Skip to content

Commit

Permalink
feat: add to support en & zh language.
Browse files Browse the repository at this point in the history
  • Loading branch information
huacnlee committed Jan 24, 2024
1 parent 258c8cf commit 30aec8a
Show file tree
Hide file tree
Showing 24 changed files with 349 additions and 117 deletions.
5 changes: 5 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
.PHONY: wasm
wasm:
GOOS=js GOARCH=wasm go build -ldflags="-s -w" -v -o frontend/static/calculator.wasm ./wasm
dev: wasm
cd frontend; bun run dev
58 changes: 42 additions & 16 deletions data/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,12 @@ package data
import (
"bytes"
"compress/gzip"
_ "embed"
"embed"
"encoding/json"
"fmt"
"io"
"regexp"
"strings"
)

//go:embed alternate_passive_additions.json.gz
Expand Down Expand Up @@ -45,17 +48,8 @@ var skillTreeGz []byte
var SkillTreeJSON []byte
var SkillTreeData SkillTree

//go:embed stat_descriptions.json.gz
var statTranslationsGz []byte
var StatTranslationsJSON []byte

//go:embed passive_skill_stat_descriptions.json.gz
var passiveSkillStatTranslationsGz []byte
var PassiveSkillStatTranslationsJSON []byte

//go:embed passive_skill_aura_stat_descriptions.json.gz
var passiveSkillAuraStatTranslationsGz []byte
var PassiveSkillAuraStatTranslationsJSON []byte
//go:embed trs/*
var trs embed.FS

//go:embed possible_stats.json.gz
var possibleStatsGz []byte
Expand Down Expand Up @@ -116,13 +110,45 @@ func init() {
panic(err)
}

StatTranslationsJSON = unzipTo(statTranslationsGz)
PassiveSkillStatTranslationsJSON = unzipTo(passiveSkillStatTranslationsGz)
PassiveSkillAuraStatTranslationsJSON = unzipTo(passiveSkillAuraStatTranslationsGz)

PossibleStatsJSON = unzipTo(possibleStatsGz)
}

func getLocale(locale string) string {
matches := regexp.MustCompile(`(?mi)en|zh`).FindStringSubmatch(locale)
if len(matches) > 0 {
return strings.ToLower(matches[0])
}

return "en"
}

func StatTranslationsJSON(locale string) string {
var gz, err = trs.ReadFile(fmt.Sprintf("trs/%s/stat_descriptions.json.gz", getLocale(locale)))
if err != nil {
panic(err)
}

return string(unzipTo(gz))
}

func PassiveSkillStatTranslationsJSON(locale string) string {
var gz, err = trs.ReadFile(fmt.Sprintf("trs/%s/passive_skill_stat_descriptions.json.gz", getLocale(locale)))
if err != nil {
panic(err)
}

return string(unzipTo(gz))
}

func PassiveSkillAuraStatTranslationsJSON(locale string) string {
var gz, err = trs.ReadFile(fmt.Sprintf("trs/%s/passive_skill_aura_stat_descriptions.json.gz", getLocale(locale)))
if err != nil {
panic(err)
}

return string(unzipTo(gz))
}

func unzipJSONTo[T any](data []byte) T {
var out = new(T)
if err := json.Unmarshal(unzipTo(data), &out); err != nil {
Expand Down
14 changes: 14 additions & 0 deletions data/main_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package data

import (
"testing"

"github.com/stretchr/testify/assert"
)

func Test_getLocale(t *testing.T) {
assert.Equal(t, getLocale("zh-CN"), "zh")
assert.Equal(t, getLocale("zh-TW"), "zh")
assert.Equal(t, getLocale("en-US"), "en")
assert.Equal(t, getLocale("other"), "en")
}
File renamed without changes.
Binary file not shown.
Binary file not shown.
Binary file added data/trs/zh/stat_descriptions.json.gz
Binary file not shown.
Binary file added frontend/bun.lockb
Binary file not shown.
5 changes: 4 additions & 1 deletion frontend/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -37,5 +37,8 @@
"typescript": "^5.2.2",
"vite": "^4.4.9"
},
"type": "module"
"type": "module",
"dependencies": {
"svelte-i18n": "^4.0.0"
}
}
11 changes: 11 additions & 0 deletions frontend/src/i18n.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import { addMessages, getLocaleFromNavigator, init } from 'svelte-i18n';

import locales from './locales.json';

addMessages('en', locales.en);
addMessages('zh', locales.zh);

init({
fallbackLocale: 'en',
initialLocale: getLocaleFromNavigator()
});
6 changes: 3 additions & 3 deletions frontend/src/lib/skill_tree.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type { Translation, Node, SkillTreeData, Group, Sprite, TranslationFile } from './skill_tree_types';
import type { Group, Node, SkillTreeData, Sprite, Translation, TranslationFile } from './skill_tree_types';
import { data } from './types';

