Go를 사용한 국제화 및 현지화



안녕하세요 고퍼 여러분!

이 기사에서는 단일 언어 웹 응용 프로그램을 다국어 웹 응용 프로그램으로 변환하는 방법을 배웁니다.

이 문서에서 사용된 도구:
  • iris

  • 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 도구를 사용하여 로케일을 포함할 수 있습니다.
  • go-bindata 도구를 설치합니다.
  • $ go get -u github.com/go-bindata/go-bindata/...
  • 응용 프로그램에 로컬 파일 포함
  • $ go-bindata -o locales.go ./locales/...
  • LoadAssets 메서드를 사용하여 언어를 초기화하고 로드합니다
  • .

    ^ AssetNamesAsset 함수는 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

    좋은 웹페이지 즐겨찾기