MUI

Обсуждение NeoBook на русском
User avatar
Snow_Irbis
Posts: 13
Joined: Thu Jul 14, 2011 7:46 am
Contact:

MUI

Post by Snow_Irbis »

Рано или поздно каждый сталкивается с тем , что в его программе требуется поддержка мультиязычности . Реализовать ее можно многими способами , об одном из них я и расскажу . Данный способ протестирован на сотнях тысяч пользователей , и зарекомендовал себя как наиболее надежный :) Если Вы разберетесь в этом примере , то реализовать поддержку мультиязычности в своей программе Вам не составит труда :)

Вот этот код вставляем в Свойства страницы -> Команды

Code: Select all

FileExists "[PubDir]lang.llf" "[ELLF]"        
If "[ELLF]" "=" "True"
FileRead "[PubDir]lang.llf" "1" "[MUI_VAR_1]"
FileRead "[PubDir]lang.llf" "2" "[MUI_VAR_2]"
FileRead "[PubDir]lang.llf" "3" "[MUI_VAR_3]"
Return
Else
EndIf
SetVar "[MUI_VAR_1]" "Русский"   
SetVar "[MUI_VAR_2]" "Сообщение программы"   
SetVar "[MUI_VAR_3]" "Действие не удалось !"   
Return
Image

Теперь пояснения к коду для новичков . Сперва проверяем доступность языкового файла в папке с программой , если он доступен то считываем из него данные которые загружаются в языковые переменные [MUI_VAR_XX] . В случае если файл языкового пакета lang.llf не найден , то присваивается значение языковым переменным [MUI_VAR_XX] принятое по умолчанию за основной язык программы :)

Далее вставляем картинки флагов ( в случае если языковых локалей очень много , а место мало , можете использовать CustomWindow

) , при нажатии на которые будет меняться язык программы . После чего вставляем следующий код в Свойства объекта -> Команды , и так для каждого языка :)

Code: Select all

ExtractFile "C:\MUI_EXAMPLE\MUI\Название_Языка.txt" "[PubDir]lang.llf"        
Delay "250"                     
FileExists "[PubDir]lang.llf" "[MLLFE]"          
If "[MLLFE]" "=" "True"
FileRead "[PubDir]lang.llf" "1" "[MUI_VAR_1]"
FileRead "[PubDir]lang.llf" "2" "[MUI_VAR_2]"
FileRead "[PubDir]lang.llf" "3" "[MUI_VAR_3]"
Else
AlertBox "[MUI_VAR_2]" "[MUI_VAR_3]"      
Return
EndIf
Image

Теперь пояснения к коду для новичков . Мы извлекаем языковой файл , после чего ждем 250 мс ( это необходимо для предотвращения конфликтных ситуаций с некоторыми параноидальными антивирусами ) . Далее проверяем доступность извлеченного языкового файла , если он доступен то считываем с него данные которые загружаются в языковые переменные [MUI_VAR_XX] , если нет , то выводим сообщение об ошибке ( будет выведено на том языке который активирован в данный момент ) :)

В итоге получится простой и надежный MUI , тестовый пример можно скачать тут :)

Image
Image
InitteCig
Posts: 19
Joined: Sun Oct 28, 2012 11:44 am

Re: MUI

Post by InitteCig »

Snow_Irbis wrote:скачать тут
Не лучше выкладывать файлы хотя бы на http://rghost.ru/ ?
Переходить по десяткам ссылок и вводить коды, как то напряжно. :(
Хотел скачать, но терпения не хватило.
User avatar
Snow_Irbis
Posts: 13
Joined: Thu Jul 14, 2011 7:46 am
Contact:

Re: MUI

Post by Snow_Irbis »

Я хотел прикрепить архив к сообщению , но такой опции не нашел , поэтому и залил на файлообменник . Перезаливать не буду , так как на ргхост.ру файл могут удалить через некоторое время , а на ифолдер.ру файл будет хранится практически вечно :)
Image
Phaniaameve
Posts: 13
Joined: Sun Oct 28, 2012 2:50 am

Re: MUI

Post by Phaniaameve »

Snow_Irbis wrote: Вот этот код вставляем в Свойства страницы -> Команды
Для новичков....
Обычно код какой-либо рАзовой инициализации вставляют не не страницу, а в секцию StartUp проекта.
Это - принципиальный момент, т.к. скрипт (команды) заложенные в StartUp выполняются только один раз при запуске приложения, в то же время, команды прописанные в "свойствах страницы" будут выполнятся каждый раз при входе на страницу (или уходе с неё).
Хотя, если вход на первую страницу должен быть выполнен только один раз, то все будет работать как задумано, в противном же случае ждите сюрпризов.
Phaniaameve
Posts: 13
Joined: Sun Oct 28, 2012 2:50 am

