Unity 2021.3.40f1
I2 Localization v2.8.22 f4
----
I2 Localization의 AppName 로컬라이징을 사용하고 있는데,
PostProcessBuild_iOS.cs를 약간 개조(추가)해서 iOS Privacy도 로컬라이징 하도록 추가함.
(현재는 ATT 관련 Description인 NSUserTrackingUsageDescription Privacy를 추가함)
아래 소스를 I2 Localization 하위에 있는 PostProcessBuild_iOS.cs가 있는 폴더에 넣거나,
원하는 곳 Editor 폴더 아래에 넣으면 된다.
난 에셋 삭제 시 함께 사라지는 걸 방지하기 위해 아래 위치에 추가해 뒀다.
[소스 위치] ../Assets/I2_Extentions/Localization/Scripts/Editor/PostProcessBuild_iOS_Privacy.cs
#if UNITY_IOS || UNITY_IPHONE
using UnityEditor.Callbacks;
using System.Collections;
using UnityEditor.iOS_I2Loc.Xcode;
using System.IO;
using UnityEditor;
using UnityEngine;
using System.Linq;
namespace I2.Loc
{
public class PostProcessBuild_IOS_Privacy
{
[PostProcessBuild(10001)]
public static void ChangeXcodePlist(BuildTarget buildTarget, string pathToBuiltProject)
{
if (buildTarget != BuildTarget.iOS)
return;
if (LocalizationManager.Sources.Count <= 0)
LocalizationManager.UpdateSources();
var langCodes = LocalizationManager.GetAllLanguagesCode(false).Concat(LocalizationManager.GetAllLanguagesCode(true)).Distinct().ToList();
if (langCodes.Count <= 0)
return;
try
{
string plistPath = pathToBuiltProject + "/Info.plist";
PlistDocument plist = new PlistDocument();
plist.ReadFromString(File.ReadAllText(plistPath));
PlistElementDict rootDict = plist.root;
var langArray = rootDict.CreateArray("CFBundleLocalizations");
foreach (var code in langCodes)
{
if (code == null || code.Length < 2)
continue;
langArray.AddString(code);
}
rootDict.SetString("CFBundleDevelopmentRegion", langCodes[0]);
File.WriteAllText(plistPath, plist.WriteToString());
string LocalizationRoot = pathToBuiltProject + "/I2Localization";
if (!Directory.Exists(LocalizationRoot))
Directory.CreateDirectory(LocalizationRoot);
var project = new PBXProject();
string projPath = PBXProject.GetPBXProjectPath(pathToBuiltProject);
project.ReadFromFile(projPath);
foreach (var code in langCodes)
{
if (code == null || code.Length < 2)
continue;
var LanguageDirRoot = LocalizationRoot + "/" + code + ".lproj";
if (!Directory.Exists(LanguageDirRoot))
Directory.CreateDirectory(LanguageDirRoot);
var infoPlistPath = LanguageDirRoot + "/InfoPlist.strings";
var InfoPlist = string.Format("\n{0} = \"{1}\";", "NSUserTrackingUsageDescription", Get_NSUserTrackingUsageDescription(code));
File.AppendAllText(infoPlistPath, InfoPlist);
}
project.WriteToFile(projPath);
}
catch (System.Exception e)
{
Debug.Log (e);
}
}
private static string Get_NSUserTrackingUsageDescription(string _code)
{
string strDescription = string.Empty;
switch(_code)
{
case "en":
strDescription = "This identifier will be used to deliver personalized ads to you.";
break;
case "ko":
strDescription = "이 식별자는 맞춤형 광고를 제공하는 데 사용됩니다.";
break;
case "zh":
case "zh-CN":
strDescription = "该标识符将用于向您投放个性化广告。";
break;
case "zh-TW":
strDescription = "該標識符將用於向您投放個人化廣告。";
break;
case "ja":
strDescription = "この識別子は、パーソナライズされた広告を配信するために使用されます。";
break;
case "vi":
strDescription = "Mã nhận dạng này sẽ được sử dụng để phân phối quảng cáo được cá nhân hóa cho bạn.";
break;
case "es":
strDescription = "Este identificador se utilizará para enviarle anuncios personalizados.";
break;
case "it":
strDescription = "Questo identificatore verrà utilizzato per fornirti annunci personalizzati.";
break;
case "id":
strDescription = "Pengenal ini akan digunakan untuk menayangkan iklan yang dipersonalisasi kepada Anda.";
break;
case "th":
strDescription = "ตัวระบุนี้จะใช้ในการส่งโฆษณาส่วนบุคคลให้กับคุณ";
break;
case "pt":
strDescription = "Este identificador será utilizado para lhe entregar anúncios personalizados.";
break;
case "hi":
strDescription = "इस पहचानकर्ता का उपयोग आपको वैयक्तिकृत विज्ञापन देने के लिए किया जाएगा.";
break;
default:
strDescription = "This identifier will be used to deliver personalized ads to you.";
break;
}
return strDescription;
}
}
}
#endif