【问题标题】:Can not do multilingual website relying on React Router不能依赖 React Router 做多语言网站
【发布时间】:2017-03-23 11:02:33
【问题描述】:

我正在尝试使用 React 制作多语言 SPA 并依赖 React-Router。

这里是入口文件的简化版:

// define the routes for each language ..
const InnerRoutes = (
    <Route>
        <IndexRoute page="home" component={InnerPage}></IndexRoute>
        <Route path="(:page)" component={InnerPage}></Route>
    </Route>
);

// define the routes for all the languages, using InnerRoutes .. 
const AllRoutes = (
    <Router history={browserHistory}>
        <Route path='/' component={App} language="bg">
            {InnerRoutes}
            <Route path="en" language="en">
                {InnerRoutes}
            </Route>
        </Route>
    </Router>
);

// and render our app ..
ReactDOM.render(
    AllRoutes,
    document.getElementById('app')
);

所以,我有App 顶级组件和InnerPage 组件。

问题是:

  1. 当导航发生变化时 - InnerPage 更新并(最终)重新渲染。

内部InnerPage

  1. 我可以通过page 属性访问请求的页面。
  2. 很遗憾 - 我无权访问 language 属性。

这就是为什么InnerPage 无法从端点提取数据 - 它知道page,但不知道language

【问题讨论】:

    标签: reactjs react-router single-page-application multilingual


    【解决方案1】:

    路由器将routes prop 传递给所有路由组件,即匹配路由的集合。例如,在 / 上,它看起来像这样:[{ path: '/', language: 'bg'}, { }, { page: 'home' }]

    因此,根据您希望如何处理不同匹配路由声明没有或多种语言的情况,您可以执行以下操作:

    const lang = this.props.routes.reduce((lang, route) => { 
      return route.language || lang;
    }, defaultLang);
    

    这将优先考虑内部路由给出的语言。

    查看您的路线配置,我还需要提及两件事:

    1. 在您的 InnerRoutes 中,&lt;IndexRoute page="home" ... /&gt;&lt;Route path="(:page)" ... /&gt; 的页面值显示方式不同。前者是路由上的道具(如language),可以通过this.props.route.page访问,而后者是URL参数(this.props.params.page)。

    2. 英语&lt;IndexRoute&gt; 不可达,因为保加利亚语:page 路由在前面并匹配。您可以通过向上移动英语路线来解决此问题。

    这是一个 jsbin,展示了我提到的几点:http://jsbin.com/siqake/5/edit?js,output

    【讨论】:

    • 嗯,问题在于我所描述的设置 - 我在App 组件中有language,但在InnerPage 组件中没有。关于page 参数 - 反之亦然。所以 - 我怎么能两者兼得 - 至少在 InnerPage 组件中。 ............(可能路线设置错误......)
    • 也许我误解了你,但这不是 routes 道具解决的问题吗?您会在所有路由组件(AppInnerPage)中获得相同的匹配路由数组,包括它们的属性(pagelanguage)。
    • 在看到您的评论后,我去了routes 属性,但它对我也不起作用。即使我循环 routes 并检查内容 - 语言也会丢失。 ......我打开了一个关于它的问题 - github.com/ReactTraining/react-router/issues/4176.
    • 如果没有任何额外的代码,很难判断出了什么问题。我在上面编辑了我的答案并包含了一个 jsbin。希望这会有所帮助!
    猜你喜欢
    • 1970-01-01
    • 2020-05-17
    • 1970-01-01
    • 2011-11-28
    • 2013-11-13
    • 2022-06-28
    • 2015-11-02
    • 2012-04-16
    • 2010-09-16
    相关资源
    最近更新 更多