Re: MUI

Post by Phaniaameve »

mishem wrote:
Snow_Irbis wrote:скачать тут
Не лучше выкладывать файлы хотя бы на http://rghost.ru/ ?
Переходить по десяткам ссылок и вводить коды, как то напряжно. :(
Хотел скачать, но терпения не хватило.
Зато мне хватило. :)

Увы, пример неудачный и неудобный!
:(
Многоязычность можно реализовать гораздо эффективнее, например, так.
Пароль на архив: neobooker.ru

Кстати, "языковые" файлы могут быть как внешними, так и вложенными.
:wink:
User avatar
Snow_Irbis
Posts: 13
Joined: Thu Jul 14, 2011 7:46 am
Contact:

Re: MUI

Post by Snow_Irbis »

Peter wrote: Для новичков....
Обычно код какой-либо рАзовой инициализации вставляют не не страницу, а в секцию StartUp проекта.
Это - принципиальный момент, т.к. скрипт (команды) заложенные в StartUp выполняются только один раз при запуске приложения, в то же время, команды прописанные в "свойствах страницы" будут выполнятся каждый раз при входе на страницу (или уходе с неё).
Хотя, если вход на первую страницу должен быть выполнен только один раз, то все будет работать как задумано, в противном же случае ждите сюрпризов.
Мой вариант реализации мультиязычности протестирован на большом количестве пользователей , никаких внештатных ситуаций в данной реализацией замечено не было . Решение инициализировать код каждый раз ( а не один раз в секции StartUp ) вызвано тем , что некоторые параноидальные антивирусы блокируют доступ к памяти , и в случае если код был установлен в секцию StartUp ( первый вариант был написан именно так ) приходилось перезапускать программу , а если в Свойства страницы -> Команды как сейчас , то достаточно свернуть и развернуть окно программы :)
Peter wrote: Увы, пример неудачный и неудобный!
:(
Многоязычность можно реализовать гораздо эффективнее, например, так.
Пароль на архив: neobooker.ru

Кстати, "языковые" файлы могут быть как внешними, так и вложенными.
:wink:
Сколько людей столько и мнений . Мне кажется что Ваш пример неудобный , неудачный ( за счет использования подпрограмм , новички могут запутаться ) и трудоемкий . Но в любом случае каждый решит для себя какой из вариантов реализации ему применить мой или Ваш . В моем примере языковые файлы так же могут быть внешними , просто подкидываете свой файл lang.llf в папку с программой и она подхватит его ( даже в случае если программа запущена , просто нужно свернуть и развернуть окно программы ) :)
Image
InitteCig
Posts: 19
Joined: Sun Oct 28, 2012 11:44 am

Re: MUI

Post by InitteCig »

Зато мне хватило.
Решил скачать, только посмотреть из за чего спор. Скачал :)
за счет использования подпрограмм , новички могут запутаться
Кстати именно к подпрограммам нужно приучать новичков. Первым открыл ваш проект, и сразу был вопрос, почему не подпрограмма, ведь везде код один и тот же, а соответственно лишнее написание одного и того же кода. + размер дистрибутива увеличивается. + если надо что то поменять, то искать и менять придется везде. Это более трудоемко чем в одном месте, в подпрограмме.
А менять уже надо. Зачем

Code: Select all

FileRead "[PubDir]lang.llf" "2" "[MUI_VAR_2]"
FileRead "[PubDir]lang.llf" "3" "[MUI_VAR_3]" 
когда

Code: Select all

If "[MLLFE]" "=" "True"
???

Зачем Return?

Code: Select all

Else
AlertBox "[MUI_VAR_2]" "[MUI_VAR_3]"  
Return
Если после EndIf все равно нет никакого продолжения?

По логике должно быть примерно так для русского языка

Code: Select all

SetVar "[lang]" "RU"
GoSub "GoSub"
В подпрограмме GoSub

Code: Select all

