【问题标题】:Android multilanguage support: string formatting issue due to different placeholder countsAndroid 多语言支持:由于占位符计数不同导致的字符串格式问题
【发布时间】:2019-02-05 07:34:04
【问题描述】:

我正在制作一个法语 Android 应用,我正在尝试支持英语。

我使用“占位符”来格式化我的字符串,这样我就可以将它们调整为适合男性和女性用户。例如,该串中的我的strings.xml文件:

<string name="encouraging_comment">
    Les %1$s sont compliqué%2$ss...
</string>

将成为 “莱斯的社强> SONTcompliqués”( “的男性强>是复杂的”)或“莱斯的 FEMMES 强> SONTcompliqué的Ë S”( “女性强>是复杂的”)。

和蹉跎了我的问题。字符串翻译,如下... P>

<string name="encouraging_comment">
    %1$s are complicated...
</string>

...只需要一个占位符,而法语等价物需要两个。

我如何管理这个问题? 提前致谢。

【问题讨论】:

    标签: android xml string localization string-formatting


    【解决方案1】:

    在渲染字符串时,只需从英文模板字符串中省略第二个占位符,并为第二个参数使用一个空字符串(或任何其他字符串,没关系,该值将被忽略):

    XML:

    <string name="encouraging_comment">
        %1$s are complicated...
    </string>
    

    Java:

    getString(R.string.encouraging_comment, "women", "");
    getString(R.string.encouraging_comment, "men", "");
    

    这是有效的,因为如果有 更多 个参数比占位符,只有当有 更少 个参数比占位符时,这不是错误。

    我假设您将拥有某种表格或映射,您可以在其中根据语言和性别查找占位符值。在伪代码中:

    (French,  Female) -> ("femmes", "e")
    (French,  Male)   -> ("hommes", "" )
    (English, Female) -> ("women",  "" )
    (English, Male)   -> ("men",    "" )
    

    【讨论】:

      【解决方案2】:

      AFAIK,您可以通过在代码中添加检查来做到这一点

      String result;
      if ( Locale.getDefault().getLanguage().equals("en")){  // examples "en", "fr", "sp"
            result= getString(R.string.encouraging_comment, myString);
          }
          else{
            result= getString(R.string.encouraging_comment, myString, myStringTwo);
          }
      textView.setText(result);
      

      希望对你有帮助:)

      【讨论】:

      • 遗憾的是,这给了我一个 Wrong argument count 在“english”块中的错误;我猜它计算了默认字符串的参数。
      • @Eva 你能分享错误或你的代码片段你如何使用这个代码
      • 有趣的事情:使用此代码 if(getString(R.string.locale).equals(Constantes.LOCALE_EN)) {s=res.getString(R.string.str, "...","");} 错误/警告显示“错误的参数计数,格式字符串 encouraging_comment 需要 2,但格式调用提供 1”。而对于这个if(getString(R.string.locale).equals(Constantes.LOCALE_EN)) {s=res.getString(R.string.str, "...","");},它会出现“错误的参数计数,格式字符串encouraging_comment 需要1,但格式调用提供2”。在这两种情况下,尽管应用程序都可以正常工作而不会崩溃!
      【解决方案3】:

      一种方法是在您的strings.xml 中创建一个字符串locale

      对于 English Strings.xml

      <string name="locale">En</string>
      

      对于 French Strings.xml

      <string name="locale">Fr</string>  
      

      然后在设置字符串时

       switch (getString(R.string.locale)) {
                  case "Fr":
                      //set your string for French
                      break;
                  case "En":
                      //set your string for English 
                      break;
              }
      

      【讨论】:

        猜你喜欢
        • 2015-12-22
        • 2022-11-16
        • 1970-01-01
        • 1970-01-01
        • 2013-02-13
        • 1970-01-01
        • 2012-09-01
        • 1970-01-01
        • 2016-12-23
        相关资源
        最近更新 更多