Greatly improved translator feature

The translator feature has been completely rewritten, and can now
convert any game language to any other.
This commit is contained in:
Raum0x2A
2021-05-20 19:22:17 -06:00
parent 6d3a57d31c
commit 94f9b4e15c
3 changed files with 124 additions and 161 deletions

View File

@@ -54,7 +54,7 @@ func init() {
if err != nil { if err != nil {
panic(errors.New("can not load: " + fileloc[x])) 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 { if err != nil {
panic(errors.New("can not write " + fileloc[x] + " to temp dir")) panic(errors.New("can not write " + fileloc[x] + " to temp dir"))
} }

236
lang.go
View File

@@ -2,176 +2,140 @@ package nmslib
import ( import (
"encoding/csv" "encoding/csv"
"fmt"
"os" "os"
"strings" "strings"
) )
func readCSV(lagcsv string) [][]string { /*Translate Game languages and english
fileloc := NmsTemp + "/" + lagcsv Translate.Lang sets source language for translations
csvFile, err := os.Open(fileloc) options are:
if err != nil { korvax
fmt.Println(err) gek
} vykeen
defer csvFile.Close() // close language file when finished atlas
english
// read csv file from memory
csvlines, err := csv.NewReader(csvFile).ReadAll()
if err != nil {
fmt.Println(err)
}
return csvlines
}
/*
Create struct of Word string
*/ */
type Translate struct { type Translate struct {
Word string Lang string
} }
// trans - set up structure of a word iteration /*Translate source language to english
type trans0 struct { Translate any NMS language (ie. Korvax) to english
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
*/ */
func (t Translate) Kor2Eng() (returnstring string) { func (t Translate) ToEng(word string) (translation string) {
csvlines := readCSV("korvax-lang.csv") //return translate2english(word, langFile(t.Lang))
for range csvlines { return Translator(word, t.Lang, "english")
returnstring = (toEng(t, csvlines))
}
return
} }
/* /*Translate source language to Korvax
Eng2Kor translate english word to korvax word Translate any NMS language or english (ie. Gek) to Korvax
*/ */
func (t Translate) Eng2Kor() (returnstring string) { func (t Translate) ToKorvax(word string) (translation string) {
csvlines := readCSV("korvax-lang.csv") return Translator(word, t.Lang, "korvax")
for range csvlines {
returnstring = (toNMS(t, csvlines))
}
return
} }
/* /*Translate source language to Vy'Keen
Gek2Eng translate Gek word to english word Translate any NMS language or english (ie. Atlas) to Vy'Keen
*/ */
func (t Translate) Gek2Eng() (returnstring string) { func (t Translate) ToVykeen(word string) (translation string) {
csvlines := readCSV("gek-lang.csv") return Translator(word, t.Lang, "vykeen")
for range csvlines {
returnstring = (toEng(t, csvlines))
}
return
} }
/* /*Translate source language to Gek
Eng2Gek translate english word to Gek word Translate any NMS language or english (ie. Vy'Keen) to Gek
*/ */
func (t Translate) Eng2Gek() (returnstring string) { func (t Translate) ToGek(word string) (translation string) {
csvlines := readCSV("gek-lang.csv") return Translator(word, t.Lang, "Gek")
for range csvlines {
returnstring = (toNMS(t, csvlines))
}
return
} }
/* /*Translate source language to Atlas
Vyk2Eng translate Vy'keen word to english word Translate any NMS language or english (ie. Korvax) to Atlas
*/ */
func (t Translate) Vyk2Eng() (returnstring string) { func (t Translate) ToAtlas(word string) (translation string) {
csvlines := readCSV("vykeen-lang.csv") return Translator(word, t.Lang, "atlas")
for range csvlines {
returnstring = (toEng(t, csvlines))
}
return
} }
/* // read language files
Eng2Vyk translate english word to vykeen word 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) { func Translator(word string, source string, target string) string {
csvlines := readCSV("vykeen-lang.csv") var sourcekey [4]string
for range csvlines { var targetkey [4]string
returnstring = (toNMS(t, csvlines)) var dmy string
} var rt string
return
}
/* rt = "*\\Kzzzzzzt\\*"
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
}
/* if source == "english" {
Eng2Atl translate english word to Atlas word dmy = target
*/ } else {
func (t Translate) Eng2Atl() (returnstring string) { dmy = source
csvlines := readCSV("atlas-lang.csv")
for range csvlines {
returnstring = (toNMS(t, csvlines))
} }
return for _, line := range langFile(dmy) {
} for _, trans := range line {
if trans == word {
func toEng(t Translate, csvlines [][]string) string { sourcekey[0] = line[0]
returnstring := "*\\Kzzzzzzt\\*" // word not found default sourcekey[1] = line[1]
for _, line := range csvlines { sourcekey[2] = line[2]
lang := trans0{ sourcekey[3] = line[3]
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 if target != "english" {
} for _, line := range langFile(target) {
if strings.EqualFold(line[0], sourcekey[0]) {
func toNMS(t Translate, csvlines [][]string) string { targetkey[0] = line[0]
returnstring := "*\\Kzzzzzzt\\*" // word not found default targetkey[1] = line[1]
for _, line := range csvlines { targetkey[2] = line[2]
lang := trans0{ targetkey[3] = line[3]
english: line[0],
word: line[1],
capword: line[2],
acpword: line[3],
}
if t.Word == lang.english {
if lang.word != "" {
returnstring = lang.word
} }
} }
if t.Word == strings.Title(strings.ToLower(lang.english)) { if strings.EqualFold(word, sourcekey[0]) {
if lang.capword != "" { if targetkey[0] != "" {
returnstring = strings.Title(strings.ToLower(lang.capword)) 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 t.Word == strings.ToUpper(lang.english) { if source == "english" {
if lang.acpword != "" { rt = targetkey[1]
returnstring = strings.ToUpper(lang.acpword) }
} 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
} }

View File

@@ -6,32 +6,31 @@ import (
) )
func TestTranslate(t *testing.T) { func TestTranslate(t *testing.T) {
want := Translate{"Paka"} kor2eng := Translate{Lang: "korvax"}
if want.Atl2Eng() != "Awake" { if kor2eng.ToEng("Alinichel") != "Emergency" {
t.Errorf("\nTesting Translate{\"Paka\"}.Atl2Eng(): got %q, want: %q.\n", want.Atl2Eng(), "Awake") t.Errorf("\nTesting Translate{Lang: \"korvax\"}.ToEng(\"Alinichel\"): got %q, want: %q.\n", kor2eng.ToEng("Alinichel"), "Emergency")
} else { } else {
fmt.Printf("\nTesting Translate{\"Paka\"}.Atl2Eng(): got %q, want: %q.\n", want.Atl2Eng(), "Awake") fmt.Printf("\nTesting Translate{Lang: \"korvax\"}.ToEng(\"Alinichel\"): got %q, want: %q.\n", kor2eng.ToEng("Alinichel"), "Emergency")
}
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")
} }
want = Translate{"Aqo"} vyk2eng := Translate{"vykeen"}
if want.Vyk2Eng() != "Foes" { if vyk2eng.ToEng("Aqo") != "Foes" {
t.Errorf("Testing Translate{\"Aqo\"}.Vyk2Eng(): got %q, want: %q.\n", want.Vyk2Eng(), "Foes") t.Errorf("Testing Translate{Lang: \"vykeen\"}.ToEng(\"Aqo\"): got %q, want: %q.\n", vyk2eng.ToEng("Aqo"), "Foes")
} else { } 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() CleanUp()
fmt.Printf("\nTesting complete.\nStatus: ")
} }