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

From AlliedModders Wiki
Jump to: navigation, search
m (Использование в плагине)
 
(4 intermediate revisions by the same user not shown)
Line 3: Line 3:
  
 
=Введение=
 
=Введение=
The SourceMod ML System is based off the following terms:
+
Система SourceMod ML базируется на следующих терминах:
*'''Languages''': Preset languages defined in <tt>configs\languages.cfg</tt>. If a language is not in this file, it <b>cannot be translated</b> until it is added and the in-memory translation cache rebuilt.
+
*'''Языки''': Предварительно заданные языки перевода устанавливаются в <tt>configs\languages.cfg</tt>. Если язык перевода отсутствует в этом файле, он <b>не может быть переведен</b> до тех пор, пока не будет добавлен в этот файл и обновлена кэш-память переводов.
*'''Phrases'''/'''Translation Keys''': Short, generic key phrases used to identify a set of translations. These reside in configuration files in the <tt>translations</tt> folder. These are called <tt>translation files</tt>.
+
*'''Фразы'''/'''Ключи перевода''': Короткие, общие ключевые фразы, используемые для определения набора переводов. Они находятся в конфигурационных файлах в папке <tt>translations</tt>. Они называются <tt>файлы перевода</tt>.
*'''Translations''': A given text translation of a phrase for a given language. These reside in a <tt>translation file</tt>.
+
*'''Переводы''': Содержат фразы текста перевода для данного языка. Они находятся в <tt>файлах перевода</tt>.
  
'''Note''': Languages and Phrases are both case sensitive.
+
'''Примечание''': Переводы и Фразы, чувствительны к регистру.
  
==File Format==
+
==Формат файла==
The ML Translation File format is in standard Valve configuration form. It is comprised of one master section, <tt>"Phrases</tt>,<tt>"</tt> which contains any number of named sub-sections. Each sub-section defines one named <tt>Phrase</tt>, which cannot itself have sub-sections. It allows the following properties:
+
Многоязычный формат файлов перевода содержится в стандартной конфигурационной форме от 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.
+
**'''Значение''': Языковой перевод строки.
  
Example:
+
Пример:
 
<pre>"Phrases"
 
<pre>"Phrases"
 
{
 
{
Line 23: Line 23:
 
{
 
{
 
"en" "Welcome to SourceMod"
 
"en" "Welcome to SourceMod"
"es" "Bienvenidos a SourceMod"
+
"ru" "Добро пожаловать в SourceMod"
 
}
 
}
 
}</pre>
 
}</pre>
  
In the above example, two translations are defined for the "Welcome" phrase - one for English, and one for Spanish. However, consider a phrase which needs certain words inserted, as in this contrived example:
+
В приведенном выше примере, два перевода определяется по имени фразы "Welcome" - одна для английского, и одна для русского языка. Вместе с тем, рассмотрим фразу, которая может вставлять определенные слова, как в этом примере:
 
<pre>"Phrases"
 
<pre>"Phrases"
 
{
 
{
Line 33: Line 33:
 
{
 
{
 
"en" "pants"
 
"en" "pants"
"es" "pantalones"
+
"ru" "трусы"
 
}
 
}
//INVALID EXAMPLE: "Bail's pants are on fire"
+
//НЕПРАВИЛЬНЫЙ ПРИМЕР: "Frenzzy трусы горят!"
 
"OnFire_plural"
 
"OnFire_plural"
 
{
 
{
 
"en" "%s's %s are on fire!"
 
"en" "%s's %s are on fire!"
"es" "¡Los %s de %s están en llamas!"
+
"ru" "%s %s горят!"
 
}
 
}
 
}</pre>
 
}</pre>
  
In the above example, the word orders have changed. English inserts the subject first, and the direct object second. Spanish associates ownership differently -- literally, ''the pants of Bail are on fire.'' This poses a problem for scripters, who always pass format parameters in one order. To solve this, the <tt>#format</tt> property was introduced. This pre-defines the order of format parameters. Example:
+
В приведенном Выше примере, порядок слов изменился. Фраза на английском вставляет объект первым, а фраза на русском предписывает объект вторым. На русском языке фраза должна выглядеть следующим образом: ''Трусы Frenzzy горят!''. Это создает проблему для скриптов, которые всегда просматривают формат параметров в одном порядке. Чтобы решить эту проблему, было введено свойство <tt>#format</tt>. Оно предопределяет порядок формата параметров. Пример:
 
