feat(i18n): complete message parity across all 25 locales
Gitea Actions Runner Test / test-job (push) Successful in 1s
CI / check (push) Successful in 37s
CI / tests-unit (push) Successful in 1m49s
CI / tests-integration (push) Successful in 1m50s
CI / tests-ui (push) Successful in 2m29s
CI / preflight (push) Skipped
CI / deploy (push) Failing after 1m37s

The admin.studio.nitroCleanup section (102 keys) only existed in en and
nl, so 23 locales fell back to English for the entire Nitro Cleanup
panel. The referrals and dailyRewards keys were missing from the same
23 locales, and en itself was missing 6 keys that nl had.

Add the missing keys to every locale with translations, so all 25
locales now carry the same 6063 keys.
This commit is contained in:
openhands committed 2026-09-27 18:38:58 +02:00
1 parent 944527e078
commit bc00ecf08c
24 files changed
+4483 -182

No files matched your search

+199 -7
View File
@@ -175,7 +175,9 @@
"cmsErrors": "CMS errors",
"themeBuilder": "Theme builder",
"openSidebar": "Open menu",
"closeSidebar": "Close menu"
"closeSidebar": "Close menu",
"referrals": "紹介",
"dailyRewards": "デイリー報酬"
},
"logs": {
"audit": {
@@ -1806,7 +1808,8 @@
"saving": "Saving…",
"deleteAd": "Delete ad",
"cancel": "Cancel"
}
},
"colId": "ID"
},
"writeableBoxes": {
"title": "Writeable Boxes",
@@ -3361,7 +3364,9 @@
"errors": "Errors",
"alerts": "Alerts",
"toolsGroup": "Tools",
"cmsErrors": "CMS errors"
"cmsErrors": "CMS errors",
"referrals": "紹介",
"dailyRewards": "デイリー報酬"
},
"events": "Events",
"eventsSubtitle": "Hotel events and event types",
@@ -4969,6 +4974,64 @@
"NoscopescreatedyetAddonebelow": "No scopes created yet. Add one below.",
"Rename": "Rename"
}
},
"referrals": {
"title": "紹介",
"subtitle": "招待システム",
"referralsToday": "今日の紹介",
"referralsTotal": "紹介総数",
"invitedTotal": "招待数",
"claims": "受け取った報酬",
"settings": "報酬設定",
"needed": "必要な紹介数",
"rewardAmount": "報酬額",
"rewardCurrency": "報酬通貨",
"blockSameIp": "招待者の現在IPと共有する紹介を拒否",
"save": "設定を保存",
"saving": "保存中…",
"saved": "紹介設定を保存しました。",
"saveError": "紹介設定を保存できませんでした。",
"recent": "最近の紹介",
"unavailable": "紹介データは一時的に利用できません。",
"empty": "まだ紹介はありません。",
"inviter": "招待者",
"invitee": "招待されたユーザー",
"ip": "IP",
"date": "日付"
},
"dailyRewards": {
"title": "デイリーログイン報酬",
"subtitle": "デイリーログイン報酬スケジュール",
"enabled": "機能ステータス",
"yes": "有効",
"no": "無効",
"scheduleDays": "スケジュール日",
"claimsToday": "今日の受け取り",
"claimsTotal": "総受け取り数",
"status": "機能ステータス",
"statusHint": "無効にすると、報酬カードが非表示になり、新しい受け取りは拒否されます。",
"disable": "無効にする",
"enable": "有効にする",
"schedule": "報酬スケジュール",
"day": "日 {day}",
"reward": "報酬",
"amount": "金額",
"actions": "操作",
"addDay": "日",
"add": "日を追加",
"save": "保存",
"saving": "保存中…",
"saved": "報酬スケジュールを保存しました。",
"cancel": "キャンセル",
"edit": "編集",
"delete": "削除",
"created": "報酬日を追加しました。",
"updated": "報酬日を更新しました。",
"deleted": "報酬日を削除しました。",
"saveError": "報酬日を保存できませんでした。",
"deleteError": "報酬日を削除できませんでした。",
"confirmDeleteTitle": "報酬日を削除",
"confirmDeleteBody": "この報酬日は今後付与されません。過去の受け取りは記録されたまま残ります。"
}
},
"myDashboard": {
@@ -5049,8 +5112,27 @@
"empty": "You're all caught up. No actions waiting.",
"unavailable": "Some actions could not be checked. Available actions are shown above.",
"retry": "Try again",
"rewardUnavailable": "Referral progress is temporarily unavailable. Please try again."
}
"rewardUnavailable": "Referral progress is temporarily unavailable. Please try again.",
"dailyReward": "デイリー報酬の受け取り準備ができました"
},
"dailyClaimed": "デイリー報酬を受け取りました — また明日!",
"dailyErrors": {
"already_claimed": "今日のデイリー報酬はすでに受け取っています。",
"disabled": "デイリー報酬は現在無効です。",
"bad_config": "デイリー報酬スケジュールが正しく設定されていません。スタッフに連絡してください。",
"ratelimit": "試行回数が多すぎます。少し待ってから再試行してください。",
"error": "デイリー報酬を受け取れませんでした。もう一度お試しください。"
},
"dailyRewardTitle": "デイリー報酬",
"dailyRewardHint": "毎日ログインして報酬を受け取ろう — 連続記録は大きな日まで伸びていきます。",
"dailyRewardDay": "日 {day}",
"dailyRewardStreak": "{count, plural, one {連続: # 日} other {連続: # 日}}",
"dailyRewardNextClaim": "次の受け取り: {amount} {currency}",
"dailyRewardTomorrow": "明日: {amount} {currency}",
"dailyRewardClaim": "デイリー報酬を受け取る",
"dailyRewardClaimedToday": "今日受け取りました — 次の報酬はまた明日。",
"dailyRewardDisabled": "デイリー報酬は現在無効です。ホテルを探索できます。",
"dailyRewardUnavailable": "デイリー報酬スケジュールを読み込めませんでした。もう一度お試しください。"
},
"error": {
"code": "Error",
@@ -6045,7 +6127,9 @@
"emailRequired": "Email is required.",
"passwordRequired": "Password is required.",
"passwordsDontMatch": "Passwords do not match.",
"newestCitizens": "Newest citizens"
"newestCitizens": "Newest citizens",
"ageVerified": "18歳以上です。年齢要件に同意します。",
"invitedBy": "{username} さんに招待されました"
},
"forgot": {
"title": "Reset password",
@@ -6479,7 +6563,11 @@
"sprite": "· sprite",
"Git": "Git:"
}
}
},
"title": "リンクされたアカウント",
"subtitle": "ソーシャルアカウントをリンクしてワンクリックでログイン",
"connected": "リンク済み",
"unavailable": "利用不可"
},
"toolbar": {
"home": "ホーム",
@@ -6497,6 +6585,110 @@
},
"admin": {
"studio": {
"nitroCleanup": {
"alreadyRunning": "スキャンは既に実行中です — それに接続しました。",
"ageUnknown": "年齢不明",
"ageBelow": "< 1日",
"scanButton": "家具アセットをスキャン",
"scanningAssets": "アセットをスキャン中…",
"cancelButton": "キャンセル",
"deleteSelected": "選択したものを削除 ({count})",
"deleting": "削除中…",
"redownloadBroken": "破損したものを再ダウンロード",
"redownloading": "再ダウンロード中…",
"autoClean": "古い偽物を自動クリーン",
"cleaning": "クリーン中…",
"exportManifest": "マニフェストをエクスポート",
"exporting": "エクスポート中…",
"phaseStems": "家具のステムを読み込み中…",
"phaseReaddir": "アセットディレクトリを読み取り中…",
"phaseValidate": ".nitroバンドルを検証中…",
"phaseScanning": "スキャン中…",
"scanProgressFiles": "{count} ファイル",
"repairProgress": "ok {ok}, 失敗 {failed}",
"attachedNotice": "スキャンはバックグラウンドで継続します — 完了すると結果が表示されます。",
"sessionCancelled": "スキャンがキャンセルされました。",
"onlyOldLabel": "これより古いファイルのみ表示",
"onlyOldAgeLabel": "表示する最小日数",
"onlyOldToggle": "最近のファイルを非表示",
"daysLabel": "日",
"autoAgeLabel": "自動クリーンの最小日数",
"loadingResult": "スキャン結果を読み込み中…",
"scannedStat": "スキャンされたアセットファイル",
"cachedNotice": "(キャッシュ済み — ディレクトリは変更なし)",
"fakeStat": "偽の nitro (一致するアイテムなし)",
"brokenStat": "破損した nitro (読み取り不可)",
"groupEmpty": "見つかりませんでした",
"selectedCount": "{count} 件選択",
"copiesBadge": "{count} コピー",
"groupFakeLabel": "偽の nitro",
"groupFakeDescription": "これらのファイルは items_base のどのアイテムとも一致しません — 削除または改名された家具の残骸です。",
"groupBrokenLabel": "破損した nitro",
"groupBrokenDescription": "これらのファイルはアイテムに属していますが、有効な Nitro バンドルとして読み取れません。",
"groupSwfLabel": "孤立した SWF",
"groupSwfDescription": "items_base のどのアイテムとも一致しない .swf ファイル。",
"groupIconLabel": "孤立したアイコン",
"groupIconDescription": "items_base のどのアイテムとも一致しないアイコンファイル。",
"warningText": "破損した .nitro を削除すると、データベース内のアイテムはバンドルなしのままになります — 再ダウンロードするか、カタログ監査で後で取得してください。このツールでデータベースの行が削除されることはありません。",
"onlyAssetsTouched": "アセットファイルのみ変更されます — FurnitureData.json とデータベースの行はそのまま残ります。",
"emptyHint": "各家具アセットディレクトリをスキャンして、偽物と破損した nitro バンドル、孤立した SWF とアイコンを削除、再ダウンロード、または古い残骸の自動クリーンを行います。",
"noResult": "スキャン結果はまだありません — まず家具アセットのスキャンを実行してください。",
"scanFailed": "スキャンに失敗しました。",
"confirmDeleteTitle": "{count} 個のアセットファイルを削除しますか?",
"confirmDeleteDescription": "ファイルはすべてのディレクトリから削除されます (public + ミラーリングされた gamedata)。データベースの行は変更されません。",
"confirmDeleteLabel": "削除",
"confirmRepairTitle": "{count} 個の破損した .nitro バンドルを再ダウンロードしますか?",
"confirmRepairDescription": "バンドルは設定された nitro ソースから再取得され、すべてのディレクトリに上書きされます (public + ミラーリングされた gamedata)。",
"confirmRepairLabel": "再ダウンロード",
"confirmAutoCleanTitle": "{days} 日より古い偽の nitro を自動クリーンしますか?",
"confirmAutoCleanDescription": "閾値より古い偽の .nitro ファイル (一致するアイテムなし) のみ削除されます。破損したバンドルと最近のファイルは変更されません。",
"confirmAutoCleanLabel": "自動クリーン",
"toastDeletePartial": "{copies} コピーを削除しましたが、一部のファイルは削除できませんでした",
"toastDeleteDone": "{copies} ファイルコピーを削除 ({deleted} ファイル)",
"toastRepairDone": "{count} 個の .nitro バンドルを修復",
"toastRepairFailed": "バンドルを取得できませんでした ({failed} 件失敗)",
"toastRepairCancelled": "修復がキャンセルされました",
"toastAutoCleanDone": "{deleted} 個の古い偽の .nitro ファイルをクリーン ({copies} コピー)。{recent} 件の最新 + {broken} 件の破損をスキップ。",
"toastAutoCleanNothing": "削除するほど古いものはありません ({recent} 件の最新、{broken} 件の破損をスキップ)",
"toastManifestDownload": "スキャンマニフェストをダウンロードしました",
"gamedataTitle": "ゲームデータのクリーン",
"gamedataHint": "先にプレビュー: これは FurnitureData.json、FigureMap.json、FigureData.json を上書きします。上のアセットツールとは異なり、参照しない行を削除します — 実行する前にカウントを確認してください。",
"gamedataScan": "ゲームデータのプレビュー",
"gamedataScanning": "スキャン中…",
"gamedataRun": "選択を実行",
"gamedataRunning": "クリーン中…",
"gamedataNoResult": "プレビューはまだありません — まずゲームデータの JSON ファイルをスキャンしてください。",
"gamedataCount_duplicates": "FurnitureData の重複",
"gamedataCount_orphans": "FurnitureData の孤立",
"gamedataCount_figureMap": "FigureMap の問題",
"gamedataCount_figureData": "未使用の FigureData",
"gamedataPass_dedupeFurnitureData": "FurnitureData の重複排除",
"gamedataPassDesc_dedupeFurnitureData": "1つのセクション内で繰り返される classnames を削除し、最高リビジョンのエントリを保持します。",
"gamedataPass_cleanFurnitureData": "FurnitureData をクリーン",
"gamedataPassDesc_cleanFurnitureData": "すべてのディレクトリで .nitro バンドルが欠落しているエントリを削除します。",
"gamedataPass_cleanFigureMap": "FigureMap をクリーン",
"gamedataPassDesc_cleanFigureMap": "FigureData で不足しているセットを指す部分と、完全に重複する部分を削除します。",
"gamedataPass_cleanFigureData": "FigureData をクリーン",
"gamedataPassDesc_cleanFigureData": "FigureMap の部分が参照しないセットを削除し、どのセットタイプも使用しないパレットを削除します。FigureMap のクリーンの後に実行する必要があります。",
"gamedataNothingSelected": "少なくとも1つのクリーン手順を選択してください",
"gamedataConfirmTitle": "ゲームデータの JSON ファイルを上書きしますか?",
"gamedataConfirmDescription": "{passes} 手順が {duplicates} 重複グループ、{orphans} 孤立行、{figureMap} FigureMap の問題、{figureData} 未使用の FigureData エントリに対して実行されます。行はバックアップなしで削除されます — これは元に戻せません。",
"gamedataConfirmLabel": "ファイルを上書き",
"gamedataDifferingWarning": "少なくとも1つの重複は保持されるエントリの正確なコピーではないため、削除された行は保持されるエントリにないデータを含んでいました。",
"gamedataCrossSectionNote": "{count} 個の classname が roomitemtypes と wallitemtypes の両方に存在します。これらは報告のみ — 1つを削除するとアイテムのタイプが変わります。",
"gamedataToastDone": "ゲームデータのクリーンが {removed} 行を削除しました",
"gamedataToastNothing": "ゲームデータはすでにクリーンでした",
"gamedataMaxRemovalsLabel": "手順ごとの最大行数",
"gamedataMaxRemovalsHint": "0 はデフォルトの 500 を使用します。より多くの削除が必要な手順は、書く前に停止して確認します。",
"gamedataLimitTitle": "{pass} は {maxRemovals} の制限を超えて {wouldRemove} 行を削除します。",
"gamedataLimitDescription": "その手順は何も書き込まなかったため、ファイルは変更されていません。まずアセットパスを確認してください — 間違ったディレクトリはすべての行を孤立させます。制限を引き上げることは、別の意図的な実行です。",
"gamedataLimitOverride": "{wouldRemove} 行を強制的に削除",
"historyTitle": "自動クリーンの履歴",
"historyScheduled": "スケジュール済み",
"historyManual": "手動",
"historyEntry": "{deleted} 件を削除 ({copies} コピー)、{recent} 件の最新と {broken} 件の破損をスキップ",
"historyErrors": "{count} エラー"
},
"importDiagnostics": {
"attempts": "ファイル診断",
"preliminary": "アドレスの事前確認です。内容はインポート時に検証します。",