Por que seu aplicativo precisa de internacionalização?
Imagine: você criou um aplicativo iOS incrível. Ele funciona perfeitamente, a interface é um espetáculo, e usuários do Brasil dão cinco estrelas. Mas e se seu código falar inglês? Ou chinês? Ou árabe, onde o texto é lido da direita para a esquerda?
Internacionalização em Swift não é apenas traduzir botões. É uma abordagem arquitetônica que permite que seu aplicativo fale a língua do usuário, respeite suas diferenças culturais (formatos de data, moedas, unidades de medida) e não quebre ao mudar de localidade.
Neste artigo, vamos abordar como implementar corretamente i18n (internationalization) em um projeto Swift, usando ferramentas modernas do Xcode e melhores práticas. Pronto para tornar seu código um cidadão do mundo? Vamos lá!
Fundamentos da localização em Swift: de NSLocalizedString a String Catalog
Abordagem clássica: NSLocalizedString
A ferramenta mais básica é a macro NSLocalizedString. Ela busca a tradução em arquivos .strings e, se não encontrar, exibe a chave (ou o valor padrão).
let hello = NSLocalizedString("hello_world", comment: "Saudação na tela principal")
print(hello) // Exibe a tradução de acordo com o idioma do dispositivo
O comentário não é mera formalidade. Ele ajuda os tradutores a entender o contexto: "hello_world" pode ser tanto uma saudação quanto o nome de uma seção. Sempre escreva um comment significativo.
String Catalog — o novo padrão (Xcode 15+)
Esqueça dezenas de arquivos Localizable.strings. No Xcode 15, surgiram os String Catalogs (.xcstrings). É um único arquivo com suporte a múltiplos idiomas, pluralização e notas contextuais.
Para criar um catálogo: File → New → File → String Catalog. Adicione uma chave — e pronto:
// O código permanece o mesmo!
let welcome = NSLocalizedString("welcome_message", comment: "Saudação para novo usuário")
// No String Catalog, você simplesmente adiciona as traduções para en, pt-BR, ar, etc.
Vantagens: não precisa sincronizar arquivos, menos chances de erro com codificação, suporte embutido para pluralização.
Formatação de números e datas: código cultural
Erro: definir o formato da data como "dd/MM/yyyy". Nos EUA, escrevem "MM/dd/yyyy", no Japão — "yyyy年MM月dd日". Swift resolve com DateFormatter e NumberFormatter.
Datas que não envergonham
let date = Date()
let formatter = DateFormatter()
formatter.dateStyle = .long
formatter.timeStyle = .none
formatter.locale = Locale.current // Ajusta automaticamente ao idioma do dispositivo
let localizedDate = formatter.string(from: date)
// Para en: "January 15, 2025"
// Para pt-BR: "15 de janeiro de 2025"
// Para de: "15. Januar 2025"
print(localizedDate)
Nada de strings dateFormat! Use .short, .medium, .long — eles já consideram as regras culturais.
Números e moedas: respeite vírgulas e pontos
No Brasil, o número 1234.56 é escrito como "1.234,56", e nos EUA — "1,234.56". O NumberFormatter sabe disso:
let price = 1234.56
let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .currency
numberFormatter.locale = Locale.current
let localizedPrice = numberFormatter.string(from: NSNumber(value: price))!
// Para en_US: "$1,234.56"
// Para pt_BR: "R$ 1.234,56"
// Para de_DE: "1.234,56 €"
print(localizedPrice)
Pluralização: um, dois, muitos — não adivinhe
A regra "um — muitos" funciona apenas em inglês. Em português, há "1 minuto", "2 minutos", "5 minutos". Em árabe, seis formas! O String Catalog e NSStringPluralRule resolvem isso elegantemente.
No String Catalog, você adiciona uma chave, define o tipo como "Plural" e preenche as formas:
// No código