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

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

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

Post by buniak_a_h » Sun 04 Nov, 2018 00:18

Здравствуйте!
Подскажите, пожалуйста, я не смог найти информации ни в документации, ни на форуме.
Имеется ли функция чтения строк из языкового файла (типа far.GetMsg), идеологически похожая на far.ShowHelp?
На самом деле хотелось бы иметь возможность:
(а) указывать имя файла (без учета настройки языка) - ;
(б) указывать не только числовой индекс строки, но и "тег" (ту строку, что в файле farrus.lng указывается внутри скобок в строках вида //[<тег>])
Я накропал макрос для этого, но, возможно, изобретаю велосипед?
GetMsg.v2.lua.7z
Версия 2
(1.99 KiB) Downloaded 1 time
Last edited by buniak_a_h on Tue 06 Nov, 2018 13:25, edited 2 times in total.

2useven10
Posts: 3620
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 3 times
Been thanked: 143 times

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

Post by 2useven10 » Sun 04 Nov, 2018 02:48

Ф-ии вроде бы нет (или я не знаю).
В макросе не учтена возможность частичного переопределения языковых строк в 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: 582
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 57 times
Been thanked: 13 times
Contact:

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

Post by buniak_a_h » Sun 04 Nov, 2018 03:40

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

2useven10
Posts: 3620
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 3 times
Been thanked: 143 times

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

Post by 2useven10 » Sun 04 Nov, 2018 03:54

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

buniak_a_h
Posts: 582
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 57 times
Been thanked: 13 times
Contact:

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

Post by buniak_a_h » Sun 04 Nov, 2018 07:38

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

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

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

Post by John Doe » Mon 05 Nov, 2018 12:16

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

buniak_a_h
Posts: 582
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 57 times
Been thanked: 13 times
Contact:

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

Post by buniak_a_h » Mon 05 Nov, 2018 12:35

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

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

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

Post by John Doe » Tue 06 Nov, 2018 11:29

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: 582
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 57 times
Been thanked: 13 times
Contact:

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

Post by buniak_a_h » Tue 06 Nov, 2018 13:18

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: 11970
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 26 times
Been thanked: 134 times

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

Post by John Doe » Tue 06 Nov, 2018 13:44

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: 582
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 57 times
Been thanked: 13 times
Contact:

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

Post by buniak_a_h » Tue 06 Nov, 2018 14:30

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: 3620
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 3 times
Been thanked: 143 times

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

Post by 2useven10 » Tue 06 Nov, 2018 14:39

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

buniak_a_h
Posts: 582
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 57 times
Been thanked: 13 times
Contact:

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

Post by buniak_a_h » Tue 06 Nov, 2018 14:49

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

2useven10
Posts: 3620
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 3 times
Been thanked: 143 times

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

Post by 2useven10 » Tue 06 Nov, 2018 15:01

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

buniak_a_h
Posts: 582
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 57 times
Been thanked: 13 times
Contact:

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

Post by buniak_a_h » Tue 06 Nov, 2018 17:31

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

2useven10
Posts: 3620
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 3 times
Been thanked: 143 times

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

Post by 2useven10 » Tue 06 Nov, 2018 18:38

buniak_a_h, Насколько я понял...
Вы читаете .lng файл,
если BOM у него в середине - файл 'плохой',
если для себя вы BOM убрали - ваш скрипт отработает,
но файл останется плохим и это может вылезти где-то ещё (если файл читается другими средствами).
Если ваш скритп покажет ошибку - файл может быть исправлен раньше, т.е. ваш скрипт будет 'спец. средством' обнаружившим ошибку.

Post Reply

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