[Zope3-Users] newbie question on i18n

Frank Burkhardt fbo2 at gmx.net
Wed Apr 26 16:13:02 EDT 2006


Hi,

On Wed, Apr 26, 2006 at 11:14:19AM +0200, Riccardo Tonon wrote:
> Hi everybody,
> 
> I'm developing a multilanguage site in Zope 3.
> 
> I've just prepared it to support the i18n based on the browser language.
> 
> I would like also to let the user decide which language to use. (e.g. using a combo 
> box present on each page of the site)
> 
> Anybody has an example where I could learn from?

I'm developing a multilingual site, too. It works like this:
   * browser language preferences are usually used to determine favorite language
   * users can click on one of 3 small flags to override browser preferences
     with a different language
   * all data fields on content objects are stored as dictionaries like this:
     context.sampledata={'de':'Einige Daten','en':'Some Data'}
   * Data fields are inserted into pagetemplates using a special metal-namespace
     <div tal:content="context/sampledate/mpgi18n:text />
   * The displayed language version is negotiated which means that the
     original browser language preference list is really treated as a
     list.

I attached the necessary BrowserLanguage-adapter, zcml (look for the
zope:adapter-statement) and the BrowserView which is used to define the
override language.

Disadvantage of my solution:
   * It's using (session)cookies

hth.

Frank
-------------- next part --------------
<?xml version="1.0" encoding="iso-8859-1"?>
<configure
	xmlns="http://namespaces.zope.org/browser"
	xmlns:zope="http://namespaces.zope.org/zope"
	xmlns:i18n="http://namespaces.zope.org/i18n"
	i18n_domain="mpgsite"
	>

	<!-- I18N Widget -->
	<zope:view
		type="zope.publisher.interfaces.browser.IBrowserRequest"
		provides="zope.app.form.interfaces.IInputWidget"
		for="mpgsite.i18n.interfaces.II18N"
		factory="mpgsite.i18n.browser.widgets.SimpleI18NInputWidget"
		permission="zope.Public"
	/>

	<zope:view
		type="zope.publisher.interfaces.browser.IBrowserRequest"
		provides="zope.app.form.interfaces.IDisplayWidget"
		for="mpgsite.i18n.interfaces.II18N"
		factory="mpgsite.i18n.browser.widgets.I18NDisplayWidget"
		permission="zope.Public"
	/>
	<zope:view
		type="zope.publisher.interfaces.browser.IBrowserRequest"
		provides="zope.app.form.interfaces.IDisplayWidget"
		for="mpgsite.i18n.interfaces.II18N zope.schema.interfaces.ITextLine"
		factory="mpgsite.i18n.browser.widgets.I18NTextDisplayWidget"
		permission="zope.Public"
	/>
	<zope:view
		type="zope.publisher.interfaces.browser.IBrowserRequest"
		provides="zope.app.form.interfaces.IDisplayWidget"
		for="mpgsite.i18n.interfaces.II18N zope.schema.interfaces.IBytesLine"
		factory="mpgsite.i18n.browser.widgets.I18NTextDisplayWidget"
		permission="zope.Public"
	/>
	<zope:view
		type="zope.publisher.interfaces.browser.IBrowserRequest"
		provides="zope.app.form.interfaces.IDisplayWidget"
		for="mpgsite.i18n.interfaces.II18N zope.schema.interfaces.ISourceText"
		factory="mpgsite.i18n.browser.widgets.I18NTextDisplayWidget"
		permission="zope.Public"
	/>
	<zope:view
		type="zope.publisher.interfaces.browser.IBrowserRequest"
		provides="zope.app.form.interfaces.IDisplayWidget"
		for="mpgsite.i18n.interfaces.II18N zope.schema.interfaces.IField"
		factory="mpgsite.i18n.browser.widgets.I18NSimpleDisplayWidget"
		permission="zope.Public"
	/>

		<addform
			name="add_I18NConfig.html"
			schema="mpgsite.i18n.interfaces.II18NConfig"
			content_factory="mpgsite.i18n.app.I18NConfig"
			permission="zope.ManageContent"
			label="Add I18N-configuration utility"
			>
			<widget field="i18nsortorder" class="zope.app.form.browser.BytesWidget"
				required="False" convert_missing_value="False" />
		</addform>
		<addMenuItem
			class="mpgsite.i18n.app.I18NConfig"
			title="I18N Config"
			description="A configuration utility for I18N content"
			permission="zope.ManageContent"
			view="add_I18NConfig.html"
			/>

		<editform
			schema="mpgsite.i18n.interfaces.II18NConfig"
			name="edit.html"
			permission="zope.ManageContent"
			i18n:domain="zope"
			menu="zmi_views"
			title="Edit"
			label="Edit"
			/>
		<defaultView
			for="mpgsite.i18n.interfaces.II18NConfig"
			name="edit.html"
			/>
	<tool
		interface="mpgsite.i18n.interfaces.II18NConfig"
		title="I18N Configuration"
		description="A configuration utility for I18N content"
		/>

	<!-- Cookie-Language-Switcher -->
	<page
		for="*"
		name="set_preferred_language.html"
		class=".views.CookieLanguageSwitchView"
		attribute="setlanguage"
		permission="zope.View"
		layer="mpgsite.skin.mpg"
		/>
	<zope:adapter
		for="zope.publisher.interfaces.browser.IBrowserRequest"
		provides="zope.i18n.interfaces.IUserPreferredLanguages"
		factory=".adapters.CookieBrowserLanguages"
		trusted="True"
		permission="zope.View"
		/>
	<page
		for="*"
		name="get_preferred_language"
		class=".views.GetLanguageView"
		permission="zope.View"
		allowed_attributes="getClass"
		layer="mpgsite.skin.mpg"
	/>
