Go를 사용한 국제화 및 현지화
20220 단어 localizationgowebdevtutorial
안녕하세요 고퍼 여러분!
이 기사에서는 단일 언어 웹 응용 프로그램을 다국어 웹 응용 프로그램으로 변환하는 방법을 배웁니다.
이 문서에서 사용된 도구:
go-bindata (옵션)
우선 애플리케이션을 호스팅하는 디렉토리를 만듭니다.
myapp
Iris를 설치합니다.$ go mod init myapp
$ go get github.com/kataras/iris/v12@master
아래 튜토리얼을 따르십시오.
국제화 및 현지화
현지화 기능은 다양한 언어로 된 문자열을 검색하는 편리한 방법을 제공하므로 애플리케이션 내에서 여러 언어를 쉽게 지원할 수 있습니다. 언어 문자열은 ./locales
디렉토리 내의 파일에 저장됩니다. 이 디렉토리 내에는 애플리케이션에서 지원하는 각 언어에 대한 하위 디렉토리가 있어야 합니다.
│ main.go
└───locales
├───el-GR
│ home.yml
├───en-US
│ home.yml
└───zh-CN
home.yml
애플리케이션의 기본 언어는 처음 등록된 언어입니다.
app := iris.New()
// First parameter: Glob filpath patern,
// Second variadic parameter: Optional language tags,
// the first one is the default/fallback one.
app.I18n.Load("./locales/*/*", "en-US", "el-GR", "zh-CN")
또는 다음을 통해 모든 언어를 로드하는 경우:
app.I18n.Load("./locales/*/*")
// Then set the default language using:
app.I18n.SetDefault("en-US")
임베디드 로케일 로드
응용 프로그램 실행 파일 내에 go-bindata 도구를 사용하여 로케일을 포함할 수 있습니다.
│ main.go
└───locales
├───el-GR
│ home.yml
├───en-US
│ home.yml
└───zh-CN
home.yml
app := iris.New()
// First parameter: Glob filpath patern,
// Second variadic parameter: Optional language tags,
// the first one is the default/fallback one.
app.I18n.Load("./locales/*/*", "en-US", "el-GR", "zh-CN")
app.I18n.Load("./locales/*/*")
// Then set the default language using:
app.I18n.SetDefault("en-US")
$ go get -u github.com/go-bindata/go-bindata/...
$ go-bindata -o locales.go ./locales/...
LoadAssets
메서드를 사용하여 언어를 초기화하고 로드합니다^
AssetNames
및 Asset
함수는 go-bindata
에 의해 생성됩니다.ap.I18n.LoadAssets(AssetNames, Asset, "en-US", "el-GR", "zh-CN")
번역 정의
로케일 파일은 YAML(권장), JSON, TOML 또는 INI 형식으로 작성할 수 있습니다.
각 파일에는 키가 있어야 합니다. 키에는 하위 키("섹션"이라고 함)도 있을 수 있습니다.
각 키의 값은 번역된 텍스트(또는 템플릿) 또는 복수형 키-값을 포함하는
string
또는 map
형식이어야 합니다.Iris i18n 모듈은 기본적으로 복수화를 지원합니다(아래 참조).
FM 스타일
hi: "Hi %s!"
ctx.Tr("Hi", "John")
// Outputs: Hi John!
주형
hi: "Hi {{.Name}}!"
ctx.Tr("Hi", iris.Map{"Name": "John"})
// Outputs: Hi John!
복수화
Iris i18n은 복수 변수를 지원합니다. 로캘별 변수를 정의하려면 다음을 수행해야 합니다.
Vars
키의 새 섹션을 정의합니다.변수에 허용되는 키는 다음과 같습니다.
one
"=x"
여기서 x는 숫자"<x"
other
format
예시:
Vars:
- Minutes:
one: "minute"
other: "minutes"
- Houses:
one: "house"
other: "houses"
그런 다음 각 메시지는 이 변수를 사용할 수 있습니다. 방법은 다음과 같습니다.
# Using variables in raw string
YouLate: "You are %[1]d ${Minutes} late."
# [x] is the argument position,
# variables always have priority other fmt-style arguments,
# that's why we see [1] for houses and [2] for the string argument.
HouseCount: "%[2]s has %[1]d ${Houses}."
ctx.Tr("YouLate", 1)
// Outputs: You are 1 minute late.
ctx.Tr("YouLate", 10)
// Outputs: You are 10 minutes late.
ctx.Tr("HouseCount", 2, "John")
// Outputs: John has 2 houses.
주어진 복수 개수에 따라 표시할 메시지를 선택할 수 있습니다.
변수를 제외하고 각 메시지는 복수형도 가질 수 있습니다!
허용되는 키:
zero
one
two
"=x"
"<x"
">x"
other
위에서 만든 Minutes 변수를 사용할 수 있는 간단한 복수형 메시지를 만들어 보겠습니다.
FreeDay:
"=3": "You have three days and %[2]d ${Minutes} off." # "FreeDay" 3,15
one: "You have a day off." # "FreeDay", 1
other: "You have %[1]d free days." # "FreeDay", 5
ctx.Tr("FreeDay", 3, 15)
// Outputs: You have three days and 15 minutes off.
ctx.Tr("FreeDay", 1)
// Outputs: You have a day off.
ctx.Tr("FreeDay", 5)
// Outputs: You have 5 free days.
템플릿 텍스트 + 함수 + 복수형 + 변수를 사용하는 좀 더 고급 예제를 계속 살펴보겠습니다.
Vars:
- Houses:
one: "house"
other: "houses"
- Gender:
"=1": "She"
"=2": "He"
VarTemplatePlural:
one: "${Gender} is awesome!"
other: "other (${Gender}) has %[3]d ${Houses}."
"=5": "{{call .InlineJoin .Names}} are awesome."
const (
female = iota + 1
male
)
ctx.Tr("VarTemplatePlural", iris.Map{
"PluralCount": 5,
"Names": []string{"John", "Peter"},
"InlineJoin": func(arr []string) string {
return strings.Join(arr, ", ")
},
})
// Outputs: John, Peter are awesome
ctx.Tr("VarTemplatePlural", 1, female)
// Outputs: She is awesome!
ctx.Tr("VarTemplatePlural", 2, female, 5)
// Outputs: other (She) has 5 houses.
섹션
키가 예약된 키(예: 하나, 둘...)가 아니면 하위 섹션으로 작동합니다. 섹션은 점 문자(
.
)로 구분됩니다.Welcome:
Message: "Welcome {{.Name}}"
ctx.Tr("Welcome.Message", iris.Map{"Name": "John"})
// Outputs: Welcome John
현재 로케일 결정
context.GetLocale
방법을 사용하여현재 로케일 또는 로케일이 주어진 값인지 확인:
func(ctx iris.Context) {
locale := ctx.GetLocale()
// [...]
}
Locale 인터페이스는 다음과 같습니다.
// Locale is the interface which returns from a
// `Localizer.GetLocale` metod.
// It serves the transltions based on "key" or format. See `GetMessage`.
type Locale interface {
// Index returns the current locale index from the languages list.
Index() int
// Tag returns the full language Tag attached tothis Locale,
// it should be uniue across different Locales.
Tag() *language.Tag
// Language should return the exact languagecode of this `Locale`
//that the user provided on `New` function.
//
// Same as `Tag().String()` but it's static.
Language() string
// GetMessage should return translated text based n the given "key".
GetMessage(key string, args ...interface{}) string
}
번역 검색
context.Tr
메서드를 이 요청에 대한 번역된 텍스트를 가져오는 바로 가기로 사용합니다.func(ctx iris.Context) {
text := ctx.Tr("hi", "name")
// [...]
}
내부 보기
func(ctx iris.Context) {
ctx.View("index.html", iris.Map{
"tr": ctx.Tr,
})
}
읽어주셔서 감사합니다 🙏 실내에서 즐겁고 안전하게 지내세요 💪
Follow my GitHub and .
Special thanks to
Reference
이 문제에 관하여(Go를 사용한 국제화 및 현지화), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/kataras/internationalization-and-localization-with-go-3b56텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)