Author Topic: Multilingual GUI  (Read 2194 times)

Biterider

  • Moderator
  • Member
  • *****
  • Posts: 1082
  • ObjAsm Developer
    • ObjAsm
Re: Multilingual GUI
« Reply #15 on: November 16, 2022, 07:26:30 AM »
Hi
I'm starting to get something to work with. Now I pass a hint to the translation procedure:
Code: [Select]
CStr SrcLang, "en"
CStr DstLang, "de"

.code
start proc                                              ;Program entry point
  SysInit                                               ;Runtime initialization of OOP model
  DbgClearAll

  OCall $ObjTmpl(Application)::Application.Init         ;Initialize application
  invoke TranslateText, offset DstLang, offset SrcLang, $OfsCStr("File"), $OfsCStr("Menu")
  DbgStrW xax
  invoke TranslateText, offset DstLang, offset SrcLang, $OfsCStr("Open File"), $OfsCStr("Menu")
  DbgStrW xax
  invoke TranslateText, offset DstLang, offset SrcLang, $OfsCStr("Open"), $OfsCStr("Menu")
  DbgStrW xax
  invoke TranslateText, offset DstLang, offset SrcLang, $OfsCStr("Save"), $OfsCStr("Menu")
  DbgStrW xax
  invoke TranslateText, offset DstLang, offset SrcLang, $OfsCStr("Save as..."), $OfsCStr("Menu")
  DbgStrW xax
  invoke TranslateText, offset DstLang, offset SrcLang, $OfsCStr("Print"), $OfsCStr("Menu")
  DbgStrW xax
  invoke TranslateText, offset DstLang, offset SrcLang, $OfsCStr("Exit"), $OfsCStr("Menu")
  DbgStrW xax
  invoke TranslateText, offset DstLang, offset SrcLang, $OfsCStr("Language"), $OfsCStr("Menu")
  DbgStrW xax
  invoke TranslateText, offset DstLang, offset SrcLang, $OfsCStr("English"), NULL
  DbgStrW xax
  invoke TranslateText, offset DstLang, offset SrcLang, $OfsCStr("Spanish"), NULL
  DbgStrW xax
  invoke TranslateText, offset DstLang, offset SrcLang, $OfsCStr("Portuguese"), NULL
  DbgStrW xax
  invoke TranslateText, offset DstLang, offset SrcLang, $OfsCStr("Italian"), NULL
  DbgStrW xax
  invoke TranslateText, offset DstLang, offset SrcLang, $OfsCStr("German"), NULL
  DbgStrW xax
  invoke TranslateText, offset DstLang, offset SrcLang, $OfsCStr("French"), NULL
  DbgStrW xax
  invoke TranslateText, offset DstLang, offset SrcLang, $OfsCStr("OK"), $OfsCStr("Button")
  DbgStrW xax
  invoke TranslateText, offset DstLang, offset SrcLang, $OfsCStr("Cancel"), $OfsCStr("Button")
  DbgStrW xax
  invoke TranslateText, offset DstLang, offset SrcLang, $OfsCStr("Search"), $OfsCStr("Button")
  DbgStrW xax

;  OCall $ObjTmpl(Application)::Application.Run          ;Execute application
  OCall $ObjTmpl(Application)::Application.Done         ;Finalize application

  SysDone                                               ;Runtime finalization of the OOP model
  invoke ExitProcess, 0                                 ;Exit program returning 0 to the OS
start endp

All results seem to be correct, at least for the languages I know
Code: [Select]
German
xax -> Datei
xax -> Datei öffnen
xax -> Öffnen
xax -> Speichern
xax -> Speichern unter...
xax -> Drucken
xax -> Beenden
xax -> Sprache
xax -> Englisch
xax -> Spanisch
xax -> Portugiesisch
xax -> Italienisch
xax -> Deutsch
xax -> Französisch
xax -> OK
xax -> Abbrechen
xax -> Suchen

