ES-DE/TRANSLATIONS.md
XargonWan 1167c4be41
feat/update 3.1.0 (#7)
* Added initial text shaping support

* Fixed some font issues

* (Windows) Added initial text shaping support

* (macOS) Added initial text shaping support

* Disabled building of HarfBuzz-subset on Windows and macOS

* (Android) Added initial text shaping support

* Added the nl_NL locale to locale/languages

* Changed the font VRAM usage calculation to actually only include texture data

* Moved the HarfBuzz segment building to a separate function

Also implemented segment caching and fixed an issue where missing glyphs were not handled correctly

* Moved the text shaping to a separate function

* Fixed a text shaping issue when there was a font change for the last character of a string

* Added support for the pl_PL locale

* Changed two font calculation functions to use shaped text

Also consolidated the HarfBuzz segment creation and shaping into a single function

* Added a hack to make shaped text wrap somehow correctly

* Changed the text shaping function to return the segment vector

* Text shaping segments are no longer created by space characters

* RTL text segments are now flagged as such

* Fixed an issue where text was not correctly centered after line breaks

* Reverted some font changes that were not needed after all

* Changed to having HarfBuzz set the horizontal glyph advance

* Fixed another failure mode for the wrapText shaped text hack

* Added a precaution to prevent crashes in case of broken fonts being used

* Made accurate text layout work correctly using HarfBuzz

* Removed the offensive wrapText hacks and added some optimizations

Also changed the three dots to an actual ellipsis Unicode character when abbreviating text

* Reverted a change in TextComponent as it caused unforeseen issues

* Changed Font::shapeText() to pass the segments vector by reference

* Removed a temporary member variable in Font and replaced it with proper argument passing

* Fixed a regression where text shaping stopped working

* Added sharing of glyph atlas entries between shaped glyph entries that need the same texture

* Added support for the ar_EG locale

* Some font-related code and comments cleanup

* Fixed a source file header typo

* Documentation update

* Removed a lot of unnecessary text processing

* Added the ICU library as a dependency

* (Android) Added the ICU library as a dependency

* (macOS) Added the ICU library as a dependency

* (Windows) Added the ICU library as a dependency

* (Windows) Fixed an MSVC compiler warning

* Replaced all built-in Unicode case conversion logic and lookup tables with facilities from the ICU library

* Documentation update

* Updated the pl_PL translations

* Added a menu title font size adjustment for the pl_PL translations

* Removed support for NetBSD and OpenBSD

* Changed a code comment that referred to BSD Unix

* Documentation update

* Silenced some Clang compiler warnings

* Added experimental support for building on Haiku

* (Haiku) Added a ScreenScraper platform identifier

* (Haiku) Added support for the Sony PlayStation Portable (psp) game system

* (Haiku) Added support for the ScummVM Game Engine (scummvm) game system

* Documentation update

* Updated the pl_PL translations

* Changed ScreenSaver to use TextComponent instead of using Font facilities directly

* Changed Window to use TextComponent instead of using Font facilities directly

* Changed ButtonComponent to use TextComponent instead of using Font facilities directly

* Changed SliderComponent to use TextComponent instead of using Font facilities directly

* Reverted ButtonComponent and SliderComponent to render the debug overlays themselves

* Changed DateTimeEditComponent to use TextComponent instead of using Font facilities directly

* Minor code cleanup

* Changed TextEditComponent to use TextComponent instead of using Font facilities directly

* Changed Font::buildTextCache() and Font::renderTextCache() to protected functions

* Changed a compiler silencing option to only apply to Clang

* (Haiku) Updated CMake configuration to make ES-DE build on Haiku Nightly (but no longer on R1/beta4)

* Documentation update

* (Haiku) Added find rule configuration for RetroArch

Also added a single core for testing purposes

* Removed direct use of Font::wrapText() from OptionListComponent, TextEditComponent and TextListComponent

* Removed direct use of Font::wrapText() from TextComponent

* Fixed an issue where ComponentList could generate elements with negative widths

* Added an assertion to GuiComponent::setSize() to check for negative mSize values

* DateTimeEditComponent no longer renders the debug overlay unless there is a string to display

* (FreeBSD) Added support for building with DEINIT_ON_LAUNCH

* (FreeBSD) Added the man page to the CPack configuration

* (FreeBSD) Added support for rebooting and powering off from inside ES-DE

* (FreeBSD) Added fallback method to locate binary

* Added layout and line wrapping support for shaped text and for mixing of LTR and RTL scripts

* Fixed a special line wrapping scenario where a trailing space should be removed

* (Windows) Fixed some MSVC compiler warnings

* Fixed some Clang compiler warnings

* Fixed an issue where theme names in the theme downloader could get abbreviated

* Added support for the ca_AD locale

* Documentation update

* (Android) Fonts and locales are now copied earlier than the other assets as HarfBuzz and libintl need them earlier in the startup process

* Documentation update

* Added support for the de_DE locale

* (Android) Added a new default find rule entry for Flycast as its application ID has been changed

* Documentation update

* Fixed an issue where text shaping could be permanently disabled after editing text

* Fixed a potential issue where globally disabling text shaping could cause space detection to fail

* Added a check for whether a text element has a width defined when the container property is set

* (Android) Changed ePSXe to use %ROM% instead of %ROMSAF%

* (Haiku) Added support for the PDF viewer

* Updated the el_GR.po, es_ES.po, fr_FR.po, it_IT.po, ja_JP.po, ru_RU.po and zh_CN.po locale files

* Documentation update

* (Haiku) Added correct installation directories to the CMake configuration

* (Haiku) Changed to correct installation directories

* (Haiku) Added support for the correct system resource directories

* (Haiku) Made sure es-pdf-convert is found under all circumstances

* Updated the fr_FR translations

* Updated the es_ES translations

* Updated the it_IT translations

* Added a menu title font size adjustment for the it_IT translations

* Updated the ja_JP translations

* Updated the zh_CN translations

* Fixed an issue where scraping using TheGamesDB would crash the application

* Added an extra check in OptionListComponent to avoid potential crashes

* Removed support for the ca_AD locale

* Added a code comment clarification in FileSystemUtil

* Updated the pl_PL translations

* Some minor code modernization in MameNames

* Fixed an issue where returning from a game would sometimes make the helpsystem use the dimmed theme properties

* (Haiku) Added a resource file

* Added a menu title font size adjustment for the de_DE translations

* (Haiku) Added support for some game systems

* (Haiku) Added a HaikuPorts recipe

* (Haiku) Fixed an URI issue in the HaikuPorts recipe

* Documentation update

* (Haiku) Added configuration for a number of game systems

* Updated the it_IT translations

* Documentation update

* (Haiku) Updated the srcGitRev value in the HaikuPorts recipe

* (Haiku) Added configuration for a number of game systems

* Documentation update

* (Haiku) Updated the srcGitRev value in the HaikuPorts recipe

* (Haiku) Added configuration for a number of game systems

* Documentation update

* (Haiku) Added configuration for a number of game systems

* Documentation update

* (Haiku) Updated the srcGitRev value in the HaikuPorts recipe

* Added basic configuration support and menu entries for theme localization

* Changed a theme loading debug message

* (linear-es-de) Fixed an issue where the system logo for saturnjp was incorrectly showing the western variant

* (modern-es-de) Fixed an issue where the system logo for saturnjp was incorrectly showing the western variant

* Updated the it_IT translations

* Added support for using language variables in the theme configuration

* Added localization support to DateTimeComponent

* Added translations for the automatic collection names when used as theme system variables

* Added localization support for the theme game counter

* Added theme contextual hinting to the custom collection summary text in CollectionSystemsManager

Also added translation support for a string that was previously missed

* Added localization support to the label entries in capabilities.xml

* Fixed a regression where horizontal text containers would sometimes not work correctly

* Fixed an issue where text elements defined as gamecount using the systemdata property could not scroll horizontally

* Added support for including theme files from within the colorScheme and fontSize tag pairs

* Added translations for the automatic collection names (short name versions) when used as theme system variables

* Fixed an incorrect code comment in CollectionSystemsManager

* Added translations for the name and fullname systemdata properties for the text element

* Added translation support for the metadata property for the text element

* Updated all locale (.po) files with the theme engine localization additions

* (linear-es-de) Added translations for en_US, en_GB and sv_SE

* Documentation update

* Updated the fr_FR translations

* (linear-es-de) Added translations for fr_FR

* Updated the ja_JP translations

* Updated the zh_CN translations

* (modern-es-de) Added translations for en_US, en_GB, fr_FR and sv_SE

* Updated the es_ES translations

* Updated the ro_RO translations

* (linear-es-de) Added translations for es_ES

* (linear-es-de) Added translations for ro_RO

* (slate-es-de) Added translations for en_US, en_GB and sv_SE

* (linear-es-de) Updated the es_ES translations

* (modern-es-de) Updated the fr_FR translations

* (linear-es-de) Some minor translation changes

* (modern-es-de) Added translations for ro_RO

* (slate-es-de) Added translations for ro_RO

* Updated the it_IT translations

* Updated the pt_BR translations

* (linear-es-de) Added translations for it_IT

* (modern-es-de) Decreased the helpsystem entry spacing

* (modern-es-de) Added translations for es_ES and it_IT

* (slate-es-de) Added translations for es_ES, fr_FR and it_IT

* (linear-es-de) Added translations for pt_BR

* (modern-es-de) Added translations for pt_BR

* (slate-es-de) Added translations for pt_BR

* (Haiku) Added support for the c64, plus4 and vic20 systems

* Documentation update

* (Haiku) Updated the srcGitRev value in the HaikuPorts recipe

* Updated SDL to 2.30.6 on Android, Windows, macOS and the Linux AppImage builds

* Added an ICU filter configuration file

* (macOS) Reduced the ICU library size via a data filter file

* (Windows) Reduced the ICU library size via a data filter file

* Updated the ru_RU translations

* (linear-es-de) Added translations for ru_RU

* (modern-es-de) Added translations for ru_RU

* (slate-es-de) Added translations for ru_RU

* Added a menu title font size adjustment for the ru_RU translations

* Removed an unnecessary element resize in ScrollableContainer

* Fixed a line breaking issue

* Added theme engine translations for 'unknown' metadata values for developer, publisher, genre and players

* Added theme engine translations for 'never' and 'unknown' date values

* (linear-es-de) Added translations for ja_JP and zh_CN

* (modern-es-de) Added translations for ja_JP and zh_CN

* (slate-es-de) Added translations for ja_JP and zh_CN

* Updated all locales with new theme engine translations

* Fixed an issue where the text element defaultValue property no longer worked correctly

* (modern-es-de) Added some capitalized default metadata values

* Documentation update

* pdated the el_GR translations

* (linear-es-de) Updated the system metadata

* (linear-es-de) Added sv_SE translations for all system hardware types

* Updated the de_DE translations

* Updated the pl_PL translations

* Bundled the July 2024 release of the Mozilla TLS/SSL certificates

* Updated the MAME index files to include ROMs up to MAME version 0.269

* (linear-es-de) Added translations for pl_PL

* Added the VirtualXT RetroArch core as an alternative emulator for the dos and pc systems

* Added the Stella 2023 RetroArch core as an alternative emulator for the atari2600 system

* Removed support for the ar_EG, de_DE, el_GR and nl_NL locales and moved their .po files to an archive directory

* Documentation update

* (modern-es-de) Added translations for pl_PL

* (slate-es-de) Added translations for pl_PL

* Updated SDL to 2.30.7 on Android, Windows, macOS and the Linux AppImage builds

* Updated the fr_FR translations

* Added support for the new Lime3DS binary names on Linux, macOS and Windows

* Added some missing find rules for Lime3DS

* (Windows) Added 'Shortcut' as an alternative emulator for the switch system

Also added the .lnk file extension

* Added jgenesis as an alternative emulator for the famicom, gamegear, gb, gbc, genesis, mastersystem, megacd, megacdjp, megadrive, megadrivejp, nes, segacd, sfc, snes and snesna systems on Linux and Windows

* Documentation update

* Added izapple2 standalone as an alternative emulator for the apple2 system on Linux and Windows

* (Android) Added support for the Microsoft Windows (windows) game system using the Winlator emulator

* (Android) Added Winlator PRoot Cmod standalone as an alternative emulator for the windows system

* Documentation update

* (Android) Added support for the PC Arcade Systems (pcarcade) and Taito Type X (type-x) game systems

* Bumped the version to 3.1.0

* (modern-es-de) Eliminated an annoying debug message

* (linear-es-de) Added some missing metadata files

* (linear-es-de) Added some missing sv_SE translations

* Updated the Winlator emulator names

* Documentation update

* Documentation update for the 3.1.0 release

* Updated latest_release.json for the 3.1.0 release

* Fixed a typo in the changelog

* Documentation update

* (Haiku) Updated the srcGitRev value in the HaikuPorts recipe

* Bumped the version to 3.1.1-alpha

* Video player resources are now completely freed up after finishing view transitions

* Changed a rounding in ScrollableContainer to slightly decrease the risk of glyphs getting cut off at the bottom of the container

* Added the Nanum Square Neo Korean font

* Added support for the ko_KR locale

* Fixed an issue where newly entered ScreenScraper username and password values were positioned incorrectly vertically in the account settings menu

* Documentation update

* Changed the position of the ko_KR language

* Changed the ja_JP position in the languages file

* Fixed an issue where attempting to view media for a game that had no downloaded media paused the playback of all static theme videos

* Documentation update

* Added support for the de_DE locale

* Updated the fr_FR translations

* Documentation update

* Updated the de_DE translations

---------

Co-authored-by: Leon Styhre <leon@leonstyhre.com>
2024-09-18 02:23:26 +02:00

14 KiB

ES-DE Frontend - Translations

This document is intended for translators who want to contribute localizations to ES-DE.

Table of contents:

[[TOC]]

Introduction

ES-DE has full localization support which means it can be translated to different languages. Adding support for a new locale does however require some minor code changes, so if you're interested in translating to a new locale you need to request support for it first. The best approach is to join our Discord server where we have a dedicated translations channel:

https://discord.gg/42jqqNcHf9

Translation updates are handled manually via this Discord server. As some translators are not familiar with using tools such as Git it was deemed simplest to coordinate all translations there. It means you can upload your translations to the channel and they will be incorporated into the ES-DE source repository.

ES-DE is released under the MIT license which is a permissive license that allows commercial use. Any translation work will as such be MIT licensed too. This is clearly indicated in the .po message catalog files that are used as the basis for the translation work. By contributing translations to ES-DE you'll also agree to transferring your copyright to the project and its owning company Northwestern Software AB. The copyright owner is also clearly indicated in the .po message catalog files.

High level approach

There are two types of translations in ES-DE, the first one is specific to Android and contains strings for the onboarding configurator and the second is using gettext and libintl to provide translations to the overall application.

The Android-specific part is quite limited with only a few strings. You can find the latest English version of this file here:

https://gitlab.com/es-de/emulationstation-de/-/blob/master/locale/android_strings.xml

There is not much more to it when it comes to these strings, just translate them and provide the XML file via Discord and they will be added to the Android release.

However the overwhelming majority of the translations are done using gettex/libintl, and the way this works is via so-called message catalog files where there's one such file per supported locale. When adding support for a new locale such a file will be added to the ES-DE repository. These files which have the .po file extension (for Portable Object) can be found here:

https://gitlab.com/es-de/emulationstation-de/-/tree/master/locale/po

Note that all .po files are named after the locale. This is always in the form of language code plus country code. For example sv_SE.po where sv is the language code for Swedish and SE is the country code for Sweden. There are often country-specific variations. For example there's also an sv_FI locale for Swedish (Finland). If you want to add translations for a specific locale such as German (Austria) or English (United Kingdom) then this is therefore possible.

When using ES-DE the specific locale you have configured in your operating systems will be searched for and applied, and if this does not exist then the default locale for your language will be selected such as falling back to sv_SE if you have sv_FI set as your language. If there is no support at all for your language then a fallback will take place to the default application language English (United States).

You can test your translations quite easily as explained later in this document, and when you want to have your updates added to the ES-DE repository you can share the updated .po file in the Discord server.

When working on translations it's also a good idea to refer to existing translations for other languages as they may provide useful insights for best approaches and such.

Tools

It's highly recommended to use Poedit when working on translations. This tool is free and open source and is available on Linux, macOS and Windows:

https://poedit.net

Poedit can also compile the .mo files needed by ES-DE to apply the actual translations, so it's required in order to test your translations (unless you use the gettext utilities directly to compile the .mo file).

Translations in practice

When support has been added to ES-DE for a certain language a corresponding .po file will be added to the ES-DE repository at the following location:

https://gitlab.com/es-de/emulationstation-de/-/tree/master/locale/po

You simply download this file and open it in Poedit to start working on your translations.

The way gettext works is that there's a pair of msgid and msgstr entries per text string, and these will be presented as such inside Poedit. The msgid string is the literal string in the default English (United States) locale as it's presented inside ES-DE. There is a slight exception for hinting as explained later in this document but in general you simply see the literal text that needs translations and then you add your own translation following this. An entry inside the .po file would look something like this:

msgid "Permission problems?"
msgstr "Åtkomstproblem?"

This is for the Swedish translation in the sv_SE.po file.

In addition to this some strings contain a format specifier. This makes it possible to define where a certain value should be placed inside a string. As the order of words differ between languages this is important. But most often it's simply used to parse the actual string that will be visible inside the application. Here's an example to clarify:

#, c-format
msgid "ERROR LAUNCHING GAME '%s' (ERROR CODE %i)"
msgstr "KUNDE INTE STARTA SPELET '%s' (FELKOD %i)"

The amount and types of format specifiers in the translated msgstr string must match the source msgid string exactly, or otherwise you'll not be able to compile to .po file and your translations won't work.

Finally there are plural entries where there are different translations based on the numerical amount parsed into the string. The following example will select %i VALD if it's singular and %i VALDA if it's plural in Swedish, even though there is no distinction between the two in the English language:

#, c-format
msgid "%i SELECTED"
msgid_plural "%i SELECTED"
msgstr[0] "%i VALD"
msgstr[1] "%i VALDA"

If you're translating to a language where there is no distinction between the two then you simply set the same value for both entries. If using Poedit all this will be easily handled by the user interface where you'll have separate tabs for the singular and plural entries.

As a general remark the correct letter case is very important for the translated text. Although there are a few instances where text is for example automatically converted to uppercase, in most instances such conversions are not made. This means that in most cases the translated text will appear exactly as entered in the .po file. This approach provides maximum flexibility and of course a number of languages don't even have the concept of letter case so automatic case conversions wouldn't make sense.

Context information

As there is sometimes ambiguity regarding translated strings, such as the same word having different meanings depending on the context, there is contextual hinting added to a number of the translation strings. Similarly some strings may need short versions for some languages as they may otherwise not fit inside the user interface. For the latter it's really a per-case thing and you'll need to test your translations to see what fits inside the interface and what doesn't. If you need context information added for a string then bring it up in the Discord server and it will get added to the application.

If you are translating to a language with excessively long words (Swedish is such a language) then it may be required to adjust the overall font sizes in ES-DE for this specific language. At the moment this is only applicable to the menu titles as these are quite restricted in length. If you find that you're constantly running out of space for your text then bring it up in the Discord server and a font size adjustment can be made in ES-DE for your specific locale.

Here's an example of a context information that is applicable for the Swedish language:

msgid "COMPLETED"
msgstr "SLUTFÖRD"
msgctxt "metadata"
msgid "COMPLETED"
msgstr "KLARAT"

In general completed is translated as slutförd but for example when having played through an entire game (as indicated in the metadata editor for the game) the word klarat makes more sense. Although you could use slutförd for a completed game this sounds pretty strange in Swedish.

However the English translations for this would be identical as there is no real distinction there:

msgid "COMPLETED"
msgstr "COMPLETED"
msgctxt "metadata"
msgid "COMPLETED"
msgstr "COMPLETED"

Here's also an example of a short version string:

msgid "GAMES DEFAULT SORT ORDER"
msgstr "GAMES DEFAULT SORT ORDER"
msgctxt "short"
msgid "GAMES DEFAULT SORT ORDER"
msgstr "DEFAULT SORT ORDER"

The short version of this string was required as it would otherwise not fit inside the menu header. Note that short strings may only be required for some specific languages, so again you need to test it to see whether you actaully need to provide a short translation or not.

Whenever there's a msgctxt line for a message it will be clearly indicated in Poedit so it's very easy to work with this context information.

Fuzzy entries

Sometimes when changes are made to translation strings this will cause fuzzy entries to get added to the .po file. This means that gettext detected something has changed but is not sure what to do. In these cases the translator needs to make an explicit decision on how to handle the change. Using Poedit makes the whole process simple as each fuzzy entry is clearly indicated with a Needs Work flag in its user interface.

Say there was the following string in ES-DE:

msgid "THEME ASPECT RATIOS"
msgstr "TEMA BILDFÖRHÅLLANDEN"

And then it was decided that this should change to THEME ASPECT RATIO instead. When the corresponding code change was done, new .po files were also automatically generated for all languages and committed to the ES-DE repository. However as the string was changed slightly gettext marked it as fuzzy in the .po files, like so:

#, fuzzy
msgid "THEME ASPECT RATIO"
msgstr "TEMA BILDFÖRHÅLLANDEN"

When an entry is marked as fuzzy it's excluded when compiling the .po file, or in other words it's not getting translated at all.

In this case a slightly updated translation was required, but other times it simply needs to be marked as OK in Poedit. When marking a translation as OK in Poedit or when updating it, the fuzzy flag is removed and the end result would look something like the following for our example:

msgid "THEME ASPECT RATIO"
msgstr "TEMA BILDFÖRHÅLLANDE"

Continuous translations

As ES-DE is constantly worked on, translations also need continuous updates. When translation strings are updated or added they will be committed to the ES-DE repository, and such changes will also be discussed and communicated in the Discord server. As well sometimes major features may get added that require additional translation work. To check the status for your translations you can always download the latest .po file from here:

https://gitlab.com/es-de/emulationstation-de/-/tree/master/locale/po

If opening the file in Poedit it will tell you the percentage of translated messages, and if any entries are marked as fuzzy.

Testing your translations

You can have Poedit compile the binary .mo file whenever you save a .po file. The .mo file (for Machine Object) is what ES-DE actually uses to load the translations, i.e. the source .po file is not used when running the application. If not enabled for your setup then you can find this setting inside the Poedit Preferences screen, where it's named Automatically compile MO file when saving.

In order to have the .mo file loaded in ES-DE simply create the following directory in your ES-DE application data directory:

ES-DE/resources/locale/<locale code>/LC_MESSAGES

Then place your .po file there and open it using Poedit. Whenever you save the .po file the .mo file will get generated in the same directory, such as the following example:

ES-DE/resources/locale/sv_SE/LC_MESSAGES/sv_SE.mo
ES-DE/resources/locale/sv_SE/LC_MESSAGES/sv_SE.po

When there's an .mo file stored there it will override the bundled .mo file and ES-DE will use your local copy instead. This way you can easily test your own translations without having to build ES-DE from source code. Note that you need to restart ES-DE anytime you've compiled a new .mo file.

Also note that this will not work unless support for your language has already been explicitly added to ES-DE.

Theme translations

In addition to what has been described above there is translation work needed for the actual themes as well. Some portion of the text displayed by the theme engine comes from the application .po files (like the system view game counter and the custom collection summary), but most text is contained within each theme's configuration files.

So to have a fully translated experience it's important to work together with the theme developers so they can incorporate full localization support into their themes. There is also an official system metadata repository available for theme developers to easily include things like game system descriptions and various other information, and the goal is to have this translated to all languages as well.

This repository can be found here:
https://gitlab.com/es-de/themes/system-metadata

And here is a link to the language section of the theme engine documentation which contains some further relevant information:
THEMES.md

Discussions regarding theme translations are also covered in the ES-DE Discord server.