使用流利的LocalMenu
模板来获取语言切换器,为我的自定义控制器和数据对象提供了"错误"的链接,我将其显示为页面。
所以我两者都有。控制器作为页面,其他自定义控制器上的数据对象显示为页面。
而不是en/sompage/foobar
我收到somepage/foobar?l=en_US
我认为这是由于我在这些数据对象和控制器上错误地实现了Link
函数造成的。
我怎样才能正确操作?我找不到任何关于这个的东西。这是我当前的代码:
public function Link($action = null) {
$parent = MyParentPage::get()->first()->URLSegment;
$home = RootURLController::get_default_homepage_link();
if($parent != $home) {
$url = $parent . '/';
} else {
$url = null;
}
return Director::baseURL() . $this->fluentUrlSegment() . $url . 'controller-segment';
}
和
public function fluentUrlSegment() {
if(class_exists('Fluent')) {
$locale = Fluent::current_locale();
$fluentConfig = Fluent::create()->config();
if($fluentConfig->default_locale != $locale) {
if($fluentConfig->aliases && isset($fluentConfig->aliases[$locale])) {
$locale = $fluentConfig->aliases[$locale];
}
$locale = $locale . '/';
} else {
$locale = '';
}
} else {
$locale = '';
}
return $locale;
}
流畅的配置
---
Name: projectfluentconfig
After: '#fluentconfig'
---
Fluent:
disable_default_prefix: true
detect_locale: true
remember_locale: true
default_locale: de_DE
locales:
- de_DE
- en_US
aliases:
de_DE: de
en_US: en
field_exclude:
---
Name: projectfluentconfig
After: '#fluenti18nconfig'
---
i18n:
default_locale: de_DE
更新
感谢 wmk 的回答,我可以改进我的链接功能。不幸的是,它仍然没有改变流利语言环境菜单中链接上的任何内容。
我没有geschichte/..
和en/geschichte/..
而是在德国网站上收到geschichte/..?l=de_DE
和geschichte/..?l=en_US
,在英语网站上收到en/geschichte/..?l=de_DE
和en/geschichte/..?l=en_US
。
会不会是流利完全忽略了这些链接功能?我是否仍然犯了错误或错过了什么?这是我的简短代码 控制器,DataObject,路由,扩展和流利配置
有什么建议吗?
更新 2
FluentSiteTree
类中的LocaleLink
函数似乎是"问题">
您已经从数据库中获取了一个页面并获取URLSegment。为什么不利用该页面的Link()
方法?这应该已经设置了流畅的东西。
然后将链接部分与Controller::join_links()
连接
public function Link($action = null) {
//maybe parent::Link() also works, depending on your code structure
$parent = MyParentPage::get()->first()->Link();
return Controller::join_links($parent, 'controller-segment', $action);
}
这不是一个真正的答案,而是一种解决方法。
我通过将FluentExtension
也添加到控制器来管理它以使其工作,并且在该控制器上我实现了自己的LocaleLink
函数。
对于其他任何被困在这里的人,直到有一个真正的解决方案,这是我的工作代码控制器,DataObject,Routes,Extensions & Fluent Config
如果您不想为控制器使用翻译的 urlsegment,您可以使用此链接功能
public function Link($action = null) {
$homepage = Page::get()->find('URLSegment', RootURLController::get_homepage_link());
$parent = $homepage->Link();
$urlByLocale = [
'de_DE' => 'geschichte',
'en_US' => 'story',
];
return Controller::join_links($parent, $urlByLocale[Fluent::current_locale()], $action);
}
并像那样更改路线
'de/geschichte//$URLSegment!' => [
'Controller' => 'Story_Controller',
'l' => 'de_DE'
],
'en/story//$URLSegment!' => [
'Controller' => 'Story_Controller',
'l' => 'en_US'
],
如果有人能找到一种"更好"的方式来实现这一目标,那就太好了。