source: ZMS/trunk/_multilangmanager.py @ 1854

Revision 1854, 25.7 KB checked in by zmsdev, 6 weeks ago (diff)

Ticket#45 (uni-bern): applied fix for entities in xml-im-/export of lang-dict

Line 
1################################################################################
2# _multilangmanager.py
3#
4# This program is free software; you can redistribute it and/or
5# modify it under the terms of the GNU General Public License
6# as published by the Free Software Foundation; either version 2
7# of the License, or (at your option) any later version.
8#
9# This program is distributed in the hope that it will be useful,
10# but WITHOUT ANY WARRANTY; without even the implied warranty of
11# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12# GNU General Public License for more details.
13#
14# You should have received a copy of the GNU General Public License
15# along with this program; if not, write to the Free Software
16# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
17################################################################################
18
19# Imports.
20from App.special_dtml import HTMLFile
21from App.Common import package_home
22import OFS.misc_
23import copy
24import urllib
25import zope.interface
26# Product Imports.
27import IZMSLocale
28import _fileutil
29import _globals
30import _xmllib
31
32
33# ------------------------------------------------------------------------------
34#  importXml
35# ------------------------------------------------------------------------------
36def _importXml(self, item, zms_system=0, createIfNotExists=1):
37  if createIfNotExists:
38    key = item['key']
39    lang_dict = self.get_lang_dict()
40    lang_dict[key] = {}
41    for langId in self.getLangIds():
42      if item.has_key(langId):
43        lang_dict[key][langId] = item[langId]
44    self.setConfProperty('ZMS.custom.langs.dict',lang_dict.copy())
45
46def importXml(self, xml, REQUEST=None, zms_system=0, createIfNotExists=1):
47  if type(xml) is not str:
48    xml = xml.read()
49  value = self.parseXmlString(xml)
50  if value is None:
51    value = []
52    builder = _xmllib.XmlBuilder()
53    nWorkbook = builder.parse(xml)
54    for nWorksheet in _xmllib.xmlNodeSet(nWorkbook,'Worksheet'):
55      for nTable in _xmllib.xmlNodeSet(nWorksheet,'Table'):
56        r = 0
57        keys = []
58        for nRow in _xmllib.xmlNodeSet(nTable,'Row'):
59          c = 0
60          for nCell in _xmllib.xmlNodeSet(nRow,'Cell'):
61            for nData in _xmllib.xmlNodeSet(nCell,'Data'):
62              if r == 0:
63                if c == 0:
64                  key = 'key'
65                else:
66                  key = nData.get('cdata','')
67                keys.append(key)
68              else:
69                if c == 0:
70                  value.append({})
71                value[-1][keys[c]] = nData.get('cdata','')
72              c += 1
73          r += 1
74  if type(value) is list:
75    for item in value:
76      _importXml( self, item, zms_system, createIfNotExists)
77  else:
78    _importXml( self, value, zms_system, createIfNotExists)
79
80
81# ------------------------------------------------------------------------------
82#  _multilangmanager.getDescLangs
83# ------------------------------------------------------------------------------
84def getDescLangs(self, id, langs):
85  obs = []
86  # Primary language is always the first item in the sorted list.
87  if id == self.getPrimaryLanguage():
88    label = '*'
89  elif langs.has_key(id):
90    label = langs[id]['label']
91  else:
92    label = id
93  obs.append((label,id))
94  # Iterate descending languages.
95  for key in langs.keys():
96    if langs[key]['parent'] == id:
97      obs.extend(getDescLangs(self,key,langs))
98  return obs
99
100
101# ------------------------------------------------------------------------------
102#  _multilangmanager.setLangMethod:
103#
104#  Set/add DTML-Method (e.g. index_lang.html) for specified language.
105# ------------------------------------------------------------------------------
106def setLangMethod(self, id, raw):
107  # delete method (if already exists)
108  delLangMethod(self, id)
109  # add method
110  title = '*** DO NOT DELETE OR MODIFY ***'
111  self.manage_addDTMLMethod(id,title,raw)
112
113
114# ------------------------------------------------------------------------------
115#  _multilangmanager.delLangMethod:
116#
117#  Delete DTML-Method (e.g. index_lang.html) for specified language.
118# ------------------------------------------------------------------------------
119def delLangMethod(self, id):
120  try:
121    self.manage_delObjects(ids=[id])
122  except:
123    pass
124
125
126################################################################################
127################################################################################
128###
129###   class lamgdict:
130###
131################################################################################
132################################################################################
133class langdict:
134
135    def __init__(self, filename='_language.xml'):
136      """
137      Constructor
138      """
139      manage_langs = []
140      lang_dict = {}
141      filepath = package_home(globals())+'/import/'
142      xmlfile = open(_fileutil.getOSPath(filepath+filename),'rb')
143      builder = _xmllib.XmlBuilder()
144      nWorkbook = builder.parse(xmlfile)
145      for nWorksheet in _xmllib.xmlNodeSet(nWorkbook,'Worksheet'):
146        for nTable in _xmllib.xmlNodeSet(nWorksheet,'Table'):
147          for nRow in _xmllib.xmlNodeSet(nTable,'Row'):
148            lRow = []
149            currIndex = 0
150            for nCell in _xmllib.xmlNodeSet(nRow,'Cell'):
151              ssIndex = int(nCell.get('attrs',{}).get('ss:Index',currIndex+1))
152              currData = None
153              for i in range(currIndex+1,ssIndex):
154                lRow.append(currData)
155              for nData in _xmllib.xmlNodeSet(nCell,'Data'):
156                currData = nData['cdata']
157              lRow.append(currData)
158              currIndex = ssIndex
159            if len(manage_langs) == 0:
160              del lRow[0]
161              manage_langs = lRow
162            else:
163              if len(lRow) > 0:
164                key = lRow[0]
165                value = {}
166                for i in range(len(manage_langs)):
167                  if i+1 < len(lRow):
168                    if lRow[i+1] is not None:
169                      value[manage_langs[i]] = lRow[i+1] # unicode(lRow[i+1],'utf-8').encode('utf-8')
170                lang_dict[key] = value
171      xmlfile.close()
172      self.manage_langs = manage_langs
173      self.langdict = lang_dict
174
175    def get_manage_langs(self):
176      """
177      Returns list of manage-languages.
178      """
179      return self.manage_langs
180
181    def get_langdict(self):
182      """
183      Returns list of manage-languages.
184      """
185      return self.langdict
186
187
188################################################################################
189################################################################################
190###
191###   C l a s s   M u l t i L a n g u a g e O b j e c t
192###
193################################################################################
194################################################################################
195class MultiLanguageObject:
196
197    def getLanguages(self, REQUEST=None):
198      """
199      Returns IDs of languages (primary language 1st)
200      """
201     
202      #-- [ReqBuff]: Fetch buffered value from Http-Request.
203      reqBuffId = 'getLanguages'
204      try:
205        value = self.fetchReqBuff( reqBuffId, REQUEST)
206        return value
207      except:
208       
209        #-- Get value.
210        value = ['*']
211        if REQUEST is not None:
212          value = self.getUserLangs(str(REQUEST['AUTHENTICATED_USER']))
213        value = filter(lambda x: ('*' in value) or (x in value), self.getLangIds())
214       
215        #-- [ReqBuff]: Returns value and stores it in buffer of Http-Request.
216        return self.storeReqBuff( reqBuffId, value, REQUEST)
217
218
219    def getDescendantLanguages(self, id, REQUEST=None):
220      """
221      Returns IDs of descendant languages
222      """
223      obs = []
224      user_langs = ['*']
225      if REQUEST is not None:
226        user_langs = self.getUserLangs(REQUEST['AUTHENTICATED_USER'])
227      langs = self.getLangs()
228      obs = getDescLangs(self,id,langs)
229      if not '*' in user_langs:
230        obs = filter(lambda x: x[1] in user_langs,obs)
231      obs.sort()
232      return map(lambda ob: ob[1],obs)
233
234
235################################################################################
236################################################################################
237###
238###   C l a s s   M u l t i L a n g u a g e M a n a g e r
239###
240################################################################################
241################################################################################
242class MultiLanguageManager:
243    zope.interface.implements(
244        IZMSLocale.IZMSLocale)
245
246    # Management Interface.
247    # ---------------------
248    manage_customizeLanguagesForm = HTMLFile('dtml/ZMS/manage_customizelanguagesform', globals())
249
250   
251    def get_manage_langs(self):
252      """
253      Returns list of manage-languages.
254      """
255      return OFS.misc_.misc_.zms['langdict'].get_manage_langs()
256
257    def get_manage_lang(self):
258      """
259      Returns preferred of manage-language for current content-language.
260      """
261      manage_lang = None
262      req = getattr( self, 'REQUEST', None)
263      if req is not None:
264        sess = _globals.get_session(self)
265        if req.form.has_key('manage_lang'):
266          manage_lang = req.get('manage_lang')
267        else:
268          if sess is not None and not req.form.has_key('reset_manage_lang'):
269            manage_lang = sess.get('manage_lang')
270          if manage_lang is None:
271            lang = req.get('lang')
272            if lang in self.getLangIds():
273              manage_lang = self.getLang(lang).get('manage')
274        if sess is not None:
275          sess.set('manage_lang',manage_lang)
276      if manage_lang is None:
277        manage_lang = 'eng'
278      return manage_lang
279
280    def getZMILangStr(self, key, REQUEST=None, RESPONSE=None):
281      """
282      Returns language-string for current manage-language.
283      """
284      lang_str = self.getLangStr( key, self.get_manage_lang())
285      if RESPONSE is not None:
286        if REQUEST.get('nocache'):
287          RESPONSE.setHeader('Cache-Control','no-cache')
288          RESPONSE.setHeader('Pragma', 'no-cache')
289        else:
290          RESPONSE.setHeader('Cache-Control','public, max-age=3600')
291        RESPONSE.setHeader('Content-Type', 'text/plain; charset=utf-8')
292      return lang_str
293
294    def getLangStr(self, key, lang=None):
295      """
296      Returns language-string for current content-language.
297      """
298      if lang is None:
299        lang = self.REQUEST.get('lang',self.getPrimaryLanguage())
300     
301      # Return custom value.
302      try:
303        d = self.get_lang_dict(forcedReqBuff=True)
304        if d.has_key(key):
305          if d[key].has_key(lang):
306            return d[key][lang]
307      except:
308        pass
309     
310      # Return system value.
311      d = OFS.misc_.misc_.zms['langdict'].get_langdict()
312      if d.has_key(key):
313        if not d[key].has_key(lang):
314          lang = 'eng'
315        if d[key].has_key(lang):
316          return d[key][lang]
317     
318      return key
319
320
321    def getPrimaryLanguage(self):
322      """
323      Get id of primary-language
324      """
325      return self.language_primary
326
327    def setPrimaryLanguage(self, v):
328      """
329      Set id of primary-language
330      """
331      self.language_primary = v
332
333
334    def getLangs(self):
335      """
336      Get language-dictionary
337      """
338      return getattr(self,'attr_languages',{})
339
340    def setLangs(self, v):
341      """
342      Set language-dictionary
343      """
344      self.attr_languages = v.copy()
345
346
347    def getParentLanguage(self, id):
348      """
349      Returns label of language specified by ID.
350      """
351      return self.getLang(id).get('parent')
352
353
354    def getLanguageLabel(self, id):
355      """
356      Returns label of language specified by ID.
357      """
358      return self.getLang(id).get('label',id)
359
360
361    # --------------------------------------------------------------------------
362    #  MultiLanguageManager.getParentLanguages:
363    #
364    #  Returns IDs of parent languages.
365    # --------------------------------------------------------------------------
366    def getParentLanguages(self, id):
367      obs = []
368      langs = self.getLangs()
369      if not langs.has_key(id):
370        id = self.getPrimaryLanguage()
371      parent = id
372      while 1:
373        parent = langs[parent]['parent']
374        if parent:
375          obs.append(parent)
376        else:
377          break
378      return obs
379
380
381    # --------------------------------------------------------------------------
382    #  MultiLanguageManager.getLang:
383    # --------------------------------------------------------------------------
384    def getLang(self, id):
385      return self.getLangs().get(id,{})
386
387
388    # --------------------------------------------------------------------------
389    #  MultiLanguageManager.getLangTree:
390    #
391    #  Returns list of Ids of languages (primary language 1st).
392    # --------------------------------------------------------------------------
393    def getLangTree(self, base=None):
394      if base is None:
395        base = self.getPrimaryLanguage()
396      l = [(base,self.getLang(base))]
397      for langId in self.getLangIds():
398        lang = self.getLang(langId)
399        if lang['parent'] == base:
400          l.extend(self.getLangTree(langId))
401      return l
402
403
404    # --------------------------------------------------------------------------
405    #  MultiLanguageManager.getLangIds:
406    #
407    #  Returns list of Ids of languages (primary language 1st).
408    # --------------------------------------------------------------------------
409    def getLangIds(self, sort=False):
410      obs = []
411      langs = self.getLangs()
412      if sort:
413        for key in langs.keys():
414          if key == self.getPrimaryLanguage():
415            label = '*'
416          else:
417            label = langs[key]['label']
418          obs.append((label,key))
419        obs.sort()
420        return map(lambda ob: ob[1],obs)
421      return langs.keys()
422
423
424    # --------------------------------------------------------------------------
425    #  MultiLanguageManager.getLanguageFromName:
426    # --------------------------------------------------------------------------
427    def getLanguageFromName(self, name):
428      lang = None
429      i = name.rfind('.')
430      if i > 0:
431        name = name[:i]
432        j = name.rfind('_')
433        if j > 0:
434          suffix = name[j+1:]
435          langs = self.getLangIds()
436          if suffix in langs:
437            lang = suffix
438      return lang
439
440
441    # --------------------------------------------------------------------------
442    #  MultiLanguageManager.getLanguage:
443    #
444    #  Get requested language of specified URL (used by index_html).
445    # --------------------------------------------------------------------------
446    def getLanguage(self, REQUEST):
447      lang = REQUEST.get('lang',None)
448      langs = self.getLangIds()
449      if lang not in langs:
450        url = REQUEST.get('URL')
451        path = url
452        i = url.rfind('.')
453        if i > 0:
454          path = url[:i]
455        j = path.rfind('_')
456        if j > 0:
457          suffix = path[j+1:]
458          if suffix in langs:
459            lang = suffix
460      if lang not in langs:
461        lang = self.getHttpAcceptLanguage( REQUEST)
462      if lang not in langs:
463        lang = self.getPrimaryLanguage()
464      return lang
465
466
467    # --------------------------------------------------------------------------
468    #  MultiLanguageManager.getHttpAcceptLanguage:
469    # --------------------------------------------------------------------------
470    def getHttpAcceptLanguage(self, REQUEST):
471      lang = None
472      langs = self.getLangIds()
473      if self.getConfProperty('ZMS.http_accept_language',0)==1:
474        accept = REQUEST.get('HTTP_ACCEPT_LANGUAGE','')
475        if accept.find( ';') >= 0:
476          accept = accept[ : accept.find( ';')]
477        m = { 'de' : 'ger', 'en' : 'eng', 'fr' : 'fra', 'ru' : 'rus', 'es' : 'esp', 'it' : 'ita', 'nl' : 'nld', 'sv' : 'swe'}
478        for l in accept.split( ','):
479          if l.find( '-') > 0:
480            l = l[ : l.find( '-')]
481          if l in langs:
482            lang = l
483            break
484          elif l in m.keys() and m[ l] in langs:
485            lang = m[ l]
486            break
487      return lang
488
489
490    # --------------------------------------------------------------------------
491    #  MultiLanguageManager.setLanguage:
492    #
493    #  Set/add language with specified values.
494    # --------------------------------------------------------------------------
495    def setLanguage(self, lang, label, parent, newManage):
496     
497      if len(parent) == 0:
498        for id in self.getLangs().keys():
499          if id != lang and self.getParentLanguage(id) == '':
500            attr_languages = self.getLangs()
501            attr_languages[id]['parent'] = lang
502            self.setLangs( attr_languages)
503        self.setPrimaryLanguage(lang)
504     
505      #-- Set/Add language.
506      attr_languages = self.getLangs()
507      attr_languages[lang] = {}
508      attr_languages[lang]['label'] = label
509      attr_languages[lang]['parent'] = parent
510      attr_languages[lang]['manage'] = newManage
511      self.setLangs( attr_languages)
512     
513      #-- Set/Add Standard DTML-Methods.
514      self.setLangMethods(lang)
515
516
517    # --------------------------------------------------------------------------
518    #  MultiLanguageManager.setLangMethods:
519    #
520    #  Set/Add Standard DTML-Methods.
521    # --------------------------------------------------------------------------
522    def setLangMethods(self, lang):
523      pageexts = ['.html']
524      if 'attr_pageext' in self.getObjAttrs().keys():
525        obj_attr = self.getObjAttr('attr_pageext')
526        if obj_attr.has_key('keys') and len(obj_attr.get('keys')) > 0:
527          pageexts = obj_attr.get('keys')
528      for pageext in pageexts:
529        setLangMethod(self,'index_%s%s'%(lang,pageext),'<dtml-var index_html>')
530        setLangMethod(self,'sitemap_%s%s'%(lang,pageext),'<dtml-call "REQUEST.set(\'op\',\'sitemap\')"><dtml-var index_html>')
531        setLangMethod(self,'index_print_%s%s'%(lang,pageext),'<dtml-call "REQUEST.set(\'op\',\'print\')"><dtml-var index_html>')
532        setLangMethod(self,'search_%s%s'%(lang,pageext),'<dtml-call "REQUEST.set(\'op\',\'search\')"><dtml-var index_html>')
533
534
535    # --------------------------------------------------------------------------
536    #  MultiLanguageManager.delLanguage:
537    #
538    #  Delete language.
539    # --------------------------------------------------------------------------
540    def delLanguage(self, lang):
541     
542      #-- Delete language.
543      attr_languages = self.getLangs()
544      del attr_languages[lang]
545      self.setLangs( attr_languages)
546     
547      #-- Delete Standard DTML-Methods.
548      pageexts = ['.html']
549      if 'attr_pageext' in self.getObjAttrs().keys():
550        obj_attr = self.getObjAttr('attr_pageext')
551        pageexts = obj_attr.get('keys',pageexts)
552      for pageext in pageexts:
553        delLangMethod(self,'index_%s%s'%(lang,pageext))
554        delLangMethod(self,'sitemap_%s%s'%(lang,pageext))
555        delLangMethod(self,'index_print_%s%s'%(lang,pageext))
556        delLangMethod(self,'search_%s%s'%(lang,pageext))
557
558
559    ############################################################################
560    #  MultiLanguageManager.manage_changeLanguages:
561    #
562    #  Change languages.
563    ############################################################################
564    def manage_changeLanguages(self, lang, REQUEST, RESPONSE):
565      """ MultiLanguageManager.manage_changeLanguages """
566     
567      # Delete.
568      # -------
569      if REQUEST['btn'] == self.getZMILangStr('BTN_DELETE'):
570        ids = REQUEST.get('ids',[])
571        for id in ids:
572          self.delLanguage(id)
573     
574      # Change.
575      # -------
576      elif REQUEST['btn'] == self.getZMILangStr('BTN_SAVE'):
577        for id in self.getLangIds():
578          newLabel = REQUEST.get('%s_label'%id).strip()
579          newParent = REQUEST.get('%s_parent'%id).strip()
580          newManage = REQUEST.get('%s_manage'%id).strip()
581          self.setLanguage(id, newLabel, newParent, newManage)
582        # Insert
583        newId = REQUEST.get('language_id').strip()
584        if len(newId) > 0:
585          newLabel = REQUEST.get('language_label').strip()
586          if len(self.getLangIds()) == 0:
587            newParent = ''
588          else:
589            newParent = REQUEST.get('language_parent').strip()
590          newManage = REQUEST.get('language_manage').strip()
591          self.setLanguage(newId, newLabel, newParent, newManage)
592     
593      # Return with message.
594      message = urllib.quote(self.getZMILangStr('MSG_CHANGED'))
595      return RESPONSE.redirect('manage_customizeLanguagesForm?lang=%s&manage_tabs_message=%s'%(lang,message))
596
597
598    # --------------------------------------------------------------------------
599    #  MultiLanguageManager.get_lang_dict:
600    #
601    #  Returns language-dictionary.
602    # --------------------------------------------------------------------------
603    def get_lang_dict(self, forcedReqBuff=False):
604     
605      #-- [ReqBuff]: Fetch buffered value from Http-Request.
606      reqBuffId = 'get_lang_dict'
607      try:
608        d = self.fetchReqBuff( reqBuffId, self.REQUEST, forced=forcedReqBuff)
609        return d
610      except:
611       
612        #-- Get value.
613        d = {}
614        portalMaster = self.getPortalMaster()
615        if portalMaster is not None:
616          lang_dict = portalMaster.get_lang_dict()
617          for key in lang_dict.keys():
618            d[key] = lang_dict[key].copy()
619            lang_ids = lang_dict[key].keys()
620            d[key]['acquired'] = self.concat_list(d[key].get('acquired',[]),lang_ids)
621        lang_dict = self.getConfProperty('ZMS.custom.langs.dict',{})
622        for key in lang_dict.keys():
623          if d.has_key(key):
624            lang_ids = lang_dict[key].keys()
625            for lang_id in lang_ids:
626              if lang_id not in d[key].get('acquired',[]):
627                d[key][lang_id] = lang_dict[key][lang_id]
628          else:
629            d[key] = lang_dict[key].copy()
630       
631        #-- [ReqBuff]: Returns value and stores it in buffer of Http-Request.
632        return self.storeReqBuff( reqBuffId, d, self.REQUEST)
633
634
635    # --------------------------------------------------------------------------
636    #  MultiLanguageManager.getLangDict:
637    #
638    #  Returns list of entries from language-dictionary (ordered by key).
639    # --------------------------------------------------------------------------
640    def getLangDict(self):
641      lang_dict = self.get_lang_dict()
642      lang_list = []
643      keys = lang_dict.keys()
644      keys.sort()
645      for key in keys:
646        d = lang_dict[key]
647        d['key'] = key
648        lang_list.append(d)
649      return lang_list
650
651
652    ############################################################################
653    #  MultiLanguageManager.manage_changeLangDictProperties:
654    #
655    #  Change property of language-dictionary.
656    ############################################################################
657    def manage_changeLangDictProperties(self, lang, REQUEST, RESPONSE):
658        """ MultiLanguageManager.manage_changeLangDictProperties """
659       
660        # Delete.
661        # -------
662        if REQUEST['btn'] == self.getZMILangStr('BTN_DELETE'):
663          ids = REQUEST.get('ids',[])
664          dict = self.get_lang_dict()
665          lang_dict = {}
666          for id in dict.keys():
667            if not id in ids:
668              lang_dict[id] = dict[id]
669          self.setConfProperty('ZMS.custom.langs.dict',lang_dict.copy())
670       
671        # Change.
672        # -------
673        elif REQUEST['btn'] == self.getZMILangStr('BTN_SAVE'):
674          d = self.get_lang_dict()
675          lang_dict = {}
676          for key in d.keys():
677            for lang_id in self.getLangIds():
678              lang_dict[key] = lang_dict.get(key,{})
679              enabled = lang_id not in d[key].get('acquired',[])
680              if enabled:
681                lang_dict[key][lang_id] = REQUEST['%s_value_%s'%(key,lang_id)].strip()
682          # Insert
683          key = REQUEST['_key'].strip()
684          if len(key) > 0:
685            lang_dict = self.get_lang_dict()
686            lang_dict[key] = {}
687            for lang_id in self.getLangIds():
688              lang_dict[key][lang_id] = REQUEST['_value_%s'%lang_id].strip()
689          self.setConfProperty('ZMS.custom.langs.dict',lang_dict.copy())
690       
691        # Export.
692        # -------
693        elif REQUEST['btn'] == self.getZMILangStr('BTN_EXPORT'):
694          value = []
695          ids = REQUEST.get('ids',[])
696          dict = self.get_lang_dict()
697          for id in dict.keys():
698            item = dict[id].copy()
699            item['key'] = id
700            if id in ids or len(ids) == 0:
701              value.append(item)
702          REQUEST.set('context',self)
703          REQUEST.set('value',value)
704          tmplt = HTMLFile('dtml/ZMS/manage_exportlanguages', globals())
705          export = tmplt(self,REQUEST)
706          return export
707       
708        # Import.
709        # -------
710        elif REQUEST['btn'] == self.getZMILangStr('BTN_IMPORT'):
711          f = REQUEST['file']
712          if f:
713            filename = f.filename
714            importXml(self,xml=f)
715          else:
716            filename = REQUEST['init']
717            createIfNotExists = 1
718            self.importConf(filename, REQUEST, createIfNotExists)
719          message = self.getZMILangStr('MSG_IMPORTED')%('<i>%s</i>'%filename)
720       
721        # Return with message.
722        message = urllib.quote(self.getZMILangStr('MSG_CHANGED'))
723        return RESPONSE.redirect('manage_customizeLanguagesForm?lang=%s&manage_tabs_message=%s#langdict'%(lang,message))
724
725################################################################################
Note: See TracBrowser for help on using the repository browser.