рдХрд┐рд╕реА рднреА рдЧреНрд░рдВрде рдХрд╛ рд╕реНрдерд╛рдиреАрдпрдХрд░рдг

рдЕрдзрд┐рдХрд╛рдВрд╢ рдЧреЗрдо рдХреБрдВрдЬреА-рдЖрдзрд╛рд░рд┐рдд рд╕реНрдерд╛рдиреАрдпрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рдд, рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд╛рда рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреБрдВрдЬреА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдПрдХ рдмреЗрд╣рддрд░ рд╡рд┐рдХрд▓реНрдк рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реВрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╡рд┐рдХрд▓реНрдк рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИ, рдЬрд┐рдирдХреЗ рдкрд╛рд╕ рдЦреЗрд▓ рдореЗрдВ рдЖрд╡рд╛рдЬ рдЕрднрд┐рдирдп рд╣реИ, рдпрд╣ рдПрдХ рдХреБрдВрдЬреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЖрд╕рд╛рди рд╣реИред

рдПрдХ рдХреБрдВрдЬреА рдХреНрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ


рдХреБрдВрдЬреА, рдпрд╛ рдмрд▓реНрдХрд┐ рдХреАрд╡рд░реНрдб, рд╡рд╣ рд╢рдмреНрдж рд╣реИ рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдХрд┐ рдХрд┐рд╕ рдкрд╛рда рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЪрдпрдирд┐рдд рднрд╛рд╖рд╛ рдХреА рдЦреЛрдЬ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЪрд▓ рд░рд╣реА рд╣реИред рдПрдХ рдХреАрд╡рд░реНрдб рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг: scene_Escape_from_jail_Ethan_dialog_with_Mary_3 , рд╣рд╛рдБ, рдХреБрдВрдЬреА рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА рдпрджрд┐ рдЖрдкрдХреЗ рдЦреЗрд▓ рдореЗрдВ рдХрдИ рджреГрд╢реНрдп, рдПрдХ рдмрдбрд╝рд╛ рдкреНрд▓реЙрдЯ рд╣реИред рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рддреБрд░рдВрдд рддреБрд░рдВрдд рдПрдХ рднрд╛рд╖рд╛ рдореЗрдВ рдПрдХ рд╡рд╛рдХреНрдпрд╛рдВрд╢ рд▓рд┐рдЦрдирд╛, рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдЕрдВрдЧреНрд░реЗрдЬреА рдпрд╛ рдПрдХ рд╣реИ рдХрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдзрд╛рд░рд╛рдкреНрд░рд╡рд╛рд╣ рд╣реИред рд╡реИрд╕реЗ, рдЪреВрдВрдХрд┐ рд╡рд░реНрддрдорд╛рди рднрд╛рд╖рд╛ рдФрд░ рдореБрдЦреНрдп рднрд╛рд╖рд╛ рдХреЗ рд╕рднреА рд╡рд╛рдХреНрдпрд╛рдВрд╢ рд░реИрдо рдореЗрдВ рдЭреВрда рд╣реЛрдВрдЧреЗ, рдпрд╣ рд╣рд░ рдмрд╛рд░ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдЙрддреНрдкрд╛рджрдХ рд╣реЛрдЧрд╛, рдмрдбрд╝реЗ рдЧреЗрдо рдХреЗ рд▓рд┐рдП, рдЖрдк рдкреНрд░рддреНрдпреЗрдХ рджреГрд╢реНрдп рдХреЗ рд▓рд┐рдП рдлрд╝рд╛рдЗрд▓ рдХреЛ рдереЛрдбрд╝рд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдХреИрд╕реЗ рд╕рдм рдХреБрдЫ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рд╣реЛрдЧрд╛


