<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://stalkerin.gameru.net/wiki/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://stalkerin.gameru.net/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Serge%21</id>
		<title>S.T.A.L.K.E.R. Inside Wiki - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://stalkerin.gameru.net/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Serge%21"/>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/Serge!"/>
		<updated>2026-04-29T23:33:19Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.22.6</generator>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%A3%D1%87%D0%B8%D0%BC_S.T.A.L.K.E.R._%D0%A2%D0%A7_%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%BE%D0%BC%D1%83_%D1%8F%D0%B7%D1%8B%D0%BA%D1%83</id>
		<title>Учим S.T.A.L.K.E.R. ТЧ русскому языку</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A3%D1%87%D0%B8%D0%BC_S.T.A.L.K.E.R._%D0%A2%D0%A7_%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%BE%D0%BC%D1%83_%D1%8F%D0%B7%D1%8B%D0%BA%D1%83"/>
				<updated>2015-11-25T12:35:47Z</updated>
		
		<summary type="html">&lt;p&gt;Serge!: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;За много лет игры все уже почти привыкли, что сохранить текущее состояние в процессе игры мы можем только в файле с английской транскрипцией. Мне это не очень нравится и поэтому предлагаю способ научить ТЧ сохранить файлы с именами на русском или (это уже самостоятельно) на любом другом языке.&lt;br /&gt;
Это не сложно и справиться может каждый, кто знает, что такое есть текстовый редактор.&lt;br /&gt;
Для решения нашей задачи нам понадобятся файлы: &amp;lt;b&amp;gt;ui_save_dialog.script&amp;lt;/b&amp;gt; и &amp;lt;b&amp;gt;ui_mm_save_dlg.xml&amp;lt;/b&amp;gt; и ещё один, который мы создадим сами, с именем &amp;lt;b&amp;gt;ui_save_dlg_rus.script&amp;lt;/b&amp;gt;. Первый и третий должны находиться в папке gamedata\scripts\, а второй в gamedata\config\ui\. Если их там нет или вообще нет папки gamedata, то значит Вам придётся извлечь их (1 и 2) из архивов дистрибутива (файлы gamedata/dbX) или отказаться от затеи русификации. Как распаковать архивы дистрибутива я не буду, т.к. про это не рассказали только самые ленивые, поэтому считаем, что эти файлы Вам доступны.&lt;br /&gt;
&lt;br /&gt;
Начинаем.&lt;br /&gt;
Сначала проделаем маленькую, но необходимую работу, а именно: определим индикатор/переключатель текущего языка ввода. Для этого открываем файл &amp;lt;b&amp;gt;ui_mm_save_dlg.xml&amp;lt;/b&amp;gt; и в конец тега form добавим строчки, чтобы получилось так:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
        &amp;lt;!-- оставляем исходное --&amp;gt;&lt;br /&gt;
	&amp;lt;st_lang x=&amp;quot;280&amp;quot; y=&amp;quot;400&amp;quot; width=&amp;quot;30&amp;quot; height=&amp;quot;20&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text font=&amp;quot;graffiti22&amp;quot; align=&amp;quot;c&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;text_color&amp;gt; &amp;lt;e r=&amp;quot;227&amp;quot; g=&amp;quot;199&amp;quot; b=&amp;quot;178&amp;quot;/&amp;gt; &amp;lt;h r=&amp;quot;255&amp;quot; g=&amp;quot;0&amp;quot; b=&amp;quot;0&amp;quot;/&amp;gt; &amp;lt;/text_color&amp;gt;&lt;br /&gt;
	&amp;lt;/st_lang&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Закрываем файл. Он нам больше не понадобится.&lt;br /&gt;
