Войти
Заметки прогераСтатьи

Простой способ локализации игры на Unity3D

Автор:

Простой способ локализации игры на Unity3D. Для небольшой, казуальной игры. Для новичков-программистов Юнити.


  Это один из самых простых способов локализации небольшой игры на Юнити. Без всяких хмельных (XML) файлов.
Допустим вы сделали игру с английским интерфейсом. И хотите ее быстро перевести на другие языки.
Для этого вам потребуется всего лишь два простых скрипта.

  Первый скрипт Translate.cs, который вы повесите на все ваши надписи ( объекты с UI текстом) выглядит так:

using UnityEngine;
using UnityEngine.UI;

public class Translate : MonoBehaviour
{
  // Use this for initialization
  void Start () 
  {
    Text text=gameObject.GetComponent<Text>();
    if(text) text.text=Translator.Translate(text.text);
  }
}

Второй скрипт Translator.cs, который будет содержать массив текстов для перевода выглядит так:

using UnityEngine;

public static class Translator
{
  static int langIndex=-1; // индекс языка: -1-еще не инициализирован, 0-англ, 1 - русский и т.д.
  
  public static string Translate(string text_)
  {
    if(langIndex==-1) // начальная инициализация индекса языка при первом вызове
    {
      switch(Application.systemLanguage.ToString())
      {
      case "English": langIndex=0; break;
      case "Russian": langIndex=1; break;
        // продолжить для других языков ....
      }
    }
      
    for(int i=0;i<labels.GetLength(0);i++)
    {
      if(text_==labels[i,0]) return labels[i,langIndex];
    }
    return text_;
  }
  
  
  // здесь будут все наши тексты
  static string [,] labels=
  {
    {
      "Login\n(max 30)", // англ.
      "Логин\n(макс 30)"  // русс.
    },
    {
      "Password\n(6-8 chars)",
      "Пароль\n(6-8 симв.)"
    },
    {
      "Sign Up",
      "Регистрация"
    },
    {
      "Sign In",
      "Войти"
    }    
    // ...... ну и т.д., если языков больше, то в каждом блоке будет больше строчек
  };
    
}

Этот скрипт никуда вешать не надо, это статичный класс. Вуаля!

  Дополнение 1. Если вам потребуется локализировать не только UI текст, а и текст 3D, то немного модифицировав скрипт Translate.cs, сделайте скрипт TranslateTextMesh.cs, который вы будете вешать на объекты с 3D текстом:

using UnityEngine;

public class TranslateTextMesh : MonoBehaviour {

  // Use this for initialization
  void Start () 
  {
    TextMesh text=gameObject.GetComponent<TextMesh>();
    if(text) text.text=Translator.Translate(text.text);
  }
}

  Дополнение 2. Если вы захотите сделать перевод по коротким ключевым словам (типа enum), а не по полным фразам текста, то вы просто для языка с индексом 0 прописываете эти ключевые слова. При этом соответственно все тексты на объектах у вас изначально должны быть этими ключевыми словами. Иначе переводчик не найдет для них перевода.

  Вот и все. Спасибо за внимание. Буду рад вашим замечаниям.

#общее, #Unity3D, #локализация, #основы, #скрипты

18 мая 2017 (Обновление: 24 мая 2017)