Internationalisation Support for PluginsΒΆ

Giving your plugin internationalisation support is quite easy and straightforward.

Somewhere in your code (preferable at the beginning) you should create a class for all strings you need. You can use any attribute name freely inside this class except name and description as these attributes are used to set and translate the corresponding fields of your eg.PluginBase and the eg.ActionBase subclasses you might have. For every eg.ActionBase you define, you can create a class inside your ‘Text’ class with the same name as the eg.ActionBase. Then set this class to the attribute text of the eg.PluginBase definition.

As an example look at this (quite useless) code:

import eg

class Text:
    text1 = "This is just a text"
    text2 = "This is just another text"
    class Message1:
        name = "Print first Message"
        description = (
            "This is a quite useless action that will print a message "
            "to the logger"
        )
        message = "This is just a message"
    class Message2:
        name = "Print second Message"
        description = (
            "This is another quite useless action that will print a "
            "message to the logger"
        )
        message = "This is another message"


class MyPlugin(eg.PluginBase):

    text = Text # <- This is all you need to do

    def __init__(self):
        self.AddAction(Message1)
        self.AddAction(Message2)
        print self.text.text1

    def __close__(self):
        print self.text.text2


class Message1(eg.ActionBase):

    def __call__(self):
        print self.text.message


class Message2(eg.ActionBase):

    def __call__(self):
        print self.text.message

As you can see, inside your eg.PluginBase methods you can now access the strings through ‘self.text’. Your action-classes will have a ‘self.text’ attribute of their own. The name and description fields of your actions have also been set up by EventGhost.

If you prefer, you can also use independent classes for the actions and assign them to the class-attribute text of the eg.ActionBase. This example will do the same as the above:

import eg

class PluginText:
    text1 = "This is just a text"
    text2 = "This is just another text"

class MyPlugin(eg.PluginBase):

    text = PluginText # <- setting the 'text' attribute for the plugin

    def __init__(self):
        self.AddAction(Message1)
        self.AddAction(Message2)
        print self.text.text1

    def __close__(self):
        print self.text.text2

# defining a 'text' class for the 'Message1' action.
class Message1Text:
    message = "This is just a message"

class Message1(eg.ActionBase):
    name = "Print first Message"
    description = (
        "This is a quite useless action that will print a message to "
        "the logger"
    )
    text = Message1Text # <- setting the 'text' attribute for the action

    def __call__(self):
        print self.text.message


class Message2(eg.ActionBase):
    # You can also define directly a nested class if you name it 'text'.
    # If the action class has no attribute 'name' or 'description',
    # EventGhost will look inside the 'text' class and use them if they
    # are defined there. So you can piece together everything in the
    # 'text' class.
    class text:
        name = "Print second Message"
        description = (
            "This is another quite useless action that will print a "
            "message to the logger"
        )
        message = "This is another message"

    def __call__(self):
        print self.text.message

It is also important to note that your plugin should be able to get imported and the __init__() method should be able to be called under all circumstances. If a translator uses the translation editing tool of EventGhost, this tool will import every plugin and call the __init__() method of every plugin, to find out all actions the plugins have. So don’t assume that the user might actually want to use your plugin and therefore assume some conditions can be presumed, like the existence of some DLL or registry key. Keep your __init__() fail-safe and add all your actions under all circumstances there. Your “hot code” should only be execute if the __start__() method gets called.