You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Godot本地化翻译:如何处理其他语言的超长字符串?

Godot本地化文本适配与常见问题解决

核心问题:固定容器下的动态字体适配

在Godot中使用TranslationServer完成本地化后,部分语言的字符串长度远超过其他语言。当容器大小固定且换行无法解决溢出问题时,可通过动态调整字体大小适配,以下是高效实现方案:

无需节点副本的字体调整逻辑

不需要创建不可见节点副本,直接利用Godot内置的文本尺寸计算API即可实现:

  1. 确保目标文本节点(Label、Button等)的clip_text设为false,根据需求设置autowrap_mode(如不允许换行则设为AUTOWRAP_OFF)。
  2. 切换语言后遍历节点树执行适配逻辑:
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)

常见疑问解答

  1. 伪本地化与多语言长度检查
    伪本地化默认不会自动取最长字符串,但可通过脚本批量处理:遍历TranslationServer的所有可用语言,统计每个翻译键对应的字符串长度,将最长条目替换到伪本地化文件中。也可以提前导出所有语言的翻译文本,用表格对比长度,优先适配最长字符串的容器尺寸。

  2. 仅针对特定语言调整字体
    完全可行。在适配逻辑中加入语言判断即可:

    # 预设不同语言的字号映射
    var lang_font_map = {"de":16, "en":20, "fr":19}
    if lang_font_map.has(lang):
        node.font_size = lang_font_map[lang]
    else:
        # 执行动态适配逻辑
    
  3. 检测文本是否超出容器
    直接通过字体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的状态。

  4. 获取用户实际看到的文本

    • 未裁剪的翻译文本:用tr(node.text)获取当前语言的翻译结果,即用户看到的内容(node.text是翻译键)。
    • 已裁剪的文本:使用node.get_visible_text()(Godot 3.5及以上版本支持)获取实际显示的内容。
  5. 伪本地化的Unicode解析错误
    错误源于伪本地化生成的字符串包含NUL字符(\0),解决方法:在项目设置中找到Localization > Pseudo Localization,关闭Add Null Characters选项,即可避免该问题。

内容的提问来源于stack exchange,提问作者Zorann

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 12:16:25