For more information, see https://gitlab.com/xonotic/xonotic/-/wikis/Translating How to make the .po template: find . -type f -not -name \*.po -not -name \*.txt | xgettext -LC -k_ -f- --from-code utf-8 How to compare the .po template against a language file: msgcmp ../../menu.dat.de.po messages.po How to merge the .po template into a language file: msgmerge -U ../../menu.dat.de.po messages.po Guideline: - do NOT translate strings in error() messages, or in dprint()! - delete obviously useless developer prints while at it - change obvious developer prints from print to dprint (even in comments), unless in developer-only functions (e.g. *dumptree*) - mark translatable strings with _() - if a translatable string is a strcat monster, change it to sprintf - if code loads files with text, use language_filename() - interesting vim macros: :map # /" :map ' i_(2f"a)/" :map " F"isprintf(_(%i), )i Unresolved TODO: - translated campaigns