Code

Added dummy hooks for I18N and some preliminary (test) markup of
authorjhermann <jhermann@57a73879-2fb5-44c3-a270-3262357dd7e2>
Wed, 21 Nov 2001 22:57:29 +0000 (22:57 +0000)
committerjhermann <jhermann@57a73879-2fb5-44c3-a270-3262357dd7e2>
Wed, 21 Nov 2001 22:57:29 +0000 (22:57 +0000)
translatable messages

git-svn-id: http://svn.roundup-tracker.org/svnroot/roundup/trunk@410 57a73879-2fb5-44c3-a270-3262357dd7e2

CHANGES.txt
roundup/cgi_client.py
roundup/i18n.py [new file with mode: 0644]

index 6bb1a5281e3f0386a72728512c78d74c578ba1d8..8686a36858ede10816a8e4a41848a8e8075d9b07 100644 (file)
@@ -16,6 +16,8 @@ Feature:
  . incorporated patch from Roch'e Compaan implementing attachments in nosy
    e-mail
  . added a target version field to the extended issue schema
+ . added dummy hooks for I18N and some preliminary (test) markup of
+   translatable messages
 
 Fixed:
  . Fixed a bug in HTMLTemplate changes.
index a17e05e90b81227c1d8050c4f789b792a81153af..4875f95edb0370967d548bfacf2504a86b19b24c 100644 (file)
 # BASIS, AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE,
 # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
 # 
-# $Id: cgi_client.py,v 1.59 2001-11-21 03:21:13 richard Exp $
+# $Id: cgi_client.py,v 1.60 2001-11-21 22:57:28 jhermann Exp $
 
 import os, cgi, pprint, StringIO, urlparse, re, traceback, mimetypes
 import binascii, Cookie, time
 
 import roundupdb, htmltemplate, date, hyperdb, password
+from roundup.i18n import _
 
 class Unauthorised(ValueError):
     pass
@@ -106,7 +107,7 @@ class Client:
 <a href="user%s">My Details</a> | <a href="logout">Logout</a>
 '''%(userid, userid)
         else:
-            user_info = '<a href="login">Login</a>'
+            user_info = _('<a href="login">Login</a>')
         if self.user is not None:
             add_links = '''
 | Add
@@ -274,7 +275,7 @@ class Client:
 
         '''
         cn = self.classname
-        self.pagehead('Index of %s'%cn)
+        self.pagehead(_('Index of %(classname)s')%{'classname': cn})
         if sort is None: sort = self.index_arg(':sort')
         if group is None: group = self.index_arg(':group')
         if filter is None: filter = self.index_arg(':filter')
@@ -372,7 +373,7 @@ class Client:
         #
         # now the display
         #
-        self.pagehead('User: %s'%node_user, message)
+        self.pagehead(_('User: %(user)s')%{'user': node_user}, message)
 
         # use the template to display the item
         item = htmltemplate.ItemTemplate(self, self.TEMPLATES, 'user')
@@ -581,7 +582,7 @@ class Client:
         ''' display a list of all the classes in the database
         '''
         if self.user == 'admin':
-            self.pagehead('Table of classes', message)
+            self.pagehead(_('Table of classes'), message)
             classnames = self.db.classes.keys()
             classnames.sort()
             self.write('<table border=0 cellspacing=0 cellpadding=2>\n')
@@ -599,7 +600,7 @@ class Client:
             raise Unauthorised
 
     def login(self, message=None, newuser_form=None):
-        self.pagehead('Login to roundup', message)
+        self.pagehead(_('Login to roundup'), message)
         self.write('''
 <table>
 <tr><td colspan=2 class="strong-header">Existing User Login</td></tr>
@@ -661,13 +662,13 @@ class Client:
         except KeyError:
             name = self.user
             self.make_user_anonymous()
-            return self.login(message='No such user "%s"'%name)
+            return self.login(message=_('No such user "%(name)s"')%locals())
 
         # and that the password is correct
         pw = self.db.user.get(uid, 'password')
         if password != self.db.user.get(uid, 'password'):
             self.make_user_anonymous()
-            return self.login(message='Incorrect password')
+            return self.login(message=_('Incorrect password'))
 
         self.set_cookie(self.user, password)
         return self.index()
@@ -977,6 +978,9 @@ def parsePropsFromForm(db, cl, form, nodeid=0):
 
 #
 # $Log: not supported by cvs2svn $
+# Revision 1.59  2001/11/21 03:21:13  richard
+# oops
+#
 # Revision 1.58  2001/11/21 03:11:28  richard
 # Better handling of new properties.
 #
diff --git a/roundup/i18n.py b/roundup/i18n.py
new file mode 100644 (file)
index 0000000..81edf78
--- /dev/null
@@ -0,0 +1,50 @@
+#
+# Copyright (c) 2001 Bizar Software Pty Ltd (http://www.bizarsoftware.com.au/)
+# This module is free software, and you may redistribute it and/or modify
+# under the same terms as Python, so long as this copyright message and
+# disclaimer are retained in their original form.
+#
+# IN NO EVENT SHALL BIZAR SOFTWARE PTY LTD BE LIABLE TO ANY PARTY FOR
+# DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING
+# OUT OF THE USE OF THIS CODE, EVEN IF THE AUTHOR HAS BEEN ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+# BIZAR SOFTWARE PTY LTD SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+# BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE.  THE CODE PROVIDED HEREUNDER IS ON AN "AS IS"
+# BASIS, AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE,
+# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+# 
+# $Id: i18n.py,v 1.1 2001-11-21 22:57:29 jhermann Exp $
+
+"""
+RoundUp Internationalization (I18N)
+
+To use this module, the following code should be used:
+
+    from roundup.i18n import _
+    ...
+    print _("Some text that can be translated")
+
+Note that to enable re-ordering of inserted texts in formatting strings
+(which can easily happen if a sentence has to be re-ordered due to
+grammatical changes), translatable formats should use named format specs:
+
+    ... _('Index of %(classname)s') % {'classname': cn} ...
+
+Also, this eases the job of translators since they have some context what
+the dynamic portion of a message really means.
+
+"""
+
+# first, we try to import gettext; this probably never fails, but we make
+# sure we survive this anyway
+try:
+    import gettext
+except ImportError:
+    # fall-back to dummy on errors (returning the english text)
+    _ = lambda text: text
+else:
+    # and for now, we JUST implement the dummy in any case
+    _ = lambda text: text
+