Index: /quintagroup.seoptimizer/trunk/quintagroup/seoptimizer/browser/keywords.py
===================================================================
--- /quintagroup.seoptimizer/trunk/quintagroup/seoptimizer/browser/keywords.py	(revision 1465)
+++ /quintagroup.seoptimizer/trunk/quintagroup/seoptimizer/browser/keywords.py	(revision 1466)
@@ -16,12 +16,10 @@
     def validateKeywords(self, text):
         """ see interface """
+        ts = getToolByName(self.context, 'translation_service')
         # extract keywords from text
-        if not text.strip():
-            return _(u'Keywords list is empty!')
-
-        keywords = map(lambda x: x.strip(), text.lower().split('\n'))
-        if not keywords:
-            return _(u'Keywords list is empty!')
-
+        if text.lower().strip():
+            keywords = map(lambda x: x.strip(), text.lower().strip().split('\n'))
+        else:
+            return ts.utranslate(None, _(u'Keywords list is empty!'), context=self.context)
         # request html page of context object
         url = '%s?qseo_without_additional_keywords=1' % self.context.absolute_url()
@@ -69,16 +67,22 @@
         # check every keyword on appearing in body of html page
         missing = []
+        finding = []
         added = {}
+        finded = {}
         for keyword in keywords:
-            if keyword not in added.keys() and not re.compile(r'\b%s\b' % keyword, re.I).search(page_text):
-                missing.append(keyword)
-                added[keyword] = 1
-
+            if keyword:
+                keyword_on_page =  len(re.compile(r'\s%s\s' % keyword, re.I).findall(page_text))
+                if keyword not in added.keys() and not keyword_on_page:
+                    missing.append(keyword.decode('utf8'))
+                    added[keyword] = 1
+                if keyword not in finded.keys() and keyword_on_page:
+                    finding.append(keyword.decode('utf8')+' - '+repr(keyword_on_page))
+                    finded[keyword] = 1
         # return list of missing keywords
         if missing:
-            msg = u"""Next keywords did not appear on the page:\n%s""" % '\n'.join(missing)
+            msg = ts.utranslate(None, _('missing_keywords', default=u'Next keywords did not appear on the page:\n${missing}', mapping={'missing':'\n'.join(missing)}), context=self.context)
         else:
-            msg = u"""All keywords found on the page!"""
-        return _(msg)
+            msg = ts.utranslate(None, _('finded_keywords', default=u'All keywords found on the page!\nMore detailed:\n${found}', mapping={'found': '\n'.join(finding)}), context=self.context)
+        return msg
 
     def walkTextNodes(self, parent, page_words=[]):
@@ -100,10 +104,10 @@
                     # pop everything from the the left-angle bracket until the right-angle bracket
                     s_list.pop(i)
-                    
+
                 # pops the right-angle bracket, too
                 s_list.pop(i)
             else:
                 i=i+1
-                
+
         # convert the list back into text
         join_char=''
Index: /quintagroup.seoptimizer/trunk/quintagroup/seoptimizer/browser/views.py
===================================================================
--- /quintagroup.seoptimizer/trunk/quintagroup/seoptimizer/browser/views.py	(revision 1465)
+++ /quintagroup.seoptimizer/trunk/quintagroup/seoptimizer/browser/views.py	(revision 1466)
@@ -307,19 +307,37 @@
     template = ViewPageTemplateFile('templates/seo_context_properties.pt')
 
-
     def test( self, condition, first, second ):
         """
         """
         return condition and first or second 
-      
+
+    def getMainDomain(self, url):
+        url = url.split('//')[-1]
+        dompath = url.split(':')[0]
+        dom = dompath.split('/')[0]
+        return '.'.join(dom.split('.')[-2:])
+
+    def validateSEOProperty(self, property, value):
+        purl = getToolByName(self.context, 'portal_url')()
+        state = ''
+        if property == PROP_PREFIX+'canonical':
+            pdomain = self.getMainDomain(purl)
+            if not pdomain == self.getMainDomain(value):
+                state = _('canonical_msg', default=u'Canonical URL mast be in ${pdomain} domain.', mapping={'pdomain': pdomain})
+        return state
+
     def setProperty(self, property, value, type='string'):
         context = aq_inner(self.context)
-        if context.hasProperty(property):
-            context.manage_changeProperties({property: value})
-        else:
-            context.manage_addProperty(property, value, type)
+        state = self.validateSEOProperty(property, value)
+        if not state:
+            if context.hasProperty(property):
+                context.manage_changeProperties({property: value})
+            else:
+                context.manage_addProperty(property, value, type)
+        return state
 
     def manageSEOProps(self, **kw):
         context = aq_inner(self.context)
+        state = ''
         delete_list, overrides, values = [], [], []
         seo_items = dict([(k[len(SEO_PREFIX):],v) for k,v in kw.items() if k.startswith(SEO_PREFIX)])
@@ -329,11 +347,15 @@
             else:
                 values.append(key)
-
         for val in values:
-            if val in overrides and seo_items[val+SUFFIX]:
-                self.setProperty(PROP_PREFIX+val, seo_items[val])
+            if val in overrides and seo_items.get(val+SUFFIX):
+                state = self.setProperty(PROP_PREFIX+val, seo_items[val])
+                if state:
+                    return state
             elif context.hasProperty(PROP_PREFIX+val):
                 delete_list.append(PROP_PREFIX+val)
-        if delete_list: context.manage_delProperties(delete_list)
+        if delete_list:
+            context.manage_delProperties(delete_list)
+        self.manageSEOCustomMetaTagsProperties(**kw)
+        return state
 
     def setSEOCustomMetaTags(self, custommetatags):
@@ -342,23 +364,17 @@
             self.setProperty('%s%s' % (PROP_CUSTOM_PREFIX, tag['meta_name']), tag['meta_content'])
 
-    def delAllSEOCustomMetaTagsByNames(self):
-        context = self.context
+    def delAllSEOCustomMetaTagsProperties(self):
+        context = aq_inner(self.context)
         delete_list = []
         for property, value in context.propertyItems():
-            if property.find(PROP_CUSTOM_PREFIX) == 0 and len(property) > len(PROP_CUSTOM_PREFIX):
+            if property.startswith(PROP_CUSTOM_PREFIX)  and not property == PROP_CUSTOM_PREFIX:
                 delete_list.append(property)
-        if delete_list: context.manage_delProperties(delete_list)        
-
-    def delSEOCustomMetaTagByName(self, custommetatagname):
-        context = self.context
-        seo_custom_prop = PROP_CUSTOM_PREFIX + custommetatagname
-        if context.hasProperty(seo_custom_prop):
-            context.manage_delProperties([seo_custom__prop])
-
-    def updateSEOCustomMetaTags(self, custommetatags):
+        if delete_list:
+            context.manage_delProperties(delete_list)
+
+    def updateSEOCustomMetaTagsProperties(self, custommetatags):
         context = aq_inner(self.context)
         site_properties = getToolByName(context, 'portal_properties')
         globalCustomMetaTags = []
-
         if hasattr(site_properties, 'seo_properties'):
             custom_meta_tags = getattr(site_properties.seo_properties, 'default_custom_metatags', [])
@@ -368,22 +384,16 @@
                     globalCustomMetaTags.append({'meta_name'    : name_value[0],
                                                  'meta_content' : len(name_value) == 1 and '' or name_value[1]})
-        metalist = []
         for tag in custommetatags:
             meta_name, meta_content = tag['meta_name'], tag['meta_content']
             if meta_name:
                 if not [gmt for gmt in globalCustomMetaTags if (gmt['meta_name']==meta_name and gmt['meta_content']==meta_content)]:
-                    metalist.append(tag)
-        if metalist: self.setSEOCustomMetaTags(metalist)
-      
-    def manageSEOCustomMetaTags(self, **kw):
-        context = aq_inner(self.context)
-        if kw.has_key('seo_custommetatags_override'):
-            if kw.get('seo_custommetatags_override'):
-                custommetatags = kw.get('seo_custommetatags', {})
-                self.updateSEOCustomMetaTags(custommetatags)
-            else:
-                self.delAllSEOCustomMetaTagsByNames()
-        elif kw.get('seo_custommetatags'):
-            self.delAllSEOCustomMetaTagsByNames()
+                    self.setProperty('%s%s' % (PROP_CUSTOM_PREFIX, meta_name), meta_content)
+
+    def manageSEOCustomMetaTagsProperties(self, **kw):
+        context = aq_inner(self.context)
+        self.delAllSEOCustomMetaTagsProperties()
+        if kw.get('seo_custommetatags_override'):
+            custommetatags = kw.get('seo_custommetatags', {})
+            self.updateSEOCustomMetaTagsProperties(custommetatags)
 
     def __call__( self ):
@@ -395,8 +405,9 @@
         submitted = form.get('form.submitted', False)
         if submitted:
-            self.manageSEOProps(**form)
-            self.manageSEOCustomMetaTags(**form)
-            context.plone_utils.addPortalMessage( _(u'Content SEO properties have been saved.'))
-            return request.response.redirect(self.context.absolute_url())
-        else:
-            return self.template()
+            state = self.manageSEOProps(**form)
+            if not state:
+                state = _('seoproperties_saved', default=u'Content SEO properties have been saved.')
+                context.plone_utils.addPortalMessage(state)
+                return request.response.redirect(self.context.absolute_url())
+            context.plone_utils.addPortalMessage(state, 'error')
+        return self.template()
Index: /quintagroup.seoptimizer/trunk/quintagroup/seoptimizer/configure.zcml
===================================================================
--- /quintagroup.seoptimizer/trunk/quintagroup/seoptimizer/configure.zcml	(revision 1465)
+++ /quintagroup.seoptimizer/trunk/quintagroup/seoptimizer/configure.zcml	(revision 1466)
@@ -10,4 +10,5 @@
 
   <five:registerPackage package="." />
+  <i18n:registerTranslations directory="locales" />
 
   <genericsetup:registerProfile
