运行时本地化(多语言)在某些设备上无法工作,例如Oppo f9和华为y9。

3

我实现了以下本地化逻辑,以便能够在我的应用程序中动态地从英语更改为阿拉伯语,反之亦然。它适用于从5.1到9.0的所有模拟器版本,并适用于我7个物理设备中的所有设备。

问题在于,我收到来自使用Oppo f9和Huawei y9(2019)等设备的用户的抱怨,当尝试更改语言时,布局方向会改变,但应用程序不使用其他字符串资源。它总是显示英文!

我对此感到很困扰,我错过了什么吗?

public class App extends Application {

@Override
protected void attachBaseContext(Context base) {
    super.attachBaseContext(LocaleManager.setLocale(base));
}

//Handles screen rotation only up till API 28 pie
@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    LocaleManager.setLocale(this);
    if (Build.VERSION.SDK_INT >= 26) {
        ProcessPhoenix.triggerRebirth(this); //Restart app!
    }
  }
}

public class BaseActivity extends AppCompatActivity {

protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if (Manager.isFirstLaunch(this)) {  //Check if it is the first time to launch the app
        startActivity(new Intent(this, ChooseLanguageActivity.class));
        finish();
    } else {
        if (Build.VERSION.SDK_INT >= 26) {
            LocaleManager.setLocale(this);
        }
        startActivity(new Intent(this, AuthenticationActivity.class));
        finish();
    }
  }
}

public class ChooseLanguageActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_choose_language);
    Crashlytics.log("ChooseLanguageActivity created");
}

public void EnglishButton(View view) {
    LocaleManager.persistLanguage(this, "en");  //In case the mobile locale is Arabic for API >=Oreo
    LocaleManager.setLocale(this);
    Manager.firstLaunchCompleted(this);
    ProcessPhoenix.triggerRebirth(this); //Restart app!
    finish();
}

public void ArabicButton(View view) {
    LocaleManager.persistLanguage(this, "ar");
    LocaleManager.setLocale(this);
    Manager.firstLaunchCompleted(this);
    ProcessPhoenix.triggerRebirth(this); //Restart app!
    finish();
  }
}

public class LocaleManager {
private static final String SELECTED_LANGUAGE = "Locale.Helper.Selected.Language";
private static final String DEFAULT_LANGUAGE = "en";

public static Context setLocale(Context c) {
    return setNewLocale(c, getLanguage(c));
}

public static Context setNewLocale(Context c, String language) {
    persistLanguage(c, language);
    return updateResources(c, language);
}

public static String getLanguage(Context c) {
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(c);
    return preferences.getString(SELECTED_LANGUAGE, DEFAULT_LANGUAGE);
}

public static void persistLanguage(Context c, String language) {
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(c);
    SharedPreferences.Editor editor = preferences.edit();
    editor.putString(SELECTED_LANGUAGE, language);
    editor.commit(); //U must use Commit and not apply, to avoid opening a new thread, causing a delayed writting in a separate thread!
    Manager.appLanguage=language;//edited upon lang selection screen/future app launches/lang change through menu
}


private static Context updateResources(Context context, String language) {
    Locale locale = new Locale(language);
    Locale.setDefault(locale);

    Resources res = context.getResources();
    Configuration config = new Configuration(res.getConfiguration());

    if(Build.VERSION.SDK_INT >= 17) {
        config.setLocale(locale);
        res.updateConfiguration(config, res.getDisplayMetrics());
    }

    return context;
}

}


1
我也遇到了这个问题。有人能帮忙吗?我被告知在Honor 5,Lenevo K4 note和其他几个设备上无法工作。 - Varun A M
@VarunAM 我找到了问题的原因。看看下面的解决方案是否对你也有效。 - Mena
1个回答

4
我能够通过生成已签名的APK文件(与签名捆绑包出现之前一样)来解决这个问题,然后将其上传到Google Play。使用“生成已签名的捆绑包”在某些设备上会导致这个问题,当它们从Google Play下载应用时,而其他设备则没有问题,因此这很令人困惑。
我的应用程序大小增加了额外的3MB,但是至少现在从Google Play下载时,在所有设备上都可以正常工作(我的和向我投诉有问题的用户的设备)。

1
非常感谢!我花了几周的时间试图弄清楚为什么它在某些设备上无法工作。现在,由于您的答案,我终于成功地为所有Android用户分发了一个可用的版本。 - Maryoomi1
2
如果您仍需要使用bundle构建应用程序,则此答案应该有所帮助:https://dev59.com/tFQJ5IYBdhLWcg3w96zx#52733674 - Alvin Rusli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接