Difference between revisions of "Making Audacity Translatable"
From Audacity Wiki
(Existing link.) |
(Some corrections) |
||
Line 11: | Line 11: | ||
* Use _() even for a format like _("%s: %s") that contains only % slots and punctuation.}} | * 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: | + | Some languages vary words contextually, such as for '''gender agreement''' or case, though this happens very little in English -- Therefore: |
{{hint| | {{hint| | ||
* Avoid putting small isolated words into _() which you then substitute into a longer string. | * Avoid putting small isolated words into _() which you then substitute into a longer string. | ||
Line 17: | Line 17: | ||
** Do this even at the cost of repetitious code that defines more strings, varying only the short word inside a longer phrase}} | ** 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 | + | Some languages prefer different '''word order''', such as Japanese with verbs last and postpositions rather than prepositions. -- Therefore: |
{{hint| | {{hint| | ||
* Avoid composition of user-visible strings using contatentation (+ operator) of many single words and short phrases. | * Avoid composition of user-visible strings using contatentation (+ operator) of many single words and short phrases. | ||
Line 40: | Line 40: | ||
auto sHours = | auto sHours = | ||
wxString::Format( wxPLURAL("%d hour", "%d hours", iHours), iHours ); | wxString::Format( wxPLURAL("%d hour", "%d hours", iHours), iHours ); | ||
+ | |||
+ | Note that strings in the wxPLURAL macro must not be prefixed. The macro inserts wxT(). | ||
{{hint|In general, | {{hint|In general, | ||
* Substitute only names and numbers into translated formats, not results of other translations. | * Substitute only names and numbers into translated formats, not results of other translations. | ||
− | + | But there remain some difficult cases where that rule must be relaxed.}} |
Revision as of 11:37, 5 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, such as 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 as 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 );
Note that strings in the wxPLURAL macro must not be prefixed. The macro inserts wxT().
In general,
- Substitute only names and numbers into translated formats, not results of other translations.