ОК, я придумал решение, основанное на том, что я знаю, лучшее, что я могу найти. Если у кого-то есть лучшее решение, напишите!
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) в любых перечислений, украшают их в ресурсах идентификаторы строк, которые они должны использовать для отображения
Пример:
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 и соответствующие методы получения):
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()});
}
Итак, проделав все это, достаточно просто определить файл другой строки для другого языка (немецкий, например (я не» t знать немецкий, поэтому язык не будет правильным)):
<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
Я предполагаю, что это не так. Я стараюсь не использовать утверждения, которые будут созданы во время выполнения. Локализация может использоваться, когда у вас есть полное статическое предложение. Пример: «есть 6 яиц» должен быть статичным. FYI «static» не является Java static, о котором я говорю. Статические средства предопределены :) – Shrikant
Почему downvotes? Должен ли я перефразировать вопрос? – GHC
@Shrikant Пожалуйста, проверьте решение, которое я разместил, и дайте мне знать, что вы думаете? – GHC