refactor: restructure i18n keys for account linking system

- Merge player_join and code_generated messages into unified linking.message.not_linked_1/2/3
- Hardcode command strings (/dmcc unlink, /link code: {}, /dmcc link) in Java code
- Remove redundant "your code is: CODE" line from /dmcc link response
- Rename _suffix/_tail/_prefix naming to _1/_2/_3 pattern
- Move tooltip keys to linking.tooltip.click_to_copy/click_to_run
- Fix zh_cn: consumed phrasing, refresh wording, add "Minecraft" prefix to player references
- Remove dead buildCodeGeneratedMessage() method, unify into buildNotLinkedMessage()

Co-authored-by: Xujiayao <58985541+Xujiayao@users.noreply.github.com>
This commit is contained in:
copilot-swe-agent[bot] 2026-03-11 11:37:46 +00:00 committed by Jason Xu
parent f99f82fbff
commit 71f38e953f
3 changed files with 33 additions and 67 deletions

View file

@ -131,15 +131,6 @@ commands:
player_only: "This command can only be used by a Minecraft player."
discord_only: "This command can only be used from Discord."
not_available: "This command is not available in the current mode."
already_linked: "Your Minecraft account is already linked to Discord user \"{}\". Run "
already_linked_unlink: "/dmcc unlink"
already_linked_suffix: " to unlink."
code_generated_prefix: "Your verification code is: "
code_generated_suffix: ". Use "
code_generated_discord_cmd: "/link code: {}"
code_generated_tail: " on Discord to complete linking. The code expires in 5 minutes. If expired, run "
code_generated_refresh_cmd: "/dmcc link"
code_generated_refresh_tail: " in-game to get a new code."
invalid_code: "Invalid or expired verification code."
success: "Successfully linked to Minecraft player \"{}\"!"
uuid_already_linked: "This Minecraft account is already linked to another Discord user."
@ -274,15 +265,16 @@ linking:
unlinked_minecraft: "Unlinked Minecraft player {} ({}) from Discord user {} ({})!"
uuid_already_linked: "Minecraft player {} ({}) is already linked to Discord user {} ({})."
verification:
generated: "Generated verification code for player {}: {}!"
refreshed: "Refreshed verification code for player {}: {}!"
consumed: "Verification code consumed by player {}: {}!"
player_join:
not_linked_prefix: "Your Minecraft account is not linked to Discord. Use "
not_linked_discord_cmd: "/link code: {}"
not_linked_middle: " on Discord to complete linking. The code expires in 5 minutes. If expired, run "
not_linked_refresh_cmd: "/dmcc link"
not_linked_refresh_tail: " in-game to get a new code."
generated: "Generated verification code for Minecraft player {}: {}!"
refreshed: "Refreshed verification code validity for Minecraft player {}: {}!"
consumed: "Minecraft player {} completed linking with verification code {}!"
message:
not_linked_1: "Your Minecraft account is not linked to a Discord user. Use "
not_linked_2: " on Discord to complete linking. The code expires in 5 minutes. Run "
not_linked_3: " in-game to refresh the code validity."
already_linked_1: "Your Minecraft account is already linked to Discord user \"{}\". Run "
already_linked_2: " to unlink."
tooltip:
click_to_copy: "Click to copy"
click_to_run: "Click to fill command"

View file

@ -131,15 +131,6 @@ commands:
player_only: "此命令只能由 Minecraft 玩家使用。"
discord_only: "此命令只能在 Discord 上使用。"
not_available: "此命令在当前模式下不可用。"
already_linked: "你的 Minecraft 账户已绑定到 Discord 用户 \"{}\"。执行 "
already_linked_unlink: "/dmcc unlink"
already_linked_suffix: " 解除绑定。"
code_generated_prefix: "你的验证码是:"
code_generated_suffix: "。在 Discord 上使用 "
code_generated_discord_cmd: "/link code: {}"
code_generated_tail: " 命令来完成绑定。验证码将在 5 分钟后过期。若过期可在游戏内执行 "
code_generated_refresh_cmd: "/dmcc link"
code_generated_refresh_tail: " 获取新验证码。"
invalid_code: "无效或已过期的验证码。"
success: "成功绑定 Minecraft 玩家 \"{}\""
uuid_already_linked: "此 Minecraft 账户已绑定到另一个 Discord 用户。"
@ -274,15 +265,16 @@ linking:
unlinked_minecraft: "已解除 Minecraft 玩家 {} ({}) 与 Discord 用户 {} ({}) 的绑定!"
uuid_already_linked: "Minecraft 玩家 {} ({}) 已绑定到 Discord 用户 {} ({})。"
verification:
generated: "已为玩家 {} 生成验证码 {}"
refreshed: "已为玩家 {} 刷新验证码 {}"
consumed: "验证码已被玩家 {} 使用:{}"
player_join:
not_linked_prefix: "你的 Minecraft 账户尚未与 Discord 用户绑定。在 Discord 上使用 "
not_linked_discord_cmd: "/link code: {}"
not_linked_middle: " 命令来完成绑定。验证码将在 5 分钟后过期。若过期可在游戏内执行 "
not_linked_refresh_cmd: "/dmcc link"
not_linked_refresh_tail: " 获取新验证码。"
generated: "已为 Minecraft 玩家 {} 生成验证码 {}"
refreshed: "已刷新 Minecraft 玩家 {} 的验证码 {} 有效期!"
consumed: "Minecraft 玩家 {} 使用验证码 {} 完成绑定!"
message:
not_linked_1: "你的 Minecraft 账户尚未与 Discord 用户绑定。在 Discord 上使用 "
not_linked_2: " 完成绑定。验证码将在 5 分钟后过期,届时可执行 "
not_linked_3: " 刷新验证码有效期。"
already_linked_1: "你的 Minecraft 账户已绑定到 Discord 用户 \"{}\"。执行 "
already_linked_2: " 解除绑定。"
tooltip:
click_to_copy: "点击复制"
click_to_run: "点击填入命令"

View file

@ -347,7 +347,7 @@ public class MinecraftEventHandler {
if (event.alreadyLinked()) {
player.sendSystemMessage(buildAlreadyLinkedMessage(event.discordName()));
} else if (event.code() != null) {
player.sendSystemMessage(buildCodeGeneratedMessage(event.code()));
player.sendSystemMessage(buildNotLinkedMessage(event.code()));
}
}
} catch (Exception ignored) {
@ -547,7 +547,8 @@ public class MinecraftEventHandler {
}
/**
* Builds a rich Component for the "not linked" player join notification.
* Builds a rich Component for the "not linked" notification shown on both player join
* and /dmcc link when the account is not linked.
* Contains inline clickable elements: [/link code: CODE] for copy-to-clipboard
* and [/dmcc link] for suggest-command.
*
@ -556,30 +557,11 @@ public class MinecraftEventHandler {
*/
private static Component buildNotLinkedMessage(String code) {
return Component.empty()
.append(Component.literal(I18nManager.getDmccTranslation("linking.player_join.not_linked_prefix")))
.append(buildCopyToClipboard(I18nManager.getDmccTranslation("linking.player_join.not_linked_discord_cmd", code)))
.append(Component.literal(I18nManager.getDmccTranslation("linking.player_join.not_linked_middle")))
.append(buildSuggestCommand("/dmcc link", I18nManager.getDmccTranslation("linking.player_join.not_linked_refresh_cmd")))
.append(Component.literal(I18nManager.getDmccTranslation("linking.player_join.not_linked_refresh_tail")));
}
/**
* Builds a rich Component for the "code generated" response from /dmcc link.
* Contains inline clickable elements: [/link code: CODE] for copy-to-clipboard
* and [/dmcc link] for suggest-command.
*
* @param code The verification code.
* @return A rich Component with inline clickable elements.
*/
private static Component buildCodeGeneratedMessage(String code) {
return Component.empty()
.append(Component.literal(I18nManager.getDmccTranslation("commands.link.code_generated_prefix")))
.append(buildCopyToClipboard(code))
.append(Component.literal(I18nManager.getDmccTranslation("commands.link.code_generated_suffix")))
.append(buildCopyToClipboard(I18nManager.getDmccTranslation("commands.link.code_generated_discord_cmd", code)))
.append(Component.literal(I18nManager.getDmccTranslation("commands.link.code_generated_tail")))
.append(buildSuggestCommand("/dmcc link", I18nManager.getDmccTranslation("commands.link.code_generated_refresh_cmd")))
.append(Component.literal(I18nManager.getDmccTranslation("commands.link.code_generated_refresh_tail")));
.append(Component.literal(I18nManager.getDmccTranslation("linking.message.not_linked_1")))
.append(buildCopyToClipboard("/link code: " + code))
.append(Component.literal(I18nManager.getDmccTranslation("linking.message.not_linked_2")))
.append(buildSuggestCommand("/dmcc link", "/dmcc link"))
.append(Component.literal(I18nManager.getDmccTranslation("linking.message.not_linked_3")));
}
/**
@ -591,9 +573,9 @@ public class MinecraftEventHandler {
*/
private static Component buildAlreadyLinkedMessage(String discordName) {
return Component.empty()
.append(Component.literal(I18nManager.getDmccTranslation("commands.link.already_linked", discordName)))
.append(buildSuggestCommand("/dmcc unlink", I18nManager.getDmccTranslation("commands.link.already_linked_unlink")))
.append(Component.literal(I18nManager.getDmccTranslation("commands.link.already_linked_suffix")));
.append(Component.literal(I18nManager.getDmccTranslation("linking.message.already_linked_1", discordName)))
.append(buildSuggestCommand("/dmcc unlink", "/dmcc unlink"))
.append(Component.literal(I18nManager.getDmccTranslation("linking.message.already_linked_2")));
}
/**
@ -607,7 +589,7 @@ public class MinecraftEventHandler {
return Component.literal("[" + text + "]").withStyle(style -> style
.withClickEvent(new ClickEvent.CopyToClipboard(text))
.withHoverEvent(new HoverEvent.ShowText(
Component.literal(I18nManager.getDmccTranslation("linking.player_join.click_to_copy"))))
Component.literal(I18nManager.getDmccTranslation("linking.tooltip.click_to_copy"))))
.withColor(ChatFormatting.GREEN));
}
@ -623,7 +605,7 @@ public class MinecraftEventHandler {
return Component.literal("[" + displayText + "]").withStyle(style -> style
.withClickEvent(new ClickEvent.SuggestCommand(command))
.withHoverEvent(new HoverEvent.ShowText(
Component.literal(I18nManager.getDmccTranslation("linking.player_join.click_to_run"))))
Component.literal(I18nManager.getDmccTranslation("linking.tooltip.click_to_run"))))
.withColor(ChatFormatting.GREEN));
}