рдиреАрдЪреЗ рд╡рд░реНрдгрд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ, рд╕реНрдерд┐рд░ рд▓реИрдВрдЧ рдХреНрд▓рд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рд╕рднреА рд╢рдмреНрдж / рд╡рд╛рдХреНрдпрд╛рдВрд╢реЛрдВ рдХреА рдЦреЛрдЬ рд╣реЛрдЧреАред рдЖрдЗрдП рд╣рдо рдЙрди рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдХрд░ рдПрдХ рд╡рд░реНрдЧ рдШреЛрд╖рд┐рдд рдХрд░реЗрдВ рдЬрд┐рдирдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

using UnityEngine; using System.Collections.Generic; // list and dictionary #if UNITY_EDITOR using UnityEditor; using System.IO; // created file in editor #endif public class Lang { private const string Path = "/Resources/"; // path to resources folder private const string FileName = "Language"; // file name with phrases } 

рдФрд░ рдЗрд╕рд▓рд┐рдП, рд╣рдо рдПрдХ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдмрд┐рдирд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рд╕реЗ рдлрд╝рд╛рдЗрд▓ рдорд┐рд▓ рдЬрд╛рдПрдЧреА, рд╣рдо рдЗрд╕реЗ рдХрд┐рд╕реА рднреА рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХреЗ рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдФрд░ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╣реИред рд╕рд┐рд╕реНрдЯрдо рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рд╕реВрдЪреА, рд╢рдмреНрджрдХреЛрд╢ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдФрд░ рд╕рдВрдкрд╛рджрдХ рд╕реЗ рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред UnityEditor рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдХреЗрд╡рд▓ рд╡рд╛рдХреНрдпрд╛рдВрд╢ рдХреЗ рдкрд╣рд▓реЗ рд░рд┐рдХреЙрд░реНрдб рдХреЗ рджреМрд░рд╛рди рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рддреНрд╡рд░рд┐рдд рдкреБрдирд░рд╛рд░рдВрдн рдХреЗ рдмрд╛рдж, рд╕рднреА рд╡рд╛рдХреНрдпрд╛рдВрд╢ рд╣рдореЗрд╢рд╛ рд▓реЛрдб рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреА рдорджрдж рд╕реЗ рд╣рдо рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХреНрд▓рд╛рд╕ рджреЛ рд╕реНрдерд┐рд░ рдлрд╝реАрд▓реНрдб рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ, рдЗрд╕реЗ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдирд╛рдо рджреЗрдВ, рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдкрде рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝реЛрд▓реНрдбрд░ рд╣реИ, рдФрд░ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдХреЛрдИ рднреА рдирд╛рдо рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдЕрдм рдЖрдкрдХреЛ рднрд╛рд╖рд╛ рдФрд░ рд╢рдмреНрджрдХреЛрд╢ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╕рднреА рдЪреАрдЬреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реВрдЪрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред

 private static int LangIndex; // variable to store the index of the current language private static List<SystemLanguage> languages = new List<SystemLanguage>(); // having languages in game private static Dictionary<string, string> Phrases = new Dictionary<string, string>(); // keys and values 

LangIndex рдлрд╝реАрд▓реНрдб рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд░рд┐рдХреЙрд░реНрдб рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рд╡рд░реНрддрдорд╛рди рднрд╛рд╖рд╛ рдХрд╛ рд╕реВрдЪрдХрд╛рдВрдХ рд░рдЦреЗрдЧреАред рднрд╛рд╖рд╛рдУрдВ рдХреА рд╕реВрдЪреА рдореЗрдВ - рдлрд╛рдЗрд▓ рдореЗрдВ рдкреНрд░рдпреБрдХреНрдд рд╕рднреА рднрд╛рд╖рд╛рдУрдВ рдХреЛ рд░рд┐рдХреЙрд░реНрдб рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╢рдмреНрджрдХреЛрд╢ рдореБрдЦреНрдп рднрд╛рд╖рд╛ рдореЗрдВ рдФрд░ рд╡рд░реНрддрдорд╛рди рднрд╛рд╖рд╛ рдореЗрдВ рд╕рднреА рд╡рд╛рдХреНрдпрд╛рдВрд╢реЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдЧрд╛ред

