Brazilian Portuguese/pt-BR Translation#1587
Conversation
cyfung1031
left a comment
There was a problem hiding this comment.
Brazilian Portuguese (pt-BR) Translation Review
Verdict
Request changes before merge.
The translation is a useful and generally understandable first pass. The namespace files are structurally complete, the JSON is organized correctly, and most placeholders and technical identifiers are preserved. However, the PR is not ready to merge because:
pt-BRis not imported or registered insrc/locales/locales.ts, so the locale cannot be selected or loaded.- Six links in
guide.jsonwere changed to unverified/pt-BR/routes, contrary to the repository rule that URLs must be preserved. - Several strings materially change the meaning of the English and Simplified Chinese sources.
- Product terminology is not consistent, especially for
Subscribe/Subscription,Skill,Source, browser tabs, file monitoring, and technical API terms. - The locale terminology document and documentation index entries are missing.
What is right
Structural and technical strengths
- All 11 runtime namespaces are present and exported by
src/locales/pt-BR/index.ts. - The Portuguese files follow the same object structure as the English and Simplified Chinese files.
- i18next placeholders are generally preserved correctly, including:
{{count}},{{selected}},{{total}}{{attempt}},{{max}}{{scriptName}},{{subscribeName}}${dir}
- HTML/React markup is retained in onboarding and popup strings.
- Metadata and developer identifiers are mostly preserved:
@match,@exclude,@grant,@connect@resource,@requireESLint,VSCode,OPFS,MCP,TTFTSKILL.md,SkillScript
- The major script-type distinctions are mostly retained:
script de usuárioscript de páginascript em segundo planoscript agendado
- Many full-sentence translations are natural and faithful, for example:
permission.cookie_warning_desceditor.confirm_override_when_edit_conflictinstall.perm_match_summaryagent.dom_permission_describesettings.sync_delete_desc(apart from one grammatical coordination issue)
- Product capitalization is usually correct as
ScriptCat. - The popup strings correctly preserve the English documentation URLs; this is the correct behavior unless localized destinations are verified.
Good choices that should be retained
| Concept | Current pt-BR choice | Assessment |
|---|---|---|
| Background Script | Script em segundo plano |
Natural and clearly distinct from other script types. |
| Scheduled Script | Script agendado |
Natural pt-BR product wording. |
| User Script | Script de usuário |
Appropriate generic term. |
| Storage | Armazenamento |
Natural for data storage and storage space. |
| Permissions | Permissão / Autorização |
Mostly distinguishes capability from granting access. |
| ScriptCat | ScriptCat |
Correct product spelling in most strings. |
| Cron expression | Expressão cron |
Technically understandable and concise. |
| Metadata identifiers | Preserved | Correct and required. |
| Backup | Backup |
Common and natural in Brazilian software. |
| Cloud | Nuvem / na nuvem |
Natural when grammar and prepositions are adjusted by context. |
Release-blocking issues
1. The locale is not registered
The PR adds src/locales/pt-BR/index.ts, but does not modify src/locales/locales.ts.
Required integration:
import * as ptBR from "./pt-BR";and inside resources:
"pt-BR": { title: "Português (Brasil)", ...ptBR },Without this change, the new files are not part of the i18next resource bundle and the language will not appear as an available runtime locale.
2. The required terminology and documentation entries are missing
The repository translation guide says a new language should have a per-locale terminology file and be registered in the terminology table.
Add:
docs/references/terminology-pt-BR.md- A row to
docs/translation.md:
| `pt-BR` | Português (Brasil) | [terminology-pt-BR.md](./references/terminology-pt-BR.md) |- Update
docs/README.mdfrom 8 locale guidelines to 9 and includept-BR.
A proposed terminology file accompanies this report.
3. guide.json changes protected URLs
The repository rules explicitly require URLs to be preserved. The Portuguese file changes six destinations to guessed /pt-BR/ routes:
installed_scriptsscript_list_content(two links)script_list_action_contenttools_backup_contentsubscribe_content
No Portuguese routes should be introduced unless they are confirmed to exist and contain the intended content. Keep the English source destinations for now:
https://docs.scriptcat.org/en/...https://scriptcat.org/en/search
This is especially important because src/locales/locales.ts currently routes every non-Chinese documentation path to /en.
Major meaning and functionality issues
| Severity | Namespace / key | English meaning | Simplified Chinese clarification | Current pt-BR | Recommended pt-BR | Why |
|---|---|---|---|---|---|---|
| Blocker | settings.blacklist_placeholder |
Prevent ScriptCat from running scripts on matching pages | Explicitly says “禁止…运行脚本” | Desative o ScriptCat para executar scripts... |
Impeça o ScriptCat de executar scripts em páginas como\nhttps://*.example.com |
Current text can be read as “disable ScriptCat in order to execute scripts,” reversing the intended behavior. |
| Blocker | settings.migration_confirm_message |
Retrying migration will modify existing data | Explicit cause/effect warning | Tentar novamente ... para modificar dados existentes |
Tentar novamente a migração do mecanismo de armazenamento modificará os dados existentes. Confirme. Consulte: https://docs.scriptcat.org/docs/change/v0.17/ |
Current text turns a warning into an instruction whose purpose is to modify data. |
| Major | editor.run_at / editor.run_in |
Execution timing vs execution environment | 运行时机 vs 运行环境 |
Both are Executar Em |
Momento da execução / Ambiente de execução |
Two distinct fields become indistinguishable. |
| Major | common.type_string |
Technical String data type |
Keeps string |
Texto |
String |
“Texto” is not equivalent to the JSON/programming data type. |
| Major | editor.storage_api |
Storage API |
Terminology guide preserves the API term | API de Armazenamento |
Storage API |
The repository terminology treats this as a technical API name. |
| Major | editor.eslint_rules_reset |
Reset-completed state | ESLint规则已重置 |
Redefinir Regras do ESLint |
Regras do ESLint redefinidas |
A result/status was changed into a command. |
| Major | editor.editor_config_reset |
Reset-completed state | 编辑器配置已重置 |
Redefinir Configuração do Editor |
Configuração do editor redefinida |
Same state/action error. |
| Major | editor.editor_type_definition_reset |
Reset-completed state | 编辑器类型定义已重置 |
Redefinir Definição de Tipo do Editor |
Definição de tipos do editor redefinida |
Same state/action error. |
| Major | editor.only_background_scheduled_can_run |
Background or scheduled scripts | Chinese corrects the bad English crontab scripts to 定时脚本 |
scripts de segundo plano/crontab |
Apenas scripts em segundo plano ou scripts agendados podem ser executados |
crontab is not the product script type. |
| Major | Subscription action/object across files | Subscribe is an action; Subscription is an object |
Chinese uses one form because Chinese does not require the same noun/verb distinction | All forms use Inscrição |
Action: Assinar; object: Assinatura |
The current translation loses the noun/verb distinction and sounds like event registration. |
| Major | Skill entity across agent, install, script |
Product entity Skill, tied to SKILL.md |
Chinese deliberately preserves Skill in entity labels |
Habilidade |
Use Skill for installed/imported product entities; use habilidade only generically |
Translating every product label makes SKILL.md, SkillScript, and the installed object look unrelated. |
| Major | install.restore_settings_clear_all |
Deselect all | Chinese: 全不选 |
Limpar tudo |
Desmarcar tudo |
“Clear all” sounds destructive in a restore/import screen. |
| Major | install.unimportable_count |
Count of items that cannot be imported | Chinese includes “items” | {{count}} não podem ser importados |
{{count}} itens não podem ser importados |
The Portuguese sentence has no subject noun. |
| Major | install.resource_import_failed |
Resources could not be imported | Chinese uses a passive failure construction | Os seguintes recursos falharam ao importar: |
Não foi possível importar os seguintes recursos: |
Current text says the resources themselves failed while importing. |
| Major | install.warning_risk_antifeature |
Declares anti-features / @antifeature metadata |
Technical feature warning | ele declara anti-recursos |
ele declara metadados @antifeature |
anti-recursos is not established userscript terminology. |
| Major | script.homepage |
Script homepage | Chinese explicitly says 脚本主页 |
Página Inicial |
Página do script |
“Página Inicial” normally means the application's home page. |
| Major | settings.enable_background.description |
Generic browser background behavior | Chinese deliberately says browser, not Chrome | Ends with sair manualmente do Chrome |
...até que você encerre manualmente o navegador. |
The English terminology guide already identifies browser-specific Chrome as a review defect. |
| Major | permission.script_accessing_cross_origin_resource |
Cross-origin resource | Chinese: cross-domain resource | recurso de origem cruzada |
recurso entre origens |
“Entre origens” is the standard Brazilian web wording. |
| Major | permission.permission_cors |
Cross-domain / CORS | Keeps cors as identifier |
Domínio cruzado (cors) |
Entre origens (CORS) |
Use standard terminology and capitalization. |
| Major | logs.live |
Real-time/live logs | Chinese: 实时 |
Ao Vivo |
Em tempo real |
“Ao vivo” suggests broadcasting, not continuously updating logs. |
| Major | logs.total_logs |
Total queried logs | Chinese uses a direct count | Um total de {{length}} logs foram consultados |
Foram encontrados {{length}} logs no total |
Current subject–verb agreement is incorrect. |
| Major | popup.ext_update_notification |
ScriptCat extension updated | Chinese preserves product name | Extensão Scriptcat atualizada |
Extensão ScriptCat atualizada |
Product capitalization is wrong. |
| Major | popup.develop_mode_guide, popup.allow_user_script_guide |
Desktop click instruction | Chinese corrects source tap to 点击 |
toque para... |
clique para saber como ativar |
This is a desktop browser-extension control, not a touch-only UI. |
| Major | install.updatepage.tap_to_expand |
Expand desktop row/control | Chinese: 点击展开 |
Toque para expandir |
Clique para expandir |
Same desktop interaction problem. |
| Major | agent.tasks_subtitle |
Run automatically on a cron schedule | Chinese: run according to a Cron cycle | em um cronograma cron |
Execute tarefas do agente automaticamente de acordo com uma expressão cron |
Current phrase is redundant and unnatural. |
| Major | agent.tasks_never_run |
Task has never run | Chinese: not run | Nunca executado |
Ainda não executada |
The implied noun is feminine tarefa; current agreement is wrong. |
| Major | script.import_done |
Import success/failure totals | Chinese explicitly labels success and failure | {{success}} com sucesso · {{fail}} falharam |
Importação concluída: {{success}} com êxito · {{fail}} com falha |
Current first count has no noun/status relation and the two halves are not parallel. |
Important terminology and naturalness issues
| Namespace / key or pattern | Current pt-BR | Recommended direction | Notes |
|---|---|---|---|
source / col_source |
Fonte |
Origem |
Fonte is better reserved for a font, source code, or a specifically named data source. For provenance/install origin, use Origem. |
common.more_menu |
Mais menus |
Mais opções |
The source describes a single “more” menu, not multiple menus. |
common.exclude_off |
Excluir a execução de $0 |
Impedir a execução em $0 |
“Excluir” sounds like deleting a run. |
editor.bulk_values |
Valores em massa |
Valores em lote |
“Em lote” is standard software wording and matches Edição em lote. |
editor.confirm_delete_exclude |
exclusão desta exclusão |
Excluir esta regra de exclusão? |
Avoid awkward repetition. |
| File watching | Observar arquivo, Observando |
Monitorar arquivo, Monitorando, Parar monitoramento |
Better describes continuous filesystem monitoring. |
guide.title |
Guia de integração |
Guia de primeiros passos |
Chinese clarifies that this is beginner onboarding, not system integration. |
guide.tour_finish |
Concluído |
Concluir |
This appears to be an action/button. |
logs.last_1_hour |
Última 1 Hora |
Última hora |
Current phrase is ungrammatical/redundant. |
| Log intervals | 1m, 5m |
1 min, 5 min |
m is ambiguous in Portuguese. |
logs.time |
Hora |
Horário or Data e hora after UI check |
English/Chinese use the broader concept “time.” |
| Authorization duration | Temporário |
Temporária |
Must agree with feminine Duração. |
auto_close_in |
{{second}}s |
{{second}} s or a localized seconds label |
Add spacing; pluralization may require a future i18n plural rule. |
popup.page_in_blacklist |
lista negra |
lista de bloqueio |
More precise and avoids an unnecessary literal calque. |
| Right-click menu | menu de clique com o botão direito |
menu de contexto |
Standard, shorter Brazilian software wording. |
badge_type_none |
Nenhum |
Não exibir |
Chinese clarifies this is display behavior, not a missing noun. |
expand_count |
Contagem para Expandir |
Limite de itens visíveis |
Current phrase is literal and unclear. |
script.background_script_tooltip |
Executa ... uma vez ativado |
É executado em segundo plano quando ativado |
Avoids reading “uma vez” as “one time.” |
script.error_script_type_mismatch |
não podem ser convertidos |
não é possível converter entre scripts normais e scripts em segundo plano |
Current sentence omits the conversion relationship. |
settings.blacklist_pages |
Página na Lista Negra |
Páginas bloqueadas |
The setting represents a collection, not one page. |
settings.script_run_env.all |
Todos |
Todas as abas |
Chinese and the English terminology review identify these as browser tabs. |
settings.blacklist_pages_desc |
comma splice | Impedir que scripts sejam executados nas páginas especificadas, com suporte a curingas |
Fix grammar and make the capability explicit. |
install.skill_secret |
Segredo |
Secreto |
This is a state/adjective parallel to Obrigatório. |
install.skill_warning_desc |
ele injeta... |
a Skill injeta... or omit pronoun |
If habilidade is retained, agreement would need feminine ela. |
install.referral_link_title |
Link de Referência |
Link de indicação or Link de afiliado after product check |
Current wording can mean a citation/reference link. |
install.membership_title |
Recursos de Membro |
Recursos para membros |
Natural Brazilian phrasing. |
tools.pulling_data_from_cloud |
Puxando Dados da Nuvem |
Obtendo dados da nuvem |
Avoid an English developer-jargon calque in user-facing UI. |
agent.model_supports_vision |
Entrada de Visão |
Entrada de imagem or Entrada visual |
Current phrase is unnatural. |
agent.skills_refresh |
Atualizar |
Recarregar |
Distinguish refresh from version update. |
agent.skills_updates_available |
atualização(ões) disponível(is) |
Atualizações disponíveis |
Avoid parenthetical pseudo-plural forms in UI. |
agent.chat_new / chat_delete |
Chat |
Prefer conversa consistently |
The same namespace otherwise uses conversa. |
agent.chat_background_* |
Modo de fundo |
Execução em segundo plano |
More natural and consistent with script terminology. |
agent.search_engine_desc |
fonte de recuperação |
fonte de busca usada pela ferramenta web_search |
“Recuperação” is an unnecessary retrieval-system calque. |
agent.summary_model_desc |
volta para o padrão |
usa o modelo padrão se não estiver definido |
More precise and natural. |
Systemic style issue: excessive title case
Many Portuguese labels capitalize almost every noun and adjective:
Nova Versão DisponívelConfigurações de ExecuçãoFalha na Verificação de AtualizaçãoRegras do ESLint SalvasPágina Inválida
Brazilian Portuguese software interfaces normally use sentence case:
Nova versão disponívelConfigurações de execuçãoFalha na verificação de atualizaçãoRegras do ESLint salvasPágina inválida
This is not only cosmetic: sentence case makes labels easier to scan and avoids inconsistent capitalization between labels and notifications. The terminology file supplied with this review makes sentence case the default.
Source disagreements that need product confirmation
These are not simple Portuguese mistakes. English and Simplified Chinese disagree, so the maintainer should confirm intended behavior.
| Key | English | Simplified Chinese | Portuguese choice | Recommendation |
|---|---|---|---|---|
guide.setting_sync_content |
Mentions syncing deletions and updating the script version here | Mentions deletion propagation to other devices; does not mention updating the version | Follows English | Confirm product behavior and then align all three locales. |
script.latest_version |
Latest Version |
“Already the latest version” | Última Versão |
Confirm whether this is a label or a status. If status, use Já está na versão mais recente. |
install.background_script_description |
Runs automatically when the browser starts | Explicitly says it runs once when the browser opens | Follows English and omits “once” | Confirm whether it runs once at startup or continuously. |
script.apply_to_run_status |
Ambiguous combined label | Also retains a combined concept | Literal combined label | Inspect the actual column/control before rewriting. It may need two labels. |
agent.chat_tools_count |
Count of tools | Count of tool calls | Count of tools | Confirm whether the number represents available tools or invocations. |
Suggested patch checklist
- Register
pt-BRinsrc/locales/locales.ts. - Add
docs/references/terminology-pt-BR.md. - Add
pt-BRtodocs/translation.md. - Update the terminology count/list in
docs/README.md. - Restore all six modified URLs in
guide.jsonunless the localized destinations are verified. - Fix all release-blocking and major rows in this report.
- Apply the terminology file consistently:
AssinarvsAssinatura- preserve product
Skill Origem, not genericFontemenu de contextoabafor browser tabentre origens (CORS)Monitorar arquivo- sentence case
- Recheck placeholders and identifiers after editing.
- Build the extension and verify:
- language selector shows
Português (Brasil) - every namespace loads
- long strings fit dialogs, tables, badges, and mobile layouts
- split strings such as
menu_expand_num_before/menu_expand_num_afterform a grammatical sentence
- language selector shows
- Ask a Brazilian Portuguese speaker to do a final in-product fluency pass after the semantic fixes.
Recommended review decision
Request changes, with the locale registration, URL restoration, and major semantic corrections required before approval. The contribution has a solid base and is worth continuing; it needs terminology normalization and a focused second pass rather than a full rewrite.
There was a problem hiding this comment.
I chose to use "Criar Script de Segundo Plano" to translate Create Background Script due to the following semantic nuances in Portuguese:
- "Script de Segundo Plano" (Recommended): The preposition "de" establishes a relationship of categorization/type. It correctly defines the nature of the script (a script that runs in the background), perfectly mapping the English meaning of "Background Script".
- "Script em Segundo Plano" (Avoided): The preposition "em" introduces syntactic ambiguity. It wrongly implies that the action of creating the script will happen in the background (asynchronously) while the user does something else in the system.
I still didn't read the other stuff to fix, maybe this is in them too, was looking on the files before the comment.
There was a problem hiding this comment.
Please read all AI review comments
For good suggestions, apply them with commits.
For bad suggestions, reply with reasons why they are bad.
Afterwards, mark this PR as ready please.
Thanks
Checklist / 检查清单
Description / 描述
Screenshots / 截图