diff --git a/README.localization b/README.localization index 52280f95bb..2f77eec430 100644 --- a/README.localization +++ b/README.localization @@ -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}" diff --git a/src/support/Messages.cpp b/src/support/Messages.cpp index ea6ec0dc57..5c8d45fd8f 100644 --- a/src/support/Messages.cpp +++ b/src/support/Messages.cpp @@ -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; } }