[Zope-Checkins] CVS: Zope3/lib/python/Zope/I18n/Views/Browser - Translate.py:1.1 Translate.pyc:1.1 __init__.py:1.1 __init__.pyc:1.1 browser.zcml:1.1 translate.pt:1.1

Stephan Richter srichter@cbu.edu
Wed, 12 Jun 2002 14:38:58 -0400


Update of /cvs-repository/Zope3/lib/python/Zope/I18n/Views/Browser
In directory cvs.zope.org:/tmp/cvs-serv9092/I18n/Views/Browser

Added Files:
	Translate.py Translate.pyc __init__.py __init__.pyc 
	browser.zcml translate.pt 
Log Message:
I finally got around to finish some priliminary Translation Support. This
complements the work done recently by Barry and Fred concerning the PT i18n
namespace. 

SimpleTranslationService: The possibly simplest implementation of a 
  Translation service. It does not do much, but provides a nice base class
  for other translation services and is great for testing. This 
  implementation does not use message catalog for its storage.

TranslationService: This is a local, persistent flavour of the translation
  service. It is used for TTW development. A first GUI for adding and 
  editing (delete does not work yet) messages is also there already. People
  which use ZBabel will find the interface very familiar. 
  This class also implements many, many methods required for the editing via 
  the browser. These methods will be probably split up into a separate 
  interface called IEditableTranslationService.

GlobalTranslationService: This is a placeless version of the translation
  service. It will be used to register translations via the file system and
  ZCML. As default the GettextMessageCatalog is used, whcih reads in 
  gettext files.


MessageCatalog: A persistent implementation to accomedate the 
  TranslationService. It also implements a couple additional methods to
  support updating and deleting of messages.

GettextMessageCatalog: Every catalog basically represents one gettext
  (*.mo) file. This message catalog cannot be altered, as the file is used
  read only. This message catalog is primarily used in combination with 
  GlobalTranslationService.


Domain: This is basically a shortcut object, so that you do not have to 
  specify the domain for a translation every single time. However, I think
  this obejct is not quiet ready yet, as I do not have the use cases on how
  to handle the placefulness well yet.

Negotiator: The language negotiator helps the translation service to 
  determine the target language in case it was not explicitly passed as an
  argument.

gts ZCML namespace: Using the registerTranslations directive you can 
  specify a gettext directory as the source for additional translations.
  These translation will be added to the GlobalTranslationService, where 
  they will be available for usage. Note that the path of the various
  gettext files identify the language and domain unambiguously.


=== Added File Zope3/lib/python/Zope/I18n/Views/Browser/Translate.py ===
##############################################################################
#
# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
# All Rights Reserved.
# 
# This software is subject to the provisions of the Zope Public License,
# Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
# FOR A PARTICULAR PURPOSE.
# 
##############################################################################
"""Translation GUI

$Id: Translate.py,v 1.1 2002/06/12 18:38:57 srichter Exp $
"""
from Zope.Publisher.Browser.BrowserView import BrowserView
from Zope.App.PageTemplate import ViewPageTemplateFile
from Zope.I18n.ITranslationService import ITranslationService


