EZ Publish/EZ Publish 多语言URL别名
EZ Publish | EZ Publish安装与卸载 | EZ Publish的使用 | EZ Publish常见问题 | EZ Publish其他 |
多语言URL别名概述[ ]
在eZ Publish 3.10,系统引入了一种新特性,它允许使用多语言虚拟URL(也被称为友好URL 或URL 别名)。这种特性允许URL 别名存在于多种语言中。
- 自动生成的别名
从3.10 版本开始,自动生成的虚拟URL 机制允许URL 别名存在于多种语言,当然这取决于对象实际使用的语言。换言之,节点的URL 别名现在由节点封装的对象所存在的翻译决定。当为对象添加新翻译时,系统会为这种翻译自动生成一套新的URL 别名。
类编辑界面中多了一个称为“URL 别名模式”的字段。它控制对象被保存时,节点的虚拟URL 如何被生成。
不能在管理界面中创建,编辑或删除自动生成的URL 别名。对象被改变时,它们会被系统自动更新。唯一修改自动生成的URL 别名的方法就是用对应语言编辑对象本身。
- 手动/用户定义的URL 别名
以下两种URL 别名可以在管理界面中管理:
• 全局URL 别名
• 节点URL 别名
全局URL 别名列表包含了所有用户定义的虚拟URL,但不包括那些指向最终目标(系统URL)的URL别名如"content/view/full/node_id"。这些被称为节点URL 别名且可以为节点单独管理。全局别名总是以站点根目录开始,节点别名却可是从根或它的父节点开始。这是通过“相对于父节点”标记控制的。
- 基于通配符的URL 转发
eZ Publish 支持基于通配符的URL 转发。这意味着您可以包含通配符(*)的URL 别名,系统会根据目标URL 自动替换别名中的通配符。
例如,您可以创建类似"pictures/*/*"的通配符URL 别名,然后指定"media/images/{1}/{2}"为目标。在本例中,类似于"http://www.example.com/pictures/home/photo/"的URL会载入"http://www.example.com/media/images/home/photo/"。换言之,在访问内容时,您可以在URL 中用"pictures"代替"media/images"来访问位于"media/images"下两层以下的内容。
可以选择别名为“直接/direct ”还是“转发/forward ”类型。在上例中,直接别名意味着当访问"http://www.example.com/pictures/home/photo/"时,输入的URL 会保留在浏览器的地址栏而真正的节点内容会直接显示在浏览器中。如果别名为“转发”类型,系统会被重定向到"http://www.example.com/media/images/home/photo/"。
通配符URL 别名可以通过管理界面管理。
- 可用性
只有别名的语言匹配当前站点入口的某个站点语言,别名才可用。如果站点入口被配置为“显示未翻译的内容”,则任何语言的别名都可用。
- 总是可用的别名
某些全局的别名需要总是可用而不论站点使用何种语言。因此,系统为全局别名引入了一个新的属性“包含在其他语言”。这一属性允许单独控制不同别名的可用性。
- 语言
多语言URL 别名不控制被请求页面的显示语言。当访问某个节点的虚拟URL 时,系统会根据站点的语言配置确定正确的语言(参阅下例)。
例
如果您创建一篇称为"Company"的文章并把它翻译成法语,则会有两个自动生成的URL 别名:"Company"和"Compagnie"。
假设您有两个公共站点入口"gb"和"fr",配置如下:
如上表所示,"gb"站点入口被配置为使用英文作为优先语言,法文作为第二语言。这以为着"Company"和"Compagine"两个别名都可用。当输入如下URL 时,系统会显示文章的英文内容:
• http://www.example.com/gb/Company
• http://www.example.com/gb/Compagnie
注意,如果您只为"gb"站点入口配置英文,则法文别名不可用。
"fr"站点入口的优先语言为法文,英文为第二语言。所以,两种URL 别名都有效且下面的URL 会要求系统显示文章的法文内容:
• http://www.example.com/fr/Company
• http://www.example.com/fr/Compagnie
- 字符转换
多语言URL 别名机制支持三种字符转换的类型/方法。可以在"site.ini"的重设文件中的"[URLTranslator]"下的"TransformationGroup"配置。下表揭示了可用的转换方法。
如果您使用"urlalias_iri"转换类型,注意某些浏览器会用百分号"%"对Unicode 字符进行编码。例如:如果用户输入"http://www.example.no/Ostehøvel",它可能会被浏览器自动转换为"http://www.example.no/Osteh%C3%B8vel"。但是这不会影响内容的正常显示。在火狐浏览器中可以禁用这种行为(在地址栏中输 入"about:config"并编辑"network.standard-url.escape-utf8"属性)。
参阅下例了解多语言URL 如何工作。
例
假设有如下站点结构:
• Company(节点ID:10)
• About us(节点ID:11)
• Contacts (节点ID:12)
如果节点10("Company")被翻译成法语,它会得到第二个URL 别名"Compagnie"。站点结构如下:
• Company | Compagnie(节点ID:10)
• About us(节点ID:11)
• Contacts (节点ID:12)
这时,如果站点入口支持英文和法文,节点10 可以通过两个URL 别名访问。如果法文为优先语言,两个URL 别名都会载入法文页面。
"About"页面(节点11)可以通过"Company/About"或"Compagnie/About"访问。"Company/About"别名会在任何支持英文的站点入口可用。"Compagnie/About"别名只在支持英文和法文的站点入口可用。两种情况下,只有英文内容会被显示(因为对象之存在于英文中)。如果您编辑"About"页面并启用“总是可用”标记,这一页会对所有站点入口可用,而无论它们的语言配置如何(即使站点入口不支持英文)。
如果"Contacts"页面(节点12)被翻译成德语,它会得到第二个别名"Kontakten"。在本例中,站点结构如下:
• Company | Compagnie(节点ID:10)
• About us(节点ID:11)
• Contacts | Kontakten(节点ID:12)
在这里,可以用以下四个URL 别名访问"Contacts|Kontakten"(节点12)。下表揭示了为了让每个URL 别名工作,站点入口所需要的语言设置。
管理URL 别名[ ]
在管理界面中可以简单地管理站点的虚拟URL。可以在两个列表中管理。它们中的一个与节点URL 别名相关,另一个负责处理全局别名。此外,还可以通过URL 通配符界面管理通配符URL 转发规则(被称为“通配符别名”)。
- 管理节点别名
节点URL 别名的管理界面可以从节点的上下文菜单中的高级选项中的“管理URL 别名”项目来触发。也可以通过"content/urlalias/<node_id>"直接访问(用节点的ID 代替<node_id>)。下图演示了节点URL 别名管理界面的外观。
这个界面列出了所有属于所选节点的URL 别名。此外,它可以用来创建与删除别名。本例列出了属于"Company"节点的所有虚拟URL。有三个手动别 名:"articles/company_info","MaCompagnie"和"mycompany"。"MaCompagnie"别名与法语关联,"article/company_info"和"mycompany"别名为英文。这意味着如果站点入口同时支持英文和法文,同一个节点可以同这些URL 别名中的任何别名访问。
下拉框可以用来选择别名关联的站点语言。例如:如果选择了“西班牙”,这个别名会在所有使用西班 牙语的站点入口中可用。下拉框包含了所有可用于管理站点入口的语言。如果"ShowUntranslatedObjects"选项被启用,则所有的翻译语言会被显示。例如:尽管对象不存在于西班牙语,也可以创建关联到这种语言的别名。注意,多语言别名不控制内容显示的语言(这由当前站点入口的语言配置决定)。
“相对于父节点”复选框可以用来控制别名从何处开始。如果勾选,它会从父节点开始。否则,别名从站点根开始。例如:如果您为"/country/state/city"这个节点添加一个称为"test"的别名,新的URL 别名可以为"/country/state/test"或"/test",取决于是否勾选“相对于父节点”复选框。
- “一般别名”窗口
在上例中,"Company"节点存在于英文和法语,因而有两个自动生成的别名:"Company"和"Compagnie"。这些别名是系统基于现有翻译而自动生成的。自动生成的别名在“一般别名”窗口显示。“一般别名”窗口位于界面的底端。如果站点入口同时支持法文和英文,则可以用任何上述别名访问"Company"节点。
注意,无论节点的父节点在不同语言中有多个别名,“一般别名”窗口为每种语言只显示一个别名。换言之,并非所有的URL 别名组合都会被显示。例如:如果在"Company"节点下创建一个新节点"Employees",它可以通过以下别名访问:
• Company/Employees
• Compagnie/Employees
• articles/company_info/Employees
• MaCompagnie/Employees
• mycompany/Employees
但是,对于"Employees"节点,只有上述别名中的一个会被显示。系统会自动选择一个父节点的自动生成的别名("Company"或"Compagnie"),取决于站点入口的语言配置。如果管理站点入口最优先的语言为英文,在"About"节点的“一般别名”窗口中,只有"Company/Employees"别名会被显示。如果最优先语言为法文,则显示"Compagnie/Employees"。父节点的别名会以粗体显示。上图中,管理站点入口的最优先语言为英文,因而"Company"别名以粗体显示。
- 创建新节点别名
要创建新别名,首先选择关联到哪个站点语言。然后输入别名的文本,再点击“创建”按钮。可以用别名让节点看起来似乎被置于节点树中完全不同的位置。例如:您可以为"Articles/Article"这篇文章创建一个别名"my_dummy_folder/my_article"。注意:不能勾选“相对于父节点”复选框。
- 附加说明
假设您在节点树中的某个位置(位置不重要)有一个节点"About us"。如前说述,您可以创建一个想象的URL(由非法的/不存在的父节点构成)。例如:您可以创建"company/about_us"并且它可以工作(系统会显示"About us"节点)。假设"Company"节点之前不存在,如果有人直接访问"company",系统会返回“对象不存在”错误页面。但是,如果创建了"Company"节点,系统会为它自动创建一个URL 别名(很可能是"company"),于是"company"别名会工作(它会显示"Company"节点)。
- 管理全局别名
管理全局别名的界面很早就被引入系统。但是在3.10 版本中被修改。这个界面可以通过点击“设置”标签下左侧的“URL 翻译器”链接访问。下图演示了这个界面的外观。
如上图所示,这个界面与管理节点的URL 别名的界面类似。这个列表显示了系统中所有的别名。列表由别名文本排序(不是由别名的路径排序)。
在上例中,有两个对"content"模块的"search"视图的别名。第一个别名与英文关联,第二个与法文关联。这允许用"findme"或"trouve-moi"别名访问"search"视图,如果站点入口同时支持英文和法文。换言之,"http://www.example.com/content/search","http://www.example.com/content/findme"和"http://www.example.com/trouve-moi"均会显示检索界面。“总是可用”列揭示这个别名是否总是可用。在上图中,"findme"别名总是可用(不论站点入口如何配置,它总是可用)。
注意:与3.10 之前版本不同,这个列表不再显示节点别名。节点别名可以在节点别名管理解明中为每个节点单独编辑/创建。
- 创建新的全局别名
要创建新的全局别名,输入虚拟URL 和指向现存功能或资源的路径;这可以是模块/视图组合或节点的地址。指定的别名总是从站点根开始。语言下拉框可以用来别名关联的站点语言。如果“包含在其它语言”复选框被勾选,新创建的别名会对所有站点入口可用,不论站点入口语言配置如何。
注意,可以用全局别名界面创建到节点的别名(例如:指向"content/view/full/<node_id>或虚拟URL)。
但是,这样的别名不会在全局列表中显示。他们会在节点别名界面中显示。
- 管理通配符URL 别名
管理通配符URL 别名的界面可以通过点击“设置”标签下左侧的“URL 通配符”链接来访问。下图演示了通配符URL 别名的外观。
上图显示了系统中所有的通配符别名并且允许您创建新的别名。在上例中,有三个通配符别名。前两个别名为英文,第三个为德文。
在浏览器中输入URL 后,系统会根据指定的通配符规则寻找与输入URL 匹配的节点。在eZ Publish 中,只有(*)才可以用于通配符别名。在别名中(*)可以重复使用。注意,别名中的每个通配符会被系统自动分配一个数字:1,2,3...。这些数字可用于引用通配符说匹配的字符串:{1},{2},{3},...(这一点与正则表达式中的"back reference"类似)。
“类型”列揭示了别名为“直接”还是“转发”类型的。在上图中,第一个别名为“转发”类型,意味着系统会重定向到目标URL。换言之,当在浏览器的地址栏中输 入"http://www.example.com/pictures/home/photo/",系统会重定向到"http://www.example.com/media/images/home/photo/"。
- 创建通配符别名
要创建一个新的通配符别名,输入别名的文字和目标地址。如果“重定向URL ”复选框被勾选,别名会工作于“转发”模式。点击“创建”按钮后,新创建的别名会在列表中显示。
URL 变换规则[ ]
当站点管理员输入一个新的虚拟URL,系统会所谓的URL 变换规则来清理输入的URL。这是为了避免由输入的字符造成的问题并且确保别名符合站点内其它URL 的标准。如果修改了别名,用户会被通知。
注意:在eZ Publish 3.10 版本中,对输入/自动生成别名的变换规则已经改变。
- 支持Unicode
在3.10 版本之前,只有下划线可被用作单词分割符。从3.10 开始,可以选择分割符。可以在"site.ini"的重设文件中"[URLTranslator]"下的"WordSeperator"设置。分割符可以为"-","_"或" "(空格)。注意,使用"urlalias_compat"方法时,这个配置会被忽略(因为它只支持下划线)。
- 大小写敏感
当使用"urlalias"或"urlalias_iri"方法时,URL 会包含大小写字符。这与传统的/旧的行为不同,那时字符都会被转换为小写字符。相反,系统会保留大小写并相应保存URL 别名。但是,URL 本身并非大小写敏感。
例如:节点"About Us"的URL 别名可能为"About-Us"(假设分割符号为"-")。您可以用任何大小写组合的URL 访问这个节点。换言之,以下URL 都可以用来访问这个节点:"www.example.com/aboutus","www.example.com/About-us","www.example.com/ABOUT-US";等等。
注意:如果在同一个位置有两个节点,它们的名字相同(几乎),(例如:"My article"和"My Article"),系统会为通过为新创建的节点的URL 后追加数字来为它生成唯一的URL 别名。例如:如果节点"My article"已经存在且"My Article"有被创建,第二篇文章的URL 别名会被生成为"My-Article2"。如果第三篇文章"MYArticle" 被创建,则URL 别名为"MY-Article3"。
- 别名文本过滤
别名过滤被实现用来在生成URL 别名时引入更多灵活性。过滤由系统在转换URL 别名之前完成。过滤器可以用扩展实现。以下文字解释了如何创建一个过滤器。
1. 编辑"site.ini"重设文件并在"[URLTranslator]"中加入一个新的扩展(如:"myfilters")。
Extensions[] Extensions[]=myfilters
2. 在"[URLTranslator]"中的"Filters[]"中添加新的过滤器(如:"StripWords")。
Extensions[] Extensions[]=myfilters Filters[] Filters[]=StripWords
系统会在"stripwords.php"中寻找"StripWords"过滤器类。
3. 在"extension/myfilters/urlfilters"中创建"stripwords.php"。注意,这个文件必须被放置在"urlfilters"目录内。确保这个文件包含如下内容:
<?php class StripWords { function process( $text, $languageObject, $caller ) { return str_replace( "hell", "", $text ); } } ?>
过滤器类"StripWords"实现了"process"方法,它有三个参数:被过滤的文字,语言对象(eZContentLanguage)和调用过滤方法的对象。这个方法返回过滤后的文字。在本例中,所有的"hell"都被删除(由空串替换)。换言之,过滤之后,新的URL 中不包含"hell"。