多语言扩展核心包
plone.multilingual的Python项目详细描述
不在开发中。这个包正在plone.app.multilingual上合并。图片::https://travis ci.org/plone/plone.multilingual.png
:目标:http://travis ci.org/plone/plone.multilingual
====
此包包含下一代多语言引擎的核心功能。
工件及其用途:
canonical:
*canonical组织有关"翻译组"的信息
*它使用一个字典,语言代码作为键,uuid
(由plone.uuid提供)作为值
存储:
*persi支架存储,它将规范存储在iobtree中
*oobtree的键是内容的uuid,相应的值是规范的
管理器:
*itranslatable的适配器
*提供翻译api
*适配器:
*itranslationlocator-在何处放置翻译
*itranslationidchooser-为翻译生成有效的id
*itranslationcloner-将独立于语言的内容复制到翻译
*itranslationfactory-创建翻译
e测试我们有一个名为demo的类型,它有一个名为demo language的适配器,该适配器允许从plone.multilingual.interfaces导入itranslationmanager,从plone.multilingual.interfaces导入ilanguage>>>>来自plone.app.测试导入setroles,登录,测试用户ID,测试用户名称
>>>来自zope.lifecycleevent import modified
>>>portal=layer['portal']
>>setroles(portal,测试用户ID,['manager'])
>;登录(portal,test_用户名)
>;>portal.invokefactory('folder','ob1',title=u"基于原型的文件夹")
'ob1'
>;>ilanguage(portal['ob1'])。设置语言('ca')
>;>portal['ob1']。reindexobject()
>;>modified(portal['ob1'])
确保新对象从plone.uuid获取其uuid::
>;>>>>itranslationmanager(portal['ob1'])。添加翻译('en')
我们尝试在'ca'中创建一个已存在的新翻译::
>>>itranslationmanager(portal['ob1'])。添加翻译('ca')
回溯(上一个最近的调用):
…
键错误:'翻译已经存在'
"en"翻译:
>;>itranslationmanager(portal['ob1']).get_translation('en')
<;at folder at/plone/ob1 en>;
>;>ilanguage(itranslationmanager(portal['ob1']).get_translation('en')。get_language()='en'
true
n关系:
>;>itranslationmanager(portal['ob1']).get_translations()
{'ca':<;atfolder at/plone/ob1>;,'en':<;atfolder at/plone/ob1 en>;}
让我们只获取语言::
>;>itranslationmanager(portal['ob1'])。获取已翻译的局域网_guages()
['ca','en']
有翻译:
>;>itranslationmanager(portal['ob1'])。有翻译('en')
true
>;>itranslationmanager(portal['ob1'])。有翻译('it')
false
通用电气:< BR>/>>>gt;itranslationmanager(portal['ob1'])。删除"翻译('en')
>>itranslationmanager(portal['ob1'])。注册"翻译"(none,portal['ob1-en'])
回溯(最近一次调用):
…
keyrerror:"没有目标语言"
register包含以下内容的翻译:
>;>itranslationmanager(portal['ob1'])。注册itranslationmanager(portal['ob1'])
>;>itranslationmanager(portal['ob1'])。获取atu translations()
{'ca':<;atfolder at/plone/ob1>;,'en':<;atfolder at/plone/ob1 en>;}
更改内容语言(应扮演订阅者):
>;>i语言(门户网站['ob1-en'])。从zope设置语言('it')
>;>gt;事件导入通知
>; >; >;>itranslationmanager(portal['ob1'])。获取"翻译"(
{'ca':<;atfolder at/plone/ob1>;,'it':<;atfolder at/plone/ob1 en>;}
测试更多翻译::
>;>;obj-it=itranslationmanager(portal['ob1'])。获取翻译('it')
>;>itranslationmanager(obj嫒it)。添加翻译('fr')
>;>itranslationmanager(obj嫒it)。添加翻译('pt')
>;>itranslationmanager(portal['ob1'])。获取翻译的语言(
['ca','it','fr','pt']
>;>;>itranslationmanager(obj_it).get_translated_languages()
['ca','it','fr','pt']
>测试规范对象是否相同::
>;>obj_ca=itranslationmanager(obj_it).get_translation('ca')
>;canonical_it=itranslationmanager(obj_it).query_canonical()
>;>canonical_ca=itranslationmanager(obj_ca).query_canonical()
>;>canonical_it==canonical_ca
true
r/>>;>>来自zope.lifecycleevent import modified
>;>portal.invokefactory('folder','ob2',title=u"基于原型的文档")
'ob2'
>;>ilanguage(portal['ob2'])。设置语言('it')
>;>modified(portal['ob2'])
>;i语言(portal['ob2']).get_language()
'it'
>;>itranslationmanager(portal['ob2']).add_translation('en')
>;>ob2_en=itranslationmanager(portal['ob2']).get_translation('en')
>;>portal.invokeFactory('folder','ob3',title=u"一个原型"基于类型的文档")
‘ob3’
>;>i语言(门户网站[‘ob3’)。设置语言(‘it’)
>;>gt;修改(门户网站[‘ob3’)
>;>i语言(门户网站[‘ob3’)。获取语言()
‘it’
>;>itranslationmanager(门户网站[‘ob3’)。添加翻译(‘es’)
>>>ob3_es=itranslationmanager(portal['ob3'])。从ofs获取翻译('es')
>>>>>>gt;;事件导入objectwillberemovedevent
>;>通知(objectwillberemovedevent(portal['ob2'])
>;>portal.manage_delobjects('ob2')
>;>t;notify(objectwillberemovedevent(ob3-es))
>;>portal.管理对象(ob3-es.id)
>;>c_old=itranslationmanager(portal['ob3'])。query_canonical()
>;>c_new=itranslationmanager(ob2-en)。query_canonical()
>;>c_old==c_new
false
>;>isinstance(c_old,str)
true
>; true
>;>itranslationmanager(ob2_en)。注册翻译('it',portal['ob3'])
>;>c1=itranslationmanager(portal['ob3'])。queryy庠canonical()
>;>c2=itranslationmanager(ob2庠en).query庠canonical()
>;>c1==c2
true
>其他用例,a('it'+'en')'和b('it'+'es'),我们需要a('en')->;b('es'):
>
>>gt;portal.invokefactory('folder','mess1',title=u"基于原型的文档"
'mess1'
>>>>gt>true>true
>gt>true;其他用例,a('it'+'en');b('it'+'en');b('it'+'en'+'en')));b('en')->;b('en')->;portal.invokefactactory('fo
>>>i语言(portal['mess1']).get_language()
'it'
>>>itranslationmanager(portal['mess1']).add_translation('en')
>>gt;mess1 en=itranslationmanager(portal['mess1']).get_translation('en')
>>portal.invokeFactory('folder','mess2',title=u"基于原型的文档")
'信息2'
>>gt>gt;illanguage(门户网站['mess2']])。设置语言('it’)
>>gt>gt;itranslationmanager(门户网站['mess2']])。添加翻译('es’)
>>gt>gt;mess2=itranslationmanager(门户网站['mess2']])。获取翻译('es’)
>>gt>gt>gt>itranslationmanager(mess1']>>>>gt;itranslationmanager(mess1'en)。注册翻译('es','es',2'es) >;>;>;itranslationmanager(portal['mess2']).get_translation('es')
>;>;itranslationmanager(portal['mess1']).get_translation('es')
<;atfolder at/plone/mess2 es>;
默认适配器
----
id chooser::
>;>;从plone.multilingual.interfaces导入itranslationidchooser
>>gt>>>选择者=itranslationidchooser(portal['ob1-en']])
>>>>选择者(portal'es')
'ob1 es'
>定位器:
>>>gt;itranslationimanager(portal['ob1']])。添加翻译('es')
>>gt;child\id=portal.ob1.invokefactory('folder文件夹''ob1'u child',language="ca")
>
>
>
'es'
'ob1'ob1 es'>'ob1'ob1'ob1'ob1'>;>;>;从plone.multilingual.interfaces导入itranslationlocator
>;>;locator=itranslationlocator(portal['ob1-en'])
>;>;locator('es')==portal
true
>;>;子locator=itranslationlocator(portal.ob1.ob1-u child)
>;>;子locator('es')==portal['ob1-es']
true
>;>;itranslationmanager(portal['ob1'])。删除u translation('es')
convert intid to uuids upgrade step
---------------------------
如果有一个具有实验性
0.1 plone的现有站点,则可以使用升级步骤。多语言版本::
>;,来自plone.multilingual.upgrades.to02导入升级
…注意:
您必须重新安装plone.multilingual软件包,以便在升级前安装所需的新
实用程序。如果您使用的是低于2.0的灵巧性版本,则必须安装包plone.app.referenceable behavior,并在尝试升级站点之前为所有灵巧性内容类型启用*referenceable*
(plone.app.referenceablebehavior.referenceable.irereferenceable)行为。
在站点的根目录中查看pgrade,或按照
门户网站设置>;升级中的升级步骤进行操作。如果看不到升级步骤,请按*显示旧升级*并选择*将基于翻译的IntID转换为Uuid(0.1→02)*
>;>从plone.multilingual.interfaces导入多语言存储
>;>gsm=portal.getsitemanager()
>;>gsm.queryutility(多语言存储)为none
true
changelog
==
<1.2.1 2013-10-16
----
mon]
1.2 2013-09-24
----
-不推荐的``objectmodifiedvent``方法
[ramon]
-不要触发``objectmodifiedvent``只需重新索引目录中所需的索引即可。
[saily]
-如果语言没有更改,则不触发重新索引。
[saily]
1.1.1 2013-07-03
----
-在iobjectremovedevent上,订阅者运行并重新索引要删除的对象。解决了错误
[ramon]
>1.1 2013-06-19
----
-更改集合递归语言,以便由itranslationmanager更新每个对象,而不是通知iobjectmodified事件。
这防止了不同事件之间的某种递归
[gborelli]
-translationmanager和add method的完整接口
``get_restricted_translations``
[jensens]
-uniquify translated languages[kiorky]
1.0 2013-04-16
----
-将"readme.rst"和"src/plone/multilingual/readme.rst"合并到
one单个文件。
[saily]
-修复所有集成和doctests
[saily]
-修复demolanguage适配器中的错误访问器。
[saily]
-支持测试中的会话。
[saily]
-更新createdevent以使用创建、复制或移动对象的aq_父级而不是"event.newparent",它在
``objectcreatedevent``上不可用。
[saily]
-一些pep8清理和与plone编码约定的对齐。
[saily]
-为plone 4.0、4.1、4.2和4.3添加构建
[saily]
-add travis integration
[saly]
1.0rc1 2013-01-26
----
-将外部工具移动到目录并添加内容属性[ramon]
-从b3升级到rc1[ramon]
-修复订阅服务器上的错误[sneridagh]
-根据存在的问题导入升级步骤"to 02"Plone.Dexterity[PySeall]
-添加get_restricted_translations[Ramon]
1.0b3 2012-10-04
----
-添加测试订阅者以测试订阅者的IObjectAddEvent、
IObjectCopiedEvent和IObjectMovedEvent[gborelli]
-不要提高评分注册或添加语言时出错
独立翻译。
[maurits]
-考虑用户可以对翻译组及其成员执行和执行更改的用例。确保它不会在存储中留下任何孤立对象的痕迹。
[ramon,sneridagh]
-添加了复制/粘贴订阅服务器[ramon]
-移动了通用addcontent订阅服务器以检查语言完整性[ramon]
-解决了itranslationlocator[ramon]上的错误
-更新语言,检查翻译完整性[ramon]
1.0b2-2012-07-09
---------
-将语言独立标识符更改为"[ramon]
-修复了卸载配置文件。[毛里塔尼亚]
1.0b1-2012-04-03
----
-无更改。
0.2b3-2012-04-03
----
-从API中删除get_字段名。[jcbrand]
-添加IDEFaultLanguageIndependentFieldsManager和适配器。[jcbrand]
-创建后重新索引对象。【Ramon】
0.1a2-2011-10-20
—————————————————————————————————————————————————————————————————————————[sneridagh]
-从裸intid迁移到plone.uuid设施。[sneridagh]
-由于之前从这个版本到上面的更改,它只与plone 4.1和更高版本兼容。[sneridagh]
-添加了升级步骤和升级浏览器视图,以将基于0.1a1
intids的实用程序转换为基于0.1a2 uuids的实用程序。[Sneridagh]
0.1a1-2011-10-03
----
-初始版本[Ramon,Awello,Sneridagh]
:目标:http://travis ci.org/plone/plone.multilingual
此包包含下一代多语言引擎的核心功能。
工件及其用途:
canonical:
*canonical组织有关"翻译组"的信息
*它使用一个字典,语言代码作为键,uuid
(由plone.uuid提供)作为值
存储:
*persi支架存储,它将规范存储在iobtree中
*oobtree的键是内容的uuid,相应的值是规范的
管理器:
*itranslatable的适配器
*提供翻译api
*适配器:
*itranslationlocator-在何处放置翻译
*itranslationidchooser-为翻译生成有效的id
*itranslationcloner-将独立于语言的内容复制到翻译
*itranslationfactory-创建翻译
e测试我们有一个名为demo的类型,它有一个名为demo language的适配器,该适配器允许从plone.multilingual.interfaces导入itranslationmanager,从plone.multilingual.interfaces导入ilanguage>>>>来自plone.app.测试导入setroles,登录,测试用户ID,测试用户名称
>>>来自zope.lifecycleevent import modified
>>>portal=layer['portal']
>>setroles(portal,测试用户ID,['manager'])
>;登录(portal,test_用户名)
>;>portal.invokefactory('folder','ob1',title=u"基于原型的文件夹")
'ob1'
>;>ilanguage(portal['ob1'])。设置语言('ca')
>;>portal['ob1']。reindexobject()
>;>modified(portal['ob1'])
确保新对象从plone.uuid获取其uuid::
>;>>>>itranslationmanager(portal['ob1'])。添加翻译('en')
我们尝试在'ca'中创建一个已存在的新翻译::
>>>itranslationmanager(portal['ob1'])。添加翻译('ca')
回溯(上一个最近的调用):
…
键错误:'翻译已经存在'
"en"翻译:
>;>itranslationmanager(portal['ob1']).get_translation('en')
<;at folder at/plone/ob1 en>;
>;>ilanguage(itranslationmanager(portal['ob1']).get_translation('en')。get_language()='en'
true
n关系:
>;>itranslationmanager(portal['ob1']).get_translations()
{'ca':<;atfolder at/plone/ob1>;,'en':<;atfolder at/plone/ob1 en>;}
让我们只获取语言::
>;>itranslationmanager(portal['ob1'])。获取已翻译的局域网_guages()
['ca','en']
有翻译:
>;>itranslationmanager(portal['ob1'])。有翻译('en')
true
>;>itranslationmanager(portal['ob1'])。有翻译('it')
false
通用电气:< BR>/>>>gt;itranslationmanager(portal['ob1'])。删除"翻译('en')
>>itranslationmanager(portal['ob1'])。注册"翻译"(none,portal['ob1-en'])
回溯(最近一次调用):
…
keyrerror:"没有目标语言"
register包含以下内容的翻译:
>;>itranslationmanager(portal['ob1'])。注册itranslationmanager(portal['ob1'])
>;>itranslationmanager(portal['ob1'])。获取atu translations()
{'ca':<;atfolder at/plone/ob1>;,'en':<;atfolder at/plone/ob1 en>;}
更改内容语言(应扮演订阅者):
>;>i语言(门户网站['ob1-en'])。从zope设置语言('it')
>;>gt;事件导入通知
>;
{'ca':<;atfolder at/plone/ob1>;,'it':<;atfolder at/plone/ob1 en>;}
测试更多翻译::
>;>;obj-it=itranslationmanager(portal['ob1'])。获取翻译('it')
>;>itranslationmanager(obj嫒it)。添加翻译('fr')
>;>itranslationmanager(obj嫒it)。添加翻译('pt')
>;>itranslationmanager(portal['ob1'])。获取翻译的语言(
['ca','it','fr','pt']
>;>;>itranslationmanager(obj_it).get_translated_languages()
['ca','it','fr','pt']
>测试规范对象是否相同::
>;>obj_ca=itranslationmanager(obj_it).get_translation('ca')
>;canonical_it=itranslationmanager(obj_it).query_canonical()
>;>canonical_ca=itranslationmanager(obj_ca).query_canonical()
>;>canonical_it==canonical_ca
true
r/>>;>>来自zope.lifecycleevent import modified
>;>portal.invokefactory('folder','ob2',title=u"基于原型的文档")
'ob2'
>;>ilanguage(portal['ob2'])。设置语言('it')
>;>modified(portal['ob2'])
>;i语言(portal['ob2']).get_language()
'it'
>;>itranslationmanager(portal['ob2']).add_translation('en')
>;>ob2_en=itranslationmanager(portal['ob2']).get_translation('en')
>;>portal.invokeFactory('folder','ob3',title=u"一个原型"基于类型的文档")
‘ob3’
>;>i语言(门户网站[‘ob3’)。设置语言(‘it’)
>;>gt;修改(门户网站[‘ob3’)
>;>i语言(门户网站[‘ob3’)。获取语言()
‘it’
>;>itranslationmanager(门户网站[‘ob3’)。添加翻译(‘es’)
>>>ob3_es=itranslationmanager(portal['ob3'])。从ofs获取翻译('es')
>>>>>>gt;;事件导入objectwillberemovedevent
>;>通知(objectwillberemovedevent(portal['ob2'])
>;>portal.manage_delobjects('ob2')
>;>t;notify(objectwillberemovedevent(ob3-es))
>;>portal.管理对象(ob3-es.id)
>;>c_old=itranslationmanager(portal['ob3'])。query_canonical()
>;>c_new=itranslationmanager(ob2-en)。query_canonical()
>;>c_old==c_new
false
>;>isinstance(c_old,str)
true
>;
>;>itranslationmanager(ob2_en)。注册翻译('it',portal['ob3'])
>;>c1=itranslationmanager(portal['ob3'])。queryy庠canonical()
>;>c2=itranslationmanager(ob2庠en).query庠canonical()
>;>c1==c2
true
>其他用例,a('it'+'en')'和b('it'+'es'),我们需要a('en')->;b('es'):
>
>>gt;portal.invokefactory('folder','mess1',title=u"基于原型的文档"
'mess1'
>>>>gt>true>true
>gt>true;其他用例,a('it'+'en');b('it'+'en');b('it'+'en'+'en')));b('en')->;b('en')->;portal.invokefactactory('fo
>>>i语言(portal['mess1']).get_language()
'it'
>>>itranslationmanager(portal['mess1']).add_translation('en')
>>gt;mess1 en=itranslationmanager(portal['mess1']).get_translation('en')
>>portal.invokeFactory('folder','mess2',title=u"基于原型的文档")
'信息2'
>>gt>gt;illanguage(门户网站['mess2']])。设置语言('it’)
>>gt>gt;itranslationmanager(门户网站['mess2']])。添加翻译('es’)
>>gt>gt;mess2=itranslationmanager(门户网站['mess2']])。获取翻译('es’)
>>gt>gt>gt>itranslationmanager(mess1']>>>>gt;itranslationmanager(mess1'en)。注册翻译('es','es',2'es)
>;>;itranslationmanager(portal['mess1']).get_translation('es')
<;atfolder at/plone/mess2 es>;
默认适配器
----
id chooser::
>;>;从plone.multilingual.interfaces导入itranslationidchooser
>>gt>>>选择者=itranslationidchooser(portal['ob1-en']])
>>>>选择者(portal'es')
'ob1 es'
>定位器:
>>>gt;itranslationimanager(portal['ob1']])。添加翻译('es')
>>gt;child\id=portal.ob1.invokefactory('folder文件夹''ob1'u child',language="ca")
>
>
>
'es'
'ob1'ob1 es'>'ob1'ob1'ob1'ob1'>;>;>;从plone.multilingual.interfaces导入itranslationlocator
>;>;locator=itranslationlocator(portal['ob1-en'])
>;>;locator('es')==portal
true
>;>;子locator=itranslationlocator(portal.ob1.ob1-u child)
>;>;子locator('es')==portal['ob1-es']
true
>;>;itranslationmanager(portal['ob1'])。删除u translation('es')
convert intid to uuids upgrade step
---------------------------
如果有一个具有实验性
0.1 plone的现有站点,则可以使用升级步骤。多语言版本::
>;,来自plone.multilingual.upgrades.to02导入升级
…注意:
您必须重新安装plone.multilingual软件包,以便在升级前安装所需的新
实用程序。如果您使用的是低于2.0的灵巧性版本,则必须安装包plone.app.referenceable behavior,并在尝试升级站点之前为所有灵巧性内容类型启用*referenceable*
(plone.app.referenceablebehavior.referenceable.irereferenceable)行为。
在站点的根目录中查看pgrade,或按照
门户网站设置>;升级中的升级步骤进行操作。如果看不到升级步骤,请按*显示旧升级*并选择*将基于翻译的IntID转换为Uuid(0.1→02)*
>;>从plone.multilingual.interfaces导入多语言存储
>;>gsm=portal.getsitemanager()
>;>gsm.queryutility(多语言存储)为none
true
changelog
==
<1.2.1 2013-10-16
----
mon]
1.2 2013-09-24
----
-不推荐的``objectmodifiedvent``方法
[ramon]
-不要触发``objectmodifiedvent``只需重新索引目录中所需的索引即可。
[saily]
-如果语言没有更改,则不触发重新索引。
[saily]
1.1.1 2013-07-03
----
-在iobjectremovedevent上,订阅者运行并重新索引要删除的对象。解决了错误
[ramon]
>1.1 2013-06-19
----
-更改集合递归语言,以便由itranslationmanager更新每个对象,而不是通知iobjectmodified事件。
这防止了不同事件之间的某种递归
[gborelli]
-translationmanager和add method的完整接口
``get_restricted_translations``
[jensens]
-uniquify translated languages[kiorky]
1.0 2013-04-16
----
-将"readme.rst"和"src/plone/multilingual/readme.rst"合并到
one单个文件。
[saily]
-修复所有集成和doctests
[saily]
-修复demolanguage适配器中的错误访问器。
[saily]
-支持测试中的会话。
[saily]
-更新createdevent以使用创建、复制或移动对象的aq_父级而不是"event.newparent",它在
``objectcreatedevent``上不可用。
[saily]
-一些pep8清理和与plone编码约定的对齐。
[saily]
-为plone 4.0、4.1、4.2和4.3添加构建
[saily]
-add travis integration
[saly]
1.0rc1 2013-01-26
----
-将外部工具移动到目录并添加内容属性[ramon]
-从b3升级到rc1[ramon]
-修复订阅服务器上的错误[sneridagh]
-根据存在的问题导入升级步骤"to 02"Plone.Dexterity[PySeall]
-添加get_restricted_translations[Ramon]
1.0b3 2012-10-04
----
-添加测试订阅者以测试订阅者的IObjectAddEvent、
IObjectCopiedEvent和IObjectMovedEvent[gborelli]
-不要提高评分注册或添加语言时出错
独立翻译。
[maurits]
-考虑用户可以对翻译组及其成员执行和执行更改的用例。确保它不会在存储中留下任何孤立对象的痕迹。
[ramon,sneridagh]
-添加了复制/粘贴订阅服务器[ramon]
-移动了通用addcontent订阅服务器以检查语言完整性[ramon]
-解决了itranslationlocator[ramon]上的错误
-更新语言,检查翻译完整性[ramon]
1.0b2-2012-07-09
---------
-将语言独立标识符更改为"[ramon]
-修复了卸载配置文件。[毛里塔尼亚]
1.0b1-2012-04-03
----
-无更改。
0.2b3-2012-04-03
----
-从API中删除get_字段名。[jcbrand]
-添加IDEFaultLanguageIndependentFieldsManager和适配器。[jcbrand]
-创建后重新索引对象。【Ramon】
0.1a2-2011-10-20
—————————————————————————————————————————————————————————————————————————[sneridagh]
-从裸intid迁移到plone.uuid设施。[sneridagh]
-由于之前从这个版本到上面的更改,它只与plone 4.1和更高版本兼容。[sneridagh]
-添加了升级步骤和升级浏览器视图,以将基于0.1a1
intids的实用程序转换为基于0.1a2 uuids的实用程序。[Sneridagh]
0.1a1-2011-10-03
----
-初始版本[Ramon,Awello,Sneridagh]