{"id":"fe13dd29-32c6-4681-95c5-47e864b8366a","shortId":"SAewu3","kind":"skill","title":"cometchat-i18n","tagline":"Localization (i18n) across all CometChat UI Kit families — React, React Native, Angular, Android (V5/V6), iOS, Flutter (V5/V6). Covers CometChatLocalize.init signature differences (positional vs object), bundled languages, custom-language registration, RTL support, fallback to En","description":"## Purpose\n\nLocalize the CometChat UI Kit to the user's language. Every kit ships with English + ~15 bundled languages (Arabic, Bengali, Chinese, German, Spanish, French, Hindi, Indonesian, Italian, Japanese, Korean, Malay, Portuguese, Russian, Swedish, Turkish — exact set varies by kit version). Custom languages can be added at runtime.\n\nThe biggest gotcha: **the `init` signature differs across kits and major versions**. The same audit pass that caught calls API drift caught one of these too (Angular Localize positional signature) — this skill is the canonical reference.\n\n---\n\n## API surface per family\n\n### React (v6) — object signature\n\n```ts\nimport { CometChatLocalize } from \"@cometchat/chat-uikit-react\";\n\nCometChatLocalize.init({\n  language: \"es\",\n  fallbackLanguage: \"en\",\n});\n```\n\nObject literal. `init({ ... })`.\n\n### React Native (v5) — object signature\n\n```ts\nimport { CometChatLocalize } from \"@cometchat/chat-uikit-react-native\";\n\nCometChatLocalize.init({\n  language: \"es\",\n  fallbackLanguage: \"en\",\n});\n```\n\nSame object signature as React.\n\n### Angular (v4) — POSITIONAL signature\n\n```ts\nimport { CometChatLocalize } from \"@cometchat/chat-uikit-angular\";\n\nCometChatLocalize.init(\"es\");\n// or with custom resources:\nCometChatLocalize.init(\"es\", { es: { CHAT: \"Charla\" } });\n```\n\n**Positional, not object.** This was the v4.0 audit fix — calling `.init({ language: \"es\" })` on Angular sets `language = [object Object]` and silently breaks translations. The skill's verification checklist flags this drift.\n\n### Android V5 — Java/Kotlin static method\n\n```kotlin\n// Kotlin\nCometChatLocalize.setLocale(Locale.forLanguageTag(\"es\"))\n```\n\n```java\n// Java\nCometChatLocalize.setLocale(Locale.forLanguageTag(\"es\"));\n```\n\n`setLocale`, not `init`. Takes a `java.util.Locale`.\n\n### Android V6 (beta) — same as V5\n\nV6 keeps the `setLocale(Locale)` API. No drift here.\n\n### iOS V5\n\n```swift\nimport CometChatUIKitSwift\n\nCometChatLocalize.setLocale(locale: \"es\")\n```\n\n`setLocale(locale:)`. Takes a String, not `Locale`.\n\n### Flutter V5 (GetX-based)\n\n```dart\nimport 'package:cometchat_calls_uikit/cometchat_calls_uikit.dart';\n\nCometChatLocalize.init(language: 'es');\n```\n\nNamed-arg, not positional. Single string.\n\n### Flutter V6 (Bloc-based)\n\n```dart\nimport 'package:cometchat_chat_uikit/cometchat_chat_uikit.dart';\n\nCometChatLocalize.init(language: 'es');\n```\n\nSame as V5 in Flutter — named arg.\n\n---\n\n## Cross-family signature summary\n\n| Family | Init call | Notes |\n|---|---|---|\n| React (v6) | `CometChatLocalize.init({ language, fallbackLanguage })` | Object |\n| React Native (v5) | `CometChatLocalize.init({ language, fallbackLanguage })` | Object |\n| **Angular (v4)** | `CometChatLocalize.init(\"es\")` | **Positional — drift trap** |\n| Android (V5/V6) | `CometChatLocalize.setLocale(Locale.forLanguageTag(\"es\"))` | Method name `setLocale`, takes `Locale` |\n| iOS (V5) | `CometChatLocalize.setLocale(locale: \"es\")` | Method name `setLocale`, takes String |\n| Flutter (V5/V6) | `CometChatLocalize.init(language: 'es')` | Named arg |\n\nThe agent must consult this table before writing any localization code. **Verify against the installed package's type definitions** if uncertain — symbol drift between minor versions is real (the React v5 → v6 changed from positional to object).\n\n---\n\n## When to call init/setLocale\n\nAfter CometChat init is configured but before mounting any kit components:\n\n```ts\n// React example — in your provider\nuseEffect(() => {\n  CometChatUIKit.init(settings).then(() => {\n    CometChatLocalize.init({ language: getUserLocale(), fallbackLanguage: \"en\" });\n    // Now mount kit components\n  });\n}, []);\n```\n\n```kotlin\n// Android — in Application.onCreate\noverride fun onCreate() {\n  super.onCreate()\n  val settings = UIKitSettings.Builder()/* ... */.build()\n  CometChatUIKit.init(this, settings) {\n    CometChatLocalize.setLocale(Locale.forLanguageTag(getUserLocale()))\n  }\n}\n```\n\n```swift\n// iOS — in App.init or AppDelegate\nCometChat.init(appId: ...) { _, error in\n  guard error == nil else { return }\n  CometChatLocalize.setLocale(locale: Locale.preferredLanguages.first ?? \"en\")\n}\n```\n\nSetting locale before init is harmless but the kit doesn't pick up the locale until init completes; some components read the locale at first render. Doing both in sequence is safest.\n\n---\n\n## Custom languages / overriding strings\n\nEach kit lets you register a custom language or override individual strings.\n\n### React / React Native (v6)\n\n```ts\nCometChatLocalize.init({\n  language: \"es\",\n  fallbackLanguage: \"en\",\n  resources: {\n    es: {\n      CHAT: \"Charla\",\n      MESSAGES: \"Mensajes\",\n      // ... override only the strings you want\n    },\n  },\n});\n```\n\n### Angular\n\nPositional second arg:\n\n```ts\nCometChatLocalize.init(\"es\", {\n  es: { CHAT: \"Charla\", MESSAGES: \"Mensajes\" },\n});\n```\n\n### Android\n\n```kotlin\nval customResources = mapOf(\n  \"CHAT\" to \"Charla\",\n  \"MESSAGES\" to \"Mensajes\",\n)\nCometChatLocalize.setLocale(Locale(\"es\"))\nCometChatLocalize.addStringResources(\"es\", customResources)   // verify symbol\n```\n\nThe exact symbol for resource-override on Android varies by version — check the kit's published API surface.\n\n### iOS\n\n```swift\nCometChatLocalize.setLocale(locale: \"es\")\nCometChatLocalize.setStringResources([\"CHAT\": \"Charla\"], for: \"es\")\n```\n\n### Flutter\n\n```dart\nCometChatLocalize.init(\n  language: 'es',\n  resources: {\n    'es': { 'CHAT': 'Charla', 'MESSAGES': 'Mensajes' },\n  },\n);\n```\n\n---\n\n## RTL languages\n\nArabic, Hebrew, Persian, Urdu render right-to-left. The kits handle layout direction automatically based on the locale, BUT:\n\n1. **Native iOS / Android**: layout direction follows the device's locale OR the explicitly-set CometChat locale, whichever is set last. If your app sets the device locale to Arabic but the kit's locale is English, mismatched RTL is visible.\n2. **Web (React / Angular)**: `<html dir=\"rtl\">` is required for full RTL support. The kit reads this from the document root. Set it when locale changes:\n\n```ts\nuseEffect(() => {\n  const lang = currentLocale;\n  document.documentElement.dir = [\"ar\", \"he\", \"fa\", \"ur\"].includes(lang) ? \"rtl\" : \"ltr\";\n  CometChatLocalize.init({ language: lang });\n}, [currentLocale]);\n```\n\n3. **React Native**: `I18nManager.forceRTL(true)` for global RTL flip. Requires app restart to take effect (this is the one common production bug — set RTL, app doesn't visibly change, devs miss the \"restart required\" warning).\n\n```ts\nimport { I18nManager, NativeModules, Platform } from \"react-native\";\n\nif (isRTLLocale(language) && !I18nManager.isRTL) {\n  I18nManager.forceRTL(true);\n  if (__DEV__) {\n    console.warn(\"RTL set — app must restart for layout change to apply\");\n  } else {\n    NativeModules.DevSettings.reload();\n  }\n}\n```\n\n4. **Flutter**: handled automatically via `MaterialApp.localizationsDelegates` + `Locale('ar')`. Flutter's framework flips layout direction on locale change without restart.\n\n---\n\n## Fallback language\n\nEvery kit falls back to English when a translation is missing for the active locale. Make this explicit:\n\n```ts\n// React/RN/Flutter\nCometChatLocalize.init({ language: \"es\", fallbackLanguage: \"en\" });\n```\n\nAngular and iOS don't have an explicit `fallbackLanguage` arg in their `init` / `setLocale` API — they hardcode English fallback internally. The skill doesn't try to override this.\n\n---\n\n## Detecting the user's preferred language\n\n```ts\n// Web — browser language\nconst language = navigator.language.split(\"-\")[0];   // \"en-US\" → \"en\"\n\n// React Native — device language\nimport * as Localization from \"expo-localization\";    // Expo\nconst language = Localization.locale.split(\"-\")[0];\n\n// or react-native-localize for bare RN:\nimport { getLocales } from \"react-native-localize\";\nconst language = getLocales()[0]?.languageCode ?? \"en\";\n```\n\n```kotlin\n// Android\nval language = Locale.getDefault().language          // \"en\"\n```\n\n```swift\n// iOS\nlet language = Locale.preferredLanguages.first?.split(separator: \"-\").first.map(String.init) ?? \"en\"\n```\n\n```dart\n// Flutter\nimport 'dart:ui';\nfinal language = window.locale.languageCode;          // 'en'\n```\n\nMap these to your kit's locale convention (most kits use ISO 639-1 two-letter codes; Flutter sometimes accepts BCP47 like `en-US`).\n\n---\n\n## Logout / language switch — re-init the kit\n\nWhen the user changes language at runtime, simply call `init`/`setLocale` again with the new language. The kit re-renders kit components on the next render cycle. No need to logout/re-login.\n\nFor React/RN — wrap kit components in a `key={language}` to force re-mount if the kit doesn't auto-detect:\n\n```tsx\n<div key={language}>\n  <CometChatConversations />\n</div>\n```\n\nThis is the workaround for kits that cache localized strings at first render.\n\n---\n\n## Anti-patterns\n\n1. **Calling `init` with the wrong signature.** Object instead of positional on Angular, vice-versa on React. The audit pass catches this — don't ship without verifying.\n2. **Setting locale before kit init.** Some kits ignore the early call. Always sequence: kit init → localize init.\n3. **No fallback language on web/RN/Flutter.** Missing translations show as raw keys (`CHAT_HEADER_TITLE` etc.) instead of English fallback.\n4. **`document.dir` not synced with locale on web.** RTL languages render LTR — broken layout.\n5. **`I18nManager.forceRTL` without app restart.** Layout doesn't flip; devs think the kit is broken.\n6. **Hardcoding language in skill output.** Always read user preference (browser/device/explicit setting).\n7. **Custom resources keyed by lowercase ID** (`\"chat\"` instead of `\"CHAT\"`). Kit string keys are uppercase by convention. Mismatched case = no override applied.\n8. **Trusting the audit-fix-once mindset.** Localize signatures can drift in future minor versions. Re-verify on kit upgrade.\n\n---\n\n## Verification checklist\n\n- [ ] `init` / `setLocale` signature matches the family in the table above\n- [ ] Locale set AFTER kit init resolves\n- [ ] `fallbackLanguage` set where supported (React, RN, Flutter)\n- [ ] Web: `document.documentElement.dir` synced with RTL languages\n- [ ] React Native: `I18nManager.forceRTL` warning + restart on RTL set\n- [ ] Custom resources use uppercase string keys\n- [ ] Language detection from browser/device, not hardcoded\n- [ ] Re-init on language switch (or `key={language}` workaround)\n- [ ] Smoke test: switch to a bundled non-English language, verify kit components localize\n- [ ] Smoke test: switch to a missing-resource language, verify English fallback\n- [ ] RTL smoke test: Arabic / Hebrew on web (with `dir=\"rtl\"`) and RN (with `I18nManager.forceRTL`) and native Android/iOS — kit components mirror correctly\n\n---\n\n## Pointers\n\n- `cometchat-{family}-core` — kit init order and conventions (localize hooks into the post-init phase)\n- `cometchat-{family}-customization` — custom string resources / theme strings\n- `cometchat-{family}-troubleshooting` — when localization doesn't apply (cache, sequence, fallback)\n- `cometchat-a11y` — sister skill; localization + accessibility together cover the bulk of \"production polish\"","tags":["cometchat","i18n","skills","agent-skills","ai-agent","chat","claude-code","cursor","messaging","nextjs","react","react-native"],"capabilities":["skill","source-cometchat","skill-cometchat-i18n","topic-agent-skills","topic-ai-agent","topic-chat","topic-claude-code","topic-cometchat","topic-cursor","topic-messaging","topic-nextjs","topic-react","topic-react-native","topic-ui-kit"],"categories":["cometchat-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/cometchat/cometchat-skills/cometchat-i18n","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add cometchat/cometchat-skills","source_repo":"https://github.com/cometchat/cometchat-skills","install_from":"skills.sh"}},"qualityScore":"0.463","qualityRationale":"deterministic score 0.46 from registry signals: · indexed on github topic:agent-skills · 27 github stars · SKILL.md body (11,039 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-18T19:04:52.681Z","embedding":null,"createdAt":"2026-05-18T07:04:25.345Z","updatedAt":"2026-05-18T19:04:52.681Z","lastSeenAt":"2026-05-18T19:04:52.681Z","tsv":"'-1':951 '/.build':446 '0':870,890,909 '1':635,1046 '15':55 '2':677,1074 '3':718,1092 '4':783,1112 '5':1126 '6':1141 '639':950 '7':1153 '8':1176 'a11y':1344 'accept':958 'access':1348 'across':6,94 'activ':817 'ad':84 'agent':365 'alway':1086,1147 'android':16,215,236,337,436,554,581,638,913 'android/ios':1301 'angular':15,113,164,198,330,542,680,829,1058 'anti':1044 'anti-pattern':1043 'api':106,123,247,590,843 'app':659,728,742,773,1129 'app.init':456 'appdeleg':458 'appid':460 'appli':780,1175,1338 'application.oncreate':438 'ar':706,790 'arab':58,615,665,1288 'arg':282,307,363,545,838 'audit':101,191,1065,1180 'audit-fix-onc':1179 'auto':1024 'auto-detect':1023 'automat':629,786 'back':807 'bare':897 'base':270,291,630 'bcp47':959 'bengali':59 'beta':238 'biggest':88 'bloc':290 'bloc-bas':289 'break':205 'broken':1124,1140 'browser':865 'browser/device':1246 'browser/device/explicit':1151 'bug':739 'bulk':1352 'bundl':28,56,1264 'cach':1037,1339 'call':105,193,275,315,403,980,1047,1085 'canon':121 'case':1172 'catch':1067 'caught':104,108 'chang':396,699,746,778,799,975 'charla':183,533,551,561,599,610 'chat':182,296,532,550,559,598,609,1104,1160,1163 'check':585 'checklist':211,1199 'chines':60 'code':374,955 'cometchat':2,8,42,274,295,406,651,1307,1323,1331,1343 'cometchat-a11y':1342 'cometchat-i18n':1 'cometchat.init':459 'cometchat/chat-uikit-angular':172 'cometchat/chat-uikit-react':135 'cometchat/chat-uikit-react-native':153 'cometchatloc':133,151,170 'cometchatlocalize.addstringresources':568 'cometchatlocalize.init':22,136,154,173,179,277,298,319,326,332,359,426,525,547,604,714,824 'cometchatlocalize.setlocale':222,227,256,339,349,450,468,565,594 'cometchatlocalize.setstringresources':597 'cometchatuikit.init':423,447 'cometchatuikitswift':255 'common':737 'complet':489 'compon':415,434,491,994,1008,1271,1303 'configur':409 'console.warn':770 'const':702,867,887,906 'consult':367 'convent':945,1170,1314 'core':1309 'correct':1305 'cover':21,1350 'cross':309 'cross-famili':308 'currentlocal':704,717 'custom':31,80,177,504,514,1154,1237,1325,1326 'custom-languag':30 'customresourc':557,570 'cycl':999 'dart':271,292,603,929,932 'definit':382 'detect':857,1025,1244 'dev':747,769,1135 'devic':643,662,877 'differ':24,93 'dir':1293 'direct':628,640,796 'div':1027 'document':693 'document.dir':1113 'document.documentelement.dir':705,1224 'doesn':481,743,851,1021,1132,1336 'drift':107,214,249,335,386,1187 'earli':1084 'effect':732 'els':466,781 'en':38,140,158,430,471,529,828,872,874,911,918,928,937,962 'en-us':871,961 'english':54,672,809,846,1110,1267,1283 'error':461,464 'es':138,156,174,180,181,196,224,229,258,279,300,333,341,351,361,527,531,548,549,567,569,596,601,606,608,826 'etc':1107 'everi':50,804 'exact':74,574 'exampl':418 'explicit':649,821,836 'explicitly-set':648 'expo':884,886 'expo-loc':883 'fa':708 'fall':806 'fallback':36,802,847,1094,1111,1284,1341 'fallbacklanguag':139,157,321,328,429,528,827,837,1216 'famili':11,126,310,313,1205,1308,1324,1332 'final':934 'first':496,1041 'first.map':926 'fix':192,1181 'flag':212 'flip':726,794,1134 'flutter':19,266,287,305,357,602,784,791,930,956,1222 'follow':641 'forc':1014 'framework':793 'french':63 'full':684 'fun':440 'futur':1189 'german':61 'getlocal':900,908 'getuserlocal':428,452 'getx':269 'getx-bas':268 'global':724 'gotcha':89 'guard':463 'handl':626,785 'hardcod':845,1142,1248 'harmless':477 'header':1105 'hebrew':616,1289 'hindi':64 'hook':1316 'i18n':3,5 'i18nmanager':755 'i18nmanager.forcertl':721,766,1127,1231,1298 'i18nmanager.isrtl':765 'id':1159 'ignor':1082 'import':132,150,169,254,272,293,754,879,899,931 'includ':710 'individu':518 'indonesian':65 'init':91,143,194,232,314,407,475,488,841,969,981,1048,1079,1089,1091,1200,1214,1251,1311,1321 'init/setlocale':404 'instal':378 'instead':1054,1108,1161 'intern':848 'io':18,251,347,454,592,637,831,920 'iso':949 'isrtllocal':763 'italian':66 'japanes':67 'java':225,226 'java.util.locale':235 'java/kotlin':217 'keep':243 'key':1011,1028,1103,1156,1166,1242,1256 'kit':10,44,51,78,95,414,433,480,509,587,625,668,688,805,942,947,971,989,993,1007,1020,1035,1078,1081,1088,1138,1164,1196,1213,1270,1302,1310 'korean':68 'kotlin':220,221,435,555,912 'lang':703,711,716 'languag':29,32,49,57,81,137,155,195,200,278,299,320,327,360,427,505,515,526,605,614,715,764,803,825,862,866,868,878,888,907,915,917,922,935,965,976,987,1012,1029,1095,1121,1143,1228,1243,1253,1257,1268,1281 'languagecod':910 'last':656 'layout':627,639,777,795,1125,1131 'left':623 'let':510,921 'letter':954 'like':960 'liter':142 'local':4,40,114,246,257,260,265,346,350,373,469,473,486,494,566,595,633,645,652,663,670,698,789,798,818,881,885,895,905,944,1038,1076,1090,1117,1184,1210,1272,1315,1335,1347 'locale.forlanguagetag':223,228,340,451 'locale.getdefault':916 'locale.preferredlanguages.first':470,923 'localization.locale.split':889 'logout':964 'logout/re-login':1003 'lowercas':1158 'ltr':713,1123 'major':97 'make':819 'malay':69 'map':938 'mapof':558 'match':1203 'materialapp.localizationsdelegates':788 'mensaj':535,553,564,612 'messag':534,552,562,611 'method':219,342,352 'mindset':1183 'minor':388,1190 'mirror':1304 'mismatch':673,1171 'miss':748,814,1098,1279 'missing-resourc':1278 'mount':412,432,1017 'must':366,774 'name':281,306,343,353,362 'named-arg':280 'nativ':14,145,324,522,636,720,761,876,894,904,1230,1300 'nativemodul':756 'nativemodules.devsettings.reload':782 'navigator.language.split':869 'need':1001 'new':986 'next':997 'nil':465 'non':1266 'non-english':1265 'note':316 'object':27,129,141,147,160,186,201,202,322,329,400,1053 'oncreat':441 'one':109,736 'order':1312 'output':1146 'overrid':439,506,517,536,579,855,1174 'packag':273,294,379 'pass':102,1066 'pattern':1045 'per':125 'persian':617 'phase':1322 'pick':483 'platform':757 'pointer':1306 'polish':1355 'portugues':70 'posit':25,115,166,184,284,334,398,543,1056 'post':1320 'post-init':1319 'prefer':861,1150 'product':738,1354 'provid':421 'publish':589 'purpos':39 'raw':1102 're':968,991,1016,1193,1250 're-init':967,1249 're-mount':1015 're-rend':990 're-verifi':1192 'react':12,13,127,144,163,317,323,393,417,520,521,679,719,760,875,893,903,1063,1220,1229 'react-nat':759 'react-native-loc':892,902 'react/rn':1005 'react/rn/flutter':823 'read':492,689,1148 'real':391 'refer':122 'regist':512 'registr':33 'render':497,619,992,998,1042,1122 'requir':682,727,751 'resolv':1215 'resourc':178,530,578,607,1155,1238,1280,1328 'resource-overrid':577 'restart':729,750,775,801,1130,1233 'return':467 'right':621 'right-to-left':620 'rn':898,1221,1296 'root':694 'rtl':34,613,674,685,712,725,741,771,1120,1227,1235,1285,1294 'runtim':86,978 'russian':71 'safest':503 'second':544 'separ':925 'sequenc':501,1087,1340 'set':75,199,424,444,449,472,650,655,660,695,740,772,1075,1152,1211,1217,1236 'setlocal':230,245,259,344,354,842,982,1201 'ship':52,1071 'show':1100 'signatur':23,92,116,130,148,161,167,311,1052,1185,1202 'silent':204 'simpli':979 'singl':285 'sister':1345 'skill':118,208,850,1145,1346 'skill-cometchat-i18n' 'smoke':1259,1273,1286 'sometim':957 'source-cometchat' 'spanish':62 'split':924 'static':218 'string':263,286,356,507,519,539,1039,1165,1241,1327,1330 'string.init':927 'summari':312 'super.oncreate':442 'support':35,686,1219 'surfac':124,591 'swedish':72 'swift':253,453,593,919 'switch':966,1254,1261,1275 'symbol':385,572,575 'sync':1115,1225 'tabl':369,1208 'take':233,261,345,355,731 'test':1260,1274,1287 'theme':1329 'think':1136 'titl':1106 'togeth':1349 'topic-agent-skills' 'topic-ai-agent' 'topic-chat' 'topic-claude-code' 'topic-cometchat' 'topic-cursor' 'topic-messaging' 'topic-nextjs' 'topic-react' 'topic-react-native' 'topic-ui-kit' 'translat':206,812,1099 'trap':336 'tri':853 'troubleshoot':1333 'true':722,767 'trust':1177 'ts':131,149,168,416,524,546,700,753,822,863 'tsx':1026 'turkish':73 'two':953 'two-lett':952 'type':381 'ui':9,43,933 'uikit/cometchat_calls_uikit.dart':276 'uikit/cometchat_chat_uikit.dart':297 'uikitsettings.builder':445 'uncertain':384 'upgrad':1197 'uppercas':1168,1240 'ur':709 'urdu':618 'us':873,963 'use':948,1239 'useeffect':422,701 'user':47,859,974,1149 'v4':165,331 'v4.0':190 'v5':146,216,241,252,267,303,325,348,394 'v5/v6':17,20,338,358 'v6':128,237,242,288,318,395,523 'val':443,556,914 'vari':76,582 'verif':210,1198 'verifi':375,571,1073,1194,1269,1282 'versa':1061 'version':79,98,389,584,1191 'via':787 'vice':1060 'vice-versa':1059 'visibl':676,745 'vs':26 'want':541 'warn':752,1232 'web':678,864,1119,1223,1291 'web/rn/flutter':1097 'whichev':653 'window.locale.languagecode':936 'without':800,1072,1128 'workaround':1033,1258 'wrap':1006 'write':371 'wrong':1051","prices":[{"id":"bca7b55f-ec90-4a56-92da-1abe078c57e8","listingId":"fe13dd29-32c6-4681-95c5-47e864b8366a","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"cometchat","category":"cometchat-skills","install_from":"skills.sh"},"createdAt":"2026-05-18T07:04:25.345Z"}],"sources":[{"listingId":"fe13dd29-32c6-4681-95c5-47e864b8366a","source":"github","sourceId":"cometchat/cometchat-skills/cometchat-i18n","sourceUrl":"https://github.com/cometchat/cometchat-skills/tree/main/skills/cometchat-i18n","isPrimary":false,"firstSeenAt":"2026-05-18T07:04:25.345Z","lastSeenAt":"2026-05-18T19:04:52.681Z"}],"details":{"listingId":"fe13dd29-32c6-4681-95c5-47e864b8366a","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"cometchat","slug":"cometchat-i18n","github":{"repo":"cometchat/cometchat-skills","stars":27,"topics":["agent-skills","ai-agent","chat","claude-code","cometchat","cursor","messaging","nextjs","react","react-native","ui-kit"],"license":null,"html_url":"https://github.com/cometchat/cometchat-skills","pushed_at":"2026-05-18T05:04:24Z","description":"Add CometChat chat to any React, Next.js, React Native, Angular, Android, iOS, or Flutter project through your AI coding agent. Works with Claude Code, Cursor, Codex, VS Code Copilot, Windsurf, Cline, Kiro, and 50+ more agents.","skill_md_sha":"8a47f7ad66861ac5c6bd598e3f0d77bee33c83ae","skill_md_path":"skills/cometchat-i18n/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/cometchat/cometchat-skills/tree/main/skills/cometchat-i18n"},"layout":"multi","source":"github","category":"cometchat-skills","frontmatter":{"name":"cometchat-i18n","license":"MIT","description":"Localization (i18n) across all CometChat UI Kit families — React, React Native, Angular, Android (V5/V6), iOS, Flutter (V5/V6). Covers CometChatLocalize.init signature differences (positional vs object), bundled languages, custom-language registration, RTL support, fallback to English, and cross-family drift risks. Cross-family — applies wherever the agent is configuring CometChat localization.","compatibility":"All CometChat UI Kit families v4.x / v5.x / v6.x"},"skills_sh_url":"https://skills.sh/cometchat/cometchat-skills/cometchat-i18n"},"updatedAt":"2026-05-18T19:04:52.681Z"}}