2015-05-25 3 views
-2

Я пишу приложение, в котором я хочу показать строку, описывающую объект в моей модели, пользователю. Я начал думать о локализации, и я немного озадачен лучшим подходом к разнице в грамматике между языками.Локализация генерируемых кодом строк естественного языка

Представьте себе, если в моей модели у меня есть глагол объект и количество (псевдокод):

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

Это должно оказать на английском _verb + _quantity + _object (т.е. «съесть 6 яиц», в то время как в Немецкий должен отображать как _quantity + _object + _verb (т.е. «6 яиц есть» (но, очевидно, с использованием немецких токенов, а не на английском)))

Есть ли стандартный подход к решению этого типа проблем в Android?

Спасибо.

+0

Я предполагаю, что это не так. Я стараюсь не использовать утверждения, которые будут созданы во время выполнения. Локализация может использоваться, когда у вас есть полное статическое предложение. Пример: «есть 6 яиц» должен быть статичным. FYI «static» не является Java static, о котором я говорю. Статические средства предопределены :) – Shrikant

+0

Почему downvotes? Должен ли я перефразировать вопрос? – GHC

+0

@Shrikant Пожалуйста, проверьте решение, которое я разместил, и дайте мне знать, что вы думаете? – GHC

ответ

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) в любых перечислений, украшают их в ресурсах идентификаторы строк, которые они должны использовать для отображения

Пример:

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 
Смежные вопросы