Spanish
xax -> Archivo
xax -> Abrir archivo
xax -> Abrir
xax -> Guardar
xax -> Guardar como...
xax -> Imprimir
xax -> Salir
xax -> Idioma
xax -> Inglés
xax -> Español
xax -> Portugués
xax -> Italiano
xax -> Alemán
xax -> Francés
xax -> Aceptar
xax -> Cancelar
xax -> Buscar

Italian
xax -> File
xax -> Apri file
xax -> Apri
xax -> Salva
xax -> Salva con nome...
xax -> Stampa
xax -> Esci
xax -> Lingua
xax -> Inglese
xax -> Spagnolo
xax -> Portoghese
xax -> Italiano
xax -> Tedesco
xax -> Francese
xax -> OK
xax -> Annulla
xax -> Cerca

I can not check the correctness in other languages.
Maybe I can write a test application where other languages like Russian or Chinese can be selected and other forum members could check the results.

These are the results for now:
Code: [Select]
Russian
xax -> Файл
xax -> Открыть файл
xax -> Открыть
xax -> Сохранить
xax -> Сохранить как...
xax -> Печать
xax -> Выход
xax -> Язык
xax -> Английский
xax -> Испанский
xax -> Португальский
xax -> итальянский
xax -> Немецкий
xax -> Французский
xax -> ОК
xax -> Отмена
xax -> Искать

Simplified Chinese
Work in progress... :-)


Biterider

Biterider

  • Moderator
  • Member
  • *****
  • Posts: 1082
  • ObjAsm Developer
    • ObjAsm
Re: Multilingual GUI
« Reply #16 on: November 16, 2022, 07:42:14 AM »
Code: [Select]
Traditional Chinese
xax -> 文件
xax -> 打開文件
xax -> 打開
xax -> 保存
xax -> 另存為...
xax -> 打印
xax -> 退出
xax -> 語言
xax -> 英語
xax -> 西班牙語
xax -> 葡萄牙語
xax -> 意大利語
xax -> 德語
xax -> 法語
xax -> 確定
xax -> 取消
xax -> 搜索

Biterider

learn64bit

  • Member
  • **
  • Posts: 188
Re: Multilingual GUI
« Reply #17 on: November 16, 2022, 07:46:59 AM »
Simplified(cn) - Traditional(tw)
开 - 開
为 - 為
语 - 語
确 - 確

Biterider

  • Moderator
  • Member
  • *****
  • Posts: 1082
  • ObjAsm Developer
    • ObjAsm
Re: Multilingual GUI
« Reply #18 on: November 16, 2022, 07:56:18 AM »
Thanks learn64bit
I mixed the chinese language definitions. I corrected the above post.
The result for simplified chinese is

Code: [Select]
xax -> 文件
xax -> 打开文件
xax -> 打开
xax -> 保存
xax -> 另存为...
xax -> 打印
xax -> 退出
xax -> 语言
xax -> 英语
xax -> 西班牙语
xax -> 葡萄牙语
xax -> 意大利语
xax -> 德语
xax -> 法语
xax -> 确定
xax -> 取消
xax -> 搜索

Code: [Select]
Hindi
xax -> फ़ाइल
xax -> फ़ाइल खोलें
xax -> खोलें
xax -> सहेजें
xax -> इस रूप में सहेजें ...
xax -> प्रिंट
xax -> बाहर निकलें
xax -> भाषा
xax -> अंग्रेज़ी
xax -> स्पैनिश
xax -> पुर्तगाली
xax -> इतालवी
xax -> जर्मन
xax -> फ्रेंच
xax -> ठीक है
xax -> रद्द करें
xax -> खोज

Code: [Select]
Japanese
xax -> ファイル
xax -> ファイルを開く
xax -> 開く
xax -> 保存
xax -> 名前を付けて保存...
xax -> 印刷
xax -> 終了
xax -> 言語
xax -> 英語
xax -> スペイン語
xax -> ポルトガル語
xax -> イタリアの
xax -> ドイツ人
xax -> フランス語
xax -> OK
xax -> キャンセル
xax -> 検索


Biterider