рдХрдХреНрд╖рд╛ рдХреЗ рдЙрдкрд░реНрдпреБрдХреНрдд рд╡рд░реНрдгрд┐рдд рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рдЖрд░рдВрдн рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред

рдХреЛрдб
 public static bool isStarting // bool for check starting { get; private set; } public static SystemLanguage language // return current language { get; private set; } #if UNITY_EDITOR public static void Starting(SystemLanguage _language, SystemLanguage default_language = SystemLanguage.English, params SystemLanguage[] _languages) // write languages without main language, it self added #else public static void Starting(SystemLanguage _language = SystemLanguage.English) // main language - only for compilation #endif { #if UNITY_EDITOR if (!File.Exists(Application.dataPath + Path + FileName + ".csv")) // if file wasn't created { File.Create(Application.dataPath + "/Resources/" + FileName + ".csv").Dispose(); // create and lose link File.WriteAllText(Application.dataPath + "/Resources/" + FileName + ".csv", SetLanguage(default_language, _languages)); // write default text with index } #endif string[] PhrasesArr = Resources.Load<TextAsset>(FileName).text.Split('\n'); // temp var for write in dicrionary string[] string_languages = PhrasesArr[0].Split(';'); // string with using languages int _length = string_languages.Length - 1; for (int i = 0; i < _length; i++) { languages.Add(SystemLanguageParse(string_languages[i])); // string language to SystemLanguage } LangIndex = FindIndexLanguage(_language); // index with current language for (int i = 0; i < PhrasesArr.Length; i++) // add keys and value { string[] temp_string = PhrasesArr[i].Split(';'); if (temp_string.Length > LangIndex) Phrases.Add(temp_string[0], temp_string[LangIndex]); else Phrases.Add(temp_string[0], temp_string[0]); } isStarting = true; } 

рдпрд╣ рддреБрд░рдВрдд рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ рддрд╛рдХрд┐ рдпрд╣ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдЕрдирд╛рд╡рд╢реНрдпрдХ рдХрд╛рд░реНрд░рд╡рд╛рдИ рди рдХрд░реЗред Lang.Starting (...) рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:

 #if !UNITY_EDITOR Lang.Starting(LANGUAGE); #else Lang.Starting(LANGUAGE, SystemLanguage.English, SystemLanguage.Russian, SystemLanguage.Ukrainian); #endif private static int FindIndexLanguage(SystemLanguage _language) // finding index or current language { int _index = languages.IndexOf(_language); if (_index == -1) // if language not found return 0; // return main language return _index; } #if UNITY_EDITOR private static void Add(string AddString) // add phrases only form editor { File.AppendAllText(Application.dataPath + "/Resources/" + FileName +".csv", AddString + "\n"); // rewrite text to file Phrases.Add(AddString, AddString); // add phrase to dicrionary AssetDatabase.Refresh(); // refresh file } #endif #if UNITY_EDITOR private static string SetLanguage(SystemLanguage default_language, params SystemLanguage[] _languages) // set first string to file { string ret_string = ""; ret_string += default_language + ";"; foreach (SystemLanguage _language in _languages) { ret_string += _language + ";"; } return ret_string + "!@#$%\n"; // for last index } #endif 


