From 94f9b4e15c4234af0a689f12ac5f977c31f73403 Mon Sep 17 00:00:00 2001 From: Raum0x2A Date: Thu, 20 May 2021 19:22:17 -0600 Subject: [PATCH] Greatly improved translator feature The translator feature has been completely rewritten, and can now convert any game language to any other. --- init.go | 2 +- lang.go | 242 +++++++++++++++++---------------------- nmslib-translate_test.go | 41 ++++--- 3 files changed, 124 insertions(+), 161 deletions(-) diff --git a/init.go b/init.go index 9ee9436..7fa35d9 100644 --- a/init.go +++ b/init.go @@ -54,7 +54,7 @@ func init() { if err != nil { panic(errors.New("can not load: " + fileloc[x])) } - err = ioutil.WriteFile(NmsTemp+"/"+fileloc[x], []byte(data), 0644) + err = ioutil.WriteFile(NmsTemp+"/assets/lang/"+fileloc[x], []byte(data), 0644) if err != nil { panic(errors.New("can not write " + fileloc[x] + " to temp dir")) } diff --git a/lang.go b/lang.go index aec0d20..765ecbb 100644 --- a/lang.go +++ b/lang.go @@ -2,176 +2,140 @@ package nmslib import ( "encoding/csv" - "fmt" "os" "strings" ) -func readCSV(lagcsv string) [][]string { - fileloc := NmsTemp + "/" + lagcsv - csvFile, err := os.Open(fileloc) - if err != nil { - fmt.Println(err) - } - defer csvFile.Close() // close language file when finished - - // read csv file from memory - csvlines, err := csv.NewReader(csvFile).ReadAll() - if err != nil { - fmt.Println(err) - } - return csvlines - -} - -/* -Create struct of Word string +/*Translate Game languages and english +Translate.Lang sets source language for translations +options are: + korvax + gek + vykeen + atlas + english */ type Translate struct { - Word string + Lang string } -// trans - set up structure of a word iteration -type trans0 struct { - english string // english word - word string // no caps word - capword string // Capitalized word - acpword string // ALL CAPITALIZED WORD -} - -/* -Kor2Eng translate korvax word to english word +/*Translate source language to english +Translate any NMS language (ie. Korvax) to english */ -func (t Translate) Kor2Eng() (returnstring string) { - csvlines := readCSV("korvax-lang.csv") - for range csvlines { - returnstring = (toEng(t, csvlines)) - } - return +func (t Translate) ToEng(word string) (translation string) { + //return translate2english(word, langFile(t.Lang)) + return Translator(word, t.Lang, "english") } -/* -Eng2Kor translate english word to korvax word +/*Translate source language to Korvax +Translate any NMS language or english (ie. Gek) to Korvax */ -func (t Translate) Eng2Kor() (returnstring string) { - csvlines := readCSV("korvax-lang.csv") - for range csvlines { - returnstring = (toNMS(t, csvlines)) - } - return +func (t Translate) ToKorvax(word string) (translation string) { + return Translator(word, t.Lang, "korvax") } -/* -Gek2Eng translate Gek word to english word +/*Translate source language to Vy'Keen +Translate any NMS language or english (ie. Atlas) to Vy'Keen */ -func (t Translate) Gek2Eng() (returnstring string) { - csvlines := readCSV("gek-lang.csv") - for range csvlines { - returnstring = (toEng(t, csvlines)) - } - return +func (t Translate) ToVykeen(word string) (translation string) { + return Translator(word, t.Lang, "vykeen") } -/* -Eng2Gek translate english word to Gek word +/*Translate source language to Gek +Translate any NMS language or english (ie. Vy'Keen) to Gek */ -func (t Translate) Eng2Gek() (returnstring string) { - csvlines := readCSV("gek-lang.csv") - for range csvlines { - returnstring = (toNMS(t, csvlines)) - } - return +func (t Translate) ToGek(word string) (translation string) { + return Translator(word, t.Lang, "Gek") } -/* -Vyk2Eng translate Vy'keen word to english word +/*Translate source language to Atlas +Translate any NMS language or english (ie. Korvax) to Atlas */ -func (t Translate) Vyk2Eng() (returnstring string) { - csvlines := readCSV("vykeen-lang.csv") - for range csvlines { - returnstring = (toEng(t, csvlines)) - } - return +func (t Translate) ToAtlas(word string) (translation string) { + return Translator(word, t.Lang, "atlas") } -/* -Eng2Vyk translate english word to vykeen word +// read language files +func langFile(lang string) [][]string { + filepath := NmsTemp + "/assets/lang/" + lang + "-lang.csv" + csvFile, err := os.Open(filepath) + if err != nil { + panic(err) + } + defer csvFile.Close() + + lines, err := csv.NewReader(csvFile).ReadAll() + if err != nil { + panic(err) + } + return lines +} + +/*Translate any in game language to another including english (ie. Korvax to Gek) +Translating from english to a game language will alway default to all lower case for now */ -func (t Translate) Eng2Vyk() (returnstring string) { - csvlines := readCSV("vykeen-lang.csv") - for range csvlines { - returnstring = (toNMS(t, csvlines)) - } - return -} +func Translator(word string, source string, target string) string { + var sourcekey [4]string + var targetkey [4]string + var dmy string + var rt string -/* -Atl2Eng translate Atlas word to english word -*/ -func (t Translate) Atl2Eng() (returnstring string) { - csvlines := readCSV("atlas-lang.csv") - for range csvlines { - returnstring = (toEng(t, csvlines)) - } - return -} + rt = "*\\Kzzzzzzt\\*" -/* -Eng2Atl translate english word to Atlas word -*/ -func (t Translate) Eng2Atl() (returnstring string) { - csvlines := readCSV("atlas-lang.csv") - for range csvlines { - returnstring = (toNMS(t, csvlines)) + if source == "english" { + dmy = target + } else { + dmy = source } - return -} - -func toEng(t Translate, csvlines [][]string) string { - returnstring := "*\\Kzzzzzzt\\*" // word not found default - for _, line := range csvlines { - lang := trans0{ - english: strings.ToLower(line[0]), - word: strings.ToLower(line[1]), - capword: strings.ToLower(line[2]), - acpword: strings.ToLower(line[3]), - } - // check translate struct for value - if strings.ToLower(t.Word) == lang.word { - returnstring = lang.english - } else if strings.ToLower(t.Word) == lang.capword { - returnstring = strings.Title(strings.ToLower(lang.english)) - } else if strings.ToLower(t.Word) == lang.acpword { - returnstring = strings.ToUpper(lang.english) - } - } - return returnstring -} - -func toNMS(t Translate, csvlines [][]string) string { - returnstring := "*\\Kzzzzzzt\\*" // word not found default - for _, line := range csvlines { - lang := trans0{ - english: line[0], - word: line[1], - capword: line[2], - acpword: line[3], - } - if t.Word == lang.english { - if lang.word != "" { - returnstring = lang.word + for _, line := range langFile(dmy) { + for _, trans := range line { + if trans == word { + sourcekey[0] = line[0] + sourcekey[1] = line[1] + sourcekey[2] = line[2] + sourcekey[3] = line[3] } } - if t.Word == strings.Title(strings.ToLower(lang.english)) { - if lang.capword != "" { - returnstring = strings.Title(strings.ToLower(lang.capword)) + if target != "english" { + for _, line := range langFile(target) { + if strings.EqualFold(line[0], sourcekey[0]) { + targetkey[0] = line[0] + targetkey[1] = line[1] + targetkey[2] = line[2] + targetkey[3] = line[3] + } } - } - if t.Word == strings.ToUpper(lang.english) { - if lang.acpword != "" { - returnstring = strings.ToUpper(lang.acpword) + if strings.EqualFold(word, sourcekey[0]) { + if targetkey[0] != "" { + rt = targetkey[0] + } + } else if strings.EqualFold(word, sourcekey[1]) { + if targetkey[1] != "" { + rt = targetkey[1] + } + } else if strings.EqualFold(word, sourcekey[2]) { + if targetkey[2] != "" { + rt = targetkey[2] + } + } else if strings.EqualFold(word, sourcekey[3]) { + if targetkey[3] != "" { + rt = targetkey[3] + } + } + if source == "english" { + rt = targetkey[1] + } + } else { + if strings.EqualFold(word, sourcekey[0]) { + rt = sourcekey[0] + } else if strings.EqualFold(word, sourcekey[1]) { + rt = strings.ToLower(sourcekey[0]) + } else if strings.EqualFold(word, sourcekey[2]) { + rt = strings.Title(sourcekey[0]) + } else if strings.EqualFold(word, sourcekey[3]) { + rt = strings.ToUpper(sourcekey[0]) } } } - return returnstring + return rt } diff --git a/nmslib-translate_test.go b/nmslib-translate_test.go index 0cf0c01..4568e15 100644 --- a/nmslib-translate_test.go +++ b/nmslib-translate_test.go @@ -6,32 +6,31 @@ import ( ) func TestTranslate(t *testing.T) { - want := Translate{"Paka"} - if want.Atl2Eng() != "Awake" { - t.Errorf("\nTesting Translate{\"Paka\"}.Atl2Eng(): got %q, want: %q.\n", want.Atl2Eng(), "Awake") + kor2eng := Translate{Lang: "korvax"} + if kor2eng.ToEng("Alinichel") != "Emergency" { + t.Errorf("\nTesting Translate{Lang: \"korvax\"}.ToEng(\"Alinichel\"): got %q, want: %q.\n", kor2eng.ToEng("Alinichel"), "Emergency") } else { - fmt.Printf("\nTesting Translate{\"Paka\"}.Atl2Eng(): got %q, want: %q.\n", want.Atl2Eng(), "Awake") - } - want = Translate{"hofsos"} - if want.Gek2Eng() != "answer" { - t.Errorf("Testing Translate{\"hofsos\"}.Gek2Eng(): got %q, want: %q.\n", want.Gek2Eng(), "answer") - } else { - fmt.Printf("Testing Translate{\"hofsos\"}.Gek2Eng(): got %q, want: %q.\n", want.Gek2Eng(), "answer") + fmt.Printf("\nTesting Translate{Lang: \"korvax\"}.ToEng(\"Alinichel\"): got %q, want: %q.\n", kor2eng.ToEng("Alinichel"), "Emergency") } - want = Translate{"Aqo"} - if want.Vyk2Eng() != "Foes" { - t.Errorf("Testing Translate{\"Aqo\"}.Vyk2Eng(): got %q, want: %q.\n", want.Vyk2Eng(), "Foes") + vyk2eng := Translate{"vykeen"} + if vyk2eng.ToEng("Aqo") != "Foes" { + t.Errorf("Testing Translate{Lang: \"vykeen\"}.ToEng(\"Aqo\"): got %q, want: %q.\n", vyk2eng.ToEng("Aqo"), "Foes") } else { - fmt.Printf("Testing Translate{\"Aqo\"}.Vyk2Eng(): got %q, want: %q.\n", want.Vyk2Eng(), "Foes") + fmt.Printf("Testing Translate{Lang: \"vykeen\"}.ToEng(\"Aqo\"): got %q, want: %q.\n", vyk2eng.ToEng("Aqo"), "Foes") } - want = Translate{"Alinichel"} - if want.Kor2Eng() != "Emergency" { - t.Errorf("Testing Translate{\"Alinichel\"}.Kor2Eng(): got %q, want: %q.\n", want.Kor2Eng(), "Emergency") - } else { - fmt.Printf("Testing Translate{\"Alinichel\"}.Kor2Eng(): got %q, want: %q.\n", want.Kor2Eng(), "Emergency") - } - fmt.Printf("\nTesting complete.\nStatus: ") + engWord := Translate{"english"} + if engWord.ToKorvax("learn") != "achi" { + t.Errorf("Testing Translate{Lang: \"english\"}.ToKor(\"learn\"): got %q, want: %q.\n", engWord.ToKorvax("learn"), "achi") + } else { + fmt.Printf("Testing Translate{Lang: \"english\"}.ToKor(\"learn\"): got %q, want: %q.\n", engWord.ToKorvax("learn"), "achi") + } + + fmt.Println("Blind Test: " + Translate{"gek"}.ToAtlas("baturk")) // word does not exist in Atlas lang + fmt.Println("Blind Test: " + Translate{"gek"}.ToAtlas("Tor")) // word exists + + fmt.Println("Running CleanUp()") CleanUp() + fmt.Printf("\nTesting complete.\nStatus: ") }