作为一个写Go语言的程序员,又是一个足球迷,我最近琢磨了一个挺有意思的事——用Golang来解析和处理巴甲球队的粤语名字,这事儿听着有点绕,但如果你也喜欢足球,又对编程感兴趣,那咱们可以好好聊聊。
我最早接触巴甲,是因为在YouTube上看了一个粤语解说的足球节目,那个主持人说“圣保罗”的时候,说的是“圣保罗”,但说到“哥連泰斯”的时候,我愣了一下——哦,原来这是Corinthians,后来我发现,粤语翻译巴甲球队名字有自己一套系统,跟普通话完全不一样。
彭美拉斯”是Palmeiras,“法林明高”是Flamengo,“山度士”是Santos,这些名字听起来特别有味道,像老港片里的江湖门派。
我就想,能不能用Go语言写个小工具,把普通话的巴甲球队名转成粤语版?或者反过来?这事儿看着简单,但真做起来,还挺考验代码设计的。
巴甲球队的粤语名字到底有啥门道?
先列几个最常见的:
| 普通话译名 | 粤语译名 | 巴甲原队名 |
|---|---|---|
| 帕尔梅拉斯 | 彭美拉斯 | Palmeiras |
| 弗拉门戈 | 法林明高 | Flamengo |
| 科林蒂安 | 哥連泰斯 | Corinthians |
| 桑托斯 | 山度士 | Santos |
| 圣保罗 | 聖保羅 | São Paulo |
| 格雷米奥 | 甘美奧 | Grêmio |
| 巴西国际 | 國際體育會 | Internacional |
| 克鲁塞罗 | 高士路 | Cruzeiro |
| 米内罗竞技 | 明尼路 | Atlético Mineiro |
| 弗鲁米嫩塞 | 富明尼斯 | Fluminense |
你看,“科林蒂安”四个字,粤语叫“哥連泰斯”三个字(不过写出来是五个字,但读音是三个音节),这种差异是因为粤语保留了中古汉语的入声韵尾,像“斯”在粤语里是si1,跟英语的“s”结尾对得上。
用Golang建模:map还是struct?
我一开始想用map[string]string,因为键值对嘛,简单粗暴。
package main
import "fmt"
func main() {
baJiaTeamNames := map[string]string{
"帕尔梅拉斯": "彭美拉斯",
"弗拉门戈": "法林明高",
"科林蒂安": "哥連泰斯",
"桑托斯": "山度士",
"圣保罗": "聖保羅",
}
fmt.Println(baJiaTeamNames["科林蒂安"]) // 输出:哥連泰斯
}
但很快我就发现一个问题,粤语翻译有时候会有变体,法林明高”在一些老球迷嘴里会叫“法林明高”或者“法林明高隊”,反向查询(粤语转普通话)也需要额外写逻辑。
这时候,struct的优势就出来了。
type BaiJiaTeam struct {
Mandarin string
Cantonese string
Original string
Region string
}
再加个方法:
func (t BaiJiaTeam) Display() string {
return fmt.Sprintf("【%s】%s(粤语:%s)", t.Original, t.Mandarin, t.Cantonese)
}
这样不仅更清晰,而且后续可以加更多字段,球队缩写”、“成立年份”、“所在州”,你甚至可以加个“粤语发音备注”,像我这种半桶水粤语爱好者就很需要。
列表遍历:用range处理集合
假如你有20支巴甲球队,总不能一个个手动打印吧?用range循环:
teams := []BaiJiaTeam{
{Mandarin: "帕尔梅拉斯", Cantonese: "彭美拉斯", Original: "Palmeiras"},
{Mandarin: "弗拉门戈", Cantonese: "法林明高", Original: "Flamengo"},
// 继续添加...
}
for _, t := range teams {
fmt.Println(t.Display())
}
输出会像这样:
【Palmeiras】帕尔梅拉斯(粤语:彭美拉斯)
【Flamengo】弗拉门戈(粤语:法林明高)
【Corinthians】科林蒂安(粤语:哥連泰斯)
看着是不是有点直播字幕的感觉?如果再加上时间戳和比分,真的能做一个实时字幕工具。
切片操作:动态添加球队信息
巴甲每年升降级,球队会变化,比如2024年升上来的“维多利亚”(Vitória),粤语叫“維多利亞”,如果用切片,可以动态Add:
func AddTeam(teams *[]BaiJiaTeam, team BaiJiaTeam) {
*teams = append(*teams, team)
}
func main() {
teams := []BaiJiaTeam{}
AddTeam(&teams, BaiJiaTeam{Mandarin: "维多利亚", Cantonese: "維多利亞", Original: "Vitória"})
// 再添加
}
但注意,这里用指针是为了避免切片扩容时的副本问题,Go的切片是引用类型,但函数传参是值拷贝,所以如果要修改原切片,得用指针。
这点很多新手会掉坑里,我自己就踩过——写了个函数给球队改名,结果原数据没变,差点以为是粤语翻译有错。
排序:按粤语名字的笔画还是拼音?
假设你要给球迷展示一份粤语名字列表,按什么排序?按普通话拼音?按粤语拼音?还是按汉字笔画?
Go的sort.Slice支持自定义排序:
sort.Slice(teams, func(i, j int) bool {
return teams[i].Cantonese < teams[j].Cantonese
})
但问题是,中文字符串比较是按Unicode码点来的,不是按拼音,也不是按笔画,结果就是“山度士”排在“彭美拉斯”前面,因为“山”的Unicode是5C71,“彭”是5F6D,这排序对粤语来说,没意义。
更靠谱的做法是引入拼音库,或者自己写一个粤语拼音映射表,但那样就复杂了——如果你只是做个小工具,用原始的汉字排序也能用,我自己就经常这么干,虽然不完美,但够用。
JSON序列化:分享球队数据
如果你想把球队信息传给前端或者存到文件里,JSON是标配。
import "encoding/json" data, _ := json.MarshalIndent(teams, "", " ") fmt.Println(string(data))
输出:
[
{
"mandarin": "帕尔梅拉斯",
"cantonese": "彭美拉斯",
"original": "Palmeiras"
},
{
"mandarin": "弗拉门戈",
"cantonese": "法林明高",
"original": "Flamengo"
}
]
这时候你可能会想:字段名要不要用小写?如果JSON字段希望是小写,就在struct里加tag:
type BaiJiaTeam struct {
Mandarin string `json:"mandarin"`
Cantonese string `json:"cantonese"`
Original string `json:"original"`
}
这个方法我是在写一个足球数据爬虫时学到的,那次爬了一个巴西足球网站,数据是葡萄牙语,我就用粤语名字做翻译替换,最后存成JSON,整个过程花了俩小时,但写完特别有成就感。
错误处理:应对不存在的球队名
如果你查一个不在map里的球队,博塔弗戈”(Botafogo),粤语叫“保地花高”,但如果你忘了添加,就会返回空字符串。
更好的做法是返回错误:
func LookupCantonese(name string) (string, error) {
if val, ok := teamMap[name]; ok {
return val, nil
}
return "", fmt.Errorf("找不到球队:%s", name)
}
调用时:
cantoName, err := LookupCantonese("博塔弗戈")
if err != nil {
fmt.Println("哎呀,这个队名还没有收录:", err)
} else {
fmt.Println("粤语叫:", cantoName)
}
这种处理方式,我觉得特别生活化,就像你去一家店问有没有某样东西,店员翻翻本子说“冇哦”,然后你心里就有数了。
用Golang写测试:确保翻译准确
足球迷最讨厌的就是名字翻译错,国际队”在粤语里叫“國際體育會”,不叫“國際”,如果你写错了,会被老球迷骂死。

