원클릭으로
i18n-localization
Skill para gerenciamento de internacionalização (i18n) — traduções, chaves de locale, chrome.i18n API e boas práticas.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
Skill para gerenciamento de internacionalização (i18n) — traduções, chaves de locale, chrome.i18n API e boas práticas.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
Skill para criar novos geradores de dados seguindo as convenções do projeto Fill All.
Skill para planejamento de roadmap, gestão de features, milestones e priorização de tarefas do projeto Fill All.
Skill para validação de regressão em testes — verificar que mudanças não quebraram funcionalidades existentes.
Skill para realizar code reviews alinhados com as convenções e padrões de qualidade do projeto Fill All.
Skill para investigação e debug sistemático de bugs — reproduzir, isolar, corrigir e validar com scripts.
Skill para gerenciamento seguro de dependências npm — auditoria, atualização, lock files e breaking changes.
| name | i18n-localization |
| description | Skill para gerenciamento de internacionalização (i18n) — traduções, chaves de locale, chrome.i18n API e boas práticas. |
| license | MIT |
| compatibility | Node.js 18+, TypeScript 5.x, Chrome Extension Manifest V3 |
| metadata | {"author":"marcusp","version":"1.0","project":"fill-all","category":"localization"} |
Gerenciar traduções e internacionalização do projeto Fill All usando o sistema nativo de i18n do Chrome Extensions, garantindo consistência entre locales e cobertura de todas as strings visíveis ao usuário.
_locales/
├── en/
│ └── messages.json # Inglês (locale padrão)
├── pt_BR/
│ └── messages.json # Português (Brasil)
└── es/
└── messages.json # Espanhol (se adicionado)
messages.json{
"extensionName": {
"message": "Fill All",
"description": "Nome da extensão exibido na Chrome Web Store"
},
"extensionDescription": {
"message": "Auto-fill forms with AI-powered field detection",
"description": "Descrição da extensão na Chrome Web Store"
},
"buttonFillAll": {
"message": "Fill All Fields",
"description": "Texto do botão principal no popup"
},
"settingsTitle": {
"message": "Settings",
"description": "Título da página de configurações"
}
}
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
message | string | ✅ Sim | Texto traduzido |
description | string | 🟡 Recomendado | Contexto para tradutores |
placeholders | object | ❌ Opcional | Variáveis dinâmicas |
{
"fieldsDetected": {
"message": "Detected $COUNT$ fields on this page",
"description": "Mensagem após detectar campos",
"placeholders": {
"count": {
"content": "$1",
"example": "5"
}
}
}
}
// ✅ Usar chrome.i18n.getMessage()
const title = chrome.i18n.getMessage("extensionName");
const msg = chrome.i18n.getMessage("fieldsDetected", ["5"]);
// ❌ Nunca hardcodar strings visíveis ao usuário
const title = "Fill All"; // ERRADO — não é internacionalizável
<!-- Usar __MSG_chave__ em arquivos HTML -->
<h1>__MSG_extensionName__</h1>
<p>__MSG_extensionDescription__</p>
<!-- No manifest.json -->
{
"name": "__MSG_extensionName__",
"description": "__MSG_extensionDescription__"
}
/* Mensagens i18n NÃO funcionam em CSS */
/* Usar JavaScript para aplicar traduções em elementos dinâmicos */
_locales/en/messages.json)chrome.i18n.getMessage()# Step 1: Adicionar chave em _locales/en/messages.json
# Step 2: Adicionar chave em _locales/pt_BR/messages.json
# Step 3: Usar no código
# Step 4: Verificar consistência
// No código TypeScript
const label = chrome.i18n.getMessage("newFeatureLabel");
element.textContent = label;
| Padrão | Exemplo | Uso |
|---|---|---|
extensionName | extensionName | Nome da extensão |
button<Action> | buttonFillAll, buttonSave | Botões |
label<Element> | labelCpf, labelEmail | Labels de campos |
title<Section> | titleSettings, titleRules | Títulos de seções |
message<Context> | messageSuccess, messageError | Mensagens ao usuário |
tooltip<Element> | tooltipFillAll, tooltipDetect | Tooltips |
placeholder<Field> | placeholderSearch, placeholderUrl | Placeholders de input |
error<Type> | errorInvalidCpf, errorNetworkFail | Mensagens de erro |
# Verificar se todas as chaves existem em todos os locales
node scripts/check-i18n.js
# Listar todas as chaves do locale padrão
cat _locales/en/messages.json | grep -o '"[^"]*":' | sort
# Comparar chaves entre locales
diff <(cat _locales/en/messages.json | grep -o '"[^"]*":' | sort) \
<(cat _locales/pt_BR/messages.json | grep -o '"[^"]*":' | sort)
# Buscar chaves usadas no código
grep -r "getMessage(\"" src/ --include="*.ts" -o | sort -u
# Buscar chaves usadas em HTML
grep -r "__MSG_" src/ --include="*.html" -o | sort -u
| Prática | Detalhe |
|---|---|
Sempre usar chrome.i18n.getMessage() | Para todas as strings visíveis ao usuário |
Incluir description | Ajuda tradutores a entender o contexto |
| Usar placeholders | Para valores dinâmicos (contagens, nomes) |
| Manter sincronizado | Mesmas chaves em todos os locales |
| Testar com outro locale | Mudar idioma do Chrome para verificar |
| Strings curtas | UI de extensão tem espaço limitado |
| Anti-Padrão | Problema |
|---|---|
| Strings hardcoded no código | Não internacionalizável |
| Concatenar traduções | Ordem das palavras varia entre idiomas |
Chaves genéricas (text1, text2) | Difícil manter e traduzir |
| Traduções no código | Centralizar em messages.json |
| Ignorar pluralização | Tratar singular/plural com chaves separadas |
O Chrome i18n não tem suporte nativo a plural. Usar chaves separadas:
{
"fieldCountSingular": {
"message": "$COUNT$ field detected",
"description": "Quando apenas 1 campo é detectado",
"placeholders": {
"count": { "content": "$1", "example": "1" }
}
},
"fieldCountPlural": {
"message": "$COUNT$ fields detected",
"description": "Quando múltiplos campos são detectados",
"placeholders": {
"count": { "content": "$1", "example": "5" }
}
}
}
const key = count === 1 ? "fieldCountSingular" : "fieldCountPlural";
const message = chrome.i18n.getMessage(key, [String(count)]);
_locales/<locale>/messages.json do locale padrão# Criar novo locale (ex: espanhol)
mkdir -p _locales/es
cp _locales/en/messages.json _locales/es/messages.json
# Traduzir mensagens no arquivo copiado
O Chrome usa códigos baseados no padrão BCP 47:
en — Inglêspt_BR — Português (Brasil)es — Espanholfr — Francêsde — Alemãoja — Japonêszh_CN — Chinês Simplificado### Revisão de Internacionalização
- [ ] Todas as strings visíveis usam `chrome.i18n.getMessage()`
- [ ] Chaves existem em todos os locales
- [ ] Campos `description` preenchidos para contexto
- [ ] Placeholders usados para valores dinâmicos
- [ ] Naming segue convenção (`button*`, `label*`, `title*`, etc.)
- [ ] Pluralização tratada com chaves separadas
- [ ] Script de verificação passa (`node scripts/check-i18n.js`)
- [ ] Testado com locale alternativo no Chrome