You can find various fixes on this fork (a PR is still in the review phase):
How it worksFirst of all you should add a LanguageRoot folder in your root site. It is like the standard folderish Document, but with an editable Language attribute where you set the language code (eg: en, it, etc).
Once you have created two or more language folders (with >2 languages there is a problem with the translation link actions at this time of writing) you can add your contents and translate them.
|The translate menu prompts a translate into italian action from /en/welcome|
Once saved, you can switch to the existing translation and navigate among languages as shown in the following picture:
|You can switch to the existing English translation|
You can see for example a select widget in edit mode on the root translation:
Code examplesAnd now code examples.
resources.pyYou can define language independent fields in your type_info attribute on your resource.
class YourResource(...): ... type_info = Document.type_info.copy( ... language_independent_fields= ['course_sku',], )
views/edit.pyThe edit form does not require changes, you just need to apply the i10n_widget_factory on your language independent fields (in some particular cases you need a bit more complex setup when you have to deal with not null column, required fields, etc). In these particular cases you'll have to play with get_source (kotti_multilingual.api.source) and put the widget in readonly mode. If you experience problems cloning select widgets you might have to migrate to deferred widgets (that creates a new widget instance each time) and set the widget mode in readonly when needed.
from kotti_multilingual.widget import i10n_widget_factory ... from kotti_multilingual.api import get_source
@colander.deferred def deferred_widget(node, kw): request = kw['request'] context = request.context ... widget = SelectWidget(values=available_tags, multiple=True) if get_source(context) is not None: widget.readonly = True return widget class YourResourceSchema(colander.Schema): course_sku = colander.SchemaNode( colander.String(), title=_(u"Course SKU"), missing=u"", widget=i10n_widget_factory(TextInputWidget), ) class YourResourceAddForm(ImageAddForm): schema_factory = YourResourceSchema ... def get_bind_data(self): bind_data = super(YourResourceAddForm, self).get_bind_data() # we tell to the i10n_widget_factory that this is an addform, # so our widgets will be shown as usual in edit mode bind_data['addform'] = True return bind_data
Final thoughtsYes, it is a very very young package but very promising!
It is not complete and probably it never will be complete because SQLAlchemy is huge and I think it is not possible to cover all the possible SQLAlchemy combinations.
For example this fork includes support for the SQLAlchemy's association_proxy feature and language independent fields (in this case the copy_properties_blacklist attribute on your resource is your friend).
This is open source, dude: if you need something that is not yet covered, just fork kotti_multilingual, implement the missing parts and share with others!
Update 20150427Merged and released new version of kotti_multilingual on PyPI https://pypi.python.org/pypi/kotti_multilingual/0.2a3.
Development happens on https://github.com/Kotti/kotti_multilingual now.