diff --git a/src/lib/honkai3rd/battlesuits.ts b/src/lib/honkai3rd/battlesuits.ts
index b6087f38..f52fc5d8 100644
--- a/src/lib/honkai3rd/battlesuits.ts
+++ b/src/lib/honkai3rd/battlesuits.ts
@@ -2,7 +2,7 @@ export interface BattlesuitSkill {
name: string
krName?: string
description: string
- krDescription: string
+ krDescription?: string
requiredRank?: string
}
diff --git a/src/pages/honkai3rd/battlesuits/[battlesuitId].tsx b/src/pages/honkai3rd/battlesuits/[battlesuitId].tsx
index f867310a..46d9f6f1 100644
--- a/src/pages/honkai3rd/battlesuits/[battlesuitId].tsx
+++ b/src/pages/honkai3rd/battlesuits/[battlesuitId].tsx
@@ -124,37 +124,44 @@ const BattlesuitShowPage = ({ battlesuit }: BattlesuitShowPageProps) => {
{battlesuit.sp != null && (
)}
@@ -191,11 +198,13 @@ export async function getStaticPaths() {
interface BattlesuitSkillGroupCardProps {
heading: string
skillGroup: BattlesuitSkillGroup
+ locale?: string
}
const BattlesuitSkillGroupCard = ({
heading,
skillGroup,
+ locale,
}: BattlesuitSkillGroupCardProps) => {
return (
@@ -206,21 +215,39 @@ const BattlesuitSkillGroupCard = ({
}}
>
- {skillGroup.core.name}
+ {translate(
+ locale,
+ { 'ko-KR': skillGroup.core.krName },
+ skillGroup.core.name
+ )}
{heading}
- {skillGroup.core.description}
+ {translate(
+ locale,
+ { 'ko-KR': skillGroup.core.krDescription },
+ skillGroup.core.description
+ )}
{skillGroup.subskills.map((subskill) => {
+ const skillName = translate(
+ locale,
+ { 'ko-KR': subskill.krName },
+ subskill.name
+ )
+ const skillDescription = translate(
+ locale,
+ { 'ko-KR': subskill.krDescription },
+ subskill.description
+ )
return (
- {subskill.name}
+ {skillName}
{subskill.requiredRank != null ? (
/^[0-9]/.test(subskill.requiredRank) ? (
- {subskill.description}
+ {skillDescription}
)
diff --git a/src/server/data/honkai3rd/battlesuits.ts b/src/server/data/honkai3rd/battlesuits.ts
index 36e570bb..2a4395fc 100644
--- a/src/server/data/honkai3rd/battlesuits.ts
+++ b/src/server/data/honkai3rd/battlesuits.ts
@@ -1,6 +1,9 @@
-import { readdirSync, readJsonFileSync } from '../fs'
+import { readdirSync, readFileSync, readJsonFileSync } from '../fs'
import { compareVersion } from '../../../lib/string'
-import { BattlesuitData } from '../../../lib/honkai3rd/battlesuits'
+import {
+ BattlesuitData,
+ BattlesuitSkillGroup,
+} from '../../../lib/honkai3rd/battlesuits'
const battlesuitsFileNameList = readdirSync('honkai3rd/battlesuits')
const battlesuitDataList = battlesuitsFileNameList
@@ -8,6 +11,21 @@ const battlesuitDataList = battlesuitsFileNameList
const filePathname = 'honkai3rd/battlesuits/' + fileName
const data = readJsonFileSync(filePathname) as BattlesuitData
+ const krDataFilePath = `honkai3rd/battlesuits-kr/${data.id}.md`
+ try {
+ const krData = parseSkillData(readFileSync(krDataFilePath).toString())
+
+ data.krName = krData.name
+ assignKrDataToSkill(data.leader, krData.leader)
+ assignKrDataToSkill(data.passive, krData.passive)
+ assignKrDataToSkill(data.evasion, krData.evasion)
+ assignKrDataToSkill(data.special, krData.special)
+ assignKrDataToSkill(data.ultimate, krData.ultimate)
+ assignKrDataToSkill(data.basic, krData.basic)
+ } catch (error) {
+ // console.warn('Failed to read', krDataFilePath)
+ // console.warn(error)
+ }
return data
})
.sort((a, b) => {
@@ -33,3 +51,62 @@ export function listBattlesuits() {
export function getBattlesuitById(id: string) {
return battlesuitMap.get(id)
}
+
+function parseSkillData(rawData: string) {
+ const [
+ nameSection,
+ leaderSection,
+ passiveSection,
+ evasionSection,
+ specialSection,
+ ultimateSection,
+ basicSection,
+ ] = rawData.split('\n## ')
+
+ const name = nameSection.replace('#', '').trim()
+
+ return {
+ name,
+ leader: parseSkillSection(leaderSection),
+ passive: parseSkillSection(passiveSection),
+ evasion: parseSkillSection(evasionSection),
+ special: parseSkillSection(specialSection),
+ ultimate: parseSkillSection(ultimateSection),
+ basic: parseSkillSection(basicSection),
+ }
+}
+
+function parseSkillSection(rawData: string) {
+ const [coreSection, ...subskillSections] = rawData.split('\n### ')
+
+ const [coreName, ...descriptionLines] = coreSection.trim().split('\n')
+
+ return {
+ core: {
+ name: coreName,
+ description: descriptionLines.join('\n').trim(),
+ },
+ subskills: subskillSections.map((subskillSection) => {
+ const [subskillName, ...subskillDescriptionLines] = subskillSection
+ .trim()
+ .split('\n')
+
+ return {
+ name: subskillName,
+ description: subskillDescriptionLines.join('\n').trim(),
+ }
+ }),
+ }
+}
+
+function assignKrDataToSkill(
+ skillGroup: BattlesuitSkillGroup,
+ krDataSkillGroup: BattlesuitSkillGroup
+) {
+ skillGroup.core.krName = krDataSkillGroup.core.name
+ skillGroup.core.krDescription = krDataSkillGroup.core.description
+ skillGroup.subskills.forEach((subskill, index) => {
+ subskill.krName = krDataSkillGroup.subskills[index].name
+ subskill.krDescription = krDataSkillGroup.subskills[index].description
+ })
+}