|
Documentação
Agende uma demoPlataforma
PlataformaMCPCLIAPIWorkflows
Guias
Changelog

Localização

  • Visão geral
  • API de Tradução
  • Localização de apps web
  • Localização de aplicativos mobile
  • iOS com String Catalogs
  • Android com strings.xml
  • Localização de e-mails
  • Conteúdo estático (ex.: .md, .json)
  • Next.js com Markdoc
  • Rails com i18n

Workflows

  • Configuração do engine com MCP
  • Triagem no Jira
  • CI/CD

Localização de apps Android com strings.xml

A CLI da Lingo.dev traduz recursos de string do Android (strings.xml) por meio de um engine de localização configurado. O tipo de bucket android da CLI entende nativamente os elementos <resources>, <string>, <string-array> e <plurals>, preservando a estrutura do XML e gerando as categorias de plural corretas para cada idioma de destino.

Este guia mostra como localizar um app Android de ponta a ponta: configurar a CLI, traduzir localmente e automatizar com GitHub Actions para que as traduções sejam entregues a cada push.

Repositório de demonstração

Faça clone ou fork de lingodotdev/android-app-localization-example para acompanhar o passo a passo. O repositório inclui um projeto Android funcional com recursos de string, uma configuração da CLI da Lingo.dev e um workflow do GitHub Actions.

Como funciona a localização no Android#

O Android usa uma convenção de diretórios de recursos em que cada idioma tem seu próprio diretório values-[locale]/. Em tempo de execução, o sistema carrega o strings.xml correto com base na configuração de idioma do dispositivo.

text
app/src/main/res/
  values/              # Default (source) strings
    strings.xml
  values-es/           # Spanish
    strings.xml
  values-fr/           # French
    strings.xml
  values-ja/           # Japanese
    strings.xml

Um strings.xml típico contém três tipos de elementos:

xml
<resources>
  <!-- Simple strings -->
  <string name="app_name">My App</string>
  <string name="welcome_message">Welcome back!</string>

  <!-- String arrays -->
  <string-array name="planets">
    <item>Mercury</item>
    <item>Venus</item>
    <item>Earth</item>
  </string-array>

  <!-- Plurals -->
  <plurals name="items_count">
    <item quantity="one">%d item</item>
    <item quantity="other">%d items</item>
  </plurals>
</resources>

A CLI analisa os três tipos de elementos, traduz o conteúdo por meio do engine de localização e grava arquivos por idioma nos diretórios values-[locale]/ corretos.

Pré-requisitos#

1

Crie um engine de localização

Cada execução da CLI envia o conteúdo para um engine de localização — a configuração que determina qual modelo de LLM, glossário, voz da marca e instruções serão aplicados. Crie um no dashboard da Lingo.dev e gere uma chave de API.

2

Verifique o Node.js

A CLI requer Node.js 18 ou superior:

bash
node -v
3

Configure seu projeto Android

Seu projeto precisa de um strings.xml padrão em app/src/main/res/values/. O Android Studio cria esse arquivo quando você inicia um novo projeto. Consulte o guia de localização do Android para configurar os diretórios de recursos.

Configure a CLI#

Crie um arquivo i18n.json na raiz do projeto. O bucket android instrui a CLI a analisar os recursos XML do Android e criar arquivos separados por idioma:

json
{
  "$schema": "https://lingo.dev/schema/i18n.json",
  "version": "1.15",
  "locale": {
    "source": "en",
    "targets": ["es", "fr", "de", "ja"]
  },
  "buckets": {
    "android": {
      "include": ["app/src/main/res/values-[locale]/strings.xml"]
    }
  }
}

O placeholder [locale] é resolvido para cada código de idioma configurado em tempo de execução. A CLI substitui o idioma de origem no padrão — então, com source: "en", ela procura por values-en/strings.xml. Os idiomas de destino geram values-es/strings.xml, values-fr/strings.xml e assim por diante.

Conecte o diretório do idioma padrão#

O Android armazena as strings padrão em values/ (sem sufixo de idioma), mas a CLI resolve [locale] literalmente e procura por values-en/strings.xml. Crie um symlink para conectar as duas convenções:

bash
cd app/src/main/res
ln -s values values-en

