【Unity-本地化】简单的游戏本地化处理方案

0 前言

这套本地化处理方案是基于Excel实现的,可以先扒一下我之前这篇文章的代码:Unity-Excel数据处理,这里会用到。

另外,这篇文章主要讲了纯文本的本地化方案,对于有内嵌字的图片,在最后会简单说一下处理方式。

1 多语言配置

通常情况下,项目内的文本会分散在各个表格之中,比如道具描述、技能说明等。但文本太过分散,会增加翻译难度,还可能会产生遗漏。所以我采取的方案是将多语言文本全部配置在同一张表格中,而其他表格则记录多语言文本的ID。

像这样:

Player.xlsx

在这里插入图片描述

LanguageLocalization.xlsx

在这里插入图片描述

像Player里的基础技能描述一般是便于制表人看,程序读取文本时用的是后面配置的本地化ID。

2 本地化实现

在开始之前先对LanguageLocalization.xlsx使用前言提到的excel数据处理方案,得到对应的CSharp和JsonData文件。

2.1 读取多语言文本的通用方法

这个通用方法应该是传入一个参数,然后根据当前语言环境返回对应的文本。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class LanguageTool
{
   
    public static SystemLanguage? defaultLanguage = SystemLanguage.Chinese;
    private static Dictionary<int, LanguageLocalization> languageDict;

    public static string GetLanguage(int id) {
   
        if (languageDict == null) {
   
            languageDict = LanguageLocalization.LoadJson();
        }

        //默认语言>系统语言
        if (defaultLanguage != null) {
   
            return GetLanguage(id, defaultLanguage.Value);
        }
        else {
   
            return GetLanguage(id, Application.systemLanguage);
        }
    }

    private static string GetLanguage(int id,SystemLanguage curLanguage) {
   
        switch (curLanguage) {
   
            case SystemLanguage.Chinese:
                //Excel里的换行符可能是\r\n的形式
                return languageDict[id].Text_Cn.Replace("\r\n", "\n");
            default:
                return languageDict[id].Text_En.Replace("\r\n", "\n");
        }
    }
}

2.2 动态文本本地化

动态文本指的是
1.像多语言配置中提到的Player的例子,技能描述、道具描述等。
2.像“失去2个道具”这样数字不确定的文本。

对于1直接根据表格内配置的Id读取多语言文本。
对于2需要先在多语言表格里自己配置一项,如失去{0}个道具,然后在代码里通过这样的形式获取文本:

tipText.text = string.Format(LanguageTool.GetLanguage(Id),num);

2.3 静态文本本地化

静态文本指的是写死在项目里,如Prefab上的文本。这种文本我写了一个组件挂在Text下,该组件会在Awake时将Text替换为对应语言环境的文本。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

[RequireComponent(typeof(Text))]
public class LanguageText : MonoBehaviour
{
   
    public int LanguageId = -1;

    private void Awake() {
   
        if (LanguageId == -1) {
   
            return;
        }
        var text = transform.GetComponent<Text>();
        text.text = LanguageTool.GetLanguage(LanguageId);
    }
}

3 方案扩展

除了以上必要的功能实现外,我们发现其实还可以从便利性出发去扩展当前这套方案。

3.1 LanguageText扩展

对于LanguageText组件,我们会希望有这些功能去辅助我们开发:

1.Inspector下展示所填写ID在Excel里对应的中英文,这样我们可以确定当前填写的ID正确。

2.当我们添加Prefab上的文本时,我们需要填写对应的多语言ID,如果去Excel里查找和编辑就有点麻烦,所以我们希望有一个方法可以实现:
1)如果Excel表里已经有这个文本了,那么自动填充对应ID。
2)如果Excel表里没有对应文本,那么在Excel里新增一行,然后填充对应ID。

3.修改Prefab上的文本时,我们希望有一个方法可以同步修改Excel里的文本。

表格:
在这里插入图片描述

3.1.1 展示Excel里对应ID的文本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using UnityEngine.UI;

[CustomEditor(typeof(LanguageText))]
public class LanguageTextEx : Editor
{
   
    private Dictionary<int, LanguageLocalization> languageDict;
    private LanguageText languageText;
    private Text textComponent;

    public override void OnInspectorGUI() {
   
        base.OnInspectorGUI();
        if (languageDict == null) {
   
            languageDict = LanguageLocalization.LoadJson();
        }

        if (textComponent == null) {
   
            languageText = target as LanguageText;
            textComponent = languageText.transform.GetComponent<Text>();
        }
		
		if (languageText.LanguageId <= -1 || !languageDict.ContainsKey(languageText.LanguageId)) 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值