ZBLOG

validator 如何优雅的根据请求环境,来加载Translation

要根据请求环境来加载不同的翻译文件,你可以使用第三方库 github.com/nicksnyder/go-i18n/v2/i18n 来实现。下面是一个示例代码:

首先,在项目中创建一个 locales 目录,并在其中添加多个语言对应的 JSON 翻译文件,比如 en.jsonzh.json

// en.json
{
  "welcome_message": "Welcome!",
  "error_required": "{{.Field}} is required."
}

// zh.json
{
  "welcome_message": "欢迎!",
  "error_required": "{{.Field}} 是必填项。"
}

然后,编写一个函数来加载并初始化翻译器:

package main

import (
	"fmt"
	"net/http"

	"github.com/nicksnyder/go-i18n/v2/i18n"
	"golang.org/x/text/language"
)

func loadTranslations(lang string) (*i18n.Bundle, error) {
	bundle := i18n.NewBundle(language.English)
	bundle.RegisterUnmarshalFunc("json", json.Unmarshal)

	err := bundle.LoadMessageFile("./locales/en.json")
	if err != nil {
		return nil, fmt.Errorf("failed to load English translations: %w", err)
	}

	if lang != "en" {
		err = bundle.LoadMessageFile(fmt.Sprintf("./locales/%s.json", lang))
		if err != nil {
			return nil, fmt.Errorf("failed to load %s translations: %w", lang, err)
		}
	}

	return bundle, nil
}

上述函数根据传入的语言标识符(比如 "en""zh")加载相应的翻译文件,如果语言为英文,则只加载英文翻译文件。

接下来,在处理请求时,根据请求头或其他方式获取到用户所需的语言,并使用该语言初始化翻译器:

func handleRequest(w http.ResponseWriter, r *http.Request) {
	// 根据请求环境获取用户所需的语言
	lang := getUserLanguage(r)

	// 加载并初始化翻译器
	bundle, err := loadTranslations(lang)
	if err != nil {
		http.Error(w, "Failed to load translations.", http.StatusInternalServerError)
		return
	}

	localizer := i18n.NewLocalizer(bundle, lang)

	// 使用 localizer 进行翻译和国际化处理
	welcomeMessage := localizer.MustLocalize(&i18n.LocalizeConfig{
		MessageID: "welcome_message",
	})

	errorMessage := localizer.MustLocalize(&i18n.LocalizeConfig{
		MessageID: "error_required",
		TemplateData: map[string]interface{}{
			"Field": "Username",
		},
	})

	fmt.Fprintf(w, "%s\n%s", welcomeMessage, errorMessage)
}

在上述代码中,我们首先通过 getUserLanguage 函数获取用户所需的语言标识符。然后,调用 loadTranslations 函数来加载对应的翻译文件并初始化翻译器。

接着,使用 i18n.NewLocalizer 创建一个 localizer 实例,并传入 bundle 和用户语言标识符。然后,可以使用 localizer 的 MustLocalize 方法来翻译和格式化消息。

在上述示例中,我们分别翻译了一个欢迎消息和一个错误消息,并将字段名作为模板数据传入以进行动态替换。

通过以上方式,你可以根据请求环境优雅地加载对应的翻译文件,并使用相应的翻译器进行国际化处理。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=14470

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?