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

4

我是一个法语的 Android 应用程序开发者,我正在尝试支持英文。

我使用“占位符”来格式化我的字符串,这样我就可以根据男性和女性用户进行调整。例如,在我的strings.xml文件中,有这个字符串:

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

将变为“Les hommes sont compliqués”(“Men are complicated”)或“Les femmes sont compliquées”(“Women are complicated”)。

这就是我的问题所在。字符串翻译如下所示...

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

当法语需要两个占位符时,中文只需要一个占位符。

我该如何解决这个问题? 提前感谢您的帮助。

3个回答

1
据我所知,您可以通过在代码中添加检查来实现此操作,例如:
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);

希望这能对你有所帮助 :)

遗憾的是,在“english”块中这给我一个“参数数量错误”的错误; 我猜它会计算默认字符串的参数。 - Eva
@Eva,你能分享一下错误信息或者你的代码片段吗?你是如何使用这段代码的? - Abdul Kawee
有趣的事情:使用以下代码 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个”的错误。但在这两种情况下,应用程序都可以正常工作,不会崩溃! - Eva

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",    "" )

0
一种方法是在你的 strings.xml 文件中创建一个字符串 locale
对于 英文 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;
        }

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