Hi Peter

Your code worked, but I did some changes. First of all: I decided that I don't 
really needed to pass the py_plugin instance. I only needed an attribute 
called: self._language. Anyway, if I passed it without doing anything else, I 
got:
TypeError: __init__() got an unexpected keyword argument 'language'

In this call inside the MissingTranslationsFallback class.
super(MissingTranslationsFallback, self).__init__(*args, **kwargs)

The error is clear, the constructor of: "gettext.GNUTranslations" isn't 
expecting an argument called: 'language', so, I removed it before doing the 
call:
language = kwargs['language']
del kwargs['language']
super(MissingTranslationsFallback, self).__init__(*args, **kwargs)

And it worked. Thanks a lot for your help. Now it looks nice without those 
nasty global variables :-)

Here the resulting code:
class TranslationService(object):
  """...__init__ and other methods are defined here"""

  def install(self):
    """...some code goes here..."""
    current_catalog = gettext.translation(plugin_name, localedir = 
locale_folder,
                                                                       class_= 
functools.partial(
                                                                       
MissingTranslationsFallback, 
                                                                       language 
= self._language
                                                                      ),
                                                                      languages 
= [current_language]
                                     )
    current_catalog.install()

class MissingTranslationsFallback(gettext.GNUTranslations, object):
  def __init__(self, *args, **kwargs):
    language = kwargs['language']
    del kwargs['language']
    super(MissingTranslationsFallback, self).__init__(*args, **kwargs)
    self.add_fallback(MissingTranslationsLogger(language))

Best regards
Josef

-----Original Message-----
From: Python-list [mailto:python-list-bounces+jmeile=hotmail....@python.org] On 
Behalf Of Peter Otten
Sent: Freitag, 8. September 2017 08:15
To: python-list@python.org
Subject: Re: Need to pass a class instance to a gettext fallback

Josef Meile wrote:

> Hi
> 
> I'm working with gettext and need to define a language Fallback. I got 
> this working, but with a global variable. I don't really like this and 
> I would like to pass this variable to the gettext Fallback's 
> contructor, but I don't know how. For simplicity, I won't put the 
> whole code here, just the important parts.
> 
> Before you look at it, I want to ask you: how can I pass the variable:
> "my_plugin" to the constructor of the "MissingTranslationsFallback" class?
> If you see, an instance of this class will be created automatically by 
> gettext. I don't create it. When calling the " add_fallback" method of 
> the gettext.GNUTranslations class, you have to pass a class and not an 
> instance.

Provided the class_ argument to gettext.translation() accepts an arbitrary 
callable the following may work:

import functools

> #Defining a global dict, which is ugly, I know MY_GLOBALS = {}
> 
> class TranslationService(object):
>   """...__init__ and other methods are defined here"""
> 
>   def install(self):
>     """...some code goes here..."""
 
     current_catalog = gettext.translation(
         plugin_name, 
         localedir=locale_folder,
         class_=functools.partial(
             MissingTranslationsFallback, 
             py_plugin=self._py_plugin
         ), 
         languages=[current_language]
      )
>     current_catalog.install()
> 
> class MissingTranslationsFallback(gettext.GNUTranslations, object):
>   def __init__(self, *args, **kwargs):

      py_plugin = kwargs.pop("py_plugin")

>     super(MissingTranslationsFallback, self).__init__(*args, **kwargs)

>     i18n_service = py_plugin.get_i18n_service()
>     #Adds an instance to the class that will handle the missing
>     #translations
>     
self.add_fallback(MissingTranslationsLogger(i18n_service.get_language()))


--
https://mail.python.org/mailman/listinfo/python-list
-- 
https://mail.python.org/mailman/listinfo/python-list

Reply via email to