feat(api): Add getClient API endpoint to retrieve subscription applications

This commit is contained in:
web 2025-08-13 07:35:58 -07:00
parent 641ed5ec36
commit 7a279e6e30
32 changed files with 1109 additions and 354 deletions

View File

@ -248,23 +248,7 @@ export function ProtocolForm() {
const handleEdit = (client: API.SubscribeApplication) => {
setEditingClient(client);
form.reset({
name: client.name,
description: client.description || '',
icon: client.icon || '',
user_agent: client.user_agent,
schema: client.proxy_template || '',
template: client.template || '',
output_format: client.output_format || '',
download_link: {
windows: '',
mac: '',
linux: '',
ios: '',
android: '',
harmony: '',
},
});
form.reset(client);
setOpen(true);
};
@ -302,7 +286,7 @@ export function ProtocolForm() {
if (editingClient) {
await updateSubscribeApplication({
...data,
proxy_template: data.schema || '',
proxy_template: '',
is_default: editingClient.is_default,
id: editingClient.id,
});
@ -310,7 +294,7 @@ export function ProtocolForm() {
} else {
await createSubscribeApplication({
...data,
proxy_template: data.schema || '',
proxy_template: '',
is_default: false,
});
toast.success(t('actions.createSuccess'));
@ -498,14 +482,82 @@ export function ProtocolForm() {
name='schema'
render={({ field }) => (
<FormItem>
<FormLabel>{t('form.fields.schema')}</FormLabel>
<FormLabel className='flex items-center gap-2'>
{t('form.fields.schema')}
<TooltipProvider>
<Tooltip>
<TooltipTrigger
onClick={(e) => {
e.preventDefault();
e.stopPropagation();
}}
>
<Icon
icon='mdi:help-circle-outline'
className='text-muted-foreground h-4 w-4'
/>
</TooltipTrigger>
<TooltipContent
side='right'
className='bg-secondary text-secondary-foreground max-w-md'
>
<div className='space-y-2 text-sm'>
<div className='font-medium'>
{t('form.descriptions.schema.title')}
</div>
<div>
<div className='font-medium'>
{t('form.descriptions.schema.variables')}
</div>
<ul className='ml-2 list-disc space-y-1 text-xs'>
<li>
<code className='rounded px-1'>{'${url}'}</code> -{' '}
{t('form.descriptions.schema.urlVariable')}
</li>
<li>
<code className='rounded px-1'>{'${name}'}</code> -{' '}
{t('form.descriptions.schema.nameVariable')}
</li>
</ul>
</div>
<div>
<div className='font-medium'>
{t('form.descriptions.schema.functions')}
</div>
<ul className='ml-2 list-disc space-y-1 text-xs'>
<li>
<code className='rounded px-1'>
{'${encodeURIComponent(...)}'}
</code>{' '}
- {t('form.descriptions.schema.urlEncoding')}
</li>
<li>
<code className='rounded px-1'>
{'${window.btoa(...)}'}
</code>{' '}
- {t('form.descriptions.schema.base64Encoding')}
</li>
<li>
<code className='rounded px-1'>
{'${JSON.stringify(...)}'}
</code>{' '}
- {t('form.descriptions.schema.jsonStringify')}
</li>
</ul>
</div>
</div>
</TooltipContent>
</Tooltip>
</TooltipProvider>
</FormLabel>
<FormControl>
<Input
placeholder='clash://install-config?url={url}&name={name}'
placeholder='clash://install-config?url=${url}&name=${name}'
{...field}
/>
</FormControl>
<FormDescription>{t('form.descriptions.schema')}</FormDescription>
<FormMessage />
</FormItem>
)}
@ -516,7 +568,82 @@ export function ProtocolForm() {
name='template'
render={({ field }) => (
<FormItem>
<FormLabel>{t('form.fields.template')}</FormLabel>
<FormLabel className='flex items-center gap-2'>
{t('form.fields.template')}
<TooltipProvider>
<Tooltip>
<TooltipTrigger
onClick={(e) => {
e.preventDefault();
e.stopPropagation();
}}
>
<Icon
icon='mdi:help-circle-outline'
className='text-muted-foreground h-4 w-4'
/>
</TooltipTrigger>
<TooltipContent
side='right'
className='bg-secondary text-secondary-foreground max-w-md'
>
<div className='space-y-2 text-sm'>
<div className='font-medium'>
{t('form.descriptions.template.title')}
</div>
<div>
<div className='font-medium'>
{t('form.descriptions.template.variables')}
</div>
<ul className='ml-2 list-disc space-y-1 text-xs'>
<li>
<code className='rounded px-1'>.SiteName</code> -{' '}
{t('form.descriptions.template.siteName')}
</li>
<li>
<code className='rounded px-1'>.SubscribeName</code> -{' '}
{t('form.descriptions.template.subscribeName')}
</li>
<li>
<code className='rounded px-1'>.Nodes</code> -{' '}
{t('form.descriptions.template.nodes')}
</li>
<li>
<code className='rounded px-1'>.UserInfo</code> -{' '}
{t('form.descriptions.template.userInfo')}
</li>
</ul>
</div>
<div>
<div className='font-medium'>
{t('form.descriptions.template.functions')}
</div>
<ul className='ml-2 list-disc space-y-1 text-xs'>
<li>
<code className='rounded px-1'>
{'{{range .Nodes}}...{{end}}'}
</code>{' '}
- {t('form.descriptions.template.range')}
</li>
<li>
<code className='rounded px-1'>
{'{{if .condition}}...{{end}}'}
</code>{' '}
- {t('form.descriptions.template.if')}
</li>
<li>
<code className='rounded px-1'>{'{{sprig_func}}'}</code> -{' '}
{t('form.descriptions.template.sprig')}
</li>
</ul>
</div>
</div>
</TooltipContent>
</Tooltip>
</TooltipProvider>
</FormLabel>
<FormControl>
<GoTemplateEditor
schema={{
@ -611,7 +738,6 @@ export function ProtocolForm() {
onChange={(value) => field.onChange(value)}
/>
</FormControl>
<FormDescription>{t('form.descriptions.template')}</FormDescription>
<FormMessage />
</FormItem>
)}

View File

@ -22,11 +22,7 @@ export const navs = [
url: '/dashboard/payment',
icon: 'flat-color-icons:currency-exchange',
},
{
title: 'Subscribe Config',
url: '/dashboard/subscribe',
icon: 'flat-color-icons:ruler',
},
{
title: 'ADS Config',
url: '/dashboard/ads',
@ -42,6 +38,11 @@ export const navs = [
{
title: 'Server',
items: [
{
title: 'Subscribe Config',
url: '/dashboard/subscribe',
icon: 'flat-color-icons:ruler',
},
{
title: 'Server Management',
url: '/dashboard/server',

View File

@ -1,27 +1,27 @@
{
"actions": {
"add": "Přidat",
"batchDelete": "Hromadné mazání",
"batchDelete": "Hromadné smazání",
"batchDeleteSuccess": "Úspěšně smazáno {count} klientů",
"batchDeleteWarning": "Opravdu chcete smazat vybrané {count} klienty?",
"cancel": "Zrušit",
"confirm": "Potvrdit",
"confirmDelete": "Potvrdit mazání",
"confirmDelete": "Potvrdit smazání",
"createSuccess": "Úspěšně vytvořeno",
"delete": "Smazat",
"deleteFailed": "Mazání selhalo",
"deleteFailed": "Smazání se nezdařilo",
"deleteSuccess": "Úspěšně smazáno",
"deleteWarning": "Tuto operaci nelze vrátit zpět. Opravdu chcete smazat tohoto klienta?",
"edit": "Upravit",
"save": "Uložit",
"saveFailed": "Uložení selhalo",
"saveFailed": "Uložení se nezdařilo",
"update": "Aktualizovat",
"updateSuccess": "Úspěšně aktualizováno"
},
"config": {
"description": "Spravujte nastavení systému předplatného",
"singleSubscriptionMode": "Režim jednoho předplatného",
"singleSubscriptionModeDescription": "Omezit uživatele na jedno aktivní předplatné. Stávající předplatná nejsou ovlivněna",
"singleSubscriptionModeDescription": "Omezit uživatele na jedno aktivní předplatné. Existující předplatná nejsou ovlivněna",
"subscriptionDomain": "Doména předplatného",
"subscriptionDomainDescription": "Vlastní doména pro odkazy na předplatné",
"subscriptionDomainPlaceholder": "Zadejte doménu předplatného, jednu na řádek",
@ -29,40 +29,61 @@
"subscriptionPathDescription": "Vlastní cesta pro koncové body předplatného (lepší výkon po restartu systému)",
"subscriptionPathPlaceholder": "Zadejte cestu předplatného",
"title": "Konfigurace předplatného",
"updateError": "Aktualizace selhala",
"updateSuccess": "Nastavení bylo úspěšně aktualizováno",
"userAgentLimit": "Omezení {userAgent}",
"updateError": "Aktualizace se nezdařila",
"updateSuccess": "Nastavení byla úspěšně aktualizována",
"userAgentLimit": "{userAgent} Omezení",
"userAgentLimitDescription": "Povolit omezení přístupu na základě {userAgent}",
"userAgentList": "Whitelist {userAgent}",
"userAgentListDescription": "Povolené {userAgent} pro přístup k odběru, jeden na řádek. Konfigurovaná aplikace {userAgent} bude automaticky zahrnuta",
"userAgentListPlaceholder": "Zadejte povolené {userAgent}, jeden na řádek",
"userAgentList": "{userAgent} Bílá listina",
"userAgentListDescription": "Povolené {userAgent} pro přístup k předplatnému, jedna na řádek. Konfigurovaná aplikace {userAgent} bude automaticky zahrnuta",
"userAgentListPlaceholder": "Zadejte povolené {userAgent}, jedna na řádek",
"wildcardResolution": "Řešení zástupných znaků",
"wildcardResolutionDescription": "Povolit řešení domén se zástupnými znaky pro předplatná"
"wildcardResolutionDescription": "Povolit řešení domény se zástupnými znaky pro předplatná"
},
"form": {
"addTitle": "Přidat klienta",
"descriptions": {
"description": "Podrobný popis klienta",
"downloadLink": "URL pro stažení platformy",
"downloadLink": "odkaz na stažení platformy",
"icon": "URL ikony nebo base64 kódování",
"name": "Zobrazovaný název klienta",
"name": "Název zobrazení klienta",
"outputFormat": "Formát konfiguračního souboru předplatného",
"proxyTemplate": "Šablona odkazu na předplatné, podporuje proměnné: {{variables}}",
"template": "Šablona konfigurace předplatného, podporuje různé proměnné",
"userAgentPrefix": "Identifikátor klienta pro rozlišení různých klientů."
"schema": {
"base64Encoding": "Base64 kódování",
"functions": "Podporuje funkce:",
"jsonStringify": "JSON objekt na řetězec",
"nameVariable": "název webu",
"title": "Šablona URL schématu",
"urlEncoding": "URL kódování",
"urlVariable": "URL předplatného",
"variables": "Podporuje proměnné:"
},
"template": {
"description": "Použijte syntaxi Go šablony k generování konfiguračních souborů předplatného",
"functions": "Funkce šablony:",
"if": "podmínkové příkazy",
"nodes": "seznam proxy uzlů",
"range": "iterovat pole",
"siteName": "název webu",
"sprig": "Knihovna funkcí Sprig (zpracování řetězců, data atd.)",
"subscribeName": "název předplatného",
"title": "Syntaxe Go šablony",
"userInfo": "uživatelské informace (provoz, expirace atd.)",
"variables": "Dostupné proměnné:"
},
"userAgentPrefix": "Identifikátor klienta pro rozlišení různých klientů"
},
"editTitle": "Upravit klienta",
"fields": {
"description": "Popis",
"icon": "Ikona",
"name": "Název",
"outputFormat": "Výstupní formát",
"proxyTemplate": "Odkaz na předplatné",
"template": "Konfigurační šablona"
"outputFormat": "Formát výstupu",
"schema": "URL schéma",
"template": "Šablona souboru předplatného"
},
"tabs": {
"basic": "Základní informace",
"download": "Stažení",
"download": "Stahování",
"template": "Šablony"
},
"validation": {
@ -72,8 +93,9 @@
},
"outputFormats": {
"base64": "Base64",
"conf": "CONF",
"json": "JSON",
"plain": "Prostý text",
"plain": "Čistý text",
"yaml": "YAML"
},
"platforms": {
@ -92,7 +114,7 @@
"default": "Výchozí",
"description": "Popis",
"name": "Název klienta",
"outputFormat": "Výstupní formát",
"outputFormat": "Formát výstupu",
"supportedPlatforms": "Podporované platformy"
}
}

View File

@ -2,7 +2,7 @@
"actions": {
"add": "Hinzufügen",
"batchDelete": "Massenlöschung",
"batchDeleteSuccess": "{count} Clients erfolgreich gelöscht",
"batchDeleteSuccess": "Erfolgreich {count} Clients gelöscht",
"batchDeleteWarning": "Sind Sie sicher, dass Sie die ausgewählten {count} Clients löschen möchten?",
"cancel": "Abbrechen",
"confirm": "Bestätigen",
@ -11,7 +11,7 @@
"delete": "Löschen",
"deleteFailed": "Löschen fehlgeschlagen",
"deleteSuccess": "Erfolgreich gelöscht",
"deleteWarning": "Dieser Vorgang kann nicht rückgängig gemacht werden. Sind Sie sicher, dass Sie diesen Client löschen möchten?",
"deleteWarning": "Diese Aktion kann nicht rückgängig gemacht werden. Sind Sie sicher, dass Sie diesen Client löschen möchten?",
"edit": "Bearbeiten",
"save": "Speichern",
"saveFailed": "Speichern fehlgeschlagen",
@ -22,22 +22,22 @@
"description": "Verwalten Sie die Systemeinstellungen für Abonnements",
"singleSubscriptionMode": "Einzelnes Abonnement",
"singleSubscriptionModeDescription": "Benutzer auf ein aktives Abonnement beschränken. Bestehende Abonnements bleiben unberührt",
"subscriptionDomain": "Abonnementdomäne",
"subscriptionDomainDescription": "Benutzerdefinierte Domäne für Abonnementlinks",
"subscriptionDomainPlaceholder": "Geben Sie die Abonnementdomäne ein, eine pro Zeile",
"subscriptionPath": "Abonnementpfad",
"subscriptionPathDescription": "Benutzerdefinierter Pfad für Abonnementendpunkte (bessere Leistung nach Systemneustart)",
"subscriptionPathPlaceholder": "Geben Sie den Abonnementpfad ein",
"subscriptionDomain": "Abonnement-Domain",
"subscriptionDomainDescription": "Benutzerdefinierte Domain für Abonnement-Links",
"subscriptionDomainPlaceholder": "Geben Sie die Abonnement-Domain ein, eine pro Zeile",
"subscriptionPath": "Abonnement-Pfad",
"subscriptionPathDescription": "Benutzerdefinierter Pfad für Abonnement-Endpunkte (bessere Leistung nach Systemneustart)",
"subscriptionPathPlaceholder": "Geben Sie den Abonnement-Pfad ein",
"title": "Abonnementkonfiguration",
"updateError": "Aktualisierung fehlgeschlagen",
"updateSuccess": "Einstellungen erfolgreich aktualisiert",
"userAgentLimit": "{userAgent} Einschränkung",
"userAgentLimitDescription": "Zugriffsrestriktionen basierend auf {userAgent} aktivieren",
"userAgentLimitDescription": "Zugriffsbeschränkungen basierend auf {userAgent} aktivieren",
"userAgentList": "{userAgent} Whitelist",
"userAgentListDescription": "Erlaubte {userAgent} für den Abonnementzugang, jeweils eine pro Zeile. Konfigurierte Anwendung {userAgent} wird automatisch hinzugefügt",
"userAgentListPlaceholder": "Erlaubte {userAgent} eingeben, jeweils eine pro Zeile",
"userAgentListDescription": "Erlaubte {userAgent} für den Abonnementzugriff, eine pro Zeile. Konfigurierte Anwendung {userAgent} wird automatisch hinzugefügt",
"userAgentListPlaceholder": "Geben Sie erlaubte {userAgent} ein, eine pro Zeile",
"wildcardResolution": "Wildcard-Auflösung",
"wildcardResolutionDescription": "Aktivieren Sie die Wildcard-Domänenauflösung für Abonnements"
"wildcardResolutionDescription": "Aktivieren Sie die Wildcard-Domainauflösung für Abonnements"
},
"form": {
"addTitle": "Client hinzufügen",
@ -47,8 +47,29 @@
"icon": "Icon-URL oder Base64-Codierung",
"name": "Anzeigename des Clients",
"outputFormat": "Format der Abonnementkonfigurationsdatei",
"proxyTemplate": "Vorlage für den Abonnementlink, unterstützt Variablen: ",
"template": "Abonnementkonfigurationsvorlage, unterstützt verschiedene Variablen",
"schema": {
"base64Encoding": "Base64-Codierung",
"functions": "Unterstützt Funktionen:",
"jsonStringify": "JSON-Objekt in String",
"nameVariable": "Seitenname",
"title": "URL-Schema-Vorlage",
"urlEncoding": "URL-Codierung",
"urlVariable": "Abonnement-URL",
"variables": "Unterstützt Variablen:"
},
"template": {
"description": "Verwenden Sie die Go-Template-Syntax zur Erstellung von Abonnementkonfigurationsdateien",
"functions": "Template-Funktionen:",
"if": "Bedingte Anweisungen",
"nodes": "Proxy-Knotenliste",
"range": "Arrays durchlaufen",
"siteName": "Seitenname",
"sprig": "Sprig-Funktionsbibliothek (Stringverarbeitung, Daten usw.)",
"subscribeName": "Abonnementname",
"title": "Go-Template-Syntax",
"userInfo": "Benutzerinformationen (Verkehr, Ablaufdatum usw.)",
"variables": "Verfügbare Variablen:"
},
"userAgentPrefix": "Client-Identifikator zur Unterscheidung verschiedener Clients"
},
"editTitle": "Client bearbeiten",
@ -57,8 +78,8 @@
"icon": "Icon",
"name": "Name",
"outputFormat": "Ausgabeformat",
"proxyTemplate": "Abonnementlink",
"template": "Konfigurationsvorlage"
"schema": "URL-Schema",
"template": "Abonnementdateivorlage"
},
"tabs": {
"basic": "Basisinformationen",
@ -72,8 +93,9 @@
},
"outputFormats": {
"base64": "Base64",
"conf": "CONF",
"json": "JSON",
"plain": "Plain Text",
"plain": "Reiner Text",
"yaml": "YAML"
},
"platforms": {
@ -85,7 +107,7 @@
"windows": "Windows"
},
"protocol": {
"title": "Client-Verwaltung"
"title": "Client-Management"
},
"table": {
"columns": {

View File

@ -61,8 +61,29 @@
"userAgentPrefix": "Client identifier for distinguishing different clients",
"description": "Detailed client description",
"outputFormat": "Subscription configuration file format",
"schema": "URL Schema template, supports variables: '{url}' subscription URL, '{name}' site name",
"template": "Subscription file template, supports various variables",
"schema": {
"title": "URL Schema template",
"variables": "Supports variables:",
"urlVariable": "subscription URL",
"nameVariable": "site name",
"functions": "Supports functions:",
"urlEncoding": "URL encoding",
"base64Encoding": "Base64 encoding",
"jsonStringify": "JSON object to string"
},
"template": {
"title": "Go Template Syntax",
"description": "Use Go template syntax to generate subscription configuration files",
"variables": "Available variables:",
"siteName": "site name",
"subscribeName": "subscription name",
"nodes": "proxy nodes list",
"userInfo": "user info (traffic, expiry, etc.)",
"functions": "Template functions:",
"range": "iterate arrays",
"if": "conditional statements",
"sprig": "Sprig function library (string processing, dates, etc.)"
},
"downloadLink": "platform download URL"
},
"validation": {

View File

@ -2,7 +2,7 @@
"actions": {
"add": "Agregar",
"batchDelete": "Eliminar en lote",
"batchDeleteSuccess": "Se eliminaron con éxito {count} clientes",
"batchDeleteSuccess": "Se eliminaron correctamente {count} clientes",
"batchDeleteWarning": "¿Está seguro de que desea eliminar los {count} clientes seleccionados?",
"cancel": "Cancelar",
"confirm": "Confirmar",
@ -34,7 +34,7 @@
"userAgentLimit": "Restricción de {userAgent}",
"userAgentLimitDescription": "Habilitar restricciones de acceso basadas en {userAgent}",
"userAgentList": "Lista blanca de {userAgent}",
"userAgentListDescription": "{userAgent} permitidos para acceso a la suscripción, uno por línea. La aplicación configurada {userAgent} se incluirá automáticamente",
"userAgentListDescription": "Permitir {userAgent} para acceso a suscripción, uno por línea. La aplicación configurada {userAgent} se incluirá automáticamente",
"userAgentListPlaceholder": "Ingrese {userAgent} permitidos, uno por línea",
"wildcardResolution": "Resolución de comodines",
"wildcardResolutionDescription": "Habilitar resolución de dominio comodín para suscripciones"
@ -47,9 +47,30 @@
"icon": "URL del ícono o codificación base64",
"name": "Nombre para mostrar del cliente",
"outputFormat": "Formato del archivo de configuración de suscripción",
"proxyTemplate": "Plantilla de enlace de suscripción, admite variables: ",
"template": "Plantilla de configuración de suscripción, admite varias variables",
"userAgentPrefix": "Identificador del cliente para distinguir diferentes clientes."
"schema": {
"base64Encoding": "Codificación Base64",
"functions": "Soporta funciones:",
"jsonStringify": "Objeto JSON a cadena",
"nameVariable": "nombre del sitio",
"title": "Plantilla de esquema de URL",
"urlEncoding": "Codificación de URL",
"urlVariable": "URL de suscripción",
"variables": "Soporta variables:"
},
"template": {
"description": "Utilizar la sintaxis de plantilla Go para generar archivos de configuración de suscripción",
"functions": "Funciones de plantilla:",
"if": "declaraciones condicionales",
"nodes": "lista de nodos proxy",
"range": "iterar arreglos",
"siteName": "nombre del sitio",
"sprig": "Biblioteca de funciones Sprig (procesamiento de cadenas, fechas, etc.)",
"subscribeName": "nombre de la suscripción",
"title": "Sintaxis de Plantilla Go",
"userInfo": "información del usuario (tráfico, expiración, etc.)",
"variables": "Variables disponibles:"
},
"userAgentPrefix": "Identificador del cliente para distinguir diferentes clientes"
},
"editTitle": "Editar Cliente",
"fields": {
@ -57,8 +78,8 @@
"icon": "Ícono",
"name": "Nombre",
"outputFormat": "Formato de Salida",
"proxyTemplate": "Enlace de Suscripción",
"template": "Plantilla de Configuración"
"schema": "Esquema de URL",
"template": "Plantilla de Archivo de Suscripción"
},
"tabs": {
"basic": "Información Básica",
@ -66,12 +87,13 @@
"template": "Plantillas"
},
"validation": {
"nameRequired": "El nombre del cliente es obligatorio",
"userAgentRequiredSuffix": "es obligatorio"
"nameRequired": "Se requiere el nombre del cliente",
"userAgentRequiredSuffix": "es requerido"
}
},
"outputFormats": {
"base64": "Base64",
"conf": "CONF",
"json": "JSON",
"plain": "Texto Plano",
"yaml": "YAML"

View File

@ -33,10 +33,10 @@
"updateSuccess": "Configuraciones actualizadas exitosamente",
"userAgentLimit": "Restricción de {userAgent}",
"userAgentLimitDescription": "Habilitar restricciones de acceso basadas en {userAgent}",
"userAgentList": "Lista blanca de {userAgent}",
"userAgentListDescription": "{userAgent} permitidos para acceso a suscripciones, uno por línea. La aplicación configurada {userAgent} se incluirá automáticamente",
"userAgentListPlaceholder": "Ingresa {userAgent} permitidos, uno por línea",
"wildcardResolution": "Resolución de Comodines",
"userAgentList": "Lista Blanca de {userAgent}",
"userAgentListDescription": "Permitir {userAgent} para acceso a suscripción, uno por línea. La aplicación configurada {userAgent} se incluirá automáticamente",
"userAgentListPlaceholder": "Ingrese {userAgent} permitidos, uno por línea",
"wildcardResolution": "Resolución de Comodín",
"wildcardResolutionDescription": "Habilitar resolución de dominio comodín para suscripciones"
},
"form": {
@ -47,8 +47,29 @@
"icon": "URL del ícono o codificación base64",
"name": "Nombre para mostrar del cliente",
"outputFormat": "Formato del archivo de configuración de suscripción",
"proxyTemplate": "Plantilla de enlace de suscripción, soporta variables: ",
"template": "Plantilla de configuración de suscripción, soporta varias variables",
"schema": {
"base64Encoding": "Codificación Base64",
"functions": "Soporta funciones:",
"jsonStringify": "Objeto JSON a cadena",
"nameVariable": "nombre del sitio",
"title": "Plantilla de Esquema de URL",
"urlEncoding": "Codificación de URL",
"urlVariable": "URL de suscripción",
"variables": "Soporta variables:"
},
"template": {
"description": "Usar sintaxis de plantilla Go para generar archivos de configuración de suscripción",
"functions": "Funciones de plantilla:",
"if": "declaraciones condicionales",
"nodes": "lista de nodos proxy",
"range": "iterar arreglos",
"siteName": "nombre del sitio",
"sprig": "Biblioteca de funciones Sprig (procesamiento de cadenas, fechas, etc.)",
"subscribeName": "nombre de la suscripción",
"title": "Sintaxis de Plantilla Go",
"userInfo": "información del usuario (tráfico, expiración, etc.)",
"variables": "Variables disponibles:"
},
"userAgentPrefix": "Identificador del cliente para distinguir diferentes clientes"
},
"editTitle": "Editar Cliente",
@ -57,8 +78,8 @@
"icon": "Ícono",
"name": "Nombre",
"outputFormat": "Formato de Salida",
"proxyTemplate": "Enlace de Suscripción",
"template": "Plantilla de Configuración"
"schema": "Esquema de URL",
"template": "Plantilla de Archivo de Suscripción"
},
"tabs": {
"basic": "Información Básica",
@ -66,12 +87,13 @@
"template": "Plantillas"
},
"validation": {
"nameRequired": "El nombre del cliente es obligatorio",
"userAgentRequiredSuffix": "es obligatorio"
"nameRequired": "Se requiere el nombre del cliente",
"userAgentRequiredSuffix": "es requerido"
}
},
"outputFormats": {
"base64": "Base64",
"conf": "CONF",
"json": "JSON",
"plain": "Texto Plano",
"yaml": "YAML"

View File

@ -1,7 +1,7 @@
{
"actions": {
"add": "افزودن",
"batchDelete": "حذف گروهی",
"add": "اضافه کردن",
"batchDelete": "حذف دسته‌ای",
"batchDeleteSuccess": "با موفقیت {count} مشتری حذف شد",
"batchDeleteWarning": "آیا مطمئن هستید که می‌خواهید {count} مشتری انتخاب شده را حذف کنید؟",
"cancel": "لغو",
@ -20,7 +20,7 @@
},
"config": {
"description": "مدیریت تنظیمات سیستم اشتراک",
"singleSubscriptionMode": "حالت اشتراک تک",
"singleSubscriptionMode": "حالت اشتراک تکی",
"singleSubscriptionModeDescription": "محدود کردن کاربران به یک اشتراک فعال. اشتراک‌های موجود تحت تأثیر قرار نمی‌گیرند",
"subscriptionDomain": "دامنه اشتراک",
"subscriptionDomainDescription": "دامنه سفارشی برای لینک‌های اشتراک",
@ -31,25 +31,46 @@
"title": "پیکربندی اشتراک",
"updateError": "به‌روزرسانی ناموفق بود",
"updateSuccess": "تنظیمات با موفقیت به‌روزرسانی شد",
"userAgentLimit": "محدودیت {userAgent}",
"userAgentLimit": "{userAgent} محدودیت",
"userAgentLimitDescription": "فعال‌سازی محدودیت‌های دسترسی بر اساس {userAgent}",
"userAgentList": "لیست سفید {userAgent}",
"userAgentListDescription": "{userAgent} های مجاز برای دسترسی به اشتراک، هر کدام در یک خط. {userAgent} های پیکربندی شده به‌طور خودکار شامل خواهند شد",
"userAgentListPlaceholder": "{userAgent} های مجاز را وارد کنید، هر کدام در یک خط",
"userAgentList": "{userAgent} لیست سفید",
"userAgentListDescription": "اجازه دسترسی {userAgent} برای اشتراک، هر کدام در یک خط. برنامه پیکربندی شده {userAgent} به‌طور خودکار شامل خواهد شد",
"userAgentListPlaceholder": "اجازه {userAgent} را وارد کنید، هر کدام در یک خط",
"wildcardResolution": "حل wildcard",
"wildcardResolutionDescription": "فعال‌سازی حل دامنه wildcard برای اشتراک‌ها"
},
"form": {
"addTitle": "افزودن مشتری",
"addTitle": "اضافه کردن مشتری",
"descriptions": {
"description": "توضیحات دقیق مشتری",
"downloadLink": "آدرس دانلود پلتفرم",
"icon": "آدرس URL آیکون یا کدگذاری base64",
"downloadLink": "URL دانلود پلتفرم",
"icon": "URL آیکون یا کدگذاری base64",
"name": "نام نمایشی مشتری",
"outputFormat": "فرمت فایل پیکربندی اشتراک",
"proxyTemplate": "الگوی لینک اشتراک، از متغیرها پشتیبانی می‌کند: ",
"template": "الگوی پیکربندی اشتراک، از متغیرهای مختلف پشتیبانی می‌کند",
"userAgentPrefix": "شناسه مشتری برای تمایز بین مشتریان مختلف"
"schema": {
"base64Encoding": "کدگذاری Base64",
"functions": "توابع پشتیبانی شده:",
"jsonStringify": "شی JSON به رشته",
"nameVariable": "نام سایت",
"title": "قالب طرح URL",
"urlEncoding": "کدگذاری URL",
"urlVariable": "URL اشتراک",
"variables": "متغیرهای پشتیبانی شده:"
},
"template": {
"description": "استفاده از نحو قالب Go برای تولید فایل‌های پیکربندی اشتراک",
"functions": "توابع قالب:",
"if": "عبارات شرطی",
"nodes": "لیست گره‌های پروکسی",
"range": "تکرار آرایه‌ها",
"siteName": "نام سایت",
"sprig": "کتابخانه توابع Sprig (پردازش رشته، تاریخ‌ها و غیره)",
"subscribeName": "نام اشتراک",
"title": "نحو قالب Go",
"userInfo": "اطلاعات کاربر (ترافیک، انقضا و غیره)",
"variables": "متغیرهای موجود:"
},
"userAgentPrefix": "شناسایی مشتری برای تمایز مشتریان مختلف"
},
"editTitle": "ویرایش مشتری",
"fields": {
@ -57,13 +78,13 @@
"icon": "آیکون",
"name": "نام",
"outputFormat": "فرمت خروجی",
"proxyTemplate": "لینک اشتراک",
"template": "الگوی پیکربندی"
"schema": "طرح URL",
"template": "قالب فایل اشتراک"
},
"tabs": {
"basic": "اطلاعات پایه",
"download": "دانلودها",
"template": "الگوها"
"template": "قالب‌ها"
},
"validation": {
"nameRequired": "نام مشتری الزامی است",
@ -72,6 +93,7 @@
},
"outputFormats": {
"base64": "Base64",
"conf": "CONF",
"json": "JSON",
"plain": "متن ساده",
"yaml": "YAML"

View File

@ -43,13 +43,34 @@
"addTitle": "Lisää asiakas",
"descriptions": {
"description": "Yksityiskohtainen asiakaskuvaus",
"downloadLink": "alustalataus-URL",
"icon": "Ikonin URL-osoite tai base64-koodaus",
"downloadLink": "alustan lataus-URL",
"icon": "Ikonin URL tai base64-koodaus",
"name": "Asiakkaan näyttönimi",
"outputFormat": "Tilauksen asetustiedoston muoto",
"proxyTemplate": "Tilauksen linkkimalli, tukee muuttujia: ",
"template": "Tilauksen asetusmalli, tukee erilaisia muuttujia",
"userAgentPrefix": "Asiakasidentifikaattori eri asiakkaiden erottamiseksi"
"outputFormat": "Tilauksen konfiguraatiotiedoston muoto",
"schema": {
"base64Encoding": "Base64-koodaus",
"functions": "Tukee toimintoja:",
"jsonStringify": "JSON-objekti merkkijonoksi",
"nameVariable": "sivuston nimi",
"title": "URL-mallin malli",
"urlEncoding": "URL-koodaus",
"urlVariable": "tilaus-URL",
"variables": "Tukee muuttujia:"
},
"template": {
"description": "Käytä Go-mallin syntaksia luodaksesi tilauksen konfiguraatiotiedostoja",
"functions": "Mallitoiminnot:",
"if": "ehdolliset lauseet",
"nodes": "proxy-solmujen lista",
"range": "iteroi taulukoita",
"siteName": "sivuston nimi",
"sprig": "Sprig-toimintokirjasto (merkkijonojen käsittely, päivämäärät jne.)",
"subscribeName": "tilauksen nimi",
"title": "Go-mallin syntaksi",
"userInfo": "käyttäjätiedot (liikenne, vanheneminen jne.)",
"variables": "Saatavilla olevat muuttujat:"
},
"userAgentPrefix": "Asiakkaan tunniste erottamaan eri asiakkaita"
},
"editTitle": "Muokkaa asiakasta",
"fields": {
@ -57,8 +78,8 @@
"icon": "Ikoni",
"name": "Nimi",
"outputFormat": "Tulostusmuoto",
"proxyTemplate": "Tilauksen linkki",
"template": "Asetusmalli"
"schema": "URL-malli",
"template": "Tilauksen tiedostomalli"
},
"tabs": {
"basic": "Perustiedot",
@ -72,6 +93,7 @@
},
"outputFormats": {
"base64": "Base64",
"conf": "CONF",
"json": "JSON",
"plain": "Plain Text",
"yaml": "YAML"

View File

@ -31,11 +31,11 @@
"title": "Configuration de l'abonnement",
"updateError": "Échec de la mise à jour",
"updateSuccess": "Paramètres mis à jour avec succès",
"userAgentLimit": "Restriction de {userAgent}",
"userAgentLimit": "Restriction {userAgent}",
"userAgentLimitDescription": "Activer les restrictions d'accès basées sur {userAgent}",
"userAgentList": "Liste blanche {userAgent}",
"userAgentListDescription": "{userAgent} autorisés pour l'accès à l'abonnement, un par ligne. L'application configurée {userAgent} sera automatiquement incluse",
"userAgentListPlaceholder": "Entrez les {userAgent} autorisés, un par ligne",
"userAgentListDescription": "Autorisé {userAgent} pour l'accès à l'abonnement, un par ligne. L'application configurée {userAgent} sera automatiquement incluse",
"userAgentListPlaceholder": "Entrez {userAgent} autorisés, un par ligne",
"wildcardResolution": "Résolution de wildcard",
"wildcardResolutionDescription": "Activer la résolution de domaine wildcard pour les abonnements"
},
@ -47,9 +47,30 @@
"icon": "URL de l'icône ou encodage base64",
"name": "Nom d'affichage du client",
"outputFormat": "Format du fichier de configuration d'abonnement",
"proxyTemplate": "Modèle de lien d'abonnement, prend en charge les variables : ",
"template": "Modèle de configuration d'abonnement, prend en charge diverses variables",
"userAgentPrefix": "Identifiant du client pour distinguer les différents clients."
"schema": {
"base64Encoding": "Encodage Base64",
"functions": "Prend en charge les fonctions :",
"jsonStringify": "Objet JSON en chaîne",
"nameVariable": "nom du site",
"title": "Modèle de schéma d'URL",
"urlEncoding": "Encodage d'URL",
"urlVariable": "URL d'abonnement",
"variables": "Prend en charge les variables :"
},
"template": {
"description": "Utilisez la syntaxe de modèle Go pour générer des fichiers de configuration d'abonnement",
"functions": "Fonctions de modèle :",
"if": "instructions conditionnelles",
"nodes": "liste des nœuds proxy",
"range": "itérer des tableaux",
"siteName": "nom du site",
"sprig": "Bibliothèque de fonctions Sprig (traitement de chaînes, dates, etc.)",
"subscribeName": "nom de l'abonnement",
"title": "Syntaxe de modèle Go",
"userInfo": "informations utilisateur (trafic, expiration, etc.)",
"variables": "Variables disponibles :"
},
"userAgentPrefix": "Identifiant du client pour distinguer différents clients"
},
"editTitle": "Modifier un client",
"fields": {
@ -57,8 +78,8 @@
"icon": "Icône",
"name": "Nom",
"outputFormat": "Format de sortie",
"proxyTemplate": "Lien d'abonnement",
"template": "Modèle de configuration"
"schema": "Schéma d'URL",
"template": "Modèle de fichier d'abonnement"
},
"tabs": {
"basic": "Informations de base",
@ -72,6 +93,7 @@
},
"outputFormats": {
"base64": "Base64",
"conf": "CONF",
"json": "JSON",
"plain": "Texte brut",
"yaml": "YAML"

View File

@ -3,7 +3,7 @@
"add": "जोड़ें",
"batchDelete": "बैच हटाएं",
"batchDeleteSuccess": "सफलता से {count} क्लाइंट हटाए गए",
"batchDeleteWarning": "क्या आप सुनिश्चित हैं कि आप चयनित {count} क्लाइंट को हटाना चाहते हैं?",
"batchDeleteWarning": "क्या आप निश्चित हैं कि आप चयनित {count} क्लाइंट हटाना चाहते हैं?",
"cancel": "रद्द करें",
"confirm": "पुष्टि करें",
"confirmDelete": "हटाने की पुष्टि करें",
@ -11,7 +11,7 @@
"delete": "हटाएं",
"deleteFailed": "हटाना विफल",
"deleteSuccess": "सफलता से हटाया गया",
"deleteWarning": "यह क्रिया पूर्ववत नहीं की जा सकती। क्या आप सुनिश्चित हैं कि आप इस क्लाइंट को हटाना चाहते हैं?",
"deleteWarning": "यह क्रिया पूर्ववत नहीं की जा सकती। क्या आप निश्चित हैं कि आप इस क्लाइंट को हटाना चाहते हैं?",
"edit": "संपादित करें",
"save": "सहेजें",
"saveFailed": "सहेजना विफल",
@ -34,21 +34,42 @@
"userAgentLimit": "{userAgent} प्रतिबंध",
"userAgentLimitDescription": "{userAgent} के आधार पर पहुंच प्रतिबंध सक्षम करें",
"userAgentList": "{userAgent} श्वेतसूची",
"userAgentListDescription": "सदस्यता पहुंच के लिए अनुमत {userAgent}, प्रत्येक पंक्ति में एक। कॉन्फ़िगर की गई एप्लिकेशन {userAgent} स्वचालित रूप से शामिल की जाएगी",
"userAgentListPlaceholder": "अनुमत {userAgent} दर्ज करें, प्रत्येक पंक्ति में एक",
"userAgentListDescription": "सदस्यता पहुंच के लिए अनुमत {userAgent}, एक प्रति पंक्ति। कॉन्फ़िगर की गई एप्लिकेशन {userAgent} स्वचालित रूप से शामिल की जाएगी",
"userAgentListPlaceholder": "अनुमत {userAgent} दर्ज करें, एक प्रति पंक्ति",
"wildcardResolution": "वाइल्डकार्ड समाधान",
"wildcardResolutionDescription": "सदस्यताओं के लिए वाइल्डकार्ड डोमेन समाधान सक्षम करें"
},
"form": {
"addTitle": "क्लाइंट जोड़ें",
"descriptions": {
"description": "विस्तृत क्लाइंट विवरण",
"downloadLink": "प्लेटफ़ॉर्म डाउनलोड URL",
"icon": "आइकन URL या बेस64 एन्कोडिंग",
"description": "क्लाइंट का विस्तृत विवरण",
"downloadLink": "प्लेटफ़ॉर्म डाउनलोड यूआरएल",
"icon": "आइकन यूआरएल या बेस64 एन्कोडिंग",
"name": "क्लाइंट प्रदर्शन नाम",
"outputFormat": "सदस्यता कॉन्फ़िगरेशन फ़ाइल प्रारूप",
"proxyTemplate": "सदस्यता लिंक टेम्पलेट, वेरिएबल का समर्थन करता है: ",
"template": "सदस्यता कॉन्फ़िगरेशन टेम्पलेट, विभिन्न वेरिएबल का समर्थन करता है",
"schema": {
"base64Encoding": "बेस64 एन्कोडिंग",
"functions": "कार्य का समर्थन करता है:",
"jsonStringify": "JSON ऑब्जेक्ट को स्ट्रिंग में",
"nameVariable": "साइट का नाम",
"title": "यूआरएल स्कीमा टेम्पलेट",
"urlEncoding": "यूआरएल एन्कोडिंग",
"urlVariable": "सदस्यता यूआरएल",
"variables": "चर का समर्थन करता है:"
},
"template": {
"description": "सदस्यता कॉन्फ़िगरेशन फ़ाइलें उत्पन्न करने के लिए गो टेम्पलेट सिंटैक्स का उपयोग करें",
"functions": "टेम्पलेट कार्य:",
"if": "शर्तीय कथन",
"nodes": "प्रॉक्सी नोड्स की सूची",
"range": "ऐरे को दोहराएं",
"siteName": "साइट का नाम",
"sprig": "स्प्रिग फ़ंक्शन पुस्तकालय (स्ट्रिंग प्रोसेसिंग, तिथियाँ, आदि)",
"subscribeName": "सदस्यता का नाम",
"title": "गो टेम्पलेट सिंटैक्स",
"userInfo": "उपयोगकर्ता जानकारी (ट्रैफ़िक, समाप्ति, आदि)",
"variables": "उपलब्ध चर:"
},
"userAgentPrefix": "विभिन्न क्लाइंट्स को अलग करने के लिए क्लाइंट पहचानकर्ता"
},
"editTitle": "क्लाइंट संपादित करें",
@ -57,8 +78,8 @@
"icon": "आइकन",
"name": "नाम",
"outputFormat": "आउटपुट प्रारूप",
"proxyTemplate": "सदस्यता लिंक",
"template": "कॉन्फ़िग टेम्पलेट"
"schema": "यूआरएल स्कीमा",
"template": "सदस्यता फ़ाइल टेम्पलेट"
},
"tabs": {
"basic": "बुनियादी जानकारी",
@ -71,7 +92,8 @@
}
},
"outputFormats": {
"base64": "Base64",
"base64": "बेस64",
"conf": "CONF",
"json": "JSON",
"plain": "सादा पाठ",
"yaml": "YAML"

View File

@ -5,7 +5,7 @@
"batchDeleteSuccess": "Sikeresen törölt {count} ügyfelet",
"batchDeleteWarning": "Biztosan törölni szeretné a kiválasztott {count} ügyfelet?",
"cancel": "Mégse",
"confirm": "Megerősít",
"confirm": "Megerősítés",
"confirmDelete": "Törlés megerősítése",
"createSuccess": "Sikeresen létrehozva",
"delete": "Törlés",
@ -32,12 +32,12 @@
"updateError": "Frissítés sikertelen",
"updateSuccess": "Beállítások sikeresen frissítve",
"userAgentLimit": "{userAgent} Korlátozás",
"userAgentLimitDescription": "Engedélyezze a hozzáférési korlátozásokat a(z) {userAgent} alapján",
"userAgentList": "{userAgent} Fehér lista",
"userAgentListDescription": "Engedélyezett {userAgent} az előfizetési hozzáféréshez, soronként egy. A konfigurált alkalmazás {userAgent} automatikusan belekerül",
"userAgentListPlaceholder": "Adja meg az engedélyezett {userAgent}-t, soronként egy",
"wildcardResolution": "Wildcard Feloldás",
"wildcardResolutionDescription": "Engedélyezze a wildcard domain feloldást az előfizetésekhez"
"userAgentLimitDescription": "Engedélyezze a hozzáférési korlátozásokat a {userAgent} alapján",
"userAgentList": "{userAgent} Fehérlista",
"userAgentListDescription": "Engedélyezett {userAgent} az előfizetési hozzáféréshez, soronként egyet. A konfigurált alkalmazás {userAgent} automatikusan belekerül",
"userAgentListPlaceholder": "Adja meg az engedélyezett {userAgent} értékeket, soronként egyet",
"wildcardResolution": "Joker karakterek feloldása",
"wildcardResolutionDescription": "Engedélyezze a joker karakterek domain feloldását az előfizetésekhez"
},
"form": {
"addTitle": "Ügyfél Hozzáadása",
@ -47,9 +47,30 @@
"icon": "Ikon URL vagy base64 kódolás",
"name": "Ügyfél megjelenítési neve",
"outputFormat": "Előfizetési konfigurációs fájl formátum",
"proxyTemplate": "Előfizetési link sablon, támogatja a változókat: ",
"template": "Előfizetési konfigurációs sablon, támogatja a különböző változókat",
"userAgentPrefix": "Kliens azonosító a különböző kliensek megkülönböztetésére."
"schema": {
"base64Encoding": "Base64 kódolás",
"functions": "Támogatott funkciók:",
"jsonStringify": "JSON objektum stringgé alakítása",
"nameVariable": "webhely neve",
"title": "URL Sémák sablon",
"urlEncoding": "URL kódolás",
"urlVariable": "előfizetési URL",
"variables": "Támogatott változók:"
},
"template": {
"description": "Használja a Go sablon szintaxist az előfizetési konfigurációs fájlok generálásához",
"functions": "Sablon funkciók:",
"if": "feltételes állítások",
"nodes": "proxy csomópontok listája",
"range": "tömbök iterálása",
"siteName": "webhely neve",
"sprig": "Sprig funkció könyvtár (string feldolgozás, dátumok, stb.)",
"subscribeName": "előfizetés neve",
"title": "Go Sablon Szintaxis",
"userInfo": "felhasználói információ (forgalom, lejárat, stb.)",
"variables": "Elérhető változók:"
},
"userAgentPrefix": "Ügyfél azonosító a különböző ügyfelek megkülönböztetésére"
},
"editTitle": "Ügyfél Szerkesztése",
"fields": {
@ -57,8 +78,8 @@
"icon": "Ikon",
"name": "Név",
"outputFormat": "Kimeneti Formátum",
"proxyTemplate": "Előfizetési Link",
"template": "Beállítási Sablon"
"schema": "URL Sémák",
"template": "Előfizetési Fájl Sablon"
},
"tabs": {
"basic": "Alap Információk",
@ -66,12 +87,13 @@
"template": "Sablonok"
},
"validation": {
"nameRequired": "Az ügyfél neve kötelező",
"userAgentRequiredSuffix": "kötelező"
"nameRequired": "Ügyfél név megadása kötelező",
"userAgentRequiredSuffix": "megadása kötelező"
}
},
"outputFormats": {
"base64": "Base64",
"conf": "CONF",
"json": "JSON",
"plain": "Egyszerű Szöveg",
"yaml": "YAML"
@ -85,7 +107,7 @@
"windows": "Windows"
},
"protocol": {
"title": "Klienskezelés"
"title": "Ügyfélkezelés"
},
"table": {
"columns": {

View File

@ -20,7 +20,7 @@
},
"config": {
"description": "サブスクリプションシステムの設定を管理します",
"singleSubscriptionMode": "シングルサブスクリプションモード",
"singleSubscriptionMode": "単一サブスクリプションモード",
"singleSubscriptionModeDescription": "ユーザーを1つのアクティブなサブスクリプションに制限します。既存のサブスクリプションには影響しません",
"subscriptionDomain": "サブスクリプションドメイン",
"subscriptionDomainDescription": "サブスクリプションリンク用のカスタムドメイン",
@ -32,10 +32,10 @@
"updateError": "更新に失敗しました",
"updateSuccess": "設定が正常に更新されました",
"userAgentLimit": "{userAgent} 制限",
"userAgentLimitDescription": "{userAgent} に基づくアクセス制限を有効に",
"userAgentLimitDescription": "{userAgent} に基づくアクセス制限を有効にします",
"userAgentList": "{userAgent} ホワイトリスト",
"userAgentListDescription": "サブスクリプションアクセスのために許可された {userAgent}、1行ごとに1つ。設定されたアプリケーションの {userAgent} は自動的に含まれます",
"userAgentListPlaceholder": "許可された {userAgent} を入力してください、1行ごとに",
"userAgentListDescription": "サブスクリプションアクセスを許可された {userAgent}1行につき1つ。構成されたアプリケーション {userAgent} は自動的に含まれます",
"userAgentListPlaceholder": "許可された {userAgent} を入力してください1行につき1つ",
"wildcardResolution": "ワイルドカード解決",
"wildcardResolutionDescription": "サブスクリプション用のワイルドカードドメイン解決を有効にします"
},
@ -47,8 +47,29 @@
"icon": "アイコンのURLまたはbase64エンコーディング",
"name": "クライアントの表示名",
"outputFormat": "サブスクリプション設定ファイル形式",
"proxyTemplate": "サブスクリプションリンクテンプレート、変数をサポートします:",
"template": "サブスクリプション設定テンプレート、さまざまな変数をサポートします",
"schema": {
"base64Encoding": "Base64エンコーディング",
"functions": "関数をサポートしています:",
"jsonStringify": "JSONオブジェクトを文字列に変換",
"nameVariable": "サイト名",
"title": "URLスキーマテンプレート",
"urlEncoding": "URLエンコーディング",
"urlVariable": "サブスクリプションURL",
"variables": "変数をサポートしています:"
},
"template": {
"description": "Goテンプレート構文を使用してサブスクリプション設定ファイルを生成します",
"functions": "テンプレート関数:",
"if": "条件文",
"nodes": "プロキシノードリスト",
"range": "配列を反復処理",
"siteName": "サイト名",
"sprig": "Sprig関数ライブラリ文字列処理、日付など",
"subscribeName": "サブスクリプション名",
"title": "Goテンプレート構文",
"userInfo": "ユーザー情報(トラフィック、有効期限など)",
"variables": "利用可能な変数:"
},
"userAgentPrefix": "異なるクライアントを区別するためのクライアント識別子"
},
"editTitle": "クライアントを編集",
@ -57,8 +78,8 @@
"icon": "アイコン",
"name": "名前",
"outputFormat": "出力形式",
"proxyTemplate": "サブスクリプションリンク",
"template": "設定テンプレート"
"schema": "URLスキーマ",
"template": "サブスクリプションファイルテンプレート"
},
"tabs": {
"basic": "基本情報",
@ -72,6 +93,7 @@
},
"outputFormats": {
"base64": "Base64",
"conf": "CONF",
"json": "JSON",
"plain": "プレーンテキスト",
"yaml": "YAML"

View File

@ -23,18 +23,18 @@
"singleSubscriptionMode": "단일 구독 모드",
"singleSubscriptionModeDescription": "사용자를 하나의 활성 구독으로 제한합니다. 기존 구독에는 영향을 미치지 않습니다",
"subscriptionDomain": "구독 도메인",
"subscriptionDomainDescription": "구독 링크를 위한 사용자 정 도메인",
"subscriptionDomainDescription": "구독 링크를 위한 사용자 도메인",
"subscriptionDomainPlaceholder": "구독 도메인을 입력하세요, 한 줄에 하나씩",
"subscriptionPath": "구독 경로",
"subscriptionPathDescription": "구독 엔드포인트를 위한 사용자 정 경로 (시스템 재시작 후 성능 향상)",
"subscriptionPathDescription": "구독 엔드포인트를 위한 사용자 경로 (시스템 재시작 후 성능 향상)",
"subscriptionPathPlaceholder": "구독 경로를 입력하세요",
"title": "구독 설정",
"updateError": "업데이트 실패",
"updateSuccess": "설정이 성공적으로 업데이트되었습니다",
"userAgentLimit": "{userAgent} 제한",
"userAgentLimitDescription": "{userAgent} 기반의 접근 제한 활성화",
"userAgentLimitDescription": "{userAgent}에 기반한 접근 제한을 활성화합니다",
"userAgentList": "{userAgent} 허용 목록",
"userAgentListDescription": "구독 접근을 위한 허용된 {userAgent}, 한 줄에 하나씩 입력. 구성된 애플리케이션 {userAgent}는 자동으로 포함됩니다.",
"userAgentListDescription": "구독 접근을 위한 허용된 {userAgent}, 한 줄에 하나씩. 구성된 애플리케이션 {userAgent}는 자동으로 포함됩니다",
"userAgentListPlaceholder": "허용된 {userAgent}를 입력하세요, 한 줄에 하나씩",
"wildcardResolution": "와일드카드 해상도",
"wildcardResolutionDescription": "구독을 위한 와일드카드 도메인 해상도를 활성화합니다"
@ -47,8 +47,29 @@
"icon": "아이콘 URL 또는 base64 인코딩",
"name": "클라이언트 표시 이름",
"outputFormat": "구독 구성 파일 형식",
"proxyTemplate": "구독 링크 템플릿, 변수 지원: ",
"template": "구독 구성 템플릿, 다양한 변수 지원",
"schema": {
"base64Encoding": "Base64 인코딩",
"functions": "함수를 지원합니다:",
"jsonStringify": "JSON 객체를 문자열로 변환",
"nameVariable": "사이트 이름",
"title": "URL 스키마 템플릿",
"urlEncoding": "URL 인코딩",
"urlVariable": "구독 URL",
"variables": "변수를 지원합니다:"
},
"template": {
"description": "구독 구성 파일 생성을 위한 Go 템플릿 구문 사용",
"functions": "템플릿 함수:",
"if": "조건문",
"nodes": "프록시 노드 목록",
"range": "배열 반복",
"siteName": "사이트 이름",
"sprig": "Sprig 함수 라이브러리 (문자열 처리, 날짜 등)",
"subscribeName": "구독 이름",
"title": "Go 템플릿 구문",
"userInfo": "사용자 정보 (트래픽, 만료 등)",
"variables": "사용 가능한 변수:"
},
"userAgentPrefix": "다양한 클라이언트를 구별하기 위한 클라이언트 식별자"
},
"editTitle": "클라이언트 편집",
@ -57,8 +78,8 @@
"icon": "아이콘",
"name": "이름",
"outputFormat": "출력 형식",
"proxyTemplate": "구독 링크",
"template": "구 템플릿"
"schema": "URL 스키마",
"template": "구독 파일 템플릿"
},
"tabs": {
"basic": "기본 정보",
@ -67,11 +88,12 @@
},
"validation": {
"nameRequired": "클라이언트 이름은 필수입니다",
"userAgentRequiredSuffix": "필수입니다"
"userAgentRequiredSuffix": "필수입니다"
}
},
"outputFormats": {
"base64": "Base64",
"conf": "CONF",
"json": "JSON",
"plain": "일반 텍스트",
"yaml": "YAML"

View File

@ -31,24 +31,45 @@
"title": "Abonnementsinnstillinger",
"updateError": "Oppdatering feilet",
"updateSuccess": "Innstillinger oppdatert med suksess",
"userAgentLimit": "{userAgent} Begrensning",
"userAgentLimitDescription": "Aktiver tilgangsbegrensninger basert på {userAgent}",
"userAgentList": "{userAgent} Hvitliste",
"userAgentListDescription": "Tillatte {userAgent} for abonnementsadgang, én per linje. Konfigurert applikasjon {userAgent} vil bli automatisk inkludert",
"userAgentListPlaceholder": "Skriv inn tillatte {userAgent}, én per linje",
"wildcardResolution": "Wildcard Oppløsning",
"wildcardResolutionDescription": "Aktiver wildcard domeneoppløsning for abonnementer"
"userAgentLimit": "{userAgent} Restriksjon",
"userAgentLimitDescription": "Aktiver tilgangsrestriksjoner basert på {userAgent}",
"userAgentList": "{userAgent} Hviteliste",
"userAgentListDescription": "Tillatte {userAgent} for abonnements tilgang, ett per linje. Konfigurert applikasjon {userAgent} vil bli automatisk inkludert",
"userAgentListPlaceholder": "Skriv inn tillatte {userAgent}, ett per linje",
"wildcardResolution": "Wildcard-oppløsning",
"wildcardResolutionDescription": "Aktiver wildcard-domeneoppløsning for abonnementer"
},
"form": {
"addTitle": "Legg til Klient",
"descriptions": {
"description": "Detaljert klientbeskrivelse",
"downloadLink": "Plattform nedlastings-URL",
"downloadLink": "plattforms nedlastings-URL",
"icon": "Ikon-URL eller base64-koding",
"name": "Klientens visningsnavn",
"outputFormat": "Format for abonnements konfigurasjonsfil",
"proxyTemplate": "Mal for abonnementslenke, støtter variabler: ",
"template": "Abonnements konfigurasjonsmal, støtter ulike variabler",
"outputFormat": "Format for abonnementskonfigurasjonsfil",
"schema": {
"base64Encoding": "Base64-koding",
"functions": "Støtter funksjoner:",
"jsonStringify": "JSON-objekt til streng",
"nameVariable": "nettstedsnavn",
"title": "URL-skjema mal",
"urlEncoding": "URL-koding",
"urlVariable": "abonnements-URL",
"variables": "Støtter variabler:"
},
"template": {
"description": "Bruk Go mal-syntaks for å generere abonnementskonfigurasjonsfiler",
"functions": "Malfunksjoner:",
"if": "betingede setninger",
"nodes": "proxy-nodeliste",
"range": "iterere over lister",
"siteName": "nettstedsnavn",
"sprig": "Sprig funksjonsbibliotek (strengbehandling, datoer, osv.)",
"subscribeName": "abonnementsnavn",
"title": "Go Mal-syntaks",
"userInfo": "brukerinformasjon (trafikk, utløp, osv.)",
"variables": "Tilgjengelige variabler:"
},
"userAgentPrefix": "Klientidentifikator for å skille mellom forskjellige klienter"
},
"editTitle": "Rediger Klient",
@ -57,13 +78,13 @@
"icon": "Ikon",
"name": "Navn",
"outputFormat": "Utdataformat",
"proxyTemplate": "Abonnementslenke",
"template": "Konfigurasjonsmal"
"schema": "URL-skjema",
"template": "Abonnementsfilmal"
},
"tabs": {
"basic": "Grunnleggende Info",
"download": "Nedlastinger",
"template": "Maler"
"template": "Mal"
},
"validation": {
"nameRequired": "Klientnavn er påkrevd",
@ -72,8 +93,9 @@
},
"outputFormats": {
"base64": "Base64",
"conf": "CONF",
"json": "JSON",
"plain": "Ren Tekst",
"plain": "Ren tekst",
"yaml": "YAML"
},
"platforms": {
@ -93,7 +115,7 @@
"description": "Beskrivelse",
"name": "Klientnavn",
"outputFormat": "Utdataformat",
"supportedPlatforms": "Støttede Plattformer"
"supportedPlatforms": "Støttede plattformer"
}
}
}

View File

@ -1,13 +1,13 @@
{
"actions": {
"add": "Dodaj",
"batchDelete": "Usunięcie zbiorcze",
"batchDelete": "Usuwanie zbiorcze",
"batchDeleteSuccess": "Pomyślnie usunięto {count} klientów",
"batchDeleteWarning": "Czy na pewno chcesz usunąć wybranych {count} klientów?",
"cancel": "Anuluj",
"confirm": "Potwierdź",
"confirmDelete": "Potwierdź usunięcie",
"createSuccess": "Utworzono pomyślnie",
"createSuccess": "Pomyślnie utworzono",
"delete": "Usuń",
"deleteFailed": "Usunięcie nie powiodło się",
"deleteSuccess": "Pomyślnie usunięto",
@ -34,8 +34,8 @@
"userAgentLimit": "Ograniczenie {userAgent}",
"userAgentLimitDescription": "Włącz ograniczenia dostępu na podstawie {userAgent}",
"userAgentList": "Biała lista {userAgent}",
"userAgentListDescription": "Dozwolone {userAgent} do dostępu subskrypcyjnego, jeden na linię. Skonfigurowana aplikacja {userAgent} zostanie automatycznie uwzględniona",
"userAgentListPlaceholder": "Wprowadź dozwolone {userAgent}, jeden na linię",
"userAgentListDescription": "Dozwolone {userAgent} do dostępu do subskrypcji, jedna na linię. Skonfigurowana aplikacja {userAgent} zostanie automatycznie uwzględniona",
"userAgentListPlaceholder": "Wprowadź dozwolone {userAgent}, jedna na linię",
"wildcardResolution": "Rozwiązywanie symboli wieloznacznych",
"wildcardResolutionDescription": "Włącz rozwiązywanie domen wieloznacznych dla subskrypcji"
},
@ -47,8 +47,29 @@
"icon": "URL ikony lub kodowanie base64",
"name": "Nazwa wyświetlana klienta",
"outputFormat": "Format pliku konfiguracyjnego subskrypcji",
"proxyTemplate": "Szablon linku subskrypcyjnego, obsługuje zmienne: ",
"template": "Szablon konfiguracji subskrypcji, obsługuje różne zmienne",
"schema": {
"base64Encoding": "Kodowanie Base64",
"functions": "Obsługuje funkcje:",
"jsonStringify": "Obiekt JSON na string",
"nameVariable": "nazwa witryny",
"title": "Szablon schematu URL",
"urlEncoding": "Kodowanie URL",
"urlVariable": "adres URL subskrypcji",
"variables": "Obsługuje zmienne:"
},
"template": {
"description": "Użyj składni szablonu Go do generowania plików konfiguracyjnych subskrypcji",
"functions": "Funkcje szablonu:",
"if": "instrukcje warunkowe",
"nodes": "lista węzłów proxy",
"range": "iteruj po tablicach",
"siteName": "nazwa witryny",
"sprig": "Biblioteka funkcji Sprig (przetwarzanie ciągów, daty itp.)",
"subscribeName": "nazwa subskrypcji",
"title": "Składnia szablonu Go",
"userInfo": "informacje o użytkowniku (ruch, wygaśnięcie itp.)",
"variables": "Dostępne zmienne:"
},
"userAgentPrefix": "Identyfikator klienta do rozróżniania różnych klientów"
},
"editTitle": "Edytuj klienta",
@ -57,23 +78,24 @@
"icon": "Ikona",
"name": "Nazwa",
"outputFormat": "Format wyjściowy",
"proxyTemplate": "Link subskrypcyjny",
"template": "Szablon konfiguracji"
"schema": "Schemat URL",
"template": "Szablon pliku subskrypcyjnego"
},
"tabs": {
"basic": "Podstawowe informacje",
"download": "Pobierania",
"download": "Pobrania",
"template": "Szablony"
},
"validation": {
"nameRequired": "Nazwa klienta jest wymagana",
"userAgentRequiredSuffix": "jest wymagany"
"userAgentRequiredSuffix": "jest wymagana"
}
},
"outputFormats": {
"base64": "Base64",
"conf": "CONF",
"json": "JSON",
"plain": "Zwykły tekst",
"plain": "Tekst zwykły",
"yaml": "YAML"
},
"platforms": {

View File

@ -2,8 +2,8 @@
"actions": {
"add": "Adicionar",
"batchDelete": "Excluir em Lote",
"batchDeleteSuccess": "Clientes excluídos com sucesso: {count}",
"batchDeleteWarning": "Você tem certeza de que deseja excluir os {count} clientes selecionados?",
"batchDeleteSuccess": "Excluídos com sucesso {count} clientes",
"batchDeleteWarning": "Você tem certeza que deseja excluir os {count} clientes selecionados?",
"cancel": "Cancelar",
"confirm": "Confirmar",
"confirmDelete": "Confirmar Exclusão",
@ -11,7 +11,7 @@
"delete": "Excluir",
"deleteFailed": "Falha ao excluir",
"deleteSuccess": "Excluído com sucesso",
"deleteWarning": "Esta operação não pode ser desfeita. Você tem certeza de que deseja excluir este cliente?",
"deleteWarning": "Esta operação não pode ser desfeita. Você tem certeza que deseja excluir este cliente?",
"edit": "Editar",
"save": "Salvar",
"saveFailed": "Falha ao salvar",
@ -31,13 +31,13 @@
"title": "Configuração de Assinatura",
"updateError": "Falha na atualização",
"updateSuccess": "Configurações atualizadas com sucesso",
"userAgentLimit": "Limitação de {userAgent}",
"userAgentLimit": "Restrição de {userAgent}",
"userAgentLimitDescription": "Ativar restrições de acesso com base em {userAgent}",
"userAgentList": "Lista de {userAgent} Permitidos",
"userAgentListDescription": "{userAgent} permitidos para acesso à assinatura, um por linha. O {userAgent} do aplicativo configurado será incluído automaticamente",
"userAgentListPlaceholder": "Digite {userAgent} permitidos, um por linha",
"userAgentList": "Lista Branca de {userAgent}",
"userAgentListDescription": "Permitir {userAgent} para acesso à assinatura, um por linha. O aplicativo configurado {userAgent} será incluído automaticamente",
"userAgentListPlaceholder": "Insira {userAgent} permitidos, um por linha",
"wildcardResolution": "Resolução de Coringa",
"wildcardResolutionDescription": "Habilitar resolução de domínio coringa para assinaturas"
"wildcardResolutionDescription": "Ativar resolução de domínio coringa para assinaturas"
},
"form": {
"addTitle": "Adicionar Cliente",
@ -47,8 +47,29 @@
"icon": "URL do ícone ou codificação base64",
"name": "Nome de exibição do cliente",
"outputFormat": "Formato do arquivo de configuração da assinatura",
"proxyTemplate": "Modelo de link de assinatura, suporta variáveis: ",
"template": "Modelo de configuração de assinatura, suporta várias variáveis",
"schema": {
"base64Encoding": "Codificação Base64",
"functions": "Suporta funções:",
"jsonStringify": "Objeto JSON para string",
"nameVariable": "nome do site",
"title": "Modelo de Esquema de URL",
"urlEncoding": "Codificação de URL",
"urlVariable": "URL da assinatura",
"variables": "Suporta variáveis:"
},
"template": {
"description": "Use a sintaxe do template Go para gerar arquivos de configuração de assinatura",
"functions": "Funções do template:",
"if": "declarações condicionais",
"nodes": "lista de nós proxy",
"range": "iterar arrays",
"siteName": "nome do site",
"sprig": "Biblioteca de funções Sprig (processamento de strings, datas, etc.)",
"subscribeName": "nome da assinatura",
"title": "Sintaxe do Template Go",
"userInfo": "informações do usuário (tráfego, expiração, etc.)",
"variables": "Variáveis disponíveis:"
},
"userAgentPrefix": "Identificador do cliente para distinguir diferentes clientes"
},
"editTitle": "Editar Cliente",
@ -57,13 +78,13 @@
"icon": "Ícone",
"name": "Nome",
"outputFormat": "Formato de Saída",
"proxyTemplate": "Link de Assinatura",
"template": "Modelo de Configuração"
"schema": "Esquema de URL",
"template": "Template do Arquivo de Assinatura"
},
"tabs": {
"basic": "Informações Básicas",
"download": "Downloads",
"template": "Modelos"
"template": "Templates"
},
"validation": {
"nameRequired": "O nome do cliente é obrigatório",
@ -72,6 +93,7 @@
},
"outputFormats": {
"base64": "Base64",
"conf": "CONF",
"json": "JSON",
"plain": "Texto Simples",
"yaml": "YAML"

View File

@ -32,10 +32,10 @@
"updateError": "Actualizarea a eșuat",
"updateSuccess": "Setările au fost actualizate cu succes",
"userAgentLimit": "Restricție {userAgent}",
"userAgentLimitDescription": "Activați restricțiile de acces bazate pe {userAgent}",
"userAgentList": "Lista albă {userAgent}",
"userAgentListDescription": "{userAgent} permise pentru accesul la abonament, câte unul pe linie. Aplicația configurată {userAgent} va fi inclusă automat",
"userAgentListPlaceholder": "Introduceți {userAgent} permise, câte unul pe linie",
"userAgentLimitDescription": "Activează restricții de acces bazate pe {userAgent}",
"userAgentList": "Listă albă {userAgent}",
"userAgentListDescription": "Permise {userAgent} pentru accesul la abonament, câte unul pe linie. Aplicația configurată {userAgent} va fi inclusă automat",
"userAgentListPlaceholder": "Introdu {userAgent} permise, câte unul pe linie",
"wildcardResolution": "Rezolvare Wildcard",
"wildcardResolutionDescription": "Activează rezolvarea domeniului wildcard pentru abonamente"
},
@ -43,13 +43,34 @@
"addTitle": "Adaugă Client",
"descriptions": {
"description": "Descriere detaliată a clientului",
"downloadLink": "URL-ul de descărcare al platformei",
"icon": "URL-ul iconiței sau codificare base64",
"downloadLink": "URL descărcare platformă",
"icon": "URL iconiță sau codare base64",
"name": "Numele de afișare al clientului",
"outputFormat": "Formatul fișierului de configurare a abonamentului",
"proxyTemplate": "Șablonul linkului de abonament, suportă variabile: ",
"template": "Șablonul de configurare a abonamentului, suportă diverse variabile",
"userAgentPrefix": "Identificatorul clientului pentru a distinge diferite clienți"
"schema": {
"base64Encoding": "Codificare Base64",
"functions": "Suportă funcții:",
"jsonStringify": "Obiect JSON în string",
"nameVariable": "numele site-ului",
"title": "Șablon Schema URL",
"urlEncoding": "Codificare URL",
"urlVariable": "URL-ul abonamentului",
"variables": "Suportă variabile:"
},
"template": {
"description": "Folosește sintaxa șablon Go pentru a genera fișiere de configurare a abonamentului",
"functions": "Funcții de șablon:",
"if": "declarații condiționale",
"nodes": "lista nodurilor proxy",
"range": "iterează prin array-uri",
"siteName": "numele site-ului",
"sprig": "biblioteca de funcții Sprig (procesare stringuri, date, etc.)",
"subscribeName": "numele abonamentului",
"title": "Sintaxă Șablon Go",
"userInfo": "informații utilizator (trafic, expirare, etc.)",
"variables": "Variabile disponibile:"
},
"userAgentPrefix": "Identificatorul clientului pentru a distinge diferiți clienți"
},
"editTitle": "Editează Client",
"fields": {
@ -57,8 +78,8 @@
"icon": "Iconiță",
"name": "Nume",
"outputFormat": "Format de Ieșire",
"proxyTemplate": "Link de Abonament",
"template": "Șablon Config"
"schema": "Schema URL",
"template": "Șablon Fișier Abonament"
},
"tabs": {
"basic": "Informații de Bază",
@ -72,6 +93,7 @@
},
"outputFormats": {
"base64": "Base64",
"conf": "CONF",
"json": "JSON",
"plain": "Text Simplu",
"yaml": "YAML"

View File

@ -34,7 +34,7 @@
"userAgentLimit": "Ограничение {userAgent}",
"userAgentLimitDescription": "Включить ограничения доступа на основе {userAgent}",
"userAgentList": "Белый список {userAgent}",
"userAgentListDescription": "Разрешенные {userAgent} для доступа по подписке, по одному на строку. Настроенное приложение {userAgent} будет автоматически включено",
"userAgentListDescription": "Разрешенные {userAgent} для доступа к подписке, по одному на строку. Настроенное приложение {userAgent} будет автоматически включено",
"userAgentListPlaceholder": "Введите разрешенные {userAgent}, по одному на строку",
"wildcardResolution": "Разрешение подстановочных знаков",
"wildcardResolutionDescription": "Включить разрешение доменов с подстановочными знаками для подписок"
@ -43,13 +43,34 @@
"addTitle": "Добавить клиента",
"descriptions": {
"description": "Подробное описание клиента",
"downloadLink": "URL загрузки платформы",
"icon": "URL иконки или кодировка base64",
"downloadLink": "URL для загрузки платформы",
"icon": "URL иконки или base64 кодировка",
"name": "Отображаемое имя клиента",
"outputFormat": "Формат файла конфигурации подписки",
"proxyTemplate": "Шаблон ссылки на подписку, поддерживает переменные: ",
"template": "Шаблон конфигурации подписки, поддерживает различные переменные",
"userAgentPrefix": "Идентификатор клиента для различения различных клиентов"
"schema": {
"base64Encoding": "Base64 кодирование",
"functions": "Поддерживает функции:",
"jsonStringify": "JSON объект в строку",
"nameVariable": "имя сайта",
"title": "Шаблон URL-схемы",
"urlEncoding": "URL кодирование",
"urlVariable": "URL подписки",
"variables": "Поддерживает переменные:"
},
"template": {
"description": "Используйте синтаксис шаблона Go для генерации файлов конфигурации подписки",
"functions": "Функции шаблона:",
"if": "условные операторы",
"nodes": "список прокси-узлов",
"range": "перебирать массивы",
"siteName": "имя сайта",
"sprig": "Библиотека функций Sprig (обработка строк, даты и т. д.)",
"subscribeName": "имя подписки",
"title": "Синтаксис шаблона Go",
"userInfo": "информация о пользователе (трафик, срок действия и т. д.)",
"variables": "Доступные переменные:"
},
"userAgentPrefix": "Идентификатор клиента для различения разных клиентов"
},
"editTitle": "Редактировать клиента",
"fields": {
@ -57,8 +78,8 @@
"icon": "Иконка",
"name": "Имя",
"outputFormat": "Формат вывода",
"proxyTemplate": "Ссылка на подписку",
"template": "Шаблон конфигурации"
"schema": "URL-схема",
"template": "Шаблон файла подписки"
},
"tabs": {
"basic": "Основная информация",
@ -72,6 +93,7 @@
},
"outputFormats": {
"base64": "Base64",
"conf": "CONF",
"json": "JSON",
"plain": "Обычный текст",
"yaml": "YAML"

View File

@ -21,23 +21,23 @@
"config": {
"description": "จัดการการตั้งค่าระบบการสมัครสมาชิก",
"singleSubscriptionMode": "โหมดการสมัครสมาชิกเดียว",
"singleSubscriptionModeDescription": "จำกัดผู้ใช้ให้มีการสมัครสมาชิกที่ใช้งานอยู่เพียงหนึ่งรายการ การสมัครสมาชิกที่มีอยู่ไม่ถูกกระทบ",
"singleSubscriptionModeDescription": "จำกัดผู้ใช้ให้มีการสมัครสมาชิกที่ใช้งานอยู่เพียงหนึ่งรายการ การสมัครสมาชิกที่มีอยู่จะไม่ถูกกระทบ",
"subscriptionDomain": "โดเมนการสมัครสมาชิก",
"subscriptionDomainDescription": "โดเมนที่กำหนดเองสำหรับลิงก์การสมัครสมาชิก",
"subscriptionDomainPlaceholder": "กรอกโดเมนการสมัครสมาชิก หนึ่งรายการต่อบรรทัด",
"subscriptionDomainPlaceholder": "กรอกโดเมนการสมัครสมาชิก, หนึ่งต่อบรรทัด",
"subscriptionPath": "เส้นทางการสมัครสมาชิก",
"subscriptionPathDescription": "เส้นทางที่กำหนดเองสำหรับจุดสิ้นสุดการสมัครสมาชิก (ประสิทธิภาพดีขึ้นหลังจากรีสตาร์ทระบบ)",
"subscriptionPathPlaceholder": "กรอกเส้นทางการสมัครสมาชิก",
"title": "การตั้งค่าการสมัครสมาชิก",
"updateError": "การอัปเดตไม่สำเร็จ",
"updateSuccess": "อัปเดตการตั้งค่าเรียบร้อยแล้ว",
"updateSuccess": "การตั้งค่าอัปเดตเรียบร้อยแล้ว",
"userAgentLimit": "ข้อจำกัด {userAgent}",
"userAgentLimitDescription": "เปิดใช้งานข้อจำกัดการเข้าถึงตาม {userAgent}",
"userAgentList": "รายการอนุญาต {userAgent}",
"userAgentListDescription": "อนุญาต {userAgent} สำหรับการเข้าถึงการสมัครสมาชิก รายการละบรรทัด แอปพลิเคชันที่กำหนด {userAgent} จะถูกเพิ่มโดยอัตโนมัติ",
"userAgentListPlaceholder": "กรอก {userAgent} ที่อนุญาต หนึ่งต่อบรรทัด",
"wildcardResolution": "การแก้ไข Wildcard",
"wildcardResolutionDescription": "เปิดใช้งานการแก้ไขโดเมน wildcard สำหรับการสมัครสมาชิก"
"userAgentListDescription": "อนุญาต {userAgent} สำหรับการเข้าถึงการสมัครสมาชิก, หนึ่งต่อบรรทัด. แอปพลิเคชันที่กำหนด {userAgent} จะถูกเพิ่มโดยอัตโนมัติ",
"userAgentListPlaceholder": "กรอก {userAgent} ที่อนุญาต, หนึ่งต่อบรรทัด",
"wildcardResolution": "การแก้ไขไวลด์การ์ด",
"wildcardResolutionDescription": "เปิดใช้งานการแก้ไขโดเมนไวลด์การ์ดสำหรับการสมัครสมาชิก"
},
"form": {
"addTitle": "เพิ่มลูกค้า",
@ -47,9 +47,30 @@
"icon": "URL ของไอคอนหรือการเข้ารหัส base64",
"name": "ชื่อที่แสดงของลูกค้า",
"outputFormat": "รูปแบบไฟล์การกำหนดค่าการสมัครสมาชิก",
"proxyTemplate": "เทมเพลตลิงก์การสมัครสมาชิก รองรับตัวแปร: ",
"template": "เทมเพลตการกำหนดค่าการสมัครสมาชิก รองรับตัวแปรต่างๆ",
"userAgentPrefix": "ตัวระบุของลูกค้าเพื่อแยกแยะลูกค้าที่แตกต่างกัน"
"schema": {
"base64Encoding": "การเข้ารหัส Base64",
"functions": "รองรับฟังก์ชัน:",
"jsonStringify": "วัตถุ JSON เป็นสตริง",
"nameVariable": "ชื่อไซต์",
"title": "เทมเพลตสคีม่า URL",
"urlEncoding": "การเข้ารหัส URL",
"urlVariable": "URL การสมัครสมาชิก",
"variables": "รองรับตัวแปร:"
},
"template": {
"description": "ใช้ไวยากรณ์เทมเพลต Go เพื่อสร้างไฟล์การกำหนดค่าการสมัครสมาชิก",
"functions": "ฟังก์ชันเทมเพลต:",
"if": "คำสั่งเงื่อนไข",
"nodes": "รายการโหนดพร็อกซี",
"range": "วนซ้ำในอาร์เรย์",
"siteName": "ชื่อไซต์",
"sprig": "ห้องสมุดฟังก์ชัน Sprig (การประมวลผลสตริง, วันที่, ฯลฯ)",
"subscribeName": "ชื่อการสมัครสมาชิก",
"title": "ไวยากรณ์เทมเพลต Go",
"userInfo": "ข้อมูลผู้ใช้ (การใช้งาน, วันหมดอายุ, ฯลฯ)",
"variables": "ตัวแปรที่มีอยู่:"
},
"userAgentPrefix": "ตัวระบุลูกค้าเพื่อแยกแยะลูกค้าที่แตกต่างกัน"
},
"editTitle": "แก้ไขลูกค้า",
"fields": {
@ -57,8 +78,8 @@
"icon": "ไอคอน",
"name": "ชื่อ",
"outputFormat": "รูปแบบผลลัพธ์",
"proxyTemplate": "ลิงก์การสมัครสมาชิก",
"template": "เทมเพลตการกำหนดค่า"
"schema": "สคีม่า URL",
"template": "เทมเพลตไฟล์การสมัครสมาชิก"
},
"tabs": {
"basic": "ข้อมูลพื้นฐาน",
@ -66,12 +87,13 @@
"template": "เทมเพลต"
},
"validation": {
"nameRequired": "ชื่อของลูกค้าจำเป็นต้องระบุ",
"nameRequired": "ต้องระบุชื่อของลูกค้า",
"userAgentRequiredSuffix": "จำเป็นต้องระบุ"
}
},
"outputFormats": {
"base64": "Base64",
"conf": "CONF",
"json": "JSON",
"plain": "ข้อความธรรมดา",
"yaml": "YAML"

View File

@ -2,7 +2,7 @@
"actions": {
"add": "Ekle",
"batchDelete": "Toplu Sil",
"batchDeleteSuccess": "{count} müşterinin başarıyla silindi",
"batchDeleteSuccess": "{count} müşteri başarıyla silindi",
"batchDeleteWarning": "Seçilen {count} müşteriyi silmek istediğinize emin misiniz?",
"cancel": "İptal",
"confirm": "Onayla",
@ -32,10 +32,10 @@
"updateError": "Güncelleme başarısız",
"updateSuccess": "Ayarlar başarıyla güncellendi",
"userAgentLimit": "{userAgent} Kısıtlaması",
"userAgentLimitDescription": "{userAgent}'ye dayalı erişim kısıtlamalarını etkinleştir",
"userAgentList": "{userAgent} Beyaz Liste",
"userAgentListDescription": "Abonelik erişimi için izin verilen {userAgent}, her biri bir satırda. Yapılandırılmış uygulama {userAgent} otomatik olarak dahil edilecektir",
"userAgentListPlaceholder": "İzin verilen {userAgent}'yi girin, her biri bir satırda",
"userAgentLimitDescription": "{userAgent} bazında erişim kısıtlamalarını etkinleştir",
"userAgentList": "{userAgent} Beyaz Listesi",
"userAgentListDescription": "Abonelik erişimi için izin verilen {userAgent}, her satıra bir tane. Yapılandırılan uygulama {userAgent} otomatik olarak dahil edilecektir",
"userAgentListPlaceholder": "İzin verilen {userAgent} girin, her satıra bir tane",
"wildcardResolution": "Joker Karakter Çözümü",
"wildcardResolutionDescription": "Abonelikler için joker alan çözümünü etkinleştir"
},
@ -47,9 +47,30 @@
"icon": "Simge URL'si veya base64 kodlaması",
"name": "Müşteri görüntüleme adı",
"outputFormat": "Abonelik yapılandırma dosyası formatı",
"proxyTemplate": "Abonelik bağlantısı şablonu, değişkenleri destekler: ",
"template": "Abonelik yapılandırma şablonu, çeşitli değişkenleri destekler",
"userAgentPrefix": "Farklı istemcileri ayırt etmek için istemci tanımlayıcısı"
"schema": {
"base64Encoding": "Base64 kodlaması",
"functions": "Fonksiyonları destekler:",
"jsonStringify": "JSON nesnesini dizeye dönüştür",
"nameVariable": "site adı",
"title": "URL Şeması şablonu",
"urlEncoding": "URL kodlaması",
"urlVariable": "abonelik URL'si",
"variables": "Değişkenleri destekler:"
},
"template": {
"description": "Abonelik yapılandırma dosyalarını oluşturmak için Go şablon söz dizimini kullanın",
"functions": "Şablon fonksiyonları:",
"if": "koşullu ifadeler",
"nodes": "proxy düğüm listesi",
"range": "dizileri yinele",
"siteName": "site adı",
"sprig": "Sprig fonksiyon kütüphanesi (dize işleme, tarihler vb.)",
"subscribeName": "abonelik adı",
"title": "Go Şablon Söz Dizimi",
"userInfo": "kullanıcı bilgisi (trafik, son tarih vb.)",
"variables": "Mevcut değişkenler:"
},
"userAgentPrefix": "Farklı müşterileri ayırt etmek için müşteri tanımlayıcısı"
},
"editTitle": "Müşteri Düzenle",
"fields": {
@ -57,8 +78,8 @@
"icon": "Simge",
"name": "İsim",
"outputFormat": ıktı Formatı",
"proxyTemplate": "Abonelik Bağlantısı",
"template": "Yapılandırma Şablonu"
"schema": "URL Şeması",
"template": "Abonelik Dosyası Şablonu"
},
"tabs": {
"basic": "Temel Bilgiler",
@ -72,6 +93,7 @@
},
"outputFormats": {
"base64": "Base64",
"conf": "CONF",
"json": "JSON",
"plain": "Düz Metin",
"yaml": "YAML"
@ -85,7 +107,7 @@
"windows": "Windows"
},
"protocol": {
"title": "İstemci Yönetimi"
"title": "Müşteri Yönetimi"
},
"table": {
"columns": {

View File

@ -33,9 +33,9 @@
"updateSuccess": "Налаштування успішно оновлено",
"userAgentLimit": "Обмеження {userAgent}",
"userAgentLimitDescription": "Увімкнути обмеження доступу на основі {userAgent}",
"userAgentList": "Список дозволених {userAgent}",
"userAgentListDescription": "Дозволені {userAgent} для доступу до підписки, по одному на рядок. Налаштований додаток {userAgent} буде автоматично включено",
"userAgentListPlaceholder": "Введіть дозволені {userAgent}, по одному на рядок",
"userAgentList": "Білий список {userAgent}",
"userAgentListDescription": "Дозволені {userAgent} для доступу до підписки, по одному в рядку. Налаштована програма {userAgent} буде автоматично включена",
"userAgentListPlaceholder": "Введіть дозволені {userAgent}, по одному в рядку",
"wildcardResolution": "Розв'язання підстановочних знаків",
"wildcardResolutionDescription": "Увімкнути розв'язання доменів з підстановочними знаками для підписок"
},
@ -44,11 +44,32 @@
"descriptions": {
"description": "Детальний опис клієнта",
"downloadLink": "URL для завантаження платформи",
"icon": "URL іконки або кодування base64",
"icon": "URL іконки або base64 кодування",
"name": "Відображуване ім'я клієнта",
"outputFormat": "Формат файлу конфігурації підписки",
"proxyTemplate": "Шаблон посилання на підписку, підтримує змінні: ",
"template": "Шаблон конфігурації підписки, підтримує різні змінні",
"schema": {
"base64Encoding": "Base64 кодування",
"functions": "Підтримує функції:",
"jsonStringify": "JSON об'єкт в рядок",
"nameVariable": "ім'я сайту",
"title": "Шаблон URL-схеми",
"urlEncoding": "URL кодування",
"urlVariable": "URL підписки",
"variables": "Підтримує змінні:"
},
"template": {
"description": "Використовуйте синтаксис шаблону Go для генерації файлів конфігурації підписки",
"functions": "Функції шаблону:",
"if": "умовні оператори",
"nodes": "список проксі-нод",
"range": "ітерація масивів",
"siteName": "ім'я сайту",
"sprig": "Бібліотека функцій Sprig (обробка рядків, дати тощо)",
"subscribeName": "ім'я підписки",
"title": "Синтаксис шаблону Go",
"userInfo": "інформація про користувача (трафік, термін дії тощо)",
"variables": "Доступні змінні:"
},
"userAgentPrefix": "Ідентифікатор клієнта для розрізнення різних клієнтів"
},
"editTitle": "Редагувати клієнта",
@ -57,8 +78,8 @@
"icon": "Іконка",
"name": "Ім'я",
"outputFormat": "Формат виходу",
"proxyTemplate": "Посилання на підписку",
"template": "Шаблон конфігурації"
"schema": "URL-схема",
"template": "Шаблон файлу підписки"
},
"tabs": {
"basic": "Основна інформація",
@ -66,12 +87,13 @@
"template": "Шаблони"
},
"validation": {
"nameRequired": "Ім'я клієнта є обов'язковим",
"userAgentRequiredSuffix": "є обов'язковим"
"nameRequired": "Ім'я клієнта обов'язкове",
"userAgentRequiredSuffix": "обов'язкове"
}
},
"outputFormats": {
"base64": "Base64",
"conf": "CONF",
"json": "JSON",
"plain": "Текстовий формат",
"yaml": "YAML"

View File

@ -31,13 +31,13 @@
"title": "Cấu hình Đăng ký",
"updateError": "Cập nhật không thành công",
"updateSuccess": "Cài đặt đã được cập nhật thành công",
"userAgentLimit": "Giới hạn {userAgent}",
"userAgentLimitDescription": "Bật hạn chế truy cập dựa trên {userAgent}",
"userAgentLimit": "Hạn chế {userAgent}",
"userAgentLimitDescription": "Kích hoạt hạn chế truy cập dựa trên {userAgent}",
"userAgentList": "Danh sách trắng {userAgent}",
"userAgentListDescription": "Các {userAgent} được phép truy cập đăng ký, mỗi cái một dòng. Ứng dụng đã cấu hình {userAgent} sẽ được tự động bao gồm",
"userAgentListPlaceholder": "Nhập {userAgent} được phép, mỗi cái một dòng",
"wildcardResolution": "Giải quyết Wildcard",
"wildcardResolutionDescription": "Kích hoạt giải quyết miền wildcard cho các đăng ký"
"userAgentListDescription": "Cho phép {userAgent} truy cập đăng ký, mỗi dòng một {userAgent}. Ứng dụng đã cấu hình {userAgent} sẽ được tự động bao gồm",
"userAgentListPlaceholder": "Nhập {userAgent} được phép, mỗi dòng một",
"wildcardResolution": "Giải quyết ký tự đại diện",
"wildcardResolutionDescription": "Kích hoạt giải quyết miền ký tự đại diện cho các đăng ký"
},
"form": {
"addTitle": "Thêm Khách hàng",
@ -47,9 +47,30 @@
"icon": "URL biểu tượng hoặc mã hóa base64",
"name": "Tên hiển thị của khách hàng",
"outputFormat": "Định dạng tệp cấu hình đăng ký",
"proxyTemplate": "Mẫu liên kết đăng ký, hỗ trợ các biến: ",
"template": "Mẫu cấu hình đăng ký, hỗ trợ nhiều biến khác nhau",
"userAgentPrefix": "Định danh khách hàng để phân biệt các khách hàng khác nhau."
"schema": {
"base64Encoding": "Mã hóa Base64",
"functions": "Hỗ trợ các hàm:",
"jsonStringify": "Chuyển đổi đối tượng JSON thành chuỗi",
"nameVariable": "tên trang",
"title": "Mô hình URL",
"urlEncoding": "Mã hóa URL",
"urlVariable": "URL đăng ký",
"variables": "Hỗ trợ các biến:"
},
"template": {
"description": "Sử dụng cú pháp mẫu Go để tạo các tệp cấu hình đăng ký",
"functions": "Các hàm mẫu:",
"if": "câu lệnh điều kiện",
"nodes": "danh sách các nút proxy",
"range": "lặp qua các mảng",
"siteName": "tên trang",
"sprig": "Thư viện hàm Sprig (xử lý chuỗi, ngày tháng, v.v.)",
"subscribeName": "tên đăng ký",
"title": "Cú pháp Mẫu Go",
"userInfo": "thông tin người dùng (lưu lượng, hết hạn, v.v.)",
"variables": "Các biến có sẵn:"
},
"userAgentPrefix": "Định danh khách hàng để phân biệt các khách hàng khác nhau"
},
"editTitle": "Chỉnh sửa Khách hàng",
"fields": {
@ -57,8 +78,8 @@
"icon": "Biểu tượng",
"name": "Tên",
"outputFormat": "Định dạng Đầu ra",
"proxyTemplate": "Liên kết Đăng ký",
"template": "Mẫu Cấu hình"
"schema": "Mô hình URL",
"template": "Mẫu Tệp Đăng ký"
},
"tabs": {
"basic": "Thông tin Cơ bản",
@ -72,6 +93,7 @@
},
"outputFormats": {
"base64": "Base64",
"conf": "CONF",
"json": "JSON",
"plain": "Văn bản thuần",
"yaml": "YAML"

View File

@ -47,8 +47,29 @@
"icon": "图标 URL 或 base64 编码",
"name": "客户端显示名称",
"outputFormat": "订阅配置文件格式",
"schema": "URL Schema 模板,支持变量:'{url}' 订阅地址,'{name}' 站点名称",
"template": "订阅文件模板,支持各种变量",
"schema": {
"title": "URL Schema 模板",
"variables": "支持变量:",
"urlVariable": "订阅地址",
"nameVariable": "站点名称",
"functions": "支持函数:",
"urlEncoding": "URL编码",
"base64Encoding": "Base64编码",
"jsonStringify": "JSON对象转字符串"
},
"template": {
"title": "Go模板语法",
"description": "使用Go模板语法生成订阅配置文件",
"variables": "可用变量:",
"siteName": "站点名称",
"subscribeName": "订阅名称",
"nodes": "代理节点列表",
"userInfo": "用户信息(流量、到期时间等)",
"functions": "模板函数:",
"range": "遍历数组",
"if": "条件判断",
"sprig": "Sprig函数库(字符串处理、日期等)"
},
"userAgentPrefix": "用于区分不同客户端的客户端标识符"
},
"editTitle": "编辑客户端",

View File

@ -21,7 +21,7 @@
"config": {
"description": "管理訂閱系統設置",
"singleSubscriptionMode": "單一訂閱模式",
"singleSubscriptionModeDescription": "限制用戶只能有一個有效的訂閱。現有訂閱不受影響",
"singleSubscriptionModeDescription": "限制用戶只能有一個有效的訂閱。現有訂閱不受影響",
"subscriptionDomain": "訂閱域名",
"subscriptionDomainDescription": "訂閱鏈接的自定義域名",
"subscriptionDomainPlaceholder": "輸入訂閱域名,每行一個",
@ -34,7 +34,7 @@
"userAgentLimit": "{userAgent} 限制",
"userAgentLimitDescription": "根據 {userAgent} 啟用訪問限制",
"userAgentList": "{userAgent} 白名單",
"userAgentListDescription": "允許的 {userAgent} 用於訂閱訪問,每行一個。配置的應用程序 {userAgent} 將自動包含",
"userAgentListDescription": "允許的 {userAgent} 用於訂閱訪問,每行一個。配置的應用 {userAgent} 將自動包含",
"userAgentListPlaceholder": "輸入允許的 {userAgent},每行一個",
"wildcardResolution": "通配符解析",
"wildcardResolutionDescription": "啟用訂閱的通配符域名解析"
@ -47,8 +47,29 @@
"icon": "圖標 URL 或 base64 編碼",
"name": "客戶端顯示名稱",
"outputFormat": "訂閱配置文件格式",
"proxyTemplate": "訂閱鏈接模板,支持變量:",
"template": "訂閱配置模板,支持各種變量",
"schema": {
"base64Encoding": "Base64 編碼",
"functions": "支持的函數:",
"jsonStringify": "將 JSON 對象轉換為字符串",
"nameVariable": "網站名稱",
"title": "URL 模式模板",
"urlEncoding": "URL 編碼",
"urlVariable": "訂閱 URL",
"variables": "支持的變量:"
},
"template": {
"description": "使用 Go 模板語法生成訂閱配置文件",
"functions": "模板函數:",
"if": "條件語句",
"nodes": "代理節點列表",
"range": "迭代數組",
"siteName": "網站名稱",
"sprig": "Sprig 函數庫(字符串處理、日期等)",
"subscribeName": "訂閱名稱",
"title": "Go 模板語法",
"userInfo": "用戶信息(流量、到期等)",
"variables": "可用變量:"
},
"userAgentPrefix": "用於區分不同客戶端的客戶端標識符"
},
"editTitle": "編輯客戶端",
@ -57,8 +78,8 @@
"icon": "圖標",
"name": "名稱",
"outputFormat": "輸出格式",
"proxyTemplate": "訂閱鏈接",
"template": "配置模板"
"schema": "URL 模式",
"template": "訂閱文件模板"
},
"tabs": {
"basic": "基本信息",
@ -72,6 +93,7 @@
},
"outputFormats": {
"base64": "Base64",
"conf": "CONF",
"json": "JSON",
"plain": "純文本",
"yaml": "YAML"

View File

@ -1,5 +1,5 @@
// @ts-ignore
/* eslint-disable */
import request from '@/utils/request';
/** Get Ads GET /v1/common/ads */
@ -43,6 +43,17 @@ export async function checkVerificationCode(
);
}
/** Get Client GET /v1/common/client */
export async function getClient(options?: { [key: string]: any }) {
return request<API.Response & { data?: API.GetSubscribeApplicationListResponse }>(
'/v1/common/client',
{
method: 'GET',
...(options || {}),
},
);
}
/** Get verification code POST /v1/common/send_code */
export async function sendEmailCode(body: API.SendCodeRequest, options?: { [key: string]: any }) {
return request<API.Response & { data?: API.SendCodeResponse }>('/v1/common/send_code', {

View File

@ -213,6 +213,15 @@ declare namespace API {
updated_at: number;
};
type DownloadLink = {
ios?: string;
android?: string;
windows?: string;
mac?: string;
linux?: string;
harmony?: string;
};
type EmailAuthticateConfig = {
enable: boolean;
enable_verify: boolean;
@ -284,6 +293,11 @@ declare namespace API {
protocol: string[];
};
type GetSubscribeApplicationListResponse = {
total: number;
list: SubscribeApplication[];
};
type GetTosResponse = {
tos_content: string;
};
@ -765,6 +779,22 @@ declare namespace API {
updated_at: number;
};
type SubscribeApplication = {
id: number;
name: string;
description?: string;
icon?: string;
scheme?: string;
user_agent: string;
is_default: boolean;
proxy_template: string;
template: string;
output_format: string;
download_link?: DownloadLink;
created_at: number;
updated_at: number;
};
type SubscribeConfig = {
single_model: boolean;
subscribe_path: string;

View File

@ -5,8 +5,7 @@ import Renewal from '@/components/subscribe/renewal';
import ResetTraffic from '@/components/subscribe/reset-traffic';
import Unsubscribe from '@/components/subscribe/unsubscribe';
import useGlobalStore from '@/config/use-global';
import { getStat } from '@/services/common/common';
import { queryApplicationConfig } from '@/services/user/subscribe';
import { getClient, getStat } from '@/services/common/common';
import { queryUserSubscribe, resetUserSubscribeToken } from '@/services/user/user';
import { getPlatform } from '@/utils/common';
import { useQuery } from '@tanstack/react-query';
@ -43,9 +42,9 @@ import CopyToClipboard from 'react-copy-to-clipboard';
import { toast } from 'sonner';
import Subscribe from '../subscribe/page';
const platforms: (keyof API.ApplicationPlatform)[] = [
const platforms: (keyof API.DownloadLink)[] = [
'windows',
'macos',
'mac',
'linux',
'ios',
'android',
@ -70,13 +69,15 @@ export default function Content() {
},
});
const { data: applications } = useQuery({
queryKey: ['queryApplicationConfig'],
queryKey: ['getClient'],
queryFn: async () => {
const { data } = await queryApplicationConfig();
return data.data?.applications || [];
const { data } = await getClient();
return data.data?.list || [];
},
});
const [platform, setPlatform] = useState<keyof API.ApplicationPlatform>(getPlatform());
const [platform, setPlatform] = useState<keyof API.DownloadLink>(
getPlatform() === 'macos' ? 'mac' : (getPlatform() as keyof API.DownloadLink),
);
const { data } = useQuery({
queryKey: ['getStat'],
@ -123,7 +124,7 @@ export default function Content() {
<div className='flex flex-wrap justify-between gap-4'>
<Tabs
value={platform}
onValueChange={(value) => setPlatform(value as keyof API.ApplicationPlatform)}
onValueChange={(value) => setPlatform(value as keyof API.DownloadLink)}
className='w-full max-w-full md:w-auto'
>
<TabsList className='flex *:flex-auto'>
@ -133,7 +134,7 @@ export default function Content() {
icon={`${
{
windows: 'mdi:microsoft-windows',
macos: 'uil:apple',
mac: 'uil:apple',
linux: 'uil:linux',
ios: 'simple-icons:ios',
android: 'uil:android',
@ -324,19 +325,18 @@ export default function Content() {
<div className='grid grid-cols-2 gap-4 md:grid-cols-3 lg:grid-cols-4 xl:grid-cols-6'>
{applications
?.filter((application) => {
const platformApps = application.platform?.[platform];
return platformApps && platformApps.length > 0;
// 检查当前平台是否有下载链接或者有 scheme
if (!application.download_link && !application.scheme) return false;
return (
!!application.download_link?.[platform] || !!application.scheme
);
})
.map((application) => {
const platformApps = application.platform?.[platform];
const app =
platformApps?.find((item) => item.is_default) ||
platformApps?.[0];
if (!app) return null;
const downloadUrl = application.download_link?.[platform];
const handleCopy = (text: string, result: boolean) => {
if (result) {
const href = getAppSubLink(application.subscribe_type, url);
const href = getAppSubLink(url, application.scheme);
const showSuccessMessage = () => {
toast.success(
<>
@ -379,23 +379,32 @@ export default function Content() {
/>
)}
<div className='flex'>
<Button
size='sm'
variant='secondary'
className='rounded-r-none px-1.5'
asChild
>
<Link href={app.url}>{t('download')}</Link>
</Button>
<CopyToClipboard
text={getAppSubLink(application.subscribe_type, url) || url}
onCopy={handleCopy}
>
<Button size='sm' className='rounded-l-none p-2'>
{t('import')}
{downloadUrl && (
<Button
size='sm'
variant='secondary'
className={
application.scheme ? 'rounded-r-none px-1.5' : 'px-1.5'
}
asChild
>
<Link href={downloadUrl}>{t('download')}</Link>
</Button>
</CopyToClipboard>
)}
{application.scheme && (
<CopyToClipboard
text={getAppSubLink(url, application.scheme)}
onCopy={handleCopy}
>
<Button
size='sm'
className={downloadUrl ? 'rounded-l-none p-2' : 'p-2'}
>
{t('import')}
</Button>
</CopyToClipboard>
)}
</div>
</div>
);

View File

@ -10,7 +10,7 @@ export interface GlobalStore {
setUser: (user?: API.User) => void;
getUserInfo: () => Promise<void>;
getUserSubscribe: (uuid: string, type?: string) => string[];
getAppSubLink: (type: string, url: string) => string;
getAppSubLink: (url: string, schema?: string) => string;
}
export const useGlobalStore = create<GlobalStore>((set, get) => ({
@ -107,45 +107,48 @@ export const useGlobalStore = create<GlobalStore>((set, get) => ({
}
});
},
getAppSubLink: (type: string, url: string) => {
getAppSubLink: (url: string, schema?: string) => {
const name = get().common?.site?.site_name || '';
switch (type) {
case 'Clash':
return `clash://install-config?url=${url}&name=${name}`;
case 'Hiddify':
return `hiddify://import/${url}#${name}`;
case 'Loon':
return `loon://import?sub=${encodeURIComponent(url)}`;
case 'NekoBox':
return `sn://subscription?url=${url}&name=${name}`;
case 'NekoRay':
return `sn://subscription?url=${url}&name=${name}`;
// case 'Netch':
// return ``;
case 'Quantumult X':
return `quantumult-x://add-resource?remote-resource=${encodeURIComponent(
JSON.stringify({
server_remote: [`${url}, tag=${name}`],
}),
)}`;
case 'Shadowrocket':
return `shadowrocket://add/sub://${window.btoa(url)}?remark=${encodeURIComponent(name)}`;
case 'Singbox':
return `sing-box://import-remote-profile?url=${encodeURIComponent(url)}#${name}`;
case 'Surfboard':
return `surfboard:///install-config?url=${encodeURIComponent(url)}`;
case 'Surge':
return `surge:///install-config?url=${encodeURIComponent(url)}`;
case 'V2box':
return `v2box://install-sub?url=${encodeURIComponent(url)}&name=${name}`;
// case 'V2rayN':
// return `v2rayn://install-sub?url=${encodeURIComponent(url)}&name=${name}`;
case 'V2rayNg':
return `v2rayng://install-sub?url=${encodeURIComponent(url)}#${name}`;
case 'Stash':
return `stash://install-config?url=${encodeURIComponent(url)}&name=${name}`;
default:
return '';
if (!schema) return url;
try {
let result = schema;
result = result.replace(/\${url}/g, url);
result = result.replace(/\${name}/g, name);
result = result.replace(/\${encodeURIComponent\(([^)]+)\)}/g, (match, expr) => {
if (expr === 'url') return encodeURIComponent(url);
if (expr === 'name') return encodeURIComponent(name);
return match;
});
result = result.replace(/\${window\.btoa\(([^)]+)\)}/g, (match, expr) => {
const btoa = typeof window !== 'undefined' ? window.btoa : (str: string) => str;
if (expr === 'url') return btoa(url);
if (expr === 'name') return btoa(name);
return match;
});
result = result.replace(/\${JSON\.stringify\(([^}]+)\)}/g, (match, expr) => {
try {
const processedExpr = expr.replace(/url/g, `"${url}"`).replace(/name/g, `"${name}"`);
if (processedExpr.includes('server_remote')) {
const serverRemoteValue = `${url}, tag=${name}`;
return JSON.stringify({ server_remote: [serverRemoteValue] });
}
const result = eval(`(${processedExpr})`);
return JSON.stringify(result);
} catch {
return match;
}
});
return result;
} catch (error) {
return url;
}
},
}));

View File

@ -1,5 +1,5 @@
// @ts-ignore
/* eslint-disable */
import request from '@/utils/request';
/** Get Ads GET /v1/common/ads */
@ -43,6 +43,17 @@ export async function checkVerificationCode(
);
}
/** Get Client GET /v1/common/client */
export async function getClient(options?: { [key: string]: any }) {
return request<API.Response & { data?: API.GetSubscribeApplicationListResponse }>(
'/v1/common/client',
{
method: 'GET',
...(options || {}),
},
);
}
/** Get verification code POST /v1/common/send_code */
export async function sendEmailCode(body: API.SendCodeRequest, options?: { [key: string]: any }) {
return request<API.Response & { data?: API.SendCodeResponse }>('/v1/common/send_code', {

View File

@ -213,6 +213,15 @@ declare namespace API {
updated_at: number;
};
type DownloadLink = {
ios?: string;
android?: string;
windows?: string;
mac?: string;
linux?: string;
harmony?: string;
};
type EmailAuthticateConfig = {
enable: boolean;
enable_verify: boolean;
@ -284,6 +293,11 @@ declare namespace API {
protocol: string[];
};
type GetSubscribeApplicationListResponse = {
total: number;
list: SubscribeApplication[];
};
type GetTosResponse = {
tos_content: string;
};
@ -765,6 +779,22 @@ declare namespace API {
updated_at: number;
};
type SubscribeApplication = {
id: number;
name: string;
description?: string;
icon?: string;
scheme?: string;
user_agent: string;
is_default: boolean;
proxy_template: string;
template: string;
output_format: string;
download_link?: DownloadLink;
created_at: number;
updated_at: number;
};
type SubscribeConfig = {
single_model: boolean;
subscribe_path: string;

View File

@ -214,6 +214,15 @@ declare namespace API {
updated_at: number;
};
type DownloadLink = {
ios?: string;
android?: string;
windows?: string;
mac?: string;
linux?: string;
harmony?: string;
};
type EmailAuthticateConfig = {
enable: boolean;
enable_verify: boolean;
@ -266,6 +275,11 @@ declare namespace API {
methods: UserAuthMethod[];
};
type GetSubscribeApplicationListResponse = {
total: number;
list: SubscribeApplication[];
};
type GetSubscribeLogParams = {
page: number;
size: number;
@ -863,6 +877,22 @@ declare namespace API {
updated_at: number;
};
type SubscribeApplication = {
id: number;
name: string;
description?: string;
icon?: string;
scheme?: string;
user_agent: string;
is_default: boolean;
proxy_template: string;
template: string;
output_format: string;
download_link?: DownloadLink;
created_at: number;
updated_at: number;
};
type SubscribeConfig = {
single_model: boolean;
subscribe_path: string;