Isso deixa as strings de origem visíveis tanto em values/strings.xml (onde o Android espera encontrá-las) quanto em values-en/strings.xml (onde a CLI procura). Faça commit do symlink no repositório — o git rastreia symlinks nativamente no macOS e no Linux.

Windows

No Windows, o Git pode fazer checkout de symlinks como arquivos de texto simples, dependendo da sua configuração. Se você estiver no Windows, execute git config core.symlinks true antes de clonar ou copie o diretório values/ para values-en/.

Vários arquivos de recursos

Se o projeto dividir as strings em vários arquivos (por exemplo, strings.xml e arrays.xml), liste todos eles. O symlink cobre o diretório inteiro, então todos os arquivos dentro de values/ ficam acessíveis em values-en/:

json
{
  "buckets": {
    "android": {
      "include": [
        "app/src/main/res/values-[locale]/strings.xml",
        "app/src/main/res/values-[locale]/arrays.xml"
      ]
    }
  }
}

Traduza localmente#

Defina sua chave de API e execute a CLI:

bash
export LINGO_API_KEY="your-api-key"
npx lingo.dev@latest run

A CLI lê o strings.xml de origem, identifica entradas ainda não traduzidas usando o lockfile, traduz o delta por meio do engine de localização e grava os resultados nos diretórios de destino values-[locale]/. Abra qualquer arquivo de destino para ver as strings traduzidas.

Para segmentar um idioma específico durante o desenvolvimento:

bash
npx lingo.dev@latest run --target-locale es

Plurais#

O Android usa elementos <plurals> com strings de quantidade do CLDR (zero, one, two, few, many, other) para lidar com formas de plural. Idiomas diferentes exigem categorias de plural diferentes — o inglês precisa de duas (one e other), o russo precisa de quatro e o árabe precisa de seis.

A CLI preserva a estrutura de <plurals> durante a tradução e gera as entradas de quantidade corretas para cada idioma de destino. Uma entrada de origem com duas categorias:

xml
<plurals name="messages_count">
  <item quantity="one">%d new message</item>
  <item quantity="other">%d new messages</item>
</plurals>

Gera as categorias corretas para cada idioma de destino. O engine de localização sabe quais regras de plural do CLDR se aplicam a cada idioma e gera apenas as categorias exigidas por aquela língua.

Bloqueio de chaves#

Alguns valores de string precisam permanecer idênticos em todos os idiomas — nomes de marca, endpoints de API ou padrões de formatação. Use o bloqueio de chaves para copiar esses valores sem traduzi-los:

json
{
  "buckets": {
    "android": {
      "include": ["app/src/main/res/values-[locale]/strings.xml"],
      "lockedKeys": ["app_name", "api_base_url"]
    }
  }
}

As chaves bloqueadas são copiadas da origem para todos os arquivos de destino sem passar pelo pipeline de tradução.

Automatize com GitHub Actions#

Adicione um arquivo de workflow em .github/workflows/translate.yml para traduzir a cada push:

As traduções fazem commit diretamente na main — sem atrito, ideal para equipes pequenas:

yaml
name: Translate
on:
  push:
    branches: [main]
permissions:
  contents: write
jobs:
  translate:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Lingo.dev
        uses: lingodotdev/lingo.dev@main
        with:
          api-key: ${{ secrets.LINGODOTDEV_API_KEY }}

Armazene sua chave de API como LINGODOTDEV_API_KEY em Settings > Secrets and variables > Actions no repositório do GitHub.

Verifique antes de implantar#

Use a flag --frozen como gate de deploy para garantir que nenhuma string sem tradução chegue à produção. A CLI retorna um status diferente de zero se alguma entrada precisar de tradução:

bash
npx lingo.dev@latest run --frozen

Adicione isso como uma etapa separada de CI antes do build:

yaml
- name: Verify translations
  run: npx lingo.dev@latest run --frozen

Próximos passos#

Localização de apps móveis
Visão geral de todas as plataformas móveis — iOS, Android, Flutter e React Native
Workflows de CI/CD
Padrões para GitHub Actions, GitLab CI e Bitbucket Pipelines
Glossários
Bloqueie nomes de marca e termos técnicos para que não sejam traduzidos
Bloqueio de chaves
Copie valores específicos sem traduzi-los

Esta página foi útil?

Max PrilutskiyMax Prilutskiy·Atualizado há 3 meses·5 min de leitura