Форум

Уведомления
Очистить все

[Other] Моддинг в Bannerlord: Локализация

 
Джеки Чан
Известный участник Модератор Гильдия переводчиков

Оригинал статьи: Перейти
Автор статьи:
Taleworld
На версию игры: Bannerlord e1.5.x
Последнее изменение статьи: 05 сентября 2020 года


Инструмент C# IDE (интегрированная среда разработки): Microsoft Visual Studio (не требуется для базовых модов)
Инструмент C# Decompiler (декомпилятор): dnSpy или dotPeek (не требуется для базовых модов)
Текстовые редакторы: Notepad++, Sublime Text, Visual Studio Code (не требуется для базовых модификаций)


ОПИСАНИЕ
Разработка локализуемого модуля

Любой игровой текст можно реализовать таким образом, чтобы его можно было локализовать. Для этого при разработке модуля следует придерживаться трех основных правил:

  1. Строки, которые могут быть видны в интерфейсе, должны храниться в объектах класса TextObject.
  2. Каждая такая строка должна иметь уникальный идентификатор (ID).
  3. Каждая локализуемая строка должна быть включена в файл std_module_strings_xml.xml в папке ...Mount & Blade II BannerlordModulesYourModNameModuleDataLanguages

Примечания по использованию TextObjects

Пожалуйста, рассмотрите возможность использования дополнительных свойств при настройке информации о сложных объектах в TextObject. Это может облегчить вашу жизнь и стать настоящей палочкой-выручалочкой для людей, которые будут переводить мод. Например, если вам нужно упомянуть персонажа в какой-либо строке, вы можете просто сохранить его имя в результате TextObject, и это поможет, но перевод строки на другие языки может стать сложнее. В качестве альтернативы вы можете сохранить в TextObject несколько свойств персонажа, включая Name и Gender. Тогда, даже если вам не нужен пол в этой конкретной строке на английском языке, его можно использовать в качестве условного фактора при переводе.

Вот пример использования свойств и условных выражений в строке TextObject

public const string conditionalString =
  "{=conditionalStringID}This proposal is on cooldown for {NUMBER_OF_DAYS} {?NUMBER_OF_DAYS.PLURAL_FORM}days{?}day{\\?}.";
    
public static readonly TextObject conditionalTextObject = new TextObject(conditionalString);
  
public static void SetNumericVariable(TextObject textObject, string variableKey, int variableValue)
{
  if (string.IsNullOrEmpty(variableKey))
  {
    return;
}
  TextObject explainedTextObject = new TextObject(variableValue);
  explainedTextObject.SetTextVariable("PLURAL_FORM", variableValue != 1 ? 1 : 0);
  if (textObject is null)
  {
    MBTextManager.SetTextVariable(variableKey, explainedTextObject);
  }
  else
  {
    textObject.SetTextVariable(variableKey, explainedTextObject);
  }
}

Вызов функции

SetNumericVariable(conditionalTextObject, "NUMBER_OF_DAYS", 21);
conditionalTextObject.ToString()

возвращает "This proposal is on cooldown for 21 days."

в то время как вызов

SetNumericVariable(conditionalTextObject, "NUMBER_OF_DAYS", 1);
conditionalTextObject.ToString()

возвращает "This proposal is on cooldown for 1 day."

Стоит отметить, что язык обработки игры по умолчанию - английский, поэтому при разработке рекомендуется использовать английские строки.

Примечания к идентификаторам строк

String ID - это строковый ключ произвольной длины и содержания без пробелов и специальных символов. Не рекомендуется использовать длинные строковые идентификаторы, поскольку это сказывается на производительности. Кроме того, идентификаторы строк являются глобальными, поэтому даже если две разные строки с одинаковым идентификатором строки будут созданы и использованы в разных игровых модулях, они все равно будут конфликтовать (и тогда могут произойти некоторые довольно неприятные вещи). Следовательно, не рекомендуется регулярно использовать семантически значимые ключи в качестве строковых идентификаторов. Вместо этого используйте для этого буквенно-цифровые строковые коды, которые выглядят следующим образом: {=zmR6sT03}. На данный момент TaleWords и большинство разработчиков игр используют 8-значные буквенно-цифровые строковые коды с помощью генерации случайных строковых идентификаторов. Вы можете использовать этот сервис для генерации случайных ключей: https://www.random.org/strings/. Это, однако, основа для дальнейшего размышления над этим вопросом для сообщества моддеров.

