我正在开发一个 REST API,我需要实现一种需要语言和国家/地区才能以正确格式生成结果的方法,因为结果包含数字和日期。
我正在使用 HTTPAccept-Language标头来获取语言。规范将标题定义为语言说明符,但现在我不确定使用此标题获取国家/地区是否正确。例如,我想允许结果为西班牙语,但数字为英语格式(用逗号而不是点)。
标题是es-US可接受的值Accept-Language吗?
我在想我可以X-Country为我的 REST API开发一个新的自定义标头。
有什么想法吗?谢谢。
我想知道接受语言中实际语言的顺序是否重要。例如,如果我们的 HTTP GET 消息包含标题:
Accept-Language: en-us, en-gb;q=0.2, en;q=0.3, fr, fr-ch, da, fi
Run Code Online (Sandbox Code Playgroud)
...浏览器是否更喜欢传统法语(fr)而不是瑞士法语(fr-ch),即使它们都没有提到相对质量因子q,因此将是1。
通过 ChromeOptions 设置 Accepted-Lang 标头适用于常规 Chrome
options.add_experimental_option('prefs', {'intl.accept_languages': 'en,en_US'})
我正在尝试切换到新的无头 Chrome,但显然此选项在检查 validator.w3.org 上的标头时无效。我可以用其他方式改变它们吗?有谁知道是否会支持此功能?
在 MacOS 上使用 Chrome 60、Chromedriver 2.30、Selenium 3.4.3、Python 3.6.1
使用此代码:
from selenium import webdriver
print('Start')
options = webdriver.ChromeOptions()
options.add_argument('headless')
options.add_experimental_option('prefs', {'intl.accept_languages':'en,en_US'})
driver = webdriver.Chrome(chrome_options=options)
driver.get('http://validator.w3.org/i18n-checker/check?uri=google.com#validate-by-uri+')
print('Loaded')
# Check headers in output.html file. Search for 'Request headers'
html_source = driver.page_source
file = open('output.html', 'w')
file.write(html_source)
file.close
driver.implicitly_wait(5)
# Or check headers with select
# WARNING: This fails with 'headless' chrome option!
element = driver.find_element_by_xpath("//code[@class='headers_accept_language_0']").get_attribute('textContent')
print('Element:', element)
driver.close()
print('Finish')
Run Code Online (Sandbox Code Playgroud)
谢谢!
selenium python-3.x selenium-chromedriver http-accept-language google-chrome-headless
在我的Codeigniter应用程序中,我$_SERVER['HTTP_ACCEPT_LANGUAGE']用来确定用户浏览器语言,根据它设置应用程序语言,如下所示:
public function __construct()
{
parent::__construct();
/* set session language if not set. "hu" if browser language "hu", else "en" */
if(!($this->session->userdata("lang")))
{
$browserlang = substr($_SERVER["HTTP_ACCEPT_LANGUAGE"],0,2);
if ($browserlang == "hu")
{
$this->config->set_item("language", "hu");
$this->session->set_userdata("lang", "hu");
$this->lang->load("bh_hu", "hungarian");
}
else
{
$this->config->set_item("language", "en");
$this->session->set_userdata("lang", "en");
$this->lang->load("bh_en", "english");
}
}
else
{
switch ($this->session->userdata("lang"))
{
case "hu": $this->lang->load("bh_hu", "hungarian"); break;
case "en": $this->lang->load("bh_en", "english"); break;
}
}
....
}
Run Code Online (Sandbox Code Playgroud)
一切正常,但由于谷歌抓取工具不发送任何东西HTTP_ACCEPT_LANGUAGE,它会返回一个php错误未定义索引:HTTP_ACCEPT_LANGUAGE抓取我的所有页面时.
这真的很讨厌,因为php错误甚至填满了我的整个谷歌搜索片段.
有没有办法让谷歌机器人忽略这个HTTP_ACCEPT_LANGUAGE动作?
提前致谢!
我正在使用 drf_spectaulous 来使用 swagger 并且它工作正常。我为 API 视图定义所需的参数(无论是在路径中还是在标头中),如下所示:
@extend_schema(
OpenApiParameter(
name='accept-language',
type=str,
location=OpenApiParameter.HEADER,
description="fa or en. The default value is en"
),
)
Run Code Online (Sandbox Code Playgroud)
但我不想将这些代码行添加到我的所有 API 视图中。是否有捷径可寻?(类似于在 SPECTACULAR_SETTINGS 中定义这些代码行)
我已经在 drf_spectaulous 的文档中找到了APPEND_COMPONENTS选项,但我对此并不熟悉。
django swagger django-rest-framework http-accept-language drf-spectacular
我对RFC 2616的解读没有回答我的问题:
服务器应该如何解释多个Accept,Accept-Encoding,Accept-Language等标题?
当然,这通常应该是罕见的,但是我可以假设每个HTTP客户端实际上都应该做到这一点.
想象一下,HTTP请求包括以下内容:
Accept-Language: en
Accept-Language: pt
Run Code Online (Sandbox Code Playgroud)
服务器应该:
Accept-Language: en, pt吗?en)?pt)?选项#1对我来说似乎是最自然的,最有可能是客户意味着什么,并且即使不是客户意味着什么,也最不可能完全打破期望.
但是有没有关于如何处理这些情况的实际规则(理想情况下由RFC指定)?
我们的业务要求规定,用户应该能够在不更改浏览器或系统设置的情况下更改他们的语言首选项。我们的实现是一个简单的界面,要求他们选择一种语言。最初,我只是将他们的选择存储在 cookie 值中并检查它并设置 UI 文化,但我想知道是否有更简单的方法。
目前,我正在尝试查看是否可以接受他们的选择,然后在响应中设置接受语言,以便在后续请求中使用。现在,我在响应中设置了接受语言标头,但下一个请求会用浏览器值覆盖它(例如 en-US,en;q=0.8")这可能吗,我该怎么做?还有其他想法吗?实现这个功能也很受欢迎。
http ×3
http-headers ×2
api ×1
device ×1
django ×1
googlebot ×1
ios ×1
java ×1
php ×1
python-3.x ×1
rest ×1
selenium ×1
swagger ×1
web-crawler ×1