Skip to content

Commit 0796a36

Browse files
feat: implement a comprehensive translation and glossary administration system with new frontend, backend, and CI/CD components
1 parent 79e2684 commit 0796a36

File tree

7 files changed

+2251
-6
lines changed

7 files changed

+2251
-6
lines changed
Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
# Compila variáveis {{VAR}} para valores reais ao fazer merge para main
2+
#
3+
# REPOSITÓRIO: wwm_brasileiro_auto_path
4+
#
5+
# FLUXO:
6+
# 1. Dev branch tem pt-br.tsv com variáveis {{JIANGHU}}, {{QINGGONG}}...
7+
# 2. Quando faz merge dev → main, esta action executa
8+
# 3. Busca glossary.json do repositório wwm_brasileiro
9+
# 4. Substitui as variáveis pelos valores reais
10+
# 5. Commit automático no main com o arquivo compilado
11+
#
12+
# IMPORTANTE: Coloque este arquivo em wwm_brasileiro_auto_path/.github/workflows/
13+
14+
name: Compile Translations on Merge
15+
16+
on:
17+
push:
18+
branches:
19+
- main
20+
paths:
21+
- 'pt-br.tsv'
22+
23+
jobs:
24+
compile:
25+
runs-on: ubuntu-latest
26+
permissions:
27+
contents: write
28+
29+
steps:
30+
- name: Checkout wwm_brasileiro_auto_path
31+
uses: actions/checkout@v4
32+
with:
33+
fetch-depth: 0
34+
35+
- name: Download glossary.json from wwm_brasileiro
36+
run: |
37+
echo "📥 Baixando glossary.json do repositório wwm_brasileiro..."
38+
curl -sSL "https://raw.githubusercontent.com/rodrigomiquilino/wwm_brasileiro/main/docs/glossary.json" -o glossary.json
39+
40+
if [ ! -f glossary.json ]; then
41+
echo "❌ Falha ao baixar glossary.json"
42+
exit 1
43+
fi
44+
45+
echo "✅ Glossário baixado com sucesso"
46+
47+
- name: Setup Python
48+
uses: actions/setup-python@v5
49+
with:
50+
python-version: '3.11'
51+
52+
- name: Check for variables in pt-br.tsv
53+
id: check-vars
54+
run: |
55+
if grep -q '{{[A-Z_0-9]*}}' pt-br.tsv 2>/dev/null; then
56+
echo "has_variables=true" >> $GITHUB_OUTPUT
57+
echo "✅ Variáveis encontradas - compilação necessária"
58+
else
59+
echo "has_variables=false" >> $GITHUB_OUTPUT
60+
echo "ℹ️ Nenhuma variável encontrada - pulando compilação"
61+
fi
62+
63+
- name: Compile translations
64+
if: steps.check-vars.outputs.has_variables == 'true'
65+
run: |
66+
python << 'EOF'
67+
import json
68+
import re
69+
70+
# Carregar glossário (baixado do wwm_brasileiro)
71+
with open('glossary.json', 'r', encoding='utf-8') as f:
72+
glossary = json.load(f)
73+
74+
# Criar mapa de variáveis
75+
variable_map = {}
76+
for term in glossary.get('terms', []):
77+
var_name = f"{{{{{term['id'].upper().replace('-', '_')}}}}}"
78+
variable_map[var_name] = term['translation']
79+
80+
print(f"📚 Carregadas {len(variable_map)} variáveis do glossário")
81+
82+
# Ler pt-br.tsv
83+
with open('pt-br.tsv', 'r', encoding='utf-8') as f:
84+
content = f.read()
85+
86+
# Contar linhas originais
87+
original_lines = len(content.split('\n'))
88+
89+
# Substituir variáveis
90+
replaced_count = 0
91+
unknown_vars = set()
92+
93+
def replace_var(match):
94+
global replaced_count
95+
full_var = match.group(0)
96+
if full_var in variable_map:
97+
replaced_count += 1
98+
return variable_map[full_var]
99+
else:
100+
unknown_vars.add(full_var)
101+
return full_var
102+
103+
compiled = re.sub(r'\{\{([A-Z_0-9]+)\}\}', replace_var, content)
104+
105+
# Salvar arquivo compilado
106+
with open('pt-br.tsv', 'w', encoding='utf-8') as f:
107+
f.write(compiled)
108+
109+
print(f"✅ Compilação concluída!")
110+
print(f" 📄 {original_lines:,} linhas processadas")
111+
print(f" 🔄 {replaced_count:,} variáveis substituídas")
112+
113+
if unknown_vars:
114+
print(f" ⚠️ {len(unknown_vars)} variáveis não encontradas:")
115+
for v in sorted(unknown_vars)[:10]:
116+
print(f" - {v}")
117+
EOF
118+
119+
- name: Cleanup glossary
120+
run: rm -f glossary.json
121+
122+
- name: Check for changes
123+
id: git-check
124+
run: |
125+
git diff --quiet pt-br.tsv && echo "changed=false" >> $GITHUB_OUTPUT || echo "changed=true" >> $GITHUB_OUTPUT
126+
127+
- name: Commit compiled translations
128+
if: steps.git-check.outputs.changed == 'true'
129+
run: |
130+
git config user.name "GitHub Actions Bot"
131+
git config user.email "actions@github.com"
132+
git add pt-br.tsv
133+
git commit -m "🔄 Auto-compile: variáveis {{VAR}} substituídas por valores reais
134+
135+
Glossário usado: rodrigomiquilino/wwm_brasileiro/docs/glossary.json
136+
Compilado automaticamente via GitHub Actions"
137+
git push
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
# Recebe solicitação de renomeação de variável do repositório wwm_brasileiro
2+
# e atualiza o pt-br.tsv na branch dev
3+
#
4+
# REPOSITÓRIO: wwm_brasileiro_auto_path
5+
# IMPORTANTE: Coloque este arquivo em wwm_brasileiro_auto_path/.github/workflows/
6+
7+
name: Rename Variable
8+
9+
on:
10+
repository_dispatch:
11+
types: [rename-variable]
12+
13+
jobs:
14+
rename:
15+
runs-on: ubuntu-latest
16+
permissions:
17+
contents: write
18+
19+
steps:
20+
- name: Checkout dev branch
21+
uses: actions/checkout@v4
22+
with:
23+
ref: dev
24+
fetch-depth: 0
25+
26+
- name: Display rename info
27+
run: |
28+
echo "🔄 Renomeando variável..."
29+
echo " DE: ${{ github.event.client_payload.old_var }}"
30+
echo "PARA: ${{ github.event.client_payload.new_var }}"
31+
32+
- name: Rename variable in pt-br.tsv
33+
run: |
34+
OLD_VAR="${{ github.event.client_payload.old_var }}"
35+
NEW_VAR="${{ github.event.client_payload.new_var }}"
36+
37+
# Conta ocorrências antes
38+
COUNT_BEFORE=$(grep -o "$OLD_VAR" pt-br.tsv | wc -l)
39+
echo "📊 Ocorrências encontradas: $COUNT_BEFORE"
40+
41+
# Substitui
42+
sed -i "s/$OLD_VAR/$NEW_VAR/g" pt-br.tsv
43+
44+
# Conta ocorrências depois (deve ser 0)
45+
COUNT_AFTER=$(grep -o "$OLD_VAR" pt-br.tsv | wc -l)
46+
echo "✅ Substituições feitas: $((COUNT_BEFORE - COUNT_AFTER))"
47+
48+
- name: Check for changes
49+
id: git-check
50+
run: |
51+
git diff --quiet pt-br.tsv && echo "changed=false" >> $GITHUB_OUTPUT || echo "changed=true" >> $GITHUB_OUTPUT
52+
53+
- name: Commit changes
54+
if: steps.git-check.outputs.changed == 'true'
55+
run: |
56+
git config user.name "GitHub Actions Bot"
57+
git config user.email "actions@github.com"
58+
git add pt-br.tsv
59+
git commit -m "🔄 Renomear variável: ${{ github.event.client_payload.old_var }} → ${{ github.event.client_payload.new_var }}
60+
61+
Disparado via glossary-admin por @${{ github.event.client_payload.triggered_by }}"
62+
git push origin dev
63+
64+
- name: No changes needed
65+
if: steps.git-check.outputs.changed == 'false'
66+
run: |
67+
echo "ℹ️ Nenhuma ocorrência de ${{ github.event.client_payload.old_var }} encontrada no arquivo."

docs/assets/css/translate.css

Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2187,6 +2187,87 @@ footer a {
21872187
font-family: 'JetBrains Mono', monospace;
21882188
}
21892189

2190+
/* ========== VARIABLE SYSTEM STYLES ========== */
2191+
/* Variable name in glossary hints */
2192+
.term-hint-variable {
2193+
display: flex;
2194+
align-items: center;
2195+
gap: 0.5rem;
2196+
margin-top: 0.4rem;
2197+
padding: 0.3rem 0.5rem;
2198+
background: rgba(139, 92, 246, 0.1);
2199+
border-radius: 4px;
2200+
}
2201+
2202+
.variable-name {
2203+
font-family: 'JetBrains Mono', monospace;
2204+
font-size: 0.75rem;
2205+
color: #a78bfa;
2206+
background: rgba(139, 92, 246, 0.15);
2207+
padding: 0.15rem 0.4rem;
2208+
border-radius: 3px;
2209+
}
2210+
2211+
.btn-copy-var {
2212+
display: inline-flex;
2213+
align-items: center;
2214+
justify-content: center;
2215+
width: 22px;
2216+
height: 22px;
2217+
padding: 0;
2218+
background: transparent;
2219+
border: 1px solid rgba(139, 92, 246, 0.3);
2220+
border-radius: 4px;
2221+
color: #a78bfa;
2222+
font-size: 0.65rem;
2223+
cursor: pointer;
2224+
transition: all 0.2s ease;
2225+
}
2226+
2227+
.btn-copy-var:hover {
2228+
background: rgba(139, 92, 246, 0.2);
2229+
border-color: #a78bfa;
2230+
}
2231+
2232+
/* Variable Preview Box */
2233+
.variable-preview {
2234+
margin-top: 0.75rem;
2235+
padding: 0.75rem;
2236+
background: rgba(139, 92, 246, 0.08);
2237+
border: 1px solid rgba(139, 92, 246, 0.2);
2238+
border-radius: 8px;
2239+
}
2240+
2241+
.preview-header {
2242+
display: flex;
2243+
align-items: center;
2244+
gap: 0.5rem;
2245+
font-size: 0.7rem;
2246+
font-weight: 600;
2247+
color: #a78bfa;
2248+
text-transform: uppercase;
2249+
letter-spacing: 0.5px;
2250+
margin-bottom: 0.5rem;
2251+
}
2252+
2253+
.preview-header i {
2254+
font-size: 0.75rem;
2255+
}
2256+
2257+
.preview-warning {
2258+
margin-left: auto;
2259+
color: #fbbf24;
2260+
font-size: 0.65rem;
2261+
}
2262+
2263+
.preview-content {
2264+
font-size: 0.85rem;
2265+
color: var(--text-primary);
2266+
line-height: 1.5;
2267+
white-space: pre-wrap;
2268+
word-break: break-word;
2269+
}
2270+
21902271
.char-counter .counter-current {
21912272
font-weight: 600;
21922273
color: var(--text-primary);
@@ -2230,6 +2311,52 @@ footer a {
22302311
color: #fbbf24;
22312312
}
22322313

2314+
/* ========== VARIABLE VALIDATION ERRORS ========== */
2315+
.preview-header.preview-error {
2316+
color: #f87171;
2317+
background: rgba(248, 113, 113, 0.1);
2318+
padding: 0.5rem;
2319+
border-radius: 6px 6px 0 0;
2320+
margin: -0.75rem -0.75rem 0.5rem -0.75rem;
2321+
}
2322+
2323+
.preview-errors {
2324+
display: flex;
2325+
flex-direction: column;
2326+
gap: 0.4rem;
2327+
margin-bottom: 0.75rem;
2328+
}
2329+
2330+
.preview-error-item {
2331+
display: flex;
2332+
align-items: flex-start;
2333+
gap: 0.5rem;
2334+
font-size: 0.8rem;
2335+
color: #fca5a5;
2336+
line-height: 1.4;
2337+
}
2338+
2339+
.preview-error-item i {
2340+
color: #f87171;
2341+
margin-top: 0.15rem;
2342+
flex-shrink: 0;
2343+
}
2344+
2345+
.preview-help {
2346+
font-size: 0.75rem;
2347+
color: var(--text-muted);
2348+
padding-top: 0.5rem;
2349+
border-top: 1px solid rgba(255, 255, 255, 0.08);
2350+
}
2351+
2352+
.preview-help code {
2353+
background: rgba(139, 92, 246, 0.2);
2354+
color: var(--purple-primary);
2355+
padding: 0.15rem 0.4rem;
2356+
border-radius: 4px;
2357+
font-family: 'JetBrains Mono', monospace;
2358+
}
2359+
22332360
/* ===== MOBILE LAYOUT - Stacked & Compact ===== */
22342361
@media (max-width: 900px) {
22352362
.modal-overlay {

0 commit comments

Comments
 (0)