Godot本地化翻译:如何处理其他语言的超长字符串?
Godot本地化文本适配与常见问题解决
核心问题:固定容器下的动态字体适配
在Godot中使用TranslationServer完成本地化后,部分语言的字符串长度远超过其他语言。当容器大小固定且换行无法解决溢出问题时,可通过动态调整字体大小适配,以下是高效实现方案:
无需节点副本的字体调整逻辑
不需要创建不可见节点副本,直接利用Godot内置的文本尺寸计算API即可实现:
- 确保目标文本节点(Label、Button等)的
clip_text设为false,根据需求设置autowrap_mode(如不允许换行则设为AUTOWRAP_OFF)。 - 切换语言后遍历节点树执行适配逻辑:
TranslationServer.set_locale(lang) # 递归遍历节点并调整字体大小 func adjust_font_size_for_node(node: Node): # 判断节点是否为可显示文本的控件 if node.has_method("get_text") and node.has_method("get_font"): var container_size = node.rect_size var original_size = node.font_size var min_font_size = 8 # 设置字号下限,避免过小 # 二分法快速找到最大适配字号(比逐次递减更高效) var low = min_font_size var high = original_size var best_size = original_size while low <= high: var mid = (low + high) // 2 node.font_size = mid var text_size = node.get_font("font").get_string_size(node.get_text()) # 根据是否允许换行,选择对比宽度或高度 if node.autowrap_mode == Control.AUTOWRAP_OFF: if text_size.x <= container_size.x: best_size = mid low = mid + 1 else: high = mid - 1 else: if text_size.y <= container_size.y: best_size = mid low = mid + 1 else: high = mid - 1 node.font_size = best_size # 递归处理子节点 for child in node.get_children(): adjust_font_size_for_node(child) # 调用方式:从根节点开始遍历 adjust_font_size_for_node(get_tree().root)
常见疑问解答
伪本地化与多语言长度检查
伪本地化默认不会自动取最长字符串,但可通过脚本批量处理:遍历TranslationServer的所有可用语言,统计每个翻译键对应的字符串长度,将最长条目替换到伪本地化文件中。也可以提前导出所有语言的翻译文本,用表格对比长度,优先适配最长字符串的容器尺寸。仅针对特定语言调整字体
完全可行。在适配逻辑中加入语言判断即可:# 预设不同语言的字号映射 var lang_font_map = {"de":16, "en":20, "fr":19} if lang_font_map.has(lang): node.font_size = lang_font_map[lang] else: # 执行动态适配逻辑检测文本是否超出容器
直接通过字体API计算文本实际尺寸,与容器尺寸对比:var text_size = node.get_font("font").get_string_size(node.get_text()) var is_overflown = text_size.x > node.rect_size.x # 不换行场景 # 自动换行场景对比高度:text_size.y > node.rect_size.y无需依赖
text_overrun_behaviour的状态。获取用户实际看到的文本
- 未裁剪的翻译文本:用
tr(node.text)获取当前语言的翻译结果,即用户看到的内容(node.text是翻译键)。 - 已裁剪的文本:使用
node.get_visible_text()(Godot 3.5及以上版本支持)获取实际显示的内容。
- 未裁剪的翻译文本:用
伪本地化的Unicode解析错误
错误源于伪本地化生成的字符串包含NUL字符(\0),解决方法:在项目设置中找到Localization > Pseudo Localization,关闭Add Null Characters选项,即可避免该问题。
内容的提问来源于stack exchange,提问作者Zorann
相关产品推荐
相关产品推荐

