mirror of
https://github.com/tcgdex/cards-database.git
synced 2025-06-12 15:59:18 +00:00
feat: Add the TCG Pocket cards in other languages (#734)
This commit is contained in:
@ -4,7 +4,7 @@ import { Card, Set, SupportedLanguages, Types } from '../../../interfaces'
|
||||
import { CardResume, Card as CardSingle } from '../../../meta/definitions/api'
|
||||
import { getSet, setToSetSimple } from './setUtil'
|
||||
import translate from './translationUtil'
|
||||
import { DB_PATH, cardIsLegal, fetchRemoteFile, getDataFolder, getLastEdit, smartGlob } from './util'
|
||||
import { DB_PATH, cardIsLegal, fetchRemoteFile, getDataFolder, getLastEdit, resolveText, smartGlob } from './util'
|
||||
|
||||
export async function getCardPictures(cardId: string, card: Card, lang: SupportedLanguages): Promise<string | undefined> {
|
||||
try {
|
||||
@ -20,7 +20,7 @@ export async function getCardPictures(cardId: string, card: Card, lang: Supporte
|
||||
}
|
||||
|
||||
export async function cardToCardSimple(id: string, card: Card, lang: SupportedLanguages): Promise<CardResume> {
|
||||
const cardName = card.name[lang]
|
||||
const cardName = resolveText(card.name, lang)
|
||||
if (!cardName) {
|
||||
throw new Error(`Card (${card.set.id}-${id}) has no name in (${lang})`)
|
||||
}
|
||||
@ -47,7 +47,7 @@ export async function cardToCardSingle(localId: string, card: Card, lang: Suppor
|
||||
illustrator: card.illustrator,
|
||||
image,
|
||||
localId,
|
||||
name: card.name[lang] as string,
|
||||
name: resolveText(card.name, lang) as string,
|
||||
|
||||
rarity: translate('rarity', card.rarity, lang) as any,
|
||||
set: await setToSetSimple(card.set, lang),
|
||||
@ -63,27 +63,27 @@ export async function cardToCardSingle(localId: string, card: Card, lang: Suppor
|
||||
dexId: card.dexId,
|
||||
hp: card.hp,
|
||||
types: card.types?.map((t) => translate('types', t, lang)) as Array<Types>,
|
||||
evolveFrom: card.evolveFrom && card.evolveFrom[lang],
|
||||
evolveFrom: card.evolveFrom && resolveText(card.evolveFrom, lang),
|
||||
weight: card.weight,
|
||||
description: card.description ? card.description[lang] as string : undefined,
|
||||
description: card.description ? resolveText(card.description, lang) as string : undefined,
|
||||
level: card.level,
|
||||
stage: translate('stage', card.stage, lang) as any,
|
||||
suffix: translate('suffix', card.suffix, lang) as any,
|
||||
item: card.item ? {
|
||||
name: card.item.name[lang] as string,
|
||||
effect: card.item.effect[lang] as string
|
||||
name: resolveText(card.item.name, lang),
|
||||
effect: resolveText(card.item.effect, lang)
|
||||
} : undefined,
|
||||
|
||||
abilities: card.abilities?.map((el) => ({
|
||||
type: translate('abilityType', el.type, lang) as any,
|
||||
name: el.name[lang] as string,
|
||||
effect: el.effect[lang] as string
|
||||
name: resolveText(el.name, lang),
|
||||
effect: resolveText(el.effect, lang)
|
||||
})),
|
||||
|
||||
attacks: card.attacks?.map((el) => ({
|
||||
cost: el.cost?.map((t) => translate('types', t, lang)) as Array<Types>,
|
||||
name: el.name[lang] as string,
|
||||
effect: el.effect ? el.effect[lang] : undefined,
|
||||
name: resolveText(el.name, lang) as string,
|
||||
effect: el.effect ? resolveText(el.effect, lang) : undefined,
|
||||
damage: el.damage
|
||||
})),
|
||||
weaknesses: card.weaknesses?.map((el) => ({
|
||||
@ -98,7 +98,7 @@ export async function cardToCardSingle(localId: string, card: Card, lang: Suppor
|
||||
|
||||
retreat: card.retreat,
|
||||
|
||||
effect: card.effect ? card.effect[lang] : undefined,
|
||||
effect: card.effect ? resolveText(card.effect, lang) : undefined,
|
||||
|
||||
trainerType: translate('trainerType', card.trainerType, lang) as any,
|
||||
energyType: translate('energyType', card.energyType, lang) as any,
|
||||
|
@ -1,14 +1,14 @@
|
||||
import { Serie, Set, SupportedLanguages } from '../../../interfaces'
|
||||
import { SerieResume, Serie as SerieSingle } from '../../../meta/definitions/api'
|
||||
import { getSets, setToSetSimple } from './setUtil'
|
||||
import { DB_PATH, getDataFolder, smartGlob } from './util'
|
||||
import { DB_PATH, getDataFolder, resolveText, smartGlob } from './util'
|
||||
|
||||
export async function getSerie(name: string, lang: SupportedLanguages): Promise<Serie> {
|
||||
return (await import(`../../${DB_PATH}/${getDataFolder(lang)}/${name}.ts`)).default
|
||||
}
|
||||
|
||||
export async function isSerieAvailable(serie: Serie, lang: SupportedLanguages): Promise<boolean> {
|
||||
if (!serie.name[lang]) {
|
||||
if (!resolveText(serie.name, lang)) {
|
||||
return false
|
||||
}
|
||||
const sets = await getSets(serie.name.en, lang)
|
||||
@ -22,7 +22,7 @@ export async function getSeries(lang: SupportedLanguages): Promise<Array<Serie>>
|
||||
// Fetch the Serie
|
||||
.map((it) => getSerie(it, lang))))
|
||||
// Filter the serie if no name's exists in the selected lang
|
||||
.filter((serie) => Boolean(serie.name[lang]))
|
||||
.filter((serie) => Boolean(resolveText(serie.name, lang)))
|
||||
|
||||
// Filter available series
|
||||
const isAvailable = await Promise.all(series.map((serie) => isSerieAvailable(serie, lang)))
|
||||
@ -69,7 +69,7 @@ export async function serieToSerieSingle(serie: Serie, lang: SupportedLanguages)
|
||||
return {
|
||||
id: serie.id,
|
||||
logo,
|
||||
name: serie.name[lang] as string,
|
||||
name: resolveText(serie.name, lang) as string,
|
||||
firstSet: sets[0],
|
||||
lastSet: sets[sets.length - 1],
|
||||
releaseDate: typeof releaseDate === 'object' ? releaseDate[lang] : releaseDate,
|
||||
|
@ -2,7 +2,7 @@ import { objectKeys } from '@dzeio/object-util'
|
||||
import { Set, SupportedLanguages } from '../../../interfaces'
|
||||
import { SetResume, Set as SetSingle } from '../../../meta/definitions/api'
|
||||
import { cardToCardSimple, getCards } from './cardUtil'
|
||||
import { DB_PATH, fetchRemoteFile, getDataFolder, setIsLegal, smartGlob } from './util'
|
||||
import { DB_PATH, fetchRemoteFile, getDataFolder, resolveText, setIsLegal, smartGlob } from './util'
|
||||
|
||||
interface t {
|
||||
[key: string]: Set
|
||||
@ -11,7 +11,7 @@ interface t {
|
||||
const setCache: t = {}
|
||||
|
||||
export function isSetAvailable(set: Set, lang: SupportedLanguages): boolean {
|
||||
return lang in set.name && lang in set.serie.name
|
||||
return !!resolveText(set.name, lang) && !!resolveText(set.serie.name, lang)
|
||||
}
|
||||
|
||||
/**
|
||||
@ -71,7 +71,7 @@ export async function setToSetSimple(set: Set, lang: SupportedLanguages): Promis
|
||||
},
|
||||
id: set.id,
|
||||
logo: pics[0],
|
||||
name: set.name[lang] as string,
|
||||
name: resolveText(set.name, lang),
|
||||
symbol: pics[1]
|
||||
}
|
||||
}
|
||||
@ -95,17 +95,17 @@ export async function setToSetSingle(set: Set, lang: SupportedLanguages): Promis
|
||||
standard: setIsLegal('standard', set)
|
||||
},
|
||||
logo: pics[0],
|
||||
name: set.name[lang] as string,
|
||||
name: resolveText(set.name, lang),
|
||||
releaseDate: typeof set.releaseDate === 'object' ? set.releaseDate[lang] ?? set.releaseDate[objectKeys(set.releaseDate)[0]]! : set.releaseDate,
|
||||
serie: {
|
||||
id: set.serie.id,
|
||||
name: set.serie.name[lang] as string
|
||||
name: resolveText(set.serie.name, lang)
|
||||
},
|
||||
symbol: pics[1],
|
||||
tcgOnline: set.tcgOnline,
|
||||
abbreviation: (set.abbreviations?.official || set.abbreviations?.[lang]) ? {
|
||||
abbreviation: (set.abbreviations?.official || resolveText(set.abbreviations, lang)) ? {
|
||||
official: set.abbreviations?.official,
|
||||
localized: set.abbreviations?.[lang]
|
||||
localized: resolveText(set.abbreviations, lang)
|
||||
} : undefined
|
||||
}
|
||||
}
|
||||
|
@ -3,7 +3,7 @@ import Queue from '@dzeio/queue'
|
||||
import { glob } from 'glob'
|
||||
import { exec, spawn } from 'node:child_process'
|
||||
import { writeFileSync } from 'node:fs'
|
||||
import { Card, Set, SupportedLanguages } from '../../../interfaces'
|
||||
import { Card, Languages, Set, SupportedLanguages } from '../../../interfaces'
|
||||
import * as legals from '../../../meta/legals'
|
||||
|
||||
interface fileCacheInterface {
|
||||
@ -177,3 +177,13 @@ export function getLastEdit(path: string): string {
|
||||
}
|
||||
return date
|
||||
}
|
||||
|
||||
export function resolveText<T>(text: Languages<T> | undefined, lang: SupportedLanguages): T | undefined {
|
||||
if (!text) return text as undefined
|
||||
let res: T | undefined = text[lang]
|
||||
if (typeof res === 'undefined' && !lang.includes('-')) {
|
||||
const key = Object.keys(text).find(key => key.startsWith(lang))
|
||||
return text[key as keyof Languages<T>]
|
||||
}
|
||||
return res
|
||||
}
|
||||
|
Reference in New Issue
Block a user