Difference between revisions of "Making Audacity Translatable"

From Audacity Wiki
Jump to: navigation, search
(Existing link.)
Line 3: Line 3:
'''Useful Links:'''
'''Useful Links:'''
* [https://techbase.kde.org/Development/Tutorials/Localization/i18n_Mistakes KDE i18n Guidelines]
* [https://techbase.kde.org/Development/Tutorials/Localization/i18n_Mistakes KDE i18n Guidelines]
* [[Translating_Audacity/Writing_Translatable_Code]]

Revision as of 17:12, 4 January 2018

Some guidelines for developers to make Audacity source code translatable.

Useful Links:

Some languages prefer other punctuation conventions, such as «these» quotes, or such as leaving a space left of a colon -- Therefore:

  • Use _() even for a format like _("%s: %s") that contains only % slots and punctuation.

Some languages vary words contextually, for gender agreement or case, though this happens very little in English -- Therefore:

  • Avoid putting small isolated words into _() which you then substitute into a longer string.
    • Instead make longer phrases in _() containing words to be translated in context.
    • Do this even at the cost of repetitious code that defines more strings, varying only the short word inside a longer phrase

Some languages prefer different word order, such a Japanese with verbs last and postpositions rather than prepositions. -- Therefore:

  • Avoid composition of user-visible strings using contatentation (+ operator) of many single words and short phrases.
    • Use format substitutions instead to put words in place. Concatenate long phrases and clauses only.

For example:

AudacityMessageBox(_("Could not open file: ") + fileName); // wrong
AudacityMessageBox( wxString::Format( _("Could not open file: %s"), fileName )); // right

Some languages have more than two number forms of nouns (singular and plural); most of the Slavics have complicated case-agreement rules for various numerals, and Arabic has a dual. -- Therefore:

  • Use the wxPLURAL macro, which cooperates with the message catalog system, so that a language can provide more than two translations as appropriate, and the run-time lookup chooses the right one according to a number.

For example:

 // wrong:
 auto format = iHours == 1 ? _("%d hour") : _("%d hours");
 auto sHours = wxString::Format( format, iHours );

 // right:
 auto sHours =
    wxString::Format( wxPLURAL("%d hour", "%d hours", iHours), iHours );

In general,
  • Substitute only names and numbers into translated formats, not results of other translations.
There remain some difficult cases where that rule must be relaxed.