147 lines
2.7 KiB
Go
147 lines
2.7 KiB
Go
package internal
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
"os"
|
|
"path/filepath"
|
|
)
|
|
|
|
type LanguageService struct{}
|
|
|
|
func isValidLang(lang string) bool {
|
|
valid := []string{"en", "jp", "cn", "kr"}
|
|
for _, v := range valid {
|
|
if lang == v {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
func (l *LanguageService) GetLanguage(path string) (string, string, error) {
|
|
files, err := os.ReadDir(path)
|
|
if err != nil {
|
|
return "", "", err
|
|
}
|
|
|
|
for _, file := range files {
|
|
filePath := filepath.Join(path, file.Name())
|
|
|
|
content, err := os.ReadFile(filePath)
|
|
if err != nil {
|
|
continue
|
|
}
|
|
|
|
patternToFind := []byte("SpriteOutput/UI/Fonts/RPG_CN.ttf")
|
|
idx := bytes.Index(content, patternToFind)
|
|
if idx == -1 {
|
|
continue
|
|
}
|
|
|
|
pattern := []byte("Korean")
|
|
idx = bytes.Index(content, pattern)
|
|
if idx == -1 {
|
|
continue
|
|
}
|
|
|
|
// Move to os text language
|
|
idx += 10
|
|
idx += 4
|
|
osText := string(content[idx : idx+2])
|
|
idx += 3 * 4
|
|
|
|
// Move to cn voice language
|
|
idx += 1
|
|
idx += 5
|
|
cnVoice := string(content[idx : idx+2])
|
|
idx += 3 * 2 // skip 2 entries
|
|
|
|
// Move to os voice language
|
|
idx += 1
|
|
idx += 5
|
|
osVoice := string(content[idx : idx+2])
|
|
idx += 3 * 5 // skip 5 entries
|
|
|
|
// Move to cn text language
|
|
idx += 1
|
|
idx += 4
|
|
cnText := string(content[idx : idx+2])
|
|
|
|
textLang := osText
|
|
voiceLang := osVoice
|
|
if !isValidLang(textLang) {
|
|
textLang = cnText
|
|
}
|
|
if !isValidLang(voiceLang) {
|
|
voiceLang = cnVoice
|
|
}
|
|
|
|
return textLang, voiceLang, nil
|
|
}
|
|
|
|
return "", "", fmt.Errorf("couldn't find file to read language from")
|
|
}
|
|
|
|
func replaceBytes(content []byte, idx int, choice string, param int) int {
|
|
for i := 0; i < param; i++ {
|
|
copy(content[idx:idx+2], []byte(choice))
|
|
idx += 3
|
|
}
|
|
return idx
|
|
}
|
|
|
|
func (l *LanguageService) SetLanguage(path string, text, voice string) (bool, error) {
|
|
files, err := os.ReadDir(path)
|
|
if err != nil {
|
|
return false, err
|
|
}
|
|
|
|
for _, file := range files {
|
|
filePath := filepath.Join(path, file.Name())
|
|
|
|
content, err := os.ReadFile(filePath)
|
|
if err != nil {
|
|
continue
|
|
}
|
|
|
|
patternToFind := []byte("SpriteOutput/UI/Fonts/RPG_CN.ttf")
|
|
idx := bytes.Index(content, patternToFind)
|
|
if idx == -1 {
|
|
continue
|
|
}
|
|
|
|
pattern := []byte("Korean")
|
|
idx = bytes.Index(content, pattern)
|
|
if idx == -1 {
|
|
continue
|
|
}
|
|
|
|
idx += 10
|
|
idx += 4
|
|
idx = replaceBytes(content, idx, text, 4)
|
|
idx += 1
|
|
|
|
idx += 5
|
|
idx = replaceBytes(content, idx, voice, 2)
|
|
idx += 1
|
|
|
|
idx += 5
|
|
idx = replaceBytes(content, idx, voice, 5)
|
|
|
|
idx += 1
|
|
|
|
idx += 4
|
|
_ = replaceBytes(content, idx, text, 2)
|
|
|
|
err = os.WriteFile(filePath, content, 0644)
|
|
if err != nil {
|
|
return false, err
|
|
}
|
|
|
|
return true, nil
|
|
}
|
|
|
|
return false, fmt.Errorf("couldn't find file to patch. Make sure this file is placed in the correct folder")
|
|
}
|