class Translate(BrowserView):
    """ """
    
    __used_for__ = ITranslationService


    index = ViewPageTemplateFile('translate.pt')


    def getMessages(self):
        """Get messages based on the domain selection"""
        filter = self.request.get('filter', '%')
        domains = self.getEditDomains()
        messages = []
        for domain in domains:
            for msg_id in self.context.getMessageIdsOfDomain(domain, filter):
                messages.append((msg_id, domain, len(messages)))

        return messages


    def getTranslation(self, domain, msgid, target_lang):
        """ """
        return self.context.translate(domain, msgid,
                                      target_language=target_lang)
    

    def getAllLanguages(self):
        """Get all available languages from the Translation Service."""
        return self.context.getAllLanguages()


    def getAllDomains(self):
        return self.context.getAllDomains()
        

    def getEditLanguages(self):
        '''get the languages that are selected for editing'''
        languages = self.request.cookies.get('edit_languages', '')
        return filter(None, languages.split(','))


    def getEditDomains(self):
        '''get the languages that are selected for editing'''
        domains = self.request.cookies.get('edit_domains', '')
        return filter(None, domains.split(','))


    def editMessages(self):
        """ """
        # Handle new Messages
        for count in range(5):
            msg_id = self.request.get('new-msg_id-%i' %count, '')
            if msg_id:
                domain = REQUEST.get('new-domain-%i' %count, 'default')
                for language in self.getEditLanguages(self.request):
                    msg = self.request.get('new-%s-%i' %(language, count),
                                           msg_id)
                    self.context.addMessage(domain, msg_id, msg, language)

        # Handle edited Messages
        keys = filter(lambda k: k.startswith('edit-msg_id-'),
                      self.request.keys())
        keys = map(lambda k: k[12:], keys)
        for key in keys:
            msg_id = self.request['edit-msg_id-'+key]
            domain = self.request['edit-domain-'+key]
            for language in self.getEditLanguages(self.request):
                msg = self.request['edit-%s-%s' %(language, key)]
                if msg != self.context.translate(domain, msg_id,
                                                 target_language=language):
                    self.context.updateMessage(domain, msg_id, msg, language)
                
        return self.request.getResponse().redirect(self.request.URL[-1])


    def deleteMessages(self):
        """ """
        return self.request.getResponse().redirect(self.request.URL[-1])


    def addLanguage(self, language):
        """ """
        self.context.addLanguage(language)
        return self.request.getResponse().redirect(self.request.URL[-1])


    def addDomain(self, domain):
        """ """
        self.context.addDomain(domain)
        return self.request.getResponse().redirect(self.request.URL[-1])


    def changeEditLanguages(self, languages=[]):
        """ """
        self.request.getResponse().setCookie('edit_languages',
                                             ','.join(languages))
        return self.request.getResponse().redirect(self.request.URL[-1])


    def changeEditDomains(self, domains=[]):
        """ """
        self.request.getResponse().setCookie('edit_domains', ','.join(domains))
        return self.request.getResponse().redirect(self.request.URL[-1])


    def changeFilter(self):
        """ """
        filter = self.request.get('filter', '%')
        self.request.getResponse().setCookie('filter', filter)
        return self.request.getResponse().redirect(self.request.URL[-1])


    def deleteLanguages(self, languages):
        """ """
        for language in languages:
            self.context.deleteLanguage(language)
        return self.request.getResponse().redirect(self.request.URL[-1])


    def deleteDomains(self, domains):
        """ """
        for domain in domains:
            self.context.deleteDomain(domain)
        return self.request.getResponse().redirect(self.request.URL[-1])




