Cloud Cloud

Iva Horn

Notes from a software engineer for iPhone, iPad and Mac apps.

Memoji

German Nextcloud Localizations

March 3, 2025 • #GitHub #Localization #Nextcloud #Transifex

While opening a pull request to fix a minor issue in the localization process of the Nextcloud Notes app for iOS I learned why de localizations must be overwritten with de_DE.

Most software projects aggregate some level of technical debt at some point, I guess. When companies and products are established since years and you are new to them, some things may appear odd. Some things are obvious technical debt, some things choices which turned out to have not that great consequences and some things are anything but obvious. This is about the last kind where past time choices are not explicable straight forward at first sight.

Localizations in the iOS apps of Nextcloud are regularly and automatically updated from Transifex. This is implemented as a shell script run in a Docker container. The script I had to update because one command lacked a short argument did something that caught my attention. It was removing all localizations for the de locale and renaming the de_DE localization to de instead. At first, I did not notice that both are set up and available on Transifex for the Nextcloud projects. I only saw the de and assumed those script commands to be obsolete. But they are not.

Nextcloud offers an informal (“Du”) and formal (“Sie”) German localization. That was a choice made long ago. Personally, I always liked this detail because I like software having a more relaxed language and not sounding like a tax refund form. But locale codes are all about language and region and there is no standardized way to distinguish these different localizations as necessary. At least none that I am aware of. While on Nextcloud server this all works fine, the freedom of choosing the active localization for an iOS app is more restricted. iOS offers only valid general languages (like de) or their regional variants (like de_DE). There is no control how the choice is displayed either. It’s either “German” or “German (Germany)”, not “German (informal)” or “German (formal)”. Hence it is necessary to settle on one.

To retain consistency across projects and products on Transifex to not make life harder for translators, the localizations are set up the same way everywhere. The difference for the iOS apps is: de is not used, only de_DE because the formal localization is the chosen one. But the specificity prevents iOS to pick it also for other locales like de_CH or de_AT. Hence it must take the place of de within the Xcode project to be available for all users using a German locale regardless of country.