Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

UnityのApplication.systemLanguageがiOS9上で誤まった中国語を返す件について

More than 3 years have passed since last update.

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しないとダメ?)

ComManager.cs
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;
  }  
}
CurIOSLang.mm
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で動作確認済み)
めでたしめでたし。

tech_a_go_go_jp
インディーゲーム開発を行っています。 twitterは https://twitter.com/tech_a_go_go_jp です。 よろしくお願いいたします。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away