export let skillTree: SkillTreeData;
Expand All @@ -13,7 +13,7 @@ export const inverseTranslations: Record<string, Translation> = {};

export const passiveToTree: Record<number, number> = {};

export const loadSkillTree = () => {
export const loadSkillTree = (locale: string) => {
skillTree = JSON.parse(data.SkillTree);
console.log('Loaded skill tree', skillTree);

Expand Down Expand Up @@ -94,7 +94,7 @@ export const loadSkillTree = () => {
];

translationFiles.forEach((f) => {
const translations: TranslationFile = JSON.parse(f);
const translations: TranslationFile = JSON.parse(f(locale));

translations.descriptors.forEach((t) => {
t.ids.forEach((id) => {
Expand Down
4 changes: 2 additions & 2 deletions frontend/src/lib/sync_worker.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { expose } from 'comlink';
import '../wasm_exec.js';
import type { ReverseSearchConfig, SearchResults, SearchWithSeed } from './skill_tree';
import { loadSkillTree, passiveToTree } from './skill_tree';
import type { SearchWithSeed, ReverseSearchConfig, SearchResults } from './skill_tree';
import { calculator, initializeCrystalline } from './types';

const obj = {
Expand All @@ -14,7 +14,7 @@ const obj = {

initializeCrystalline();

loadSkillTree();
loadSkillTree(navigator.language || 'en');
});
},
async search(args: ReverseSearchConfig, callback: (seed: number) => Promise<void>): Promise<SearchResults> {
Expand Down
39 changes: 26 additions & 13 deletions frontend/src/lib/types/index.d.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,18 @@
/* eslint-disable */
export declare namespace calculator {
function Calculate(passiveID: number, seed: number, timelessJewelType: number, conqueror: string): data.AlternatePassiveSkillInformation;
function ReverseSearch(passiveIDs?: Array<number>, statIDs?: Array<number>, timelessJewelType: number, conqueror: string, updates: (arg1: number) => Promise<void>): Promise<(Record<number, Record<number, Record<number, number> | undefined> | undefined> | undefined)>;
function Calculate(
passiveID: number,
seed: number,
timelessJewelType: number,
conqueror: string
): data.AlternatePassiveSkillInformation;
function ReverseSearch(
passiveIDs?: Array<number>,
statIDs?: Array<number>,
timelessJewelType: number,
conqueror: string,
updates: (arg1: number) => Promise<void>
): Promise<Record<number, Record<number, Record<number, number> | undefined> | undefined> | undefined>;
}
export declare namespace data {
interface AlternatePassiveAddition {
Expand All @@ -15,7 +26,7 @@ export declare namespace data {
Stat2Min: number;
Stat2Max: number;
PassiveType?: Array<number>;
GetStatMinMax(min: boolean, index: number): number;
GetStatMinMax(arg1: boolean, arg2: number): number;
}
interface AlternatePassiveAdditionInformation {
AlternatePassiveAddition?: data.AlternatePassiveAddition;
Expand All @@ -41,7 +52,7 @@ export declare namespace data {
RandomMin: number;
RandomMax: number;
ConquerorVersion: number;
GetStatMinMax(min: boolean, index: number): number;
GetStatMinMax(arg1: boolean, arg2: number): number;
}
interface AlternatePassiveSkillInformation {
AlternatePassiveSkill?: data.AlternatePassiveSkill;
Expand Down Expand Up @@ -73,19 +84,21 @@ export declare namespace data {
Index: number;
Version: number;
}
function GetAlternatePassiveAdditionByIndex(index: number): (data.AlternatePassiveAddition | undefined);
function GetAlternatePassiveSkillByIndex(index: number): (data.AlternatePassiveSkill | undefined);
function GetPassiveSkillByIndex(index: number): (data.PassiveSkill | undefined);
function GetStatByIndex(index: number): (data.Stat | undefined);
const PassiveSkillAuraStatTranslationsJSON: string;
const PassiveSkillStatTranslationsJSON: string;
function GetAlternatePassiveAdditionByIndex(index: number): data.AlternatePassiveAddition | undefined;
function GetAlternatePassiveSkillByIndex(index: number): data.AlternatePassiveSkill | undefined;
function GetPassiveSkillByIndex(index: number): data.PassiveSkill | undefined;
function GetStatByIndex(index: number): data.Stat | undefined;
function StatTranslationsJSON(locale: string): string;
function PassiveSkillAuraStatTranslationsJSON(locale: string): string;
function PassiveSkillStatTranslationsJSON(locale: string): string;
const PassiveSkills: Array<data.PassiveSkill | undefined> | undefined;
const PossibleStats: string;
const SkillTree: string;
const StatTranslationsJSON: string;
const TimelessJewelConquerors: Record<number, Record<string, data.TimelessJewelConqueror | undefined> | undefined> | undefined;
const TimelessJewelConquerors:
| Record<number, Record<string, data.TimelessJewelConqueror | undefined> | undefined>
| undefined;
const TimelessJewelSeedRanges: Record<number, data.Range> | undefined;
const TimelessJewels: Record<number, string> | undefined;
const TreeToPassive: Record<number, data.PassiveSkill | undefined> | undefined;
}
export const initializeCrystalline: () => void;
export const initializeCrystalline: () => void;
40 changes: 21 additions & 19 deletions frontend/src/lib/types/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,23 +4,25 @@ export let data;

export const initializeCrystalline = () => {
calculator = {
Calculate: globalThis["go"]["timeless-jewels"]["calculator"]["Calculate"],
ReverseSearch: globalThis["go"]["timeless-jewels"]["calculator"]["ReverseSearch"],
}
Calculate: globalThis['go']['timeless-jewels']['calculator']['Calculate'],
ReverseSearch: globalThis['go']['timeless-jewels']['calculator']['ReverseSearch']
};
data = {
GetAlternatePassiveAdditionByIndex: globalThis["go"]["timeless-jewels"]["data"]["GetAlternatePassiveAdditionByIndex"],
GetAlternatePassiveSkillByIndex: globalThis["go"]["timeless-jewels"]["data"]["GetAlternatePassiveSkillByIndex"],
GetPassiveSkillByIndex: globalThis["go"]["timeless-jewels"]["data"]["GetPassiveSkillByIndex"],
GetStatByIndex: globalThis["go"]["timeless-jewels"]["data"]["GetStatByIndex"],
PassiveSkillAuraStatTranslationsJSON: globalThis["go"]["timeless-jewels"]["data"]["PassiveSkillAuraStatTranslationsJSON"],
PassiveSkillStatTranslationsJSON: globalThis["go"]["timeless-jewels"]["data"]["PassiveSkillStatTranslationsJSON"],
PassiveSkills: globalThis["go"]["timeless-jewels"]["data"]["PassiveSkills"],
PossibleStats: globalThis["go"]["timeless-jewels"]["data"]["PossibleStats"],
SkillTree: globalThis["go"]["timeless-jewels"]["data"]["SkillTree"],
StatTranslationsJSON: globalThis["go"]["timeless-jewels"]["data"]["StatTranslationsJSON"],
TimelessJewelConquerors: globalThis["go"]["timeless-jewels"]["data"]["TimelessJewelConquerors"],
TimelessJewelSeedRanges: globalThis["go"]["timeless-jewels"]["data"]["TimelessJewelSeedRanges"],
TimelessJewels: globalThis["go"]["timeless-jewels"]["data"]["TimelessJewels"],
TreeToPassive: globalThis["go"]["timeless-jewels"]["data"]["TreeToPassive"],
}
}
GetAlternatePassiveAdditionByIndex:
globalThis['go']['timeless-jewels']['data']['GetAlternatePassiveAdditionByIndex'],
GetAlternatePassiveSkillByIndex: globalThis['go']['timeless-jewels']['data']['GetAlternatePassiveSkillByIndex'],
GetPassiveSkillByIndex: globalThis['go']['timeless-jewels']['data']['GetPassiveSkillByIndex'],
GetStatByIndex: globalThis['go']['timeless-jewels']['data']['GetStatByIndex'],
PassiveSkillAuraStatTranslationsJSON:
globalThis['go']['timeless-jewels']['data']['PassiveSkillAuraStatTranslationsJSON'],
PassiveSkillStatTranslationsJSON: globalThis['go']['timeless-jewels']['data']['PassiveSkillStatTranslationsJSON'],
PassiveSkills: globalThis['go']['timeless-jewels']['data']['PassiveSkills'],
PossibleStats: globalThis['go']['timeless-jewels']['data']['PossibleStats'],
SkillTree: globalThis['go']['timeless-jewels']['data']['SkillTree'],
StatTranslationsJSON: globalThis['go']['timeless-jewels']['data']['StatTranslationsJSON'],
TimelessJewelConquerors: globalThis['go']['timeless-jewels']['data']['TimelessJewelConquerors'],
TimelessJewelSeedRanges: globalThis['go']['timeless-jewels']['data']['TimelessJewelSeedRanges'],
TimelessJewels: globalThis['go']['timeless-jewels']['data']['TimelessJewels'],
TreeToPassive: globalThis['go']['timeless-jewels']['data']['TreeToPassive']
};
};
Loading

0 comments on commit 30aec8a

Please sign in to comment.