5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-07-28

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で動作確認済み)
めでたしめでたし。

5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?