mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2026-06-07 21:54:10 +00:00
fix
This commit is contained in:
parent
8f74ccdda6
commit
0e6d54917e
17 changed files with 170 additions and 24 deletions
|
|
@ -160,10 +160,10 @@ func (s *SubClashService) getProxies(inbound *model.Inbound, client model.Client
|
||||||
|
|
||||||
func (s *SubClashService) buildProxy(inbound *model.Inbound, client model.Client, stream map[string]any, extraRemark string) map[string]any {
|
func (s *SubClashService) buildProxy(inbound *model.Inbound, client model.Client, stream map[string]any, extraRemark string) map[string]any {
|
||||||
proxy := map[string]any{
|
proxy := map[string]any{
|
||||||
"name": s.SubService.genRemark(inbound, client.Email, extraRemark),
|
"name": s.SubService.genRemark(inbound, client.Email, extraRemark),
|
||||||
"server": inbound.Listen,
|
"server": inbound.Listen,
|
||||||
"port": inbound.Port,
|
"port": inbound.Port,
|
||||||
"udp": true,
|
"udp": true,
|
||||||
}
|
}
|
||||||
|
|
||||||
network, _ := stream["network"].(string)
|
network, _ := stream["network"].(string)
|
||||||
|
|
|
||||||
|
|
@ -76,9 +76,9 @@ type AllSetting struct {
|
||||||
SubURI string `json:"subURI" form:"subURI"` // Subscription server URI
|
SubURI string `json:"subURI" form:"subURI"` // Subscription server URI
|
||||||
SubJsonPath string `json:"subJsonPath" form:"subJsonPath"` // Path for JSON subscription endpoint
|
SubJsonPath string `json:"subJsonPath" form:"subJsonPath"` // Path for JSON subscription endpoint
|
||||||
SubJsonURI string `json:"subJsonURI" form:"subJsonURI"` // JSON subscription server URI
|
SubJsonURI string `json:"subJsonURI" form:"subJsonURI"` // JSON subscription server URI
|
||||||
SubClashEnable bool `json:"subClashEnable" form:"subClashEnable"` // Enable Clash/Mihomo subscription endpoint
|
SubClashEnable bool `json:"subClashEnable" form:"subClashEnable"` // Enable Clash/Mihomo subscription endpoint
|
||||||
SubClashPath string `json:"subClashPath" form:"subClashPath"` // Path for Clash/Mihomo subscription endpoint
|
SubClashPath string `json:"subClashPath" form:"subClashPath"` // Path for Clash/Mihomo subscription endpoint
|
||||||
SubClashURI string `json:"subClashURI" form:"subClashURI"` // Clash/Mihomo subscription server URI
|
SubClashURI string `json:"subClashURI" form:"subClashURI"` // Clash/Mihomo subscription server URI
|
||||||
SubJsonFragment string `json:"subJsonFragment" form:"subJsonFragment"` // JSON subscription fragment configuration
|
SubJsonFragment string `json:"subJsonFragment" form:"subJsonFragment"` // JSON subscription fragment configuration
|
||||||
SubJsonNoises string `json:"subJsonNoises" form:"subJsonNoises"` // JSON subscription noise configuration
|
SubJsonNoises string `json:"subJsonNoises" form:"subJsonNoises"` // JSON subscription noise configuration
|
||||||
SubJsonMux string `json:"subJsonMux" form:"subJsonMux"` // JSON subscription mux configuration
|
SubJsonMux string `json:"subJsonMux" form:"subJsonMux"` // JSON subscription mux configuration
|
||||||
|
|
|
||||||
|
|
@ -1059,6 +1059,7 @@
|
||||||
},
|
},
|
||||||
showNord() {
|
showNord() {
|
||||||
nordModal.show();
|
nordModal.show();
|
||||||
|
},
|
||||||
async loadCustomGeoAliases() {
|
async loadCustomGeoAliases() {
|
||||||
try {
|
try {
|
||||||
const msg = await HttpUtil.get('/panel/api/custom-geo/aliases');
|
const msg = await HttpUtil.get('/panel/api/custom-geo/aliases');
|
||||||
|
|
|
||||||
|
|
@ -14,13 +14,18 @@ type NordService struct {
|
||||||
SettingService
|
SettingService
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var nordHTTPClient = &http.Client{Timeout: 15 * time.Second}
|
||||||
|
|
||||||
|
// maxResponseSize limits the maximum size of NordVPN API responses (10 MB).
|
||||||
|
const maxResponseSize = 10 << 20
|
||||||
|
|
||||||
func (s *NordService) GetCountries() (string, error) {
|
func (s *NordService) GetCountries() (string, error) {
|
||||||
resp, err := http.Get("https://api.nordvpn.com/v1/countries")
|
resp, err := nordHTTPClient.Get("https://api.nordvpn.com/v1/countries")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
defer resp.Body.Close()
|
defer resp.Body.Close()
|
||||||
body, err := io.ReadAll(resp.Body)
|
body, err := io.ReadAll(io.LimitReader(resp.Body, maxResponseSize))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
|
|
@ -28,13 +33,19 @@ func (s *NordService) GetCountries() (string, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *NordService) GetServers(countryId string) (string, error) {
|
func (s *NordService) GetServers(countryId string) (string, error) {
|
||||||
|
// Validate countryId is numeric to prevent URL injection
|
||||||
|
for _, c := range countryId {
|
||||||
|
if c < '0' || c > '9' {
|
||||||
|
return "", common.NewError("invalid country ID")
|
||||||
|
}
|
||||||
|
}
|
||||||
url := fmt.Sprintf("https://api.nordvpn.com/v2/servers?limit=0&filters[servers_technologies][id]=35&filters[country_id]=%s", countryId)
|
url := fmt.Sprintf("https://api.nordvpn.com/v2/servers?limit=0&filters[servers_technologies][id]=35&filters[country_id]=%s", countryId)
|
||||||
resp, err := http.Get(url)
|
resp, err := nordHTTPClient.Get(url)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
defer resp.Body.Close()
|
defer resp.Body.Close()
|
||||||
body, err := io.ReadAll(resp.Body)
|
body, err := io.ReadAll(io.LimitReader(resp.Body, maxResponseSize))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
|
|
@ -63,12 +74,18 @@ func (s *NordService) GetServers(countryId string) (string, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *NordService) SetKey(privateKey string) (string, error) {
|
func (s *NordService) SetKey(privateKey string) (string, error) {
|
||||||
|
if privateKey == "" {
|
||||||
|
return "", common.NewError("private key cannot be empty")
|
||||||
|
}
|
||||||
nordData := map[string]string{
|
nordData := map[string]string{
|
||||||
"private_key": privateKey,
|
"private_key": privateKey,
|
||||||
"token": "", // No token for manual key
|
"token": "",
|
||||||
}
|
}
|
||||||
data, _ := json.Marshal(nordData)
|
data, _ := json.Marshal(nordData)
|
||||||
s.SettingService.SetNord(string(data))
|
err := s.SettingService.SetNord(string(data))
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
return string(data), nil
|
return string(data), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -91,7 +108,7 @@ func (s *NordService) GetCredentials(token string) (string, error) {
|
||||||
return "", common.NewErrorf("NordVPN API error: %s", resp.Status)
|
return "", common.NewErrorf("NordVPN API error: %s", resp.Status)
|
||||||
}
|
}
|
||||||
|
|
||||||
body, err := io.ReadAll(resp.Body)
|
body, err := io.ReadAll(io.LimitReader(resp.Body, maxResponseSize))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
|
|
@ -111,7 +128,10 @@ func (s *NordService) GetCredentials(token string) (string, error) {
|
||||||
"token": token,
|
"token": token,
|
||||||
}
|
}
|
||||||
data, _ := json.Marshal(nordData)
|
data, _ := json.Marshal(nordData)
|
||||||
s.SettingService.SetNord(string(data))
|
err = s.SettingService.SetNord(string(data))
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
return string(data), nil
|
return string(data), nil
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -767,13 +767,13 @@ func extractHostname(host string) string {
|
||||||
func (s *SettingService) GetDefaultSettings(host string) (any, error) {
|
func (s *SettingService) GetDefaultSettings(host string) (any, error) {
|
||||||
type settingFunc func() (any, error)
|
type settingFunc func() (any, error)
|
||||||
settings := map[string]settingFunc{
|
settings := map[string]settingFunc{
|
||||||
"expireDiff": func() (any, error) { return s.GetExpireDiff() },
|
"expireDiff": func() (any, error) { return s.GetExpireDiff() },
|
||||||
"trafficDiff": func() (any, error) { return s.GetTrafficDiff() },
|
"trafficDiff": func() (any, error) { return s.GetTrafficDiff() },
|
||||||
"pageSize": func() (any, error) { return s.GetPageSize() },
|
"pageSize": func() (any, error) { return s.GetPageSize() },
|
||||||
"defaultCert": func() (any, error) { return s.GetCertFile() },
|
"defaultCert": func() (any, error) { return s.GetCertFile() },
|
||||||
"defaultKey": func() (any, error) { return s.GetKeyFile() },
|
"defaultKey": func() (any, error) { return s.GetKeyFile() },
|
||||||
"tgBotEnable": func() (any, error) { return s.GetTgbotEnabled() },
|
"tgBotEnable": func() (any, error) { return s.GetTgbotEnabled() },
|
||||||
"subEnable": func() (any, error) { return s.GetSubEnable() },
|
"subEnable": func() (any, error) { return s.GetSubEnable() },
|
||||||
"subJsonEnable": func() (any, error) { return s.GetSubJsonEnable() },
|
"subJsonEnable": func() (any, error) { return s.GetSubJsonEnable() },
|
||||||
"subClashEnable": func() (any, error) { return s.GetSubClashEnable() },
|
"subClashEnable": func() (any, error) { return s.GetSubClashEnable() },
|
||||||
"subTitle": func() (any, error) { return s.GetSubTitle() },
|
"subTitle": func() (any, error) { return s.GetSubTitle() },
|
||||||
|
|
@ -781,8 +781,8 @@ func (s *SettingService) GetDefaultSettings(host string) (any, error) {
|
||||||
"subJsonURI": func() (any, error) { return s.GetSubJsonURI() },
|
"subJsonURI": func() (any, error) { return s.GetSubJsonURI() },
|
||||||
"subClashURI": func() (any, error) { return s.GetSubClashURI() },
|
"subClashURI": func() (any, error) { return s.GetSubClashURI() },
|
||||||
"remarkModel": func() (any, error) { return s.GetRemarkModel() },
|
"remarkModel": func() (any, error) { return s.GetRemarkModel() },
|
||||||
"datepicker": func() (any, error) { return s.GetDatepicker() },
|
"datepicker": func() (any, error) { return s.GetDatepicker() },
|
||||||
"ipLimitEnable": func() (any, error) { return s.GetIpLimitEnable() },
|
"ipLimitEnable": func() (any, error) { return s.GetIpLimitEnable() },
|
||||||
}
|
}
|
||||||
|
|
||||||
result := make(map[string]any)
|
result := make(map[string]any)
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,8 @@
|
||||||
"confirm" = "تأكيد"
|
"confirm" = "تأكيد"
|
||||||
"cancel" = "إلغاء"
|
"cancel" = "إلغاء"
|
||||||
"close" = "إغلاق"
|
"close" = "إغلاق"
|
||||||
|
"save" = "حفظ"
|
||||||
|
"logout" = "تسجيل خروج"
|
||||||
"create" = "إنشاء"
|
"create" = "إنشاء"
|
||||||
"update" = "تحديث"
|
"update" = "تحديث"
|
||||||
"copy" = "نسخ"
|
"copy" = "نسخ"
|
||||||
|
|
@ -496,6 +498,8 @@
|
||||||
"ipv4RoutingDesc" = "الخيارات دي هتوجه الترافيك بناءً على وجهة معينة عبر IPv4."
|
"ipv4RoutingDesc" = "الخيارات دي هتوجه الترافيك بناءً على وجهة معينة عبر IPv4."
|
||||||
"warpRouting" = "توجيه WARP"
|
"warpRouting" = "توجيه WARP"
|
||||||
"warpRoutingDesc" = "الخيارات دي هتوجه الترافيك بناءً على وجهة معينة عبر WARP."
|
"warpRoutingDesc" = "الخيارات دي هتوجه الترافيك بناءً على وجهة معينة عبر WARP."
|
||||||
|
"nordRouting" = "توجيه NordVPN"
|
||||||
|
"nordRoutingDesc" = "الخيارات دي هتوجه الترافيك بناءً على وجهة معينة عبر NordVPN."
|
||||||
"Template" = "قالب إعدادات Xray المتقدم"
|
"Template" = "قالب إعدادات Xray المتقدم"
|
||||||
"TemplateDesc" = "ملف إعدادات Xray النهائي هيتولد بناءً على القالب ده."
|
"TemplateDesc" = "ملف إعدادات Xray النهائي هيتولد بناءً على القالب ده."
|
||||||
"FreedomStrategy" = "استراتيجية بروتوكول الحرية"
|
"FreedomStrategy" = "استراتيجية بروتوكول الحرية"
|
||||||
|
|
@ -573,6 +577,14 @@
|
||||||
"testSuccess" = "الاختبار ناجح"
|
"testSuccess" = "الاختبار ناجح"
|
||||||
"testFailed" = "فشل الاختبار"
|
"testFailed" = "فشل الاختبار"
|
||||||
"testError" = "فشل اختبار المخرج"
|
"testError" = "فشل اختبار المخرج"
|
||||||
|
"nordvpn" = "NordVPN"
|
||||||
|
"accessToken" = "رمز الوصول"
|
||||||
|
"country" = "الدولة"
|
||||||
|
"server" = "الخادم"
|
||||||
|
"city" = "المدينة"
|
||||||
|
"allCities" = "كل المدن"
|
||||||
|
"privateKey" = "المفتاح الخاص"
|
||||||
|
"load" = "الحمل"
|
||||||
|
|
||||||
[pages.xray.balancer]
|
[pages.xray.balancer]
|
||||||
"addBalancer" = "أضف موازن تحميل"
|
"addBalancer" = "أضف موازن تحميل"
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,8 @@
|
||||||
"confirm" = "Confirmar"
|
"confirm" = "Confirmar"
|
||||||
"cancel" = "Cancelar"
|
"cancel" = "Cancelar"
|
||||||
"close" = "Cerrar"
|
"close" = "Cerrar"
|
||||||
|
"save" = "Guardar"
|
||||||
|
"logout" = "Cerrar Sesión"
|
||||||
"create" = "Crear"
|
"create" = "Crear"
|
||||||
"update" = "Actualizar"
|
"update" = "Actualizar"
|
||||||
"copy" = "Copiar"
|
"copy" = "Copiar"
|
||||||
|
|
@ -496,6 +498,8 @@
|
||||||
"ipv4RoutingDesc" = "Estas opciones solo enrutarán a los dominios objetivo a través de IPv4."
|
"ipv4RoutingDesc" = "Estas opciones solo enrutarán a los dominios objetivo a través de IPv4."
|
||||||
"warpRouting" = "Enrutamiento WARP"
|
"warpRouting" = "Enrutamiento WARP"
|
||||||
"warpRoutingDesc" = "Precaución: Antes de usar estas opciones, instale WARP en modo de proxy socks5 en su servidor siguiendo los pasos en el GitHub del panel. WARP enrutará el tráfico a los sitios web a través de los servidores de Cloudflare."
|
"warpRoutingDesc" = "Precaución: Antes de usar estas opciones, instale WARP en modo de proxy socks5 en su servidor siguiendo los pasos en el GitHub del panel. WARP enrutará el tráfico a los sitios web a través de los servidores de Cloudflare."
|
||||||
|
"nordRouting" = "Enrutamiento NordVPN"
|
||||||
|
"nordRoutingDesc" = "Estas opciones enrutarán el tráfico basado en un destino específico a través de NordVPN."
|
||||||
"Template" = "Plantilla de Configuración de Xray"
|
"Template" = "Plantilla de Configuración de Xray"
|
||||||
"TemplateDesc" = "Genera el archivo de configuración final de Xray basado en esta plantilla."
|
"TemplateDesc" = "Genera el archivo de configuración final de Xray basado en esta plantilla."
|
||||||
"FreedomStrategy" = "Configurar Estrategia para el Protocolo Freedom"
|
"FreedomStrategy" = "Configurar Estrategia para el Protocolo Freedom"
|
||||||
|
|
@ -573,6 +577,14 @@
|
||||||
"testSuccess" = "Prueba exitosa"
|
"testSuccess" = "Prueba exitosa"
|
||||||
"testFailed" = "Prueba fallida"
|
"testFailed" = "Prueba fallida"
|
||||||
"testError" = "Error al probar la salida"
|
"testError" = "Error al probar la salida"
|
||||||
|
"nordvpn" = "NordVPN"
|
||||||
|
"accessToken" = "Token de acceso"
|
||||||
|
"country" = "País"
|
||||||
|
"server" = "Servidor"
|
||||||
|
"city" = "Ciudad"
|
||||||
|
"allCities" = "Todas las ciudades"
|
||||||
|
"privateKey" = "Clave privada"
|
||||||
|
"load" = "Carga"
|
||||||
|
|
||||||
[pages.xray.balancer]
|
[pages.xray.balancer]
|
||||||
"addBalancer" = "Agregar equilibrador"
|
"addBalancer" = "Agregar equilibrador"
|
||||||
|
|
|
||||||
|
|
@ -582,6 +582,8 @@
|
||||||
"country" = "کشور"
|
"country" = "کشور"
|
||||||
"server" = "سرور"
|
"server" = "سرور"
|
||||||
"privateKey" = "کلید خصوصی"
|
"privateKey" = "کلید خصوصی"
|
||||||
|
"city" = "شهر"
|
||||||
|
"allCities" = "همه شهرها"
|
||||||
"load" = "فشار سرور"
|
"load" = "فشار سرور"
|
||||||
|
|
||||||
[pages.xray.balancer]
|
[pages.xray.balancer]
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,8 @@
|
||||||
"confirm" = "Konfirmasi"
|
"confirm" = "Konfirmasi"
|
||||||
"cancel" = "Batal"
|
"cancel" = "Batal"
|
||||||
"close" = "Tutup"
|
"close" = "Tutup"
|
||||||
|
"save" = "Simpan"
|
||||||
|
"logout" = "Keluar"
|
||||||
"create" = "Buat"
|
"create" = "Buat"
|
||||||
"update" = "Perbarui"
|
"update" = "Perbarui"
|
||||||
"copy" = "Salin"
|
"copy" = "Salin"
|
||||||
|
|
@ -496,6 +498,8 @@
|
||||||
"ipv4RoutingDesc" = "Opsi ini akan mengalihkan lalu lintas berdasarkan tujuan tertentu melalui IPv4."
|
"ipv4RoutingDesc" = "Opsi ini akan mengalihkan lalu lintas berdasarkan tujuan tertentu melalui IPv4."
|
||||||
"warpRouting" = "Perutean WARP"
|
"warpRouting" = "Perutean WARP"
|
||||||
"warpRoutingDesc" = "Opsi ini akan mengalihkan lalu lintas berdasarkan tujuan tertentu melalui WARP."
|
"warpRoutingDesc" = "Opsi ini akan mengalihkan lalu lintas berdasarkan tujuan tertentu melalui WARP."
|
||||||
|
"nordRouting" = "Routing NordVPN"
|
||||||
|
"nordRoutingDesc" = "Opsi ini akan mengalihkan lalu lintas berdasarkan tujuan tertentu melalui NordVPN."
|
||||||
"Template" = "Template Konfigurasi Xray Lanjutan"
|
"Template" = "Template Konfigurasi Xray Lanjutan"
|
||||||
"TemplateDesc" = "File konfigurasi Xray akhir akan dibuat berdasarkan template ini."
|
"TemplateDesc" = "File konfigurasi Xray akhir akan dibuat berdasarkan template ini."
|
||||||
"FreedomStrategy" = "Strategi Protokol Freedom"
|
"FreedomStrategy" = "Strategi Protokol Freedom"
|
||||||
|
|
@ -573,6 +577,14 @@
|
||||||
"testSuccess" = "Tes berhasil"
|
"testSuccess" = "Tes berhasil"
|
||||||
"testFailed" = "Tes gagal"
|
"testFailed" = "Tes gagal"
|
||||||
"testError" = "Gagal menguji outbound"
|
"testError" = "Gagal menguji outbound"
|
||||||
|
"nordvpn" = "NordVPN"
|
||||||
|
"accessToken" = "Token Akses"
|
||||||
|
"country" = "Negara"
|
||||||
|
"server" = "Server"
|
||||||
|
"city" = "Kota"
|
||||||
|
"allCities" = "Semua Kota"
|
||||||
|
"privateKey" = "Kunci Privat"
|
||||||
|
"load" = "Beban"
|
||||||
|
|
||||||
[pages.xray.balancer]
|
[pages.xray.balancer]
|
||||||
"addBalancer" = "Tambahkan Penyeimbang"
|
"addBalancer" = "Tambahkan Penyeimbang"
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,8 @@
|
||||||
"confirm" = "確認"
|
"confirm" = "確認"
|
||||||
"cancel" = "キャンセル"
|
"cancel" = "キャンセル"
|
||||||
"close" = "閉じる"
|
"close" = "閉じる"
|
||||||
|
"save" = "保存"
|
||||||
|
"logout" = "ログアウト"
|
||||||
"create" = "作成"
|
"create" = "作成"
|
||||||
"update" = "更新"
|
"update" = "更新"
|
||||||
"copy" = "コピー"
|
"copy" = "コピー"
|
||||||
|
|
@ -496,6 +498,8 @@
|
||||||
"ipv4RoutingDesc" = "このオプションはIPv4のみを介してターゲットドメインへルーティングします"
|
"ipv4RoutingDesc" = "このオプションはIPv4のみを介してターゲットドメインへルーティングします"
|
||||||
"warpRouting" = "WARP ルーティング"
|
"warpRouting" = "WARP ルーティング"
|
||||||
"warpRoutingDesc" = "注意:これらのオプションを使用する前に、パネルのGitHubの手順に従って、サーバーにsocks5プロキシモードでWARPをインストールしてください。WARPはCloudflareサーバー経由でトラフィックをウェブサイトにルーティングします。"
|
"warpRoutingDesc" = "注意:これらのオプションを使用する前に、パネルのGitHubの手順に従って、サーバーにsocks5プロキシモードでWARPをインストールしてください。WARPはCloudflareサーバー経由でトラフィックをウェブサイトにルーティングします。"
|
||||||
|
"nordRouting" = "NordVPN ルーティング"
|
||||||
|
"nordRoutingDesc" = "これらのオプションはNordVPN経由で特定の宛先にトラフィックをルーティングします。"
|
||||||
"Template" = "高度なXray設定テンプレート"
|
"Template" = "高度なXray設定テンプレート"
|
||||||
"TemplateDesc" = "最終的なXray設定ファイルはこのテンプレートに基づいて生成されます"
|
"TemplateDesc" = "最終的なXray設定ファイルはこのテンプレートに基づいて生成されます"
|
||||||
"FreedomStrategy" = "Freedom プロトコル戦略"
|
"FreedomStrategy" = "Freedom プロトコル戦略"
|
||||||
|
|
@ -573,6 +577,14 @@
|
||||||
"testSuccess" = "テスト成功"
|
"testSuccess" = "テスト成功"
|
||||||
"testFailed" = "テスト失敗"
|
"testFailed" = "テスト失敗"
|
||||||
"testError" = "アウトバウンドのテストに失敗しました"
|
"testError" = "アウトバウンドのテストに失敗しました"
|
||||||
|
"nordvpn" = "NordVPN"
|
||||||
|
"accessToken" = "アクセストークン"
|
||||||
|
"country" = "国"
|
||||||
|
"server" = "サーバー"
|
||||||
|
"city" = "都市"
|
||||||
|
"allCities" = "すべての都市"
|
||||||
|
"privateKey" = "秘密鍵"
|
||||||
|
"load" = "負荷"
|
||||||
|
|
||||||
[pages.xray.balancer]
|
[pages.xray.balancer]
|
||||||
"addBalancer" = "負荷分散追加"
|
"addBalancer" = "負荷分散追加"
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,8 @@
|
||||||
"confirm" = "Confirmar"
|
"confirm" = "Confirmar"
|
||||||
"cancel" = "Cancelar"
|
"cancel" = "Cancelar"
|
||||||
"close" = "Fechar"
|
"close" = "Fechar"
|
||||||
|
"save" = "Salvar"
|
||||||
|
"logout" = "Sair"
|
||||||
"create" = "Criar"
|
"create" = "Criar"
|
||||||
"update" = "Atualizar"
|
"update" = "Atualizar"
|
||||||
"copy" = "Copiar"
|
"copy" = "Copiar"
|
||||||
|
|
@ -496,6 +498,8 @@
|
||||||
"ipv4RoutingDesc" = "Essas opções roteam o tráfego para um destino específico via IPv4."
|
"ipv4RoutingDesc" = "Essas opções roteam o tráfego para um destino específico via IPv4."
|
||||||
"warpRouting" = "Roteamento WARP"
|
"warpRouting" = "Roteamento WARP"
|
||||||
"warpRoutingDesc" = "Essas opções roteam o tráfego para um destino específico via WARP."
|
"warpRoutingDesc" = "Essas opções roteam o tráfego para um destino específico via WARP."
|
||||||
|
"nordRouting" = "Roteamento NordVPN"
|
||||||
|
"nordRoutingDesc" = "Essas opções roteiam o tráfego para um destino específico via NordVPN."
|
||||||
"Template" = "Modelo de Configuração Avançada do Xray"
|
"Template" = "Modelo de Configuração Avançada do Xray"
|
||||||
"TemplateDesc" = "O arquivo final de configuração do Xray será gerado com base neste modelo."
|
"TemplateDesc" = "O arquivo final de configuração do Xray será gerado com base neste modelo."
|
||||||
"FreedomStrategy" = "Estratégia do Protocolo Freedom"
|
"FreedomStrategy" = "Estratégia do Protocolo Freedom"
|
||||||
|
|
@ -573,6 +577,14 @@
|
||||||
"testSuccess" = "Teste bem-sucedido"
|
"testSuccess" = "Teste bem-sucedido"
|
||||||
"testFailed" = "Teste falhou"
|
"testFailed" = "Teste falhou"
|
||||||
"testError" = "Falha ao testar saída"
|
"testError" = "Falha ao testar saída"
|
||||||
|
"nordvpn" = "NordVPN"
|
||||||
|
"accessToken" = "Token de Acesso"
|
||||||
|
"country" = "País"
|
||||||
|
"server" = "Servidor"
|
||||||
|
"city" = "Cidade"
|
||||||
|
"allCities" = "Todas as Cidades"
|
||||||
|
"privateKey" = "Chave Privada"
|
||||||
|
"load" = "Carga"
|
||||||
|
|
||||||
[pages.xray.balancer]
|
[pages.xray.balancer]
|
||||||
"addBalancer" = "Adicionar Balanceador"
|
"addBalancer" = "Adicionar Balanceador"
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,8 @@
|
||||||
"confirm" = "Подтвердить"
|
"confirm" = "Подтвердить"
|
||||||
"cancel" = "Отмена"
|
"cancel" = "Отмена"
|
||||||
"close" = "Закрыть"
|
"close" = "Закрыть"
|
||||||
|
"save" = "Сохранить"
|
||||||
|
"logout" = "Выход"
|
||||||
"create" = "Создать"
|
"create" = "Создать"
|
||||||
"update" = "Обновить"
|
"update" = "Обновить"
|
||||||
"copy" = "Копировать"
|
"copy" = "Копировать"
|
||||||
|
|
@ -495,7 +497,9 @@
|
||||||
"ipv4Routing" = "Правила IPv4"
|
"ipv4Routing" = "Правила IPv4"
|
||||||
"ipv4RoutingDesc" = "Эти параметры позволят клиентам маршрутизироваться к целевым доменам только через IPv4"
|
"ipv4RoutingDesc" = "Эти параметры позволят клиентам маршрутизироваться к целевым доменам только через IPv4"
|
||||||
"warpRouting" = "Правила WARP"
|
"warpRouting" = "Правила WARP"
|
||||||
"warpRoutingDesc" = " Эти опции будут направлять трафик в зависимости от конкретного пункта назначения через WARP."
|
"warpRoutingDesc" = " Эти опции будут направлять трафик в зависимости от конкретного пункта назначения через WARP."
|
||||||
|
"nordRouting" = "Маршрутизация NordVPN"
|
||||||
|
"nordRoutingDesc" = "Эти опции будут направлять трафик в зависимости от конкретного пункта назначения через NordVPN."
|
||||||
"Template" = "Шаблон конфигурации Xray"
|
"Template" = "Шаблон конфигурации Xray"
|
||||||
"TemplateDesc" = "На основе шаблона создаётся конфигурационный файл Xray."
|
"TemplateDesc" = "На основе шаблона создаётся конфигурационный файл Xray."
|
||||||
"FreedomStrategy" = "Настройка стратегии протокола Freedom"
|
"FreedomStrategy" = "Настройка стратегии протокола Freedom"
|
||||||
|
|
@ -573,6 +577,14 @@
|
||||||
"testSuccess" = "Тест успешен"
|
"testSuccess" = "Тест успешен"
|
||||||
"testFailed" = "Тест не пройден"
|
"testFailed" = "Тест не пройден"
|
||||||
"testError" = "Не удалось протестировать исходящее подключение"
|
"testError" = "Не удалось протестировать исходящее подключение"
|
||||||
|
"nordvpn" = "NordVPN"
|
||||||
|
"accessToken" = "Токен доступа"
|
||||||
|
"country" = "Страна"
|
||||||
|
"server" = "Сервер"
|
||||||
|
"city" = "Город"
|
||||||
|
"allCities" = "Все города"
|
||||||
|
"privateKey" = "Приватный ключ"
|
||||||
|
"load" = "Нагрузка"
|
||||||
|
|
||||||
[pages.xray.balancer]
|
[pages.xray.balancer]
|
||||||
"addBalancer" = "Создать балансировщик"
|
"addBalancer" = "Создать балансировщик"
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,8 @@
|
||||||
"confirm" = "Onayla"
|
"confirm" = "Onayla"
|
||||||
"cancel" = "İptal"
|
"cancel" = "İptal"
|
||||||
"close" = "Kapat"
|
"close" = "Kapat"
|
||||||
|
"save" = "Kaydet"
|
||||||
|
"logout" = "Çıkış Yap"
|
||||||
"create" = "Oluştur"
|
"create" = "Oluştur"
|
||||||
"update" = "Güncelle"
|
"update" = "Güncelle"
|
||||||
"copy" = "Kopyala"
|
"copy" = "Kopyala"
|
||||||
|
|
@ -496,6 +498,8 @@
|
||||||
"ipv4RoutingDesc" = "Bu seçenekler belirli bir varış yerine IPv4 üzerinden trafiği yönlendirir."
|
"ipv4RoutingDesc" = "Bu seçenekler belirli bir varış yerine IPv4 üzerinden trafiği yönlendirir."
|
||||||
"warpRouting" = "WARP Yönlendirme"
|
"warpRouting" = "WARP Yönlendirme"
|
||||||
"warpRoutingDesc" = "Bu seçenekler belirli bir varış yerine WARP üzerinden trafiği yönlendirir."
|
"warpRoutingDesc" = "Bu seçenekler belirli bir varış yerine WARP üzerinden trafiği yönlendirir."
|
||||||
|
"nordRouting" = "NordVPN Yönlendirme"
|
||||||
|
"nordRoutingDesc" = "Bu seçenekler belirli bir varış yerine NordVPN üzerinden trafiği yönlendirir."
|
||||||
"Template" = "Gelişmiş Xray Yapılandırma Şablonu"
|
"Template" = "Gelişmiş Xray Yapılandırma Şablonu"
|
||||||
"TemplateDesc" = "Nihai Xray yapılandırma dosyası bu şablona göre oluşturulacaktır."
|
"TemplateDesc" = "Nihai Xray yapılandırma dosyası bu şablona göre oluşturulacaktır."
|
||||||
"FreedomStrategy" = "Freedom Protokol Stratejisi"
|
"FreedomStrategy" = "Freedom Protokol Stratejisi"
|
||||||
|
|
@ -573,6 +577,14 @@
|
||||||
"testSuccess" = "Test başarılı"
|
"testSuccess" = "Test başarılı"
|
||||||
"testFailed" = "Test başarısız"
|
"testFailed" = "Test başarısız"
|
||||||
"testError" = "Giden test edilemedi"
|
"testError" = "Giden test edilemedi"
|
||||||
|
"nordvpn" = "NordVPN"
|
||||||
|
"accessToken" = "Erişim Jetonu"
|
||||||
|
"country" = "Ülke"
|
||||||
|
"server" = "Sunucu"
|
||||||
|
"city" = "Şehir"
|
||||||
|
"allCities" = "Tüm Şehirler"
|
||||||
|
"privateKey" = "Özel Anahtar"
|
||||||
|
"load" = "Yük"
|
||||||
|
|
||||||
[pages.xray.balancer]
|
[pages.xray.balancer]
|
||||||
"addBalancer" = "Dengeleyici Ekle"
|
"addBalancer" = "Dengeleyici Ekle"
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,8 @@
|
||||||
"confirm" = "Підтвердити"
|
"confirm" = "Підтвердити"
|
||||||
"cancel" = "Скасувати"
|
"cancel" = "Скасувати"
|
||||||
"close" = "Закрити"
|
"close" = "Закрити"
|
||||||
|
"save" = "Зберегти"
|
||||||
|
"logout" = "Вийти"
|
||||||
"create" = "Створити"
|
"create" = "Створити"
|
||||||
"update" = "Оновити"
|
"update" = "Оновити"
|
||||||
"copy" = "Копіювати"
|
"copy" = "Копіювати"
|
||||||
|
|
@ -496,6 +498,8 @@
|
||||||
"ipv4RoutingDesc" = "Ці параметри спрямовуватимуть трафік на основі певного призначення через IPv4."
|
"ipv4RoutingDesc" = "Ці параметри спрямовуватимуть трафік на основі певного призначення через IPv4."
|
||||||
"warpRouting" = "WARP Маршрутизація"
|
"warpRouting" = "WARP Маршрутизація"
|
||||||
"warpRoutingDesc" = "Ці параметри маршрутизуватимуть трафік на основі певного пункту призначення через WARP."
|
"warpRoutingDesc" = "Ці параметри маршрутизуватимуть трафік на основі певного пункту призначення через WARP."
|
||||||
|
"nordRouting" = "Маршрутизація NordVPN"
|
||||||
|
"nordRoutingDesc" = "Ці параметри маршрутизуватимуть трафік на основі певного пункту призначення через NordVPN."
|
||||||
"Template" = "Шаблон розширеної конфігурації Xray"
|
"Template" = "Шаблон розширеної конфігурації Xray"
|
||||||
"TemplateDesc" = "Остаточний конфігураційний файл Xray буде створено на основі цього шаблону."
|
"TemplateDesc" = "Остаточний конфігураційний файл Xray буде створено на основі цього шаблону."
|
||||||
"FreedomStrategy" = "Стратегія протоколу свободи"
|
"FreedomStrategy" = "Стратегія протоколу свободи"
|
||||||
|
|
@ -573,6 +577,14 @@
|
||||||
"testSuccess" = "Тест успішний"
|
"testSuccess" = "Тест успішний"
|
||||||
"testFailed" = "Тест не пройдено"
|
"testFailed" = "Тест не пройдено"
|
||||||
"testError" = "Не вдалося протестувати вихідне з'єднання"
|
"testError" = "Не вдалося протестувати вихідне з'єднання"
|
||||||
|
"nordvpn" = "NordVPN"
|
||||||
|
"accessToken" = "Токен доступу"
|
||||||
|
"country" = "Країна"
|
||||||
|
"server" = "Сервер"
|
||||||
|
"city" = "Місто"
|
||||||
|
"allCities" = "Усі міста"
|
||||||
|
"privateKey" = "Приватний ключ"
|
||||||
|
"load" = "Навантаження"
|
||||||
|
|
||||||
[pages.xray.balancer]
|
[pages.xray.balancer]
|
||||||
"addBalancer" = "Додати балансир"
|
"addBalancer" = "Додати балансир"
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,8 @@
|
||||||
"confirm" = "Xác nhận"
|
"confirm" = "Xác nhận"
|
||||||
"cancel" = "Hủy bỏ"
|
"cancel" = "Hủy bỏ"
|
||||||
"close" = "Đóng"
|
"close" = "Đóng"
|
||||||
|
"save" = "Lưu"
|
||||||
|
"logout" = "Đăng xuất"
|
||||||
"create" = "Tạo"
|
"create" = "Tạo"
|
||||||
"update" = "Cập nhật"
|
"update" = "Cập nhật"
|
||||||
"copy" = "Sao chép"
|
"copy" = "Sao chép"
|
||||||
|
|
@ -496,6 +498,8 @@
|
||||||
"ipv4RoutingDesc" = "Những tùy chọn này sẽ chỉ định kết nối đến các tên miền mục tiêu qua IPv4."
|
"ipv4RoutingDesc" = "Những tùy chọn này sẽ chỉ định kết nối đến các tên miền mục tiêu qua IPv4."
|
||||||
"warpRouting" = "Định tuyến WARP"
|
"warpRouting" = "Định tuyến WARP"
|
||||||
"warpRoutingDesc" = "Cảnh báo: Trước khi sử dụng những tùy chọn này, hãy cài đặt WARP ở chế độ proxy socks5 trên máy chủ của bạn bằng cách làm theo các bước trên GitHub của bảng điều khiển. WARP sẽ định tuyến lưu lượng đến các trang web qua máy chủ Cloudflare."
|
"warpRoutingDesc" = "Cảnh báo: Trước khi sử dụng những tùy chọn này, hãy cài đặt WARP ở chế độ proxy socks5 trên máy chủ của bạn bằng cách làm theo các bước trên GitHub của bảng điều khiển. WARP sẽ định tuyến lưu lượng đến các trang web qua máy chủ Cloudflare."
|
||||||
|
"nordRouting" = "Định tuyến NordVPN"
|
||||||
|
"nordRoutingDesc" = "Các tùy chọn này sẽ định tuyến lưu lượng dựa trên đích cụ thể qua NordVPN."
|
||||||
"Template" = "Mẫu Cấu hình Xray"
|
"Template" = "Mẫu Cấu hình Xray"
|
||||||
"TemplateDesc" = "Tạo tệp cấu hình Xray cuối cùng dựa trên mẫu này."
|
"TemplateDesc" = "Tạo tệp cấu hình Xray cuối cùng dựa trên mẫu này."
|
||||||
"FreedomStrategy" = "Cấu hình Chiến lược cho Giao thức Freedom"
|
"FreedomStrategy" = "Cấu hình Chiến lược cho Giao thức Freedom"
|
||||||
|
|
@ -573,6 +577,14 @@
|
||||||
"testSuccess" = "Kiểm tra thành công"
|
"testSuccess" = "Kiểm tra thành công"
|
||||||
"testFailed" = "Kiểm tra thất bại"
|
"testFailed" = "Kiểm tra thất bại"
|
||||||
"testError" = "Không thể kiểm tra đầu ra"
|
"testError" = "Không thể kiểm tra đầu ra"
|
||||||
|
"nordvpn" = "NordVPN"
|
||||||
|
"accessToken" = "Mã truy cập"
|
||||||
|
"country" = "Quốc gia"
|
||||||
|
"server" = "Máy chủ"
|
||||||
|
"city" = "Thành phố"
|
||||||
|
"allCities" = "Tất cả thành phố"
|
||||||
|
"privateKey" = "Khóa riêng"
|
||||||
|
"load" = "Tải"
|
||||||
|
|
||||||
[pages.xray.balancer]
|
[pages.xray.balancer]
|
||||||
"addBalancer" = "Thêm cân bằng"
|
"addBalancer" = "Thêm cân bằng"
|
||||||
|
|
|
||||||
|
|
@ -574,6 +574,9 @@
|
||||||
"test" = "测试"
|
"test" = "测试"
|
||||||
"testResult" = "测试结果"
|
"testResult" = "测试结果"
|
||||||
"testing" = "正在测试连接..."
|
"testing" = "正在测试连接..."
|
||||||
|
"testSuccess" = "测试成功"
|
||||||
|
"testFailed" = "测试失败"
|
||||||
|
"testError" = "测试出站失败"
|
||||||
"nordvpn" = "NordVPN"
|
"nordvpn" = "NordVPN"
|
||||||
"accessToken" = "访问令牌"
|
"accessToken" = "访问令牌"
|
||||||
"country" = "国家"
|
"country" = "国家"
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,8 @@
|
||||||
"confirm" = "確定"
|
"confirm" = "確定"
|
||||||
"cancel" = "取消"
|
"cancel" = "取消"
|
||||||
"close" = "關閉"
|
"close" = "關閉"
|
||||||
|
"save" = "儲存"
|
||||||
|
"logout" = "登出"
|
||||||
"create" = "建立"
|
"create" = "建立"
|
||||||
"update" = "更新"
|
"update" = "更新"
|
||||||
"copy" = "複製"
|
"copy" = "複製"
|
||||||
|
|
@ -496,6 +498,8 @@
|
||||||
"ipv4RoutingDesc" = "此選項將僅通過 IPv4 路由到目標域"
|
"ipv4RoutingDesc" = "此選項將僅通過 IPv4 路由到目標域"
|
||||||
"warpRouting" = "WARP 路由"
|
"warpRouting" = "WARP 路由"
|
||||||
"warpRoutingDesc" = "注意:在使用這些選項之前,請按照面板 GitHub 上的步驟在你的伺服器上以 socks5 代理模式安裝 WARP。WARP 將通過 Cloudflare 伺服器將流量路由到網站。"
|
"warpRoutingDesc" = "注意:在使用這些選項之前,請按照面板 GitHub 上的步驟在你的伺服器上以 socks5 代理模式安裝 WARP。WARP 將通過 Cloudflare 伺服器將流量路由到網站。"
|
||||||
|
"nordRouting" = "NordVPN 路由"
|
||||||
|
"nordRoutingDesc" = "這些選項將根據特定目的地通過 NordVPN 路由流量。"
|
||||||
"Template" = "高階 Xray 配置模板"
|
"Template" = "高階 Xray 配置模板"
|
||||||
"TemplateDesc" = "最終的 Xray 配置檔案將基於此模板生成"
|
"TemplateDesc" = "最終的 Xray 配置檔案將基於此模板生成"
|
||||||
"FreedomStrategy" = "Freedom 協議策略"
|
"FreedomStrategy" = "Freedom 協議策略"
|
||||||
|
|
@ -573,6 +577,14 @@
|
||||||
"testSuccess" = "測試成功"
|
"testSuccess" = "測試成功"
|
||||||
"testFailed" = "測試失敗"
|
"testFailed" = "測試失敗"
|
||||||
"testError" = "測試出站失敗"
|
"testError" = "測試出站失敗"
|
||||||
|
"nordvpn" = "NordVPN"
|
||||||
|
"accessToken" = "訪問令牌"
|
||||||
|
"country" = "國家"
|
||||||
|
"server" = "伺服器"
|
||||||
|
"city" = "城市"
|
||||||
|
"allCities" = "所有城市"
|
||||||
|
"privateKey" = "私密金鑰"
|
||||||
|
"load" = "負載"
|
||||||
|
|
||||||
[pages.xray.balancer]
|
[pages.xray.balancer]
|
||||||
"addBalancer" = "新增負載均衡"
|
"addBalancer" = "新增負載均衡"
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue