feat: add Russian (ru) translation for the JMeter UI#6706
Open
vlsi wants to merge 9 commits into
Open
Conversation
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>
* `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>
* `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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
ruinJMeterMenuBar.getLanguages()so the Russian locale shows up under Options → Choose Language, and addru=<localised name>to every existingmessages_*.properties(EnglishRussian, GermanRussisch, FrenchRusse, ...).messages_ru.properties(1523 keys) and 33 component bundles*_ru.propertiescovering 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).xdocs/localising/glossary_ru.mdso 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
colors.properties,images/icon*.properties,gui/util/textarea.properties,Example*Resources.properties) are deliberately not translated — same convention as the other locales.\:escaping / code identifiers (HttpClient,Groovy,JSR223,HTTPmethods,{0},${var}, ...) are preserved verbatim.diffof key names is empty for every translated bundle), soPackageTestpasses.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(includesorg.apache.jmeter.resources.PackageTestviatestFixtures(core)) — 438 tests, 0 failures.:src:core:test— 379 tests, 0 failures../gradlew runGuiwith the new locale — selected via Options → Choose Language → Русский, every visible label rendered in Russian without missing-key fallbacks.🤖 Generated with Claude Code