【问题标题】:using different string files in android在android中使用不同的字符串文件
【发布时间】:2012-12-05 10:57:42
【问题描述】:

我正在将我的 iPhone 应用程序移植到 android,但我现在遇到了字符串文件问题。

该应用程序是一个翻译工具,用户可以切换语言,因此所有本地化字符串都是两种语言,它们独立于操作系统运行的语言环境。

对于 iOS 版本,我有不同的文件,例如 de.strings、en.strings 和 fr.strings 等。对于具有指定语言对的每个目标,我从字符串表中读取字符串,例如对于 de-fr,我将在项目中包含 de.strings 和 fr.strings,并在 info-list 文件中设置字符串表的名称并从中读取字符串。最后,我有一个项目包含不同的目标(具有不同的信息列表文件),并且所有配置都很好。

我打算在安卓平台上做同样的事情,但是

  1. 每个项目只允许一个strings.xml吗?

  2. 如何设置不同的构建目标?例如我的 de-fr 和 de-en 翻译应用程序实际上是两个应用程序,唯一的区别是语言对。如何设置一些东西以便我可以使用一个项目来生成两个应用程序?在 XCode 中它很简单,但我找不到 eclipse 的解决方案。

  3. 如何指定每个目标应该读取哪些 strings.xml?

感谢您的回答,但请注意,我需要与操作系统区域设置无关的语言设置,即如果用户将操作系统区域设置从 en 更改为 de,我的应用程序仍会以英语显示本地化字符串。我实际上要问的是如何设置预构建之类的内容并为不同的目标加载不同的字符串文件。

【问题讨论】:

    标签: android xml string build-automation localizable.strings


    【解决方案1】:

    根据用户设置自动选择区域设置

    strings.xml 包含原始文本,假设为英语。 要创建不同语言的翻译,您可以创建文件夹,例如: values-grvalues.it,用于希腊语结尾的意大利语。 只需将strings.xml 复制到这些文件夹中并翻译即可。

    在应用程序启动时,操作系统会根据用户的偏好自动选择一种语言。

    手动选择区域设置,覆盖用户设置

    例如,要强制使用希腊语,您可以使用:

    Locale locale = new Locale("gr"); 
                Locale.setDefault(locale);
                Configuration config = new Configuration();
                config.locale = locale;
                getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
    

    当然,您应该提供希腊语翻译才能使其正常工作。

    了解更多

    您可以在此处查看文档: Support Different Languages - Android

    【讨论】:

    • 请注意我需要它独立于语言设置,请参阅我的“请注意”。我不希望我的应用程序在正常概念上支持不同的语言,而是无论语言设置如何变化都加载不同的字符串资源。
    • 您想加载运行时不同的语言吗?或者构建例如 5 个应用程序,每个应用程序使用不同的语言?
    • 假设我只是想加载不同的 strings.xml 文件。是的,构建例如5 个应用程序,具有不同的 strings.xml
    • 嗯...我不知道这个...但是一个简单的解决方法是使用上面的代码,使用一个常量作为语言环境,并使用您想要的 5 种不同语言构建它例如五次。之后,如果您想为用户提供更改语言的方法,请给他们一个选项菜单。 android 中的默认语言环境由用户在 Android 设置中选择。
    • 谢谢!只有一个问题:如果我使用上面的代码,操作系统区域设置会改变吗?即英语用户退出应用程序并找到他的操作系统系统现在是希腊语?
    【解决方案2】:

    您必须将本地化字符串放在不同的文件夹中,例如 values-es、values-de、values-fr 等。

    文件必须包含相同的键,例如在 values 文件夹中:

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <string name="hello">Hello</string>
    </resources>
    

    在 values-es 文件夹中:

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <string name="hello">Hola</string>
    </resources>
    

    等等。

    【讨论】:

      【解决方案3】:

      您必须为每种语言创建一个 values 文件夹,使用以下格式添加您想要翻译的语言的语言 ISO 代码:values-es、values-de、... 在每个文件夹中,您必须添加一个strings.xml 及其语言的字符串。 values 文件夹(没有国家代码)将是默认语言。

      选择你想使用的字符串语言:

      import android.app.Activity;
      import android.content.res.Configuration;
      import android.os.Bundle;
      
      public class Main extends Activity {
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
      
          String languageToLoad  = "fa"; // your language
          Locale locale = new Locale(languageToLoad); 
          Locale.setDefault(locale);
          Configuration config = new Configuration();
          config.locale = locale;
          getBaseContext().getResources().updateConfiguration(config, 
          getBaseContext().getResources().getDisplayMetrics());
          this.setContentView(R.layout.main);
        }
      }
      

      【讨论】:

      • 请注意我需要它独立于语言设置,请参阅我的“请注意”
      • 您可以在这种模式下定义字符串并像在这种情况下进行更改:stackoverflow.com/questions/2900023/…
      • 我不打算更改操作系统语言设置。
      • 谢谢!但这会以某种方式改变操作系统语言设置吗?或者只是应用程序使用的语言?我不希望用户退出应用程序并发现他的操作系统语言设置已更改。
      • 我认为它只会更改应用程序语言,我不确定,但您可以尝试使用您的设备或模拟器 :)
      【解决方案4】:

      ad 1。不,你可以拥有尽可能多的。请参阅ad 3 了解更多信息。

      ad 2。 ????

      ad 3。要在我们的应用程序中选择语言,您应该update context。然后会自动选择正确的 xml。阅读 this 了解如何操作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-20
        • 2021-11-18
        • 1970-01-01
        • 1970-01-01
        • 2015-07-31
        • 2021-01-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多