Language Localization em projetos iOS

Douglas Frari
5 min readAug 27, 2015

Aplicativos estão cada vez mais aptos a serem utilizados globalmente. No entanto, para alcançar esse mercado, os envolvidos na produção do software precisam se atentar à necessidade de internacionalizar os textos que aparecerão na interface. A proposta deste tutorial é demonstrar uma solução que tenho adotado em projetos iOS.

Motivação

Esse tutorial é fruto de uma resposta enviada para o StackOverFlow quando respondi a dúvida de um programador (How do I keep localized Storyboards or XIBs in sync?). Apesar dele não avaliar a resposta como a melhor, achei pertinente compartilhar a solução.

Escrevi um pequeno exemplo e coloquei no GitHub para que outros colegas possam ver como foi feito. A ideia original é do meu amigo @allanragec e foi colocado em prática em nosso projeto.

IOSLocalizationDemo

A proposta propõe utilizar um projeto Xcode (iOS) para dar suporte a internacionalização (do inglês language localization), através de uma infraestrutura com arquivos centralizados, bem como, utilizar uma abordagem complementar que reusa componentes comuns (UILabel, UIButton…), obtendo o conteúdo de acordo com o idioma e com diferencial de não precisar fazer isso programaticamente.

componente customizado para reusar idioma em uso

Conforme descrevi na resposta do StackOverFlow e também no projeto GitHub do IOSLocalizationDemo, isso é apenas uma ideia de abordagem possível. Há outras possibilidades que podem ser implementadas para internacionalização. Porém, a forma como vou descrever mostrou-se mais produtiva no dia a dia.

Para colocar em prática, vamos precisar fazer alguns passos que vou descrever abaixo:

  • Crie um projeto no Xcode e adicione os idiomas desejados; para fazer isso pode-se selecionar na área de configuração do projeto (não dos targets), então as opções de Language podem ser adicionadas na seção Localizations (ver imagem do passo 1);
  • Crie um arquivo para centralizar os textos dos respectivos idiomas; Para isso, escolha no menu de opções (File/ New / File) e então (iOS / Resource / Strings File). Chame o arquivo de "Localizable". Esse método permite centralizar todos os arquivos em um único ponto. Porém, o default é o idioma default (english).
passo 1: adicionando suporte para outros idiomas no Xcode
passo 2: criação arquivo Localizable.strings

Aqui temos que fazer um truque para permitir usar o arquivo criado acima para exibir os outros idiomas, caso contrário, haverá somente um idioma disponível. A ideia é ter essa opção da imagem do passo 2.1. Então vamos para o próximo passo.

passo 2.1: arquivo configurado com 4 idiomas
  • Habilite o arquivo Localizable.strings para suportar outros idiomas; deixe o arquivo selecionado (lado esquerdo) e exiba as propriedades de inspector do Xcode (lado direito). Na seção Localization, escolha os idiomas que você adicionou no passo 1. Mas não marque a opção "Base".
passo 3: habilitando outros idiomas no arquivo centralizado

Os arquivos centralizados para cada idioma seguem o padrão conhecido, onde temos uma chave e seu valor traduzido para o idioma alvo. A imagem acima (passo 3) ilustra um exemplo simples. Agora podemos recuperar o conteúdo programaticamente usando o comando NSLocalizedString.

exemplificando recuperar o o valor programaticamente

Essa abordagem funciona no código e pode ser usada para recuperar as valores e temos que criar uma property IBOutlet no Xcode para cada componente visual como UILabel ou UIButton. Caso deseja-se um UILabel no centro da tela ("Hello World"), teríamos que setar programaticamente e setar a propriedade .text do label. Isso gera um certo trabalho. Como podemos fazer isso sem ter que fazer programaticamente?

Customizando o componente UILabel

A intenção agora é minimizar o esforço de ter que fazer programaticamente o processo descrito acima. Essa foi a ideia do meu colega @allanragec e que testamos usando a seguinte abordagem:

  • Crie uma classe que estenda de UILabel; neste processo podemos editar a classe .m e reescrever o método drawRect(…), conforme a imagem abaixo.
criando uma classe que herda de UILabel e reescrevendo método drawRect
  • Associe no seu componente UILabel com o componente customizado; agora nas propriedades (identify inspector), no campo Class, coloque o nome da classe customizada (DFLabel). Então, na sua tela principal já poderá adicionar no campo Text, colocando a chave de internacionalização desejado.
associando UILabel padrão com DFLabel (customizado)

Assim, não precisará programar essa substituição programaticamente, pois a chave será setada automaticamente pelo método drawRect(), pois a propriedade Text irá representar a chave. Normalmente essa propriedade representa o conteúdo estático do label. Outros UILabels podem ser usados usando essa abordagem economizando tempo de codificação.

Conclusão

Utilizar essa abordagem proporciona ganhos de produtividade além de ser um caminho interessante para prover internacionalização de idiomas.

fonte

O Xcode oferece outras abordagens e métodos para prover a Language Localization, porém, a forma descrita mostrou-se eficaz. Customizar componentes comuns como UILabel, UIButton, etc. promoveu ganhos de tempo durante o desenvolvimento e tornou o processo mais simples.

--

--