Теперь создадим таблицу перекодировки английских символов в кириллицу, которую запишем в наш 3й файл &amp;lt;b&amp;gt;ui_save_dlg_rus.script&amp;lt;/b&amp;gt;.&lt;br /&gt;
Выглядит эта таблица так: &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local tbl_ansii = {&lt;br /&gt;
        [ 034 ] = 221, -- &amp;quot; --&amp;gt; Э&lt;br /&gt;
        [ 035 ] = 185, -- # --&amp;gt; №&lt;br /&gt;
	[ 039 ] = 253, -- ' --&amp;gt; э&lt;br /&gt;
	[ 044 ] = 225, -- , --&amp;gt; б&lt;br /&gt;
	[ 046 ] = 254, -- . --&amp;gt; ю&lt;br /&gt;
	[ 047 ] = 046, -- / --&amp;gt; .&lt;br /&gt;
	[ 058 ] = 198, -- : --&amp;gt; Ж&lt;br /&gt;
	[ 059 ] = 230, -- ; --&amp;gt; ж&lt;br /&gt;
	[ 060 ] = 193, -- &amp;lt; --&amp;gt; Б&lt;br /&gt;
	[ 062 ] = 222, -- &amp;gt; --&amp;gt; Ю&lt;br /&gt;
	[ 065 ] = 212, -- A --&amp;gt; Ф&lt;br /&gt;
	[ 066 ] = 200, -- B --&amp;gt; И&lt;br /&gt;
	[ 067 ] = 209, -- C --&amp;gt; С&lt;br /&gt;
	[ 068 ] = 194, -- D --&amp;gt; В&lt;br /&gt;
	[ 069 ] = 211, -- E --&amp;gt; У&lt;br /&gt;
	[ 070 ] = 192, -- F --&amp;gt; А&lt;br /&gt;
	[ 071 ] = 207, -- G --&amp;gt; П&lt;br /&gt;
	[ 072 ] = 208, -- H --&amp;gt; Р&lt;br /&gt;
	[ 073 ] = 216, -- I --&amp;gt; Ш&lt;br /&gt;
	[ 074 ] = 206, -- J --&amp;gt; О&lt;br /&gt;
	[ 075 ] = 203, -- K --&amp;gt; Л&lt;br /&gt;
	[ 076 ] = 196, -- L --&amp;gt; Д&lt;br /&gt;
	[ 077 ] = 220, -- M --&amp;gt; Ь&lt;br /&gt;
	[ 078 ] = 210, -- N --&amp;gt; Т&lt;br /&gt;
	[ 079 ] = 217, -- O --&amp;gt; Щ&lt;br /&gt;
	[ 080 ] = 199, -- P --&amp;gt; З&lt;br /&gt;
	[ 081 ] = 201, -- Q --&amp;gt; Й&lt;br /&gt;
	[ 082 ] = 202, -- R --&amp;gt; К&lt;br /&gt;
	[ 083 ] = 219, -- S --&amp;gt; Ы&lt;br /&gt;
	[ 084 ] = 197, -- T --&amp;gt; Е&lt;br /&gt;
	[ 085 ] = 195, -- U --&amp;gt; Г&lt;br /&gt;
	[ 086 ] = 204, -- V --&amp;gt; М&lt;br /&gt;
	[ 087 ] = 214, -- W --&amp;gt; Ц&lt;br /&gt;
	[ 088 ] = 215, -- X --&amp;gt; Ч&lt;br /&gt;
	[ 089 ] = 205, -- Y --&amp;gt; Н&lt;br /&gt;
	[ 090 ] = 223, -- Z --&amp;gt; Я&lt;br /&gt;
	[ 091 ] = 245, -- [ --&amp;gt; х&lt;br /&gt;
	[ 093 ] = 250, -- ] --&amp;gt; ъ&lt;br /&gt;
	[ 097 ] = 244, -- a --&amp;gt; ф&lt;br /&gt;
	[ 098 ] = 232, -- b --&amp;gt; и&lt;br /&gt;
	[ 099 ] = 241, -- c --&amp;gt; с&lt;br /&gt;
	[ 100 ] = 226, -- d --&amp;gt; в&lt;br /&gt;
	[ 101 ] = 243, -- e --&amp;gt; у&lt;br /&gt;
	[ 102 ] = 224, -- f --&amp;gt; а&lt;br /&gt;
	[ 103 ] = 239, -- g --&amp;gt; п&lt;br /&gt;
	[ 104 ] = 240, -- h --&amp;gt; р&lt;br /&gt;
	[ 105 ] = 248, -- i --&amp;gt; ш&lt;br /&gt;
	[ 106 ] = 238, -- j --&amp;gt; о&lt;br /&gt;
	[ 107 ] = 235, -- k --&amp;gt; л&lt;br /&gt;
	[ 108 ] = 228, -- l --&amp;gt; д&lt;br /&gt;
	[ 109 ] = 252, -- m --&amp;gt; ь&lt;br /&gt;
	[ 110 ] = 242, -- n --&amp;gt; т&lt;br /&gt;
	[ 111 ] = 249, -- o --&amp;gt; щ&lt;br /&gt;
	[ 112 ] = 231, -- p --&amp;gt; з&lt;br /&gt;
	[ 113 ] = 233, -- q --&amp;gt; й&lt;br /&gt;
	[ 114 ] = 234, -- r --&amp;gt; к&lt;br /&gt;
	[ 115 ] = 251, -- s --&amp;gt; ы&lt;br /&gt;
	[ 116 ] = 229, -- t --&amp;gt; е&lt;br /&gt;
	[ 117 ] = 227, -- u --&amp;gt; г&lt;br /&gt;
	[ 118 ] = 236, -- v --&amp;gt; м&lt;br /&gt;
	[ 119 ] = 246, -- w --&amp;gt; ц&lt;br /&gt;
	[ 120 ] = 247, -- x --&amp;gt; ч&lt;br /&gt;
	[ 121 ] = 237, -- y --&amp;gt; н&lt;br /&gt;
	[ 122 ] = 255, -- z --&amp;gt; я&lt;br /&gt;
	[ 123 ] = 213, -- { --&amp;gt; Х&lt;br /&gt;
	[ 125 ] = 218, -- } --&amp;gt; Ъ&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И напоследок откорректируем скрипт диалога сохранения. Для этого открываем в редакторе файл &amp;lt;b&amp;gt;ui_save_dialog.script&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
1. Вверху, сразу под комментариями описания скрипта, определяем несколько переменных: &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local t_lang,  edb_Pos, edb_Str = ui_save_dlg_rus.tbl_ansii, 1, {}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
где: t_lang – таблица перекодировки, edb_Pos – позиция курсора в поле EditBox (инициируется 1) и edb_Str – массив, в котором мы будем сохранять символы вводимого текста.&lt;br /&gt;
&lt;br /&gt;
2. Создадим индикатор текущего языка ввода текста.&lt;br /&gt;
&lt;br /&gt;
Договоримся, что переключать раскладку будем щелчком левой кнопки мыши по индикатору или клавишей левый-Ctrl (причем она будет работать как триггер), а переключать режим временного изменения языка ввода будем при нажатой и удерживаемой клавише левый-Alt.&lt;br /&gt;
Для этого в методе &amp;lt;b&amp;gt;save_dialog:InitControls()&amp;lt;/b&amp;gt; в самом конце вставим:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
self.ind_lan = xml:Init3tButton(&amp;quot;form:st_lang&amp;quot;, self.form)&lt;br /&gt;
self:Register(self.ind_lan, &amp;quot;button_lang&amp;quot;)&lt;br /&gt;
self.ind_lan:SetText(&amp;quot;Рус&amp;quot;)&lt;br /&gt;
self.mode_lang = true&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
где: self.mode_lang - флаг текущего языка ввода (true - русский, false - английский)&lt;br /&gt;
Всё, переключатель языка ввода мы создали, теперь надо обеспечить его функционирование.&lt;br /&gt;
Для этого в функцию &amp;lt;b&amp;gt;InitCallBacks()&amp;lt;/b&amp;gt; вставим строку:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
self:AddCallback(&amp;quot;button_lang&amp;quot;, ui_events.BUTTON_CLICKED, self.OnChg_lan, self)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
а этим под блоком вставляем функцию:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function save_dialog:OnChg_lan()&lt;br /&gt;
    self.mode_lang = not self.mode_lang&lt;br /&gt;
    if self.mode_lang then self.ind_lan:SetText(&amp;quot;Рус&amp;quot;)&lt;br /&gt;
    else self.ind_lan:SetText(&amp;quot;Eng&amp;quot;) end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Здесь всё ясно - сначала инвертируем флаг текущего языка ввода и потом меняем текст индикатора.&lt;br /&gt;
&lt;br /&gt;
Отлавливать факт переключения языка ввода и сам ввод в поле имени файла будем в системном прерывании &amp;lt;b&amp;gt;save_dialog:OnKeyboard(dik, keyboard_action)&amp;lt;/b&amp;gt;. Для этого добавим туда свои строки, чтобы в итоге получилось так:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function save_dialog:OnKeyboard(dik, keyboard_action)  --virtual function&lt;br /&gt;
    ui_base_dialog.base_dialog.OnKeyboard(self,dik,keyboard_action)&lt;br /&gt;
    DIK_RETURN = 28&lt;br /&gt;
    WINDOW_KEY_PRESSED = 6&lt;br /&gt;
    if dik == DIK_RETURN and keyboard_action == WINDOW_KEY_PRESSED then &lt;br /&gt;
        self:OnButton_ok_clicked()&lt;br /&gt;
        self.owner:Show(true)&lt;br /&gt;
        elseif keyboard_action == ui_events.WINDOW_KEY_PRESSED then&lt;br /&gt;
        if dik == DIK_keys.DIK_LCONTROL or dik == DIK_keys.DIK_LMENU then&lt;br /&gt;
            self:OnChg_lan()&lt;br /&gt;
        elseif dik == DIK_keys.DIK_LEFT then&lt;br /&gt;
            if edb_Pos &amp;gt; 1 then edb_Pos = edb_Pos - 1 end&lt;br /&gt;
        elseif dik == DIK_keys.DIK_RIGHT then&lt;br /&gt;
            if edb_Pos &amp;lt;= #edb_Str then edb_Pos = edb_Pos + 1 end&lt;br /&gt;
        elseif dik == DIK_keys.DIK_DELETE then&lt;br /&gt;
            if edb_Pos &amp;lt;= #edb_Str then table.remove(edb_Str,edb_Pos) end&lt;br /&gt;
        elseif dik == DIK_keys.DIK_BACK then&lt;br /&gt;
            if edb_Pos &amp;gt; 1 then edb_Pos = edb_Pos-1 end&lt;br /&gt;
            table.remove(edb_Str,edb_Pos)&lt;br /&gt;
        elseif     (dik &amp;gt;= 2  and dik &amp;lt;= 13) or &lt;br /&gt;
                        (dik &amp;gt;= 16 and dik &amp;lt;= 27) or &lt;br /&gt;
                        (dik &amp;gt;= 30 and dik &amp;lt;= 40) or&lt;br /&gt;
                        (dik &amp;gt;= 44 and dik &amp;lt;= 53) or&lt;br /&gt;
                        dik == 57 or &lt;br /&gt;
                        (dik &amp;gt;= 71 and dik &amp;lt;= 83) then self:OnEdit_CHANGED()&lt;br /&gt;
        end&lt;br /&gt;
    elseif keyboard_action == ui_events.WINDOW_KEY_RELEASED then&lt;br /&gt;
        if dik == DIK_keys.DIK_LMENU then&lt;br /&gt;
                self:OnChg_lan()&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return true&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь всё достаточно просто. При переключении языка вызывается метод &amp;lt;b&amp;gt;self:OnChg_lan()&amp;lt;/b&amp;gt;. При перемещении стрелками проверяем новое положение курсора и, если оно в пределах строки, то запоминаем его позицию. При удалении символа из строки удаляем соответствующий элемент из массива копии строки и опять же запоминаем текущую позицию ввода. При вводе текста  отлавливаются прерывания от всех клавиш с печатными символами и, если такое обнаружено, то вызывается функция обработчик, т.е. &amp;lt;b&amp;gt;OnEdit_CHANGED()&amp;lt;/b&amp;gt;. &amp;lt;i&amp;gt;Обратите внимание, что мы даже не пытаемся отловить ввод буквы ‘ё’, т.к. на этой же клавише размещена тильда ‘~’, которую движок «сталкера» обрабатывает специальным образом для вывода окна консоли.&amp;lt;/i&amp;gt;&lt;br /&gt;
И так, если мы зафиксировали факт нажатия клавиши с печатным символом, то вызывается функция &amp;lt;b&amp;gt;self:OnEdit_CHANGED&amp;lt;/b&amp;gt;, но её пока нет. Вот ею и займёмся.&lt;br /&gt;
&lt;br /&gt;
Сразу под созданной нами ранее &amp;lt;b&amp;gt;save_dialog:OnChg_lan()&amp;lt;/b&amp;gt; вставим ещё одну функцию:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function save_dialog:OnEdit_CHANGED()&lt;br /&gt;
    local str_edit = self:GetEditBox(&amp;quot;edit_filename&amp;quot;)   -- /1&lt;br /&gt;
    local sim = str_edit:GetText():match ('.',edb_Pos)  -- /2&lt;br /&gt;
    local cls = self.mode_lang and t_lang[sim:byte()]   -- /3&lt;br /&gt;
    sim = cls and string.char(cls) or sim               -- /4&lt;br /&gt;
    table.insert(edb_Str,edb_Pos,sim)                   -- /5&lt;br /&gt;
    edb_Pos = #edb_Str + 1                              -- /6&lt;br /&gt;
    str_edit:SetText(table.concat(edb_Str))             -- /7&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь тоже нет особых сложностей, но, тем не менее, прокомментируем наши действия.&lt;br /&gt;
Подключаемся к контролу EditBox (1) и получаем символ, находящийся в текущей позиции ввода (2). Если включен режим кириллицы, то ищем код переданного движком символа (он всегда английский) в таблице перекодировки и при его наличии получаем соответствующий код русского символа (3). Если код найден, то подменяем английский символ русским, а если нет, то оставляем всё как есть (4). Заносим полученный символ в массив копии строки ввода в соответствии со значение текущей позиции курсора (5). Устанавливаем новую текущую позиции ввода (6), преобразуем массив символов в строку и возвращаем её в поле ввода (7).&lt;br /&gt;
&lt;br /&gt;
Если Вы всё проделали правильно, то теперь можете вводить имя сохраняемого файла в английской, русской или смешанной кодировке, а также корректировать вводимый текст без искажения его синтаксиса.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Послесловие:&amp;lt;/u&amp;gt;&lt;br /&gt;
Этот алгоритм имеет отличие от стандартной обработки строки редактирования, которое выражается в том, что при вставке символа в середину строки, позиция ввода следующего символа всегда устанавливается в её конец, тогда как в “штатной” – текущей становится следующая позиция. В этой ситуации есть свой плюс и свой минус, однако в любом случае, как побороть это, я просто не знаю.&lt;/div&gt;</summary>
		<author><name>Serge!</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%A3%D1%87%D0%B8%D0%BC_S.T.A.L.K.E.R._%D0%A2%D0%A7_%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%BE%D0%BC%D1%83_%D1%8F%D0%B7%D1%8B%D0%BA%D1%83</id>
		<title>Учим S.T.A.L.K.E.R. ТЧ русскому языку</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A3%D1%87%D0%B8%D0%BC_S.T.A.L.K.E.R._%D0%A2%D0%A7_%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%BE%D0%BC%D1%83_%D1%8F%D0%B7%D1%8B%D0%BA%D1%83"/>
				<updated>2015-11-25T12:22:34Z</updated>
		
		<summary type="html">&lt;p&gt;Serge!: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;За много лет игры все уже почти привыкли, что сохранить текущее состояние в процессе игры мы можем только в файле с английской транскрипцией. Мне это не очень нравится и поэтому предлагаю способ научить ТЧ сохранить файлы с именами на русском или (это уже самостоятельно) на любом другом языке.&lt;br /&gt;
Это не сложно и справиться может каждый, кто знает, что такое есть текстовый редактор.&lt;br /&gt;
Для решения нашей задачи нам понадобятся файлы: &amp;lt;b&amp;gt;ui_save_dialog.script&amp;lt;/b&amp;gt; и &amp;lt;b&amp;gt;ui_mm_save_dlg.xml&amp;lt;/b&amp;gt; и ещё один, который мы создадим сами, с именем &amp;lt;b&amp;gt;ui_save_dlg_rus.script&amp;lt;/b&amp;gt;. Первый и третий должны находиться в папке gamedata\scripts\, а второй в gamedata\config\ui\. Если их там нет или вообще нет папки gamedata, то значит Вам придётся извлечь их (1 и 2) из архивов дистрибутива (файлы gamedata/dbX) или отказаться от затеи русификации. Как распаковать архивы дистрибутива я не буду, т.к. про это не рассказали только самые ленивые, поэтому считаем, что эти файлы Вам доступны.&lt;br /&gt;
&lt;br /&gt;
Начинаем.&lt;br /&gt;
Сначала проделаем маленькую, но необходимую работу, а именно: определим индикатор/переключатель текущего языка ввода. Для этого открываем файл &amp;lt;b&amp;gt;ui_mm_save_dlg.xml&amp;lt;/b&amp;gt; и в конец тега form добавим строчки, чтобы получилось так:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
        &amp;lt;!-- оставляем исходное --&amp;gt;&lt;br /&gt;
	&amp;lt;st_lang x=&amp;quot;280&amp;quot; y=&amp;quot;400&amp;quot; width=&amp;quot;30&amp;quot; height=&amp;quot;20&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text font=&amp;quot;graffiti22&amp;quot; align=&amp;quot;c&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;text_color&amp;gt; &amp;lt;e r=&amp;quot;227&amp;quot; g=&amp;quot;199&amp;quot; b=&amp;quot;178&amp;quot;/&amp;gt; &amp;lt;h r=&amp;quot;255&amp;quot; g=&amp;quot;0&amp;quot; b=&amp;quot;0&amp;quot;/&amp;gt; &amp;lt;/text_color&amp;gt;&lt;br /&gt;
	&amp;lt;/st_lang&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Закрываем файл. Он нам больше не понадобится.&lt;br /&gt;
Теперь создадим таблицу перекодировки английских символов в кириллицу, которую запишем в наш 3й файл &amp;lt;b&amp;gt;ui_save_dlg_rus.script&amp;lt;/b&amp;gt;.&lt;br /&gt;
Выглядит эта таблица так: &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local tbl_ansii = {&lt;br /&gt;
        [ 034 ] = 221, -- &amp;quot; --&amp;gt; Э&lt;br /&gt;
        [ 035 ] = 185, -- # --&amp;gt; №&lt;br /&gt;
	[ 039 ] = 253, -- ' --&amp;gt; э&lt;br /&gt;
	[ 044 ] = 225, -- , --&amp;gt; б&lt;br /&gt;
	[ 046 ] = 254, -- . --&amp;gt; ю&lt;br /&gt;
	[ 047 ] = 046, -- / --&amp;gt; .&lt;br /&gt;
	[ 058 ] = 198, -- : --&amp;gt; Ж&lt;br /&gt;
	[ 059 ] = 230, -- ; --&amp;gt; ж&lt;br /&gt;
	[ 060 ] = 193, -- &amp;lt; --&amp;gt; Б&lt;br /&gt;
	[ 062 ] = 222, -- &amp;gt; --&amp;gt; Ю&lt;br /&gt;
	[ 065 ] = 212, -- A --&amp;gt; Ф&lt;br /&gt;
	[ 066 ] = 200, -- B --&amp;gt; И&lt;br /&gt;
	[ 067 ] = 209, -- C --&amp;gt; С&lt;br /&gt;
	[ 068 ] = 194, -- D --&amp;gt; В&lt;br /&gt;
	[ 069 ] = 211, -- E --&amp;gt; У&lt;br /&gt;
	[ 070 ] = 192, -- F --&amp;gt; А&lt;br /&gt;
	[ 071 ] = 207, -- G --&amp;gt; П&lt;br /&gt;
	[ 072 ] = 208, -- H --&amp;gt; Р&lt;br /&gt;
	[ 073 ] = 216, -- I --&amp;gt; Ш&lt;br /&gt;
	[ 074 ] = 206, -- J --&amp;gt; О&lt;br /&gt;
	[ 075 ] = 203, -- K --&amp;gt; Л&lt;br /&gt;
	[ 076 ] = 196, -- L --&amp;gt; Д&lt;br /&gt;
	[ 077 ] = 220, -- M --&amp;gt; Ь&lt;br /&gt;
	[ 078 ] = 210, -- N --&amp;gt; Т&lt;br /&gt;
	[ 079 ] = 217, -- O --&amp;gt; Щ&lt;br /&gt;
	[ 080 ] = 199, -- P --&amp;gt; З&lt;br /&gt;
	[ 081 ] = 201, -- Q --&amp;gt; Й&lt;br /&gt;
	[ 082 ] = 202, -- R --&amp;gt; К&lt;br /&gt;
	[ 083 ] = 219, -- S --&amp;gt; Ы&lt;br /&gt;
	[ 084 ] = 197, -- T --&amp;gt; Е&lt;br /&gt;
	[ 085 ] = 195, -- U --&amp;gt; Г&lt;br /&gt;
	[ 086 ] = 204, -- V --&amp;gt; М&lt;br /&gt;
	[ 087 ] = 214, -- W --&amp;gt; Ц&lt;br /&gt;
	[ 088 ] = 215, -- X --&amp;gt; Ч&lt;br /&gt;
	[ 089 ] = 205, -- Y --&amp;gt; Н&lt;br /&gt;
	[ 090 ] = 223, -- Z --&amp;gt; Я&lt;br /&gt;
	[ 091 ] = 245, -- [ --&amp;gt; х&lt;br /&gt;
	[ 093 ] = 250, -- ] --&amp;gt; ъ&lt;br /&gt;
	[ 097 ] = 244, -- a --&amp;gt; ф&lt;br /&gt;
	[ 098 ] = 232, -- b --&amp;gt; и&lt;br /&gt;
	[ 099 ] = 241, -- c --&amp;gt; с&lt;br /&gt;
	[ 100 ] = 226, -- d --&amp;gt; в&lt;br /&gt;
	[ 101 ] = 243, -- e --&amp;gt; у&lt;br /&gt;
	[ 102 ] = 224, -- f --&amp;gt; а&lt;br /&gt;
	[ 103 ] = 239, -- g --&amp;gt; п&lt;br /&gt;
	[ 104 ] = 240, -- h --&amp;gt; р&lt;br /&gt;
	[ 105 ] = 248, -- i --&amp;gt; ш&lt;br /&gt;
	[ 106 ] = 238, -- j --&amp;gt; о&lt;br /&gt;
	[ 107 ] = 235, -- k --&amp;gt; л&lt;br /&gt;
	[ 108 ] = 228, -- l --&amp;gt; д&lt;br /&gt;
	[ 109 ] = 252, -- m --&amp;gt; ь&lt;br /&gt;
	[ 110 ] = 242, -- n --&amp;gt; т&lt;br /&gt;
	[ 111 ] = 249, -- o --&amp;gt; щ&lt;br /&gt;
	[ 112 ] = 231, -- p --&amp;gt; з&lt;br /&gt;
	[ 113 ] = 233, -- q --&amp;gt; й&lt;br /&gt;
	[ 114 ] = 234, -- r --&amp;gt; к&lt;br /&gt;
	[ 115 ] = 251, -- s --&amp;gt; ы&lt;br /&gt;
	[ 116 ] = 229, -- t --&amp;gt; е&lt;br /&gt;
	[ 117 ] = 227, -- u --&amp;gt; г&lt;br /&gt;
	[ 118 ] = 236, -- v --&amp;gt; м&lt;br /&gt;
	[ 119 ] = 246, -- w --&amp;gt; ц&lt;br /&gt;
	[ 120 ] = 247, -- x --&amp;gt; ч&lt;br /&gt;
	[ 121 ] = 237, -- y --&amp;gt; н&lt;br /&gt;
	[ 122 ] = 255, -- z --&amp;gt; я&lt;br /&gt;
	[ 123 ] = 213, -- { --&amp;gt; Х&lt;br /&gt;
	[ 125 ] = 218, -- } --&amp;gt; Ъ&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И напоследок откорректируем скрипт диалога сохранения. Для этого открываем в редакторе файл &amp;lt;b&amp;gt;ui_save_dialog.script&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
1. Вверху, сразу под комментариями описания скрипта, определяем несколько переменных: &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local t_lang,  edb_Pos, edb_Str = ui_save_dlg_rus.tbl_ansii, 1, {}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
где: t_lang – таблица перекодировки, edb_Pos – позиция курсора в поле EditBox (инициируется 1) и edb_Str – массив, в котором мы будем сохранять символы вводимого текста.&lt;br /&gt;
&lt;br /&gt;
2. Создадим индикатор текущего языка ввода текста.&lt;br /&gt;
&lt;br /&gt;
Договоримся, что переключать раскладку будем щелчком левой кнопки мыши по индикатору или клавишей левый-Ctrl (причем она будет работать как триггер), а переключать режим временного изменения языка ввода будем при нажатой и удерживаемой клавише левый-Alt.&lt;br /&gt;
Для этого в методе &amp;lt;b&amp;gt;save_dialog:InitControls()&amp;lt;/b&amp;gt; в самом конце вставим:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
self.ind_lan = xml:Init3tButton(&amp;quot;form:st_lang&amp;quot;, self.form)&lt;br /&gt;
self:Register(self.ind_lan, &amp;quot;button_lang&amp;quot;)&lt;br /&gt;
self.ind_lan:SetText(&amp;quot;Рус&amp;quot;)&lt;br /&gt;
self.mode_lang = true&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
где: self.mode_lang - флаг текущего языка ввода (true - русский, false - английский)&lt;br /&gt;
Всё, переключатель языка ввода мы создали, теперь надо обеспечить его функционирование.&lt;br /&gt;
Для этого в функцию &amp;lt;b&amp;gt;InitCallBacks()&amp;lt;/b&amp;gt; вставим строку:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
self:AddCallback(&amp;quot;button_lang&amp;quot;, ui_events.BUTTON_CLICKED, self.OnChg_lan, self)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
а этим под блоком вставляем функцию:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function save_dialog:OnChg_lan()&lt;br /&gt;
	self.mode_lang = not self.mode_lang&lt;br /&gt;
	self.ind_lang:SetText( self.mode_lang and &amp;quot;Рус&amp;quot; or &amp;quot;Eng&amp;quot; )&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Здесь всё ясно - сначала инвертируем флаг текущего языка ввода и потом меняем текст индикатора.&lt;br /&gt;
&lt;br /&gt;
Отлавливать факт переключения языка ввода и сам ввод в поле имени файла будем в системном прерывании &amp;lt;b&amp;gt;save_dialog:OnKeyboard(dik, keyboard_action)&amp;lt;/b&amp;gt;. Для этого добавим туда свои строки, чтобы в итоге получилось так:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function save_dialog:OnKeyboard(dik, keyboard_action)  --virtual function&lt;br /&gt;
    ui_base_dialog.base_dialog.OnKeyboard(self,dik,keyboard_action)&lt;br /&gt;
    DIK_RETURN = 28&lt;br /&gt;
    WINDOW_KEY_PRESSED = 6&lt;br /&gt;
    if dik == DIK_RETURN and keyboard_action == WINDOW_KEY_PRESSED then &lt;br /&gt;
        self:OnButton_ok_clicked()&lt;br /&gt;
        self.owner:Show(true)&lt;br /&gt;
        elseif keyboard_action == ui_events.WINDOW_KEY_PRESSED then&lt;br /&gt;
        if dik == DIK_keys.DIK_LCONTROL or dik == DIK_keys.DIK_LMENU then&lt;br /&gt;
            self:OnChg_lan()&lt;br /&gt;
        elseif dik == DIK_keys.DIK_LEFT then&lt;br /&gt;
            if edb_Pos &amp;gt; 1 then edb_Pos = edb_Pos - 1 end&lt;br /&gt;
        elseif dik == DIK_keys.DIK_RIGHT then&lt;br /&gt;
            if edb_Pos &amp;lt;= #edb_Str then edb_Pos = edb_Pos + 1 end&lt;br /&gt;
        elseif dik == DIK_keys.DIK_DELETE then&lt;br /&gt;
            if edb_Pos &amp;lt;= #edb_Str then table.remove(edb_Str,edb_Pos) end&lt;br /&gt;
        elseif dik == DIK_keys.DIK_BACK then&lt;br /&gt;
            if edb_Pos &amp;gt; 1 then edb_Pos = edb_Pos-1 end&lt;br /&gt;
            table.remove(edb_Str,edb_Pos)&lt;br /&gt;
        elseif     (dik &amp;gt;= 2  and dik &amp;lt;= 13) or &lt;br /&gt;
                        (dik &amp;gt;= 16 and dik &amp;lt;= 27) or &lt;br /&gt;
                        (dik &amp;gt;= 30 and dik &amp;lt;= 40) or&lt;br /&gt;
                        (dik &amp;gt;= 44 and dik &amp;lt;= 53) or&lt;br /&gt;
                        dik == 57 or &lt;br /&gt;
                        (dik &amp;gt;= 71 and dik &amp;lt;= 83) then self:OnEdit_CHANGED()&lt;br /&gt;
        end&lt;br /&gt;
    elseif keyboard_action == ui_events.WINDOW_KEY_RELEASED then&lt;br /&gt;
        if dik == DIK_keys.DIK_LMENU then&lt;br /&gt;
                self:OnChg_lan()&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return true&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь всё достаточно просто. При переключении языка вызывается метод &amp;lt;b&amp;gt;self:OnChg_lan()&amp;lt;/b&amp;gt;. При перемещении стрелками проверяем новое положение курсора и, если оно в пределах строки, то запоминаем его позицию. При удалении символа из строки удаляем соответствующий элемент из массива копии строки и опять же запоминаем текущую позицию ввода. При вводе текста  отлавливаются прерывания от всех клавиш с печатными символами и, если такое обнаружено, то вызывается функция обработчик, т.е. &amp;lt;b&amp;gt;OnEdit_CHANGED()&amp;lt;/b&amp;gt;. &amp;lt;i&amp;gt;Обратите внимание, что мы даже не пытаемся отловить ввод буквы ‘ё’, т.к. на этой же клавише размещена тильда ‘~’, которую движок «сталкера» обрабатывает специальным образом для вывода окна консоли.&amp;lt;/i&amp;gt;&lt;br /&gt;
И так, если мы зафиксировали факт нажатия клавиши с печатным символом, то вызывается функция &amp;lt;b&amp;gt;self:OnEdit_CHANGED&amp;lt;/b&amp;gt;, но её пока нет. Вот ею и займёмся.&lt;br /&gt;
&lt;br /&gt;
Сразу под созданной нами ранее &amp;lt;b&amp;gt;save_dialog:OnChg_lan()&amp;lt;/b&amp;gt; вставим ещё одну функцию:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function save_dialog:OnEdit_CHANGED()&lt;br /&gt;
    local str_edit = self:GetEditBox(&amp;quot;edit_filename&amp;quot;)   -- /1&lt;br /&gt;
    local sim = str_edit:GetText():match ('.',edb_Pos)  -- /2&lt;br /&gt;
    local cls = self.mode_lang and t_lang[sim:byte()]   -- /3&lt;br /&gt;
    sim = cls and string.char(cls) or sim               -- /4&lt;br /&gt;
    table.insert(edb_Str,edb_Pos,sim)                   -- /5&lt;br /&gt;
    edb_Pos = #edb_Str + 1                              -- /6&lt;br /&gt;
    str_edit:SetText(table.concat(edb_Str))             -- /7&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь тоже нет особых сложностей, но, тем не менее, прокомментируем наши действия.&lt;br /&gt;
Подключаемся к контролу EditBox (1) и получаем символ, находящийся в текущей позиции ввода (2). Если включен режим кириллицы, то ищем код переданного движком символа (он всегда английский) в таблице перекодировки и при его наличии получаем соответствующий код русского символа (3). Если код найден, то подменяем английский символ русским, а если нет, то оставляем всё как есть (4). Заносим полученный символ в массив копии строки ввода в соответствии со значение текущей позиции курсора (5). Устанавливаем новую текущую позиции ввода (6), преобразуем массив символов в строку и возвращаем её в поле ввода (7).&lt;br /&gt;
&lt;br /&gt;
Если Вы всё проделали правильно, то теперь можете вводить имя сохраняемого файла в английской, русской или смешанной кодировке, а также корректировать вводимый текст без искажения его синтаксиса.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Послесловие:&amp;lt;/u&amp;gt;&lt;br /&gt;
Этот алгоритм имеет отличие от стандартной обработки строки редактирования, которое выражается в том, что при вставке символа в середину строки, позиция ввода следующего символа всегда устанавливается в её конец, тогда как в “штатной” – текущей становится следующая позиция. В этой ситуации есть свой плюс и свой минус, однако в любом случае, как побороть это, я просто не знаю.&lt;/div&gt;</summary>
		<author><name>Serge!</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%A3%D1%87%D0%B8%D0%BC_S.T.A.L.K.E.R._%D0%A2%D0%A7_%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%BE%D0%BC%D1%83_%D1%8F%D0%B7%D1%8B%D0%BA%D1%83</id>
		<title>Учим S.T.A.L.K.E.R. ТЧ русскому языку</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A3%D1%87%D0%B8%D0%BC_S.T.A.L.K.E.R._%D0%A2%D0%A7_%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%BE%D0%BC%D1%83_%D1%8F%D0%B7%D1%8B%D0%BA%D1%83"/>
				<updated>2015-11-21T13:29:53Z</updated>
		
		<summary type="html">&lt;p&gt;Serge!: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;За много лет игры все уже почти привыкли, что сохранить текущее состояние в процессе игры мы можем только в файле с английской транскрипцией. Мне это не очень нравится и поэтому предлагаю способ научить ТЧ сохранить файлы с именами на русском или (это уже самостоятельно) на любом другом языке.&lt;br /&gt;
Это не сложно и справиться может каждый, кто знает, что такое есть текстовый редактор.&lt;br /&gt;
Для решения нашей задачи нам понадобятся файлы: &amp;lt;b&amp;gt;ui_save_dialog.script&amp;lt;/b&amp;gt; и &amp;lt;b&amp;gt;ui_mm_save_dlg.xml&amp;lt;/b&amp;gt; и ещё один, который мы создадим сами, с именем &amp;lt;b&amp;gt;ui_save_dlg_rus.script&amp;lt;/b&amp;gt;. Первый и третий должны находиться в папке gamedata\scripts\, а второй в gamedata\config\ui\. Если их там нет или вообще нет папки gamedata, то значит Вам придётся извлечь их (1 и 2) из архивов дистрибутива (файлы gamedata/dbX) или отказаться от затеи русификации. Как распаковать архивы дистрибутива я не буду, т.к. про это не рассказали только самые ленивые, поэтому считаем, что эти файлы Вам доступны.&lt;br /&gt;
&lt;br /&gt;
Начинаем.&lt;br /&gt;
Сначала проделаем маленькую, но необходимую работу, а именно: определим индикатор/переключатель текущего языка ввода. Для этого открываем файл &amp;lt;b&amp;gt;ui_mm_save_dlg.xml&amp;lt;/b&amp;gt; и в конец тега form добавим строчки, чтобы получилось так:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
        &amp;lt;!-- оставляем исходное --&amp;gt;&lt;br /&gt;
	&amp;lt;st_lang x=&amp;quot;280&amp;quot; y=&amp;quot;400&amp;quot; width=&amp;quot;30&amp;quot; height=&amp;quot;20&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text font=&amp;quot;graffiti22&amp;quot; align=&amp;quot;c&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;text_color&amp;gt; &amp;lt;e r=&amp;quot;227&amp;quot; g=&amp;quot;199&amp;quot; b=&amp;quot;178&amp;quot;/&amp;gt; &amp;lt;h r=&amp;quot;255&amp;quot; g=&amp;quot;0&amp;quot; b=&amp;quot;0&amp;quot;/&amp;gt; &amp;lt;/text_color&amp;gt;&lt;br /&gt;
	&amp;lt;/st_lang&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Закрываем файл. Он нам больше не понадобится.&lt;br /&gt;
Теперь создадим таблицу перекодировки английских символов в кириллицу, которую запишем в наш 3й файл &amp;lt;b&amp;gt;ui_save_dlg_rus.script&amp;lt;/b&amp;gt;.&lt;br /&gt;
Выглядит эта таблица так: &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local tbl_ansii = {&lt;br /&gt;
        [ 034 ] = 221, -- &amp;quot; --&amp;gt; Э&lt;br /&gt;
        [ 035 ] = 185, -- # --&amp;gt; №&lt;br /&gt;
	[ 039 ] = 253, -- ' --&amp;gt; э&lt;br /&gt;
	[ 044 ] = 225, -- , --&amp;gt; б&lt;br /&gt;
	[ 046 ] = 254, -- . --&amp;gt; ю&lt;br /&gt;
	[ 047 ] = 046, -- / --&amp;gt; .&lt;br /&gt;
	[ 058 ] = 198, -- : --&amp;gt; Ж&lt;br /&gt;
	[ 059 ] = 230, -- ; --&amp;gt; ж&lt;br /&gt;
	[ 060 ] = 193, -- &amp;lt; --&amp;gt; Б&lt;br /&gt;
	[ 062 ] = 222, -- &amp;gt; --&amp;gt; Ю&lt;br /&gt;
	[ 065 ] = 212, -- A --&amp;gt; Ф&lt;br /&gt;
	[ 066 ] = 200, -- B --&amp;gt; И&lt;br /&gt;
	[ 067 ] = 209, -- C --&amp;gt; С&lt;br /&gt;
	[ 068 ] = 194, -- D --&amp;gt; В&lt;br /&gt;
	[ 069 ] = 211, -- E --&amp;gt; У&lt;br /&gt;
	[ 070 ] = 192, -- F --&amp;gt; А&lt;br /&gt;
	[ 071 ] = 207, -- G --&amp;gt; П&lt;br /&gt;
	[ 072 ] = 208, -- H --&amp;gt; Р&lt;br /&gt;
	[ 073 ] = 216, -- I --&amp;gt; Ш&lt;br /&gt;
	[ 074 ] = 206, -- J --&amp;gt; О&lt;br /&gt;
	[ 075 ] = 203, -- K --&amp;gt; Л&lt;br /&gt;
	[ 076 ] = 196, -- L --&amp;gt; Д&lt;br /&gt;
	[ 077 ] = 220, -- M --&amp;gt; Ь&lt;br /&gt;
	[ 078 ] = 210, -- N --&amp;gt; Т&lt;br /&gt;
	[ 079 ] = 217, -- O --&amp;gt; Щ&lt;br /&gt;
	[ 080 ] = 199, -- P --&amp;gt; З&lt;br /&gt;
	[ 081 ] = 201, -- Q --&amp;gt; Й&lt;br /&gt;
	[ 082 ] = 202, -- R --&amp;gt; К&lt;br /&gt;
	[ 083 ] = 219, -- S --&amp;gt; Ы&lt;br /&gt;
	[ 084 ] = 197, -- T --&amp;gt; Е&lt;br /&gt;
	[ 085 ] = 195, -- U --&amp;gt; Г&lt;br /&gt;
	[ 086 ] = 204, -- V --&amp;gt; М&lt;br /&gt;
	[ 087 ] = 214, -- W --&amp;gt; Ц&lt;br /&gt;
	[ 088 ] = 215, -- X --&amp;gt; Ч&lt;br /&gt;
	[ 089 ] = 205, -- Y --&amp;gt; Н&lt;br /&gt;
	[ 090 ] = 223, -- Z --&amp;gt; Я&lt;br /&gt;
	[ 091 ] = 245, -- [ --&amp;gt; х&lt;br /&gt;
	[ 093 ] = 250, -- ] --&amp;gt; ъ&lt;br /&gt;
	[ 097 ] = 244, -- a --&amp;gt; ф&lt;br /&gt;
	[ 098 ] = 232, -- b --&amp;gt; и&lt;br /&gt;
	[ 099 ] = 241, -- c --&amp;gt; с&lt;br /&gt;
	[ 100 ] = 226, -- d --&amp;gt; в&lt;br /&gt;
	[ 101 ] = 243, -- e --&amp;gt; у&lt;br /&gt;
	[ 102 ] = 224, -- f --&amp;gt; а&lt;br /&gt;
	[ 103 ] = 239, -- g --&amp;gt; п&lt;br /&gt;
	[ 104 ] = 240, -- h --&amp;gt; р&lt;br /&gt;
	[ 105 ] = 248, -- i --&amp;gt; ш&lt;br /&gt;
	[ 106 ] = 238, -- j --&amp;gt; о&lt;br /&gt;
	[ 107 ] = 235, -- k --&amp;gt; л&lt;br /&gt;
	[ 108 ] = 228, -- l --&amp;gt; д&lt;br /&gt;
	[ 109 ] = 252, -- m --&amp;gt; ь&lt;br /&gt;
	[ 110 ] = 242, -- n --&amp;gt; т&lt;br /&gt;
	[ 111 ] = 249, -- o --&amp;gt; щ&lt;br /&gt;
	[ 112 ] = 231, -- p --&amp;gt; з&lt;br /&gt;
	[ 113 ] = 233, -- q --&amp;gt; й&lt;br /&gt;
	[ 114 ] = 234, -- r --&amp;gt; к&lt;br /&gt;
	[ 115 ] = 251, -- s --&amp;gt; ы&lt;br /&gt;
	[ 116 ] = 229, -- t --&amp;gt; е&lt;br /&gt;
	[ 117 ] = 227, -- u --&amp;gt; г&lt;br /&gt;
	[ 118 ] = 236, -- v --&amp;gt; м&lt;br /&gt;
	[ 119 ] = 246, -- w --&amp;gt; ц&lt;br /&gt;
	[ 120 ] = 247, -- x --&amp;gt; ч&lt;br /&gt;
	[ 121 ] = 237, -- y --&amp;gt; н&lt;br /&gt;
	[ 122 ] = 255, -- z --&amp;gt; я&lt;br /&gt;
	[ 123 ] = 213, -- { --&amp;gt; Х&lt;br /&gt;
	[ 125 ] = 218, -- } --&amp;gt; Ъ&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И напоследок откорректируем скрипт диалога сохранения. Для этого открываем в редакторе файл &amp;lt;b&amp;gt;ui_save_dialog.script&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
1. Вверху, сразу под комментариями описания скрипта, определяем несколько переменных: &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local t_lang,  edb_Pos, edb_Str = ui_save_dlg_rus.tbl_ansii, 1, {}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
где: t_lang – таблица перекодировки, edb_Pos – позиция курсора в поле EditBox (инициируется 1) и edb_Str – массив, в котором мы будем сохранять символы вводимого текста.&lt;br /&gt;
&lt;br /&gt;
2. Создадим индикатор текущего языка ввода текста.&lt;br /&gt;
&lt;br /&gt;
Договоримся, что переключать раскладку будем щелчком левой кнопки мыши по индикатору или клавишей левый-Ctrl (причем она будет работать как триггер), а переключать режим временного изменения языка ввода будем при нажатой и удерживаемой клавише левый-Alt.&lt;br /&gt;
Для этого в методе &amp;lt;b&amp;gt;save_dialog:InitControls()&amp;lt;/b&amp;gt; в самом конце вставим:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
self.ind_lan = xml:Init3tButton(&amp;quot;form:st_lang&amp;quot;, self.form)&lt;br /&gt;
self:Register(self.ind_lan, &amp;quot;button_lang&amp;quot;)&lt;br /&gt;
self.ind_lan:SetText(&amp;quot;Рус&amp;quot;)&lt;br /&gt;
self.mode_lang = true&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
где: self.mode_lang - флаг текущего языка ввода (true - русский, false - английский)&lt;br /&gt;
Всё, переключатель языка ввода мы создали, теперь надо обеспечить его функционирование.&lt;br /&gt;
Для этого в функцию &amp;lt;b&amp;gt;InitCallBacks()&amp;lt;/b&amp;gt; вставим строку:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
self:AddCallback(&amp;quot;button_lang&amp;quot;, ui_events.BUTTON_CLICKED, self.OnChg_lan, self)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
а этим под блоком вставляем функцию:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function save_dialog:OnChg_lan()&lt;br /&gt;
	self.mode_lang = not self.mode_lang&lt;br /&gt;
	if self.mode_lang then self.ind_lang:SetText(&amp;quot;Рус&amp;quot;)&lt;br /&gt;
	else self.ind_lang:SetText(&amp;quot;Eng&amp;quot;) end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Здесь всё ясно - сначала инвертируем флаг текущего языка ввода и потом меняем текст индикатора.&lt;br /&gt;
&lt;br /&gt;
Отлавливать факт переключения языка ввода и сам ввод в поле имени файла будем в системном прерывании &amp;lt;b&amp;gt;save_dialog:OnKeyboard(dik, keyboard_action)&amp;lt;/b&amp;gt;. Для этого добавим туда свои строки, чтобы в итоге получилось так:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function save_dialog:OnKeyboard(dik, keyboard_action)  --virtual function&lt;br /&gt;
    ui_base_dialog.base_dialog.OnKeyboard(self,dik,keyboard_action)&lt;br /&gt;
    DIK_RETURN = 28&lt;br /&gt;
    WINDOW_KEY_PRESSED = 6&lt;br /&gt;
    if dik == DIK_RETURN and keyboard_action == WINDOW_KEY_PRESSED then &lt;br /&gt;
        self:OnButton_ok_clicked()&lt;br /&gt;
        self.owner:Show(true)&lt;br /&gt;
        elseif keyboard_action == ui_events.WINDOW_KEY_PRESSED then&lt;br /&gt;
        if dik == DIK_keys.DIK_LCONTROL or dik == DIK_keys.DIK_LMENU then&lt;br /&gt;
            self:OnChg_lan()&lt;br /&gt;
        elseif dik == DIK_keys.DIK_LEFT then&lt;br /&gt;
            if edb_Pos &amp;gt; 1 then edb_Pos = edb_Pos - 1 end&lt;br /&gt;
        elseif dik == DIK_keys.DIK_RIGHT then&lt;br /&gt;
            if edb_Pos &amp;lt;= #edb_Str then edb_Pos = edb_Pos + 1 end&lt;br /&gt;
        elseif dik == DIK_keys.DIK_DELETE then&lt;br /&gt;
            if edb_Pos &amp;lt;= #edb_Str then table.remove(edb_Str,edb_Pos) end&lt;br /&gt;
        elseif dik == DIK_keys.DIK_BACK then&lt;br /&gt;
            if edb_Pos &amp;gt; 1 then edb_Pos = edb_Pos-1 end&lt;br /&gt;
            table.remove(edb_Str,edb_Pos)&lt;br /&gt;
        elseif     (dik &amp;gt;= 2  and dik &amp;lt;= 13) or &lt;br /&gt;
                        (dik &amp;gt;= 16 and dik &amp;lt;= 27) or &lt;br /&gt;
                        (dik &amp;gt;= 30 and dik &amp;lt;= 40) or&lt;br /&gt;
                        (dik &amp;gt;= 44 and dik &amp;lt;= 53) or&lt;br /&gt;
                        dik == 57 or &lt;br /&gt;
                        (dik &amp;gt;= 71 and dik &amp;lt;= 83) then self:OnEdit_CHANGED()&lt;br /&gt;
        end&lt;br /&gt;
    elseif keyboard_action == ui_events.WINDOW_KEY_RELEASED then&lt;br /&gt;
        if dik == DIK_keys.DIK_LMENU then&lt;br /&gt;
                self:OnChg_lan()&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return true&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь всё достаточно просто. При переключении языка вызывается метод &amp;lt;b&amp;gt;self:OnChg_lan()&amp;lt;/b&amp;gt;. При перемещении стрелками проверяем новое положение курсора и, если оно в пределах строки, то запоминаем его позицию. При удалении символа из строки удаляем соответствующий элемент из массива копии строки и опять же запоминаем текущую позицию ввода. При вводе текста  отлавливаются прерывания от всех клавиш с печатными символами и, если такое обнаружено, то вызывается функция обработчик, т.е. &amp;lt;b&amp;gt;OnEdit_CHANGED()&amp;lt;/b&amp;gt;. &amp;lt;i&amp;gt;Обратите внимание, что мы даже не пытаемся отловить ввод буквы ‘ё’, т.к. на этой же клавише размещена тильда ‘~’, которую движок «сталкера» обрабатывает специальным образом для вывода окна консоли.&amp;lt;/i&amp;gt;&lt;br /&gt;
И так, если мы зафиксировали факт нажатия клавиши с печатным символом, то вызывается функция &amp;lt;b&amp;gt;self:OnEdit_CHANGED&amp;lt;/b&amp;gt;, но её пока нет. Вот ею и займёмся.&lt;br /&gt;
&lt;br /&gt;
Сразу под созданной нами ранее &amp;lt;b&amp;gt;save_dialog:OnChg_lan()&amp;lt;/b&amp;gt; вставим ещё одну функцию:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function save_dialog:OnEdit_CHANGED()&lt;br /&gt;
    local str_edit = self:GetEditBox(&amp;quot;edit_filename&amp;quot;)   -- /1&lt;br /&gt;
    local sim = str_edit:GetText():match ('.',edb_Pos)  -- /2&lt;br /&gt;
    local cls = self.mode_lang and t_lang[sim:byte()]   -- /3&lt;br /&gt;
    sim = cls and string.char(cls) or sim               -- /4&lt;br /&gt;
    table.insert(edb_Str,edb_Pos,sim)                   -- /5&lt;br /&gt;
    edb_Pos = #edb_Str + 1                              -- /6&lt;br /&gt;
    str_edit:SetText(table.concat(edb_Str))             -- /7&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь тоже нет особых сложностей, но, тем не менее, прокомментируем наши действия.&lt;br /&gt;
Подключаемся к контролу EditBox (1) и получаем символ, находящийся в текущей позиции ввода (2). Если включен режим кириллицы, то ищем код переданного движком символа (он всегда английский) в таблице перекодировки и при его наличии получаем соответствующий код русского символа (3). Если код найден, то подменяем английский символ русским, а если нет, то оставляем всё как есть (4). Заносим полученный символ в массив копии строки ввода в соответствии со значение текущей позиции курсора (5). Устанавливаем новую текущую позиции ввода (6), преобразуем массив символов в строку и возвращаем её в поле ввода (7).&lt;br /&gt;
&lt;br /&gt;
Если Вы всё проделали правильно, то теперь можете вводить имя сохраняемого файла в английской, русской или смешанной кодировке, а также корректировать вводимый текст без искажения его синтаксиса.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Послесловие:&amp;lt;/u&amp;gt;&lt;br /&gt;
Этот алгоритм имеет отличие от стандартной обработки строки редактирования, которое выражается в том, что при вставке символа в середину строки, позиция ввода следующего символа всегда устанавливается в её конец, тогда как в “штатной” – текущей становится следующая позиция. В этой ситуации есть свой плюс и свой минус, однако в любом случае, как побороть это, я просто не знаю.&lt;/div&gt;</summary>
		<author><name>Serge!</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%A3%D1%87%D0%B8%D0%BC_S.T.A.L.K.E.R._%D0%A2%D0%A7_%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%BE%D0%BC%D1%83_%D1%8F%D0%B7%D1%8B%D0%BA%D1%83</id>
		<title>Учим S.T.A.L.K.E.R. ТЧ русскому языку</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A3%D1%87%D0%B8%D0%BC_S.T.A.L.K.E.R._%D0%A2%D0%A7_%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%BE%D0%BC%D1%83_%D1%8F%D0%B7%D1%8B%D0%BA%D1%83"/>
				<updated>2015-11-21T13:29:06Z</updated>
		
		<summary type="html">&lt;p&gt;Serge!: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;За много лет игры все уже почти привыкли, что сохранить текущее состояние в процессе игры мы можем только в файле с английской транскрипцией. Мне это не очень нравится и поэтому предлагаю способ научить ТЧ сохранить файлы с именами на русском или (это уже самостоятельно) на любом другом языке.&lt;br /&gt;
Это не сложно и справиться может каждый, кто знает, что такое есть текстовый редактор.&lt;br /&gt;
Для решения нашей задачи нам понадобятся файлы: &amp;lt;b&amp;gt;ui_save_dialog.script&amp;lt;/b&amp;gt; и &amp;lt;b&amp;gt;ui_mm_save_dlg.xml&amp;lt;/b&amp;gt; и ещё один, который мы создадим сами, с именем &amp;lt;b&amp;gt;ui_save_dlg_rus.script&amp;lt;/b&amp;gt;. Первый и третий должны находиться в папке gamedata\scripts\, а второй в gamedata\config\ui\. Если их там нет или вообще нет папки gamedata, то значит Вам придётся извлечь их (1 и 2) из архивов дистрибутива (файлы gamedata/dbX) или отказаться от затеи русификации. Как распаковать архивы дистрибутива я не буду, т.к. про это не рассказали только самые ленивые, поэтому считаем, что эти файлы Вам доступны.&lt;br /&gt;
&lt;br /&gt;
Начинаем.&lt;br /&gt;
Сначала проделаем маленькую, но необходимую работу, а именно: определим индикатор/переключатель текущего языка ввода. Для этого открываем файл &amp;lt;b&amp;gt;ui_mm_save_dlg.xml&amp;lt;/b&amp;gt; и в конец тега form добавим строчки, чтобы получилось так:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
        &amp;lt;!-- оставляем исходное --&amp;gt;&lt;br /&gt;
	&amp;lt;st_lang x=&amp;quot;280&amp;quot; y=&amp;quot;400&amp;quot; width=&amp;quot;30&amp;quot; height=&amp;quot;20&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text font=&amp;quot;graffiti22&amp;quot; align=&amp;quot;c&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;text_color&amp;gt; &amp;lt;e r=&amp;quot;227&amp;quot; g=&amp;quot;199&amp;quot; b=&amp;quot;178&amp;quot;/&amp;gt; &amp;lt;h r=&amp;quot;255&amp;quot; g=&amp;quot;0&amp;quot; b=&amp;quot;0&amp;quot;/&amp;gt; &amp;lt;/text_color&amp;gt;&lt;br /&gt;
	&amp;lt;/st_lang&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Закрываем файл. Он нам больше не понадобится.&lt;br /&gt;
Теперь создадим таблицу перекодировки английских символов в кириллицу, которую запишем в наш 3й файл &amp;lt;b&amp;gt;ui_save_dlg_rus&amp;lt;/b&amp;gt;.script.&lt;br /&gt;
Выглядит эта таблица так: &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local tbl_ansii = {&lt;br /&gt;
        [ 034 ] = 221, -- &amp;quot; --&amp;gt; Э&lt;br /&gt;
        [ 035 ] = 185, -- # --&amp;gt; №&lt;br /&gt;
	[ 039 ] = 253, -- ' --&amp;gt; э&lt;br /&gt;
	[ 044 ] = 225, -- , --&amp;gt; б&lt;br /&gt;
	[ 046 ] = 254, -- . --&amp;gt; ю&lt;br /&gt;
	[ 047 ] = 046, -- / --&amp;gt; .&lt;br /&gt;
	[ 058 ] = 198, -- : --&amp;gt; Ж&lt;br /&gt;
	[ 059 ] = 230, -- ; --&amp;gt; ж&lt;br /&gt;
	[ 060 ] = 193, -- &amp;lt; --&amp;gt; Б&lt;br /&gt;
	[ 062 ] = 222, -- &amp;gt; --&amp;gt; Ю&lt;br /&gt;
	[ 065 ] = 212, -- A --&amp;gt; Ф&lt;br /&gt;
	[ 066 ] = 200, -- B --&amp;gt; И&lt;br /&gt;
	[ 067 ] = 209, -- C --&amp;gt; С&lt;br /&gt;
	[ 068 ] = 194, -- D --&amp;gt; В&lt;br /&gt;
	[ 069 ] = 211, -- E --&amp;gt; У&lt;br /&gt;
	[ 070 ] = 192, -- F --&amp;gt; А&lt;br /&gt;
	[ 071 ] = 207, -- G --&amp;gt; П&lt;br /&gt;
	[ 072 ] = 208, -- H --&amp;gt; Р&lt;br /&gt;
	[ 073 ] = 216, -- I --&amp;gt; Ш&lt;br /&gt;
	[ 074 ] = 206, -- J --&amp;gt; О&lt;br /&gt;
	[ 075 ] = 203, -- K --&amp;gt; Л&lt;br /&gt;
	[ 076 ] = 196, -- L --&amp;gt; Д&lt;br /&gt;
	[ 077 ] = 220, -- M --&amp;gt; Ь&lt;br /&gt;
	[ 078 ] = 210, -- N --&amp;gt; Т&lt;br /&gt;
	[ 079 ] = 217, -- O --&amp;gt; Щ&lt;br /&gt;
	[ 080 ] = 199, -- P --&amp;gt; З&lt;br /&gt;
	[ 081 ] = 201, -- Q --&amp;gt; Й&lt;br /&gt;
	[ 082 ] = 202, -- R --&amp;gt; К&lt;br /&gt;
	[ 083 ] = 219, -- S --&amp;gt; Ы&lt;br /&gt;
	[ 084 ] = 197, -- T --&amp;gt; Е&lt;br /&gt;
	[ 085 ] = 195, -- U --&amp;gt; Г&lt;br /&gt;
	[ 086 ] = 204, -- V --&amp;gt; М&lt;br /&gt;
	[ 087 ] = 214, -- W --&amp;gt; Ц&lt;br /&gt;
	[ 088 ] = 215, -- X --&amp;gt; Ч&lt;br /&gt;
	[ 089 ] = 205, -- Y --&amp;gt; Н&lt;br /&gt;
	[ 090 ] = 223, -- Z --&amp;gt; Я&lt;br /&gt;
	[ 091 ] = 245, -- [ --&amp;gt; х&lt;br /&gt;
	[ 093 ] = 250, -- ] --&amp;gt; ъ&lt;br /&gt;
	[ 097 ] = 244, -- a --&amp;gt; ф&lt;br /&gt;
	[ 098 ] = 232, -- b --&amp;gt; и&lt;br /&gt;
	[ 099 ] = 241, -- c --&amp;gt; с&lt;br /&gt;
	[ 100 ] = 226, -- d --&amp;gt; в&lt;br /&gt;
	[ 101 ] = 243, -- e --&amp;gt; у&lt;br /&gt;
	[ 102 ] = 224, -- f --&amp;gt; а&lt;br /&gt;
	[ 103 ] = 239, -- g --&amp;gt; п&lt;br /&gt;
	[ 104 ] = 240, -- h --&amp;gt; р&lt;br /&gt;
	[ 105 ] = 248, -- i --&amp;gt; ш&lt;br /&gt;
	[ 106 ] = 238, -- j --&amp;gt; о&lt;br /&gt;
	[ 107 ] = 235, -- k --&amp;gt; л&lt;br /&gt;
	[ 108 ] = 228, -- l --&amp;gt; д&lt;br /&gt;
	[ 109 ] = 252, -- m --&amp;gt; ь&lt;br /&gt;
	[ 110 ] = 242, -- n --&amp;gt; т&lt;br /&gt;
	[ 111 ] = 249, -- o --&amp;gt; щ&lt;br /&gt;
	[ 112 ] = 231, -- p --&amp;gt; з&lt;br /&gt;
	[ 113 ] = 233, -- q --&amp;gt; й&lt;br /&gt;
	[ 114 ] = 234, -- r --&amp;gt; к&lt;br /&gt;
	[ 115 ] = 251, -- s --&amp;gt; ы&lt;br /&gt;
	[ 116 ] = 229, -- t --&amp;gt; е&lt;br /&gt;
	[ 117 ] = 227, -- u --&amp;gt; г&lt;br /&gt;
	[ 118 ] = 236, -- v --&amp;gt; м&lt;br /&gt;
	[ 119 ] = 246, -- w --&amp;gt; ц&lt;br /&gt;
	[ 120 ] = 247, -- x --&amp;gt; ч&lt;br /&gt;
	[ 121 ] = 237, -- y --&amp;gt; н&lt;br /&gt;
	[ 122 ] = 255, -- z --&amp;gt; я&lt;br /&gt;
	[ 123 ] = 213, -- { --&amp;gt; Х&lt;br /&gt;
	[ 125 ] = 218, -- } --&amp;gt; Ъ&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И напоследок откорректируем скрипт диалога сохранения. Для этого открываем в редакторе файл &amp;lt;b&amp;gt;ui_save_dialog.script&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
1. Вверху, сразу под комментариями описания скрипта, определяем несколько переменных: &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local t_lang,  edb_Pos, edb_Str = ui_save_dlg_rus.tbl_ansii, 1, {}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
где: t_lang – таблица перекодировки, edb_Pos – позиция курсора в поле EditBox (инициируется 1) и edb_Str – массив, в котором мы будем сохранять символы вводимого текста.&lt;br /&gt;
&lt;br /&gt;
2. Создадим индикатор текущего языка ввода текста.&lt;br /&gt;
&lt;br /&gt;
Договоримся, что переключать раскладку будем щелчком левой кнопки мыши по индикатору или клавишей левый-Ctrl (причем она будет работать как триггер), а переключать режим временного изменения языка ввода будем при нажатой и удерживаемой клавише левый-Alt.&lt;br /&gt;
Для этого в методе &amp;lt;b&amp;gt;save_dialog:InitControls()&amp;lt;/b&amp;gt; в самом конце вставим:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
self.ind_lan = xml:Init3tButton(&amp;quot;form:st_lang&amp;quot;, self.form)&lt;br /&gt;
self:Register(self.ind_lan, &amp;quot;button_lang&amp;quot;)&lt;br /&gt;
self.ind_lan:SetText(&amp;quot;Рус&amp;quot;)&lt;br /&gt;
self.mode_lang = true&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
где: self.mode_lang - флаг текущего языка ввода (true - русский, false - английский)&lt;br /&gt;
Всё, переключатель языка ввода мы создали, теперь надо обеспечить его функционирование.&lt;br /&gt;
Для этого в функцию &amp;lt;b&amp;gt;InitCallBacks()&amp;lt;/b&amp;gt; вставим строку:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
self:AddCallback(&amp;quot;button_lang&amp;quot;, ui_events.BUTTON_CLICKED, self.OnChg_lan, self)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
а этим под блоком вставляем функцию:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function save_dialog:OnChg_lan()&lt;br /&gt;
	self.mode_lang = not self.mode_lang&lt;br /&gt;
	if self.mode_lang then self.ind_lang:SetText(&amp;quot;Рус&amp;quot;)&lt;br /&gt;
	else self.ind_lang:SetText(&amp;quot;Eng&amp;quot;) end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Здесь всё ясно - сначала инвертируем флаг текущего языка ввода и потом меняем текст индикатора.&lt;br /&gt;
&lt;br /&gt;
Отлавливать факт переключения языка ввода и сам ввод в поле имени файла будем в системном прерывании &amp;lt;b&amp;gt;save_dialog:OnKeyboard(dik, keyboard_action)&amp;lt;/b&amp;gt;. Для этого добавим туда свои строки, чтобы в итоге получилось так:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function save_dialog:OnKeyboard(dik, keyboard_action)  --virtual function&lt;br /&gt;
    ui_base_dialog.base_dialog.OnKeyboard(self,dik,keyboard_action)&lt;br /&gt;
    DIK_RETURN = 28&lt;br /&gt;
    WINDOW_KEY_PRESSED = 6&lt;br /&gt;
    if dik == DIK_RETURN and keyboard_action == WINDOW_KEY_PRESSED then &lt;br /&gt;
        self:OnButton_ok_clicked()&lt;br /&gt;
        self.owner:Show(true)&lt;br /&gt;
        elseif keyboard_action == ui_events.WINDOW_KEY_PRESSED then&lt;br /&gt;
        if dik == DIK_keys.DIK_LCONTROL or dik == DIK_keys.DIK_LMENU then&lt;br /&gt;
            self:OnChg_lan()&lt;br /&gt;
        elseif dik == DIK_keys.DIK_LEFT then&lt;br /&gt;
            if edb_Pos &amp;gt; 1 then edb_Pos = edb_Pos - 1 end&lt;br /&gt;
        elseif dik == DIK_keys.DIK_RIGHT then&lt;br /&gt;
            if edb_Pos &amp;lt;= #edb_Str then edb_Pos = edb_Pos + 1 end&lt;br /&gt;
        elseif dik == DIK_keys.DIK_DELETE then&lt;br /&gt;
            if edb_Pos &amp;lt;= #edb_Str then table.remove(edb_Str,edb_Pos) end&lt;br /&gt;
        elseif dik == DIK_keys.DIK_BACK then&lt;br /&gt;
            if edb_Pos &amp;gt; 1 then edb_Pos = edb_Pos-1 end&lt;br /&gt;
            table.remove(edb_Str,edb_Pos)&lt;br /&gt;
        elseif     (dik &amp;gt;= 2  and dik &amp;lt;= 13) or &lt;br /&gt;
                        (dik &amp;gt;= 16 and dik &amp;lt;= 27) or &lt;br /&gt;
                        (dik &amp;gt;= 30 and dik &amp;lt;= 40) or&lt;br /&gt;
                        (dik &amp;gt;= 44 and dik &amp;lt;= 53) or&lt;br /&gt;
                        dik == 57 or &lt;br /&gt;
                        (dik &amp;gt;= 71 and dik &amp;lt;= 83) then self:OnEdit_CHANGED()&lt;br /&gt;
        end&lt;br /&gt;
    elseif keyboard_action == ui_events.WINDOW_KEY_RELEASED then&lt;br /&gt;
        if dik == DIK_keys.DIK_LMENU then&lt;br /&gt;
                self:OnChg_lan()&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return true&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь всё достаточно просто. При переключении языка вызывается метод &amp;lt;b&amp;gt;self:OnChg_lan()&amp;lt;/b&amp;gt;. При перемещении стрелками проверяем новое положение курсора и, если оно в пределах строки, то запоминаем его позицию. При удалении символа из строки удаляем соответствующий элемент из массива копии строки и опять же запоминаем текущую позицию ввода. При вводе текста  отлавливаются прерывания от всех клавиш с печатными символами и, если такое обнаружено, то вызывается функция обработчик, т.е. &amp;lt;b&amp;gt;OnEdit_CHANGED()&amp;lt;/b&amp;gt;. &amp;lt;i&amp;gt;Обратите внимание, что мы даже не пытаемся отловить ввод буквы ‘ё’, т.к. на этой же клавише размещена тильда ‘~’, которую движок «сталкера» обрабатывает специальным образом для вывода окна консоли.&amp;lt;/i&amp;gt;&lt;br /&gt;
И так, если мы зафиксировали факт нажатия клавиши с печатным символом, то вызывается функция &amp;lt;b&amp;gt;self:OnEdit_CHANGED&amp;lt;/b&amp;gt;, но её пока нет. Вот ею и займёмся.&lt;br /&gt;
&lt;br /&gt;
Сразу под созданной нами ранее &amp;lt;b&amp;gt;save_dialog:OnChg_lan()&amp;lt;/b&amp;gt; вставим ещё одну функцию:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function save_dialog:OnEdit_CHANGED()&lt;br /&gt;
    local str_edit = self:GetEditBox(&amp;quot;edit_filename&amp;quot;)   -- /1&lt;br /&gt;
    local sim = str_edit:GetText():match ('.',edb_Pos)  -- /2&lt;br /&gt;
    local cls = self.mode_lang and t_lang[sim:byte()]   -- /3&lt;br /&gt;
    sim = cls and string.char(cls) or sim               -- /4&lt;br /&gt;
    table.insert(edb_Str,edb_Pos,sim)                   -- /5&lt;br /&gt;
    edb_Pos = #edb_Str + 1                              -- /6&lt;br /&gt;
    str_edit:SetText(table.concat(edb_Str))             -- /7&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь тоже нет особых сложностей, но, тем не менее, прокомментируем наши действия.&lt;br /&gt;
Подключаемся к контролу EditBox (1) и получаем символ, находящийся в текущей позиции ввода (2). Если включен режим кириллицы, то ищем код переданного движком символа (он всегда английский) в таблице перекодировки и при его наличии получаем соответствующий код русского символа (3). Если код найден, то подменяем английский символ русским, а если нет, то оставляем всё как есть (4). Заносим полученный символ в массив копии строки ввода в соответствии со значение текущей позиции курсора (5). Устанавливаем новую текущую позиции ввода (6), преобразуем массив символов в строку и возвращаем её в поле ввода (7).&lt;br /&gt;
&lt;br /&gt;
Если Вы всё проделали правильно, то теперь можете вводить имя сохраняемого файла в английской, русской или смешанной кодировке, а также корректировать вводимый текст без искажения его синтаксиса.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Послесловие:&amp;lt;/u&amp;gt;&lt;br /&gt;
Этот алгоритм имеет отличие от стандартной обработки строки редактирования, которое выражается в том, что при вставке символа в середину строки, позиция ввода следующего символа всегда устанавливается в её конец, тогда как в “штатной” – текущей становится следующая позиция. В этой ситуации есть свой плюс и свой минус, однако в любом случае, как побороть это, я просто не знаю.&lt;/div&gt;</summary>
		<author><name>Serge!</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%A3%D1%87%D0%B8%D0%BC_S.T.A.L.K.E.R._%D0%A2%D0%A7_%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%BE%D0%BC%D1%83_%D1%8F%D0%B7%D1%8B%D0%BA%D1%83</id>
		<title>Учим S.T.A.L.K.E.R. ТЧ русскому языку</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A3%D1%87%D0%B8%D0%BC_S.T.A.L.K.E.R._%D0%A2%D0%A7_%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%BE%D0%BC%D1%83_%D1%8F%D0%B7%D1%8B%D0%BA%D1%83"/>
				<updated>2015-11-14T13:02:22Z</updated>
		
		<summary type="html">&lt;p&gt;Serge!: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;За много лет игры все уже почти привыкли, что сохранить текущее состояние в процессе игры мы можем только в файле с английской транскрипцией. Мне это не очень нравится и поэтому предлагаю способ научить ТЧ сохранить файлы с именами на русском или (это уже самостоятельно) на любом другом языке.&lt;br /&gt;
Это не сложно и справиться может каждый, кто знает, что такое есть текстовый редактор.&lt;br /&gt;
Для решения нашей задачи нам понадобятся файлы: &amp;lt;b&amp;gt;ui_save_dialog.script&amp;lt;/b&amp;gt; и &amp;lt;b&amp;gt;ui_mm_save_dlg.xml&amp;lt;/b&amp;gt; и ещё один, который мы создадим сами, с именем &amp;lt;b&amp;gt;ui_save_dlg_rus.script&amp;lt;/b&amp;gt;. Первый и третий должны находиться в папке gamedata\scripts\, а второй в gamedata\config\ui\. Если их там нет или вообще нет папки gamedata, то значит Вам придётся извлечь их (1 и 2) из архивов дистрибутива (файлы gamedata/dbX) или отказаться от затеи русификации. Как распаковать архивы дистрибутива я не буду, т.к. про это не рассказали только самые ленивые, поэтому считаем, что эти файлы Вам доступны.&lt;br /&gt;
&lt;br /&gt;
Начинаем.&lt;br /&gt;
Сначала проделаем маленькую, но необходимую работу, а именно: определим индикатор/переключатель текущего языка ввода. Для этого открываем файл &amp;lt;b&amp;gt;ui_mm_save_dlg.xml&amp;lt;/b&amp;gt; и в конец тега form добавим строчки, чтобы получилось так:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
        &amp;lt;!-- оставляем исходное --&amp;gt;&lt;br /&gt;
	&amp;lt;st_lang x=&amp;quot;280&amp;quot; y=&amp;quot;400&amp;quot; width=&amp;quot;30&amp;quot; height=&amp;quot;20&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text font=&amp;quot;graffiti22&amp;quot; align=&amp;quot;c&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;text_color&amp;gt; &amp;lt;e r=&amp;quot;227&amp;quot; g=&amp;quot;199&amp;quot; b=&amp;quot;178&amp;quot;/&amp;gt; &amp;lt;h r=&amp;quot;255&amp;quot; g=&amp;quot;0&amp;quot; b=&amp;quot;0&amp;quot;/&amp;gt; &amp;lt;/text_color&amp;gt;&lt;br /&gt;
	&amp;lt;/st_lang&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Закрываем файл. Он нам больше не понадобится.&lt;br /&gt;
Теперь создадим таблицу перекодировки английских символов в кириллицу, которую запишем в наш 3й файл ui_save_dlg_rus.script.&lt;br /&gt;
Выглядит эта таблица так: &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local tbl_ansii = {&lt;br /&gt;
        [ 034 ] = 221, -- &amp;quot; --&amp;gt; Э&lt;br /&gt;
        [ 035 ] = 185, -- # --&amp;gt; №&lt;br /&gt;
	[ 039 ] = 253, -- ' --&amp;gt; э&lt;br /&gt;
	[ 044 ] = 225, -- , --&amp;gt; б&lt;br /&gt;
	[ 046 ] = 254, -- . --&amp;gt; ю&lt;br /&gt;
	[ 047 ] = 046, -- / --&amp;gt; .&lt;br /&gt;
	[ 058 ] = 198, -- : --&amp;gt; Ж&lt;br /&gt;
	[ 059 ] = 230, -- ; --&amp;gt; ж&lt;br /&gt;
	[ 060 ] = 193, -- &amp;lt; --&amp;gt; Б&lt;br /&gt;
	[ 062 ] = 222, -- &amp;gt; --&amp;gt; Ю&lt;br /&gt;
	[ 065 ] = 212, -- A --&amp;gt; Ф&lt;br /&gt;
	[ 066 ] = 200, -- B --&amp;gt; И&lt;br /&gt;
	[ 067 ] = 209, -- C --&amp;gt; С&lt;br /&gt;
	[ 068 ] = 194, -- D --&amp;gt; В&lt;br /&gt;
	[ 069 ] = 211, -- E --&amp;gt; У&lt;br /&gt;
	[ 070 ] = 192, -- F --&amp;gt; А&lt;br /&gt;
	[ 071 ] = 207, -- G --&amp;gt; П&lt;br /&gt;
	[ 072 ] = 208, -- H --&amp;gt; Р&lt;br /&gt;
	[ 073 ] = 216, -- I --&amp;gt; Ш&lt;br /&gt;
	[ 074 ] = 206, -- J --&amp;gt; О&lt;br /&gt;
	[ 075 ] = 203, -- K --&amp;gt; Л&lt;br /&gt;
	[ 076 ] = 196, -- L --&amp;gt; Д&lt;br /&gt;
	[ 077 ] = 220, -- M --&amp;gt; Ь&lt;br /&gt;
	[ 078 ] = 210, -- N --&amp;gt; Т&lt;br /&gt;
	[ 079 ] = 217, -- O --&amp;gt; Щ&lt;br /&gt;
	[ 080 ] = 199, -- P --&amp;gt; З&lt;br /&gt;
	[ 081 ] = 201, -- Q --&amp;gt; Й&lt;br /&gt;
	[ 082 ] = 202, -- R --&amp;gt; К&lt;br /&gt;
	[ 083 ] = 219, -- S --&amp;gt; Ы&lt;br /&gt;
	[ 084 ] = 197, -- T --&amp;gt; Е&lt;br /&gt;
	[ 085 ] = 195, -- U --&amp;gt; Г&lt;br /&gt;
	[ 086 ] = 204, -- V --&amp;gt; М&lt;br /&gt;
	[ 087 ] = 214, -- W --&amp;gt; Ц&lt;br /&gt;
	[ 088 ] = 215, -- X --&amp;gt; Ч&lt;br /&gt;
	[ 089 ] = 205, -- Y --&amp;gt; Н&lt;br /&gt;
	[ 090 ] = 223, -- Z --&amp;gt; Я&lt;br /&gt;
	[ 091 ] = 245, -- [ --&amp;gt; х&lt;br /&gt;
	[ 093 ] = 250, -- ] --&amp;gt; ъ&lt;br /&gt;
	[ 097 ] = 244, -- a --&amp;gt; ф&lt;br /&gt;
	[ 098 ] = 232, -- b --&amp;gt; и&lt;br /&gt;
	[ 099 ] = 241, -- c --&amp;gt; с&lt;br /&gt;
	[ 100 ] = 226, -- d --&amp;gt; в&lt;br /&gt;
	[ 101 ] = 243, -- e --&amp;gt; у&lt;br /&gt;
	[ 102 ] = 224, -- f --&amp;gt; а&lt;br /&gt;
	[ 103 ] = 239, -- g --&amp;gt; п&lt;br /&gt;
	[ 104 ] = 240, -- h --&amp;gt; р&lt;br /&gt;
	[ 105 ] = 248, -- i --&amp;gt; ш&lt;br /&gt;
	[ 106 ] = 238, -- j --&amp;gt; о&lt;br /&gt;
	[ 107 ] = 235, -- k --&amp;gt; л&lt;br /&gt;
	[ 108 ] = 228, -- l --&amp;gt; д&lt;br /&gt;
	[ 109 ] = 252, -- m --&amp;gt; ь&lt;br /&gt;
	[ 110 ] = 242, -- n --&amp;gt; т&lt;br /&gt;
	[ 111 ] = 249, -- o --&amp;gt; щ&lt;br /&gt;
	[ 112 ] = 231, -- p --&amp;gt; з&lt;br /&gt;
	[ 113 ] = 233, -- q --&amp;gt; й&lt;br /&gt;
	[ 114 ] = 234, -- r --&amp;gt; к&lt;br /&gt;
	[ 115 ] = 251, -- s --&amp;gt; ы&lt;br /&gt;
	[ 116 ] = 229, -- t --&amp;gt; е&lt;br /&gt;
	[ 117 ] = 227, -- u --&amp;gt; г&lt;br /&gt;
	[ 118 ] = 236, -- v --&amp;gt; м&lt;br /&gt;
	[ 119 ] = 246, -- w --&amp;gt; ц&lt;br /&gt;
	[ 120 ] = 247, -- x --&amp;gt; ч&lt;br /&gt;
	[ 121 ] = 237, -- y --&amp;gt; н&lt;br /&gt;
	[ 122 ] = 255, -- z --&amp;gt; я&lt;br /&gt;
	[ 123 ] = 213, -- { --&amp;gt; Х&lt;br /&gt;
	[ 125 ] = 218, -- } --&amp;gt; Ъ&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И напоследок откорректируем скрипт диалога сохранения. Для этого открываем в редакторе файл &amp;lt;b&amp;gt;ui_save_dialog.script&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
1. Вверху, сразу под комментариями описания скрипта, определяем несколько переменных: &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local t_lang,  edb_Pos, edb_Str = ui_save_dlg_rus.tbl_ansii, 1, {}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
где: t_lang – таблица перекодировки, edb_Pos – позиция курсора в поле EditBox (инициируется 1) и edb_Str – массив, в котором мы будем сохранять символы вводимого текста.&lt;br /&gt;
&lt;br /&gt;
2. Создадим индикатор текущего языка ввода текста.&lt;br /&gt;
&lt;br /&gt;
Договоримся, что переключать раскладку будем щелчком левой кнопки мыши по индикатору или клавишей левый-Ctrl (причем она будет работать как триггер), а переключать режим временного изменения языка ввода будем при нажатой и удерживаемой клавише левый-Alt.&lt;br /&gt;
Для этого в методе &amp;lt;b&amp;gt;save_dialog:InitControls()&amp;lt;/b&amp;gt; в самом конце вставим:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
self.ind_lan = xml:Init3tButton(&amp;quot;form:st_lang&amp;quot;, self.form)&lt;br /&gt;
self:Register(self.ind_lan, &amp;quot;button_lang&amp;quot;)&lt;br /&gt;
self.ind_lan:SetText(&amp;quot;Рус&amp;quot;)&lt;br /&gt;
self.mode_lang = true&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
где: self.mode_lang - флаг текущего языка ввода (true - русский, false - английский)&lt;br /&gt;
Всё, переключатель языка ввода мы создали, теперь надо обеспечить его функционирование.&lt;br /&gt;
Для этого в функцию &amp;lt;b&amp;gt;InitCallBacks()&amp;lt;/b&amp;gt; вставим строку:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
self:AddCallback(&amp;quot;button_lang&amp;quot;, ui_events.BUTTON_CLICKED, self.OnChg_lan, self)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
а этим под блоком вставляем функцию:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function save_dialog:OnChg_lan()&lt;br /&gt;
	self.mode_lang = not self.mode_lang&lt;br /&gt;
	if self.mode_lang then self.ind_lang:SetText(&amp;quot;Рус&amp;quot;)&lt;br /&gt;
	else self.ind_lang:SetText(&amp;quot;Eng&amp;quot;) end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Здесь всё ясно - сначала инвертируем флаг текущего языка ввода и потом меняем текст индикатора.&lt;br /&gt;
&lt;br /&gt;
Отлавливать факт переключения языка ввода и сам ввод в поле имени файла будем в системном прерывании &amp;lt;b&amp;gt;save_dialog:OnKeyboard(dik, keyboard_action)&amp;lt;/b&amp;gt;. Для этого добавим туда свои строки, чтобы в итоге получилось так:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function save_dialog:OnKeyboard(dik, keyboard_action)  --virtual function&lt;br /&gt;
    ui_base_dialog.base_dialog.OnKeyboard(self,dik,keyboard_action)&lt;br /&gt;
    DIK_RETURN = 28&lt;br /&gt;
    WINDOW_KEY_PRESSED = 6&lt;br /&gt;
    if dik == DIK_RETURN and keyboard_action == WINDOW_KEY_PRESSED then &lt;br /&gt;
        self:OnButton_ok_clicked()&lt;br /&gt;
        self.owner:Show(true)&lt;br /&gt;
        elseif keyboard_action == ui_events.WINDOW_KEY_PRESSED then&lt;br /&gt;
        if dik == DIK_keys.DIK_LCONTROL or dik == DIK_keys.DIK_LMENU then&lt;br /&gt;
            self:OnChg_lan()&lt;br /&gt;
        elseif dik == DIK_keys.DIK_LEFT then&lt;br /&gt;
            if edb_Pos &amp;gt; 1 then edb_Pos = edb_Pos - 1 end&lt;br /&gt;
        elseif dik == DIK_keys.DIK_RIGHT then&lt;br /&gt;
            if edb_Pos &amp;lt;= #edb_Str then edb_Pos = edb_Pos + 1 end&lt;br /&gt;
        elseif dik == DIK_keys.DIK_DELETE then&lt;br /&gt;
            if edb_Pos &amp;lt;= #edb_Str then table.remove(edb_Str,edb_Pos) end&lt;br /&gt;
        elseif dik == DIK_keys.DIK_BACK then&lt;br /&gt;
            if edb_Pos &amp;gt; 1 then edb_Pos = edb_Pos-1 end&lt;br /&gt;
            table.remove(edb_Str,edb_Pos)&lt;br /&gt;
        elseif     (dik &amp;gt;= 2  and dik &amp;lt;= 13) or &lt;br /&gt;
                        (dik &amp;gt;= 16 and dik &amp;lt;= 27) or &lt;br /&gt;
                        (dik &amp;gt;= 30 and dik &amp;lt;= 40) or&lt;br /&gt;
                        (dik &amp;gt;= 44 and dik &amp;lt;= 53) or&lt;br /&gt;
                        dik == 57 or &lt;br /&gt;
                        (dik &amp;gt;= 71 and dik &amp;lt;= 83) then self:OnEdit_CHANGED()&lt;br /&gt;
        end&lt;br /&gt;
    elseif keyboard_action == ui_events.WINDOW_KEY_RELEASED then&lt;br /&gt;
        if dik == DIK_keys.DIK_LMENU then&lt;br /&gt;
                self:OnChg_lan()&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return true&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь всё достаточно просто. При переключении языка вызывается метод &amp;lt;b&amp;gt;self:OnChg_lan()&amp;lt;/b&amp;gt;. При перемещении стрелками проверяем новое положение курсора и, если оно в пределах строки, то запоминаем его позицию. При удалении символа из строки удаляем соответствующий элемент из массива копии строки и опять же запоминаем текущую позицию ввода. При вводе текста  отлавливаются прерывания от всех клавиш с печатными символами и, если такое обнаружено, то вызывается функция обработчик, т.е. &amp;lt;b&amp;gt;OnEdit_CHANGED()&amp;lt;/b&amp;gt;. &amp;lt;i&amp;gt;Обратите внимание, что мы даже не пытаемся отловить ввод буквы ‘ё’, т.к. на этой же клавише размещена тильда ‘~’, которую движок «сталкера» обрабатывает специальным образом для вывода окна консоли.&amp;lt;/i&amp;gt;&lt;br /&gt;
И так, если мы зафиксировали факт нажатия клавиши с печатным символом, то вызывается функция &amp;lt;b&amp;gt;self:OnEdit_CHANGED&amp;lt;/b&amp;gt;, но её пока нет. Вот ею и займёмся.&lt;br /&gt;
&lt;br /&gt;
Сразу под созданной нами ранее &amp;lt;b&amp;gt;save_dialog:OnChg_lan()&amp;lt;/b&amp;gt; вставим ещё одну функцию:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function save_dialog:OnEdit_CHANGED()&lt;br /&gt;
    local str_edit = self:GetEditBox(&amp;quot;edit_filename&amp;quot;)   -- /1&lt;br /&gt;
    local sim = str_edit:GetText():match ('.',edb_Pos)  -- /2&lt;br /&gt;
    local cls = self.mode_lang and t_lang[sim:byte()]   -- /3&lt;br /&gt;
    sim = cls and string.char(cls) or sim               -- /4&lt;br /&gt;
    table.insert(edb_Str,edb_Pos,sim)                   -- /5&lt;br /&gt;
    edb_Pos = #edb_Str + 1                              -- /6&lt;br /&gt;
    str_edit:SetText(table.concat(edb_Str))             -- /7&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь тоже нет особых сложностей, но, тем не менее, прокомментируем наши действия.&lt;br /&gt;
Подключаемся к контролу EditBox (1) и получаем символ, находящийся в текущей позиции ввода (2). Если включен режим кириллицы, то ищем код переданного движком символа (он всегда английский) в таблице перекодировки и при его наличии получаем соответствующий код русского символа (3). Если код найден, то подменяем английский символ русским, а если нет, то оставляем всё как есть (4). Заносим полученный символ в массив копии строки ввода в соответствии со значение текущей позиции курсора (5). Устанавливаем новую текущую позиции ввода (6), преобразуем массив символов в строку и возвращаем её в поле ввода (7).&lt;br /&gt;
&lt;br /&gt;
Если Вы всё проделали правильно, то теперь можете вводить имя сохраняемого файла в английской, русской или смешанной кодировке, а также корректировать вводимый текст без искажения его синтаксиса.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Послесловие:&amp;lt;/u&amp;gt;&lt;br /&gt;
Этот алгоритм имеет отличие от стандартной обработки строки редактирования, которое выражается в том, что при вставке символа в середину строки, позиция ввода следующего символа всегда устанавливается в её конец, тогда как в “штатной” – текущей становится следующая позиция. В этой ситуации есть свой плюс и свой минус, однако в любом случае, как побороть это, я просто не знаю.&lt;/div&gt;</summary>
		<author><name>Serge!</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%A3%D1%87%D0%B8%D0%BC_S.T.A.L.K.E.R._%D0%A2%D0%A7_%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%BE%D0%BC%D1%83_%D1%8F%D0%B7%D1%8B%D0%BA%D1%83</id>
		<title>Учим S.T.A.L.K.E.R. ТЧ русскому языку</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A3%D1%87%D0%B8%D0%BC_S.T.A.L.K.E.R._%D0%A2%D0%A7_%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%BE%D0%BC%D1%83_%D1%8F%D0%B7%D1%8B%D0%BA%D1%83"/>
				<updated>2015-11-14T12:59:41Z</updated>
		
		<summary type="html">&lt;p&gt;Serge!: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;За много лет игры все уже почти привыкли, что сохранить текущее состояние в процессе игры мы можем только в файле с английской транскрипцией. Мне это не очень нравится и поэтому предлагаю способ научить ТЧ сохранить файлы с именами на русском или (это уже самостоятельно) на любом другом языке.&lt;br /&gt;
Это не сложно и справиться может каждый, кто знает, что такое есть текстовый редактор.&lt;br /&gt;
Для решения нашей задачи нам понадобятся файлы: &amp;lt;b&amp;gt;ui_save_dialog.script&amp;lt;/b&amp;gt; и &amp;lt;b&amp;gt;ui_mm_save_dlg.xml&amp;lt;/b&amp;gt; и ещё один, который мы создадим сами, с именем &amp;lt;b&amp;gt;ui_save_dlg_rus.script&amp;lt;/b&amp;gt;. Первый и третий должны находиться в папке gamedata\scripts\, а второй в gamedata\config\ui\. Если их там нет или вообще нет папки gamedata, то значит Вам придётся извлечь их (1 и 2) из архивов дистрибутива (файлы gamedata/dbX) или отказаться от затеи русификации. Как распаковать архивы дистрибутива я не буду, т.к. про это не рассказали только самые ленивые, поэтому считаем, что эти файлы Вам доступны.&lt;br /&gt;
&lt;br /&gt;
Начинаем.&lt;br /&gt;
Сначала проделаем маленькую, но необходимую работу, а именно: определим индикатор/переключатель текущего языка ввода. Для этого открываем файл &amp;lt;b&amp;gt;ui_mm_save_dlg.xml&amp;lt;/b&amp;gt; и в конец тега form добавим строчки, чтобы получилось так:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
        &amp;lt;!-- оставляем исходное --&amp;gt;&lt;br /&gt;
	&amp;lt;st_lang x=&amp;quot;280&amp;quot; y=&amp;quot;400&amp;quot; width=&amp;quot;30&amp;quot; height=&amp;quot;20&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text font=&amp;quot;graffiti22&amp;quot; align=&amp;quot;c&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;text_color&amp;gt; &amp;lt;e r=&amp;quot;227&amp;quot; g=&amp;quot;199&amp;quot; b=&amp;quot;178&amp;quot;/&amp;gt; &amp;lt;h r=&amp;quot;255&amp;quot; g=&amp;quot;0&amp;quot; b=&amp;quot;0&amp;quot;/&amp;gt; &amp;lt;/text_color&amp;gt;&lt;br /&gt;
	&amp;lt;/st_lang&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Закрываем файл. Он нам больше не понадобится.&lt;br /&gt;
Теперь создадим таблицу перекодировки английских символов в кириллицу, которую запишем в наш 3й файл ui_save_dlg_rus.script.&lt;br /&gt;
Выглядит эта таблица так: &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local tbl_ansii = {&lt;br /&gt;
        [ 034 ] = 221, -- &amp;quot; --&amp;gt; Э&lt;br /&gt;
        [ 035 ] = 185, -- # --&amp;gt; №&lt;br /&gt;
	[ 039 ] = 253, -- ' --&amp;gt; э&lt;br /&gt;
	[ 044 ] = 225, -- , --&amp;gt; б&lt;br /&gt;
	[ 046 ] = 254, -- . --&amp;gt; ю&lt;br /&gt;
	[ 047 ] = 046, -- / --&amp;gt; .&lt;br /&gt;
	[ 058 ] = 198, -- : --&amp;gt; Ж&lt;br /&gt;
	[ 059 ] = 230, -- ; --&amp;gt; ж&lt;br /&gt;
	[ 060 ] = 193, -- &amp;lt; --&amp;gt; Б&lt;br /&gt;
	[ 062 ] = 222, -- &amp;gt; --&amp;gt; Ю&lt;br /&gt;
	[ 065 ] = 212, -- A --&amp;gt; Ф&lt;br /&gt;
	[ 066 ] = 200, -- B --&amp;gt; И&lt;br /&gt;
	[ 067 ] = 209, -- C --&amp;gt; С&lt;br /&gt;
	[ 068 ] = 194, -- D --&amp;gt; В&lt;br /&gt;
	[ 069 ] = 211, -- E --&amp;gt; У&lt;br /&gt;
	[ 070 ] = 192, -- F --&amp;gt; А&lt;br /&gt;
	[ 071 ] = 207, -- G --&amp;gt; П&lt;br /&gt;
	[ 072 ] = 208, -- H --&amp;gt; Р&lt;br /&gt;
	[ 073 ] = 216, -- I --&amp;gt; Ш&lt;br /&gt;
	[ 074 ] = 206, -- J --&amp;gt; О&lt;br /&gt;
	[ 075 ] = 203, -- K --&amp;gt; Л&lt;br /&gt;
	[ 076 ] = 196, -- L --&amp;gt; Д&lt;br /&gt;
	[ 077 ] = 220, -- M --&amp;gt; Ь&lt;br /&gt;
	[ 078 ] = 210, -- N --&amp;gt; Т&lt;br /&gt;
	[ 079 ] = 217, -- O --&amp;gt; Щ&lt;br /&gt;
	[ 080 ] = 199, -- P --&amp;gt; З&lt;br /&gt;
	[ 081 ] = 201, -- Q --&amp;gt; Й&lt;br /&gt;
	[ 082 ] = 202, -- R --&amp;gt; К&lt;br /&gt;
	[ 083 ] = 219, -- S --&amp;gt; Ы&lt;br /&gt;
	[ 084 ] = 197, -- T --&amp;gt; Е&lt;br /&gt;
	[ 085 ] = 195, -- U --&amp;gt; Г&lt;br /&gt;
	[ 086 ] = 204, -- V --&amp;gt; М&lt;br /&gt;
	[ 087 ] = 214, -- W --&amp;gt; Ц&lt;br /&gt;
	[ 088 ] = 215, -- X --&amp;gt; Ч&lt;br /&gt;
	[ 089 ] = 205, -- Y --&amp;gt; Н&lt;br /&gt;
	[ 090 ] = 223, -- Z --&amp;gt; Я&lt;br /&gt;
	[ 091 ] = 245, -- [ --&amp;gt; х&lt;br /&gt;
	[ 093 ] = 250, -- ] --&amp;gt; ъ&lt;br /&gt;
	[ 097 ] = 244, -- a --&amp;gt; ф&lt;br /&gt;
	[ 098 ] = 232, -- b --&amp;gt; и&lt;br /&gt;
	[ 099 ] = 241, -- c --&amp;gt; с&lt;br /&gt;
	[ 100 ] = 226, -- d --&amp;gt; в&lt;br /&gt;
	[ 101 ] = 243, -- e --&amp;gt; у&lt;br /&gt;
	[ 102 ] = 224, -- f --&amp;gt; а&lt;br /&gt;
	[ 103 ] = 239, -- g --&amp;gt; п&lt;br /&gt;
	[ 104 ] = 240, -- h --&amp;gt; р&lt;br /&gt;
	[ 105 ] = 248, -- i --&amp;gt; ш&lt;br /&gt;
	[ 106 ] = 238, -- j --&amp;gt; о&lt;br /&gt;
	[ 107 ] = 235, -- k --&amp;gt; л&lt;br /&gt;
	[ 108 ] = 228, -- l --&amp;gt; д&lt;br /&gt;
	[ 109 ] = 252, -- m --&amp;gt; ь&lt;br /&gt;
	[ 110 ] = 242, -- n --&amp;gt; т&lt;br /&gt;
	[ 111 ] = 249, -- o --&amp;gt; щ&lt;br /&gt;
	[ 112 ] = 231, -- p --&amp;gt; з&lt;br /&gt;
	[ 113 ] = 233, -- q --&amp;gt; й&lt;br /&gt;
	[ 114 ] = 234, -- r --&amp;gt; к&lt;br /&gt;
	[ 115 ] = 251, -- s --&amp;gt; ы&lt;br /&gt;
	[ 116 ] = 229, -- t --&amp;gt; е&lt;br /&gt;
	[ 117 ] = 227, -- u --&amp;gt; г&lt;br /&gt;
	[ 118 ] = 236, -- v --&amp;gt; м&lt;br /&gt;
	[ 119 ] = 246, -- w --&amp;gt; ц&lt;br /&gt;
	[ 120 ] = 247, -- x --&amp;gt; ч&lt;br /&gt;
	[ 121 ] = 237, -- y --&amp;gt; н&lt;br /&gt;
	[ 122 ] = 255, -- z --&amp;gt; я&lt;br /&gt;
	[ 123 ] = 213, -- { --&amp;gt; Х&lt;br /&gt;
	[ 125 ] = 218, -- } --&amp;gt; Ъ&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И напоследок откорректируем скрипт диалога сохранения. Для этого открываем в редакторе файл &amp;lt;b&amp;gt;ui_save_dialog.script&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
1. Вверху, сразу под комментариями описания скрипта, определяем несколько переменных: &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local t_lang,  edb_Pos, edb_Str = ui_save_dlg_rus.tbl_ansii, 1, {}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
где: t_lang – таблица перекодировки, edb_Pos – позиция курсора в поле EditBox (инициируется 1) и edb_Str – массив, в котором мы будем сохранять символы вводимого текста.&lt;br /&gt;
&lt;br /&gt;
2. Создадим индикатор текущего языка ввода текста.&lt;br /&gt;
&lt;br /&gt;
Договоримся, что переключать раскладку будем щелчком левой кнопки мыши по индикатору или клавишей левый-Ctrl (причем она будет работать как триггер), а переключать режим временного изменения языка ввода будем при нажатой и удерживаемой клавише левый-Alt.&lt;br /&gt;
Для этого в методе &amp;lt;b&amp;gt;save_dialog:InitControls()&amp;lt;/b&amp;gt; в самом конце вставим:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
self.ind_lan = xml:Init3tButton(&amp;quot;form:st_lang&amp;quot;, self.form)&lt;br /&gt;
self:Register(self.ind_lan, &amp;quot;button_lang&amp;quot;)&lt;br /&gt;
self.ind_lan:SetText(&amp;quot;Рус&amp;quot;)&lt;br /&gt;
self.mode_lang = true&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
где: self.mode_lang - флаг текущего языка ввода (true - русский, false - английский)&lt;br /&gt;
Всё, переключатель языка ввода мы создали, теперь надо обеспечить его функционирование.&lt;br /&gt;
Для этого в функцию &amp;lt;b&amp;gt;InitCallBacks()&amp;lt;/b&amp;gt; вставим строку:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
self:AddCallback(&amp;quot;button_lang&amp;quot;, ui_events.BUTTON_CLICKED, self.OnChg_lan, self)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
а этим под блоком вставляем функцию:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function save_dialog:OnChg_lan()&lt;br /&gt;
	self.mode_lang = not self.mode_lang&lt;br /&gt;
	if self.mode_lang then self.ind_lang:SetText(&amp;quot;Рус&amp;quot;)&lt;br /&gt;
	else self.ind_lang:SetText(&amp;quot;Eng&amp;quot;) end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Здесь всё ясно - сначала инвертируем флаг текущего языка ввода и потом меняем текст индикатора.&lt;br /&gt;
&lt;br /&gt;
Отлавливать факт переключения языка ввода и сам ввод в поле имени файла будем в системном прерывании &amp;lt;b&amp;gt;save_dialog:OnKeyboard(dik, keyboard_action)&amp;lt;/b&amp;gt;. Для этого добавим туда свои строки, чтобы в итоге получилось так:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function save_dialog:OnKeyboard(dik, keyboard_action)  --virtual function&lt;br /&gt;
    ui_base_dialog.base_dialog.OnKeyboard(self,dik,keyboard_action)&lt;br /&gt;
    DIK_RETURN = 28&lt;br /&gt;
    WINDOW_KEY_PRESSED = 6&lt;br /&gt;
    if dik == DIK_RETURN and keyboard_action == WINDOW_KEY_PRESSED then &lt;br /&gt;
        self:OnButton_ok_clicked()&lt;br /&gt;
        self.owner:Show(true)&lt;br /&gt;
        elseif keyboard_action == ui_events.WINDOW_KEY_PRESSED then&lt;br /&gt;
        if dik == DIK_keys.DIK_LCONTROL or dik == DIK_keys.DIK_LMENU then&lt;br /&gt;
            self:OnChg_lan()&lt;br /&gt;
        elseif dik == DIK_keys.DIK_LEFT then&lt;br /&gt;
            if edb_Pos &amp;gt; 1 then edb_Pos = edb_Pos - 1 end&lt;br /&gt;
        elseif dik == DIK_keys.DIK_RIGHT then&lt;br /&gt;
            if edb_Pos &amp;lt;= #edb_Str then edb_Pos = edb_Pos + 1 end&lt;br /&gt;
        elseif dik == DIK_keys.DIK_DELETE then&lt;br /&gt;
            if edb_Pos &amp;lt;= #edb_Str then table.remove(edb_Str,edb_Pos) end&lt;br /&gt;
        elseif dik == DIK_keys.DIK_BACK then&lt;br /&gt;
            if edb_Pos &amp;gt; 1 then edb_Pos = edb_Pos-1 end&lt;br /&gt;
            table.remove(edb_Str,edb_Pos)&lt;br /&gt;
        elseif     (dik &amp;gt;= 2  and dik &amp;lt;= 13) or &lt;br /&gt;
                        (dik &amp;gt;= 16 and dik &amp;lt;= 27) or &lt;br /&gt;
                        (dik &amp;gt;= 30 and dik &amp;lt;= 40) or&lt;br /&gt;
                        (dik &amp;gt;= 44 and dik &amp;lt;= 53) or&lt;br /&gt;
                        dik == 57 or &lt;br /&gt;
                        (dik &amp;gt;= 71 and dik &amp;lt;= 83) then self:OnEdit_CHANGED()&lt;br /&gt;
        end&lt;br /&gt;
    elseif keyboard_action == ui_events.WINDOW_KEY_RELEASED then&lt;br /&gt;
        if dik == DIK_keys.DIK_LMENU then&lt;br /&gt;
                self:OnChg_lan()&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return true&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь всё достаточно просто. При переключении языка вызывается метод &amp;lt;b&amp;gt;self:OnChg_lan()&amp;lt;/b&amp;gt;. При перемещении стрелками проверяем новое положение курсора и, если оно в пределах строки, то запоминаем его позицию. При удалении символа из строки удаляем соответствующий элемент из массива копии строки и опять же запоминаем текущую позицию ввода. При вводе текста  отлавливаются прерывания от всех клавиш с печатными символами и, если такое обнаружено, то вызывается функция обработчик, т.е. &amp;lt;b&amp;gt;OnEdit_CHANGED()&amp;lt;/b&amp;gt;. &amp;lt;k&amp;gt;Обратите внимание, что мы даже не пытаемся отловить ввод буквы ‘ё’, т.к. на этой же клавише размещена тильда ‘~’, которую движок «сталкера» обрабатывает специальным образом для вывода окна консоли.&amp;lt;/k&amp;gt;&lt;br /&gt;
И так, если мы зафиксировали факт нажатия клавиши с печатным символом, то вызывается функция &amp;lt;b&amp;gt;self:OnEdit_CHANGED&amp;lt;/b&amp;gt;, но её пока нет. Вот ею и займёмся.&lt;br /&gt;
&lt;br /&gt;
Сразу под созданной нами ранее &amp;lt;b&amp;gt;save_dialog:OnChg_lan()&amp;lt;/b&amp;gt; вставим ещё одну функцию:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function save_dialog:OnEdit_CHANGED()&lt;br /&gt;
    local str_edit = self:GetEditBox(&amp;quot;edit_filename&amp;quot;)   -- /1&lt;br /&gt;
    local sim = str_edit:GetText():match ('.',edb_Pos)  -- /2&lt;br /&gt;
    local cls = self.mode_lang and t_lang[sim:byte()]   -- /3&lt;br /&gt;
    sim = cls and string.char(cls) or sim               -- /4&lt;br /&gt;
    table.insert(edb_Str,edb_Pos,sim)                   -- /5&lt;br /&gt;
    edb_Pos = #edb_Str + 1                              -- /6&lt;br /&gt;
    str_edit:SetText(table.concat(edb_Str))             -- /7&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь тоже нет особых сложностей, но, тем не менее, прокомментируем наши действия.&lt;br /&gt;
Подключаемся к контролу EditBox (1) и получаем символ, находящийся в текущей позиции ввода (2). Если включен режим кириллицы, то ищем код переданного движком символа (он всегда английский) в таблице перекодировки и при его наличии получаем соответствующий код русского символа (3). Если код найден, то подменяем английский символ русским, а если нет, то оставляем всё как есть (4). Заносим полученный символ в массив копии строки ввода в соответствии со значение текущей позиции курсора (5). Устанавливаем новую текущую позиции ввода (6), преобразуем массив символов в строку и возвращаем её в поле ввода (7).&lt;br /&gt;
&lt;br /&gt;
Если Вы всё проделали правильно, то теперь можете вводить имя сохраняемого файла в английской, русской или смешанной кодировке, а также корректировать вводимый текст без искажения его синтаксиса.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Послесловие:&amp;lt;/u&amp;gt;&lt;br /&gt;
Этот алгоритм имеет отличие от стандартной обработки строки редактирования, которое выражается в том, что при вставке символа в середину строки, позиция ввода следующего символа всегда устанавливается в её конец, тогда как в “штатной” – текущей становится следующая позиция. В этой ситуации есть свой плюс и свой минус, однако в любом случае, как побороть это, я просто не знаю.&lt;/div&gt;</summary>
		<author><name>Serge!</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%A3%D1%87%D0%B8%D0%BC_S.T.A.L.K.E.R._%D0%A2%D0%A7_%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%BE%D0%BC%D1%83_%D1%8F%D0%B7%D1%8B%D0%BA%D1%83</id>
		<title>Учим S.T.A.L.K.E.R. ТЧ русскому языку</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A3%D1%87%D0%B8%D0%BC_S.T.A.L.K.E.R._%D0%A2%D0%A7_%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%BE%D0%BC%D1%83_%D1%8F%D0%B7%D1%8B%D0%BA%D1%83"/>
				<updated>2015-11-14T12:57:55Z</updated>
		
		<summary type="html">&lt;p&gt;Serge!: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;За много лет игры все уже почти привыкли, что сохранить текущее состояние в процессе игры мы можем только в файле с английской транскрипцией. Мне это не очень нравится и поэтому предлагаю способ научить ТЧ сохранить файлы с именами на русском или (это уже самостоятельно) на любом другом языке.&lt;br /&gt;
Это не сложно и справиться может каждый, кто знает, что такое есть текстовый редактор.&lt;br /&gt;
Для решения нашей задачи нам понадобятся файлы: &amp;lt;b&amp;gt;ui_save_dialog.script&amp;lt;/b&amp;gt; и &amp;lt;b&amp;gt;ui_mm_save_dlg.xml&amp;lt;/b&amp;gt; и ещё один, который мы создадим сами, с именем &amp;lt;b&amp;gt;ui_save_dlg_rus.script&amp;lt;/b&amp;gt;. Первый и третий должны находиться в папке gamedata\scripts\, а второй в gamedata\config\ui\. Если их там нет или вообще нет папки gamedata, то значит Вам придётся извлечь их (1 и 2) из архивов дистрибутива (файлы gamedata/dbX) или отказаться от затеи русификации. Как распаковать архивы дистрибутива я не буду, т.к. про это не рассказали только самые ленивые, поэтому считаем, что эти файлы Вам доступны.&lt;br /&gt;
&lt;br /&gt;
Начинаем.&lt;br /&gt;
Сначала проделаем маленькую, но необходимую работу, а именно: определим индикатор/переключатель текущего языка ввода. Для этого открываем файл &amp;lt;b&amp;gt;ui_mm_save_dlg.xml&amp;lt;/b&amp;gt; и в конец тега form добавим строчки, чтобы получилось так:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
        &amp;lt;!-- оставляем исходное --&amp;gt;&lt;br /&gt;
	&amp;lt;st_lang x=&amp;quot;280&amp;quot; y=&amp;quot;400&amp;quot; width=&amp;quot;30&amp;quot; height=&amp;quot;20&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text font=&amp;quot;graffiti22&amp;quot; align=&amp;quot;c&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;text_color&amp;gt; &amp;lt;e r=&amp;quot;227&amp;quot; g=&amp;quot;199&amp;quot; b=&amp;quot;178&amp;quot;/&amp;gt; &amp;lt;h r=&amp;quot;255&amp;quot; g=&amp;quot;0&amp;quot; b=&amp;quot;0&amp;quot;/&amp;gt; &amp;lt;/text_color&amp;gt;&lt;br /&gt;
	&amp;lt;/st_lang&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Закрываем файл. Он нам больше не понадобится.&lt;br /&gt;
Теперь создадим таблицу перекодировки английских символов в кириллицу, которую запишем в наш 3й файл ui_save_dlg_rus.script.&lt;br /&gt;
Выглядит эта таблица так: &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local tbl_ansii = {&lt;br /&gt;
        [ 034 ] = 221, -- &amp;quot; --&amp;gt; Э&lt;br /&gt;
        [ 035 ] = 185, -- # --&amp;gt; №&lt;br /&gt;
	[ 039 ] = 253, -- ' --&amp;gt; э&lt;br /&gt;
	[ 044 ] = 225, -- , --&amp;gt; б&lt;br /&gt;
	[ 046 ] = 254, -- . --&amp;gt; ю&lt;br /&gt;
	[ 047 ] = 046, -- / --&amp;gt; .&lt;br /&gt;
	[ 058 ] = 198, -- : --&amp;gt; Ж&lt;br /&gt;
	[ 059 ] = 230, -- ; --&amp;gt; ж&lt;br /&gt;
	[ 060 ] = 193, -- &amp;lt; --&amp;gt; Б&lt;br /&gt;
	[ 062 ] = 222, -- &amp;gt; --&amp;gt; Ю&lt;br /&gt;
	[ 065 ] = 212, -- A --&amp;gt; Ф&lt;br /&gt;
	[ 066 ] = 200, -- B --&amp;gt; И&lt;br /&gt;
	[ 067 ] = 209, -- C --&amp;gt; С&lt;br /&gt;
	[ 068 ] = 194, -- D --&amp;gt; В&lt;br /&gt;
	[ 069 ] = 211, -- E --&amp;gt; У&lt;br /&gt;
	[ 070 ] = 192, -- F --&amp;gt; А&lt;br /&gt;
	[ 071 ] = 207, -- G --&amp;gt; П&lt;br /&gt;
	[ 072 ] = 208, -- H --&amp;gt; Р&lt;br /&gt;
	[ 073 ] = 216, -- I --&amp;gt; Ш&lt;br /&gt;
	[ 074 ] = 206, -- J --&amp;gt; О&lt;br /&gt;
	[ 075 ] = 203, -- K --&amp;gt; Л&lt;br /&gt;
	[ 076 ] = 196, -- L --&amp;gt; Д&lt;br /&gt;
	[ 077 ] = 220, -- M --&amp;gt; Ь&lt;br /&gt;
	[ 078 ] = 210, -- N --&amp;gt; Т&lt;br /&gt;
	[ 079 ] = 217, -- O --&amp;gt; Щ&lt;br /&gt;
	[ 080 ] = 199, -- P --&amp;gt; З&lt;br /&gt;
	[ 081 ] = 201, -- Q --&amp;gt; Й&lt;br /&gt;
	[ 082 ] = 202, -- R --&amp;gt; К&lt;br /&gt;
	[ 083 ] = 219, -- S --&amp;gt; Ы&lt;br /&gt;
	[ 084 ] = 197, -- T --&amp;gt; Е&lt;br /&gt;
	[ 085 ] = 195, -- U --&amp;gt; Г&lt;br /&gt;
	[ 086 ] = 204, -- V --&amp;gt; М&lt;br /&gt;
	[ 087 ] = 214, -- W --&amp;gt; Ц&lt;br /&gt;
	[ 088 ] = 215, -- X --&amp;gt; Ч&lt;br /&gt;
	[ 089 ] = 205, -- Y --&amp;gt; Н&lt;br /&gt;
	[ 090 ] = 223, -- Z --&amp;gt; Я&lt;br /&gt;
	[ 091 ] = 245, -- [ --&amp;gt; х&lt;br /&gt;
	[ 093 ] = 250, -- ] --&amp;gt; ъ&lt;br /&gt;
	[ 097 ] = 244, -- a --&amp;gt; ф&lt;br /&gt;
	[ 098 ] = 232, -- b --&amp;gt; и&lt;br /&gt;
	[ 099 ] = 241, -- c --&amp;gt; с&lt;br /&gt;
	[ 100 ] = 226, -- d --&amp;gt; в&lt;br /&gt;
	[ 101 ] = 243, -- e --&amp;gt; у&lt;br /&gt;
	[ 102 ] = 224, -- f --&amp;gt; а&lt;br /&gt;
	[ 103 ] = 239, -- g --&amp;gt; п&lt;br /&gt;
	[ 104 ] = 240, -- h --&amp;gt; р&lt;br /&gt;
	[ 105 ] = 248, -- i --&amp;gt; ш&lt;br /&gt;
	[ 106 ] = 238, -- j --&amp;gt; о&lt;br /&gt;
	[ 107 ] = 235, -- k --&amp;gt; л&lt;br /&gt;
	[ 108 ] = 228, -- l --&amp;gt; д&lt;br /&gt;
	[ 109 ] = 252, -- m --&amp;gt; ь&lt;br /&gt;
	[ 110 ] = 242, -- n --&amp;gt; т&lt;br /&gt;
	[ 111 ] = 249, -- o --&amp;gt; щ&lt;br /&gt;
	[ 112 ] = 231, -- p --&amp;gt; з&lt;br /&gt;
	[ 113 ] = 233, -- q --&amp;gt; й&lt;br /&gt;
	[ 114 ] = 234, -- r --&amp;gt; к&lt;br /&gt;
	[ 115 ] = 251, -- s --&amp;gt; ы&lt;br /&gt;
	[ 116 ] = 229, -- t --&amp;gt; е&lt;br /&gt;
	[ 117 ] = 227, -- u --&amp;gt; г&lt;br /&gt;
	[ 118 ] = 236, -- v --&amp;gt; м&lt;br /&gt;
	[ 119 ] = 246, -- w --&amp;gt; ц&lt;br /&gt;
	[ 120 ] = 247, -- x --&amp;gt; ч&lt;br /&gt;
	[ 121 ] = 237, -- y --&amp;gt; н&lt;br /&gt;
	[ 122 ] = 255, -- z --&amp;gt; я&lt;br /&gt;
	[ 123 ] = 213, -- { --&amp;gt; Х&lt;br /&gt;
	[ 125 ] = 218, -- } --&amp;gt; Ъ&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И напоследок откорректируем скрипт диалога сохранения. Для этого открываем в редакторе файл &amp;lt;b&amp;gt;ui_save_dialog.script&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
1. Вверху, сразу под комментариями описания скрипта, определяем несколько переменных: &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local t_lang,  edb_Pos, edb_Str = ui_save_dlg_rus.tbl_ansii, 1, {}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
где: t_lang – таблица перекодировки, edb_Pos – позиция курсора в поле EditBox (инициируется 1) и edb_Str – массив, в котором мы будем сохранять символы вводимого текста.&lt;br /&gt;
&lt;br /&gt;
2. Создадим индикатор текущего языка ввода текста.&lt;br /&gt;
&lt;br /&gt;
Договоримся, что переключать раскладку будем щелчком левой кнопки мыши по индикатору или клавишей левый-Ctrl (причем она будет работать как триггер), а переключать режим временного изменения языка ввода будем при нажатой и удерживаемой клавише левый-Alt.&lt;br /&gt;
Для этого в методе &amp;lt;b&amp;gt;save_dialog:InitControls()&amp;lt;/b&amp;gt; в самом конце вставим:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
self.ind_lan = xml:Init3tButton(&amp;quot;form:st_lang&amp;quot;, self.form)&lt;br /&gt;
self:Register(self.ind_lan, &amp;quot;button_lang&amp;quot;)&lt;br /&gt;
self.ind_lan:SetText(&amp;quot;Рус&amp;quot;)&lt;br /&gt;
self.mode_lang = true&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
где: self.mode_lang - флаг текущего языка ввода (true - русский, false - английский)&lt;br /&gt;
Всё, переключатель языка ввода мы создали, теперь надо обеспечить его функционирование.&lt;br /&gt;
Для этого в функцию &amp;lt;b&amp;gt;InitCallBacks()&amp;lt;/b&amp;gt; вставим строку:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
self:AddCallback(&amp;quot;button_lang&amp;quot;, ui_events.BUTTON_CLICKED, self.OnChg_lan, self)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
а этим под блоком вставляем функцию:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function save_dialog:OnChg_lan()&lt;br /&gt;
	self.mode_lang = not self.mode_lang&lt;br /&gt;
	if self.mode_lang then self.ind_lang:SetText(&amp;quot;Рус&amp;quot;)&lt;br /&gt;
	else self.ind_lang:SetText(&amp;quot;Eng&amp;quot;) end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Здесь всё ясно - сначала инвертируем флаг текущего языка ввода и потом меняем текст индикатора.&lt;br /&gt;
&lt;br /&gt;
Отлавливать факт переключения языка ввода и сам ввод в поле имени файла будем в системном прерывании &amp;lt;b&amp;gt;save_dialog:OnKeyboard(dik, keyboard_action)&amp;lt;/b&amp;gt;. Для этого добавим туда свои строки, чтобы в итоге получилось так:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function save_dialog:OnKeyboard(dik, keyboard_action)  --virtual function&lt;br /&gt;
    ui_base_dialog.base_dialog.OnKeyboard(self,dik,keyboard_action)&lt;br /&gt;
    DIK_RETURN = 28&lt;br /&gt;
    WINDOW_KEY_PRESSED = 6&lt;br /&gt;
    if dik == DIK_RETURN and keyboard_action == WINDOW_KEY_PRESSED then &lt;br /&gt;
        self:OnButton_ok_clicked()&lt;br /&gt;
        self.owner:Show(true)&lt;br /&gt;
        elseif keyboard_action == ui_events.WINDOW_KEY_PRESSED then&lt;br /&gt;
        if dik == DIK_keys.DIK_LCONTROL or dik == DIK_keys.DIK_LMENU then&lt;br /&gt;
            self:OnChg_lan()&lt;br /&gt;
        elseif dik == DIK_keys.DIK_LEFT then&lt;br /&gt;
            if edb_Pos &amp;gt; 1 then edb_Pos = edb_Pos - 1 end&lt;br /&gt;
        elseif dik == DIK_keys.DIK_RIGHT then&lt;br /&gt;
            if edb_Pos &amp;lt;= #edb_Str then edb_Pos = edb_Pos + 1 end&lt;br /&gt;
        elseif dik == DIK_keys.DIK_DELETE then&lt;br /&gt;
            if edb_Pos &amp;lt;= #edb_Str then table.remove(edb_Str,edb_Pos) end&lt;br /&gt;
        elseif dik == DIK_keys.DIK_BACK then&lt;br /&gt;
            if edb_Pos &amp;gt; 1 then edb_Pos = edb_Pos-1 end&lt;br /&gt;
            table.remove(edb_Str,edb_Pos)&lt;br /&gt;
        elseif     (dik &amp;gt;= 2  and dik &amp;lt;= 13) or &lt;br /&gt;
                        (dik &amp;gt;= 16 and dik &amp;lt;= 27) or &lt;br /&gt;
                        (dik &amp;gt;= 30 and dik &amp;lt;= 40) or&lt;br /&gt;
                        (dik &amp;gt;= 44 and dik &amp;lt;= 53) or&lt;br /&gt;
                        dik == 57 or &lt;br /&gt;
                        (dik &amp;gt;= 71 and dik &amp;lt;= 83) then self:OnEdit_CHANGED()&lt;br /&gt;
        end&lt;br /&gt;
    elseif keyboard_action == ui_events.WINDOW_KEY_RELEASED then&lt;br /&gt;
        if dik == DIK_keys.DIK_LMENU then&lt;br /&gt;
                self:OnChg_lan()&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return true&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь всё достаточно просто. При переключении языка вызывается метод &amp;lt;b&amp;gt;self:OnChg_lan()&amp;lt;/b&amp;gt;. При перемещении стрелками проверяем новое положение курсора и, если оно в пределах строки, то запоминаем его позицию. При удалении символа из строки удаляем соответствующий элемент из массива копии строки и опять же запоминаем текущую позицию ввода. При вводе текста  отлавливаются прерывания от всех клавиш с печатными символами и, если такое обнаружено, то вызывается функция обработчик, т.е. &amp;lt;b&amp;gt;OnEdit_CHANGED()&amp;lt;/&amp;gt;. Обратите внимание, что мы даже не пытаемся отловить ввод буквы ‘ё’, т.к. на этой же клавише размещена тильда ‘~’, которую движок «сталкера» обрабатывает специальным образом для вывода окна консоли.&lt;br /&gt;
И так, если мы зафиксировали факт нажатия клавиши с печатным символом, то вызывается функция &amp;lt;b&amp;gt;self:OnEdit_CHANGED&amp;lt;/b&amp;gt;, но её пока нет. Вот ею и займёмся.&lt;br /&gt;
&lt;br /&gt;
Сразу под созданной нами ранее &amp;lt;b&amp;gt;save_dialog:OnChg_lan()&amp;lt;/b&amp;gt; вставим ещё одну функцию:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function save_dialog:OnEdit_CHANGED()&lt;br /&gt;
    local str_edit = self:GetEditBox(&amp;quot;edit_filename&amp;quot;)   -- /1&lt;br /&gt;
    local sim = str_edit:GetText():match ('.',edb_Pos)  -- /2&lt;br /&gt;
    local cls = self.mode_lang and t_lang[sim:byte()]   -- /3&lt;br /&gt;
    sim = cls and string.char(cls) or sim               -- /4&lt;br /&gt;
    table.insert(edb_Str,edb_Pos,sim)                   -- /5&lt;br /&gt;
    edb_Pos = #edb_Str + 1                              -- /6&lt;br /&gt;
    str_edit:SetText(table.concat(edb_Str))             -- /7&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь тоже нет особых сложностей, но, тем не менее, прокомментируем наши действия.&lt;br /&gt;
Подключаемся к контролу EditBox (1) и получаем символ, находящийся в текущей позиции ввода (2). Если включен режим кириллицы, то ищем код переданного движком символа (он всегда английский) в таблице перекодировки и при его наличии получаем соответствующий код русского символа (3). Если код найден, то подменяем английский символ русским, а если нет, то оставляем всё как есть (4). Заносим полученный символ в массив копии строки ввода в соответствии со значение текущей позиции курсора (5). Устанавливаем новую текущую позиции ввода (6), преобразуем массив символов в строку и возвращаем её в поле ввода (7).&lt;br /&gt;
&lt;br /&gt;
Если Вы всё проделали правильно, то теперь можете вводить имя сохраняемого файла в английской, русской или смешанной кодировке, а также корректировать вводимый текст без искажения его синтаксиса.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Послесловие:&amp;lt;/u&amp;gt;&lt;br /&gt;
Этот алгоритм имеет отличие от стандартной обработки строки редактирования, которое выражается в том, что при вставке символа в середину строки, позиция ввода следующего символа всегда устанавливается в её конец, тогда как в “штатной” – текущей становится следующая позиция. В этой ситуации есть свой плюс и свой минус, однако в любом случае, как побороть это, я просто не знаю.&lt;/div&gt;</summary>
		<author><name>Serge!</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%A3%D1%87%D0%B8%D0%BC_S.T.A.L.K.E.R._%D0%A2%D0%A7_%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%BE%D0%BC%D1%83_%D1%8F%D0%B7%D1%8B%D0%BA%D1%83</id>
		<title>Учим S.T.A.L.K.E.R. ТЧ русскому языку</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A3%D1%87%D0%B8%D0%BC_S.T.A.L.K.E.R._%D0%A2%D0%A7_%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%BE%D0%BC%D1%83_%D1%8F%D0%B7%D1%8B%D0%BA%D1%83"/>
				<updated>2015-11-14T12:47:25Z</updated>
		
		<summary type="html">&lt;p&gt;Serge!: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;За много лет игры все уже почти привыкли, что сохранить текущее состояние в процессе игры мы можем только в файле с английской транскрипцией. Мне это не очень нравится и поэтому предлагаю способ научить ТЧ сохранить файлы с именами на русском или (это уже самостоятельно) на любом другом языке.&lt;br /&gt;
Это не сложно и справиться может каждый, кто знает, что такое есть текстовый редактор.&lt;br /&gt;
Для решения нашей задачи нам понадобятся файлы: ui_save_dialog.script и ui_mm_save_dlg.xml и ещё один, который мы создадим сами, с именем ui_save_dlg_rus.script. Первый и третий должны находиться в папке gamedata\scripts\, а второй в gamedata\config\ui\. Если их там нет или вообще нет папки gamedata, то значит Вам придётся извлечь их (1 и 2) из архивов дистрибутива (файлы gamedata/dbX) или отказаться от затеи русификации. Как распаковать архивы дистрибутива я не буду, т.к. про это не рассказали только самые ленивые, поэтому считаем, что эти файлы Вам доступны.&lt;br /&gt;
&lt;br /&gt;
Начинаем.&lt;br /&gt;
Сначала проделаем маленькую, но необходимую работу, а именно: определим индикатор/переключатель текущего языка ввода. Для этого открываем файл ui_mm_save_dlg.xml и в конец тега form добавим строчки, чтобы получилось так:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
        &amp;lt;!-- оставляем исходное --&amp;gt;&lt;br /&gt;
	&amp;lt;st_lang x=&amp;quot;280&amp;quot; y=&amp;quot;400&amp;quot; width=&amp;quot;30&amp;quot; height=&amp;quot;20&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text font=&amp;quot;graffiti22&amp;quot; align=&amp;quot;c&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;text_color&amp;gt; &amp;lt;e r=&amp;quot;227&amp;quot; g=&amp;quot;199&amp;quot; b=&amp;quot;178&amp;quot;/&amp;gt; &amp;lt;h r=&amp;quot;255&amp;quot; g=&amp;quot;0&amp;quot; b=&amp;quot;0&amp;quot;/&amp;gt; &amp;lt;/text_color&amp;gt;&lt;br /&gt;
	&amp;lt;/st_lang&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Закрываем файл. Он нам больше не понадобится.&lt;br /&gt;
Теперь создадим таблицу перекодировки английских символов в кириллицу, которую запишем в наш 3-й файл ui_save_dlg_rus.script.&lt;br /&gt;
Выглядит эта таблица так: &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local tbl_ansii = {&lt;br /&gt;
        [ 034 ] = 221, -- &amp;quot; --&amp;gt; Э&lt;br /&gt;
        [ 035 ] = 185, -- # --&amp;gt; №&lt;br /&gt;
	[ 039 ] = 253, -- ' --&amp;gt; э&lt;br /&gt;
	[ 044 ] = 225, -- , --&amp;gt; б&lt;br /&gt;
	[ 046 ] = 254, -- . --&amp;gt; ю&lt;br /&gt;
	[ 047 ] = 046, -- / --&amp;gt; .&lt;br /&gt;
	[ 058 ] = 198, -- : --&amp;gt; Ж&lt;br /&gt;
	[ 059 ] = 230, -- ; --&amp;gt; ж&lt;br /&gt;
	[ 060 ] = 193, -- &amp;lt; --&amp;gt; Б&lt;br /&gt;
	[ 062 ] = 222, -- &amp;gt; --&amp;gt; Ю&lt;br /&gt;
	[ 065 ] = 212, -- A --&amp;gt; Ф&lt;br /&gt;
	[ 066 ] = 200, -- B --&amp;gt; И&lt;br /&gt;
	[ 067 ] = 209, -- C --&amp;gt; С&lt;br /&gt;
	[ 068 ] = 194, -- D --&amp;gt; В&lt;br /&gt;
	[ 069 ] = 211, -- E --&amp;gt; У&lt;br /&gt;
	[ 070 ] = 192, -- F --&amp;gt; А&lt;br /&gt;
	[ 071 ] = 207, -- G --&amp;gt; П&lt;br /&gt;
	[ 072 ] = 208, -- H --&amp;gt; Р&lt;br /&gt;
	[ 073 ] = 216, -- I --&amp;gt; Ш&lt;br /&gt;
	[ 074 ] = 206, -- J --&amp;gt; О&lt;br /&gt;
	[ 075 ] = 203, -- K --&amp;gt; Л&lt;br /&gt;
	[ 076 ] = 196, -- L --&amp;gt; Д&lt;br /&gt;
	[ 077 ] = 220, -- M --&amp;gt; Ь&lt;br /&gt;
	[ 078 ] = 210, -- N --&amp;gt; Т&lt;br /&gt;
	[ 079 ] = 217, -- O --&amp;gt; Щ&lt;br /&gt;
	[ 080 ] = 199, -- P --&amp;gt; З&lt;br /&gt;
	[ 081 ] = 201, -- Q --&amp;gt; Й&lt;br /&gt;
	[ 082 ] = 202, -- R --&amp;gt; К&lt;br /&gt;
	[ 083 ] = 219, -- S --&amp;gt; Ы&lt;br /&gt;
	[ 084 ] = 197, -- T --&amp;gt; Е&lt;br /&gt;
	[ 085 ] = 195, -- U --&amp;gt; Г&lt;br /&gt;
	[ 086 ] = 204, -- V --&amp;gt; М&lt;br /&gt;
	[ 087 ] = 214, -- W --&amp;gt; Ц&lt;br /&gt;
	[ 088 ] = 215, -- X --&amp;gt; Ч&lt;br /&gt;
	[ 089 ] = 205, -- Y --&amp;gt; Н&lt;br /&gt;
	[ 090 ] = 223, -- Z --&amp;gt; Я&lt;br /&gt;
	[ 091 ] = 245, -- [ --&amp;gt; х&lt;br /&gt;
	[ 093 ] = 250, -- ] --&amp;gt; ъ&lt;br /&gt;
	[ 097 ] = 244, -- a --&amp;gt; ф&lt;br /&gt;
	[ 098 ] = 232, -- b --&amp;gt; и&lt;br /&gt;
	[ 099 ] = 241, -- c --&amp;gt; с&lt;br /&gt;
	[ 100 ] = 226, -- d --&amp;gt; в&lt;br /&gt;
	[ 101 ] = 243, -- e --&amp;gt; у&lt;br /&gt;
	[ 102 ] = 224, -- f --&amp;gt; а&lt;br /&gt;
	[ 103 ] = 239, -- g --&amp;gt; п&lt;br /&gt;
	[ 104 ] = 240, -- h --&amp;gt; р&lt;br /&gt;
	[ 105 ] = 248, -- i --&amp;gt; ш&lt;br /&gt;
	[ 106 ] = 238, -- j --&amp;gt; о&lt;br /&gt;
	[ 107 ] = 235, -- k --&amp;gt; л&lt;br /&gt;
	[ 108 ] = 228, -- l --&amp;gt; д&lt;br /&gt;
	[ 109 ] = 252, -- m --&amp;gt; ь&lt;br /&gt;
	[ 110 ] = 242, -- n --&amp;gt; т&lt;br /&gt;
	[ 111 ] = 249, -- o --&amp;gt; щ&lt;br /&gt;
	[ 112 ] = 231, -- p --&amp;gt; з&lt;br /&gt;
	[ 113 ] = 233, -- q --&amp;gt; й&lt;br /&gt;
	[ 114 ] = 234, -- r --&amp;gt; к&lt;br /&gt;
	[ 115 ] = 251, -- s --&amp;gt; ы&lt;br /&gt;
	[ 116 ] = 229, -- t --&amp;gt; е&lt;br /&gt;
	[ 117 ] = 227, -- u --&amp;gt; г&lt;br /&gt;
	[ 118 ] = 236, -- v --&amp;gt; м&lt;br /&gt;
	[ 119 ] = 246, -- w --&amp;gt; ц&lt;br /&gt;
	[ 120 ] = 247, -- x --&amp;gt; ч&lt;br /&gt;
	[ 121 ] = 237, -- y --&amp;gt; н&lt;br /&gt;
	[ 122 ] = 255, -- z --&amp;gt; я&lt;br /&gt;
	[ 123 ] = 213, -- { --&amp;gt; Х&lt;br /&gt;
	[ 125 ] = 218, -- } --&amp;gt; Ъ&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И напоследок откорректируем скрипт диалога сохранения. Для этого открываем в редакторе файл ui_save_dialog.script.&lt;br /&gt;
&lt;br /&gt;
1. Вверху, сразу под комментариями описания скрипта, определяем несколько переменных: &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local t_lang,  edb_Pos, edb_Str = ui_save_dlg_rus.tbl_ansii, 1, {}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
где: t_lang – таблица перекодировки, edb_Pos – позиция курсора в поле EditBox (инициируется 1) и edb_Str – массив, в котором мы будем сохранять символы вводимого текста.&lt;br /&gt;
&lt;br /&gt;
2. Создадим индикатор текущего языка ввода текста.&lt;br /&gt;
&lt;br /&gt;
Договоримся, что переключать раскладку будем щелчком левой кнопки мыши по индикатору или клавишей левый-Ctrl (причем она будет работать как триггер), а переключать режим временного изменения языка ввода будем при нажатой и удерживаемой клавише левый-Alt.&lt;br /&gt;
Для этого в методе save_dialog:InitControls() в самом конце вставим:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
self.ind_lan = xml:Init3tButton(&amp;quot;form:st_lang&amp;quot;, self.form)&lt;br /&gt;
self:Register(self.ind_lan, &amp;quot;button_lang&amp;quot;)&lt;br /&gt;
self.ind_lan:SetText(&amp;quot;Рус&amp;quot;)&lt;br /&gt;
self.mode_lang = true&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
где: self.mode_lang - флаг текущего языка ввода (true - русский, false - английский)&lt;br /&gt;
Всё, переключатель языка ввода мы создали, теперь надо обеспечить его функционирование.&lt;br /&gt;
Для этого в функцию InitCallBacks() вставим строку:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
self:AddCallback(&amp;quot;button_lang&amp;quot;, ui_events.BUTTON_CLICKED, self.OnChg_lan, self)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
а этим под блоком вставляем функцию:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function save_dialog:OnChg_lan()&lt;br /&gt;
	self.mode_lang = not self.mode_lang&lt;br /&gt;
	if self.mode_lang then self.ind_lang:SetText(&amp;quot;Рус&amp;quot;)&lt;br /&gt;
	else self.ind_lang:SetText(&amp;quot;Eng&amp;quot;) end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Здесь всё ясно - сначала инвертируем флаг текущего языка ввода и потом меняем текст индикатора.&lt;br /&gt;
&lt;br /&gt;
Отлавливать факт переключения языка ввода и сам ввод в поле имени файла будем в системном прерывании save_dialog:OnKeyboard(dik, keyboard_action). Для этого добавим туда свои строки, чтобы в итоге получилось так:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function save_dialog:OnKeyboard(dik, keyboard_action)  --virtual function&lt;br /&gt;
    ui_base_dialog.base_dialog.OnKeyboard(self,dik,keyboard_action)&lt;br /&gt;
    DIK_RETURN = 28&lt;br /&gt;
    WINDOW_KEY_PRESSED = 6&lt;br /&gt;
    if dik == DIK_RETURN and keyboard_action == WINDOW_KEY_PRESSED then &lt;br /&gt;
        self:OnButton_ok_clicked()&lt;br /&gt;
        self.owner:Show(true)&lt;br /&gt;
        elseif keyboard_action == ui_events.WINDOW_KEY_PRESSED then&lt;br /&gt;
        if dik == DIK_keys.DIK_LCONTROL or dik == DIK_keys.DIK_LMENU then&lt;br /&gt;
            self:OnChg_lan()&lt;br /&gt;
        elseif dik == DIK_keys.DIK_LEFT then&lt;br /&gt;
            if edb_Pos &amp;gt; 1 then edb_Pos = edb_Pos - 1 end&lt;br /&gt;
        elseif dik == DIK_keys.DIK_RIGHT then&lt;br /&gt;
            if edb_Pos &amp;lt;= #edb_Str then edb_Pos = edb_Pos + 1 end&lt;br /&gt;
        elseif dik == DIK_keys.DIK_DELETE then&lt;br /&gt;
            if edb_Pos &amp;lt;= #edb_Str then table.remove(edb_Str,edb_Pos) end&lt;br /&gt;
        elseif dik == DIK_keys.DIK_BACK then&lt;br /&gt;
            if edb_Pos &amp;gt; 1 then edb_Pos = edb_Pos-1 end&lt;br /&gt;
            table.remove(edb_Str,edb_Pos)&lt;br /&gt;
        elseif     (dik &amp;gt;= 2  and dik &amp;lt;= 13) or &lt;br /&gt;
                        (dik &amp;gt;= 16 and dik &amp;lt;= 27) or &lt;br /&gt;
                        (dik &amp;gt;= 30 and dik &amp;lt;= 40) or&lt;br /&gt;
                        (dik &amp;gt;= 44 and dik &amp;lt;= 53) or&lt;br /&gt;
                        dik == 57 or &lt;br /&gt;
                        (dik &amp;gt;= 71 and dik &amp;lt;= 83) then self:OnEdit_CHANGED()&lt;br /&gt;
        end&lt;br /&gt;
    elseif keyboard_action == ui_events.WINDOW_KEY_RELEASED then&lt;br /&gt;
        if dik == DIK_keys.DIK_LMENU then&lt;br /&gt;
                self:OnChg_lan()&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return true&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь всё достаточно просто. При переключении языка вызывается метод self:OnChg_lan(). При перемещении стрелками проверяем новое положение курсора и, если оно в пределах строки, то запоминаем его позицию. При удалении символа из строки удаляем соответствующий элемент из массива копии строки и опять же запоминаем текущую позицию ввода. При вводе текста  отлавливаются прерывания от всех клавиш с печатными символами и, если такое обнаружено, то вызывается функция обработчик, т.е. OnEdit_CHANGED(). Обратите внимание, что мы даже не пытаемся отловить ввод буквы ‘ё’, т.к. на этой же клавише размещена тильда ‘~’, которую движок «сталкера» обрабатывает специальным образом для вывода окна консоли.&lt;br /&gt;
И так, если мы зафиксировали факт нажатия клавиши с печатным символом, то вызывается функция OnEdit_CHANGED, но её пока нет. Вот ею и займёмся.&lt;br /&gt;
&lt;br /&gt;
Сразу под созданной нами ранее save_dialog:OnChg_lan() вставим ещё одну функцию:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function save_dialog:OnEdit_CHANGED()&lt;br /&gt;
    local str_edit = self:GetEditBox(&amp;quot;edit_filename&amp;quot;)   -- /1&lt;br /&gt;
    local sim = str_edit:GetText():match ('.',edb_Pos)  -- /2&lt;br /&gt;
    local cls = self.mode_lang and t_lang[sim:byte()]   -- /3&lt;br /&gt;
    sim = cls and string.char(cls) or sim               -- /4&lt;br /&gt;
    table.insert(edb_Str,edb_Pos,sim)                   -- /5&lt;br /&gt;
    edb_Pos = #edb_Str + 1                              -- /6&lt;br /&gt;
    str_edit:SetText(table.concat(edb_Str))             -- /7&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь тоже нет особых сложностей, но, тем не менее, прокомментируем наши действия.&lt;br /&gt;
Подключаемся к контролу EditBox (1) и получаем символ, находящийся в текущей позиции ввода (2). Если включен режим кириллицы, то ищем код переданного движком символа (он всегда английский) в таблице перекодировки и при его наличии получаем соответствующий код русского символа (3). Если код найден, то подменяем английский символ русским, а если нет, то оставляем всё как есть (4). Заносим полученный символ в массив копии строки ввода в соответствии со значение текущей позиции курсора (5). Устанавливаем новую текущую позиции ввода (6), преобразуем массив символов в строку и возвращаем её в поле ввода (7).&lt;br /&gt;
&lt;br /&gt;
Если Вы всё проделами правильно, то теперь можете вводить имя сохраняемого файла в английской, русской или смешанной кодировке, а также корректировать вводимый текст без искажения его синтаксиса.&lt;br /&gt;
&lt;br /&gt;
Послесловие:&lt;br /&gt;
Этот алгоритм имеет отличие от стандартной обработки строки редактирования, которое выражается в том, что при вставке символа в середину строки, позиция ввода следующего символа всегда устанавливается в её конец, тогда как в “штатной” – текущей становится следующая позиция. В этой ситуации есть свой плюс и свой минус, однако в любом случае, как побороть это, я просто не знаю.&lt;/div&gt;</summary>
		<author><name>Serge!</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%A3%D1%87%D0%B8%D0%BC_S.T.A.L.K.E.R._%D0%A2%D0%A7_%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%BE%D0%BC%D1%83_%D1%8F%D0%B7%D1%8B%D0%BA%D1%83</id>
		<title>Учим S.T.A.L.K.E.R. ТЧ русскому языку</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A3%D1%87%D0%B8%D0%BC_S.T.A.L.K.E.R._%D0%A2%D0%A7_%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%BE%D0%BC%D1%83_%D1%8F%D0%B7%D1%8B%D0%BA%D1%83"/>
				<updated>2015-11-14T12:41:14Z</updated>
		
		<summary type="html">&lt;p&gt;Serge!: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;За много лет игры все уже почти привыкли, что сохранить текущее состояние в процессе игры мы можем только в файле с английской транскрипцией. Мне это не очень нравится и поэтому предлагаю способ научить ТЧ сохранить файлы с именами на русском или (это уже самостоятельно) на любом другом языке.&lt;br /&gt;
Это не сложно и справиться может каждый, кто знает, что такое есть текстовый редактор.&lt;br /&gt;
Для решения нашей задачи нам понадобятся файлы: ui_save_dialog.script и ui_mm_save_dlg.xml и ещё один, который мы создадим сами, с именем ui_save_dlg_rus.script. Первый и третий должны находиться в папке gamedata\scripts\, а второй в gamedata\config\ui\. Если их там нет или вообще нет папки gamedata, то значит Вам придётся извлечь их (1 и 2) из архивов дистрибутива (файлы gamedata/dbX) или отказаться от затеи русификации. Как распаковать архивы дистрибутива я не буду, т.к. про это не рассказали только самые ленивые, поэтому считаем, что эти файлы Вам доступны.&lt;br /&gt;
&lt;br /&gt;
Начинаем.&lt;br /&gt;
Сначала проделаем маленькую, но необходимую работу, а именно: определим индикатор/переключатель текущего языка ввода. Для этого открываем файл ui_mm_save_dlg.xml и в конец тега form добавим строчки, чтобы получилось так:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
        &amp;lt;!-- оставляем исходное --&amp;gt;&lt;br /&gt;
	&amp;lt;st_lang x=&amp;quot;280&amp;quot; y=&amp;quot;400&amp;quot; width=&amp;quot;30&amp;quot; height=&amp;quot;20&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text font=&amp;quot;graffiti22&amp;quot; align=&amp;quot;c&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;text_color&amp;gt; &amp;lt;e r=&amp;quot;227&amp;quot; g=&amp;quot;199&amp;quot; b=&amp;quot;178&amp;quot;/&amp;gt; &amp;lt;h r=&amp;quot;255&amp;quot; g=&amp;quot;0&amp;quot; b=&amp;quot;0&amp;quot;/&amp;gt; &amp;lt;/text_color&amp;gt;&lt;br /&gt;
	&amp;lt;/st_lang&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Закрываем файл. Он нам больше не понадобится.&lt;br /&gt;
Теперь создадим таблицу перекодировки английских символов в кириллицу, которую запишем в наш 3-й файл ui_save_dlg_rus.script.&lt;br /&gt;
Выглядит эта таблица так: &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local tbl_ansii = {&lt;br /&gt;
        [ 034 ] = 221, -- &amp;quot; --&amp;gt; Э&lt;br /&gt;
        [ 035 ] = 185, -- # --&amp;gt; №&lt;br /&gt;
	[ 039 ] = 253, -- ' --&amp;gt; э&lt;br /&gt;
	[ 044 ] = 225, -- , --&amp;gt; б&lt;br /&gt;
	[ 046 ] = 254, -- . --&amp;gt; ю&lt;br /&gt;
	[ 047 ] = 046, -- / --&amp;gt; .&lt;br /&gt;
	[ 058 ] = 198, -- : --&amp;gt; Ж&lt;br /&gt;
	[ 059 ] = 230, -- ; --&amp;gt; ж&lt;br /&gt;
	[ 060 ] = 193, -- &amp;lt; --&amp;gt; Б&lt;br /&gt;
	[ 062 ] = 222, -- &amp;gt; --&amp;gt; Ю&lt;br /&gt;
	[ 065 ] = 212, -- A --&amp;gt; Ф&lt;br /&gt;
	[ 066 ] = 200, -- B --&amp;gt; И&lt;br /&gt;
	[ 067 ] = 209, -- C --&amp;gt; С&lt;br /&gt;
	[ 068 ] = 194, -- D --&amp;gt; В&lt;br /&gt;
	[ 069 ] = 211, -- E --&amp;gt; У&lt;br /&gt;
	[ 070 ] = 192, -- F --&amp;gt; А&lt;br /&gt;
	[ 071 ] = 207, -- G --&amp;gt; П&lt;br /&gt;
	[ 072 ] = 208, -- H --&amp;gt; Р&lt;br /&gt;
	[ 073 ] = 216, -- I --&amp;gt; Ш&lt;br /&gt;
	[ 074 ] = 206, -- J --&amp;gt; О&lt;br /&gt;
	[ 075 ] = 203, -- K --&amp;gt; Л&lt;br /&gt;
	[ 076 ] = 196, -- L --&amp;gt; Д&lt;br /&gt;
	[ 077 ] = 220, -- M --&amp;gt; Ь&lt;br /&gt;
	[ 078 ] = 210, -- N --&amp;gt; Т&lt;br /&gt;
	[ 079 ] = 217, -- O --&amp;gt; Щ&lt;br /&gt;
	[ 080 ] = 199, -- P --&amp;gt; З&lt;br /&gt;
	[ 081 ] = 201, -- Q --&amp;gt; Й&lt;br /&gt;
	[ 082 ] = 202, -- R --&amp;gt; К&lt;br /&gt;
	[ 083 ] = 219, -- S --&amp;gt; Ы&lt;br /&gt;
	[ 084 ] = 197, -- T --&amp;gt; Е&lt;br /&gt;
	[ 085 ] = 195, -- U --&amp;gt; Г&lt;br /&gt;
	[ 086 ] = 204, -- V --&amp;gt; М&lt;br /&gt;
	[ 087 ] = 214, -- W --&amp;gt; Ц&lt;br /&gt;
	[ 088 ] = 215, -- X --&amp;gt; Ч&lt;br /&gt;
	[ 089 ] = 205, -- Y --&amp;gt; Н&lt;br /&gt;
	[ 090 ] = 223, -- Z --&amp;gt; Я&lt;br /&gt;
	[ 091 ] = 245, -- [ --&amp;gt; х&lt;br /&gt;
	[ 093 ] = 250, -- ] --&amp;gt; ъ&lt;br /&gt;
	[ 097 ] = 244, -- a --&amp;gt; ф&lt;br /&gt;
	[ 098 ] = 232, -- b --&amp;gt; и&lt;br /&gt;
	[ 099 ] = 241, -- c --&amp;gt; с&lt;br /&gt;
	[ 100 ] = 226, -- d --&amp;gt; в&lt;br /&gt;
	[ 101 ] = 243, -- e --&amp;gt; у&lt;br /&gt;
	[ 102 ] = 224, -- f --&amp;gt; а&lt;br /&gt;
	[ 103 ] = 239, -- g --&amp;gt; п&lt;br /&gt;
	[ 104 ] = 240, -- h --&amp;gt; р&lt;br /&gt;
	[ 105 ] = 248, -- i --&amp;gt; ш&lt;br /&gt;
	[ 106 ] = 238, -- j --&amp;gt; о&lt;br /&gt;
	[ 107 ] = 235, -- k --&amp;gt; л&lt;br /&gt;
	[ 108 ] = 228, -- l --&amp;gt; д&lt;br /&gt;
	[ 109 ] = 252, -- m --&amp;gt; ь&lt;br /&gt;
	[ 110 ] = 242, -- n --&amp;gt; т&lt;br /&gt;
	[ 111 ] = 249, -- o --&amp;gt; щ&lt;br /&gt;
	[ 112 ] = 231, -- p --&amp;gt; з&lt;br /&gt;
	[ 113 ] = 233, -- q --&amp;gt; й&lt;br /&gt;
	[ 114 ] = 234, -- r --&amp;gt; к&lt;br /&gt;
	[ 115 ] = 251, -- s --&amp;gt; ы&lt;br /&gt;
	[ 116 ] = 229, -- t --&amp;gt; е&lt;br /&gt;
	[ 117 ] = 227, -- u --&amp;gt; г&lt;br /&gt;
	[ 118 ] = 236, -- v --&amp;gt; м&lt;br /&gt;
	[ 119 ] = 246, -- w --&amp;gt; ц&lt;br /&gt;
	[ 120 ] = 247, -- x --&amp;gt; ч&lt;br /&gt;
	[ 121 ] = 237, -- y --&amp;gt; н&lt;br /&gt;
	[ 122 ] = 255, -- z --&amp;gt; я&lt;br /&gt;
	[ 123 ] = 213, -- { --&amp;gt; Х&lt;br /&gt;
	[ 125 ] = 218, -- } --&amp;gt; Ъ&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И напоследок откорректируем скрипт диалога сохранения. Для этого открываем в редакторе файл ui_save_dialog.script.&lt;br /&gt;
&lt;br /&gt;
1. Вверху, сразу под комментариями описания скрипта, определяем несколько переменных: &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local t_lang,  edb_Pos, edb_Str = ui_save_dlg_rus.tbl_ansii, 1, {}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
где: t_lang – таблица перекодировки, edb_Pos – позиция курсора в поле EditBox (инициируется 1) и edb_Str – массив, в котором мы будем сохранять символы вводимого текста.&lt;br /&gt;
&lt;br /&gt;
2. Создадим индикатор текущего языка ввода текста.&lt;br /&gt;
&lt;br /&gt;
Договоримся, что переключать раскладку будем щелчком левой кнопки мыши по индикатору или клавишей левый-Ctrl (причем она будет работать как триггер), а переключать режим временного изменения языка ввода будем при нажатой и удерживаемой клавише левый-Alt.&lt;br /&gt;
Для этого в методе save_dialog:InitControls() в самом конце вставим:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
self.ind_lan = xml:Init3tButton(&amp;quot;form:st_lang&amp;quot;, self.form)&lt;br /&gt;
self:Register(self.ind_lan, &amp;quot;button_lang&amp;quot;)&lt;br /&gt;
self.ind_lan:SetText(&amp;quot;Рус&amp;quot;)&lt;br /&gt;
self.mode_lang = true&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
где: self.mode_lang - флаг текущего языка ввода (true - русский, false - английский)&lt;br /&gt;
Всё, переключатель языка ввода мы создали, теперь надо обеспечить его функционирование.&lt;br /&gt;
Для этого в функцию InitCallBacks() вставим строку:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
self:AddCallback(&amp;quot;button_lang&amp;quot;, ui_events.BUTTON_CLICKED, self.OnChg_lan, self)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
а этим под блоком вставляем функцию:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function save_dialog:OnChg_lan()&lt;br /&gt;
	self.mode_lang = not self.mode_lang&lt;br /&gt;
	if self.mode_lang then self.ind_lang:SetText(&amp;quot;Рус&amp;quot;)&lt;br /&gt;
	else self.ind_lang:SetText(&amp;quot;Eng&amp;quot;) end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Здесь всё ясно - сначала инвертируем флаг текущего языка ввода и потом меняем текст индикатора.&lt;br /&gt;
&lt;br /&gt;
Отлавливать факт переключения языка ввода и сам ввод в поле имени файла будем в системном прерывании save_dialog:OnKeyboard(dik, keyboard_action). Для этого добавим туда свои строки, чтобы в итоге получилось так:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function save_dialog:OnKeyboard(dik, keyboard_action)  --virtual function&lt;br /&gt;
    ui_base_dialog.base_dialog.OnKeyboard(self,dik,keyboard_action)&lt;br /&gt;
    DIK_RETURN = 28&lt;br /&gt;
    WINDOW_KEY_PRESSED = 6&lt;br /&gt;
    if dik == DIK_RETURN and keyboard_action == WINDOW_KEY_PRESSED then &lt;br /&gt;
        self:OnButton_ok_clicked()&lt;br /&gt;
        self.owner:Show(true)&lt;br /&gt;
        elseif keyboard_action == ui_events.WINDOW_KEY_PRESSED then&lt;br /&gt;
        if dik == DIK_keys.DIK_LCONTROL or dik == DIK_keys.DIK_LMENU then&lt;br /&gt;
            self:OnChg_lan()&lt;br /&gt;
        elseif dik == DIK_keys.DIK_LEFT then&lt;br /&gt;
            if edb_Pos &amp;gt; 1 then edb_Pos = edb_Pos - 1 end&lt;br /&gt;
        elseif dik == DIK_keys.DIK_RIGHT then&lt;br /&gt;
            if edb_Pos &amp;lt;= #edb_Str then edb_Pos = edb_Pos + 1 end&lt;br /&gt;
        elseif dik == DIK_keys.DIK_DELETE then&lt;br /&gt;
            if edb_Pos &amp;lt;= #edb_Str then table.remove(edb_Str,edb_Pos) end&lt;br /&gt;
        elseif dik == DIK_keys.DIK_BACK then&lt;br /&gt;
            if edb_Pos &amp;gt; 1 then edb_Pos = edb_Pos-1 end&lt;br /&gt;
            table.remove(edb_Str,edb_Pos)&lt;br /&gt;
        elseif     (dik &amp;gt;= 2  and dik &amp;lt;= 13) or &lt;br /&gt;
                        (dik &amp;gt;= 16 and dik &amp;lt;= 27) or &lt;br /&gt;
                        (dik &amp;gt;= 30 and dik &amp;lt;= 40) or&lt;br /&gt;
                        (dik &amp;gt;= 44 and dik &amp;lt;= 53) or&lt;br /&gt;
                        dik == 57 or &lt;br /&gt;
                        (dik &amp;gt;= 71 and dik &amp;lt;= 83) then self:OnEdit_CHANGED()&lt;br /&gt;
        end&lt;br /&gt;
    elseif keyboard_action == ui_events.WINDOW_KEY_RELEASED then&lt;br /&gt;
        if dik == DIK_keys.DIK_LMENU then&lt;br /&gt;
                self:OnChg_lan()&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return true&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь всё достаточно просто. При переключении языка вызывается метод self:OnChg_lan(). При перемещении стрелками проверяем новое положение курсора и, если оно в пределах строки, то запоминаем его позицию. При удалении символа из строки удаляем соответствующий элемент из массива копии строки и опять же запоминаем текущую позицию ввода. При вводе текста  отлавливаются прерывания от всех клавиш с печатными символами и, если такое обнаружено, то вызывается функция обработчик, т.е. OnEdit_CHANGED(). Обратите внимание, что мы даже не пытаемся отловить ввод буквы ‘ё’, т.к. на этой же клавише размещена тильда ‘~’, которую движок «сталкера» обрабатывает специальным образом для вывода окна консоли.&lt;br /&gt;
И так, если мы зафиксировали факт нажатия клавиши с печатным символом, то вызывается функция OnEdit_CHANGED, но её пока нет. Вот ею и займёмся.&lt;br /&gt;
&lt;br /&gt;
Сразу под созданной нами ранее save_dialog:OnChg_lan() вставим ещё одну функцию:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function save_dialog:OnEdit_CHANGED()&lt;br /&gt;
    local str_edit = self:GetEditBox(&amp;quot;edit_filename&amp;quot;)&lt;br /&gt;
    local sim = str_edit:GetText():match ('.',edb_Pos)&lt;br /&gt;
    local cls = self.mode_lang and t_lang[sim:byte()]&lt;br /&gt;
    sim = cls and string.char(cls) or sim&lt;br /&gt;
    table.insert(edb_Str,edb_Pos,sim)&lt;br /&gt;
    edb_Pos = #edb_Str + 1&lt;br /&gt;
    str_edit:SetText(table.concat(edb_Str))&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь тоже нет особых сложностей, но, тем не менее, прокомментируем наши действия.&lt;br /&gt;
Подключаемся к контролу EditBox (1) и получаем символ, находящийся в текущей позиции ввода (2). Если включен режим кириллицы, то ищем код переданного движком символа (он всегда английский) в таблице перекодировки и при его наличии получаем соответствующий код русского символа (3). Если код найден, то подменяем английский символ русским, а если нет, то оставляем всё как есть (4). Заносим полученный символ в массив копии строки ввода в соответствии со значение текущей позиции курсора (5). Устанавливаем новую текущую позиции ввода (6), преобразуем массив символов в строку и возвращаем её в поле ввода (7).&lt;br /&gt;
&lt;br /&gt;
Если Вы всё проделами правильно, то теперь можете вводить имя сохраняемого файла в английской, русской или смешанной кодировке, а также корректировать вводимый текст без искажения его синтаксиса.&lt;br /&gt;
&lt;br /&gt;
Послесловие:&lt;br /&gt;
Этот алгоритм имеет отличие от стандартной обработки строки редактирования, которое выражается в том, что при вставке символа в середину строки, позиция ввода следующего символа всегда устанавливается в её конец, тогда как в “штатной” – текущей становится следующая позиция. В этой ситуации есть свой плюс и свой минус, однако в любом случае, как побороть это, я просто не знаю.&lt;/div&gt;</summary>
		<author><name>Serge!</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%A3%D1%87%D0%B8%D0%BC_S.T.A.L.K.E.R._%D0%A2%D0%A7_%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%BE%D0%BC%D1%83_%D1%8F%D0%B7%D1%8B%D0%BA%D1%83</id>
		<title>Учим S.T.A.L.K.E.R. ТЧ русскому языку</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A3%D1%87%D0%B8%D0%BC_S.T.A.L.K.E.R._%D0%A2%D0%A7_%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%BE%D0%BC%D1%83_%D1%8F%D0%B7%D1%8B%D0%BA%D1%83"/>
				<updated>2015-11-14T12:35:53Z</updated>
		
		<summary type="html">&lt;p&gt;Serge!: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;За много лет игры все уже почти привыкли, что сохранить текущее состояние в процессе игры мы можем только в файле с английской транскрипцией. Мне это не очень нравится и поэтому предлагаю способ научить ТЧ сохранить файлы с именами на русском или (это уже самостоятельно) на любом другом языке.&lt;br /&gt;
Это не сложно и справиться может каждый, кто знает, что такое есть текстовый редактор.&lt;br /&gt;
Для решения нашей задачи нам понадобятся файлы: ui_save_dialog.script и ui_mm_save_dlg.xml и ещё один, который мы создадим сами, с именем ui_save_dlg_rus.script. Первый и третий должны находиться в папке gamedata\scripts\, а второй в gamedata\config\ui\. Если их там нет или вообще нет папки gamedata, то значит Вам придётся извлечь их (1 и 2) из архивов дистрибутива (файлы gamedata/dbX) или отказаться от затеи русификации. Как распаковать архивы дистрибутива я не буду, т.к. про это не рассказали только самые ленивые, поэтому считаем, что эти файлы Вам доступны.&lt;br /&gt;
&lt;br /&gt;
Начинаем.&lt;br /&gt;
Сначала проделаем маленькую, но необходимую работу, а именно: определим индикатор/переключатель текущего языка ввода. Для этого открываем файл ui_mm_save_dlg.xml и в конец тега form добавим строчки, чтобы получилось так:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;form&amp;gt;&lt;br /&gt;
        &amp;lt;!-- оставляем исходное --&amp;gt;&lt;br /&gt;
	&amp;lt;st_lang x=&amp;quot;280&amp;quot; y=&amp;quot;400&amp;quot; width=&amp;quot;30&amp;quot; height=&amp;quot;20&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;text font=&amp;quot;graffiti22&amp;quot; align=&amp;quot;c&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;text_color&amp;gt; &amp;lt;e r=&amp;quot;227&amp;quot; g=&amp;quot;199&amp;quot; b=&amp;quot;178&amp;quot;/&amp;gt; &amp;lt;h r=&amp;quot;255&amp;quot; g=&amp;quot;0&amp;quot; b=&amp;quot;0&amp;quot;/&amp;gt; &amp;lt;/text_color&amp;gt;&lt;br /&gt;
	&amp;lt;/st_lang&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Закрываем файл. Он нам больше не понадобится.&lt;br /&gt;
Теперь создадим таблицу перекодировки английских символов в кириллицу, которую запишем в наш 3-й файл ui_save_dlg_rus.script.&lt;br /&gt;
Выглядит эта таблица так: &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local tbl_ansii = {&lt;br /&gt;
        [ 034 ] = 221, -- &amp;quot; --&amp;gt; Э&lt;br /&gt;
        [ 035 ] = 185, -- # --&amp;gt; №&lt;br /&gt;
	[ 039 ] = 253, -- ' --&amp;gt; э&lt;br /&gt;
	[ 044 ] = 225, -- , --&amp;gt; б&lt;br /&gt;
	[ 046 ] = 254, -- . --&amp;gt; ю&lt;br /&gt;
	[ 047 ] = 046, -- / --&amp;gt; .&lt;br /&gt;
	[ 058 ] = 198, -- : --&amp;gt; Ж&lt;br /&gt;
	[ 059 ] = 230, -- ; --&amp;gt; ж&lt;br /&gt;
	[ 060 ] = 193, -- &amp;lt; --&amp;gt; Б&lt;br /&gt;
	[ 062 ] = 222, -- &amp;gt; --&amp;gt; Ю&lt;br /&gt;
	[ 065 ] = 212, -- A --&amp;gt; Ф&lt;br /&gt;
	[ 066 ] = 200, -- B --&amp;gt; И&lt;br /&gt;
	[ 067 ] = 209, -- C --&amp;gt; С&lt;br /&gt;
	[ 068 ] = 194, -- D --&amp;gt; В&lt;br /&gt;
	[ 069 ] = 211, -- E --&amp;gt; У&lt;br /&gt;
	[ 070 ] = 192, -- F --&amp;gt; А&lt;br /&gt;
	[ 071 ] = 207, -- G --&amp;gt; П&lt;br /&gt;
	[ 072 ] = 208, -- H --&amp;gt; Р&lt;br /&gt;
	[ 073 ] = 216, -- I --&amp;gt; Ш&lt;br /&gt;
	[ 074 ] = 206, -- J --&amp;gt; О&lt;br /&gt;
	[ 075 ] = 203, -- K --&amp;gt; Л&lt;br /&gt;
	[ 076 ] = 196, -- L --&amp;gt; Д&lt;br /&gt;
	[ 077 ] = 220, -- M --&amp;gt; Ь&lt;br /&gt;
	[ 078 ] = 210, -- N --&amp;gt; Т&lt;br /&gt;
	[ 079 ] = 217, -- O --&amp;gt; Щ&lt;br /&gt;
	[ 080 ] = 199, -- P --&amp;gt; З&lt;br /&gt;
	[ 081 ] = 201, -- Q --&amp;gt; Й&lt;br /&gt;
	[ 082 ] = 202, -- R --&amp;gt; К&lt;br /&gt;
	[ 083 ] = 219, -- S --&amp;gt; Ы&lt;br /&gt;
	[ 084 ] = 197, -- T --&amp;gt; Е&lt;br /&gt;
	[ 085 ] = 195, -- U --&amp;gt; Г&lt;br /&gt;
	[ 086 ] = 204, -- V --&amp;gt; М&lt;br /&gt;
	[ 087 ] = 214, -- W --&amp;gt; Ц&lt;br /&gt;
	[ 088 ] = 215, -- X --&amp;gt; Ч&lt;br /&gt;
	[ 089 ] = 205, -- Y --&amp;gt; Н&lt;br /&gt;
	[ 090 ] = 223, -- Z --&amp;gt; Я&lt;br /&gt;
	[ 091 ] = 245, -- [ --&amp;gt; х&lt;br /&gt;
	[ 093 ] = 250, -- ] --&amp;gt; ъ&lt;br /&gt;
	[ 097 ] = 244, -- a --&amp;gt; ф&lt;br /&gt;
	[ 098 ] = 232, -- b --&amp;gt; и&lt;br /&gt;
	[ 099 ] = 241, -- c --&amp;gt; с&lt;br /&gt;
	[ 100 ] = 226, -- d --&amp;gt; в&lt;br /&gt;
	[ 101 ] = 243, -- e --&amp;gt; у&lt;br /&gt;
	[ 102 ] = 224, -- f --&amp;gt; а&lt;br /&gt;
	[ 103 ] = 239, -- g --&amp;gt; п&lt;br /&gt;
	[ 104 ] = 240, -- h --&amp;gt; р&lt;br /&gt;
	[ 105 ] = 248, -- i --&amp;gt; ш&lt;br /&gt;
	[ 106 ] = 238, -- j --&amp;gt; о&lt;br /&gt;
	[ 107 ] = 235, -- k --&amp;gt; л&lt;br /&gt;
	[ 108 ] = 228, -- l --&amp;gt; д&lt;br /&gt;
	[ 109 ] = 252, -- m --&amp;gt; ь&lt;br /&gt;
	[ 110 ] = 242, -- n --&amp;gt; т&lt;br /&gt;
	[ 111 ] = 249, -- o --&amp;gt; щ&lt;br /&gt;
	[ 112 ] = 231, -- p --&amp;gt; з&lt;br /&gt;
	[ 113 ] = 233, -- q --&amp;gt; й&lt;br /&gt;
	[ 114 ] = 234, -- r --&amp;gt; к&lt;br /&gt;
	[ 115 ] = 251, -- s --&amp;gt; ы&lt;br /&gt;
	[ 116 ] = 229, -- t --&amp;gt; е&lt;br /&gt;
	[ 117 ] = 227, -- u --&amp;gt; г&lt;br /&gt;
	[ 118 ] = 236, -- v --&amp;gt; м&lt;br /&gt;
	[ 119 ] = 246, -- w --&amp;gt; ц&lt;br /&gt;
	[ 120 ] = 247, -- x --&amp;gt; ч&lt;br /&gt;
	[ 121 ] = 237, -- y --&amp;gt; н&lt;br /&gt;
	[ 122 ] = 255, -- z --&amp;gt; я&lt;br /&gt;
	[ 123 ] = 213, -- { --&amp;gt; Х&lt;br /&gt;
	[ 125 ] = 218, -- } --&amp;gt; Ъ&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Открываем в редакторе файл ui_save_dialog.script.&lt;br /&gt;
&lt;br /&gt;
1. Вверху, сразу под комментариями описания скрипта, определяем несколько переменных: &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local t_lang,  edb_Pos, edb_Str = ui_save_dlg_rus.tbl_ansii, 1, {}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
где: t_lang – таблица перекодировки, edb_Pos – позиция курсора в поле EditBox (инициируется 1) и edb_Str – массив, в котором мы будем сохранять символы вводимого текста.&lt;br /&gt;
&lt;br /&gt;
2. Создадим индикатор текущего языка ввода текста.&lt;br /&gt;
&lt;br /&gt;
Договоримся, что переключать раскладку будем щелчком левой кнопки мыши по индикатору или клавишей левый-Ctrl (причем она будет работать как триггер), а переключать режим временного изменения языка ввода будем при нажатой и удерживаемой клавише левый-Alt.&lt;br /&gt;
Для этого в методе save_dialog:InitControls() в самом конце вставим:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
self.ind_lan = xml:Init3tButton(&amp;quot;form:st_lang&amp;quot;, self.form)&lt;br /&gt;
self:Register(self.ind_lan, &amp;quot;button_lang&amp;quot;)&lt;br /&gt;
self.ind_lan:SetText(&amp;quot;Рус&amp;quot;)&lt;br /&gt;
self.mode_lang = true&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
где: self.mode_lang - флаг текущего языка ввода (true - русский, false - английский)&lt;br /&gt;
Всё, переключатель языка ввода мы создали, теперь надо обеспечить его функционирование.&lt;br /&gt;
Для этого в функцию InitCallBacks() вставим строку:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
self:AddCallback(&amp;quot;button_lang&amp;quot;, ui_events.BUTTON_CLICKED, self.OnChg_lan, self)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
а этим под блоком вставляем функцию:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function save_dialog:OnChg_lan()&lt;br /&gt;
	self.mode_lang = not self.mode_lang&lt;br /&gt;
	if self.mode_lang then self.ind_lang:SetText(&amp;quot;Рус&amp;quot;)&lt;br /&gt;
	else self.ind_lang:SetText(&amp;quot;Eng&amp;quot;) end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Здесь всё ясно - сначала инвертируем флаг текущего языка ввода и потом меняем текст индикатора.&lt;br /&gt;
&lt;br /&gt;
Отлавливать факт переключения языка ввода и сам ввод в поле имени файла будем в системном прерывании save_dialog:OnKeyboard(dik, keyboard_action). Для этого добавим туда свои строки, чтобы в итоге получилось так:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function save_dialog:OnKeyboard(dik, keyboard_action)  --virtual function&lt;br /&gt;
    ui_base_dialog.base_dialog.OnKeyboard(self,dik,keyboard_action)&lt;br /&gt;
    DIK_RETURN = 28&lt;br /&gt;
    WINDOW_KEY_PRESSED = 6&lt;br /&gt;
    if dik == DIK_RETURN and keyboard_action == WINDOW_KEY_PRESSED then &lt;br /&gt;
        self:OnButton_ok_clicked()&lt;br /&gt;
        self.owner:Show(true)&lt;br /&gt;
        elseif keyboard_action == ui_events.WINDOW_KEY_PRESSED then&lt;br /&gt;
        if dik == DIK_keys.DIK_LCONTROL or dik == DIK_keys.DIK_LMENU then&lt;br /&gt;
            self:OnChg_lan()&lt;br /&gt;
        elseif dik == DIK_keys.DIK_LEFT then&lt;br /&gt;
            if edb_Pos &amp;gt; 1 then edb_Pos = edb_Pos - 1 end&lt;br /&gt;
        elseif dik == DIK_keys.DIK_RIGHT then&lt;br /&gt;
            if edb_Pos &amp;lt;= #edb_Str then edb_Pos = edb_Pos + 1 end&lt;br /&gt;
        elseif dik == DIK_keys.DIK_DELETE then&lt;br /&gt;
            if edb_Pos &amp;lt;= #edb_Str then table.remove(edb_Str,edb_Pos) end&lt;br /&gt;
        elseif dik == DIK_keys.DIK_BACK then&lt;br /&gt;
            if edb_Pos &amp;gt; 1 then edb_Pos = edb_Pos-1 end&lt;br /&gt;
            table.remove(edb_Str,edb_Pos)&lt;br /&gt;
        elseif     (dik &amp;gt;= 2  and dik &amp;lt;= 13) or &lt;br /&gt;
                        (dik &amp;gt;= 16 and dik &amp;lt;= 27) or &lt;br /&gt;
                        (dik &amp;gt;= 30 and dik &amp;lt;= 40) or&lt;br /&gt;
                        (dik &amp;gt;= 44 and dik &amp;lt;= 53) or&lt;br /&gt;
                        dik == 57 or &lt;br /&gt;
                        (dik &amp;gt;= 71 and dik &amp;lt;= 83) then self:OnEdit_CHANGED()&lt;br /&gt;
        end&lt;br /&gt;
    elseif keyboard_action == ui_events.WINDOW_KEY_RELEASED then&lt;br /&gt;
        if dik == DIK_keys.DIK_LMENU then&lt;br /&gt;
                self:OnChg_lan()&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return true&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь всё достаточно просто. При переключении языка вызывается метод self:OnChg_lan(). При перемещении стрелками проверяем новое положение курсора и, если оно в пределах строки, то запоминаем его позицию. При удалении символа из строки удаляем соответствующий элемент из массива копии строки и опять же запоминаем текущую позицию ввода. При вводе текста  отлавливаются прерывания от всех клавиш с печатными символами и, если такое обнаружено, то вызывается функция обработчик, т.е. OnEdit_CHANGED(). Обратите внимание, что мы даже не пытаемся отловить ввод буквы ‘ё’, т.к. на этой же клавише размещена тильда ‘~’, которую движок «сталкера» обрабатывает специальным образом для вывода окна консоли.&lt;br /&gt;
И так, если мы зафиксировали факт нажатия клавиши с печатным символом, то вызывается функция OnEdit_CHANGED, но её пока нет. Вот ею и займёмся.&lt;br /&gt;
&lt;br /&gt;
Сразу под созданной нами ранее save_dialog:OnChg_lan() вставим ещё одну функцию:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function save_dialog:OnEdit_CHANGED()&lt;br /&gt;
    local str_edit = self:GetEditBox(&amp;quot;edit_filename&amp;quot;)&lt;br /&gt;
    local sim = str_edit:GetText():match ('.',edb_Pos)&lt;br /&gt;
    local cls = self.mode_lang and t_lang[sim:byte()]&lt;br /&gt;
    sim = cls and string.char(cls) or sim&lt;br /&gt;
    table.insert(edb_Str,edb_Pos,sim)&lt;br /&gt;
    edb_Pos = #edb_Str + 1&lt;br /&gt;
    str_edit:SetText(table.concat(edb_Str))&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь тоже нет особых сложностей, но, тем не менее, прокомментируем наши действия.&lt;br /&gt;
Подключаемся к контролу EditBox (1) и получаем символ, находящийся в текущей позиции ввода (2). Если включен режим кириллицы, то ищем код переданного движком символа (он всегда английский) в таблице перекодировки и при его наличии получаем соответствующий код русского символа (3). Если код найден, то подменяем английский символ русским, а если нет, то оставляем всё как есть (4). Заносим полученный символ в массив копии строки ввода в соответствии со значение текущей позиции курсора (5). Устанавливаем новую текущую позиции ввода (6), преобразуем массив символов в строку и возвращаем её в поле ввода (7).&lt;br /&gt;
&lt;br /&gt;
Если Вы всё проделами правильно, то теперь можете вводить имя сохраняемого файла в английской, русской или смешанной кодировке, а также корректировать вводимый текст без искажения его синтаксиса.&lt;br /&gt;
&lt;br /&gt;
Послесловие:&lt;br /&gt;
Этот алгоритм имеет отличие от стандартной обработки строки редактирования, которое выражается в том, что при вставке символа в середину строки, позиция ввода следующего символа всегда устанавливается в её конец, тогда как в “штатной” – текущей становится следующая позиция. В этой ситуации есть свой плюс и свой минус, однако в любом случае, как побороть это, я просто не знаю.&lt;/div&gt;</summary>
		<author><name>Serge!</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%A3%D1%87%D0%B8%D0%BC_S.T.A.L.K.E.R._%D0%A2%D0%A7_%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%BE%D0%BC%D1%83_%D1%8F%D0%B7%D1%8B%D0%BA%D1%83</id>
		<title>Учим S.T.A.L.K.E.R. ТЧ русскому языку</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A3%D1%87%D0%B8%D0%BC_S.T.A.L.K.E.R._%D0%A2%D0%A7_%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%BE%D0%BC%D1%83_%D1%8F%D0%B7%D1%8B%D0%BA%D1%83"/>
				<updated>2015-11-14T12:34:25Z</updated>
		
		<summary type="html">&lt;p&gt;Serge!: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;За много лет игры все уже почти привыкли, что сохранить текущее состояние в процессе игры мы можем только в файле с английской транскрипцией. Мне это не очень нравится и поэтому предлагаю способ научить ТЧ сохранить файлы с именами на русском или (это уже самостоятельно) на любом другом языке.&lt;br /&gt;
Это не сложно и справиться может каждый, кто знает, что такое есть текстовый редактор.&lt;br /&gt;
Для решения нашей задачи нам понадобятся файлы: ui_save_dialog.script и ui_mm_save_dlg.xml и ещё один, который мы создадим сами, с именем ui_save_dlg_rus.script. Первый и третий должны находиться в папке gamedata\scripts\, а второй в gamedata\config\ui\. Если их там нет или вообще нет папки gamedata, то значит Вам придётся извлечь их (1 и 2) из архивов дистрибутива (файлы gamedata/dbX) или отказаться от затеи русификации. Как распаковать архивы дистрибутива я не буду, т.к. про это не рассказали только самые ленивые, поэтому считаем, что эти файлы Вам доступны.&lt;br /&gt;
&lt;br /&gt;
Начинаем.&lt;br /&gt;
Сначала проделаем маленькую, но необходимую работу, а именно: определим индикатор/переключатель текущего языка ввода. Для этого открываем файл ui_mm_save_dlg.xml и в конец тега form добавим строчки, чтобы получилось так:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
        &amp;lt;form&amp;gt;&lt;br /&gt;
                &amp;lt;!-- оставляем исходное --&amp;gt;&lt;br /&gt;
		&amp;lt;st_lang x=&amp;quot;280&amp;quot; y=&amp;quot;400&amp;quot; width=&amp;quot;30&amp;quot; height=&amp;quot;20&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;text font=&amp;quot;graffiti22&amp;quot; align=&amp;quot;c&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;text_color&amp;gt; &amp;lt;e r=&amp;quot;227&amp;quot; g=&amp;quot;199&amp;quot; b=&amp;quot;178&amp;quot;/&amp;gt; &amp;lt;h r=&amp;quot;255&amp;quot; g=&amp;quot;0&amp;quot; b=&amp;quot;0&amp;quot;/&amp;gt; &amp;lt;/text_color&amp;gt;&lt;br /&gt;
		&amp;lt;/st_lang&amp;gt;&lt;br /&gt;
	&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Закрываем файл. Он нам больше не понадобится.&lt;br /&gt;
Теперь создадим таблицу перекодировки английских символов в кириллицу, которую запишем в наш 3-й файл ui_save_dlg_rus.script.&lt;br /&gt;
Выглядит эта таблица так: &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local tbl_ansii = {&lt;br /&gt;
        [ 034 ] = 221, -- &amp;quot; --&amp;gt; Э&lt;br /&gt;
        [ 035 ] = 185, -- # --&amp;gt; №&lt;br /&gt;
	[ 039 ] = 253, -- ' --&amp;gt; э&lt;br /&gt;
	[ 044 ] = 225, -- , --&amp;gt; б&lt;br /&gt;
	[ 046 ] = 254, -- . --&amp;gt; ю&lt;br /&gt;
	[ 047 ] = 046, -- / --&amp;gt; .&lt;br /&gt;
	[ 058 ] = 198, -- : --&amp;gt; Ж&lt;br /&gt;
	[ 059 ] = 230, -- ; --&amp;gt; ж&lt;br /&gt;
	[ 060 ] = 193, -- &amp;lt; --&amp;gt; Б&lt;br /&gt;
	[ 062 ] = 222, -- &amp;gt; --&amp;gt; Ю&lt;br /&gt;
	[ 065 ] = 212, -- A --&amp;gt; Ф&lt;br /&gt;
	[ 066 ] = 200, -- B --&amp;gt; И&lt;br /&gt;
	[ 067 ] = 209, -- C --&amp;gt; С&lt;br /&gt;
	[ 068 ] = 194, -- D --&amp;gt; В&lt;br /&gt;
	[ 069 ] = 211, -- E --&amp;gt; У&lt;br /&gt;
	[ 070 ] = 192, -- F --&amp;gt; А&lt;br /&gt;
	[ 071 ] = 207, -- G --&amp;gt; П&lt;br /&gt;
	[ 072 ] = 208, -- H --&amp;gt; Р&lt;br /&gt;
	[ 073 ] = 216, -- I --&amp;gt; Ш&lt;br /&gt;
	[ 074 ] = 206, -- J --&amp;gt; О&lt;br /&gt;
	[ 075 ] = 203, -- K --&amp;gt; Л&lt;br /&gt;
	[ 076 ] = 196, -- L --&amp;gt; Д&lt;br /&gt;
	[ 077 ] = 220, -- M --&amp;gt; Ь&lt;br /&gt;
	[ 078 ] = 210, -- N --&amp;gt; Т&lt;br /&gt;
	[ 079 ] = 217, -- O --&amp;gt; Щ&lt;br /&gt;
	[ 080 ] = 199, -- P --&amp;gt; З&lt;br /&gt;
	[ 081 ] = 201, -- Q --&amp;gt; Й&lt;br /&gt;
	[ 082 ] = 202, -- R --&amp;gt; К&lt;br /&gt;
	[ 083 ] = 219, -- S --&amp;gt; Ы&lt;br /&gt;
	[ 084 ] = 197, -- T --&amp;gt; Е&lt;br /&gt;
	[ 085 ] = 195, -- U --&amp;gt; Г&lt;br /&gt;
	[ 086 ] = 204, -- V --&amp;gt; М&lt;br /&gt;
	[ 087 ] = 214, -- W --&amp;gt; Ц&lt;br /&gt;
	[ 088 ] = 215, -- X --&amp;gt; Ч&lt;br /&gt;
	[ 089 ] = 205, -- Y --&amp;gt; Н&lt;br /&gt;
	[ 090 ] = 223, -- Z --&amp;gt; Я&lt;br /&gt;
	[ 091 ] = 245, -- [ --&amp;gt; х&lt;br /&gt;
	[ 093 ] = 250, -- ] --&amp;gt; ъ&lt;br /&gt;
	[ 097 ] = 244, -- a --&amp;gt; ф&lt;br /&gt;
	[ 098 ] = 232, -- b --&amp;gt; и&lt;br /&gt;
	[ 099 ] = 241, -- c --&amp;gt; с&lt;br /&gt;
	[ 100 ] = 226, -- d --&amp;gt; в&lt;br /&gt;
	[ 101 ] = 243, -- e --&amp;gt; у&lt;br /&gt;
	[ 102 ] = 224, -- f --&amp;gt; а&lt;br /&gt;
	[ 103 ] = 239, -- g --&amp;gt; п&lt;br /&gt;
	[ 104 ] = 240, -- h --&amp;gt; р&lt;br /&gt;
	[ 105 ] = 248, -- i --&amp;gt; ш&lt;br /&gt;
	[ 106 ] = 238, -- j --&amp;gt; о&lt;br /&gt;
	[ 107 ] = 235, -- k --&amp;gt; л&lt;br /&gt;
	[ 108 ] = 228, -- l --&amp;gt; д&lt;br /&gt;
	[ 109 ] = 252, -- m --&amp;gt; ь&lt;br /&gt;
	[ 110 ] = 242, -- n --&amp;gt; т&lt;br /&gt;
	[ 111 ] = 249, -- o --&amp;gt; щ&lt;br /&gt;
	[ 112 ] = 231, -- p --&amp;gt; з&lt;br /&gt;
	[ 113 ] = 233, -- q --&amp;gt; й&lt;br /&gt;
	[ 114 ] = 234, -- r --&amp;gt; к&lt;br /&gt;
	[ 115 ] = 251, -- s --&amp;gt; ы&lt;br /&gt;
	[ 116 ] = 229, -- t --&amp;gt; е&lt;br /&gt;
	[ 117 ] = 227, -- u --&amp;gt; г&lt;br /&gt;
	[ 118 ] = 236, -- v --&amp;gt; м&lt;br /&gt;
	[ 119 ] = 246, -- w --&amp;gt; ц&lt;br /&gt;
	[ 120 ] = 247, -- x --&amp;gt; ч&lt;br /&gt;
	[ 121 ] = 237, -- y --&amp;gt; н&lt;br /&gt;
	[ 122 ] = 255, -- z --&amp;gt; я&lt;br /&gt;
	[ 123 ] = 213, -- { --&amp;gt; Х&lt;br /&gt;
	[ 125 ] = 218, -- } --&amp;gt; Ъ&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Открываем в редакторе файл ui_save_dialog.script.&lt;br /&gt;
&lt;br /&gt;
1. Вверху, сразу под комментариями описания скрипта, определяем несколько переменных: &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local t_lang,  edb_Pos, edb_Str = ui_save_dlg_rus.tbl_ansii, 1, {}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
где: t_lang – таблица перекодировки, edb_Pos – позиция курсора в поле EditBox (инициируется 1) и edb_Str – массив, в котором мы будем сохранять символы вводимого текста.&lt;br /&gt;
&lt;br /&gt;
2. Создадим индикатор текущего языка ввода текста.&lt;br /&gt;
&lt;br /&gt;
Договоримся, что переключать раскладку будем щелчком левой кнопки мыши по индикатору или клавишей левый-Ctrl (причем она будет работать как триггер), а переключать режим временного изменения языка ввода будем при нажатой и удерживаемой клавише левый-Alt.&lt;br /&gt;
Для этого в методе save_dialog:InitControls() в самом конце вставим:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
self.ind_lan = xml:Init3tButton(&amp;quot;form:st_lang&amp;quot;, self.form)&lt;br /&gt;
self:Register(self.ind_lan, &amp;quot;button_lang&amp;quot;)&lt;br /&gt;
self.ind_lan:SetText(&amp;quot;Рус&amp;quot;)&lt;br /&gt;
self.mode_lang = true&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
где: self.mode_lang - флаг текущего языка ввода (true - русский, false - английский)&lt;br /&gt;
Всё, переключатель языка ввода мы создали, теперь надо обеспечить его функционирование.&lt;br /&gt;
Для этого в функцию InitCallBacks() вставим строку:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
self:AddCallback(&amp;quot;button_lang&amp;quot;, ui_events.BUTTON_CLICKED, self.OnChg_lan, self)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
а этим под блоком вставляем функцию:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function save_dialog:OnChg_lan()&lt;br /&gt;
	self.mode_lang = not self.mode_lang&lt;br /&gt;
	if self.mode_lang then self.ind_lang:SetText(&amp;quot;Рус&amp;quot;)&lt;br /&gt;
	else self.ind_lang:SetText(&amp;quot;Eng&amp;quot;) end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Здесь всё ясно - сначала инвертируем флаг текущего языка ввода и потом меняем текст индикатора.&lt;br /&gt;
&lt;br /&gt;
Отлавливать факт переключения языка ввода и сам ввод в поле имени файла будем в системном прерывании save_dialog:OnKeyboard(dik, keyboard_action). Для этого добавим туда свои строки, чтобы в итоге получилось так:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function save_dialog:OnKeyboard(dik, keyboard_action)  --virtual function&lt;br /&gt;
    ui_base_dialog.base_dialog.OnKeyboard(self,dik,keyboard_action)&lt;br /&gt;
    DIK_RETURN = 28&lt;br /&gt;
    WINDOW_KEY_PRESSED = 6&lt;br /&gt;
    if dik == DIK_RETURN and keyboard_action == WINDOW_KEY_PRESSED then &lt;br /&gt;
        self:OnButton_ok_clicked()&lt;br /&gt;
        self.owner:Show(true)&lt;br /&gt;
        elseif keyboard_action == ui_events.WINDOW_KEY_PRESSED then&lt;br /&gt;
        if dik == DIK_keys.DIK_LCONTROL or dik == DIK_keys.DIK_LMENU then&lt;br /&gt;
            self:OnChg_lan()&lt;br /&gt;
        elseif dik == DIK_keys.DIK_LEFT then&lt;br /&gt;
            if edb_Pos &amp;gt; 1 then edb_Pos = edb_Pos - 1 end&lt;br /&gt;
        elseif dik == DIK_keys.DIK_RIGHT then&lt;br /&gt;
            if edb_Pos &amp;lt;= #edb_Str then edb_Pos = edb_Pos + 1 end&lt;br /&gt;
        elseif dik == DIK_keys.DIK_DELETE then&lt;br /&gt;
            if edb_Pos &amp;lt;= #edb_Str then table.remove(edb_Str,edb_Pos) end&lt;br /&gt;
        elseif dik == DIK_keys.DIK_BACK then&lt;br /&gt;
            if edb_Pos &amp;gt; 1 then edb_Pos = edb_Pos-1 end&lt;br /&gt;
            table.remove(edb_Str,edb_Pos)&lt;br /&gt;
        elseif     (dik &amp;gt;= 2  and dik &amp;lt;= 13) or &lt;br /&gt;
                        (dik &amp;gt;= 16 and dik &amp;lt;= 27) or &lt;br /&gt;
                        (dik &amp;gt;= 30 and dik &amp;lt;= 40) or&lt;br /&gt;
                        (dik &amp;gt;= 44 and dik &amp;lt;= 53) or&lt;br /&gt;
                        dik == 57 or &lt;br /&gt;
                        (dik &amp;gt;= 71 and dik &amp;lt;= 83) then self:OnEdit_CHANGED()&lt;br /&gt;
        end&lt;br /&gt;
    elseif keyboard_action == ui_events.WINDOW_KEY_RELEASED then&lt;br /&gt;
        if dik == DIK_keys.DIK_LMENU then&lt;br /&gt;
                self:OnChg_lan()&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return true&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь всё достаточно просто. При переключении языка вызывается метод self:OnChg_lan(). При перемещении стрелками проверяем новое положение курсора и, если оно в пределах строки, то запоминаем его позицию. При удалении символа из строки удаляем соответствующий элемент из массива копии строки и опять же запоминаем текущую позицию ввода. При вводе текста  отлавливаются прерывания от всех клавиш с печатными символами и, если такое обнаружено, то вызывается функция обработчик, т.е. OnEdit_CHANGED(). Обратите внимание, что мы даже не пытаемся отловить ввод буквы ‘ё’, т.к. на этой же клавише размещена тильда ‘~’, которую движок «сталкера» обрабатывает специальным образом для вывода окна консоли.&lt;br /&gt;
И так, если мы зафиксировали факт нажатия клавиши с печатным символом, то вызывается функция OnEdit_CHANGED, но её пока нет. Вот ею и займёмся.&lt;br /&gt;
&lt;br /&gt;
Сразу под созданной нами ранее save_dialog:OnChg_lan() вставим ещё одну функцию:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function save_dialog:OnEdit_CHANGED()&lt;br /&gt;
    local str_edit = self:GetEditBox(&amp;quot;edit_filename&amp;quot;)&lt;br /&gt;
    local sim = str_edit:GetText():match ('.',edb_Pos)&lt;br /&gt;
    local cls = self.mode_lang and t_lang[sim:byte()]&lt;br /&gt;
    sim = cls and string.char(cls) or sim&lt;br /&gt;
    table.insert(edb_Str,edb_Pos,sim)&lt;br /&gt;
    edb_Pos = #edb_Str + 1&lt;br /&gt;
    str_edit:SetText(table.concat(edb_Str))&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь тоже нет особых сложностей, но, тем не менее, прокомментируем наши действия.&lt;br /&gt;
Подключаемся к контролу EditBox (1) и получаем символ, находящийся в текущей позиции ввода (2). Если включен режим кириллицы, то ищем код переданного движком символа (он всегда английский) в таблице перекодировки и при его наличии получаем соответствующий код русского символа (3). Если код найден, то подменяем английский символ русским, а если нет, то оставляем всё как есть (4). Заносим полученный символ в массив копии строки ввода в соответствии со значение текущей позиции курсора (5). Устанавливаем новую текущую позиции ввода (6), преобразуем массив символов в строку и возвращаем её в поле ввода (7).&lt;br /&gt;
&lt;br /&gt;
Если Вы всё проделами правильно, то теперь можете вводить имя сохраняемого файла в английской, русской или смешанной кодировке, а также корректировать вводимый текст без искажения его синтаксиса.&lt;br /&gt;
&lt;br /&gt;
Послесловие:&lt;br /&gt;
Этот алгоритм имеет отличие от стандартной обработки строки редактирования, которое выражается в том, что при вставке символа в середину строки, позиция ввода следующего символа всегда устанавливается в её конец, тогда как в “штатной” – текущей становится следующая позиция. В этой ситуации есть свой плюс и свой минус, однако в любом случае, как побороть это, я просто не знаю.&lt;/div&gt;</summary>
		<author><name>Serge!</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%A3%D1%87%D0%B8%D0%BC_S.T.A.L.K.E.R._%D0%A2%D0%A7_%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%BE%D0%BC%D1%83_%D1%8F%D0%B7%D1%8B%D0%BA%D1%83</id>
		<title>Учим S.T.A.L.K.E.R. ТЧ русскому языку</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A3%D1%87%D0%B8%D0%BC_S.T.A.L.K.E.R._%D0%A2%D0%A7_%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%BE%D0%BC%D1%83_%D1%8F%D0%B7%D1%8B%D0%BA%D1%83"/>
				<updated>2015-11-14T12:31:39Z</updated>
		
		<summary type="html">&lt;p&gt;Serge!: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;За много лет игры все уже почти привыкли, что сохранить текущее состояние в процессе игры мы можем только в файле с английской транскрипцией. Мне это не очень нравится и поэтому предлагаю способ научить ТЧ сохранить файлы с именами на русском или (это уже самостоятельно) на любом другом языке.&lt;br /&gt;
Это не сложно и справиться может каждый, кто знает, что такое есть текстовый редактор.&lt;br /&gt;
Для решения нашей задачи нам понадобятся файлы: ui_save_dialog.script и ui_mm_save_dlg.xml и ещё один, который мы создадим сами, с именем ui_save_dlg_rus.script. Первый и третий должны находиться в папке gamedata\scripts\, а второй в gamedata\config\ui\. Если их там нет или вообще нет папки gamedata, то значит Вам придётся извлечь их (1 и 2) из архивов дистрибутива (файлы gamedata/dbX) или отказаться от затеи русификации. Как распаковать архивы дистрибутива я не буду, т.к. про это не рассказали только самые ленивые, поэтому считаем, что эти файлы Вам доступны.&lt;br /&gt;
&lt;br /&gt;
Начинаем.&lt;br /&gt;
Сначала проделаем маленькую, но необходимую работу, а именно: определим индикатор/переключатель текущего языка ввода. Для этого открываем файл ui_mm_save_dlg.xml и в конец тега form добавим строчки, чтобы получилось так:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
		&amp;lt;st_lang x=&amp;quot;280&amp;quot; y=&amp;quot;400&amp;quot; width=&amp;quot;30&amp;quot; height=&amp;quot;20&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;text font=&amp;quot;graffiti22&amp;quot; align=&amp;quot;c&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;text_color&amp;gt; &amp;lt;e r=&amp;quot;227&amp;quot; g=&amp;quot;199&amp;quot; b=&amp;quot;178&amp;quot;/&amp;gt; &amp;lt;h r=&amp;quot;255&amp;quot; g=&amp;quot;0&amp;quot; b=&amp;quot;0&amp;quot;/&amp;gt; &amp;lt;/text_color&amp;gt;&lt;br /&gt;
		&amp;lt;/st_lang&amp;gt;&lt;br /&gt;
	&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Закрываем файл. Он нам больше не понадобится.&lt;br /&gt;
Теперь создадим таблицу перекодировки английских символов в кириллицу, которую запишем в наш 3-й файл ui_save_dlg_rus.script.&lt;br /&gt;
Выглядит эта таблица так: &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local tbl_ansii = {&lt;br /&gt;
        [ 034 ] = 221, -- &amp;quot; --&amp;gt; Э&lt;br /&gt;
        [ 035 ] = 185, -- # --&amp;gt; №&lt;br /&gt;
	[ 039 ] = 253, -- ' --&amp;gt; э&lt;br /&gt;
	[ 044 ] = 225, -- , --&amp;gt; б&lt;br /&gt;
	[ 046 ] = 254, -- . --&amp;gt; ю&lt;br /&gt;
	[ 047 ] = 046, -- / --&amp;gt; .&lt;br /&gt;
	[ 058 ] = 198, -- : --&amp;gt; Ж&lt;br /&gt;
	[ 059 ] = 230, -- ; --&amp;gt; ж&lt;br /&gt;
	[ 060 ] = 193, -- &amp;lt; --&amp;gt; Б&lt;br /&gt;
	[ 062 ] = 222, -- &amp;gt; --&amp;gt; Ю&lt;br /&gt;
	[ 065 ] = 212, -- A --&amp;gt; Ф&lt;br /&gt;
	[ 066 ] = 200, -- B --&amp;gt; И&lt;br /&gt;
	[ 067 ] = 209, -- C --&amp;gt; С&lt;br /&gt;
	[ 068 ] = 194, -- D --&amp;gt; В&lt;br /&gt;
	[ 069 ] = 211, -- E --&amp;gt; У&lt;br /&gt;
	[ 070 ] = 192, -- F --&amp;gt; А&lt;br /&gt;
	[ 071 ] = 207, -- G --&amp;gt; П&lt;br /&gt;
	[ 072 ] = 208, -- H --&amp;gt; Р&lt;br /&gt;
	[ 073 ] = 216, -- I --&amp;gt; Ш&lt;br /&gt;
	[ 074 ] = 206, -- J --&amp;gt; О&lt;br /&gt;
	[ 075 ] = 203, -- K --&amp;gt; Л&lt;br /&gt;
	[ 076 ] = 196, -- L --&amp;gt; Д&lt;br /&gt;
	[ 077 ] = 220, -- M --&amp;gt; Ь&lt;br /&gt;
	[ 078 ] = 210, -- N --&amp;gt; Т&lt;br /&gt;
	[ 079 ] = 217, -- O --&amp;gt; Щ&lt;br /&gt;
	[ 080 ] = 199, -- P --&amp;gt; З&lt;br /&gt;
	[ 081 ] = 201, -- Q --&amp;gt; Й&lt;br /&gt;
	[ 082 ] = 202, -- R --&amp;gt; К&lt;br /&gt;
	[ 083 ] = 219, -- S --&amp;gt; Ы&lt;br /&gt;
	[ 084 ] = 197, -- T --&amp;gt; Е&lt;br /&gt;
	[ 085 ] = 195, -- U --&amp;gt; Г&lt;br /&gt;
	[ 086 ] = 204, -- V --&amp;gt; М&lt;br /&gt;
	[ 087 ] = 214, -- W --&amp;gt; Ц&lt;br /&gt;
	[ 088 ] = 215, -- X --&amp;gt; Ч&lt;br /&gt;
	[ 089 ] = 205, -- Y --&amp;gt; Н&lt;br /&gt;
	[ 090 ] = 223, -- Z --&amp;gt; Я&lt;br /&gt;
	[ 091 ] = 245, -- [ --&amp;gt; х&lt;br /&gt;
	[ 093 ] = 250, -- ] --&amp;gt; ъ&lt;br /&gt;
	[ 097 ] = 244, -- a --&amp;gt; ф&lt;br /&gt;
	[ 098 ] = 232, -- b --&amp;gt; и&lt;br /&gt;
	[ 099 ] = 241, -- c --&amp;gt; с&lt;br /&gt;
	[ 100 ] = 226, -- d --&amp;gt; в&lt;br /&gt;
	[ 101 ] = 243, -- e --&amp;gt; у&lt;br /&gt;
	[ 102 ] = 224, -- f --&amp;gt; а&lt;br /&gt;
	[ 103 ] = 239, -- g --&amp;gt; п&lt;br /&gt;
	[ 104 ] = 240, -- h --&amp;gt; р&lt;br /&gt;
	[ 105 ] = 248, -- i --&amp;gt; ш&lt;br /&gt;
	[ 106 ] = 238, -- j --&amp;gt; о&lt;br /&gt;
	[ 107 ] = 235, -- k --&amp;gt; л&lt;br /&gt;
	[ 108 ] = 228, -- l --&amp;gt; д&lt;br /&gt;
	[ 109 ] = 252, -- m --&amp;gt; ь&lt;br /&gt;
	[ 110 ] = 242, -- n --&amp;gt; т&lt;br /&gt;
	[ 111 ] = 249, -- o --&amp;gt; щ&lt;br /&gt;
	[ 112 ] = 231, -- p --&amp;gt; з&lt;br /&gt;
	[ 113 ] = 233, -- q --&amp;gt; й&lt;br /&gt;
	[ 114 ] = 234, -- r --&amp;gt; к&lt;br /&gt;
	[ 115 ] = 251, -- s --&amp;gt; ы&lt;br /&gt;
	[ 116 ] = 229, -- t --&amp;gt; е&lt;br /&gt;
	[ 117 ] = 227, -- u --&amp;gt; г&lt;br /&gt;
	[ 118 ] = 236, -- v --&amp;gt; м&lt;br /&gt;
	[ 119 ] = 246, -- w --&amp;gt; ц&lt;br /&gt;
	[ 120 ] = 247, -- x --&amp;gt; ч&lt;br /&gt;
	[ 121 ] = 237, -- y --&amp;gt; н&lt;br /&gt;
	[ 122 ] = 255, -- z --&amp;gt; я&lt;br /&gt;
	[ 123 ] = 213, -- { --&amp;gt; Х&lt;br /&gt;
	[ 125 ] = 218, -- } --&amp;gt; Ъ&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Открываем в редакторе файл ui_save_dialog.script.&lt;br /&gt;
&lt;br /&gt;
1. Вверху, сразу под комментариями описания скрипта, определяем несколько переменных: &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local t_lang,  edb_Pos, edb_Str = ui_save_dlg_rus.tbl_ansii, 1, {}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
где: t_lang – таблица перекодировки, edb_Pos – позиция курсора в поле EditBox (инициируется 1) и edb_Str – массив, в котором мы будем сохранять символы вводимого текста.&lt;br /&gt;
&lt;br /&gt;
2. Создадим индикатор текущего языка ввода текста.&lt;br /&gt;
&lt;br /&gt;
Договоримся, что переключать раскладку будем щелчком левой кнопки мыши по индикатору или клавишей левый-Ctrl (причем она будет работать как триггер), а переключать режим временного изменения языка ввода будем при нажатой и удерживаемой клавише левый-Alt.&lt;br /&gt;
Для этого в методе save_dialog:InitControls() в самом конце вставим:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
self.ind_lan = xml:Init3tButton(&amp;quot;form:st_lang&amp;quot;, self.form)&lt;br /&gt;
self:Register(self.ind_lan, &amp;quot;button_lang&amp;quot;)&lt;br /&gt;
self.ind_lan:SetText(&amp;quot;Рус&amp;quot;)&lt;br /&gt;
self.mode_lang = true&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
где: self.mode_lang - флаг текущего языка ввода (true - русский, false - английский)&lt;br /&gt;
Всё, переключатель языка ввода мы создали, теперь надо обеспечить его функционирование.&lt;br /&gt;
Для этого в функцию InitCallBacks() вставим строку:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
self:AddCallback(&amp;quot;button_lang&amp;quot;, ui_events.BUTTON_CLICKED, self.OnChg_lan, self)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
а этим под блоком вставляем функцию:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function save_dialog:OnChg_lan()&lt;br /&gt;
	self.mode_lang = not self.mode_lang&lt;br /&gt;
	if self.mode_lang then self.ind_lang:SetText(&amp;quot;Рус&amp;quot;)&lt;br /&gt;
	else self.ind_lang:SetText(&amp;quot;Eng&amp;quot;) end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Здесь всё ясно - сначала инвертируем флаг текущего языка ввода и потом меняем текст индикатора.&lt;br /&gt;
&lt;br /&gt;
Отлавливать факт переключения языка ввода и сам ввод в поле имени файла будем в системном прерывании save_dialog:OnKeyboard(dik, keyboard_action). Для этого добавим туда свои строки, чтобы в итоге получилось так:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function save_dialog:OnKeyboard(dik, keyboard_action)  --virtual function&lt;br /&gt;
    ui_base_dialog.base_dialog.OnKeyboard(self,dik,keyboard_action)&lt;br /&gt;
    DIK_RETURN = 28&lt;br /&gt;
    WINDOW_KEY_PRESSED = 6&lt;br /&gt;
    if dik == DIK_RETURN and keyboard_action == WINDOW_KEY_PRESSED then &lt;br /&gt;
        self:OnButton_ok_clicked()&lt;br /&gt;
        self.owner:Show(true)&lt;br /&gt;
        elseif keyboard_action == ui_events.WINDOW_KEY_PRESSED then&lt;br /&gt;
        if dik == DIK_keys.DIK_LCONTROL or dik == DIK_keys.DIK_LMENU then&lt;br /&gt;
            self:OnChg_lan()&lt;br /&gt;
        elseif dik == DIK_keys.DIK_LEFT then&lt;br /&gt;
            if edb_Pos &amp;gt; 1 then edb_Pos = edb_Pos - 1 end&lt;br /&gt;
        elseif dik == DIK_keys.DIK_RIGHT then&lt;br /&gt;
            if edb_Pos &amp;lt;= #edb_Str then edb_Pos = edb_Pos + 1 end&lt;br /&gt;
        elseif dik == DIK_keys.DIK_DELETE then&lt;br /&gt;
            if edb_Pos &amp;lt;= #edb_Str then table.remove(edb_Str,edb_Pos) end&lt;br /&gt;
        elseif dik == DIK_keys.DIK_BACK then&lt;br /&gt;
            if edb_Pos &amp;gt; 1 then edb_Pos = edb_Pos-1 end&lt;br /&gt;
            table.remove(edb_Str,edb_Pos)&lt;br /&gt;
        elseif     (dik &amp;gt;= 2  and dik &amp;lt;= 13) or &lt;br /&gt;
                        (dik &amp;gt;= 16 and dik &amp;lt;= 27) or &lt;br /&gt;
                        (dik &amp;gt;= 30 and dik &amp;lt;= 40) or&lt;br /&gt;
                        (dik &amp;gt;= 44 and dik &amp;lt;= 53) or&lt;br /&gt;
                        dik == 57 or &lt;br /&gt;
                        (dik &amp;gt;= 71 and dik &amp;lt;= 83) then self:OnEdit_CHANGED()&lt;br /&gt;
        end&lt;br /&gt;
    elseif keyboard_action == ui_events.WINDOW_KEY_RELEASED then&lt;br /&gt;
        if dik == DIK_keys.DIK_LMENU then&lt;br /&gt;
                self:OnChg_lan()&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return true&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь всё достаточно просто. При переключении языка вызывается метод self:OnChg_lan(). При перемещении стрелками проверяем новое положение курсора и, если оно в пределах строки, то запоминаем его позицию. При удалении символа из строки удаляем соответствующий элемент из массива копии строки и опять же запоминаем текущую позицию ввода. При вводе текста  отлавливаются прерывания от всех клавиш с печатными символами и, если такое обнаружено, то вызывается функция обработчик, т.е. OnEdit_CHANGED(). Обратите внимание, что мы даже не пытаемся отловить ввод буквы ‘ё’, т.к. на этой же клавише размещена тильда ‘~’, которую движок «сталкера» обрабатывает специальным образом для вывода окна консоли.&lt;br /&gt;
И так, если мы зафиксировали факт нажатия клавиши с печатным символом, то вызывается функция OnEdit_CHANGED, но её пока нет. Вот ею и займёмся.&lt;br /&gt;
&lt;br /&gt;
Сразу под созданной нами ранее save_dialog:OnChg_lan() вставим ещё одну функцию:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function save_dialog:OnEdit_CHANGED()&lt;br /&gt;
    local str_edit = self:GetEditBox(&amp;quot;edit_filename&amp;quot;)&lt;br /&gt;
    local sim = str_edit:GetText():match ('.',edb_Pos)&lt;br /&gt;
    local cls = self.mode_lang and t_lang[sim:byte()]&lt;br /&gt;
    sim = cls and string.char(cls) or sim&lt;br /&gt;
    table.insert(edb_Str,edb_Pos,sim)&lt;br /&gt;
    edb_Pos = #edb_Str + 1&lt;br /&gt;
    str_edit:SetText(table.concat(edb_Str))&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь тоже нет особых сложностей, но, тем не менее, прокомментируем наши действия.&lt;br /&gt;
Подключаемся к контролу EditBox (1) и получаем символ, находящийся в текущей позиции ввода (2). Если включен режим кириллицы, то ищем код переданного движком символа (он всегда английский) в таблице перекодировки и при его наличии получаем соответствующий код русского символа (3). Если код найден, то подменяем английский символ русским, а если нет, то оставляем всё как есть (4). Заносим полученный символ в массив копии строки ввода в соответствии со значение текущей позиции курсора (5). Устанавливаем новую текущую позиции ввода (6), преобразуем массив символов в строку и возвращаем её в поле ввода (7).&lt;br /&gt;
&lt;br /&gt;
Если Вы всё проделами правильно, то теперь можете вводить имя сохраняемого файла в английской, русской или смешанной кодировке, а также корректировать вводимый текст без искажения его синтаксиса.&lt;br /&gt;
&lt;br /&gt;
Послесловие:&lt;br /&gt;
Этот алгоритм имеет отличие от стандартной обработки строки редактирования, которое выражается в том, что при вставке символа в середину строки, позиция ввода следующего символа всегда устанавливается в её конец, тогда как в “штатной” – текущей становится следующая позиция. В этой ситуации есть свой плюс и свой минус, однако в любом случае, как побороть это, я просто не знаю.&lt;/div&gt;</summary>
		<author><name>Serge!</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%A3%D1%87%D0%B8%D0%BC_S.T.A.L.K.E.R._%D0%A2%D0%A7_%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%BE%D0%BC%D1%83_%D1%8F%D0%B7%D1%8B%D0%BA%D1%83</id>
		<title>Учим S.T.A.L.K.E.R. ТЧ русскому языку</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A3%D1%87%D0%B8%D0%BC_S.T.A.L.K.E.R._%D0%A2%D0%A7_%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%BE%D0%BC%D1%83_%D1%8F%D0%B7%D1%8B%D0%BA%D1%83"/>
				<updated>2015-11-14T12:28:51Z</updated>
		
		<summary type="html">&lt;p&gt;Serge!: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;За много лет игры все уже почти привыкли, что сохранить текущее состояние в процессе игры мы можем только в файле с английской транскрипцией. Мне это не очень нравится и поэтому предлагаю способ научить ТЧ сохранить файлы с именами на русском или (это уже самостоятельно) на любом другом языке.&lt;br /&gt;
Это не сложно и справиться может каждый, кто знает, что такое есть текстовый редактор.&lt;br /&gt;
Для решения нашей задачи нам понадобятся файлы: ui_save_dialog.script и ui_mm_save_dlg.xml и ещё один, который мы создадим сами, с именем ui_save_dlg_rus.script. Первый и третий должны находиться в папке gamedata\scripts\, а второй в gamedata\config\ui\. Если их там нет или вообще нет папки gamedata, то значит Вам придётся извлечь их (1 и 2) из архивов дистрибутива (файлы gamedata/dbX) или отказаться от затеи русификации. Как распаковать архивы дистрибутива я не буду, т.к. про это не рассказали только самые ленивые, поэтому считаем, что эти файлы Вам доступны.&lt;br /&gt;
&lt;br /&gt;
Начинаем.&lt;br /&gt;
Сначала проделаем маленькую, но необходимую работу, а именно: определим индикатор/переключатель текущего языка ввода. Для этого открываем файл ui_mm_save_dlg.xml и в конец тега form добавим строчки, чтобы получилось так:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
		&amp;lt;st_lang x=&amp;quot;280&amp;quot; y=&amp;quot;400&amp;quot; width=&amp;quot;30&amp;quot; height=&amp;quot;20&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;text font=&amp;quot;graffiti22&amp;quot; align=&amp;quot;c&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;text_color&amp;gt; &amp;lt;e r=&amp;quot;227&amp;quot; g=&amp;quot;199&amp;quot; b=&amp;quot;178&amp;quot;/&amp;gt; &amp;lt;h r=&amp;quot;255&amp;quot; g=&amp;quot;0&amp;quot; b=&amp;quot;0&amp;quot;/&amp;gt; &amp;lt;/text_color&amp;gt;&lt;br /&gt;
		&amp;lt;/st_lang&amp;gt;&lt;br /&gt;
	&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Закрываем файл. Он нам больше не понадобится.&lt;br /&gt;
Теперь создадим таблицу перекодировки английских символов в кириллицу, которую запишем в наш 3-й файл ui_save_dlg_rus.script.&lt;br /&gt;
Выглядит эта таблица так: &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local tbl_ansii = {&lt;br /&gt;
        [ 034 ] = 221, -- &amp;quot; --&amp;gt; Э&lt;br /&gt;
        [ 035 ] = 185, -- # --&amp;gt; №&lt;br /&gt;
	[ 039 ] = 253, -- ' --&amp;gt; э&lt;br /&gt;
	[ 044 ] = 225, -- , --&amp;gt; б&lt;br /&gt;
	[ 046 ] = 254, -- . --&amp;gt; ю&lt;br /&gt;
	[ 047 ] = 046, -- / --&amp;gt; .&lt;br /&gt;
	[ 058 ] = 198, -- : --&amp;gt; Ж&lt;br /&gt;
	[ 059 ] = 230, -- ; --&amp;gt; ж&lt;br /&gt;
	[ 060 ] = 193, -- &amp;lt; --&amp;gt; Б&lt;br /&gt;
	[ 062 ] = 222, -- &amp;gt; --&amp;gt; Ю&lt;br /&gt;
	[ 065 ] = 212, -- A --&amp;gt; Ф&lt;br /&gt;
	[ 066 ] = 200, -- B --&amp;gt; И&lt;br /&gt;
	[ 067 ] = 209, -- C --&amp;gt; С&lt;br /&gt;
	[ 068 ] = 194, -- D --&amp;gt; В&lt;br /&gt;
	[ 069 ] = 211, -- E --&amp;gt; У&lt;br /&gt;
	[ 070 ] = 192, -- F --&amp;gt; А&lt;br /&gt;
	[ 071 ] = 207, -- G --&amp;gt; П&lt;br /&gt;
	[ 072 ] = 208, -- H --&amp;gt; Р&lt;br /&gt;
	[ 073 ] = 216, -- I --&amp;gt; Ш&lt;br /&gt;
	[ 074 ] = 206, -- J --&amp;gt; О&lt;br /&gt;
	[ 075 ] = 203, -- K --&amp;gt; Л&lt;br /&gt;
	[ 076 ] = 196, -- L --&amp;gt; Д&lt;br /&gt;
	[ 077 ] = 220, -- M --&amp;gt; Ь&lt;br /&gt;
	[ 078 ] = 210, -- N --&amp;gt; Т&lt;br /&gt;
	[ 079 ] = 217, -- O --&amp;gt; Щ&lt;br /&gt;
	[ 080 ] = 199, -- P --&amp;gt; З&lt;br /&gt;
	[ 081 ] = 201, -- Q --&amp;gt; Й&lt;br /&gt;
	[ 082 ] = 202, -- R --&amp;gt; К&lt;br /&gt;
	[ 083 ] = 219, -- S --&amp;gt; Ы&lt;br /&gt;
	[ 084 ] = 197, -- T --&amp;gt; Е&lt;br /&gt;
	[ 085 ] = 195, -- U --&amp;gt; Г&lt;br /&gt;
	[ 086 ] = 204, -- V --&amp;gt; М&lt;br /&gt;
	[ 087 ] = 214, -- W --&amp;gt; Ц&lt;br /&gt;
	[ 088 ] = 215, -- X --&amp;gt; Ч&lt;br /&gt;
	[ 089 ] = 205, -- Y --&amp;gt; Н&lt;br /&gt;
	[ 090 ] = 223, -- Z --&amp;gt; Я&lt;br /&gt;
	[ 091 ] = 245, -- [ --&amp;gt; х&lt;br /&gt;
	[ 093 ] = 250, -- ] --&amp;gt; ъ&lt;br /&gt;
	[ 097 ] = 244, -- a --&amp;gt; ф&lt;br /&gt;
	[ 098 ] = 232, -- b --&amp;gt; и&lt;br /&gt;
	[ 099 ] = 241, -- c --&amp;gt; с&lt;br /&gt;
	[ 100 ] = 226, -- d --&amp;gt; в&lt;br /&gt;
	[ 101 ] = 243, -- e --&amp;gt; у&lt;br /&gt;
	[ 102 ] = 224, -- f --&amp;gt; а&lt;br /&gt;
	[ 103 ] = 239, -- g --&amp;gt; п&lt;br /&gt;
	[ 104 ] = 240, -- h --&amp;gt; р&lt;br /&gt;
	[ 105 ] = 248, -- i --&amp;gt; ш&lt;br /&gt;
	[ 106 ] = 238, -- j --&amp;gt; о&lt;br /&gt;
	[ 107 ] = 235, -- k --&amp;gt; л&lt;br /&gt;
	[ 108 ] = 228, -- l --&amp;gt; д&lt;br /&gt;
	[ 109 ] = 252, -- m --&amp;gt; ь&lt;br /&gt;
	[ 110 ] = 242, -- n --&amp;gt; т&lt;br /&gt;
	[ 111 ] = 249, -- o --&amp;gt; щ&lt;br /&gt;
	[ 112 ] = 231, -- p --&amp;gt; з&lt;br /&gt;
	[ 113 ] = 233, -- q --&amp;gt; й&lt;br /&gt;
	[ 114 ] = 234, -- r --&amp;gt; к&lt;br /&gt;
	[ 115 ] = 251, -- s --&amp;gt; ы&lt;br /&gt;
	[ 116 ] = 229, -- t --&amp;gt; е&lt;br /&gt;
	[ 117 ] = 227, -- u --&amp;gt; г&lt;br /&gt;
	[ 118 ] = 236, -- v --&amp;gt; м&lt;br /&gt;
	[ 119 ] = 246, -- w --&amp;gt; ц&lt;br /&gt;
	[ 120 ] = 247, -- x --&amp;gt; ч&lt;br /&gt;
	[ 121 ] = 237, -- y --&amp;gt; н&lt;br /&gt;
	[ 122 ] = 255, -- z --&amp;gt; я&lt;br /&gt;
	[ 123 ] = 213, -- { --&amp;gt; Х&lt;br /&gt;
	[ 125 ] = 218, -- } --&amp;gt; Ъ&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Открываем в редакторе файл ui_save_dialog.script.&lt;br /&gt;
&lt;br /&gt;
1. Вверху, сразу под комментариями описания скрипта, определяем несколько переменных: &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local t_lang,  edb_Pos, edb_Str = ui_save_dlg_rus.tbl_ansii, 1, {}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
где: t_lang – таблица перекодировки, edb_Pos – позиция курсора в поле EditBox (инициируется 1) и edb_Str – массив, в котором мы будем сохранять символы вводимого текста.&lt;br /&gt;
&lt;br /&gt;
2. Создадим индикатор текущего языка ввода текста.&lt;br /&gt;
&lt;br /&gt;
Договоримся, что переключать раскладку будем щелчком левой кнопки мыши по индикатору или клавишей левый-Ctrl (причем она будет работать как триггер), а переключать режим временного изменения языка ввода будем при нажатой и удерживаемой клавише левый-Alt.&lt;br /&gt;
Для этого в методе save_dialog:InitControls() в самом конце вставим:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
self.ind_lan = xml:Init3tButton(&amp;quot;form:st_lang&amp;quot;, self.form)&lt;br /&gt;
self:Register(self.ind_lan, &amp;quot;button_lang&amp;quot;)&lt;br /&gt;
self.ind_lan:SetText(&amp;quot;Рус&amp;quot;)&lt;br /&gt;
self.mode_lang = true&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
где: self.mode_lang - флаг текущего языка ввода (true - русский, false - английский)&lt;br /&gt;
Всё, переключатель языка ввода мы создали, теперь надо обеспечить его функционирование.&lt;br /&gt;
Для этого в функцию InitCallBacks() вставим строку:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
self:AddCallback(&amp;quot;button_lang&amp;quot;, ui_events.BUTTON_CLICKED, self.OnChg_lan, self)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
а этим под блоком вставляем функцию:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function save_dialog:OnChg_lan()&lt;br /&gt;
	self.mode_lang = not self.mode_lang&lt;br /&gt;
	if self.mode_lang then self.ind_lang:SetText(&amp;quot;Рус&amp;quot;)&lt;br /&gt;
	else self.ind_lang:SetText(&amp;quot;Eng&amp;quot;) end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Здесь всё ясно - сначала инвертируем флаг текущего языка ввода и потом меняем текст индикатора.&lt;br /&gt;
&lt;br /&gt;
Отлавливать факт переключения языка ввода и сам ввод в поле имени файла будем в системном прерывании save_dialog:OnKeyboard(dik, keyboard_action). Для этого добавим туда свои строки, чтобы в итоге получилось так:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function save_dialog:OnKeyboard(dik, keyboard_action)  --virtual function&lt;br /&gt;
    ui_base_dialog.base_dialog.OnKeyboard(self,dik,keyboard_action)&lt;br /&gt;
    DIK_RETURN = 28&lt;br /&gt;
    WINDOW_KEY_PRESSED = 6&lt;br /&gt;
    if dik == DIK_RETURN and keyboard_action == WINDOW_KEY_PRESSED then &lt;br /&gt;
        self:OnButton_ok_clicked()&lt;br /&gt;
        self.owner:Show(true)&lt;br /&gt;
        elseif keyboard_action == ui_events.WINDOW_KEY_PRESSED then&lt;br /&gt;
        if dik == DIK_keys.DIK_LCONTROL or dik == DIK_keys.DIK_LMENU then&lt;br /&gt;
            self:OnChg_lan()&lt;br /&gt;
        elseif dik == DIK_keys.DIK_LEFT then&lt;br /&gt;
            if edb_Pos &amp;gt; 1 then edb_Pos = edb_Pos - 1 end&lt;br /&gt;
        elseif dik == DIK_keys.DIK_RIGHT then&lt;br /&gt;
            if edb_Pos &amp;lt;= #edb_Str then edb_Pos = edb_Pos + 1 end&lt;br /&gt;
        elseif dik == DIK_keys.DIK_DELETE then&lt;br /&gt;
            if edb_Pos &amp;lt;= #edb_Str then table.remove(edb_Str,edb_Pos) end&lt;br /&gt;
        elseif dik == DIK_keys.DIK_BACK then&lt;br /&gt;
            if edb_Pos &amp;gt; 1 then edb_Pos = edb_Pos-1 end&lt;br /&gt;
            table.remove(edb_Str,edb_Pos)&lt;br /&gt;
        elseif     (dik &amp;gt;= 2  and dik &amp;lt;= 13) or &lt;br /&gt;
                        (dik &amp;gt;= 16 and dik &amp;lt;= 27) or &lt;br /&gt;
                        (dik &amp;gt;= 30 and dik &amp;lt;= 40) or&lt;br /&gt;
                        (dik &amp;gt;= 44 and dik &amp;lt;= 53) or&lt;br /&gt;
                        dik == 57 or &lt;br /&gt;
                        (dik &amp;gt;= 71 and dik &amp;lt;= 83) then self:OnEdit_CHANGED()&lt;br /&gt;
        end&lt;br /&gt;
    elseif keyboard_action == ui_events.WINDOW_KEY_RELEASED then&lt;br /&gt;
        if dik == DIK_keys.DIK_LMENU then&lt;br /&gt;
                self:OnChg_lan()&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return true&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь всё достаточно просто. При переключении языка вызывается метод self:OnChg_lan(). При перемещении стрелками проверяем новое положение курсора и, если оно в пределах строки, то запоминаем его позицию. При удалении символа из строки удаляем соответствующий элемент из массива копии строки и опять же запоминаем текущую позицию ввода. При вводе текста  отлавливаются прерывания от всех клавиш с печатными символами и, если такое обнаружено, то вызывается функция обработчик, т.е. OnEdit_CHANGED(). Обратите внимание, что мы даже не пытаемся отловить ввод буквы ‘ё’, т.к. на этой же клавише размещена тильда ‘~’, которую движок «сталкера» обрабатывает специальным образом для вывода окна консоли.&lt;br /&gt;
И так, если мы зафиксировали факт нажатия клавиши с печатным символом, то вызывается функция OnEdit_CHANGED, но её пока нет. Вот ею и займёмся.&lt;br /&gt;
&lt;br /&gt;
Сразу под созданной нами ранее save_dialog:OnChg_lan() вставим ещё одну функцию:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function save_dialog:OnEdit_CHANGED()&lt;br /&gt;
    local str_edit = self:GetEditBox(&amp;quot;edit_filename&amp;quot;)&lt;br /&gt;
    local sim = str_edit:GetText():match ('.',edb_Pos)&lt;br /&gt;
    local cls = self.mode_lang and t_lang[sim:byte()]&lt;br /&gt;
    sim = cls and string.char(cls) or sim&lt;br /&gt;
    table.insert(edb_Str,edb_Pos,sim)&lt;br /&gt;
    edb_Pos = #edb_Str + 1&lt;br /&gt;
    str_edit:SetText(table.concat(edb_Str))&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь тоже нет особых сложностей, но, тем не менее, прокомментируем наши действия.&lt;br /&gt;
Подключаемся к контролу EditBox (1) и получаем символ, находящийся в текущей позиции ввода (2). Если включен режим кириллицы, то ищем код переданного движком символа (он всегда английский) в таблице перекодировки и при его наличии получаем соответствующий код русского символа (3). Если код найден, то подменяем английский символ русским, а если нет, то оставляем всё как есть (4). Заносим полученный символ в массив копии строки ввода в соответствии со значение текущей позиции курсора (5). Устанавливаем новую текущую позиции ввода (6), преобразуем массив символов в строку и возвращаем её в поле ввода (7).&lt;br /&gt;
&lt;br /&gt;
Если Вы всё проделами правильно, то теперь можете вводить имя сохраняемого файла в английской, русской или смешанной кодировке, а также корректировать вводимый текст без искажения его синтаксиса.&lt;br /&gt;
&lt;br /&gt;
Послесловие:&lt;br /&gt;
Этот алгоритм имеет отличие от стандартной обработки строки редактирования, которое выражается в том, что при вставке символа в середину строки, позиции ввода следующего символа всегда устанавливается в её конец, тогда как в “штатной” – текущей становится следующая позиция. В этой ситуации есть свой плюс и свой минус, однако в любом случае, как побороть это, я просто не знаю.&lt;/div&gt;</summary>
		<author><name>Serge!</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%A3%D1%87%D0%B8%D0%BC_S.T.A.L.K.E.R._%D0%A2%D0%A7_%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%BE%D0%BC%D1%83_%D1%8F%D0%B7%D1%8B%D0%BA%D1%83</id>
		<title>Учим S.T.A.L.K.E.R. ТЧ русскому языку</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A3%D1%87%D0%B8%D0%BC_S.T.A.L.K.E.R._%D0%A2%D0%A7_%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%BE%D0%BC%D1%83_%D1%8F%D0%B7%D1%8B%D0%BA%D1%83"/>
				<updated>2015-11-14T12:26:05Z</updated>
		
		<summary type="html">&lt;p&gt;Serge!: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;За много лет игры все уже почти привыкли, что сохранить текущее состояние в процессе игры мы можем только в файле с английской транскрипцией. Мне это не очень нравится и поэтому предлагаю способ научить ТЧ сохранить файлы с именами на русском или (это уже самостоятельно) на любом другом языке.&lt;br /&gt;
Это не сложно и справиться может каждый, кто знает, что такое есть текстовый редактор.&lt;br /&gt;
Для решения нашей задачи нам понадобятся файлы: ui_save_dialog.script и ui_mm_save_dlg.xml и ещё один, который мы создадим сами, с именем ui_save_dlg_rus.script. Первый и третий должны находиться в папке gamedata\scripts\, а второй в gamedata\config\ui\. Если их там нет или вообще нет папки gamedata, то значит Вам придётся извлечь их (1 и 2) из архивов дистрибутива (файлы gamedata/dbX) или отказаться от затеи русификации. Как распаковать архивы дистрибутива я не буду, т.к. про это не рассказали только самые ленивые, поэтому считаем, что эти файлы Вам доступны.&lt;br /&gt;
&lt;br /&gt;
Начинаем.&lt;br /&gt;
Сначала проделаем маленькую, но необходимую работу, а именно: определим индикатор/переключатель текущего языка ввода. Для этого открываем файл ui_mm_save_dlg.xml и в конец тега form добавим строчки, чтобы получилось так:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
		&amp;lt;st_lang x=&amp;quot;280&amp;quot; y=&amp;quot;400&amp;quot; width=&amp;quot;30&amp;quot; height=&amp;quot;20&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;text font=&amp;quot;graffiti22&amp;quot; align=&amp;quot;c&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;text_color&amp;gt; &amp;lt;e r=&amp;quot;227&amp;quot; g=&amp;quot;199&amp;quot; b=&amp;quot;178&amp;quot;/&amp;gt; &amp;lt;h r=&amp;quot;255&amp;quot; g=&amp;quot;0&amp;quot; b=&amp;quot;0&amp;quot;/&amp;gt; &amp;lt;/text_color&amp;gt;&lt;br /&gt;
		&amp;lt;/st_lang&amp;gt;&lt;br /&gt;
	&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Закрываем файл. Он нам больше не понадобится.&lt;br /&gt;
Теперь создадим таблицу перекодировки английских символов в кириллицу, которую запишем в наш 3-й файл ui_save_dlg_rus.script.&lt;br /&gt;
Выглядит эта таблица так: &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local tbl_ansii = {&lt;br /&gt;
	[ 039 ] = 253, -- ' --&amp;gt; э&lt;br /&gt;
	[ 044 ] = 225, -- , --&amp;gt; б&lt;br /&gt;
	[ 046 ] = 254, -- . --&amp;gt; ю&lt;br /&gt;
	[ 047 ] = 046, -- / --&amp;gt; .&lt;br /&gt;
	[ 058 ] = 198, -- : --&amp;gt; Ж&lt;br /&gt;
	[ 059 ] = 230, -- ; --&amp;gt; ж&lt;br /&gt;
	[ 060 ] = 193, -- &amp;lt; --&amp;gt; Б&lt;br /&gt;
	[ 062 ] = 222, -- &amp;gt; --&amp;gt; Ю&lt;br /&gt;
	[ 065 ] = 212, -- A --&amp;gt; Ф&lt;br /&gt;
	[ 066 ] = 200, -- B --&amp;gt; И&lt;br /&gt;
	[ 067 ] = 209, -- C --&amp;gt; С&lt;br /&gt;
	[ 068 ] = 194, -- D --&amp;gt; В&lt;br /&gt;
	[ 069 ] = 211, -- E --&amp;gt; У&lt;br /&gt;
	[ 070 ] = 192, -- F --&amp;gt; А&lt;br /&gt;
	[ 071 ] = 207, -- G --&amp;gt; П&lt;br /&gt;
	[ 072 ] = 208, -- H --&amp;gt; Р&lt;br /&gt;
	[ 073 ] = 216, -- I --&amp;gt; Ш&lt;br /&gt;
	[ 074 ] = 206, -- J --&amp;gt; О&lt;br /&gt;
	[ 075 ] = 203, -- K --&amp;gt; Л&lt;br /&gt;
	[ 076 ] = 196, -- L --&amp;gt; Д&lt;br /&gt;
	[ 077 ] = 220, -- M --&amp;gt; Ь&lt;br /&gt;
	[ 078 ] = 210, -- N --&amp;gt; Т&lt;br /&gt;
	[ 079 ] = 217, -- O --&amp;gt; Щ&lt;br /&gt;
	[ 080 ] = 199, -- P --&amp;gt; З&lt;br /&gt;
	[ 081 ] = 201, -- Q --&amp;gt; Й&lt;br /&gt;
	[ 082 ] = 202, -- R --&amp;gt; К&lt;br /&gt;
	[ 083 ] = 219, -- S --&amp;gt; Ы&lt;br /&gt;
	[ 084 ] = 197, -- T --&amp;gt; Е&lt;br /&gt;
	[ 085 ] = 195, -- U --&amp;gt; Г&lt;br /&gt;
	[ 086 ] = 204, -- V --&amp;gt; М&lt;br /&gt;
	[ 087 ] = 214, -- W --&amp;gt; Ц&lt;br /&gt;
	[ 088 ] = 215, -- X --&amp;gt; Ч&lt;br /&gt;
	[ 089 ] = 205, -- Y --&amp;gt; Н&lt;br /&gt;
	[ 090 ] = 223, -- Z --&amp;gt; Я&lt;br /&gt;
	[ 091 ] = 245, -- [ --&amp;gt; х&lt;br /&gt;
	[ 093 ] = 250, -- ] --&amp;gt; ъ&lt;br /&gt;
	[ 097 ] = 244, -- a --&amp;gt; ф&lt;br /&gt;
	[ 098 ] = 232, -- b --&amp;gt; и&lt;br /&gt;
	[ 099 ] = 241, -- c --&amp;gt; с&lt;br /&gt;
	[ 100 ] = 226, -- d --&amp;gt; в&lt;br /&gt;
	[ 101 ] = 243, -- e --&amp;gt; у&lt;br /&gt;
	[ 102 ] = 224, -- f --&amp;gt; а&lt;br /&gt;
	[ 103 ] = 239, -- g --&amp;gt; п&lt;br /&gt;
	[ 104 ] = 240, -- h --&amp;gt; р&lt;br /&gt;
	[ 105 ] = 248, -- i --&amp;gt; ш&lt;br /&gt;
	[ 106 ] = 238, -- j --&amp;gt; о&lt;br /&gt;
	[ 107 ] = 235, -- k --&amp;gt; л&lt;br /&gt;
	[ 108 ] = 228, -- l --&amp;gt; д&lt;br /&gt;
	[ 109 ] = 252, -- m --&amp;gt; ь&lt;br /&gt;
	[ 110 ] = 242, -- n --&amp;gt; т&lt;br /&gt;
	[ 111 ] = 249, -- o --&amp;gt; щ&lt;br /&gt;
	[ 112 ] = 231, -- p --&amp;gt; з&lt;br /&gt;
	[ 113 ] = 233, -- q --&amp;gt; й&lt;br /&gt;
	[ 114 ] = 234, -- r --&amp;gt; к&lt;br /&gt;
	[ 115 ] = 251, -- s --&amp;gt; ы&lt;br /&gt;
	[ 116 ] = 229, -- t --&amp;gt; е&lt;br /&gt;
	[ 117 ] = 227, -- u --&amp;gt; г&lt;br /&gt;
	[ 118 ] = 236, -- v --&amp;gt; м&lt;br /&gt;
	[ 119 ] = 246, -- w --&amp;gt; ц&lt;br /&gt;
	[ 120 ] = 247, -- x --&amp;gt; ч&lt;br /&gt;
	[ 121 ] = 237, -- y --&amp;gt; н&lt;br /&gt;
	[ 122 ] = 255, -- z --&amp;gt; я&lt;br /&gt;
	[ 123 ] = 213, -- { --&amp;gt; Х&lt;br /&gt;
	[ 125 ] = 218, -- } --&amp;gt; Ъ&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Открываем в редакторе файл ui_save_dialog.script.&lt;br /&gt;
&lt;br /&gt;
1. Вверху, сразу под комментариями описания скрипта, определяем несколько переменных: &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local t_lang,  edb_Pos, edb_Str = ui_save_dlg_rus.tbl_ansii, 1, {}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
где: t_lang – таблица перекодировки, edb_Pos – позиция курсора в поле EditBox (инициируется 1) и edb_Str – массив, в котором мы будем сохранять символы вводимого текста.&lt;br /&gt;
&lt;br /&gt;
2. Создадим индикатор текущего языка ввода текста.&lt;br /&gt;
&lt;br /&gt;
Договоримся, что переключать раскладку будем щелчком левой кнопки мыши по индикатору или клавишей левый-Ctrl (причем она будет работать как триггер), а переключать режим временного изменения языка ввода будем при нажатой и удерживаемой клавише левый-Alt.&lt;br /&gt;
Для этого в методе save_dialog:InitControls() в самом конце вставим:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
self.ind_lan = xml:Init3tButton(&amp;quot;form:st_lang&amp;quot;, self.form)&lt;br /&gt;
self:Register(self.ind_lan, &amp;quot;button_lang&amp;quot;)&lt;br /&gt;
self.ind_lan:SetText(&amp;quot;Рус&amp;quot;)&lt;br /&gt;
self.mode_lang = true&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
где: self.mode_lang - флаг текущего языка ввода (true - русский, false - английский)&lt;br /&gt;
Всё, переключатель языка ввода мы создали, теперь надо обеспечить его функционирование.&lt;br /&gt;
Для этого в функцию InitCallBacks() вставим строку:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
self:AddCallback(&amp;quot;button_lang&amp;quot;, ui_events.BUTTON_CLICKED, self.OnChg_lan, self)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
а этим под блоком вставляем функцию:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function save_dialog:OnChg_lan()&lt;br /&gt;
	self.mode_lang = not self.mode_lang&lt;br /&gt;
	if self.mode_lang then self.ind_lang:SetText(&amp;quot;Рус&amp;quot;)&lt;br /&gt;
	else self.ind_lang:SetText(&amp;quot;Eng&amp;quot;) end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Здесь всё ясно - сначала инвертируем флаг текущего языка ввода и потом меняем текст индикатора.&lt;br /&gt;
&lt;br /&gt;
Отлавливать факт переключения языка ввода и сам ввод в поле имени файла будем в системном прерывании save_dialog:OnKeyboard(dik, keyboard_action). Для этого добавим туда свои строки, чтобы в итоге получилось так:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function save_dialog:OnKeyboard(dik, keyboard_action)  --virtual function&lt;br /&gt;
    ui_base_dialog.base_dialog.OnKeyboard(self,dik,keyboard_action)&lt;br /&gt;
    DIK_RETURN = 28&lt;br /&gt;
    WINDOW_KEY_PRESSED = 6&lt;br /&gt;
    if dik == DIK_RETURN and keyboard_action == WINDOW_KEY_PRESSED then &lt;br /&gt;
        self:OnButton_ok_clicked()&lt;br /&gt;
        self.owner:Show(true)&lt;br /&gt;
        elseif keyboard_action == ui_events.WINDOW_KEY_PRESSED then&lt;br /&gt;
        if dik == DIK_keys.DIK_LCONTROL or dik == DIK_keys.DIK_LMENU then&lt;br /&gt;
            self:OnChg_lan()&lt;br /&gt;
        elseif dik == DIK_keys.DIK_LEFT then&lt;br /&gt;
            if edb_Pos &amp;gt; 1 then edb_Pos = edb_Pos - 1 end&lt;br /&gt;
        elseif dik == DIK_keys.DIK_RIGHT then&lt;br /&gt;
            if edb_Pos &amp;lt;= #edb_Str then edb_Pos = edb_Pos + 1 end&lt;br /&gt;
        elseif dik == DIK_keys.DIK_DELETE then&lt;br /&gt;
            if edb_Pos &amp;lt;= #edb_Str then table.remove(edb_Str,edb_Pos) end&lt;br /&gt;
        elseif dik == DIK_keys.DIK_BACK then&lt;br /&gt;
            if edb_Pos &amp;gt; 1 then edb_Pos = edb_Pos-1 end&lt;br /&gt;
            table.remove(edb_Str,edb_Pos)&lt;br /&gt;
        elseif     (dik &amp;gt;= 2  and dik &amp;lt;= 13) or &lt;br /&gt;
                        (dik &amp;gt;= 16 and dik &amp;lt;= 27) or &lt;br /&gt;
                        (dik &amp;gt;= 30 and dik &amp;lt;= 40) or&lt;br /&gt;
                        (dik &amp;gt;= 44 and dik &amp;lt;= 53) or&lt;br /&gt;
                        dik == 57 or &lt;br /&gt;
                        (dik &amp;gt;= 71 and dik &amp;lt;= 83) then self:OnEdit_CHANGED()&lt;br /&gt;
        end&lt;br /&gt;
    elseif keyboard_action == ui_events.WINDOW_KEY_RELEASED then&lt;br /&gt;
        if dik == DIK_keys.DIK_LMENU then&lt;br /&gt;
                self:OnChg_lan()&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return true&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь всё достаточно просто. При переключении языка вызывается метод self:OnChg_lan(). При перемещении стрелками проверяем новое положение курсора и, если оно в пределах строки, то запоминаем его позицию. При удалении символа из строки удаляем соответствующий элемент из массива копии строки и опять же запоминаем текущую позицию ввода. При вводе текста  отлавливаются прерывания от всех клавиш с печатными символами и, если такое обнаружено, то вызывается функция обработчик, т.е. OnEdit_CHANGED(). Обратите внимание, что мы даже не пытаемся отловить ввод буквы ‘ё’, т.к. на этой же клавише размещена тильда ‘~’, которую движок «сталкера» обрабатывает специальным образом для вывода окна консоли.&lt;br /&gt;
И так, если мы зафиксировали факт нажатия клавиши с печатным символом, то вызывается функция OnEdit_CHANGED, но её пока нет. Вот ею и займёмся.&lt;br /&gt;
&lt;br /&gt;
Сразу под созданной нами ранее save_dialog:OnChg_lan() вставим ещё одну функцию:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function save_dialog:OnEdit_CHANGED()&lt;br /&gt;
    local str_edit = self:GetEditBox(&amp;quot;edit_filename&amp;quot;)&lt;br /&gt;
    local sim = str_edit:GetText():match ('.',edb_Pos)&lt;br /&gt;
    local cls = self.mode_lang and t_lang[sim:byte()]&lt;br /&gt;
    sim = cls and string.char(cls) or sim&lt;br /&gt;
    table.insert(edb_Str,edb_Pos,sim)&lt;br /&gt;
    edb_Pos = #edb_Str + 1&lt;br /&gt;
    str_edit:SetText(table.concat(edb_Str))&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь тоже нет особых сложностей, но, тем не менее, прокомментируем наши действия.&lt;br /&gt;
Подключаемся к контролу EditBox (1) и получаем символ, находящийся в текущей позиции ввода (2). Если включен режим кириллицы, то ищем код переданного движком символа (он всегда английский) в таблице перекодировки и при его наличии получаем соответствующий код русского символа (3). Если код найден, то подменяем английский символ русским, а если нет, то оставляем всё как есть (4). Заносим полученный символ в массив копии строки ввода в соответствии со значение текущей позиции курсора (5). Устанавливаем новую текущую позиции ввода (6), преобразуем массив символов в строку и возвращаем её в поле ввода (7).&lt;br /&gt;
&lt;br /&gt;
Если Вы всё проделами правильно, то теперь можете вводить имя сохраняемого файла в английской, русской или смешанной кодировке, а также корректировать вводимый текст без искажения его синтаксиса.&lt;br /&gt;
&lt;br /&gt;
Послесловие:&lt;br /&gt;
Этот алгоритм имеет отличие от стандартной обработки строки редактирования, которое выражается в том, что при вставке символа в середину строки, позиции ввода следующего символа всегда устанавливается в её конец, тогда как в “штатной” – текущей становится следующая позиция. В этой ситуации есть свой плюс и свой минус, однако в любом случае, как побороть это, я просто не знаю.&lt;/div&gt;</summary>
		<author><name>Serge!</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%A3%D1%87%D0%B8%D0%BC_S.T.A.L.K.E.R._%D0%A2%D0%A7_%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%BE%D0%BC%D1%83_%D1%8F%D0%B7%D1%8B%D0%BA%D1%83</id>
		<title>Учим S.T.A.L.K.E.R. ТЧ русскому языку</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A3%D1%87%D0%B8%D0%BC_S.T.A.L.K.E.R._%D0%A2%D0%A7_%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%BE%D0%BC%D1%83_%D1%8F%D0%B7%D1%8B%D0%BA%D1%83"/>
				<updated>2015-11-14T12:14:42Z</updated>
		
		<summary type="html">&lt;p&gt;Serge!: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;За много лет игры все уже почти привыкли, что сохранить текущее состояние в процессе игры мы можем только в файле с английской транскрипцией. Мне это не очень нравится и поэтому предлагаю способ научить ТЧ сохранить файлы с именами на русском или (это уже самостоятельно) на любом другом языке.&lt;br /&gt;
Это не сложно и справиться может каждый, кто знает, что такое есть текстовый редактор.&lt;br /&gt;
Для решения нашей задачи нам понадобятся файлы: ui_save_dialog.script и ui_mm_save_dlg.xml и ещё один, который мы создадим сами, с именем ui_save_dlg_rus.script. Первый и третий должны находиться в папке gamedata\scripts\, а второй в gamedata\config\ui\. Если их там нет или вообще нет папки gamedata, то значит Вам придётся извлечь их (1 и 2) из архивов дистрибутива (файлы gamedata/dbX) или отказаться от затеи русификации. Как распаковать архивы дистрибутива я не буду, т.к. про это не рассказали только самые ленивые, поэтому считаем, что эти файлы Вам доступны.&lt;br /&gt;
&lt;br /&gt;
Начинаем.&lt;br /&gt;
Сначала проделаем маленькую, но необходимую работу. Нам надо в окне диалога сохранения определить индикатор текущего языка ввода. Для этого открываем файл ui_mm_save_dlg.xml и в конец тега form добавим строчки, чтобы получилось так:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
		&amp;lt;st_lang x=&amp;quot;280&amp;quot; y=&amp;quot;400&amp;quot; width=&amp;quot;30&amp;quot; height=&amp;quot;20&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;text font=&amp;quot;graffiti22&amp;quot; align=&amp;quot;c&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;text_color&amp;gt; &amp;lt;e r=&amp;quot;227&amp;quot; g=&amp;quot;199&amp;quot; b=&amp;quot;178&amp;quot;/&amp;gt; &amp;lt;h r=&amp;quot;255&amp;quot; g=&amp;quot;0&amp;quot; b=&amp;quot;0&amp;quot;/&amp;gt; &amp;lt;/text_color&amp;gt;&lt;br /&gt;
		&amp;lt;/st_lang&amp;gt;&lt;br /&gt;
	&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Закрываем файл. Он нам больше не понадобится.&lt;br /&gt;
Теперь создадим таблицу перекодировки английских символов в кириллицу, которую запишем в наш 3-й файл ui_save_dlg_rus.script.&lt;br /&gt;
Выглядит эта таблица так: &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local tbl_ansii = {&lt;br /&gt;
	[ 039 ] = 253, -- ' --&amp;gt; э&lt;br /&gt;
	[ 044 ] = 225, -- , --&amp;gt; б&lt;br /&gt;
	[ 046 ] = 254, -- . --&amp;gt; ю&lt;br /&gt;
	[ 047 ] = 046, -- / --&amp;gt; .&lt;br /&gt;
	[ 058 ] = 198, -- : --&amp;gt; Ж&lt;br /&gt;
	[ 059 ] = 230, -- ; --&amp;gt; ж&lt;br /&gt;
	[ 060 ] = 193, -- &amp;lt; --&amp;gt; Б&lt;br /&gt;
	[ 062 ] = 222, -- &amp;gt; --&amp;gt; Ю&lt;br /&gt;
	[ 065 ] = 212, -- A --&amp;gt; Ф&lt;br /&gt;
	[ 066 ] = 200, -- B --&amp;gt; И&lt;br /&gt;
	[ 067 ] = 209, -- C --&amp;gt; С&lt;br /&gt;
	[ 068 ] = 194, -- D --&amp;gt; В&lt;br /&gt;
	[ 069 ] = 211, -- E --&amp;gt; У&lt;br /&gt;
	[ 070 ] = 192, -- F --&amp;gt; А&lt;br /&gt;
	[ 071 ] = 207, -- G --&amp;gt; П&lt;br /&gt;
	[ 072 ] = 208, -- H --&amp;gt; Р&lt;br /&gt;
	[ 073 ] = 216, -- I --&amp;gt; Ш&lt;br /&gt;
	[ 074 ] = 206, -- J --&amp;gt; О&lt;br /&gt;
	[ 075 ] = 203, -- K --&amp;gt; Л&lt;br /&gt;
	[ 076 ] = 196, -- L --&amp;gt; Д&lt;br /&gt;
	[ 077 ] = 220, -- M --&amp;gt; Ь&lt;br /&gt;
	[ 078 ] = 210, -- N --&amp;gt; Т&lt;br /&gt;
	[ 079 ] = 217, -- O --&amp;gt; Щ&lt;br /&gt;
	[ 080 ] = 199, -- P --&amp;gt; З&lt;br /&gt;
	[ 081 ] = 201, -- Q --&amp;gt; Й&lt;br /&gt;
	[ 082 ] = 202, -- R --&amp;gt; К&lt;br /&gt;
	[ 083 ] = 219, -- S --&amp;gt; Ы&lt;br /&gt;
	[ 084 ] = 197, -- T --&amp;gt; Е&lt;br /&gt;
	[ 085 ] = 195, -- U --&amp;gt; Г&lt;br /&gt;
	[ 086 ] = 204, -- V --&amp;gt; М&lt;br /&gt;
	[ 087 ] = 214, -- W --&amp;gt; Ц&lt;br /&gt;
	[ 088 ] = 215, -- X --&amp;gt; Ч&lt;br /&gt;
	[ 089 ] = 205, -- Y --&amp;gt; Н&lt;br /&gt;
	[ 090 ] = 223, -- Z --&amp;gt; Я&lt;br /&gt;
	[ 091 ] = 245, -- [ --&amp;gt; х&lt;br /&gt;
	[ 093 ] = 250, -- ] --&amp;gt; ъ&lt;br /&gt;
	[ 097 ] = 244, -- a --&amp;gt; ф&lt;br /&gt;
	[ 098 ] = 232, -- b --&amp;gt; и&lt;br /&gt;
	[ 099 ] = 241, -- c --&amp;gt; с&lt;br /&gt;
	[ 100 ] = 226, -- d --&amp;gt; в&lt;br /&gt;
	[ 101 ] = 243, -- e --&amp;gt; у&lt;br /&gt;
	[ 102 ] = 224, -- f --&amp;gt; а&lt;br /&gt;
	[ 103 ] = 239, -- g --&amp;gt; п&lt;br /&gt;
	[ 104 ] = 240, -- h --&amp;gt; р&lt;br /&gt;
	[ 105 ] = 248, -- i --&amp;gt; ш&lt;br /&gt;
	[ 106 ] = 238, -- j --&amp;gt; о&lt;br /&gt;
	[ 107 ] = 235, -- k --&amp;gt; л&lt;br /&gt;
	[ 108 ] = 228, -- l --&amp;gt; д&lt;br /&gt;
	[ 109 ] = 252, -- m --&amp;gt; ь&lt;br /&gt;
	[ 110 ] = 242, -- n --&amp;gt; т&lt;br /&gt;
	[ 111 ] = 249, -- o --&amp;gt; щ&lt;br /&gt;
	[ 112 ] = 231, -- p --&amp;gt; з&lt;br /&gt;
	[ 113 ] = 233, -- q --&amp;gt; й&lt;br /&gt;
	[ 114 ] = 234, -- r --&amp;gt; к&lt;br /&gt;
	[ 115 ] = 251, -- s --&amp;gt; ы&lt;br /&gt;
	[ 116 ] = 229, -- t --&amp;gt; е&lt;br /&gt;
	[ 117 ] = 227, -- u --&amp;gt; г&lt;br /&gt;
	[ 118 ] = 236, -- v --&amp;gt; м&lt;br /&gt;
	[ 119 ] = 246, -- w --&amp;gt; ц&lt;br /&gt;
	[ 120 ] = 247, -- x --&amp;gt; ч&lt;br /&gt;
	[ 121 ] = 237, -- y --&amp;gt; н&lt;br /&gt;
	[ 122 ] = 255, -- z --&amp;gt; я&lt;br /&gt;
	[ 123 ] = 213, -- { --&amp;gt; Х&lt;br /&gt;
	[ 125 ] = 218, -- } --&amp;gt; Ъ&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Открываем в редакторе файл ui_save_dialog.script.&lt;br /&gt;
&lt;br /&gt;
1. Вверху, сразу под комментариями описания скрипта, определяем несколько переменных: &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local t_lang,  edb_Pos, edb_Str = ui_save_dlg_rus.tbl_ansii, 1, {}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
где: t_lang – таблица перекодировки, edb_Pos – позиция курсора в поле EditBox (инициируется 1) и edb_Str – массив, в котором мы будем сохранять символы вводимого текста.&lt;br /&gt;
&lt;br /&gt;
2. Создадим индикатор текущего языка ввода текста.&lt;br /&gt;
&lt;br /&gt;
Договоримся, что переключать раскладку будем щелчком левой кнопки мыши по индикатору или клавишей левый-Ctrl (причем она будет работать как триггер), а переключать режим временного изменения языка ввода будем при нажатой и удерживаемой клавише левый-Alt.&lt;br /&gt;
Для этого в методе save_dialog:InitControls() в самом конце вставим:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
self.ind_lan = xml:Init3tButton(&amp;quot;form:st_lang&amp;quot;, self.form)&lt;br /&gt;
self:Register(self.ind_lan, &amp;quot;button_lang&amp;quot;)&lt;br /&gt;
self.ind_lan:SetText(&amp;quot;Рус&amp;quot;)&lt;br /&gt;
self.mode_lang = true&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
где: self.mode_lang - флаг текущего языка ввода (true - русский, false - английский)&lt;br /&gt;
Всё, переключатель языка ввода мы создали, теперь надо обеспечить его функционирование.&lt;br /&gt;
Для этого в функцию InitCallBacks() вставим строку:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
self:AddCallback(&amp;quot;button_lang&amp;quot;, ui_events.BUTTON_CLICKED, self.OnChg_lan, self)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
а этим под блоком вставляем функцию:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function save_dialog:OnChg_lan()&lt;br /&gt;
	self.mode_lang = not self.mode_lang&lt;br /&gt;
	if self.mode_lang then self.ind_lang:SetText(&amp;quot;Рус&amp;quot;)&lt;br /&gt;
	else self.ind_lang:SetText(&amp;quot;Eng&amp;quot;) end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Здесь всё ясно - сначала инвертируем флаг текущего языка ввода и потом меняем текст индикатора.&lt;br /&gt;
&lt;br /&gt;
Отлавливать факт переключения языка ввода и сам ввод в поле имени файла будем в системном прерывании save_dialog:OnKeyboard(dik, keyboard_action). Для этого добавим туда свои строки, чтобы в итоге получилось так:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function save_dialog:OnKeyboard(dik, keyboard_action)  --virtual function&lt;br /&gt;
    ui_base_dialog.base_dialog.OnKeyboard(self,dik,keyboard_action)&lt;br /&gt;
    DIK_RETURN = 28&lt;br /&gt;
    WINDOW_KEY_PRESSED = 6&lt;br /&gt;
    if dik == DIK_RETURN and keyboard_action == WINDOW_KEY_PRESSED then &lt;br /&gt;
        self:OnButton_ok_clicked()&lt;br /&gt;
        self.owner:Show(true)&lt;br /&gt;
        elseif keyboard_action == ui_events.WINDOW_KEY_PRESSED then&lt;br /&gt;
        if dik == DIK_keys.DIK_LCONTROL or dik == DIK_keys.DIK_LMENU then&lt;br /&gt;
            self:OnChg_lan()&lt;br /&gt;
        elseif dik == DIK_keys.DIK_LEFT then&lt;br /&gt;
            if edb_Pos &amp;gt; 1 then edb_Pos = edb_Pos - 1 end&lt;br /&gt;
        elseif dik == DIK_keys.DIK_RIGHT then&lt;br /&gt;
            if edb_Pos &amp;lt;= #edb_Str then edb_Pos = edb_Pos + 1 end&lt;br /&gt;
        elseif dik == DIK_keys.DIK_DELETE then&lt;br /&gt;
            if edb_Pos &amp;lt;= #edb_Str then table.remove(edb_Str,edb_Pos) end&lt;br /&gt;
        elseif dik == DIK_keys.DIK_BACK then&lt;br /&gt;
            if edb_Pos &amp;gt; 1 then edb_Pos = edb_Pos-1 end&lt;br /&gt;
            table.remove(edb_Str,edb_Pos)&lt;br /&gt;
        elseif     (dik &amp;gt;= 2  and dik &amp;lt;= 13) or &lt;br /&gt;
                        (dik &amp;gt;= 16 and dik &amp;lt;= 27) or &lt;br /&gt;
                        (dik &amp;gt;= 30 and dik &amp;lt;= 40) or&lt;br /&gt;
                        (dik &amp;gt;= 44 and dik &amp;lt;= 53) or&lt;br /&gt;
                        dik == 57 or &lt;br /&gt;
                        (dik &amp;gt;= 71 and dik &amp;lt;= 83) then self:OnEdit_CHANGED()&lt;br /&gt;
        end&lt;br /&gt;
    elseif keyboard_action == ui_events.WINDOW_KEY_RELEASED then&lt;br /&gt;
        if dik == DIK_keys.DIK_LMENU then&lt;br /&gt;
                self:OnChg_lan()&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return true&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь всё достаточно просто. При переключении языка вызывается метод self:OnChg_lan(). При перемещении стрелками проверяем новое положение курсора и, если оно в пределах строки, то запоминаем его позицию. При удалении символа из строки удаляем соответствующий элемент из массива копии строки и опять же запоминаем текущую позицию ввода. При вводе текста  отлавливаются прерывания от всех клавиш с печатными символами и, если такое обнаружено, то вызывается функция обработчик, т.е. OnEdit_CHANGED(). Обратите внимание, что мы даже не пытаемся отловить ввод буквы ‘ё’, т.к. на этой же клавише размещена тильда ‘~’, которую движок «сталкера» обрабатывает специальным образом для вывода окна консоли.&lt;br /&gt;
И так, если мы зафиксировали факт нажатия клавиши с печатным символом, то вызывается функция OnEdit_CHANGED, но её пока нет. Вот ею и займёмся.&lt;br /&gt;
&lt;br /&gt;
Сразу под созданной нами ранее save_dialog:OnChg_lan() вставим ещё одну функцию:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function save_dialog:OnEdit_CHANGED()&lt;br /&gt;
    local str_edit = self:GetEditBox(&amp;quot;edit_filename&amp;quot;)&lt;br /&gt;
    local sim = str_edit:GetText():match ('.',edb_Pos)&lt;br /&gt;
    local cls = self.mode_lang and t_lang[sim:byte()]&lt;br /&gt;
    sim = cls and string.char(cls) or sim&lt;br /&gt;
    table.insert(edb_Str,edb_Pos,sim)&lt;br /&gt;
    edb_Pos = #edb_Str + 1&lt;br /&gt;
    str_edit:SetText(table.concat(edb_Str))&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь тоже нет особых сложностей, но, тем не менее, прокомментируем наши действия.&lt;br /&gt;
Подключаемся к контролу EditBox (1) и получаем символ, находящийся в текущей позиции ввода (2). Если включен режим кириллицы, то ищем код переданного движком символа (он всегда английский) в таблице перекодировки и при его наличии получаем соответствующий код русского символа (3). Если код найден, то подменяем английский символ русским, а если нет, то оставляем всё как есть (4). Заносим полученный символ в массив копии строки ввода в соответствии со значение текущей позиции курсора (5). Устанавливаем новую текущую позиции ввода (6), преобразуем массив символов в строку и возвращаем её в поле ввода (7).&lt;br /&gt;
&lt;br /&gt;
Если Вы всё проделами правильно, то теперь можете вводить имя сохраняемого файла в английской, русской или смешанной кодировке, а также корректировать вводимый текст без искажения его синтаксиса.&lt;br /&gt;
&lt;br /&gt;
Послесловие:&lt;br /&gt;
Этот алгоритм имеет отличие от стандартной обработки строки редактирования, которое выражается в том, что при вставке символа в середину строки, позиции ввода следующего символа всегда устанавливается в её конец, тогда как в “штатной” – текущей становится следующая позиция. В этой ситуации есть свой плюс и свой минус, однако в любом случае, как побороть это, я просто не знаю.&lt;/div&gt;</summary>
		<author><name>Serge!</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%A3%D1%87%D0%B8%D0%BC_S.T.A.L.K.E.R._%D0%A2%D0%A7_%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%BE%D0%BC%D1%83_%D1%8F%D0%B7%D1%8B%D0%BA%D1%83</id>
		<title>Учим S.T.A.L.K.E.R. ТЧ русскому языку</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A3%D1%87%D0%B8%D0%BC_S.T.A.L.K.E.R._%D0%A2%D0%A7_%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%BE%D0%BC%D1%83_%D1%8F%D0%B7%D1%8B%D0%BA%D1%83"/>
				<updated>2015-10-21T00:14:19Z</updated>
		
		<summary type="html">&lt;p&gt;Serge!: Serge! переименовал страницу Учим S.T.A.L.K.E.R ТЧ русскому языку в Учим S.T.A.L.K.E.R. ТЧ русскому языку&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;За много лет игры все уже почти привыкли, что сохранить текущее состояние в процессе игры мы можем только в файле с английской транскрипцией. Мне это не очень нравится и поэтому предлагаю способ научить ТЧ сохранить файлы с именами на русском или (это уже самостоятельно) на любом другом языке.&lt;br /&gt;
Это не сложно и справиться может каждый, кто знает, что такое есть текстовый редактор.&lt;br /&gt;
Для решения нашей задачи нам понадобятся файлы: ui_save_dialog.script и ui_mm_save_dlg.xml и ещё один, который мы создадим сами, с именем ui_save_dlg_rus.script. Первый и третий должны находиться в папке gamedata\scripts\, а второй в gamedata\config\ui\. Если их там нет или вообще нет папки gamedata, то значит Вам придётся извлечь их (1 и 2) из архивов дистрибутива (файлы gamedata/dbX) или отказаться от затеи русификации. Как распаковать архивы дистрибутива я не буду, т.к. про это не рассказали только самые ленивые, поэтому считаем, что эти файлы Вам доступны.&lt;br /&gt;
&lt;br /&gt;
Начинаем.&lt;br /&gt;
Сначала проделаем маленькую, но необходимую работу. Нам надо в окне диалога сохранения определить индикатор текущего языка ввода. Для этого открываем файл ui_mm_save_dlg.xml и в конец тега form добавим строчки, чтобы получилось так:&lt;br /&gt;
		&amp;lt;st_lang x=&amp;quot;280&amp;quot; y=&amp;quot;400&amp;quot; width=&amp;quot;30&amp;quot; height=&amp;quot;20&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;text font=&amp;quot;graffiti22&amp;quot; align=&amp;quot;c&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;text_color&amp;gt; &amp;lt;e r=&amp;quot;227&amp;quot; g=&amp;quot;199&amp;quot; b=&amp;quot;178&amp;quot;/&amp;gt; &amp;lt;h r=&amp;quot;255&amp;quot; g=&amp;quot;0&amp;quot; b=&amp;quot;0&amp;quot;/&amp;gt; &amp;lt;/text_color&amp;gt;&lt;br /&gt;
		&amp;lt;/st_lang&amp;gt;&lt;br /&gt;
	&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Закрываем файл. Он нам больше не понадобится.&lt;br /&gt;
Теперь создадим таблицу перекодировки английских символов в кириллицу, которую запишем в наш 3-й файл ui_save_dlg_rus.script.&lt;br /&gt;
Выглядит эта таблица так:&lt;br /&gt;
local tbl_ansii = {&lt;br /&gt;
	[ 039 ] = 253, -- ' --&amp;gt; э&lt;br /&gt;
	[ 044 ] = 225, -- , --&amp;gt; б&lt;br /&gt;
	[ 046 ] = 254, -- . --&amp;gt; ю&lt;br /&gt;
	[ 047 ] = 046, -- / --&amp;gt; .&lt;br /&gt;
	[ 058 ] = 198, -- : --&amp;gt; Ж&lt;br /&gt;
	[ 059 ] = 230, -- ; --&amp;gt; ж&lt;br /&gt;
	[ 060 ] = 193, -- &amp;lt; --&amp;gt; Б&lt;br /&gt;
	[ 062 ] = 222, -- &amp;gt; --&amp;gt; Ю&lt;br /&gt;
	[ 065 ] = 212, -- A --&amp;gt; Ф&lt;br /&gt;
	[ 066 ] = 200, -- B --&amp;gt; И&lt;br /&gt;
	[ 067 ] = 209, -- C --&amp;gt; С&lt;br /&gt;
	[ 068 ] = 194, -- D --&amp;gt; В&lt;br /&gt;
	[ 069 ] = 211, -- E --&amp;gt; У&lt;br /&gt;
	[ 070 ] = 192, -- F --&amp;gt; А&lt;br /&gt;
	[ 071 ] = 207, -- G --&amp;gt; П&lt;br /&gt;
	[ 072 ] = 208, -- H --&amp;gt; Р&lt;br /&gt;
	[ 073 ] = 216, -- I --&amp;gt; Ш&lt;br /&gt;
	[ 074 ] = 206, -- J --&amp;gt; О&lt;br /&gt;
	[ 075 ] = 203, -- K --&amp;gt; Л&lt;br /&gt;
	[ 076 ] = 196, -- L --&amp;gt; Д&lt;br /&gt;
	[ 077 ] = 220, -- M --&amp;gt; Ь&lt;br /&gt;
	[ 078 ] = 210, -- N --&amp;gt; Т&lt;br /&gt;
	[ 079 ] = 217, -- O --&amp;gt; Щ&lt;br /&gt;
	[ 080 ] = 199, -- P --&amp;gt; З&lt;br /&gt;
	[ 081 ] = 201, -- Q --&amp;gt; Й&lt;br /&gt;
	[ 082 ] = 202, -- R --&amp;gt; К&lt;br /&gt;
	[ 083 ] = 219, -- S --&amp;gt; Ы&lt;br /&gt;
	[ 084 ] = 197, -- T --&amp;gt; Е&lt;br /&gt;
	[ 085 ] = 195, -- U --&amp;gt; Г&lt;br /&gt;
	[ 086 ] = 204, -- V --&amp;gt; М&lt;br /&gt;
	[ 087 ] = 214, -- W --&amp;gt; Ц&lt;br /&gt;
	[ 088 ] = 215, -- X --&amp;gt; Ч&lt;br /&gt;
	[ 089 ] = 205, -- Y --&amp;gt; Н&lt;br /&gt;
	[ 090 ] = 223, -- Z --&amp;gt; Я&lt;br /&gt;
	[ 091 ] = 245, -- [ --&amp;gt; х&lt;br /&gt;
	[ 093 ] = 250, -- ] --&amp;gt; ъ&lt;br /&gt;
	[ 097 ] = 244, -- a --&amp;gt; ф&lt;br /&gt;
	[ 098 ] = 232, -- b --&amp;gt; и&lt;br /&gt;
	[ 099 ] = 241, -- c --&amp;gt; с&lt;br /&gt;
	[ 100 ] = 226, -- d --&amp;gt; в&lt;br /&gt;
	[ 101 ] = 243, -- e --&amp;gt; у&lt;br /&gt;
	[ 102 ] = 224, -- f --&amp;gt; а&lt;br /&gt;
	[ 103 ] = 239, -- g --&amp;gt; п&lt;br /&gt;
	[ 104 ] = 240, -- h --&amp;gt; р&lt;br /&gt;
	[ 105 ] = 248, -- i --&amp;gt; ш&lt;br /&gt;
	[ 106 ] = 238, -- j --&amp;gt; о&lt;br /&gt;
	[ 107 ] = 235, -- k --&amp;gt; л&lt;br /&gt;
	[ 108 ] = 228, -- l --&amp;gt; д&lt;br /&gt;
	[ 109 ] = 252, -- m --&amp;gt; ь&lt;br /&gt;
	[ 110 ] = 242, -- n --&amp;gt; т&lt;br /&gt;
	[ 111 ] = 249, -- o --&amp;gt; щ&lt;br /&gt;
	[ 112 ] = 231, -- p --&amp;gt; з&lt;br /&gt;
	[ 113 ] = 233, -- q --&amp;gt; й&lt;br /&gt;
	[ 114 ] = 234, -- r --&amp;gt; к&lt;br /&gt;
	[ 115 ] = 251, -- s --&amp;gt; ы&lt;br /&gt;
	[ 116 ] = 229, -- t --&amp;gt; е&lt;br /&gt;
	[ 117 ] = 227, -- u --&amp;gt; г&lt;br /&gt;
	[ 118 ] = 236, -- v --&amp;gt; м&lt;br /&gt;
	[ 119 ] = 246, -- w --&amp;gt; ц&lt;br /&gt;
	[ 120 ] = 247, -- x --&amp;gt; ч&lt;br /&gt;
	[ 121 ] = 237, -- y --&amp;gt; н&lt;br /&gt;
	[ 122 ] = 255, -- z --&amp;gt; я&lt;br /&gt;
	[ 123 ] = 213, -- { --&amp;gt; Х&lt;br /&gt;
	[ 125 ] = 218, -- } --&amp;gt; Ъ&lt;br /&gt;
}&lt;br /&gt;
Открываем в редакторе файл ui_save_dialog.script.&lt;br /&gt;
1. Вверху, сразу под комментариями описания скрипта, определяем несколько переменных: &lt;br /&gt;
&lt;br /&gt;
local t_lang,  edb_Pos, edb_Str = ui_save_dlg_rus.tbl_ansii, 1, {}&lt;br /&gt;
&lt;br /&gt;
где: t_lang – таблица перекодировки, edb_Pos – позиция курсора в поле EditBox (инициируется 1) и edb_Str – массив, в котором мы будем сохранять символы вводимого текста.&lt;br /&gt;
&lt;br /&gt;
2. Создадим индикатор текущего языка ввода текста.&lt;br /&gt;
Договоримся, что переключать раскладку будем щелчком левой кнопки мыши по индикатору или клавишей левый-Ctrl (причем она будет работать как триггер), а переключать режим временного изменения языка ввода будем при нажатой и удерживаемой клавише левый-Alt.&lt;br /&gt;
Для этого в методе save_dialog:InitControls() в самом конце вставим:&lt;br /&gt;
self.ind_lan = xml:Init3tButton(&amp;quot;form:st_lang&amp;quot;, self.form)&lt;br /&gt;
self:Register(self.ind_lan, &amp;quot;button_lang&amp;quot;)&lt;br /&gt;
self.ind_lan:SetText(&amp;quot;Рус&amp;quot;)&lt;br /&gt;
self.mode_lang = true&lt;br /&gt;
&lt;br /&gt;
где: self.mode_lang - флаг текущего языка ввода (true - русский, false - английский)&lt;br /&gt;
Всё, переключатель языка ввода мы создали, теперь надо обеспечить его функционирование.&lt;br /&gt;
Для этого в функцию InitCallBacks() вставим строку&lt;br /&gt;
&lt;br /&gt;
	self:AddCallback(&amp;quot;button_lang&amp;quot;, ui_events.BUTTON_CLICKED, self.OnChg_lan, self)&lt;br /&gt;
&lt;br /&gt;
а этим под блоком вставляем функцию:&lt;br /&gt;
&lt;br /&gt;
function save_dialog:OnChg_lan()&lt;br /&gt;
	self.mode_lang = not self.mode_lang&lt;br /&gt;
	if self.mode_lang then self.ind_lang:SetText(&amp;quot;Рус&amp;quot;)&lt;br /&gt;
	else self.ind_lang:SetText(&amp;quot;Eng&amp;quot;) end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Здесь всё ясно - сначала инвертируем флаг текущего языка ввода и потом меняем текст индикатора.&lt;br /&gt;
&lt;br /&gt;
Отлавливать факт переключения языка ввода и сам ввод в поле имени файла будем в системном прерывании save_dialog:OnKeyboard(dik, keyboard_action). Для этого добавим туда свои строки, чтобы в итоге получилось так:&lt;br /&gt;
function save_dialog:OnKeyboard(dik, keyboard_action)  --virtual function&lt;br /&gt;
    ui_base_dialog.base_dialog.OnKeyboard(self,dik,keyboard_action)&lt;br /&gt;
    DIK_RETURN = 28&lt;br /&gt;
    WINDOW_KEY_PRESSED = 6&lt;br /&gt;
    if dik == DIK_RETURN and keyboard_action == WINDOW_KEY_PRESSED then &lt;br /&gt;
        self:OnButton_ok_clicked()&lt;br /&gt;
        self.owner:Show(true)&lt;br /&gt;
        elseif keyboard_action == ui_events.WINDOW_KEY_PRESSED then&lt;br /&gt;
        if dik == DIK_keys.DIK_LCONTROL or dik == DIK_keys.DIK_LMENU then&lt;br /&gt;
            self:OnChg_lan()&lt;br /&gt;
        elseif dik == DIK_keys.DIK_LEFT then&lt;br /&gt;
            if edb_Pos &amp;gt; 1 then edb_Pos = edb_Pos - 1 end&lt;br /&gt;
        elseif dik == DIK_keys.DIK_RIGHT then&lt;br /&gt;
            if edb_Pos &amp;lt;= #edb_Str then edb_Pos = edb_Pos + 1 end&lt;br /&gt;
        elseif dik == DIK_keys.DIK_DELETE then&lt;br /&gt;
            if edb_Pos &amp;lt;= #edb_Str then table.remove(edb_Str,edb_Pos) end&lt;br /&gt;
        elseif dik == DIK_keys.DIK_BACK then&lt;br /&gt;
            if edb_Pos &amp;gt; 1 then edb_Pos = edb_Pos-1 end&lt;br /&gt;
            table.remove(edb_Str,edb_Pos)&lt;br /&gt;
        elseif     (dik &amp;gt;= 2  and dik &amp;lt;= 13) or &lt;br /&gt;
                        (dik &amp;gt;= 16 and dik &amp;lt;= 27) or &lt;br /&gt;
                        (dik &amp;gt;= 30 and dik &amp;lt;= 40) or&lt;br /&gt;
                        (dik &amp;gt;= 44 and dik &amp;lt;= 53) or&lt;br /&gt;
                        dik == 57 or &lt;br /&gt;
                        (dik &amp;gt;= 71 and dik &amp;lt;= 83) then self:OnEdit_CHANGED()&lt;br /&gt;
        end&lt;br /&gt;
    elseif keyboard_action == ui_events.WINDOW_KEY_RELEASED then&lt;br /&gt;
        if dik == DIK_keys.DIK_LMENU then&lt;br /&gt;
                self:OnChg_lan()&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Здесь всё достаточно просто. При переключении языка вызывается метод self:OnChg_lan(). При перемещении стрелками проверяем новое положение курсора и, если оно в пределах строки, то запоминаем его позицию. При удалении символа из строки удаляем соответствующий элемент из массива копии строки и опять же запоминаем текущую позицию ввода. При вводе текста  отлавливаются прерывания от всех клавиш с печатными символами и, если такое обнаружено, то вызывается функция обработчик, т.е. OnEdit_CHANGED(). Обратите внимание, что мы даже не пытаемся отловить ввод буквы ‘ё’, т.к. на этой же клавише размещена тильда ‘~’, которую движок «сталкера» обрабатывает специальным образом для вывода окна консоли.&lt;br /&gt;
И так, если мы зафиксировали факт нажатия клавиши с печатным символом, то вызывается функция OnEdit_CHANGED, но её пока нет. Вот ею и займёмся.&lt;br /&gt;
&lt;br /&gt;
Сразу под созданной нами ранее save_dialog:OnChg_lan() вставим ещё одну функцию:&lt;br /&gt;
&lt;br /&gt;
function save_dialog:OnEdit_CHANGED()&lt;br /&gt;
    local str_edit = self:GetEditBox(&amp;quot;edit_filename&amp;quot;)&lt;br /&gt;
    local sim = str_edit:GetText():match ('.',edb_Pos)&lt;br /&gt;
    local cls = self.mode_lang and t_lang[sim:byte()]&lt;br /&gt;
    sim = cls and string.char(cls) or sim&lt;br /&gt;
    table.insert(edb_Str,edb_Pos,sim)&lt;br /&gt;
    edb_Pos = #edb_Str + 1&lt;br /&gt;
    str_edit:SetText(table.concat(edb_Str))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Здесь тоже нет особых сложностей, но, тем не менее, прокомментируем наши действия.&lt;br /&gt;
Подключаемся к контролу EditBox (1) и получаем символ, находящийся в текущей позиции ввода (2). Если включен режим кириллицы, то ищем код переданного движком символа (он всегда английский) в таблице перекодировки и при его наличии получаем соответствующий код русского символа (3). Если код найден, то подменяем английский символ русским, а если нет, то оставляем всё как есть (4). Заносим полученный символ в массив копии строки ввода в соответствии со значение текущей позиции курсора (5). Устанавливаем новую текущую позиции ввода (6), преобразуем массив символов в строку и возвращаем её в поле ввода (7).&lt;br /&gt;
&lt;br /&gt;
Если Вы всё проделами правильно, то теперь можете вводить имя сохраняемого файла в английской, русской или смешанной кодировке, а также корректировать вводимый текст без искажения его синтаксиса.&lt;br /&gt;
&lt;br /&gt;
Послесловие:&lt;br /&gt;
Этот алгоритм имеет отличие от стандартной обработки строки редактирования, которое выражается в том, что при вставке символа в середину строки, позиции ввода следующего символа всегда устанавливается в её конец, тогда как в “штатной” – текущей становится следующая позиция. В этой ситуации есть свой плюс и свой минус, однако в любом случае, как побороть это, я просто не знаю.&lt;/div&gt;</summary>
		<author><name>Serge!</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%A3%D1%87%D0%B8%D0%BC_S.T.A.L.K.E.R_%D0%A2%D0%A7_%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%BE%D0%BC%D1%83_%D1%8F%D0%B7%D1%8B%D0%BA%D1%83</id>
		<title>Учим S.T.A.L.K.E.R ТЧ русскому языку</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A3%D1%87%D0%B8%D0%BC_S.T.A.L.K.E.R_%D0%A2%D0%A7_%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%BE%D0%BC%D1%83_%D1%8F%D0%B7%D1%8B%D0%BA%D1%83"/>
				<updated>2015-10-21T00:14:19Z</updated>
		
		<summary type="html">&lt;p&gt;Serge!: Serge! переименовал страницу Учим S.T.A.L.K.E.R ТЧ русскому языку в Учим S.T.A.L.K.E.R. ТЧ русскому языку&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#перенаправление [[Учим S.T.A.L.K.E.R. ТЧ русскому языку]]&lt;/div&gt;</summary>
		<author><name>Serge!</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%A3%D1%87%D0%B8%D0%BC_S.T.A.L.K.E.R._%D0%A2%D0%A7_%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%BE%D0%BC%D1%83_%D1%8F%D0%B7%D1%8B%D0%BA%D1%83</id>
		<title>Учим S.T.A.L.K.E.R. ТЧ русскому языку</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A3%D1%87%D0%B8%D0%BC_S.T.A.L.K.E.R._%D0%A2%D0%A7_%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%BE%D0%BC%D1%83_%D1%8F%D0%B7%D1%8B%D0%BA%D1%83"/>
				<updated>2015-10-21T00:00:50Z</updated>
		
		<summary type="html">&lt;p&gt;Serge!: Новая страница: «За много лет игры все уже почти привыкли, что сохранить текущее состояние в процессе игр…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;За много лет игры все уже почти привыкли, что сохранить текущее состояние в процессе игры мы можем только в файле с английской транскрипцией. Мне это не очень нравится и поэтому предлагаю способ научить ТЧ сохранить файлы с именами на русском или (это уже самостоятельно) на любом другом языке.&lt;br /&gt;
Это не сложно и справиться может каждый, кто знает, что такое есть текстовый редактор.&lt;br /&gt;
Для решения нашей задачи нам понадобятся файлы: ui_save_dialog.script и ui_mm_save_dlg.xml и ещё один, который мы создадим сами, с именем ui_save_dlg_rus.script. Первый и третий должны находиться в папке gamedata\scripts\, а второй в gamedata\config\ui\. Если их там нет или вообще нет папки gamedata, то значит Вам придётся извлечь их (1 и 2) из архивов дистрибутива (файлы gamedata/dbX) или отказаться от затеи русификации. Как распаковать архивы дистрибутива я не буду, т.к. про это не рассказали только самые ленивые, поэтому считаем, что эти файлы Вам доступны.&lt;br /&gt;
&lt;br /&gt;
Начинаем.&lt;br /&gt;
Сначала проделаем маленькую, но необходимую работу. Нам надо в окне диалога сохранения определить индикатор текущего языка ввода. Для этого открываем файл ui_mm_save_dlg.xml и в конец тега form добавим строчки, чтобы получилось так:&lt;br /&gt;
		&amp;lt;st_lang x=&amp;quot;280&amp;quot; y=&amp;quot;400&amp;quot; width=&amp;quot;30&amp;quot; height=&amp;quot;20&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;text font=&amp;quot;graffiti22&amp;quot; align=&amp;quot;c&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;text_color&amp;gt; &amp;lt;e r=&amp;quot;227&amp;quot; g=&amp;quot;199&amp;quot; b=&amp;quot;178&amp;quot;/&amp;gt; &amp;lt;h r=&amp;quot;255&amp;quot; g=&amp;quot;0&amp;quot; b=&amp;quot;0&amp;quot;/&amp;gt; &amp;lt;/text_color&amp;gt;&lt;br /&gt;
		&amp;lt;/st_lang&amp;gt;&lt;br /&gt;
	&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Закрываем файл. Он нам больше не понадобится.&lt;br /&gt;
Теперь создадим таблицу перекодировки английских символов в кириллицу, которую запишем в наш 3-й файл ui_save_dlg_rus.script.&lt;br /&gt;
Выглядит эта таблица так:&lt;br /&gt;
local tbl_ansii = {&lt;br /&gt;
	[ 039 ] = 253, -- ' --&amp;gt; э&lt;br /&gt;
	[ 044 ] = 225, -- , --&amp;gt; б&lt;br /&gt;
	[ 046 ] = 254, -- . --&amp;gt; ю&lt;br /&gt;
	[ 047 ] = 046, -- / --&amp;gt; .&lt;br /&gt;
	[ 058 ] = 198, -- : --&amp;gt; Ж&lt;br /&gt;
	[ 059 ] = 230, -- ; --&amp;gt; ж&lt;br /&gt;
	[ 060 ] = 193, -- &amp;lt; --&amp;gt; Б&lt;br /&gt;
	[ 062 ] = 222, -- &amp;gt; --&amp;gt; Ю&lt;br /&gt;
	[ 065 ] = 212, -- A --&amp;gt; Ф&lt;br /&gt;
	[ 066 ] = 200, -- B --&amp;gt; И&lt;br /&gt;
	[ 067 ] = 209, -- C --&amp;gt; С&lt;br /&gt;
	[ 068 ] = 194, -- D --&amp;gt; В&lt;br /&gt;
	[ 069 ] = 211, -- E --&amp;gt; У&lt;br /&gt;
	[ 070 ] = 192, -- F --&amp;gt; А&lt;br /&gt;
	[ 071 ] = 207, -- G --&amp;gt; П&lt;br /&gt;
	[ 072 ] = 208, -- H --&amp;gt; Р&lt;br /&gt;
	[ 073 ] = 216, -- I --&amp;gt; Ш&lt;br /&gt;
	[ 074 ] = 206, -- J --&amp;gt; О&lt;br /&gt;
	[ 075 ] = 203, -- K --&amp;gt; Л&lt;br /&gt;
	[ 076 ] = 196, -- L --&amp;gt; Д&lt;br /&gt;
	[ 077 ] = 220, -- M --&amp;gt; Ь&lt;br /&gt;
	[ 078 ] = 210, -- N --&amp;gt; Т&lt;br /&gt;
	[ 079 ] = 217, -- O --&amp;gt; Щ&lt;br /&gt;
	[ 080 ] = 199, -- P --&amp;gt; З&lt;br /&gt;
	[ 081 ] = 201, -- Q --&amp;gt; Й&lt;br /&gt;
	[ 082 ] = 202, -- R --&amp;gt; К&lt;br /&gt;
	[ 083 ] = 219, -- S --&amp;gt; Ы&lt;br /&gt;
	[ 084 ] = 197, -- T --&amp;gt; Е&lt;br /&gt;
	[ 085 ] = 195, -- U --&amp;gt; Г&lt;br /&gt;
	[ 086 ] = 204, -- V --&amp;gt; М&lt;br /&gt;
	[ 087 ] = 214, -- W --&amp;gt; Ц&lt;br /&gt;
	[ 088 ] = 215, -- X --&amp;gt; Ч&lt;br /&gt;
	[ 089 ] = 205, -- Y --&amp;gt; Н&lt;br /&gt;
	[ 090 ] = 223, -- Z --&amp;gt; Я&lt;br /&gt;
	[ 091 ] = 245, -- [ --&amp;gt; х&lt;br /&gt;
	[ 093 ] = 250, -- ] --&amp;gt; ъ&lt;br /&gt;
	[ 097 ] = 244, -- a --&amp;gt; ф&lt;br /&gt;
	[ 098 ] = 232, -- b --&amp;gt; и&lt;br /&gt;
	[ 099 ] = 241, -- c --&amp;gt; с&lt;br /&gt;
	[ 100 ] = 226, -- d --&amp;gt; в&lt;br /&gt;
	[ 101 ] = 243, -- e --&amp;gt; у&lt;br /&gt;
	[ 102 ] = 224, -- f --&amp;gt; а&lt;br /&gt;
	[ 103 ] = 239, -- g --&amp;gt; п&lt;br /&gt;
	[ 104 ] = 240, -- h --&amp;gt; р&lt;br /&gt;
	[ 105 ] = 248, -- i --&amp;gt; ш&lt;br /&gt;
	[ 106 ] = 238, -- j --&amp;gt; о&lt;br /&gt;
	[ 107 ] = 235, -- k --&amp;gt; л&lt;br /&gt;
	[ 108 ] = 228, -- l --&amp;gt; д&lt;br /&gt;
	[ 109 ] = 252, -- m --&amp;gt; ь&lt;br /&gt;
	[ 110 ] = 242, -- n --&amp;gt; т&lt;br /&gt;
	[ 111 ] = 249, -- o --&amp;gt; щ&lt;br /&gt;
	[ 112 ] = 231, -- p --&amp;gt; з&lt;br /&gt;
	[ 113 ] = 233, -- q --&amp;gt; й&lt;br /&gt;
	[ 114 ] = 234, -- r --&amp;gt; к&lt;br /&gt;
	[ 115 ] = 251, -- s --&amp;gt; ы&lt;br /&gt;
	[ 116 ] = 229, -- t --&amp;gt; е&lt;br /&gt;
	[ 117 ] = 227, -- u --&amp;gt; г&lt;br /&gt;
	[ 118 ] = 236, -- v --&amp;gt; м&lt;br /&gt;
	[ 119 ] = 246, -- w --&amp;gt; ц&lt;br /&gt;
	[ 120 ] = 247, -- x --&amp;gt; ч&lt;br /&gt;
	[ 121 ] = 237, -- y --&amp;gt; н&lt;br /&gt;
	[ 122 ] = 255, -- z --&amp;gt; я&lt;br /&gt;
	[ 123 ] = 213, -- { --&amp;gt; Х&lt;br /&gt;
	[ 125 ] = 218, -- } --&amp;gt; Ъ&lt;br /&gt;
}&lt;br /&gt;
Открываем в редакторе файл ui_save_dialog.script.&lt;br /&gt;
1. Вверху, сразу под комментариями описания скрипта, определяем несколько переменных: &lt;br /&gt;
&lt;br /&gt;
local t_lang,  edb_Pos, edb_Str = ui_save_dlg_rus.tbl_ansii, 1, {}&lt;br /&gt;
&lt;br /&gt;
где: t_lang – таблица перекодировки, edb_Pos – позиция курсора в поле EditBox (инициируется 1) и edb_Str – массив, в котором мы будем сохранять символы вводимого текста.&lt;br /&gt;
&lt;br /&gt;
2. Создадим индикатор текущего языка ввода текста.&lt;br /&gt;
Договоримся, что переключать раскладку будем щелчком левой кнопки мыши по индикатору или клавишей левый-Ctrl (причем она будет работать как триггер), а переключать режим временного изменения языка ввода будем при нажатой и удерживаемой клавише левый-Alt.&lt;br /&gt;
Для этого в методе save_dialog:InitControls() в самом конце вставим:&lt;br /&gt;
self.ind_lan = xml:Init3tButton(&amp;quot;form:st_lang&amp;quot;, self.form)&lt;br /&gt;
self:Register(self.ind_lan, &amp;quot;button_lang&amp;quot;)&lt;br /&gt;
self.ind_lan:SetText(&amp;quot;Рус&amp;quot;)&lt;br /&gt;
self.mode_lang = true&lt;br /&gt;
&lt;br /&gt;
где: self.mode_lang - флаг текущего языка ввода (true - русский, false - английский)&lt;br /&gt;
Всё, переключатель языка ввода мы создали, теперь надо обеспечить его функционирование.&lt;br /&gt;
Для этого в функцию InitCallBacks() вставим строку&lt;br /&gt;
&lt;br /&gt;
	self:AddCallback(&amp;quot;button_lang&amp;quot;, ui_events.BUTTON_CLICKED, self.OnChg_lan, self)&lt;br /&gt;
&lt;br /&gt;
а этим под блоком вставляем функцию:&lt;br /&gt;
&lt;br /&gt;
function save_dialog:OnChg_lan()&lt;br /&gt;
	self.mode_lang = not self.mode_lang&lt;br /&gt;
	if self.mode_lang then self.ind_lang:SetText(&amp;quot;Рус&amp;quot;)&lt;br /&gt;
	else self.ind_lang:SetText(&amp;quot;Eng&amp;quot;) end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Здесь всё ясно - сначала инвертируем флаг текущего языка ввода и потом меняем текст индикатора.&lt;br /&gt;
&lt;br /&gt;
Отлавливать факт переключения языка ввода и сам ввод в поле имени файла будем в системном прерывании save_dialog:OnKeyboard(dik, keyboard_action). Для этого добавим туда свои строки, чтобы в итоге получилось так:&lt;br /&gt;
function save_dialog:OnKeyboard(dik, keyboard_action)  --virtual function&lt;br /&gt;
    ui_base_dialog.base_dialog.OnKeyboard(self,dik,keyboard_action)&lt;br /&gt;
    DIK_RETURN = 28&lt;br /&gt;
    WINDOW_KEY_PRESSED = 6&lt;br /&gt;
    if dik == DIK_RETURN and keyboard_action == WINDOW_KEY_PRESSED then &lt;br /&gt;
        self:OnButton_ok_clicked()&lt;br /&gt;
        self.owner:Show(true)&lt;br /&gt;
        elseif keyboard_action == ui_events.WINDOW_KEY_PRESSED then&lt;br /&gt;
        if dik == DIK_keys.DIK_LCONTROL or dik == DIK_keys.DIK_LMENU then&lt;br /&gt;
            self:OnChg_lan()&lt;br /&gt;
        elseif dik == DIK_keys.DIK_LEFT then&lt;br /&gt;
            if edb_Pos &amp;gt; 1 then edb_Pos = edb_Pos - 1 end&lt;br /&gt;
        elseif dik == DIK_keys.DIK_RIGHT then&lt;br /&gt;
            if edb_Pos &amp;lt;= #edb_Str then edb_Pos = edb_Pos + 1 end&lt;br /&gt;
        elseif dik == DIK_keys.DIK_DELETE then&lt;br /&gt;
            if edb_Pos &amp;lt;= #edb_Str then table.remove(edb_Str,edb_Pos) end&lt;br /&gt;
        elseif dik == DIK_keys.DIK_BACK then&lt;br /&gt;
            if edb_Pos &amp;gt; 1 then edb_Pos = edb_Pos-1 end&lt;br /&gt;
            table.remove(edb_Str,edb_Pos)&lt;br /&gt;
        elseif     (dik &amp;gt;= 2  and dik &amp;lt;= 13) or &lt;br /&gt;
                        (dik &amp;gt;= 16 and dik &amp;lt;= 27) or &lt;br /&gt;
                        (dik &amp;gt;= 30 and dik &amp;lt;= 40) or&lt;br /&gt;
                        (dik &amp;gt;= 44 and dik &amp;lt;= 53) or&lt;br /&gt;
                        dik == 57 or &lt;br /&gt;
                        (dik &amp;gt;= 71 and dik &amp;lt;= 83) then self:OnEdit_CHANGED()&lt;br /&gt;
        end&lt;br /&gt;
    elseif keyboard_action == ui_events.WINDOW_KEY_RELEASED then&lt;br /&gt;
        if dik == DIK_keys.DIK_LMENU then&lt;br /&gt;
                self:OnChg_lan()&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Здесь всё достаточно просто. При переключении языка вызывается метод self:OnChg_lan(). При перемещении стрелками проверяем новое положение курсора и, если оно в пределах строки, то запоминаем его позицию. При удалении символа из строки удаляем соответствующий элемент из массива копии строки и опять же запоминаем текущую позицию ввода. При вводе текста  отлавливаются прерывания от всех клавиш с печатными символами и, если такое обнаружено, то вызывается функция обработчик, т.е. OnEdit_CHANGED(). Обратите внимание, что мы даже не пытаемся отловить ввод буквы ‘ё’, т.к. на этой же клавише размещена тильда ‘~’, которую движок «сталкера» обрабатывает специальным образом для вывода окна консоли.&lt;br /&gt;
И так, если мы зафиксировали факт нажатия клавиши с печатным символом, то вызывается функция OnEdit_CHANGED, но её пока нет. Вот ею и займёмся.&lt;br /&gt;
&lt;br /&gt;
Сразу под созданной нами ранее save_dialog:OnChg_lan() вставим ещё одну функцию:&lt;br /&gt;
&lt;br /&gt;
function save_dialog:OnEdit_CHANGED()&lt;br /&gt;
    local str_edit = self:GetEditBox(&amp;quot;edit_filename&amp;quot;)&lt;br /&gt;
    local sim = str_edit:GetText():match ('.',edb_Pos)&lt;br /&gt;
    local cls = self.mode_lang and t_lang[sim:byte()]&lt;br /&gt;
    sim = cls and string.char(cls) or sim&lt;br /&gt;
    table.insert(edb_Str,edb_Pos,sim)&lt;br /&gt;
    edb_Pos = #edb_Str + 1&lt;br /&gt;
    str_edit:SetText(table.concat(edb_Str))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Здесь тоже нет особых сложностей, но, тем не менее, прокомментируем наши действия.&lt;br /&gt;
Подключаемся к контролу EditBox (1) и получаем символ, находящийся в текущей позиции ввода (2). Если включен режим кириллицы, то ищем код переданного движком символа (он всегда английский) в таблице перекодировки и при его наличии получаем соответствующий код русского символа (3). Если код найден, то подменяем английский символ русским, а если нет, то оставляем всё как есть (4). Заносим полученный символ в массив копии строки ввода в соответствии со значение текущей позиции курсора (5). Устанавливаем новую текущую позиции ввода (6), преобразуем массив символов в строку и возвращаем её в поле ввода (7).&lt;br /&gt;
&lt;br /&gt;
Если Вы всё проделами правильно, то теперь можете вводить имя сохраняемого файла в английской, русской или смешанной кодировке, а также корректировать вводимый текст без искажения его синтаксиса.&lt;br /&gt;
&lt;br /&gt;
Послесловие:&lt;br /&gt;
Этот алгоритм имеет отличие от стандартной обработки строки редактирования, которое выражается в том, что при вставке символа в середину строки, позиции ввода следующего символа всегда устанавливается в её конец, тогда как в “штатной” – текущей становится следующая позиция. В этой ситуации есть свой плюс и свой минус, однако в любом случае, как побороть это, я просто не знаю.&lt;/div&gt;</summary>
		<author><name>Serge!</name></author>	</entry>

	</feed>