20 |
$Id$ |
$Id$ |
21 |
""" |
""" |
22 |
|
|
23 |
import re, zLOG |
import re, zLOG, Globals |
24 |
|
from OFS.Folder import Folder |
25 |
from types import DictType, StringType, UnicodeType |
from types import DictType, StringType, UnicodeType |
26 |
from Negotiator import negotiator |
from Negotiator import negotiator |
27 |
from Domain import Domain |
from Domain import Domain |
56 |
LANGUAGE_FALLBACKS = list(os.environ.get('LANGUAGE_FALLBACKS', 'en').split(' ')) |
LANGUAGE_FALLBACKS = list(os.environ.get('LANGUAGE_FALLBACKS', 'en').split(' ')) |
57 |
|
|
58 |
|
|
59 |
class PlacelessTranslationService: |
class PlacelessTranslationService(Folder): |
60 |
|
meta_type = title = 'Placeless Translation Service' |
61 |
|
icon = 'misc_/PlacelessTranslationService/PlacelessTranslationService.png' |
62 |
|
# major, minor, patchlevel, internal |
63 |
|
# internal is always 0 on releases; if you hack this internally, increment it |
64 |
|
_class_version = (0, 4, 0, 4) |
65 |
|
all_meta_types = () |
66 |
|
|
67 |
def __init__(self, default_domain='global', fallbacks=None): |
def __init__(self, default_domain='global', fallbacks=None): |
68 |
|
self._instance_version = self._class_version |
69 |
# XXX We haven't specified that ITranslationServices have a default |
# XXX We haven't specified that ITranslationServices have a default |
70 |
# domain. So far, we've required the domain argument to .translate() |
# domain. So far, we've required the domain argument to .translate() |
71 |
self._domain = default_domain |
self._domain = default_domain |
72 |
# _catalogs maps (language, domain) to IMessageCatalog instances |
# _catalogs maps (language, domain) to identifiers |
73 |
self._catalogs = {} |
self._catalogs = {} |
|
# _data maps IMessageCatalog.getIdentifier() to IMessageCatalog |
|
|
self._data = {} |
|
74 |
# What languages to fallback to, if there is no catalog for the |
# What languages to fallback to, if there is no catalog for the |
75 |
# requested language (no fallback on individual messages) |
# requested language (no fallback on individual messages) |
76 |
if fallbacks is None: |
if fallbacks is None: |
77 |
fallbacks = LANGUAGE_FALLBACKS |
fallbacks = LANGUAGE_FALLBACKS |
78 |
self._fallbacks = fallbacks |
self._fallbacks = fallbacks |
79 |
|
|
80 |
|
# Disable some inappropriate operations |
81 |
|
manage_addObject=None |
82 |
|
manage_delObjects=None |
83 |
|
manage_addProperty=None |
84 |
|
manage_editProperties=None |
85 |
|
manage_delProperties=None |
86 |
|
|
87 |
def _registerMessageCatalog(self, language, domain, catalog_name): |
def _registerMessageCatalog(self, language, domain, catalog_name): |
88 |
http_language = language.lower().replace('_', '-') |
http_language = language.lower().replace('_', '-') |
89 |
key = (http_language, domain) |
key = (http_language, domain) |
90 |
mc = self._catalogs.setdefault(key, []) |
mc = self._catalogs.setdefault(key, []) |
91 |
mc.append(catalog_name) |
mc.append(catalog_name) |
|
log('adding catalog for domain %s, language %s' % (domain, language)) |
|
92 |
|
|
93 |
def addCatalog(self, catalog): |
def addCatalog(self, catalog): |
94 |
self._data[catalog.getIdentifier()] = catalog |
try: |
95 |
|
self._delObject(catalog.id) |
96 |
|
except: |
97 |
|
pass |
98 |
|
self._setObject(catalog.id, catalog, set_owner=False) |
99 |
|
log('adding %s: %s' % (catalog.id, catalog.title)) |
100 |
self._registerMessageCatalog(catalog.getLanguage(), |
self._registerMessageCatalog(catalog.getLanguage(), |
101 |
catalog.getDomain(), |
catalog.getDomain(), |
102 |
catalog.getIdentifier()) |
catalog.getIdentifier()) |
111 |
for (ccode, cdomain), cnames in self._catalogs.items(): |
for (ccode, cdomain), cnames in self._catalogs.items(): |
112 |
if ccode == code: |
if ccode == code: |
113 |
for cname in cnames: |
for cname in cnames: |
114 |
cat = self._data[cname] |
cat = self._getOb(cname) |
115 |
if cat.name: |
if cat.name: |
116 |
return cat.name |
return cat.name |
117 |
|
|
166 |
break |
break |
167 |
|
|
168 |
for name in catalog_names: |
for name in catalog_names: |
169 |
catalog = self._data[name] |
catalog = self._getOb(name) |
170 |
try: |
try: |
171 |
text = catalog.getMessage(msgid, default) |
text = catalog.getMessage(msgid, default) |
172 |
except KeyError: |
except KeyError: |