Использование xliff-плейсхолдеров в строковых ресурсах

| 14.10.2014

Представим себе ситуацию, когда ваш проект включает в себя несколько строковых ресурсов, часть содержимого которых должно генерироваться динамически. Конечно же, можно поделить строку на несколько частей, а потом уже строить из них финальную строку программно. Однако, это очень неудобно и серьезно засоряет код. Для решения подобной задачи целесообразнее использовать xliff-плейсхолдеры. Рассмотрим пример.

Создадим простой проект с одним экраном, где будет отображаться один элемент TextView с именем и фамилией пользователя. Текст для TextView мы будем задавать программно.

Вот так будет выглядеть наш layout:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    tools:context=".MainActivity">

    <TextView
        android:text="@string/hello_world"
        android:id="@+id/txt"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</RelativeLayout>

Строковые ресурсы res/values/strings.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="rn:oasis:names:tc:xliff:document:1.2">

    <string name="app_name">Xliff</string>
    <string name="hello_world">Hello world!</string>
    <string name="action_settings">Settings</string>
    <string name="title">Ваше имя: <xliff:g id="name" example="Andrew" >%2$s</xliff:g>, 
        фамилия: <xliff:g id="last_name" example="Poleshuk" >%1$s</xliff:g> 
    </string>
</resources>

Как вы уже, наверное, подметили, ресурс «title» включает в себя несколько вставок, обрамленных в тег xliff. Это как раз части строки, которые мы будем заполнять динамически. Каждый тег xliff включает в себя также атрибуты id с уникальным именем тега и example с примером его содержимого.

Теперь, как мы получаем это ресурс и заполняем участки с xliff:

MainActivity.java

package ru.androiddocs.xliff;

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.widget.TextView;


public class MainActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TextView txt = (TextView) findViewById(R.id.txt);
        txt.setText(getString(R.string.title, "Иванов", "Сергей"));
    }
}

По сути, все происходит в строке:

txt.setText(getString(R.string.title, "Иванов", "Сергей"));

Здесь мы с помощью метода getString() достаем нужный ресурс, где первый параметр — это id ресурса, второй параметр «Иванов» заменит плэйсхолдер %1$s, а третий — «Сергей» заменит %2$s.

Я тут нарочно поменял местами имя и фамилию, чтобы было более наглядно, как используется порядок аргументов. Когда вы указываете в плэйсхолдерах число %1 или %2, то это, по сути, номер строкового параметра. В строке можно использовать несколько раз один и тот же плэйсхолдер, например, %1$s, и он везде будет заполнен одним и тем же параметром — «Иванов».

Вот так приложение выглядит после запуска:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*