Page 1 of 4

Чтение из языкового файла .lng (расширение GetMsg)

Posted: Sun 04 Nov, 2018 00:18
by buniak_a_h
Здравствуйте!
Реализовал "расширенную" версию функции GetMsg.







Выпустил версию 5.

В связи с включением в скрипт информационных данных (истории, примеров, инструкции) он разросся, и я не стану больше помещать сам скрипт в текст поста. Только во вложении.
GetMsg.v5.lua.7z
Версия 1.5.1
(4.97 KiB) Downloaded 144 times

Чтение из языкового файла .lng

Posted: Sun 04 Nov, 2018 02:48
by 2useven10
Ф-ии вроде бы нет (или я не знаю).
В макросе не учтена возможность частичного переопределения языковых строк в File.lng.custom.
viewtopic.php?t=9896&start=16

Чтение из языкового файла .lng

Posted: Sun 04 Nov, 2018 03:40
by buniak_a_h
2useven10 wrote: Sun 04 Nov, 2018 02:48 не учтена возможность частичного переопределения языковых строк в File.lng.custom.
Спасибо, доделаю. Единственно - сделаю, чтоб искало не как написано в , но и в том же каталоге, где исходный. Для макросов это будет удобнее, а плагинам не нужно, насколько я понимаю...

Чтение из языкового файла .lng

Posted: Sun 04 Nov, 2018 03:54
by 2useven10
lng.generator.exe в дистрибутив не входит, сорсы есть в репозитории.
используется он для компиляции языковых файлов самого фара.
у плагинов обычно либо свои генераторы, либо файлы созданные в редакторе.

Чтение из языкового файла .lng

Posted: Sun 04 Nov, 2018 07:38
by buniak_a_h
Добавил возможность чтения настраиваемых lng.custom-файлов, если тег задан строкой.
Считается, что все языковые файлы в кодировке UTF-8 (65001). Сигнатуру (BOM) я вроде удаляю, но как-то криво я это сделал.

Чтение из языкового файла .lng

Posted: Mon 05 Nov, 2018 12:16
by John Doe
buniak_a_h wrote: Sun 04 Nov, 2018 00:18 Я накропал макрос для этого, но, возможно, изобретаю велосипед?
В общем да, велосипед. Но другого пути пока нет, хотя напомню о том, что на багтрекере были предложения https://bugs.farmanager.com/view.php?id=3301

Чтение из языкового файла .lng

Posted: Mon 05 Nov, 2018 12:35
by buniak_a_h
John Doe wrote: Mon 05 Nov, 2018 12:16 В общем да, велосипед. Но другого пути пока нет
Значит не велосипед.
Для локализации макросов удобная вещь оказалась. Хотя, конечно, лучше бы реализовать там, где GetMsg

Чтение из языкового файла .lng

Posted: Tue 06 Nov, 2018 11:29
by John Doe
if #{...} == 1 and tonumber(...) then
Подозреваю вы имели ввиду:

Code: Select all

