sqle
sqle copied to clipboard
国际化支持英文
需求描述(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
+ }
todos
- 接口层对rules和audit result的操作适配结构变更
- 自定义规则、模板,修改params参数的情况
- 兼容老版本插件
- rollback中reason支持多语言切换
- 检查插件advisor中optimize是否需要支持多语言切换
- 重写规则国际化
- 国际化包代码组件间复用