Com o mundo sendo um mercado global hoje em dia, a capacidade de seus aplicativos móveis estarem em diferentes idiomas e culturas não é apenas uma opção, mas uma necessidade. A localização melhora a experiência do usuário, amplia seu alcance e pode ter um grande impacto no sucesso do software em nível internacional.
Para os desenvolvedores iOS, o Swift oferece ferramentas poderosas para incorporar facilmente a localização aos aplicativos. Este guia explica a transição na localização em Swift, desde as técnicas iniciais até a ferramenta mais recente, para ajudar os desenvolvedores a aproveitar ao máximo esses recursos.
Inicialmente, quando o Swift foi introduzido pela primeira vez, ele herdou a infraestrutura de localização do Objective-C, que foi construída em torno do arquivo Localizable.strings
e da função NSLocalizedString
. Dessa forma, os desenvolvedores tiveram que editar manualmente as strings localizadas e sincronizá-las em arquivos de idiomas diferentes, um processo que é propenso a erros e demorado.
Localizable.strings
O arquivo Localizável é um arquivo simples de par chave-valor onde as strings são armazenadas no formato "key" = "value" , onde "key" é o identificador do código e "value" é a string localizada que o usuário verá. Este arquivo precisa ser duplicado e traduzido para cada idioma suportado e colocado nos diretórios '.lproj' correspondentes apropriados, como 'en.lproj' para o idioma inglês e 'de.lproj' para o idioma alemão.
Localizable.strings
: "hello_world_key" = "Hello, World!";
No código Swift, esta string pode ser recuperada como:
let greeting = NSLocalizedString("hello_world_key", comment: "The default greeting")
A função NSLocalizedString facilita o acesso ao conteúdo localizado usando chaves de Localizable.strings
.
Esta função pega uma chave, fornece um valor substituto e coloca um comentário para os tradutores. Oferecer um comentário é crucial, pois dá aos tradutores o subtexto para melhorar a precisão e a adequação das traduções.
Exemplo: cumprimentando um usuário com base na hora do dia:
func greetingBasedOnTime() -> String { let hour = Calendar.current.component(.hour, from: Date()) let key = hour < 12 ? "good_morning_key" : "good_evening_key" return NSLocalizedString(key, comment: "Greeting based on time of day") }
Com Localizable.strings
correspondente , entradas parecidas com:
"good_morning_key" = "Good morning!"; "good_evening_key" = "Good evening!";
Aqui estão alguns desafios com Localizable. strings que você pode enfrentar:
1) Problemas de escalabilidade.
À medida que o número de strings aumenta, fica difícil manuseá-las. Gerenciar vários arquivos .strings ao longo do tempo torna-se complicado.
2) Duplicação.
Cada idioma exigia um arquivo separado, levando a possíveis inconsistências e esforços duplicados no gerenciamento de strings. Com suporte para um idioma, pode não ser um problema, mas quando você precisa gerenciar vários idiomas, às vezes torna-se muito problemático.
3) Falta de contexto.
No entanto, os comentários podem ser adicionados em NSLocalizedString – mesmo que nem sempre ajudem o tradutor a compreender totalmente o contexto, isso pode resultar em imprecisões na tradução. Os desenvolvedores geralmente têm preguiça de preenchê-los adequadamente.
stringsdict
para pluralização A introdução dos arquivos stringsdict
trouxe uma melhoria significativa para a localização do Swift, que abordou principalmente os problemas de pluralização. A principal causa é que os plurais das línguas são formados de forma diferente, e o que pode ser eficaz para o inglês pode não o ser para outras línguas, como o russo ou o árabe.
Antes da introdução do stringsdict
, era muito difícil gerenciá-los. stringsdict
permite que os programadores determinem regras para categorias como “um”, “poucos”, “muitos” e “outros”, que garantem o mesmo nível de correção na tradução entre idiomas.
Noções básicas sobre arquivos stringsdict
O arquivo Stringsdict
é uma lista de propriedades XML, usada para criar strings que são localizadas dependendo de valores numéricos. Esta funcionalidade destina-se a processar corretamente formas plurais porque diferentes idiomas têm suas próprias regras diferentes para processar formas plurais.
Estrutura de um arquivo stringsdict
:
Uma amostra do arquivo stringsdict
inclui entradas de todas as strings que precisam ser pluralizadas. Cada entrada é composta por uma chave e um dicionário no qual o usuário define uma ou mais subchaves representando diferentes categorias plurais.
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>numberOfSongs</key> <dict> <key>NSStringLocalizedFormatKey</key> <string>%#@songs@</string> <key>songs</key> <dict> <key>NSStringFormatSpecTypeKey</key> <string>NSStringPluralRuleType</string> <key>one</key> <string>One song</string> <key>other</key> <string>%d songs</string> </dict> </dict> </dict> </plist>
Exemplo de uso de stringsdict
para pluralização
Suponhamos que temos uma aplicação que mostra a quantidade de artigos que foram lidos por um usuário. Na tela deverá aparecer uma mensagem apresentando o plural correto da quantidade de artigos lidos.
Localizable.stringsdict
para inglês e polonês:
<!-- English --> <key>article_count</key> <dict> <key>NSStringLocalizedFormatKey</key> <string>%#@articles@</string> <key>articles</key> <dict> <key>NSStringFormatSpecTypeKey</key> <string>NSStringPluralRuleType</string> <key>one</key> <string>One article</string> <key>other</key> <string>%d articles</string> </dict> </dict> <!-- Polish --> <key>article_count</key> <dict> <key>NSStringLocalizedFormatKey</key> <string>%#@articles@</string> <key>articles</key> <dict> <key>NSStringFormatSpecTypeKey</key> <string>NSStringPluralRuleType</string> <key>one</key> <string>Jeden artykuł</string> <key>few</key> <string>%d artykuły</string> <key>many</key> <string>%d artykułów</string> <key>other</key> <string>%d artykułu</string> </dict> </dict>
Aqui, a localização polonesa demonstra claramente a complexidade das formas plurais em alguns idiomas, onde múltiplas categorias plurais (um, poucos, muitos, outros) são necessárias para representar corretamente diferentes contextos numéricos.
Implementação rápida:
As entradas stringsdict
podem ser utilizadas no código simplesmente referindo-se às chaves definidas no arquivo ao chamar NSLocalizedString
.
let count = getArticleCount() let formatString = NSLocalizedString("article_count", comment: "Count of articles read by a user") let message = String(format: formatString, count)
Essa abordagem permite modificar de forma adaptativa a sequência de saída para corresponder à gramática dos idiomas suportados; tudo isso apenas em uma linha de código.
Benefícios do stringsdict
Um dos novos recursos introduzidos com o Xcode 15 são os Catálogos de String, que supostamente ajudam os desenvolvedores a tornar a localização de aplicativos iOS e macOS ainda mais fácil do que antes. Embora Localizable.strings
e stringsdict
tenham sido recursos úteis para armazenar e organizar strings, os Catálogos de Strings são muito mais coesos e mais amigáveis à interface do usuário para gerenciar strings localizadas.
Estes são os principais aspectos que devem ser destacados nos catálogos de strings:
stringsdict
, oferecendo um controle mais preciso de formas plurais e texto com variações dependendo dos elementos da interface do usuário e dos tipos de dispositivos.
Implementação rápida:
Suponhamos que em um aplicativo de mensagens você precise informar aos usuários a quantidade de mensagens que não foram lidas por eles. A notificação deve ser dinâmica mostrando o número de mensagens recebidas e deve ajustar-se de acordo com o tipo de conteúdo.
Configuração passo a passo:
Crie um Catálogo de Strings: Adicione um novo Catálogo de Strings ao seu projeto. Isso irá gerar um arquivo .stringcatalog
.
Adicionar entradas: use o editor para adicionar entradas para cada string que precisa ser localizada. Em seguida, especifique chaves, valores padrão e quaisquer regras plurais ou parâmetros adaptativos para cada entrada.
Localize Conteúdo: Fornece traduções para cada idioma suportado, especificando diferentes formas para plurais, adaptações para tipos de dispositivos, etc.
Implementar no código: faça referência a essas strings usando identificadores localizados em seu código Swift.
<!-- String Catalog Entry --> <key>unread_messages_count</key> <dict> <key>NSStringLocalizedFormatKey</key> <string>%#@messages@</string> <key>messages</key> <dict> <key>NSStringFormatSpecTypeKey</key> <string>NSStringPluralRuleType</string> <key>one</key> <string>You have one unread message.</string> <key>other</key> <string>You have %d unread messages.</string> </dict> </dict>
Você poderia acessar esta string assim:
let unreadCount = fetchUnreadMessagesCount() let message = NSLocalizedString("unread_messages_count", value: "You have \(unreadCount) unread messages.", comment: "Notify about unread messages") print(message)
Embora os Catálogos de Strings ofereçam melhorias significativas, eles também apresentam desafios. Primeiro, é uma curva de aprendizagem; leva tempo para se acostumar com um novo sistema ou forma de criar algo. Outro desafio potencial que os desenvolvedores podem enfrentar está relacionado ao tempo e aos ajustes necessários para integrar Catálogos de Strings em projetos existentes onde os arquivos de localização tradicionais já foram criados e em uso.
Os Catálogos de Strings em Swift são o mais recente aprimoramento da tecnologia de localização, fornecendo ferramentas que não são apenas poderosas, mas também flexíveis e fáceis de usar. Ao adicionar a tecnologia como parte do ciclo de vida de desenvolvimento, as equipes terão melhorado drasticamente a eficiência e a qualidade no processo de localização; portanto, serão criados melhores produtos globais.
Estarei constantemente atualizando este artigo com os desenvolvimentos mais recentes nas ferramentas de localização Swift. Se você acha que deixei alguma coisa de fora ou tem alguma opinião sobre o que eu disse, você pode compartilhá-la na caixa de comentários abaixo. Certifique-se de me seguir para obter informações mais interessantes e últimas notícias!