Minecraft Fabric 1.18.2开发:如何在LiteralText中嵌入TranslatableText
Minecraft Fabric 1.18.2 聊天栏多语言消息实现
完全支持翻译文本和动态内容混合使用,不需要硬编码整段固定内容。Minecraft的文本组件本身是可嵌套、可拼接的结构,不管是TranslatableText还是LiteralText都支持自由组合,不存在只能全用翻译文本或者全用硬编码文本的限制。
你之前手动把所有内容转字符串拼接成LiteralText的写法反而有问题:提前调用getString()会把原本的翻译文本组件转成普通字符串,既会丢失方块名的多语言适配能力(比如玩家客户端是其他语言时,方块名会固定成服务端当前语言的文本),也会丢失文本自带的悬停提示、样式等原生属性。
推荐实现方式
用TranslatableText自带的占位符参数能力嵌入动态内容,不需要手动拼接字符串:
- 首先在模组资源目录的语言文件中定义翻译键,比如
assets/[你的模组ID]/lang/zh_cn.json中添加:
{ "message.mymod.found_ore": "发现 %s 位于坐标 (%d, %d, %d)" }
对应英文语言文件en_us.json中添加:
{ "message.mymod.found_ore": "Found %s at (%d, %d, %d)" }
- 修改消息发送逻辑,直接把动态内容作为参数传入
TranslatableText:
private void outputValuableCoordinates(BlockPos blockPos, PlayerEntity player, Block blockBelow) { player.sendMessage( new TranslatableText( "message.mymod.found_ore", blockBelow.getName(), // 直接传入方块的文本组件,不需要转字符串 blockPos.getX(), blockPos.getY(), blockPos.getZ() ), false ); }
自定义分段拼接方式
如果你需要给不同片段加单独样式、点击交互,也可以用append()方法自由拼接不同类型的文本组件,翻译文本、纯文本、带样式的特殊文本可以混着拼,聊天栏会按顺序正常渲染:
// 示例:给方块名加金色样式,坐标加灰色样式 player.sendMessage( new TranslatableText("message.mymod.found_prefix") .append(blockBelow.getName().formatted(Formatting.GOLD)) .append(new TranslatableText("message.mymod.at_position")) .append(new LiteralText(String.format("(%d, %d, %d)", blockPos.getX(), blockPos.getY(), blockPos.getZ() )).formatted(Formatting.GRAY)), false );
内容的提问来源于stack exchange,提问作者BlueLP
相关产品推荐
相关产品推荐

