When users are searching for software in GNOME Software it is very important to answer the the question “Is this localized in my language?” If you can only speak Swedish then an application talking just in American English is not much use at all. The way we calculate this in the AppStream builder is to look at the compiled .mo
files, breaking them apart and then using statistics to work out what locales are included.
When we’re processing distro packages we usually extract them one at a time. We first try for a gettext domain (the .mo
file name) of the distro package name, and if that’s not found then we just try and find the first .mo file in any of the locale directories. This works about 70% of the time (which is good) but fails about 30% of the time (which is bad). For xdg-app we build the application in a special prefix, along with any dependent libraries. We don’t have a distro package name for the bundle (only the application ID) and so the “first .mo file we can find” heuristic fails more often that it works. We clearly need some more information about the gettext domain from the upstream project.
AppData to the rescue. By adding this in the AppData file informs the AppStream generation code in the xdg-app builder what gettext domain to use for an application. To use this you just need to add:
<translation type="gettext">the_gettext_domain_here</translation>
under the <component>
tag. The gettext domain is normally set in the configure.ac
file with the GETTEXT_PACKAGE
define. If you don’t have this extra data in your application then appstream-util validate
is soon going to fail, and your application isn’t going to get the language metadata and so will be lower in the search results for users using GNOME Software in a non-C locale. If your GNOME application is available in jhbuild the good news is that I’ve automatically added the <translation>
tag to 104 projects semi-automatically today. For XFCE and KDE I’m going to be sending emails to the development mailing lists tomorrow. For all other applications I’m going to be using the <update_contact>
email address set in the AppData file for another mass-emailing.
Although it seems I’m asking people to do more things again and again I can assure you that slowly we’re putting the foundations in place for an awesome software installer experience. Just today I merged in the xdg-app branch into gnome-software and so I’m hoping to have a per-user xdg-app preview available in Fedora 24. Exciting times. :)
What the_gettext_domain_here do you want there?
Gnumeric has more than one.
In this case just use more than one translation tag; the tools support this already. Thanks!
And if my appdata.xml has no I should just add one right under the top-level element?
(I’d use ‘appstream-util validate’ to confirm my guess, but it fails due to “Not enough tags for a good description”, and I’ve no idea if it prints all errors, or if it stops after the 1st error, and I just can’t re-write the today.)
Your blog silently eats XML tags in the comments, and it has no preview.
This was supposed to say “has no LESS THAN SIGN component GREATER THAN SIGN I should” and “top-level LESS THAN SIGN application GREATER THAN SIGN element” and “rewrite the LESS THAN SIGN description GREATER THAN SIGN today”.
Yes, sorry, I’m just using the default wordpress options. If your AppData file has an <application> tag rather than a <component> tag this is fine (it’s the old syntax, but still very much supported) but you can easily upgrade your file using
appstream-util upgrade name-of-appdata.appdata.xml
which converts everything automatically.Could I suggest either AppData or it’s build be extended to indicate the translation percentage? For example, according to https://l10n.gnome.org/vertimus/gnome-calculator/gnome-3-18/po/ar , only 36% of the calculator’s strings have been translated to Arabic, and none of it’s User Guide has been.
I’d actually be surprised if most of the .mo files that ship weren’t incomplete.
The AppStream metadata does have <lang> tags with exactly this information in. The percentage actually corresponds to “how complete is the .mo file”.
Please keep in mind that running in a certain locale doesn’t mean that I don’t understand any other language. In smaller languages it is common to have a desktop with applications in multiple languages. Untranslated applications should still be easily visible and not outranked by any and all translated choices. I’d be very happy if you can share some details on exactly how this information is used for ranking.
The current code is here: https://git.gnome.org/browse/gnome-software/tree/src/gs-shell-search.c#n243
Thanks. I’m not seeing anything that looks related to translations. Is this part of what is returned by gs_app_get_search_sort_key ()?
Regardless, thanks for the work on this.
Yes, the app search key matches your current locale first, and then falls back to the C locale.
> If you don’t have this extra data in your application then
> appstream-util validate is soon going to fail, and your
> application isn’t going to get the language metadata
(a) What is the right thing to do if the application has no translations? (in order to avoid the appstream-util validate fail I mean, clearly the right thing to do to avoid dropping down the list is i18n).
(b) should add-ons do this too?
Good questions. For apps with no translations but wanting to validate I guess just acknowledging the fact should be enough, e.g. doing <translation/> — if that fails to validate let me know and I’ll fix it. If addons also include a <translation> tag that would be fine, but not required for the validator. I don’t know if it makes sense to “promote” or average out the addon language stats with the main app, but including the tag isn’t going to hurt anything.
Thanks! Yes the [translation/] single self-closing tag seems to validate (with appstream-glib as packaged in Fedora 23).
What about applications using a different translation system, e.g. Qt .qm files (Note that KDE applications typically DO use gettext, through kf5-ki18n, but some Qt applications do not want to depend on ki18n and prefer using the system Qt provides.), Java .properties translations, etc. (Some applications even make up their own translation system.)? Do you have any plans to not make those show up as “untranslated”?
I added support for the QT translation system this week, to use this just use <translation type=”qt”>id<translation> where the ID is the name before the locale eg id-en_GB.qm
If any app does something crazy (e.g. the eclipse system) you can always specify <lang> values in the AppData file as well, although this isn’t awesome as it requires you to manually update them.
Finally linux will have proper software deployment. Great work. However I quite don’t understand difference between xdg-app and Canonical’s Snappy, hope they are both different beasts.