0

Suporte a múltiplos idiomas e formatação de strings no Android

Vítor Guimarães
Vítor Guimarães

Você deseja que seu app seja utilizado por pessoas do mundo todo? Deseja utilizar as strings do seu app de forma mais eficiente? Nesse artigo vou ensinar como disponibilizar seu aplicativo em vários idiomas e algumas dicas de como formatar as strings do seu app.


Uso básico


Para referenciar as strings do nosso app devemos utilizar o arquivo strings.xml localizado por padrão em res/values/string.xml. Em seguida devemos adicionar nossa string utilizando a seguinte sintaxe:


<string name="nome_da_string">Texto da string</string>


Veja alguns exemplos abaixo:


<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="hello">Olá Mundo!</string>
    <string name="good_morning">Bom dia!</string>
</resources>


Para exibir em views (TextView, Buttons etc) devemos utilizar o @string/ seguido do nome da nossa string:


<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/hello" />


Já no código podemos utilizar a função getString():


val string: String = getString(R.string.hello)


Localização


Vamos supor que queremos disponibilizar nosso aplicativo em, Português Brasileiro, Inglês e Espanhol. Para isso vamos criar novas pastas dentro da pasta res do projeto para cada idioma que o app irá suportar e adicionar um arquivo strings.xml para cada pasta.


Nesse exemplo as strings em português ficarão no arquivo padrão, e as strings em Inglês e em Espanhol ficarão respectivamente nas pastas values-en e values-es. Caso o Português Brasileiro não for o idioma padrão, devemos criar a pasta values-pt-rBR para colocar nossas strings.


Estrutura:

MyProject/
    res/
       values/
           strings.xml
       values-en/
           strings.xml
       values-es/
           strings.xml

values/strings.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="hello">Olá Mundo!</string>
</resources>

values-en/strings.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="hello">Hello World!</string>
</resources>

values-es/strings.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="hello">¡Hola Mundo!</string>
</resources>


Agora o app já suporta 3 idiomas diferentes!


Arrays

Além de strings, também podemos armazenar arrays de strings. Vamos supor que vamos precisar exibir a lista de equipes participantes da Formula 1. Para isso podemos fazer como no exemplo abaixo:


<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="formula_one_teams_array">
        <item>Mercedes</item>
        <item>Red Bull Racing</item>
        <item>McLaren</item>
        <item>Ferrari</item>
        <item>Alpine</item>
        <item>Alphatauri</item>
        <item>Aston Martin</item>
        <item>Williams</item>
        <item>Alfa Romeo</item>
        <item>Haas</item>
    </string-array>
</resources>


e carregar o array da seguinte maneira:


val array:Array<String> = resources.getStringArray(R.array.formula_one_teams_array)


Repare que dessa vez utilizaremos o “R.array” ao invés do “R.string”.


Formatando strings


Podemos adicionar placeholders a nossas strings para exibir valores futuramente:


<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="weather_info">Hoje está %1$s e fazem %2$d °C.</string>
</resources>


Nesse exemplo %1$s será uma string e %2$d será um valor decimal


val TAG = MainActivity::class.simpleName
val weather = "ensolarado" 
val temperature = 25

Log.i(TAG, getString(R.string.weather_info,weather,temperature)) //Hoje está ensolarado e fazem 25 °C.


Plurais


O Android também oferece maneiras de adaptar as strings para itens no plural. Cada idioma tem diferentes regras gramaticais, por isso o Android oferece o seguinte conjunto para exibir plurais: zero, one, two, few, many e other.

Para plurais utilizamos o “R.plurals” ao invés do “R.string”.


<?xml version="1.0" encoding="utf-8"?>
<resources>
    <plurals name="scoredPoints">
        <item quantity="one">A equipe marcou %d ponto</item>
        <item quantity="other">A equipe marcou %d pontos</item>
    </plurals>
</resources>


val count = getNumberOfPoints() //10 
val scoredPoints = resources.getQuantityString(R.plurals.scoredPoints, count, count)

Log.i(TAG,scoredPoints) //A equipe marcou 10 pontos


0
0

Comentários (0)

None

Brasil