<pre>"Phrases"
 
<pre>"Phrases"
 
{
 
{
//Example: "Bail's pants are on fire"
+
//Пример: "Трусы Frenzzy горят!"
 
"OnFire_plural"
 
"OnFire_plural"
 
{
 
{
 
"#format" "{1:s},{2:s}"
 
"#format" "{1:s},{2:s}"
 
"en" "{1}'s {2} are on fire!"
 
"en" "{1}'s {2} are on fire!"
"es" "¡Los {2} de {1} están en llamas"
+
"ru" "{2} {1} горят!"
 
}
 
}
//Example: "Hello, Bail!"
+
//Пример: "Привет, Frenzzy!"
 
"Hello"
 
"Hello"
 
{
 
{
 
"#format" "{1:s}"
 
"#format" "{1:s}"
 
"en" "Hello, {1}"
 
"en" "Hello, {1}"
"es" "Hola, {1}"
+
"ru" "Привет, {1}"
 
}
 
}
 
}</pre>
 
}</pre>
  
The format string is comprised of comma delimited sections, each section enclosed in brackets. Each section has an ''index'' and a ''format specifier'', which are separated with a colon. Format specifiers follow the general rules of [[Format Class Functions (SourceMod Scripting)|formatting]], however, only the following types are currently allowed:
+
Формат строки состоит из разделов которые разделяются запятыми, а каждый раздел заключен в скобках. Каждый раздел имеет ''индекс'' и ''спецификатор формата'', которые разделяются двоеточиями. Спецификаторы формата следуют общим правилам [[Ru:Format Class Functions (SourceMod Scripting)|форматирования]], однако в настоящее время, они поддерживаются только в следующих видах:
*'''d'''/'''i''': Digits/Integer display
+
*'''d'''/'''i''': Отображение десятичных/целых значений
*'''x''': Hexadecimal display
+
*'''x''': Отображение шестнадцатеричных значений
*'''f''': Floating point display
+
*'''f''': Отображение числа с плавающей точкой
*'''s''': String display
+
*'''s''': Отображение строки
*'''c''': Character display (UTF-8 compatible)
+
*'''c''': Отображение символов (поддерживается UTF-8)
  
Note that currently, the special "%T" format type is not allowed inside a language translation string.
+
Заметим, что в настоящее время специальный формат типа "%T" не допускает внутри языка перевод строки.
  
=Usage in a Plugin=
+
=Использование в плагине=
Plugins must call <tt>LoadTranslations</tt> 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.
+
Плагины должны вызывать функцию <tt>LoadTranslations</tt> на каждый файл с переводом, который они хотят использовать. Если это не будет сделано, то никакие переводы работать не будут, даже если другой плагин загрузил те же самые файлы. Это поможет предотвратить конфликты фраз между плагинами.
  
'''Note''': Language files are reloaded every mapchange. Even if the plugin gets reloaded, the translation file stays cached until next map.
+
'''Примечание''': языковые файлы загружаться после каждой смены карты (mapchange). Даже если плагин будет перезагружен, кэшированный перевод файлов остается до следующей карты.
  
