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

Здесь обсуждается всё, что касается макросов.
buniak_a_h
Posts: 1877
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 120 times
Been thanked: 167 times
Contact:

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

Post by buniak_a_h »

Здравствуйте!
Реализовал "расширенную" версию функции GetMsg.







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

В связи с включением в скрипт информационных данных (истории, примеров, инструкции) он разросся, и я не стану больше помещать сам скрипт в текст поста. Только во вложении.
GetMsg.v5.lua.7z
Версия 1.5.1
(4.97 KiB) Downloaded 40 times
Last edited by buniak_a_h on Sat 28 Dec, 2019 07:25, edited 8 times in total.

2useven10
Posts: 4051
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 5 times
Been thanked: 188 times

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

Post by 2useven10 »

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

buniak_a_h
Posts: 1877
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 120 times
Been thanked: 167 times
Contact:

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

Post by buniak_a_h »

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

2useven10
Posts: 4051
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 5 times
Been thanked: 188 times

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

Post by 2useven10 »

lng.generator.exe в дистрибутив не входит, сорсы есть в репозитории.
используется он для компиляции языковых файлов самого фара.
у плагинов обычно либо свои генераторы, либо файлы созданные в редакторе.

buniak_a_h
Posts: 1877
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 120 times
Been thanked: 167 times
Contact:

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

Post by buniak_a_h »

Добавил возможность чтения настраиваемых lng.custom-файлов, если тег задан строкой.
Считается, что все языковые файлы в кодировке UTF-8 (65001). Сигнатуру (BOM) я вроде удаляю, но как-то криво я это сделал.
Attachments
GetMsg.lua.7z
Версия 2
(1.95 KiB) Downloaded 35 times
Last edited by buniak_a_h on Sun 04 Nov, 2018 07:39, edited 1 time in total.

User avatar
John Doe
Бюрократ
Posts: 12829
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 38 times
Been thanked: 290 times

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

Post by John Doe »

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

buniak_a_h
Posts: 1877
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 120 times
Been thanked: 167 times
Contact:

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

Post by buniak_a_h »

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

User avatar
John Doe
Бюрократ
Posts: 12829
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 38 times
Been thanked: 290 times

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

Post 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.
Это очень выборочные замечания, остальной код просто не смотрел.

buniak_a_h
Posts: 1877
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 120 times
Been thanked: 167 times
Contact:

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

Post 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 напишите, псе, если знаете как...

User avatar
John Doe
Бюрократ
Posts: 12829
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 38 times
Been thanked: 290 times

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

Post 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
А почему "напомню"?
Было обсуждение.
Это не запрещено, но практика нежелательная, лучше модулем.
(Лично я некоторые простые функции вставляю прямо в скрипт, не беспокоясь о некотором дублировании)

buniak_a_h
Posts: 1877
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 120 times
Been thanked: 167 times
Contact:

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

Post 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.

2useven10
Posts: 4051
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 5 times
Been thanked: 188 times

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

Post by 2useven10 »

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

buniak_a_h
Posts: 1877
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 120 times
Been thanked: 167 times
Contact:

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

Post by buniak_a_h »

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

2useven10
Posts: 4051
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 5 times
Been thanked: 188 times

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

Post by 2useven10 »

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

buniak_a_h
Posts: 1877
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 120 times
Been thanked: 167 times
Contact:

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

Post 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 или вообще сторонних редакторов. Юзеру надо облегчать жизнь, а не усложнять... Или Вы хотите получить пример?

Post Reply

Return to “Обсуждение макросов”