GNU gettext: Print string translated and untranslated at the same time

Richard Damon Richard at damon-family.org
Thu Aug 17 12:41:21 EDT 2023


> On Aug 17, 2023, at 10:02 AM, c.buhtz--- via Python-list <python-list at python.org> wrote:
> 
> X-Post: https://stackoverflow.com/q/76913082/4865723
> 
> I want to display one string in its original source (untranslated) version and in its translated version site by site without duplicating the string in the python source code?
> It wouldn't be a big deal if it is only one word.
> 
>    print('The translated string "{}" is originally "{}".'.format(_('Hello'), 'Hello'))
> 
> But in my situation it is a multi line string containing multiple paragraphs. It is a full text. I don't want to duplicate that string.
> 
>    # Imagine 'Hello' as a 50x70 characters multi line string.
>    original = 'Hello'
>    translated = _('Hello')
>    print('The translated string "{}" is originally "{}".'.format(translated, original))
> 
> I do use the "class based API" of GNU gettext. My current approach, which is not working, is to somehow (how!?) disable (or mask) the translation function "_()" temporarily.
> But as described in the stackoverflow question (see first line of this mail) this do not work.
> 
> def foobar(translate):
>    if not translate:
>        # I try to mask the global _() builtins-function
>        def _(txt):
>            return txt
> 
>    return _('Hello')
> 
> if __name__ == '__main__':
> 
>    # To ilustrate that _() is part of "builtins" namespace
>    print(_('No problem.'))
> 
>    print('The translated string "{}" is originally "{}".'
>          .format(foobar(True), foobar(False)))
> 
> This is the output:
> 
>    Traceback (most recent call last):
>      File "/home/user/ownCloud/_transfer/./z.py", line 27, in <module>
>        .format(foobar(True), foobar(False)))
>      File "/home/user/ownCloud/_transfer/./z.py", line 19, in foobar
>        return _('Hello')
>    UnboundLocalError: local variable '_' referenced before assignment
> 
> The full MWE can be found at stackoverflow (https://stackoverflow.com/q/76913082/4865723).
> 
> The question is if this can be solved somehow or if there is an alternative approach.
> The "_()" function is installed in the builtins namespace because of gettext class based API. This is nice.
> Maybe I can somehow manipulate that builtins namespace? I tried to import builtins and played around with it but couldn't find a way to do it.
> 
> Thanks
> Christian Buhtz
> 
> PS: This is IMHO not relevant for my question but if someone is interested the connection to productive code can be found in this issue: https://github.com/bit-team/backintime/issues/1473 There I describe what I want to achive and also provide a GUI mockup.
> -- 
> https://mail.python.org/mailman/listinfo/python-list

One thing to remember is that the _() function, which calls gettext doesn’t need a literal string, so you can set a variable to ‘raw’ string, and then translate it to another variable, so you can have both.


More information about the Python-list mailing list