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

如何用Unity Localization翻译脚本中带数值的TextMeshPro文本?

Unity TextMeshPro 动态数值文本本地化实现方案

针对你脚本中带动态数值的文本(如「Coins」「DEATH COUNT」拼接数值),核心思路是将静态文本部分存入本地化表,通过占位符标记变量位置,再在脚本中结合动态数值格式化字符串,以下是具体实现步骤:

1. 配置本地化字符串表

不管你使用Unity官方的Localization Package还是第三方本地化工具,先添加两个本地化键值对:

  • 键:SaveSlot_Coins,对应多语言值示例:
    • 英文:"Coins: {0}"
    • 中文:"金币: {0}"
  • 键:SaveSlot_DeathCount,对应多语言值示例:
    • 英文:"DEATH COUNT: {0}"
    • 中文:"死亡次数: {0}"

注:{0}是占位符,用来后续插入动态数值

2. 修改SaveSlot脚本

替换原脚本中直接拼接文本的代码,根据你使用的本地化工具选择对应实现:

方案一:使用Unity官方Localization Package

确保已导入Unity Localization Package,然后修改SetData方法中的文本赋值部分:

// 替换原来的CoinText和deathCountText赋值代码
CoinText.text = LocalizationSettings.StringDatabase.GetLocalizedString("你的字符串表名称", "SaveSlot_Coins", data.coin);
deathCountText.text = LocalizationSettings.StringDatabase.GetLocalizedString("你的字符串表名称", "SaveSlot_DeathCount", data.deathCount);

提示:"你的字符串表名称"替换为你在本地化系统中创建的字符串表名称

方案二:通用兼容(适配第三方本地化工具)

如果使用I2 Localization等第三方工具,或自己实现的本地化逻辑,可通过string.Format完成拼接:

// 先获取本地化静态文本,再格式化插入数值
string coinsLocalized = 你的本地化工具.GetTranslation("SaveSlot_Coins");
CoinText.text = string.Format(coinsLocalized, data.coin);

string deathCountLocalized = 你的本地化工具.GetTranslation("SaveSlot_DeathCount");
deathCountText.text = string.Format(deathCountLocalized, data.deathCount);

修改后的完整SaveSlot脚本(以官方Localization Package为例)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;
using UnityEngine.UI;
using UnityEngine.Localization;
using UnityEngine.Localization.Settings; // 引入本地化命名空间

public class SaveSlot : MonoBehaviour
{
    [Header("Profile")]
    [SerializeField] private string profileId = "";

    [Header("Content")]
    [SerializeField] private GameObject noDataContent;
    [SerializeField] private GameObject hasDataContent;
    [SerializeField] private TextMeshProUGUI CoinText;
    [SerializeField] private TextMeshProUGUI deathCountText;

    [Header("Clear Data Button")]
    [SerializeField] private Button clearButton;

    public bool hasData { get; private set; } = false;

    private Button saveSlotButton;

    private void Awake()
    {
        saveSlotButton = this.GetComponent<Button>();
    }

    public void SetData(GameData data)
    {
        if (data == null)
        {
            hasData = false;
            noDataContent.SetActive(true);
            hasDataContent.SetActive(false);
            clearButton.gameObject.SetActive(false);
        }
        else
        {
            hasData = true;
            noDataContent.SetActive(false);
            hasDataContent.SetActive(true);
            clearButton.gameObject.SetActive(true);
        
            // 本地化赋值代码
            CoinText.text = LocalizationSettings.StringDatabase.GetLocalizedString("SaveSlotTable", "SaveSlot_Coins", data.coin);
            deathCountText.text = LocalizationSettings.StringDatabase.GetLocalizedString("SaveSlotTable", "SaveSlot_DeathCount", data.deathCount);
        }
    }

    public string GetProfileId()
    {
        return this.profileId;
    }

    public void SetInteractable(bool interactable)
    {
        saveSlotButton.interactable = interactable;
        clearButton.interactable = interactable;
    }
}

关键说明

  • 占位符支持多个变量:如果需要插入多个数值,可使用{0}``{1}等依次标记,格式化时传入对应参数即可
  • 数值格式化:如果需要对数值做格式处理(如保留小数、千分位),可在占位符中指定格式,比如"金币: {0:N0}"表示整数格式,本地化后再格式化即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 04:05:24