[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"> </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"> </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">
<input class="form-element" type="submit"
name="@@deleteMessages.html:method" value="Delete Labels">
</div>
</form>
</div>
</body>
</html>