Skip to content

Commit

Permalink
feat(android): add support for Android's API 33 Per-app Languages
Browse files Browse the repository at this point in the history
  • Loading branch information
AbdullahFaqeir committed Sep 20, 2024
1 parent e1212e9 commit 3f94606
Show file tree
Hide file tree
Showing 3 changed files with 74 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,10 @@
import java.text.DateFormat;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Locale;

import org.appcelerator.kroll.KrollDict;
import org.appcelerator.kroll.KrollModule;
import org.appcelerator.kroll.annotations.Kroll;
import org.appcelerator.kroll.common.Log;
Expand All @@ -21,8 +23,12 @@
import org.appcelerator.titanium.util.TiPlatformHelper;
import org.appcelerator.titanium.util.TiRHelper;

import android.os.Build;
import android.telephony.PhoneNumberUtils;

import androidx.appcompat.app.AppCompatDelegate;
import androidx.core.os.LocaleListCompat;

@Kroll.module
public class LocaleModule extends KrollModule
{
Expand All @@ -33,6 +39,62 @@ public LocaleModule()
super("Locale");
}

@Kroll.setProperty
public void setApplicationLocales(String locales)
{
if (Build.VERSION.SDK_INT < 33) {
Log.w(TAG, "This property is only supported on android API 33 and above.");
return;
}
LocaleListCompat appLocale = LocaleListCompat.forLanguageTags(locales);
AppCompatDelegate.setApplicationLocales(appLocale);
}

@Kroll.getProperty
public KrollDict[] getApplicationLocales()
{
if (Build.VERSION.SDK_INT < 33) {
Log.w(TAG, "This property is only supported on android API 33 and above.");
return new KrollDict[0];
}
LocaleListCompat localeListCompat = AppCompatDelegate.getApplicationLocales();
int size = localeListCompat.size();
KrollDict[] locales = new KrollDict[size];
for (int i = 0; i < size; i++) {
Locale locale = localeListCompat.get(i);
if (locale != null) {
KrollDict localeObj = new KrollDict();
localeObj.put("country", locale.getCountry());
localeObj.put("iso3_country", locale.getISO3Country());
localeObj.put("display_country", locale.getDisplayCountry());
localeObj.put("language", locale.getLanguage());
localeObj.put("iso3_language", locale.getISO3Language());
localeObj.put("display_language", locale.getDisplayLanguage());
localeObj.put("variant", locale.getVariant());
localeObj.put("display_variant", locale.getDisplayVariant());
localeObj.put("script", locale.getScript());
localeObj.put("display_script", locale.getDisplayScript());
localeObj.put("display_name", locale.getDisplayName());
localeObj.put("language_tag", locale.toLanguageTag());
Character[] extensionKeys = new Character[locale.getExtensionKeys().size()];
String[] extensions = new String[locale.getExtensionKeys().size()];
Iterator<Character> extensionKeysSize = locale.getExtensionKeys().iterator();
int l = 0;
while (extensionKeysSize.hasNext()) {
extensionKeys[l] = extensionKeysSize.next();
extensions[l] = locale.getExtension(extensionKeys[l]);
l++;
}
localeObj.put("extension_keys", extensionKeys);
localeObj.put("extensions", extensions);
locales[i] = localeObj;
} else {
locales[i] = null;
}
}
return locales;
}

@Kroll.getProperty
public String getCurrentLanguage()
{
Expand Down
2 changes: 1 addition & 1 deletion android/templates/build/ti.constants.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

project.ext {
tiNdkVersion = '26.2.11394342'
tiAndroidXAppCompatLibVersion = '1.4.1'
tiAndroidXAppCompatLibVersion = '1.6.1'
tiAndroidXCoreLibVersion = '1.9.0'
tiAndroidXFragmentLibVersion = '1.5.7'
tiMaterialLibVersion = '1.6.1'
Expand Down
11 changes: 11 additions & 0 deletions apidoc/Titanium/Locale/Locale.yml
Original file line number Diff line number Diff line change
Expand Up @@ -235,3 +235,14 @@ properties:
sections of wikipedia for reference.
type: String
permission: read-only

- name: applicationLocales
summary: Update or retrieve Android's Per-app languages.
platforms: [android]
description: |
This property holds the values of Android's Per-app languages which is an array of defined Per-app languages,
if no languages defined, an empty array will be returned. You can set the value of it like this `en-US,en-GB,ar-SA`.
This property requires android API 33 and above.
See the [Android's Per-app languages](https://developer.android.com/guide/topics/resources/app-languages).
type: String | Array
since: "12.6.0"

0 comments on commit 3f94606

Please sign in to comment.