【问题标题】:Android Localization for French and English Strings法语和英语字符串的 Android 本地化
【发布时间】:2015-08-18 03:50:39
【问题描述】:

我们正在构建一个产品,我们计划从服务器为英语和法语用户推送静态字符串,以提高性能。两个字符串将同时被推送。我们在导航抽屉上提供了一个开关,可以在英语和语言之间切换。由于这些字符串会随着时间的推移而不断变化,我们不能将它们保存在 values 和 values-fr 文件夹下。

现在有几个问题

  1. 当设备区域设置改变时,我们需要切换语言 应用程序在运行时使用这些字符串。有什么办法可以 在运行时动态加载字符串到值和值-fr 文件夹。

  2. 如果上述方法不可行,我们计划对每个 查看每个字符串,会增加代码的复杂度。

我们可以实施上述问题的任何替代方案或解决方案吗?非常感谢任何帮助。

【问题讨论】:

    标签: android localization


    【解决方案1】:
    1. 不,这是不可能的
    2. 我曾经做过类似的事情。我所做的是为strings.xml 提供一组空项目,只是为了ID。当然,您也可以为此目的使用ids.xml。当应用程序启动时,我下载了包含key, value 对的文件,其中key 是我在strings.xml 中使用的name 属性,并将这对放在HashMap<String, String> 中。最后我有个小经理,把id翻译成nameretrievedHashMap的字符串翻译回来给客户。

    正如您想象的那样,从可维护性的角度来看,它曾经是/是一场噩梦。我强烈反对它,但我知道有时这是不可能的

    【讨论】:

      【解决方案2】:

      使用应用程序类

      public class MyApplication extends Application {
      private static MyApplication instance = null;
      
          private String frenchValue;
      
      private String englishValue;
      
      private String env_lang_Value;
      
      public String getFrenchValue() {
          return frenchValue;
      }
      
      public void setFrenchValue(String frenchValue) {
          UnravelApplication.frenchValue = frenchValue;
      }
      
      public String getEnglishValue() {
          return englishValue;
      }
      
      public void setEnglishValue(String englishValue) {
          UnravelApplication.englishValue = englishValue;
      }
      
      public String getEnv_lang_Value() {
          return env_lang_Value;
      }
      
      public void setEnv_lang_Value(String env_lang_Value) {
          UnravelApplication.env_lang_Value = env_lang_Value;
      }
      
      private MyApplication() {
        // Exists only to defeat instantiation.
        }
        public static MyApplication getInstance() {
        if(instance == null) {
           instance = new MyApplication();
        }
        return instance;
       }
      
      
      @Override
      public void onConfigurationChanged(Configuration newConfig) {
          super.onConfigurationChanged(newConfig);
          if (newConfig.locale.getLanguage() == Configuration.locale.ENGLISH) {
      env_lang_value=englishValue
      }
      if (newConfig.locale.getLanguage() == Configuration.locale.FRENCH) {
      env_lang_value=frenchValue
      }
      }
      }
      

      从服务器接收推送静态字符串时的任何活动

      public MyActivity extends Activity{
      MyApplication myApplication = MyApplication.getInstance();
      
      //to set while getting strings from server for both english and french
      
      myApplication.setEnglishValue(englishValue);
      myApplication.setFrenchValue(frenchValue);
          if(Locale.getDefault().getDisplayLanguage().equalsIgnoreCase("English"))
      myApplication.setEnv_lang_value=englishValue;
      if(Locale.getDefault().getDisplayLanguage().equalsIgnoreCase("French"))
      myApplication.setEnv_lang_value=frenchValue;
      
      //to get value
      String currentValue=myApplication.getEnv_lang_value;
      
      }
      

      不要忘记在 AndroidManifest.xml 的标签中指定应用程序类名称

      <application android:icon="@drawable/icon" android:label="@string/app_name" android:name="MyApplication">
      

      【讨论】:

      • 应用程序类只有在你安装应用程序后才会被调用。Locale会被用户频繁更改,所以你的onConfigurationChanged不会在这里收到回调。除此之外,还必须在 Manifest 文件中定义 configChanges(developer.android.com/reference/android/app/…) 以接收回调。
      猜你喜欢
      • 1970-01-01
      • 2010-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多