Merge pull request #690 from trheyi/main

optimize the logic for rendering i18n on SUI pages
This commit is contained in:
Max 2024-07-16 19:12:39 +08:00 committed by GitHub
commit 7cce948eae
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 56 additions and 47 deletions

View file

@ -669,7 +669,7 @@ func (page *Page) translateNode(node *html.Node, sequence *int) ([]Translation,
parentSel.SetAttr("s:trans-node", key) parentSel.SetAttr("s:trans-node", key)
*sequence = *sequence + 1 *sequence = *sequence + 1
} }
parentSel.RemoveAttr("s:trans") parentSel.SetAttr("s:trans-escape", "true")
} }
if _, has := parentSel.Attr("s:trans-text"); has { if _, has := parentSel.Attr("s:trans-text"); has {
@ -682,7 +682,6 @@ func (page *Page) translateNode(node *html.Node, sequence *int) ([]Translation,
if len(keys) > 0 { if len(keys) > 0 {
raw := strings.Join(keys, ",") raw := strings.Join(keys, ",")
parentSel.SetAttr("s:trans-text", raw) parentSel.SetAttr("s:trans-text", raw)
parentSel.RemoveAttr("s:trans")
translations = append(translations, trans...) translations = append(translations, trans...)
} }
break break

View file

@ -277,10 +277,9 @@ func (parser *TemplateParser) parseNode(node *html.Node) {
func (parser *TemplateParser) parseElementNode(sel *goquery.Selection) { func (parser *TemplateParser) parseElementNode(sel *goquery.Selection) {
node := sel.Get(0) parser.transElementNode(sel) // Translations
// Translations node := sel.Get(0)
parser.transElementNode(sel)
if _, exist := sel.Attr("s:for"); exist { if _, exist := sel.Attr("s:for"); exist {
parser.forStatementNode(sel) parser.forStatementNode(sel)
@ -303,20 +302,35 @@ func (parser *TemplateParser) parseElementNode(sel *goquery.Selection) {
parser.parseElementAttrs(sel) parser.parseElementAttrs(sel)
} }
func (parser *TemplateParser) transElementNode(sel *goquery.Selection) { func (parser *TemplateParser) transTextNode(node *html.Node) {
if parser.locale != nil {
if v, exists := sel.Attr("s:trans-node"); exists { parentSel := goquery.NewDocumentFromNode(node.Parent).Selection
parser.transNode(v, sel) text := strings.TrimSpace(node.Data)
if text == "" {
return
} }
// Translate the node
if key, exists := parentSel.Attr("s:trans-node"); exists {
text = parser.transNode(key, text)
} }
// Escape the text // Escape the text
if _, exists := sel.Attr("s:trans-node"); exists { if _, exists := parentSel.Attr("s:trans-escape"); exists {
content := parser.escapeText(strings.TrimSpace(sel.Text())) text = parser.escapeText(text)
sel.SetText(content)
} }
// Translate the attributes // Translate the text
if v, exists := parentSel.Attr("s:trans-text"); exists {
keys := strings.Split(v, ",")
text = parser.transText(text, keys)
}
node.Data = text
}
func (parser *TemplateParser) transElementNode(sel *goquery.Selection) {
for _, attr := range sel.Nodes[0].Attr { for _, attr := range sel.Nodes[0].Attr {
if strings.HasPrefix(attr.Key, "s:trans-attr-") { if strings.HasPrefix(attr.Key, "s:trans-attr-") {
keys := strings.Split(attr.Val, ",") keys := strings.Split(attr.Val, ",")
@ -329,38 +343,6 @@ func (parser *TemplateParser) transElementNode(sel *goquery.Selection) {
sel.SetAttr(name, newValue) sel.SetAttr(name, newValue)
} }
} }
// Translate the text
if v, exists := sel.Attr("s:trans-text"); exists {
keys := strings.Split(v, ",")
content := strings.TrimSpace(sel.Text())
if content == "" {
return
}
content = parser.transText(content, keys)
sel.SetText(content)
}
}
func (parser *TemplateParser) transNode(key string, sel *goquery.Selection) {
content := sel.Text()
message := strings.TrimSpace(content)
if message == "" {
return
}
if lcMessage, has := parser.locale.Keys[key]; has && lcMessage != message {
content = strings.Replace(content, message, lcMessage, 1)
sel.SetText(content)
return
}
if lcMessage, has := parser.locale.Messages[message]; has {
content = strings.Replace(content, message, lcMessage, 1)
sel.SetText(content)
return
}
} }
// 替换转义字符 // 替换转义字符
@ -378,19 +360,46 @@ func (parser *TemplateParser) escape(value string) string {
if strings.HasPrefix(value, "':::") { if strings.HasPrefix(value, "':::") {
return "'::" + strings.TrimPrefix(value, "':::") return "'::" + strings.TrimPrefix(value, "':::")
} }
if strings.HasPrefix(value, "':::") {
return "'::" + strings.TrimPrefix(value, "':::")
}
if strings.HasPrefix(value, "\":::") { if strings.HasPrefix(value, "\":::") {
return "\"::" + strings.TrimPrefix(value, "\":::") return "\"::" + strings.TrimPrefix(value, "\":::")
} }
if strings.HasPrefix(value, "":::") {
return ""::" + strings.TrimPrefix(value, "":::")
}
return value return value
} }
func (parser *TemplateParser) transNode(key string, message string) string {
if parser.locale == nil {
return message
}
if lcMessage, has := parser.locale.Keys[key]; has && lcMessage != message {
return lcMessage
}
if lcMessage, has := parser.locale.Messages[message]; has {
return lcMessage
}
return message
}
func (parser *TemplateParser) transText(content string, keys []string) string { func (parser *TemplateParser) transText(content string, keys []string) string {
matches := stmtRe.FindAllStringSubmatch(content, -1) matches := stmtRe.FindAllStringSubmatch(content, -1)
newContent := content newContent := content
for _, match := range matches { for _, match := range matches {
text := strings.TrimSpace(match[1]) text := strings.TrimSpace(match[1])
if strings.HasPrefix(text, "':::") || strings.HasPrefix(text, "\":::") { if strings.HasPrefix(text, "':::") || strings.HasPrefix(text, "\":::") || strings.HasPrefix(text, "':::") || strings.HasPrefix(text, "":::") {
escaped := parser.escape(text) escaped := parser.escape(text)
newContent = strings.Replace(newContent, text, escaped, 1) newContent = strings.Replace(newContent, text, escaped, 1)
continue continue
@ -511,6 +520,7 @@ func checkIsRawElement(node *html.Node) bool {
return false return false
} }
func (parser *TemplateParser) parseTextNode(node *html.Node) { func (parser *TemplateParser) parseTextNode(node *html.Node) {
parser.transTextNode(node) // Translations
parser.sequence = parser.sequence + 1 parser.sequence = parser.sequence + 1
res, hasStmt := parser.data.Replace(node.Data) res, hasStmt := parser.data.Replace(node.Data)
// Bind the variable to the parent node // Bind the variable to the parent node