Advertisement
AZJIO

Многоязычная программа

Sep 16th, 2011
589
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
AutoIt 6.99 KB | None | 0 0
  1.  
  2. ;  @AZJIO пример программы с внешними языковыми файлами
  3.  
  4. #include <ComboConstants.au3>
  5.  
  6. ;=============================================================
  7. ; создаём два языковых файла En.lng и Ru.lng. В скрипте они не обязательны, нужны для этого примера. Добавлен флаг 32, чтобы включить поддержку Юникода
  8. If Not FileExists(@ScriptDir & '\Lang') Then DirCreate(@ScriptDir & '\Lang')
  9. $hFile = FileOpen(@ScriptDir & '\Lang\En.lng', 2 + 32)
  10. If $hFile <> -1 Then
  11.     FileWrite($hFile, _
  12.             '[lng]' & @CRLF & _
  13.             '1=My Programs' & @CRLF & _
  14.             '2=Open' & @CRLF & _
  15.             '3=Open File' & @CRLF & _
  16.             '4=Example choice language' & @CRLF & _
  17.             '5=Select' & @CRLF & _
  18.             '6=Language')
  19.     FileClose($hFile)
  20. EndIf
  21.  
  22. $hFile = FileOpen(@ScriptDir & '\Lang\Ru.lng', 2 + 32)
  23. If $hFile <> -1 Then
  24.     FileWrite($hFile, _
  25.             '[lng]' & @CRLF & _
  26.             '1=Моя программа' & @CRLF & _
  27.             '2=Открыть' & @CRLF & _
  28.             '3=Открыть файл' & @CRLF & _
  29.             '4=Пример выбора языка' & @CRLF & _
  30.             '5=Выбор' & @CRLF & _
  31.             '6=Языковой файл')
  32.     FileClose($hFile)
  33. EndIf
  34. ;=============================================================
  35.  
  36. #NoTrayIcon
  37. Global $LangPath, $Ini = @ScriptDir & '\prog_set.ini'
  38.  
  39. ; создаём файл настроек с языковым параметром. Используется при первом запуске.
  40. If Not FileExists($Ini) Then
  41.     $hFile = FileOpen($Ini, 2)
  42.     If $hFile <> -1 Then
  43.         FileWrite($hFile, _
  44.                 '[Set]' & @CRLF & _
  45.                 'Lang=none')
  46.         FileClose($hFile)
  47.     EndIf
  48. EndIf
  49.  
  50. ; По умолчанию устанавливаем англоязычный интерфейс, в случае отсутствия языковых файлов.
  51. Global $aLngDef[7][2] = [[ _
  52.         6, 6],[ _
  53.         '1', 'My Programs'],[ _
  54.         '2', 'Open'],[ _
  55.         '3', 'Open File'],[ _
  56.         '4', 'Example choice language'],[ _
  57.         '5', 'Select'],[ _
  58.         '6', 'Language']]
  59.  
  60. ; Ru
  61. ; если русская локализация, то русский язык. Эта фишка необязательна, но удобство в том, чтобы на родном языке не требовался файл русификации
  62. If @OSLang = 0419 Then
  63.     Dim $aLngDef[7][2] = [[ _
  64.             6, 6],[ _
  65.             '1', 'Моя программа'],[ _
  66.             '2', 'Открыть'],[ _
  67.             '3', 'Открыть файл'],[ _
  68.             '4', 'Пример выбора языка'],[ _
  69.             '5', 'Выбор'],[ _
  70.             '6', 'Языковой файл']]
  71. EndIf
  72.  
  73. Global $aLng[7] = [6]
  74.  
  75. _SetLangCur($aLngDef) ; изначально устанавливаем по умолчанию, на случай если языковой файл окажется неправильный и не применится ко всем элементам
  76.  
  77. ; применяем языковой файл, если указан.
  78. $LangPath = IniRead($Ini, 'Set', 'Lang', 'none') ; читаем значение параметра lng в глобальную переменную $LangPath
  79. If $LangPath <> 'none' And FileExists(@ScriptDir & '\Lang\' & $LangPath) Then ; если не по умолчанию и файл существует, то
  80.     $aLngINI = IniReadSection(@ScriptDir & '\Lang\' & $LangPath, 'lng')
  81.     If Not @error Then _SetLangCur($aLngINI)
  82. EndIf
  83. $aLngINI = 0
  84.  
  85. $hGui = GUICreate($aLng[1], 250, 100)
  86. $Button = GUICtrlCreateButton($aLng[2], 10, 60, 99, 22)
  87. GUICtrlSetTip(-1, $aLng[3])
  88. $Label = GUICtrlCreateLabel($aLng[4], 10, 5, 153, 15)
  89. ; $Checkbox = GUICtrlCreateCheckbox ($aLng[5], 10, 50, 55, 22)
  90.  
  91. ; Поиск языковых файлов, для добавления в список Combo
  92. $LangList = 'none'
  93. $search = FileFindFirstFile(@ScriptDir & '\Lang\*.lng')
  94. If $search <> -1 Then
  95.     While 1
  96.         $hFile = FileFindNextFile($search)
  97.         If @error Then ExitLoop
  98.         $LangList &= '|' & $hFile
  99.     WEnd
  100. EndIf
  101. FileClose($search)
  102.  
  103. GUICtrlCreateLabel('Language', 10, 33, 75, 17) ; Обычно этот текст не рекомендуется переводить, так как случайное переключение на непонятный язык приведёт к трудностям восстановления родного языка, так как не понятно какой пункт в меню кликать.
  104. $ComboLang = GUICtrlCreateCombo('', 85, 30, 70, 22, $CBS_DROPDOWNLIST)
  105. GUICtrlSetData(-1, $LangList, $LangPath)
  106.  
  107. GUISetState()
  108.  
  109. While 1
  110.     Switch GUIGetMsg()
  111.         Case $ComboLang
  112.             _SetLang()
  113.         Case -3
  114.             Exit
  115.     EndSwitch
  116. WEnd
  117.  
  118. ; функция смены языка
  119. Func _SetLang()
  120.     Local $aLngINI
  121.     $LangPath = GUICtrlRead($ComboLang)
  122.     If $LangPath <> 'none' And FileExists(@ScriptDir & '\Lang\' & $LangPath) Then ; если по умолчанию и файл существует, то
  123.         $aLngINI = IniReadSection(@ScriptDir & '\Lang\' & $LangPath, 'lng')
  124.         If Not @error Then
  125.             _SetLangCur($aLngINI)
  126.             _SetLang2()
  127.             IniWrite($Ini, 'Set', 'Lang', $LangPath)
  128.         EndIf
  129.     Else ; если нет файла или выбран "none", то используем язык встроенный в программу
  130.         _SetLangCur($aLngDef)
  131.         _SetLang2()
  132.         $LangPath = 'none'
  133.         IniWrite($Ini, 'Set', 'Lang', 'none')
  134.     EndIf
  135. EndFunc   ;==>_SetLang
  136.  
  137. Func _SetLangCur($aLng2D)
  138.     ; генерируем переменные массива
  139.     Local $tmp
  140.     For $i = 1 To $aLng2D[0][0]
  141.         If StringInStr($aLng2D[$i][1], '\n') Then $aLng2D[$i][1] = StringReplace($aLng2D[$i][1], '\n', @CRLF) ; Обеспечивает перенос строк, который не поддерживает ini
  142.         $tmp = Number($aLng2D[$i][0])
  143.         If $tmp > 0 And $tmp <= $aLng[0] Then $aLng[$tmp] = $aLng2D[$i][1] ; добавление текста, если его параметр является число используемое как индекс массива
  144.         ; Фактически если переданный в $tmp параметр не является числом в диапазоне индексов массива, то он будет отброшен. Массив не вызывает ошибки, так как число не превысит количество элементов массива.
  145.     Next
  146. EndFunc   ;==>_SetLangCur
  147.  
  148. ; функция обновления текстов интерфейса
  149. Func _SetLang2()
  150.     ; недостаточно обновить имена в переменных, их нужно сменить в видимом интерфейсе программы
  151.     WinSetTitle($hGui, '', $aLng[1]) ; сменить имя окна, если это окно настройки
  152.     GUICtrlSetData($Label, $aLng[4])
  153.     GUICtrlSetData($Button, $aLng[2])
  154.     GUICtrlSetTip($Button, $aLng[3])
  155.     ; смена языка взависимости от состояния чекбокса
  156.     ; If $TrCh = 0 Then
  157.         ; GUICtrlSetTip($Checkbox, $aLng[5])
  158.     ; Else
  159.         ; GUICtrlSetTip($Checkbox, $aLng[6])
  160.     ; EndIf
  161. EndFunc   ;==>_SetLang2
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement