mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-05-08 03:01:47 +00:00
feat(i18n): add Ukrainian locale
This commit is contained in:
parent
0d41e94ca9
commit
c4b287ba53
6 changed files with 35 additions and 6 deletions
|
|
@ -25,7 +25,7 @@ Language resolution order:
|
|||
3. ``display.language`` from config.yaml
|
||||
4. ``"en"`` (baseline)
|
||||
|
||||
Supported languages: en, zh, ja, de, es, fr. Unknown values fall back to en.
|
||||
Supported languages: en, zh, ja, de, es, fr, uk. Unknown values fall back to en.
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
|
@ -39,7 +39,7 @@ from typing import Any
|
|||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
SUPPORTED_LANGUAGES: tuple[str, ...] = ("en", "zh", "ja", "de", "es", "fr")
|
||||
SUPPORTED_LANGUAGES: tuple[str, ...] = ("en", "zh", "ja", "de", "es", "fr", "uk")
|
||||
DEFAULT_LANGUAGE = "en"
|
||||
|
||||
# Accept a few natural aliases so users who type "chinese" / "zh-CN" / "jp"
|
||||
|
|
@ -51,6 +51,7 @@ _LANGUAGE_ALIASES: dict[str, str] = {
|
|||
"german": "de", "deutsch": "de", "de-de": "de",
|
||||
"spanish": "es", "español": "es", "espanol": "es", "es-es": "es", "es-mx": "es",
|
||||
"french": "fr", "français": "fr", "france": "fr", "fr-fr": "fr", "fr-be": "fr", "fr-ca": "fr", "fr-ch": "fr",
|
||||
"ukrainian": "uk", "ukrainisch": "uk", "українська": "uk", "uk-ua": "uk", "ua": "uk",
|
||||
}
|
||||
|
||||
_catalog_cache: dict[str, dict[str, str]] = {}
|
||||
|
|
|
|||
|
|
@ -784,7 +784,7 @@ DEFAULT_CONFIG = {
|
|||
# UI language for static user-facing messages (approval prompts, a
|
||||
# handful of gateway slash-command replies). Does NOT affect agent
|
||||
# responses, log lines, tool outputs, or slash-command descriptions.
|
||||
# Supported: en, zh, ja, de, es. Unknown values fall back to en.
|
||||
# Supported: en, zh, ja, de, es, fr, uk. Unknown values fall back to en.
|
||||
"language": "en",
|
||||
# TUI busy indicator style: kaomoji (default), emoji, unicode (braille
|
||||
# spinner), or ascii. Live-swappable via `/indicator <style>`.
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
#
|
||||
# Keys are dotted paths; nesting below is purely for readability. Values may
|
||||
# contain {placeholder} tokens for str.format substitution. When adding a
|
||||
# new key, add it to EVERY locale file (en/zh/ja/de/es/fr) in the same commit --
|
||||
# new key, add it to EVERY locale file (en/zh/ja/de/es/fr/uk) in the same commit --
|
||||
# tests/agent/test_i18n.py asserts catalog parity.
|
||||
|
||||
approval:
|
||||
|
|
|
|||
24
locales/uk.yaml
Normal file
24
locales/uk.yaml
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
# Каталог статичних повідомлень Hermes -- Українська
|
||||
# See locales/en.yaml for the source of truth; keep keys in sync.
|
||||
|
||||
approval:
|
||||
dangerous_header: "⚠️ НЕБЕЗПЕЧНА КОМАНДА: {description}"
|
||||
choose_long: " [o]один раз | [s]сеанс | [a]завжди | [d]відхилити"
|
||||
choose_short: " [o]один раз | [s]сеанс | [d]відхилити"
|
||||
prompt_long: " Вибір [o/s/a/D]: "
|
||||
prompt_short: " Вибір [o/s/D]: "
|
||||
timeout: " ⏱ Час очікування вичерпано — команду відхилено"
|
||||
allowed_once: " ✓ Дозволено один раз"
|
||||
allowed_session: " ✓ Дозволено для цього сеансу"
|
||||
allowed_always: " ✓ Додано до постійного списку дозволених команд"
|
||||
denied: " ✗ Відхилено"
|
||||
cancelled: " ✗ Скасовано"
|
||||
blocklist_message: "Ця команда є в безумовному списку блокування, її не можна схвалити."
|
||||
|
||||
gateway:
|
||||
approval_expired: "⚠️ Час схвалення минув (агент більше не очікує). Попросіть агента спробувати ще раз."
|
||||
draining: "⏳ Очікування завершення {count} активних агент(ів) перед перезапуском..."
|
||||
goal_cleared: "✓ Ціль очищено."
|
||||
no_active_goal: "Немає активної цілі."
|
||||
config_read_failed: "⚠️ Не вдалося прочитати config.yaml: {error}"
|
||||
config_save_failed: "⚠️ Не вдалося зберегти конфігурацію: {error}"
|
||||
|
|
@ -89,6 +89,9 @@ def test_normalize_lang_accepts_aliases():
|
|||
assert i18n._normalize_lang("Deutsch") == "de"
|
||||
assert i18n._normalize_lang("español") == "es"
|
||||
assert i18n._normalize_lang("jp") == "ja"
|
||||
assert i18n._normalize_lang("Ukrainian") == "uk"
|
||||
assert i18n._normalize_lang("uk-UA") == "uk"
|
||||
assert i18n._normalize_lang("ua") == "uk"
|
||||
|
||||
|
||||
def test_normalize_lang_unknown_falls_back():
|
||||
|
|
@ -126,6 +129,7 @@ def test_default_when_nothing_set(monkeypatch):
|
|||
def test_t_explicit_lang():
|
||||
assert i18n.t("approval.denied", lang="en").endswith("Denied")
|
||||
assert i18n.t("approval.denied", lang="zh").endswith("已拒绝")
|
||||
assert i18n.t("approval.denied", lang="uk").endswith("Відхилено")
|
||||
|
||||
|
||||
def test_t_formats_placeholders():
|
||||
|
|
|
|||
|
|
@ -1167,14 +1167,14 @@ display:
|
|||
show_cost: false # Show estimated $ cost in the CLI status bar
|
||||
tool_preview_length: 0 # Max chars for tool call previews (0 = no limit, show full paths/commands)
|
||||
runtime_metadata_footer: false # Gateway: append a runtime-context footer to final replies
|
||||
language: en # UI language for static messages (approval prompts, some gateway replies). en | zh | ja | de | es
|
||||
language: en # UI language for static messages (approval prompts, some gateway replies). en | zh | ja | de | es | fr | uk
|
||||
```
|
||||
|
||||
### UI language for static messages
|
||||
|
||||
The `display.language` setting translates a small set of static user-facing messages — the CLI approval prompt, a handful of gateway slash-command replies (e.g. restart-drain notices, "approval expired", "goal cleared"). It does **not** translate agent responses, log lines, tool output, error tracebacks, or slash-command descriptions — those stay in English. If you want the agent itself to reply in another language, just tell it in your prompt or system message.
|
||||
|
||||
Supported values: `en` (default), `zh` (Simplified Chinese), `ja` (Japanese), `de` (German), `es` (Spanish). Unknown values fall back to English.
|
||||
Supported values: `en` (default), `zh` (Simplified Chinese), `ja` (Japanese), `de` (German), `es` (Spanish), `fr` (French), `uk` (Ukrainian). Unknown values fall back to English.
|
||||
|
||||
You can also set this per-session with the `HERMES_LANGUAGE` env var, which overrides the config value.
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue