Как мне заставить Android переводить логические значения?

В Android Studio я пытаюсь локализовать на испанский язык, используя xliff, строку, которая получает логическое значение.

На английском мой строковый ресурс выглядит так:

<string name="true_false_test">True/False?      <xliff:g example="true" id="true_false">%b</xliff:g></string>

По-испански вот так:

<string name="true_false_test">Verdadero/Falso? <xliff:g id="true_false" example="true">%b</xliff:g></string>

Когда приложение работает на английском языке, это дает один из:

  • True/False? правда
  • True/False? ложный

Но на испанском языке реальное логическое значение, похоже, не переводится:

  • Verdadero/Falso? правда
  • Verdadero/Falso? ложный

Как мне заставить Android переводить логические значения?

3 ответа

Я встретил ту же проблему только сейчас. Затем я обошел вокруг и понял это. Хотя этот вопрос был опубликован 2 года назад, я думаю, что мое решение может быть полезным.

Мы можем создать строки для true а также false для разных языков в файлах ресурсов:

Для английского:

<string name="boolean_true">true</string>
<string name="boolean_false">false</string>

Для китайцев:

<string name="boolean_true">是</string>
<string name="boolean_false">否</string>

Тогда мы можем перевести boolean ценности на любые языки, которые мы хотим:

boolean isActive = false;
String  strIsActive = isActive
                      ? getString(R.string.boolean_true)
                      : getString(R.string.boolean_false);

Я в классе Android также.. Я думаю, что формат для логического выражения "%B" с заглавной буквы "B", а не в нижнем регистре "b". Увидимся на расслабленной..

<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
    <string name="whip">whip?<xliff:g id="whip">%B</xliff:g></string>
</resources>

private String createOrderSummary(int price) {
    String mess = "Name: "+ getName() +"\n";
    mess += getString(R.string.add_whipped_cream, whip);///whip IS A BOOL VAL.
    return  mess;
}

Я не нашел "простого" решения, но смог обойти эту задачу вот так. Протестировано в Android Studio и на 6.0.1 Android.

Во-первых, в файле res/strings.xml: в теге 'resources' укажите свои локализованные значения true / false, например:

<string name="TRUE">Ja</string>
<string name="FALSE">Nein</string>

Определите вашу строку с помощью тега xliff, используя % s (НЕ%b!) Следующим образом:

<string name="does_mary_have_a_little_lamb">Does Mary have a little lamb? <xliff:g name="trueFalse" example="true">%s</xliff:g>

** Пример ниже находится внутри класса mainActivity.java. Ваша заявка может отличаться. Пожалуйста, обратите внимание на пространство имен. **

В вашем Java-коде создайте функцию для преобразования логических значений в локализованное строковое представление:

/**
 * function to convert boolean values to localized true / false strings
 * @param b boolean to be translated
 * @return String containing localized true / false message
 */
private String translateBoolean(boolean b) {
    String trueFalse = Boolean.toString(b).toUpperCase(); // true / false is a reserved keyword, so convert to TRUE / FALSE
    String packageName = getPackageName();
    int resId = getResources().getIdentifier(trueFalse, "string", packageName);

    // this is to make sure that we got a valid resId else getString() will force close
    if (resId > 0) {
        return getString(resId);
    }
    else
    {
        return trueFalse; // provide a fallback 'true/false' if translation is not available
    }
}

Затем используйте его в своих строковых функциях следующим образом:

String output = getString(R.string.does_mary_have_a_little_lamb,translateBoolean(hasLittleLamb)) + "\n";

Вы можете легко расширить приведенный выше пример, чтобы учесть переводы да / нет, вверх / вниз и т. Д. Поскольку этот метод довольно дорогой, вы можете рассмотреть кэширование результатов, если вы интенсивно его используете.

Другие вопросы по тегам