if select("#,...)==1 and type(...)=="number" then
buniak_a_h wrote: Sun 04 Nov, 2018 07:38 for Line in hFile:lines() do
     -- Столкнулся с ситуацией, когда в начале файла - сигнатура UTF-8 (BOM). Попытка тупо удалить.
     -- Наверняка есть более корректный способ, но на выводе BOM не виден.
Уж точно не надо пытаться из каждой строки BOM удалять.
buniak_a_h wrote: Sun 04 Nov, 2018 07:38 local lang=(Far.GetConfig('Language.Main') or win.GetEnv('FARLANG') or 'English'):sub(1,3)
   local langh=(Far.GetConfig('Language.Help') or win.GetEnv('FARLANG') or 'English'):sub(1,3)
Не знаю на какие именно случаи рассчитан тут or, но результат явно неконсистентный, т.к. строка обрезается только если первое условие не выполняется.
buniak_a_h wrote: Sun 04 Nov, 2018 07:38 -- Эту функцию записываю в _G, если её там не было. Для упрощения вызова...
-- Если Вам это не надо - просто уберите следующие строки
На всякий случай напомню, что так не желательно делать в скриптах, которые выкладываются для общего пользования.

P.S.
Это очень выборочные замечания, остальной код просто не смотрел.

Чтение из языкового файла .lng

Posted: Tue 06 Nov, 2018 13:18
by buniak_a_h
John Doe wrote: Tue 06 Nov, 2018 11:29 if #{...} == 1 and tonumber(...) then
Подозреваю вы имели ввиду:
if select("#,...)==1 and type(...)=="number" then
Ок, спасибо.
John Doe wrote: Tue 06 Nov, 2018 11:29 Вс 04 ноя, 2018 09:38
for Line in hFile:lines() do
     -- Столкнулся с ситуацией, когда в начале файла - сигнатура UTF-8 (BOM). Попытка тупо удалить.
     -- Наверняка есть более корректный способ, но на выводе BOM не виден.
Уж точно не надо пытаться из каждой строки BOM удалять.
1. Я же писал, что криво. Наверняка есть способ, чтоб при чтении он был бы просто НЕ ВИДЕН. Чтобы удалить один раз из файла надо сначала весь файл прочитать; тут я не уверен, что это будет эффективнее. Если знаете, как правильно решить эту каку, напишите.
2. Надо проверять ещё и первая ли строка? дополнительная проверка, дополнительная переменная...
3. Ситуация: было 2 файла с BOM, слили их копированием с "Append"; в результате BOM оказался в начале не-первой строки...
John Doe wrote: Tue 06 Nov, 2018 11:29 buniak_a_h писал(а): ↑Вс 04 ноя, 2018 09:38
local lang=(Far.GetConfig('Language.Main') or win.GetEnv('FARLANG') or 'English'):sub(1,3)
   local langh=(Far.GetConfig('Language.Help') or win.GetEnv('FARLANG') or 'English'):sub(1,3)
Не знаю на какие именно случаи рассчитан тут or, но результат явно неконсистентный, т.к. строка обрезается только если первое условие не выполняется.
1. Не моё творчество - слизал отсюда Я - так вообще не понимаю, как Far.GetConfig(...) может вернуть nil и зачем так было сделано...
2. По существу: если GetConfig вернёт nil, то берём %FARLANG%, а если и она не определена - "English". И уже от полученной строки берём первые 3 символа. Там все 3 альтернативы в скобках, за которыми стоит :sub, так что строка обрежется, вроде, в любом случае. Нет?
3. Поэкспериментировал... Far.GetConfig не может вернуть nil. Если ошибка в аргументе, то возникает ошибка. Так что я опять не понимаю, зачем автор, с которого я слизал эту конструкцию, так умничал...
John Doe wrote: Tue 06 Nov, 2018 11:29 buniak_a_h писал(а): ↑Вс 04 ноя, 2018 09:38
-- Эту функцию записываю в _G, если её там не было. Для упрощения вызова...
-- Если Вам это не надо - просто уберите следующие строки
На всякий случай напомню, что так не желательно делать в скриптах, которые выкладываются для общего пользования.
Хорошо...
А почему "напомню"?
Обновлю скрипт в первом посте... Про борьбу с BOM напишите, псе, если знаете как...

Чтение из языкового файла .lng

Posted: Tue 06 Nov, 2018 13:44
by John Doe
buniak_a_h wrote: Tue 06 Nov, 2018 13:18 1. Я же писал, что криво. Наверняка есть способ, чтоб при чтении он был бы просто НЕ ВИДЕН.
Нет.
buniak_a_h wrote: Tue 06 Nov, 2018 13:18Чтобы удалить один раз из файла надо сначала весь файл прочитать; тут я не уверен, что это будет эффективнее. Если знаете, как правильно решить эту каку, напишите.
1. Необязательно весь 2. Весь тоже будет вполне эффективно
buniak_a_h wrote: Tue 06 Nov, 2018 13:18 3. Ситуация: было 2 файла с BOM, слили их копированием с "Append"; в результате BOM оказался в начале не-первой строки...
Не может. Это уже ошибка.
buniak_a_h wrote: Tue 06 Nov, 2018 13:18 По существу: если GetConfig вернёт nil, то берём %FARLANG%, а если и она не определена - "English". И уже от полученной строки берём первые 3 символа. Там все 3 альтернативы в скобках, за которыми стоит :sub, так что строка обрежется, вроде, в любом случае. Нет?
Да, это я не досмотрел скобки, извините.
buniak_a_h wrote: Tue 06 Nov, 2018 13:18 Так что я опять не понимаю, зачем автор, с которого я слизал эту конструкцию, так умничал...
А зачем слизывать.
buniak_a_h wrote: Tue 06 Nov, 2018 13:18 А почему "напомню"?
Было обсуждение.
Это не запрещено, но практика нежелательная, лучше модулем.
(Лично я некоторые простые функции вставляю прямо в скрипт, не беспокоясь о некотором дублировании)

Чтение из языкового файла .lng

Posted: Tue 06 Nov, 2018 14:30
by buniak_a_h
John Doe wrote: Tue 06 Nov, 2018 13:44 buniak_a_h писал(а): ↑Вт 06 ноя, 2018 15:18
3. Ситуация: было 2 файла с BOM, слили их копированием с "Append"; в результате BOM оказался в начале не-первой строки...
Не может. Это уже ошибка.
Я догадываюсь, что это - ошибка. Но я попробовал сделать такой файл и открыть его во встроенном редакторе ФАРа. Увы, там BOM НЕ ВИДЕН!!! А теперь представьте себя на месте юзера: сделал всё правильно, перепроверил в редакторе, а ФАР строку не видит. И что ему делать?
PS. Я довольно много времени потратил, чтоб узнать, почему мой скрипт не находит тег. Если б не 16-ричный редактор - ни за что бы не догадался! А значт, скрипт должен такую ситуацию отрабатывать сам...
PPS.

Чтение из языкового файла .lng

Posted: Tue 06 Nov, 2018 14:39
by 2useven10
buniak_a_h wrote: Tue 06 Nov, 2018 14:30 Но я попробовал сделать такой файл и открыть его во встроенном редакторе ФАРа. Увы, там BOM НЕ ВИДЕН!!!
Обычно виден. Визуально в зависимости от фонта - либо квадратик, либо пробел.
На Win7 вроде бы были фонты в которых символ вообще не виден,
что вообще-то правильно - это символ нулевой ширины, но в концепцию консольного API не вписывается.

Чтение из языкового файла .lng

Posted: Tue 06 Nov, 2018 14:49
by buniak_a_h
2useven10 wrote: Tue 06 Nov, 2018 14:39 Обычно виден
Может, влияют (а) настройки; (б) FarColorer (в) уж не знаю, что. Но... У меня не виден. Если Вы не верите - могу прислать файл и скриншот.
Просто проверка BOM в каждой строке пользовательского (а, значит, не очень большого) файла - маленькая плата за гарантию от трудно находимой ошибки.

Чтение из языкового файла .lng

Posted: Tue 06 Nov, 2018 15:01
by 2useven10
buniak_a_h wrote: Tue 06 Nov, 2018 14:49 Просто проверка BOM в каждой строке пользовательского (а, значит, не очень большого) файла - маленькая плата за гарантию от трудно находимой ошибки.
Если на этом обработка файла заканчивается, или вы отдаёте исправленный файл - да, всё хорошо.
Но если файл с BOM в середине вы передаёте дальше, то предпочтительнее показывать ошибку, а не прятать её.

Чтение из языкового файла .lng

Posted: Tue 06 Nov, 2018 17:31
by buniak_a_h
2useven10 wrote: Tue 06 Nov, 2018 15:01
buniak_a_h wrote: Tue 06 Nov, 2018 14:49 Просто проверка BOM в каждой строке пользовательского (а, значит, не очень большого) файла - маленькая плата за гарантию от трудно находимой ошибки.
Если на этом обработка файла заканчивается, или вы отдаёте исправленный файл - да, всё хорошо.
Но если файл с BOM в середине вы передаёте дальше, то предпочтительнее показывать ошибку, а не прятать её.
Чо-т я затормозил...
1. обработка какого файла?
2. Исправленный файл скрипта - в первом посте темы. Если Вы про исправленный файл с несколькими BOM-ами в разных строках, то (а) это был тест и (б) кому я должен его отдать?
3. Прячу ошибку опять же не я. Я встроенного ФАРовского редактора не касался. Я тоже считаю, что BOM должен быть виден (или всегда, или внутри файла - на вкус и цвет...). Но редактор делал не я.
3. Что Вы предлагаете мне сделать? Убрать анализ в каждой строке - я уже объяснил, что может привести к ошибке, которую невозможно найти без спец. средств типа Hex Editor или вообще сторонних редакторов. Юзеру надо облегчать жизнь, а не усложнять... Или Вы хотите получить пример?