首页 > 技术文章 > 【Unity3D游戏开发】Application.systemLanguage无法区分简体中文和繁体中文 (二六)

MATU 2016-03-25 08:28 原文

游戏发布,语言本地化需要繁体中文和简体中文

iOS8版本之前没问题,iOS9上无法正常识别这两种语言

原因是在iOS9上,Unity通过Application.systemLanguage返回的简体中文和繁体中文都是SystemLanguage.Chinese,真尼玛坑爹啊,摔手机砸电脑~

亲测Unity 5.2.1、Unity 5.3都有这个问题,Unity更新日志中都没有见这方面消息,不知是没人重视还是没人提~

 

原因分析:

语言            iOS返回语言            Application.systemLanguage

ios 7
简体中文            zh-Hans                ChineseSimplified
繁体中文            zh-Hans                ChineseSimplified

ios 8.1
简体中文            zh-Hans                ChineseSimplified
繁体中文(香港)        zh-HK                ChineseTraditional
繁体中文(台湾)        zh-Hant                ChineseTraditional

ios 9.1
繁体中文            zh-Hant-CN            Chinese            
简体中文            zh-Hans-CN            Chinese
繁体中文(香港)        zh-HK                ChineseTraditional
繁体中文(台湾)        zh-TW                Chinese

可见苹果在iOS9上都做了什么鬼处理......

 

 

解决方法:

如果Application.systemLanguage返回的是chinese,直接通过C#调用ObjC函数获得当前iOS系统语言进行纠正

 1 using UnityEngine;
 2 using System.Collections;
 3 using System.Runtime.InteropServices;
 4 
 5 public class ComManager
 6 {
 7     [DllImport("__Internal")]
 8     // ios手机的当前语言 "en"、“zh"、“zh-Hans"、"zh-Hant"
 9     private static extern string CurIOSLang();
10 
11     /**
12         获得校正后的系统语言
13         因为ios9调整了系统语言,简体中文和繁体中文在ios9上Application.systemLanguage获取的值都是Chinese
14         无法区分简体中文和繁体中文
15 
16         ios 7
17         简体                zh-Hans
18         繁体                zh-Hant
19 
20         ios 8.1
21         简体中文            zh-Hans                ChineseSimplified
22         繁体中文(香港)        zh-HK                ChineseTraditional
23         繁体中文(台湾)        zh-Hant                ChineseTraditional
24 
25         ios 9.1
26         简体中文            zh-Hans-CN            Chinese
27         繁体中文(香港)        zh-HK                ChineseTraditional
28         繁体中文(台湾)        zh-TW                Chinese
29     **/
30     public static SystemLanguage GetSystemLanguage()
31     {
32         SystemLanguage lang = Application.systemLanguage;
33         if (Application.platform == RuntimePlatform.IPhonePlayer)
34         {
35             if (lang == SystemLanguage.Chinese) {
36                 string name = CurIOSLang();
37                 if (name.StartsWith("zh-Hans")) {
38                     return SystemLanguage.ChineseSimplified;
39                 }
40 
41                 return SystemLanguage.ChineseTraditional;
42             }
43         }
44 
45         return lang;
46     }
47 }

有朋友问上面生命的的CurIOSLang函数怎么来的,是在Objective-C中定义好的,C#中声明引用,具体可以看文章最后的Unity的C#和ObjC数据交互

定义一个.mm文件,内容如下:

 1 extern char* cStringCopy(const char* string);
 2 
 3 extern "C"
 4 {
 5     // ios手机的当前语言 "en"、“zh"、“zh-Hans"、"zh-Hant"
 6    const char* CurIOSLang()
 7    {
 8            NSArray *languages = [NSLocale preferredLanguages];  
 9         NSString *currentLanguage = [languages objectAtIndex:0]; 
10         return cStringCopy([currentLanguage UTF8String]);
11    }
12 }

 

推荐阅读