sqle icon indicating copy to clipboard operation
sqle copied to clipboard

国际化支持英文

Open sjjian opened this issue 1 year ago • 0 comments

需求描述(Describe)

原始需求:http://10.186.18.11/confluence/pages/viewpage.action?pageId=166559794

实现方案

国际化框架

https://github.com/nicksnyder/go-i18n 通过该库定义需要国际化的消息,将消息翻译成各语言的语言包,启动时加载语言包。

接口级翻译

通过echo中间件,在请求时将本地化器加载到 context 中,需要翻译时使用特定的key取出使用。

后台任务级翻译

后台任务的翻译需要存储所有支持语言的翻译文本,各语言的文本通过 language.Tag.String() 作为key存储,需要时将请求头 Accept-Language 转换成 language.Tag 取相应的语言版本。

func GetLangTagFromEchoCtx(c echo.Context) language.Tag {
	for _, lang := range bundle.LanguageTags() {
		if strings.HasPrefix(c.Request().Header.Get("accept-language"), lang.String()) {
			return lang
		}
	}
	return DefaultLang
}

插件国际化

插件自行维护语言包,Metas接口返回所有语言版本的规则,audit接口返回所有语言版本的审核结果。

结构变更

proto

+ message I18nRuleInfo {
+   string desc = 2;
# +   string level = 3;
+   string category = 4;
+   repeated Param params = 5;
+   string annotation = 6;
+   Knowledge knowledge = 7;
+ }

message Rule {
	string name = 1;
-	string desc = 2;
	string level = 3;
-	string category = 4;
-	repeated Param params = 5;
-	string annotation = 6;
-	Knowledge knowledge = 7;
+	map<string, I18nRuleInfo> i18nRuleInfo = 8;
}


+ message I18nAuditResultInfo {
+   string message = 1;
+ }

message AuditResult {
-  string message = 1;
  string level = 2;
  string rule_name = 3;
+  map<string, I18nAuditResultInfo> i18nAuditResultInfo = 4;
}

model

// Rule
type Rule struct {
	Name            string         `json:"name" gorm:"primary_key; not null;type:varchar(255)"`
	DBType          string         `json:"db_type" gorm:"primary_key; not null; default:\"mysql\";type:varchar(255)"`
-	Desc            string         `json:"desc" gorm:"type:varchar(255)"`
-	Annotation      string         `json:"annotation" gorm:"column:annotation;type:varchar(1024)"`
	Level           string         `json:"level" example:"error" gorm:"type:varchar(255)"` // notice, warn, error
-	Typ             string         `json:"type" gorm:"column:type; not null;type:varchar(255)"`
-	Params          params.Params  `json:"params" gorm:"type:varchar(1000)"`
	KnowledgeId     uint           `json:"knowledge_id"`
	Knowledge       *RuleKnowledge `json:"knowledge" gorm:"foreignkey:KnowledgeId"`
	HasAuditPower   bool           `json:"has_audit_power" gorm:"type:bool" example:"true"`
	HasRewritePower bool           `json:"has_rewrite_power" gorm:"type:bool" example:"true"`
+	I18nRuleInfo    I18nRuleInfo   `json:"i18n_rule_info" gorm:"type:json"`
}

+ type RuleInfo struct {
+ 	Desc       string
+ 	Annotation string
+ 	Category   string
+ 	Level      string
+ 	Params     params.Params
+ 	Knowledge  RuleKnowledge
+ }
+ 
+ type I18nRuleInfo map[string]RuleInfo
+ 
+ func (i I18nRuleInfo) Value() (driver.Value, error) {
+ 	b, err := json.Marshal(i)
+ 	return string(b), err
+ }
+ 
+ func (i *I18nRuleInfo) Scan(input interface{}) error {
+ 	return json.Unmarshal(input.([]byte), i)
+ }


// AuditResult
type AuditResults []AuditResult

type AuditResult struct {
	Level               string `json:"level"`
-	Message             string `json:"message"`
	RuleName            string `json:"rule_name"`
+	I18NAuditResultInfo map[string]*I18NAuditResultInfo
}

+ type I18NAuditResultInfo struct {
+ 	Message string
+ }

image image

todos

  • 接口层对rules和audit result的操作适配结构变更
  • 自定义规则、模板,修改params参数的情况
  • 兼容老版本插件
  • rollback中reason支持多语言切换
  • 检查插件advisor中optimize是否需要支持多语言切换
  • 重写规则国际化
  • 国际化包代码组件间复用

变更影响面

受影响的模块或功能

外部引用的潜在问题或风险

版本兼容性

测试建议

sjjian avatar Aug 16 '24 06:08 sjjian