Remix.run Logo
Implementing UI translation in SumatraPDF, a C++ Windows application(blog.kowalczyk.info)
54 points by jandeboevrie 10 hours ago | 16 comments
nerdile 11 minutes ago | parent | next [-]

Since this is a Windows C++ app, why not use MUI? It solves this exact problem, and since it's a standard part of the platform, there's broad tooling support for it.

Kwpolska 7 hours ago | parent | prev | next [-]

> [gettext] also doesn’t solve the 2 hard problems. I would still have to write code to extract strings from source code and build a way to allow users to translate them easily.

The first problem is solved by the xgettext tool.

The second problem is solved by services like Transifex. Or by telling people to use Poedit and having them submit GitHub pull requests.

At the same time, gettext does solve the issue of plural forms. This solution does not.

bdhcuidbebe 3 hours ago | parent | next [-]

> The second problem is solved by services like Transifex.

Just wanted to mention another of those services, that I discovered by contributing translation work for the jellyfin project:

https://weblate.org/

The jellyfin status can be seen here:

https://translate.jellyfin.org/projects/jellyfin/

kevin_thibedeau 6 hours ago | parent | prev [-]

Poedit is a cross platform offline GUI that makes it easy for translators to incrementally perform their work. This was a whole lot of unnecessary NIH. Even if LGPL isn't viable, you could use all the tooling and reimplement the hashing in your own code.

https://poedit.net

bramblerose 7 hours ago | parent | prev | next [-]

The solution to the "interface/tooling to translate" problem, at least for open source applications, is https://translatewiki.net/ , with the additional benefit that it comes with a team of experts that can help you understand how to deal with stuff you might be unfamiliar with, such as RTL languages and plural forms.

cyco130 5 hours ago | parent | prev | next [-]

Internationalization and localization are extremely hard problems. I know because I worked as technical translator for sone years.

But, in C++ land, I had very good success with Qt and its translation system in one of my open source projects.

That was 2010’ish, there are probably better ways now bit I don’t know.

NooneAtAll3 8 hours ago | parent | prev | next [-]

Looking at strings in the linked apptranslator.org website, a lot of them have ampersands (&) e.g. "&Back" or "&Book View"

What do those mean?

Translations seem to put them in the middle sometimes

---

on the other hand, there are languages even with "0 untranslated strings" that have untranslated "unused strings" - what are those about, and is it okay to not have those be tracked?

mananaysiempre 8 hours ago | parent | next [-]

Windows convention for access keys (as opposed to keyboard shortcuts). E.g. you can choose &File > &Open by pressing Alt-F then O (as an alternative to Ctrl-O), with the requisite keys underlined when you press Alt; you can choose the dialog option labelled &Abort by pressing Alt-A, with the requisite key always underlined in the traditional Win32 toolkit. (By convention, OK and Cancel don’t get access keys, as you can always use Enter and Escape respectively instead.) Not every menu item gets a shortcut, but in a competently designed Windows UI every one gets an accelerator.

(This idea is nice but not without its problems. For those of us who regularly use more than one keyboard layout or even system locale, it doesn’t work all that well.)

neerajsi 8 hours ago | parent | prev | next [-]

Looks like the ampersands appear in menu items to indicate the keyboard shortcut key to navigate to that item.

https://willus.com/mingw/colinp/win32/resources/menu.html

ayi 8 hours ago | parent | prev | next [-]

When you press ALT on windows you will see that some characters on menu items are underlined. When you press alt and these letters you can open that menu. To indicate which character to act as that you put & before that.

godshatter 8 hours ago | parent | prev [-]

It's been a while, but that might mean that (in the example above) B is the shortcut key for that menu item.

rikafurude21 7 hours ago | parent | prev | next [-]

I had to implement multilingual UI for my app recently and the best method I found was using an LLM API inside a script which just runs on build and anytime a new text field gets added it gets the translations and stores it in a JSON where the right strings are picked based on system language or user settings. The annoying part was adjusting the entire UI to the new 'dynamic' string selection functionality but other than that, the tokens I had generated only cost maybe a dollar. I suggest the author looks into that, because waiting for user submissions could take some time

csb6 6 hours ago | parent [-]

An LLM isn’t going to provide a high quality translation because it doesn’t understand the context of what the string means in the UI, cultural conventions/writing styles, etc. You might as well run every string through Google Translate. Localization isn’t just a 1-to-1 translation of the text - it requires tailoring for each language that a human translator can do best.

on_the_train 9 hours ago | parent | prev [-]

I'm also trying to avoid the gettext monstrosity to be introduced into our c++ codebase after making equality great experiences with a self-build solution in previous teams. It's ok so solve easy problems by yourself. Good for the author for thinking for himself.

AndriyKunitsyn 7 hours ago | parent [-]

It is okay to solve easy problems by yourself. It is not okay to treat hard problems as easy problems because you lack domain knowledge.

Compared to gettext, OP's solution doesn't have positional formatting or support for additional plural forms.

on_the_train 3 minutes ago | parent [-]

Yup, it's a matter of understanding your scope. Positional formatting is pretty easy to add. But plural forms is where complexity explodes