рд╕рдВрдкрд╛рджрдХ рдореЗрдВ рдЦреЗрд▓рддреЗ рд╕рдордп рдХреЙрд▓ рдореЗрдВ рджреЛ рдореБрдЦреНрдп рдкреИрд░рд╛рдореАрдЯрд░ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП, рдпрд╣ рд╡рд╣ рд╣реИ рдЬреЛ рдЕрдм рднрд╛рд╖рд╛ рдХреЗ рд╡рд╛рдХреНрдпрд╛рдВрд╢реЛрдВ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдореБрдЦреНрдп рднрд╛рд╖рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рд╕ рднрд╛рд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЕрдиреНрдп рд╕рднреА рдкреИрд░рд╛рдореАрдЯрд░ рднрд╛рд╖рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ рдЬреЛ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рдорд╛рд╣рд┐рдд рдХрд┐рдП рдЬрд╛рдиреЗ рдЪрд╛рд╣рд┐рдП, рдпреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗрд╡рд▓ рдкрд╣рд▓реЗ рд▓реЙрдиреНрдЪ рдХреЗ рджреМрд░рд╛рди рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВред рдЬрдм рдлрд╝рд╛рдЗрд▓ рдЕрднреА рддрдХ рдирд╣реАрдВ рдмрдирд╛рдИ рдЧрдИ рд╣реИ (рдФрд░ рдмрд╛рдж рдореЗрдВ рдЗрд╕реЗ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ), рдЕрдиреНрдпрдерд╛, рдпрджрд┐ рдЖрдкрдХреЛ рдХреБрдЫ рднрд╛рд╖рд╛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд╕рдм рдХреБрдЫ рдХреЙрдкреА рдХрд░рдиреЗ, рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╣рдЯрд╛рдиреЗ рдФрд░ рд╕рдВрдкрд╛рджрдХ рдореЗрдВ рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рдЪрд▓рд╛рдиреЗ рдпрд╛ рдЗрд╕реЗ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб SystemLanguageParse (...) рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рдХрд╛рд░ рд╕реЗ SystemLanguage рдореЗрдВ рднрд╛рд╖рд╛ рдХреЗ рдирд╛рдо рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░рддрд╛ рд╣реИ (рдпрд╣ рд╡рд┐рдзрд┐ рдХрдо рд╣реЛрдЧреА)ред

рдЖрдЗрдП рд╣рдо рдЬреЛрдбрд╝рдиреЗ рдХреА рд╡рд┐рдзрд┐ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ:

 #if UNITY_EDITOR private static void Add(string AddString) // add phrases only form editor { File.AppendAllText(Application.dataPath + "/Resources/" + FileName +".csv", AddString + "\n"); // rewrite text to file Phrases.Add(AddString, AddString); // add phrase to dicrionary AssetDatabase.Refresh(); // refresh file } #endif 

рдЪреВрдВрдХрд┐ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рд╕рдВрдкрд╛рджрдХ рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рджреМрд░рд╛рди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЗрд╕рд▓рд┐рдП рд╣рдо рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЕрдзрд┐рд▓реЗрдЦрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рд╕реНрдЯрдо рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рд╛рде рд╣реА рд░реАрдлрд╝реНрд░реЗрд╢ () рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕рдВрдкрд╛рджрдХ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрди рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдмреАрдЪ, рдПрдХ рд╡рд╛рдХреНрдпрд╛рдВрд╢ рдХреЛ рдХреЗрд╡рд▓ рд╢рдмреНрджрдХреЛрд╢ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддрд╛рдХрд┐ рдЙрд╕реА рд╕рддреНрд░ рдореЗрдВ рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдлрд┐рд░ рд╕реЗ рд░рд┐рдХреЙрд░реНрдб рдХрд░рдиреЗ рд╕реЗ рдмрдЪрд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗред

рд╡реИрд╕реЗ, рдореИрдВ рдпрд╣ рдХрд╣рдирд╛ рднреВрд▓ рдЧрдпрд╛ рдХрд┐ рд╡рд╛рдХреНрдпрд╛рдВрд╢ рдПрдХ .csv рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ, рдЬреЛ рд╣рдореЗрдВ рдЖрд░рд╛рдо рд╕реЗ рд╡рд╛рдХреНрдпрд╛рдВрд╢реЛрдВ рдХреЛ рдПрдХреНрд╕реЗрд▓реЗ рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рдЕрдм рд╣рдореЗрдВ рдЕрдкрдиреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫреА рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рд╣рдореЗрдВ рднрд╛рд╖рд╛ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛:

  public static void ChangeLanguage(SystemLanguage _language) // change language { string[] PhrasesArr = Resources.Load<TextAsset>(FileName).text.Split('\n'); // load all text from file LangIndex = FindIndexLanguage(_language); Phrases.Clear(); // clear dictionary with phrases for (int i = 1; i < PhrasesArr.Length; i++) { string[] temp_string = PhrasesArr[i].Split(';'); if (temp_string.Length > LangIndex) Phrases.Add(temp_string[0], temp_string[LangIndex]); else Phrases.Add(temp_string[0], temp_string[0]); } } 