Biterider

  • Moderator
  • Member
  • *****
  • Posts: 1082
  • ObjAsm Developer
    • ObjAsm
Re: Multilingual GUI
« Reply #19 on: November 16, 2022, 06:49:32 PM »
Hi all
I ask those members who are fluent in the languages of the above posts to check that the translations are correct.
It would help me a lot to verify that the hints are working as intended.

Many thanks.  :thumbsup:

Biterider

Biterider

  • Moderator
  • Member
  • *****
  • Posts: 1082
  • ObjAsm Developer
    • ObjAsm
Re: Multilingual GUI
« Reply #20 on: November 18, 2022, 06:45:25 PM »
Hi
When translating a bunch of single words one after the other, the overall process is slow.
For this reason I am changing the strategy, collecting the words first and sending them all together in a single request. This means the response has to be parsed, but I think the speed gain is worth the effort.

Biterider

Biterider

  • Moderator
  • Member
  • *****
  • Posts: 1082
  • ObjAsm Developer
    • ObjAsm
Re: Multilingual GUI
« Reply #21 on: November 19, 2022, 06:03:51 AM »
Hi
Bad news...  :sad:
The free service seems to have some limitations: it can not process multiple lines at the same time.
It is designed to translate single sentences.

We have to live with it, which isn't a major problem for the current goal.


Biterider

Biterider

  • Moderator
  • Member
  • *****
  • Posts: 1082
  • ObjAsm Developer
    • ObjAsm
Re: Multilingual GUI
« Reply #22 on: November 20, 2022, 09:13:32 PM »
Hi
As a proof of concept, I wrote a demo application that changes the main menu based on a user selection.
Alternatively, the machine locale could be used, but the demo was written to show their online translation capabilities.
Once a language has been selected via the "Languages" submenu (this submenu is intentionally excluded from the translation, preserving the native language names), a nice throbber will appear (only if the OS version is >= 8) while the translation is in action.  :cool:
The final result is saved in a file, so that the next time the application is started, the last translation is immediately active.

For this demo I randomly selected only 10 languages from Google's list. It currently contains more than 90 languages.

Since the application resource section is filled with a large amount of throbber images, its size exceeds the upload limit of the forum. The application can be downloaded from GitHub using the following link https://github.com/ObjAsm/ObjAsm-C.1/raw/master/Projects/X/Multilingual%20GUI/ML_GUI.exe

The complete source code is also available on GitHub, but the original idea and code is posted above.
The code for single translations can be found in the attachment.

Biterider

HSE

  • Member
  • *****
  • Posts: 2491
  • AMD 7-32 / i3 10-64
Re: Multilingual GUI
« Reply #23 on: November 21, 2022, 12:07:57 AM »
Hi Biterider!

application resource section is filled with a large amount of throbber images

Nice, but to much. In Win7 (without throbber) translation is instantaneus.  :thumbsup:

The complete source code is also available on GitHub

I cloned full repository in High Contrast machine.

Look fantastic. Still some dynamic layout metric is not perfect, because there are some superpositions (1 to 3 pixels, or so).

Object Explorer don't work. I was thinking I brokened that, but apparently wasn't me this time  :biggrin:

HSE
Equations in Assembly: SmplMath

jj2007

  • Member
  • *****
  • Posts: 13932
  • Assembly is fun ;-)
    • MasmBasic
Re: Multilingual GUI
« Reply #24 on: November 21, 2022, 12:08:44 AM »
No throbber on Win7-64, as expected, but the translation works fine, with a 3 second delay :thumbsup:

Biterider

  • Moderator
  • Member
  • *****
  • Posts: 1082
  • ObjAsm Developer
    • ObjAsm
Re: Multilingual GUI
« Reply #25 on: November 21, 2022, 04:43:38 AM »
Hi
Thanks for testing  :cool:

@HSE:
Knowing that a good friend uses HC, I invested some time to add some improvements :biggrin:
Can you send me a screenshot of the "dynamic layout" issue? It will help a lot to pinpoint the problem.
It may be that the ObjectExplorer is confused because I uploaded the file ObjAsm\code\OA_Info.stm which contains information about my own system. Try deleting the file and restarting the application.
I'll remove this file from GitHub too.

