Автор Тема: AppTranslation Module - Добавление поддержки мультиязычности в вашу программу  (Прочитано 5861 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7827
  • Репутация: 2288
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Вот пример добавления поддержки мультиязычности в вашу программу:

Код: AutoIt [Выделить]
#include <GUIConstantsEx.au3>

Global Const Enum _
    $iMsg_First = 0, _
        $iMsg_Title, $iMsg_Label1, $iMsg_Button1, _
        $iMsg_CheckBox1, $iMsg_CheckBox2, $iMsg_CheckBox3, $iMsg_CheckBox4, $iMsg_CheckBox5, $iMsg_CheckBox6, $iMsg_CheckBox7, _
    $iMsg_Last

Global $aMessage = _AppTranslation_Proc(@ScriptDir & "\Russian.lng")

GUICreate($aMessage[$iMsg_Title], 300, 300)

GUICtrlCreateLabel($aMessage[$iMsg_Label1], 20, 10)
GUICtrlCreateButton($aMessage[$iMsg_Button1], 20, 40)

$iTop = 100

For $i = 1 To 7
    GUICtrlCreateCheckbox($aMessage[Eval("iMsg_CheckBox" & $i)], 20, $iTop)
    $iTop += 20
Next

GUISetState()

While 1
    $nMsg = GUIGetMsg()
   
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd

Func _AppTranslation_Proc($sLangFile)
    Local $aMessage[$iMsg_Last+1], $sMessage
   
    ;Default values
    $aMessage[$iMsg_Title] = "My App"
    $aMessage[$iMsg_Label1] = "This is the label text"
    $aMessage[$iMsg_Button1] = "Press me"
    $aMessage[$iMsg_CheckBox1] = "CheckBox number... 1"
    $aMessage[$iMsg_CheckBox2] = "CheckBox number... 2"
    $aMessage[$iMsg_CheckBox3] = "CheckBox number... 3"
    $aMessage[$iMsg_CheckBox4] = "CheckBox number... 4"
    $aMessage[$iMsg_CheckBox5] = "CheckBox number... 5"
    $aMessage[$iMsg_CheckBox6] = "CheckBox number... 6"
    $aMessage[$iMsg_CheckBox7] = "CheckBox number... 7"
   
    If Not FileExists($sLangFile) Then
        Return $aMessage
    EndIf
   
    For $i = $iMsg_First + 1 To $iMsg_Last - 1
        $sMessage = IniRead($sLangFile, "Translation", "0" & $i, "")
        $sMessage = BinaryToString(StringToBinary($sMessage), 4)
       
        If $sMessage <> "" Then
            $aMessage[$i] = $sMessage
        EndIf
    Next
   
    Return $aMessage
EndFunc

 


Содержание языкового файла (Russian.lng):
Код: (ini) [Выделить]
  1. [Translation]
  2. 01="Заголовок моей программы"
  3. 02="Это текст надписи"
  4. 03="Нажмите на меня"
  5. 04="Опция номер... 1"
  6. 05="Опция номер... 2"
  7. 06="Опция номер... 3"
  8. 07="Опция номер... 4"
  9. 08="Опция номер... 5"
  10. 09="Опция номер... 6"
  11. 010="Опция номер... 7"

файл должен быть сохранён в кодировке UTF-8, иначе записи будут плохо отображаться.

P.S
В своих программах я использую более сложную форму данной концепции, но этот пример только для общего представления.
« Последнее редактирование: Май 30, 2010, 22:31:21 от CreatoR »


Правила, Поиск, Супер тема


AutoIt is simple, subtle, elegant.


«Не оказываю тех. поддержку через ПМ/ICQ, и по электронной почте - для этого есть форум. (C)»
«Законы Мэрфи неоспоримы!»


Мои работы

Русское сообщество AutoIt


Оффлайн kzru_hunter [?]

  • Осваивающий
  • **
  • Сообщений: 144
  • Репутация: 49
    • Награды
Вот так было бы удобнее разбираться в коде, если бы lang-файл выглядил так:
Цитировать
[Translation]
MAIN_TITLE = Заголовок моей программы
LABEL_TEXT = Это текст надписи
PRESS_ON_ME = Нажмите на меня
OPTION_1 = Опция номер... 1
OPTION_2 = Опция номер... 2
OPTION_3 = Опция номер... 3
OPTION_4 = Опция номер... 4
OPTION_5 = Опция номер... 5
OPTION_6 = Опция номер... 6
OPTION_N = Опция номер... 7
И в примере можно было бы добавить Combo, в котором можно выбрать язык. При выборе в Combo автоматически менять язык всех контролов.

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7827

  • Автор темы
  • Репутация: 2288
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
kzru_hunter  [?]
Цитировать
Вот так было бы удобнее разбираться в коде
Ничего удобного здесь не вижу, придётся для каждого элемента читать по уникальному ключу.


Цитировать
ожно было бы добавить Combo, в котором можно выбрать язык
Я же написал, как раз для таких замечании:
[?]
Цитировать
P.S
В своих программах я использую более сложную форму данной концепции, но этот пример только для общего представления.

Оффлайн kzru_hunter [?]

  • Осваивающий
  • **
  • Сообщений: 144
  • Репутация: 49
    • Награды
CreatoR  [?]
Цитировать
Ничего удобного здесь не вижу, придётся для каждого элемента читать по уникальному ключу.
Можно всю секцию целиком прочитать, и потом уже думать, как работать с массивом, который возвратила функция IniReadSection в плане оптимизации временных затрат.

Текст кода может быть очень большим, и разбирать в каждой такой строке
Код: AutoIt [Выделить]
GUICtrlCreateLabel($aMessage[2], 20, 10)

значение в массиве $aMessage[N] будет не удобно. Придётся каждый раз переключаться на lang-файл, чтобы понять, какой текст записан в этот массив.
Особенно будет не удобно, если открыть свой старый проект с поддержкой мультиязычности, например, через год.
Пример lang-файла, который я предложил, как раз имеет такой же вид, как и в Counter-Strike 1.6 при написании плагинов.

Могу предложить свой вариант добавления поддержки мультиязычности, если никто не будет против  :)