</configure>
-------------- next part --------------
from zope.app.publisher.browser import BrowserView
from mpgsite.i18n.browser.tools import getPreferredLanguages
from zope.formlib import form
from zope.interface import Interface

class CookieLanguageSwitchView(BrowserView):
	"""A view that sets a new preferred language by sending a cookie to the user.
		Presence of this cookie overrides preferred-language settings in the browser.
		This is useful for systems where the user is unable to control the browser
		settings."""
	def setlanguage(self, language, newurl):
		response = self.request.response
		response.setCookie('mpgsite.preferredlanguage', language, path='/')
		response.redirect(newurl)

class GetLanguageView(BrowserView):
	"""Returns the current language selection"""
	def __call__(self):
		languages=getPreferredLanguages(self.request)
		return languages[0]

	def getClass(self,language):
		if language == self.__call__():
			return 'MpgSelectedLanguage'
		else:
			return 'MpgUnSelectedLanguage'
			
class I18NEditView(form.EditForm):
	schema=Interface
	def __init__(self,context,request):
		self.form_fields=form.Fields(self.schema)

	@form.action("edit")
	def handle_edit_action(self,action,data):
		if form.applyChanges(self.context,self.form_fields,data):
			self.status='Object updated'
		else:
			self.status='No changes'

	def __call__(self):
		self.update()
		self.i18nwidgetcontroller=I18NWidgetController(self)
		self._show_navmenu=False
		for widget in self.widgets.__Widgets_widgets_list__:
			widget.i18nwidgetcontroller=self.i18nwidgetcontroller
		return self.index()
-------------- next part --------------
from zope.component import adapts
from zope.publisher.interfaces.browser import IBrowserRequest
from zope.publisher.browser import BrowserLanguages
from zope.i18n.interfaces import IUserPreferredLanguages


class CookieBrowserLanguages(BrowserLanguages):
	adapts(IBrowserRequest)

	def getPreferredLanguages(self):
		lang = self.request.cookies.get('mpgsite.preferredlanguage', None)
		if lang is None:
			languages=super(CookieBrowserLanguages,self).getPreferredLanguages()
			return languages
		return [lang]




More information about the Zope3-users mailing list