=== Added File Zope3/lib/python/Zope/I18n/Views/Browser/Translate.pyc ===
-í
d=c       sY     d  Z    d k l Z  d k l Z  d k l Z  d e f d „  ƒ  YZ d S(   sN   Translation GUI

$Id: Contents.py,v 1.1.4.1 2002/05/25 14:03:20 ctheune Exp $
(   s   BrowserView(   s   ViewPageTemplateFile(   s   ITranslationServices	   Translatec      sŕ    d  Z    e Z  e d ƒ Z   d „  Z , d „  Z 2 d „  Z 7 d „  Z ; d „  Z	 A d „  Z
 G d „  Z c d	 „  Z h d
 „  Z
 n d „  Z t g  d „ Z { g  d
 „ Z  d „  Z ˆ d „  Z  d „  Z RS(   s    s   translate.ptc    s     ! " |  i i d d ƒ } # |  i ƒ  } $ g  } % xV | D% ]K } & x? |  i i	 | | ƒ D& ]% } ' | i | | t | ƒ f ƒ qb Wq@ W) | Sd S(   s*   Get messages based on the domain selections   filters   %N(
   s   selfs   requests   gets   filters   getEditDomainss   domainss   messagess   domains   contexts   getMessageIdsOfDomains   msg_ids   appends   len(   s   selfs   filters   domains   domainss   msg_ids   messages(    (    sO   /home/srichter/Zope3/Zope3-Head/lib/python/Zope/I18n/Views/Browser/Translate.pys   getMessages  s   	
 	 	'c    s)   , - . |  i i | | / d | ƒSd S(   s    s   target_languageN(   s   selfs   contexts	   translates   domains   msgids   target_lang(   s   selfs   domains   msgids   target_lang(    (    sO   /home/srichter/Zope3/Zope3-Head/lib/python/Zope/I18n/Views/Browser/Translate.pys   getTranslation, s   c    s   2 3 4 |  i i ƒ  Sd S(   s9   Get all available languages from the Translation Service.N(   s   selfs   contexts   getAllLanguages(   s   self(    (    sO   /home/srichter/Zope3/Zope3-Head/lib/python/Zope/I18n/Views/Browser/Translate.pys   getAllLanguages2 s   c    s   7 8 |  i i ƒ  Sd  S(   N(   s   selfs   contexts
   getAllDomains(   s   self(    (    sO   /home/srichter/Zope3/Zope3-Head/lib/python/Zope/I18n/Views/Browser/Translate.pys
   getAllDomains7 s   c    s>   ; < = |  i i i d d ƒ } > t t | i d ƒ ƒ Sd S(   s/   get the languages that are selected fo!
r editings   edit_languagess    s   ,N(   s   selfs   requests   cookiess   gets	   languagess   filters   Nones   split(   s   selfs	   languages(    (    sO   /home/srichter/Zope3/Zope3-Head/lib/python/Zope/I18n/Views/Browser/Translate.pys   getEditLanguages; s   c    s>   A B C |  i i i d d ƒ } D t t | i d ƒ ƒ Sd S(   s/   get the languages that are selected for editings   edit_domainss    s   ,N(   s   selfs   requests   cookiess   gets   domainss   filters   Nones   split(   s   selfs   domains(    (    sO   /home/srichter/Zope3/Zope3-Head/lib/python/Zope/I18n/Views/Browser/Translate.pys   getEditDomainsA s   c    së  G H J xž t  d ƒ DJ ]­ } K |  i i d | d ƒ } L | o M t i d | d ƒ } N x^ |  i |  i ƒ DN ]G } O |  i i d | | f P | ƒ } Q |  i i | | | | ƒ qt Wn q WT t
 d „  U |  i i ƒ  ƒ } V t d „  | ƒ } W xž | DW ]ł } X |  i d	 !
| } Y |  i d
 | } Z x |  i |  i ƒ DZ ]h } [ |  i d | | f } \ | |  i i | | ] d | ƒj o  ^ |  i i | | | | ƒ n qQWq
W` |  i i ƒ  i |  i i d
 ƒ Sd S(   s    i   s
   new-msg_id-%is    s
   new-domain-%is   defaults	   new-%s-%ic    s   T |  i d ƒ S(   Ns   edit-msg_id-(   s   ks
   startswith(   s   k(    (    sO   /home/srichter/Zope3/Zope3-Head/lib/python/Zope/I18n/Views/Browser/Translate.pys   <lambda>T s    c    s   V |  d S(   Ni   (   s   k(   s   k(    (    sO   /home/srichter/Zope3/Zope3-Head/lib/python/Zope/I18n/Views/Browser/Translate.pys   <lambda>V s    s   edit-msg_id-s   edit-domain-s
   edit-%s-%ss   target_languagei˙˙˙˙N(   s   ranges   counts   selfs   requests   gets   msg_ids   REQUESTs   domains   getEditLanguagess   languages   msgs   contexts
   addMessages   filters   keyss   maps   keys	   translates
   updateMessages   getResponses   redirects   URL(   s   selfs   counts   domains   languages   keyss   msg_ids   keys   msg(    (    sO   /home/srichter/Zope3/Zope3-Head/lib/python/Zope/I18n/Views/Browser/Translate.pys   editMessagesG s2    	
 	(
 	 	(c    s-   c d e |  i i ƒ  i |  i i d ƒ Sd S(   s    i˙˙˙˙N(   s   selfs   requests   getResponses   redirects   URL(   s   self(    (    sO   /home/srichter/Zope3/Zope3-Head/lib/python/Zope/I18n/Views/Browser/Translate.pys   deleteMessagesc s   c    s@   h i j |  i i | ƒ k |  i i ƒ  i |  i i d ƒ Sd S(   s    i˙˙˙˙N(   s   selfs   contexts   addLanguages   languages   requests   getResponses   redirects   URL(   s   selfs   language(    (    sO   /home/srichter/Zope3/Zope3-Head/lib/python/Zope/I18n/Views/Browser/Translate.pys   addLanguageh s   c    s@   n o p |  i i | ƒ q |  i i ƒ  i |  i i d ƒ Sd S(   s    i˙˙˙˙N(   s   selfs   contexts	   addDomains   domains   requests   getResponses   redirects   URL(   s   selfs   domain(    (    sO   /home/srichter/Zope3/Zope3-Head/lib/python/Zope/I18n/Views/Browser/Translate.pys	   addDomainn s   c !
   sU   t u v |  i i ƒ  i d w d i | ƒ ƒ x |  i i ƒ  i |  i i d ƒ Sd S(   s    s   edit_languagess   ,i˙˙˙˙N(   s   selfs   requests   getResponses	   setCookies   joins	   languagess   redirects   URL(   s   selfs	   languages(    (    sO   /home/srichter/Zope3/Zope3-Head/lib/python/Zope/I18n/Views/Browser/Translate.pys   changeEditLanguagest s   c    sR   { | } |  i i ƒ  i d d i | ƒ ƒ ~ |  i i ƒ  i |  i i d ƒ Sd S(   s    s   edit_domainss   ,i˙˙˙˙N(   s   selfs   requests   getResponses	   setCookies   joins   domainss   redirects   URL(   s   selfs   domains(    (    sO   /home/srichter/Zope3/Zope3-Head/lib/python/Zope/I18n/Views/Browser/Translate.pys   changeEditDomains{ s   %c    sa    ‚ ƒ |  i i d d ƒ } „ |  i i ƒ  i d | ƒ … |  i i ƒ  i |  i i d ƒ Sd S(   s    s   filters   %i˙˙˙˙N(   s   selfs   requests   gets   filters   getRes!
ponses	   setCookies   redirects   URL(   s   selfs   filter(    (    sO   /home/srichter/Zope3/Zope3-Head/lib/python/Zope/I18n/Views/Browser/Translate.pys   changeFilter s   c    sW   ˆ ‰ Š x$ | DŠ ] } ‹ |  i i | ƒ q WŒ |  i i ƒ  i |  i i d ƒ Sd S(   s    i˙˙˙˙N(	   s	   languagess   languages   selfs   contexts   deleteLanguages   requests   getResponses   redirects   URL(   s   selfs	   languagess   language(    (    sO   /home/srichter/Zope3/Zope3-Head/lib/python/Zope/I18n/Views/Browser/Translate.pys   deleteLanguagesˆ s
   
 	c    sW     ‘ x$ | D‘ ] } ’ |  i i | ƒ q W“ |  i i ƒ  i |  i i d ƒ Sd S(   s    i˙˙˙˙N(	   s   domainss   domains   selfs   contexts   deleteDomains   requests   getResponses   redirects   URL(   s   selfs   domainss   domain(    (    sO   /home/srichter/Zope3/Zope3-Head/lib/python/Zope/I18n/Views/Browser/Translate.pys
   deleteDomains s
   
 	(   s   __doc__s   ITranslationServices   __used_for__s   ViewPageTemplateFiles   indexs   getMessagess   getTranslations   getAllLanguagess
   getAllDomainss   getEditLanguagess   getEditDomainss   editMessagess   deleteMessagess   addLanguages	   addDomains   changeEditLanguagess   changeEditDomainss   changeFilters   deleteLanguagess
   deleteDomains(    (    (    sO   /home/srichter/Zope3/Zope3-Head/lib/python/Zope/I18n/Views/Browser/Translate.pys	   Translate s$   		N(   s   __doc__s"   Zope.Publisher.Browser.BrowserViews   BrowserViews   Zope.App.PageTemplates   ViewPageTemplateFiles   Zope.I18n.ITranslationServices   ITranslationServices	   Translate(   s   BrowserViews   ITranslationServices   ViewPageTemplateFiles	   Translate(    (    sO   /home/srichter/Zope3/Zope3-Head/lib/python/Zope/I18n/Views/Browser/Translate.pys   ? s   

=== Added File Zope3/lib/python/Zope/I18n/Views/Browser/__init__.py ===
##############################################################################
#
# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
# All Rights Reserved.
# 
# This software is subject to the provisions of the Zope Public License,
# Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
# FOR A PARTICULAR PURPOSE.
# 
##############################################################################



=== Added File Zope3/lib/python/Zope/I18n/Views/Browser/__init__.pyc ===
-í
ÜĄ=c       s     d  S(   N(    (    (    (    sN   /home/srichter/Zope3/Zope3-Head/lib/python/Zope/I18n/Views/Browser/__init__.pys   ?  s    

=== Added File Zope3/lib/python/Zope/I18n/Views/Browser/browser.zcml ===
<zopeConfigure
   xmlns='http://namespaces.zope.org/zope'
   xmlns:security='http://namespaces.zope.org/security'
   xmlns:zmi='http://namespaces.zope.org/zmi'
   xmlns:browser='http://namespaces.zope.org/browser'
>

  <browser:defaultView 
     for="Zope.I18n.ITranslationService."
     name="index.html"
     />

  <browser:view 
     permission="Zope.ManageServices" 
     for="Zope.I18n.ITranslationService."
     factory="Zope.I18n.Views.Browser.Translate.">

     <browser:page name="index.html" attribute="index" />

     <browser:page name="editMessages.html" attribute="editMessages" />

     <browser:page name="addLanguage.html" attribute="addLanguage" />
     <browser:page name="addDomain.html" attribute="addDomain" />

     <browser:page name="changeEditLanguages.html" 
                   attribute="changeEditLanguages" />
     <browser:page name="changeEditDomains.html" 
                   attribute="changeEditDomains" />
     <browser:page name="changeFilter.html" 
                   attribute="changeFilter" />

     <browser:page name="deleteLanguages.html" attribute="deleteLanguages" />
     <browser:page name="deleteDomains.html" attribute="deleteDomains" />

  </browser:view>

  <zmi:tabs for="Zope.I18n.ITranslationService.">
    <zmi:tab label="Translate" action="@@index.html"/>
  </zmi:tabs>

</zopeConfigure>


=== Added File Zope3/lib/python/Zope/I18n/Views/Browser/translate.pt ===
<html metal:use-macro="views/standard_macros/page">
<head>
  <title>Translation Service - Translate</title>
</head>
<body>

<div metal:fill-slot="body">

<table cols="4" width="100%" border="0">
  <tr>
    <td width="25%">
      <form action="./" method="post">
        <div class="form-label">Select Languages:</div>
        <div>
          <select name="languages:list" size="3" style="width: 80%" multiple>
            <tal:block repeat="language view/getAllLanguages">
              <option value="" 
		      tal:attributes="value language"
		      tal:content="language"
                      tal:condition="python: language not in
                                     view.getEditLanguages()" ></option>
              <option value="" selected="1"
		      tal:attributes="value language"
		      tal:content="language"
                      tal:condition="python: language in
                                     view.getEditLanguages()" ></option>
            </tal:block>
          </select>
        </div>
        <div>
          <input class="form-element" type="submit" 
                 name="@@changeEditLanguages.html:method" value="Edit">
          <input class="form-element" type="submit" 
                 name="@@deleteLanguages.html:method" value="Delete">
        </div>
      </form>
    </td>
    <td width="25%">
      <form action="./" method="post">
        <div class="form-label">Select Domains:</div>
        <div>
          <select name="domains:list" size="3" style="width: 80%" multiple>
            <tal:block repeat="domain view/getAllDomains">
              <option value="" 
		      tal:attributes="value domain"
		      tal:content="domain"
                      tal:condition="python: domain not in
                                     view.getEditDomains()" ></option>
              <option value="" selected="1"
		      tal:attributes="value domain"
		      tal:content="domain"
                      tal:condition="python: domain in
                                     view.getEditDomains()" ></option>
            </tal:block>
            </select>
          </div>
          <div>
            <input class="form-element" type="submit" 
                   name="@@changeEditDomains.html:method" value="Edit">
            <input class="form-element" type="submit" 
                   name="@@deleteDomains.html:method" value="Delete">
          </div>
        </form>
      </td>
      <td width="25%" align="right" valign="top">
        <form action="." method="post">
          <div class="form-label"
               i18n:translate="" i18n:domain="Zope-I18n">New Language:</div>
          <div>
            <input type="text" name="language" size="20" value="">
            <input type="submit" name="@@addLanguage.html:method" value="Add">
          </div>
          <div class="form-label">New Domain:</div>
          <div>
            <input type="text" name="domain" size="20" value="">
            <input type="submit" name="@@addDomain.html:method" value="Add">
          </div>
        </form>
      </td>
      <td width="25%" align="right" valign="top">
        <form action="./" method="post">
          <div class="form-label">Filter (% - wildcard):</div>
          <div>
            <input type="text" name="filter" size="25" value=""
                   tal:attributes="value request/filter|default" />
          </div>
          <div>
            <input type="submit" name="@@changeFilter.html:method" 
                   value="Filter" />
          </div>
        </form>
      </td>
    </tr>
  </table>

  <form action="./" method="post">
  <table width="100%" cellspacing="0" cellpadding="3" border="0">
    <tr class="list-header" align="left">
        <th width="16">&nbsp;</th>
        <th>Message Id</th>
        <th>Domains</th>
        <th tal:repeat="language python:view.getEditLanguages()"
            tal:content="language">de</th>
    </tr>    
    <tr tal:repeat="message python: view.getMessages()">
      <td>
        <input type="hidden"
	       tal:attributes="name python: 'edit-msg_id-%i' %message[2];
                               value python: message[0]">
        <input type="hidden"
	       tal:attributes="name python: 'edit-domain-%i' %message[2];
                               value python: message[1]">
        <input type="checkbox" names="message_ids:list"
	       tal:attributes="name python: message[2]">
      </td>
      <td>
        <a href="editMessage?messageId="
           tal:content="python: message[0]">message_id</a>
      </td>
      <td tal:content="python: message[1]">
        default
      </td>
      <td tal:repeat="language python:view.getEditLanguages()">
        <textarea cols="20" rows="2"
	  tal:attributes="name python: 'edit-%s-%i' %(language, message[2])"
          tal:content="python: view.getTranslation(message[1], 
                               message[0], language)"></textarea>
      </td>
    </tr>
    <tr><td colspan="3"
         tal:attributes="colspan python:len(view.getEditLanguages())+3">
      <hr width="80%" align="center" size="2" noshade="1">
    </td></tr>
    
    <tr tal:repeat="count python:range(5)">
      <td width="16">&nbsp;</td>
      <td>
        <textarea cols="20" rows="2" name=""
                  tal:attributes="name string:new-msg_id-${count}"></textarea> 
      </td>
      <td>
        <select name=""
                tal:attributes="name string:new-domain-${count}">
          <option value=""
    	          tal:repeat="domain python: view.getEditDomains()"
                  tal:content="domain"
		  tal:attributes="value domain">default</option>
        </select>
      </td>
      <td tal:repeat="language python:view.getEditLanguages()">
        <textarea cols="20" rows="2" name=""
          tal:attributes="name string:new-${language}-${count}"></textarea> 
      </td>
    </tr>
  </table>
    
  <div>
    <input class="form-element" type="submit" 
           name="@@editMessages.html:method" value="Edit Labels">&nbsp;
    <input class="form-element" type="submit" 
           name="@@deleteMessages.html:method" value="Delete Labels">
  </div>
  </form>
</div>
</body>
</html>