v0.252.0 — the sentences the program builds follow the language (R-557 slice 2 release A)
gates / gates (push) Successful in 23s

Slice 1 translated the dashboard's markup. The sentences the program BUILDS were still
Hungarian literals in Go, so an English household clicked an English button and was
answered in Hungarian. 226 of them move into the bundle here.

A flash was the hard part: it travels inside the redirect URL and is rendered by a
DIFFERENT request, so it now carries a bundle key plus its parameters. A link minted by
an older controller carries prose and is shown verbatim — never a raw key, never dropped.

Also converted: page data and view-model text, the internal/api JSON answers, the alert
banners (Alert.MessageKey, rendered on the way out of GetAlerts), 237 country names at
display, and the four page titles built around an app name (R-566 closed).

Hungarian is byte-identical, and that is measured rather than read:
scripts/i18n_go_parity.py freezes every Go literal at the base commit (7 467) and refuses
a key whose Hungarian is not that text, byte for byte. Three decoys, each seen to convict.
Its own first version filtered the capture through an ASCII-Hungarian word list and missed
seven real literals — the R-565 class. The filter is gone.

Nothing on the wire moved, and wire goldens now hold it there: the report's health
warnings and every notify event message stay Hungarian, because the hub MAILS the
controller's sentence when it has no entry of its own. Slice 3 (R-558) owns those.

