===============================================================
loops - Linked Objects for Organization and Processing Services
===============================================================

  ($Id$)

Let's do some basic set up

  >>> from zope.app.testing.setup import placefulSetUp, placefulTearDown
  >>> site = placefulSetUp(True)

  >>> from zope import component, interface

and setup a simple loops site with a concept manager and some concepts
(with all the type machinery, what in real life is done via standard
ZCML setup):

  >>> from loops.interfaces import ILoops, IConcept
  >>> from loops.concept import Concept
  >>> from loops.setup import ISetupManager
  >>> from loops.knowledge.setup import SetupManager
  >>> component.provideAdapter(SetupManager, (ILoops,), ISetupManager,
  ...                           name='knowledge')

  >>> from loops.tests.setup import TestSite
  >>> t = TestSite(site)
  >>> concepts, resources, views = t.setup()
  >>> loopsRoot = site['loops']

  >>> from loops.knowledge.knowledge import Topic
  >>> component.provideAdapter(Topic)

For testing and demonstration purposes let's create a topic.

  >>> topic = concepts['topic']
  >>> topic01 = concepts['topic01'] = Concept(u'loops for Zope 3')
  >>> topic01.conceptType = topic


Content Internationalization
============================

Let's look at a certain concept that should contain i18n-alized data.

  >>> topic01.title
  u'loops for Zope 3'

We can query the available languages, the current language setting and
the default language using a LanguageInfo object that is similar to a view.

  >>> from zope.publisher.browser import TestRequest
  >>> from loops.i18n.browser import LanguageInfo
  >>> langInfo = LanguageInfo(topic01, TestRequest())
  >>> langInfo.availableLanguages
  []
  >>> langInfo.language is None
  True
  >>> langInfo.defaultLanguage is None
  True

In order to use content i18n we have to define the available languages
as an option on the loops root object.

  >>> loopsRoot.options = ['languages:en,de,it']
  >>> langInfo = LanguageInfo(topic01, TestRequest())
  >>> langInfo.availableLanguages
  ['en', 'de', 'it']
  >>> langInfo.defaultLanguage
  'en'
  >>> langInfo.language
  'en'

By setting an appropriate value in the URI we can select a certaing
language for processing of the current request.

  >>> input = {'loops.language': 'it'}
  >>> langInfo = LanguageInfo(topic01, TestRequest(form=input))
  >>> langInfo.availableLanguages
  ['en', 'de', 'it']
  >>> langInfo.defaultLanguage
  'en'
  >>> langInfo.language
  'it'

Let's now use a form to edit an i18n-sensible attribute. For this we have
to set up some components needed by the zope.formlib machinery.

  >>> from zope.publisher.interfaces.browser import IBrowserRequest
  >>> from zope.app.form.browser import TextWidget, ChoiceInputWidget, DropdownWidget
  >>> from zope.schema.interfaces import ITextLine, IText, IChoice
  >>> from zope.app.form.interfaces import IInputWidget
  >>> component.provideAdapter(TextWidget, (IText, IBrowserRequest),
  ...                          IInputWidget)
  >>> from loops.concept import ConceptTypeSourceList
  >>> from zope.schema.vocabulary import getVocabularyRegistry
  >>> getVocabularyRegistry().register('loops.conceptTypeSource', ConceptTypeSourceList)
  >>> component.provideAdapter(ChoiceInputWidget,
  ...          (IChoice, IBrowserRequest), IInputWidget)
  >>> component.provideAdapter(DropdownWidget,
  ...          (IChoice, ConceptTypeSourceList, IBrowserRequest), IInputWidget)

We also have to mark the attributes that should be stored in multiple
languages on the type object.

  >>> from loops.common import adapted
  >>> tTopic = adapted(topic)
  >>> tTopic.options = ['i18nattributes:title,description']

Now we are ready to enter a language-specific title.

  >>> from loops.browser.concept import ConceptEditForm, ConceptView
  >>> input = {'form.title': 'loops per Zope 3', 'loops.language': 'it',
  ...          'form.actions.apply': 'Change'}
  >>> form = ConceptEditForm(topic01, TestRequest(form=input))
  >>> form.update()

  >>> topic01.title
  I18NValue({'en': u'loops for Zope 3', 'it': u'loops per Zope 3'})

If we access an i18n attribute via a view that is i18n-aware we get the
value corresponding to the language preferences that appear in the request.

  >>> input = {'loops.language': 'it'}
  >>> view = ConceptView(topic01, TestRequest(form=input))
  >>> view.title
  u'loops per Zope 3'

If there is no entry for the language given we get back the entry for
the default language.

  >>> input = {'loops.language': 'de'}
  >>> view = ConceptView(topic01, TestRequest(form=input))
  >>> view.title
  u'loops for Zope 3'

There are also fallbacks - mainly for being able to access the title
attribute in not i18n-aware contexts - that retrieve the value corresponding
to the default language at the time of the attribute creation.

  >>> topic01.title.getDefault()
  u'loops for Zope 3'
  >>> str(topic01.title)
  'loops for Zope 3'
  >>> topic01.title.lower()
  u'loops for zope 3'

Viewing translations
--------------------

  >>> view.adapted.translations()
  {'en': u'loops for Zope 3', 'it': u'loops per Zope 3'}


Fin de partie
=============

  >>> placefulTearDown()

