enum abstract Lang(String)
package util.kit.lang
Lang
oferece um sistema de internacionalização que permite carregar e acessar textos traduzidos
através de enums gerados dinamicamente a partir de arquivos de recursos.
A abordagem recomendada é usar arquivos JSON embarcados como recursos e acessar as chaves através dos valores de enum gerados automaticamente pela macro.
É recomendado usar esta classe tanto por importação direta quanto como extensão estática:
// Importação normal
import util.kit.lang.Lang;
// Extensão estática
using util.kit.lang.Lang;
Exemplos de uso com recursos embarcados:
- Configuração dos recursos no arquivo de compilação (ex: build.hxml):
--resource res/lang-pt.json@lang-pt
--resource res/lang-en.json@lang-en
- Carregando um idioma e acessando valores através de enum:
// Carrega o dicionário em português
Lang.setLanguage("PT");
// Acessando valores através de enums gerados automaticamente
var saudacao = Lang.GREETING; // "Olá mundo!"
// Alternando para inglês
Lang.setLanguage("EN");
var greeting = Lang.GREETING; // "Hello world!"
- Usando placeholders para substituição dinâmica:
// Usando o método params()
var msg = Lang.WELCOME.params("João", "5"); // "Bem-vindo, João! Você tem 5 mensagens."
// Outra forma seria:
var msg = "WELCOME".lang("João", "5"); // Usando extensão estática
- Acessando valores aninhados:
// Os valores aninhados são automaticamente transformados em enums com underscores
var erro = Lang.MESSAGES_ERRORS_NOT_FOUND; // "Registro não encontrado"
// Acessando valores de array (também gera enum)
var domingo = Lang.DAYS_0; // "Domingo"
var sexta = Lang.DAYS_5; // "Sexta"
Estrutura do arquivo de recursos JSON:
{
"GREETING": "Olá mundo!",
"WELCOME": "Bem-vindo, $v! Você tem $v mensagens.",
"MESSAGES": {
"SUCCESS": "Operação realizada com sucesso",
"ERRORS": {
"NOT_FOUND": "Registro não encontrado",
"FORBIDDEN": "Acesso negado"
}
},
"DAYS": ["Domingo", "Segunda", "Terça", "Quarta", "Quinta", "Sexta", "Sábado"]
}
Note que todas as chaves são tratadas como case-insensitive. Portanto, "welcome", "Welcome" e "WELCOME" são consideradas a mesma chave.
Responsabilidades:
- Geração automática de enums: Cria enums a partir da estrutura dos arquivos JSON de idioma
- Carregamento de recursos embarcados: Carrega dicionários a partir de recursos JSON
- Gerenciamento de dicionário de strings: Armazena e organiza textos associados a chaves específicas
- Substituição de placeholders: Substitui marcadores de texto (
$v
) por valores dinâmicos - Suporte a estruturas aninhadas: Permite organizar o dicionário em estruturas hierárquicas e arrays
- Normalização de chaves: Converte todas as chaves para maiúsculas para tornar o sistema case-insensitive
Forma alternativa (legado):
Também é possível carregar dicionários diretamente através de objetos:
// Carregando dicionário manualmente
var dictionary = {
GREETING: "Olá mundo!",
FAREWELL: "Adeus!"
};
Lang.load(dictionary);
// Acessando valores
var texto = Lang.lang("GREETING"); // "Olá mundo!"
Como lidar com o cache do VSCode:
Quando você modifica arquivos de recursos JSON externos, o VSCode não atualiza automaticamente as opções de autocompletar/intellisense devido ao cache do completion server. Isso significa que novas chaves adicionadas aos arquivos JSON não aparecerão no autocompletar até que você reinicie o servidor de compilação.
Para resolver este problema, você deve registrar uma dependência explícita entre seu código e os arquivos JSON no seu arquivo HXML:
# Registra dependência dos arquivos de idioma para atualizar o cache do completion server
--macro util.kit.lang.LangMacro.depends("res/lang-pt.json")
--macro util.kit.lang.LangMacro.depends("res/lang-en.json")
# Registra recursos normalmente
--resource res/lang-pt.json@lang-pt
--resource res/lang-en.json@lang-en
Com essa configuração, sempre que você modificar um dos arquivos JSON listados, o VSCode reconhecerá a necessidade de recompilar e atualizar o cache do completion server, garantindo que as novas chaves apareçam corretamente no autocompletar.
Static methods
staticinlinelang(key:String, rest:Rest<String>):String
Obtém um texto do dicionário a partir de uma chave e substitui os marcadores de
posição ($v
) pelos parâmetros fornecidos.
Os marcadores $v
no texto serão substituídos sequencialmente pelos valores fornecidos.
Se um valor for null
, ele será substituído por uma string vazia.
Parameters:
key:String | A chave que identifica o texto no dicionário |
---|---|
rest:String | Valores que serão usados para substituir os marcadores |
Returns:
String O texto processado com as substituições ou uma string vazia se a chave não existir
staticload(data:Dynamic):Void
Carrega dados no dicionário de internacionalização. Os dados podem ser estruturados como objetos aninhados ou arrays. Todas as chaves são convertidas para acesso case-insensitive.
Esta função é principalmente usada internamente pelo método setLanguage()
,
mas também pode ser utilizada para carregar dicionários manualmente quando
necessário.
Parameters:
data:Dynamic | Objeto contendo os dados a serem carregados no dicionário |
---|
staticsetLanguage(language:String):Void
Carrega um dicionário de idioma a partir de recursos embarcados.
Esta é a forma recomendada de usar a classe Lang. Os arquivos de idioma são carregados a partir de recursos embarcados e as chaves são acessadas através dos valores de enum gerados automaticamente pela macro.
Esta função busca por recursos com o padrão de nome 'lang-XX', onde XX é o código do idioma (por exemplo, PT, EN, ES). Quando encontra o idioma solicitado, carrega automaticamente o dicionário correspondente.
Como configurar os arquivos de idioma:
- Crie arquivos JSON para cada idioma seguindo a estrutura:
{
"GREETING": "Olá mundo!",
"WELCOME": "Bem-vindo, $v!",
"MESSAGES": {
"SUCCESS": "Operação realizada com sucesso",
"ERROR": "Ocorreu um erro"
}
}
- Adicione os arquivos como recursos embarcados no seu arquivo de compilação:
--resource res/lang-pt.json@lang-pt
--resource res/lang-en.json@lang-en
- Use os enums gerados para acessar os textos:
// Carrega o idioma
Lang.setLanguage("PT");
// Acessa textos via enum
trace(Lang.GREETING); // "Olá mundo!"
trace(Lang.WELCOME.params("João")); // "Bem-vindo, João!"
trace(Lang.MESSAGES_SUCCESS); // "Operação realizada com sucesso"
Se o idioma solicitado não for encontrado, a função emitirá um aviso no console e o dicionário atual não será alterado.
Parameters:
language:String | Código do idioma a ser carregado (ex: "PT", "EN", "ES") |
---|
Methods
key(this:String):String
Retorna a chave do enum como uma string.
Útil para casos em que você precisa da chave literal em vez do valor traduzido.
Returns:
String A chave de enum como string
params(this:String, rest:Rest<String>):String
Aplica parâmetros a um texto que contém placeholders.
Este método é usado principalmente com os valores de enum para substituir
os marcadores $v
por valores dinâmicos.
Exemplo:
// Com o texto "Olá, $v! Você tem $v mensagens."
var msg = Lang.WELCOME.params("João", "5");
// Resultado: "Olá, João! Você tem 5 mensagens."
Parameters:
rest:String | Valores que serão usados para substituir os marcadores |
---|
Returns:
String O texto com os placeholders substituídos pelos valores fornecidos