ExtractFile "[PubDir]MUI\[lang].txt" "[PubDir]lang.llf"
FileExists "[PubDir]lang.llf" "[MLLFE]" 
If "[MLLFE]" "=" "True"
FileRead "[PubDir]lang.llf" "1" "[MUI_VAR_1]" 
Else
FileRead "[PubDir]lang.llf" "2" "[MUI_VAR_2]"
FileRead "[PubDir]lang.llf" "3" "[MUI_VAR_3]"
AlertBox "[MUI_VAR_2]" "[MUI_VAR_3]"   
EndIf
По поводу задержки для пароидальных антивирусников я как то сомневаюсь, но спорить не буду.

Code: Select all

Обычно код какой-либо рАзовой инициализации вставляют не не страницу, а в секцию StartUp проекта.
Я тоже разместил бы в этой секции, но ни как не в свойствах страницы.
Чисто логически, ни к чему выполнять код который не нужен.

Код Петра считаю более эфективным.
новички могут запутаться
В программировании должна быть логика.
Если будет желание, не запутаются. :)
Да и разбираться новичкам проще в одной подпрограмме, чем читать один и тот же код в каждой кнопке.

Да, и еще, я не понял почему
Файлы проэкта примера должны располагатся по пути C:\MUI_EXAMPLE\
а не

Code: Select all

[PubDir]MUI\
?

Или хотя бы в

Code: Select all

[TempDir]MUI\
Зачем учить людей сувать файлы неизвестно куда.
Лично меня вообще то напрягает когда после запуска чьих то проектов я обнаруживаю файлы в директории С:
Поубивал бы. :)
Phaniaameve
Posts: 13
Joined: Sun Oct 28, 2012 2:50 am

Re: MUI

Post by Phaniaameve »

Мои высказывания насчет StartUp были просто замечаниями-комментариями, а не критикой.
А по-поводу "параноидальности" антивирей вообще ничего не понятно.

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

К созданию многоязычных приложений приступают далеко не новички в NeoBook, а люди уже достаточно хорошо владеющие программой, которые просто обязаны уметь работать с подпрограммами и переменными.
Кстати, подпрограммы и задуманы были для избежания многократного написания одного и того же кода, и обладают ещё одной особенностью - они не привязаны к событиям объектов, и могут вызываться из любого объекта (скрипта) приложения.
Все это относится и к функциям, у которых достоинств больше, чем у подпрограмм.

Мой пример неудачный...
:lol:
Сравните количество строк кода, хотя бы!
Кроме того, в моем примере используется LoadVariables, которая...
Догадайтесь ЧЕМ отличается от FileRead...
:D

Собственно, все это я пишу только для того, чтобы потенциальные (гипотетические) новички, заглянувшие в эту тему, не впадали в заблуждение.
InitteCig
Posts: 19
Joined: Sun Oct 28, 2012 11:44 am

Re: MUI

Post by InitteCig »

И еще, по поводу задержки....
Задержка создает ощущение подвисания программы. Программа не реагирует ни на что. Иногда лучше использовать GotoLine.
Что бы не создавать вечный цикл на тот случай если файл был не найден, можно придумать еще какое нибудь страховочное действие.
Вообще то, антивирусники выдают сообщение если происходит действие с их стороны с каким либо файлом.
Скорей всего это может понадобиться для маломощных компьютеров. ;)
Phaniaameve
Posts: 13
Joined: Sun Oct 28, 2012 2:50 am

Re: MUI

Post by Phaniaameve »

Вот, что ещё надо заметить, справедливости ради.
Мой пример не является идеальным с точки зрения использования только подпрограмм (можно и на каждый пункт меню или на соответствующую кнопку повесить отдельный скрипт).
Но, вот что касается способа загрузки языковых значений, то тут уж без вариантов.
Phaniaameve
Posts: 13
Joined: Sun Oct 28, 2012 2:50 am

Re: MUI

Post by Phaniaameve »

mishem wrote:Скорей всего это может понадобиться для маломощных компьютеров. ;)
В любом случае, задержка не дает никакой гарантии, что код сработает.
User avatar
Snow_Irbis
Posts: 13
Joined: Thu Jul 14, 2011 7:46 am
Contact:

Re: MUI

Post by Snow_Irbis »

mishem wrote: А менять уже надо. Зачем

Code: Select all

FileRead "[PubDir]lang.llf" "2" "[MUI_VAR_2]"
FileRead "[PubDir]lang.llf" "3" "[MUI_VAR_3]" 
когда

Code: Select all

If "[MLLFE]" "=" "True"
???

Зачем Return?

Code: Select all

