From ba25f7eedaca9bb93bb396a102b4778a139ad451 Mon Sep 17 00:00:00 2001 From: Burak Guner Date: Thu, 30 Jul 2026 18:08:33 +0300 Subject: [PATCH] respect unicode extensions --- README.md | 7 ++++--- .../zoontek/rnlocalize/RNLocalizeModuleImpl.kt | 1 + ios/RNLocalize.mm | 1 + src/extras/mock/index.ts | 16 ++++++++++++++-- src/module.ts | 1 + src/types.ts | 2 ++ 6 files changed, 23 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 26ec2b7..48683c5 100644 --- a/README.md +++ b/README.md @@ -204,6 +204,7 @@ type getLocales = () => Array<{ scriptCode?: string; countryCode: string; languageTag: string; + languageTagWithExtensions: string; isRTL: boolean; }>; ``` @@ -215,9 +216,9 @@ import { getLocales } from "react-native-localize"; console.log(getLocales()); /* -> [ - { countryCode: "GB", languageTag: "en-GB", languageCode: "en", isRTL: false }, - { countryCode: "US", languageTag: "en-US", languageCode: "en", isRTL: false }, - { countryCode: "FR", languageTag: "fr-FR", languageCode: "fr", isRTL: false }, + { countryCode: "GB", languageTag: "en-GB", languageTagWithExtensions: "en-GB", languageCode: "en", isRTL: false }, + { countryCode: "US", languageTag: "en-US", languageTagWithExtensions: "en-US", languageCode: "en", isRTL: false }, + { countryCode: "SA", languageTag: "ar-SA", languageTagWithExtensions: "ar-SA-u-nu-latn", languageCode: "ar", isRTL: true }, ] */ ``` diff --git a/android/src/main/java/com/zoontek/rnlocalize/RNLocalizeModuleImpl.kt b/android/src/main/java/com/zoontek/rnlocalize/RNLocalizeModuleImpl.kt index 1c25661..72b6093 100644 --- a/android/src/main/java/com/zoontek/rnlocalize/RNLocalizeModuleImpl.kt +++ b/android/src/main/java/com/zoontek/rnlocalize/RNLocalizeModuleImpl.kt @@ -163,6 +163,7 @@ object RNLocalizeModuleImpl { putString("languageCode", languageCode) putString("countryCode", countryCode) putString("languageTag", languageTag) + putString("languageTagWithExtensions", systemLocale.toLanguageTag()) val rtl = TextUtils.getLayoutDirectionFromLocale(systemLocale) == View.LAYOUT_DIRECTION_RTL putBoolean("isRTL", rtl) diff --git a/ios/RNLocalize.mm b/ios/RNLocalize.mm index 7d0a44e..f1acb8f 100755 --- a/ios/RNLocalize.mm +++ b/ios/RNLocalize.mm @@ -123,6 +123,7 @@ - (NSArray *)getLocalesImpl { @"languageCode": languageCode, @"countryCode": countryCode, @"languageTag": languageTag, + @"languageTagWithExtensions": identifier, @"isRTL": @(isRTL), }]; diff --git a/src/extras/mock/index.ts b/src/extras/mock/index.ts index 1274d92..cfd82e4 100644 --- a/src/extras/mock/index.ts +++ b/src/extras/mock/index.ts @@ -6,8 +6,20 @@ export const getCurrencies = () => ["USD", "EUR"]; // can be empty array export const getLocales = () => [ // extend if needed, add the locales you want - { countryCode: "US", languageTag: "en-US", languageCode: "en", isRTL: false }, - { countryCode: "FR", languageTag: "fr-FR", languageCode: "fr", isRTL: false }, + { + countryCode: "US", + languageTag: "en-US", + languageTagWithExtensions: "en-US", + languageCode: "en", + isRTL: false, + }, + { + countryCode: "FR", + languageTag: "fr-FR", + languageTagWithExtensions: "fr-FR", + languageCode: "fr", + isRTL: false, + }, ]; export const getNumberFormatSettings = () => ({ diff --git a/src/module.ts b/src/module.ts index 6328c3c..b0260fc 100644 --- a/src/module.ts +++ b/src/module.ts @@ -42,6 +42,7 @@ const convertLanguageTagToLocale = ( languageCode, countryCode, languageTag: `${languageCode}-${countryCode}`, + languageTagWithExtensions: languageTag, isRTL: USES_RTL_LAYOUT.has(languageCode), }; }; diff --git a/src/types.ts b/src/types.ts index 32e67d5..17d224e 100644 --- a/src/types.ts +++ b/src/types.ts @@ -30,6 +30,8 @@ export type Locale = Readonly<{ countryCode: string; /** Full BCP 47 language tag (e.g., `"en-US"`, `"zh-Hans-CN"`) */ languageTag: string; + /** Full BCP 47 language tag, including Unicode extensions when available (e.g., `"ar-SA-u-nu-latn"`) */ + languageTagWithExtensions: string; /** Whether the locale uses right-to-left text direction */ isRTL: boolean; }>;