Internacionalização (i18n) em Swift: NSLocalizedString e String Catalog

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Internacionalização (i18n) em Swift: guia completo para iOS e macOS

\n\n

Internacionalização (i18n) é o processo de projetar um aplicativo de forma que ele possa ser adaptado para diferentes idiomas e regiões sem alterações de engenharia. No ecossistema Apple (iOS, macOS, watchOS, tvOS), as ferramentas de localização estão integradas diretamente no Swift e no Xcode. Neste artigo, vamos detalhar como usar NSLocalizedString e o moderno String Catalog para criar aplicativos multilíngues.

\n\n

Fundamentos: NSLocalizedString

\n\n

O mecanismo básico de internacionalização em Swift é a função NSLocalizedString. Ela busca a tradução da string nos arquivos .strings ou .xcstrings (String Catalog).

\n\n
let greeting = NSLocalizedString("hello_world", comment: "Saudação na tela inicial")\nprint(greeting) // Exibirá a tradução de acordo com o idioma do dispositivo
\n\n

O parâmetro comment serve como dica para o tradutor. A chave "hello_world" deve ser única em todo o projeto.

\n\n

Criação de arquivos de localização

\n\n

No Xcode, você pode adicionar idiomas suportados através de Project Info > Localizations. Depois disso, para cada arquivo .strings ou Storyboard, serão criados subarquivos de localização.

\n\n

Exemplo de conteúdo do Localizable.strings (inglês):

\n
"hello_world" = "Hello, World!";\n"welcome_message" = "Welcome to our app %@";
\n\n

Versão em português (Localizable.strings (Portuguese)):

\n
"hello_world" = "Olá, Mundo!";\n"welcome_message" = "Bem-vindo ao nosso aplicativo %@";
\n\n

Formatação de strings com parâmetros

\n\n

Para strings que contêm dados dinâmicos, use especificadores de formato. Em Swift, isso pode ser feito de duas maneiras:

\n\n

Método 1: String(format:)

\n
let userName = "João"\nlet points = 150\nlet message = String(format: NSLocalizedString("user_score", comment: "Pontuação do usuário"), userName, points)\nprint(message) // "João marcou 150 pontos"
\n\n

No arquivo de localização:

\n
"user_score" = "%@ marcou %d pontos";
\n\n

Método 2: Swift String Interpolation (iOS 15+)

\n
let message = "\\(userName) marcou \\(points) pontos"
\n

No entanto, este método não é adequado para localização, pois a ordem das palavras pode variar em diferentes idiomas. Use apenas String(format:) ou AttributedString com inflexão.

\n\n

Pluralização (formas plurais)

\n\n

Em português, existem regras complexas de plural: "1 arquivo", "2 arquivos", "5 arquivos". Para isso, a Apple fornece stringsdict (XML) ou String Catalog com regras de pluralização.

\n\n

Exemplo de stringsdict

\n
<?xml version="1.0" encoding="UTF-8"?>\n<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"\n  "http://www.apple.com/DTDs/PropertyList-1.0.dtd">\n<plist version="1.0">\n<dict>\n    <key>files_count</key>\n    <dict>\n        <key>NSStringLocalizedFormatKey</key>\n        <string>%#@files@</string>\n        <key>files</key>\n        <dict>\n            <key>NSStringFormatSpecTypeKey</key>\n            <string>NSStringPluralRuleType</string>\n            <key>NSStringFormatValueTypeKey</key>\n            <string>d</string>\n            <key>one</key>\n            <string>%d arquivo</string>\n            <key>few</key>\n            <string>%d arquivos</string>\n            <key>many</key>\n            <string>%d arquivos</string>\n            <key>other</key>\n            <string>%d arquivos</string>\n        </dict>                    

Recommendations