Любая локализуемая строка должна начинаться с идентификатора строки:

private const string exampleString = "{=stringID}Some text";
public static readonly TextObject exampleTextObject = new TextObject (exampleString);

Примечания к std_module_strings_xml 

Каждая локализуемая строка должна быть включена в файл std_module_strings_xml.xml в папке ..\Mount & Blade II Bannerlord\Modules\YourModName\ModuleData\Languages\. Язык игры по умолчанию - английский, и текстовый процессор ожидает, что каждая строка, которую вы определите в коде, будет английской. Поэтому создание std_module_strings_xml.xml с будет просто для справки - из него не будут загружаться тексты игр, но он может быть использован переводчиками модулей для создания их языковых версий (переводов).

Вот пример std_module_strings_xml.xml для вышеприведенного exampleString и conditionalString:

<?xml version="1.0" encoding="utf-8"?>
<base xmlns//www.w3.org/2001/XMLSchema-instance" xmlns//www.w3.org/2001/XMLSchema" type="string">
    <tags>
        <tag language="English" />
    </tags>
    <strings>
        <string id="stringID" text="Some text" />
        <string id="conditionalStringID" text="This proposal is on cooldown for {NUMBER_OF_DAYS} {?NUMBER_OF_DAYS.PLURAL_FORM}days{?}day{\?}." />      
    </strings>
</base>

Перевод игрового модуля 

Для перевода игрового модуля вам необходимо создать копию каждого XML-файла в папке ..\Mount & Blade II Bannerlord\Modules\ModName\ModuleData\Languages\

и поместить их в папку ..\Mount & Blade II Bannerlord\Modules\ModName\ModuleData\Languages\LanguageTagShort\ 

Тогда вам придется вручную изменить "English" в на язык перевода.

*Начиная с версии e.1.4.2, игра автоматически определяет идентификатор каждого языка из каждого файла каждого модуля и добавляет его в меню игры. В более ранних версиях, изменение языка в игре на новый могло привести к сбою, если этот идентификатор языка также не был добавлен в ...\Mount & Blade II Bannerlord\GUI\Fonts\Languages.xml.

Будьте осторожны с тем, что каждый идентификатор языка является отдельным объектом для игры, даже если они семантически означают один и тот же язык, поэтому, например, если у вас есть некоторые файлы xml, которые используют , они будут несовместимы с файлами xml, которые используют и только один из них будет использоваться (выбранный в настоящее время в настройках), в то время как каждая строка из другого набора вернется к языку по умолчанию.

После определения идентификатора языка каждая текстовая строка должна быть переведена с исходными идентификаторами строк и сохранением всех переменных. В приведенном выше примере:

<?xml version="1.0" encoding="utf-8"?>
<base xmlns//www.w3.org/2001/XMLSchema-instance" xmlns//www.w3.org/2001/XMLSchema" type="string">
    <tags>
        <tag language="Русский" />
    </tags>
    <strings>
        <string id="stringID" text="Какой-то текст" />
        <string id="conditionalStringID" text="Это предложение может быть внесено через {NUMBER_OF_DAYS} {?NUMBER_OF_DAYS.PLURAL_FORM}дней{?}день{\?}." />      
    </strings>
</base>

При переводе будьте осторожны - пробелы, пунктуация и использование символов верхнего или нижнего регистра могут иметь значение.

ОтветитьЦитата
Автор темы Размещено : 29.01.2022 17:03

Оставьте ответ

Имя автора

Электронная почта автора

Заголовок *

Мы используем cookie-файлы для наилучшего представления нашего сайта. Продолжая использовать этот сайт, вы соглашаетесь с использованием cookie-файлов.
Принять
Политика конфиденциальности