Мало лишь перевести свою игру, нужно еще и убедить в этом факте магазины приложений. Зачем? Как правило, описание приложения в магазине содержит поддерживаемые языки, что может повлиять на решение игрока о покупке. К сожалению, каждая платформа требует свой подход для добавления информации о переводах в сборку, но я постарался собрать наиболее удобные методы для трех основных магазинов.
iOS и MacOS
В корне сборки проекта для Xcode на iOS, находится файл Info.plist, такой же файл находится и в сборке для MacOS в папке GAMENAME.app/Contents. Необходимо добавить в него ключ CFBundleLocalizations с массивом значений всех языков, поддерживаемых вашей игрой:
<key>CFBundleLocalizations</key>
<array>
<string>en</string>
<string>ru</string>
</array>
Проблема в том, что после очередной сборки игры, этот файл будет перезаписан и все придется повторят снова и снова. Благо для нас — это легко автоматизировать скриптом в самом Unity:
#if UNITY_EDITOR
using UnityEngine;
using UnityEditor;
using UnityEditor.Callbacks;
using System.IO;
using System.Xml;
public class LocalizationPostBuildProcess
{
//В этом массиве содержатся поддерживаемые приложением языки
static string[] kProjectLocalizations = { "en", "ru" };
[PostProcessBuild]
public static void OnPostprocessBuild(BuildTarget buildTarget, string path)
{
if (buildTarget == BuildTarget.iOS ||
buildTarget == BuildTarget.StandaloneOSXUniversal ||
buildTarget == BuildTarget.StandaloneOSXIntel ||
buildTarget == BuildTarget.StandaloneOSXIntel64)
{
string infoPList = System.IO.Path.Combine(path, buildTarget == BuildTarget.iOS
? "Info.plist" : "/Contents/Info.plist");
if (File.Exists(infoPList) == false)
{
Debug.LogError("Could not add localizations to Info.plist file.");
return;
}
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.Load(infoPList);
XmlNode pListDictionary = xmlDocument.SelectSingleNode("plist/dict");
if (pListDictionary == null)
{
Debug.LogError("Could not add localizations to Info.plist file.");
return;
}
XmlElement localizationsKey = xmlDocument.CreateElement("key");
localizationsKey.InnerText = "CFBundleLocalizations";
pListDictionary.AppendChild(localizationsKey);
XmlElement localizationsArray = xmlDocument.CreateElement("array");
foreach (string localization in kProjectLocalizations)
{
XmlElement localizationElement = xmlDocument.CreateElement("string");
localizationElement.InnerText = localization;
localizationsArray.AppendChild(localizationElement);
}
pListDictionary.AppendChild(localizationsArray);
xmlDocument.Save(infoPList);
}
}
}
#endif
Android
Для Android самый удобный способ — файлы ресурсов локализации. Большой плюс, что это можно сделать прямо в проекте Unity: создайте xml файл AssetsPluginsAndroidresvalues-ЯЗЫК, например: values-ru. Внутри файла создайте одно значение:
<!--?xml version="1.0" encoding="utf-8"?-->
<resources>
<string name="app_name">GodSpeed</string>
</resources>
Повторить процесс с каждой локализацией и ваш apk будет содержать информацию о всех доступных языках в игре.
Windows store
В проекте Visual Studio, созданным Unity, находится файл Package.appxmanifest, в котором присутствует ключ Resources:
<Resources>
<Resource Language="x-generate" />
</Resources>
Значение говорит о том, что Visual Studio должна добавить сюда поддерживаемые языки при сборке пакета. Но мы можем вручную вписать нужные нам значения:
<Resources>
<Resource Language=”en-us” />
<Resource Language=”fr-fr” />
</Resources>
Вопреки документации Microsoft, после загрузки пакета, магазин игнорирует эти значения и обнаруживает только язык по умолчанию.
Придется идти путём добавления файлов ресурсов. Принцип похож на метод для Android, но файлы нужно добавить в самом проекте Visual Studio, а не в Unity. Создаем папку с названием языка (ru, en-US и т.д.) и внутри файл Resources.resw. Обязательно откройте файл и добавьте хотя бы одно значение внутрь. Процесс повторить для всех локализаций, кроме языка по умолчанию. Сделать это необходимо только один раз, при последующих сборках Unity не удалит эти файлы. Готово! Теперь при сборке проекта Visual Studio найдет все файлы ресурсов и автоматически добавит информацию о поддерживаемых языках в appxupload.
Заключение
Хоть и провести эти операции, при наличии информации — дело максимум на час, хотелось бы чтобы в Unity появилась опция добавления всей необходимой информации при сборке. Всем спасибо, надеюсь вам это поможет!
Автор: Максим Ратников