osdir.com


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

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()))