Русское сообщество AutoIt


Оффлайн FlatX007 [?]

  • Осваивающий
  • **
  • Сообщений: 174
  • Репутация: 33
  • Пол: Мужской
  • Tattoo!
    • Награды
...что можно узнать статус выполнения другой функции если в ней не включена возможность об отчете о том что она делает до того момента как она отработает

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7827

  • Автор темы
  • Репутация: 2288
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
kzru_hunter  [?]
Цитировать
Текст кода может быть очень большим, и разбирать в каждой такой строке
...
значение в массиве $aMessage[N] будет не удобно
Можно присвоить константы для этого:

Код: AutoIt [Выделить]
#include <GUIConstantsEx.au3>

Global Const Enum _
    $iMsg_First = 0, _
        $iMsg_Title, $iMsg_Label1, $iMsg_Button1, _
        $iMsg_CheckBox1, $iMsg_CheckBox2, $iMsg_CheckBox3, $iMsg_CheckBox4, $iMsg_CheckBox5, $iMsg_CheckBox6, $iMsg_CheckBox7, _
    $iMsg_Last

Global $aMessage = _AppTranslation_Proc(@ScriptDir & "\Russian.lng")

GUICreate($aMessage[$iMsg_Title], 300, 300)

GUICtrlCreateLabel($aMessage[$iMsg_Label1], 20, 10)
GUICtrlCreateButton($aMessage[$iMsg_Button1], 20, 40)

$iTop = 100

For $i = 1 To 7
    GUICtrlCreateCheckbox($aMessage[Eval("iMsg_CheckBox" & $i)], 20, $iTop)
    $iTop += 20
Next

GUISetState()

While 1
    $nMsg = GUIGetMsg()
   
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd

Func _AppTranslation_Proc($sLangFile)
    Local $aMessage[$iMsg_Last+1], $sMessage
   
    ;Default values
    $aMessage[$iMsg_Title] = "My App"
    $aMessage[$iMsg_Label1] = "This is the label text"
    $aMessage[$iMsg_Button1] = "Press me"
    $aMessage[$iMsg_CheckBox1] = "CheckBox number... 1"
    $aMessage[$iMsg_CheckBox2] = "CheckBox number... 2"
    $aMessage[$iMsg_CheckBox3] = "CheckBox number... 3"
    $aMessage[$iMsg_CheckBox4] = "CheckBox number... 4"
    $aMessage[$iMsg_CheckBox5] = "CheckBox number... 5"
    $aMessage[$iMsg_CheckBox6] = "CheckBox number... 6"
    $aMessage[$iMsg_CheckBox7] = "CheckBox number... 7"
   
    If Not FileExists($sLangFile) Then
        Return $aMessage
    EndIf
   
    For $i = $iMsg_First + 1 To $iMsg_Last - 1
        $sMessage = IniRead($sLangFile, "Translation", "0" & $i, "")
        $sMessage = BinaryToString(StringToBinary($sMessage), 4)
       
        If $sMessage <> "" Then
            $aMessage[$i] = $sMessage
        EndIf
    Next
   
    Return $aMessage
EndFunc


Оффлайн kzru_hunter [?]

  • Осваивающий
  • **
  • Сообщений: 144
  • Репутация: 49
    • Награды
Добавлять новые переменные для новых контролов не удобно.
Удобнее смотрелось бы вот так:
Код: AutoIt [Выделить]
__SetLanguage("Russian.lng")
...
GUICtrlCreateLabel(__GetLangText("MAIN_TITLE"), 20, 10)
...


Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7827

  • Автор темы
  • Репутация: 2288
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
kzru_hunter  [?]
Цитировать
Удобнее смотрелось бы вот так
Удобство понятие относительное, тем более что в такой форме инициализация скрипта будет задерживаться дольше обычного.

Русское сообщество AutoIt


 

Похожие темы

  Тема / Автор Ответов Последний ответ
5 Ответов
5120 Просмотров
Последний ответ Октябрь 18, 2009, 18:20:47
от snoitaleR
28 Ответов
19903 Просмотров
Последний ответ Апрель 02, 2014, 03:55:58
от AZJIO
6 Ответов
5107 Просмотров
Последний ответ Февраль 13, 2011, 13:47:14
от Viktor217
7 Ответов
6275 Просмотров
Последний ответ Июнь 05, 2010, 18:10:12
от ynbIpb
25 Ответов
17368 Просмотров
Последний ответ Июль 23, 2013, 00:38:25
от Astel064
4 Ответов
3343 Просмотров
Последний ответ Февраль 13, 2011, 12:46:08
от AZJIO
4 Ответов
2426 Просмотров
Последний ответ Май 23, 2011, 00:57:48
от CreatoR
4 Ответов
6489 Просмотров
Последний ответ Август 08, 2012, 14:29:47
от CreatoR
7 Ответов
3115 Просмотров
Последний ответ Декабрь 26, 2012, 23:49:50
от erlik
1 Ответов
777 Просмотров
Последний ответ Июнь 03, 2015, 13:56:07
от Prog