Inline translation works in any [[Format Class Functions (SourceMod Scripting)|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:
+
Встроенный перевод работает в любых [[Ru:Format Class Functions (SourceMod Scripting)|формат-классовых]] функциях. Вводится новый спецификатор формата '%T', который указывает формат вставки определенного перевода фразы. В отличие от всех других спецификаторов формата, он требует как минимум двух параметров:
*'''1st Parameter''': A string containing the phrase to be translated.
+
*'''1-ый параметр''': Строка, содержащая фразу для перевода.
*'''2nd Parameter''': One of the following:
+
*'''2-ой параметр''': Одно из следующих:
**The <tt>LANG_SERVER</tt> constant, which specifies a translation to the default language.
+
**Постоянная <tt>LANG_SERVER</tt>, которая определяет язык перевода по умолчанию.
**A player ID constant, which specifies a translation to the player's set language.
+
**Константа player ID, которая определяет язык перевода установленный игроком.
*'''3rd Parameter and higher''': Inputs into the phrase's format specifiers, if necessary.
+
*'''3-ий параметр и больше''': Вывод во фразе спецификаторов формата, если это необходимо.
  
Examples of this are:
+
Примерами являются:
 
<pawn>new String:name[32], String:buffer[128];
 
<pawn>new String:name[32], String:buffer[128];
 
GetClientName(client, name, sizeof(name));
 
GetClientName(client, name, sizeof(name));
Line 89: Line 89:
 
Format(buffer, sizeof(buffer), "[SourceMod] %T", "Hello", LANG_SERVER, name);</pawn>
 
Format(buffer, sizeof(buffer), "[SourceMod] %T", "Hello", LANG_SERVER, name);</pawn>
  
A breakdown of the format parameters:
+
Формат параметров в отдельности:
*<tt>"Hello"</tt>: The phrase to translate.
+
*<tt>"Hello"</tt>: Фраза для перевода.
*<tt>client/LANG_SERVER</tt>: Who to translate the phrase to.
+
*<tt>client/LANG_SERVER</tt>: Кто получит перевод фразы.
 
*<tt>name</tt>: The "Hello" phrase requires one string, so this will appear in the translated phrase.
 
*<tt>name</tt>: 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:
+
Наконец, существует вторая форма однострочного перевода, используя '%t'. Она допускается только в функциях, которые действуют непосредственно на одного или нескольких клиентов. Она исключает второй параметр, и использует указанного клиента. Пример:
 
<pawn>PrintToChat(client, "[SourceMod] %t", "Hello", name);</pawn>
 
<pawn>PrintToChat(client, "[SourceMod] %t", "Hello", name);</pawn>
  
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 <tt>PrintToChat</tt>. However, in functions which are not "player directed," such as <tt>Format</tt> or <tt>PrintToServer</tt>, only '%T' can be used.
+
Как видно из этого примера, Мы не должны указывать индекс клиента больше, чем один раз. Таким образом, как правило, более удобны для использования ограниченные версии '%t' в функциях, таких как <tt>PrintToChat</tt>. Однако, в функциях, которые не "управляют игроком", таких, как <tt>Format</tt> или <tt>PrintToServer</tt>, может быть использован только '%T'.
  
 
[[Category:Ru:SourceMod Scripting]]
 
[[Category:Ru:SourceMod Scripting]]

Latest revision as of 05:34, 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!"
		"ru"		"{2} {1} горят!"
	}
	//Пример: "Привет, Frenzzy!"
	"Hello"
	{
		"#format"	"{1:s}"
		"en"		"Hello, {1}"
		"ru"		"Привет, {1}"
	}
}

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

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

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

Использование в плагине

Плагины должны вызывать функцию LoadTranslations на каждый файл с переводом, который они хотят использовать. Если это не будет сделано, то никакие переводы работать не будут, даже если другой плагин загрузил те же самые файлы. Это поможет предотвратить конфликты фраз между плагинами.

Примечание: языковые файлы загружаться после каждой смены карты (mapchange). Даже если плагин будет перезагружен, кэшированный перевод файлов остается до следующей карты.

Встроенный перевод работает в любых формат-классовых функциях. Вводится новый спецификатор формата '%T', который указывает формат вставки определенного перевода фразы. В отличие от всех других спецификаторов формата, он требует как минимум двух параметров:

  • 1-ый параметр: Строка, содержащая фразу для перевода.
  • 2-ой параметр: Одно из следующих:
    • Постоянная LANG_SERVER, которая определяет язык перевода по умолчанию.
    • Константа player ID, которая определяет язык перевода установленный игроком.
  • 3-ий параметр и больше: Вывод во фразе спецификаторов формата, если это необходимо.

Примерами являются:

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);

Формат параметров в отдельности:

  • "Hello": Фраза для перевода.
  • client/LANG_SERVER: Кто получит перевод фразы.
  • name: The "Hello" phrase requires one string, so this will appear in the translated phrase.

Наконец, существует вторая форма однострочного перевода, используя '%t'. Она допускается только в функциях, которые действуют непосредственно на одного или нескольких клиентов. Она исключает второй параметр, и использует указанного клиента. Пример:

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

Как видно из этого примера, Мы не должны указывать индекс клиента больше, чем один раз. Таким образом, как правило, более удобны для использования ограниченные версии '%t' в функциях, таких как PrintToChat. Однако, в функциях, которые не "управляют игроком", таких, как Format или PrintToServer, может быть использован только '%T'.