Else
AlertBox "[MUI_VAR_2]" "[MUI_VAR_3]"  
Return
Если после EndIf все равно нет никакого продолжения?
А Вы возьмите вникнете в код , тогда у Вас и не будет таких вопросов , ну а про Return это как "Слышь спичек не найдется ?"
mishem wrote: По логике должно быть примерно так для русского языка

Code: Select all

SetVar "[lang]" "RU"
GoSub "GoSub"
В подпрограмме GoSub

Code: Select all

ExtractFile "[PubDir]MUI\[lang].txt" "[PubDir]lang.llf"
FileExists "[PubDir]lang.llf" "[MLLFE]" 
If "[MLLFE]" "=" "True"
FileRead "[PubDir]lang.llf" "1" "[MUI_VAR_1]" 
Else
FileRead "[PubDir]lang.llf" "2" "[MUI_VAR_2]"
FileRead "[PubDir]lang.llf" "3" "[MUI_VAR_3]"
AlertBox "[MUI_VAR_2]" "[MUI_VAR_3]"   
EndIf
Image 1.При вот таком подходе ExtractFile "[PubDir]MUI\[lang].txt" "[PubDir]lang.llf" неизбежна ошибка File do not exist . Так как Вы пытаетесь вложить в проект файл не указав его явное имя , по этому и будет при компиляции попытка добавить файл [lang].txt которого как Вы наверное уже догадались нет . Ваш бы подход работал если бы Вы использовали команду FileCopy , а не ExtractFile ( кстати можете парировать что именно эту команду Вы и хотели использовать ) :D Ну а если Вы вдруг будете использовать FileCopy то Вам прийдется рядом с программой тягать языковый файлы , а в случае ExtractFile они будут вкомпилированны в программу , что значительно лучше в плане надежности :)

Image Image ( так как одного мало ) теперь разберем этот ( не побоюсь этого слова ) шедевр
mishem wrote:

Code: Select all

FileExists "[PubDir]lang.llf" "[MLLFE]" 
If "[MLLFE]" "=" "True"
FileRead "[PubDir]lang.llf" "1" "[MUI_VAR_1]" 
Else
FileRead "[PubDir]lang.llf" "2" "[MUI_VAR_2]"
FileRead "[PubDir]lang.llf" "3" "[MUI_VAR_3]"
AlertBox "[MUI_VAR_2]" "[MUI_VAR_3]"   
EndIf
Мы проверили доступность файла lang.llf , у нас случилось так что он недоступен , в моем варианте выведется сообщение что действие не удалось на языке который активен в данный момент , в Вашем же варианте программа попытается два раза обратится к несуществующему файлу ( что приведет к выводу сообщения о недоступности файла ) и только потом сообщит о том что действие не удалось . В случае если файл будет доступен то обновится значение только одной переменной [MUI_VAR_1] , а [MUI_VAR_2] и [MUI_VAR_3] останутся старыми , соответственно язык в них останется старым . В общем фейл на фейле у Вас в коде и никакой логики ( лучше уж сказать человеку об этом сразу и прямо , а не намеками ходить круг да около ) :)
mishem wrote:Да, и еще, я не понял почему
Файлы проэкта примера должны располагатся по пути C:\MUI_EXAMPLE\
а не

Code: Select all

[PubDir]MUI\
?

Или хотя бы в

Code: Select all

[TempDir]MUI\
Зачем учить людей сувать файлы неизвестно куда.
Лично меня вообще то напрягает когда после запуска чьих то проектов я обнаруживаю файлы в директории С:
Ну как Вам сказать , при компиляции программы файлы должны располагаться определенным образом по определенным путям ( после компиляции они не используются а извлекаются в папку с программой ). В моем примере архив необходимо распаковать в C:\MUI_EXAMPLE\ , в примере Peter архив надо распаковать в D:\1\My Projects\NEOBOOKER.RU\Проекты\MultiLangauge\ , если файлы проекта будут располагаться по другому пути то это вызовет ошибки , это известно и новичкам :D

В общем садитесь два , и по вечерам читайте Хелп :D !
mishem wrote:Код Петра считаю более эфективным.
Конечно извините меня за такую грубость , но мое ИМХО раз Вы запутались в моем простом коде , то код Peter Вы вряд ли осилили ( опять же мое ИМХО ) :)
mishem wrote:Если будет желание, не запутаются. :)
Да и разбираться новичкам проще в одной подпрограмме, чем читать один и тот же код в каждой кнопке.
Запутаются и еще как запутаются , Вы вон в пару строк кода заблудились :D а от новичков хотите глубоких познаний :)
mishem wrote:Поубивал бы. :)
Начните с себе :D
Image
User avatar
Snow_Irbis
Posts: 13
Joined: Thu Jul 14, 2011 7:46 am
Contact:

