diff --git a/app/src/main/java/com/hjq/language/demo/MainActivity.java b/app/src/main/java/com/hjq/language/demo/MainActivity.java index dc79a9f..3988f2d 100644 --- a/app/src/main/java/com/hjq/language/demo/MainActivity.java +++ b/app/src/main/java/com/hjq/language/demo/MainActivity.java @@ -3,9 +3,12 @@ import android.annotation.TargetApi; import android.content.Context; import android.content.Intent; +import android.graphics.Bitmap; import android.net.Uri; import android.os.Build; import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; import android.webkit.WebChromeClient; import android.webkit.WebResourceRequest; import android.webkit.WebView; @@ -54,7 +57,7 @@ protected void onCreate(Bundle savedInstanceState) { getApplication().getResources().getString(R.string.current_language)); mSystemLanguageView = findViewById(R.id.tv_main_language_system); mSystemLanguageView.setText(MultiLanguages.getLanguageString(this, - MultiLanguages.getSystemLanguage(this), R.string.current_language)); + MultiLanguages.getSystemLanguage(this), R.string.current_language)); if (MultiLanguages.isSystemLanguage(this)) { radioGroup.check(R.id.rb_main_language_auto); @@ -66,6 +69,8 @@ protected void onCreate(Bundle savedInstanceState) { radioGroup.check(R.id.rb_main_language_tw); } else if (LocaleContract.getEnglishLocale().equals(locale)) { radioGroup.check(R.id.rb_main_language_en); + } else if (LocaleContract.getArabicLocale().equals(locale)) { + radioGroup.check(R.id.rb_main_language_ar); } else { radioGroup.check(R.id.rb_main_language_auto); } @@ -94,6 +99,9 @@ public void onCheckedChanged(RadioGroup group, int checkedId) { } else if (checkedId == R.id.rb_main_language_en) { // 英语 restart = MultiLanguages.setAppLanguage(this, LocaleContract.getEnglishLocale()); + } else if (checkedId == R.id.rb_main_language_ar) { + // 阿拉伯语 + restart = MultiLanguages.setAppLanguage(this, LocaleContract.getArabicLocale()); } if (restart) { @@ -130,7 +138,7 @@ public void onResume() { return; } mSystemLanguageView.setText(MultiLanguages.getLanguageString(this, - MultiLanguages.getSystemLanguage(this), R.string.current_language)); + MultiLanguages.getSystemLanguage(this), R.string.current_language)); } @Override @@ -189,6 +197,18 @@ public boolean shouldOverrideUrlLoading(WebView view, String url) { } return true; } + @Override + public void onPageCommitVisible(WebView view, String url) { + super.onPageCommitVisible(view, url); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { + Locale locale = MultiLanguages.getAppLanguage(view.getContext()); + if (View.LAYOUT_DIRECTION_RTL == TextUtils.getLayoutDirectionFromLocale(locale)) { + // 水平滚动条滚动到最右边 + view.scrollTo(view.getWidth(), 0); + } + } + } } /** diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 97c9296..d65cd7b 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -48,6 +48,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="15dp" + android:layout_marginStart="15dp" android:text="简体" /> + + @@ -100,7 +112,8 @@ android:id="@+id/tv_main_language_application" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginLeft="20dp" /> + android:layout_marginLeft="20dp" + android:layout_marginStart="20dp" /> + android:layout_marginLeft="20dp" + android:layout_marginStart="20dp" /> diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml new file mode 100644 index 0000000..c023c10 --- /dev/null +++ b/app/src/main/res/values-ar/strings.xml @@ -0,0 +1,9 @@ + + + تدويل + اتبع النظام + + النشاط الحالي اللغة: + لغة التطبيق الحالية: + لغة النظام الحالية: + \ No newline at end of file diff --git a/library/src/main/AndroidManifest.xml b/library/src/main/AndroidManifest.xml index 33915b1..8a9c2a3 100644 --- a/library/src/main/AndroidManifest.xml +++ b/library/src/main/AndroidManifest.xml @@ -1,2 +1,5 @@ - \ No newline at end of file + + + \ No newline at end of file diff --git a/library/src/main/java/com/hjq/language/LanguagesUtils.java b/library/src/main/java/com/hjq/language/LanguagesUtils.java index 2226242..f36f612 100644 --- a/library/src/main/java/com/hjq/language/LanguagesUtils.java +++ b/library/src/main/java/com/hjq/language/LanguagesUtils.java @@ -39,8 +39,14 @@ static void setLocale(Configuration config, Locale locale) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { LocaleList localeList = new LocaleList(locale); config.setLocales(localeList); + // 在一台Android13的联想平板上,setLocales和setLocale均无效,修改config.locale生效,所以这里判断一下是否设置成功 + if (config.getLocales().get(0) != locale) { + config.locale = locale; + } + config.setLayoutDirection(locale); } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { config.setLocale(locale); + config.setLayoutDirection(locale); } else { config.locale = locale; } diff --git a/library/src/main/java/com/hjq/language/MultiLanguages.java b/library/src/main/java/com/hjq/language/MultiLanguages.java index db3ddfc..118425b 100644 --- a/library/src/main/java/com/hjq/language/MultiLanguages.java +++ b/library/src/main/java/com/hjq/language/MultiLanguages.java @@ -2,7 +2,9 @@ import android.app.Application; import android.content.Context; +import android.content.res.Configuration; import android.content.res.Resources; +import android.os.Build; import android.os.Looper; import android.os.MessageQueue; import android.text.TextUtils; @@ -96,7 +98,10 @@ public static void updateAppLanguage(Context context, Resources resources) { return; } Locale locale = getAppLanguage(context); - if (!locale.equals(LanguagesUtils.getLocale(resources.getConfiguration()))) { + Configuration config = resources.getConfiguration(); + if (!locale.equals(LanguagesUtils.getLocale(config)) + || (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 + && TextUtils.getLayoutDirectionFromLocale(locale) != config.getLayoutDirection())) { LanguagesUtils.updateLanguages(resources, locale); } if (!locale.equals(LanguagesUtils.getDefaultLocale())) {