无法将应用程序转换为多语言并保持当前内容可翻译
Cannot convert application to multi-lang and keep current content translatable
我们有一个基于 Symfony-CMF 构建的应用程序,运行 很好。我们现在需要为内容添加语言环境和翻译。我们已经设置了一个页面 (/contact),其中包含各种特定于语言环境的路由(例如 /en/contact 和 /fr/contact),我们能够访问这些 URL 并独立编辑每种语言的内容。但是,我们无法看到现有内容,因此当我们点击 /en/contact 时,所有可编辑的内容区域都是空白的。
通过重建我们的应用程序并加载内容(通过固定装置)以及相关的多语言配置,我们能够看到原始内容,但是当我们编辑它时,它似乎为每个编辑它语。因此,当我们转到 /en/contact 并在那里编辑内容时,我们会看到该更改反映在 /fr/contact,反之亦然。
我们添加了以下配置:
doctrine_phpcr:
odm:
locales:
en: ~
fr: [en]
de: [en]
cmf_core:
multilang:
locales: [en, fr, de]
我们的文档有 BasicPage class:
/**
* @PHPCR\Document(referenceable=true,translator="attribute")
*/
class BasicPage extends Page implements SeoAwareInterface, SitemapElementInterface
{
/**
* @var string
* @PHPCR\String(nullable=true,translated=true)
*/
protected $intro;
...
}
我们还需要做些什么来使原始内容可翻译吗?
你现在如何加载灯具?是否使用 bindTranslation 以多种语言存储内容?否则您将只能创建内容的一种语言版本。
编辑时,您加载文档所用的语言就是您存储回的语言,除非您明确指定它是一种不同的语言。 (通常,您会更改映射到文档区域设置的字段)。
在你的情况下,如果文档目前只被翻译成英文,而你要求提供法语文档,phpcr-odm 将回退为英语并为你提供该文档。然后你编辑它并保存回来,更新英文版本。最好的方法是将区域设置映射到一个字段上,然后将其公开给编辑器以明确指定区域设置,或者在 url 中使用内容语言参数以避免混淆。
如果您想显示该信息,也可以向文档管理器询问可用的翻译。
顺便说一下,我们目前正在努力提供一种工具,将非翻译文档转换为翻译文档,反之亦然:https://github.com/doctrine/phpcr-odm/pull/655。如果您想检查一下,非常感谢您的反馈。
好的,所以我设法自己解决了这个问题(部分原因是 dbu and partly thanks to xdebug!) The cmf_create inline editor was generating ajax requests to update the documents but these were using the default locale rather than the locale specified in the request. Setting cmf_create.rest_force_request_locale to true as specified in the CMF docs worked and means we can edit each language separately when loaded from our fixtures. We still need a migration to make each document translatable but we may be able to leverage the converter tool as mentioned by dbu 提供的信息。
我们有一个基于 Symfony-CMF 构建的应用程序,运行 很好。我们现在需要为内容添加语言环境和翻译。我们已经设置了一个页面 (/contact),其中包含各种特定于语言环境的路由(例如 /en/contact 和 /fr/contact),我们能够访问这些 URL 并独立编辑每种语言的内容。但是,我们无法看到现有内容,因此当我们点击 /en/contact 时,所有可编辑的内容区域都是空白的。
通过重建我们的应用程序并加载内容(通过固定装置)以及相关的多语言配置,我们能够看到原始内容,但是当我们编辑它时,它似乎为每个编辑它语。因此,当我们转到 /en/contact 并在那里编辑内容时,我们会看到该更改反映在 /fr/contact,反之亦然。
我们添加了以下配置:
doctrine_phpcr:
odm:
locales:
en: ~
fr: [en]
de: [en]
cmf_core:
multilang:
locales: [en, fr, de]
我们的文档有 BasicPage class:
/**
* @PHPCR\Document(referenceable=true,translator="attribute")
*/
class BasicPage extends Page implements SeoAwareInterface, SitemapElementInterface
{
/**
* @var string
* @PHPCR\String(nullable=true,translated=true)
*/
protected $intro;
...
}
我们还需要做些什么来使原始内容可翻译吗?
你现在如何加载灯具?是否使用 bindTranslation 以多种语言存储内容?否则您将只能创建内容的一种语言版本。
编辑时,您加载文档所用的语言就是您存储回的语言,除非您明确指定它是一种不同的语言。 (通常,您会更改映射到文档区域设置的字段)。
在你的情况下,如果文档目前只被翻译成英文,而你要求提供法语文档,phpcr-odm 将回退为英语并为你提供该文档。然后你编辑它并保存回来,更新英文版本。最好的方法是将区域设置映射到一个字段上,然后将其公开给编辑器以明确指定区域设置,或者在 url 中使用内容语言参数以避免混淆。
如果您想显示该信息,也可以向文档管理器询问可用的翻译。
顺便说一下,我们目前正在努力提供一种工具,将非翻译文档转换为翻译文档,反之亦然:https://github.com/doctrine/phpcr-odm/pull/655。如果您想检查一下,非常感谢您的反馈。
好的,所以我设法自己解决了这个问题(部分原因是 dbu and partly thanks to xdebug!) The cmf_create inline editor was generating ajax requests to update the documents but these were using the default locale rather than the locale specified in the request. Setting cmf_create.rest_force_request_locale to true as specified in the CMF docs worked and means we can edit each language separately when loaded from our fixtures. We still need a migration to make each document translatable but we may be able to leverage the converter tool as mentioned by dbu 提供的信息。