рдФрд░ рдЗрд╕рд▓рд┐рдП, рд╣рдо рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рдзрд┐ рдкрд░ рдЖрдП, рдЬреЛ рд╡рд╛рдХреНрдпрд╛рдВрд╢ рдХреЛ рдореБрдЦреНрдп рднрд╛рд╖рд╛ рдореЗрдВ рд▓реЗ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдЗрд╕реЗ рд╕рд╣реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЬрд╛рд░реА рдХрд░реЗрдЧрд╛:

  public static string Phrase(string DefaultPhrase) // translate phrase, args use to formating string { #if UNITY_EDITOR if (!isStarting) // if not starting { throw new System.Exception("Forgot initialization.Use Lang.Starting(...)"); // throw exception } #endif string temp_EnglishPhrase = DefaultPhrase; // temp variable for try get value if (Phrases.TryGetValue(DefaultPhrase, out DefaultPhrase)) // if value has been found { return temp_EnglishPhrase; } #if UNITY_EDITOR Add(temp_EnglishPhrase); // add phrase if value hasn't been found #endif return temp_EnglishPhrase; } 

рдпрд╣ рд╡рд┐рдзрд┐ рдмрд╕ рдореБрдЦреНрдп рднрд╛рд╖рд╛ рдореЗрдВ рдПрдХ рд╡рд╛рдХреНрдпрд╛рдВрд╢ рд▓реЗрддреА рд╣реИ, рдлрд┐рд░ рд╢рдмреНрджрдХреЛрд╢ рдореЗрдВ рдЬреЛ рдХреБрдЫ рднреА рд╣реИ, рдЙрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рдХреБрдВрдЬреА рджреНрд╡рд╛рд░рд╛ рдРрд╕рд╛ рд╡рд╛рдХреНрдпрд╛рдВрд╢ рдвреВрдВрдврдирд╛, рдпрд╣ рд╣рдореЗрдВ рдЗрд╕ рдХреБрдВрдЬреА рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рджреЗрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рд╣рдореЗрдВ рдЬрд┐рд╕ рднрд╛рд╖рд╛ рдореЗрдВ рдЪрд╛рд╣рд┐рдП, рд╡рд╣ рд╡рд╛рдХреНрдпрд╛рдВрд╢ рд╣реИред рдЖрдк рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЛрдб рдХреА рдПрдХ рд╕рд░рд▓ рд░реЗрдЦрд╛ рдХреЗ рд╕рд╛рде рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 string str = Lang.Phrase("Hello world"); 

рдЕрдм рд╣рдореЗрдВ рдЬрд┐рд╕ рднрд╛рд╖рд╛ рдореЗрдВ рд╡рд╛рдХреНрдпрд╛рдВрд╢ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рд╡рд╣ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдорд┐рд▓ рдЬрд╛рдПрдЧреА, рдЕрдЧрд░ рдЕрдЪрд╛рдирдХ рдпрд╣ рдЧрд╛рдпрдм рд╣реИ, рддреЛ рдорд╛рдкрджрдВрдбреЛрдВ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╡рд╛рдХреНрдпрд╛рдВрд╢, рдЕрд░реНрдерд╛рддреН, рд╣реИрд▓реЛ рджреБрдирд┐рдпрд╛, рдЧрд┐рд░ рдЬрд╛рдПрдЧреАред

