Update translation framework, add badge to readme

This commit is contained in:
Daniel Oaks
2018-01-23 15:06:55 +10:00
parent 1d22d65f9f
commit 75dcff7183
9 changed files with 332 additions and 173 deletions
+54 -5
View File
@@ -7,6 +7,7 @@ package irc
import (
"crypto/tls"
"encoding/json"
"errors"
"fmt"
"io/ioutil"
@@ -496,16 +497,18 @@ func LoadConfig(filename string) (config *Config, err error) {
continue
}
// only load .lang.yaml files
// only load core .lang.yaml files, and ignore help/irc files
name := f.Name()
if !strings.HasSuffix(strings.ToLower(name), ".lang.yaml") {
lowerName := strings.ToLower(name)
if !strings.HasSuffix(lowerName, ".lang.yaml") {
continue
}
// don't load our example file in practice
if strings.ToLower(name) == "example.lang.yaml" {
// don't load our example files in practice
if strings.HasPrefix(lowerName, "example") {
continue
}
// load core info file
data, err = ioutil.ReadFile(filepath.Join(config.Languages.Path, name))
if err != nil {
return nil, fmt.Errorf("Could not load language file [%s]: %s", name, err.Error())
@@ -516,6 +519,52 @@ func LoadConfig(filename string) (config *Config, err error) {
if err != nil {
return nil, fmt.Errorf("Could not parse language file [%s]: %s", name, err.Error())
}
langInfo.Translations = make(map[string]string)
// load actual translation files
var tlList map[string]string
// load irc strings file
ircName := strings.TrimSuffix(name, ".lang.yaml") + "-irc.lang.json"
data, err = ioutil.ReadFile(filepath.Join(config.Languages.Path, ircName))
if err != nil {
return nil, fmt.Errorf("Could not load language's irc file [%s]: %s", ircName, err.Error())
}
err = json.Unmarshal(data, &tlList)
if err != nil {
return nil, fmt.Errorf("Could not parse language's irc file [%s]: %s", ircName, err.Error())
}
for key, value := range tlList {
// because of how crowdin works, this is how we skip untranslated lines
if key == value {
continue
}
langInfo.Translations[key] = value
}
// load help strings file
helpName := strings.TrimSuffix(name, ".lang.yaml") + "-help.lang.json"
data, err = ioutil.ReadFile(filepath.Join(config.Languages.Path, helpName))
if err != nil {
return nil, fmt.Errorf("Could not load language's help file [%s]: %s", helpName, err.Error())
}
err = json.Unmarshal(data, &tlList)
if err != nil {
return nil, fmt.Errorf("Could not parse language's help file [%s]: %s", helpName, err.Error())
}
for key, value := range tlList {
// because of how crowdin works, this is how we skip untranslated lines
if key == value {
continue
}
langInfo.Translations[key] = value
}
// confirm that values are correct
if langInfo.Code == "en" {
@@ -527,7 +576,7 @@ func LoadConfig(filename string) (config *Config, err error) {
}
if len(langInfo.Translations) == 0 {
return nil, fmt.Errorf("Language file [%s] contains no translations", name)
return nil, fmt.Errorf("Language [%s / %s] contains no translations", langInfo.Code, langInfo.Name)
}
// check for duplicate languages
+2 -2
View File
@@ -372,10 +372,10 @@ func dlineHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool {
var snoDescription string
if durationIsUsed {
client.Notice(fmt.Sprintf("Added temporary (%s) D-Line for %s", duration.String(), hostString))
client.Notice(fmt.Sprintf(client.t("Added temporary (%s) D-Line for %s"), duration.String(), hostString))
snoDescription = fmt.Sprintf(ircfmt.Unescape("%s [%s]$r added temporary (%s) D-Line for %s"), client.nick, operName, duration.String(), hostString)
} else {
client.Notice(fmt.Sprintf("Added D-Line for %s", hostString))
client.Notice(fmt.Sprintf(client.t("Added D-Line for %s"), hostString))
snoDescription = fmt.Sprintf(ircfmt.Unescape("%s [%s]$r added D-Line for %s"), client.nick, operName, hostString)
}
server.snomasks.Send(sno.LocalXline, snoDescription)
+9 -1
View File
@@ -34,7 +34,15 @@ func NewLanguageManager(defaultLang string, languageData map[string]LangData) *L
// load language data
for name, data := range languageData {
lm.Info[name] = data
lm.translations[name] = data.Translations
// make sure we don't include empty translations
lm.translations[name] = make(map[string]string)
for key, value := range data.Translations {
if strings.TrimSpace(value) == "" {
continue
}
lm.translations[name][key] = value
}
}
return &lm
+20 -12
View File
@@ -2235,7 +2235,7 @@ func languageHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool
}
var (
infoString = strings.Split(` ▄▄▄ ▄▄▄· ▄▄ • ▐ ▄
infoString1 = strings.Split(` ▄▄▄ ▄▄▄· ▄▄ • ▐ ▄
▪ ▀▄ █·▐█ ▀█ ▐█ ▀ ▪▪ •█▌▐█▪
▄█▀▄ ▐▀▀▄ ▄█▀▀█ ▄█ ▀█▄ ▄█▀▄▪▐█▐▐▌ ▄█▀▄
▐█▌.▐▌▐█•█▌▐█ ▪▐▌▐█▄▪▐█▐█▌ ▐▌██▐█▌▐█▌.▐▌
@@ -2243,17 +2243,11 @@ var (
https://oragono.io/
https://github.com/oragono/oragono
Oragono is released under the MIT license.
Thanks to Jeremy Latt for founding Ergonomadic, the project this is based on <3
Core Developers:
Daniel Oakley, DanielOaks, <daniel@danieloaks.net>
`, "\n")
infoString2 = strings.Split(` Daniel Oakley, DanielOaks, <daniel@danieloaks.net>
Shivaram Lingamneni, slingamn, <slingamn@cs.stanford.edu>
Contributors and Former Developers:
3onyc
`, "\n")
infoString3 = strings.Split(` 3onyc
Edmund Huber
Euan Kemp (euank)
Jeremy Latt
@@ -2267,7 +2261,21 @@ Contributors and Former Developers:
)
func infoHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool {
for _, line := range infoString {
// we do the below so that the human-readable lines in info can be translated.
for _, line := range infoString1 {
client.Send(nil, server.name, RPL_INFO, client.nick, line)
}
client.Send(nil, server.name, RPL_INFO, client.nick, client.t("Oragono is released under the MIT license."))
client.Send(nil, server.name, RPL_INFO, client.nick, "")
client.Send(nil, server.name, RPL_INFO, client.nick, client.t("Thanks to Jeremy Latt for founding Ergonomadic, the project this is based on <3"))
client.Send(nil, server.name, RPL_INFO, client.nick, "")
client.Send(nil, server.name, RPL_INFO, client.nick, client.t("Core Developers:"))
for _, line := range infoString2 {
client.Send(nil, server.name, RPL_INFO, client.nick, line)
}
client.Send(nil, server.name, RPL_INFO, client.nick, "")
client.Send(nil, server.name, RPL_INFO, client.nick, client.t("Contributors and Former Developers:"))
for _, line := range infoString3 {
client.Send(nil, server.name, RPL_INFO, client.nick, line)
}
client.Send(nil, server.name, RPL_ENDOFINFO, client.nick, "End of /INFO")