Сайт AZJIO
Главная | Регистрация | Вход Приветствую Вас Гость | RSS
Меню сайта
Категории раздела
Скрипты для LiveCD [0]
Скрипты для WindowsXP [8]
Примеры скриптов [15]
Функции [5]
Поиск
Главная » Статьи » Скрипты AutoIt3 » Примеры скриптов

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

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


Нумеровать числом оказалось намного проще и для внутренней реализации. А если хочется читабельности, то можно перевод указать в коментирии, рядом с переменной. Всё равно использование аббривеатуры не повышает читабельности, поэтому отказался от этого метода
Существует краткий вариант без внешних файлов, родной язык и английский, используя обычное условие. Такой вариант позволяет создать пример для себя и для англоязычной публики и остаться при этом универсальным.

;  @AZJIO пример программы с внешними языковыми файлами

#include <ComboConstants.au3>

;=============================================================
; создаём два языковых файла En.lng и Ru.lng. В скрипте они не обязательны, нужны для этого примера. Добавлен флаг 32, чтобы включить поддержку Юникода

If Not FileExists(@ScriptDir & '\Lang') Then DirCreate(@ScriptDir & '\Lang')
$hFile = FileOpen(@ScriptDir & '\Lang\En.lng', 2 + 32)
If $hFile <> -1 Then
    FileWrite($hFile, _
            '[lng]' & @CRLF & _
            '1=My Programs' & @CRLF & _
            '2=Open' & @CRLF & _
            '3=Open File' & @CRLF & _
            '4=Example choice language' & @CRLF & _
            '5=Select' & @CRLF & _
            '6=Language')
    FileClose($hFile)
EndIf

$hFile = FileOpen(@ScriptDir & '\Lang\Ru.lng', 2 + 32)
If $hFile <> -1 Then
    FileWrite($hFile, _
            '[lng]' & @CRLF & _
            '1=Моя программа' & @CRLF & _
            '2=Открыть' & @CRLF & _
            '3=Открыть файл' & @CRLF & _
            '4=Пример выбора языка' & @CRLF & _
            '5=Выбор' & @CRLF & _
            '6=Языковой файл')
    FileClose($hFile)
EndIf
;=============================================================

#NoTrayIcon
Global $LangPath, $Ini = @ScriptDir & '\prog_set.ini'

; создаём файл настроек с языковым параметром. Используется при первом запуске.
If Not FileExists($Ini) Then
    $hFile = FileOpen($Ini, 2)
    If $hFile <> -1 Then
        FileWrite($hFile, _
                '[Set]' & @CRLF & _
                'Lang=none')
        FileClose($hFile)
    EndIf
EndIf


; По умолчанию устанавливаем англоязычный интерфейс, в случае отсутствия языковых файлов.
Global $aLngDef[7][2] = [[ _
        6, 6],[ _
        '1', 'My Programs'],[ _
        '2', 'Open'],[ _
        '3', 'Open File'],[ _
        '4', 'Example choice language'],[ _
        '5', 'Select'],[ _
        '6', 'Language']]

; Ru
; если русская локализация, то русский язык. Эта фишка необязательна, но удобство в том, чтобы на родном языке не требовался файл русификации

If @OSLang = 0419 Then
    Dim $aLngDef[7][2] = [[ _
            6, 6],[ _
            '1', 'Моя программа'],[ _
            '2', 'Открыть'],[ _
            '3', 'Открыть файл'],[ _
            '4', 'Пример выбора языка'],[ _
            '5', 'Выбор'],[ _
            '6', 'Языковой файл']]
EndIf

Global
$aLng[7] = [6]

_SetLangCur($aLngDef) ; изначально устанавливаем по умолчанию, на случай если языковой файл окажется неправильный и не применится ко всем элементам

; применяем языковой файл, если указан.

$LangPath = IniRead($Ini, 'Set', 'Lang', 'none') ; читаем значение параметра lng в глобальную переменную $LangPath
If $LangPath <> 'none' And FileExists(@ScriptDir & '\Lang\' & $LangPath) Then ; если не по умолчанию и файл существует, то
    $aLngINI = IniReadSection(@ScriptDir & '\Lang\' & $LangPath, 'lng')
    If Not @error Then _SetLangCur($aLngINI)
EndIf
$aLngINI = 0

$hGui = GUICreate($aLng[1], 250, 100)
$Button = GUICtrlCreateButton($aLng[2], 10, 60, 99, 22)
GUICtrlSetTip(-1, $aLng[3])
$Label = GUICtrlCreateLabel($aLng[4], 10, 5, 153, 15)
; $Checkbox = GUICtrlCreateCheckbox ($LngCh, 10, 50, 55, 22)

; Поиск языковых файлов, для добавления в список Combo

$LangList = 'none'
$search = FileFindFirstFile(@ScriptDir & '\Lang\*.lng')
If $search <> -1 Then
    While 1
        $hFile = FileFindNextFile($search)
        If @error Then ExitLoop
        $LangList &= '|' & $hFile
    WEnd
EndIf

FileClose($search)

GUICtrlCreateLabel('Language', 10, 33, 75, 17) ; Обычно этот текст не рекомендуется переводить, так как случайное переключение на непонятный язык приведёт к трудностям восстановления родного языка, так как не понятно какой пункт в меню кликать.
$ComboLang = GUICtrlCreateCombo('', 85, 30, 70, 22, $CBS_DROPDOWNLIST)
GUICtrlSetData(-1, $LangList, $LangPath)

GUISetState()

While 1
    Switch GUIGetMsg()
        Case $ComboLang
            _SetLang()
        Case -3
            Exit
    EndSwitch
WEnd


; функция смены языка
Func _SetLang()
    Local $aLngINI, $LangPath
    $LangPath = GUICtrlRead($ComboLang)
    If $LangPath <> 'none' And FileExists(@ScriptDir & '\Lang\' & $LangPath) Then ; если по умолчанию и файл существует, то
        $aLngINI = IniReadSection(@ScriptDir & '\Lang\' & $LangPath, 'lng')
        If Not @error Then
            _SetLangCur($aLngINI)
            _SetLang2()
            IniWrite($Ini, 'Set', 'Lang', $LangPath)
        EndIf
    Else ; если нет файла или выбран "none", то используем язык встроенный в программу
        _SetLangCur($aLngDef)
        _SetLang2()
        IniWrite($Ini, 'Set', 'Lang', 'none')
    EndIf
EndFunc
  ;==>_SetLang

Func _SetLangCur($aLng2D)
    ; генерируем переменные массива
    Local $tmp
    For $i = 1 To $aLng2D[0][0]
        If StringInStr($aLng2D[$i][1], '\n') Then $aLng2D[$i][1] = StringReplace($aLng2D[$i][1], '\n', @CRLF) ; Обеспечивает перенос строк, который не поддерживает ini
        $tmp = Number($aLng2D[$i][0])
        If $tmp > 0 And $tmp <= $aLng[0] Then $aLng[$tmp] = $aLng2D[$i][1] ; добавление текста, если его параметр является число используемое как индекс массива
        ; Фактически если переданный в $tmp параметр не является числом в диапазоне индексов массива, то он будет отброшен. Массив не вызывает ошибки, так как число не превысит количество элементов массива.
    Next
EndFunc
  ;==>_SetLangCur

; функция обновления текстов интерфейса

Func _SetLang2()
    ; недостаточно обновить имена в переменных, их нужно сменить в видимом интерфейсе программы
    WinSetTitle($hGui, '', $aLng[1]) ; сменить имя окна, если это окно настройки
    GUICtrlSetData($Label, $aLng[4])
    GUICtrlSetData($Button, $aLng[2])
    GUICtrlSetTip($Button, $aLng[3])
    ; смена языка взависимости от состояния чекбокса
    ; If $TrCh = 0 Then
    ; GUICtrlSetTip($Checkbox, $LngCh1)
    ; Else
    ; GUICtrlSetTip($Checkbox, $LngCh2)
    ; EndIf
EndFunc   ;==>_SetLang2

Категория: Примеры скриптов | Добавил: AZJIO (11.01.2011)
Просмотров: 1486 | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Вход
Друзья сайта
  • Справки AZJIO
  • USBTOR
  • PureBasic (Ru)
  • PureBasic (En)
  • AutoIT3 - Ru.Board
  • autoit-script.ru
  • autoitscript.com
  • WinPE - Ru.Board
  • Статистика

    Онлайн всего: 1
    Гостей: 1
    Пользователей: 0
    ЮMoney

    Мой кошелёк

    ЮMoney: 4100117604217624


    AZJIO © 2024