2

假设我在 JCR 中有一个节点,该节点以英文提供电影的属性,例如标题、导演和演员。然后我有另一个节点存储相同的属性,但使用另一种语言,比如法语。有没有办法让法语节点引用英语节点,这样只有需要翻译的属性才会实际存储在第二个节点上。前任:

-englishNode Properties Title: The Sword in the Stone 导演: Wolfgang Reitherman 演员: Sebastian Cabot

-frenchNode 属性标题:Merlin L'Enchanteur

但是导演和演员属性将从英文节点中检索,因为它们不需要翻译。但是,调用 frenchNode.getProperty("director") 需要从englishNode 检索属性。

我知道我可以使法语节点成为英语节点的子节点并继承其属性,但我需要一个结构,其中所有英语电影都位于英语节点下,所有法语电影都位于法语节点下,所以是法国电影不能是英国人的兄弟姐妹,而是“表亲”。

4

2 回答 2

1

我知道 JCR 中没有任何东西可以直接适应这种情况。但我能想到几种可能的选择。每个都有自己的好处,一种解决方案可能在一种情况下效果很好,而在另一种情况下则很糟糕。

本地特定子节点 将一种语言作为主要语言(例如,无论备用或更流行的本地语言可能是什么),并将本地特定属性放在该节点下的本地特定子节点上。因此,如果英语是主要语言,那么电影属性可能会存储在电影节点上。法语属性可能存储在“fr”子节点上,德语属性存储在“de”子节点上,等等。一个优点是您的应用程序只需要加载它使用的语言环境。

后备引用 创建从一个节点到“后备”的引用属性,并让您的逻辑在检索属性时考虑到这一点。如果该属性不在该节点上,则从回退中获取它,在该处可以使用 检索回退节点movie.getProperty("fallback").getNode()。(请注意,使此递归非常容易,其中回退可能有回退。)这允许将节点存储在不同的位置。但是,请注意循环后备引用(英语的后备是法语,法语的后备是英语);这是可以处理的,但它需要跟踪一些状态。同样,您的应用程序仅根据需要加载具有特定于语言环境的属性的节点。

本地特定属性 在电影节点上存储所有属性,包括英文、法文和任何其他语言的标题。在属性名称上使用后缀或前缀来表示语言环境(例如,en-titlefr-title)。加载单个节点往往会加载所有属性的所有语言环境变量。因此,这适用于较少的语言、较少的本地特定属性和较少的整体属性。

每个“属性”的子节点 将每个“属性”(例如“标题”)放置为子节点,每个特定于语言环境的值都存储为属性。同样,由于加载节点会加载所有语言环境的值,因此这对于较少数量的语言和特定于语言环境的值会更好。

于 2012-10-31T19:11:57.723 回答
0

我也不认为 JCR 提供了开箱即用的东西。

Apache Sling中,我们使用类似的机制来允许“用户”脚本覆盖“系统”脚本:处理给定的请求 Sling 可能会发现 /libs/foo/foo.esp 中的脚本是一个很好的候选者,但是如果 /apps/foo/foo.esp 有另一个脚本,它将被使用。

如果后者存在,您可以通过使用 /content/books/fr/title 覆盖说 /content/books/en/title 属性来做同样的事情。您必须在应用程序级别执行此操作,但这种“并行路径”结构清晰且易于理解和管理,您只需定义路径的哪一部分代表内容的区域设置。

于 2012-11-01T08:38:04.260 回答