Internacionalização (i18n)
Os dois apps suportam Português (pt-BR) como idioma fonte e Espanhol (es) como tradução. O iOS já migrou para o String Catalog moderno; o Android está com a maior parte traduzida e segue em andamento.
iOS · chaves
250
iOS · ES
~98%
Android · PT-BR
1028
Android · ES
~91%
Status por plataforma
| Plataforma | Mecanismo | Idiomas | Status |
|---|---|---|---|
| iOS | Localizable.xcstrings (String Catalog) | pt-BR (fonte) · es | Feito — 250 chaves, es ≈ 98% (244/250) |
| Android | res/values*/strings.xml | pt-BR (default) · es | Em andamento — es ≈ 91% (935/1028) + literais a migrar |
Arquivos
iOS: AppMonisatIos/Localizable.xcstrings ← String Catalog (pt-BR fonte + es) AppMonisatIos/Base.lproj/ ← storyboards/XIBs base project.pbxproj: knownRegions = (en, Base, pt-BR, es); developmentRegion = pt-BR Android: res/values/strings.xml ← pt-BR (default) — 1028 strings + 24 plurals res/values-es/strings.xml ← es — 935 strings + 24 plurals (em andamento)
iOS — String Catalog: o projeto deixou os antigos
Localizable.strings (um por .lproj) e usa um único Localizable.xcstrings (JSON, Xcode 15+). O Xcode extrai automaticamente as chaves de String(localized:) / NSLocalizedString e marca cada tradução como new / needs review / translated. As chaves sem tradução em es caem no texto fonte pt-BR.
Como referenciar strings
| Plataforma | No código | Em layout / UI declarativa |
|---|---|---|
| iOS | String(localized: "chave") / NSLocalizedString("chave", comment:) | Storyboards/XIBs no Base.lproj, traduzidos via catálogo |
| Android | getString(R.string.chave) | android:text="@string/chave" — nunca literal |
Formatação posicional (importante)
Em ES a ordem das palavras muda; argumentos posicionais evitam que os valores troquem de lugar na tradução.
<!-- Android ❌ Problemático --> <string name="msg">Rota %s excede %s km</string> <!-- Android ✓ Correto --> <string name="msg">Rota %1$s excede %2$.1f km</string>
// iOS ✓ — placeholders posicionais no catálogo String(format: String(localized: "Rota %1$@ excede %2$.1f km"), placa, km)
Regra: toda string com mais de um argumento usa índices posicionais (
%1$s/%2$s no Android, %1$@/%2$@ no iOS). Nunca %s %s simples — em ES pode inverter a ordem.Pendências Android (em andamento)
- Completar
values-es/strings.xml— faltam ~93 strings vs o PT-BR (1028). - Migrar literais hardcoded em layouts (
android:text="...") para@string/*. Textos de preview devem usartools:text, nãoandroid:text. - Garantir formatação posicional em todas as mensagens com múltiplos argumentos.