@JJ:
The few seconds delay is due to the running of the online service. It's not related to the application itself. I tried using a batch approach but it didn't work. Maybe sending multiple requests at once can solve the problem.
Since I haven't had any more time so far, I've installed the Throbber, which makes those few seconds go by much faster.  :rolleyes:

Biterider

jj2007

  • Member
  • *****
  • Posts: 13932
  • Assembly is fun ;-)
    • MasmBasic
Re: Multilingual GUI
« Reply #26 on: December 03, 2022, 03:28:08 AM »
As a proof of concept, I wrote a demo application that changes the main menu based on a user selection.

Hi Biterider,

News from my own baby, with now about 700 translations :cool:

daydreamer

  • Member
  • *****
  • Posts: 2393
  • my kind of REAL10 Blonde
Re: Multilingual GUI
« Reply #27 on: December 10, 2022, 08:56:36 PM »
I have interest in foreign languages, so i downloaded language packs,for example japanese, would it be possible to get info from language pack instead?
Or some way to find windows data somewhere it keeps native meny texts?
.cpp for example in resource file dialogs for file, help,about box is kept there
So swedish version programs probably keep it there or indirect loads it from other files
@JJ
Fluent in x86,x64,German, Italian I guess  :greenclp:
my none asm creations
http://masm32.com/board/index.php?topic=6937.msg74303#msg74303
I am an Invoker
"An Invoker is a mage who specializes in the manipulation of raw and elemental energies."
Like SIMD coding

TimoVJL

  • Member
  • *****
  • Posts: 1317
Re: Multilingual GUI
« Reply #28 on: December 10, 2022, 10:55:20 PM »
EnumUILanguagesA function (winnls.h)

Quote
In the registry is this

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\MUI\UILanguages\en-US]
"LCID"=dword:00000409
"Type"=dword:00000091

Some experiments:
https://forum.pellesc.de/index.php?topic=5324.msg20459#msg20459
Code: [Select]
void SetLang(HWND hwnd, LANGID lid)
{
typedef LANGID (WINAPI *fnSetThreadUILanguage) (LANGID wReserved);
HMENU hMenu;
if ((GetVersion() & 0x00FF) > 5) // Vista =>
{
fnSetThreadUILanguage fnPtr = (fnSetThreadUILanguage)GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "SetThreadUILanguage");
if (fnPtr)
(*fnPtr) (lid);
} else
SetThreadLocale(MAKELCID(lid, SORT_DEFAULT));
hMenu = GetMenu(hwnd);
SetMenu(hwnd, NULL);
DestroyMenu(hMenu);
hMenu = LoadMenu(GetModuleHandle(NULL), MAKEINTRESOURCE(2001));
SetMenu(hwnd, hMenu);
}
Is this, what you was after ?
May the source be with you

jj2007

  • Member
  • *****
  • Posts: 13932
  • Assembly is fun ;-)
    • MasmBasic
Re: Multilingual GUI
« Reply #29 on: December 12, 2022, 09:24:55 PM »
Hi Biterider,

You might find these interesting:

https://translatepress.com/deepl-vs-google-translate-comparison/

Quote
With both Google Translate and DeepL, you can translate up to 500,000 characters (not words) per month for free. This is 100% free forever. So as long as you stay under 500,000 characters per month, you could use either API for free.

https://blog.meinrad.cc/en/deepl-google-translate-not-all-machine-translation-engines-are-created-equal

Quote
The real difference between these two engines is in the technology they use. Both use neural networks, but Google Translate (like most other machine translation engines) uses what are known as recurrent neural networks. By contrast, DeepL uses convolutional neural networks (CNNs), which produce better all-round results for longer, continuous sequences of words. Although CNNs aren’t perfect, and so far haven’t been used by other machine translation providers, they process texts better in parallel and produce better translations as a result.