
本文介绍如何通过 http 请求头中的 accept-language 字段获取用户浏览器偏好的自然语言与区域设置,实现 go web 应用的多语言动态适配。
本文介绍如何通过 http 请求头中的 accept-language 字段获取用户浏览器偏好的自然语言与区域设置,实现 go web 应用的多语言动态适配。
在构建国际化(i18n)Web 应用时,准确识别用户首选语言是实现本地化响应的关键第一步。Go 标准库 net/http 并未提供封装好的“获取语言”函数(如 PHP 的 $_SERVER['HTTP_ACCEPT_LANGUAGE']),但可通过直接读取请求头轻松实现等效功能:r.Header.Get("Accept-Language")。
该字段由浏览器自动发送,遵循 RFC 7231 规范,返回形如 en-US,en;q=0.8,ja;q=0.6,zh-CN;q=0.4 的字符串,其中:
- en-US 表示美国英语,en 表示通用英语;
- q= 后的数值为质量权重(quality value),反映用户偏好强度(范围 0–1,默认为 1.0);
- 多个语言标签按优先级从高到低排列,逗号分隔。
以下是一个最小可行示例:
package main
import (
"fmt"
"log"
"net/http"
)
func index(w http.ResponseWriter, r *http.Request) {
if r.Method != "GET" {
http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
return
}
acceptLang := r.Header.Get("Accept-Language")
if acceptLang == "" {
fmt.Fprintln(w, "No Accept-Language header provided")
return
}
fmt.Printf("Raw Accept-Language: %s\n", acceptLang)
// 输出示例:en-US,en;q=0.8,ja;q=0.6
// 实际项目中建议使用成熟解析库(如 golang.org/x/text/language)
// 这里仅作基础演示:提取第一个非加权主语言标签
lang := parsePrimaryLanguage(acceptLang)
fmt.Fprintf(w, "Detected language: %s", lang)
}
// 简单解析:提取首个语言子标签(如 en-US → en)
func parsePrimaryLanguage(s string) string {
for _, part := range strings.Split(s, ",") {
langTag := strings.TrimSpace(strings.Split(part, ";")[0])
if langTag != "" {
// 取连字符前部分(如 zh-CN → zh,pt-BR → pt)
if idx := strings.Index(langTag, "-"); idx > 0 {
return strings.ToLower(langTag[:idx])
}
return strings.ToLower(langTag)
}
}
return "en"
}
func main() {
http.HandleFunc("/", index)
fmt.Println("Server starting on :8080...")
log.Fatal(http.ListenAndServe(":8080", nil))
}
⚠️ 注意事项:
- 不可依赖客户端 IP 地理定位替代 Accept-Language:用户可能身处异地或使用代理,语言偏好应以浏览器声明为准;
- 避免硬编码解析逻辑:生产环境强烈推荐使用 golang.org/x/text/language 包进行标准化解析与匹配,它支持 BCP 47 标准、语言匹配算法(如 Matcher)、区域变体处理等;
- 需配合后端语言协商策略:获取语言标签后,应与应用支持的语言集(如 []string{"en", "zh", "ja", "es"})做匹配,并 fallback 到默认语言(如 "en");
- 安全提示:Accept-Language 是客户端可控字段,切勿用于身份认证或权限判断,仅适用于 UI 层本地化。
综上,r.Header.Get("Accept-Language") 是 Go 中获取用户语言偏好的标准且可靠方式。结合专业国际化库与合理的 fallback 策略,即可构建健壮、符合用户预期的多语言 Web 服务。










