Реализовал "расширенную" версию функции GetMsg.
- Есть возможность указать имя языкового файла (или его префикс, см. описание вызова, или маску файла).
- В самом языковом файле можно указывать не только строки, но и корректные lua-выражения; если это выражение - описание функции, то она будет выполнена с параметрами, переданными при вызове ф-ции GetMsg (см. пример. func.lng)
- Ограничение: нет привязки к плагину (говорят, в стандартной можно передавать Guid плагина).
Функция предусматривает два способа указания параметров: ключевой и позиционный. В первом случае передаётся таблица с полями File, Tag (обязательные), Quiet=true/false, Dir, AddArgs … . Во втором передаются параметры в следующем порядке:
- 1 - File - строка или таблица из двух строк; в этом случае первая строка - Dir; вторая - маска имени файла.
Если имя файла - строка, то это может быть либо каталог+имя файла, либо каталог+префикс имени файла, либо стандартная маска файла с применением WildCard. Если указан префикс, то файл ищется в следующей последовательности: префикс+3 символа языка, префикс+подчерк+3 символа языка. Для основного языка, языка помощи и Eng. См. пример использование префикса. - 2 - Tag - строка или целое число (не проверял) - что искать в языковом файле.
В случае строкового ключа языковом файле должен быть якорь в формате//[Tag]
; со следующей строки должно начинаться выражение для возврата. Признаком конца выражения является либо следующий якорь, либо пустая строка.
В кастомных файлах (File.lng.custom) допускаются строка видаTag=Value
. - 3 - Quiet - выводить ли сообщение о ненайденном файле / теге (true - не выводить).
- 4 и далее - параметры для вызова функции (см. пример func).
В папке Dir имеются файлы Samp_rus.lng и Samp_Eng.lng.
Строку можно будет получить так:
GetMsg('Samp', 'Key')
.Аналогичный вызов можно будет применить для чтения из файлов SampRus.lng и SampEng.lng.
При этом наличие и корректность служебной строки
.Language=
не требуется.Имеются файлы Dir\Samp001.lng, Dir\Samp002.lng, …
Получить строку можно вызовом
GetMsg('Dir\Samp*.lng', 'Key')
.При этом наличие корректной служебной строки
.Language=
является обязательнымВ каталоге Dir имеются файлы SampR01.lng, SampEn01.lng, SampQwe01.lng .
Вызов будет выглядеть так: GetMsg({'Dir', '/Samp.{1,3}\\d+\\.lng/i', 'key')
Имеется языковой файл SampEng.lng со следующим содержимым:
Code: Select all
.Language=English, English
//[func]
function(arg1, arg2) far.Show('SampRus.lng:'..tostring(arg1)..', '..tostring(arg2)) return 'qwerty=' .. arg1 .. ',' .. tostring(arg2) end
Code: Select all
.Language=English, English
//[func]
function(arg1, arg2) far.Show('SampRus.lng:'..tostring(arg1)..', '..tostring(arg2)) return 'йцукен=' .. arg1 .. ',' .. tostring(arg2) end
GetMsg('Samp', 'func', true, 'Первый', 3.14)
GetMsg('%FARHOME%\\Far*.lng', 'MFindPanel')
или
GetMsg({'%FARHOME%', [[far.*\.lng]]}, "MFindPanel")
Выпустил версию 5.
1. Реализована возможность указания не единственного языкового файла, а маски. Маска - либо
стандартная маска файла, либо массив из двух строк: каталога и собственно маски файла в
формате Perl-регулярного выражения.
При этом во всех языковых файлах, соответствующих маске, ОБЯЗАТЕЛЬНО
указание служебной строки .Language=<язык>; файл ищется именно по этой строке.
2. Реализована возможность указания set-переменных в имени каталога и файла (например, %FARHOME%).
3. Обработка "кастомных" языковых файлов (*.lng.custom) сделана более универсальной:
кроме формата
name="string"
допускается также вариант.
Code: Select all
//[name]
Выражение
В связи с включением в скрипт информационных данных (истории, примеров, инструкции) он разросся, и я не стану больше помещать сам скрипт в текст поста. Только во вложении.
- GetMsg.v5.lua.7z
- Версия 1.5.1
- (4.97 KiB) Downloaded 153 times