Application.systemLanguageが返す中国語について
iOS8まではiOS端末の言語設定が簡体字もしくは繁体字の場合、Unity API の Application.systemLanguageはそれぞれSystemLanguage.ChineseSimplified, SystemLanguage.ChineseTraditionalを返してくれていました。
しかし、iOS9からは一律にSystemLanguage.Chineseを返すようになってしまいました。(Unity 5.4.0f3で確認)
これでは簡体字か繁体字の判定ができず、それぞれの中国語文字にローカライズ対応しているアプリではまずいことになります。
原因
詳しくは分かりませんがきっと iOS9でNSLocale preferredLanguagesの戻り値が変わった が関連していると思います。
Unityも内部的にこの値を用いていてひきづられてしまったのかなと。
対策
Twitter で教えてもらった このバグ報告? のソースを使わせてもらいます。
CurIOSLang.mmはリンク先のものが動作しなかったので少し変更しています。
(XCodeでビルド時にcStringCopy なんて知らねーって文句言われたので cStringCopy は自分で実装しています。何かのヘッダーをimportしないとダメ?)
using UnityEngine;
using System.Collections;
using System.Runtime.InteropServices;
public class ComManager
{
#if UNITY_IOS
[DllImport("__Internal")]
private static extern string CurIOSLang();
#endif
public static SystemLanguage GetSystemLanguage()
{
SystemLanguage lang = Application.systemLanguage;
#if UNITY_IOS
if (Application.platform == RuntimePlatform.IPhonePlayer) {
if (lang == SystemLanguage.Chinese) {
string name = CurIOSLang();
if (name.StartsWith("zh-Hans")) {
return SystemLanguage.ChineseSimplified;
}
return SystemLanguage.ChineseTraditional;
}
}
#endif
return lang;
}
}
char* cStringCopy(const char* string)
{
if(string == NULL){
return NULL;
}
char* newString = (char*)malloc(strlen(string) + 1);
strcpy(newString, string);
return newString;
}
extern "C"
{
const char* CurIOSLang ()
{
NSArray *languages = [NSLocale preferredLanguages];
NSString *CurrentLanguage = [languages objectAtIndex:0];
return cStringCopy([CurrentLanguage UTF8String]);
}
}
ComManager.csはご自身のUnityプロジェクトの適当な場所に、CurIOSLang.mmは ご自身のUnityプロジェクト内の./Assets/Plugins/iOS に保存します。
(Unity5.3.?からObjective-Cなどネイティブコードを ./Assets/Plugins/iOS に保存する必要はないはずですが、とりあえずここではそのディレクトリに保存しています。)
結果
ComManager.GetSystemLanguage();
が適切な中国語文字を返してくれるようになりました。(iOS8, iOS9で動作確認済み)
めでたしめでたし。