feat(subscribe): Add unit time

This commit is contained in:
web@ppanel 2024-12-20 18:52:30 +07:00
parent d8b0bd9c2d
commit 39d07ecee5
80 changed files with 553 additions and 165 deletions

View File

@ -15,7 +15,6 @@ import {
SheetTrigger, SheetTrigger,
} from '@shadcn/ui/sheet'; } from '@shadcn/ui/sheet';
import { useTranslations } from 'next-intl'; import { useTranslations } from 'next-intl';
import { useTheme } from 'next-themes';
import { useEffect, useState } from 'react'; import { useEffect, useState } from 'react';
const formSchema = z.object({ const formSchema = z.object({
@ -39,7 +38,6 @@ export default function AnnouncementForm<T extends Record<string, any>>({
title, title,
}: AnnouncementFormProps<T>) { }: AnnouncementFormProps<T>) {
const t = useTranslations('announcement'); const t = useTranslations('announcement');
const { resolvedTheme } = useTheme();
const [open, setOpen] = useState(false); const [open, setOpen] = useState(false);
const form = useForm({ const form = useForm({
resolver: zodResolver(formSchema), resolver: zodResolver(formSchema),

View File

@ -16,7 +16,6 @@ import {
SheetTrigger, SheetTrigger,
} from '@shadcn/ui/sheet'; } from '@shadcn/ui/sheet';
import { useTranslations } from 'next-intl'; import { useTranslations } from 'next-intl';
import { useTheme } from 'next-themes';
import { useEffect, useState } from 'react'; import { useEffect, useState } from 'react';
const formSchema = z.object({ const formSchema = z.object({
@ -41,7 +40,6 @@ export default function DocumentForm<T extends Record<string, any>>({
title, title,
}: DocumentFormProps<T>) { }: DocumentFormProps<T>) {
const t = useTranslations('document'); const t = useTranslations('document');
const { resolvedTheme } = useTheme();
const [open, setOpen] = useState(false); const [open, setOpen] = useState(false);
const form = useForm({ const form = useForm({
resolver: zodResolver(formSchema), resolver: zodResolver(formSchema),

View File

@ -32,7 +32,6 @@ import {
} from '@shadcn/ui/sheet'; } from '@shadcn/ui/sheet';
import { useQuery } from '@tanstack/react-query'; import { useQuery } from '@tanstack/react-query';
import { useTranslations } from 'next-intl'; import { useTranslations } from 'next-intl';
import { useTheme } from 'next-themes';
import { assign, shake } from 'radash'; import { assign, shake } from 'radash';
import { useEffect, useState } from 'react'; import { useEffect, useState } from 'react';
@ -53,6 +52,7 @@ const defaultValues = {
discount: [], discount: [],
server_group: [], server_group: [],
server: [], server: [],
unit_time: 'Month',
}; };
export default function SubscribeForm<T extends Record<string, any>>({ export default function SubscribeForm<T extends Record<string, any>>({
@ -63,7 +63,6 @@ export default function SubscribeForm<T extends Record<string, any>>({
title, title,
}: SubscribeFormProps<T>) { }: SubscribeFormProps<T>) {
const t = useTranslations('subscribe'); const t = useTranslations('subscribe');
const { resolvedTheme } = useTheme();
const [open, setOpen] = useState(false); const [open, setOpen] = useState(false);
@ -71,11 +70,12 @@ export default function SubscribeForm<T extends Record<string, any>>({
name: z.string(), name: z.string(),
description: z.string().optional(), description: z.string().optional(),
unit_price: z.number(), unit_price: z.number(),
unit_time: z.string().default('Month'),
replacement: z.number().optional(), replacement: z.number().optional(),
discount: z discount: z
.array( .array(
z.object({ z.object({
months: z.number(), quantity: z.number(),
discount: z.number(), discount: z.number(),
}), }),
) )
@ -135,6 +135,7 @@ export default function SubscribeForm<T extends Record<string, any>>({
}, },
}); });
const unit_time = form.watch('unit_time');
return ( return (
<Sheet open={open} onOpenChange={setOpen}> <Sheet open={open} onOpenChange={setOpen}>
<SheetTrigger asChild> <SheetTrigger asChild>
@ -255,7 +256,7 @@ export default function SubscribeForm<T extends Record<string, any>>({
name='unit_price' name='unit_price'
render={({ field }) => ( render={({ field }) => (
<FormItem> <FormItem>
<FormLabel>{t('form.unit_price')}</FormLabel> <FormLabel>{t('form.unitPrice')}</FormLabel>
<FormControl> <FormControl>
<EnhancedInput <EnhancedInput
type='number' type='number'
@ -272,6 +273,34 @@ export default function SubscribeForm<T extends Record<string, any>>({
</FormItem> </FormItem>
)} )}
/> />
<FormField
control={form.control}
name='unit_time'
render={({ field }) => (
<FormItem>
<FormLabel>{t('form.unitTime')}</FormLabel>
<FormControl>
<Combobox
placeholder={t('form.selectUnitTime')}
{...field}
onChange={(value) => {
if (value) {
form.setValue(field.name, value);
}
}}
options={[
{ label: t('form.Year'), value: 'Year' },
{ label: t('form.Month'), value: 'Month' },
{ label: t('form.Day'), value: 'Day' },
{ label: t('form.Hour'), value: 'Hour' },
{ label: t('form.Minute'), value: 'Minute' },
]}
/>
</FormControl>
<FormMessage />
</FormItem>
)}
/>
<FormField <FormField
control={form.control} control={form.control}
name='replacement' name='replacement'
@ -436,10 +465,10 @@ export default function SubscribeForm<T extends Record<string, any>>({
<ArrayInput<API.SubscribeDiscount> <ArrayInput<API.SubscribeDiscount>
fields={[ fields={[
{ {
name: 'months', name: 'quantity',
type: 'number', type: 'number',
min: 1, min: 1,
suffix: t('form.discountMonths'), suffix: unit_time && t(`form.${unit_time}`),
}, },
{ {
name: 'discount', name: 'discount',
@ -453,7 +482,7 @@ export default function SubscribeForm<T extends Record<string, any>>({
return { return {
...data, ...data,
price: evaluateWithPrecision( price: evaluateWithPrecision(
`${unit_price} * ${data.months} * ${data.discount} / 100`, `${unit_price} * ${data.quantity} * ${data.discount} / 100`,
), ),
}; };
}, },
@ -471,7 +500,7 @@ export default function SubscribeForm<T extends Record<string, any>>({
return { return {
...data, ...data,
discount: evaluateWithPrecision( discount: evaluateWithPrecision(
`${data.price} / ${data.months} / ${unit_price} * 100`, `${data.price} / ${data.quantity} / ${unit_price} * 100`,
), ),
}; };
}, },

View File

@ -13,6 +13,11 @@
"edit": "Upravit", "edit": "Upravit",
"editSubscribe": "Upravit odběr", "editSubscribe": "Upravit odběr",
"form": { "form": {
"Day": "Den",
"Hour": "Hodina",
"Minute": "Minuta",
"Month": "Měsíc",
"Year": "Rok",
"cancel": "Zrušit", "cancel": "Zrušit",
"confirm": "Potvrdit", "confirm": "Potvrdit",
"description": "Popis", "description": "Popis",
@ -29,12 +34,14 @@
"quota": "Limit nákupu", "quota": "Limit nákupu",
"replacement": "Cena za reset (za každý)", "replacement": "Cena za reset (za každý)",
"selectSubscribeGroup": "Vyberte prosím skupinu předplatného", "selectSubscribeGroup": "Vyberte prosím skupinu předplatného",
"selectUnitTime": "Vyberte jednotku času",
"server": "Server", "server": "Server",
"serverGroup": "Skupina serverů", "serverGroup": "Skupina serverů",
"speedLimit": "Omezení rychlosti (Mbps)", "speedLimit": "Omezení rychlosti (Mbps)",
"subscribeGroup": "Skupina předplatného", "subscribeGroup": "Skupina předplatného",
"traffic": "Přenos dat", "traffic": "Přenos dat",
"unit_price": "Cena za měsíc" "unitPrice": "Jednotková cena",
"unitTime": "Jednotka času"
}, },
"group": { "group": {
"actions": "Akce", "actions": "Akce",

View File

@ -13,6 +13,11 @@
"edit": "Bearbeiten", "edit": "Bearbeiten",
"editSubscribe": "Abonnement bearbeiten", "editSubscribe": "Abonnement bearbeiten",
"form": { "form": {
"Day": "Tag",
"Hour": "Stunde",
"Minute": "Minute",
"Month": "Monat",
"Year": "Jahr",
"cancel": "Abbrechen", "cancel": "Abbrechen",
"confirm": "Bestätigen", "confirm": "Bestätigen",
"description": "Beschreibung", "description": "Beschreibung",
@ -29,12 +34,14 @@
"quota": "Kaufbeschränkung", "quota": "Kaufbeschränkung",
"replacement": "Ersatzpreis (pro Mal)", "replacement": "Ersatzpreis (pro Mal)",
"selectSubscribeGroup": "Bitte Abonnementgruppe auswählen", "selectSubscribeGroup": "Bitte Abonnementgruppe auswählen",
"selectUnitTime": "Bitte wählen Sie eine Zeiteinheit",
"server": "Dienst", "server": "Dienst",
"serverGroup": "Dienstgruppe", "serverGroup": "Dienstgruppe",
"speedLimit": "Geschwindigkeitsbegrenzung (Mbps)", "speedLimit": "Geschwindigkeitsbegrenzung (Mbps)",
"subscribeGroup": "Abonnementgruppe", "subscribeGroup": "Abonnementgruppe",
"traffic": "Datenvolumen", "traffic": "Datenvolumen",
"unit_price": "Monatspreis" "unitPrice": "Einheitspreis",
"unitTime": "Zeiteinheit"
}, },
"group": { "group": {
"actions": "Aktionen", "actions": "Aktionen",

View File

@ -13,6 +13,11 @@
"edit": "Edit", "edit": "Edit",
"editSubscribe": "Edit Subscription", "editSubscribe": "Edit Subscription",
"form": { "form": {
"Day": "Day",
"Hour": "Hour",
"Minute": "Minute",
"Month": "Month",
"Year": "Year",
"cancel": "Cancel", "cancel": "Cancel",
"confirm": "Confirm", "confirm": "Confirm",
"description": "Description", "description": "Description",
@ -29,12 +34,14 @@
"quota": "Purchase Limit", "quota": "Purchase Limit",
"replacement": "Reset Price (per time)", "replacement": "Reset Price (per time)",
"selectSubscribeGroup": "Select Subscription Group", "selectSubscribeGroup": "Select Subscription Group",
"selectUnitTime": "Please select a unit of time",
"server": "Server", "server": "Server",
"serverGroup": "Server Group", "serverGroup": "Server Group",
"speedLimit": "Speed Limit (Mbps)", "speedLimit": "Speed Limit (Mbps)",
"subscribeGroup": "Subscription Group", "subscribeGroup": "Subscription Group",
"traffic": "Traffic", "traffic": "Traffic",
"unit_price": "Monthly Price" "unitPrice": "Unit Price",
"unitTime": "Unit Time"
}, },
"group": { "group": {
"actions": "Actions", "actions": "Actions",

View File

@ -13,6 +13,11 @@
"edit": "editar", "edit": "editar",
"editSubscribe": "Editar suscripción", "editSubscribe": "Editar suscripción",
"form": { "form": {
"Day": "Día",
"Hour": "Hora",
"Minute": "Minuto",
"Month": "Mes",
"Year": "Año",
"cancel": "Cancelar", "cancel": "Cancelar",
"confirm": "Confirmar", "confirm": "Confirmar",
"description": "Descripción", "description": "Descripción",
@ -29,12 +34,14 @@
"quota": "Cantidad de compra limitada", "quota": "Cantidad de compra limitada",
"replacement": "Precio de reposición (cada vez)", "replacement": "Precio de reposición (cada vez)",
"selectSubscribeGroup": "Por favor, seleccione un grupo de suscripción", "selectSubscribeGroup": "Por favor, seleccione un grupo de suscripción",
"selectUnitTime": "Por favor, seleccione la unidad de tiempo",
"server": "Servidor", "server": "Servidor",
"serverGroup": "Grupo de servidores", "serverGroup": "Grupo de servidores",
"speedLimit": "Límite de velocidad (Mbps)", "speedLimit": "Límite de velocidad (Mbps)",
"subscribeGroup": "Grupo de suscripción", "subscribeGroup": "Grupo de suscripción",
"traffic": "Tráfico", "traffic": "Tráfico",
"unit_price": "Precio mensual" "unitPrice": "Precio unitario",
"unitTime": "Unidad de tiempo"
}, },
"group": { "group": {
"actions": "Acciones", "actions": "Acciones",

View File

@ -13,6 +13,11 @@
"edit": "editar", "edit": "editar",
"editSubscribe": "Editar suscripción", "editSubscribe": "Editar suscripción",
"form": { "form": {
"Day": "Día",
"Hour": "Hora",
"Minute": "Minuto",
"Month": "Mes",
"Year": "Año",
"cancel": "Cancelar", "cancel": "Cancelar",
"confirm": "Confirmar", "confirm": "Confirmar",
"description": "Descripción", "description": "Descripción",
@ -29,12 +34,14 @@
"quota": "Cantidad máxima de compra", "quota": "Cantidad máxima de compra",
"replacement": "Precio de reposición (cada vez)", "replacement": "Precio de reposición (cada vez)",
"selectSubscribeGroup": "Por favor seleccione un grupo de suscripción", "selectSubscribeGroup": "Por favor seleccione un grupo de suscripción",
"selectUnitTime": "Por favor seleccione la unidad de tiempo",
"server": "Servidor", "server": "Servidor",
"serverGroup": "Grupo de servidores", "serverGroup": "Grupo de servidores",
"speedLimit": "Límite de velocidad (Mbps)", "speedLimit": "Límite de velocidad (Mbps)",
"subscribeGroup": "Grupo de suscripción", "subscribeGroup": "Grupo de suscripción",
"traffic": "Tráfico", "traffic": "Tráfico",
"unit_price": "Precio mensual" "unitPrice": "Precio unitario",
"unitTime": "Unidad de tiempo"
}, },
"group": { "group": {
"actions": "Acciones", "actions": "Acciones",

View File

@ -13,6 +13,11 @@
"edit": "muokkaa", "edit": "muokkaa",
"editSubscribe": "Muokkaa tilausta", "editSubscribe": "Muokkaa tilausta",
"form": { "form": {
"Day": "Päivä",
"Hour": "Tunti",
"Minute": "Minuutti",
"Month": "Kuukausi",
"Year": "Vuosi",
"cancel": "Peruuta", "cancel": "Peruuta",
"confirm": "Vahvista", "confirm": "Vahvista",
"description": "Kuvaus", "description": "Kuvaus",
@ -29,12 +34,14 @@
"quota": "Ostorajoitus", "quota": "Ostorajoitus",
"replacement": "Uudelleenhinnan asetus (kerta)", "replacement": "Uudelleenhinnan asetus (kerta)",
"selectSubscribeGroup": "Valitse tilausryhmä", "selectSubscribeGroup": "Valitse tilausryhmä",
"selectUnitTime": "Valitse aikayksikkö",
"server": "Palvelin", "server": "Palvelin",
"serverGroup": "Palvelinryhmä", "serverGroup": "Palvelinryhmä",
"speedLimit": "Nopeusrajoitus (Mbps)", "speedLimit": "Nopeusrajoitus (Mbps)",
"subscribeGroup": "Tilausryhmä", "subscribeGroup": "Tilausryhmä",
"traffic": "Liikenne", "traffic": "Liikenne",
"unit_price": "Kuukausihinta" "unitPrice": "Yksikköhinta",
"unitTime": "Aikayksikkö"
}, },
"group": { "group": {
"actions": "Toiminnot", "actions": "Toiminnot",

View File

@ -13,6 +13,11 @@
"edit": "Éditer", "edit": "Éditer",
"editSubscribe": "Modifier l'abonnement", "editSubscribe": "Modifier l'abonnement",
"form": { "form": {
"Day": "Jour",
"Hour": "Heure",
"Minute": "Minute",
"Month": "Mois",
"Year": "Année",
"cancel": "Annuler", "cancel": "Annuler",
"confirm": "Confirmer", "confirm": "Confirmer",
"description": "Description", "description": "Description",
@ -29,12 +34,14 @@
"quota": "Quantité d'achat limitée", "quota": "Quantité d'achat limitée",
"replacement": "Prix de réinitialisation (par fois)", "replacement": "Prix de réinitialisation (par fois)",
"selectSubscribeGroup": "Veuillez sélectionner un groupe d'abonnement", "selectSubscribeGroup": "Veuillez sélectionner un groupe d'abonnement",
"selectUnitTime": "Veuillez sélectionner l'unité de temps",
"server": "Serveur", "server": "Serveur",
"serverGroup": "Groupe de serveurs", "serverGroup": "Groupe de serveurs",
"speedLimit": "Limite de vitesse (Mbps)", "speedLimit": "Limite de vitesse (Mbps)",
"subscribeGroup": "Groupe d'abonnement", "subscribeGroup": "Groupe d'abonnement",
"traffic": "Trafic", "traffic": "Trafic",
"unit_price": "Prix mensuel unitaire" "unitPrice": "Prix unitaire",
"unitTime": "Unité de temps"
}, },
"group": { "group": {
"actions": "Actions", "actions": "Actions",

View File

@ -13,6 +13,11 @@
"edit": "संपादित करें", "edit": "संपादित करें",
"editSubscribe": "संपादन सदस्यता", "editSubscribe": "संपादन सदस्यता",
"form": { "form": {
"Day": "दिन",
"Hour": "घंटा",
"Minute": "मिनट",
"Month": "महीना",
"Year": "वर्ष",
"cancel": "रद्द करें", "cancel": "रद्द करें",
"confirm": "पुष्टि करें", "confirm": "पुष्टि करें",
"description": "विवरण", "description": "विवरण",
@ -29,12 +34,14 @@
"quota": "खरीद सीमा", "quota": "खरीद सीमा",
"replacement": "पुनःस्थापना मूल्य (प्रति बार)", "replacement": "पुनःस्थापना मूल्य (प्रति बार)",
"selectSubscribeGroup": "कृपया सदस्यता समूह चुनें", "selectSubscribeGroup": "कृपया सदस्यता समूह चुनें",
"selectUnitTime": "कृपया इकाई समय चुनें",
"server": "सर्वर", "server": "सर्वर",
"serverGroup": "सर्वर समूह", "serverGroup": "सर्वर समूह",
"speedLimit": "गति सीमा (Mbps)", "speedLimit": "गति सीमा (Mbps)",
"subscribeGroup": "सदस्यता समूह", "subscribeGroup": "सदस्यता समूह",
"traffic": "ट्रैफिक", "traffic": "ट्रैफिक",
"unit_price": "प्रति माह मूल्य" "unitPrice": "इकाई मूल्य",
"unitTime": "इकाई समय"
}, },
"group": { "group": {
"actions": "क्रियाएँ", "actions": "क्रियाएँ",

View File

@ -13,6 +13,11 @@
"edit": "szerkesztés", "edit": "szerkesztés",
"editSubscribe": "Előfizetés szerkesztése", "editSubscribe": "Előfizetés szerkesztése",
"form": { "form": {
"Day": "Nap",
"Hour": "Óra",
"Minute": "Perc",
"Month": "Hónap",
"Year": "Év",
"cancel": "Mégse", "cancel": "Mégse",
"confirm": "Megerősít", "confirm": "Megerősít",
"description": "Leírás", "description": "Leírás",
@ -29,12 +34,14 @@
"quota": "Vásárlási korlát", "quota": "Vásárlási korlát",
"replacement": "Csere ára (alkalmanként)", "replacement": "Csere ára (alkalmanként)",
"selectSubscribeGroup": "Kérjük, válassza ki az előfizetési csoportot", "selectSubscribeGroup": "Kérjük, válassza ki az előfizetési csoportot",
"selectUnitTime": "Kérjük, válassza ki az időegységet",
"server": "Szolgáltatás", "server": "Szolgáltatás",
"serverGroup": "Szolgáltatáscsoport", "serverGroup": "Szolgáltatáscsoport",
"speedLimit": "Sebességkorlát (Mbps)", "speedLimit": "Sebességkorlát (Mbps)",
"subscribeGroup": "Előfizetési csoport", "subscribeGroup": "Előfizetési csoport",
"traffic": "Forgalom", "traffic": "Forgalom",
"unit_price": "Havi ár" "unitPrice": "Egységár",
"unitTime": "Időegység"
}, },
"group": { "group": {
"actions": "Műveletek", "actions": "Műveletek",

View File

@ -13,6 +13,11 @@
"edit": "編集", "edit": "編集",
"editSubscribe": "サブスクリプションを編集", "editSubscribe": "サブスクリプションを編集",
"form": { "form": {
"Day": "日",
"Hour": "時",
"Minute": "分",
"Month": "月",
"Year": "年",
"cancel": "キャンセル", "cancel": "キャンセル",
"confirm": "確認", "confirm": "確認",
"description": "説明", "description": "説明",
@ -29,12 +34,14 @@
"quota": "購入制限数", "quota": "購入制限数",
"replacement": "リセット価格(毎回)", "replacement": "リセット価格(毎回)",
"selectSubscribeGroup": "サブスクリプショングループを選択してください", "selectSubscribeGroup": "サブスクリプショングループを選択してください",
"selectUnitTime": "単位時間を選択してください",
"server": "サーバー", "server": "サーバー",
"serverGroup": "サーバーグループ", "serverGroup": "サーバーグループ",
"speedLimit": "速度制限Mbps", "speedLimit": "速度制限Mbps",
"subscribeGroup": "サブスクリプショングループ", "subscribeGroup": "サブスクリプショングループ",
"traffic": "トラフィック", "traffic": "トラフィック",
"unit_price": "月額価格" "unitPrice": "単価",
"unitTime": "単位時間"
}, },
"group": { "group": {
"actions": "操作", "actions": "操作",

View File

@ -13,6 +13,11 @@
"edit": "편집", "edit": "편집",
"editSubscribe": "구독 편집", "editSubscribe": "구독 편집",
"form": { "form": {
"Day": "일",
"Hour": "시",
"Minute": "분",
"Month": "월",
"Year": "년",
"cancel": "취소", "cancel": "취소",
"confirm": "확인", "confirm": "확인",
"description": "설명", "description": "설명",
@ -29,12 +34,14 @@
"quota": "구매 한도", "quota": "구매 한도",
"replacement": "재설정 가격 (매회)", "replacement": "재설정 가격 (매회)",
"selectSubscribeGroup": "구독 그룹을 선택하세요", "selectSubscribeGroup": "구독 그룹을 선택하세요",
"selectUnitTime": "단위 시간을 선택하세요",
"server": "서버", "server": "서버",
"serverGroup": "서버 그룹", "serverGroup": "서버 그룹",
"speedLimit": "속도 제한 (Mbps)", "speedLimit": "속도 제한 (Mbps)",
"subscribeGroup": "구독 그룹", "subscribeGroup": "구독 그룹",
"traffic": "트래픽", "traffic": "트래픽",
"unit_price": "월 단위 가격" "unitPrice": "단가",
"unitTime": "단위 시간"
}, },
"group": { "group": {
"actions": "작업", "actions": "작업",

View File

@ -13,6 +13,11 @@
"edit": "rediger", "edit": "rediger",
"editSubscribe": "Rediger abonnement", "editSubscribe": "Rediger abonnement",
"form": { "form": {
"Day": "Dag",
"Hour": "Time",
"Minute": "Minutt",
"Month": "Måned",
"Year": "År",
"cancel": "Avbryt", "cancel": "Avbryt",
"confirm": "Bekreft", "confirm": "Bekreft",
"description": "Beskrivelse", "description": "Beskrivelse",
@ -29,12 +34,14 @@
"quota": "Kjøpskvote", "quota": "Kjøpskvote",
"replacement": "Erstatningspris (per gang)", "replacement": "Erstatningspris (per gang)",
"selectSubscribeGroup": "Vennligst velg abonnementsgruppe", "selectSubscribeGroup": "Vennligst velg abonnementsgruppe",
"selectUnitTime": "Vennligst velg enhetstid",
"server": "Tjeneste", "server": "Tjeneste",
"serverGroup": "Tjenestegruppe", "serverGroup": "Tjenestegruppe",
"speedLimit": "Hastighetsbegrensning (Mbps)", "speedLimit": "Hastighetsbegrensning (Mbps)",
"subscribeGroup": "Abonnementsgruppe", "subscribeGroup": "Abonnementsgruppe",
"traffic": "Trafikk", "traffic": "Trafikk",
"unit_price": "Pris per måned" "unitPrice": "Enhetspris",
"unitTime": "Enhetstid"
}, },
"group": { "group": {
"actions": "Handlinger", "actions": "Handlinger",

View File

@ -13,6 +13,11 @@
"edit": "edytuj", "edit": "edytuj",
"editSubscribe": "Edytuj subskrypcję", "editSubscribe": "Edytuj subskrypcję",
"form": { "form": {
"Day": "Dzień",
"Hour": "Godzina",
"Minute": "Minuta",
"Month": "Miesiąc",
"Year": "Rok",
"cancel": "Anuluj", "cancel": "Anuluj",
"confirm": "Potwierdź", "confirm": "Potwierdź",
"description": "Opis", "description": "Opis",
@ -29,12 +34,14 @@
"quota": "Limit zakupu", "quota": "Limit zakupu",
"replacement": "Cena wymiany (za każdym razem)", "replacement": "Cena wymiany (za każdym razem)",
"selectSubscribeGroup": "Wybierz grupę subskrypcji", "selectSubscribeGroup": "Wybierz grupę subskrypcji",
"selectUnitTime": "Proszę wybrać jednostkę czasu",
"server": "Serwer", "server": "Serwer",
"serverGroup": "Grupa serwerów", "serverGroup": "Grupa serwerów",
"speedLimit": "Limit prędkości (Mbps)", "speedLimit": "Limit prędkości (Mbps)",
"subscribeGroup": "Grupa subskrypcji", "subscribeGroup": "Grupa subskrypcji",
"traffic": "Ruch", "traffic": "Ruch",
"unit_price": "Cena za miesiąc" "unitPrice": "Cena jednostkowa",
"unitTime": "Jednostka czasu"
}, },
"group": { "group": {
"actions": "Działania", "actions": "Działania",

View File

@ -13,6 +13,11 @@
"edit": "editar", "edit": "editar",
"editSubscribe": "Editar Assinatura", "editSubscribe": "Editar Assinatura",
"form": { "form": {
"Day": "Dia",
"Hour": "Hora",
"Minute": "Minuto",
"Month": "Mês",
"Year": "Ano",
"cancel": "Cancelar", "cancel": "Cancelar",
"confirm": "Confirmar", "confirm": "Confirmar",
"description": "Descrição", "description": "Descrição",
@ -29,12 +34,14 @@
"quota": "Quantidade limitada", "quota": "Quantidade limitada",
"replacement": "Preço de reposição (cada vez)", "replacement": "Preço de reposição (cada vez)",
"selectSubscribeGroup": "Por favor, selecione o grupo de assinatura", "selectSubscribeGroup": "Por favor, selecione o grupo de assinatura",
"selectUnitTime": "Por favor, selecione a unidade de tempo",
"server": "Servidor", "server": "Servidor",
"serverGroup": "Grupo de servidores", "serverGroup": "Grupo de servidores",
"speedLimit": "Limite de velocidade (Mbps)", "speedLimit": "Limite de velocidade (Mbps)",
"subscribeGroup": "Grupo de assinatura", "subscribeGroup": "Grupo de assinatura",
"traffic": "Tráfego", "traffic": "Tráfego",
"unit_price": "Preço mensal" "unitPrice": "Preço unitário",
"unitTime": "Unidade de tempo"
}, },
"group": { "group": {
"actions": "Ações", "actions": "Ações",

View File

@ -13,6 +13,11 @@
"edit": "editează", "edit": "editează",
"editSubscribe": "Editează abonamentul", "editSubscribe": "Editează abonamentul",
"form": { "form": {
"Day": "Zi",
"Hour": "Oră",
"Minute": "Minut",
"Month": "Lună",
"Year": "An",
"cancel": "Anulează", "cancel": "Anulează",
"confirm": "Confirmă", "confirm": "Confirmă",
"description": "Descriere", "description": "Descriere",
@ -29,12 +34,14 @@
"quota": "Limită de achiziție", "quota": "Limită de achiziție",
"replacement": "Preț de înlocuire (per dată)", "replacement": "Preț de înlocuire (per dată)",
"selectSubscribeGroup": "Vă rugăm să selectați grupul de abonament", "selectSubscribeGroup": "Vă rugăm să selectați grupul de abonament",
"selectUnitTime": "Vă rugăm să selectați unitatea de timp",
"server": "Server", "server": "Server",
"serverGroup": "Grup server", "serverGroup": "Grup server",
"speedLimit": "Limită de viteză (Mbps)", "speedLimit": "Limită de viteză (Mbps)",
"subscribeGroup": "Grup de abonament", "subscribeGroup": "Grup de abonament",
"traffic": "Trafic", "traffic": "Trafic",
"unit_price": "Preț lunar unitar" "unitPrice": "Preț unitar",
"unitTime": "Unitate de timp"
}, },
"group": { "group": {
"actions": "Acțiuni", "actions": "Acțiuni",

View File

@ -13,6 +13,11 @@
"edit": "редактировать", "edit": "редактировать",
"editSubscribe": "Редактировать подписку", "editSubscribe": "Редактировать подписку",
"form": { "form": {
"Day": "День",
"Hour": "Час",
"Minute": "Минута",
"Month": "Месяц",
"Year": "Год",
"cancel": "Отмена", "cancel": "Отмена",
"confirm": "Подтвердить", "confirm": "Подтвердить",
"description": "Описание", "description": "Описание",
@ -29,12 +34,14 @@
"quota": "Лимит покупки", "quota": "Лимит покупки",
"replacement": "Цена замены (за раз)", "replacement": "Цена замены (за раз)",
"selectSubscribeGroup": "Пожалуйста, выберите группу подписки", "selectSubscribeGroup": "Пожалуйста, выберите группу подписки",
"selectUnitTime": "Пожалуйста, выберите единицу времени",
"server": "Сервер", "server": "Сервер",
"serverGroup": "Группа серверов", "serverGroup": "Группа серверов",
"speedLimit": "Ограничение скорости (Мбит/с)", "speedLimit": "Ограничение скорости (Мбит/с)",
"subscribeGroup": "Группа подписки", "subscribeGroup": "Группа подписки",
"traffic": "Трафик", "traffic": "Трафик",
"unit_price": "Цена за месяц" "unitPrice": "Цена за единицу",
"unitTime": "Единица времени"
}, },
"group": { "group": {
"actions": "Действия", "actions": "Действия",

View File

@ -13,6 +13,11 @@
"edit": "แก้ไข", "edit": "แก้ไข",
"editSubscribe": "แก้ไขการสมัครสมาชิก", "editSubscribe": "แก้ไขการสมัครสมาชิก",
"form": { "form": {
"Day": "วัน",
"Hour": "ชั่วโมง",
"Minute": "นาที",
"Month": "เดือน",
"Year": "ปี",
"cancel": "ยกเลิก", "cancel": "ยกเลิก",
"confirm": "ยืนยัน", "confirm": "ยืนยัน",
"description": "คำอธิบาย", "description": "คำอธิบาย",
@ -29,12 +34,14 @@
"quota": "จำนวนจำกัดการซื้อ", "quota": "จำนวนจำกัดการซื้อ",
"replacement": "ราคารีเซ็ต (ต่อครั้ง)", "replacement": "ราคารีเซ็ต (ต่อครั้ง)",
"selectSubscribeGroup": "กรุณาเลือกกลุ่มการสมัครสมาชิก", "selectSubscribeGroup": "กรุณาเลือกกลุ่มการสมัครสมาชิก",
"selectUnitTime": "กรุณาเลือกหน่วยเวลา",
"server": "เซิร์ฟเวอร์", "server": "เซิร์ฟเวอร์",
"serverGroup": "กลุ่มเซิร์ฟเวอร์", "serverGroup": "กลุ่มเซิร์ฟเวอร์",
"speedLimit": "จำกัดความเร็ว (Mbps)", "speedLimit": "จำกัดความเร็ว (Mbps)",
"subscribeGroup": "กลุ่มการสมัครสมาชิก", "subscribeGroup": "กลุ่มการสมัครสมาชิก",
"traffic": "ปริมาณข้อมูล", "traffic": "ปริมาณข้อมูล",
"unit_price": "ราคาต่อเดือน" "unitPrice": "ราคาต่อหน่วย",
"unitTime": "หน่วยเวลา"
}, },
"group": { "group": {
"actions": "การดำเนินการ", "actions": "การดำเนินการ",

View File

@ -13,6 +13,11 @@
"edit": "düzenle", "edit": "düzenle",
"editSubscribe": "Aboneliği Düzenle", "editSubscribe": "Aboneliği Düzenle",
"form": { "form": {
"Day": "Gün",
"Hour": "Saat",
"Minute": "Dakika",
"Month": "Ay",
"Year": "Yıl",
"cancel": "İptal", "cancel": "İptal",
"confirm": "Onayla", "confirm": "Onayla",
"description": "Açıklama", "description": "Açıklama",
@ -29,12 +34,14 @@
"quota": "Satın Alma Limiti", "quota": "Satın Alma Limiti",
"replacement": "Yenileme Ücreti (her seferinde)", "replacement": "Yenileme Ücreti (her seferinde)",
"selectSubscribeGroup": "Abonelik Grubunu Seçiniz", "selectSubscribeGroup": "Abonelik Grubunu Seçiniz",
"selectUnitTime": "Lütfen birim zamanı seçin",
"server": "Sunucu", "server": "Sunucu",
"serverGroup": "Sunucu Grubu", "serverGroup": "Sunucu Grubu",
"speedLimit": "Hız Sınırı (Mbps)", "speedLimit": "Hız Sınırı (Mbps)",
"subscribeGroup": "Abonelik Grubu", "subscribeGroup": "Abonelik Grubu",
"traffic": "Trafik", "traffic": "Trafik",
"unit_price": "Aylık Fiyat" "unitPrice": "Birim fiyatı",
"unitTime": "Birim zamanı"
}, },
"group": { "group": {
"actions": "Eylemler", "actions": "Eylemler",

View File

@ -13,6 +13,11 @@
"edit": "редагувати", "edit": "редагувати",
"editSubscribe": "Редагувати підписку", "editSubscribe": "Редагувати підписку",
"form": { "form": {
"Day": "День",
"Hour": "Година",
"Minute": "Хвилина",
"Month": "Місяць",
"Year": "Рік",
"cancel": "Скасувати", "cancel": "Скасувати",
"confirm": "Підтвердити", "confirm": "Підтвердити",
"description": "Опис", "description": "Опис",
@ -29,12 +34,14 @@
"quota": "Ліміт покупки", "quota": "Ліміт покупки",
"replacement": "Ціна заміни (за раз)", "replacement": "Ціна заміни (за раз)",
"selectSubscribeGroup": "Будь ласка, виберіть групу підписки", "selectSubscribeGroup": "Будь ласка, виберіть групу підписки",
"selectUnitTime": "Будь ласка, виберіть одиницю часу",
"server": "Сервер", "server": "Сервер",
"serverGroup": "Група серверів", "serverGroup": "Група серверів",
"speedLimit": "Обмеження швидкості (Мбіт/с)", "speedLimit": "Обмеження швидкості (Мбіт/с)",
"subscribeGroup": "Група підписки", "subscribeGroup": "Група підписки",
"traffic": "Трафік", "traffic": "Трафік",
"unit_price": "Ціна за місяць" "unitPrice": "Ціна за одиницю",
"unitTime": "Одиниця часу"
}, },
"group": { "group": {
"actions": "Дії", "actions": "Дії",

View File

@ -13,6 +13,11 @@
"edit": "Chỉnh sửa", "edit": "Chỉnh sửa",
"editSubscribe": "Chỉnh sửa đăng ký", "editSubscribe": "Chỉnh sửa đăng ký",
"form": { "form": {
"Day": "Ngày",
"Hour": "Giờ",
"Minute": "Phút",
"Month": "Tháng",
"Year": "Năm",
"cancel": "Hủy", "cancel": "Hủy",
"confirm": "Xác nhận", "confirm": "Xác nhận",
"description": "Mô tả", "description": "Mô tả",
@ -29,12 +34,14 @@
"quota": "Số lượng mua giới hạn", "quota": "Số lượng mua giới hạn",
"replacement": "Giá thay thế (mỗi lần)", "replacement": "Giá thay thế (mỗi lần)",
"selectSubscribeGroup": "Vui lòng chọn nhóm đăng ký", "selectSubscribeGroup": "Vui lòng chọn nhóm đăng ký",
"selectUnitTime": "Vui lòng chọn đơn vị thời gian",
"server": "Dịch vụ", "server": "Dịch vụ",
"serverGroup": "Nhóm dịch vụ", "serverGroup": "Nhóm dịch vụ",
"speedLimit": "Giới hạn tốc độ (Mbps)", "speedLimit": "Giới hạn tốc độ (Mbps)",
"subscribeGroup": "Nhóm đăng ký", "subscribeGroup": "Nhóm đăng ký",
"traffic": "Lưu lượng", "traffic": "Lưu lượng",
"unit_price": "Giá mỗi tháng" "unitPrice": "Đơn giá",
"unitTime": "Đơn vị thời gian"
}, },
"group": { "group": {
"actions": "Hành động", "actions": "Hành động",

View File

@ -13,6 +13,11 @@
"edit": "编辑", "edit": "编辑",
"editSubscribe": "编辑订阅", "editSubscribe": "编辑订阅",
"form": { "form": {
"Day": "天",
"Hour": "时",
"Minute": "分",
"Month": "月",
"Year": "年",
"cancel": "取消", "cancel": "取消",
"confirm": "确认", "confirm": "确认",
"description": "描述", "description": "描述",
@ -29,12 +34,14 @@
"quota": "限购数量", "quota": "限购数量",
"replacement": "重置价格(每次)", "replacement": "重置价格(每次)",
"selectSubscribeGroup": "请选择订阅组", "selectSubscribeGroup": "请选择订阅组",
"selectUnitTime": "请选择单位时间",
"server": "服务", "server": "服务",
"serverGroup": "服务组", "serverGroup": "服务组",
"speedLimit": "速度限制Mbps", "speedLimit": "速度限制Mbps",
"subscribeGroup": "订阅组", "subscribeGroup": "订阅组",
"traffic": "流量", "traffic": "流量",
"unit_price": "单月价格" "unitPrice": "单价",
"unitTime": "单位时间"
}, },
"group": { "group": {
"actions": "操作", "actions": "操作",

View File

@ -13,6 +13,11 @@
"edit": "編輯", "edit": "編輯",
"editSubscribe": "編輯訂閱", "editSubscribe": "編輯訂閱",
"form": { "form": {
"Day": "日",
"Hour": "小時",
"Minute": "分鐘",
"Month": "月",
"Year": "年",
"cancel": "取消", "cancel": "取消",
"confirm": "確認", "confirm": "確認",
"description": "描述", "description": "描述",
@ -29,12 +34,14 @@
"quota": "限購數量", "quota": "限購數量",
"replacement": "重置價格(每次)", "replacement": "重置價格(每次)",
"selectSubscribeGroup": "請選擇訂閱組", "selectSubscribeGroup": "請選擇訂閱組",
"selectUnitTime": "請選擇單位時間",
"server": "服務", "server": "服務",
"serverGroup": "服務組", "serverGroup": "服務組",
"speedLimit": "速度限制Mbps", "speedLimit": "速度限制Mbps",
"subscribeGroup": "訂閱組", "subscribeGroup": "訂閱組",
"traffic": "流量", "traffic": "流量",
"unit_price": "單月價格" "unitPrice": "單價",
"unitTime": "單位時間"
}, },
"group": { "group": {
"actions": "操作", "actions": "操作",

View File

@ -153,3 +153,15 @@ export async function getNodeList(
...(options || {}), ...(options || {}),
}); });
} }
/** Node sort POST /v1/admin/server/sort */
export async function nodeSort(body: API.NodeSortRequest, options?: { [key: string]: any }) {
return request<API.Response & { data?: any }>('/v1/admin/server/sort', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
data: body,
...(options || {}),
});
}

View File

@ -165,3 +165,18 @@ export async function getSubscribeList(
}, },
); );
} }
/** Subscribe sort POST /v1/admin/subscribe/sort */
export async function subscribeSort(
body: API.SubscribeSortRequest,
options?: { [key: string]: any },
) {
return request<API.Response & { data?: any }>('/v1/admin/subscribe/sort', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
data: body,
...(options || {}),
});
}

View File

@ -12,6 +12,7 @@ declare namespace API {
title: string; title: string;
content: string; content: string;
enable: boolean; enable: boolean;
type: number;
created_at: number; created_at: number;
updated_at: number; updated_at: number;
}; };
@ -81,6 +82,7 @@ declare namespace API {
type CreateAnnouncementRequest = { type CreateAnnouncementRequest = {
title: string; title: string;
content: string; content: string;
type: number;
}; };
type CreateApplicationRequest = { type CreateApplicationRequest = {
@ -156,6 +158,7 @@ declare namespace API {
name: string; name: string;
description: string; description: string;
unit_price: number; unit_price: number;
unit_time: string;
discount: SubscribeDiscount[]; discount: SubscribeDiscount[];
replacement: number; replacement: number;
inventory: number; inventory: number;
@ -504,6 +507,10 @@ declare namespace API {
node_push_interval: number; node_push_interval: number;
}; };
type NodeSortRequest = {
sort: SortItem[];
};
type NodeStatus = { type NodeStatus = {
online_users: OnlineUser[]; online_users: OnlineUser[];
status: ServerStatus; status: ServerStatus;
@ -630,6 +637,7 @@ declare namespace API {
created_at: number; created_at: number;
updated_at: number; updated_at: number;
status: NodeStatus; status: NodeStatus;
sort: number;
}; };
type ServerGroup = { type ServerGroup = {
@ -682,6 +690,11 @@ declare namespace API {
site_logo: string; site_logo: string;
}; };
type SortItem = {
id: number;
sort: number;
};
type StripeConfig = { type StripeConfig = {
public_key: string; public_key: string;
secret_key: string; secret_key: string;
@ -694,6 +707,7 @@ declare namespace API {
name: string; name: string;
description: string; description: string;
unit_price: number; unit_price: number;
unit_time: string;
discount: SubscribeDiscount[]; discount: SubscribeDiscount[];
replacement: number; replacement: number;
inventory: number; inventory: number;
@ -718,7 +732,7 @@ declare namespace API {
}; };
type SubscribeDiscount = { type SubscribeDiscount = {
months: number; quantity: number;
discount: number; discount: number;
}; };
@ -730,6 +744,10 @@ declare namespace API {
updated_at: number; updated_at: number;
}; };
type SubscribeSortRequest = {
sort: SortItem[];
};
type SubscribeType = { type SubscribeType = {
subscribe_types: string[]; subscribe_types: string[];
}; };
@ -805,6 +823,7 @@ declare namespace API {
title: string; title: string;
content: string; content: string;
enable: boolean; enable: boolean;
type: number;
}; };
type UpdateApplicationRequest = { type UpdateApplicationRequest = {
@ -903,6 +922,7 @@ declare namespace API {
name: string; name: string;
description: string; description: string;
unit_price: number; unit_price: number;
unit_time: string;
discount: SubscribeDiscount[]; discount: SubscribeDiscount[];
replacement: number; replacement: number;
inventory: number; inventory: number;
@ -915,6 +935,7 @@ declare namespace API {
server: number[]; server: number[];
show: boolean; show: boolean;
sell: boolean; sell: boolean;
sort: number;
}; };
type UpdateTicketStatusRequest = { type UpdateTicketStatusRequest = {

View File

@ -4,6 +4,7 @@ declare namespace API {
title: string; title: string;
content: string; content: string;
enable: boolean; enable: boolean;
type: number;
created_at: number; created_at: number;
updated_at: number; updated_at: number;
}; };
@ -266,6 +267,7 @@ declare namespace API {
created_at: number; created_at: number;
updated_at: number; updated_at: number;
status: NodeStatus; status: NodeStatus;
sort: number;
}; };
type ServerGroup = { type ServerGroup = {
@ -296,11 +298,17 @@ declare namespace API {
site_logo: string; site_logo: string;
}; };
type SortItem = {
id: number;
sort: number;
};
type Subscribe = { type Subscribe = {
id: number; id: number;
name: string; name: string;
description: string; description: string;
unit_price: number; unit_price: number;
unit_time: string;
discount: SubscribeDiscount[]; discount: SubscribeDiscount[];
replacement: number; replacement: number;
inventory: number; inventory: number;
@ -325,7 +333,7 @@ declare namespace API {
}; };
type SubscribeDiscount = { type SubscribeDiscount = {
months: number; quantity: number;
discount: number; discount: number;
}; };

View File

@ -112,27 +112,29 @@ export default function Purchase({
}} }}
className='flex flex-wrap gap-0.5 *:w-20 md:gap-2' className='flex flex-wrap gap-0.5 *:w-20 md:gap-2'
> >
<div className='relative'> {subscribe?.unit_time !== 'Minute' && (
<RadioGroupItem value='1' id='1' className='peer sr-only' /> <div className='relative'>
<Label <RadioGroupItem value='1' id='1' className='peer sr-only' />
htmlFor='1' <Label
className='border-muted bg-popover hover:bg-accent hover:text-accent-foreground peer-data-[state=checked]:border-primary relative flex h-full flex-col items-center justify-center gap-2 rounded-md border-2 p-2' htmlFor='1'
> className='border-muted bg-popover hover:bg-accent hover:text-accent-foreground peer-data-[state=checked]:border-primary relative flex h-full flex-col items-center justify-center gap-2 rounded-md border-2 p-2'
1 {t('month')} >
</Label> 1 / {t(subscribe?.unit_time || 'Month')}
</div> </Label>
</div>
)}
{subscribe?.discount?.map((item) => ( {subscribe?.discount?.map((item) => (
<div key={item.months}> <div key={item.quantity}>
<RadioGroupItem <RadioGroupItem
value={String(item.months)} value={String(item.quantity)}
id={String(item.months)} id={String(item.quantity)}
className='peer sr-only' className='peer sr-only'
/> />
<Label <Label
htmlFor={String(item.months)} htmlFor={String(item.quantity)}
className='border-muted bg-popover hover:bg-accent hover:text-accent-foreground peer-data-[state=checked]:border-primary relative flex h-full flex-col items-center justify-center gap-2 rounded-md border-2 p-2' className='border-muted bg-popover hover:bg-accent hover:text-accent-foreground peer-data-[state=checked]:border-primary relative flex h-full flex-col items-center justify-center gap-2 rounded-md border-2 p-2'
> >
{item.months} {t('months')} {item.quantity} / {t(subscribe?.unit_time || 'Month')}
{item.discount < 100 && ( {item.discount < 100 && (
<Badge variant='destructive'>-{100 - item.discount}%</Badge> <Badge variant='destructive'>-{100 - item.discount}%</Badge>
)} )}

View File

@ -107,27 +107,29 @@ export default function Renewal({ token, subscribe }: { token: string; subscribe
}} }}
className='flex flex-wrap gap-2' className='flex flex-wrap gap-2'
> >
<div className='relative'> {subscribe?.unit_time !== 'Minute' && (
<RadioGroupItem value='1' id='1' className='peer sr-only' /> <div className='relative'>
<Label <RadioGroupItem value='1' id='1' className='peer sr-only' />
htmlFor='1' <Label
className='border-muted bg-popover hover:bg-accent hover:text-accent-foreground peer-data-[state=checked]:border-primary relative flex h-full flex-col items-center justify-center gap-2 rounded-md border-2 p-2' htmlFor='1'
> className='border-muted bg-popover hover:bg-accent hover:text-accent-foreground peer-data-[state=checked]:border-primary relative flex h-full flex-col items-center justify-center gap-2 rounded-md border-2 p-2'
1 {t('month')} >
</Label> 1 / {t(subscribe?.unit_time || 'Month')}
</div> </Label>
</div>
)}
{subscribe?.discount?.map((item) => ( {subscribe?.discount?.map((item) => (
<div key={item.months}> <div key={item.quantity}>
<RadioGroupItem <RadioGroupItem
value={String(item.months)} value={String(item.quantity)}
id={String(item.months)} id={String(item.quantity)}
className='peer sr-only' className='peer sr-only'
/> />
<Label <Label
htmlFor={String(item.months)} htmlFor={String(item.quantity)}
className='border-muted bg-popover hover:bg-accent hover:text-accent-foreground peer-data-[state=checked]:border-primary relative flex h-full flex-col items-center justify-center gap-2 rounded-md border-2 p-2' className='border-muted bg-popover hover:bg-accent hover:text-accent-foreground peer-data-[state=checked]:border-primary relative flex h-full flex-col items-center justify-center gap-2 rounded-md border-2 p-2'
> >
{item.months} {t('months')} {item.quantity} / {t(subscribe?.unit_time || 'Month')}
{item.discount < 100 && ( {item.discount < 100 && (
<Badge variant='destructive'>-{100 - item.discount}%</Badge> <Badge variant='destructive'>-{100 - item.discount}%</Badge>
)} )}

View File

@ -15,44 +15,45 @@ interface SubscribeBillingProps {
fee_amount?: number; fee_amount?: number;
amount?: number; amount?: number;
unit_price?: number; unit_price?: number;
unit_time?: number;
}; };
} }
export function SubscribeBilling({ order }: SubscribeBillingProps) { export function SubscribeBilling({ order }: SubscribeBillingProps) {
const t = useTranslations('subscribe.billing'); const t = useTranslations('subscribe');
return ( return (
<> <>
<div className='font-semibold'>{t('billingTitle')}</div> <div className='font-semibold'>{t('billing.billingTitle')}</div>
<ul className='grid grid-cols-2 gap-3 *:flex *:items-center *:justify-between lg:grid-cols-1'> <ul className='grid grid-cols-2 gap-3 *:flex *:items-center *:justify-between lg:grid-cols-1'>
{order?.type && [1, 2].includes(order?.type) && ( {order?.type && [1, 2].includes(order?.type) && (
<li> <li>
<span className='text-muted-foreground'>{t('duration')}</span> <span className='text-muted-foreground'>{t('billing.duration')}</span>
<span> <span>
{order?.quantity || 1} {t('months')} {order?.quantity || 1} {t(order?.unit_time || 'Month')}
</span> </span>
</li> </li>
)} )}
<li> <li>
<span className='text-muted-foreground'>{t('price')}</span> <span className='text-muted-foreground'>{t('billing.price')}</span>
<span> <span>
<Display type='currency' value={order?.price || order?.unit_price} /> <Display type='currency' value={order?.price || order?.unit_price} />
</span> </span>
</li> </li>
<li> <li>
<span className='text-muted-foreground'>{t('productDiscount')}</span> <span className='text-muted-foreground'>{t('billing.productDiscount')}</span>
<span> <span>
<Display type='currency' value={order?.discount} /> <Display type='currency' value={order?.discount} />
</span> </span>
</li> </li>
<li> <li>
<span className='text-muted-foreground'>{t('couponDiscount')}</span> <span className='text-muted-foreground'>{t('billing.couponDiscount')}</span>
<span> <span>
<Display type='currency' value={order?.coupon_discount} /> <Display type='currency' value={order?.coupon_discount} />
</span> </span>
</li> </li>
<li> <li>
<span className='text-muted-foreground'>{t('fee')}</span> <span className='text-muted-foreground'>{t('billing.fee')}</span>
<span> <span>
<Display type='currency' value={order?.fee_amount} /> <Display type='currency' value={order?.fee_amount} />
</span> </span>
@ -60,7 +61,7 @@ export function SubscribeBilling({ order }: SubscribeBillingProps) {
</ul> </ul>
<Separator /> <Separator />
<div className='flex items-center justify-between font-semibold'> <div className='flex items-center justify-between font-semibold'>
<span className='text-muted-foreground'>{t('total')}</span> <span className='text-muted-foreground'>{t('billing.total')}</span>
<span> <span>
<Display type='currency' value={order?.amount} /> <Display type='currency' value={order?.amount} />
</span> </span>

View File

@ -120,7 +120,7 @@ export default function Page() {
<CardFooter className='relative mt-2 flex flex-col gap-2'> <CardFooter className='relative mt-2 flex flex-col gap-2'>
<h2 className='pb-5 text-2xl font-semibold sm:text-3xl'> <h2 className='pb-5 text-2xl font-semibold sm:text-3xl'>
<Display type='currency' value={item.unit_price} /> <Display type='currency' value={item.unit_price} />
<span className='text-base font-medium'>/{t('perMonth')}</span> <span className='text-base font-medium'>/{t(item.unit_time || 'Month')}</span>
</h2> </h2>
<Button <Button
className='absolute bottom-0 w-full rounded-b-xl rounded-t-none' className='absolute bottom-0 w-full rounded-b-xl rounded-t-none'

View File

@ -1,4 +1,9 @@
{ {
"Day": "Den",
"Hour": "Hodina",
"Minute": "Minuta",
"Month": "Měsíc",
"Year": "Rok",
"balanceRecharge": "Doplnění zůstatku", "balanceRecharge": "Doplnění zůstatku",
"buyNow": "Koupit nyní", "buyNow": "Koupit nyní",
"buySubscription": "Koupit předplatné", "buySubscription": "Koupit předplatné",
@ -16,8 +21,6 @@
"stripe_alipay": "Stripe (Alipay)", "stripe_alipay": "Stripe (Alipay)",
"stripe_wechat_pay": "Stripe (WeChat)" "stripe_wechat_pay": "Stripe (WeChat)"
}, },
"month": "měsíc",
"months": "měsíce",
"name": "Název", "name": "Název",
"orderClosed": "Objednávka byla uzavřena", "orderClosed": "Objednávka byla uzavřena",
"orderList": "Seznam objednávek", "orderList": "Seznam objednávek",

View File

@ -1,11 +1,15 @@
{ {
"Day": "Den",
"Hour": "Hodina",
"Minute": "Minuta",
"Month": "Měsíc",
"Year": "Rok",
"all": "Vše", "all": "Vše",
"billing": { "billing": {
"billingTitle": "Faktura za zboží", "billingTitle": "Faktura za zboží",
"couponDiscount": "Sleva z kupónu", "couponDiscount": "Sleva z kupónu",
"duration": "Doba trvání balíčku", "duration": "Doba trvání balíčku",
"fee": "Poplatek", "fee": "Poplatek",
"months": "měsíce",
"price": "Cena", "price": "Cena",
"productDiscount": "Sleva na zboží", "productDiscount": "Sleva na zboží",
"total": "Celková cena" "total": "Celková cena"
@ -25,7 +29,6 @@
"stripe_alipay": "Stripe (Alipay)", "stripe_alipay": "Stripe (Alipay)",
"stripe_wechat_pay": "Stripe (WeChat)" "stripe_wechat_pay": "Stripe (WeChat)"
}, },
"perMonth": "měsíc",
"productDescription": "Popis produktu", "productDescription": "Popis produktu",
"products": "Produkty" "products": "Produkty"
} }

View File

@ -1,4 +1,9 @@
{ {
"Day": "Tag",
"Hour": "Stunde",
"Minute": "Minute",
"Month": "Monat",
"Year": "Jahr",
"balanceRecharge": "Guthaben aufladen", "balanceRecharge": "Guthaben aufladen",
"buyNow": "Jetzt kaufen", "buyNow": "Jetzt kaufen",
"buySubscription": "Abonnement kaufen", "buySubscription": "Abonnement kaufen",
@ -16,8 +21,6 @@
"stripe_alipay": "Stripe (Alipay)", "stripe_alipay": "Stripe (Alipay)",
"stripe_wechat_pay": "Stripe (WeChat)" "stripe_wechat_pay": "Stripe (WeChat)"
}, },
"month": "Monat",
"months": "Monate",
"name": "Name", "name": "Name",
"orderClosed": "Bestellung wurde geschlossen", "orderClosed": "Bestellung wurde geschlossen",
"orderList": "Bestellliste", "orderList": "Bestellliste",

View File

@ -1,11 +1,15 @@
{ {
"Day": "Tag",
"Hour": "Stunde",
"Minute": "Minute",
"Month": "Monat",
"Year": "Jahr",
"all": "Alle", "all": "Alle",
"billing": { "billing": {
"billingTitle": "Produktrechnung", "billingTitle": "Produktrechnung",
"couponDiscount": "Rabattcode-Rabatt", "couponDiscount": "Rabattcode-Rabatt",
"duration": "Paketdauer", "duration": "Paketdauer",
"fee": "Bearbeitungsgebühr", "fee": "Bearbeitungsgebühr",
"months": "Monate",
"price": "Preis", "price": "Preis",
"productDiscount": "Produktrabatt", "productDiscount": "Produktrabatt",
"total": "Gesamtpreis" "total": "Gesamtpreis"
@ -25,7 +29,6 @@
"stripe_alipay": "Stripe (Alipay)", "stripe_alipay": "Stripe (Alipay)",
"stripe_wechat_pay": "Stripe (WeChat)" "stripe_wechat_pay": "Stripe (WeChat)"
}, },
"perMonth": "Monat",
"productDescription": "Produktbeschreibung", "productDescription": "Produktbeschreibung",
"products": "Produkte" "products": "Produkte"
} }

View File

@ -1,4 +1,9 @@
{ {
"Day": "Day",
"Hour": "Hour",
"Minute": "Minute",
"Month": "Month",
"Year": "Year",
"balanceRecharge": "Balance Recharge", "balanceRecharge": "Balance Recharge",
"buyNow": "Buy Now", "buyNow": "Buy Now",
"buySubscription": "Buy Subscription", "buySubscription": "Buy Subscription",
@ -16,8 +21,6 @@
"stripe_alipay": "Stripe (Alipay)", "stripe_alipay": "Stripe (Alipay)",
"stripe_wechat_pay": "Stripe (WeChat)" "stripe_wechat_pay": "Stripe (WeChat)"
}, },
"month": "month",
"months": "months",
"name": "Name", "name": "Name",
"orderClosed": "Order Closed", "orderClosed": "Order Closed",
"orderList": "Order List", "orderList": "Order List",

View File

@ -1,11 +1,15 @@
{ {
"Day": "Day",
"Hour": "Hour",
"Minute": "Minute",
"Month": "Month",
"Year": "Year",
"all": "All", "all": "All",
"billing": { "billing": {
"billingTitle": "Product Billing", "billingTitle": "Product Billing",
"couponDiscount": "Coupon Discount", "couponDiscount": "Coupon Discount",
"duration": "Duration", "duration": "Duration",
"fee": "Fee", "fee": "Fee",
"months": "months",
"price": "Price", "price": "Price",
"productDiscount": "Product Discount", "productDiscount": "Product Discount",
"total": "Total" "total": "Total"
@ -25,7 +29,6 @@
"stripe_alipay": "Stripe (Alipay)", "stripe_alipay": "Stripe (Alipay)",
"stripe_wechat_pay": "Stripe (WeChat)" "stripe_wechat_pay": "Stripe (WeChat)"
}, },
"perMonth": "Per Month",
"productDescription": "Product Description", "productDescription": "Product Description",
"products": "Products" "products": "Products"
} }

View File

@ -1,4 +1,9 @@
{ {
"Day": "Día",
"Hour": "Hora",
"Minute": "Minuto",
"Month": "Mes",
"Year": "Año",
"balanceRecharge": "Recarga de saldo", "balanceRecharge": "Recarga de saldo",
"buyNow": "Comprar ahora", "buyNow": "Comprar ahora",
"buySubscription": "Comprar suscripción", "buySubscription": "Comprar suscripción",
@ -16,8 +21,6 @@
"stripe_alipay": "Stripe (Alipay)", "stripe_alipay": "Stripe (Alipay)",
"stripe_wechat_pay": "Stripe (WeChat)" "stripe_wechat_pay": "Stripe (WeChat)"
}, },
"month": "mes",
"months": "meses",
"name": "nombre", "name": "nombre",
"orderClosed": "Pedido cerrado", "orderClosed": "Pedido cerrado",
"orderList": "Lista de pedidos", "orderList": "Lista de pedidos",

View File

@ -1,11 +1,15 @@
{ {
"Day": "Día",
"Hour": "Hora",
"Minute": "Minuto",
"Month": "Mes",
"Year": "Año",
"all": "todo", "all": "todo",
"billing": { "billing": {
"billingTitle": "Factura de productos", "billingTitle": "Factura de productos",
"couponDiscount": "Descuento por cupón", "couponDiscount": "Descuento por cupón",
"duration": "Duración del paquete", "duration": "Duración del paquete",
"fee": "Tarifa de servicio", "fee": "Tarifa de servicio",
"months": "meses",
"price": "Precio", "price": "Precio",
"productDiscount": "Descuento de producto", "productDiscount": "Descuento de producto",
"total": "Precio total" "total": "Precio total"
@ -25,7 +29,6 @@
"stripe_alipay": "Stripe (Alipay)", "stripe_alipay": "Stripe (Alipay)",
"stripe_wechat_pay": "Stripe (WeChat)" "stripe_wechat_pay": "Stripe (WeChat)"
}, },
"perMonth": "mes",
"productDescription": "Descripción del producto", "productDescription": "Descripción del producto",
"products": "productos" "products": "productos"
} }

View File

@ -1,4 +1,9 @@
{ {
"Day": "Día",
"Hour": "Hora",
"Minute": "Minuto",
"Month": "Mes",
"Year": "Año",
"balanceRecharge": "Recarga de saldo", "balanceRecharge": "Recarga de saldo",
"buyNow": "Compra ahora", "buyNow": "Compra ahora",
"buySubscription": "Comprar suscripción", "buySubscription": "Comprar suscripción",
@ -16,8 +21,6 @@
"stripe_alipay": "Stripe (Alipay)", "stripe_alipay": "Stripe (Alipay)",
"stripe_wechat_pay": "Stripe (WeChat)" "stripe_wechat_pay": "Stripe (WeChat)"
}, },
"month": "mes",
"months": "meses",
"name": "Nombre", "name": "Nombre",
"orderClosed": "Pedido cerrado", "orderClosed": "Pedido cerrado",
"orderList": "Lista de pedidos", "orderList": "Lista de pedidos",

View File

@ -1,11 +1,15 @@
{ {
"Day": "Día",
"Hour": "Hora",
"Minute": "Minuto",
"Month": "Mes",
"Year": "Año",
"all": "Todo", "all": "Todo",
"billing": { "billing": {
"billingTitle": "Factura de Producto", "billingTitle": "Factura de Producto",
"couponDiscount": "Descuento de Cupón", "couponDiscount": "Descuento de Cupón",
"duration": "Duración del Paquete", "duration": "Duración del Paquete",
"fee": "Tarifa", "fee": "Tarifa",
"months": "meses",
"price": "Precio", "price": "Precio",
"productDiscount": "Descuento de Producto", "productDiscount": "Descuento de Producto",
"total": "Total" "total": "Total"
@ -25,7 +29,6 @@
"stripe_alipay": "Stripe (Alipay)", "stripe_alipay": "Stripe (Alipay)",
"stripe_wechat_pay": "Stripe (WeChat)" "stripe_wechat_pay": "Stripe (WeChat)"
}, },
"perMonth": "mes",
"productDescription": "Descripción del producto", "productDescription": "Descripción del producto",
"products": "productos" "products": "productos"
} }

View File

@ -1,4 +1,9 @@
{ {
"Day": "Päivä",
"Hour": "Tunti",
"Minute": "Minuutti",
"Month": "Kuukausi",
"Year": "Vuosi",
"balanceRecharge": "Saldon lataus", "balanceRecharge": "Saldon lataus",
"buyNow": "Osta nyt", "buyNow": "Osta nyt",
"buySubscription": "Osta tilaus", "buySubscription": "Osta tilaus",
@ -16,8 +21,6 @@
"stripe_alipay": "Stripe (Alipay)", "stripe_alipay": "Stripe (Alipay)",
"stripe_wechat_pay": "Stripe (WeChat)" "stripe_wechat_pay": "Stripe (WeChat)"
}, },
"month": "kuukausi",
"months": "kuukautta",
"name": "Nimi", "name": "Nimi",
"orderClosed": "Tilaus on suljettu", "orderClosed": "Tilaus on suljettu",
"orderList": "Tilauslista", "orderList": "Tilauslista",

View File

@ -1,11 +1,15 @@
{ {
"Day": "Päivä",
"Hour": "Tunti",
"Minute": "Minuutti",
"Month": "Kuukausi",
"Year": "Vuosi",
"all": "kaikki", "all": "kaikki",
"billing": { "billing": {
"billingTitle": "Tuotelasku", "billingTitle": "Tuotelasku",
"couponDiscount": "Alennuskoodin alennus", "couponDiscount": "Alennuskoodin alennus",
"duration": "Paketin kesto", "duration": "Paketin kesto",
"fee": "Käsittelymaksu", "fee": "Käsittelymaksu",
"months": "kuukautta",
"price": "Hinta", "price": "Hinta",
"productDiscount": "Tuotealennus", "productDiscount": "Tuotealennus",
"total": "Kokonaishinta" "total": "Kokonaishinta"
@ -25,7 +29,6 @@
"stripe_alipay": "Stripe (Alipay)", "stripe_alipay": "Stripe (Alipay)",
"stripe_wechat_pay": "Stripe (WeChat)" "stripe_wechat_pay": "Stripe (WeChat)"
}, },
"perMonth": "kuukausi",
"productDescription": "Tuotteen kuvaus", "productDescription": "Tuotteen kuvaus",
"products": "tuotteet" "products": "tuotteet"
} }

View File

@ -1,4 +1,9 @@
{ {
"Day": "Jour",
"Hour": "Heure",
"Minute": "Minute",
"Month": "Mois",
"Year": "Année",
"balanceRecharge": "Recharge de solde", "balanceRecharge": "Recharge de solde",
"buyNow": "Acheter maintenant", "buyNow": "Acheter maintenant",
"buySubscription": "Acheter un abonnement", "buySubscription": "Acheter un abonnement",
@ -16,8 +21,6 @@
"stripe_alipay": "Stripe (Alipay)", "stripe_alipay": "Stripe (Alipay)",
"stripe_wechat_pay": "Stripe (WeChat)" "stripe_wechat_pay": "Stripe (WeChat)"
}, },
"month": "mois",
"months": "mois",
"name": "Nom", "name": "Nom",
"orderClosed": "Commande fermée", "orderClosed": "Commande fermée",
"orderList": "Liste des commandes", "orderList": "Liste des commandes",

View File

@ -1,11 +1,15 @@
{ {
"Day": "Jour",
"Hour": "Heure",
"Minute": "Minute",
"Month": "Mois",
"Year": "Année",
"all": "Tout", "all": "Tout",
"billing": { "billing": {
"billingTitle": "Facture des produits", "billingTitle": "Facture des produits",
"couponDiscount": "Réduction du code promo", "couponDiscount": "Réduction du code promo",
"duration": "Durée du forfait", "duration": "Durée du forfait",
"fee": "Frais de service", "fee": "Frais de service",
"months": "mois",
"price": "Prix", "price": "Prix",
"productDiscount": "Réduction sur le produit", "productDiscount": "Réduction sur le produit",
"total": "Prix total" "total": "Prix total"
@ -25,7 +29,6 @@
"stripe_alipay": "Stripe (Alipay)", "stripe_alipay": "Stripe (Alipay)",
"stripe_wechat_pay": "Stripe (WeChat)" "stripe_wechat_pay": "Stripe (WeChat)"
}, },
"perMonth": "mois",
"productDescription": "Description du produit", "productDescription": "Description du produit",
"products": "produits" "products": "produits"
} }

View File

@ -1,4 +1,9 @@
{ {
"Day": "दिन",
"Hour": "घंटा",
"Minute": "मिनट",
"Month": "महीना",
"Year": "वर्ष",
"balanceRecharge": "शेष राशि रिचार्ज", "balanceRecharge": "शेष राशि रिचार्ज",
"buyNow": "अभी खरीदें", "buyNow": "अभी खरीदें",
"buySubscription": "सदस्यता खरीदें", "buySubscription": "सदस्यता खरीदें",
@ -16,8 +21,6 @@
"stripe_alipay": "स्ट्राइप (अलीपे)", "stripe_alipay": "स्ट्राइप (अलीपे)",
"stripe_wechat_pay": "स्ट्राइप (वीचैट)" "stripe_wechat_pay": "स्ट्राइप (वीचैट)"
}, },
"month": "महीना",
"months": "महीने",
"name": "नाम", "name": "नाम",
"orderClosed": "आदेश बंद कर दिया गया है", "orderClosed": "आदेश बंद कर दिया गया है",
"orderList": "आदेश सूची", "orderList": "आदेश सूची",

View File

@ -1,11 +1,15 @@
{ {
"Day": "दिन",
"Hour": "घंटा",
"Minute": "मिनट",
"Month": "महीना",
"Year": "वर्ष",
"all": "सभी", "all": "सभी",
"billing": { "billing": {
"billingTitle": "उत्पाद बिल", "billingTitle": "उत्पाद बिल",
"couponDiscount": "कूपन छूट", "couponDiscount": "कूपन छूट",
"duration": "पैकेज अवधि", "duration": "पैकेज अवधि",
"fee": "शुल्क", "fee": "शुल्क",
"months": "महीने",
"price": "मूल्य", "price": "मूल्य",
"productDiscount": "उत्पाद छूट", "productDiscount": "उत्पाद छूट",
"total": "कुल मूल्य" "total": "कुल मूल्य"
@ -25,7 +29,6 @@
"stripe_alipay": "स्ट्राइप (अलीपे)", "stripe_alipay": "स्ट्राइप (अलीपे)",
"stripe_wechat_pay": "स्ट्राइप (वीचैट)" "stripe_wechat_pay": "स्ट्राइप (वीचैट)"
}, },
"perMonth": "महीना",
"productDescription": "उत्पाद विवरण", "productDescription": "उत्पाद विवरण",
"products": "उत्पाद" "products": "उत्पाद"
} }

View File

@ -1,4 +1,9 @@
{ {
"Day": "Nap",
"Hour": "Óra",
"Minute": "Perc",
"Month": "Hónap",
"Year": "Év",
"balanceRecharge": "Egyenleg feltöltése", "balanceRecharge": "Egyenleg feltöltése",
"buyNow": "Vásároljon most", "buyNow": "Vásároljon most",
"buySubscription": "Előfizetés vásárlása", "buySubscription": "Előfizetés vásárlása",
@ -16,8 +21,6 @@
"stripe_alipay": "Stripe (Alipay)", "stripe_alipay": "Stripe (Alipay)",
"stripe_wechat_pay": "Stripe (WeChat)" "stripe_wechat_pay": "Stripe (WeChat)"
}, },
"month": "hónap",
"months": "hónapok",
"name": "Név", "name": "Név",
"orderClosed": "A rendelés lezárva", "orderClosed": "A rendelés lezárva",
"orderList": "Rendelési lista", "orderList": "Rendelési lista",

View File

@ -1,11 +1,15 @@
{ {
"Day": "Nap",
"Hour": "Óra",
"Minute": "Perc",
"Month": "Hónap",
"Year": "Év",
"all": "Összes", "all": "Összes",
"billing": { "billing": {
"billingTitle": "Termékszámla", "billingTitle": "Termékszámla",
"couponDiscount": "Kuponkedvezmény", "couponDiscount": "Kuponkedvezmény",
"duration": "Csomag időtartama", "duration": "Csomag időtartama",
"fee": "Kezelési díj", "fee": "Kezelési díj",
"months": "hónapok",
"price": "Ár", "price": "Ár",
"productDiscount": "Termékkedvezmény", "productDiscount": "Termékkedvezmény",
"total": "Teljes ár" "total": "Teljes ár"
@ -25,7 +29,6 @@
"stripe_alipay": "Stripe (Alipay)", "stripe_alipay": "Stripe (Alipay)",
"stripe_wechat_pay": "Stripe (WeChat)" "stripe_wechat_pay": "Stripe (WeChat)"
}, },
"perMonth": "hónap",
"productDescription": "Termékleírás", "productDescription": "Termékleírás",
"products": "termékek" "products": "termékek"
} }

View File

@ -1,4 +1,9 @@
{ {
"Day": "日",
"Hour": "時",
"Minute": "分",
"Month": "月",
"Year": "年",
"balanceRecharge": "残高チャージ", "balanceRecharge": "残高チャージ",
"buyNow": "今すぐ購入", "buyNow": "今すぐ購入",
"buySubscription": "サブスクリプションを購入", "buySubscription": "サブスクリプションを購入",
@ -16,8 +21,6 @@
"stripe_alipay": "Stripe(支付宝)", "stripe_alipay": "Stripe(支付宝)",
"stripe_wechat_pay": "Stripe(微信)" "stripe_wechat_pay": "Stripe(微信)"
}, },
"month": "ヶ月",
"months": "ヶ月",
"name": "名前", "name": "名前",
"orderClosed": "注文は締め切られました", "orderClosed": "注文は締め切られました",
"orderList": "注文リスト", "orderList": "注文リスト",

View File

@ -1,11 +1,15 @@
{ {
"Day": "日",
"Hour": "時",
"Minute": "分",
"Month": "月",
"Year": "年",
"all": "すべて", "all": "すべて",
"billing": { "billing": {
"billingTitle": "商品請求書", "billingTitle": "商品請求書",
"couponDiscount": "クーポン割引", "couponDiscount": "クーポン割引",
"duration": "プラン期間", "duration": "プラン期間",
"fee": "手数料", "fee": "手数料",
"months": "ヶ月",
"price": "価格", "price": "価格",
"productDiscount": "商品割引", "productDiscount": "商品割引",
"total": "合計" "total": "合計"
@ -25,7 +29,6 @@
"stripe_alipay": "Stripe(支付宝)", "stripe_alipay": "Stripe(支付宝)",
"stripe_wechat_pay": "Stripe(微信)" "stripe_wechat_pay": "Stripe(微信)"
}, },
"perMonth": "月",
"productDescription": "商品説明", "productDescription": "商品説明",
"products": "商品" "products": "商品"
} }

View File

@ -1,4 +1,9 @@
{ {
"Day": "일",
"Hour": "시",
"Minute": "분",
"Month": "월",
"Year": "년",
"balanceRecharge": "잔액 충전", "balanceRecharge": "잔액 충전",
"buyNow": "지금 구매", "buyNow": "지금 구매",
"buySubscription": "구독 구매", "buySubscription": "구독 구매",
@ -16,8 +21,6 @@
"stripe_alipay": "Stripe(알리페이)", "stripe_alipay": "Stripe(알리페이)",
"stripe_wechat_pay": "Stripe(위챗)" "stripe_wechat_pay": "Stripe(위챗)"
}, },
"month": "개월",
"months": "개월",
"name": "이름", "name": "이름",
"orderClosed": "주문이 종료되었습니다", "orderClosed": "주문이 종료되었습니다",
"orderList": "주문 목록", "orderList": "주문 목록",

View File

@ -1,11 +1,15 @@
{ {
"Day": "일",
"Hour": "시",
"Minute": "분",
"Month": "월",
"Year": "년",
"all": "전체", "all": "전체",
"billing": { "billing": {
"billingTitle": "상품 청구서", "billingTitle": "상품 청구서",
"couponDiscount": "할인 코드 혜택", "couponDiscount": "할인 코드 혜택",
"duration": "패키지 기간", "duration": "패키지 기간",
"fee": "수수료", "fee": "수수료",
"months": "개월",
"price": "가격", "price": "가격",
"productDiscount": "상품 할인", "productDiscount": "상품 할인",
"total": "총액" "total": "총액"
@ -25,7 +29,6 @@
"stripe_alipay": "Stripe(알리페이)", "stripe_alipay": "Stripe(알리페이)",
"stripe_wechat_pay": "Stripe(위챗)" "stripe_wechat_pay": "Stripe(위챗)"
}, },
"perMonth": "월",
"productDescription": "제품 설명", "productDescription": "제품 설명",
"products": "상품" "products": "상품"
} }

View File

@ -1,4 +1,9 @@
{ {
"Day": "Dag",
"Hour": "Time",
"Minute": "Minutt",
"Month": "Måned",
"Year": "År",
"balanceRecharge": "Saldoopplading", "balanceRecharge": "Saldoopplading",
"buyNow": "Kjøp nå", "buyNow": "Kjøp nå",
"buySubscription": "Kjøp abonnement", "buySubscription": "Kjøp abonnement",
@ -16,8 +21,6 @@
"stripe_alipay": "Stripe (Alipay)", "stripe_alipay": "Stripe (Alipay)",
"stripe_wechat_pay": "Stripe (WeChat)" "stripe_wechat_pay": "Stripe (WeChat)"
}, },
"month": "måned",
"months": "måneder",
"name": "Navn", "name": "Navn",
"orderClosed": "Bestillingen er stengt", "orderClosed": "Bestillingen er stengt",
"orderList": "Bestillingsliste", "orderList": "Bestillingsliste",

View File

@ -1,11 +1,15 @@
{ {
"Day": "Dag",
"Hour": "Time",
"Minute": "Minutt",
"Month": "Måned",
"Year": "År",
"all": "Alle", "all": "Alle",
"billing": { "billing": {
"billingTitle": "Varefaktura", "billingTitle": "Varefaktura",
"couponDiscount": "Rabattkode rabatt", "couponDiscount": "Rabattkode rabatt",
"duration": "Pakketid", "duration": "Pakketid",
"fee": "Gebyr", "fee": "Gebyr",
"months": "Måneder",
"price": "Pris", "price": "Pris",
"productDiscount": "Produkt rabatt", "productDiscount": "Produkt rabatt",
"total": "Totalpris" "total": "Totalpris"
@ -25,7 +29,6 @@
"stripe_alipay": "Stripe (Alipay)", "stripe_alipay": "Stripe (Alipay)",
"stripe_wechat_pay": "Stripe (WeChat)" "stripe_wechat_pay": "Stripe (WeChat)"
}, },
"perMonth": "måned",
"productDescription": "Produktbeskrivelse", "productDescription": "Produktbeskrivelse",
"products": "Produkter" "products": "Produkter"
} }

View File

@ -1,4 +1,9 @@
{ {
"Day": "Dzień",
"Hour": "Godzina",
"Minute": "Minuta",
"Month": "Miesiąc",
"Year": "Rok",
"balanceRecharge": "Doładowanie salda", "balanceRecharge": "Doładowanie salda",
"buyNow": "Kup teraz", "buyNow": "Kup teraz",
"buySubscription": "Kup subskrypcję", "buySubscription": "Kup subskrypcję",
@ -16,8 +21,6 @@
"stripe_alipay": "Stripe (Alipay)", "stripe_alipay": "Stripe (Alipay)",
"stripe_wechat_pay": "Stripe (WeChat)" "stripe_wechat_pay": "Stripe (WeChat)"
}, },
"month": "miesiąc",
"months": "miesięcy",
"name": "Nazwa", "name": "Nazwa",
"orderClosed": "Zamówienie zostało zamknięte", "orderClosed": "Zamówienie zostało zamknięte",
"orderList": "Lista zamówień", "orderList": "Lista zamówień",

View File

@ -1,11 +1,15 @@
{ {
"Day": "Dzień",
"Hour": "Godzina",
"Minute": "Minuta",
"Month": "Miesiąc",
"Year": "Rok",
"all": "Wszystko", "all": "Wszystko",
"billing": { "billing": {
"billingTitle": "Rachunek za produkt", "billingTitle": "Rachunek za produkt",
"couponDiscount": "Zniżka z kodu rabatowego", "couponDiscount": "Zniżka z kodu rabatowego",
"duration": "Czas trwania pakietu", "duration": "Czas trwania pakietu",
"fee": "Opłata manipulacyjna", "fee": "Opłata manipulacyjna",
"months": "miesiące",
"price": "Cena", "price": "Cena",
"productDiscount": "Zniżka na produkt", "productDiscount": "Zniżka na produkt",
"total": "Suma" "total": "Suma"
@ -25,7 +29,6 @@
"stripe_alipay": "Stripe (Alipay)", "stripe_alipay": "Stripe (Alipay)",
"stripe_wechat_pay": "Stripe (WeChat)" "stripe_wechat_pay": "Stripe (WeChat)"
}, },
"perMonth": "miesiąc",
"productDescription": "Opis produktu", "productDescription": "Opis produktu",
"products": "Produkty" "products": "Produkty"
} }

View File

@ -1,4 +1,9 @@
{ {
"Day": "Dia",
"Hour": "Hora",
"Minute": "Minuto",
"Month": "Mês",
"Year": "Ano",
"balanceRecharge": "Recarga de Saldo", "balanceRecharge": "Recarga de Saldo",
"buyNow": "Compre Agora", "buyNow": "Compre Agora",
"buySubscription": "Comprar Assinatura", "buySubscription": "Comprar Assinatura",
@ -16,8 +21,6 @@
"stripe_alipay": "Stripe (Alipay)", "stripe_alipay": "Stripe (Alipay)",
"stripe_wechat_pay": "Stripe (WeChat)" "stripe_wechat_pay": "Stripe (WeChat)"
}, },
"month": "mês",
"months": "meses",
"name": "nome", "name": "nome",
"orderClosed": "Pedido encerrado", "orderClosed": "Pedido encerrado",
"orderList": "Lista de Pedidos", "orderList": "Lista de Pedidos",

View File

@ -1,11 +1,15 @@
{ {
"Day": "Dia",
"Hour": "Hora",
"Minute": "Minuto",
"Month": "Mês",
"Year": "Ano",
"all": "todos", "all": "todos",
"billing": { "billing": {
"billingTitle": "Fatura do Produto", "billingTitle": "Fatura do Produto",
"couponDiscount": "Desconto do Cupom", "couponDiscount": "Desconto do Cupom",
"duration": "Duração do Pacote", "duration": "Duração do Pacote",
"fee": "Taxa de Serviço", "fee": "Taxa de Serviço",
"months": "meses",
"price": "Preço", "price": "Preço",
"productDiscount": "Desconto do Produto", "productDiscount": "Desconto do Produto",
"total": "Preço Total" "total": "Preço Total"
@ -25,7 +29,6 @@
"stripe_alipay": "Stripe (Alipay)", "stripe_alipay": "Stripe (Alipay)",
"stripe_wechat_pay": "Stripe (WeChat)" "stripe_wechat_pay": "Stripe (WeChat)"
}, },
"perMonth": "mês",
"productDescription": "Descrição do produto", "productDescription": "Descrição do produto",
"products": "produtos" "products": "produtos"
} }

View File

@ -1,4 +1,9 @@
{ {
"Day": "Zi",
"Hour": "Oră",
"Minute": "Minută",
"Month": "Lună",
"Year": "An",
"balanceRecharge": "Reîncărcare sold", "balanceRecharge": "Reîncărcare sold",
"buyNow": "Cumpără acum", "buyNow": "Cumpără acum",
"buySubscription": "Cumpără abonament", "buySubscription": "Cumpără abonament",
@ -16,8 +21,6 @@
"stripe_alipay": "Stripe (Alipay)", "stripe_alipay": "Stripe (Alipay)",
"stripe_wechat_pay": "Stripe (WeChat)" "stripe_wechat_pay": "Stripe (WeChat)"
}, },
"month": "lună",
"months": "luni",
"name": "Nume", "name": "Nume",
"orderClosed": "Comanda a fost închisă", "orderClosed": "Comanda a fost închisă",
"orderList": "Listă de comenzi", "orderList": "Listă de comenzi",

View File

@ -1,11 +1,15 @@
{ {
"Day": "Zi",
"Hour": "Oră",
"Minute": "Minut",
"Month": "Lună",
"Year": "An",
"all": "Toate", "all": "Toate",
"billing": { "billing": {
"billingTitle": "Factură produs", "billingTitle": "Factură produs",
"couponDiscount": "Reducere cupon", "couponDiscount": "Reducere cupon",
"duration": "Durata pachetului", "duration": "Durata pachetului",
"fee": "Taxă de procesare", "fee": "Taxă de procesare",
"months": "luni",
"price": "Preț", "price": "Preț",
"productDiscount": "Reducere produs", "productDiscount": "Reducere produs",
"total": "Total" "total": "Total"
@ -25,7 +29,6 @@
"stripe_alipay": "Stripe (Alipay)", "stripe_alipay": "Stripe (Alipay)",
"stripe_wechat_pay": "Stripe (WeChat)" "stripe_wechat_pay": "Stripe (WeChat)"
}, },
"perMonth": "lună",
"productDescription": "Descrierea produsului", "productDescription": "Descrierea produsului",
"products": "produse" "products": "produse"
} }

View File

@ -1,4 +1,9 @@
{ {
"Day": "День",
"Hour": "Час",
"Minute": "минута",
"Month": "Месяц",
"Year": "Год",
"balanceRecharge": "Пополнение баланса", "balanceRecharge": "Пополнение баланса",
"buyNow": "Купить сейчас", "buyNow": "Купить сейчас",
"buySubscription": "Купить подписку", "buySubscription": "Купить подписку",
@ -16,8 +21,6 @@
"stripe_alipay": "Stripe (Alipay)", "stripe_alipay": "Stripe (Alipay)",
"stripe_wechat_pay": "Stripe (WeChat)" "stripe_wechat_pay": "Stripe (WeChat)"
}, },
"month": "месяц",
"months": "месяцы",
"name": "название", "name": "название",
"orderClosed": "Заказ закрыт", "orderClosed": "Заказ закрыт",
"orderList": "Список заказов", "orderList": "Список заказов",

View File

@ -1,11 +1,15 @@
{ {
"Day": "День",
"Hour": "Час",
"Minute": "минута",
"Month": "Месяц",
"Year": "Год",
"all": "все", "all": "все",
"billing": { "billing": {
"billingTitle": "Счет за товар", "billingTitle": "Счет за товар",
"couponDiscount": "Скидка по промокоду", "couponDiscount": "Скидка по промокоду",
"duration": "Продолжительность пакета", "duration": "Продолжительность пакета",
"fee": "Комиссия", "fee": "Комиссия",
"months": "месяцев",
"price": "Цена", "price": "Цена",
"productDiscount": "Скидка на товар", "productDiscount": "Скидка на товар",
"total": "Итоговая цена" "total": "Итоговая цена"
@ -25,7 +29,6 @@
"stripe_alipay": "Stripe(Alipay)", "stripe_alipay": "Stripe(Alipay)",
"stripe_wechat_pay": "Stripe(WeChat)" "stripe_wechat_pay": "Stripe(WeChat)"
}, },
"perMonth": "месяц",
"productDescription": "Описание товара", "productDescription": "Описание товара",
"products": "товары" "products": "товары"
} }

View File

@ -1,4 +1,9 @@
{ {
"Day": "วัน",
"Hour": "ชั่วโมง",
"Minute": "นาที",
"Month": "เดือน",
"Year": "ปี",
"balanceRecharge": "เติมเงินยอดคงเหลือ", "balanceRecharge": "เติมเงินยอดคงเหลือ",
"buyNow": "ซื้อทันที", "buyNow": "ซื้อทันที",
"buySubscription": "ซื้อการสมัครสมาชิก", "buySubscription": "ซื้อการสมัครสมาชิก",
@ -16,8 +21,6 @@
"stripe_alipay": "Stripe (อาลีเพย์)", "stripe_alipay": "Stripe (อาลีเพย์)",
"stripe_wechat_pay": "Stripe (วีแชท)" "stripe_wechat_pay": "Stripe (วีแชท)"
}, },
"month": "เดือน",
"months": "เดือน",
"name": "ชื่อ", "name": "ชื่อ",
"orderClosed": "คำสั่งซื้อถูกปิดแล้ว", "orderClosed": "คำสั่งซื้อถูกปิดแล้ว",
"orderList": "รายการสั่งซื้อ", "orderList": "รายการสั่งซื้อ",

View File

@ -1,11 +1,15 @@
{ {
"Day": "วัน",
"Hour": "ชั่วโมง",
"Minute": "นาที",
"Month": "เดือน",
"Year": "ปี",
"all": "ทั้งหมด", "all": "ทั้งหมด",
"billing": { "billing": {
"billingTitle": "ใบแจ้งหนี้สินค้า", "billingTitle": "ใบแจ้งหนี้สินค้า",
"couponDiscount": "ส่วนลดคูปอง", "couponDiscount": "ส่วนลดคูปอง",
"duration": "ระยะเวลาแพ็กเกจ", "duration": "ระยะเวลาแพ็กเกจ",
"fee": "ค่าธรรมเนียม", "fee": "ค่าธรรมเนียม",
"months": "เดือน",
"price": "ราคา", "price": "ราคา",
"productDiscount": "ส่วนลดสินค้า", "productDiscount": "ส่วนลดสินค้า",
"total": "ราคารวม" "total": "ราคารวม"
@ -25,7 +29,6 @@
"stripe_alipay": "Stripe (อาลีเพย์)", "stripe_alipay": "Stripe (อาลีเพย์)",
"stripe_wechat_pay": "Stripe (วีแชท)" "stripe_wechat_pay": "Stripe (วีแชท)"
}, },
"perMonth": "เดือน",
"productDescription": "รายละเอียดสินค้า", "productDescription": "รายละเอียดสินค้า",
"products": "สินค้า" "products": "สินค้า"
} }

View File

@ -1,4 +1,9 @@
{ {
"Day": "Gün",
"Hour": "Saat",
"Minute": "Dakika",
"Month": "Ay",
"Year": "Yıl",
"balanceRecharge": "Bakiye Yükleme", "balanceRecharge": "Bakiye Yükleme",
"buyNow": "Şimdi Satın Al", "buyNow": "Şimdi Satın Al",
"buySubscription": "Abonelik Satın Al", "buySubscription": "Abonelik Satın Al",
@ -16,8 +21,6 @@
"stripe_alipay": "Stripe(Alipay)", "stripe_alipay": "Stripe(Alipay)",
"stripe_wechat_pay": "Stripe(WeChat)" "stripe_wechat_pay": "Stripe(WeChat)"
}, },
"month": "ay",
"months": "aylar",
"name": "Adı", "name": "Adı",
"orderClosed": "Sipariş kapatıldı", "orderClosed": "Sipariş kapatıldı",
"orderList": "Sipariş Listesi", "orderList": "Sipariş Listesi",

View File

@ -1,11 +1,15 @@
{ {
"Day": "Gün",
"Hour": "Saat",
"Minute": "Dakika",
"Month": "Ay",
"Year": "Yıl",
"all": "Tümü", "all": "Tümü",
"billing": { "billing": {
"billingTitle": "Ürün Faturası", "billingTitle": "Ürün Faturası",
"couponDiscount": "Kupon İndirimi", "couponDiscount": "Kupon İndirimi",
"duration": "Paket Süresi", "duration": "Paket Süresi",
"fee": "İşlem Ücreti", "fee": "İşlem Ücreti",
"months": "Ay",
"price": "Fiyat", "price": "Fiyat",
"productDiscount": "Ürün İndirimi", "productDiscount": "Ürün İndirimi",
"total": "Toplam Fiyat" "total": "Toplam Fiyat"
@ -25,7 +29,6 @@
"stripe_alipay": "Stripe(Alipay)", "stripe_alipay": "Stripe(Alipay)",
"stripe_wechat_pay": "Stripe(WeChat)" "stripe_wechat_pay": "Stripe(WeChat)"
}, },
"perMonth": "ay",
"productDescription": "Ürün Açıklaması", "productDescription": "Ürün Açıklaması",
"products": "ürünler" "products": "ürünler"
} }

View File

@ -1,4 +1,9 @@
{ {
"Day": "День",
"Hour": "Година",
"Minute": "Хвилина",
"Month": "Місяць",
"Year": "Рік",
"balanceRecharge": "Поповнення балансу", "balanceRecharge": "Поповнення балансу",
"buyNow": "Купити зараз", "buyNow": "Купити зараз",
"buySubscription": "Придбати підписку", "buySubscription": "Придбати підписку",
@ -16,8 +21,6 @@
"stripe_alipay": "Stripe(Alipay)", "stripe_alipay": "Stripe(Alipay)",
"stripe_wechat_pay": "Stripe(WeChat)" "stripe_wechat_pay": "Stripe(WeChat)"
}, },
"month": "місяць",
"months": "місяців",
"name": "Назва", "name": "Назва",
"orderClosed": "Замовлення закрито", "orderClosed": "Замовлення закрито",
"orderList": "Список замовлень", "orderList": "Список замовлень",

View File

@ -1,11 +1,15 @@
{ {
"Day": "День",
"Hour": "Година",
"Minute": "хвилина",
"Month": "Місяць",
"Year": "Рік",
"all": "всі", "all": "всі",
"billing": { "billing": {
"billingTitle": "Рахунок за товар", "billingTitle": "Рахунок за товар",
"couponDiscount": "Знижка за промокодом", "couponDiscount": "Знижка за промокодом",
"duration": "Тривалість пакету", "duration": "Тривалість пакету",
"fee": "Комісія", "fee": "Комісія",
"months": "місяців",
"price": "Ціна", "price": "Ціна",
"productDiscount": "Знижка на товар", "productDiscount": "Знижка на товар",
"total": "Загальна сума" "total": "Загальна сума"
@ -25,7 +29,6 @@
"stripe_alipay": "Stripe (Alipay)", "stripe_alipay": "Stripe (Alipay)",
"stripe_wechat_pay": "Stripe (WeChat)" "stripe_wechat_pay": "Stripe (WeChat)"
}, },
"perMonth": "місяць",
"productDescription": "Опис товару", "productDescription": "Опис товару",
"products": "товари" "products": "товари"
} }

View File

@ -1,4 +1,9 @@
{ {
"Day": "Ngày",
"Hour": "Giờ",
"Minute": "Phút",
"Month": "Tháng",
"Year": "Năm",
"balanceRecharge": "Nạp tiền số dư", "balanceRecharge": "Nạp tiền số dư",
"buyNow": "Mua ngay", "buyNow": "Mua ngay",
"buySubscription": "Mua đăng ký", "buySubscription": "Mua đăng ký",
@ -16,8 +21,6 @@
"stripe_alipay": "Stripe (Alipay)", "stripe_alipay": "Stripe (Alipay)",
"stripe_wechat_pay": "Stripe (WeChat)" "stripe_wechat_pay": "Stripe (WeChat)"
}, },
"month": "tháng",
"months": "tháng",
"name": "Tên", "name": "Tên",
"orderClosed": "Đơn hàng đã đóng", "orderClosed": "Đơn hàng đã đóng",
"orderList": "Danh sách đơn hàng", "orderList": "Danh sách đơn hàng",

View File

@ -1,11 +1,15 @@
{ {
"Day": "Ngày",
"Hour": "Giờ",
"Minute": "Phút",
"Month": "Tháng",
"Year": "Năm",
"all": "Tất cả", "all": "Tất cả",
"billing": { "billing": {
"billingTitle": "Hóa đơn sản phẩm", "billingTitle": "Hóa đơn sản phẩm",
"couponDiscount": "Ưu đãi mã giảm giá", "couponDiscount": "Ưu đãi mã giảm giá",
"duration": "Thời gian gói", "duration": "Thời gian gói",
"fee": "Phí dịch vụ", "fee": "Phí dịch vụ",
"months": "tháng",
"price": "Giá", "price": "Giá",
"productDiscount": "Giảm giá sản phẩm", "productDiscount": "Giảm giá sản phẩm",
"total": "Tổng giá" "total": "Tổng giá"
@ -25,7 +29,6 @@
"stripe_alipay": "Stripe (Alipay)", "stripe_alipay": "Stripe (Alipay)",
"stripe_wechat_pay": "Stripe (WeChat)" "stripe_wechat_pay": "Stripe (WeChat)"
}, },
"perMonth": "tháng",
"productDescription": "Mô tả sản phẩm", "productDescription": "Mô tả sản phẩm",
"products": "Sản phẩm" "products": "Sản phẩm"
} }

View File

@ -1,4 +1,9 @@
{ {
"Day": "天",
"Hour": "时",
"Minute": "分",
"Month": "月",
"Year": "年",
"balanceRecharge": "余额充值", "balanceRecharge": "余额充值",
"buyNow": "立即购买", "buyNow": "立即购买",
"buySubscription": "购买订阅", "buySubscription": "购买订阅",
@ -16,8 +21,6 @@
"stripe_alipay": "Stripe(支付宝)", "stripe_alipay": "Stripe(支付宝)",
"stripe_wechat_pay": "Stripe(微信)" "stripe_wechat_pay": "Stripe(微信)"
}, },
"month": "个月",
"months": "个月",
"name": "名称", "name": "名称",
"orderClosed": "订单已关闭", "orderClosed": "订单已关闭",
"orderList": "订单列表", "orderList": "订单列表",

View File

@ -1,11 +1,15 @@
{ {
"Day": "天",
"Hour": "时",
"Minute": "分",
"Month": "月",
"Year": "年",
"all": "全部", "all": "全部",
"billing": { "billing": {
"billingTitle": "商品账单", "billingTitle": "商品账单",
"couponDiscount": "折扣码优惠", "couponDiscount": "折扣码优惠",
"duration": "套餐时长", "duration": "套餐时长",
"fee": "手续费", "fee": "手续费",
"months": "个月",
"price": "价格", "price": "价格",
"productDiscount": "商品折扣", "productDiscount": "商品折扣",
"total": "总价" "total": "总价"
@ -25,7 +29,6 @@
"stripe_alipay": "Stripe(支付宝)", "stripe_alipay": "Stripe(支付宝)",
"stripe_wechat_pay": "Stripe(微信)" "stripe_wechat_pay": "Stripe(微信)"
}, },
"perMonth": "月",
"productDescription": "商品描述", "productDescription": "商品描述",
"products": "商品" "products": "商品"
} }

View File

@ -1,4 +1,9 @@
{ {
"Day": "日",
"Hour": "時",
"Minute": "分鐘",
"Month": "月",
"Year": "年",
"balanceRecharge": "餘額儲值", "balanceRecharge": "餘額儲值",
"buyNow": "立即購買", "buyNow": "立即購買",
"buySubscription": "購買訂閱", "buySubscription": "購買訂閱",
@ -16,8 +21,6 @@
"stripe_alipay": "Stripe(支付寶)", "stripe_alipay": "Stripe(支付寶)",
"stripe_wechat_pay": "Stripe(微信)" "stripe_wechat_pay": "Stripe(微信)"
}, },
"month": "個月",
"months": "個月",
"name": "名稱", "name": "名稱",
"orderClosed": "訂單已關閉", "orderClosed": "訂單已關閉",
"orderList": "訂單列表", "orderList": "訂單列表",

View File

@ -1,11 +1,15 @@
{ {
"Day": "日",
"Hour": "時",
"Minute": "分鐘",
"Month": "月",
"Year": "年",
"all": "全部", "all": "全部",
"billing": { "billing": {
"billingTitle": "商品帳單", "billingTitle": "商品帳單",
"couponDiscount": "折扣碼優惠", "couponDiscount": "折扣碼優惠",
"duration": "方案時長", "duration": "方案時長",
"fee": "手續費", "fee": "手續費",
"months": "個月",
"price": "價格", "price": "價格",
"productDiscount": "商品折扣", "productDiscount": "商品折扣",
"total": "總價" "total": "總價"
@ -25,7 +29,6 @@
"stripe_alipay": "Stripe(支付寶)", "stripe_alipay": "Stripe(支付寶)",
"stripe_wechat_pay": "Stripe(微信)" "stripe_wechat_pay": "Stripe(微信)"
}, },
"perMonth": "每月",
"productDescription": "商品描述", "productDescription": "商品描述",
"products": "產品" "products": "產品"
} }

View File

@ -4,6 +4,7 @@ declare namespace API {
title: string; title: string;
content: string; content: string;
enable: boolean; enable: boolean;
type: number;
created_at: number; created_at: number;
updated_at: number; updated_at: number;
}; };
@ -266,6 +267,7 @@ declare namespace API {
created_at: number; created_at: number;
updated_at: number; updated_at: number;
status: NodeStatus; status: NodeStatus;
sort: number;
}; };
type ServerGroup = { type ServerGroup = {
@ -296,11 +298,17 @@ declare namespace API {
site_logo: string; site_logo: string;
}; };
type SortItem = {
id: number;
sort: number;
};
type Subscribe = { type Subscribe = {
id: number; id: number;
name: string; name: string;
description: string; description: string;
unit_price: number; unit_price: number;
unit_time: string;
discount: SubscribeDiscount[]; discount: SubscribeDiscount[];
replacement: number; replacement: number;
inventory: number; inventory: number;
@ -325,7 +333,7 @@ declare namespace API {
}; };
type SubscribeDiscount = { type SubscribeDiscount = {
months: number; quantity: number;
discount: number; discount: number;
}; };

View File

@ -4,6 +4,7 @@ declare namespace API {
title: string; title: string;
content: string; content: string;
enable: boolean; enable: boolean;
type: number;
created_at: number; created_at: number;
updated_at: number; updated_at: number;
}; };
@ -399,6 +400,7 @@ declare namespace API {
created_at: number; created_at: number;
updated_at: number; updated_at: number;
status: NodeStatus; status: NodeStatus;
sort: number;
}; };
type ServerGroup = { type ServerGroup = {
@ -429,6 +431,11 @@ declare namespace API {
site_logo: string; site_logo: string;
}; };
type SortItem = {
id: number;
sort: number;
};
type StripePayment = { type StripePayment = {
method: string; method: string;
client_secret: string; client_secret: string;
@ -440,6 +447,7 @@ declare namespace API {
name: string; name: string;
description: string; description: string;
unit_price: number; unit_price: number;
unit_time: string;
discount: SubscribeDiscount[]; discount: SubscribeDiscount[];
replacement: number; replacement: number;
inventory: number; inventory: number;
@ -464,7 +472,7 @@ declare namespace API {
}; };
type SubscribeDiscount = { type SubscribeDiscount = {
months: number; quantity: number;
discount: number; discount: number;
}; };