рдЗрд╕ рдкрджреНрдзрддрд┐ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕реБрдзрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддрд╛рдХрд┐ рдЖрдк рднрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рд▓реЗ рд╕рдХреЗрдВ:

  public static string Phrase(string DefaultPhrase, params string[] args) // translate phrase, args use to formating string { #if UNITY_EDITOR if (!isStarting) // if not starting { throw new System.Exception("Forgot initialization.Use Lang.Starting(...)"); // throw exception } #endif string temp_EnglishPhrase = DefaultPhrase; // temp variable for try get value if (Phrases.TryGetValue(DefaultPhrase, out DefaultPhrase)) // if value has been found { if (args.Length == 0) return DefaultPhrase; return string.Format(DefaultPhrase, args); } #if UNITY_EDITOR Add(temp_EnglishPhrase); // add phrase if value hasn't been found #endif if (args.Length == 0) return temp_EnglishPhrase; return string.Format(temp_EnglishPhrase, args); } 

рдЕрдм рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдкрд╣рд▓реЗ рдХреА рддрд░рд╣ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

 string str = Lang.Phrase("Hello world"); 

рд▓реЗрдХрд┐рди рдЕрдм рд╣рдорд╛рд░реА рд╡рд┐рдзрд┐ рдиреЗ рдЖрдЙрдЯрдкреБрдЯ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рд╣реИ, рдЬреЛ рдХреЙрдорд╛ рджреНрд╡рд╛рд░рд╛ рдЕрд▓рдЧ рдХрд┐рдП рдЧрдП рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ:

 string str = Lang.Phrase("Hello {0} from {1}", "world", "habr"); 

рд╡рд╛рдХреНрдпрд╛рдВрд╢ рдЕрдиреБрд╡рд╛рдж


рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдКрдкрд░ рд▓рд┐рдЦрд╛ рд╣реИ, рдлрд╝рд╛рдЗрд▓ .csv рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдПрдХреНрд╕реЗрд▓ рдореЗрдВ рд╕рдм рдХреБрдЫ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛, рд▓реЗрдХрд┐рди рдЗрддрдирд╛ рд╕рд░рд▓ рдирд╣реАрдВ, рд╕реА-рд╢рд╛рд░реНрдк рдФрд░ рдПрдХреНрд╕реЗрд▓ рдХреА рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╡реЗ рд╕рд┐рд░рд┐рд▓рд┐рдХ рд╡рд░реНрдгрдорд╛рд▓рд╛ рдХреЛ рд╡рд┐рднрд┐рдиреНрди рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдореЗрдВ рд╕рдордЭрддреЗ рд╣реИрдВ, рдПрдХреНрд╕реЗрд▓ рдХреЗрд╡рд▓ UTF-8-BOM рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХреЛ рд╕рдордЭрддрд╛ рд╣реИ рдпрд╛ рдЬреЛ рд╣рдорд╛рд░реЗ рд╣рд╛рдВрдкреА рдХреЛ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИ, рд╣рдореЗрдВ рдЙрд╕рдореЗрдВ рдХреЗрд╡рд▓ UTF-8 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рднрд▓реЗ рд╣реА рдПрдХрд╛рддреНрдордХ рд╕рдВрдкрд╛рджрдХ UTF-8-BOM рдХреЛ рд╕рдордЭреЗрдЧрд╛, рдХреЛрдб рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдПрдиреНрдХреЛрдбрд┐рдВрдЧреНрд╕ (UTF-8 рдФрд░ UTF-8-) рдкрд░ рджреЛ рд╕рдорд╛рди рд╢рдмреНрдж рд╣реИрдВ рдмреАрдУрдПрдо) рд╕рдорд╛рди рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдЬреЛ рд╣рдорд╛рд░реА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рдорд╛рди рд╢рдмреНрджреЛрдВ рдХреЗ рдирд┐рд░рдВрддрд░ рдЬреЛрдбрд╝ рдХреЛ рдЬрдиреНрдо рджреЗрдЧрд╛ред

