Skip to content

feat: add Russian (ru) translation for the JMeter UI#6706

Open
vlsi wants to merge 9 commits into
apache:masterfrom
vlsi:russian_translation
Open

feat: add Russian (ru) translation for the JMeter UI#6706
vlsi wants to merge 9 commits into
apache:masterfrom
vlsi:russian_translation

Conversation

@vlsi
Copy link
Copy Markdown
Collaborator

@vlsi vlsi commented May 27, 2026

Summary

  • Register ru in JMeterMenuBar.getLanguages() so the Russian locale shows up under Options → Choose Language, and add ru=<localised name> to every existing messages_*.properties (English Russian, German Russisch, French Russe, ...).
  • Add messages_ru.properties (1523 keys) and 33 component bundles *_ru.properties covering BeanShell / BSF / JSR223 (Assertion, Pre/PostProcessor, Sampler, Timer, Listener), CSV Data Set, Keystore Config, Random Variable Config, Sync/Constant/Precise Throughput Timer, Debug Sampler & PostProcessor, Compare Assertion, Bolt, AccessLog, GraphQL HTTP, JDBC (Sampler, Pre/Post Processor, DataSourceElement).
  • Ship a translator glossary at xdocs/localising/glossary_ru.md so future Russian PRs stay consistent: canonical terms (Sampler → сэмплер, Thread Group → группа потоков, Listener → слушатель, Aggregate Report → сводный отчёт, ...) plus style rules (sentence-case headings, imperative buttons without trailing dots, "Не удалось …" for errors, no является / данный / осуществлять).

Notes for reviewers

  • Technical files outside UI localisation (colors.properties, images/icon*.properties, gui/util/textarea.properties, Example*Resources.properties) are deliberately not translated — same convention as the other locales.
  • HTML / placeholders / \: escaping / code identifiers (HttpClient, Groovy, JSR223, HTTP methods, {0}, ${var}, ...) are preserved verbatim.
  • Russian key set is identical to the English source (diff of key names is empty for every translated bundle), so PackageTest passes.

PS. I used https://github.com/Netcracker/qubership-ai-packages/blob/main/agent-packages/russian-developer-style skill to guide the translation.

Test plan

  • :src:components:test :src:protocol:http:test :src:protocol:jdbc:test :src:protocol:bolt:test :src:protocol:java:test --tests "*ResourceKeyUsageTest*" — 851 tests, 0 failures.
  • :src:dist-check:test (includes org.apache.jmeter.resources.PackageTest via testFixtures(core)) — 438 tests, 0 failures.
  • :src:core:test — 379 tests, 0 failures.
  • ./gradlew runGui with the new locale — selected via Options → Choose Language → Русский, every visible label rendered in Russian without missing-key fallbacks.

🤖 Generated with Claude Code

vlsi and others added 3 commits May 27, 2026 20:55
Register `ru` in `JMeterMenuBar.getLanguages()` so the Russian locale
appears in Options > Choose Language, and add the corresponding
`ru=<localised name>` entry to every existing `messages_*.properties`.

Add full Russian translations:

* `messages_ru.properties` — 1523 keys (main UI dictionary).
* 33 component bundles `*_ru.properties` covering BeanShell, BSF and
  JSR223 (Assertion / PreProcessor / PostProcessor / Sampler / Timer /
  Listener), CSV Data Set, Keystore Config, Random Variable Config,
  Sync / Constant / Precise Throughput Timer, Debug Sampler and
  PostProcessor, Compare Assertion, Bolt connection element and
  sampler, AccessLog Sampler, GraphQL HTTP Sampler, and JDBC
  (Sampler, Pre/Post Processor, DataSourceElement).

Include `xdocs/localising/glossary_ru.md` — a translator's glossary
that fixes the canonical Russian terms used across the translation
(e.g. Sampler → сэмплер, Thread Group → группа потоков, Listener →
слушатель, Aggregate Report → сводный отчёт) and the style rules
(sentence-case headings, imperative buttons without trailing dots,
"Не удалось …" for error messages, no `является` / `данный` /
`осуществлять`).

Add a `changes.xml` entry under "UI".

Verified with `ResourceKeyUsageTest*` across `core`, `components`,
`protocol/http`, `protocol/jdbc`, `protocol/bolt`, `protocol/java`
and `dist-check` (`resources.PackageTest` runs as part of the
`testFixtures`-driven suite) — all green.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Apply ~67 corrections found by a second review pass against the
russian-developer-style skill and the project glossary.

* `messages_ru.properties` — ~57 edits across 4 blocks. Highlights:
  - Drop empty `является` linkers, marketing `успешно`, calques like
    `на коды`, `упадёт`, `провал/провален` (use neutral `сбой` /
    `не пройден` per glossary).
  - `Apdex T/F` now read as `порог толерантности` / `порог раздражения`
    (was the meaningless `недопустимости` / `удовлетворённости`).
  - JMS `durable subscription` → `устойчивая подписка`
    (was the literal `долговечная`).
  - `Result Status Action Handler` → `Действие по результату`
    (was `Обработчик результата` — lost the *Action* part).
  - SMIME `Distinguished name` → `Уникальное имя (DN)` (was mixed-lang).
  - `Size Assertion` operator phrasing now agrees with the noun in
    neuter: `должно быть равно/больше/меньше N байт`.
  - Drop `пожалуйста` per skill; rephrase `смотрите файл журнала` →
    `См. файл журнала`.
  - Capitalize `Bouncy Castle`.
  - Restore Think Time terminology from the glossary.
  - **Critical:** keep `reportgenerator_summary_total` /
    `reportgenerator_top5_total` as `Total` (not `Всего`). These keys
    leak into the JSON of `HTMLReportExpect.json`, which hard-codes
    `"Total"`. French and other locales already do the same.
* `CompareAssertionResources_ru.properties` — `Что сравнивать` →
  `Выбор операторов сравнения`; `Подстановки` → `Замены`.
* `CSVDataSetResources_ru.properties` — align cross-reference to the
  neighbouring `Переходить в начало по EOF` label.
* `PreciseThroughputTimerResources_ru.properties` — `Пачечная отправка`
  → `Отправка пачками`; `Размер пачки потоков` → `Число потоков в пачке`.
* `SyncTimerResources_ru.properties` — fix accusative agreement:
  `означает все пользователи` → `означает всех пользователей`.

Verified with `:src:dist-check:test` (2135 tests, 0 failures, includes
`resources.PackageTest` and the report-generator end-to-end checks).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The previous review pass over-corrected in a few places where the
original wording was idiomatic and the "fix" was either an English
calque or pure churn. Revert:

* `add_think_times` — `Добавить паузы между запросами к дочерним
  элементам` reads more naturally than the literal `Добавить время на
  размышление дочерним элементам`. The glossary explicitly allows
  either translation for *Think Time*.
* `argument_must_not_be_negative` — `не может быть отрицательным` is
  idiomatic in Russian validation messages; `не должен быть
  отрицательным` is a grammatical calque of `must not`. Both are
  correct, the original is more natural.
* `laf_quit_after_change` — drop the fabricated "для корректной
  работы". The English source said only "Look & Feel change requires a
  restart"; the addition was reviewer's own creation.
* `smtp_default_port` — restore the `\:` escaping. `\:` and `:` are
  equivalent in `.properties`, so the change was pure cosmetics.
* `smtp_tlsprotocols_tooltip` — restore `handshake`. `рукопожатие` is
  not the established Russian term for SSL/TLS handshake; the loanword
  is standard in this context.
* `view_results_table_request_http_nohttp` — `Не HTTP-сэмпл` and
  `Сэмпл не HTTP` are equally natural; the change was a no-op word
  reorder.

Also align `bind` with `unbind` (LDAP operation radio buttons) — both
are now imperatives `Привязать поток` / `Отвязать поток` instead of
the mixed `Привязка потока` / `Отвязать поток` pair. Verified in
`LdapExtConfigGui.java` that these are radio-button labels for LDAP
operations, where imperative form matches the sibling `compare=
Сравнить` and `rename=Переименовать запись`.

`:src:dist-check:test` — 2135 tests, 0 failures.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
vlsi and others added 4 commits May 27, 2026 21:31
* `cookie_manager_title`: `Менеджер cookie HTTP` → `Менеджер HTTP cookie`.
* `cache_manager_title`: `Менеджер кэша HTTP` → `Менеджер HTTP-кэша`.
* `dns_cache_manager_title`: `Менеджер кэша DNS` → `Менеджер DNS-кэша`
  (same pattern as HTTP-cache).
* `auth_manager_title`: `Менеджер авторизации HTTP` → `Менеджер
  HTTP-авторизации`.
* `curl_add_cookie_header_to_cookiemanager`: refer to the manager by
  its new name `менеджер HTTP cookie`.
* `iterator_num` and `thread_group_scheduler_warning`: `Loop Count`
  now reads as `Количество итераций`, not `Число итераций`.

Update `xdocs/localising/glossary_ru.md` so future contributors see
the agreed wording.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Use the wording that Russian-speaking JMeter practitioners actually
use in blogs, talks and forum threads (Habr / Точка, Performance-Lab,
software-testing.ru, automated-testing.info) instead of the academic
calque "утверждение".

* Element type and titles:
  - `assertion_title`: `Утверждение по ответу` → `Проверка ответа`
  - `bsh_assertion_title`: `Проверка BeanShell`
  - `duration_assertion_title`: `Проверка длительности`
  - `html_assertion_label` / `html_assertion_title`: `Проверка HTML`
  - `jmespath_assertion_title`: `Проверка JSON JMESPath`
  - `json_assertion_title`: `Проверка JSON`
  - `md5hex_assertion_title`: `Проверка MD5Hex`
  - `size_assertion_title`: `Проверка размера`
  - `smime_assertion_title`: `Проверка SMIME`
  - `xml_assertion_title`, `xmlschema_assertion_title`,
    `xpath_assertion_*`, `xpath2_assertion_*`: `Проверка XML…/XPath…`
  - `menu_assertions`: `Утверждения` → `Проверки`
  - Component bundles `BSFAssertionResources_ru`,
    `JSR223AssertionResources_ru`, `CompareAssertionResources_ru`:
    `displayName` updated the same way.
* Inline references in tooltips, labels and visualiser titles
  (`assertion_textarea_label`, `assertion_visualizer_title`,
  `comparison_visualizer_title`, `proxy_assertions`, `save_assertions`,
  `save_assertionresultsfailuremessage`, `junit_append_error`,
  `view_results_assertion_*`, `view_results_tab_assertion`,
  `smime_assertion_message_position`, `*_invert`, `*_negate`).

Also revert HTTP-manager titles per project owner's preference:
* `cache_manager_title`: `Менеджер кэша HTTP` (was hyphenated).
* `dns_cache_manager_title`: `Менеджер кэша DNS` (same model).
* `auth_manager_title`: `Менеджер авторизации HTTP`.
Cookie manager keeps `Менеджер HTTP cookie` (cookie stays in Latin).

Update `xdocs/localising/glossary_ru.md` so the canonical wording is
recorded for future contributors.

`:src:dist-check:test` — 2135 tests, 0 failures.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Russian UI convention: a checkbox label is a statement, not a
question. Walk the 41 keys whose Russian value ended with `?`,
classify each by the Java code that consumes it, and drop the
trailing `?` only on checkboxes. Keep it on dialog confirms and
menu items that are real questions to the user.

27 checkbox labels lost the `?` (the agent's 25 plus two table-
column headers `encode?` and `include_equals` whose cells are
boolean checkboxes):

* `aggregate_graph_*` × 4 (StatGraphVisualizer/RespTimeGraphVisualizer)
* `auth_manager_clear_per_iter`, `cache_session_id`,
  `clear_cache_per_iter`, `clear_cookies_per_iter`
* `foreach_use_separator`
* `ftp_binary_mode`, `ftp_save_response_data`
* `if_controller_evaluate_all`, `if_controller_expression`
* `jms_stop_between_samples`, `jms_use_auth`,
  `jms_use_non_persistent_delivery`
* `ldap_parse_results`, `ldap_secure`, `ldap_trust_all`
* `response_save_as_md5` (uses `JBooleanPropertyEditor` →
  `JEditableCheckBox`)
* `smtp_enabledebug`
* `view_results_autoscroll`, `view_results_childsamples`
* `xpath_extractor_fragment`, `xpath_tester_fragment`
* `encode?` (table column header for HTTP-arg encode flag) →
  `URL-кодирование`
* `include_equals` (table column header for the equals-sign flag) →
  `Точное совпадение`

12 dialog-confirm messages and titles keep the `?`:
`cancel_exit_to_save`, `cancel_new_from_template`,
`cancel_new_to_save`, `cancel_revert_project`, `remove_confirm_msg`,
`revert_project?`, `save?`, `save_overwrite_existing_file`,
`should_save`, `template_load?`, `web_parameters_lost_message`,
`schematic_view_outputfile`.

`help_node` (menu item "What's this node?") and
`property_returnvalue_param` (parameter description in a help table
phrased as "Should X …?") also keep the `?` — they are semantic
questions, not checkbox labels.

Glossary updates while here:
* `Required → Обязательное` (was `Обязательное поле`).
* `Preferences → Предпочтения` (was a duplicate of `Настройки`).

`:src:dist-check:test` — 2135 tests, 0 failures.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Russian UI checkboxes are statements, not questions. The translation
pass already applied this convention (English `Save response as MD5
hash?` → Russian `Сохранять ответ как хеш MD5`), but the rule wasn't
written down anywhere project-local. Add a short entry to the style
section of `glossary_ru.md` so future contributors don't have to
re-derive it from the existing translations.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
vlsi and others added 2 commits May 28, 2026 11:28
* `soap_sampler_title`: translate the leftover `(DEPRECATED)` marker to
  `(УСТАРЕЛО)`, matching the BSF component bundles.
* `sample_scope_all` / `sample_scope_children`: `подсэмпл` → `дочерний
  сэмпл` (sub-sample). Record `sub-sample → дочерний сэмпл` in the
  glossary; note the spelling stays `сэмпл` (with «э», 49 hits in the
  file, 0 of «семпл»).
* Glossary: collapse the duplicate `Browse` / `Browse…` rows into one
  and note the `...` is kept verbatim from `Browse...`.

Remove vs Delete were reviewed and intentionally left both as
`Удалить`: `remove` deletes a node from the test tree (Remove.java,
context menu) while `delete` is a row-delete button inside tables;
they never appear together. French does the same (both `Supprimer`);
German splits them (`Entfernen` / `Löschen`).

`:src:dist-check:test` — 2135 tests, 0 failures.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The earlier `?`-cleanup pass only covered messages_ru.properties, so
the TestBean component bundles still had question marks on checkbox
labels and their tooltips. These are boolean properties rendered as
checkboxes in the TestBean GUI (displayName) plus their tooltips
(shortDescription), not dialog prompts — so the `?` is dropped per
the Russian UI convention.

* CSVDataSetResources_ru: `quotedData`, `recycle`, `stopThread`
  (displayName + shortDescription).
* RandomVariableConfigResources_ru: `perThread`
  (displayName + shortDescription).
* DebugPostProcessorResources_ru: `displayJMeterProperties`,
  `displayJMeterVariables`, `displaySamplerProperties`,
  `displaySystemProperties` (shortDescription).
* DebugSamplerResources_ru: `displayJMeterVariables`,
  `displayJMeterProperties`, `displaySystemProperties`
  (shortDescription).

`:src:components:test` — 549 tests, 0 failures.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant