RESTful URL:我应该把语言环境放在哪里? example.com/en/page 与 example.com/page?locale=en

Posted

技术标签:

【中文标题】RESTful URL:我应该把语言环境放在哪里? example.com/en/page 与 example.com/page?locale=en【英文标题】:RESTful URL: where should I put locale? example.com/en/page vs example.com/page?locale=en 【发布时间】:2011-12-15 02:29:28 【问题描述】:

我正在决定如何组织 URL 并将语言环境放入其中。我有两个选择:

    example.com/en/page example.com/page?locale=en -- Google 方式 en.example.com/page -- 不好,因为我使用的是子域

从一方面看,example.com/en/pageexample.com/page?locale=en 更好更紧凑。 另一方面,我们有两个 URL example.com/en/pageexample.com/ru/page 用于具有两种表示形式的一个资源。 当然,在example.com/page?locale=en 的情况下,我们对于一个资源也有两个 URL,但在我看来它更 RESTful。

最佳做法是什么?你在用什么,为什么?

【问题讨论】:

【参考方案1】:

本地化是 Restful API 中内容协商的一部分。

所以我的首选方式是通过标题来实现。 HTTP 提供了定义所需语言的标准方法。看看Accept-Language 标头。

【讨论】:

是的。我知道接受语言。但例如在俄罗斯,很多人使用英语语言环境,但更喜欢俄语内容。因此,如果我只使用 Accept-Language,他们将没有机会更改内容的语言(当然更改浏览器的语言环境除外)。最常见的解决方案是站点布局中的语言切换器。所以我试图了解组织这种切换器的最佳方式是什么。 我明白了,所以您的 api 客户端是浏览器(例如通过 AJAX 调用)?然后我会选择您建议的 url 参数方式(例如 ?lang=en),因为为您提供“可选”语义(回退到 Accept-Language 标头)。 浏览器和外部服务。谢谢你的意见,我也是这么想的。 我没有看到使用Accept-Language 的问题。是的,当您的 浏览器 发送页面的 HTTP 请求(可能只是您的 SPA 索引)时,它将发送浏览器设置中设置的值。但是对于您对 API 的所有请求,使用 Ajax,您当然可以为此标头指定任何您想要的值——任何体面的框架都允许您自动配置它。因此,您仍然可以让用户从下拉列表中选择一个区域设置,并始终将其与每个连续的请求一起发送。【参考方案2】:

来自https://www.w3.org/International/questions/qa-accept-lang-locales:

HTTP Accept-Language 标头最初仅用于指定用户的语言。然而,由于许多应用程序需要知道用户的语言环境,通常的做法是使用 Accept-Language 来确定此信息。 单独使用 HTTP Accept-Language 标头来确定用户的区域设置不是一个好主意。如果您只使用 Accept-Language,您可能会将用户束缚在一组不符合他喜好的选择中。

我的偏好:

请求 使用查询参数 如果查询参数不是,则回退到Accept-Language 标头 指定 如果未定义 Accept-Language 标头,则回退到 已记录默认语言环境 响应 设置Content-Language 在响应负载中设置区域设置,例如 <some-root-tag xml:lang="en-US">(参见 http://www.opentag.com/xfaq_lang.htm)

【讨论】:

以上是关于RESTful URL:我应该把语言环境放在哪里? example.com/en/page 与 example.com/page?locale=en的主要内容,如果未能解决你的问题,请参考以下文章

我应该把 AutoLayout 代码放在哪里?

我应该把我的 DTO 放在哪里?

我应该如何构建一个 Java 应用程序,我应该把我的类放在哪里?

我应该把dll文件放在哪里(我在我的项目中使用)

Monodroid:我应该把配置设置放在哪里?

我应该把我的 Vaadin 10+ 静态文件放在哪里?