写个测试:
package main
import "testing"
func TestCantoneseTranslation(t *testing.T) {
team := BaiJiaTeam{Mandarin: "格雷米奥", Cantonese: "甘美奧", Original: "Grêmio"}
if team.Cantonese != "甘美奧" {
t.Errorf("格雷米奥的粤语翻译应该是甘美奧,你写成了%s", team.Cantonese)
}
}
跑一下 go test,绿色通过,心里就踏实了。
我自己有个习惯——每翻译一个新球队,先写测试,这样以后改代码,不怕改出毛病。
关于巴甲粤语名字的一些趣事
说到最后,聊聊巴甲粤语名字本身,这些翻译大多来自香港的足球媒体,上世纪八九十年代,香港转播巴西足球联赛,翻译都是随性又精准。
Flamengo”叫“法林明高”,听起来像武侠小说里的高手。“Corinthians”叫“哥連泰斯”,有复古感。“Palmeiras”叫“彭美拉斯”,有点霸气的意思。
但也有一些争议,São Paulo”的粤语是“聖保羅”,但有些人觉得应该叫“聖保羅隊”或者“聖保羅足球會”,这就像国内叫“圣保罗”还是“圣保罗队”,没定论。
我自己写代码时,就加了个“别名”字段:
type BaiJiaTeam struct {
Mandarin string
Cantonese string
CantoneseAliases []string
Original string
}
聖保羅”可能有别名“聖保羅隊”,遍历时,用别名也能查到。
结尾就停在这儿吧
写到这儿,其实我还没把所有巴甲球队的粤语名字都整理完,像“巴拉纳竞技”(Athletico Paranaense)的粤语名字,我还在查资料——香港媒体好像叫“帕拉拿體育會”还是“巴拉納體育會”,我有点拿不准。
但这就是写程序、追足球、学语言的有趣之处吧,永远有下一个球队等着你翻译,永远有下一行代码等着你调试,而Go语言这种清晰的语法,就像粤语翻译一样,直来直去,没什么弯弯绕。
好了,我要去更新我的球队库了,如果哪天你也在看巴甲,听到解说说出“哥連泰斯”的时候,说不定能想起Golang里那个map或struct——那挺酷的。
本文来自作者[kyadmin]投稿,不代表中国·AC米兰(Milan)体育官方网站-Official Website立场,如若转载,请注明出处:http://www.paperlink.cn/qc/927.html
评论列表(4条)
我是中国·AC米兰(Milan)体育官方网站-Official Website的签约作者“kyadmin”!
希望本篇文章《用Golang聊巴甲粤语球队名字,当编程语言遇上足球翻译》能对你有所帮助!
本站[中国·AC米兰(Milan)体育官方网站-Official Website]内容主要涵盖:AC米兰,ac米兰官网,AC米兰官网
本文概览:作为一个写Go语言的程序员,又是一个足球迷,我最近琢磨了一个挺有意思的事——用Golang来解析和处理巴甲球队的粤语名字,这事儿听着有点...