translation context handling in vdr >= 1.5.7

Message ID 46CED532.1000405@cadsoft.de
State New
Headers

Commit Message

Klaus Schmidinger Aug. 24, 2007, 12:55 p.m. UTC
  On 08/23/07 13:48, Christian Wieninger wrote:
> Hi,
> 
> I just noticed a small change in the context handling of translations 
> since vdr-1.5.7. Till now it was possible to have e.g.
> 
> const char AllowedChars[] = trNOOP("$ 
> abcdefghijklmnopqrstuvwxyz0123456789-.,#~\\^$[]|()*+?{}/:%@&");
> 
> Note the 2 '$'. The first one only helps to have the second one in the 
> translation and not to be interpreted as context.
> 
> Previous implementations of I18nTranslate did only cut the context of 
> the english version. So the translation could look like this in i18n.c 
> or the po-files:
> 
>    // The allowed characters in strings:
>    { "$ abcdefghijklmnopqrstuvwxyz0123456789-.,#~\\^$[]|()*+?{}/:%@&",
>      " aäbcdefghijklmnoöpqrsßtuüvwxyz0123456789-.,#~\\^$[]|()*+?{}/:%@&",
>      " abcdefghijklmnopqrstuvwxyz0123456789-.,#~\\^$[]|()*+?{}/:%@&",
> ...
> 
> The current implementation cuts the translations too which results in
> 
> "[]|()*+?{}/:%@&"
> 
> Is this intended? If so, one could add the dummy '$' also at the 
> beginning of the translation, but has to handle this again for backwards 
> compatibility.
> 
> If it's not intended the following patch should give the previous behaviour:
> 
> --- vdr-1.5.8/i18n.c	2007-08-19 16:10:46.000000000 +0200
> +++ vdr-1.5.8-patched/i18n.c	2007-08-23 12:47:48.000000000 +0200
> @@ -208,10 +208,10 @@
>           t = dgettext(Plugin, s);
>        if (t == s)
>           t = gettext(s);
> -     s = t;
> +     return t;
>        }
> -  const char *p = strchr(s, '$');
> -  return p ? p + 1 : s;
> +  else
> +    return SkipContext(s);
>   }
> 
>   const char *I18nLocale(int Language)

gettext() may or may not return the original string, so if no translation
is found, the context needs to be stripped.

Please try this:




Klaus
  

Comments

Anssi Hannula Aug. 24, 2007, 1:37 p.m. UTC | #1
Klaus Schmidinger wrote:
> On 08/23/07 13:48, Christian Wieninger wrote:
>> Hi,
>>
>> I just noticed a small change in the context handling of translations 
>> since vdr-1.5.7. Till now it was possible to have e.g.
>>
>> const char AllowedChars[] = trNOOP("$ 
>> abcdefghijklmnopqrstuvwxyz0123456789-.,#~\\^$[]|()*+?{}/:%@&");
>>
>> Note the 2 '$'. The first one only helps to have the second one in the 
>> translation and not to be interpreted as context.
>>
>> Previous implementations of I18nTranslate did only cut the context of 
>> the english version. So the translation could look like this in i18n.c 
>> or the po-files:
>>
>>    // The allowed characters in strings:
>>    { "$ abcdefghijklmnopqrstuvwxyz0123456789-.,#~\\^$[]|()*+?{}/:%@&",
>>      " aäbcdefghijklmnoöpqrsßtuüvwxyz0123456789-.,#~\\^$[]|()*+?{}/:%@&",
>>      " abcdefghijklmnopqrstuvwxyz0123456789-.,#~\\^$[]|()*+?{}/:%@&",
>> ...
>>
>> The current implementation cuts the translations too which results in
>>
>> "[]|()*+?{}/:%@&"
>>
>> Is this intended? If so, one could add the dummy '$' also at the 
>> beginning of the translation, but has to handle this again for backwards 
>> compatibility.
>>
>> If it's not intended the following patch should give the previous behaviour:
[...]
> 
> gettext() may or may not return the original string, so if no translation
> is found, the context needs to be stripped.
[...]

For the record, gettext also has context support:
http://www.gnu.org/software/gettext/manual/gettext.html#Contexts

But if it needs too many changes, maybe it is not worth it.
  
Klaus Schmidinger Aug. 24, 2007, 1:48 p.m. UTC | #2
On 08/24/07 15:37, Anssi Hannula wrote:
> ...
> For the record, gettext also has context support:
> http://www.gnu.org/software/gettext/manual/gettext.html#Contexts
> 
> But if it needs too many changes, maybe it is not worth it.

I thought about that shortly, but decided not to use it.
There's not really too much to gain, and it would mean
we'd have to touch quite a few places.

Klaus
  
Christian Wieninger Aug. 27, 2007, 5:18 p.m. UTC | #3
Klaus Schmidinger wrote:
> gettext() may or may not return the original string, so if no translation
> is found, the context needs to be stripped.
> 
> Please try this:

sorry for the late response. gmx seemed to be blacklisted again ;)
Works like a charm.

BR,

Christian
  

Patch

--- i18n.c      2007/08/19 16:03:03     1.313
+++ i18n.c      2007/08/24 12:53:53
@@ -208,10 +208,10 @@ 
         t = dgettext(Plugin, s);
      if (t == s)
         t = gettext(s);
-     s = t;
+     if (t != s)
+        return t;
      }
-  const char *p = strchr(s, '$');
-  return p ? p + 1 : s;
+  return SkipContext(s);
 }

 const char *I18nLocale(int Language)