Implement the use of [[Context]] for placeholders

When placeholders are used, the context can indicate what will be
substituted for the placeholder (e.g. "%1$s[[date]], %1$s[[time]]).
This commit is contained in:
Vincent van Ravesteijn 2013-05-13 12:46:33 +02:00
parent b79c88034e
commit fec57fe959
2 changed files with 22 additions and 12 deletions

View File

@ -71,8 +71,9 @@ appear in your translations! Please take them exactly as they are or you may
experience crashes when running LyX.
[[Context]] is used to distinguish otherwise identical strings, which could
have different translations depending on the Context. [[Context]] appears only
in msgid string and should not be repeated in the translated version.
have different translations depending on the Context. It can also be used to
indicate what is substituted for a placeholder. [[Context]] appears only in
msgid string and should not be repeated in the translated version.
{} refer to counters and must not be translated. An example would be:
msgid "Algorithm \\arabic{theorem}"

View File

@ -34,17 +34,26 @@ void cleanTranslation(docstring & trans)
Some english words have different translations, depending on
context. In these cases the original string is augmented by
context information (e.g. "To:[[as in 'From page x to page
y']]" and "To:[[as in 'From format x to format y']]". This
means that we need to filter out everything in double square
brackets at the end of the string, otherwise the user sees
bogus messages. If we are unable to honour the request we
just return what we got in.
y']]" and "To:[[as in 'From format x to format y']]". Also,
when placeholders are used, the context can indicate what will
be substituted for the placeholder (e.g. "%1$s[[date]], %1$s
[[time]]). This means that we need to filter out everything
in double square brackets at the end of the string, otherwise
the user sees bogus messages. If we are unable to honour the
request we just return what we got in.
*/
size_t const pos1 = trans.find(from_ascii("[["));
if (pos1 != docstring::npos) {
size_t const pos2 = trans.find(from_ascii("]]"), pos1);
if (pos2 != docstring::npos)
trans.erase(pos1, pos2 - pos1 + 2);
static docstring const ctx_start = from_ascii("[[");
static docstring const ctx_end = from_ascii("]]");
while (true) {
size_t const pos1 = trans.find(ctx_start);
if (pos1 != docstring::npos) {
size_t const pos2 = trans.find(ctx_end, pos1);
if (pos2 != docstring::npos) {
trans.erase(pos1, pos2 - pos1 + 2);
continue;
}
}
break;
}
}