Unity 本地化比较实用的实现方案

本文介绍了一种基于I2Localization插件的游戏本地化解决方案,详细阐述了图片和文字两种资源的本地化方法,包括静态和动态资源的处理流程,并提供了解析脚本示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本篇笔记是在I2Localization插件的基础上针对项目需求,制定的一套本地化技术解决方案,目的是实现一个语言配置文件统一来管理整个游戏的语言本地化,个人认为是非常实用的,有兴趣的同学可以简单看下这个方案的解决思路。


游戏中的本地化考虑两种资源形式:

一、图片本地化

二、文字本地化


图片本地化

图片本地化分为两种情况:
1、用Unity编辑器制作的静态界面图片本地化,如图


这个UI图片不需要程序动态加载,属于静态UI,我们借助本地化工具I2 Localization插件,即可实现这个UI的本地化,使用方法下面再说。

2、代码控制的动态添加的图片资源本地化,如图


这种UI变化涉及到的逻辑比较复杂,我们可能想要程序动态创建和更换这些UI的显示,本地化插件不够灵活,这时候我们把资源放入相应的语言路径下,动态加载即可(动态的资源放入Resoucres)

动态加载方法:

 iconImg.sprite = Resources.Load(string.Format("UI/XXUI/{0}/{1}",GameTools.getInstance().getCurrentLanguageDict(),"Button"),typeof(Sprite)) as Sprite;

文字本地化

文字本地化也分为两种情况:
1、用Unity编辑器制作的静态文字界面本地化,如图


这种系统文字也使用本地化插件I2 Localization制作也很方便。

2、代码控制添加的系统文字,如图


在Resouces/Doc目录下编辑如下格式txt文件

 #根据";"来截取字符串,所以本地语言文字中不要存在“;”作为值,各个字段之间不能存在空格和换行
    Key;Type;Desc;english [bs];Chinese (Simplified);Chinese (Traditional)
    reveive;Text;;;领取;

写一个解析脚本,这样可以根据key值读取不同语言的文字,至于为什么是这种格式,下面介绍I2Localization插件的时候再介绍

解析脚本

public class _LocalizationManager : _Instance<_LocalizationManager> {
    //存储语言字典
    private Dictionary<string,string> __languageDict;

    //ctor
    public _LocalizationManager(){
        __languageDict = new Dictionary<string,string>();
        //根据系统语言读取文本
        if(Application.isEditor) {
            //设置默认语言为中文
            GlobalConfig.LANGUAGE = "1";
        }
        LoadLanguageDictByTxt();
    }

    /// <summary>
    /// 通过txt文件加载游戏文字语言,路径 地址:Resources/Doc/doc.txt
    /// </summary>
    private void LoadLanguageDictByTxt(){
        if(__languageDict.Count > 0){
            __languageDict.Clear ();
        }
        //根据语言,将text格式的行录入语言字典中
        string p = "Doc/doc";
        TextAsset asseet = Resources.Load<TextAsset>(p);
        string l = asseet.ToString();

        //解析字符串
        string[] firstSplit = l.Split('\n');
        for(int i = 0; i< firstSplit.Length; i++){
            if(!string.IsNullOrEmpty(firstSplit[i])){
                string[] secondSplit = firstSplit[i].Split(';');
                if("Text" == secondSplit[1]){
                    string value = secondSplit[int.Parse(GlobalConfig.LANGUAGE) + 2];
                    if(string.IsNullOrEmpty(value)){
                        //如果当前语言没有设置,默认读取中文
                        value = secondSplit[4];
                    }
                    __languageDict.Add(secondSplit[0],value);
                } else
                    continue;
            }
        }
    }

    /// <summary>
    /// 根据key值,读取文字
    /// </summary>
    /// <returns>The dic string.</returns>
    /// <param name="varKey">Variable key.</param>
    public string getDicStr(string varKey){
        if(string.IsNullOrEmpty(varKey))
            return null;
        string text;
        if(__languageDict.TryGetValue(varKey,out text)){
            return text;
        }
        return null;
    }
}

获取字符串直接调用接口即可: _LocalizationManager.getInstance().getDicStr("xxx");

Edit


I2Localization插件使用说明

1、导入I2Localization插件到Unity工程中。

2、关键看这个I2Languages组件(这个预设体是全局的哦,如果不想要全局,拖拽到场景中也可以,但是暂不推荐这样做,后面的封装需要全局),添加默认语言,注意下面勾选Store Integration IOS和android


3、添加terms,就是添加key-value


4、添加的terms类型要选择正确,区分图片类型和文字类型
5、在项目中创建一个UI(Text),拖拽I2Localization插件中的Localize脚本,然后选择要绑定的key,本地化图片操作相同,至此,本地化制作结束


6、将I2Localization配置的key-value打包(合并)成一个txt文件,方便后期统一翻译,而且用 _LocalizationManager.getInstance().getDicStr("xxx")接口也可以代码动态访问


7、如果手动修改了doc.txt,也可以import进来,点击import面板中的merge即可

优缺点分析:

优点:
1、配置多语言有可视化的界面,更方便。
2、只需要一个文件就能支持n种语言,后期翻译一键搞定。
3、扩展了I2Localization插件的文件解析方法,并且支持程序动态控制语言文字,更加灵活。

缺点:
1、所有的资源和文字都配在一个txt文件中,当游戏本地化数据足够大的时候,解析时间会增加
2、所有的语言配置都在一个文件中,容易造成多人开发冲突



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值