Golang中如何检查语言标签

Golang中如何检查语言标签 请告诉我如何检查当前的语言标签? 我尝试了类似这样的方法:

func main() {

 t, err := language.Parse("en")
 if err != nil {
  fmt.Println(err.Error())
 }

 fmt.Println(t)


 k, err := language.ParseBase("en")
 if err != nil {
  fmt.Println(err.Error())
 }

 fmt.Println(k)

 r, err := language.ParseRegion("en")
 if err != nil {
  fmt.Println(err.Error())
 }

 fmt.Println(r)
}

但结果是:

en
en
language: subtag "EN" is well-formed but unknown
ZZ

这让我有点困惑。 哪个包可以正确检查标签? 谢谢!


更多关于Golang中如何检查语言标签的实战教程也可以访问 https://www.itying.com/category-94-b0.html

6 回复

抱歉,包 - “golang.org/x/text/language” 英文 - 我指的是像英语这样的语言

更多关于Golang中如何检查语言标签的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


language 是从哪里来的?我在标准库中找不到这样的包。

除此之外,我不知道有任何语言会有 “en” 这样的子语言,也许你应该尝试使用 “us” 或 “uk” 这样的代码?

哦,我明白了,只有ISO标签才能正常工作吗? 但我需要检查带有alpha3值的标签( https://www.loc.gov/standards/iso639-2/php/English_list.php

我在有效值列表中找不到 eneng,根据 https://en.wikipedia.org/wiki/ISO_3166-1

文档中这样说明:

ParseRegion 解析一个2位或3位的ISO 3166-1或UN M.49代码。如果s是格式正确但未知的区域标识符,则返回ValueError;如果发生其他错误,则返回其他错误。

因此,如果你需要处理ISO 639-2标准,就需要寻找能够处理该标准的库。你当前使用的库已明确声明不支持此功能。

在Go语言中,检查语言标签最合适的包是 golang.org/x/text/language。你已经在使用这个包了,但需要理解不同解析方法的作用。

你的代码实际上已经正确解析了语言标签,但需要理解:

  • language.Parse() 解析完整语言标签
  • language.ParseBase() 只解析基础语言部分
  • language.ParseRegion() 只解析地区部分

这里是一个更完整的示例:

package main

import (
    "fmt"
    "golang.org/x/text/language"
)

func main() {
    // 解析完整语言标签
    tag, err := language.Parse("en-US")
    if err != nil {
        fmt.Printf("解析错误: %v\n", err)
        return
    }
    
    fmt.Printf("完整标签: %s\n", tag)
    fmt.Printf("基础语言: %s\n", tag.Base())
    fmt.Printf("地区: %s\n", tag.Region())
    fmt.Printf("脚本: %s\n", tag.Script())
    
    // 检查标签是否有效
    if tag.IsRoot() {
        fmt.Println("这是根标签")
    }
    
    // 匹配语言偏好
    matcher := language.NewMatcher([]language.Tag{
        language.English,
        language.SimplifiedChinese,
        language.TraditionalChinese,
    })
    
    matched, index, confidence := matcher.Match(tag)
    fmt.Printf("匹配结果: %s, 索引: %d, 置信度: %v\n", matched, index, confidence)
}

对于你的具体问题,“en” 作为地区代码是无效的,所以 ParseRegion("en") 会失败。正确的用法是:

// 解析基础语言
base, err := language.ParseBase("en")
if err != nil {
    fmt.Printf("基础语言解析错误: %v\n", err)
} else {
    fmt.Printf("基础语言: %s\n", base)
}

// 解析地区(需要使用有效的地区代码)
region, err := language.ParseRegion("US")
if err != nil {
    fmt.Printf("地区解析错误: %v\n", err)
} else {
    fmt.Printf("地区: %s\n", region)
}

输出会是:

基础语言: en
地区: US

要检查当前系统的语言标签,可以使用:

// 获取系统偏好语言
preferred, _ := language.ParseAcceptLanguage("en-US,en;q=0.9,zh-CN;q=0.8")
fmt.Printf("系统偏好语言: %v\n", preferred)

golang.org/x/text/language 包是处理语言标签的标准方法,你的使用方向是正确的,只需要根据具体需求选择合适的解析函数。

回到顶部