Улучшение строковых ресурсов Android с помощью XLIFF

Я видел некоторые приложения Google и образцы кода, использующие теги XLIFF для переноса переменных. Я вижу в этом большие преимущества, особенно для замены неописательных аргументов формата, таких как %1$s.

К сожалению, XLIFF плохо интегрируется в ADT. Возьмем, к примеру, следующий строковый ресурс:

<resources 
    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" 
    xmlns:tools="http://schemas.android.com/tools">

    <string name="share_with_application">
        Share your score of <xliff:g id="score" example="1337">%1$s</xliff:g>
        with <xliff:g id="application_name" example="Bluetooth">%2$s</xliff:g>!  
    </string>

</resources>

Предварительный просмотр графического макета

В приведенном выше примере строка усекается после первого тега <xliff>. Можно было бы также ожидать, что будет использоваться атрибут example, что приведет к графическому предварительному просмотру, показывающему:

Поделитесь своим счетом 1337 с Bluetooth!

Есть ли смысл использовать теги XLIFF в моих строковых ресурсах?


person Paul Lammertsma    schedule 04.07.2012    source источник
comment
Я видел некоторые приложения Google и образцы кода, использующие теги XLIFF для переноса переменных — если у вас есть пример какого-либо проекта Android, не считая приложений AOSP, в котором используется XLIFF, укажите нам на него. Приложения AOSP имеют собственный процесс сборки, который может интегрировать XLIFF. Использование XLIFF не задокументировано как поддерживаемое Android SDK.   -  person CommonsWare    schedule 04.07.2012
comment
Спасибо за понимание. Похоже, что образцы strings.xml в каталоге SDK имеют только объявление пространства имен XLIFF и фактически не используют теги. Можете ли вы дать больше информации об этих пользовательских процессах сборки? Это плагины Jenkins?   -  person Paul Lammertsma    schedule 04.07.2012
comment
Можете ли вы дать больше информации об этих пользовательских процессах сборки? - эти приложения создаются как часть полной сборки прошивки (например, lunch), но я никогда не делал полную сборку прошивки, не говоря уже о том, чтобы анализировать все детали того, что она делает. Это плагины Jenkins? -- Я очень в этом сомневаюсь; по крайней мере, вам не нужен Jenkins для сборки прошивки.   -  person CommonsWare    schedule 04.07.2012
comment
@CommonsWare Только что наткнулся на этот тег, просматривая какой-то источник. Я нашел раздел в документации, в котором предлагается использовать чтобы пометить определенные разделы string как непереводимые. Так безопасно ли это использовать сейчас? ADT по-прежнему не распознает его, но тестирование на реальном устройстве проходит нормально.   -  person Tony Chan    schedule 23.05.2013
comment
@Turbo: Ну, по крайней мере, <xliff:g> должен быть в безопасности. Работает ли что-то сверх этого, я не могу сказать.   -  person CommonsWare    schedule 24.05.2013


Ответы (3)


Мы только что добавили поддержку этого в Android Studio для версии 0.3: https://android-review.googlesource.com/#/c/67724/

person Tor Norbye    schedule 10.10.2013
comment
Планируется ли это и для Eclipse? Также можете ли вы подтвердить, что целью тега xliff является пометка непереводимого текста или у него есть другие цели? - person Tony Chan; 22.10.2013
comment
Согласно документации Android, тег xliff:g предназначен для маркировки непереводимого текста: developer.android.com/distribute/googleplay/publish/ - person ZoFreX; 13.02.2014
comment
Приведенный выше URL-адрес, упомянутый @ZoFreX, был перемещен: developer.android.com/ руководство/темы/ресурсы/ - person Paul Lammertsma; 14.07.2017

Просто для ясности: использование тегов XLIFF в строковых ресурсах Android полностью задокументировано на

https://developer.android.com/distribute/tools/localization-checklist.html#manage-strings

Такие строки прекрасно работают даже в сборках Eclipse (поддержка есть в инструменте aapt, который создает приложения).

Однако, как показано в вопросе, инструменты графического макета, содержащиеся в ADT, не учитывают тег xliff, просто усекая строку после первой такой размеченной подстроки.

Графические инструменты в Android Studio хорошо справляются с такими строками, зная и используя разметку xliff.

На самом деле я обнаружил, что полное <xliff:g> в моем исходном коде довольно многословно, поэтому я корректирую объявление namepsace, чтобы позволить мне использовать только <x:g>, таким образом:

<resources xmlns:x="urn:oasis:names:tc:xliff:document:1.2">

   <string name="greeting">Hello <x:g id="name">%1$s</x:g>!</string>

</resources>
person zmarties    schedule 19.08.2014

Теперь, когда я испачкал руки сборкой AOSP из исходного кода, CommonsWare прав: этот процесс сборки совершенно другой, и действительно, многие приложения AOSP содержат теги XLIFF. Жаль, что это не интегрируется с ADT, но это так.

person Paul Lammertsma    schedule 05.01.2013