Android多语言支持:由于占位符计数不同导致的字符串格式问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android多语言支持:由于占位符计数不同导致的字符串格式问题相关的知识,希望对你有一定的参考价值。

我正在制作法语android应用程序,我正在努力支持英语。

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

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

将成为“男人复杂”或“女人复杂”。

我的问题就在于此。字符串翻译,如下......

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

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

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

答案

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

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",    "" )
另一答案

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);

希望这可以帮助你:)

另一答案

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

对于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;
        }

以上是关于Android多语言支持:由于占位符计数不同导致的字符串格式问题的主要内容,如果未能解决你的问题,请参考以下文章

使用gettext提取c#中的多语言占位符(nopCommerce示例篇)

为 Movilizer 应用程序提供本地化/多语言支持

多语言(Java&C#&Ruby&C++&Objective-C&Android)互通的TripleDES加解密算法实现

android多语言的纠结问题

第九章 多语言环境的支持和多屏幕的适配

Android面试题——kotlin相关面试题