Что нового

UDF - добавление поддержки мультиязычности

kzru_hunter

Осваивающий
Сообщения
144
Репутация
49
AutoIt: 3.3.6.0
Версия: 1.0 исправленная

Категория: Разное

Описание: UDF для добавления в ваш скрипт поддержки мультиязычности.

Описание функций в UDF:
1) _SetLanguage($LangFile)
Считывает выбранный lang-файл (указывать файл без расширения) в память, как бы устанавливая его текущим для последующего использования функции _GetLangText.
2) _GetLangText($Key)
Получает текст ключа текущего lang-файла
3) _GetLanguages($mode = 1)
Получает все доступные языки из папки Langs.
При этом есть 2 вида возвращаемых значений:
Первое: возвращает массив с названиями языков, при этом в нулевом индексе будет хранится кол-во языков (пример, array[0] = 2, array[1] = "english", array[2] = "russian").
Второе: возвращает языки в виде строки, разделенных между собой специальным разделителем (по умолчанию символ |), например, "english|russian"

Все lang-файлы при этом должны находится в папке Langs и иметь следующий вид (слева - ключ, справа - текст ключа):
[Translation]
MAIN_TITLE = Main Title
BUTTON_TEXT = Button Text
LABEL_TEXT = Label Text

Достоинства UDF:
1. В коде, а также в UDF не нужно добавлять никаких переменных. Просто используются те функции, которые описаны выше (пример работы функций приведен ниже с комментариями).
2. Ассоциативность при работе с ключами.
3. Функции максимально оптимизированы.

Вообщем, смотрите пример.
Код/Пример:
Код:
#include <ComboConstants.au3>
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include "LangUDF.au3"

Opt("GUIOnEventMode", 1)

; ------------------------ СОЗДАНИЕ ФОРМЫ ---------------------------
$Form1 = GUICreate("Title", 324, 210, -1, -1)
$Button1 = GUICtrlCreateButton("", 12, 16, 123, 25)
$Label1 = GUICtrlCreateLabel("", 16, 48, 100, 17)
$Combo1 = GUICtrlCreateCombo("", 180, 168, 109, 25, BitOR($CBS_DROPDOWNLIST,$CBS_AUTOHSCROLL))
$Label2 = GUICtrlCreateLabel("", 180, 148, 119, 17)
GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
; -----------------------------------------------------------------

; -- Устанавливаем вызовы функций при наступлении событий --
GuiSetOnEvent($GUI_EVENT_CLOSE,"_Exit")
GuiCtrlSetOnEvent($Combo1,"_ChangeLanguage")
; ----------------------------------------------------------


$Languages = _GetLanguages(2) ; получаем строку, состоящую из языков, разделенных между собой "|"
GUICtrlSetData($Combo1,$Languages,"Russian") ; заносим языки в Combo


; --------- Устанавливаем выбранный lang-файл текущим ---------
_SetLanguage("Russian") ; russian
;_SetLanguage("English")
If @error Then
	MsgBox(16,"Error","Error opening of lang-file")
	Exit
EndIf
; -------------------------------------------------------------

; ------ Устанавливаем значения элементам из текущего lang-файла -------
WinSetTitle($Form1,"",_GetLangText("MAIN_TITLE"))
GuiCtrlSetData($Button1,_GetLangText("BUTTON_TEXT"))
GuiCtrlSetData($Label1,_GetLangText("LABEL_TEXT"))
GuiCtrlSetData($Label2,_GetLangText("CHOOSE_LANG"))
; ------------------------------------------------------------------------------------------------

; --- Показываем форму на экране ---
GUISetState(@SW_SHOW)
; ----------------------------------

While 1
	Sleep(30)
WEnd

; ----------- Функция смены языка на форме -----------------------
Func _ChangeLanguage()
	Local $LangFile = GuiCtrlRead($Combo1)
	_SetLanguage($LangFile)
	WinSetTitle($Form1,"",_GetLangText("MAIN_TITLE"))
	GuiCtrlSetData($Button1,_GetLangText("BUTTON_TEXT"))
	GuiCtrlSetData($Label1,_GetLangText("LABEL_TEXT"))
	GuiCtrlSetData($Label2,_GetLangText("CHOOSE_LANG"))
EndFunc
; ----------------------------------------------------------------

Func _Exit()
	Exit
EndFunc
Скрины с результатом работы этого примера, а также все файлы(пример, UDF, lang-файлы) находятся во вложении в файле LangSupport.rar. В описании мог некоторые важные детали пропустить, так что если что, спрашивайте.

Автор: hunter
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Концепция неплохая, она мне даже немного нравится, но вот на ряду с плюсами по сравнению с другими идеями есть тут и пару минусов...

1) Нужно для каждого элемента писать название строки перевода.
2) Нет возможности присваивать в цикле значения элементам, а это очень важно в больших скриптах.


Добавлено:
Сообщение автоматически объединено:

Хотя последнее конечно можно обойти написав значения в виде
Код:
_GetLangText("CHECKBOX_1")
_GetLangText("CHECKBOX_2")

и т.д.
 
Автор
K

kzru_hunter

Осваивающий
Сообщения
144
Репутация
49
CreatoR [?]
1) Нужно для каждого элемента писать название строки перевода.
Ага, для наглядности ( чтобы взглянув на эту строку сразу всплыл перевод, придуманный для этого элемента )
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
CreatoR [?]
1) Нужно для каждого элемента писать название строки перевода.
В принципе все файлы перевода так и пишутся, для каждого элемента своя строка.
Просто теперь, нужен, будет редактор языковых файлов, и самое главное для каждого варианта свой. :smile:
По моему личному мнению, каждый всё равно будет подстраиваться под свои замыслы, видимо универсального решения нет. :smile:
 
Автор
K

kzru_hunter

Осваивающий
Сообщения
144
Репутация
49
Garrett [?]
Просто теперь, нужен, будет редактор языковых файлов
Хорошая идея. Типа надстройка для Scite? В этом вопросе не силен, т.к. не знаю, как следить в нём за функциями, на которых в данный момент установлен курсор.

[Добавлено]
Исправлен косяк, который был допущен в _GetLanguages в режиме 1
 

astati

Новичок
Сообщения
145
Репутация
4
Вопрос.
1)А как добавлять новые языки(к примеру французский)
2)И как изменять lng ? я так понимаю там хранятся переводы строк.
 

Viktor217

Осваивающий
Сообщения
233
Репутация
31
astati сказал(а):
Вопрос.
1)А как добавлять новые языки(к примеру французский)
2)И как изменять lng ? я так понимаю там хранятся переводы строк.
1. Создаёшь новый лэнг-файл.
2. Правильно понимаешь, изменять можно простым блокнотом...
 
Верх