рд╣рдо рдирд┐: рд╢реБрд▓реНрдХ рдиреЛрдЯрдкреИрдб ++ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдПрдирдХреЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рд╛рдЗрдЯред рдПрдХ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рд╕реЗ рдЖрдкрдХреЛ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реЛрдЧреА, рдПрдХ рд╢рдмреНрдж рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рдПрдХ рдкрд╛рда рд╕рдВрдкрд╛рджрдХ, рдПрдХ рд╣реА рдиреЛрдЯ рдкреИрдб рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╡рд╛рддрд╛рд╡рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЕрдВрддрд┐рдо рдХреЛрдб
 using UnityEngine; using System.Collections.Generic; // list and dictionary #if UNITY_EDITOR using UnityEditor; using System.IO; // created file in editor #endif public class Lang { private const string Path = "/Resources/"; // path to resources folder private const string FileName = "Language"; // file name with phrases private static int NumberOfLanguage; // variable to store the index of the current language private static List<SystemLanguage> languages = new List<SystemLanguage>(); // having languages in game private static Dictionary<string, string> Phrases = new Dictionary<string, string>(); // keys and values private static SystemLanguage language; // current language #if UNITY_EDITOR public static void Starting(SystemLanguage _language, SystemLanguage default_language, params SystemLanguage[] _languages) // write languages without main language, it self added #else public static void Starting(SystemLanguage _language = SystemLanguage.English) // main language - only for compilation #endif { #if UNITY_EDITOR if (!File.Exists(Application.dataPath + Path + FileName + ".csv")) // if file wasn't created { File.Create(Application.dataPath + "/Resources/" + FileName + ".csv").Dispose(); // create and lose link File.WriteAllText(Application.dataPath + "/Resources/" + FileName + ".csv", SetLanguage(default_language, _languages)); // write default text with index } #endif string[] PhrasesArr = Resources.Load<TextAsset>(FileName).text.Split('\n'); // temp var for write in dicrionary string[] string_languages = PhrasesArr[0].Split(';'); // string with using languages int _length = string_languages.Length - 1; for (int i = 0; i < _length; i++) { languages.Add(SystemLanguageParse(string_languages[i])); // string language to SystemLanguage } NumberOfLanguage = FindIndexLanguage(_language); // index with current language for (int i = 0; i < PhrasesArr.Length; i++) // add keys and value { string[] temp_string = PhrasesArr[i].Split(';'); if (temp_string.Length > NumberOfLanguage) Phrases.Add(temp_string[0], temp_string[NumberOfLanguage]); else Phrases.Add(temp_string[0], temp_string[0]); } isStarting = true; } public static bool isStarting // bool for check starting { get; private set; } public static SystemLanguage Language // return current language { get { return language; } } public static string Phrase(string DefaultPhrase, params string[] args) // translate phrase, args use to formating string { #if UNITY_EDITOR if (!isStarting) // if not starting { throw new System.Exception("Forgot initialization.Use Lang.Starting(...)"); // throw exception } #endif string temp_EnglishPhrase = DefaultPhrase; // temp variable for try get value if (Phrases.TryGetValue(DefaultPhrase, out DefaultPhrase)) // if value has been found { if (args.Length == 0) return DefaultPhrase; return string.Format(DefaultPhrase, args); } #if UNITY_EDITOR Add(temp_EnglishPhrase); // add phrase if value hasn't been found #endif if (args.Length == 0) return temp_EnglishPhrase; return string.Format(temp_EnglishPhrase, args); } public static void ChangeLanguage(SystemLanguage _language) // change language { string[] PhrasesArr = Resources.Load<TextAsset>(FileName).text.Split('\n'); // load all text from file NumberOfLanguage = FindIndexLanguage(_language); Phrases.Clear(); // clear dictionary with phrases for (int i = 1; i < PhrasesArr.Length; i++) { string[] temp_string = PhrasesArr[i].Split(';'); if (temp_string.Length > NumberOfLanguage) Phrases.Add(temp_string[0], temp_string[NumberOfLanguage]); else Phrases.Add(temp_string[0], temp_string[0]); } } private static int FindIndexLanguage(SystemLanguage _language) // finding index or current language { int _index = languages.IndexOf(_language); if (_index == -1) // if language not found return 0; // return main language return _index; } #if UNITY_EDITOR private static void Add(string AddString) // add phrases only form editor { File.AppendAllText(Application.dataPath + "/Resources/" + FileName + ".csv", AddString + "\n"); // rewrite text to file Phrases.Add(AddString, AddString); // add phrase to dicrionary AssetDatabase.Refresh(); // refresh file } #endif #if UNITY_EDITOR private static string SetLanguage(SystemLanguage default_language, params SystemLanguage[] _languages) // set first string to file { string ret_string = ""; ret_string += default_language + ";"; foreach (SystemLanguage _language in _languages) { ret_string += _language + ";"; } return ret_string + "!@#$%\n"; // for last index } #endif private static SystemLanguage SystemLanguageParse(string _language) // just parse from string to SystemLanguage { switch (_language) { case "English": return SystemLanguage.English; case "Russian": return SystemLanguage.Russian; case "Ukrainian": return SystemLanguage.Ukrainian; case "Polish": return SystemLanguage.Polish; case "French": return SystemLanguage.French; case "Japanese": return SystemLanguage.Japanese; case "Chinese": return SystemLanguage.Chinese; case "Afrikaans": return SystemLanguage.Afrikaans; case "Arabic": return SystemLanguage.Arabic; case "Basque": return SystemLanguage.Basque; case "Belarusian": return SystemLanguage.Belarusian; case "Bulgarian": return SystemLanguage.Bulgarian; case "ChineseSimplified": return SystemLanguage.ChineseSimplified; case "ChineseTraditional": return SystemLanguage.ChineseTraditional; case "Czech": return SystemLanguage.Czech; case "Danish": return SystemLanguage.Danish; case "Dutch": return SystemLanguage.Dutch; case "Estonian": return SystemLanguage.Estonian; case "Faroese": return SystemLanguage.Faroese; case "Finnish": return SystemLanguage.Finnish; case "German": return SystemLanguage.German; case "Greek": return SystemLanguage.Greek; case "Hebrew": return SystemLanguage.Hebrew; case "Hungarian": return SystemLanguage.Hungarian; case "Icelandic": return SystemLanguage.Icelandic; case "Indonesian": return SystemLanguage.Indonesian; case "Italian": return SystemLanguage.Italian; case "Korean": return SystemLanguage.Korean; case "Latvian": return SystemLanguage.Latvian; case "Lithuanian": return SystemLanguage.Lithuanian; case "Norwegian": return SystemLanguage.Norwegian; case "Portuguese": return SystemLanguage.Portuguese; case "Romanian": return SystemLanguage.Romanian; case "SerboCroatian": return SystemLanguage.SerboCroatian; case "Slovak": return SystemLanguage.Slovak; case "Slovenian": return SystemLanguage.Slovenian; case "Spanish": return SystemLanguage.Spanish; case "Swedish": return SystemLanguage.Swedish; case "Thai": return SystemLanguage.Thai; case "Turkish": return SystemLanguage.Turkish; case "Vietnamese": return SystemLanguage.Vietnamese; } return SystemLanguage.Unknown; } } 

рдпрд╛рдж рд░рдЦрдиреЗ рдХреА рдореБрдЦреНрдп рдмрд╛рдд: UTF-8-BOM - рдПрдХреНрд╕реЗрд▓ рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреЛрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП UTF-8, рдордд рднреВрд▓рдирд╛ред

Source: https://habr.com/ru/post/hi446844/


All Articles