Skip to content

Instantly share code, notes, and snippets.

@mumunuu
Last active January 28, 2021 00:15
Show Gist options
  • Save mumunuu/7cd6c9dd537a49acb2924bd7499a5099 to your computer and use it in GitHub Desktop.
Save mumunuu/7cd6c9dd537a49acb2924bd7499a5099 to your computer and use it in GitHub Desktop.
check Language
package main
import (
"fmt"
"strings"
"golang.org/x/text/language"
)
func main() {
fmt.Println(getLanguageCode("ㅁㄴㅇㅁ")) //없는값 시도 en
fmt.Println(getLanguageCode("123")) //없는값 시도 en
fmt.Println(getLanguageCode("1")) //없는값 시도 en
fmt.Println(getLanguageCode("true")) //없는값 시도 en
fmt.Println(getLanguageCode("ar")) //ar
fmt.Println(getLanguageCode("ar-EG")) //ar-EG
fmt.Println(getLanguageCode("ar-SA")) //ar-SA
fmt.Println(getLanguageCode("ar-123")) //없는 값으로 시도하면 en으로 나옴
fmt.Println(getLanguageCode("en")) //en
fmt.Println(getLanguageCode("en-AU")) //en
fmt.Println(getLanguageCode("en-CA")) //en
fmt.Println(getLanguageCode("en-GB")) //en
fmt.Println(getLanguageCode("en-IG")) //en
fmt.Println(getLanguageCode("en-IN")) //en
fmt.Println(getLanguageCode("en-SG")) //en
fmt.Println(getLanguageCode("en-US")) //en
fmt.Println(getLanguageCode("en-ZA")) //en
fmt.Println(getLanguageCode("en-AA")) //없는 값으로 시도하면 en으로 나옴
fmt.Println(getLanguageCode("fr")) //fr
fmt.Println(getLanguageCode("fr-CA")) //fr
fmt.Println(getLanguageCode("fr-CH")) //fr
fmt.Println(getLanguageCode("fr-asdasd")) //없는 값으로 시도하면 en으로 나옴
fmt.Println(getLanguageCode("de")) //de
fmt.Println(getLanguageCode("de-AT")) //de
fmt.Println(getLanguageCode("hi")) //hi
fmt.Println(getLanguageCode("id")) //id
fmt.Println(getLanguageCode("it")) //it
fmt.Println(getLanguageCode("ja")) //ja
fmt.Println(getLanguageCode("jA")) //대소문자 이상하게 섞어도 ja로 출력
fmt.Println(getLanguageCode("KO")) //대문자로 하더라도, ko로 출력
fmt.Println(getLanguageCode("ko")) //ko
fmt.Println(getLanguageCode("ko-KR")) //ko
fmt.Println(getLanguageCode("ko-ㅁㄴㅇㄹㅁ")) //없는값으로 시도하면 en
fmt.Println(getLanguageCode("ms")) //ms
fmt.Println(getLanguageCode("pt")) //pt
fmt.Println(getLanguageCode("pt-BR")) //pt
fmt.Println(getLanguageCode("pt-PT")) //pt
fmt.Println(getLanguageCode("pt-PT")) //pt
fmt.Println(getLanguageCode("ru")) //ru
//중국어 분기 시작
//TOOD: 홍콩 타이완 분기 요구
fmt.Println(getLanguageCode("zh")) //zh-cn
fmt.Println(getLanguageCode("zh-cn")) //zh-cn
fmt.Println(getLanguageCode("zh-tw")) //zh-tw
fmt.Println(getLanguageCode("zh-HK")) //zh-tw //확인 결과, 홍콩으로 요청하면 TW으로 반환됩니다.
// TODO: NG는 중국어 리스트에 없는데, zh-cn으로 반환되고, VZ도 없지만 en 으로 반환됨
fmt.Println(getLanguageCode("zh-NG")) //zh-cn
fmt.Println(getLanguageCode("zh-VZ")) //en
// TODO: 컨플루언스 기준, 다른 조건은 충족하지만 zh-mo등은 충족하지 않아서 확인 필요
// https://namu.wiki/w/%EC%A4%91%EA%B5%AD%EC%96%B4%20%EC%9C%84%ED%82%A4%EB%B0%B1%EA%B3%BC
// 简体(간체, zh-hans) : 문자만 간체로 변환함.[참고] //Simplified
// 繁體(번체, zh-hant) : 문자만 번체로 변환함.[참고] //Traditional
// 大陆简体(대륙 간체, zh-cn) : 중국 대륙 간체자.
// 香港繁體(향항 번체, zh-hk) : 홍콩 번체자.
// 澳門繁體(오문 번체, zh-mo) : 마카오 번체자.
// 大马简体(대마 간체, zh-my) : 말레이시아 간체자.[9]
// 新加坡简体(신가파 간체, zh-sg) : 싱가포르 간체자.
// 臺灣正體(대만 정체, zh-tw) : 대만 정체자.
// 확인 결과, 간체/번체 차이로만 번역함.
// 홍콩, 마카오, 대만은 번체를 사용하므로 zh-tw으로 리턴함
fmt.Println(getLanguageCode("zh-hans")) //zh-cn
fmt.Println(getLanguageCode("zh-hant")) //zh-cn
fmt.Println(getLanguageCode("zh-mo")) //zh-tw //마카오도 번체를 쓰므로 tw
fmt.Println(getLanguageCode("zh-my")) //zh-tw //말레이시아 간체를 쓴다는데 tw으로 오는 의문......
fmt.Println(getLanguageCode("zh-sg")) //zh-cn //싱가포르는 중국 본토와 같이 사용하기 때문에 zh-cn
fmt.Println(getLanguageCode("es")) //es
fmt.Println(getLanguageCode("es-AR")) //es
fmt.Println(getLanguageCode("es-CL")) //es
fmt.Println(getLanguageCode("es-CO")) //es
fmt.Println(getLanguageCode("es-CR")) //es
fmt.Println(getLanguageCode("es-DO")) //es
fmt.Println(getLanguageCode("es-EC")) //es
fmt.Println(getLanguageCode("es-SV")) //es
fmt.Println(getLanguageCode("es-GT")) //es
fmt.Println(getLanguageCode("es-HN")) //es
fmt.Println(getLanguageCode("es-MX")) //es
fmt.Println(getLanguageCode("es-NI")) //es
fmt.Println(getLanguageCode("es-PA")) //es
fmt.Println(getLanguageCode("es-PE")) //es
fmt.Println(getLanguageCode("es-PR")) //es
fmt.Println(getLanguageCode("es-PY")) //es
fmt.Println(getLanguageCode("es-US")) //es
fmt.Println(getLanguageCode("es-UY")) //es
fmt.Println(getLanguageCode("es-VE")) //es
fmt.Println(getLanguageCode("th")) //th
fmt.Println(getLanguageCode("tr")) //tr
fmt.Println(getLanguageCode("vi")) //vi
}
func getLanguageCode(s string) string {
//추후 국가 추가시, tag 추가로 간단히 해결할 수 있습니다.
//https://pkg.go.dev/golang.org/x/text/language#Tag
//디폴트 언어인 영어가 제일 위에 위치해 있어야 함
matcher := language.NewMatcher([]language.Tag{
language.English,
language.Arabic,
language.French,
language.German,
language.Hindi,
language.Indonesian,
language.Italian,
language.Japanese,
language.Korean,
language.Malay,
language.Portuguese,
language.Russian,
language.SimplifiedChinese,
language.TraditionalChinese,
language.Chinese,
language.Spanish,
language.Thai,
language.Turkish,
language.Vietnamese,
})
preferred, _, _ := language.ParseAcceptLanguage(s)
code, _, _ := matcher.Match(preferred...)
base, _ := code.Base()
langauge, _ := code.Region()
if base.String() == "zh" { //중국어 예외처리
return "zh-" + strings.ToLower(langauge.String())
}
return base.String()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment