Страница 1 из 1

Вопрос о локализации игры

СообщениеДобавлено: 17 фев 2019, 11:42
JodyRedlot
Приветствую. Столкнулся с проблемой касательно локализации. В первую очередь скажу, что все тексты будут храниться в .txt-файлах и парситься при загрузке игры и изменении языка игры. При парсинге должна будет заполняться структура, где хранятся все игровые строки:
Синтаксис:
Используется csharp
public struct Strings
{
        string NewGame, Options, Exit, Inspect, Switch;
}


Сам парсинг работает вроде как более, чем хорошо:
- Содержимое файла, где первое слово - ключ (совпадает с именем string-а в коде), второе - локализованное слово, если можно так выразиться:
NewGame#Новая игра
Options#Настройки
Exit#Выход


- Парсер:
Синтаксис:
Используется csharp
StreamReader reader = new StreamReader("Assets/Resources/test.txt");
while(!reader.EndOfStream)
{
        string str = reader.ReadLine();
                       
        string[] keyNword = str.Split(new char[] {'#', '\n'} );
        string output = string.Format("Key - {0}, word - {1}", keyNword[0], keyNword[1]);
        Debug.Log(output);
}
        reader.Close();


Теперь вопрос к знатокам: можно ли как-то при каждой итерации цикла заполнять подряд строки структуры Strings? Заранее благодарю.
зы. строковый массив не предлагать

Re: Вопрос о локализации игры

СообщениеДобавлено: 17 фев 2019, 12:55
Jarico
Синтаксис:
Используется csharp

using System;
using System.Linq;
using UnityEngine;

public class Localication
{
//номер текста
public int loc_id = -1;
public string loc_text = "текст локализации";
}


public class LocalizationManager
{
public static List<Localization> m_Loc = new List<Localization>();

public static string GetLocalizationString(int loc_id)
{
return m_Loc.First(x => loc_id == x.loc_id).loc_text;
}

public static void Init()
{
//загружаешь из файла текст в формате json
m_Loc  = JsonUtility.FromJson< List<Localization>>(текст из файла);
}
}
 



Писал в блокноте но вроде должно работать...


Для редактора можно написать небольшую утилиту для оперативного добавления строк локализации...

Re: Вопрос о локализации игры

СообщениеДобавлено: 17 фев 2019, 22:04
Woolf
Странный малость подход. Зачем вам структура?
И чем вам не подходит Dictionary, он как раз и есть "ключ-значение"
Ну и в текстовых файлах принято разделять ключ/значение через =, а не через #
Через равно легче читается и понятнее структура. Хотя, конечно, это дело вкуса.

Re: Вопрос о локализации игры

СообщениеДобавлено: 17 фев 2019, 23:02
Jarico
Woolf писал(а):Через равно легче читается и понятнее структура. Хотя, конечно, это дело вкуса.


Мне лично побоку всегда было какой парсер использовать, в Unity есть Json парсер его и юзаю... Сейчас же не нулевые годы чтобы за размер файликов переживать :)

Вот если что еще один парсер... .INI
Синтаксис:
Используется csharp
https://stackoverflow.com/questions/217902/reading-writing-an-ini-file


Woolf писал(а):Странный малость подход. Зачем вам структура?


Можно дополнительную переменную добавить и записать в файл без нарушения структуры в виде Json

Re: Вопрос о локализации игры

СообщениеДобавлено: 18 фев 2019, 04:08
JodyRedlot
Woolf писал(а):И чем вам не подходит Dictionary, он как раз и есть "ключ-значение"

Да, спасибо большое. То, что нужно. Быть может, кому пригодится.
Синтаксис:
Используется csharp
public static Dictionary<string, string> s = new Dictionary<string, string>(0);
...
public static void LoadLang()
{
        StreamReader reader = new StreamReader("Assets/Resources/test.txt");
               
        while(!reader.EndOfStream)
        {
                string str = reader.ReadLine();
                string[] keyNword = str.Split(new char[] {'#', '\n'} );
                s.Add(keyNword[0], keyNword[1]);
        }
   
       reader.Close();
}
...
Debug.Log(s["NewGame"]);//Вывод: Новая игра
 


Ну и в текстовых файлах принято разделять ключ/значение через =, а не через #

Я решил использовать наиболее редкоиспользуемый символ для разделения, как мне кажется.

Re: Вопрос о локализации игры

СообщениеДобавлено: 18 фев 2019, 06:41
Woolf
Я решил использовать наиболее редкоиспользуемый символ для разделения, как мне кажется.

Будете ручками ланг-файлы редактировать (а вы будете), упоретесь )) В кашу же всё сольётся. Не нужно создавать на ровном месте себе проблему, используйте "равно", тем более, что в этом случае можно и какие-либо библиотечки для чтения ini поюзать, ну, или хоть и тот же самый JSON