Re: MUI

Post by Snow_Irbis »

Peter wrote:Мои высказывания насчет StartUp были просто замечаниями-комментариями, а не критикой.
Да критикуйте , я только за , в спорах рождается истина :)
Peter wrote: и безопасный.
Чем мой пример опасный ?
Peter wrote: А по-поводу "параноидальности" антивирей вообще ничего не понятно.
Я возможно опишу данный момент когда у меня будет время . Мне пришлось долгое время писать в СП различных антивирусных вендоров с заявкой о ложном срабатывании , о ограничении прав программы и т.п. ( аж страшно вспомнить , но раньше на любую программу срабатывало 5-15 антивирусов ) .
Peter wrote: К созданию многоязычных приложений приступают далеко не новички в NeoBook, а люди уже достаточно хорошо владеющие программой, которые просто обязаны уметь работать с подпрограммами и переменными.
Ну почему же , мой вариант реализации мультиязычности сможет освоить даже новичек :)
Peter wrote:Мой пример неудачный...
:lol:
Сравните количество строк кода, хотя бы!
Кроме того, в моем примере используется LoadVariables, которая...
Догадайтесь ЧЕМ отличается от FileRead...
:D
Каждый из нас все равно останется при своем мнении , ну а пользователи которые захотят реализовать мультиязычноть сами решат какой из примеров им использовать :)
Peter wrote: Собственно, все это я пишу только для того, чтобы потенциальные (гипотетические) новички, заглянувшие в эту тему, не впадали в заблуждение.
Ок , теперь я 10 раз подумаю прежде чем постить какой то пример , а то введу еще кого то в заблуждение . Уж лучше буду читать Ваши примеры и комментировать :)
mishem wrote:И еще, по поводу задержки....
Задержка создает ощущение подвисания программы. Программа не реагирует ни на что.
250 мс это очень малая величина , Вы никак не ощутите ее :)
Image
InitteCig
Posts: 19
Joined: Sun Oct 28, 2012 11:44 am

Re: MUI

Post by InitteCig »

Короче, я особо не вникал что там в файле.
Взгляд мой упал на заранее в сущности не правильный код.
Разжевывать, у меня нет ни желания ни времени человеку который не хочет понять простых истин.
Считаете что так правильно да ради бога.
Хотя ладно, попробую еще раз.
Так как Вы пытаетесь вложить в проект файл не указав его явное имя
это вам ни о чем не говорит?

Code: Select all

SetVar "[lang]" "RU"
Как раз и получится

Code: Select all

ExtractFile "[PubDir]MUI\[b]RU[/b].txt" "[PubDir]lang.llf"
и если мне память не изменяет, то вообще достаточно указать имя извлекаемого файла без всяких путей.

А это

Code: Select all

FileRead "[PubDir]lang.llf" "2" "[MUI_VAR_2]"
FileRead "[PubDir]lang.llf" "3" "[MUI_VAR_3]"
на мой взгляд, вообще не нужно.
Но в моей голове прокрутилось что это текст присваивается переменным.
Здесь мое упущение, не вник.
Но при вашем раскладе, если файл существует, Else никогда не сработает.
Но если и сработает, то текст будет тот который присвоен по умолчанию. Тоесть русский.
Я англичанин, и мне до лампочки будет сообщение на русском.
А сообщение должно быть на том языке, который мне хотелось бы установить.
Отсюда через условие нужно присвоить переменным сообщение на нужном языке.

Мне этот пример совершенно не интересен. Отсюда на скорую руку и были выссказаны недостатки(на мой взгляд) как и сейчас.
Не сумел правильно донести? Да, это моя вина.
Но если бы человек захотел понять то о чем ему хотели сказать, он понял бы.
Я все, продолжения не будет.
Захотите понять, поймете. Нет, на нет и спроса нет.
InitteCig
Posts: 19
Joined: Sun Oct 28, 2012 11:44 am

Re: MUI

Post by InitteCig »

250 мс это очень малая величина , Вы никак не ощутите ее
В том то и дело что смысла в ее существовании нет.
Для антивиря - мало. ДДля медленного компа тоже.
Тогда зачем?
Locked