代码的本地化生成自然语言字符串

时间:2015-05-25 10:31:00

标签: android localization grammar

我正在编写一个应用程序,我想在其中向用户显示一个字符串,用于描述模型中的对象。我开始考虑本地化,而且我对处理语言之间语法差异的最佳方法感到有点难过。

想象一下,如果在我的模型中我有一个动词,一个对象和一个数量(伪代码):

int _quantity = 6;
String _object = "@string/object";
String _verb = "@string/verb";

这应该用英文呈现为_verb + _quantity + _object(即"吃6个鸡蛋",而在德语中它应该呈现为_quantity + _object + _verb(即" 6个鸡蛋吃#34; ;(但是,显然,使用德语单词代币而不是英语:)))

Android中是否存在针对此类问题的标准方法?

感谢。

1 个答案:

答案 0 :(得分:0)

好的,我已经提出了一个解决方案,根据我所知,这是我能找到的最好的解决方案。如果有人有更好的解决方案,请发帖!

1)在strings.xml中,定义所需的任何文本位(对我来说,这些等同于枚举成员的本地化名称和用于构建自然语言字符串的字符串(稍后详细介绍))

示例:

<resources>
    ...
    <string name="verb_ate">ate</string>
    <string name="verb_threw">threw</string>
    ...
    <string name="modelobject_naturallanguagedescription">I {0} {1} {2}</string>
    ...
</resources>

2)在任何枚举中,用它们用于显示的字符串的资源ID来装饰它们

示例:

public enum VerbType
    Ate(R.string.verb_ate),
    Threw(R.string.verb_threw);

    private final int _stringID;

    private VerbType(int stringID) {
        _stringID = stringID;
    }

    public int getStringID() {
        return _stringID;
    }
}

3)创建一个辅助函数,它将获取模型对象和上下文,并将所需的自然语言字符串(使用java.text.MessageFormat)和每个枚举的辅助函数拼凑在一起:

示例(假设ModelObject具有_verb,_quantity,_object和相关的getter):

public static String getVerb(VerbType v, Context c) {
    return c.getResources().getString(v.getStringID());
}

public static String getNaturalLanguageString(ModelObject o, Context c) {
    MessageFormat mf = new MessageFormat(c.getResources().getString(R.string.modelobject_naturallanguagedescription);
    return mf.format(new Object[] {getVerb(o.getVerb(),c), o.getQuantity(), o.getObject()});
}

所以,完成所有这些后,很容易为另一种语言定义另一个字符串文件(例如德语(我不懂德语,所以语言不会成为正确的)):

<resources>
    ...
    <string name="verb_ate">gegessen</string>
    <string name="verb_threw">gethrown</string>
    ...
    <string name="modelobject_naturallanguagedescription">Ich haben {1} {2} {0}</string>
    ...
</resources>

因此,在英语语言环境中,getNaturalLanguageString可能会返回:

I ate 6 eggs

而在德国语言环境中它可能会返回:

Ich haben 6 eggs gegessen