MinAgent: 0.131.0 (unchanged). No hub release needed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
This commit is contained in:
2026-09-18 10:15:56 +02:00
parent 736f54b496
commit 5270bad76e
52 changed files with 10755 additions and 478 deletions
+427 -1
View File
@@ -1589,5 +1589,431 @@
"storage.figyelem": "WARNING:",
"storage_init.jelenlegi": "current:",
"debug.mp": "s",
"debug.p": "m"
"debug.p": "m",
"flash.share.already_on": "Sharing is already on.",
"flash.share.enable_failed": "Sharing could not be turned on.",
"flash.share.enabled": "Sharing is on.",
"flash.share.not_on": "Sharing is not on.",
"flash.share.relink_failed": "The new link could not be created.",
"flash.share.relinked": "A new share link is ready. The old link and every earlier sign-in are now invalid.",
"flash.share.disable_failed": "Sharing could not be turned off.",
"flash.share.disabled": "Sharing is off.",
"flash.share.pw_clear_failed": "The password could not be removed.",
"flash.share.pw_cleared": "The share password is removed.",
"flash.share.pw_too_short": "The password must be at least 8 characters long.",
"flash.share.pw_set_failed": "The password could not be set.",
"flash.share.pw_set": "The share password is set. Earlier sign-ins are now invalid.",
"flash.restore.started": "The restore has started — the status updates here.",
"flash.restore.file_started": "The file restore has started — the status updates here.",
"flash.restore.full_started": "The full restore has started — the status updates here.",
"flash.login.password_changed": "Your password is changed. Sign in with the new one.",
"flash.backup.window_invalid_time": "That is not a valid time. Use the HH:MM format (02:30, for example).",
"flash.backup.window_save_failed": "The backup window could not be saved.",
"flash.backup.window_updated": "The backup window is updated.",
"flash.sharing.save_failed": "That could not be saved.",
"flash.sharing.disabled": "Network sharing is off. The folders and the files are still there.",
"flash.sharing.prepare_running": "The sharing service is already being prepared.",
"flash.sharing.saved_preparing": "Setting saved. The sharing service is being prepared…",
"flash.sharing.pw_too_short": "The password must be at least 8 characters long.",
"flash.sharing.pw_mismatch": "The two passwords do not match.",
"flash.sharing.pw_set_failed": "The password could not be set.",
"flash.sharing.pw_set_preparing_already": "The sharing password is set. Preparation is already running.",
"flash.sharing.pw_set_preparing": "The sharing password is set. The sharing service is being prepared…",
"flash.sharing.folder_failed": "The folder could not be created.",
"flash.sharing.created": "The share is created.",
"flash.sharing.protected": "This share is part of the system and cannot be deleted.",
"flash.sharing.deleted": "The share is deleted — the folder and the files are still there.",
"flash.sharing.saved": "Setting saved.",
"flash.tier2.target_invalid": "The drive you picked is not valid.",
"flash.tier2.save_failed": "The setting could not be saved.",
"flash.tier2.saved": "The second backup setting is saved.",
"flash.tier2.app_email_off": "Email sending is off for this app.",
"flash.tier2.app_email_on": "Email sending is on for this app.",
"flash.offbox.mgr_unavailable": "The backup manager is not reachable.",
"flash.offbox.fields_required": "The target address, the user and the storage path are all required.",
"flash.offbox.path_absolute": "The storage path must be absolute (it has to start with /).",
"flash.offbox.config_invalid": "That setting is not valid: %s",
"flash.offbox.first_setup_needs_key": "The first setup needs both the SSH private key and the target machine’s known-host line.",
"flash.offbox.creds_save_failed": "The credentials could not be saved.",
"flash.offbox.save_failed": "The setting could not be saved.",
"flash.offbox.target_saved": "The remote backup target is saved.",
"flash.offbox.target_saved_escrow_agent_down": "The remote backup target is saved. — the key could not be prepared for safekeeping (the agent is not reachable); try again.",
"flash.offbox.target_saved_escrow_failed": "The remote backup target is saved. — the key could not be prepared for safekeeping; try again.",
"flash.offbox.target_not_set": "The remote backup target is not set.",
"flash.offbox.escrow_confirmed": "The key is confirmed in safekeeping — the remote backup can run from now on.",
"flash.offbox.repo_pw_required": "The repository password is required.",
"flash.offbox.repo_pw_failed": "The password could not be set: %s",
"flash.offbox.repo_pw_set": "The recovered repository password is set.",
"flash.offbox.app_missing": "The app is missing.",
"flash.offbox.app_setting_updated": "The remote backup setting is updated.",
"flash.offbox.waiting_for_escrow": "The remote backup is waiting for the key to be put into safekeeping.",
"flash.offbox.repo_orphaned": "The remote store is orphaned — start a new remote backup first, the way the card shows.",
"flash.offbox.run_started": "The remote backup has started — the status updates here.",
"flash.offbox.not_orphaned": "The off-site store is not orphaned.",
"flash.offbox.needs_confirmation": "The restore needs your confirmation.",
"flash.offbox.restart_started": "A new remote backup is starting — the old history is set aside, not deleted.",
"flash.offbox.restore_started": "The remote restore has started — the status updates here.",
"flash.offbox.full_needs_confirmation": "The full restore cannot run without your confirmation.",
"flash.offbox.full_restore_started": "The full restore has started — the status updates here.",
"flash.offbox.mgr_unreachable": "The backup manager cannot be reached.",
"flash.offbox.scratch_missing": "The check copy is missing.",
"flash.offbox.delete_needs_confirmation": "The delete cannot run without your confirmation.",
"flash.offbox.delete_failed": "The copy could not be deleted: %s",
"flash.offbox.scratch_deleted": "The check copy is deleted. Your real data is unchanged.",
"flash.offbox.recover_started": "The recovery has started — the status updates here.",
"flash.offbox.shares_restore_started": "The share restore has started — the status updates here.",
"flash.offbox.shares_recover_started": "The share recovery has started — the status updates here.",
"flash.offbox.run_already_going": "A remote backup is already running — this request did not start another one. What you see is still the earlier run; wait for it to finish.",
"page.title.logs": "%s — Logs",
"page.title.deploy": "%s — Install",
"page.title.app_settings": "%s — Settings",
"page.title.tier2_config": "Second backup setup — %s",
"logs.fetch_failed": "The logs could not be read: %v",
"storage.bar_purpose": "External storage — the large files of your installed apps (media, documents) go here; the databases stay on the internal SSD.",
"deploy.path_not_allowed": "network storage — cannot be picked for an app",
"creds.filebrowser_note": "This is the File manager sign-in. Felhom set the password on this machine.",
"ping.label.heartbeat": "Heartbeat",
"ping.label.system_health": "System health",
"ping.label.db_dump": "Database backup",
"ping.label.backup": "Backup",
"ping.label.integrity": "Backup integrity",
"ping.schedule.5min": "Every 5 minutes",
"ping.schedule.daily_at": "Daily at %s",
"offbox.selection_changed": "The selection changed since the last run — the next remote backup includes it.",
"backup.contents.db": "Config",
"backup.contents.data": "Data",
"backup.status.ok": "App data backup is fine",
"backup.status.db_failed": "The database backup failed",
"backup.tier2.no_drive": "No second drive",
"backup.tier2.badge_ok": "Done",
"backup.tier2.badge_error": "Error",
"backup.tier2.badge_running": "Running...",
"backup.tier2.schedule_daily": "Daily",
"backup.removed_app": "Removed app — its backup is here and can be restored",
"backup.tier2.dest_ssd": "internal SSD (database and settings only)",
"flash.backup.not_configured": "Backup is not set up",
"escrow.no_retrieval_password": "This machine has no stored recovery password.",
"escrow.stack_mgr_unavailable": "The app manager is not reachable.",
"escrow.unknown_app": "Unknown app.",
"escrow.missing_field": "A field is missing.",
"escrow.field_not_revealable": "This field cannot be revealed.",
"escrow.app_settings_unreadable": "The app’s settings cannot be read.",
"escrow.no_stored_value": "There is no stored value for this field.",
"escrow.initial_pw_read_failed": "The first password could not be read.",
"escrow.initial_pw_unavailable": "The first password cannot be read right now — the app has to be running, and the file may have been deleted after the first sign-in.",
"escrow.settings_unavailable": "The settings are not reachable.",
"escrow.filebrowser_not_ours": "Felhom did not set the File manager password on this machine, so we cannot show it.",
"escrow.password_unreadable": "The password cannot be read right now.",
"settings.pw_wrong_current": "That is not your current password",
"settings.pw_too_short": "The password must be at least 8 characters long",
"settings.pw_mismatch": "The two passwords do not match",
"settings.pw_save_error": "Something went wrong while saving the password",
"settings.notify_email_required": "Give an address for notifications – with notifications on, we need somewhere to send them.",
"settings.notify_save_error": "Something went wrong while saving the settings",
"settings.notify_saved_sync_failed": "Notification settings saved on this machine. Syncing them to the central service failed: %v",
"settings.notify_saved": "Notification settings saved.",
"settings.app_email_save_error": "Something went wrong while saving the app email setting",
"settings.app_email_shim_failed": "The setting is saved, but the email service could not be started.",
"settings.app_email_on": "App email is on. Turn it on for each app that should send email.",
"settings.app_email_off": "App email is off.",
"settings.notify_disabled": "Notifications are not turned on",
"settings.test_email_failed": "The test email could not be sent: %v",
"settings.test_email_sent": "The test email is sent.",
"storage.err_path_missing": "That path does not exist, or it is not a folder.",
"storage.err_not_separate": "That path is not a separately mounted drive. The data would land on the SSD.",
"storage.err_not_writable": "That path cannot be written to.",
"storage.err_overlaps": "That path overlaps the already registered path %s.",
"storage.err_save": "Something went wrong while saving.",
"storage.err_in_use": "It cannot be removed: these apps use it: %s",
"storage.err_default": "The default storage cannot be removed.",
"storage.err_last": "The last storage cannot be removed.",
"storage.err_delete": "Something went wrong while removing it.",
"storage.err_label": "The name cannot be empty and can be at most 50 characters.",
"storage.err_label_save": "Something went wrong while saving the name.",
"storage.msg_added": "Storage added: %s",
"storage.msg_removed": "Storage removed: %s",
"storage.msg_default_set": "Default storage set: %s",
"storage.msg_state_changed": "Storage state changed: %s",
"storage.msg_label_changed": "Name changed: %s",
"country.AF": "Afghanistan",
"country.AL": "Albania",
"country.DZ": "Algeria",
"country.AS": "American Samoa",
"country.AD": "Andorra",
"country.AO": "Angola",
"country.AI": "Anguilla",
"country.AQ": "Antarctica",
"country.AG": "Antigua and Barbuda",
"country.AR": "Argentina",
"country.AM": "Armenia",
"country.AW": "Aruba",
"country.AU": "Australia",
"country.AT": "Austria",
"country.AZ": "Azerbaijan",
"country.BS": "Bahamas",
"country.BH": "Bahrain",
"country.BD": "Bangladesh",
"country.BB": "Barbados",
"country.BY": "Belarus",
"country.BE": "Belgium",
"country.BZ": "Belize",
"country.BJ": "Benin",
"country.BM": "Bermuda",
"country.BT": "Bhutan",
"country.BO": "Bolivia",
"country.BA": "Bosnia and Herzegovina",
"country.BW": "Botswana",
"country.BR": "Brazil",
"country.BN": "Brunei",
"country.BG": "Bulgaria",
"country.BF": "Burkina Faso",
"country.BI": "Burundi",
"country.CV": "Cabo Verde",
"country.KH": "Cambodia",
"country.CM": "Cameroon",
"country.CA": "Kanada",
"country.KY": "Cayman Islands",
"country.CF": "Central African Republic",
"country.TD": "Chad",
"country.CL": "Chile",
"country.CN": "China",
"country.CO": "Colombia",
"country.KM": "Comoros",
"country.CG": "Congo",
"country.CD": "Democratic Republic of the Congo",
"country.CK": "Cook Islands",
"country.CR": "Costa Rica",
"country.CI": "Cote d’Ivoire",
"country.HR": "Croatia",
"country.CU": "Cuba",
"country.CW": "Curacao",
"country.CY": "Cyprus",
"country.CZ": "Czechia",
"country.DK": "Denmark",
"country.DJ": "Djibouti",
"country.DM": "Dominica",
"country.DO": "Dominican Republic",
"country.EC": "Ecuador",
"country.EG": "Egypt",
"country.SV": "El Salvador",
"country.GQ": "Equatorial Guinea",
"country.ER": "Eritrea",
"country.EE": "Estonia",
"country.SZ": "Eswatini",
"country.ET": "Ethiopia",
"country.FK": "Falkland Islands",
"country.FO": "Faroe Islands",
"country.FJ": "Fiji",
"country.FI": "Finland",
"country.FR": "France",
"country.GF": "French Guiana",
"country.PF": "French Polynesia",
"country.GA": "Gabon",
"country.GM": "Gambia",
"country.GE": "Georgia",
"country.DE": "Germany",
"country.GH": "Ghana",
"country.GI": "Gibraltar",
"country.GR": "Greece",
"country.GL": "Greenland",
"country.GD": "Grenada",
"country.GP": "Guadeloupe",
"country.GU": "Guam",
"country.GT": "Guatemala",
"country.GG": "Guernsey",
"country.GN": "Guinea",
"country.GW": "Guinea-Bissau",
"country.GY": "Guyana",
"country.HT": "Haiti",
"country.HN": "Honduras",
"country.HK": "Hong Kong",
"country.HU": "Hungary",
"country.IS": "Iceland",
"country.IN": "India",
"country.ID": "Indonesia",
"country.IR": "Iran",
"country.IQ": "Iraq",
"country.IE": "Ireland",
"country.IM": "Isle of Man",
"country.IL": "Israel",
"country.IT": "Italy",
"country.JM": "Jamaica",
"country.JP": "Japan",
"country.JE": "Jersey",
"country.JO": "Jordan",
"country.KZ": "Kazakhstan",
"country.KE": "Kenya",
"country.KI": "Kiribati",
"country.KP": "North Korea",
"country.KR": "South Korea",
"country.KW": "Kuwait",
"country.KG": "Kyrgyzstan",
"country.LA": "Laos",
"country.LV": "Latvia",
"country.LB": "Lebanon",
"country.LS": "Lesotho",
"country.LR": "Liberia",
"country.LY": "Libya",
"country.LI": "Liechtenstein",
"country.LT": "Lithuania",
"country.LU": "Luxemburg",
"country.MO": "Macao",
"country.MG": "Madagascar",
"country.MW": "Malawi",
"country.MY": "Malaysia",
"country.MV": "Maldives",
"country.ML": "Mali",
"country.MT": "Malta",
"country.MH": "Marshall Islands",
"country.MQ": "Martinique",
"country.MR": "Mauritania",
"country.MU": "Mauritius",
"country.YT": "Mayotte",
"country.MX": "Mexico",
"country.FM": "Micronesia",
"country.MD": "Moldova",
"country.MC": "Monaco",
"country.MN": "Mongolia",
"country.ME": "Montenegro",
"country.MS": "Montserrat",
"country.MA": "Morocco",
"country.MZ": "Mozambique",
"country.MM": "Myanmar",
"country.NA": "Namibia",
"country.NR": "Nauru",
"country.NP": "Nepal",
"country.NL": "Netherlands",
"country.NC": "New Caledonia",
"country.NZ": "New Zealand",
"country.NI": "Nicaragua",
"country.NE": "Niger",
"country.NG": "Nigeria",
"country.NU": "Niue",
"country.NF": "Norfolk Island",
"country.MK": "North Macedonia",
"country.MP": "Northern Mariana Islands",
"country.NO": "Norway",
"country.OM": "Oman",
"country.PK": "Pakistan",
"country.PW": "Palau",
"country.PS": "Palestine",
"country.PA": "Panama",
"country.PG": "Papua New Guinea",
"country.PY": "Paraguay",
"country.PE": "Peru",
"country.PH": "Philippines",
"country.PL": "Poland",
"country.PT": "Portugal",
"country.PR": "Puerto Rico",
"country.QA": "Qatar",
"country.RE": "Reunion",
"country.RO": "Romania",
"country.RU": "Russia",
"country.RW": "Rwanda",
"country.BL": "Saint Barthelemy",
"country.SH": "Saint Helena",
"country.KN": "Saint Kitts és Nevis",
"country.LC": "Saint Lucia",
"country.MF": "Saint Martin",
"country.PM": "Saint Pierre and Miquelon",
"country.VC": "Saint Vincent and the Grenadines",
"country.WS": "Samoa",
"country.SM": "San Marino",
"country.ST": "Sao Tome and Principe",
"country.SA": "Saudi Arabia",
"country.SN": "Senegal",
"country.RS": "Serbia",
"country.SC": "Seychelles",
"country.SL": "Sierra Leone",
"country.SG": "Singapore",
"country.SX": "Sint Maarten",
"country.SK": "Slovakia",
"country.SI": "Slovenia",
"country.SB": "Solomon Islands",
"country.SO": "Somalia",
"country.ZA": "South Africa",
"country.SS": "South Sudan",
"country.ES": "Spain",
"country.LK": "Srí Lanka",
"country.SD": "Sudan",
"country.SR": "Suriname",
"country.SE": "Sweden",
"country.CH": "Switzerland",
"country.SY": "Syria",
"country.TW": "Taiwan",
"country.TJ": "Tajikistan",
"country.TZ": "Tanzania",
"country.TH": "Thailand",
"country.TL": "Timor-Leste",
"country.TG": "Togo",
"country.TK": "Tokelau",
"country.TO": "Tonga",
"country.TT": "Trinidad and Tobago",
"country.TN": "Tunisia",
"country.TR": "Turkiye",
"country.TM": "Turkmenistan",
"country.TC": "Turks and Caicos Islands",
"country.TV": "Tuvalu",
"country.UG": "Uganda",
"country.UA": "Ukraine",
"country.AE": "United Arab Emirates",
"country.GB": "United Kingdom",
"country.US": "United States",
"country.UY": "Uruguay",
"country.UZ": "Uzbekistan",
"country.VU": "Vanuatu",
"country.VA": "Vatican City",
"country.VE": "Venezuela",
"country.VN": "Vietnam",
"country.VG": "British Virgin Islands",
"country.VI": "United States Virgin Islands",
"country.WF": "Wallis and Futuna",
"country.EH": "Western Sahara",
"country.YE": "Yemen",
"country.ZM": "Zambia",
"country.ZW": "Zimbabwe",
"api.deploy.netstorage_unreachable": "The network storage you picked cannot be reached from the apps right now, so the install cannot start. Try again in a few minutes, or tell your operator.",
"api.deploy.not_installable": "This app cannot be installed right now.",
"api.deploy.no_space": "There is not enough free space to install: only %.0f GB is free, and the system keeps %.0f GB in reserve to protect the core services (controller, proxy). Free some space, or add more storage.",
"api.deploy.started": "The install has started – the card shows how it is going",
"api.start.drive_missing": "Storage %s cannot be reached right now — the app cannot start until the drive is back.",
"api.start.not_enough_memory": "There is not enough memory to start. Needs %d MB, %d MB is free (%d MB used of %d MB usable)",
"api.action.state_not_saved": "This cannot be done: the app’s settings cannot be saved.",
"api.update.started": "The update has started – the card shows how it is going",
"api.settings.updated": "Settings updated",
"api.integration.enabled": "Integration turned on",
"api.integration.disabled": "Integration turned off",
"api.backup.already_running": "A backup is already running",
"api.backup.started": "The backup has started",
"api.backup.tier2_started": "The second backup has started",
"api.update.kicked_off": "The update has started",
"api.config.unchanged": "The configuration is unchanged — no restart is needed.",
"api.config.applied": "The configuration is applied — the controller is restarting.",
"api.geo.set": "Country limit set",
"api.geo.no_cloudflare": "The Cloudflare API is not set up",
"api.geo.sync_started": "The sync has started",
"api.geo.app_set": "App country limit set",
"api.geo.app_removed": "App country limit removed",
"alert.link.settings": "Settings",
"alert.link.monitoring": "System monitor",
"alert.link.update": "Update",
"alert.deadapp.group": "%d installed apps are not running — look at the system monitor",
"alert.deadapp.one": "An installed app is not running: %s",
"alert.deadapp.one_state": "An installed app is not running: %s (%s)",
"alert.storage.disconnected": "A drive is disconnected: %s (%s)",
"alert.hub.disabled": "The hub connection is off — central monitoring is not running",
"alert.hub.unreachable": "The hub cannot be reached — last error: %s",
"alert.backup.disabled": "Backup is not turned on",
"alert.update.available": "A new controller version is available: %s",
"alert.overflow": "+ %d more warnings",
"disk.err.bad_request": "that request is not valid",
"disk.err.bad_mountpoint": "that mount point is not valid",
"disk.err.target_required": "a target storage is required for the move",
"disk.err.name_mismatch": "the name you typed does not match the mount name",
"disk.err.unknown_mode": "unknown mode (migrate or anyway)",
"disk.err.device_required": "a device is required",
"disk.err.init_in_progress": "a drive is already being initialised",
"disk.err.protected": "this drive is protected (system / backup) — erasing it needs an operator signature",
"disk.err.wipe_failed": "the erase failed: %s",
"disk.err.attach_unavailable": "This drive cannot be attached right now — it may already be registered, or it may have been unplugged. Reload the page and look at Storage → Drives."
}