--- a/ProjectDjangoTagsMenu/DjangoTagsMenuHandler.py Sun Feb 09 18:21:45 2014 +0100 +++ b/ProjectDjangoTagsMenu/DjangoTagsMenuHandler.py Mon Feb 10 19:21:55 2014 +0100 @@ -7,6 +7,12 @@ Module implementing the Django tags menu handler. """ +from __future__ import unicode_literals # __IGNORE_WARNING__ +try: + str = unicode +except NameError: + pass + import os import datetime @@ -59,9 +65,11 @@ mainMenu.addMenu(self.__initWebDesignMenu()) mainMenu.addMenu(self.__initStaticMenu()) mainMenu.addMenu(self.__initCommentsMenu()) - # TODO: add internationalization tags/filters menu + mainMenu.addMenu(self.__initInternationalizationMenu()) # TODO: add localization tags/filters menu + mainMenu.addMenu(self.__initlocalizationMenu()) # TODO: add timezone tags/filters menu + mainMenu.addMenu(self.__initTimezoneMenu()) def __initTagsMenu(self): """ @@ -187,7 +195,6 @@ @return generated menu (QMenu) """ - # TODO: subdivide into even parts a-i,j-r,s-z mainMenu = QMenu(self.tr("Filters")) menu = QMenu(self.tr("A-I"), mainMenu) @@ -472,7 +479,7 @@ def __initCommentsMenu(self): """ - Private method to initialize the static menu. + Private method to initialize the comments menu. @return generated menu (QMenu) """ @@ -516,6 +523,107 @@ self.__commentsMenu = menu return menu + def __initInternationalizationMenu(self): + """ + Private method to initialize the static menu. + + @return generated menu (QMenu) + """ + mainMenu = QMenu(self.tr("Internationalization (i18n)")) + mainMenu.addAction( + self.tr("Load Package"), + lambda: self.__applyTemplate("loadi18n")) + mainMenu.addSeparator() + + menu = QMenu(self.tr("Tags"), mainMenu) + menu.addAction( + self.tr("trans - Translate String or Variable"), + lambda: self.__applyTemplate("trans")) + menu.addAction( + self.tr("trans..as - Translate String into Variable"), + lambda: self.__applyTemplate("trans..as")) + menu.addSeparator() + menu.addAction( + self.tr("blocktrans - Translate Block"), + lambda: self.__applyTemplate("blocktrans")) + menu.addAction( + self.tr("blocktrans..with - Translate Block with Attributes"), + lambda: self.__applyTemplate("blocktrans..with")) + menu.addAction( + self.tr("plural - Plural Block"), + lambda: self.__applyTemplate("plural")) + menu.addAction( + self.tr("language - Switch language"), + lambda: self.__applyTemplate("language")) + menu.addSeparator() + menu.addAction( + self.tr("get_current_language - Current language"), + lambda: self.__applyTemplate("get_current_language")) + menu.addAction( + self.tr("get_available_languages - Available languages"), + lambda: self.__applyTemplate("get_available_languages")) + menu.addAction( + self.tr("get_current_language_bidi - Current language's" + " direction"), + lambda: self.__applyTemplate("get_current_language_bidi")) + menu.addAction( + self.tr("get_language_info - Language Information"), + lambda: self.__applyTemplate("get_language_info")) + menu.addAction( + self.tr("get_language_info_list - Language Information for a list" + " of languages"), + lambda: self.__applyTemplate("get_language_info_list")) + mainMenu.addMenu(menu) + + menu = QMenu(self.tr("Filters"), mainMenu) + menu.addAction( + self.tr("language_name - Language name"), + lambda: self.__applyTemplate("language_name")) + menu.addAction( + self.tr("language_name_local - Language name translated"), + lambda: self.__applyTemplate("language_name_local")) + menu.addAction( + self.tr("bidi - Language's direction"), + lambda: self.__applyTemplate("bidi")) + mainMenu.addMenu(menu) + + self.__internationalizationMenu = mainMenu + return mainMenu + + def __initlocalizationMenu(self): + """ + Private method to initialize the static menu. + + @return generated menu (QMenu) + """ + mainMenu = QMenu(self.tr("Localization (l10n)")) + mainMenu.addAction( + self.tr("Load Package"), + lambda: self.__applyTemplate("loadl10n")) + mainMenu.addSeparator() + + menu = QMenu(self.tr("Tags"), mainMenu) + + menu = QMenu(self.tr("Filters"), mainMenu) + + self.__localizationMenu = mainMenu + return mainMenu + + def __initTimezoneMenu(self): + """ + Private method to initialize the static menu. + + @return generated menu (QMenu) + """ + menu = QMenu(self.tr("Timezone (tz)")) + menu.addAction( + self.tr("Load Package"), + lambda: self.__applyTemplate("loadtz")) + menu.addSeparator() + + self.__timezoneMenu = menu + return menu + def __findTemplateTag(self): """ Private slot to find a template tag and insert its text. @@ -1250,7 +1358,7 @@ self.tr("Comment File"), self.tr("""<p>The file <b>{0}</b> could not be""" """ read.</p><p>Reason: {1}</p>""").format( - str(err))) + str(err))) elif tag == "singlelinecommentdatetime": templateText = '{{# {0} by {1} #}}'.format( datetime.datetime.now().isoformat().split(), @@ -1265,10 +1373,119 @@ templateText = '<!--{0}-->'.format(tag) replace = True - # TODO: add internationalization tags/filters + #################################################### + ## Internationalization ## + #################################################### + + elif tag == "loadi18n": + templateText = '{% load i18n %}' + ## Tags ## + elif tag == "trans": + if ' ' in selectedText: + selectedText = '"{0}"'.format(selectedText) + templateText = '{{% trans {0} %}}'.format(selectedText) + replace = True + elif tag == "trans..as": + data, ok = DjangoTagInputDialog.getText( + None, + self.tr("Translate String into Variable"), + [self.tr("Enter variable receiving translation:")], + ["translation"]) + if ok: + templateText = '{{% trans "{0}" as {1} %}}'.format( + selectedText, data[0]) + replace = True + elif tag == "blocktrans": + templateText = '{{% blocktrans %}}{0}{{% endblocktrans %}}'.format( + selectedText) + replace = True + elif tag == "blocktrans..with": + data, ok = DjangoTagInputDialog.getText( + None, + self.tr("Translate Block with Attributes"), + [self.tr("Enter attribute binding expressions" + " (space separated):")], + ["myvar1=value1 myvar2=value2"]) + if ok: + templateText = ( + '{{% blocktrans with {0} %}}{1}{{% endblocktrans %}}' + .format(data[0], selectedText)) + replace = True + elif tag == "plural": + templateText = '{{% plural %}} {0}'.format(selectedText) + replace = True + elif tag == "language": + data, ok = DjangoTagInputDialog.getText( + None, + self.tr("Switch language"), + [self.tr("Enter language:")], + ["en"]) + if ok: + templateText = ( + "{{% language '{0}' %}}{1}{{% endlanguage %}}" + .format(data[0], selectedText)) + replace = True + elif tag == "get_current_language": + templateText = '{% get_current_language as LANGUAGE_CODE %}' + elif tag == "get_available_languages": + templateText = '{% get_available_languages as LANGUAGES %}' + elif tag == "get_current_language_bidi": + templateText = '{% get_current_language_bidi as LANGUAGE_BIDI %}' + elif tag == "get_language_info": + data, ok = DjangoTagInputDialog.getText( + None, + self.tr("Language Information"), + [self.tr("Enter language string or variable (empty for" + " LANGUAGE_CODE):")], + ['"en"']) + if ok: + if data[0]: + templateText = ( + '{{% get_language_info for "{0}" as lang %}}' + .format(data[0])) + else: + templateText = ("{% get_language_info for LANGUAGE_CODE" + " as lang %}") + elif tag == "get_language_info_list": + data, ok = DjangoTagInputDialog.getText( + None, + self.tr("Language Information for a list of languages"), + [self.tr("Enter language list variable (empty for" + " LANGUAGES):")], + ["available_languages"]) + if ok: + if data[0]: + templateText = ( + '{{% get_language_info_list for {0} as langs %}}' + .format(data[0])) + else: + templateText = ("{% get_language_info_list for LANGUAGES" + " as langs %}") + ## Filters ## + elif tag == "language_name": + templateText = '|language_name' + elif tag == "language_name_local": + templateText = '|language_name_local' + elif tag == "bidi": + templateText = '|bidi' + # TODO: add localization tags/filters + #################################################### + ## Localization ## + #################################################### + + elif tag == "loadl10n": + templateText = '{% load l10n %}' + # TODO: add timezone tags/filters #################################################### + ## Timezone ## + #################################################### + + elif tag == "loadtz": + templateText = '{% load tz %}' + + #################################################### ## Fallback: return just the tag name ## ####################################################