Difference between revisions of "Ru:Translations (SourceMod Scripting)"

From AlliedModders Wiki
Jump to: navigation, search
(Введение)
(Формат файла)
Line 12: Line 12:
 
==Формат файла==
 
==Формат файла==
 
Многоязычный формат файлов перевода содержится в стандартной конфигурационной форме от Valve. Она состоит из одного главного раздела, <tt>"Phrases"</tt>, который содержит любое число имен подразделов. Каждый подраздел определяется одним именем <tt>Фразы</tt>, и не могут иметь в себе подразделы. Они обладают следующими свойствами:
 
Многоязычный формат файлов перевода содержится в стандартной конфигурационной форме от Valve. Она состоит из одного главного раздела, <tt>"Phrases"</tt>, который содержит любое число имен подразделов. Каждый подраздел определяется одним именем <tt>Фразы</tt>, и не могут иметь в себе подразделы. Они обладают следующими свойствами:
*'''Key''': "#format"
+
*'''Ключ''': "#format"
**'''Value''': Comma-delimited, ordered pairs of indexes and format strings.
+
**'''Значение''': Разделенные запятыми, пары индексов и форматов
*'''Key''': Two-letter language code.
+
*'''Ключ''': Двух символьный код языка.
**'''Value''': Language translation string.
+
**'''Значение''': Языковой перевод строки.
  
 
Пример:
 
Пример:

Revision as of 04:48, 30 December 2008

SourceMod, так же как и его предшественник AMX Mod X, содержит встроенный Multi-Lingual Translation layer ("ML"). Система ML является одной из дополнительных SourceMod систем, предназначенная для повышения гибкости платформы, насколько это возможно. Она полностью поддерживает UTF-8.

Введение

Система SourceMod ML базируется на следующих терминах:

  • Языки: Предварительно заданные языки перевода устанавливаются в configs\languages.cfg. Если язык перевода отсутствует в этом файле, он не может быть переведен до тех пор, пока не будет добавлен в этот файл и обновлена кэш-память переводов.
  • Фразы/Ключи перевода: Короткие, общие ключевые фразы, используемые для определения набора переводов. Они находятся в конфигурационных файлах в папке translations. Они называются файлы перевода.
  • Переводы: Содержат фразы текста перевода для данного языка. Они находятся в файлах перевода.

Примечание: Переводы и Фразы, чувствительны к регистру.

Формат файла

Многоязычный формат файлов перевода содержится в стандартной конфигурационной форме от Valve. Она состоит из одного главного раздела, "Phrases", который содержит любое число имен подразделов. Каждый подраздел определяется одним именем Фразы, и не могут иметь в себе подразделы. Они обладают следующими свойствами:

  • Ключ: "#format"
    • Значение: Разделенные запятыми, пары индексов и форматов
  • Ключ: Двух символьный код языка.
    • Значение: Языковой перевод строки.

Пример:

"Phrases"
{
	"Welcome"
	{
		"en"		"Welcome to SourceMod"
		"ru"		"Добро пожаловать в SourceMod"
	}
}

В приведенном выше примере, два перевода определяется по имени фразы "Welcome" - одна для английского, и одна для русского языка. Вместе с тем, рассмотрим фразу, которая может вставлять определенные слова, как в этом примере:

"Phrases"
{
	"Pants"
	{
		"en"		"pants"
		"ru"		"трусы"
	}
	//НЕПРАВИЛЬНЫЙ ПРИМЕР: "Frenzzy трусы горят!"
	"OnFire_plural"
	{
		"en"		"%s's %s are on fire!"
		"ru"		"%s %s горят!"
	}
}

В приведенном Выше примере, порядок слов изменился. Фраза на английском вставляет объект первым, а фраза на русском предписывает объект вторым. На русском языке фраза должна выглядеть следующим образом: Трусы Frenzzy горят!. Это создает проблему для скриптов, которые всегда просматривают формат параметров в одном порядке. Чтобы решить эту проблему, было введено свойство #format. Оно предопределяет порядок формата параметров. Пример:

"Phrases"
{
	//Пример: "Frenzzy трусы горят"
	"OnFire_plural"
	{
		"#format"	"{1:s},{2:s}"
		"en"		"{1}'s {2} are on fire!"
		"es"		"{2} {1} горят!"
	}
	//Пример: "Привет, Frenzzy!"
	"Hello"
	{
		"#format"	"{1:s}"
		"en"		"Hello, {1}"
		"es"		"Привет, {1}"
	}
}

Формат строки состоит из разделов которые разделяются запятыми, а каждый раздел заключен в скобках. Каждый раздел имеет индекс и спецификатор формата, которые разделяются двоеточиями. Спецификаторы формата следуют общим правилам форматирования, однако в настоящее время, они поддерживаются только в следующих видах:

  • d/i: Отображение десятичных/целых значений
  • x: Отображение шестнадцатеричных значений
  • f: Отображение числа с плавающей точкой
  • s: Отображение строки
  • c: Отображение символов (поддерживается UTF-8)

Заметим, что в настоящее время специальный формат типа "%T" не допускает внутри языка перевод строки.

Usage in a Plugin

Plugins must call LoadTranslations on each translation file they wish to use. Failure to do so will cause any translations to fail, even if another plugin loads the same file. This is to help prevent phrase-clashes between plugins.

Note: Language files are reloaded every mapchange. Even if the plugin gets reloaded, the translation file stays cached until next map.

Inline translation works in any format-class of functions. A new format specifier, '%T', is introduced, which instructs the format routine to insert a translated phrase. Unlike all other format specifiers, this requires a minimum of two parameters:

  • 1st Parameter: A string containing the phrase to be translated.
  • 2nd Parameter: One of the following:
    • The LANG_SERVER constant, which specifies a translation to the default language.
    • A player ID constant, which specifies a translation to the player's set language.
  • 3rd Parameter and higher: Inputs into the phrase's format specifiers, if necessary.

Examples of this are:

new String:name[32], String:buffer[128];
GetClientName(client, name, sizeof(name));
PrintToChat(client, "[SourceMod] %T", "Hello", client, name);
Format(buffer, sizeof(buffer), "[SourceMod] %T", "Hello", LANG_SERVER, name);

A breakdown of the format parameters:

  • "Hello": The phrase to translate.
  • client/LANG_SERVER: Who to translate the phrase to.
  • name: The "Hello" phrase requires one string, so this will appear in the translated phrase.

Lastly, there is a second form of inline translation, using '%t'. This is only allowed in functions which act directly on one or more clients. It eliminates the second parameter, and uses the original client specified. Example:

PrintToChat(client, "[SourceMod] %t", "Hello", name);

As you can see from this example, we did not have to specify the client index more than once. Thus, it is usually more convenient to use the limited '%t' version in functions such as PrintToChat. However, in functions which are not "player directed," such as Format or PrintToServer, only '%T' can be used.