游戏发布,语言本地化需要繁体中文和简体中文
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 }