Index: /quintagroup.seoptimizer/trunk/quintagroup/seoptimizer/locales/quintagroup.seoptimizer.pot
===================================================================
--- /quintagroup.seoptimizer/trunk/quintagroup/seoptimizer/locales/quintagroup.seoptimizer.pot	(revision 1466)
+++ /quintagroup.seoptimizer/trunk/quintagroup/seoptimizer/locales/quintagroup.seoptimizer.pot	(revision 1466)
@@ -0,0 +1,191 @@
+# --- PLEASE EDIT THE LINES BELOW CORRECTLY ---
+# SOME DESCRIPTIVE TITLE.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"POT-Creation-Date: 2009-12-22 15:36+0000\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI +ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0\n"
+"Language-Code: en\n"
+"Language-Name: English\n"
+"Preferred-Encodings: utf-8 latin1\n"
+"Domain: quintagroup.seoptimizer\n"
+
+#: ./quintagroup.seoptimizer/quintagroup/seoptimizer/browser/keywords.py:81
+msgid "All keywords found on the page!"
+msgstr ""
+
+#: ./quintagroup.seoptimizer/quintagroup/seoptimizer/browser/keywords.py:67
+msgid "Could not find lynx browser!"
+msgstr ""
+
+#: ./quintagroup.seoptimizer/quintagroup/seoptimizer/browser/keywords.py:20
+msgid "Keywords list is empty!"
+msgstr ""
+
+#. Default: "Canonical URL mast be in ${pdomain} domain."
+#: ./quintagroup.seoptimizer/quintagroup/seoptimizer/browser/views.py:326
+msgid "canonical_msg"
+msgstr ""
+
+#. Default: "This form allows you to edit html header meta tags that are produced by Plone CMS to incrase Search Engine visibility. The values generated by Plone are present as default values in input fields. To override default value, check corresponding checkbox and input value itself in the corresponding field."
+#: ./quintagroup.seoptimizer/quintagroup/seoptimizer/browser/templates/seo_context_properties.pt:36
+msgid "description_edit_seo_properties"
+msgstr ""
+
+#. Default: "Select content types that will have SEO properties enabled."
+#: ./quintagroup.seoptimizer/quintagroup/seoptimizer/browser/templates/seo_controlpanel.pt:84
+msgid "description_seo_content_types"
+msgstr ""
+
+#. Default: "Controls if <abbr title=\"Dublin Core\">DC</abbr> metatags are exposed to page header. They include DC.description, DC.type, DC.format, DC.creator and others."
+#: ./quintagroup.seoptimizer/quintagroup/seoptimizer/browser/templates/seo_controlpanel.pt:30
+msgid "description_seo_dc_metatags"
+msgstr ""
+
+#. Default: "Edit SEO Properties"
+#: ./quintagroup.seoptimizer/quintagroup/seoptimizer/browser/templates/seo_context_properties.pt:35
+msgid "heading_edit_seo_properties"
+msgstr ""
+
+#. Default: "Use this field when you want that your content types receive additional keywords from the ones you manually specify. Enter one keyword per line."
+#: ./quintagroup.seoptimizer/quintagroup/seoptimizer/browser/templates/seo_controlpanel.pt:69
+msgid "help_additional_keywords"
+msgstr ""
+
+#. Default: "Fill in custom metatag names (one per line) which will appear on qseo_properties edit tab. Example: \"metaname|metacontent\" or \"metaname\"."
+#: ./quintagroup.seoptimizer/quintagroup/seoptimizer/browser/templates/seo_controlpanel.pt:41
+msgid "help_default_custom_metatags"
+msgstr ""
+
+#. Default: "Fill in meta tags order (one per line) which will appear on qseo_properties edit tab. Example: \"metaname accessor\"."
+#: ./quintagroup.seoptimizer/quintagroup/seoptimizer/browser/templates/seo_controlpanel.pt:55
+msgid "help_metatags_order"
+msgstr ""
+
+#. Default: "Specify your canonical URL. If your site has identical or vastly similar content that's accessible through multiple URLs, this format provides you with more control over the URL returned in search results."
+#: ./quintagroup.seoptimizer/quintagroup/seoptimizer/browser/templates/seo_context_properties.pt:237
+msgid "help_seo_canonical"
+msgstr ""
+
+#. Default: "Here you can manage your custom meta tags. Specify local Meta Tags parameters to be added to the global Meta Tags. If metacontent field is empty, then a meta tag will not be present on this page."
+#: ./quintagroup.seoptimizer/quintagroup/seoptimizer/browser/templates/seo_context_properties.pt:270
+msgid "help_seo_custommetatags"
+msgstr ""
+
+#. Default: "Description of the document to be indexed by Search Engines. This text will be present in meta description tag in page HTML source."
+#: ./quintagroup.seoptimizer/quintagroup/seoptimizer/browser/templates/seo_context_properties.pt:88
+msgid "help_seo_description"
+msgstr ""
+
+#. Default: "Distribution meta tag to designate time and area disribution of the document."
+#: ./quintagroup.seoptimizer/quintagroup/seoptimizer/browser/templates/seo_context_properties.pt:206
+msgid "help_seo_distribution"
+msgstr ""
+
+#. Default: "Comments embedded into HTML header."
+#: ./quintagroup.seoptimizer/quintagroup/seoptimizer/browser/templates/seo_context_properties.pt:150
+msgid "help_seo_html_comment"
+msgstr ""
+
+#. Default: "Keywords, the page will be indexed with. <strong>Enter each keyword in separate line, please.</strong> Though the relevance of listing meta keywords is of questionable value now, it is useful to set meta keywords for pages - for furture reference."
+#: ./quintagroup.seoptimizer/quintagroup/seoptimizer/browser/templates/seo_context_properties.pt:116
+msgid "help_seo_keywords"
+msgstr ""
+
+#. Default: "Robots meta tag value. Allows or denies indexing, following links, etc. for spiders indexing your content."
+#: ./quintagroup.seoptimizer/quintagroup/seoptimizer/browser/templates/seo_context_properties.pt:177
+msgid "help_seo_robots"
+msgstr ""
+
+#. Default: "Text to be present in &lt;TITLE&gt; tag. It is displayed in browser title bar. Search engines display it as a title of the document."
+#: ./quintagroup.seoptimizer/quintagroup/seoptimizer/browser/templates/seo_context_properties.pt:58
+msgid "help_seo_title"
+msgstr ""
+
+#. Default: "Additional keywords that should be added to the content types."
+#: ./quintagroup.seoptimizer/quintagroup/seoptimizer/browser/templates/seo_controlpanel.pt:66
+msgid "label_additional_keywords"
+msgstr ""
+
+#. Default: "Canonical URL"
+#: ./quintagroup.seoptimizer/quintagroup/seoptimizer/browser/templates/seo_context_properties.pt:234
+msgid "label_canonical_tag"
+msgstr ""
+
+#. Default: "Content Types"
+#: ./quintagroup.seoptimizer/quintagroup/seoptimizer/browser/templates/seo_controlpanel.pt:82
+msgid "label_content_type_title"
+msgstr ""
+
+#. Default: "Custom Meta Tags"
+#: ./quintagroup.seoptimizer/quintagroup/seoptimizer/browser/templates/seo_context_properties.pt:267
+msgid "label_custom_metatags"
+msgstr ""
+
+#. Default: "Default custom metatags."
+#: ./quintagroup.seoptimizer/quintagroup/seoptimizer/browser/templates/seo_controlpanel.pt:38
+msgid "label_default_custom_metatags"
+msgstr ""
+
+#. Default: "Distribution Tag"
+#: ./quintagroup.seoptimizer/quintagroup/seoptimizer/browser/templates/seo_context_properties.pt:203
+msgid "label_distribution_tag"
+msgstr ""
+
+#. Default: "HTML Comment"
+#: ./quintagroup.seoptimizer/quintagroup/seoptimizer/browser/templates/seo_context_properties.pt:147
+msgid "label_html_comment"
+msgstr ""
+
+#. Default: "Meta Description Tag"
+#: ./quintagroup.seoptimizer/quintagroup/seoptimizer/browser/templates/seo_context_properties.pt:85
+msgid "label_meta_description_tag"
+msgstr ""
+
+#. Default: "Meta Keywords Tag"
+#: ./quintagroup.seoptimizer/quintagroup/seoptimizer/browser/templates/seo_context_properties.pt:113
+msgid "label_meta_keywords_tag"
+msgstr ""
+
+#. Default: "Meta tags order in the page."
+#: ./quintagroup.seoptimizer/quintagroup/seoptimizer/browser/templates/seo_controlpanel.pt:52
+msgid "label_metatags_order"
+msgstr ""
+
+#. Default: "Override"
+#: ./quintagroup.seoptimizer/quintagroup/seoptimizer/browser/templates/seo_context_properties.pt:70
+msgid "label_override"
+msgstr ""
+
+#. Default: "Page Title Tag"
+#: ./quintagroup.seoptimizer/quintagroup/seoptimizer/browser/templates/seo_context_properties.pt:55
+msgid "label_page_title_tag"
+msgstr ""
+
+#. Default: "Robot Tag"
+#: ./quintagroup.seoptimizer/quintagroup/seoptimizer/browser/templates/seo_context_properties.pt:174
+msgid "label_robot_tag"
+msgstr ""
+
+#. Default: "Up to Plone Setup"
+#: ./quintagroup.seoptimizer/quintagroup/seoptimizer/browser/templates/seo_controlpanel.pt:12
+msgid "label_up_to_plone_setup"
+msgstr ""
+
+#. Default: "Next keywords did not appear on the page:\n${keywords}"
+#: ./quintagroup.seoptimizer/quintagroup/seoptimizer/browser/keywords.py:79
+msgid "missing_keywords"
+msgstr ""
+
+#. Default: "Content SEO properties have been saved."
+#: ./quintagroup.seoptimizer/quintagroup/seoptimizer/browser/views.py:409
+msgid "seoproperties_saved"
+msgstr ""
+
Index: /quintagroup.seoptimizer/trunk/quintagroup/seoptimizer/locales/uk/LC_MESSAGES/quintagroup.seoptimizer.po
===================================================================
--- /quintagroup.seoptimizer/trunk/quintagroup/seoptimizer/locales/uk/LC_MESSAGES/quintagroup.seoptimizer.po	(revision 1466)
+++ /quintagroup.seoptimizer/trunk/quintagroup/seoptimizer/locales/uk/LC_MESSAGES/quintagroup.seoptimizer.po	(revision 1466)
@@ -0,0 +1,191 @@
+# --- PLEASE EDIT THE LINES BELOW CORRECTLY ---
+# SOME DESCRIPTIVE TITLE.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"POT-Creation-Date: 2009-12-22 15:36+0000\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI +ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0\n"
+"Language-Code: en\n"
+"Language-Name: English\n"
+"Preferred-Encodings: utf-8 latin1\n"
+"Domain: quintagroup.seoptimizer\n"
+
+#: ./quintagroup.seoptimizer/quintagroup/seoptimizer/browser/keywords.py:81
+msgid "All keywords found on the page!"
+msgstr "Всі ключові слова знайдено на сторінці!"
+
+#: ./quintagroup.seoptimizer/quintagroup/seoptimizer/browser/keywords.py:67
+msgid "Could not find lynx browser!"
+msgstr ""
+
+#: ./quintagroup.seoptimizer/quintagroup/seoptimizer/browser/keywords.py:20
+msgid "Keywords list is empty!"
+msgstr ""
+
+#. Default: "Canonical URL mast be in ${pdomain} domain."
+#: ./quintagroup.seoptimizer/quintagroup/seoptimizer/browser/views.py:326
+msgid "canonical_msg"
+msgstr "Canonical URL повинен знаходитись в домені \"${pdomain}\"."
+
+#. Default: "This form allows you to edit html header meta tags that are produced by Plone CMS to incrase Search Engine visibility. The values generated by Plone are present as default values in input fields. To override default value, check corresponding checkbox and input value itself in the corresponding field."
+#: ./quintagroup.seoptimizer/quintagroup/seoptimizer/browser/templates/seo_context_properties.pt:36
+msgid "description_edit_seo_properties"
+msgstr ""
+
+#. Default: "Select content types that will have SEO properties enabled."
+#: ./quintagroup.seoptimizer/quintagroup/seoptimizer/browser/templates/seo_controlpanel.pt:84
+msgid "description_seo_content_types"
+msgstr ""
+
+#. Default: "Controls if <abbr title=\"Dublin Core\">DC</abbr> metatags are exposed to page header. They include DC.description, DC.type, DC.format, DC.creator and others."
+#: ./quintagroup.seoptimizer/quintagroup/seoptimizer/browser/templates/seo_controlpanel.pt:30
+msgid "description_seo_dc_metatags"
+msgstr ""
+
+#. Default: "Edit SEO Properties"
+#: ./quintagroup.seoptimizer/quintagroup/seoptimizer/browser/templates/seo_context_properties.pt:35
+msgid "heading_edit_seo_properties"
+msgstr ""
+
+#. Default: "Use this field when you want that your content types receive additional keywords from the ones you manually specify. Enter one keyword per line."
+#: ./quintagroup.seoptimizer/quintagroup/seoptimizer/browser/templates/seo_controlpanel.pt:69
+msgid "help_additional_keywords"
+msgstr ""
+
+#. Default: "Fill in custom metatag names (one per line) which will appear on qseo_properties edit tab. Example: \"metaname|metacontent\" or \"metaname\"."
+#: ./quintagroup.seoptimizer/quintagroup/seoptimizer/browser/templates/seo_controlpanel.pt:41
+msgid "help_default_custom_metatags"
+msgstr ""
+
+#. Default: "Fill in meta tags order (one per line) which will appear on qseo_properties edit tab. Example: \"metaname accessor\"."
+#: ./quintagroup.seoptimizer/quintagroup/seoptimizer/browser/templates/seo_controlpanel.pt:55
+msgid "help_metatags_order"
+msgstr ""
+
+#. Default: "Specify your canonical URL. If your site has identical or vastly similar content that's accessible through multiple URLs, this format provides you with more control over the URL returned in search results."
+#: ./quintagroup.seoptimizer/quintagroup/seoptimizer/browser/templates/seo_context_properties.pt:237
+msgid "help_seo_canonical"
+msgstr ""
+
+#. Default: "Here you can manage your custom meta tags. Specify local Meta Tags parameters to be added to the global Meta Tags. If metacontent field is empty, then a meta tag will not be present on this page."
+#: ./quintagroup.seoptimizer/quintagroup/seoptimizer/browser/templates/seo_context_properties.pt:270
+msgid "help_seo_custommetatags"
+msgstr ""
+
+#. Default: "Description of the document to be indexed by Search Engines. This text will be present in meta description tag in page HTML source."
+#: ./quintagroup.seoptimizer/quintagroup/seoptimizer/browser/templates/seo_context_properties.pt:88
+msgid "help_seo_description"
+msgstr ""
+
+#. Default: "Distribution meta tag to designate time and area disribution of the document."
+#: ./quintagroup.seoptimizer/quintagroup/seoptimizer/browser/templates/seo_context_properties.pt:206
+msgid "help_seo_distribution"
+msgstr ""
+
+#. Default: "Comments embedded into HTML header."
+#: ./quintagroup.seoptimizer/quintagroup/seoptimizer/browser/templates/seo_context_properties.pt:150
+msgid "help_seo_html_comment"
+msgstr ""
+
+#. Default: "Keywords, the page will be indexed with. <strong>Enter each keyword in separate line, please.</strong> Though the relevance of listing meta keywords is of questionable value now, it is useful to set meta keywords for pages - for furture reference."
+#: ./quintagroup.seoptimizer/quintagroup/seoptimizer/browser/templates/seo_context_properties.pt:116
+msgid "help_seo_keywords"
+msgstr ""
+
+#. Default: "Robots meta tag value. Allows or denies indexing, following links, etc. for spiders indexing your content."
+#: ./quintagroup.seoptimizer/quintagroup/seoptimizer/browser/templates/seo_context_properties.pt:177
+msgid "help_seo_robots"
+msgstr ""
+
+#. Default: "Text to be present in &lt;TITLE&gt; tag. It is displayed in browser title bar. Search engines display it as a title of the document."
+#: ./quintagroup.seoptimizer/quintagroup/seoptimizer/browser/templates/seo_context_properties.pt:58
+msgid "help_seo_title"
+msgstr ""
+
+#. Default: "Additional keywords that should be added to the content types."
+#: ./quintagroup.seoptimizer/quintagroup/seoptimizer/browser/templates/seo_controlpanel.pt:66
+msgid "label_additional_keywords"
+msgstr ""
+
+#. Default: "Canonical URL"
+#: ./quintagroup.seoptimizer/quintagroup/seoptimizer/browser/templates/seo_context_properties.pt:234
+msgid "label_canonical_tag"
+msgstr ""
+
+#. Default: "Content Types"
+#: ./quintagroup.seoptimizer/quintagroup/seoptimizer/browser/templates/seo_controlpanel.pt:82
+msgid "label_content_type_title"
+msgstr ""
+
+#. Default: "Custom Meta Tags"
+#: ./quintagroup.seoptimizer/quintagroup/seoptimizer/browser/templates/seo_context_properties.pt:267
+msgid "label_custom_metatags"
+msgstr ""
+
+#. Default: "Default custom metatags."
+#: ./quintagroup.seoptimizer/quintagroup/seoptimizer/browser/templates/seo_controlpanel.pt:38
+msgid "label_default_custom_metatags"
+msgstr ""
+
+#. Default: "Distribution Tag"
+#: ./quintagroup.seoptimizer/quintagroup/seoptimizer/browser/templates/seo_context_properties.pt:203
+msgid "label_distribution_tag"
+msgstr ""
+
+#. Default: "HTML Comment"
+#: ./quintagroup.seoptimizer/quintagroup/seoptimizer/browser/templates/seo_context_properties.pt:147
+msgid "label_html_comment"
+msgstr ""
+
+#. Default: "Meta Description Tag"
+#: ./quintagroup.seoptimizer/quintagroup/seoptimizer/browser/templates/seo_context_properties.pt:85
+msgid "label_meta_description_tag"
+msgstr ""
+
+#. Default: "Meta Keywords Tag"
+#: ./quintagroup.seoptimizer/quintagroup/seoptimizer/browser/templates/seo_context_properties.pt:113
+msgid "label_meta_keywords_tag"
+msgstr ""
+
+#. Default: "Meta tags order in the page."
+#: ./quintagroup.seoptimizer/quintagroup/seoptimizer/browser/templates/seo_controlpanel.pt:52
+msgid "label_metatags_order"
+msgstr ""
+
+#. Default: "Override"
+#: ./quintagroup.seoptimizer/quintagroup/seoptimizer/browser/templates/seo_context_properties.pt:70
+msgid "label_override"
+msgstr ""
+
+#. Default: "Page Title Tag"
+#: ./quintagroup.seoptimizer/quintagroup/seoptimizer/browser/templates/seo_context_properties.pt:55
+msgid "label_page_title_tag"
+msgstr ""
+
+#. Default: "Robot Tag"
+#: ./quintagroup.seoptimizer/quintagroup/seoptimizer/browser/templates/seo_context_properties.pt:174
+msgid "label_robot_tag"
+msgstr ""
+
+#. Default: "Up to Plone Setup"
+#: ./quintagroup.seoptimizer/quintagroup/seoptimizer/browser/templates/seo_controlpanel.pt:12
+msgid "label_up_to_plone_setup"
+msgstr ""
+
+#. Default: "Next keywords did not appear on the page:\n${keywords}"
+#: ./quintagroup.seoptimizer/quintagroup/seoptimizer/browser/keywords.py:79
+msgid "missing_keywords"
+msgstr ""
+
+#. Default: "Content SEO properties have been saved."
+#: ./quintagroup.seoptimizer/quintagroup/seoptimizer/browser/views.py:409
+msgid "seoproperties_saved"
+msgstr "Налаштування збереженно."
+
Index: intagroup.seoptimizer/trunk/quintagroup/seoptimizer/skins/quintagroup.seoptimizer/qseo_properties_edit.cpy
===================================================================
--- /quintagroup.seoptimizer/trunk/quintagroup/seoptimizer/skins/quintagroup.seoptimizer/qseo_properties_edit.cpy	(revision 1465)
+++ 	(revision )
@@ -1,81 +1,0 @@
-## Controller Python Script "qseo_properties_edit"
-##bind container=container
-##bind context=context
-##bind namespace=
-##bind script=script
-##bind state=state
-##bind subpath=traverse_subpath
-##title=Update SEO Properties
-##parameters=title=None,description=None,canonical=None,keywords=None,html_comment=None,robots=None,distribution=None,title_override=0,description_override=0,canonical_override=0,keywords_override=0,html_comment_override=0,robots_override=0,distribution_override=0,custommetatags=[],custommetatags_override=0
-
-from Products.CMFCore.utils import getToolByName
-SEPERATOR = '|'
-
-def setProperty(context, property, value, type='string'):
-    if context.hasProperty(property):
-        context.manage_changeProperties({property: value})
-    else:
-        context.manage_addProperty(property, value, type)
-
-delete_list = []
-
-# update custom meta tags
-property_prefix = 'qSEO_custom_'
-custom_existing = []
-for property, value in context.propertyItems():
-    if property.find(property_prefix) == 0 and len(property) > len(property_prefix):
-        custom_existing.append(property)
-
-if not custommetatags_override: custommetatags=[]
-
-globalCustomMetaTags = []
-site_properties = getToolByName(context, 'portal_properties')
-if hasattr(site_properties, 'seo_properties'):
-    custom_meta_tags = getattr(site_properties.seo_properties, 'default_custom_metatags', [])
-    for tag in custom_meta_tags:
-        name_value = tag.split(SEPERATOR)
-        if name_value[0]:
-            globalCustomMetaTags.append({'meta_name'    : name_value[0],
-                                         'meta_content' : len(name_value) == 1 and '' or name_value[1]})
-
-custom_updated = []
-for tag in custommetatags:
-    meta_name, meta_content = tag['meta_name'], tag['meta_content']
-    if meta_name:
-        if not [gmt for gmt in globalCustomMetaTags if (gmt['meta_name']==meta_name and gmt['meta_content']==meta_content)]:
-            setProperty(context, '%s%s' % (property_prefix, meta_name), meta_content)
-        custom_updated.append('%s%s' % (property_prefix, meta_name))
-
-#add not updated custom metatags to delete list
-for tag in custom_existing:
-    if tag not in custom_updated:
-        delete_list.append(tag)
-
-setProperty(context, 'qSEO_title', title)
-setProperty(context, 'qSEO_description', description)
-setProperty(context, 'qSEO_keywords', keywords, 'lines')
-setProperty(context, 'qSEO_html_comment', html_comment)
-setProperty(context, 'qSEO_robots', robots)
-setProperty(context, 'qSEO_distribution', distribution)
-setProperty(context, 'qSEO_canonical', canonical)
-
-if not title_override:        delete_list.append('qSEO_title')
-if not description_override:  delete_list.append('qSEO_description')
-if not keywords_override:     delete_list.append('qSEO_keywords')
-if not html_comment_override: delete_list.append('qSEO_html_comment')
-if not robots_override:       delete_list.append('qSEO_robots')
-if not distribution_override: delete_list.append('qSEO_distribution')
-if not canonical_override:    delete_list.append('qSEO_canonical')
-
-if delete_list: context.manage_delProperties(delete_list)
-
-from DateTime import DateTime
-kwargs = {'modification_date' : DateTime()}
-context.plone_utils.contentEdit(context, **kwargs)
-
-msg ='Content SEO properties have been saved.'
-try:
-    context.plone_utils.addPortalMessage(msg)
-    return state
-except AttributeError:
-    return state.set(context=context, portal_status_message=msg)
Index: intagroup.seoptimizer/trunk/quintagroup/seoptimizer/skins/quintagroup.seoptimizer/qseo_properties_edit.cpy.metadata
===================================================================
--- /quintagroup.seoptimizer/trunk/quintagroup/seoptimizer/skins/quintagroup.seoptimizer/qseo_properties_edit.cpy.metadata	(revision 1465)
+++ 	(revision )
@@ -1,6 +1,0 @@
-[validators]
-validators = 
-
-[actions]
-action.failure=redirect_to:string:qseo_properties_edit_form
-action.success=redirect_to_action:string:view
Index: intagroup.seoptimizer/trunk/quintagroup/seoptimizer/skins/quintagroup.seoptimizer/qseo_properties_edit_form.cpt
===================================================================
--- /quintagroup.seoptimizer/trunk/quintagroup/seoptimizer/skins/quintagroup.seoptimizer/qseo_properties_edit_form.cpt	(revision 1465)
+++ 	(revision )
@@ -1,403 +1,0 @@
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
-      lang="en"
-      metal:use-macro="here/main_template/macros/master"
-      i18n:domain="qseoptimizer">
-  <metal:border fill-slot="top_slot">
-    <tal:border define="dummy python:request.set('enable_border',1)" />
-  </metal:border>
-  <metal:style_head fill-slot="style_slot">
-      <style type="text/css">
-          tr.datagridwidget-empty-row {
-              display:none;
-          }
-      </style>
-  </metal:style_head>
-  <metal:javascript_head fill-slot="javascript_head_slot">
-      <script type="text/javascript"
-              tal:condition="python:exists('portal/statistics.js')"
-              tal:attributes="src string:${here/absolute_url}/statistics.js">
-      </script>
-      <script type="text/javascript"
-              tal:condition="python:exists('portal/checkkeywords.js')"
-              tal:attributes="src string:${here/absolute_url}/checkkeywords.js">
-      </script>
-      <script type="text/javascript"
-              tal:condition="python:exists('portal/custommetatags.js')"
-              tal:attributes="src string:${here/absolute_url}/custommetatags.js">
-      </script>
-  </metal:javascript_head>
-  <body>
-    <div metal:fill-slot="main"
-         tal:define="errors options/state/getErrors;">
-      <h1 i18n:translate="heading_edit_seo_properties">Edit SEO Properties</h1>
-      <p i18n:translate="description_edit_seo_properties">
-        This form allows you to edit html header meta tags that are produced by 
-        Plone CMS to incrase Search Engine visibility. The values generated by
-        Plone are present as default values in input fields. To override default
-        value, check corresponding checkbox and input value itself in the 
-        corresponding field.
-      </p>
-      <form name="edit_form"
-            action=""
-            method="post"
-            tal:attributes="action string:${here/absolute_url}/${template/getId}">
-        <fieldset>
-          <legend i18n:domain="plone" i18n:translate="legend_item_properties">
-            Item Properties
-          </legend>
-          <div class="field">
-            <label i18n:translate="label_page_title_tag" for="title">
-              Page Title Tag
-            </label>
-            <div class="formHelp" i18n:translate="help_seo_title">
-              Text to be present in &lt;TITLE&gt; tag. It is displayed in 
-              browser title bar. Search engines display it as a title of the 
-              document.
-            </div>
-            <input type="checkbox"
-                   id="title_override"
-                   name="title_override"
-                   tabindex=""
-                   tal:attributes="checked python:test(here.hasProperty('qSEO_title'), 'on', None);
-                                   tabindex tabindex/next;"
-                   />
-            <label i18n:translate="label_override" for="title_override">
-              Override
-            </label>
-            <input type="text"
-                   id="seo_title"
-                   name="title"
-                   size="40"
-                   value=""
-                   tabindex=""
-                   tal:attributes="value request/title | here/@@seo_context/seo_title;
-                                   tabindex tabindex/next;"
-                   />
-          </div>
-          <div class="field">
-            <label i18n:translate="label_meta_description_tag" for="description">
-              Meta Description Tag
-            </label>
-            <div class="formHelp" i18n:translate="help_seo_description">
-              Description of the document to be indexed by Search Engines. This text will be present in meta description tag in page HTML source. 
-            </div>
-            <input type="checkbox"
-                   id="description_override"
-                   name="description_override"
-                   tabindex=""
-                   tal:attributes="checked python:test(here.hasProperty('qSEO_description'), 'on', None);
-                                   tabindex tabindex/next;"
-                   />
-            <label i18n:translate="label_override" for="description_override">
-              Override
-            </label>
-            <textarea 
-                      type="text"
-                      id="seo_description"
-                      name="description"
-                      rows="5"
-                      cols="15"
-                      tabindex=""
-                      tal:attributes="tabindex tabindex/next;"
-                      tal:content="request/description | here/@@seo_context/seo_description"
-                      ></textarea>
-
-          </div>
-            
-          <div class="field">
-            <label i18n:translate="label_meta_keywords_tag" for="keywords">
-              Meta Keywords Tag
-            </label>
-            <div class="formHelp" i18n:translate="help_seo_keywords">
-              Keywords, the page will be indexed with. 
-              <strong>Enter each keyword in separate line, please.</strong>
-              Though the relevance of listing meta keywords is of 
-              questionable value now, it is useful to set meta keywords for
-              pages - for furture reference.
-            </div>
-            <input type="checkbox"
-                   id="keywords_override"
-                   name="keywords_override"
-                   tabindex=""
-                   tal:attributes="checked python:test(here.hasProperty('qSEO_keywords'), 'on', None);
-                                   tabindex tabindex/next;"
-                   />
-            <label i18n:translate="label_override" for="keywords_override">
-              Override
-            </label>
-            <textarea 
-                      id="seo_keywords"
-                      name="keywords:lines"
-                      rows="11"
-                      cols="15"
-                      wrap="off"
-                      tabindex=""
-                      tal:attributes="tabindex tabindex/next;"
-                      tal:define="keywords request/keywords | here/@@seo_context/seo_keywords"
-                      tal:content="python:'\n'.join(keywords)"
-                      ></textarea>
-          </div>
-          <div class="field">
-            <label i18n:translate="label_html_comment" for="html_commment">
-              HTML Comment
-            </label>
-            <div class="formHelp" i18n:translate="help_seo_html_comment">
-              Comments embedded into HTML header.
-            </div>
-            <input type="checkbox"
-                   id="html_comment_override"
-                   name="html_comment_override"
-                   tabindex=""
-                   tal:attributes="checked python:test(here.hasProperty('qSEO_html_comment'), 'on', None);
-                                   tabindex tabindex/next;"
-                   />
-            <label i18n:translate="label_override" for="html_comment_override">
-              Override
-            </label>
-            <br />
-            <textarea 
-                      id="seo_html_comment"
-                      name="html_comment"
-                      rows="5"
-                      cols="15"
-                      tabindex=""
-                      tal:attributes="tabindex tabindex/next;"
-                      tal:content="request/html_comment | here/@@seo_context/seo_html_comment"
-                      ></textarea>
-          </div>
-          <div class="field">
-            <label i18n:translate="label_robot_tag" for="robots">
-              Robot Tag
-            </label>
-            <div class="formHelp" i18n:translate="help_seo_robots">
-              Robots meta tag value. Allows or denies indexing, following 
-              links, etc. for spiders indexing your content.
-            </div>
-            <input type="checkbox"
-                   id="robots_override"
-                   name="robots_override"
-                   tabindex=""
-                   tal:attributes="checked python:test(here.hasProperty('qSEO_robots'), 'on', None);
-                                   tabindex tabindex/next;"
-                   />
-            <label i18n:translate="label_override" for="robots_override">
-              Override
-            </label><br />
-            <input type="text"
-                   id="seo_robots"
-                   name="robots"
-                   size="25"
-                   value=""
-                   tabindex=""
-                   tal:attributes="value request/robots | here/@@seo_context/seo_robots;
-                                   tabindex tabindex/next;"
-                   />
-          </div>
-          <div class="field">
-            <label i18n:translate="label_distribution_tag" for="distribution">
-              Distribution Tag
-            </label>
-            <div class="formHelp" i18n:translate="help_seo_distribution">
-              Distribution meta tag to designate time and area disribution
-              of the document.
-            </div>
-            <input type="checkbox"
-                   id="distribution_override"
-                   name="distribution_override"
-                   tabindex=""
-                   tal:attributes="checked python:test(here.hasProperty('qSEO_distribution'), 'on', None);
-                                   tabindex tabindex/next;"
-                   />
-            <label i18n:translate="label_override" for="distribution_override">
-              Override
-            </label><br />
-            <input type="text"
-                   id="seo_distribution"
-                   name="distribution"
-                   size="25"
-                   value=""
-                   tabindex=""
-                   tal:attributes="value request/distribution | here/@@seo_context/seo_distribution;
-                                   tabindex tabindex/next;"
-                   />
-          </div>
-          <div class="field"
-               tal:define="error errors/canonical|nothing;"
-               tal:attributes="class python:test(error, 'field error', 'field')">
-            <label i18n:translate="label_canonical_tag" for="canonical">
-              Canonical URL
-            </label>
-            <div class="formHelp" i18n:translate="help_seo_canonical">
-              Specify your canonical URL.
-              If your site has identical or vastly similar content that's accessible through multiple URLs,
-              this format provides you with more control over the URL returned in search results.
-            </div>
-            <input type="checkbox"
-                   id="canonical_override"
-                   name="canonical_override"
-                   tabindex=""
-                   tal:attributes="checked python:test(here.hasProperty('qSEO_canonical'), 'on', None);
-                                   tabindex tabindex/next;"
-                   />
-            <label i18n:translate="label_override" for="canonical_override">
-              Override
-            </label><br />
-            <div tal:content="error">Validation error output</div>
-            <input type="text"
-                   id="seo_canonical"
-                   name="canonical"
-                   size="55"
-                   value=""
-                   tabindex=""
-                   tal:attributes="value request/canonical | here/@@seo_context/seo_canonical;
-                                   tabindex tabindex/next;"
-                   />
-          </div>
-          <div class="field"
-               tal:define="fieldName string:custommetatags;
-                           nonEmptylocalMetaTags here/@@seo_context/seo_nonEmptylocalMetaTags;">
-            <label i18n:translate="label_custom_metatags" for="custom_metatags">
-              Custom Meta Tags
-            </label>
-            <div class="formHelp" i18n:translate="help_seo_custommetatags">
-              Here you can manage your custom meta tags. Specify local Meta Tags parameters to be added to the global Meta Tags.  
-              If metacontent field is empty, then a meta tag will not be present on this page.
-
-            </div>
-            <input type="checkbox"
-                   id="custommetatags_override"
-                   name="custommetatags_override"
-                   tabindex=""
-                   tal:attributes="checked python:test(nonEmptylocalMetaTags, 'on', None);
-                                   tabindex tabindex/next;"
-                   />
-            <label i18n:translate="label_override" for="custommetatags_override">
-              Override
-            </label><br />
-            <table class="custom-metatags-table"
-                   id="datagridwidget-table-custommetatags"
-                   style="width: 100%"
-                   tal:define="columnNames python:['meta name', 'meta content'];
-                               columnIds   python:['meta_name', 'meta_content'];
-                               globalMT    here/@@seo_context/seo_globalWithoutLocalCustomMetaTags;
-                               localMT    here/@@seo_context/seo_localCustomMetaTags;">
-                <thead>
-                    <tr>
-                        <th class="discreet" style="text-align: left"
-                            tal:repeat="columnName columnNames"
-                            tal:content="columnName"
-                            i18n:translate="">Column name</th>
-                        <th />
-                        <th />
-                    </tr>
-                </thead>
-                <tbody id="datagridwidget-tbody-custommetatags">
-                    <tal:row-loop tal:repeat="row globalMT">
-                        <tr id="datagridwidget-row">
-                            <tal:vars define="fieldId string:${fieldName}_${repeat/row/number}">
-                                <td class="datagridwidget-cell"
-                                    tal:repeat="column columnIds">
-                                    <tal:cell tal:define="cell_value python:row.get(column);">
-                                        <input type="text"
-                                               id="columnId_fieldId"
-                                               value=""
-                                               name="fieldId.columnId:records"
-                                               style="width: 100%;"
-                                               tal:attributes="name string:${fieldName}.${column}:records;
-                                                               id string:${column}_${fieldId};
-                                                               value cell_value"/>
-                                    </tal:cell>
-                                </td>
-                            </tal:vars>
-                        </tr>
-                    </tal:row-loop>
-                    <tal:row-loop tal:repeat="row localMT">
-                        <tr id="datagridwidget-row">
-                            <tal:vars define="fieldId string:${fieldName}_${repeat/row/number}">
-                                <td class="datagridwidget-cell"
-                                    tal:repeat="column columnIds">
-                                    <tal:cell tal:define="cell_value python:row.get(column);">
-                                        <input type="text"
-                                               id="columnId_fieldId"
-                                               value=""
-                                               name="fieldId.columnId:records"
-                                               style="width: 100%;"
-                                               tal:attributes="name string:${fieldName}.${column}:records;
-                                                               id string:${column}_${fieldId};
-                                                               value cell_value"/>
-                                    </tal:cell>
-                                </td>
-                                <td  class="datagridwidget-manipulator">
-                                    <img alt="Delete row"
-                                         onclick="customMetaTagsFunctions.removeFieldRow(this);return false"
-                                         tal:attributes="src string:${portal_url}/delete_icon.gif;" />
-                                </td>
-                                <td class="datagridwidget-hidden-data">
-                                    <input type="hidden"
-                                           tal:attributes="name string:${fieldName}.orderindex_:records;
-                                                           id string:orderindex__${fieldId};
-                                                           value repeat/row/number;" />
-                                </td>
-                            </tal:vars>
-                        </tr>
-                    </tal:row-loop>
-                    <tr id="datagridwidget-empty-row"
-                        class="datagridwidget-empty-row"
-                        tal:define="fieldId string:${fieldName}_new">
-                        <td class="datagridwidget-cell"
-                            tal:repeat="column columnIds">
-                            <span>
-                                <input type="text"
-                                       id="columnId_fieldName_new"
-                                       value=""
-                                       name="fieldName.columnId:records"
-                                       style="width: 100%;"
-                                       tal:attributes="id string:${column}_${fieldName}_new;
-                                                       name string:${fieldName}.${column}:records;" />
-                           </span>
-                        </td>
-                        <td  class="datagridwidget-manipulator">
-                            <img alt="Delete row"
-                                 onclick="customMetaTagsFunctions.removeFieldRow(this);return false"
-                                 tal:attributes="src string:${portal_url}/delete_icon.gif;" />
-                        </td>
-                        <td class="datagridwidget-hidden-data">
-                            <input type="hidden"
-                                   value="template_row_marker"
-                                   tal:attributes="name string:${fieldName}.orderindex_:records;
-                                                  id string:orderindex__${fieldId};" />
-                        </td>
-                    </tr>
-                </tbody>
-            </table>
-            <input type="button"
-                   class="datagridwidget-add-button"
-                   id="datagridwidget-add-button"
-                   value="Add new row"
-                   tal:attributes="onclick string:customMetaTagsFunctions.addRow('${fieldName}')" />
-          </div>
-          <div class="formControls"
-               tal:define="process_creation request/process_creation|nothing;"
-               i18n:domain="plone">
-            <input class="context"
-                   tabindex=""
-                   type="submit"
-                   name="form.button.Save"
-                   value="Save"
-                   i18n:attributes="value"
-                   tal:attributes="tabindex tabindex/next;" />
-            <input class="standalone"
-                   tabindex=""
-                   type="submit"
-                   name="form.button.Cancel"
-                   value="Cancel"
-                   i18n:attributes="value"
-                   tal:attributes="tabindex tabindex/next;" />
-          </div>
-        </fieldset>
-        <input type="hidden" name="form.submitted" value="1" />
-      </form>
-    </div>
-  </body>
-</html>
-
Index: intagroup.seoptimizer/trunk/quintagroup/seoptimizer/skins/quintagroup.seoptimizer/qseo_properties_edit_form.cpt.metadata
===================================================================
--- /quintagroup.seoptimizer/trunk/quintagroup/seoptimizer/skins/quintagroup.seoptimizer/qseo_properties_edit_form.cpt.metadata	(revision 1465)
+++ 	(revision )
@@ -1,14 +1,0 @@
-[default]
-title=Edit SEO Properties
-
-[security]
-View=0:Authenticated
-
-[validators]
-validators..Save=validate_qseo_properties
-validators..Cancel=
-
-[actions]
-action.success..Save=traverse_to:string:qseo_properties_edit
-action.success..Cancel=redirect_to_action:string:view
-action.failure=traverse_to:string:qseo_properties_edit_form
Index: intagroup.seoptimizer/trunk/quintagroup/seoptimizer/skins/quintagroup.seoptimizer/validate_qseo_properties.vpy
===================================================================
--- /quintagroup.seoptimizer/trunk/quintagroup/seoptimizer/skins/quintagroup.seoptimizer/validate_qseo_properties.vpy	(revision 1465)
+++ 	(revision )
@@ -1,30 +1,0 @@
-## Controller Python Script "qseo_properties_edit"
-##bind container=container
-##bind context=context
-##bind namespace=
-##bind script=script
-##bind state=state
-##bind subpath=traverse_subpath
-##title=validates SEO Properties
-##parameters=title=None,description=None,canonical=None,keywords=None,html_comment=None,robots=None,distribution=None,title_override=0,description_override=0,canonical_override=0,keywords_override=0,html_comment_override=0,robots_override=0,distribution_override=0,custommetatags=[]
-
-from Products.CMFCore.utils import getToolByName
-from quintagroup.seoptimizer import SeoptimizerMessageFactory as _
-
-def getMainDomain(url):
-    url = url.split('//')[-1]
-    dompath = url.split(':')[0]
-    dom = dompath.split('/')[0]
-    return '.'.join(dom.split('.')[-2:])
-
-purl = getToolByName(context, 'portal_url')()
-if canonical:
-    pdomain = getMainDomain(purl)
-    if not pdomain == getMainDomain(canonical):
-        state.setError('canonical', _(u'Canonical URL mast be in "%s" domain' % pdomain), "canonical")
-
-if state.getErrors():
-    context.plone_utils.addPortalMessage(_(u'Please correct the indicated errors.'))
-    return state.set(status='failure')
-else:
-    return state
