Fix translation pluralization format for next-intl

- Convert i18next pluralization format to next-intl ICU format
- Change from with_count_one/with_count_other to ICU plural syntax
- Update footer.remixes.label to use # for count formatting
- Update party.details.turns to use proper plural format

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Justin Edmund 2025-09-02 21:15:35 -07:00
parent 59bd37e806
commit 903ab8aeb1
3 changed files with 62 additions and 65 deletions

View file

@ -29,7 +29,7 @@ const RemixedToast = ({
return ( return (
<Toast <Toast
altText={t('toasts.remixed', { title: partyName })} altText={t('toasts.remixed_alt', { title: partyName })}
open={open} open={open}
duration={2400} duration={2400}
type="foreground" type="foreground"

View file

@ -14,8 +14,8 @@
"confirm_logout": "Are you sure you want to log out?", "confirm_logout": "Are you sure you want to log out?",
"incompatible_weapon": "You've selected a weapon that can't be added to the Additional Weapon slots.", "incompatible_weapon": "You've selected a weapon that can't be added to the Additional Weapon slots.",
"unsaved_changes": { "unsaved_changes": {
"party": "You will lose all changes to your party <strong>{{objectName}}</strong> if you continue.<br/><br/>Are you sure you want to continue without saving?", "party": "You will lose all changes to your party <strong>{objectName}</strong> if you continue.<br/><br/>Are you sure you want to continue without saving?",
"object": "You will lose all changes to <strong>{{objectName}}</strong> if you continue.<br/><br/>Are you sure you want to continue without saving?", "object": "You will lose all changes to <strong>{objectName}</strong> if you continue.<br/><br/>Are you sure you want to continue without saving?",
"buttons": { "buttons": {
"confirm": "Continue without saving", "confirm": "Continue without saving",
"cancel": "Nevermind" "cancel": "Nevermind"
@ -25,17 +25,17 @@
"ax": { "ax": {
"no_skill": "No AX Skill", "no_skill": "No AX Skill",
"errors": { "errors": {
"value_too_low": "{{name}} must be at least {{minValue}}{{suffix}}", "value_too_low": "{name} must be at least {minValue}{suffix}",
"value_too_high": "{{name}} cannot be greater than {{maxValue}}{{suffix}}", "value_too_high": "{name} cannot be greater than {maxValue}{suffix}",
"value_not_whole": "{{name}} must be a whole number", "value_not_whole": "{name} must be a whole number",
"value_empty": "{{name}} must have a value" "value_empty": "{name} must have a value"
} }
}, },
"awakening": { "awakening": {
"no_type": "No awakening", "no_type": "No awakening",
"errors": { "errors": {
"value_too_low": "Awakening level must be at least {{minValue}}", "value_too_low": "Awakening level must be at least {minValue}",
"value_too_high": "Awakening level cannot be greater than {{maxValue}}", "value_too_high": "Awakening level cannot be greater than {maxValue}",
"value_not_whole": "Awakening level must be a whole number", "value_not_whole": "Awakening level must be a whole number",
"value_empty": "Awakening must have a level" "value_empty": "Awakening must have a level"
} }
@ -77,10 +77,10 @@
}, },
"earring": { "earring": {
"errors": { "errors": {
"value_too_low": "{{name}} must be at least {{minValue}}", "value_too_low": "{name} must be at least {minValue}",
"value_too_high": "{{name}} cannot be greater than {{maxValue}}", "value_too_high": "{name} cannot be greater than {maxValue}",
"value_not_whole": "{{name}} must be a whole number", "value_not_whole": "{name} must be a whole number",
"value_empty": "{{name}} must have a value" "value_empty": "{name} must have a value"
} }
}, },
"elements": { "elements": {
@ -144,17 +144,15 @@
"empty": "This team doesn't have a description" "empty": "This team doesn't have a description"
}, },
"remixes": { "remixes": {
"label_zero": "Remixes", "label": "{count, plural, =0 {Remixes} =1 {# Remix} other {# Remixes}}",
"label_one": "{{count}} Remix",
"label_other": "{{count}} Remixes",
"empty": "No one has remixed this team yet" "empty": "No one has remixed this team yet"
} }
}, },
"header": { "header": {
"anonymous": "Anonymous", "anonymous": "Anonymous",
"untitled_team": "Untitled team by {{username}}", "untitled_team": "Untitled team by {username}",
"new_team": "New team", "new_team": "New team",
"byline": "{{partyName}} by {{username}}" "byline": "{partyName} by {username}"
}, },
"job_skills": { "job_skills": {
"all": "All skills", "all": "All skills",
@ -213,7 +211,7 @@
"conflict": { "conflict": {
"character": "Only one <strong>version of a character</strong> can be included in each party. Do you want to change your party members?", "character": "Only one <strong>version of a character</strong> can be included in each party. Do you want to change your party members?",
"weapon": { "weapon": {
"generic": "Only one weapon from the <strong>{{series}} Series</strong> can be included in each party. Do you want to change your weapons?", "generic": "Only one weapon from the <strong>{series} Series</strong> can be included in each party. Do you want to change your weapons?",
"opus-draconic": "Only one <strong>Dark Opus</strong> or <strong>Draconic Weapon</strong> can be included in each party. Do you want to change your weapons?" "opus-draconic": "Only one <strong>Dark Opus</strong> or <strong>Draconic Weapon</strong> can be included in each party. Do you want to change your weapons?"
}, },
"buttons": { "buttons": {
@ -391,7 +389,7 @@
}, },
"agreement": "By signing up, I agree to the <br/><2>Privacy Policy</2> and <1>Usage Guidelines</1>.", "agreement": "By signing up, I agree to the <br/><2>Privacy Policy</2> and <1>Usage Guidelines</1>.",
"errors": { "errors": {
"field_in_use": "This {{field}} is already in use", "field_in_use": "This {field} is already in use",
"empty_email": "Please enter your email", "empty_email": "Please enter your email",
"invalid_email": "That email address is not valid", "invalid_email": "That email address is not valid",
"username_too_short": "Username must be at least 3 characters", "username_too_short": "Username must be at least 3 characters",
@ -467,8 +465,8 @@
"roadmap": "Roadmap / granblue.team", "roadmap": "Roadmap / granblue.team",
"discover": "Discover teams / granblue.team", "discover": "Discover teams / granblue.team",
"new": "Create a new team / granblue.team", "new": "Create a new team / granblue.team",
"profile": "@{{username}}'s Teams / granblue.team", "profile": "@{username}'s Teams / granblue.team",
"team": "{{emoji}} {{teamName}} by {{username}} / granblue.team", "team": "{emoji} {teamName} by {username} / granblue.team",
"saved": "Your saved teams / granblue.team" "saved": "Your saved teams / granblue.team"
}, },
"descriptions": { "descriptions": {
@ -477,8 +475,8 @@
"roadmap": "Upcoming planned features for granblue.team", "roadmap": "Upcoming planned features for granblue.team",
"discover": "Save and discover teams to use in Granblue Fantasy and search by raid, element or recency", "discover": "Save and discover teams to use in Granblue Fantasy and search by raid, element or recency",
"new": "Create and theorycraft teams to use in Granblue Fantasy and share with the community", "new": "Create and theorycraft teams to use in Granblue Fantasy and share with the community",
"profile": "Browse @{{username}}'s Teams and filter by raid, element or recency", "profile": "Browse @{username}'s Teams and filter by raid, element or recency",
"team": "Browse this team for {{raidName}} by {{username}} and others on granblue.team" "team": "Browse this team for {raidName} by {username} and others on granblue.team"
} }
}, },
"party": { "party": {
@ -505,8 +503,7 @@
"seconds": "s" "seconds": "s"
}, },
"turns": { "turns": {
"with_count_one": "{{count}} turn", "with_count": "{count, plural, =1 {# turn} other {# turns}}"
"with_count_other": "{{count}} turns"
} }
}, },
"notices": { "notices": {
@ -564,11 +561,11 @@
}, },
"search": { "search": {
"recent": "Recently added", "recent": "Recently added",
"result_count": "{{record_count}} results", "result_count": "{record_count} results",
"errors": { "errors": {
"start_typing": "Start typing the name of a {{object}}", "start_typing": "Start typing the name of a {object}",
"min_length": "Type at least 3 characters", "min_length": "Type at least 3 characters",
"no_results": "No results found for '{{query}}'", "no_results": "No results found for '{query}'",
"no_results_generic": "No results found", "no_results_generic": "No results found",
"end_results": "No more results", "end_results": "No more results",
"type": "Keep typing..." "type": "Keep typing..."
@ -633,6 +630,7 @@
"toasts": { "toasts": {
"copied": "This party's URL was copied to your clipboard", "copied": "This party's URL was copied to your clipboard",
"remixed": "You remixed <strong>{title}</strong>", "remixed": "You remixed <strong>{title}</strong>",
"remixed_alt": "You remixed {title}",
"update": { "update": {
"title": "New update", "title": "New update",
"description": { "description": {
@ -653,7 +651,7 @@
"highlight": "Highlight", "highlight": "Highlight",
"link": "Add a link", "link": "Add a link",
"youtube": "Add a Youtube video", "youtube": "Add a Youtube video",
"heading": "Heading {{level}}", "heading": "Heading {level}",
"bulletList": "Bullet list", "bulletList": "Bullet list",
"orderedList": "Numbered list" "orderedList": "Numbered list"
} }
@ -673,7 +671,7 @@
"equipped": "Equipped", "equipped": "Equipped",
"coming_soon": "Coming Soon", "coming_soon": "Coming Soon",
"new_party": "New party", "new_party": "New party",
"no_accessory": "No {{accessory}} equipped", "no_accessory": "No {accessory} equipped",
"no_title": "Untitled", "no_title": "Untitled",
"no_raid": "No raid", "no_raid": "No raid",
"no_user": "Anonymous", "no_user": "Anonymous",

View file

@ -14,8 +14,8 @@
"confirm_logout": "ログアウトしますか", "confirm_logout": "ログアウトしますか",
"incompatible_weapon": "Additional Weaponsに装備できない武器を入れました。", "incompatible_weapon": "Additional Weaponsに装備できない武器を入れました。",
"unsaved_changes": { "unsaved_changes": {
"party": "<strong>「{{objectName}}」</strong>という編成の変更は保存していません。<br/><br/>変更を保存せずに続けますか?", "party": "<strong>「{objectName}」</strong>という編成の変更は保存していません。<br/><br/>変更を保存せずに続けますか?",
"object": "<strong>「{{objectName}}」</strong>の変更は保存していません。<br/><br/>変更を保存せずに続けますか?", "object": "<strong>「{objectName}」</strong>の変更は保存していません。<br/><br/>変更を保存せずに続けますか?",
"buttons": { "buttons": {
"confirm": "変更せずに続ける", "confirm": "変更せずに続ける",
"cancel": "キャンセル" "cancel": "キャンセル"
@ -25,17 +25,17 @@
"ax": { "ax": {
"no_skill": "EXスキルなし", "no_skill": "EXスキルなし",
"errors": { "errors": {
"value_too_low": "{{name}}は最低{{minValue}}{{suffix}}を入力してください", "value_too_low": "{name}は最低{minValue}{suffix}を入力してください",
"value_too_high": "{{name}}は最大{{maxValue}}{{suffix}}を入力してください", "value_too_high": "{name}は最大{maxValue}{suffix}を入力してください",
"value_not_whole": "{{name}}は整数でなければなりません", "value_not_whole": "{name}は整数でなければなりません",
"value_empty": "{{name}}を入力してください" "value_empty": "{name}を入力してください"
} }
}, },
"awakening": { "awakening": {
"no_type": "覚醒タイプなし", "no_type": "覚醒タイプなし",
"errors": { "errors": {
"value_too_low": "覚醒レベルは最低{{minValue}}を入力してください", "value_too_low": "覚醒レベルは最低{minValue}を入力してください",
"value_too_high": "覚醒レベルは最大{{maxValue}}を入力してください", "value_too_high": "覚醒レベルは最大{maxValue}を入力してください",
"value_not_whole": "覚醒レベルは整数でなければなりません", "value_not_whole": "覚醒レベルは整数でなければなりません",
"value_empty": "覚醒レベルを入力してください" "value_empty": "覚醒レベルを入力してください"
} }
@ -77,10 +77,10 @@
}, },
"earring": { "earring": {
"errors": { "errors": {
"value_too_low": "{{name}}は最低{{minValue}}を入力してください", "value_too_low": "{name}は最低{minValue}を入力してください",
"value_too_high": "{{name}}は最大{{maxValue}}を入力してください", "value_too_high": "{name}は最大{maxValue}を入力してください",
"value_not_whole": "{{name}}は整数でなければなりません", "value_not_whole": "{name}は整数でなければなりません",
"value_empty": "{{name}}を入力してください" "value_empty": "{name}を入力してください"
} }
}, },
"elements": { "elements": {
@ -144,16 +144,15 @@
"empty": "この編成には説明がありません" "empty": "この編成には説明がありません"
}, },
"remixes": { "remixes": {
"label_zero": "リミックス", "label": "{count, plural, =0 {リミックス} other {リミックス: #個}}",
"label": "リミックス: {{count}}個",
"empty": "この編成はリミックスされていません" "empty": "この編成はリミックスされていません"
} }
}, },
"header": { "header": {
"anonymous": "無名", "anonymous": "無名",
"untitled_team": "{{username}}さんからの無題編成", "untitled_team": "{username}さんからの無題編成",
"new_team": "新編成", "new_team": "新編成",
"byline": "{{username}}さんからの{{partyName}}" "byline": "{username}さんからの{partyName}"
}, },
"job_skills": { "job_skills": {
"all": "全てのアビリティ", "all": "全てのアビリティ",
@ -202,7 +201,7 @@
"awakening": "覚醒" "awakening": "覚醒"
}, },
"messages": { "messages": {
"remove": "<strong>{{character}}</strong>を編成から削除しますか?" "remove": "<strong>{character}</strong>を編成から削除しますか?"
}, },
"buttons": { "buttons": {
"confirm": "キャラクターを変更する", "confirm": "キャラクターを変更する",
@ -212,7 +211,7 @@
"conflict": { "conflict": {
"character": "<strong>同じ名前のキャラクター</strong>がパーティに編成されています。<br />以下のキャラクターを入れ替えますか?", "character": "<strong>同じ名前のキャラクター</strong>がパーティに編成されています。<br />以下のキャラクターを入れ替えますか?",
"weapon": { "weapon": {
"generic": "<strong>{{series}}</strong>の武器に装備制限があり、武器が既に装備されています。<br /><br />以下の武器を入れ替えますか?", "generic": "<strong>{series}</strong>の武器に装備制限があり、武器が既に装備されています。<br /><br />以下の武器を入れ替えますか?",
"opus-draconic": "<strong>終末の神器シリーズ</strong>と<strong>ドラコニックシリーズ</strong>から1本しか装備できない制限があり、武器が既に装備されています。<br /><br />以下の武器を入れ替えますか?" "opus-draconic": "<strong>終末の神器シリーズ</strong>と<strong>ドラコニックシリーズ</strong>から1本しか装備できない制限があり、武器が既に装備されています。<br /><br />以下の武器を入れ替えますか?"
}, },
"buttons": { "buttons": {
@ -315,7 +314,7 @@
}, },
"job_skills": { "job_skills": {
"messages": { "messages": {
"remove": "<strong>{{job_skill}}</strong>を編成から削除しますか?" "remove": "<strong>{job_skill}</strong>を編成から削除しますか?"
}, },
"buttons": { "buttons": {
"remove": "ジョブスキルを削除する" "remove": "ジョブスキルを削除する"
@ -340,8 +339,8 @@
"remix_team": { "remix_team": {
"title": "編成をリミックス", "title": "編成をリミックス",
"description": { "description": {
"creator": "既に<strong>{{name}}</strong>の作家のため, 本当にリミックスでコピーを作成しますか?", "creator": "既に<strong>{name}</strong>の作家のため, 本当にリミックスでコピーを作成しますか?",
"viewer": "編成をリミックスすると変更をするために自アカウントにコピーを作成します。<strong>{{name}}</strong>をリミックスをしますか?" "viewer": "編成をリミックスすると変更をするために自アカウントにコピーを作成します。<strong>{name}</strong>をリミックスをしますか?"
}, },
"buttons": { "buttons": {
"confirm": "リミックス", "confirm": "リミックス",
@ -387,7 +386,7 @@
}, },
"agreement": "続行することで<1>利用規約</1>に同意し、<br/><1>プライバシーポリシー</1>を読んだものとみなされます。", "agreement": "続行することで<1>利用規約</1>に同意し、<br/><1>プライバシーポリシー</1>を読んだものとみなされます。",
"errors": { "errors": {
"field_in_use": "入力された{{field}}は既に登録済みです", "field_in_use": "入力された{field}は既に登録済みです",
"empty_email": "メールアドレスを入力して下さい", "empty_email": "メールアドレスを入力して下さい",
"invalid_email": "メールアドレスは有効ではありません", "invalid_email": "メールアドレスは有効ではありません",
"username_too_short": "ユーザーネームは3文字以上で入力してください", "username_too_short": "ユーザーネームは3文字以上で入力してください",
@ -458,8 +457,8 @@
"roadmap": "ロードマップ / granblue.team", "roadmap": "ロードマップ / granblue.team",
"discover": "編成を見出す / granblue.team", "discover": "編成を見出す / granblue.team",
"new": "新しい編成 / granblue.team", "new": "新しい編成 / granblue.team",
"profile": "@{{username}}さんの作った編成 / granblue.team", "profile": "@{username}さんの作った編成 / granblue.team",
"team": "{{emoji}} {{teamName}}、{{username}}さんから / granblue.team", "team": "{emoji} {teamName}、{username}さんから / granblue.team",
"saved": "保存した編成" "saved": "保存した編成"
}, },
"descriptions": { "descriptions": {
@ -468,8 +467,8 @@
"roadmap": "granblue.teamの開発予定機能", "roadmap": "granblue.teamの開発予定機能",
"discover": "グランブルーファンタジーの編成をマルチ、属性、作った時間などで探したり保存したりできる", "discover": "グランブルーファンタジーの編成をマルチ、属性、作った時間などで探したり保存したりできる",
"new": "グランブルーファンタジーの編成を作成し、騎空士とシェアできるサイトgranblue.team", "new": "グランブルーファンタジーの編成を作成し、騎空士とシェアできるサイトgranblue.team",
"profile": "@{{username}}の編成を調査し、マルチ、属性、または作った時間でフィルターする", "profile": "@{username}の編成を調査し、マルチ、属性、または作った時間でフィルターする",
"team": "granblue.teamで{{username}}さんが作った{{raidName}}の編成を調査できる" "team": "granblue.teamで{username}さんが作った{raidName}の編成を調査できる"
} }
}, },
"party": { "party": {
@ -497,8 +496,7 @@
}, },
"turns": { "turns": {
"with_count_one": "{{count}}ターン", "with_count": "{count, plural, other {#ターン}}"
"with_count_other": "{{count}}ターン"
} }
}, },
"notices": { "notices": {
@ -556,11 +554,11 @@
}, },
"search": { "search": {
"recent": "最近追加した", "recent": "最近追加した",
"result_count": "{{record_count}}件", "result_count": "{record_count}件",
"errors": { "errors": {
"start_typing": "{{object}}名を入力してください", "start_typing": "{object}名を入力してください",
"min_length": "3文字以上を入力してください", "min_length": "3文字以上を入力してください",
"no_results": "'{{query}}'の検索結果が見つかりませんでした", "no_results": "'{query}'の検索結果が見つかりませんでした",
"no_results_generic": "検索結果が見つかりませんでした", "no_results_generic": "検索結果が見つかりませんでした",
"end_results": "検索結果これ以上ありません", "end_results": "検索結果これ以上ありません",
"type": "もっと入力してください" "type": "もっと入力してください"
@ -624,7 +622,8 @@
}, },
"toasts": { "toasts": {
"copied": "この編成のURLはクリップボードにコピーされました", "copied": "この編成のURLはクリップボードにコピーされました",
"remixed": "{{title}}をリミックスしました", "remixed": "<strong>{title}</strong>をリミックスしました",
"remixed_alt": "{title}をリミックスしました",
"update": { "update": {
"title": "新アプデ", "title": "新アプデ",
"description": { "description": {
@ -645,7 +644,7 @@
"highlight": "ハイライト", "highlight": "ハイライト",
"link": "リンクを挿入", "link": "リンクを挿入",
"youtube": "Youtube動画を埋め込む", "youtube": "Youtube動画を埋め込む",
"heading": "見出し {{level}}", "heading": "見出し {level}",
"bulletList": "箇条書き", "bulletList": "箇条書き",
"orderedList": "番号リスト" "orderedList": "番号リスト"
} }
@ -665,7 +664,7 @@
"sephira_guidebooks": "セフィラ導本", "sephira_guidebooks": "セフィラ導本",
"coming_soon": "開発中", "coming_soon": "開発中",
"new_party": "新しい編成", "new_party": "新しい編成",
"no_accessory": "{{accessory}}は装備していません", "no_accessory": "{accessory}は装備していません",
"no_title": "無題", "no_title": "無題",
"no_raid": "マルチなし", "no_raid": "マルチなし",
"no_user": "無名", "no_user": "無名",