diff --git a/api/dns/dto.go b/api/dns/dto.go new file mode 100644 index 00000000..0a28b9db --- /dev/null +++ b/api/dns/dto.go @@ -0,0 +1,115 @@ +package dns + +import ( + "github.com/0xJacky/Nginx-UI/internal/dns" + "github.com/0xJacky/Nginx-UI/model" +) + +type domainListQuery struct { + Keyword string `form:"keyword"` + CredentialID uint64 `form:"credential_id"` + Page int `form:"page"` + PerPage int `form:"per_page"` +} + +type domainRequest struct { + Domain string `json:"domain" binding:"required"` + Description string `json:"description"` + DnsCredentialID uint64 `json:"dns_credential_id" binding:"required"` +} + +type recordListQuery struct { + Type string `form:"type"` + Name string `form:"name"` + Page int `form:"page"` + PerPage int `form:"per_page"` +} + +type recordRequest struct { + Type string `json:"type" binding:"required"` + Name string `json:"name" binding:"required"` + Content string `json:"content" binding:"required"` + TTL int `json:"ttl" binding:"required,min=1"` + Priority *int `json:"priority"` + Weight *int `json:"weight"` + Proxied *bool `json:"proxied"` +} + +func toRecordInput(req recordRequest) dns.RecordInput { + return dns.RecordInput{ + Type: req.Type, + Name: req.Name, + Content: req.Content, + TTL: req.TTL, + Priority: req.Priority, + Weight: req.Weight, + Proxied: req.Proxied, + } +} + +const timeFormat = "2006-01-02T15:04:05Z07:00" + +type ddnsConfigRequest struct { + Enabled bool `json:"enabled"` + IntervalSeconds int `json:"interval_seconds" binding:"required,min=60"` + RecordIDs []string `json:"record_ids"` +} + +type ddnsRecordTarget struct { + ID string `json:"id"` + Name string `json:"name"` + Type string `json:"type"` +} + +type ddnsConfigResponse struct { + Enabled bool `json:"enabled"` + IntervalSeconds int `json:"interval_seconds"` + Targets []ddnsRecordTarget `json:"targets"` + LastIPv4 string `json:"last_ipv4,omitempty"` + LastIPv6 string `json:"last_ipv6,omitempty"` + LastRunAt string `json:"last_run_at,omitempty"` + LastError string `json:"last_error,omitempty"` +} + +func toDDNSResponse(cfg *model.DDNSConfig) ddnsConfigResponse { + resp := ddnsConfigResponse{ + Enabled: cfg != nil && cfg.Enabled, + IntervalSeconds: dns.DefaultDDNSInterval(), + Targets: []ddnsRecordTarget{}, + } + + if cfg == nil { + return resp + } + + interval := cfg.IntervalSeconds + if interval <= 0 { + interval = dns.DefaultDDNSInterval() + } + resp.IntervalSeconds = interval + resp.LastIPv4 = cfg.LastIPv4 + resp.LastIPv6 = cfg.LastIPv6 + resp.LastError = cfg.LastError + + if cfg.LastRunAt != nil { + resp.LastRunAt = cfg.LastRunAt.Format(timeFormat) + } + + for _, target := range cfg.Targets { + resp.Targets = append(resp.Targets, ddnsRecordTarget{ + ID: target.ID, + Name: target.Name, + Type: target.Type, + }) + } + + return resp +} + +type ddnsDomainItem struct { + ID uint64 `json:"id"` + Domain string `json:"domain"` + CredentialName string `json:"credential_name,omitempty"` + CredentialProvider string `json:"credential_provider,omitempty"` + Config ddnsConfigResponse `json:"config"` +} diff --git a/api/dns/handler.go b/api/dns/handler.go new file mode 100644 index 00000000..d2873edd --- /dev/null +++ b/api/dns/handler.go @@ -0,0 +1,292 @@ +package dns + +import ( + "net/http" + "strings" + + "github.com/gin-gonic/gin" + "github.com/samber/lo" + "github.com/spf13/cast" + "github.com/uozi-tech/cosy" + + "github.com/0xJacky/Nginx-UI/internal/cron" + dnsService "github.com/0xJacky/Nginx-UI/internal/dns" + "github.com/0xJacky/Nginx-UI/model" +) + +func ListDomains(c *gin.Context) { + cosy.Core[model.DnsDomain](c). + SetPreloads("DnsCredential"). + SetFussy("domain", "description"). + PagingList() +} + +func GetDomain(c *gin.Context) { + cosy.Core[model.DnsDomain](c). + SetPreloads("DnsCredential"). + Get() +} + +func CreateDomain(c *gin.Context) { + cosy.Core[model.DnsDomain](c). + SetValidRules(gin.H{ + "domain": "required", + "description": "omitempty", + "dns_credential_id": "required", + }). + BeforeExecuteHook(domainMutationHook(dnsService.NewService(), false)). + Create() +} + +func UpdateDomain(c *gin.Context) { + cosy.Core[model.DnsDomain](c). + SetValidRules(gin.H{ + "domain": "required", + "description": "omitempty", + "dns_credential_id": "required", + }). + BeforeExecuteHook(domainMutationHook(dnsService.NewService(), true)). + Modify() +} + +func DeleteDomain(c *gin.Context) { + cosy.Core[model.DnsDomain](c).Destroy() +} + +func ListRecords(c *gin.Context) { + domainID := cast.ToUint64(c.Param("id")) + var params recordListQuery + _ = c.ShouldBindQuery(¶ms) + + svc := dnsService.NewService() + records, err := svc.ListRecords( + c.Request.Context(), + domainID, + dnsService.RecordListOptions{ + Filter: dnsService.RecordFilter{ + Type: params.Type, + Name: params.Name, + }, + }, + ) + if err != nil { + cosy.ErrHandler(c, err) + return + } + + page := lo.If(params.Page < 1, 1).Else(params.Page) + perPage := lo.If(params.PerPage <= 0, 50).Else(params.PerPage) + + total := len(records) + start := max((page-1)*perPage, 0) + end := min(start+perPage, total) + + var pagedRecords []dnsService.Record + if total == 0 || start >= total { + pagedRecords = []dnsService.Record{} + } else { + pagedRecords = records[start:end] + } + + c.JSON(http.StatusOK, gin.H{ + "data": pagedRecords, + "pagination": buildPagination(page, perPage, int64(total)), + }) +} + +func CreateRecord(c *gin.Context) { + domainID := cast.ToUint64(c.Param("id")) + var payload recordRequest + if !cosy.BindAndValid(c, &payload) { + return + } + + svc := dnsService.NewService() + record, err := svc.CreateRecord(c.Request.Context(), domainID, toRecordInput(payload)) + if err != nil { + cosy.ErrHandler(c, err) + return + } + + c.JSON(http.StatusCreated, record) +} + +func UpdateRecord(c *gin.Context) { + domainID := cast.ToUint64(c.Param("id")) + recordID := c.Param("record_id") + + var payload recordRequest + if !cosy.BindAndValid(c, &payload) { + return + } + + svc := dnsService.NewService() + record, err := svc.UpdateRecord(c.Request.Context(), domainID, recordID, toRecordInput(payload)) + if err != nil { + cosy.ErrHandler(c, err) + return + } + + c.JSON(http.StatusOK, record) +} + +func DeleteRecord(c *gin.Context) { + domainID := cast.ToUint64(c.Param("id")) + recordID := c.Param("record_id") + + svc := dnsService.NewService() + if err := svc.DeleteRecord(c.Request.Context(), domainID, recordID); err != nil { + cosy.ErrHandler(c, err) + return + } + + c.Status(http.StatusNoContent) +} + +// GetDDNSConfig returns the DDNS configuration for a domain. +func GetDDNSConfig(c *gin.Context) { + domainID := cast.ToUint64(c.Param("id")) + svc := dnsService.NewService() + + cfg, err := svc.GetDDNSConfig(c.Request.Context(), domainID) + if err != nil { + cosy.ErrHandler(c, err) + return + } + + c.JSON(http.StatusOK, toDDNSResponse(cfg)) +} + +// ListDDNSConfig returns DDNS overview for all domains. +func ListDDNSConfig(c *gin.Context) { + ctx := c.Request.Context() + domains, err := dnsService.ListDDNSDomains(ctx) + if err != nil { + cosy.ErrHandler(c, err) + return + } + + items := make([]ddnsDomainItem, 0, len(domains)) + for _, domain := range domains { + cfg := domain.DDNSConfig + if cfg == nil { + cfg = &model.DDNSConfig{ + Enabled: false, + IntervalSeconds: dnsService.DefaultDDNSInterval(), + Targets: []model.DDNSRecordTarget{}, + } + } else if cfg.IntervalSeconds <= 0 { + cfg.IntervalSeconds = dnsService.DefaultDDNSInterval() + } + + credName := "" + credProvider := "" + if domain.DnsCredential != nil { + credName = domain.DnsCredential.Name + credProvider = domain.DnsCredential.Provider + } + + item := ddnsDomainItem{ + ID: domain.ID, + Domain: domain.Domain, + CredentialName: credName, + CredentialProvider: credProvider, + Config: toDDNSResponse(cfg), + } + items = append(items, item) + } + + c.JSON(http.StatusOK, gin.H{ + "data": items, + }) +} + +// UpdateDDNSConfig updates DDNS settings for a domain and restarts its schedule. +func UpdateDDNSConfig(c *gin.Context) { + domainID := cast.ToUint64(c.Param("id")) + + var payload ddnsConfigRequest + if !cosy.BindAndValid(c, &payload) { + return + } + + if payload.Enabled && len(payload.RecordIDs) == 0 { + cosy.ErrHandler(c, dnsService.ErrDDNSTargetRequired) + return + } + + svc := dnsService.NewService() + cfg, err := svc.UpdateDDNSConfig(c.Request.Context(), domainID, dnsService.DDNSUpdateInput{ + Enabled: payload.Enabled, + IntervalSeconds: payload.IntervalSeconds, + RecordIDs: payload.RecordIDs, + }) + if err != nil { + cosy.ErrHandler(c, err) + return + } + + if cfg.Enabled { + if err := cron.AddOrUpdateDDNSJob(domainID, cfg.IntervalSeconds); err != nil { + cosy.ErrHandler(c, err) + return + } + } else { + if err := cron.RemoveDDNSJob(domainID); err != nil { + cosy.ErrHandler(c, err) + return + } + } + + c.JSON(http.StatusOK, toDDNSResponse(cfg)) +} + +func buildPagination(page, perPage int, total int64) model.Pagination { + page = lo.If(page < 1, 1).Else(page) + perPage = lo.If(perPage <= 0, 50).Else(perPage) + + totalPages := total / cast.ToInt64(perPage) + if total%cast.ToInt64(perPage) != 0 { + totalPages++ + } + + return model.Pagination{ + Total: total, + PerPage: perPage, + CurrentPage: page, + TotalPages: totalPages, + } +} + +func domainMutationHook(svc *dnsService.Service, isUpdate bool) func(ctx *cosy.Ctx[model.DnsDomain]) { + return func(ctx *cosy.Ctx[model.DnsDomain]) { + normalized, err := dnsService.NormalizeDomain(ctx.Model.Domain) + if err != nil { + ctx.AbortWithError(err) + return + } + + credential, err := dnsService.LoadCredential(ctx.Request.Context(), ctx.Model.DnsCredentialID) + if err != nil { + ctx.AbortWithError(err) + return + } + + excludeID := uint64(0) + if isUpdate { + if ctx.ID == 0 { + ctx.ID = ctx.GetParamID() + } + excludeID = ctx.ID + } + + if err := dnsService.EnsureDomainUnique(ctx.Request.Context(), normalized, credential.ID, excludeID); err != nil { + ctx.AbortWithError(err) + return + } + + ctx.Model.Domain = normalized + ctx.Model.Description = strings.TrimSpace(ctx.Model.Description) + ctx.Model.DnsCredentialID = credential.ID + } +} diff --git a/api/dns/router.go b/api/dns/router.go new file mode 100644 index 00000000..4ab14aa7 --- /dev/null +++ b/api/dns/router.go @@ -0,0 +1,30 @@ +package dns + +import ( + "github.com/gin-gonic/gin" + + _ "github.com/0xJacky/Nginx-UI/internal/dns/providers/alidns" + _ "github.com/0xJacky/Nginx-UI/internal/dns/providers/cloudflare" + _ "github.com/0xJacky/Nginx-UI/internal/dns/providers/tencentcloud" +) + +func InitRouter(r *gin.RouterGroup) { + group := r.Group("/dns") + { + group.GET("/domains", ListDomains) + group.GET("/domains/:id", GetDomain) + group.POST("/domains", CreateDomain) + group.POST("/domains/:id", UpdateDomain) + group.DELETE("/domains/:id", DeleteDomain) + + group.GET("/domains/:id/records", ListRecords) + group.POST("/domains/:id/records", CreateRecord) + group.PUT("/domains/:id/records/:record_id", UpdateRecord) + group.DELETE("/domains/:id/records/:record_id", DeleteRecord) + + group.GET("/domains/:id/ddns", GetDDNSConfig) + group.PUT("/domains/:id/ddns", UpdateDDNSConfig) + + group.GET("/ddns", ListDDNSConfig) + } +} diff --git a/app/components.d.ts b/app/components.d.ts index 5779cd36..4b57dbee 100644 --- a/app/components.d.ts +++ b/app/components.d.ts @@ -28,6 +28,8 @@ declare module 'vue' { ACollapsePanel: typeof import('ant-design-vue/es')['CollapsePanel'] AComment: typeof import('ant-design-vue/es')['Comment'] AConfigProvider: typeof import('ant-design-vue/es')['ConfigProvider'] + ADescriptions: typeof import('ant-design-vue/es')['Descriptions'] + ADescriptionsItem: typeof import('ant-design-vue/es')['DescriptionsItem'] ADivider: typeof import('ant-design-vue/es')['Divider'] ADrawer: typeof import('ant-design-vue/es')['Drawer'] ADropdown: typeof import('ant-design-vue/es')['Dropdown'] @@ -50,6 +52,7 @@ declare module 'vue' { AMenuDivider: typeof import('ant-design-vue/es')['MenuDivider'] AMenuItem: typeof import('ant-design-vue/es')['MenuItem'] AModal: typeof import('ant-design-vue/es')['Modal'] + APagination: typeof import('ant-design-vue/es')['Pagination'] APopconfirm: typeof import('ant-design-vue/es')['Popconfirm'] APopover: typeof import('ant-design-vue/es')['Popover'] AppProviderAppProvider: typeof import('./src/components/AppProvider/AppProvider.vue')['default'] @@ -64,6 +67,7 @@ declare module 'vue' { ASelect: typeof import('ant-design-vue/es')['Select'] ASelectOptGroup: typeof import('ant-design-vue/es')['SelectOptGroup'] ASelectOption: typeof import('ant-design-vue/es')['SelectOption'] + ASkeleton: typeof import('ant-design-vue/es')['Skeleton'] ASpace: typeof import('ant-design-vue/es')['Space'] ASpin: typeof import('ant-design-vue/es')['Spin'] AStatistic: typeof import('ant-design-vue/es')['Statistic'] @@ -164,6 +168,8 @@ declare global { const ACollapsePanel: typeof import('ant-design-vue/es')['CollapsePanel'] const AComment: typeof import('ant-design-vue/es')['Comment'] const AConfigProvider: typeof import('ant-design-vue/es')['ConfigProvider'] + const ADescriptions: typeof import('ant-design-vue/es')['Descriptions'] + const ADescriptionsItem: typeof import('ant-design-vue/es')['DescriptionsItem'] const ADivider: typeof import('ant-design-vue/es')['Divider'] const ADrawer: typeof import('ant-design-vue/es')['Drawer'] const ADropdown: typeof import('ant-design-vue/es')['Dropdown'] @@ -186,6 +192,7 @@ declare global { const AMenuDivider: typeof import('ant-design-vue/es')['MenuDivider'] const AMenuItem: typeof import('ant-design-vue/es')['MenuItem'] const AModal: typeof import('ant-design-vue/es')['Modal'] + const APagination: typeof import('ant-design-vue/es')['Pagination'] const APopconfirm: typeof import('ant-design-vue/es')['Popconfirm'] const APopover: typeof import('ant-design-vue/es')['Popover'] const AppProviderAppProvider: typeof import('./src/components/AppProvider/AppProvider.vue')['default'] @@ -200,6 +207,7 @@ declare global { const ASelect: typeof import('ant-design-vue/es')['Select'] const ASelectOptGroup: typeof import('ant-design-vue/es')['SelectOptGroup'] const ASelectOption: typeof import('ant-design-vue/es')['SelectOption'] + const ASkeleton: typeof import('ant-design-vue/es')['Skeleton'] const ASpace: typeof import('ant-design-vue/es')['Space'] const ASpin: typeof import('ant-design-vue/es')['Spin'] const AStatistic: typeof import('ant-design-vue/es')['Statistic'] diff --git a/app/src/api/dns.ts b/app/src/api/dns.ts new file mode 100644 index 00000000..a94ae475 --- /dev/null +++ b/app/src/api/dns.ts @@ -0,0 +1,110 @@ +import type { ModelBase, Pagination } from '@/api/curd' +import type { DnsCredential } from '@/api/dns_credential' +import { http, useCurdApi } from '@uozi-admin/request' + +export interface DNSDomain extends ModelBase { + domain: string + description?: string + dns_credential_id: number + dns_credential?: { + id: number + name: string + provider: string + } +} + +export interface DNSRecord { + id: string + type: string + name: string + content: string + ttl: number + priority?: number + weight?: number + proxied?: boolean +} + +export interface DDNSRecordTarget { + id: string + name: string + type: string +} + +export interface DDNSConfig { + enabled: boolean + interval_seconds: number + targets: DDNSRecordTarget[] + last_ipv4?: string + last_ipv6?: string + last_run_at?: string + last_error?: string +} + +export interface DDNSDomainItem { + id: number + domain: string + credential_name?: string + credential_provider?: string + config: DDNSConfig +} + +export interface UpdateDDNSPayload { + enabled: boolean + interval_seconds: number + record_ids: string[] +} + +export interface DomainListParams { + keyword?: string + credential_id?: number + page?: number + per_page?: number +} + +export interface RecordListParams { + type?: string + name?: string + page?: number + per_page?: number +} + +export interface RecordPayload { + type: string + name: string + content: string + ttl: number + priority?: number + weight?: number + proxied?: boolean +} + +const baseDomainUrl = '/dns/domains' + +const domainApi = useCurdApi(baseDomainUrl) + +export const dnsApi = { + ...domainApi, + listRecords(domainId: number, params?: RecordListParams) { + return http.get<{ data: DNSRecord[], pagination: Pagination }>(`${baseDomainUrl}/${domainId}/records`, { params }) + }, + createRecord(domainId: number, payload: RecordPayload) { + return http.post(`${baseDomainUrl}/${domainId}/records`, payload) + }, + updateRecord(domainId: number, recordId: string, payload: RecordPayload) { + return http.put(`${baseDomainUrl}/${domainId}/records/${recordId}`, payload) + }, + deleteRecord(domainId: number, recordId: string) { + return http.delete(`${baseDomainUrl}/${domainId}/records/${recordId}`) + }, + getDDNSConfig(domainId: number) { + return http.get(`${baseDomainUrl}/${domainId}/ddns`) + }, + updateDDNSConfig(domainId: number, payload: UpdateDDNSPayload) { + return http.put(`${baseDomainUrl}/${domainId}/ddns`, payload) + }, + listDDNS() { + return http.get<{ data: DDNSDomainItem[] }>(`/dns/ddns`) + }, +} + +export type { DnsCredential } diff --git a/app/src/components/AutoCertForm/DNSChallenge.vue b/app/src/components/AutoCertForm/DNSChallenge.vue index 4549c36b..752c375f 100644 --- a/app/src/components/AutoCertForm/DNSChallenge.vue +++ b/app/src/components/AutoCertForm/DNSChallenge.vue @@ -5,6 +5,7 @@ import type { Ref } from 'vue' import type { AutoCertOptions, DNSProvider } from '@/api/auto_cert' import auto_cert from '@/api/auto_cert' import dns_credential from '@/api/dns_credential' +import { filterAllowedDnsProviders } from '@/constants/dns_providers' const providers = ref([]) as Ref const credentials = ref([]) @@ -20,8 +21,9 @@ const code = computed(() => { return data.value.code }) -const providerIdx = ref() +const providerIdx = ref(undefined) function init() { + providerIdx.value = undefined providers.value?.forEach((v: DNSProvider, k: number) => { if (v.code === code.value) providerIdx.value = k @@ -29,7 +31,12 @@ function init() { } const current = computed(() => { - return providers.value?.[providerIdx.value || -1] + const idx = providerIdx.value + if (idx === undefined || idx === null) + return undefined + if (idx < 0 || idx >= providers.value.length) + return undefined + return providers.value?.[idx] }) const mounted = ref(false) @@ -37,9 +44,19 @@ const mounted = ref(false) watch(code, init) watch(current, () => { + if (!current.value) { + credentials.value = [] + if (mounted.value) { + data.value.code = undefined + data.value.provider = undefined + data.value.dns_credential_id = undefined + } + return + } credentials.value = [] data.value.code = current.value.code - data.value.provider = current.value.name + // Keep provider consistent with credential records (prefer provider/code over display name). + data.value.provider = current.value.provider || current.value.code || current.value.name if (mounted.value) data.value.dns_credential_id = undefined @@ -55,16 +72,26 @@ watch(current, () => { onMounted(async () => { await auto_cert.get_dns_providers().then(r => { - providers.value = r + providers.value = filterAllowedDnsProviders(r) }).then(() => { init() }) if (data.value.dns_credential_id) { await dns_credential.getItem(data.value.dns_credential_id).then(r => { - data.value.code = r.code - data.value.provider = r.provider - providerIdx.value = providers.value.findIndex(v => v.code === r.code) + const idx = providers.value.findIndex(v => v.code === r.code) + if (idx > -1) { + data.value.code = r.code + data.value.provider = r.provider + providerIdx.value = idx + } + else { + // provider not supported anymore; clear existing selection to keep form consistent + data.value.code = undefined + data.value.provider = undefined + data.value.dns_credential_id = undefined + providerIdx.value = undefined + } }) } @@ -101,12 +128,12 @@ function filterOption(input: string, option?: DefaultOptionType) { /> diff --git a/app/src/constants/dns_providers.ts b/app/src/constants/dns_providers.ts new file mode 100644 index 00000000..4dea6f20 --- /dev/null +++ b/app/src/constants/dns_providers.ts @@ -0,0 +1,31 @@ +import type { DNSProvider } from '@/api/auto_cert' + +export const ALLOWED_DNS_PROVIDER_CODES = ['alidns', 'tencentcloud', 'cloudflare'] as const + +type DNSProviderIdentifier = Pick | null + +const allowedProviderSet = new Set(ALLOWED_DNS_PROVIDER_CODES) + +export function normalizeProviderCode(value?: string | null) { + return (value ?? '').trim().toLowerCase() +} + +export function resolveProviderCode(provider?: DNSProviderIdentifier) { + if (!provider) + return '' + return normalizeProviderCode(provider.code ?? provider.provider ?? provider.name) +} + +export function isAllowedDnsProvider(provider?: DNSProviderIdentifier) { + const code = resolveProviderCode(provider) + return Boolean(code) && allowedProviderSet.has(code) +} + +export function isAllowedDnsProviderCode(value?: string | null) { + const normalized = normalizeProviderCode(value) + return Boolean(normalized) && allowedProviderSet.has(normalized) +} + +export function filterAllowedDnsProviders>(list: T[]) { + return list.filter(item => isAllowedDnsProvider(item)) +} diff --git a/app/src/language/ar/app.po b/app/src/language/ar/app.po index 58aa8c6b..0247082a 100644 --- a/app/src/language/ar/app.po +++ b/app/src/language/ar/app.po @@ -187,8 +187,10 @@ msgstr "إجراء" #: src/views/backup/AutoBackup/AutoBackup.vue:273 #: src/views/certificate/ACMEUser.vue:131 #: src/views/certificate/CertificateList/certColumns.tsx:92 -#: src/views/certificate/DNSCredential.vue:71 -#: src/views/config/configColumns.tsx:51 src/views/namespace/columns.ts:97 +#: src/views/config/configColumns.tsx:51 +#: src/views/dns/components/DNSRecordTable.vue:41 +#: src/views/dns/DDNSManager.vue:91 src/views/dns/DNSCredential.vue:71 +#: src/views/dns/DNSDomainList.vue:211 src/views/namespace/columns.ts:97 #: src/views/nginx_log/NginxLogList.vue:338 src/views/node/nodeColumns.tsx:96 #: src/views/notification/notificationColumns.tsx:72 #: src/views/preference/components/ExternalNotify/columns.tsx:85 @@ -242,6 +244,10 @@ msgstr "إضافة رأس" msgid "Add Location" msgstr "أضف مكان" +#: src/views/dns/DNSRecordManager.vue:171 +msgid "Add Record" +msgstr "إضافة سجل" + #: src/components/NgxConfigEditor/NgxServer.vue:92 msgid "Add Server" msgstr "إضافة خادم" @@ -262,7 +268,7 @@ msgstr "إضافة upstream" msgid "Added successfully" msgstr "تمت الإضافة بنجاح" -#: src/views/certificate/components/DNSChallenge.vue:97 +#: src/views/dns/components/DNSChallenge.vue:98 msgid "Additional" msgstr "إضافي" @@ -299,6 +305,10 @@ msgstr "الإعدادات المتقدمة" msgid "Afterwards, refresh this page and click add passkey again." msgstr "بعد ذلك، قم بتحديث هذه الصفحة وانقر على إضافة مفتاح مرور مرة أخرى." +#: src/views/dns/components/DNSRecordFilter.vue:55 +msgid "All" +msgstr "الكل" + #: src/views/system/Licenses.vue:152 msgid "All Components" msgstr "جميع المكونات" @@ -340,7 +350,7 @@ msgstr "يمكن استخدام أي عنوان IP قابل للوصول مع س msgid "API Base Url" msgstr "عنوان URL الأساسي لAPI" -#: src/views/certificate/components/DNSChallenge.vue:70 +#: src/views/dns/components/DNSChallenge.vue:71 msgid "API Document" msgstr "ملف API" @@ -376,6 +386,10 @@ msgstr "هل أنت متأكد من حذف عنوان IP المحظور هذا msgid "Are you sure to delete this passkey immediately?" msgstr "هل أنت متأكد من حذف مفتاح المرور هذا على الفور؟" +#: src/views/dns/components/DNSRecordTable.vue:90 +msgid "Are you sure to delete this record?" +msgstr "هل أنت متأكد من حذف هذا السجل؟" + #: src/views/preference/components/AuthSettings/RecoveryCodes.vue:155 msgid "Are you sure to generate new recovery codes?" msgstr "هل أنت متأكد من رغبتك في إنشاء رموز استرداد جديدة؟" @@ -545,7 +559,7 @@ msgstr "متوسط/زيارة الصفحة" #: src/views/certificate/components/CertificateActions.vue:22 #: src/views/config/components/ConfigLeftPanel.vue:274 #: src/views/config/ConfigList.vue:120 src/views/config/ConfigList.vue:217 -#: src/views/nginx_log/NginxLog.vue:129 +#: src/views/dns/DNSRecordManager.vue:223 src/views/nginx_log/NginxLog.vue:129 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:183 #: src/views/stream/components/StreamEditor.vue:147 msgid "Back" @@ -693,6 +707,10 @@ msgstr "المتصفح" msgid "Browser Statistics" msgstr "إحصائيات المتصفح" +#: src/views/dns/DNSDomainList.vue:257 +msgid "Business contact:" +msgstr "اتصال تجاري:" + #: src/views/nginx_log/components/IndexingSettingsModal.vue:316 msgid "" "By enabling advanced indexing, you acknowledge that your system meets the " @@ -762,6 +780,7 @@ msgstr "" #: src/components/NgxConfigEditor/NgxUpstream.vue:32 src/language/curd.ts:37 #: src/views/config/components/Delete.vue:98 #: src/views/dashboard/components/SiteHealthCheckModal.vue:710 +#: src/views/dns/DDNSManager.vue:244 src/views/dns/DNSRecordManager.vue:212 #: src/views/nginx_log/components/IndexingSettingsModal.vue:102 #: src/views/nginx_log/indexing/IndexManagement.vue:33 #: src/views/nginx_log/indexing/IndexManagement.vue:59 @@ -912,7 +931,7 @@ msgstr "نوع الشهادة" msgid "Certificates" msgstr "شهادات" -#: src/routes/modules/certificates.ts:36 +#: src/routes/modules/certificates.ts:28 msgid "Certificates List" msgstr "قائمة الشهادات" @@ -1293,7 +1312,7 @@ msgstr "مسار التكوين فارغ" msgid "Config Template" msgstr "قالب التكوين" -#: src/views/certificate/DNSCredential.vue:52 +#: src/views/dns/DNSCredential.vue:52 msgid "Configuration" msgstr "التكوين" @@ -1321,6 +1340,14 @@ msgstr "اسم التكوين" msgid "Configurations" msgstr "التكوينات" +#: src/views/dns/DDNSManager.vue:201 +msgid "Configure" +msgstr "تكوين" + +#: src/views/dns/DDNSManager.vue:211 +msgid "Configure DDNS" +msgstr "تكوين DDNS" + #: src/views/site/site_add/SiteAdd.vue:81 msgid "Configure SSL" msgstr "تكوين SSL" @@ -1442,6 +1469,10 @@ msgstr "إنشاء ملف" msgid "Create Folder" msgstr "إنشاء مجلد" +#: src/views/dns/DNSRecordManager.vue:200 +msgid "Create Record" +msgstr "إنشاء سجل" + #: src/views/backup/components/BackupCreator.vue:75 msgid "" "Create system backups including Nginx configuration and Nginx UI settings. " @@ -1467,11 +1498,12 @@ msgstr "تم الإنشاء بنجاح" msgid "Creating client facilitates communication with the CA server" msgstr "يؤدي إنشاء العميل إلى تسهيل الاتصال بخادم CA" -#: src/components/AutoCertForm/DNSChallenge.vue:105 +#: src/components/AutoCertForm/DNSChallenge.vue:131 +#: src/views/dns/DDNSManager.vue:65 src/views/dns/DNSDomainList.vue:109 msgid "Credential" msgstr "بيان الاعتماد" -#: src/views/certificate/components/DNSChallenge.vue:86 +#: src/routes/modules/dns.ts:20 src/views/dns/components/DNSChallenge.vue:87 msgid "Credentials" msgstr "بيانات الاعتماد" @@ -1586,6 +1618,18 @@ msgstr "أيام" msgid "Db file not found" msgstr "ملف قاعدة البيانات غير موجود" +#: src/routes/modules/dns.ts:36 +msgid "DDNS" +msgstr "DDNS" + +#: src/views/dns/DDNSManager.vue:153 +msgid "DDNS Overview" +msgstr "نظرة عامة على DDNS" + +#: src/views/dns/DDNSManager.vue:135 +msgid "DDNS saved" +msgstr "تم حفظ DDNS" + #: src/constants/errors/geolite.ts:12 msgid "Decompression succeeded but failed to delete compressed file: {0}" msgstr "تم التفكيك بنجاح لكن فشل حذف الملف المضغوط: {0}" @@ -1610,6 +1654,7 @@ msgstr "حدد اسم منطقة الذاكرة المشتركة والحجم، #: src/views/config/components/Delete.vue:65 #: src/views/config/components/Delete.vue:97 #: src/views/config/ConfigList.vue:199 +#: src/views/dns/components/DNSRecordTable.vue:94 #: src/views/site/site_list/SiteList.vue:100 #: src/views/stream/StreamList.vue:110 msgid "Delete" @@ -1851,7 +1896,8 @@ msgid "Disable stream %{name} from %{node} successfully" msgstr "تم تعطيل الدفق %{name} من %{node} بنجاح" #: src/views/backup/AutoBackup/AutoBackup.vue:175 -#: src/views/node/nodeColumns.tsx:60 src/views/node/nodeColumns.tsx:78 +#: src/views/dns/DDNSManager.vue:175 src/views/node/nodeColumns.tsx:60 +#: src/views/node/nodeColumns.tsx:78 #: src/views/preference/tabs/HTTPSettings.vue:24 #: src/views/preference/tabs/NodeSettings.vue:25 #: src/views/preference/tabs/NodeSettings.vue:30 @@ -1876,16 +1922,35 @@ msgstr "غير متصل" msgid "Disk IO" msgstr "إدخال/إخراج القرص" -#: src/routes/modules/certificates.ts:28 -#: src/views/certificate/DNSCredential.vue:79 +#: src/routes/modules/dns.ts:11 +msgid "DNS" +msgstr "DNS" + +#: src/views/dns/DNSCredential.vue:79 msgid "DNS Credentials" msgstr "بيانات اعتماد DNS" -#: src/components/AutoCertForm/DNSChallenge.vue:95 -#: src/views/certificate/components/DNSChallenge.vue:59 +#: src/routes/modules/dns.ts:28 src/views/dns/DNSDomainList.vue:228 +msgid "DNS Domains" +msgstr "نطاقات DNS" + +#: src/views/dns/components/DNSRecordTable.vue:81 +msgid "DNS Only" +msgstr "DNS فقط" + +#: src/components/AutoCertForm/DNSChallenge.vue:121 +#: src/views/dns/components/DNSChallenge.vue:60 msgid "DNS Provider" msgstr "مزود DNS" +#: src/views/dns/DNSDomainList.vue:244 +msgid "DNS Provider Support" +msgstr "دعم موفر DNS" + +#: src/routes/modules/dns.ts:44 src/views/dns/DNSRecordManager.vue:58 +msgid "DNS Records" +msgstr "سجلات DNS" + #: src/views/dashboard/components/SiteHealthCheckModal.vue:678 msgid "DNS Resolver" msgstr "حل DNS" @@ -1951,6 +2016,7 @@ msgid "Document Count" msgstr "عدد المستندات" #: src/views/certificate/components/DNSIssueCertificate.vue:119 +#: src/views/dns/DDNSManager.vue:60 src/views/dns/DNSDomainList.vue:98 msgid "Domain" msgstr "نطاق" @@ -2038,7 +2104,7 @@ msgstr "مفتاح HMAC EAB" msgid "EAB Key ID" msgstr "معرف مفتاح EAB" -#: src/language/curd.ts:8 +#: src/language/curd.ts:8 src/views/dns/components/DNSRecordTable.vue:87 msgid "Edit" msgstr "تعديل" @@ -2052,6 +2118,10 @@ msgstr "تعديل %{n}" msgid "Edit Configuration" msgstr "تعديل التكوين" +#: src/views/dns/DNSRecordManager.vue:200 +msgid "Edit Record" +msgstr "تعديل السجل" + #: src/routes/modules/sites.ts:34 msgid "Edit Site" msgstr "تعديل الموقع" @@ -2102,6 +2172,10 @@ msgstr "تمكين إكمال التعليمات البرمجية" msgid "Enable compression for content transfer" msgstr "تمكين الضغط لنقل المحتوى" +#: src/views/dns/DDNSManager.vue:218 +msgid "Enable DDNS" +msgstr "تمكين DDNS" + #: src/views/dashboard/components/SiteHealthCheckModal.vue:473 msgid "Enable Health Check" msgstr "تمكين فحص الصحة" @@ -2189,7 +2263,8 @@ msgid "Enable TOTP" msgstr "تفعيل TOTP" #: src/views/backup/AutoBackup/AutoBackup.vue:174 -#: src/views/node/nodeColumns.tsx:69 src/views/node/nodeColumns.tsx:75 +#: src/views/dns/DDNSManager.vue:175 src/views/node/nodeColumns.tsx:69 +#: src/views/node/nodeColumns.tsx:75 #: src/views/preference/components/ExternalNotify/columns.tsx:47 #: src/views/preference/tabs/HTTPSettings.vue:24 #: src/views/preference/tabs/LogrotateSettings.vue:20 @@ -3149,14 +3224,19 @@ msgstr "القيمة الأعلى تعني إعادة استخدام أفضل ل msgid "History" msgstr "السجل" -#: src/routes/index.ts:52 +#: src/routes/index.ts:54 msgid "Home" msgstr "الصفحة الرئيسية" +#: src/views/dns/components/DNSRecordFilter.vue:42 #: src/views/preference/tabs/ServerSettings.vue:19 msgid "Host" msgstr "المضيف" +#: src/views/dns/components/DNSRecordFilter.vue:45 +msgid "Host, e.g. @ or www" +msgstr "المضيف، مثل @ أو www" + #: src/views/backup/AutoBackup/components/CronEditor.vue:159 #: src/views/nginx_log/dashboard/components/HourlyChart.vue:87 msgid "Hour" @@ -3228,7 +3308,7 @@ msgstr "" msgid "Import" msgstr "استيراد" -#: src/routes/modules/certificates.ts:54 +#: src/routes/modules/certificates.ts:46 #: src/views/certificate/CertificateEditor.vue:84 msgid "Import Certificate" msgstr "استيراد شهادة" @@ -3351,10 +3431,15 @@ msgstr "" "لا يُسمح بالتثبيت بعد 10 دقائق من بدء تشغيل النظام، يرجى إعادة تشغيل واجهة " "Nginx." +#: src/views/dns/DDNSManager.vue:79 #: src/views/preference/tabs/LogrotateSettings.vue:26 msgid "Interval" msgstr "فترة" +#: src/views/dns/DDNSManager.vue:232 +msgid "Interval (seconds)" +msgstr "الفاصل الزمني (بالثواني)" + #: src/views/certificate/ACMEUser.vue:166 msgid "Invalid" msgstr "غير صالح" @@ -3583,6 +3668,10 @@ msgstr "آخر فهرسة" msgid "Last month" msgstr "الشهر الماضي" +#: src/views/dns/DDNSManager.vue:87 +msgid "Last run" +msgstr "آخر تشغيل" + #: src/views/dashboard/NginxDashBoard.vue:138 msgid "Last update" msgstr "آخر تحديث" @@ -3849,6 +3938,10 @@ msgstr "" msgid "Manage Configs" msgstr "إدارة التكوينات" +#: src/views/dns/DNSDomainList.vue:236 +msgid "Manage Records" +msgstr "إدارة السجلات" + #: src/routes/modules/sites.ts:10 src/views/site/site_list/SiteList.vue:45 msgid "Manage Sites" msgstr "إدارة المواقع" @@ -4019,7 +4112,7 @@ msgstr "تم التعديل في" msgid "Modify" msgstr "تعديل" -#: src/routes/modules/certificates.ts:44 +#: src/routes/modules/certificates.ts:36 #: src/views/certificate/CertificateEditor.vue:84 msgid "Modify Certificate" msgstr "تعديل الشهادة" @@ -4080,11 +4173,13 @@ msgstr "غير متاح" #: src/views/certificate/components/CertificateBasicInfo.vue:44 #: src/views/certificate/components/CertificateBasicInfo.vue:58 #: src/views/certificate/components/CertificateBasicInfo.vue:70 -#: src/views/certificate/DNSCredential.vue:17 #: src/views/config/components/ConfigRightPanel/Basic.vue:34 #: src/views/config/components/Delete.vue:123 #: src/views/config/components/Mkdir.vue:64 -#: src/views/config/configColumns.tsx:17 src/views/namespace/columns.ts:9 +#: src/views/config/configColumns.tsx:17 +#: src/views/dns/components/DNSRecordForm.vue:63 +#: src/views/dns/components/DNSRecordTable.vue:17 +#: src/views/dns/DNSCredential.vue:17 src/views/namespace/columns.ts:9 #: src/views/nginx_log/NginxLogList.vue:155 src/views/node/nodeColumns.tsx:8 #: src/views/preference/components/AuthSettings/AddPasskey.vue:81 #: src/views/site/site_edit/components/RightPanel/Basic.vue:36 @@ -4112,6 +4207,14 @@ msgstr "مساحة الاسم" msgid "Namespaces" msgstr "مساحات الأسماء" +#: src/views/dns/DNSDomainList.vue:251 +msgid "" +"Need more DNS providers? Support us through donations or contact us for " +"commercial collaboration" +msgstr "" +"هل تحتاج إلى المزيد من موفري DNS؟ ادعمنا من خلال التبرعات أو اتصل بنا " +"للتعاون التجاري" + #: src/views/dashboard/NginxDashBoard.vue:195 msgid "Need to enable the stub_status module" msgstr "يجب تمكين وحدة stub_status" @@ -4504,6 +4607,10 @@ msgstr "غير مفهرس" msgid "Not Loaded" msgstr "غير محمل" +#: src/views/dns/DDNSManager.vue:102 +msgid "Not run yet" +msgstr "لم يتم تشغيله بعد" + #: src/components/AutoCertForm/AutoCertForm.vue:230 msgid "Not supported for IP certificates" msgstr "غير مدعوم لشهادات IP" @@ -4513,7 +4620,7 @@ msgid "Not Valid Before: %{date}" msgstr "غير صالح قبل: %{date}" #: src/components/AutoCertForm/AutoCertForm.vue:150 -#: src/views/certificate/DNSCredential.vue:89 +#: src/views/dns/DNSCredential.vue:89 msgid "Note" msgstr "ملاحظة" @@ -4642,10 +4749,6 @@ msgstr "حسنًا" msgid "On" msgstr "تشغيل" -#: src/views/certificate/DNSCredential.vue:99 -msgid "Once the verification is complete, the records will be removed." -msgstr "بمجرد اكتمال التحقق، سيتم إزالة السجلات." - #: src/components/NamespaceTabs/NamespaceTabs.vue:164 #: src/components/NodeCard/NodeCard.vue:51 #: src/components/NodeSelector/NodeSelector.vue:65 @@ -4935,7 +5038,7 @@ msgstr "يرجى ملء جميع الحقول بشكل صحيح" msgid "Please fill in required S3 configuration fields" msgstr "يرجى ملء حقول تكوين S3 المطلوبة" -#: src/views/certificate/DNSCredential.vue:93 +#: src/views/dns/DNSCredential.vue:93 msgid "" "Please fill in the API authentication credentials provided by your DNS " "provider." @@ -4994,7 +5097,7 @@ msgstr "يرجى إدخال اسم المستخدم الخاص بك!" msgid "Please log in." msgstr "الرجاء تسجيل الدخول." -#: src/views/certificate/DNSCredential.vue:102 +#: src/views/dns/DNSCredential.vue:96 msgid "Please note that the unit of time configurations below are all in seconds." msgstr "يرجى ملاحظة أن تكوين وحدات الوقت أدناه كلها بالثواني." @@ -5074,6 +5177,11 @@ msgstr "تفضيل" msgid "Preparing lego configurations" msgstr "تحضير تكوينات Lego" +#: src/views/dns/components/DNSRecordForm.vue:81 +#: src/views/dns/components/DNSRecordTable.vue:33 +msgid "Priority" +msgstr "الأولوية" + #: src/components/AutoCertForm/AutoCertForm.vue:206 msgid "Private CA:" msgstr "CA الخاصة:" @@ -5136,7 +5244,8 @@ msgstr "" "إعدادات البروتوكول تتأثر فقط عند الاتصال المباشر. إذا كنت تستخدم خادم وكيل " "عكسي، يرجى تكوين البروتوكول بشكل منفصل في خادم الوكيل العكسي." -#: src/views/certificate/DNSCredential.vue:26 +#: src/views/dns/DDNSManager.vue:70 src/views/dns/DNSCredential.vue:26 +#: src/views/dns/DNSDomainList.vue:177 src/views/dns/DNSDomainList.vue:198 msgid "Provider" msgstr "مزود" @@ -5148,6 +5257,12 @@ msgstr "لم يتم العثور على المزود: {0}" msgid "Province / Region" msgstr "المحافظة / المنطقة" +#: src/views/dns/components/DNSRecordForm.vue:87 +#: src/views/dns/components/DNSRecordTable.vue:51 +#: src/views/dns/components/DNSRecordTable.vue:81 +msgid "Proxied" +msgstr "وكيل" + #: src/views/certificate/ACMEUser.vue:63 msgid "Proxy" msgstr "وكيل" @@ -5242,6 +5357,22 @@ msgstr "إعادة التحقق" msgid "Recommended:" msgstr "مُوصى به:" +#: src/views/dns/DNSRecordManager.vue:113 +msgid "Record created" +msgstr "تم إنشاء السجل" + +#: src/views/dns/DNSRecordManager.vue:120 +msgid "Record deleted" +msgstr "تم حذف السجل" + +#: src/views/dns/DNSRecordManager.vue:109 +msgid "Record updated" +msgstr "تم تحديث السجل" + +#: src/views/dns/DDNSManager.vue:221 +msgid "Records" +msgstr "السجلات" + #: src/components/TwoFA/Authorization.vue:79 msgid "Recovery" msgstr "استرداد" @@ -5271,7 +5402,8 @@ msgstr "رسائل إعادة التوجيه (3xx)" msgid "Referer" msgstr "المرجع" -#: src/language/curd.ts:70 +#: src/language/curd.ts:70 src/views/dns/DDNSManager.vue:161 +#: src/views/dns/DNSRecordManager.vue:165 msgid "Refresh" msgstr "تحديث" @@ -5511,7 +5643,7 @@ msgstr "تم الطلب باستخدام عوامل خاطئة" msgid "Requests Per Connection" msgstr "الطلبات لكل اتصال" -#: src/language/curd.ts:13 +#: src/language/curd.ts:13 src/views/dns/components/DNSRecordFilter.vue:65 #: src/views/nginx_log/structured/components/SearchFilters.vue:214 #: src/views/nginx_log/structured/StructuredLogViewer.vue:745 msgid "Reset" @@ -5751,6 +5883,7 @@ msgstr "السبت" #: src/views/config/components/ConfigLeftPanel.vue:283 #: src/views/config/components/ConfigName.vue:58 #: src/views/dashboard/components/SiteHealthCheckModal.vue:713 +#: src/views/dns/DDNSManager.vue:247 src/views/dns/DNSRecordManager.vue:215 #: src/views/preference/components/AuthSettings/Passkey.vue:131 #: src/views/preference/Preference.vue:124 #: src/views/site/site_edit/components/ConfigName/ConfigName.vue:52 @@ -5856,12 +5989,13 @@ msgstr "الجدول الزمني" msgid "Schedule Type" msgstr "نوع الجدول" -#: src/views/certificate/components/DNSChallenge.vue:77 +#: src/views/dns/components/DNSChallenge.vue:78 msgid "SDK" msgstr "حزمة تطوير البرمجيات SDK" #: src/language/constants.ts:62 src/language/curd.ts:12 #: src/views/config/configColumns.tsx:5 +#: src/views/dns/components/DNSRecordFilter.vue:62 #: src/views/nginx_log/structured/components/SearchFilters.vue:217 #: src/views/site/site_list/columns.tsx:17 src/views/stream/columns.tsx:13 msgid "Search" @@ -5920,10 +6054,18 @@ msgstr "" msgid "Select all" msgstr "تحديد الكل" +#: src/language/constants.ts:68 +msgid "Select Credential" +msgstr "حدد بيانات الاعتماد" + #: src/views/certificate/ACMEUser.vue:45 msgid "Select or enter a CA directory URL" msgstr "حدد أو أدخل عنوان URL لدليل CA" +#: src/language/constants.ts:67 +msgid "Select Provider" +msgstr "اختر مزود الخدمة" + #: src/language/curd.ts:59 msgid "Selected {count} files" msgstr "تم تحديد {count} ملفات" @@ -6247,6 +6389,7 @@ msgstr "ثابت" #: src/views/certificate/ACMEUser.vue:75 #: src/views/certificate/CertificateList/certColumns.tsx:63 #: src/views/dashboard/components/ModulesTable.vue:75 +#: src/views/dns/DDNSManager.vue:75 #: src/views/nginx_log/structured/components/SearchFilters.vue:106 #: src/views/nginx_log/structured/StructuredLogViewer.vue:241 #: src/views/nginx_log/structured/StructuredLogViewer.vue:521 @@ -6477,6 +6620,10 @@ msgstr "استعادة النظام" msgid "System restored successfully." msgstr "تم استعادة النظام بنجاح." +#: src/views/dns/DDNSManager.vue:83 +msgid "Targets" +msgstr "الأهداف" + #: src/constants/errors/self_check.ts:3 msgid "Task is not fixable" msgstr "المهمة غير قابلة للإصلاح" @@ -7005,6 +7152,14 @@ msgstr "حاول تعديل معايير البحث أو التنقل بين ا msgid "Try adjusting your search criteria or time range." msgstr "حاول تعديل معايير البحث أو النطاق الزمني." +#: src/views/dns/components/DNSRecordTable.vue:29 +msgid "TTL" +msgstr "TTL" + +#: src/views/dns/components/DNSRecordForm.vue:78 +msgid "TTL (seconds)" +msgstr "TTL (ثواني)" + #: src/views/backup/AutoBackup/components/CronEditor.vue:28 msgid "Tuesday" msgstr "الثلاثاء" @@ -7017,6 +7172,9 @@ msgstr "يتطلب المصادقة الثنائية" #: src/views/certificate/CertificateList/certColumns.tsx:24 #: src/views/config/components/Delete.vue:122 #: src/views/dashboard/components/ModulesTable.vue:62 +#: src/views/dns/components/DNSRecordFilter.vue:49 +#: src/views/dns/components/DNSRecordForm.vue:57 +#: src/views/dns/components/DNSRecordTable.vue:21 #: src/views/nginx_log/NginxLogList.vue:146 #: src/views/notification/notificationColumns.tsx:8 #: src/views/preference/components/ExternalNotify/columns.tsx:19 @@ -7027,6 +7185,10 @@ msgstr "نوع" msgid "Type %{delete} to confirm" msgstr "اكتب %{delete} للتأكيد" +#: src/views/dns/DDNSManager.vue:228 +msgid "Type or select A/AAAA records" +msgstr "اكتب أو حدد سجلات A/AAAA" + #: src/views/nginx_log/structured/components/SearchFilters.vue:142 msgid "Type or select browser" msgstr "اكتب أو اختر المتصفح" @@ -7082,9 +7244,9 @@ msgstr "تم التحديث بنجاح" #: src/views/backup/AutoBackup/AutoBackup.vue:236 #: src/views/certificate/ACMEUser.vue:124 -#: src/views/certificate/DNSCredential.vue:65 #: src/views/config/components/ConfigRightPanel/Basic.vue:54 -#: src/views/config/configColumns.tsx:44 src/views/namespace/columns.ts:91 +#: src/views/config/configColumns.tsx:44 src/views/dns/DNSCredential.vue:65 +#: src/views/dns/DNSDomainList.vue:205 src/views/namespace/columns.ts:91 #: src/views/node/nodeColumns.tsx:89 #: src/views/site/site_edit/components/RightPanel/Basic.vue:39 #: src/views/site/site_list/columns.tsx:113 src/views/stream/columns.tsx:80 @@ -7157,6 +7319,10 @@ msgstr "مدة التشغيل:" msgid "URL" msgstr "عنوان URL" +#: src/views/dns/components/DNSRecordForm.vue:64 +msgid "Use @ for root" +msgstr "استخدم @ للجذر" + #: src/components/TwoFA/Authorization.vue:121 msgid "Use OTP" msgstr "استخدم كلمة المرور لمرة واحدة" @@ -7222,6 +7388,8 @@ msgid "Validate SSL Certificate" msgstr "التحقق من صحة شهادة SSL" #: src/views/dashboard/components/PerformanceTablesCard.vue:22 +#: src/views/dns/components/DNSRecordForm.vue:66 +#: src/views/dns/components/DNSRecordTable.vue:25 msgid "Value" msgstr "القيمة" @@ -7316,12 +7484,6 @@ msgstr "" msgid "We do not accept any feature requests" msgstr "نحن لا نقبل أي طلبات ميزات" -#: src/views/certificate/DNSCredential.vue:96 -msgid "" -"We will add one or more TXT records to the DNS records of your domain for " -"ownership verification." -msgstr "سنضيف سجل أو أكثر من سجلات TXT إلى سجلات DNS لنطاقك للتحقق من الملكية." - #: src/views/site/site_edit/components/Cert/ObtainCert.vue:142 msgid "" "We will remove the HTTPChallenge configuration from this file and reload " @@ -7358,6 +7520,11 @@ msgstr "أسبوعي" msgid "Weekly on %{day} at %{time}" msgstr "أسبوعيًا يوم %{day} الساعة %{time}" +#: src/views/dns/components/DNSRecordForm.vue:84 +#: src/views/dns/components/DNSRecordTable.vue:37 +msgid "Weight" +msgstr "الوزن" + #: src/views/certificate/ACMEUser.vue:119 msgid "" "When Enabled, Nginx UI will automatically re-register users upon startup. " @@ -7406,7 +7573,7 @@ msgstr "عمليات العامل" msgid "Workers" msgstr "العمال" -#: src/layouts/HeaderLayout.vue:61 src/routes/index.ts:61 +#: src/layouts/HeaderLayout.vue:61 src/routes/index.ts:63 #: src/views/workspace/WorkSpace.vue:51 msgid "Workspace" msgstr "مساحة العمل" @@ -7508,6 +7675,14 @@ msgstr "مفاتيح المرور الخاصة بك" msgid "Zero-allocation pipeline" msgstr "خط أنابيب بدون تخصيص" +#~ msgid "Once the verification is complete, the records will be removed." +#~ msgstr "بمجرد اكتمال التحقق، سيتم إزالة السجلات." + +#~ msgid "" +#~ "We will add one or more TXT records to the DNS records of your domain for " +#~ "ownership verification." +#~ msgstr "سنضيف سجل أو أكثر من سجلات TXT إلى سجلات DNS لنطاقك للتحقق من الملكية." + #~ msgid "Settings" #~ msgstr "الإعدادات" @@ -7529,9 +7704,6 @@ msgstr "خط أنابيب بدون تخصيص" #~ msgid "Tested in isolated sandbox mode" #~ msgstr "تم الاختبار في وضع الحماية المعزول" -#~ msgid "All" -#~ msgstr "الكل" - #~ msgid "Based on M2 Pro (12 cores) testing" #~ msgstr "بناءً على اختبار M2 Pro (12 نواة)" @@ -7738,9 +7910,6 @@ msgstr "خط أنابيب بدون تخصيص" #~ msgid "Are you sure you want to delete this item permanently?" #~ msgstr "هل أنت متأكد أنك تريد حذف هذا العنصر نهائيًا؟" -#~ msgid "Are you sure you want to delete this item?" -#~ msgstr "هل أنت متأكد أنك تريد حذف هذا العنصر؟" - #~ msgid "Are you sure you want to recover this item?" #~ msgstr "هل أنت متأكد أنك تريد استرداد هذا العنصر؟" diff --git a/app/src/language/constants.ts b/app/src/language/constants.ts index 28053395..7d4d3ab5 100644 --- a/app/src/language/constants.ts +++ b/app/src/language/constants.ts @@ -63,4 +63,7 @@ export const msg = [ $gettext('Access Log'), $gettext('Error Log'), + + $gettext('Select Provider'), + $gettext('Select Credential'), ] diff --git a/app/src/language/de_DE/app.po b/app/src/language/de_DE/app.po index e5069889..8207d42c 100644 --- a/app/src/language/de_DE/app.po +++ b/app/src/language/de_DE/app.po @@ -187,8 +187,10 @@ msgstr "Aktion" #: src/views/backup/AutoBackup/AutoBackup.vue:273 #: src/views/certificate/ACMEUser.vue:131 #: src/views/certificate/CertificateList/certColumns.tsx:92 -#: src/views/certificate/DNSCredential.vue:71 -#: src/views/config/configColumns.tsx:51 src/views/namespace/columns.ts:97 +#: src/views/config/configColumns.tsx:51 +#: src/views/dns/components/DNSRecordTable.vue:41 +#: src/views/dns/DDNSManager.vue:91 src/views/dns/DNSCredential.vue:71 +#: src/views/dns/DNSDomainList.vue:211 src/views/namespace/columns.ts:97 #: src/views/nginx_log/NginxLogList.vue:338 src/views/node/nodeColumns.tsx:96 #: src/views/notification/notificationColumns.tsx:72 #: src/views/preference/components/ExternalNotify/columns.tsx:85 @@ -242,6 +244,10 @@ msgstr "Header hinzufügen" msgid "Add Location" msgstr "Ort hinzufügen" +#: src/views/dns/DNSRecordManager.vue:171 +msgid "Add Record" +msgstr "Datensatz hinzufügen" + #: src/components/NgxConfigEditor/NgxServer.vue:92 msgid "Add Server" msgstr "Server hinzufügen" @@ -262,7 +268,7 @@ msgstr "Upstream hinzufügen" msgid "Added successfully" msgstr "Erfolgreich hinzugefügt" -#: src/views/certificate/components/DNSChallenge.vue:97 +#: src/views/dns/components/DNSChallenge.vue:98 msgid "Additional" msgstr "Zusätzlich" @@ -305,6 +311,10 @@ msgstr "" "Aktualisieren Sie anschließend diese Seite und klicken Sie erneut auf " "\"Passkey hinzufügen\"." +#: src/views/dns/components/DNSRecordFilter.vue:55 +msgid "All" +msgstr "Alle" + #: src/views/system/Licenses.vue:152 msgid "All Components" msgstr "Alle Komponenten" @@ -349,7 +359,7 @@ msgstr "" msgid "API Base Url" msgstr "API-Basis-URL" -#: src/views/certificate/components/DNSChallenge.vue:70 +#: src/views/dns/components/DNSChallenge.vue:71 msgid "API Document" msgstr "API-Dokument" @@ -385,6 +395,10 @@ msgstr "Sind Sie sicher, dass Sie diese gesperrte IP sofort löschen möchten?" msgid "Are you sure to delete this passkey immediately?" msgstr "Sind Sie sicher, dass Sie diesen Passkey sofort löschen möchten?" +#: src/views/dns/components/DNSRecordTable.vue:90 +msgid "Are you sure to delete this record?" +msgstr "Sind Sie sicher, dass Sie diesen Eintrag löschen möchten?" + #: src/views/preference/components/AuthSettings/RecoveryCodes.vue:155 msgid "Are you sure to generate new recovery codes?" msgstr "Sind Sie sicher, dass Sie neue Wiederherstellungscodes generieren möchten?" @@ -558,7 +572,7 @@ msgstr "Durchschn./PV" #: src/views/certificate/components/CertificateActions.vue:22 #: src/views/config/components/ConfigLeftPanel.vue:274 #: src/views/config/ConfigList.vue:120 src/views/config/ConfigList.vue:217 -#: src/views/nginx_log/NginxLog.vue:129 +#: src/views/dns/DNSRecordManager.vue:223 src/views/nginx_log/NginxLog.vue:129 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:183 #: src/views/stream/components/StreamEditor.vue:147 msgid "Back" @@ -716,6 +730,10 @@ msgstr "Browser" msgid "Browser Statistics" msgstr "Browser-Statistiken" +#: src/views/dns/DNSDomainList.vue:257 +msgid "Business contact:" +msgstr "Geschäftskontakt:" + #: src/views/nginx_log/components/IndexingSettingsModal.vue:316 msgid "" "By enabling advanced indexing, you acknowledge that your system meets the " @@ -788,6 +806,7 @@ msgstr "" #: src/components/NgxConfigEditor/NgxUpstream.vue:32 src/language/curd.ts:37 #: src/views/config/components/Delete.vue:98 #: src/views/dashboard/components/SiteHealthCheckModal.vue:710 +#: src/views/dns/DDNSManager.vue:244 src/views/dns/DNSRecordManager.vue:212 #: src/views/nginx_log/components/IndexingSettingsModal.vue:102 #: src/views/nginx_log/indexing/IndexManagement.vue:33 #: src/views/nginx_log/indexing/IndexManagement.vue:59 @@ -933,7 +952,7 @@ msgstr "Zertifikatstyp" msgid "Certificates" msgstr "Zertifikate" -#: src/routes/modules/certificates.ts:36 +#: src/routes/modules/certificates.ts:28 msgid "Certificates List" msgstr "Zertifikatsliste" @@ -1320,7 +1339,7 @@ msgstr "Konfigurationspfad ist leer" msgid "Config Template" msgstr "Konfigurationsvorlage" -#: src/views/certificate/DNSCredential.vue:52 +#: src/views/dns/DNSCredential.vue:52 msgid "Configuration" msgstr "Konfiguration" @@ -1350,6 +1369,14 @@ msgstr "Konf" msgid "Configurations" msgstr "Konfigurationen" +#: src/views/dns/DDNSManager.vue:201 +msgid "Configure" +msgstr "Konfigurieren" + +#: src/views/dns/DDNSManager.vue:211 +msgid "Configure DDNS" +msgstr "DDNS konfigurieren" + #: src/views/site/site_add/SiteAdd.vue:81 msgid "Configure SSL" msgstr "SSL konfigurieren" @@ -1473,6 +1500,10 @@ msgstr "Datei erstellen" msgid "Create Folder" msgstr "Ordner erstellen" +#: src/views/dns/DNSRecordManager.vue:200 +msgid "Create Record" +msgstr "Datensatz erstellen" + #: src/views/backup/components/BackupCreator.vue:75 msgid "" "Create system backups including Nginx configuration and Nginx UI settings. " @@ -1499,11 +1530,12 @@ msgstr "Erfolgreich erstellt" msgid "Creating client facilitates communication with the CA server" msgstr "Er" -#: src/components/AutoCertForm/DNSChallenge.vue:105 +#: src/components/AutoCertForm/DNSChallenge.vue:131 +#: src/views/dns/DDNSManager.vue:65 src/views/dns/DNSDomainList.vue:109 msgid "Credential" msgstr "Zugangsdaten" -#: src/views/certificate/components/DNSChallenge.vue:86 +#: src/routes/modules/dns.ts:20 src/views/dns/components/DNSChallenge.vue:87 msgid "Credentials" msgstr "Zugangsdaten" @@ -1618,6 +1650,18 @@ msgstr "Tage" msgid "Db file not found" msgstr "Datenbankdatei nicht gefunden" +#: src/routes/modules/dns.ts:36 +msgid "DDNS" +msgstr "DDNS" + +#: src/views/dns/DDNSManager.vue:153 +msgid "DDNS Overview" +msgstr "DDNS-Übersicht" + +#: src/views/dns/DDNSManager.vue:135 +msgid "DDNS saved" +msgstr "DDNS gespeichert" + #: src/constants/errors/geolite.ts:12 msgid "Decompression succeeded but failed to delete compressed file: {0}" msgstr "" @@ -1646,6 +1690,7 @@ msgstr "" #: src/views/config/components/Delete.vue:65 #: src/views/config/components/Delete.vue:97 #: src/views/config/ConfigList.vue:199 +#: src/views/dns/components/DNSRecordTable.vue:94 #: src/views/site/site_list/SiteList.vue:100 #: src/views/stream/StreamList.vue:110 msgid "Delete" @@ -1887,7 +1932,8 @@ msgid "Disable stream %{name} from %{node} successfully" msgstr "Stream %{name} von %{node} erfolgreich deaktiviert" #: src/views/backup/AutoBackup/AutoBackup.vue:175 -#: src/views/node/nodeColumns.tsx:60 src/views/node/nodeColumns.tsx:78 +#: src/views/dns/DDNSManager.vue:175 src/views/node/nodeColumns.tsx:60 +#: src/views/node/nodeColumns.tsx:78 #: src/views/preference/tabs/HTTPSettings.vue:24 #: src/views/preference/tabs/NodeSettings.vue:25 #: src/views/preference/tabs/NodeSettings.vue:30 @@ -1912,16 +1958,35 @@ msgstr "Getrennt" msgid "Disk IO" msgstr "Festplatten-IO" -#: src/routes/modules/certificates.ts:28 -#: src/views/certificate/DNSCredential.vue:79 +#: src/routes/modules/dns.ts:11 +msgid "DNS" +msgstr "DNS" + +#: src/views/dns/DNSCredential.vue:79 msgid "DNS Credentials" msgstr "DNS-Zugangsdaten" -#: src/components/AutoCertForm/DNSChallenge.vue:95 -#: src/views/certificate/components/DNSChallenge.vue:59 +#: src/routes/modules/dns.ts:28 src/views/dns/DNSDomainList.vue:228 +msgid "DNS Domains" +msgstr "DNS-Domänen" + +#: src/views/dns/components/DNSRecordTable.vue:81 +msgid "DNS Only" +msgstr "Nur DNS" + +#: src/components/AutoCertForm/DNSChallenge.vue:121 +#: src/views/dns/components/DNSChallenge.vue:60 msgid "DNS Provider" msgstr "DNS-Anbieter" +#: src/views/dns/DNSDomainList.vue:244 +msgid "DNS Provider Support" +msgstr "DNS-Anbieter-Unterstützung" + +#: src/routes/modules/dns.ts:44 src/views/dns/DNSRecordManager.vue:58 +msgid "DNS Records" +msgstr "DNS-Einträge" + #: src/views/dashboard/components/SiteHealthCheckModal.vue:678 msgid "DNS Resolver" msgstr "DNS-Resolver" @@ -1984,6 +2049,7 @@ msgid "Document Count" msgstr "Dokumentenanzahl" #: src/views/certificate/components/DNSIssueCertificate.vue:119 +#: src/views/dns/DDNSManager.vue:60 src/views/dns/DNSDomainList.vue:98 msgid "Domain" msgstr "Domain" @@ -2074,7 +2140,7 @@ msgstr "EAB HMAC-Schlüssel" msgid "EAB Key ID" msgstr "EAB-Schlüssel-ID" -#: src/language/curd.ts:8 +#: src/language/curd.ts:8 src/views/dns/components/DNSRecordTable.vue:87 msgid "Edit" msgstr "Bearbeiten" @@ -2088,6 +2154,10 @@ msgstr "Bearbeiten %{n}" msgid "Edit Configuration" msgstr "Konfiguration bearbeiten" +#: src/views/dns/DNSRecordManager.vue:200 +msgid "Edit Record" +msgstr "Datensatz bearbeiten" + #: src/routes/modules/sites.ts:34 msgid "Edit Site" msgstr "Seite bearbeiten" @@ -2138,6 +2208,10 @@ msgstr "Code-Vervollständigung aktivieren" msgid "Enable compression for content transfer" msgstr "Komprimierung für die Inhaltsübertragung aktivieren" +#: src/views/dns/DDNSManager.vue:218 +msgid "Enable DDNS" +msgstr "DDNS aktivieren" + #: src/views/dashboard/components/SiteHealthCheckModal.vue:473 msgid "Enable Health Check" msgstr "Health Check aktivieren" @@ -2225,7 +2299,8 @@ msgid "Enable TOTP" msgstr "TOTP aktivieren" #: src/views/backup/AutoBackup/AutoBackup.vue:174 -#: src/views/node/nodeColumns.tsx:69 src/views/node/nodeColumns.tsx:75 +#: src/views/dns/DDNSManager.vue:175 src/views/node/nodeColumns.tsx:69 +#: src/views/node/nodeColumns.tsx:75 #: src/views/preference/components/ExternalNotify/columns.tsx:47 #: src/views/preference/tabs/HTTPSettings.vue:24 #: src/views/preference/tabs/LogrotateSettings.vue:20 @@ -3196,14 +3271,19 @@ msgstr "Ein höherer Wert bedeutet eine bessere Wiederverwendung der Verbindung" msgid "History" msgstr "Verlauf" -#: src/routes/index.ts:52 +#: src/routes/index.ts:54 msgid "Home" msgstr "Startseite" +#: src/views/dns/components/DNSRecordFilter.vue:42 #: src/views/preference/tabs/ServerSettings.vue:19 msgid "Host" msgstr "Host" +#: src/views/dns/components/DNSRecordFilter.vue:45 +msgid "Host, e.g. @ or www" +msgstr "Host, z.B. @ oder www" + #: src/views/backup/AutoBackup/components/CronEditor.vue:159 #: src/views/nginx_log/dashboard/components/HourlyChart.vue:87 msgid "Hour" @@ -3280,7 +3360,7 @@ msgstr "" msgid "Import" msgstr "Import" -#: src/routes/modules/certificates.ts:54 +#: src/routes/modules/certificates.ts:46 #: src/views/certificate/CertificateEditor.vue:84 msgid "Import Certificate" msgstr "Zertifikat importieren" @@ -3403,10 +3483,15 @@ msgstr "" "Die Installation ist nach 10 Minuten Systemstart nicht mehr erlaubt. Bitte " "starten Sie die Nginx UI neu." +#: src/views/dns/DDNSManager.vue:79 #: src/views/preference/tabs/LogrotateSettings.vue:26 msgid "Interval" msgstr "Intervall" +#: src/views/dns/DDNSManager.vue:232 +msgid "Interval (seconds)" +msgstr "Intervall (Sekunden)" + #: src/views/certificate/ACMEUser.vue:166 msgid "Invalid" msgstr "Ungültig" @@ -3635,6 +3720,10 @@ msgstr "Zuletzt indiziert" msgid "Last month" msgstr "Letzter Monat" +#: src/views/dns/DDNSManager.vue:87 +msgid "Last run" +msgstr "Letzte Ausführung" + #: src/views/dashboard/NginxDashBoard.vue:138 msgid "Last update" msgstr "Letzte Aktualisierung" @@ -3904,6 +3993,10 @@ msgstr "" msgid "Manage Configs" msgstr "Verwalte Konfigurationen" +#: src/views/dns/DNSDomainList.vue:236 +msgid "Manage Records" +msgstr "Einträge verwalten" + #: src/routes/modules/sites.ts:10 src/views/site/site_list/SiteList.vue:45 msgid "Manage Sites" msgstr "Verwalte Seiten" @@ -4074,7 +4167,7 @@ msgstr "Geändert am" msgid "Modify" msgstr "Ändern" -#: src/routes/modules/certificates.ts:44 +#: src/routes/modules/certificates.ts:36 #: src/views/certificate/CertificateEditor.vue:84 msgid "Modify Certificate" msgstr "Zertifikat ändern" @@ -4135,11 +4228,13 @@ msgstr "N/V" #: src/views/certificate/components/CertificateBasicInfo.vue:44 #: src/views/certificate/components/CertificateBasicInfo.vue:58 #: src/views/certificate/components/CertificateBasicInfo.vue:70 -#: src/views/certificate/DNSCredential.vue:17 #: src/views/config/components/ConfigRightPanel/Basic.vue:34 #: src/views/config/components/Delete.vue:123 #: src/views/config/components/Mkdir.vue:64 -#: src/views/config/configColumns.tsx:17 src/views/namespace/columns.ts:9 +#: src/views/config/configColumns.tsx:17 +#: src/views/dns/components/DNSRecordForm.vue:63 +#: src/views/dns/components/DNSRecordTable.vue:17 +#: src/views/dns/DNSCredential.vue:17 src/views/namespace/columns.ts:9 #: src/views/nginx_log/NginxLogList.vue:155 src/views/node/nodeColumns.tsx:8 #: src/views/preference/components/AuthSettings/AddPasskey.vue:81 #: src/views/site/site_edit/components/RightPanel/Basic.vue:36 @@ -4167,6 +4262,14 @@ msgstr "Namensraum" msgid "Namespaces" msgstr "Namensräume" +#: src/views/dns/DNSDomainList.vue:251 +msgid "" +"Need more DNS providers? Support us through donations or contact us for " +"commercial collaboration" +msgstr "" +"Benötigen Sie mehr DNS-Anbieter? Unterstützen Sie uns durch Spenden oder " +"kontaktieren Sie uns für eine geschäftliche Zusammenarbeit" + #: src/views/dashboard/NginxDashBoard.vue:195 msgid "Need to enable the stub_status module" msgstr "Das stub_status-Modul muss aktiviert werden" @@ -4561,6 +4664,10 @@ msgstr "Nicht indiziert" msgid "Not Loaded" msgstr "Nicht geladen" +#: src/views/dns/DDNSManager.vue:102 +msgid "Not run yet" +msgstr "Noch nicht ausgeführt" + #: src/components/AutoCertForm/AutoCertForm.vue:230 msgid "Not supported for IP certificates" msgstr "Nicht für IP-Zertifikate unterstützt" @@ -4570,7 +4677,7 @@ msgid "Not Valid Before: %{date}" msgstr "Nich gültig vor: %{date}" #: src/components/AutoCertForm/AutoCertForm.vue:150 -#: src/views/certificate/DNSCredential.vue:89 +#: src/views/dns/DNSCredential.vue:89 msgid "Note" msgstr "Notiz" @@ -4703,10 +4810,6 @@ msgstr "OK" msgid "On" msgstr "Ein" -#: src/views/certificate/DNSCredential.vue:99 -msgid "Once the verification is complete, the records will be removed." -msgstr "Sobaöd die Überprüfung abgeschlossen ist, werden die Einträge entfernt." - #: src/components/NamespaceTabs/NamespaceTabs.vue:164 #: src/components/NodeCard/NodeCard.vue:51 #: src/components/NodeSelector/NodeSelector.vue:65 @@ -4998,7 +5101,7 @@ msgstr "Bitte füllen Sie alle Felder korrekt aus" msgid "Please fill in required S3 configuration fields" msgstr "Bitte füllen Sie die erforderlichen S3-Konfigurationsfelder aus" -#: src/views/certificate/DNSCredential.vue:93 +#: src/views/dns/DNSCredential.vue:93 msgid "" "Please fill in the API authentication credentials provided by your DNS " "provider." @@ -5066,7 +5169,7 @@ msgstr "Bitte gib deinen Benutzernamen ein!" msgid "Please log in." msgstr "Bitte melden Sie sich an." -#: src/views/certificate/DNSCredential.vue:102 +#: src/views/dns/DNSCredential.vue:96 msgid "Please note that the unit of time configurations below are all in seconds." msgstr "" "Bitte beachte, dass die Zeiteinheiten der unten aufgeführten " @@ -5150,6 +5253,11 @@ msgstr "Einstellungen" msgid "Preparing lego configurations" msgstr "Lego-Konfigurationen vorbereiten" +#: src/views/dns/components/DNSRecordForm.vue:81 +#: src/views/dns/components/DNSRecordTable.vue:33 +msgid "Priority" +msgstr "Priorität" + #: src/components/AutoCertForm/AutoCertForm.vue:206 msgid "Private CA:" msgstr "Private CA:" @@ -5213,7 +5321,8 @@ msgstr "" "eines Reverse Proxys konfigurieren Sie das Protokoll bitte separat im " "Reverse Proxy." -#: src/views/certificate/DNSCredential.vue:26 +#: src/views/dns/DDNSManager.vue:70 src/views/dns/DNSCredential.vue:26 +#: src/views/dns/DNSDomainList.vue:177 src/views/dns/DNSDomainList.vue:198 msgid "Provider" msgstr "Anbieter" @@ -5225,6 +5334,12 @@ msgstr "Anbieter nicht gefunden: {0}" msgid "Province / Region" msgstr "Provinz / Region" +#: src/views/dns/components/DNSRecordForm.vue:87 +#: src/views/dns/components/DNSRecordTable.vue:51 +#: src/views/dns/components/DNSRecordTable.vue:81 +msgid "Proxied" +msgstr "Proxied" + #: src/views/certificate/ACMEUser.vue:63 msgid "Proxy" msgstr "Proxy" @@ -5319,6 +5434,22 @@ msgstr "Erneut prüfen" msgid "Recommended:" msgstr "Empfohlen:" +#: src/views/dns/DNSRecordManager.vue:113 +msgid "Record created" +msgstr "Datensatz erstellt" + +#: src/views/dns/DNSRecordManager.vue:120 +msgid "Record deleted" +msgstr "Eintrag gelöscht" + +#: src/views/dns/DNSRecordManager.vue:109 +msgid "Record updated" +msgstr "Datensatz aktualisiert" + +#: src/views/dns/DDNSManager.vue:221 +msgid "Records" +msgstr "Datensätze" + #: src/components/TwoFA/Authorization.vue:79 msgid "Recovery" msgstr "Wiederherstellung" @@ -5349,7 +5480,8 @@ msgstr "Umleitungsmeldungen (3xx)" msgid "Referer" msgstr "Referer" -#: src/language/curd.ts:70 +#: src/language/curd.ts:70 src/views/dns/DDNSManager.vue:161 +#: src/views/dns/DNSRecordManager.vue:165 msgid "Refresh" msgstr "Aktualisieren" @@ -5593,7 +5725,7 @@ msgstr "Forderte mit falschen Parametern an" msgid "Requests Per Connection" msgstr "Anfragen pro Verbindung" -#: src/language/curd.ts:13 +#: src/language/curd.ts:13 src/views/dns/components/DNSRecordFilter.vue:65 #: src/views/nginx_log/structured/components/SearchFilters.vue:214 #: src/views/nginx_log/structured/StructuredLogViewer.vue:745 msgid "Reset" @@ -5836,6 +5968,7 @@ msgstr "Samstag" #: src/views/config/components/ConfigLeftPanel.vue:283 #: src/views/config/components/ConfigName.vue:58 #: src/views/dashboard/components/SiteHealthCheckModal.vue:713 +#: src/views/dns/DDNSManager.vue:247 src/views/dns/DNSRecordManager.vue:215 #: src/views/preference/components/AuthSettings/Passkey.vue:131 #: src/views/preference/Preference.vue:124 #: src/views/site/site_edit/components/ConfigName/ConfigName.vue:52 @@ -5941,12 +6074,13 @@ msgstr "Zeitplan" msgid "Schedule Type" msgstr "Zeitplantyp" -#: src/views/certificate/components/DNSChallenge.vue:77 +#: src/views/dns/components/DNSChallenge.vue:78 msgid "SDK" msgstr "SDK" #: src/language/constants.ts:62 src/language/curd.ts:12 #: src/views/config/configColumns.tsx:5 +#: src/views/dns/components/DNSRecordFilter.vue:62 #: src/views/nginx_log/structured/components/SearchFilters.vue:217 #: src/views/site/site_list/columns.tsx:17 src/views/stream/columns.tsx:13 msgid "Search" @@ -6006,10 +6140,18 @@ msgstr "" msgid "Select all" msgstr "Alle auswählen" +#: src/language/constants.ts:68 +msgid "Select Credential" +msgstr "Anmeldeinformationen auswählen" + #: src/views/certificate/ACMEUser.vue:45 msgid "Select or enter a CA directory URL" msgstr "Wählen Sie eine CA-Verzeichnis-URL aus oder geben Sie sie ein" +#: src/language/constants.ts:67 +msgid "Select Provider" +msgstr "Anbieter auswählen" + #: src/language/curd.ts:59 msgid "Selected {count} files" msgstr "Ausgewählte {count} Dateien" @@ -6341,6 +6483,7 @@ msgstr "Statisch" #: src/views/certificate/ACMEUser.vue:75 #: src/views/certificate/CertificateList/certColumns.tsx:63 #: src/views/dashboard/components/ModulesTable.vue:75 +#: src/views/dns/DDNSManager.vue:75 #: src/views/nginx_log/structured/components/SearchFilters.vue:106 #: src/views/nginx_log/structured/StructuredLogViewer.vue:241 #: src/views/nginx_log/structured/StructuredLogViewer.vue:521 @@ -6574,6 +6717,10 @@ msgstr "Systemwiederherstellung" msgid "System restored successfully." msgstr "System erfolgreich wiederhergestellt." +#: src/views/dns/DDNSManager.vue:83 +msgid "Targets" +msgstr "Ziele" + #: src/constants/errors/self_check.ts:3 msgid "Task is not fixable" msgstr "Aufgabe ist nicht behebbar" @@ -7125,6 +7272,14 @@ msgstr "" msgid "Try adjusting your search criteria or time range." msgstr "Versuchen Sie, Ihre Suchkriterien oder den Zeitraum anzupassen." +#: src/views/dns/components/DNSRecordTable.vue:29 +msgid "TTL" +msgstr "TTL" + +#: src/views/dns/components/DNSRecordForm.vue:78 +msgid "TTL (seconds)" +msgstr "TTL (Sekunden)" + #: src/views/backup/AutoBackup/components/CronEditor.vue:28 msgid "Tuesday" msgstr "Dienstag" @@ -7137,6 +7292,9 @@ msgstr "Zwei-Faktor-Authentifizierung erforderlich" #: src/views/certificate/CertificateList/certColumns.tsx:24 #: src/views/config/components/Delete.vue:122 #: src/views/dashboard/components/ModulesTable.vue:62 +#: src/views/dns/components/DNSRecordFilter.vue:49 +#: src/views/dns/components/DNSRecordForm.vue:57 +#: src/views/dns/components/DNSRecordTable.vue:21 #: src/views/nginx_log/NginxLogList.vue:146 #: src/views/notification/notificationColumns.tsx:8 #: src/views/preference/components/ExternalNotify/columns.tsx:19 @@ -7147,6 +7305,10 @@ msgstr "Typ" msgid "Type %{delete} to confirm" msgstr "Geben Sie %{delete} zur Bestätigung ein" +#: src/views/dns/DDNSManager.vue:228 +msgid "Type or select A/AAAA records" +msgstr "Geben Sie A/AAAA-Datensätze ein oder wählen Sie sie aus" + #: src/views/nginx_log/structured/components/SearchFilters.vue:142 msgid "Type or select browser" msgstr "Browser eingeben oder auswählen" @@ -7202,9 +7364,9 @@ msgstr "Erfolgreich aktualisiert" #: src/views/backup/AutoBackup/AutoBackup.vue:236 #: src/views/certificate/ACMEUser.vue:124 -#: src/views/certificate/DNSCredential.vue:65 #: src/views/config/components/ConfigRightPanel/Basic.vue:54 -#: src/views/config/configColumns.tsx:44 src/views/namespace/columns.ts:91 +#: src/views/config/configColumns.tsx:44 src/views/dns/DNSCredential.vue:65 +#: src/views/dns/DNSDomainList.vue:205 src/views/namespace/columns.ts:91 #: src/views/node/nodeColumns.tsx:89 #: src/views/site/site_edit/components/RightPanel/Basic.vue:39 #: src/views/site/site_list/columns.tsx:113 src/views/stream/columns.tsx:80 @@ -7277,6 +7439,10 @@ msgstr "Uptime:" msgid "URL" msgstr "URL" +#: src/views/dns/components/DNSRecordForm.vue:64 +msgid "Use @ for root" +msgstr "Verwenden Sie @ für die Root-Domain" + #: src/components/TwoFA/Authorization.vue:121 msgid "Use OTP" msgstr "Benutze OTP" @@ -7342,6 +7508,8 @@ msgid "Validate SSL Certificate" msgstr "SSL-Zertifikat validieren" #: src/views/dashboard/components/PerformanceTablesCard.vue:22 +#: src/views/dns/components/DNSRecordForm.vue:66 +#: src/views/dns/components/DNSRecordTable.vue:25 msgid "Value" msgstr "Wert" @@ -7439,14 +7607,6 @@ msgstr "" msgid "We do not accept any feature requests" msgstr "Wir akzeptieren keine Funktionsanfragen" -#: src/views/certificate/DNSCredential.vue:96 -msgid "" -"We will add one or more TXT records to the DNS records of your domain for " -"ownership verification." -msgstr "" -"Wir werden einen oder mehrere TXT-Einträge zu den DNS-Einträgen deiner " -"Domain hinzufügen, um die Eigentumsverifizierung durchzuführen." - #: src/views/site/site_edit/components/Cert/ObtainCert.vue:142 msgid "" "We will remove the HTTPChallenge configuration from this file and reload " @@ -7483,6 +7643,11 @@ msgstr "Wöchentlich" msgid "Weekly on %{day} at %{time}" msgstr "Wöchentlich am %{day} um %{time}" +#: src/views/dns/components/DNSRecordForm.vue:84 +#: src/views/dns/components/DNSRecordTable.vue:37 +msgid "Weight" +msgstr "Gewicht" + #: src/views/certificate/ACMEUser.vue:119 msgid "" "When Enabled, Nginx UI will automatically re-register users upon startup. " @@ -7537,7 +7702,7 @@ msgstr "Worker-Prozesse" msgid "Workers" msgstr "Worker" -#: src/layouts/HeaderLayout.vue:61 src/routes/index.ts:61 +#: src/layouts/HeaderLayout.vue:61 src/routes/index.ts:63 #: src/views/workspace/WorkSpace.vue:51 msgid "Workspace" msgstr "Arbeitsplatz" @@ -7643,6 +7808,16 @@ msgstr "Deine Passkeys" msgid "Zero-allocation pipeline" msgstr "Allokationsfreie Pipeline" +#~ msgid "Once the verification is complete, the records will be removed." +#~ msgstr "Sobaöd die Überprüfung abgeschlossen ist, werden die Einträge entfernt." + +#~ msgid "" +#~ "We will add one or more TXT records to the DNS records of your domain for " +#~ "ownership verification." +#~ msgstr "" +#~ "Wir werden einen oder mehrere TXT-Einträge zu den DNS-Einträgen deiner " +#~ "Domain hinzufügen, um die Eigentumsverifizierung durchzuführen." + #~ msgid "Settings" #~ msgstr "Einstellungen" @@ -7664,9 +7839,6 @@ msgstr "Allokationsfreie Pipeline" #~ msgid "Tested in isolated sandbox mode" #~ msgstr "Im isolierten Sandbox-Modus getestet" -#~ msgid "All" -#~ msgstr "Alle" - #~ msgid "Based on M2 Pro (12 cores) testing" #~ msgstr "Basierend auf Tests mit M2 Pro (12 Kerne)" @@ -7875,9 +8047,6 @@ msgstr "Allokationsfreie Pipeline" #~ msgid "Are you sure you want to delete this item permanently?" #~ msgstr "Sind Sie sicher, dass Sie diesen Artikel endgültig löschen möchten?" -#~ msgid "Are you sure you want to delete this item?" -#~ msgstr "Sind Sie sicher, dass Sie dieses Element löschen möchten?" - #~ msgid "Are you sure you want to recover this item?" #~ msgstr "Sind Sie sicher, dass Sie dieses Element wiederherstellen möchten?" diff --git a/app/src/language/en/app.po b/app/src/language/en/app.po index a881c570..f26ec287 100644 --- a/app/src/language/en/app.po +++ b/app/src/language/en/app.po @@ -166,8 +166,10 @@ msgstr "" #: src/views/backup/AutoBackup/AutoBackup.vue:273 #: src/views/certificate/ACMEUser.vue:131 #: src/views/certificate/CertificateList/certColumns.tsx:92 -#: src/views/certificate/DNSCredential.vue:71 -#: src/views/config/configColumns.tsx:51 src/views/namespace/columns.ts:97 +#: src/views/config/configColumns.tsx:51 +#: src/views/dns/components/DNSRecordTable.vue:41 +#: src/views/dns/DDNSManager.vue:91 src/views/dns/DNSCredential.vue:71 +#: src/views/dns/DNSDomainList.vue:211 src/views/namespace/columns.ts:97 #: src/views/nginx_log/NginxLogList.vue:338 src/views/node/nodeColumns.tsx:96 #: src/views/notification/notificationColumns.tsx:72 #: src/views/preference/components/ExternalNotify/columns.tsx:85 @@ -221,6 +223,10 @@ msgstr "" msgid "Add Location" msgstr "" +#: src/views/dns/DNSRecordManager.vue:171 +msgid "Add Record" +msgstr "" + #: src/components/NgxConfigEditor/NgxServer.vue:92 msgid "Add Server" msgstr "" @@ -241,7 +247,7 @@ msgstr "" msgid "Added successfully" msgstr "" -#: src/views/certificate/components/DNSChallenge.vue:97 +#: src/views/dns/components/DNSChallenge.vue:98 msgid "Additional" msgstr "" @@ -278,6 +284,10 @@ msgstr "" msgid "Afterwards, refresh this page and click add passkey again." msgstr "" +#: src/views/dns/components/DNSRecordFilter.vue:55 +msgid "All" +msgstr "" + #: src/views/system/Licenses.vue:152 msgid "All Components" msgstr "" @@ -316,7 +326,7 @@ msgstr "" msgid "API Base Url" msgstr "" -#: src/views/certificate/components/DNSChallenge.vue:70 +#: src/views/dns/components/DNSChallenge.vue:71 msgid "API Document" msgstr "" @@ -352,6 +362,10 @@ msgstr "" msgid "Are you sure to delete this passkey immediately?" msgstr "" +#: src/views/dns/components/DNSRecordTable.vue:90 +msgid "Are you sure to delete this record?" +msgstr "" + #: src/views/preference/components/AuthSettings/RecoveryCodes.vue:155 msgid "Are you sure to generate new recovery codes?" msgstr "" @@ -521,7 +535,7 @@ msgstr "" #: src/views/certificate/components/CertificateActions.vue:22 #: src/views/config/components/ConfigLeftPanel.vue:274 #: src/views/config/ConfigList.vue:120 src/views/config/ConfigList.vue:217 -#: src/views/nginx_log/NginxLog.vue:129 +#: src/views/dns/DNSRecordManager.vue:223 src/views/nginx_log/NginxLog.vue:129 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:183 #: src/views/stream/components/StreamEditor.vue:147 msgid "Back" @@ -668,6 +682,10 @@ msgstr "" msgid "Browser Statistics" msgstr "" +#: src/views/dns/DNSDomainList.vue:257 +msgid "Business contact:" +msgstr "" + #: src/views/nginx_log/components/IndexingSettingsModal.vue:316 msgid "" "By enabling advanced indexing, you acknowledge that your system meets the " @@ -733,6 +751,7 @@ msgstr "" #: src/components/NgxConfigEditor/NgxUpstream.vue:32 src/language/curd.ts:37 #: src/views/config/components/Delete.vue:98 #: src/views/dashboard/components/SiteHealthCheckModal.vue:710 +#: src/views/dns/DDNSManager.vue:244 src/views/dns/DNSRecordManager.vue:212 #: src/views/nginx_log/components/IndexingSettingsModal.vue:102 #: src/views/nginx_log/indexing/IndexManagement.vue:33 #: src/views/nginx_log/indexing/IndexManagement.vue:59 @@ -879,7 +898,7 @@ msgstr "" msgid "Certificates" msgstr "" -#: src/routes/modules/certificates.ts:36 +#: src/routes/modules/certificates.ts:28 msgid "Certificates List" msgstr "" @@ -1222,7 +1241,7 @@ msgstr "" msgid "Config Template" msgstr "" -#: src/views/certificate/DNSCredential.vue:52 +#: src/views/dns/DNSCredential.vue:52 msgid "Configuration" msgstr "" @@ -1250,6 +1269,14 @@ msgstr "" msgid "Configurations" msgstr "" +#: src/views/dns/DDNSManager.vue:201 +msgid "Configure" +msgstr "" + +#: src/views/dns/DDNSManager.vue:211 +msgid "Configure DDNS" +msgstr "" + #: src/views/site/site_add/SiteAdd.vue:81 msgid "Configure SSL" msgstr "" @@ -1371,6 +1398,10 @@ msgstr "" msgid "Create Folder" msgstr "" +#: src/views/dns/DNSRecordManager.vue:200 +msgid "Create Record" +msgstr "" + #: src/views/backup/components/BackupCreator.vue:75 msgid "" "Create system backups including Nginx configuration and Nginx UI settings. " @@ -1394,11 +1425,12 @@ msgstr "" msgid "Creating client facilitates communication with the CA server" msgstr "" -#: src/components/AutoCertForm/DNSChallenge.vue:105 +#: src/components/AutoCertForm/DNSChallenge.vue:131 +#: src/views/dns/DDNSManager.vue:65 src/views/dns/DNSDomainList.vue:109 msgid "Credential" msgstr "" -#: src/views/certificate/components/DNSChallenge.vue:86 +#: src/routes/modules/dns.ts:20 src/views/dns/components/DNSChallenge.vue:87 msgid "Credentials" msgstr "" @@ -1513,6 +1545,18 @@ msgstr "" msgid "Db file not found" msgstr "" +#: src/routes/modules/dns.ts:36 +msgid "DDNS" +msgstr "" + +#: src/views/dns/DDNSManager.vue:153 +msgid "DDNS Overview" +msgstr "" + +#: src/views/dns/DDNSManager.vue:135 +msgid "DDNS saved" +msgstr "" + #: src/constants/errors/geolite.ts:12 msgid "Decompression succeeded but failed to delete compressed file: {0}" msgstr "" @@ -1537,6 +1581,7 @@ msgstr "" #: src/views/config/components/Delete.vue:65 #: src/views/config/components/Delete.vue:97 #: src/views/config/ConfigList.vue:199 +#: src/views/dns/components/DNSRecordTable.vue:94 #: src/views/site/site_list/SiteList.vue:100 #: src/views/stream/StreamList.vue:110 msgid "Delete" @@ -1778,7 +1823,8 @@ msgid "Disable stream %{name} from %{node} successfully" msgstr "" #: src/views/backup/AutoBackup/AutoBackup.vue:175 -#: src/views/node/nodeColumns.tsx:60 src/views/node/nodeColumns.tsx:78 +#: src/views/dns/DDNSManager.vue:175 src/views/node/nodeColumns.tsx:60 +#: src/views/node/nodeColumns.tsx:78 #: src/views/preference/tabs/HTTPSettings.vue:24 #: src/views/preference/tabs/NodeSettings.vue:25 #: src/views/preference/tabs/NodeSettings.vue:30 @@ -1803,16 +1849,35 @@ msgstr "" msgid "Disk IO" msgstr "" -#: src/routes/modules/certificates.ts:28 -#: src/views/certificate/DNSCredential.vue:79 +#: src/routes/modules/dns.ts:11 +msgid "DNS" +msgstr "" + +#: src/views/dns/DNSCredential.vue:79 msgid "DNS Credentials" msgstr "" -#: src/components/AutoCertForm/DNSChallenge.vue:95 -#: src/views/certificate/components/DNSChallenge.vue:59 +#: src/routes/modules/dns.ts:28 src/views/dns/DNSDomainList.vue:228 +msgid "DNS Domains" +msgstr "" + +#: src/views/dns/components/DNSRecordTable.vue:81 +msgid "DNS Only" +msgstr "" + +#: src/components/AutoCertForm/DNSChallenge.vue:121 +#: src/views/dns/components/DNSChallenge.vue:60 msgid "DNS Provider" msgstr "" +#: src/views/dns/DNSDomainList.vue:244 +msgid "DNS Provider Support" +msgstr "" + +#: src/routes/modules/dns.ts:44 src/views/dns/DNSRecordManager.vue:58 +msgid "DNS Records" +msgstr "" + #: src/views/dashboard/components/SiteHealthCheckModal.vue:678 msgid "DNS Resolver" msgstr "" @@ -1874,6 +1939,7 @@ msgid "Document Count" msgstr "" #: src/views/certificate/components/DNSIssueCertificate.vue:119 +#: src/views/dns/DDNSManager.vue:60 src/views/dns/DNSDomainList.vue:98 msgid "Domain" msgstr "" @@ -1959,7 +2025,7 @@ msgstr "" msgid "EAB Key ID" msgstr "" -#: src/language/curd.ts:8 +#: src/language/curd.ts:8 src/views/dns/components/DNSRecordTable.vue:87 msgid "Edit" msgstr "" @@ -1973,6 +2039,10 @@ msgstr "" msgid "Edit Configuration" msgstr "" +#: src/views/dns/DNSRecordManager.vue:200 +msgid "Edit Record" +msgstr "" + #: src/routes/modules/sites.ts:34 msgid "Edit Site" msgstr "" @@ -2023,6 +2093,10 @@ msgstr "" msgid "Enable compression for content transfer" msgstr "" +#: src/views/dns/DDNSManager.vue:218 +msgid "Enable DDNS" +msgstr "" + #: src/views/dashboard/components/SiteHealthCheckModal.vue:473 msgid "Enable Health Check" msgstr "" @@ -2110,7 +2184,8 @@ msgid "Enable TOTP" msgstr "" #: src/views/backup/AutoBackup/AutoBackup.vue:174 -#: src/views/node/nodeColumns.tsx:69 src/views/node/nodeColumns.tsx:75 +#: src/views/dns/DDNSManager.vue:175 src/views/node/nodeColumns.tsx:69 +#: src/views/node/nodeColumns.tsx:75 #: src/views/preference/components/ExternalNotify/columns.tsx:47 #: src/views/preference/tabs/HTTPSettings.vue:24 #: src/views/preference/tabs/LogrotateSettings.vue:20 @@ -3054,14 +3129,19 @@ msgstr "" msgid "History" msgstr "" -#: src/routes/index.ts:52 +#: src/routes/index.ts:54 msgid "Home" msgstr "" +#: src/views/dns/components/DNSRecordFilter.vue:42 #: src/views/preference/tabs/ServerSettings.vue:19 msgid "Host" msgstr "" +#: src/views/dns/components/DNSRecordFilter.vue:45 +msgid "Host, e.g. @ or www" +msgstr "" + #: src/views/backup/AutoBackup/components/CronEditor.vue:159 #: src/views/nginx_log/dashboard/components/HourlyChart.vue:87 msgid "Hour" @@ -3127,7 +3207,7 @@ msgstr "" msgid "Import" msgstr "" -#: src/routes/modules/certificates.ts:54 +#: src/routes/modules/certificates.ts:46 #: src/views/certificate/CertificateEditor.vue:84 msgid "Import Certificate" msgstr "" @@ -3246,10 +3326,15 @@ msgid "" "restart the Nginx UI." msgstr "" +#: src/views/dns/DDNSManager.vue:79 #: src/views/preference/tabs/LogrotateSettings.vue:26 msgid "Interval" msgstr "" +#: src/views/dns/DDNSManager.vue:232 +msgid "Interval (seconds)" +msgstr "" + #: src/views/certificate/ACMEUser.vue:166 msgid "Invalid" msgstr "" @@ -3476,6 +3561,10 @@ msgstr "" msgid "Last month" msgstr "" +#: src/views/dns/DDNSManager.vue:87 +msgid "Last run" +msgstr "" + #: src/views/dashboard/NginxDashBoard.vue:138 msgid "Last update" msgstr "" @@ -3731,6 +3820,10 @@ msgstr "" msgid "Manage Configs" msgstr "" +#: src/views/dns/DNSDomainList.vue:236 +msgid "Manage Records" +msgstr "" + #: src/routes/modules/sites.ts:10 src/views/site/site_list/SiteList.vue:45 msgid "Manage Sites" msgstr "" @@ -3901,7 +3994,7 @@ msgstr "" msgid "Modify" msgstr "" -#: src/routes/modules/certificates.ts:44 +#: src/routes/modules/certificates.ts:36 #: src/views/certificate/CertificateEditor.vue:84 msgid "Modify Certificate" msgstr "" @@ -3962,11 +4055,13 @@ msgstr "" #: src/views/certificate/components/CertificateBasicInfo.vue:44 #: src/views/certificate/components/CertificateBasicInfo.vue:58 #: src/views/certificate/components/CertificateBasicInfo.vue:70 -#: src/views/certificate/DNSCredential.vue:17 #: src/views/config/components/ConfigRightPanel/Basic.vue:34 #: src/views/config/components/Delete.vue:123 #: src/views/config/components/Mkdir.vue:64 -#: src/views/config/configColumns.tsx:17 src/views/namespace/columns.ts:9 +#: src/views/config/configColumns.tsx:17 +#: src/views/dns/components/DNSRecordForm.vue:63 +#: src/views/dns/components/DNSRecordTable.vue:17 +#: src/views/dns/DNSCredential.vue:17 src/views/namespace/columns.ts:9 #: src/views/nginx_log/NginxLogList.vue:155 src/views/node/nodeColumns.tsx:8 #: src/views/preference/components/AuthSettings/AddPasskey.vue:81 #: src/views/site/site_edit/components/RightPanel/Basic.vue:36 @@ -3994,6 +4089,12 @@ msgstr "" msgid "Namespaces" msgstr "" +#: src/views/dns/DNSDomainList.vue:251 +msgid "" +"Need more DNS providers? Support us through donations or contact us for " +"commercial collaboration" +msgstr "" + #: src/views/dashboard/NginxDashBoard.vue:195 msgid "Need to enable the stub_status module" msgstr "" @@ -4384,6 +4485,10 @@ msgstr "" msgid "Not Loaded" msgstr "" +#: src/views/dns/DDNSManager.vue:102 +msgid "Not run yet" +msgstr "" + #: src/components/AutoCertForm/AutoCertForm.vue:230 msgid "Not supported for IP certificates" msgstr "" @@ -4393,7 +4498,7 @@ msgid "Not Valid Before: %{date}" msgstr "" #: src/components/AutoCertForm/AutoCertForm.vue:150 -#: src/views/certificate/DNSCredential.vue:89 +#: src/views/dns/DNSCredential.vue:89 msgid "Note" msgstr "" @@ -4516,10 +4621,6 @@ msgstr "" msgid "On" msgstr "" -#: src/views/certificate/DNSCredential.vue:99 -msgid "Once the verification is complete, the records will be removed." -msgstr "" - #: src/components/NamespaceTabs/NamespaceTabs.vue:164 #: src/components/NodeCard/NodeCard.vue:51 #: src/components/NodeSelector/NodeSelector.vue:65 @@ -4804,7 +4905,7 @@ msgstr "" msgid "Please fill in required S3 configuration fields" msgstr "" -#: src/views/certificate/DNSCredential.vue:93 +#: src/views/dns/DNSCredential.vue:93 msgid "" "Please fill in the API authentication credentials provided by your DNS " "provider." @@ -4861,7 +4962,7 @@ msgstr "" msgid "Please log in." msgstr "" -#: src/views/certificate/DNSCredential.vue:102 +#: src/views/dns/DNSCredential.vue:96 msgid "" "Please note that the unit of time configurations below are all in seconds." msgstr "" @@ -4942,6 +5043,11 @@ msgstr "" msgid "Preparing lego configurations" msgstr "" +#: src/views/dns/components/DNSRecordForm.vue:81 +#: src/views/dns/components/DNSRecordTable.vue:33 +msgid "Priority" +msgstr "" + #: src/components/AutoCertForm/AutoCertForm.vue:206 msgid "Private CA:" msgstr "" @@ -5001,7 +5107,8 @@ msgid "" "reverse proxy, please configure the protocol separately in the reverse proxy." msgstr "" -#: src/views/certificate/DNSCredential.vue:26 +#: src/views/dns/DDNSManager.vue:70 src/views/dns/DNSCredential.vue:26 +#: src/views/dns/DNSDomainList.vue:177 src/views/dns/DNSDomainList.vue:198 msgid "Provider" msgstr "" @@ -5013,6 +5120,12 @@ msgstr "" msgid "Province / Region" msgstr "" +#: src/views/dns/components/DNSRecordForm.vue:87 +#: src/views/dns/components/DNSRecordTable.vue:51 +#: src/views/dns/components/DNSRecordTable.vue:81 +msgid "Proxied" +msgstr "" + #: src/views/certificate/ACMEUser.vue:63 msgid "Proxy" msgstr "" @@ -5107,6 +5220,22 @@ msgstr "" msgid "Recommended:" msgstr "" +#: src/views/dns/DNSRecordManager.vue:113 +msgid "Record created" +msgstr "" + +#: src/views/dns/DNSRecordManager.vue:120 +msgid "Record deleted" +msgstr "" + +#: src/views/dns/DNSRecordManager.vue:109 +msgid "Record updated" +msgstr "" + +#: src/views/dns/DDNSManager.vue:221 +msgid "Records" +msgstr "" + #: src/components/TwoFA/Authorization.vue:79 msgid "Recovery" msgstr "" @@ -5134,7 +5263,8 @@ msgstr "" msgid "Referer" msgstr "" -#: src/language/curd.ts:70 +#: src/language/curd.ts:70 src/views/dns/DDNSManager.vue:161 +#: src/views/dns/DNSRecordManager.vue:165 msgid "Refresh" msgstr "" @@ -5374,7 +5504,7 @@ msgstr "" msgid "Requests Per Connection" msgstr "" -#: src/language/curd.ts:13 +#: src/language/curd.ts:13 src/views/dns/components/DNSRecordFilter.vue:65 #: src/views/nginx_log/structured/components/SearchFilters.vue:214 #: src/views/nginx_log/structured/StructuredLogViewer.vue:745 msgid "Reset" @@ -5610,6 +5740,7 @@ msgstr "" #: src/views/config/components/ConfigLeftPanel.vue:283 #: src/views/config/components/ConfigName.vue:58 #: src/views/dashboard/components/SiteHealthCheckModal.vue:713 +#: src/views/dns/DDNSManager.vue:247 src/views/dns/DNSRecordManager.vue:215 #: src/views/preference/components/AuthSettings/Passkey.vue:131 #: src/views/preference/Preference.vue:124 #: src/views/site/site_edit/components/ConfigName/ConfigName.vue:52 @@ -5715,12 +5846,13 @@ msgstr "" msgid "Schedule Type" msgstr "" -#: src/views/certificate/components/DNSChallenge.vue:77 +#: src/views/dns/components/DNSChallenge.vue:78 msgid "SDK" msgstr "" #: src/language/constants.ts:62 src/language/curd.ts:12 #: src/views/config/configColumns.tsx:5 +#: src/views/dns/components/DNSRecordFilter.vue:62 #: src/views/nginx_log/structured/components/SearchFilters.vue:217 #: src/views/site/site_list/columns.tsx:17 src/views/stream/columns.tsx:13 msgid "Search" @@ -5777,10 +5909,18 @@ msgstr "" msgid "Select all" msgstr "" +#: src/language/constants.ts:68 +msgid "Select Credential" +msgstr "" + #: src/views/certificate/ACMEUser.vue:45 msgid "Select or enter a CA directory URL" msgstr "" +#: src/language/constants.ts:67 +msgid "Select Provider" +msgstr "" + #: src/language/curd.ts:59 msgid "Selected {count} files" msgstr "" @@ -6096,6 +6236,7 @@ msgstr "" #: src/views/certificate/ACMEUser.vue:75 #: src/views/certificate/CertificateList/certColumns.tsx:63 #: src/views/dashboard/components/ModulesTable.vue:75 +#: src/views/dns/DDNSManager.vue:75 #: src/views/nginx_log/structured/components/SearchFilters.vue:106 #: src/views/nginx_log/structured/StructuredLogViewer.vue:241 #: src/views/nginx_log/structured/StructuredLogViewer.vue:521 @@ -6321,6 +6462,10 @@ msgstr "" msgid "System restored successfully." msgstr "" +#: src/views/dns/DDNSManager.vue:83 +msgid "Targets" +msgstr "" + #: src/constants/errors/self_check.ts:3 msgid "Task is not fixable" msgstr "" @@ -6798,6 +6943,14 @@ msgstr "" msgid "Try adjusting your search criteria or time range." msgstr "" +#: src/views/dns/components/DNSRecordTable.vue:29 +msgid "TTL" +msgstr "" + +#: src/views/dns/components/DNSRecordForm.vue:78 +msgid "TTL (seconds)" +msgstr "" + #: src/views/backup/AutoBackup/components/CronEditor.vue:28 msgid "Tuesday" msgstr "" @@ -6810,6 +6963,9 @@ msgstr "" #: src/views/certificate/CertificateList/certColumns.tsx:24 #: src/views/config/components/Delete.vue:122 #: src/views/dashboard/components/ModulesTable.vue:62 +#: src/views/dns/components/DNSRecordFilter.vue:49 +#: src/views/dns/components/DNSRecordForm.vue:57 +#: src/views/dns/components/DNSRecordTable.vue:21 #: src/views/nginx_log/NginxLogList.vue:146 #: src/views/notification/notificationColumns.tsx:8 #: src/views/preference/components/ExternalNotify/columns.tsx:19 @@ -6820,6 +6976,10 @@ msgstr "" msgid "Type %{delete} to confirm" msgstr "" +#: src/views/dns/DDNSManager.vue:228 +msgid "Type or select A/AAAA records" +msgstr "" + #: src/views/nginx_log/structured/components/SearchFilters.vue:142 msgid "Type or select browser" msgstr "" @@ -6875,9 +7035,9 @@ msgstr "" #: src/views/backup/AutoBackup/AutoBackup.vue:236 #: src/views/certificate/ACMEUser.vue:124 -#: src/views/certificate/DNSCredential.vue:65 #: src/views/config/components/ConfigRightPanel/Basic.vue:54 -#: src/views/config/configColumns.tsx:44 src/views/namespace/columns.ts:91 +#: src/views/config/configColumns.tsx:44 src/views/dns/DNSCredential.vue:65 +#: src/views/dns/DNSDomainList.vue:205 src/views/namespace/columns.ts:91 #: src/views/node/nodeColumns.tsx:89 #: src/views/site/site_edit/components/RightPanel/Basic.vue:39 #: src/views/site/site_list/columns.tsx:113 src/views/stream/columns.tsx:80 @@ -6950,6 +7110,10 @@ msgstr "" msgid "URL" msgstr "" +#: src/views/dns/components/DNSRecordForm.vue:64 +msgid "Use @ for root" +msgstr "" + #: src/components/TwoFA/Authorization.vue:121 msgid "Use OTP" msgstr "" @@ -7015,6 +7179,8 @@ msgid "Validate SSL Certificate" msgstr "" #: src/views/dashboard/components/PerformanceTablesCard.vue:22 +#: src/views/dns/components/DNSRecordForm.vue:66 +#: src/views/dns/components/DNSRecordTable.vue:25 msgid "Value" msgstr "" @@ -7104,12 +7270,6 @@ msgstr "" msgid "We do not accept any feature requests" msgstr "" -#: src/views/certificate/DNSCredential.vue:96 -msgid "" -"We will add one or more TXT records to the DNS records of your domain for " -"ownership verification." -msgstr "" - #: src/views/site/site_edit/components/Cert/ObtainCert.vue:142 msgid "" "We will remove the HTTPChallenge configuration from this file and reload the " @@ -7144,6 +7304,11 @@ msgstr "" msgid "Weekly on %{day} at %{time}" msgstr "" +#: src/views/dns/components/DNSRecordForm.vue:84 +#: src/views/dns/components/DNSRecordTable.vue:37 +msgid "Weight" +msgstr "" + #: src/views/certificate/ACMEUser.vue:119 msgid "" "When Enabled, Nginx UI will automatically re-register users upon startup. " @@ -7187,7 +7352,7 @@ msgstr "" msgid "Workers" msgstr "" -#: src/layouts/HeaderLayout.vue:61 src/routes/index.ts:61 +#: src/layouts/HeaderLayout.vue:61 src/routes/index.ts:63 #: src/views/workspace/WorkSpace.vue:51 msgid "Workspace" msgstr "" diff --git a/app/src/language/es/app.po b/app/src/language/es/app.po index f377fe83..c3ce8027 100644 --- a/app/src/language/es/app.po +++ b/app/src/language/es/app.po @@ -193,8 +193,10 @@ msgstr "Acción" #: src/views/backup/AutoBackup/AutoBackup.vue:273 #: src/views/certificate/ACMEUser.vue:131 #: src/views/certificate/CertificateList/certColumns.tsx:92 -#: src/views/certificate/DNSCredential.vue:71 -#: src/views/config/configColumns.tsx:51 src/views/namespace/columns.ts:97 +#: src/views/config/configColumns.tsx:51 +#: src/views/dns/components/DNSRecordTable.vue:41 +#: src/views/dns/DDNSManager.vue:91 src/views/dns/DNSCredential.vue:71 +#: src/views/dns/DNSDomainList.vue:211 src/views/namespace/columns.ts:97 #: src/views/nginx_log/NginxLogList.vue:338 src/views/node/nodeColumns.tsx:96 #: src/views/notification/notificationColumns.tsx:72 #: src/views/preference/components/ExternalNotify/columns.tsx:85 @@ -248,6 +250,10 @@ msgstr "Agregar encabezado" msgid "Add Location" msgstr "Agregar Ubicación" +#: src/views/dns/DNSRecordManager.vue:171 +msgid "Add Record" +msgstr "Agregar registro" + #: src/components/NgxConfigEditor/NgxServer.vue:92 msgid "Add Server" msgstr "Agregar servidor" @@ -268,7 +274,7 @@ msgstr "Agregar upstream" msgid "Added successfully" msgstr "Agregado exitoso" -#: src/views/certificate/components/DNSChallenge.vue:97 +#: src/views/dns/components/DNSChallenge.vue:98 msgid "Additional" msgstr "Adicional" @@ -309,6 +315,10 @@ msgstr "" "Después, actualice esta página y haga clic en agregar clave de acceso " "nuevamente." +#: src/views/dns/components/DNSRecordFilter.vue:55 +msgid "All" +msgstr "Todos" + #: src/views/system/Licenses.vue:152 msgid "All Components" msgstr "Todos los componentes" @@ -352,7 +362,7 @@ msgstr "" msgid "API Base Url" msgstr "URL Base de la API" -#: src/views/certificate/components/DNSChallenge.vue:70 +#: src/views/dns/components/DNSChallenge.vue:71 msgid "API Document" msgstr "Documento de la API" @@ -388,6 +398,10 @@ msgstr "¿Está seguro de eliminar esta IP bloqueada inmediatamente?" msgid "Are you sure to delete this passkey immediately?" msgstr "¿Está seguro de eliminar esta llave de acceso inmediatamente?" +#: src/views/dns/components/DNSRecordTable.vue:90 +msgid "Are you sure to delete this record?" +msgstr "¿Estás seguro de eliminar este registro?" + #: src/views/preference/components/AuthSettings/RecoveryCodes.vue:155 msgid "Are you sure to generate new recovery codes?" msgstr "¿Estás seguro de generar nuevos códigos de recuperación?" @@ -561,7 +575,7 @@ msgstr "Prom./PV" #: src/views/certificate/components/CertificateActions.vue:22 #: src/views/config/components/ConfigLeftPanel.vue:274 #: src/views/config/ConfigList.vue:120 src/views/config/ConfigList.vue:217 -#: src/views/nginx_log/NginxLog.vue:129 +#: src/views/dns/DNSRecordManager.vue:223 src/views/nginx_log/NginxLog.vue:129 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:183 #: src/views/stream/components/StreamEditor.vue:147 msgid "Back" @@ -721,6 +735,10 @@ msgstr "Navegador" msgid "Browser Statistics" msgstr "Estadísticas del navegador" +#: src/views/dns/DNSDomainList.vue:257 +msgid "Business contact:" +msgstr "Contacto comercial:" + #: src/views/nginx_log/components/IndexingSettingsModal.vue:316 msgid "" "By enabling advanced indexing, you acknowledge that your system meets the " @@ -793,6 +811,7 @@ msgstr "" #: src/components/NgxConfigEditor/NgxUpstream.vue:32 src/language/curd.ts:37 #: src/views/config/components/Delete.vue:98 #: src/views/dashboard/components/SiteHealthCheckModal.vue:710 +#: src/views/dns/DDNSManager.vue:244 src/views/dns/DNSRecordManager.vue:212 #: src/views/nginx_log/components/IndexingSettingsModal.vue:102 #: src/views/nginx_log/indexing/IndexManagement.vue:33 #: src/views/nginx_log/indexing/IndexManagement.vue:59 @@ -941,7 +960,7 @@ msgstr "Tipo de certificado" msgid "Certificates" msgstr "Certificados" -#: src/routes/modules/certificates.ts:36 +#: src/routes/modules/certificates.ts:28 msgid "Certificates List" msgstr "Lista de Certificados" @@ -1325,7 +1344,7 @@ msgstr "La ruta de configuración está vacía" msgid "Config Template" msgstr "Plantilla de configuración" -#: src/views/certificate/DNSCredential.vue:52 +#: src/views/dns/DNSCredential.vue:52 msgid "Configuration" msgstr "Configuración" @@ -1355,6 +1374,14 @@ msgstr "Nombre de la configuración" msgid "Configurations" msgstr "Configuraciones" +#: src/views/dns/DDNSManager.vue:201 +msgid "Configure" +msgstr "Configurar" + +#: src/views/dns/DDNSManager.vue:211 +msgid "Configure DDNS" +msgstr "Configurar DDNS" + #: src/views/site/site_add/SiteAdd.vue:81 msgid "Configure SSL" msgstr "Configurar SSL" @@ -1478,6 +1505,10 @@ msgstr "Crear Archivo" msgid "Create Folder" msgstr "Crear carpeta" +#: src/views/dns/DNSRecordManager.vue:200 +msgid "Create Record" +msgstr "Crear registro" + #: src/views/backup/components/BackupCreator.vue:75 msgid "" "Create system backups including Nginx configuration and Nginx UI settings. " @@ -1504,11 +1535,12 @@ msgstr "Creado con éxito" msgid "Creating client facilitates communication with the CA server" msgstr "La creación de un cliente facilita la comunicación con el servidor CA" -#: src/components/AutoCertForm/DNSChallenge.vue:105 +#: src/components/AutoCertForm/DNSChallenge.vue:131 +#: src/views/dns/DDNSManager.vue:65 src/views/dns/DNSDomainList.vue:109 msgid "Credential" msgstr "Credencial" -#: src/views/certificate/components/DNSChallenge.vue:86 +#: src/routes/modules/dns.ts:20 src/views/dns/components/DNSChallenge.vue:87 msgid "Credentials" msgstr "Credenciales" @@ -1625,6 +1657,18 @@ msgstr "Días" msgid "Db file not found" msgstr "Archivo de base de datos no encontrado" +#: src/routes/modules/dns.ts:36 +msgid "DDNS" +msgstr "DDNS" + +#: src/views/dns/DDNSManager.vue:153 +msgid "DDNS Overview" +msgstr "Resumen de DDNS" + +#: src/views/dns/DDNSManager.vue:135 +msgid "DDNS saved" +msgstr "DDNS guardado" + #: src/constants/errors/geolite.ts:12 msgid "Decompression succeeded but failed to delete compressed file: {0}" msgstr "Descompresión exitosa pero falló al eliminar el archivo comprimido: {0}" @@ -1651,6 +1695,7 @@ msgstr "" #: src/views/config/components/Delete.vue:65 #: src/views/config/components/Delete.vue:97 #: src/views/config/ConfigList.vue:199 +#: src/views/dns/components/DNSRecordTable.vue:94 #: src/views/site/site_list/SiteList.vue:100 #: src/views/stream/StreamList.vue:110 msgid "Delete" @@ -1892,7 +1937,8 @@ msgid "Disable stream %{name} from %{node} successfully" msgstr "Deshabilitar el flujo %{name} desde %{node} con éxito" #: src/views/backup/AutoBackup/AutoBackup.vue:175 -#: src/views/node/nodeColumns.tsx:60 src/views/node/nodeColumns.tsx:78 +#: src/views/dns/DDNSManager.vue:175 src/views/node/nodeColumns.tsx:60 +#: src/views/node/nodeColumns.tsx:78 #: src/views/preference/tabs/HTTPSettings.vue:24 #: src/views/preference/tabs/NodeSettings.vue:25 #: src/views/preference/tabs/NodeSettings.vue:30 @@ -1917,16 +1963,35 @@ msgstr "Desconectado" msgid "Disk IO" msgstr "I/O del disco" -#: src/routes/modules/certificates.ts:28 -#: src/views/certificate/DNSCredential.vue:79 +#: src/routes/modules/dns.ts:11 +msgid "DNS" +msgstr "DNS" + +#: src/views/dns/DNSCredential.vue:79 msgid "DNS Credentials" msgstr "Credenciales de DNS" -#: src/components/AutoCertForm/DNSChallenge.vue:95 -#: src/views/certificate/components/DNSChallenge.vue:59 +#: src/routes/modules/dns.ts:28 src/views/dns/DNSDomainList.vue:228 +msgid "DNS Domains" +msgstr "Dominios DNS" + +#: src/views/dns/components/DNSRecordTable.vue:81 +msgid "DNS Only" +msgstr "Solo DNS" + +#: src/components/AutoCertForm/DNSChallenge.vue:121 +#: src/views/dns/components/DNSChallenge.vue:60 msgid "DNS Provider" msgstr "Proveedor DNS" +#: src/views/dns/DNSDomainList.vue:244 +msgid "DNS Provider Support" +msgstr "Soporte de proveedor de DNS" + +#: src/routes/modules/dns.ts:44 src/views/dns/DNSRecordManager.vue:58 +msgid "DNS Records" +msgstr "Registros DNS" + #: src/views/dashboard/components/SiteHealthCheckModal.vue:678 msgid "DNS Resolver" msgstr "Resolución DNS" @@ -1988,6 +2053,7 @@ msgid "Document Count" msgstr "Recuento de documentos" #: src/views/certificate/components/DNSIssueCertificate.vue:119 +#: src/views/dns/DDNSManager.vue:60 src/views/dns/DNSDomainList.vue:98 msgid "Domain" msgstr "Dominio" @@ -2078,7 +2144,7 @@ msgstr "Clave HMAC EAB" msgid "EAB Key ID" msgstr "ID de clave EAB" -#: src/language/curd.ts:8 +#: src/language/curd.ts:8 src/views/dns/components/DNSRecordTable.vue:87 msgid "Edit" msgstr "Editar" @@ -2092,6 +2158,10 @@ msgstr "Editar %{n}" msgid "Edit Configuration" msgstr "Editar Configuración" +#: src/views/dns/DNSRecordManager.vue:200 +msgid "Edit Record" +msgstr "Editar registro" + #: src/routes/modules/sites.ts:34 msgid "Edit Site" msgstr "Editar Sitio" @@ -2142,6 +2212,10 @@ msgstr "Habilitar finalización de código" msgid "Enable compression for content transfer" msgstr "Habilitar compresión para transferencia de contenido" +#: src/views/dns/DDNSManager.vue:218 +msgid "Enable DDNS" +msgstr "Habilitar DDNS" + #: src/views/dashboard/components/SiteHealthCheckModal.vue:473 msgid "Enable Health Check" msgstr "Habilitar verificación de salud" @@ -2229,7 +2303,8 @@ msgid "Enable TOTP" msgstr "Habilitar TOTP" #: src/views/backup/AutoBackup/AutoBackup.vue:174 -#: src/views/node/nodeColumns.tsx:69 src/views/node/nodeColumns.tsx:75 +#: src/views/dns/DDNSManager.vue:175 src/views/node/nodeColumns.tsx:69 +#: src/views/node/nodeColumns.tsx:75 #: src/views/preference/components/ExternalNotify/columns.tsx:47 #: src/views/preference/tabs/HTTPSettings.vue:24 #: src/views/preference/tabs/LogrotateSettings.vue:20 @@ -3203,14 +3278,19 @@ msgstr "Un valor más alto significa una mejor reutilización de la conexión" msgid "History" msgstr "Historial" -#: src/routes/index.ts:52 +#: src/routes/index.ts:54 msgid "Home" msgstr "Inicio" +#: src/views/dns/components/DNSRecordFilter.vue:42 #: src/views/preference/tabs/ServerSettings.vue:19 msgid "Host" msgstr "Host" +#: src/views/dns/components/DNSRecordFilter.vue:45 +msgid "Host, e.g. @ or www" +msgstr "Host, p. ej. @ o www" + #: src/views/backup/AutoBackup/components/CronEditor.vue:159 #: src/views/nginx_log/dashboard/components/HourlyChart.vue:87 msgid "Hour" @@ -3284,7 +3364,7 @@ msgstr "" msgid "Import" msgstr "Importar" -#: src/routes/modules/certificates.ts:54 +#: src/routes/modules/certificates.ts:46 #: src/views/certificate/CertificateEditor.vue:84 msgid "Import Certificate" msgstr "Importar Certificado" @@ -3407,10 +3487,15 @@ msgstr "" "No se permite la instalación después de 10 minutos del inicio del sistema, " "por favor reinicie la interfaz de Nginx." +#: src/views/dns/DDNSManager.vue:79 #: src/views/preference/tabs/LogrotateSettings.vue:26 msgid "Interval" msgstr "Intervalo" +#: src/views/dns/DDNSManager.vue:232 +msgid "Interval (seconds)" +msgstr "Intervalo (segundos)" + #: src/views/certificate/ACMEUser.vue:166 msgid "Invalid" msgstr "Inválido" @@ -3639,6 +3724,10 @@ msgstr "Última indexación" msgid "Last month" msgstr "Mes pasado" +#: src/views/dns/DDNSManager.vue:87 +msgid "Last run" +msgstr "Última ejecución" + #: src/views/dashboard/NginxDashBoard.vue:138 msgid "Last update" msgstr "Última actualización" @@ -3909,6 +3998,10 @@ msgstr "" msgid "Manage Configs" msgstr "Administrar configuraciones" +#: src/views/dns/DNSDomainList.vue:236 +msgid "Manage Records" +msgstr "Gestionar registros" + #: src/routes/modules/sites.ts:10 src/views/site/site_list/SiteList.vue:45 msgid "Manage Sites" msgstr "Administrar sitios" @@ -4079,7 +4172,7 @@ msgstr "Modificado el" msgid "Modify" msgstr "Modificar" -#: src/routes/modules/certificates.ts:44 +#: src/routes/modules/certificates.ts:36 #: src/views/certificate/CertificateEditor.vue:84 msgid "Modify Certificate" msgstr "Modificar Certificado" @@ -4140,11 +4233,13 @@ msgstr "N/A" #: src/views/certificate/components/CertificateBasicInfo.vue:44 #: src/views/certificate/components/CertificateBasicInfo.vue:58 #: src/views/certificate/components/CertificateBasicInfo.vue:70 -#: src/views/certificate/DNSCredential.vue:17 #: src/views/config/components/ConfigRightPanel/Basic.vue:34 #: src/views/config/components/Delete.vue:123 #: src/views/config/components/Mkdir.vue:64 -#: src/views/config/configColumns.tsx:17 src/views/namespace/columns.ts:9 +#: src/views/config/configColumns.tsx:17 +#: src/views/dns/components/DNSRecordForm.vue:63 +#: src/views/dns/components/DNSRecordTable.vue:17 +#: src/views/dns/DNSCredential.vue:17 src/views/namespace/columns.ts:9 #: src/views/nginx_log/NginxLogList.vue:155 src/views/node/nodeColumns.tsx:8 #: src/views/preference/components/AuthSettings/AddPasskey.vue:81 #: src/views/site/site_edit/components/RightPanel/Basic.vue:36 @@ -4172,6 +4267,14 @@ msgstr "Espacio de nombres" msgid "Namespaces" msgstr "Espacios de nombres" +#: src/views/dns/DNSDomainList.vue:251 +msgid "" +"Need more DNS providers? Support us through donations or contact us for " +"commercial collaboration" +msgstr "" +"¿Necesita más proveedores de DNS? Apóyenos a través de donaciones o " +"contáctenos para colaboración comercial" + #: src/views/dashboard/NginxDashBoard.vue:195 msgid "Need to enable the stub_status module" msgstr "Es necesario habilitar el módulo stub_status" @@ -4567,6 +4670,10 @@ msgstr "No indexado" msgid "Not Loaded" msgstr "No cargado" +#: src/views/dns/DDNSManager.vue:102 +msgid "Not run yet" +msgstr "Aún no ejecutado" + #: src/components/AutoCertForm/AutoCertForm.vue:230 msgid "Not supported for IP certificates" msgstr "No compatible con certificados de IP" @@ -4576,7 +4683,7 @@ msgid "Not Valid Before: %{date}" msgstr "No válido antes: %{date}" #: src/components/AutoCertForm/AutoCertForm.vue:150 -#: src/views/certificate/DNSCredential.vue:89 +#: src/views/dns/DNSCredential.vue:89 msgid "Note" msgstr "Nota" @@ -4709,10 +4816,6 @@ msgstr "OK" msgid "On" msgstr "Encendido" -#: src/views/certificate/DNSCredential.vue:99 -msgid "Once the verification is complete, the records will be removed." -msgstr "Una vez que se complete la verificación, los registros se eliminarán." - #: src/components/NamespaceTabs/NamespaceTabs.vue:164 #: src/components/NodeCard/NodeCard.vue:51 #: src/components/NodeSelector/NodeSelector.vue:65 @@ -5007,7 +5110,7 @@ msgstr "Por favor, complete todos los campos correctamente" msgid "Please fill in required S3 configuration fields" msgstr "Por favor, complete los campos de configuración de S3 requeridos" -#: src/views/certificate/DNSCredential.vue:93 +#: src/views/dns/DNSCredential.vue:93 msgid "" "Please fill in the API authentication credentials provided by your DNS " "provider." @@ -5075,7 +5178,7 @@ msgstr "¡Por favor ingrese su nombre de usuario!" msgid "Please log in." msgstr "Por favor, inicie sesión." -#: src/views/certificate/DNSCredential.vue:102 +#: src/views/dns/DNSCredential.vue:96 msgid "Please note that the unit of time configurations below are all in seconds." msgstr "" "Tenga en cuenta que las siguientes configuraciones de unidades de tiempo " @@ -5159,6 +5262,11 @@ msgstr "Configuración" msgid "Preparing lego configurations" msgstr "Preparar la configuración de LEGO" +#: src/views/dns/components/DNSRecordForm.vue:81 +#: src/views/dns/components/DNSRecordTable.vue:33 +msgid "Priority" +msgstr "Prioridad" + #: src/components/AutoCertForm/AutoCertForm.vue:206 msgid "Private CA:" msgstr "CA privada:" @@ -5222,7 +5330,8 @@ msgstr "" "directamente. Si utiliza un proxy inverso, configure el protocolo por " "separado en el proxy inverso." -#: src/views/certificate/DNSCredential.vue:26 +#: src/views/dns/DDNSManager.vue:70 src/views/dns/DNSCredential.vue:26 +#: src/views/dns/DNSDomainList.vue:177 src/views/dns/DNSDomainList.vue:198 msgid "Provider" msgstr "Proveedor" @@ -5234,6 +5343,12 @@ msgstr "Proveedor no encontrado: {0}" msgid "Province / Region" msgstr "Provincia / Región" +#: src/views/dns/components/DNSRecordForm.vue:87 +#: src/views/dns/components/DNSRecordTable.vue:51 +#: src/views/dns/components/DNSRecordTable.vue:81 +msgid "Proxied" +msgstr "Proxy" + #: src/views/certificate/ACMEUser.vue:63 msgid "Proxy" msgstr "Proxy" @@ -5328,6 +5443,22 @@ msgstr "Volver a comprobar" msgid "Recommended:" msgstr "Recomendado:" +#: src/views/dns/DNSRecordManager.vue:113 +msgid "Record created" +msgstr "Registro creado" + +#: src/views/dns/DNSRecordManager.vue:120 +msgid "Record deleted" +msgstr "Registro eliminado" + +#: src/views/dns/DNSRecordManager.vue:109 +msgid "Record updated" +msgstr "Registro actualizado" + +#: src/views/dns/DDNSManager.vue:221 +msgid "Records" +msgstr "Registros" + #: src/components/TwoFA/Authorization.vue:79 msgid "Recovery" msgstr "Recuperación" @@ -5358,7 +5489,8 @@ msgstr "Mensajes de redirección (3xx)" msgid "Referer" msgstr "Referente" -#: src/language/curd.ts:70 +#: src/language/curd.ts:70 src/views/dns/DDNSManager.vue:161 +#: src/views/dns/DNSRecordManager.vue:165 msgid "Refresh" msgstr "Actualizar" @@ -5600,7 +5732,7 @@ msgstr "Pedido con parámetros incorrectos" msgid "Requests Per Connection" msgstr "Solicitudes por conexión" -#: src/language/curd.ts:13 +#: src/language/curd.ts:13 src/views/dns/components/DNSRecordFilter.vue:65 #: src/views/nginx_log/structured/components/SearchFilters.vue:214 #: src/views/nginx_log/structured/StructuredLogViewer.vue:745 msgid "Reset" @@ -5841,6 +5973,7 @@ msgstr "Sábado" #: src/views/config/components/ConfigLeftPanel.vue:283 #: src/views/config/components/ConfigName.vue:58 #: src/views/dashboard/components/SiteHealthCheckModal.vue:713 +#: src/views/dns/DDNSManager.vue:247 src/views/dns/DNSRecordManager.vue:215 #: src/views/preference/components/AuthSettings/Passkey.vue:131 #: src/views/preference/Preference.vue:124 #: src/views/site/site_edit/components/ConfigName/ConfigName.vue:52 @@ -5948,12 +6081,13 @@ msgstr "Programación" msgid "Schedule Type" msgstr "Tipo de programación" -#: src/views/certificate/components/DNSChallenge.vue:77 +#: src/views/dns/components/DNSChallenge.vue:78 msgid "SDK" msgstr "SDK" #: src/language/constants.ts:62 src/language/curd.ts:12 #: src/views/config/configColumns.tsx:5 +#: src/views/dns/components/DNSRecordFilter.vue:62 #: src/views/nginx_log/structured/components/SearchFilters.vue:217 #: src/views/site/site_list/columns.tsx:17 src/views/stream/columns.tsx:13 msgid "Search" @@ -6012,10 +6146,18 @@ msgstr "" msgid "Select all" msgstr "Seleccionar todo" +#: src/language/constants.ts:68 +msgid "Select Credential" +msgstr "Seleccionar credencial" + #: src/views/certificate/ACMEUser.vue:45 msgid "Select or enter a CA directory URL" msgstr "Seleccione o ingrese una URL de directorio CA" +#: src/language/constants.ts:67 +msgid "Select Provider" +msgstr "Seleccionar proveedor" + #: src/language/curd.ts:59 msgid "Selected {count} files" msgstr "Seleccionados {count} archivos" @@ -6347,6 +6489,7 @@ msgstr "Estático" #: src/views/certificate/ACMEUser.vue:75 #: src/views/certificate/CertificateList/certColumns.tsx:63 #: src/views/dashboard/components/ModulesTable.vue:75 +#: src/views/dns/DDNSManager.vue:75 #: src/views/nginx_log/structured/components/SearchFilters.vue:106 #: src/views/nginx_log/structured/StructuredLogViewer.vue:241 #: src/views/nginx_log/structured/StructuredLogViewer.vue:521 @@ -6578,6 +6721,10 @@ msgstr "Restauración del sistema" msgid "System restored successfully." msgstr "Sistema restaurado correctamente." +#: src/views/dns/DDNSManager.vue:83 +msgid "Targets" +msgstr "Objetivos" + #: src/constants/errors/self_check.ts:3 msgid "Task is not fixable" msgstr "La tarea no es reparable" @@ -7125,6 +7272,14 @@ msgstr "Intente ajustar sus criterios de búsqueda o navegar a diferentes págin msgid "Try adjusting your search criteria or time range." msgstr "Intente ajustar sus criterios de búsqueda o el rango de tiempo." +#: src/views/dns/components/DNSRecordTable.vue:29 +msgid "TTL" +msgstr "TTL" + +#: src/views/dns/components/DNSRecordForm.vue:78 +msgid "TTL (seconds)" +msgstr "TTL (segundos)" + #: src/views/backup/AutoBackup/components/CronEditor.vue:28 msgid "Tuesday" msgstr "Martes" @@ -7137,6 +7292,9 @@ msgstr "Se requiere autenticación de dos factores" #: src/views/certificate/CertificateList/certColumns.tsx:24 #: src/views/config/components/Delete.vue:122 #: src/views/dashboard/components/ModulesTable.vue:62 +#: src/views/dns/components/DNSRecordFilter.vue:49 +#: src/views/dns/components/DNSRecordForm.vue:57 +#: src/views/dns/components/DNSRecordTable.vue:21 #: src/views/nginx_log/NginxLogList.vue:146 #: src/views/notification/notificationColumns.tsx:8 #: src/views/preference/components/ExternalNotify/columns.tsx:19 @@ -7147,6 +7305,10 @@ msgstr "Tipo" msgid "Type %{delete} to confirm" msgstr "Escriba %{delete} para confirmar" +#: src/views/dns/DDNSManager.vue:228 +msgid "Type or select A/AAAA records" +msgstr "Escriba o seleccione registros A/AAAA" + #: src/views/nginx_log/structured/components/SearchFilters.vue:142 msgid "Type or select browser" msgstr "Escriba o seleccione el navegador" @@ -7202,9 +7364,9 @@ msgstr "Actualización exitosa" #: src/views/backup/AutoBackup/AutoBackup.vue:236 #: src/views/certificate/ACMEUser.vue:124 -#: src/views/certificate/DNSCredential.vue:65 #: src/views/config/components/ConfigRightPanel/Basic.vue:54 -#: src/views/config/configColumns.tsx:44 src/views/namespace/columns.ts:91 +#: src/views/config/configColumns.tsx:44 src/views/dns/DNSCredential.vue:65 +#: src/views/dns/DNSDomainList.vue:205 src/views/namespace/columns.ts:91 #: src/views/node/nodeColumns.tsx:89 #: src/views/site/site_edit/components/RightPanel/Basic.vue:39 #: src/views/site/site_list/columns.tsx:113 src/views/stream/columns.tsx:80 @@ -7277,6 +7439,10 @@ msgstr "Tiempo encendido:" msgid "URL" msgstr "URL" +#: src/views/dns/components/DNSRecordForm.vue:64 +msgid "Use @ for root" +msgstr "Usa @ para la raíz" + #: src/components/TwoFA/Authorization.vue:121 msgid "Use OTP" msgstr "Usar OTP" @@ -7342,6 +7508,8 @@ msgid "Validate SSL Certificate" msgstr "Validar certificado SSL" #: src/views/dashboard/components/PerformanceTablesCard.vue:22 +#: src/views/dns/components/DNSRecordForm.vue:66 +#: src/views/dns/components/DNSRecordTable.vue:25 msgid "Value" msgstr "Valor" @@ -7438,14 +7606,6 @@ msgstr "" msgid "We do not accept any feature requests" msgstr "No aceptamos solicitudes de funciones" -#: src/views/certificate/DNSCredential.vue:96 -msgid "" -"We will add one or more TXT records to the DNS records of your domain for " -"ownership verification." -msgstr "" -"Agregaremos uno o más registros TXT a los registros DNS de su dominio para " -"verificar la propiedad." - #: src/views/site/site_edit/components/Cert/ObtainCert.vue:142 msgid "" "We will remove the HTTPChallenge configuration from this file and reload " @@ -7482,6 +7642,11 @@ msgstr "Semanal" msgid "Weekly on %{day} at %{time}" msgstr "Semanalmente el %{day} a las %{time}" +#: src/views/dns/components/DNSRecordForm.vue:84 +#: src/views/dns/components/DNSRecordTable.vue:37 +msgid "Weight" +msgstr "Peso" + #: src/views/certificate/ACMEUser.vue:119 msgid "" "When Enabled, Nginx UI will automatically re-register users upon startup. " @@ -7533,7 +7698,7 @@ msgstr "Procesos de trabajo" msgid "Workers" msgstr "Trabajadores" -#: src/layouts/HeaderLayout.vue:61 src/routes/index.ts:61 +#: src/layouts/HeaderLayout.vue:61 src/routes/index.ts:63 #: src/views/workspace/WorkSpace.vue:51 msgid "Workspace" msgstr "Espacio de trabajo" @@ -7640,6 +7805,16 @@ msgstr "Sus llaves de acceso" msgid "Zero-allocation pipeline" msgstr "Canalización sin asignación" +#~ msgid "Once the verification is complete, the records will be removed." +#~ msgstr "Una vez que se complete la verificación, los registros se eliminarán." + +#~ msgid "" +#~ "We will add one or more TXT records to the DNS records of your domain for " +#~ "ownership verification." +#~ msgstr "" +#~ "Agregaremos uno o más registros TXT a los registros DNS de su dominio para " +#~ "verificar la propiedad." + #~ msgid "Settings" #~ msgstr "Configuración" @@ -7661,9 +7836,6 @@ msgstr "Canalización sin asignación" #~ msgid "Tested in isolated sandbox mode" #~ msgstr "Probado en modo sandbox aislado" -#~ msgid "All" -#~ msgstr "Todos" - #~ msgid "Based on M2 Pro (12 cores) testing" #~ msgstr "Basado en pruebas con M2 Pro (12 núcleos)" @@ -7869,9 +8041,6 @@ msgstr "Canalización sin asignación" #~ msgid "Are you sure you want to apply to all selected?" #~ msgstr "¿Estás seguro de que deseas aplicar a todos los seleccionados?" -#~ msgid "Are you sure you want to delete this item?" -#~ msgstr "¿Está seguro de que quiere borrar este elemento?" - #~ msgid "Are you sure you want to recover this item?" #~ msgstr "¿Está seguro de que quiere recuperar este elemento?" @@ -8138,9 +8307,6 @@ msgstr "Canalización sin asignación" #~ msgid "Dark" #~ msgstr "Oscuro" -#~ msgid "Light" -#~ msgstr "Claro" - #~ msgid "Theme" #~ msgstr "Tema" diff --git a/app/src/language/fr_FR/app.po b/app/src/language/fr_FR/app.po index d36daf66..14674956 100644 --- a/app/src/language/fr_FR/app.po +++ b/app/src/language/fr_FR/app.po @@ -194,8 +194,10 @@ msgstr "Action" #: src/views/backup/AutoBackup/AutoBackup.vue:273 #: src/views/certificate/ACMEUser.vue:131 #: src/views/certificate/CertificateList/certColumns.tsx:92 -#: src/views/certificate/DNSCredential.vue:71 -#: src/views/config/configColumns.tsx:51 src/views/namespace/columns.ts:97 +#: src/views/config/configColumns.tsx:51 +#: src/views/dns/components/DNSRecordTable.vue:41 +#: src/views/dns/DDNSManager.vue:91 src/views/dns/DNSCredential.vue:71 +#: src/views/dns/DNSDomainList.vue:211 src/views/namespace/columns.ts:97 #: src/views/nginx_log/NginxLogList.vue:338 src/views/node/nodeColumns.tsx:96 #: src/views/notification/notificationColumns.tsx:72 #: src/views/preference/components/ExternalNotify/columns.tsx:85 @@ -249,6 +251,10 @@ msgstr "Ajouter un en-tête" msgid "Add Location" msgstr "Ajouter une localisation" +#: src/views/dns/DNSRecordManager.vue:171 +msgid "Add Record" +msgstr "Ajouter un enregistrement" + #: src/components/NgxConfigEditor/NgxServer.vue:92 msgid "Add Server" msgstr "Ajouter un serveur" @@ -269,7 +275,7 @@ msgstr "Ajouter un upstream" msgid "Added successfully" msgstr "Ajouté avec succès" -#: src/views/certificate/components/DNSChallenge.vue:97 +#: src/views/dns/components/DNSChallenge.vue:98 msgid "Additional" msgstr "Supplémentaire" @@ -310,6 +316,10 @@ msgstr "" "Ensuite, rafraîchissez cette page et cliquez à nouveau sur ajouter une clé " "d'accès." +#: src/views/dns/components/DNSRecordFilter.vue:55 +msgid "All" +msgstr "Tous" + #: src/views/system/Licenses.vue:152 msgid "All Components" msgstr "Tous les composants" @@ -354,7 +364,7 @@ msgstr "" msgid "API Base Url" msgstr "URL de base de l'API" -#: src/views/certificate/components/DNSChallenge.vue:70 +#: src/views/dns/components/DNSChallenge.vue:71 msgid "API Document" msgstr "Documentation API" @@ -390,6 +400,10 @@ msgstr "Êtes-vous sûr de vouloir supprimer immédiatement cette IP bannie ?" msgid "Are you sure to delete this passkey immediately?" msgstr "Êtes-vous sûr de vouloir supprimer immédiatement cette clé d'accès ?" +#: src/views/dns/components/DNSRecordTable.vue:90 +msgid "Are you sure to delete this record?" +msgstr "Êtes-vous sûr de vouloir supprimer cet enregistrement ?" + #: src/views/preference/components/AuthSettings/RecoveryCodes.vue:155 msgid "Are you sure to generate new recovery codes?" msgstr "Êtes-vous sûr de vouloir générer de nouveaux codes de récupération ?" @@ -563,7 +577,7 @@ msgstr "Moy./PV" #: src/views/certificate/components/CertificateActions.vue:22 #: src/views/config/components/ConfigLeftPanel.vue:274 #: src/views/config/ConfigList.vue:120 src/views/config/ConfigList.vue:217 -#: src/views/nginx_log/NginxLog.vue:129 +#: src/views/dns/DNSRecordManager.vue:223 src/views/nginx_log/NginxLog.vue:129 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:183 #: src/views/stream/components/StreamEditor.vue:147 msgid "Back" @@ -721,6 +735,10 @@ msgstr "Navigateur" msgid "Browser Statistics" msgstr "Statistiques du navigateur" +#: src/views/dns/DNSDomainList.vue:257 +msgid "Business contact:" +msgstr "Contact commercial :" + #: src/views/nginx_log/components/IndexingSettingsModal.vue:316 msgid "" "By enabling advanced indexing, you acknowledge that your system meets the " @@ -793,6 +811,7 @@ msgstr "" #: src/components/NgxConfigEditor/NgxUpstream.vue:32 src/language/curd.ts:37 #: src/views/config/components/Delete.vue:98 #: src/views/dashboard/components/SiteHealthCheckModal.vue:710 +#: src/views/dns/DDNSManager.vue:244 src/views/dns/DNSRecordManager.vue:212 #: src/views/nginx_log/components/IndexingSettingsModal.vue:102 #: src/views/nginx_log/indexing/IndexManagement.vue:33 #: src/views/nginx_log/indexing/IndexManagement.vue:59 @@ -938,7 +957,7 @@ msgstr "Type de certificat" msgid "Certificates" msgstr "Certificats" -#: src/routes/modules/certificates.ts:36 +#: src/routes/modules/certificates.ts:28 msgid "Certificates List" msgstr "Liste des certificats" @@ -1326,7 +1345,7 @@ msgstr "Le chemin de configuration est vide" msgid "Config Template" msgstr "Modèle de configuration" -#: src/views/certificate/DNSCredential.vue:52 +#: src/views/dns/DNSCredential.vue:52 msgid "Configuration" msgstr "Configuration" @@ -1356,6 +1375,14 @@ msgstr "Nom de la configuration" msgid "Configurations" msgstr "Configurations" +#: src/views/dns/DDNSManager.vue:201 +msgid "Configure" +msgstr "Configurer" + +#: src/views/dns/DDNSManager.vue:211 +msgid "Configure DDNS" +msgstr "Configurer DDNS" + #: src/views/site/site_add/SiteAdd.vue:81 msgid "Configure SSL" msgstr "Configurer SSL" @@ -1479,6 +1506,10 @@ msgstr "Créer un fichier" msgid "Create Folder" msgstr "Créer un dossier" +#: src/views/dns/DNSRecordManager.vue:200 +msgid "Create Record" +msgstr "Créer un enregistrement" + #: src/views/backup/components/BackupCreator.vue:75 msgid "" "Create system backups including Nginx configuration and Nginx UI settings. " @@ -1505,11 +1536,12 @@ msgstr "Créé avec succès" msgid "Creating client facilitates communication with the CA server" msgstr "La création du client facilite la communication avec le serveur CA" -#: src/components/AutoCertForm/DNSChallenge.vue:105 +#: src/components/AutoCertForm/DNSChallenge.vue:131 +#: src/views/dns/DDNSManager.vue:65 src/views/dns/DNSDomainList.vue:109 msgid "Credential" msgstr "Identifiant" -#: src/views/certificate/components/DNSChallenge.vue:86 +#: src/routes/modules/dns.ts:20 src/views/dns/components/DNSChallenge.vue:87 msgid "Credentials" msgstr "Identifiants" @@ -1626,6 +1658,18 @@ msgstr "Jours" msgid "Db file not found" msgstr "Fichier de base de données introuvable" +#: src/routes/modules/dns.ts:36 +msgid "DDNS" +msgstr "DDNS" + +#: src/views/dns/DDNSManager.vue:153 +msgid "DDNS Overview" +msgstr "Aperçu du DDNS" + +#: src/views/dns/DDNSManager.vue:135 +msgid "DDNS saved" +msgstr "DDNS enregistré" + #: src/constants/errors/geolite.ts:12 msgid "Decompression succeeded but failed to delete compressed file: {0}" msgstr "" @@ -1654,6 +1698,7 @@ msgstr "" #: src/views/config/components/Delete.vue:65 #: src/views/config/components/Delete.vue:97 #: src/views/config/ConfigList.vue:199 +#: src/views/dns/components/DNSRecordTable.vue:94 #: src/views/site/site_list/SiteList.vue:100 #: src/views/stream/StreamList.vue:110 msgid "Delete" @@ -1895,7 +1940,8 @@ msgid "Disable stream %{name} from %{node} successfully" msgstr "Désactivation du flux %{name} depuis %{node} réussie" #: src/views/backup/AutoBackup/AutoBackup.vue:175 -#: src/views/node/nodeColumns.tsx:60 src/views/node/nodeColumns.tsx:78 +#: src/views/dns/DDNSManager.vue:175 src/views/node/nodeColumns.tsx:60 +#: src/views/node/nodeColumns.tsx:78 #: src/views/preference/tabs/HTTPSettings.vue:24 #: src/views/preference/tabs/NodeSettings.vue:25 #: src/views/preference/tabs/NodeSettings.vue:30 @@ -1920,16 +1966,35 @@ msgstr "Déconnecté" msgid "Disk IO" msgstr "E/S disque" -#: src/routes/modules/certificates.ts:28 -#: src/views/certificate/DNSCredential.vue:79 +#: src/routes/modules/dns.ts:11 +msgid "DNS" +msgstr "DNS" + +#: src/views/dns/DNSCredential.vue:79 msgid "DNS Credentials" msgstr "Identifiants DNS" -#: src/components/AutoCertForm/DNSChallenge.vue:95 -#: src/views/certificate/components/DNSChallenge.vue:59 +#: src/routes/modules/dns.ts:28 src/views/dns/DNSDomainList.vue:228 +msgid "DNS Domains" +msgstr "Domaines DNS" + +#: src/views/dns/components/DNSRecordTable.vue:81 +msgid "DNS Only" +msgstr "DNS uniquement" + +#: src/components/AutoCertForm/DNSChallenge.vue:121 +#: src/views/dns/components/DNSChallenge.vue:60 msgid "DNS Provider" msgstr "Fournisseur DNS" +#: src/views/dns/DNSDomainList.vue:244 +msgid "DNS Provider Support" +msgstr "Support du fournisseur DNS" + +#: src/routes/modules/dns.ts:44 src/views/dns/DNSRecordManager.vue:58 +msgid "DNS Records" +msgstr "Enregistrements DNS" + #: src/views/dashboard/components/SiteHealthCheckModal.vue:678 msgid "DNS Resolver" msgstr "Résolveur DNS" @@ -1990,6 +2055,7 @@ msgid "Document Count" msgstr "Nombre de documents" #: src/views/certificate/components/DNSIssueCertificate.vue:119 +#: src/views/dns/DDNSManager.vue:60 src/views/dns/DNSDomainList.vue:98 msgid "Domain" msgstr "Domaine" @@ -2078,7 +2144,7 @@ msgstr "Clé HMAC EAB" msgid "EAB Key ID" msgstr "ID de clé EAB" -#: src/language/curd.ts:8 +#: src/language/curd.ts:8 src/views/dns/components/DNSRecordTable.vue:87 msgid "Edit" msgstr "Modifier" @@ -2092,6 +2158,10 @@ msgstr "Modifier %{n}" msgid "Edit Configuration" msgstr "Modifier la configuration" +#: src/views/dns/DNSRecordManager.vue:200 +msgid "Edit Record" +msgstr "Modifier l'enregistrement" + #: src/routes/modules/sites.ts:34 msgid "Edit Site" msgstr "Modifier le site" @@ -2142,6 +2212,10 @@ msgstr "Activer la complétion de code" msgid "Enable compression for content transfer" msgstr "Activer la compression pour le transfert de contenu" +#: src/views/dns/DDNSManager.vue:218 +msgid "Enable DDNS" +msgstr "Activer DDNS" + #: src/views/dashboard/components/SiteHealthCheckModal.vue:473 msgid "Enable Health Check" msgstr "Activer la vérification de santé" @@ -2229,7 +2303,8 @@ msgid "Enable TOTP" msgstr "Activer TOTP" #: src/views/backup/AutoBackup/AutoBackup.vue:174 -#: src/views/node/nodeColumns.tsx:69 src/views/node/nodeColumns.tsx:75 +#: src/views/dns/DDNSManager.vue:175 src/views/node/nodeColumns.tsx:69 +#: src/views/node/nodeColumns.tsx:75 #: src/views/preference/components/ExternalNotify/columns.tsx:47 #: src/views/preference/tabs/HTTPSettings.vue:24 #: src/views/preference/tabs/LogrotateSettings.vue:20 @@ -3203,14 +3278,19 @@ msgstr "Une valeur plus élevée signifie une meilleure réutilisation de la con msgid "History" msgstr "Historique" -#: src/routes/index.ts:52 +#: src/routes/index.ts:54 msgid "Home" msgstr "Menu principal" +#: src/views/dns/components/DNSRecordFilter.vue:42 #: src/views/preference/tabs/ServerSettings.vue:19 msgid "Host" msgstr "Hôte" +#: src/views/dns/components/DNSRecordFilter.vue:45 +msgid "Host, e.g. @ or www" +msgstr "Hôte, par ex. @ ou www" + #: src/views/backup/AutoBackup/components/CronEditor.vue:159 #: src/views/nginx_log/dashboard/components/HourlyChart.vue:87 msgid "Hour" @@ -3288,7 +3368,7 @@ msgstr "" msgid "Import" msgstr "Importer" -#: src/routes/modules/certificates.ts:54 +#: src/routes/modules/certificates.ts:46 #: src/views/certificate/CertificateEditor.vue:84 msgid "Import Certificate" msgstr "Importer un certificat" @@ -3411,10 +3491,15 @@ msgstr "" "L'installation n'est pas autorisée après 10 minutes de démarrage du " "système, veuillez redémarrer l'interface Nginx." +#: src/views/dns/DDNSManager.vue:79 #: src/views/preference/tabs/LogrotateSettings.vue:26 msgid "Interval" msgstr "Intervalle" +#: src/views/dns/DDNSManager.vue:232 +msgid "Interval (seconds)" +msgstr "Intervalle (secondes)" + #: src/views/certificate/ACMEUser.vue:166 msgid "Invalid" msgstr "Invalide" @@ -3643,6 +3728,10 @@ msgstr "Dernière indexation" msgid "Last month" msgstr "Mois dernier" +#: src/views/dns/DDNSManager.vue:87 +msgid "Last run" +msgstr "Dernière exécution" + #: src/views/dashboard/NginxDashBoard.vue:138 msgid "Last update" msgstr "Dernière mise à jour" @@ -3913,6 +4002,10 @@ msgstr "" msgid "Manage Configs" msgstr "Gérer les configurations" +#: src/views/dns/DNSDomainList.vue:236 +msgid "Manage Records" +msgstr "Gérer les enregistrements" + #: src/routes/modules/sites.ts:10 src/views/site/site_list/SiteList.vue:45 msgid "Manage Sites" msgstr "Gérer les sites" @@ -4083,7 +4176,7 @@ msgstr "Modifié le" msgid "Modify" msgstr "Modifier" -#: src/routes/modules/certificates.ts:44 +#: src/routes/modules/certificates.ts:36 #: src/views/certificate/CertificateEditor.vue:84 msgid "Modify Certificate" msgstr "Modifier le certificat" @@ -4144,11 +4237,13 @@ msgstr "N/D" #: src/views/certificate/components/CertificateBasicInfo.vue:44 #: src/views/certificate/components/CertificateBasicInfo.vue:58 #: src/views/certificate/components/CertificateBasicInfo.vue:70 -#: src/views/certificate/DNSCredential.vue:17 #: src/views/config/components/ConfigRightPanel/Basic.vue:34 #: src/views/config/components/Delete.vue:123 #: src/views/config/components/Mkdir.vue:64 -#: src/views/config/configColumns.tsx:17 src/views/namespace/columns.ts:9 +#: src/views/config/configColumns.tsx:17 +#: src/views/dns/components/DNSRecordForm.vue:63 +#: src/views/dns/components/DNSRecordTable.vue:17 +#: src/views/dns/DNSCredential.vue:17 src/views/namespace/columns.ts:9 #: src/views/nginx_log/NginxLogList.vue:155 src/views/node/nodeColumns.tsx:8 #: src/views/preference/components/AuthSettings/AddPasskey.vue:81 #: src/views/site/site_edit/components/RightPanel/Basic.vue:36 @@ -4176,6 +4271,14 @@ msgstr "Espace de noms" msgid "Namespaces" msgstr "Espaces de noms" +#: src/views/dns/DNSDomainList.vue:251 +msgid "" +"Need more DNS providers? Support us through donations or contact us for " +"commercial collaboration" +msgstr "" +"Vous avez besoin de plus de fournisseurs DNS ? Soutenez-nous par des dons " +"ou contactez-nous pour une collaboration commerciale" + #: src/views/dashboard/NginxDashBoard.vue:195 msgid "Need to enable the stub_status module" msgstr "Il faut activer le module stub_status" @@ -4570,6 +4673,10 @@ msgstr "Non indexé" msgid "Not Loaded" msgstr "Non chargé" +#: src/views/dns/DDNSManager.vue:102 +msgid "Not run yet" +msgstr "Pas encore exécuté" + #: src/components/AutoCertForm/AutoCertForm.vue:230 msgid "Not supported for IP certificates" msgstr "Non pris en charge pour les certificats IP" @@ -4579,7 +4686,7 @@ msgid "Not Valid Before: %{date}" msgstr "Non valide avant : %{date}" #: src/components/AutoCertForm/AutoCertForm.vue:150 -#: src/views/certificate/DNSCredential.vue:89 +#: src/views/dns/DNSCredential.vue:89 msgid "Note" msgstr "Note" @@ -4711,10 +4818,6 @@ msgstr "OK" msgid "On" msgstr "Activé" -#: src/views/certificate/DNSCredential.vue:99 -msgid "Once the verification is complete, the records will be removed." -msgstr "Une fois la vérification terminée, les enregistrements seront supprimés." - #: src/components/NamespaceTabs/NamespaceTabs.vue:164 #: src/components/NodeCard/NodeCard.vue:51 #: src/components/NodeSelector/NodeSelector.vue:65 @@ -5009,7 +5112,7 @@ msgstr "Veuillez remplir tous les champs correctement" msgid "Please fill in required S3 configuration fields" msgstr "Veuillez remplir les champs de configuration S3 requis" -#: src/views/certificate/DNSCredential.vue:93 +#: src/views/dns/DNSCredential.vue:93 msgid "" "Please fill in the API authentication credentials provided by your DNS " "provider." @@ -5077,7 +5180,7 @@ msgstr "Veuillez saisir votre nom d'utilisateur !" msgid "Please log in." msgstr "Veuillez vous connecter." -#: src/views/certificate/DNSCredential.vue:102 +#: src/views/dns/DNSCredential.vue:96 msgid "Please note that the unit of time configurations below are all in seconds." msgstr "" "Veuillez noter que les unités de temps des configurations ci-dessous sont " @@ -5161,6 +5264,11 @@ msgstr "Préférence" msgid "Preparing lego configurations" msgstr "Préparation des configurations Lego" +#: src/views/dns/components/DNSRecordForm.vue:81 +#: src/views/dns/components/DNSRecordTable.vue:33 +msgid "Priority" +msgstr "Priorité" + #: src/components/AutoCertForm/AutoCertForm.vue:206 msgid "Private CA:" msgstr "CA privée :" @@ -5224,7 +5332,8 @@ msgstr "" "directe. Si vous utilisez un proxy inverse, veuillez configurer le " "protocole séparément dans le proxy inverse." -#: src/views/certificate/DNSCredential.vue:26 +#: src/views/dns/DDNSManager.vue:70 src/views/dns/DNSCredential.vue:26 +#: src/views/dns/DNSDomainList.vue:177 src/views/dns/DNSDomainList.vue:198 msgid "Provider" msgstr "Fournisseur" @@ -5236,6 +5345,12 @@ msgstr "Fournisseur introuvable : {0}" msgid "Province / Region" msgstr "Province / Région" +#: src/views/dns/components/DNSRecordForm.vue:87 +#: src/views/dns/components/DNSRecordTable.vue:51 +#: src/views/dns/components/DNSRecordTable.vue:81 +msgid "Proxied" +msgstr "Proxifié" + #: src/views/certificate/ACMEUser.vue:63 msgid "Proxy" msgstr "Proxy" @@ -5330,6 +5445,22 @@ msgstr "Vérifier à nouveau" msgid "Recommended:" msgstr "Recommandé :" +#: src/views/dns/DNSRecordManager.vue:113 +msgid "Record created" +msgstr "Enregistrement créé" + +#: src/views/dns/DNSRecordManager.vue:120 +msgid "Record deleted" +msgstr "Enregistrement supprimé" + +#: src/views/dns/DNSRecordManager.vue:109 +msgid "Record updated" +msgstr "Enregistrement mis à jour" + +#: src/views/dns/DDNSManager.vue:221 +msgid "Records" +msgstr "Enregistrements" + #: src/components/TwoFA/Authorization.vue:79 msgid "Recovery" msgstr "Récupération" @@ -5360,7 +5491,8 @@ msgstr "Messages de redirection (3xx)" msgid "Referer" msgstr "Référent" -#: src/language/curd.ts:70 +#: src/language/curd.ts:70 src/views/dns/DDNSManager.vue:161 +#: src/views/dns/DNSRecordManager.vue:165 msgid "Refresh" msgstr "Actualiser" @@ -5604,7 +5736,7 @@ msgstr "Demandé avec des paramètres incorrects" msgid "Requests Per Connection" msgstr "Requêtes par connexion" -#: src/language/curd.ts:13 +#: src/language/curd.ts:13 src/views/dns/components/DNSRecordFilter.vue:65 #: src/views/nginx_log/structured/components/SearchFilters.vue:214 #: src/views/nginx_log/structured/StructuredLogViewer.vue:745 msgid "Reset" @@ -5845,6 +5977,7 @@ msgstr "Samedi" #: src/views/config/components/ConfigLeftPanel.vue:283 #: src/views/config/components/ConfigName.vue:58 #: src/views/dashboard/components/SiteHealthCheckModal.vue:713 +#: src/views/dns/DDNSManager.vue:247 src/views/dns/DNSRecordManager.vue:215 #: src/views/preference/components/AuthSettings/Passkey.vue:131 #: src/views/preference/Preference.vue:124 #: src/views/site/site_edit/components/ConfigName/ConfigName.vue:52 @@ -5952,12 +6085,13 @@ msgstr "Planification" msgid "Schedule Type" msgstr "Type de planification" -#: src/views/certificate/components/DNSChallenge.vue:77 +#: src/views/dns/components/DNSChallenge.vue:78 msgid "SDK" msgstr "SDK" #: src/language/constants.ts:62 src/language/curd.ts:12 #: src/views/config/configColumns.tsx:5 +#: src/views/dns/components/DNSRecordFilter.vue:62 #: src/views/nginx_log/structured/components/SearchFilters.vue:217 #: src/views/site/site_list/columns.tsx:17 src/views/stream/columns.tsx:13 msgid "Search" @@ -6016,10 +6150,18 @@ msgstr "" msgid "Select all" msgstr "Tout sélectionner" +#: src/language/constants.ts:68 +msgid "Select Credential" +msgstr "Sélectionner les identifiants" + #: src/views/certificate/ACMEUser.vue:45 msgid "Select or enter a CA directory URL" msgstr "Sélectionnez ou entrez une URL de répertoire CA" +#: src/language/constants.ts:67 +msgid "Select Provider" +msgstr "Sélectionner un fournisseur" + #: src/language/curd.ts:59 msgid "Selected {count} files" msgstr "{count} fichiers sélectionnés" @@ -6351,6 +6493,7 @@ msgstr "Statique" #: src/views/certificate/ACMEUser.vue:75 #: src/views/certificate/CertificateList/certColumns.tsx:63 #: src/views/dashboard/components/ModulesTable.vue:75 +#: src/views/dns/DDNSManager.vue:75 #: src/views/nginx_log/structured/components/SearchFilters.vue:106 #: src/views/nginx_log/structured/StructuredLogViewer.vue:241 #: src/views/nginx_log/structured/StructuredLogViewer.vue:521 @@ -6584,6 +6727,10 @@ msgstr "Restauration du système" msgid "System restored successfully." msgstr "Système restauré avec succès." +#: src/views/dns/DDNSManager.vue:83 +msgid "Targets" +msgstr "Cibles" + #: src/constants/errors/self_check.ts:3 msgid "Task is not fixable" msgstr "La tâche n'est pas réparable" @@ -7141,6 +7288,14 @@ msgstr "" msgid "Try adjusting your search criteria or time range." msgstr "Essayez d'ajuster vos critères de recherche ou la plage horaire." +#: src/views/dns/components/DNSRecordTable.vue:29 +msgid "TTL" +msgstr "TTL" + +#: src/views/dns/components/DNSRecordForm.vue:78 +msgid "TTL (seconds)" +msgstr "TTL (secondes)" + #: src/views/backup/AutoBackup/components/CronEditor.vue:28 msgid "Tuesday" msgstr "Mardi" @@ -7153,6 +7308,9 @@ msgstr "Authentification à deux facteurs requise" #: src/views/certificate/CertificateList/certColumns.tsx:24 #: src/views/config/components/Delete.vue:122 #: src/views/dashboard/components/ModulesTable.vue:62 +#: src/views/dns/components/DNSRecordFilter.vue:49 +#: src/views/dns/components/DNSRecordForm.vue:57 +#: src/views/dns/components/DNSRecordTable.vue:21 #: src/views/nginx_log/NginxLogList.vue:146 #: src/views/notification/notificationColumns.tsx:8 #: src/views/preference/components/ExternalNotify/columns.tsx:19 @@ -7163,6 +7321,10 @@ msgstr "Type" msgid "Type %{delete} to confirm" msgstr "Tapez %{delete} pour confirmer" +#: src/views/dns/DDNSManager.vue:228 +msgid "Type or select A/AAAA records" +msgstr "Saisissez ou sélectionnez des enregistrements A/AAAA" + #: src/views/nginx_log/structured/components/SearchFilters.vue:142 msgid "Type or select browser" msgstr "Saisissez ou sélectionnez un navigateur" @@ -7218,9 +7380,9 @@ msgstr "Mise à jour réussie" #: src/views/backup/AutoBackup/AutoBackup.vue:236 #: src/views/certificate/ACMEUser.vue:124 -#: src/views/certificate/DNSCredential.vue:65 #: src/views/config/components/ConfigRightPanel/Basic.vue:54 -#: src/views/config/configColumns.tsx:44 src/views/namespace/columns.ts:91 +#: src/views/config/configColumns.tsx:44 src/views/dns/DNSCredential.vue:65 +#: src/views/dns/DNSDomainList.vue:205 src/views/namespace/columns.ts:91 #: src/views/node/nodeColumns.tsx:89 #: src/views/site/site_edit/components/RightPanel/Basic.vue:39 #: src/views/site/site_list/columns.tsx:113 src/views/stream/columns.tsx:80 @@ -7293,6 +7455,10 @@ msgstr "Disponibilité :" msgid "URL" msgstr "URL" +#: src/views/dns/components/DNSRecordForm.vue:64 +msgid "Use @ for root" +msgstr "Utilisez @ pour la racine" + #: src/components/TwoFA/Authorization.vue:121 msgid "Use OTP" msgstr "Utiliser OTP" @@ -7358,6 +7524,8 @@ msgid "Validate SSL Certificate" msgstr "Valider le certificat SSL" #: src/views/dashboard/components/PerformanceTablesCard.vue:22 +#: src/views/dns/components/DNSRecordForm.vue:66 +#: src/views/dns/components/DNSRecordTable.vue:25 msgid "Value" msgstr "Valeur" @@ -7454,14 +7622,6 @@ msgstr "" msgid "We do not accept any feature requests" msgstr "Nous n'acceptons aucune demande de fonctionnalité" -#: src/views/certificate/DNSCredential.vue:96 -msgid "" -"We will add one or more TXT records to the DNS records of your domain for " -"ownership verification." -msgstr "" -"Nous ajouterons un ou plusieurs enregistrements TXT aux enregistrements DNS " -"de votre domaine pour vérifier la propriété." - #: src/views/site/site_edit/components/Cert/ObtainCert.vue:142 msgid "" "We will remove the HTTPChallenge configuration from this file and reload " @@ -7498,6 +7658,11 @@ msgstr "Hebdomadaire" msgid "Weekly on %{day} at %{time}" msgstr "Hebdomadairement le %{day} à %{time}" +#: src/views/dns/components/DNSRecordForm.vue:84 +#: src/views/dns/components/DNSRecordTable.vue:37 +msgid "Weight" +msgstr "Poids" + #: src/views/certificate/ACMEUser.vue:119 msgid "" "When Enabled, Nginx UI will automatically re-register users upon startup. " @@ -7552,7 +7717,7 @@ msgstr "Processus de travail" msgid "Workers" msgstr "Workers" -#: src/layouts/HeaderLayout.vue:61 src/routes/index.ts:61 +#: src/layouts/HeaderLayout.vue:61 src/routes/index.ts:63 #: src/views/workspace/WorkSpace.vue:51 msgid "Workspace" msgstr "Espace de travail" @@ -7659,6 +7824,16 @@ msgstr "Vos clés d'accès" msgid "Zero-allocation pipeline" msgstr "Pipeline sans allocation" +#~ msgid "Once the verification is complete, the records will be removed." +#~ msgstr "Une fois la vérification terminée, les enregistrements seront supprimés." + +#~ msgid "" +#~ "We will add one or more TXT records to the DNS records of your domain for " +#~ "ownership verification." +#~ msgstr "" +#~ "Nous ajouterons un ou plusieurs enregistrements TXT aux enregistrements DNS " +#~ "de votre domaine pour vérifier la propriété." + #~ msgid "Settings" #~ msgstr "Paramètres" @@ -7680,9 +7855,6 @@ msgstr "Pipeline sans allocation" #~ msgid "Tested in isolated sandbox mode" #~ msgstr "Testé en mode sandbox isolé" -#~ msgid "All" -#~ msgstr "Tous" - #~ msgid "Based on M2 Pro (12 cores) testing" #~ msgstr "Basé sur des tests avec M2 Pro (12 cœurs)" @@ -7890,9 +8062,6 @@ msgstr "Pipeline sans allocation" #~ msgid "Are you sure you want to apply to all selected?" #~ msgstr "Êtes-vous sûr de vouloir appliquer à tous les éléments sélectionnés ?" -#~ msgid "Are you sure you want to delete this item?" -#~ msgstr "Êtes-vous sûr de vouloir supprimer cet élément ?" - #~ msgid "Are you sure you want to recover this item?" #~ msgstr "Êtes-vous sûr de vouloir récupérer cet élément ?" @@ -8126,9 +8295,6 @@ msgstr "Pipeline sans allocation" #~ msgid "Dark" #~ msgstr "Sombre" -#~ msgid "Light" -#~ msgstr "Clair" - #~ msgid "Theme" #~ msgstr "Thème" diff --git a/app/src/language/ja_JP/app.po b/app/src/language/ja_JP/app.po index ba910441..f97e9e42 100644 --- a/app/src/language/ja_JP/app.po +++ b/app/src/language/ja_JP/app.po @@ -185,8 +185,10 @@ msgstr "操作" #: src/views/backup/AutoBackup/AutoBackup.vue:273 #: src/views/certificate/ACMEUser.vue:131 #: src/views/certificate/CertificateList/certColumns.tsx:92 -#: src/views/certificate/DNSCredential.vue:71 -#: src/views/config/configColumns.tsx:51 src/views/namespace/columns.ts:97 +#: src/views/config/configColumns.tsx:51 +#: src/views/dns/components/DNSRecordTable.vue:41 +#: src/views/dns/DDNSManager.vue:91 src/views/dns/DNSCredential.vue:71 +#: src/views/dns/DNSDomainList.vue:211 src/views/namespace/columns.ts:97 #: src/views/nginx_log/NginxLogList.vue:338 src/views/node/nodeColumns.tsx:96 #: src/views/notification/notificationColumns.tsx:72 #: src/views/preference/components/ExternalNotify/columns.tsx:85 @@ -240,6 +242,10 @@ msgstr "ヘッダーを追加" msgid "Add Location" msgstr "Locationを追加" +#: src/views/dns/DNSRecordManager.vue:171 +msgid "Add Record" +msgstr "レコードを追加" + #: src/components/NgxConfigEditor/NgxServer.vue:92 msgid "Add Server" msgstr "サーバーを追加" @@ -260,7 +266,7 @@ msgstr "アップストリームを追加" msgid "Added successfully" msgstr "正常に追加されました" -#: src/views/certificate/components/DNSChallenge.vue:97 +#: src/views/dns/components/DNSChallenge.vue:98 msgid "Additional" msgstr "追加設定" @@ -297,6 +303,10 @@ msgstr "詳細設定" msgid "Afterwards, refresh this page and click add passkey again." msgstr "その後、このページを更新し、再度パスキーを追加をクリックしてください。" +#: src/views/dns/components/DNSRecordFilter.vue:55 +msgid "All" +msgstr "すべて" + #: src/views/system/Licenses.vue:152 msgid "All Components" msgstr "すべてのコンポーネント" @@ -336,7 +346,7 @@ msgstr "到達可能なIPアドレスは、プライベート認証局で使用 msgid "API Base Url" msgstr "APIベースURL" -#: src/views/certificate/components/DNSChallenge.vue:70 +#: src/views/dns/components/DNSChallenge.vue:71 msgid "API Document" msgstr "APIドキュメント" @@ -372,6 +382,10 @@ msgstr "このIPアドレス制限を削除してもよろしいですか?" msgid "Are you sure to delete this passkey immediately?" msgstr "このパスキーをすぐに削除してもよろしいですか?" +#: src/views/dns/components/DNSRecordTable.vue:90 +msgid "Are you sure to delete this record?" +msgstr "このレコードを削除してもよろしいですか?" + #: src/views/preference/components/AuthSettings/RecoveryCodes.vue:155 msgid "Are you sure to generate new recovery codes?" msgstr "新しいリカバリーコードを生成してもよろしいですか?" @@ -541,7 +555,7 @@ msgstr "平均/PV" #: src/views/certificate/components/CertificateActions.vue:22 #: src/views/config/components/ConfigLeftPanel.vue:274 #: src/views/config/ConfigList.vue:120 src/views/config/ConfigList.vue:217 -#: src/views/nginx_log/NginxLog.vue:129 +#: src/views/dns/DNSRecordManager.vue:223 src/views/nginx_log/NginxLog.vue:129 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:183 #: src/views/stream/components/StreamEditor.vue:147 msgid "Back" @@ -687,6 +701,10 @@ msgstr "ブラウザ" msgid "Browser Statistics" msgstr "ブラウザ統計" +#: src/views/dns/DNSDomainList.vue:257 +msgid "Business contact:" +msgstr "ビジネス連絡先:" + #: src/views/nginx_log/components/IndexingSettingsModal.vue:316 msgid "" "By enabling advanced indexing, you acknowledge that your system meets the " @@ -756,6 +774,7 @@ msgstr "" #: src/components/NgxConfigEditor/NgxUpstream.vue:32 src/language/curd.ts:37 #: src/views/config/components/Delete.vue:98 #: src/views/dashboard/components/SiteHealthCheckModal.vue:710 +#: src/views/dns/DDNSManager.vue:244 src/views/dns/DNSRecordManager.vue:212 #: src/views/nginx_log/components/IndexingSettingsModal.vue:102 #: src/views/nginx_log/indexing/IndexManagement.vue:33 #: src/views/nginx_log/indexing/IndexManagement.vue:59 @@ -901,7 +920,7 @@ msgstr "証明書の種類" msgid "Certificates" msgstr "証明書" -#: src/routes/modules/certificates.ts:36 +#: src/routes/modules/certificates.ts:28 msgid "Certificates List" msgstr "証明書リスト" @@ -1266,7 +1285,7 @@ msgstr "設定パスが空です" msgid "Config Template" msgstr "設定テンプレート" -#: src/views/certificate/DNSCredential.vue:52 +#: src/views/dns/DNSCredential.vue:52 msgid "Configuration" msgstr "設定" @@ -1294,6 +1313,14 @@ msgstr "設定名" msgid "Configurations" msgstr "設定" +#: src/views/dns/DDNSManager.vue:201 +msgid "Configure" +msgstr "設定" + +#: src/views/dns/DDNSManager.vue:211 +msgid "Configure DDNS" +msgstr "DDNSを設定" + #: src/views/site/site_add/SiteAdd.vue:81 msgid "Configure SSL" msgstr "SSLを設定する" @@ -1415,6 +1442,10 @@ msgstr "ファイルを作成" msgid "Create Folder" msgstr "フォルダーを作成" +#: src/views/dns/DNSRecordManager.vue:200 +msgid "Create Record" +msgstr "レコードを作成" + #: src/views/backup/components/BackupCreator.vue:75 msgid "" "Create system backups including Nginx configuration and Nginx UI settings. " @@ -1438,11 +1469,12 @@ msgstr "正常に作成されました" msgid "Creating client facilitates communication with the CA server" msgstr "クライアントを作成することで CA サーバーとの通信が容易になります" -#: src/components/AutoCertForm/DNSChallenge.vue:105 +#: src/components/AutoCertForm/DNSChallenge.vue:131 +#: src/views/dns/DDNSManager.vue:65 src/views/dns/DNSDomainList.vue:109 msgid "Credential" msgstr "認証情報" -#: src/views/certificate/components/DNSChallenge.vue:86 +#: src/routes/modules/dns.ts:20 src/views/dns/components/DNSChallenge.vue:87 msgid "Credentials" msgstr "認証情報" @@ -1557,6 +1589,18 @@ msgstr "日" msgid "Db file not found" msgstr "データベース ファイルが見つかりません" +#: src/routes/modules/dns.ts:36 +msgid "DDNS" +msgstr "DDNS" + +#: src/views/dns/DDNSManager.vue:153 +msgid "DDNS Overview" +msgstr "DDNS 概要" + +#: src/views/dns/DDNSManager.vue:135 +msgid "DDNS saved" +msgstr "DDNSが保存されました" + #: src/constants/errors/geolite.ts:12 msgid "Decompression succeeded but failed to delete compressed file: {0}" msgstr "解凍に成功しましたが、圧縮ファイルの削除に失敗しました: {0}" @@ -1581,6 +1625,7 @@ msgstr "共有メモリゾーンの名前とサイズを定義します(例: p #: src/views/config/components/Delete.vue:65 #: src/views/config/components/Delete.vue:97 #: src/views/config/ConfigList.vue:199 +#: src/views/dns/components/DNSRecordTable.vue:94 #: src/views/site/site_list/SiteList.vue:100 #: src/views/stream/StreamList.vue:110 msgid "Delete" @@ -1822,7 +1867,8 @@ msgid "Disable stream %{name} from %{node} successfully" msgstr "ストリーム %{name} を %{node} から無効化しました" #: src/views/backup/AutoBackup/AutoBackup.vue:175 -#: src/views/node/nodeColumns.tsx:60 src/views/node/nodeColumns.tsx:78 +#: src/views/dns/DDNSManager.vue:175 src/views/node/nodeColumns.tsx:60 +#: src/views/node/nodeColumns.tsx:78 #: src/views/preference/tabs/HTTPSettings.vue:24 #: src/views/preference/tabs/NodeSettings.vue:25 #: src/views/preference/tabs/NodeSettings.vue:30 @@ -1847,16 +1893,35 @@ msgstr "切断されました" msgid "Disk IO" msgstr "ディスク IO" -#: src/routes/modules/certificates.ts:28 -#: src/views/certificate/DNSCredential.vue:79 +#: src/routes/modules/dns.ts:11 +msgid "DNS" +msgstr "DNS" + +#: src/views/dns/DNSCredential.vue:79 msgid "DNS Credentials" msgstr "DNS 認証情報" -#: src/components/AutoCertForm/DNSChallenge.vue:95 -#: src/views/certificate/components/DNSChallenge.vue:59 +#: src/routes/modules/dns.ts:28 src/views/dns/DNSDomainList.vue:228 +msgid "DNS Domains" +msgstr "DNS ドメイン" + +#: src/views/dns/components/DNSRecordTable.vue:81 +msgid "DNS Only" +msgstr "DNSのみ" + +#: src/components/AutoCertForm/DNSChallenge.vue:121 +#: src/views/dns/components/DNSChallenge.vue:60 msgid "DNS Provider" msgstr "DNSプロバイダー" +#: src/views/dns/DNSDomainList.vue:244 +msgid "DNS Provider Support" +msgstr "DNSプロバイダーのサポート" + +#: src/routes/modules/dns.ts:44 src/views/dns/DNSRecordManager.vue:58 +msgid "DNS Records" +msgstr "DNSレコード" + #: src/views/dashboard/components/SiteHealthCheckModal.vue:678 msgid "DNS Resolver" msgstr "DNSリゾルバ" @@ -1917,6 +1982,7 @@ msgid "Document Count" msgstr "ドキュメント数" #: src/views/certificate/components/DNSIssueCertificate.vue:119 +#: src/views/dns/DDNSManager.vue:60 src/views/dns/DNSDomainList.vue:98 msgid "Domain" msgstr "ドメイン" @@ -2002,7 +2068,7 @@ msgstr "EAB HMACキー" msgid "EAB Key ID" msgstr "EABキーID" -#: src/language/curd.ts:8 +#: src/language/curd.ts:8 src/views/dns/components/DNSRecordTable.vue:87 msgid "Edit" msgstr "編集" @@ -2016,6 +2082,10 @@ msgstr "%{n} を編集" msgid "Edit Configuration" msgstr "設定を編集" +#: src/views/dns/DNSRecordManager.vue:200 +msgid "Edit Record" +msgstr "レコードを編集" + #: src/routes/modules/sites.ts:34 msgid "Edit Site" msgstr "サイトを編集" @@ -2066,6 +2136,10 @@ msgstr "コード補完を有効にする" msgid "Enable compression for content transfer" msgstr "コンテンツ転送の圧縮を有効にする" +#: src/views/dns/DDNSManager.vue:218 +msgid "Enable DDNS" +msgstr "DDNS を有効にする" + #: src/views/dashboard/components/SiteHealthCheckModal.vue:473 msgid "Enable Health Check" msgstr "ヘルスチェックを有効にする" @@ -2153,7 +2227,8 @@ msgid "Enable TOTP" msgstr "TOTP を有効にする" #: src/views/backup/AutoBackup/AutoBackup.vue:174 -#: src/views/node/nodeColumns.tsx:69 src/views/node/nodeColumns.tsx:75 +#: src/views/dns/DDNSManager.vue:175 src/views/node/nodeColumns.tsx:69 +#: src/views/node/nodeColumns.tsx:75 #: src/views/preference/components/ExternalNotify/columns.tsx:47 #: src/views/preference/tabs/HTTPSettings.vue:24 #: src/views/preference/tabs/LogrotateSettings.vue:20 @@ -3102,14 +3177,19 @@ msgstr "値が高いほど接続の再利用が効率的であることを意味 msgid "History" msgstr "履歴" -#: src/routes/index.ts:52 +#: src/routes/index.ts:54 msgid "Home" msgstr "ホーム" +#: src/views/dns/components/DNSRecordFilter.vue:42 #: src/views/preference/tabs/ServerSettings.vue:19 msgid "Host" msgstr "ホスト" +#: src/views/dns/components/DNSRecordFilter.vue:45 +msgid "Host, e.g. @ or www" +msgstr "ホスト、例: @ または www" + #: src/views/backup/AutoBackup/components/CronEditor.vue:159 #: src/views/nginx_log/dashboard/components/HourlyChart.vue:87 msgid "Hour" @@ -3175,7 +3255,7 @@ msgstr "ドメインにCNAMEレコードがあり、証明書を取得できな msgid "Import" msgstr "インポート" -#: src/routes/modules/certificates.ts:54 +#: src/routes/modules/certificates.ts:46 #: src/views/certificate/CertificateEditor.vue:84 msgid "Import Certificate" msgstr "証明書をインポート" @@ -3294,10 +3374,15 @@ msgid "" "restart the Nginx UI." msgstr "システム起動から10分後はインストールが許可されません。Nginx UIを再起動してください。" +#: src/views/dns/DDNSManager.vue:79 #: src/views/preference/tabs/LogrotateSettings.vue:26 msgid "Interval" msgstr "間隔" +#: src/views/dns/DDNSManager.vue:232 +msgid "Interval (seconds)" +msgstr "間隔(秒)" + #: src/views/certificate/ACMEUser.vue:166 msgid "Invalid" msgstr "無効" @@ -3524,6 +3609,10 @@ msgstr "最終インデックス日時" msgid "Last month" msgstr "先月" +#: src/views/dns/DDNSManager.vue:87 +msgid "Last run" +msgstr "最終実行" + #: src/views/dashboard/NginxDashBoard.vue:138 msgid "Last update" msgstr "最終更新" @@ -3787,6 +3876,10 @@ msgstr "" msgid "Manage Configs" msgstr "設定管理" +#: src/views/dns/DNSDomainList.vue:236 +msgid "Manage Records" +msgstr "レコードの管理" + #: src/routes/modules/sites.ts:10 src/views/site/site_list/SiteList.vue:45 msgid "Manage Sites" msgstr "サイト管理" @@ -3957,7 +4050,7 @@ msgstr "更新日時" msgid "Modify" msgstr "変更" -#: src/routes/modules/certificates.ts:44 +#: src/routes/modules/certificates.ts:36 #: src/views/certificate/CertificateEditor.vue:84 msgid "Modify Certificate" msgstr "証明書を変更" @@ -4018,11 +4111,13 @@ msgstr "該当なし" #: src/views/certificate/components/CertificateBasicInfo.vue:44 #: src/views/certificate/components/CertificateBasicInfo.vue:58 #: src/views/certificate/components/CertificateBasicInfo.vue:70 -#: src/views/certificate/DNSCredential.vue:17 #: src/views/config/components/ConfigRightPanel/Basic.vue:34 #: src/views/config/components/Delete.vue:123 #: src/views/config/components/Mkdir.vue:64 -#: src/views/config/configColumns.tsx:17 src/views/namespace/columns.ts:9 +#: src/views/config/configColumns.tsx:17 +#: src/views/dns/components/DNSRecordForm.vue:63 +#: src/views/dns/components/DNSRecordTable.vue:17 +#: src/views/dns/DNSCredential.vue:17 src/views/namespace/columns.ts:9 #: src/views/nginx_log/NginxLogList.vue:155 src/views/node/nodeColumns.tsx:8 #: src/views/preference/components/AuthSettings/AddPasskey.vue:81 #: src/views/site/site_edit/components/RightPanel/Basic.vue:36 @@ -4050,6 +4145,12 @@ msgstr "名前空間" msgid "Namespaces" msgstr "名前空間" +#: src/views/dns/DNSDomainList.vue:251 +msgid "" +"Need more DNS providers? Support us through donations or contact us for " +"commercial collaboration" +msgstr "さらに多くのDNSプロバイダーが必要ですか?寄付でサポートするか、商業協力のためにご連絡ください" + #: src/views/dashboard/NginxDashBoard.vue:195 msgid "Need to enable the stub_status module" msgstr "stub_statusモジュールを有効にする必要があります" @@ -4440,6 +4541,10 @@ msgstr "未インデックス" msgid "Not Loaded" msgstr "ロードされていません" +#: src/views/dns/DDNSManager.vue:102 +msgid "Not run yet" +msgstr "まだ実行されていません" + #: src/components/AutoCertForm/AutoCertForm.vue:230 msgid "Not supported for IP certificates" msgstr "IP証明書には対応していません" @@ -4449,7 +4554,7 @@ msgid "Not Valid Before: %{date}" msgstr "有効開始日: %{date}" #: src/components/AutoCertForm/AutoCertForm.vue:150 -#: src/views/certificate/DNSCredential.vue:89 +#: src/views/dns/DNSCredential.vue:89 msgid "Note" msgstr "注記" @@ -4574,10 +4679,6 @@ msgstr "OK" msgid "On" msgstr "オン" -#: src/views/certificate/DNSCredential.vue:99 -msgid "Once the verification is complete, the records will be removed." -msgstr "検証が完了すると、レコードは削除されます。" - #: src/components/NamespaceTabs/NamespaceTabs.vue:164 #: src/components/NodeCard/NodeCard.vue:51 #: src/components/NodeSelector/NodeSelector.vue:65 @@ -4864,7 +4965,7 @@ msgstr "すべての項目を正しく入力してください" msgid "Please fill in required S3 configuration fields" msgstr "必要なS3設定項目を入力してください" -#: src/views/certificate/DNSCredential.vue:93 +#: src/views/dns/DNSCredential.vue:93 msgid "" "Please fill in the API authentication credentials provided by your DNS " "provider." @@ -4923,7 +5024,7 @@ msgstr "ユーザー名を入力してください!" msgid "Please log in." msgstr "ログインしてください。" -#: src/views/certificate/DNSCredential.vue:102 +#: src/views/dns/DNSCredential.vue:96 msgid "Please note that the unit of time configurations below are all in seconds." msgstr "以下の時間設定の単位はすべて秒であることに注意してください。" @@ -5003,6 +5104,11 @@ msgstr "設定" msgid "Preparing lego configurations" msgstr "Lego 設定を準備中" +#: src/views/dns/components/DNSRecordForm.vue:81 +#: src/views/dns/components/DNSRecordTable.vue:33 +msgid "Priority" +msgstr "優先度" + #: src/components/AutoCertForm/AutoCertForm.vue:206 msgid "Private CA:" msgstr "プライベートCA:" @@ -5063,7 +5169,8 @@ msgid "" "proxy." msgstr "プロトコル設定は直接接続時にのみ有効です。リバースプロキシを使用している場合は、リバースプロキシで個別にプロトコルを設定してください。" -#: src/views/certificate/DNSCredential.vue:26 +#: src/views/dns/DDNSManager.vue:70 src/views/dns/DNSCredential.vue:26 +#: src/views/dns/DNSDomainList.vue:177 src/views/dns/DNSDomainList.vue:198 msgid "Provider" msgstr "プロバイダー" @@ -5075,6 +5182,12 @@ msgstr "プロバイダーが見つかりません: {0}" msgid "Province / Region" msgstr "省 / 地域" +#: src/views/dns/components/DNSRecordForm.vue:87 +#: src/views/dns/components/DNSRecordTable.vue:51 +#: src/views/dns/components/DNSRecordTable.vue:81 +msgid "Proxied" +msgstr "プロキシ済み" + #: src/views/certificate/ACMEUser.vue:63 msgid "Proxy" msgstr "プロキシ" @@ -5169,6 +5282,22 @@ msgstr "再チェック" msgid "Recommended:" msgstr "推奨:" +#: src/views/dns/DNSRecordManager.vue:113 +msgid "Record created" +msgstr "レコードが作成されました" + +#: src/views/dns/DNSRecordManager.vue:120 +msgid "Record deleted" +msgstr "レコードを削除しました" + +#: src/views/dns/DNSRecordManager.vue:109 +msgid "Record updated" +msgstr "レコードが更新されました" + +#: src/views/dns/DDNSManager.vue:221 +msgid "Records" +msgstr "レコード" + #: src/components/TwoFA/Authorization.vue:79 msgid "Recovery" msgstr "復旧" @@ -5196,7 +5325,8 @@ msgstr "リダイレクトメッセージ (3xx)" msgid "Referer" msgstr "リファラー" -#: src/language/curd.ts:70 +#: src/language/curd.ts:70 src/views/dns/DDNSManager.vue:161 +#: src/views/dns/DNSRecordManager.vue:165 msgid "Refresh" msgstr "更新" @@ -5436,7 +5566,7 @@ msgstr "間違ったパラメータでリクエストされました" msgid "Requests Per Connection" msgstr "接続あたりのリクエスト数" -#: src/language/curd.ts:13 +#: src/language/curd.ts:13 src/views/dns/components/DNSRecordFilter.vue:65 #: src/views/nginx_log/structured/components/SearchFilters.vue:214 #: src/views/nginx_log/structured/StructuredLogViewer.vue:745 msgid "Reset" @@ -5672,6 +5802,7 @@ msgstr "土曜日" #: src/views/config/components/ConfigLeftPanel.vue:283 #: src/views/config/components/ConfigName.vue:58 #: src/views/dashboard/components/SiteHealthCheckModal.vue:713 +#: src/views/dns/DDNSManager.vue:247 src/views/dns/DNSRecordManager.vue:215 #: src/views/preference/components/AuthSettings/Passkey.vue:131 #: src/views/preference/Preference.vue:124 #: src/views/site/site_edit/components/ConfigName/ConfigName.vue:52 @@ -5777,12 +5908,13 @@ msgstr "スケジュール" msgid "Schedule Type" msgstr "スケジュールタイプ" -#: src/views/certificate/components/DNSChallenge.vue:77 +#: src/views/dns/components/DNSChallenge.vue:78 msgid "SDK" msgstr "SDK" #: src/language/constants.ts:62 src/language/curd.ts:12 #: src/views/config/configColumns.tsx:5 +#: src/views/dns/components/DNSRecordFilter.vue:62 #: src/views/nginx_log/structured/components/SearchFilters.vue:217 #: src/views/site/site_list/columns.tsx:17 src/views/stream/columns.tsx:13 msgid "Search" @@ -5839,10 +5971,18 @@ msgstr "事前定義されたCAディレクトリを選択するか、カスタ msgid "Select all" msgstr "すべて選択" +#: src/language/constants.ts:68 +msgid "Select Credential" +msgstr "認証情報を選択" + #: src/views/certificate/ACMEUser.vue:45 msgid "Select or enter a CA directory URL" msgstr "CAディレクトリURLを選択または入力してください" +#: src/language/constants.ts:67 +msgid "Select Provider" +msgstr "プロバイダーを選択" + #: src/language/curd.ts:59 msgid "Selected {count} files" msgstr "選択された {count} ファイル" @@ -6162,6 +6302,7 @@ msgstr "静的" #: src/views/certificate/ACMEUser.vue:75 #: src/views/certificate/CertificateList/certColumns.tsx:63 #: src/views/dashboard/components/ModulesTable.vue:75 +#: src/views/dns/DDNSManager.vue:75 #: src/views/nginx_log/structured/components/SearchFilters.vue:106 #: src/views/nginx_log/structured/StructuredLogViewer.vue:241 #: src/views/nginx_log/structured/StructuredLogViewer.vue:521 @@ -6390,6 +6531,10 @@ msgstr "システム復元" msgid "System restored successfully." msgstr "システムの復元が完了しました。" +#: src/views/dns/DDNSManager.vue:83 +msgid "Targets" +msgstr "ターゲット" + #: src/constants/errors/self_check.ts:3 msgid "Task is not fixable" msgstr "タスクは修正不可能です" @@ -6884,6 +7029,14 @@ msgstr "検索条件を調整するか、別のページに移動してみてく msgid "Try adjusting your search criteria or time range." msgstr "検索条件または時間範囲を調整してみてください。" +#: src/views/dns/components/DNSRecordTable.vue:29 +msgid "TTL" +msgstr "TTL" + +#: src/views/dns/components/DNSRecordForm.vue:78 +msgid "TTL (seconds)" +msgstr "TTL (秒)" + #: src/views/backup/AutoBackup/components/CronEditor.vue:28 msgid "Tuesday" msgstr "火曜日" @@ -6896,6 +7049,9 @@ msgstr "二要素認証が必要です" #: src/views/certificate/CertificateList/certColumns.tsx:24 #: src/views/config/components/Delete.vue:122 #: src/views/dashboard/components/ModulesTable.vue:62 +#: src/views/dns/components/DNSRecordFilter.vue:49 +#: src/views/dns/components/DNSRecordForm.vue:57 +#: src/views/dns/components/DNSRecordTable.vue:21 #: src/views/nginx_log/NginxLogList.vue:146 #: src/views/notification/notificationColumns.tsx:8 #: src/views/preference/components/ExternalNotify/columns.tsx:19 @@ -6906,6 +7062,10 @@ msgstr "タイプ" msgid "Type %{delete} to confirm" msgstr "確認のために %{delete} と入力してください" +#: src/views/dns/DDNSManager.vue:228 +msgid "Type or select A/AAAA records" +msgstr "A/AAAAレコードを入力または選択" + #: src/views/nginx_log/structured/components/SearchFilters.vue:142 msgid "Type or select browser" msgstr "ブラウザを入力または選択" @@ -6961,9 +7121,9 @@ msgstr "更新に成功しました" #: src/views/backup/AutoBackup/AutoBackup.vue:236 #: src/views/certificate/ACMEUser.vue:124 -#: src/views/certificate/DNSCredential.vue:65 #: src/views/config/components/ConfigRightPanel/Basic.vue:54 -#: src/views/config/configColumns.tsx:44 src/views/namespace/columns.ts:91 +#: src/views/config/configColumns.tsx:44 src/views/dns/DNSCredential.vue:65 +#: src/views/dns/DNSDomainList.vue:205 src/views/namespace/columns.ts:91 #: src/views/node/nodeColumns.tsx:89 #: src/views/site/site_edit/components/RightPanel/Basic.vue:39 #: src/views/site/site_list/columns.tsx:113 src/views/stream/columns.tsx:80 @@ -7036,6 +7196,10 @@ msgstr "稼働時間:" msgid "URL" msgstr "URL" +#: src/views/dns/components/DNSRecordForm.vue:64 +msgid "Use @ for root" +msgstr "ルートには @ を使用" + #: src/components/TwoFA/Authorization.vue:121 msgid "Use OTP" msgstr "OTP を使用する" @@ -7101,6 +7265,8 @@ msgid "Validate SSL Certificate" msgstr "SSL証明書を検証" #: src/views/dashboard/components/PerformanceTablesCard.vue:22 +#: src/views/dns/components/DNSRecordForm.vue:66 +#: src/views/dns/components/DNSRecordTable.vue:25 msgid "Value" msgstr "値" @@ -7193,12 +7359,6 @@ msgstr "" msgid "We do not accept any feature requests" msgstr "機能リクエストは受け付けていません" -#: src/views/certificate/DNSCredential.vue:96 -msgid "" -"We will add one or more TXT records to the DNS records of your domain for " -"ownership verification." -msgstr "所有権確認のために、お客様のドメインのDNSレコードに1つ以上のTXTレコードを追加します。" - #: src/views/site/site_edit/components/Cert/ObtainCert.vue:142 msgid "" "We will remove the HTTPChallenge configuration from this file and reload " @@ -7233,6 +7393,11 @@ msgstr "毎週" msgid "Weekly on %{day} at %{time}" msgstr "毎週%{day}の%{time}" +#: src/views/dns/components/DNSRecordForm.vue:84 +#: src/views/dns/components/DNSRecordTable.vue:37 +msgid "Weight" +msgstr "重み" + #: src/views/certificate/ACMEUser.vue:119 msgid "" "When Enabled, Nginx UI will automatically re-register users upon startup. " @@ -7278,7 +7443,7 @@ msgstr "ワーカープロセス" msgid "Workers" msgstr "ワーカー" -#: src/layouts/HeaderLayout.vue:61 src/routes/index.ts:61 +#: src/layouts/HeaderLayout.vue:61 src/routes/index.ts:63 #: src/views/workspace/WorkSpace.vue:51 msgid "Workspace" msgstr "ワークスペース" @@ -7374,6 +7539,14 @@ msgstr "あなたのパスキー" msgid "Zero-allocation pipeline" msgstr "ゼロアロケーションパイプライン" +#~ msgid "Once the verification is complete, the records will be removed." +#~ msgstr "検証が完了すると、レコードは削除されます。" + +#~ msgid "" +#~ "We will add one or more TXT records to the DNS records of your domain for " +#~ "ownership verification." +#~ msgstr "所有権確認のために、お客様のドメインのDNSレコードに1つ以上のTXTレコードを追加します。" + #~ msgid "Settings" #~ msgstr "設定" @@ -7395,9 +7568,6 @@ msgstr "ゼロアロケーションパイプライン" #~ msgid "Tested in isolated sandbox mode" #~ msgstr "隔離されたサンドボックスモードでテストされました" -#~ msgid "All" -#~ msgstr "すべて" - #~ msgid "Based on M2 Pro (12 cores) testing" #~ msgstr "M2 Pro(12コア)でのテストに基づく" @@ -7601,9 +7771,6 @@ msgstr "ゼロアロケーションパイプライン" #~ msgid "Are you sure you want to apply to all selected?" #~ msgstr "選択したすべてに適用してもよろしいですか?" -#~ msgid "Are you sure you want to delete this item?" -#~ msgstr "このアイテムを削除してもよろしいですか?" - #~ msgid "Are you sure you want to recover this item?" #~ msgstr "このアイテムを復元してもよろしいですか?" diff --git a/app/src/language/ko_KR/app.po b/app/src/language/ko_KR/app.po index 41fb0820..e8009602 100644 --- a/app/src/language/ko_KR/app.po +++ b/app/src/language/ko_KR/app.po @@ -183,8 +183,10 @@ msgstr "작업" #: src/views/backup/AutoBackup/AutoBackup.vue:273 #: src/views/certificate/ACMEUser.vue:131 #: src/views/certificate/CertificateList/certColumns.tsx:92 -#: src/views/certificate/DNSCredential.vue:71 -#: src/views/config/configColumns.tsx:51 src/views/namespace/columns.ts:97 +#: src/views/config/configColumns.tsx:51 +#: src/views/dns/components/DNSRecordTable.vue:41 +#: src/views/dns/DDNSManager.vue:91 src/views/dns/DNSCredential.vue:71 +#: src/views/dns/DNSDomainList.vue:211 src/views/namespace/columns.ts:97 #: src/views/nginx_log/NginxLogList.vue:338 src/views/node/nodeColumns.tsx:96 #: src/views/notification/notificationColumns.tsx:72 #: src/views/preference/components/ExternalNotify/columns.tsx:85 @@ -238,6 +240,10 @@ msgstr "헤더 추가" msgid "Add Location" msgstr "위치 추가" +#: src/views/dns/DNSRecordManager.vue:171 +msgid "Add Record" +msgstr "레코드 추가" + #: src/components/NgxConfigEditor/NgxServer.vue:92 msgid "Add Server" msgstr "서버 추가" @@ -258,7 +264,7 @@ msgstr "업스트림 추가" msgid "Added successfully" msgstr "성공적으로 추가됨" -#: src/views/certificate/components/DNSChallenge.vue:97 +#: src/views/dns/components/DNSChallenge.vue:98 msgid "Additional" msgstr "추가적인" @@ -295,6 +301,10 @@ msgstr "고급 설정" msgid "Afterwards, refresh this page and click add passkey again." msgstr "이후에 이 페이지를 새로 고치고 패스키 추가를 다시 클릭하세요." +#: src/views/dns/components/DNSRecordFilter.vue:55 +msgid "All" +msgstr "모두" + #: src/views/system/Licenses.vue:152 msgid "All Components" msgstr "모든 구성 요소" @@ -334,7 +344,7 @@ msgstr "도달 가능한 모든 IP 주소는 개인 인증 기관과 함께 사 msgid "API Base Url" msgstr "API 기본 URL" -#: src/views/certificate/components/DNSChallenge.vue:70 +#: src/views/dns/components/DNSChallenge.vue:71 msgid "API Document" msgstr "API 문서" @@ -370,6 +380,10 @@ msgstr "차단된 IP를 즉시 삭제하시겠습니까?" msgid "Are you sure to delete this passkey immediately?" msgstr "이 패스키를 즉시 삭제하시겠습니까?" +#: src/views/dns/components/DNSRecordTable.vue:90 +msgid "Are you sure to delete this record?" +msgstr "이 레코드를 삭제하시겠습니까?" + #: src/views/preference/components/AuthSettings/RecoveryCodes.vue:155 msgid "Are you sure to generate new recovery codes?" msgstr "새로운 복구 코드를 생성하시겠습니까?" @@ -539,7 +553,7 @@ msgstr "평균/PV" #: src/views/certificate/components/CertificateActions.vue:22 #: src/views/config/components/ConfigLeftPanel.vue:274 #: src/views/config/ConfigList.vue:120 src/views/config/ConfigList.vue:217 -#: src/views/nginx_log/NginxLog.vue:129 +#: src/views/dns/DNSRecordManager.vue:223 src/views/nginx_log/NginxLog.vue:129 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:183 #: src/views/stream/components/StreamEditor.vue:147 msgid "Back" @@ -685,6 +699,10 @@ msgstr "브라우저" msgid "Browser Statistics" msgstr "브라우저 통계" +#: src/views/dns/DNSDomainList.vue:257 +msgid "Business contact:" +msgstr "비즈니스 연락처:" + #: src/views/nginx_log/components/IndexingSettingsModal.vue:316 msgid "" "By enabling advanced indexing, you acknowledge that your system meets the " @@ -754,6 +772,7 @@ msgstr "" #: src/components/NgxConfigEditor/NgxUpstream.vue:32 src/language/curd.ts:37 #: src/views/config/components/Delete.vue:98 #: src/views/dashboard/components/SiteHealthCheckModal.vue:710 +#: src/views/dns/DDNSManager.vue:244 src/views/dns/DNSRecordManager.vue:212 #: src/views/nginx_log/components/IndexingSettingsModal.vue:102 #: src/views/nginx_log/indexing/IndexManagement.vue:33 #: src/views/nginx_log/indexing/IndexManagement.vue:59 @@ -900,7 +919,7 @@ msgstr "인증서 유형" msgid "Certificates" msgstr "인증서" -#: src/routes/modules/certificates.ts:36 +#: src/routes/modules/certificates.ts:28 msgid "Certificates List" msgstr "인증서 목록" @@ -1263,7 +1282,7 @@ msgstr "설정 경로가 비어 있습니다" msgid "Config Template" msgstr "설정 템플릿" -#: src/views/certificate/DNSCredential.vue:52 +#: src/views/dns/DNSCredential.vue:52 msgid "Configuration" msgstr "구성" @@ -1291,6 +1310,14 @@ msgstr "구성 이름" msgid "Configurations" msgstr "구성들" +#: src/views/dns/DDNSManager.vue:201 +msgid "Configure" +msgstr "구성" + +#: src/views/dns/DDNSManager.vue:211 +msgid "Configure DDNS" +msgstr "DDNS 구성" + #: src/views/site/site_add/SiteAdd.vue:81 msgid "Configure SSL" msgstr "SSL 구성하기" @@ -1412,6 +1439,10 @@ msgstr "파일 생성" msgid "Create Folder" msgstr "폴더 생성" +#: src/views/dns/DNSRecordManager.vue:200 +msgid "Create Record" +msgstr "레코드 생성" + #: src/views/backup/components/BackupCreator.vue:75 msgid "" "Create system backups including Nginx configuration and Nginx UI settings. " @@ -1435,11 +1466,12 @@ msgstr "성공적으로 생성됨" msgid "Creating client facilitates communication with the CA server" msgstr "클라이언트 생성은 CA 서버와의 통신을 용이하게 합니다" -#: src/components/AutoCertForm/DNSChallenge.vue:105 +#: src/components/AutoCertForm/DNSChallenge.vue:131 +#: src/views/dns/DDNSManager.vue:65 src/views/dns/DNSDomainList.vue:109 msgid "Credential" msgstr "인증 정보" -#: src/views/certificate/components/DNSChallenge.vue:86 +#: src/routes/modules/dns.ts:20 src/views/dns/components/DNSChallenge.vue:87 msgid "Credentials" msgstr "인증 정보들" @@ -1554,6 +1586,18 @@ msgstr "일" msgid "Db file not found" msgstr "데이터베이스 파일을 찾을 수 없습니다" +#: src/routes/modules/dns.ts:36 +msgid "DDNS" +msgstr "DDNS" + +#: src/views/dns/DDNSManager.vue:153 +msgid "DDNS Overview" +msgstr "DDNS 개요" + +#: src/views/dns/DDNSManager.vue:135 +msgid "DDNS saved" +msgstr "DDNS 저장됨" + #: src/constants/errors/geolite.ts:12 msgid "Decompression succeeded but failed to delete compressed file: {0}" msgstr "압축 해제는 성공했지만 압축 파일을 삭제하는 데 실패했습니다: {0}" @@ -1578,6 +1622,7 @@ msgstr "공유 메모리 영역 이름과 크기를 정의합니다(예: proxy_c #: src/views/config/components/Delete.vue:65 #: src/views/config/components/Delete.vue:97 #: src/views/config/ConfigList.vue:199 +#: src/views/dns/components/DNSRecordTable.vue:94 #: src/views/site/site_list/SiteList.vue:100 #: src/views/stream/StreamList.vue:110 msgid "Delete" @@ -1819,7 +1864,8 @@ msgid "Disable stream %{name} from %{node} successfully" msgstr "스트림 %{name}을(를) %{node}에서 비활성화했습니다" #: src/views/backup/AutoBackup/AutoBackup.vue:175 -#: src/views/node/nodeColumns.tsx:60 src/views/node/nodeColumns.tsx:78 +#: src/views/dns/DDNSManager.vue:175 src/views/node/nodeColumns.tsx:60 +#: src/views/node/nodeColumns.tsx:78 #: src/views/preference/tabs/HTTPSettings.vue:24 #: src/views/preference/tabs/NodeSettings.vue:25 #: src/views/preference/tabs/NodeSettings.vue:30 @@ -1844,16 +1890,35 @@ msgstr "연결 끊김" msgid "Disk IO" msgstr "디스크 IO" -#: src/routes/modules/certificates.ts:28 -#: src/views/certificate/DNSCredential.vue:79 +#: src/routes/modules/dns.ts:11 +msgid "DNS" +msgstr "DNS" + +#: src/views/dns/DNSCredential.vue:79 msgid "DNS Credentials" msgstr "DNS 인증 정보" -#: src/components/AutoCertForm/DNSChallenge.vue:95 -#: src/views/certificate/components/DNSChallenge.vue:59 +#: src/routes/modules/dns.ts:28 src/views/dns/DNSDomainList.vue:228 +msgid "DNS Domains" +msgstr "DNS 도메인" + +#: src/views/dns/components/DNSRecordTable.vue:81 +msgid "DNS Only" +msgstr "DNS 전용" + +#: src/components/AutoCertForm/DNSChallenge.vue:121 +#: src/views/dns/components/DNSChallenge.vue:60 msgid "DNS Provider" msgstr "DNS 제공자" +#: src/views/dns/DNSDomainList.vue:244 +msgid "DNS Provider Support" +msgstr "DNS 공급자 지원" + +#: src/routes/modules/dns.ts:44 src/views/dns/DNSRecordManager.vue:58 +msgid "DNS Records" +msgstr "DNS 레코드" + #: src/views/dashboard/components/SiteHealthCheckModal.vue:678 msgid "DNS Resolver" msgstr "DNS 확인자" @@ -1914,6 +1979,7 @@ msgid "Document Count" msgstr "문서 수" #: src/views/certificate/components/DNSIssueCertificate.vue:119 +#: src/views/dns/DDNSManager.vue:60 src/views/dns/DNSDomainList.vue:98 msgid "Domain" msgstr "도메인" @@ -2001,7 +2067,7 @@ msgstr "EAB HMAC 키" msgid "EAB Key ID" msgstr "EAB 키 ID" -#: src/language/curd.ts:8 +#: src/language/curd.ts:8 src/views/dns/components/DNSRecordTable.vue:87 msgid "Edit" msgstr "편집" @@ -2015,6 +2081,10 @@ msgstr "%{n} 편집" msgid "Edit Configuration" msgstr "구성 편집" +#: src/views/dns/DNSRecordManager.vue:200 +msgid "Edit Record" +msgstr "레코드 편집" + #: src/routes/modules/sites.ts:34 msgid "Edit Site" msgstr "사이트 편집" @@ -2065,6 +2135,10 @@ msgstr "코드 완성 활성화" msgid "Enable compression for content transfer" msgstr "콘텐츠 전송 압축 활성화" +#: src/views/dns/DDNSManager.vue:218 +msgid "Enable DDNS" +msgstr "DDNS 활성화" + #: src/views/dashboard/components/SiteHealthCheckModal.vue:473 msgid "Enable Health Check" msgstr "헬스 체크 활성화" @@ -2152,7 +2226,8 @@ msgid "Enable TOTP" msgstr "TOTP 활성화" #: src/views/backup/AutoBackup/AutoBackup.vue:174 -#: src/views/node/nodeColumns.tsx:69 src/views/node/nodeColumns.tsx:75 +#: src/views/dns/DDNSManager.vue:175 src/views/node/nodeColumns.tsx:69 +#: src/views/node/nodeColumns.tsx:75 #: src/views/preference/components/ExternalNotify/columns.tsx:47 #: src/views/preference/tabs/HTTPSettings.vue:24 #: src/views/preference/tabs/LogrotateSettings.vue:20 @@ -3101,14 +3176,19 @@ msgstr "값이 높을수록 연결 재사용이 더 좋다는 것을 의미합 msgid "History" msgstr "기록" -#: src/routes/index.ts:52 +#: src/routes/index.ts:54 msgid "Home" msgstr "홈" +#: src/views/dns/components/DNSRecordFilter.vue:42 #: src/views/preference/tabs/ServerSettings.vue:19 msgid "Host" msgstr "호스트" +#: src/views/dns/components/DNSRecordFilter.vue:45 +msgid "Host, e.g. @ or www" +msgstr "호스트, 예: @ 또는 www" + #: src/views/backup/AutoBackup/components/CronEditor.vue:159 #: src/views/nginx_log/dashboard/components/HourlyChart.vue:87 msgid "Hour" @@ -3174,7 +3254,7 @@ msgstr "도메인에 CNAME 레코드가 있고 인증서를 얻을 수 없는 msgid "Import" msgstr "가져오기" -#: src/routes/modules/certificates.ts:54 +#: src/routes/modules/certificates.ts:46 #: src/views/certificate/CertificateEditor.vue:84 msgid "Import Certificate" msgstr "인증서 가져오기" @@ -3293,10 +3373,15 @@ msgid "" "restart the Nginx UI." msgstr "시스템 시작 후 10분이 지나면 설치가 허용되지 않습니다. Nginx UI를 다시 시작하세요." +#: src/views/dns/DDNSManager.vue:79 #: src/views/preference/tabs/LogrotateSettings.vue:26 msgid "Interval" msgstr "간격" +#: src/views/dns/DDNSManager.vue:232 +msgid "Interval (seconds)" +msgstr "간격(초)" + #: src/views/certificate/ACMEUser.vue:166 msgid "Invalid" msgstr "무효" @@ -3523,6 +3608,10 @@ msgstr "마지막 인덱싱" msgid "Last month" msgstr "지난달" +#: src/views/dns/DDNSManager.vue:87 +msgid "Last run" +msgstr "마지막 실행" + #: src/views/dashboard/NginxDashBoard.vue:138 msgid "Last update" msgstr "마지막 업데이트" @@ -3783,6 +3872,10 @@ msgstr "인증서를 받기 전에 .well-known 디렉터리에 대한 역방향 msgid "Manage Configs" msgstr "구성 관리" +#: src/views/dns/DNSDomainList.vue:236 +msgid "Manage Records" +msgstr "레코드 관리" + #: src/routes/modules/sites.ts:10 src/views/site/site_list/SiteList.vue:45 msgid "Manage Sites" msgstr "사이트 관리" @@ -3953,7 +4046,7 @@ msgstr "수정일시" msgid "Modify" msgstr "수정" -#: src/routes/modules/certificates.ts:44 +#: src/routes/modules/certificates.ts:36 #: src/views/certificate/CertificateEditor.vue:84 msgid "Modify Certificate" msgstr "인증서 수정" @@ -4014,11 +4107,13 @@ msgstr "해당 없음" #: src/views/certificate/components/CertificateBasicInfo.vue:44 #: src/views/certificate/components/CertificateBasicInfo.vue:58 #: src/views/certificate/components/CertificateBasicInfo.vue:70 -#: src/views/certificate/DNSCredential.vue:17 #: src/views/config/components/ConfigRightPanel/Basic.vue:34 #: src/views/config/components/Delete.vue:123 #: src/views/config/components/Mkdir.vue:64 -#: src/views/config/configColumns.tsx:17 src/views/namespace/columns.ts:9 +#: src/views/config/configColumns.tsx:17 +#: src/views/dns/components/DNSRecordForm.vue:63 +#: src/views/dns/components/DNSRecordTable.vue:17 +#: src/views/dns/DNSCredential.vue:17 src/views/namespace/columns.ts:9 #: src/views/nginx_log/NginxLogList.vue:155 src/views/node/nodeColumns.tsx:8 #: src/views/preference/components/AuthSettings/AddPasskey.vue:81 #: src/views/site/site_edit/components/RightPanel/Basic.vue:36 @@ -4046,6 +4141,12 @@ msgstr "네임스페이스" msgid "Namespaces" msgstr "네임스페이스" +#: src/views/dns/DNSDomainList.vue:251 +msgid "" +"Need more DNS providers? Support us through donations or contact us for " +"commercial collaboration" +msgstr "더 많은 DNS 제공자가 필요하신가요? 기부를 통해 지원하거나 상업적 협력을 위해 문의해 주세요" + #: src/views/dashboard/NginxDashBoard.vue:195 msgid "Need to enable the stub_status module" msgstr "stub_status 모듈을 활성화해야 합니다" @@ -4436,6 +4537,10 @@ msgstr "인덱스되지 않음" msgid "Not Loaded" msgstr "로드되지 않음" +#: src/views/dns/DDNSManager.vue:102 +msgid "Not run yet" +msgstr "아직 실행되지 않음" + #: src/components/AutoCertForm/AutoCertForm.vue:230 msgid "Not supported for IP certificates" msgstr "IP 인증서는 지원되지 않습니다" @@ -4445,7 +4550,7 @@ msgid "Not Valid Before: %{date}" msgstr "유효 시작일: %{date}" #: src/components/AutoCertForm/AutoCertForm.vue:150 -#: src/views/certificate/DNSCredential.vue:89 +#: src/views/dns/DNSCredential.vue:89 msgid "Note" msgstr "참고" @@ -4570,10 +4675,6 @@ msgstr "확인" msgid "On" msgstr "켜짐" -#: src/views/certificate/DNSCredential.vue:99 -msgid "Once the verification is complete, the records will be removed." -msgstr "검증이 완료되면, 레코드는 제거됩니다." - #: src/components/NamespaceTabs/NamespaceTabs.vue:164 #: src/components/NodeCard/NodeCard.vue:51 #: src/components/NodeSelector/NodeSelector.vue:65 @@ -4860,7 +4961,7 @@ msgstr "모든 필드를 올바르게 작성해 주세요" msgid "Please fill in required S3 configuration fields" msgstr "필수 S3 구성 필드를 입력해 주세요" -#: src/views/certificate/DNSCredential.vue:93 +#: src/views/dns/DNSCredential.vue:93 msgid "" "Please fill in the API authentication credentials provided by your DNS " "provider." @@ -4917,7 +5018,7 @@ msgstr "사용자 이름을 입력해주세요!" msgid "Please log in." msgstr "로그인해 주세요." -#: src/views/certificate/DNSCredential.vue:102 +#: src/views/dns/DNSCredential.vue:96 msgid "Please note that the unit of time configurations below are all in seconds." msgstr "아래의 시간 설정 단위는 모두 초 단위임을 유의해주세요." @@ -4997,6 +5098,11 @@ msgstr "환경설정" msgid "Preparing lego configurations" msgstr "Lego 설정 준비 중" +#: src/views/dns/components/DNSRecordForm.vue:81 +#: src/views/dns/components/DNSRecordTable.vue:33 +msgid "Priority" +msgstr "우선순위" + #: src/components/AutoCertForm/AutoCertForm.vue:206 msgid "Private CA:" msgstr "개인 CA:" @@ -5057,7 +5163,8 @@ msgid "" "proxy." msgstr "프로토콜 설정은 직접 연결할 때만 적용됩니다. 리버스 프록시를 사용하는 경우 리버스 프록시에서 별도로 프로토콜을 구성하세요." -#: src/views/certificate/DNSCredential.vue:26 +#: src/views/dns/DDNSManager.vue:70 src/views/dns/DNSCredential.vue:26 +#: src/views/dns/DNSDomainList.vue:177 src/views/dns/DNSDomainList.vue:198 msgid "Provider" msgstr "제공자" @@ -5069,6 +5176,12 @@ msgstr "공급자를 찾을 수 없음: {0}" msgid "Province / Region" msgstr "지역 / 지역" +#: src/views/dns/components/DNSRecordForm.vue:87 +#: src/views/dns/components/DNSRecordTable.vue:51 +#: src/views/dns/components/DNSRecordTable.vue:81 +msgid "Proxied" +msgstr "프록시됨" + #: src/views/certificate/ACMEUser.vue:63 msgid "Proxy" msgstr "프록시" @@ -5163,6 +5276,22 @@ msgstr "재확인" msgid "Recommended:" msgstr "권장:" +#: src/views/dns/DNSRecordManager.vue:113 +msgid "Record created" +msgstr "레코드가 생성되었습니다" + +#: src/views/dns/DNSRecordManager.vue:120 +msgid "Record deleted" +msgstr "레코드 삭제됨" + +#: src/views/dns/DNSRecordManager.vue:109 +msgid "Record updated" +msgstr "레코드가 업데이트되었습니다" + +#: src/views/dns/DDNSManager.vue:221 +msgid "Records" +msgstr "레코드" + #: src/components/TwoFA/Authorization.vue:79 msgid "Recovery" msgstr "복구" @@ -5190,7 +5319,8 @@ msgstr "리디렉션 메시지 (3xx)" msgid "Referer" msgstr "리퍼러" -#: src/language/curd.ts:70 +#: src/language/curd.ts:70 src/views/dns/DDNSManager.vue:161 +#: src/views/dns/DNSRecordManager.vue:165 msgid "Refresh" msgstr "새로 고침" @@ -5430,7 +5560,7 @@ msgstr "잘못된 매개변수로 요청됨" msgid "Requests Per Connection" msgstr "연결당 요청 수" -#: src/language/curd.ts:13 +#: src/language/curd.ts:13 src/views/dns/components/DNSRecordFilter.vue:65 #: src/views/nginx_log/structured/components/SearchFilters.vue:214 #: src/views/nginx_log/structured/StructuredLogViewer.vue:745 msgid "Reset" @@ -5668,6 +5798,7 @@ msgstr "토요일" #: src/views/config/components/ConfigLeftPanel.vue:283 #: src/views/config/components/ConfigName.vue:58 #: src/views/dashboard/components/SiteHealthCheckModal.vue:713 +#: src/views/dns/DDNSManager.vue:247 src/views/dns/DNSRecordManager.vue:215 #: src/views/preference/components/AuthSettings/Passkey.vue:131 #: src/views/preference/Preference.vue:124 #: src/views/site/site_edit/components/ConfigName/ConfigName.vue:52 @@ -5773,12 +5904,13 @@ msgstr "일정" msgid "Schedule Type" msgstr "일정 유형" -#: src/views/certificate/components/DNSChallenge.vue:77 +#: src/views/dns/components/DNSChallenge.vue:78 msgid "SDK" msgstr "SDK" #: src/language/constants.ts:62 src/language/curd.ts:12 #: src/views/config/configColumns.tsx:5 +#: src/views/dns/components/DNSRecordFilter.vue:62 #: src/views/nginx_log/structured/components/SearchFilters.vue:217 #: src/views/site/site_list/columns.tsx:17 src/views/stream/columns.tsx:13 msgid "Search" @@ -5835,10 +5967,18 @@ msgstr "미리 정의된 CA 디렉터리를 선택하거나 사용자 지정 디 msgid "Select all" msgstr "모두 선택" +#: src/language/constants.ts:68 +msgid "Select Credential" +msgstr "자격 증명 선택" + #: src/views/certificate/ACMEUser.vue:45 msgid "Select or enter a CA directory URL" msgstr "CA 디렉터리 URL을 선택하거나 입력하세요" +#: src/language/constants.ts:67 +msgid "Select Provider" +msgstr "공급자 선택" + #: src/language/curd.ts:59 msgid "Selected {count} files" msgstr "선택된 {count} 파일" @@ -6158,6 +6298,7 @@ msgstr "정적" #: src/views/certificate/ACMEUser.vue:75 #: src/views/certificate/CertificateList/certColumns.tsx:63 #: src/views/dashboard/components/ModulesTable.vue:75 +#: src/views/dns/DDNSManager.vue:75 #: src/views/nginx_log/structured/components/SearchFilters.vue:106 #: src/views/nginx_log/structured/StructuredLogViewer.vue:241 #: src/views/nginx_log/structured/StructuredLogViewer.vue:521 @@ -6386,6 +6527,10 @@ msgstr "시스템 복원" msgid "System restored successfully." msgstr "시스템이 성공적으로 복원되었습니다." +#: src/views/dns/DDNSManager.vue:83 +msgid "Targets" +msgstr "대상" + #: src/constants/errors/self_check.ts:3 msgid "Task is not fixable" msgstr "작업을 수정할 수 없음" @@ -6877,6 +7022,14 @@ msgstr "검색 조건을 조정하거나 다른 페이지로 이동해 보세요 msgid "Try adjusting your search criteria or time range." msgstr "검색 조건이나 시간 범위를 조정해 보세요." +#: src/views/dns/components/DNSRecordTable.vue:29 +msgid "TTL" +msgstr "TTL" + +#: src/views/dns/components/DNSRecordForm.vue:78 +msgid "TTL (seconds)" +msgstr "TTL (초)" + #: src/views/backup/AutoBackup/components/CronEditor.vue:28 msgid "Tuesday" msgstr "화요일" @@ -6889,6 +7042,9 @@ msgstr "2단계 인증이 필요합니다" #: src/views/certificate/CertificateList/certColumns.tsx:24 #: src/views/config/components/Delete.vue:122 #: src/views/dashboard/components/ModulesTable.vue:62 +#: src/views/dns/components/DNSRecordFilter.vue:49 +#: src/views/dns/components/DNSRecordForm.vue:57 +#: src/views/dns/components/DNSRecordTable.vue:21 #: src/views/nginx_log/NginxLogList.vue:146 #: src/views/notification/notificationColumns.tsx:8 #: src/views/preference/components/ExternalNotify/columns.tsx:19 @@ -6899,6 +7055,10 @@ msgstr "유형" msgid "Type %{delete} to confirm" msgstr "확인하려면 %{delete}를 입력하세요" +#: src/views/dns/DDNSManager.vue:228 +msgid "Type or select A/AAAA records" +msgstr "A/AAAA 레코드 입력 또는 선택" + #: src/views/nginx_log/structured/components/SearchFilters.vue:142 msgid "Type or select browser" msgstr "브라우저 입력 또는 선택" @@ -6954,9 +7114,9 @@ msgstr "성공적으로 업데이트되었습니다" #: src/views/backup/AutoBackup/AutoBackup.vue:236 #: src/views/certificate/ACMEUser.vue:124 -#: src/views/certificate/DNSCredential.vue:65 #: src/views/config/components/ConfigRightPanel/Basic.vue:54 -#: src/views/config/configColumns.tsx:44 src/views/namespace/columns.ts:91 +#: src/views/config/configColumns.tsx:44 src/views/dns/DNSCredential.vue:65 +#: src/views/dns/DNSDomainList.vue:205 src/views/namespace/columns.ts:91 #: src/views/node/nodeColumns.tsx:89 #: src/views/site/site_edit/components/RightPanel/Basic.vue:39 #: src/views/site/site_list/columns.tsx:113 src/views/stream/columns.tsx:80 @@ -7029,6 +7189,10 @@ msgstr "가동 시간:" msgid "URL" msgstr "URL" +#: src/views/dns/components/DNSRecordForm.vue:64 +msgid "Use @ for root" +msgstr "루트에는 @ 사용" + #: src/components/TwoFA/Authorization.vue:121 msgid "Use OTP" msgstr "OTP 사용" @@ -7094,6 +7258,8 @@ msgid "Validate SSL Certificate" msgstr "SSL 인증서 검증" #: src/views/dashboard/components/PerformanceTablesCard.vue:22 +#: src/views/dns/components/DNSRecordForm.vue:66 +#: src/views/dns/components/DNSRecordTable.vue:25 msgid "Value" msgstr "값" @@ -7185,12 +7351,6 @@ msgstr "" msgid "We do not accept any feature requests" msgstr "기능 요청을 받지 않습니다" -#: src/views/certificate/DNSCredential.vue:96 -msgid "" -"We will add one or more TXT records to the DNS records of your domain for " -"ownership verification." -msgstr "도메인 소유권 검증을 위해 도메인의 DNS레코드에 하나 이상의 TXT 레코드를 추가할 것입니다." - #: src/views/site/site_edit/components/Cert/ObtainCert.vue:142 msgid "" "We will remove the HTTPChallenge configuration from this file and reload " @@ -7225,6 +7385,11 @@ msgstr "매주" msgid "Weekly on %{day} at %{time}" msgstr "매주 %{day} %{time}" +#: src/views/dns/components/DNSRecordForm.vue:84 +#: src/views/dns/components/DNSRecordTable.vue:37 +msgid "Weight" +msgstr "가중치" + #: src/views/certificate/ACMEUser.vue:119 msgid "" "When Enabled, Nginx UI will automatically re-register users upon startup. " @@ -7270,7 +7435,7 @@ msgstr "작업자 프로세스" msgid "Workers" msgstr "워커" -#: src/layouts/HeaderLayout.vue:61 src/routes/index.ts:61 +#: src/layouts/HeaderLayout.vue:61 src/routes/index.ts:63 #: src/views/workspace/WorkSpace.vue:51 msgid "Workspace" msgstr "작업 공간" @@ -7368,6 +7533,14 @@ msgstr "귀하의 패스키" msgid "Zero-allocation pipeline" msgstr "할당 없는 파이프라인" +#~ msgid "Once the verification is complete, the records will be removed." +#~ msgstr "검증이 완료되면, 레코드는 제거됩니다." + +#~ msgid "" +#~ "We will add one or more TXT records to the DNS records of your domain for " +#~ "ownership verification." +#~ msgstr "도메인 소유권 검증을 위해 도메인의 DNS레코드에 하나 이상의 TXT 레코드를 추가할 것입니다." + #~ msgid "Settings" #~ msgstr "설정" @@ -7389,9 +7562,6 @@ msgstr "할당 없는 파이프라인" #~ msgid "Tested in isolated sandbox mode" #~ msgstr "격리된 샌드박스 모드에서 테스트됨" -#~ msgid "All" -#~ msgstr "모두" - #~ msgid "Based on M2 Pro (12 cores) testing" #~ msgstr "M2 Pro(12코어) 테스트 기반" @@ -7595,9 +7765,6 @@ msgstr "할당 없는 파이프라인" #~ msgid "Are you sure you want to apply to all selected?" #~ msgstr "선택한 모든 항목에 적용하시겠습니까?" -#~ msgid "Are you sure you want to delete this item?" -#~ msgstr "이 항목을 삭제하시겠습니까?" - #~ msgid "Are you sure you want to recover this item?" #~ msgstr "정말로 이 항목을 복구하시겠습니까?" diff --git a/app/src/language/messages.pot b/app/src/language/messages.pot index 23f25cab..cded0247 100644 --- a/app/src/language/messages.pot +++ b/app/src/language/messages.pot @@ -167,8 +167,11 @@ msgstr "" #: src/views/backup/AutoBackup/AutoBackup.vue:273 #: src/views/certificate/ACMEUser.vue:131 #: src/views/certificate/CertificateList/certColumns.tsx:92 -#: src/views/certificate/DNSCredential.vue:71 #: src/views/config/configColumns.tsx:51 +#: src/views/dns/components/DNSRecordTable.vue:41 +#: src/views/dns/DDNSManager.vue:91 +#: src/views/dns/DNSCredential.vue:71 +#: src/views/dns/DNSDomainList.vue:211 #: src/views/namespace/columns.ts:97 #: src/views/nginx_log/NginxLogList.vue:338 #: src/views/node/nodeColumns.tsx:96 @@ -227,6 +230,10 @@ msgstr "" msgid "Add Location" msgstr "" +#: src/views/dns/DNSRecordManager.vue:171 +msgid "Add Record" +msgstr "" + #: src/components/NgxConfigEditor/NgxServer.vue:92 msgid "Add Server" msgstr "" @@ -248,7 +255,7 @@ msgstr "" msgid "Added successfully" msgstr "" -#: src/views/certificate/components/DNSChallenge.vue:97 +#: src/views/dns/components/DNSChallenge.vue:98 msgid "Additional" msgstr "" @@ -285,6 +292,10 @@ msgstr "" msgid "Afterwards, refresh this page and click add passkey again." msgstr "" +#: src/views/dns/components/DNSRecordFilter.vue:55 +msgid "All" +msgstr "" + #: src/views/system/Licenses.vue:152 msgid "All Components" msgstr "" @@ -318,7 +329,7 @@ msgstr "" msgid "API Base Url" msgstr "" -#: src/views/certificate/components/DNSChallenge.vue:70 +#: src/views/dns/components/DNSChallenge.vue:71 msgid "API Document" msgstr "" @@ -354,6 +365,10 @@ msgstr "" msgid "Are you sure to delete this passkey immediately?" msgstr "" +#: src/views/dns/components/DNSRecordTable.vue:90 +msgid "Are you sure to delete this record?" +msgstr "" + #: src/views/preference/components/AuthSettings/RecoveryCodes.vue:155 msgid "Are you sure to generate new recovery codes?" msgstr "" @@ -526,6 +541,7 @@ msgstr "" #: src/views/config/components/ConfigLeftPanel.vue:274 #: src/views/config/ConfigList.vue:120 #: src/views/config/ConfigList.vue:217 +#: src/views/dns/DNSRecordManager.vue:223 #: src/views/nginx_log/NginxLog.vue:129 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:183 #: src/views/stream/components/StreamEditor.vue:147 @@ -672,6 +688,10 @@ msgstr "" msgid "Browser Statistics" msgstr "" +#: src/views/dns/DNSDomainList.vue:257 +msgid "Business contact:" +msgstr "" + #: src/views/nginx_log/components/IndexingSettingsModal.vue:316 msgid "By enabling advanced indexing, you acknowledge that your system meets the requirements and understand the performance implications. This will start indexing existing log files immediately." msgstr "" @@ -733,6 +753,8 @@ msgstr "" #: src/language/curd.ts:37 #: src/views/config/components/Delete.vue:98 #: src/views/dashboard/components/SiteHealthCheckModal.vue:710 +#: src/views/dns/DDNSManager.vue:244 +#: src/views/dns/DNSRecordManager.vue:212 #: src/views/nginx_log/components/IndexingSettingsModal.vue:102 #: src/views/nginx_log/indexing/IndexManagement.vue:33 #: src/views/nginx_log/indexing/IndexManagement.vue:59 @@ -879,7 +901,7 @@ msgstr "" msgid "Certificates" msgstr "" -#: src/routes/modules/certificates.ts:36 +#: src/routes/modules/certificates.ts:28 msgid "Certificates List" msgstr "" @@ -1189,7 +1211,7 @@ msgstr "" msgid "Config Template" msgstr "" -#: src/views/certificate/DNSCredential.vue:52 +#: src/views/dns/DNSCredential.vue:52 msgid "Configuration" msgstr "" @@ -1217,6 +1239,14 @@ msgstr "" msgid "Configurations" msgstr "" +#: src/views/dns/DDNSManager.vue:201 +msgid "Configure" +msgstr "" + +#: src/views/dns/DDNSManager.vue:211 +msgid "Configure DDNS" +msgstr "" + #: src/views/site/site_add/SiteAdd.vue:81 msgid "Configure SSL" msgstr "" @@ -1339,6 +1369,10 @@ msgstr "" msgid "Create Folder" msgstr "" +#: src/views/dns/DNSRecordManager.vue:200 +msgid "Create Record" +msgstr "" + #: src/views/backup/components/BackupCreator.vue:75 msgid "Create system backups including Nginx configuration and Nginx UI settings. Backup files will be automatically downloaded to your computer." msgstr "" @@ -1360,11 +1394,14 @@ msgstr "" msgid "Creating client facilitates communication with the CA server" msgstr "" -#: src/components/AutoCertForm/DNSChallenge.vue:105 +#: src/components/AutoCertForm/DNSChallenge.vue:131 +#: src/views/dns/DDNSManager.vue:65 +#: src/views/dns/DNSDomainList.vue:109 msgid "Credential" msgstr "" -#: src/views/certificate/components/DNSChallenge.vue:86 +#: src/routes/modules/dns.ts:20 +#: src/views/dns/components/DNSChallenge.vue:87 msgid "Credentials" msgstr "" @@ -1478,6 +1515,18 @@ msgstr "" msgid "Db file not found" msgstr "" +#: src/routes/modules/dns.ts:36 +msgid "DDNS" +msgstr "" + +#: src/views/dns/DDNSManager.vue:153 +msgid "DDNS Overview" +msgstr "" + +#: src/views/dns/DDNSManager.vue:135 +msgid "DDNS saved" +msgstr "" + #: src/constants/errors/geolite.ts:12 msgid "Decompression succeeded but failed to delete compressed file: {0}" msgstr "" @@ -1503,6 +1552,7 @@ msgstr "" #: src/views/config/components/Delete.vue:65 #: src/views/config/components/Delete.vue:97 #: src/views/config/ConfigList.vue:199 +#: src/views/dns/components/DNSRecordTable.vue:94 #: src/views/site/site_list/SiteList.vue:100 #: src/views/stream/StreamList.vue:110 msgid "Delete" @@ -1747,6 +1797,7 @@ msgid "Disable stream %{name} from %{node} successfully" msgstr "" #: src/views/backup/AutoBackup/AutoBackup.vue:175 +#: src/views/dns/DDNSManager.vue:175 #: src/views/node/nodeColumns.tsx:60 #: src/views/node/nodeColumns.tsx:78 #: src/views/preference/tabs/HTTPSettings.vue:24 @@ -1774,16 +1825,37 @@ msgstr "" msgid "Disk IO" msgstr "" -#: src/routes/modules/certificates.ts:28 -#: src/views/certificate/DNSCredential.vue:79 +#: src/routes/modules/dns.ts:11 +msgid "DNS" +msgstr "" + +#: src/views/dns/DNSCredential.vue:79 msgid "DNS Credentials" msgstr "" -#: src/components/AutoCertForm/DNSChallenge.vue:95 -#: src/views/certificate/components/DNSChallenge.vue:59 +#: src/routes/modules/dns.ts:28 +#: src/views/dns/DNSDomainList.vue:228 +msgid "DNS Domains" +msgstr "" + +#: src/views/dns/components/DNSRecordTable.vue:81 +msgid "DNS Only" +msgstr "" + +#: src/components/AutoCertForm/DNSChallenge.vue:121 +#: src/views/dns/components/DNSChallenge.vue:60 msgid "DNS Provider" msgstr "" +#: src/views/dns/DNSDomainList.vue:244 +msgid "DNS Provider Support" +msgstr "" + +#: src/routes/modules/dns.ts:44 +#: src/views/dns/DNSRecordManager.vue:58 +msgid "DNS Records" +msgstr "" + #: src/views/dashboard/components/SiteHealthCheckModal.vue:678 msgid "DNS Resolver" msgstr "" @@ -1845,6 +1917,8 @@ msgid "Document Count" msgstr "" #: src/views/certificate/components/DNSIssueCertificate.vue:119 +#: src/views/dns/DDNSManager.vue:60 +#: src/views/dns/DNSDomainList.vue:98 msgid "Domain" msgstr "" @@ -1930,6 +2004,7 @@ msgid "EAB Key ID" msgstr "" #: src/language/curd.ts:8 +#: src/views/dns/components/DNSRecordTable.vue:87 msgid "Edit" msgstr "" @@ -1943,6 +2018,10 @@ msgstr "" msgid "Edit Configuration" msgstr "" +#: src/views/dns/DNSRecordManager.vue:200 +msgid "Edit Record" +msgstr "" + #: src/routes/modules/sites.ts:34 msgid "Edit Site" msgstr "" @@ -1993,6 +2072,10 @@ msgstr "" msgid "Enable compression for content transfer" msgstr "" +#: src/views/dns/DDNSManager.vue:218 +msgid "Enable DDNS" +msgstr "" + #: src/views/dashboard/components/SiteHealthCheckModal.vue:473 msgid "Enable Health Check" msgstr "" @@ -2080,6 +2163,7 @@ msgid "Enable TOTP" msgstr "" #: src/views/backup/AutoBackup/AutoBackup.vue:174 +#: src/views/dns/DDNSManager.vue:175 #: src/views/node/nodeColumns.tsx:69 #: src/views/node/nodeColumns.tsx:75 #: src/views/preference/components/ExternalNotify/columns.tsx:47 @@ -3010,14 +3094,19 @@ msgstr "" msgid "History" msgstr "" -#: src/routes/index.ts:52 +#: src/routes/index.ts:54 msgid "Home" msgstr "" +#: src/views/dns/components/DNSRecordFilter.vue:42 #: src/views/preference/tabs/ServerSettings.vue:19 msgid "Host" msgstr "" +#: src/views/dns/components/DNSRecordFilter.vue:45 +msgid "Host, e.g. @ or www" +msgstr "" + #: src/views/backup/AutoBackup/components/CronEditor.vue:159 #: src/views/nginx_log/dashboard/components/HourlyChart.vue:87 msgid "Hour" @@ -3075,7 +3164,7 @@ msgstr "" msgid "Import" msgstr "" -#: src/routes/modules/certificates.ts:54 +#: src/routes/modules/certificates.ts:46 #: src/views/certificate/CertificateEditor.vue:84 msgid "Import Certificate" msgstr "" @@ -3191,10 +3280,15 @@ msgstr "" msgid "Installation is not allowed after 10 minutes of system startup, please restart the Nginx UI." msgstr "" +#: src/views/dns/DDNSManager.vue:79 #: src/views/preference/tabs/LogrotateSettings.vue:26 msgid "Interval" msgstr "" +#: src/views/dns/DDNSManager.vue:232 +msgid "Interval (seconds)" +msgstr "" + #: src/views/certificate/ACMEUser.vue:166 msgid "Invalid" msgstr "" @@ -3419,6 +3513,10 @@ msgstr "" msgid "Last month" msgstr "" +#: src/views/dns/DDNSManager.vue:87 +msgid "Last run" +msgstr "" + #: src/views/dashboard/NginxDashBoard.vue:138 msgid "Last update" msgstr "" @@ -3669,6 +3767,10 @@ msgstr "" msgid "Manage Configs" msgstr "" +#: src/views/dns/DNSDomainList.vue:236 +msgid "Manage Records" +msgstr "" + #: src/routes/modules/sites.ts:10 #: src/views/site/site_list/SiteList.vue:45 msgid "Manage Sites" @@ -3843,7 +3945,7 @@ msgstr "" msgid "Modify" msgstr "" -#: src/routes/modules/certificates.ts:44 +#: src/routes/modules/certificates.ts:36 #: src/views/certificate/CertificateEditor.vue:84 msgid "Modify Certificate" msgstr "" @@ -3904,11 +4006,13 @@ msgstr "" #: src/views/certificate/components/CertificateBasicInfo.vue:44 #: src/views/certificate/components/CertificateBasicInfo.vue:58 #: src/views/certificate/components/CertificateBasicInfo.vue:70 -#: src/views/certificate/DNSCredential.vue:17 #: src/views/config/components/ConfigRightPanel/Basic.vue:34 #: src/views/config/components/Delete.vue:123 #: src/views/config/components/Mkdir.vue:64 #: src/views/config/configColumns.tsx:17 +#: src/views/dns/components/DNSRecordForm.vue:63 +#: src/views/dns/components/DNSRecordTable.vue:17 +#: src/views/dns/DNSCredential.vue:17 #: src/views/namespace/columns.ts:9 #: src/views/nginx_log/NginxLogList.vue:155 #: src/views/node/nodeColumns.tsx:8 @@ -3942,6 +4046,10 @@ msgstr "" msgid "Namespaces" msgstr "" +#: src/views/dns/DNSDomainList.vue:251 +msgid "Need more DNS providers? Support us through donations or contact us for commercial collaboration" +msgstr "" + #: src/views/dashboard/NginxDashBoard.vue:195 msgid "Need to enable the stub_status module" msgstr "" @@ -4335,6 +4443,10 @@ msgstr "" msgid "Not Loaded" msgstr "" +#: src/views/dns/DDNSManager.vue:102 +msgid "Not run yet" +msgstr "" + #: src/components/AutoCertForm/AutoCertForm.vue:230 msgid "Not supported for IP certificates" msgstr "" @@ -4344,7 +4456,7 @@ msgid "Not Valid Before: %{date}" msgstr "" #: src/components/AutoCertForm/AutoCertForm.vue:150 -#: src/views/certificate/DNSCredential.vue:89 +#: src/views/dns/DNSCredential.vue:89 msgid "Note" msgstr "" @@ -4463,10 +4575,6 @@ msgstr "" msgid "On" msgstr "" -#: src/views/certificate/DNSCredential.vue:99 -msgid "Once the verification is complete, the records will be removed." -msgstr "" - #: src/components/NamespaceTabs/NamespaceTabs.vue:164 #: src/components/NodeCard/NodeCard.vue:51 #: src/components/NodeSelector/NodeSelector.vue:65 @@ -4748,7 +4856,7 @@ msgstr "" msgid "Please fill in required S3 configuration fields" msgstr "" -#: src/views/certificate/DNSCredential.vue:93 +#: src/views/dns/DNSCredential.vue:93 msgid "Please fill in the API authentication credentials provided by your DNS provider." msgstr "" @@ -4797,7 +4905,7 @@ msgstr "" msgid "Please log in." msgstr "" -#: src/views/certificate/DNSCredential.vue:102 +#: src/views/dns/DNSCredential.vue:96 msgid "Please note that the unit of time configurations below are all in seconds." msgstr "" @@ -4882,6 +4990,11 @@ msgstr "" msgid "Preparing lego configurations" msgstr "" +#: src/views/dns/components/DNSRecordForm.vue:81 +#: src/views/dns/components/DNSRecordTable.vue:33 +msgid "Priority" +msgstr "" + #: src/components/AutoCertForm/AutoCertForm.vue:206 msgid "Private CA:" msgstr "" @@ -4939,7 +5052,10 @@ msgstr "" msgid "Protocol configuration only takes effect when directly connecting. If using reverse proxy, please configure the protocol separately in the reverse proxy." msgstr "" -#: src/views/certificate/DNSCredential.vue:26 +#: src/views/dns/DDNSManager.vue:70 +#: src/views/dns/DNSCredential.vue:26 +#: src/views/dns/DNSDomainList.vue:177 +#: src/views/dns/DNSDomainList.vue:198 msgid "Provider" msgstr "" @@ -4951,6 +5067,12 @@ msgstr "" msgid "Province / Region" msgstr "" +#: src/views/dns/components/DNSRecordForm.vue:87 +#: src/views/dns/components/DNSRecordTable.vue:51 +#: src/views/dns/components/DNSRecordTable.vue:81 +msgid "Proxied" +msgstr "" + #: src/views/certificate/ACMEUser.vue:63 msgid "Proxy" msgstr "" @@ -5047,6 +5169,22 @@ msgstr "" msgid "Recommended:" msgstr "" +#: src/views/dns/DNSRecordManager.vue:113 +msgid "Record created" +msgstr "" + +#: src/views/dns/DNSRecordManager.vue:120 +msgid "Record deleted" +msgstr "" + +#: src/views/dns/DNSRecordManager.vue:109 +msgid "Record updated" +msgstr "" + +#: src/views/dns/DDNSManager.vue:221 +msgid "Records" +msgstr "" + #: src/components/TwoFA/Authorization.vue:79 msgid "Recovery" msgstr "" @@ -5073,6 +5211,8 @@ msgid "Referer" msgstr "" #: src/language/curd.ts:70 +#: src/views/dns/DDNSManager.vue:161 +#: src/views/dns/DNSRecordManager.vue:165 msgid "Refresh" msgstr "" @@ -5317,6 +5457,7 @@ msgid "Requests Per Connection" msgstr "" #: src/language/curd.ts:13 +#: src/views/dns/components/DNSRecordFilter.vue:65 #: src/views/nginx_log/structured/components/SearchFilters.vue:214 #: src/views/nginx_log/structured/StructuredLogViewer.vue:745 msgid "Reset" @@ -5548,6 +5689,8 @@ msgstr "" #: src/views/config/components/ConfigLeftPanel.vue:283 #: src/views/config/components/ConfigName.vue:58 #: src/views/dashboard/components/SiteHealthCheckModal.vue:713 +#: src/views/dns/DDNSManager.vue:247 +#: src/views/dns/DNSRecordManager.vue:215 #: src/views/preference/components/AuthSettings/Passkey.vue:131 #: src/views/preference/Preference.vue:124 #: src/views/site/site_edit/components/ConfigName/ConfigName.vue:52 @@ -5655,13 +5798,14 @@ msgstr "" msgid "Schedule Type" msgstr "" -#: src/views/certificate/components/DNSChallenge.vue:77 +#: src/views/dns/components/DNSChallenge.vue:78 msgid "SDK" msgstr "" #: src/language/constants.ts:62 #: src/language/curd.ts:12 #: src/views/config/configColumns.tsx:5 +#: src/views/dns/components/DNSRecordFilter.vue:62 #: src/views/nginx_log/structured/components/SearchFilters.vue:217 #: src/views/site/site_list/columns.tsx:17 #: src/views/stream/columns.tsx:13 @@ -5717,10 +5861,18 @@ msgstr "" msgid "Select all" msgstr "" +#: src/language/constants.ts:68 +msgid "Select Credential" +msgstr "" + #: src/views/certificate/ACMEUser.vue:45 msgid "Select or enter a CA directory URL" msgstr "" +#: src/language/constants.ts:67 +msgid "Select Provider" +msgstr "" + #: src/language/curd.ts:59 msgid "Selected {count} files" msgstr "" @@ -6032,6 +6184,7 @@ msgstr "" #: src/views/certificate/ACMEUser.vue:75 #: src/views/certificate/CertificateList/certColumns.tsx:63 #: src/views/dashboard/components/ModulesTable.vue:75 +#: src/views/dns/DDNSManager.vue:75 #: src/views/nginx_log/structured/components/SearchFilters.vue:106 #: src/views/nginx_log/structured/StructuredLogViewer.vue:241 #: src/views/nginx_log/structured/StructuredLogViewer.vue:521 @@ -6260,6 +6413,10 @@ msgstr "" msgid "System restored successfully." msgstr "" +#: src/views/dns/DDNSManager.vue:83 +msgid "Targets" +msgstr "" + #: src/constants/errors/self_check.ts:3 msgid "Task is not fixable" msgstr "" @@ -6680,6 +6837,14 @@ msgstr "" msgid "Try adjusting your search criteria or time range." msgstr "" +#: src/views/dns/components/DNSRecordTable.vue:29 +msgid "TTL" +msgstr "" + +#: src/views/dns/components/DNSRecordForm.vue:78 +msgid "TTL (seconds)" +msgstr "" + #: src/views/backup/AutoBackup/components/CronEditor.vue:28 msgid "Tuesday" msgstr "" @@ -6692,6 +6857,9 @@ msgstr "" #: src/views/certificate/CertificateList/certColumns.tsx:24 #: src/views/config/components/Delete.vue:122 #: src/views/dashboard/components/ModulesTable.vue:62 +#: src/views/dns/components/DNSRecordFilter.vue:49 +#: src/views/dns/components/DNSRecordForm.vue:57 +#: src/views/dns/components/DNSRecordTable.vue:21 #: src/views/nginx_log/NginxLogList.vue:146 #: src/views/notification/notificationColumns.tsx:8 #: src/views/preference/components/ExternalNotify/columns.tsx:19 @@ -6702,6 +6870,10 @@ msgstr "" msgid "Type %{delete} to confirm" msgstr "" +#: src/views/dns/DDNSManager.vue:228 +msgid "Type or select A/AAAA records" +msgstr "" + #: src/views/nginx_log/structured/components/SearchFilters.vue:142 msgid "Type or select browser" msgstr "" @@ -6757,9 +6929,10 @@ msgstr "" #: src/views/backup/AutoBackup/AutoBackup.vue:236 #: src/views/certificate/ACMEUser.vue:124 -#: src/views/certificate/DNSCredential.vue:65 #: src/views/config/components/ConfigRightPanel/Basic.vue:54 #: src/views/config/configColumns.tsx:44 +#: src/views/dns/DNSCredential.vue:65 +#: src/views/dns/DNSDomainList.vue:205 #: src/views/namespace/columns.ts:91 #: src/views/node/nodeColumns.tsx:89 #: src/views/site/site_edit/components/RightPanel/Basic.vue:39 @@ -6839,6 +7012,10 @@ msgstr "" msgid "URL" msgstr "" +#: src/views/dns/components/DNSRecordForm.vue:64 +msgid "Use @ for root" +msgstr "" + #: src/components/TwoFA/Authorization.vue:121 msgid "Use OTP" msgstr "" @@ -6906,6 +7083,8 @@ msgid "Validate SSL Certificate" msgstr "" #: src/views/dashboard/components/PerformanceTablesCard.vue:22 +#: src/views/dns/components/DNSRecordForm.vue:66 +#: src/views/dns/components/DNSRecordTable.vue:25 msgid "Value" msgstr "" @@ -6994,10 +7173,6 @@ msgstr "" msgid "We do not accept any feature requests" msgstr "" -#: src/views/certificate/DNSCredential.vue:96 -msgid "We will add one or more TXT records to the DNS records of your domain for ownership verification." -msgstr "" - #: src/views/site/site_edit/components/Cert/ObtainCert.vue:142 msgid "We will remove the HTTPChallenge configuration from this file and reload the Nginx. Are you sure you want to continue?" msgstr "" @@ -7030,6 +7205,11 @@ msgstr "" msgid "Weekly on %{day} at %{time}" msgstr "" +#: src/views/dns/components/DNSRecordForm.vue:84 +#: src/views/dns/components/DNSRecordTable.vue:37 +msgid "Weight" +msgstr "" + #: src/views/certificate/ACMEUser.vue:119 msgid "When Enabled, Nginx UI will automatically re-register users upon startup. Generally, do not enable this unless you are in a dev environment and using Pebble as CA." msgstr "" @@ -7067,7 +7247,7 @@ msgid "Workers" msgstr "" #: src/layouts/HeaderLayout.vue:61 -#: src/routes/index.ts:61 +#: src/routes/index.ts:63 #: src/views/workspace/WorkSpace.vue:51 msgid "Workspace" msgstr "" diff --git a/app/src/language/pt_PT/app.po b/app/src/language/pt_PT/app.po index 854c8a10..0f8268e7 100644 --- a/app/src/language/pt_PT/app.po +++ b/app/src/language/pt_PT/app.po @@ -187,8 +187,10 @@ msgstr "Acção" #: src/views/backup/AutoBackup/AutoBackup.vue:273 #: src/views/certificate/ACMEUser.vue:131 #: src/views/certificate/CertificateList/certColumns.tsx:92 -#: src/views/certificate/DNSCredential.vue:71 -#: src/views/config/configColumns.tsx:51 src/views/namespace/columns.ts:97 +#: src/views/config/configColumns.tsx:51 +#: src/views/dns/components/DNSRecordTable.vue:41 +#: src/views/dns/DDNSManager.vue:91 src/views/dns/DNSCredential.vue:71 +#: src/views/dns/DNSDomainList.vue:211 src/views/namespace/columns.ts:97 #: src/views/nginx_log/NginxLogList.vue:338 src/views/node/nodeColumns.tsx:96 #: src/views/notification/notificationColumns.tsx:72 #: src/views/preference/components/ExternalNotify/columns.tsx:85 @@ -242,6 +244,10 @@ msgstr "Adicionar cabeçalho" msgid "Add Location" msgstr "Adicionar Local" +#: src/views/dns/DNSRecordManager.vue:171 +msgid "Add Record" +msgstr "Adicionar registo" + #: src/components/NgxConfigEditor/NgxServer.vue:92 msgid "Add Server" msgstr "Adicionar servidor" @@ -262,7 +268,7 @@ msgstr "Adicionar upstream" msgid "Added successfully" msgstr "Adicionado com sucesso" -#: src/views/certificate/components/DNSChallenge.vue:97 +#: src/views/dns/components/DNSChallenge.vue:98 msgid "Additional" msgstr "Adicional" @@ -303,6 +309,10 @@ msgstr "" "Depois, atualize esta página e clique em adicionar chave de acesso " "novamente." +#: src/views/dns/components/DNSRecordFilter.vue:55 +msgid "All" +msgstr "Todos" + #: src/views/system/Licenses.vue:152 msgid "All Components" msgstr "Todos os componentes" @@ -346,7 +356,7 @@ msgstr "" msgid "API Base Url" msgstr "Url Base da API" -#: src/views/certificate/components/DNSChallenge.vue:70 +#: src/views/dns/components/DNSChallenge.vue:71 msgid "API Document" msgstr "Documento da API" @@ -382,6 +392,10 @@ msgstr "Tem certeza que pretende eliminar este IP banido imediatamente?" msgid "Are you sure to delete this passkey immediately?" msgstr "Tem a certeza de que deseja eliminar imediatamente esta chave de acesso?" +#: src/views/dns/components/DNSRecordTable.vue:90 +msgid "Are you sure to delete this record?" +msgstr "Tem a certeza de que pretende eliminar este registo?" + #: src/views/preference/components/AuthSettings/RecoveryCodes.vue:155 msgid "Are you sure to generate new recovery codes?" msgstr "Tem a certeza que deseja gerar novos códigos de recuperação?" @@ -555,7 +569,7 @@ msgstr "Méd./PV" #: src/views/certificate/components/CertificateActions.vue:22 #: src/views/config/components/ConfigLeftPanel.vue:274 #: src/views/config/ConfigList.vue:120 src/views/config/ConfigList.vue:217 -#: src/views/nginx_log/NginxLog.vue:129 +#: src/views/dns/DNSRecordManager.vue:223 src/views/nginx_log/NginxLog.vue:129 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:183 #: src/views/stream/components/StreamEditor.vue:147 msgid "Back" @@ -709,6 +723,10 @@ msgstr "Navegador" msgid "Browser Statistics" msgstr "Estatísticas do navegador" +#: src/views/dns/DNSDomainList.vue:257 +msgid "Business contact:" +msgstr "Contacto comercial:" + #: src/views/nginx_log/components/IndexingSettingsModal.vue:316 msgid "" "By enabling advanced indexing, you acknowledge that your system meets the " @@ -779,6 +797,7 @@ msgstr "" #: src/components/NgxConfigEditor/NgxUpstream.vue:32 src/language/curd.ts:37 #: src/views/config/components/Delete.vue:98 #: src/views/dashboard/components/SiteHealthCheckModal.vue:710 +#: src/views/dns/DDNSManager.vue:244 src/views/dns/DNSRecordManager.vue:212 #: src/views/nginx_log/components/IndexingSettingsModal.vue:102 #: src/views/nginx_log/indexing/IndexManagement.vue:33 #: src/views/nginx_log/indexing/IndexManagement.vue:59 @@ -927,7 +946,7 @@ msgstr "Tipo de certificado" msgid "Certificates" msgstr "Certificados" -#: src/routes/modules/certificates.ts:36 +#: src/routes/modules/certificates.ts:28 msgid "Certificates List" msgstr "Lista de Certificados" @@ -1310,7 +1329,7 @@ msgstr "O caminho de configuração está vazio" msgid "Config Template" msgstr "Modelo de Configuração" -#: src/views/certificate/DNSCredential.vue:52 +#: src/views/dns/DNSCredential.vue:52 msgid "Configuration" msgstr "Configuração" @@ -1340,6 +1359,14 @@ msgstr "Nome da Configuração" msgid "Configurations" msgstr "Configurações" +#: src/views/dns/DDNSManager.vue:201 +msgid "Configure" +msgstr "Configurar" + +#: src/views/dns/DDNSManager.vue:211 +msgid "Configure DDNS" +msgstr "Configurar DDNS" + #: src/views/site/site_add/SiteAdd.vue:81 msgid "Configure SSL" msgstr "Configurar SSL" @@ -1463,6 +1490,10 @@ msgstr "Criar Ficheiro" msgid "Create Folder" msgstr "Criar Pasta" +#: src/views/dns/DNSRecordManager.vue:200 +msgid "Create Record" +msgstr "Criar registo" + #: src/views/backup/components/BackupCreator.vue:75 msgid "" "Create system backups including Nginx configuration and Nginx UI settings. " @@ -1489,11 +1520,12 @@ msgstr "Criado com sucesso" msgid "Creating client facilitates communication with the CA server" msgstr "Criar cliente facilita comunicação com o servidor CA" -#: src/components/AutoCertForm/DNSChallenge.vue:105 +#: src/components/AutoCertForm/DNSChallenge.vue:131 +#: src/views/dns/DDNSManager.vue:65 src/views/dns/DNSDomainList.vue:109 msgid "Credential" msgstr "Credencial" -#: src/views/certificate/components/DNSChallenge.vue:86 +#: src/routes/modules/dns.ts:20 src/views/dns/components/DNSChallenge.vue:87 msgid "Credentials" msgstr "Credenciais" @@ -1608,6 +1640,18 @@ msgstr "Dias" msgid "Db file not found" msgstr "Ficheiro da base de dados não encontrado" +#: src/routes/modules/dns.ts:36 +msgid "DDNS" +msgstr "DDNS" + +#: src/views/dns/DDNSManager.vue:153 +msgid "DDNS Overview" +msgstr "Visão Geral do DDNS" + +#: src/views/dns/DDNSManager.vue:135 +msgid "DDNS saved" +msgstr "DDNS guardado" + #: src/constants/errors/geolite.ts:12 msgid "Decompression succeeded but failed to delete compressed file: {0}" msgstr "Descompressão bem-sucedida, mas falha ao eliminar o ficheiro comprimido: {0}" @@ -1634,6 +1678,7 @@ msgstr "" #: src/views/config/components/Delete.vue:65 #: src/views/config/components/Delete.vue:97 #: src/views/config/ConfigList.vue:199 +#: src/views/dns/components/DNSRecordTable.vue:94 #: src/views/site/site_list/SiteList.vue:100 #: src/views/stream/StreamList.vue:110 msgid "Delete" @@ -1875,7 +1920,8 @@ msgid "Disable stream %{name} from %{node} successfully" msgstr "Desativar o fluxo %{name} de %{node} com sucesso" #: src/views/backup/AutoBackup/AutoBackup.vue:175 -#: src/views/node/nodeColumns.tsx:60 src/views/node/nodeColumns.tsx:78 +#: src/views/dns/DDNSManager.vue:175 src/views/node/nodeColumns.tsx:60 +#: src/views/node/nodeColumns.tsx:78 #: src/views/preference/tabs/HTTPSettings.vue:24 #: src/views/preference/tabs/NodeSettings.vue:25 #: src/views/preference/tabs/NodeSettings.vue:30 @@ -1900,16 +1946,35 @@ msgstr "Desconectado" msgid "Disk IO" msgstr "E/S de Disco" -#: src/routes/modules/certificates.ts:28 -#: src/views/certificate/DNSCredential.vue:79 +#: src/routes/modules/dns.ts:11 +msgid "DNS" +msgstr "DNS" + +#: src/views/dns/DNSCredential.vue:79 msgid "DNS Credentials" msgstr "Credenciais DNS" -#: src/components/AutoCertForm/DNSChallenge.vue:95 -#: src/views/certificate/components/DNSChallenge.vue:59 +#: src/routes/modules/dns.ts:28 src/views/dns/DNSDomainList.vue:228 +msgid "DNS Domains" +msgstr "Domínios DNS" + +#: src/views/dns/components/DNSRecordTable.vue:81 +msgid "DNS Only" +msgstr "Apenas DNS" + +#: src/components/AutoCertForm/DNSChallenge.vue:121 +#: src/views/dns/components/DNSChallenge.vue:60 msgid "DNS Provider" msgstr "Provedor DNS" +#: src/views/dns/DNSDomainList.vue:244 +msgid "DNS Provider Support" +msgstr "Suporte de provedor de DNS" + +#: src/routes/modules/dns.ts:44 src/views/dns/DNSRecordManager.vue:58 +msgid "DNS Records" +msgstr "Registros DNS" + #: src/views/dashboard/components/SiteHealthCheckModal.vue:678 msgid "DNS Resolver" msgstr "Resolvedor DNS" @@ -1970,6 +2035,7 @@ msgid "Document Count" msgstr "Contagem de documentos" #: src/views/certificate/components/DNSIssueCertificate.vue:119 +#: src/views/dns/DDNSManager.vue:60 src/views/dns/DNSDomainList.vue:98 msgid "Domain" msgstr "Domínio" @@ -2058,7 +2124,7 @@ msgstr "Chave HMAC EAB" msgid "EAB Key ID" msgstr "ID da chave EAB" -#: src/language/curd.ts:8 +#: src/language/curd.ts:8 src/views/dns/components/DNSRecordTable.vue:87 msgid "Edit" msgstr "Editar" @@ -2072,6 +2138,10 @@ msgstr "Editar %{n}" msgid "Edit Configuration" msgstr "Editar Configuração" +#: src/views/dns/DNSRecordManager.vue:200 +msgid "Edit Record" +msgstr "Editar registo" + #: src/routes/modules/sites.ts:34 msgid "Edit Site" msgstr "Editar Site" @@ -2122,6 +2192,10 @@ msgstr "Ativar conclusão de código" msgid "Enable compression for content transfer" msgstr "Ativar compressão para transferência de conteúdo" +#: src/views/dns/DDNSManager.vue:218 +msgid "Enable DDNS" +msgstr "Ativar DDNS" + #: src/views/dashboard/components/SiteHealthCheckModal.vue:473 msgid "Enable Health Check" msgstr "Ativar verificação de saúde" @@ -2209,7 +2283,8 @@ msgid "Enable TOTP" msgstr "Ativar TOTP" #: src/views/backup/AutoBackup/AutoBackup.vue:174 -#: src/views/node/nodeColumns.tsx:69 src/views/node/nodeColumns.tsx:75 +#: src/views/dns/DDNSManager.vue:175 src/views/node/nodeColumns.tsx:69 +#: src/views/node/nodeColumns.tsx:75 #: src/views/preference/components/ExternalNotify/columns.tsx:47 #: src/views/preference/tabs/HTTPSettings.vue:24 #: src/views/preference/tabs/LogrotateSettings.vue:20 @@ -3177,14 +3252,19 @@ msgstr "Um valor mais alto significa uma melhor reutilização da conexão" msgid "History" msgstr "Histórico" -#: src/routes/index.ts:52 +#: src/routes/index.ts:54 msgid "Home" msgstr "Início" +#: src/views/dns/components/DNSRecordFilter.vue:42 #: src/views/preference/tabs/ServerSettings.vue:19 msgid "Host" msgstr "Host" +#: src/views/dns/components/DNSRecordFilter.vue:45 +msgid "Host, e.g. @ or www" +msgstr "Host, por ex. @ ou www" + #: src/views/backup/AutoBackup/components/CronEditor.vue:159 #: src/views/nginx_log/dashboard/components/HourlyChart.vue:87 msgid "Hour" @@ -3259,7 +3339,7 @@ msgstr "" msgid "Import" msgstr "Importar" -#: src/routes/modules/certificates.ts:54 +#: src/routes/modules/certificates.ts:46 #: src/views/certificate/CertificateEditor.vue:84 msgid "Import Certificate" msgstr "Importar Certificados" @@ -3382,10 +3462,15 @@ msgstr "" "A instalação não é permitida após 10 minutos do arranque do sistema, por " "favor reinicie a interface Nginx." +#: src/views/dns/DDNSManager.vue:79 #: src/views/preference/tabs/LogrotateSettings.vue:26 msgid "Interval" msgstr "Intervalo" +#: src/views/dns/DDNSManager.vue:232 +msgid "Interval (seconds)" +msgstr "Intervalo (segundos)" + #: src/views/certificate/ACMEUser.vue:166 msgid "Invalid" msgstr "Inválido" @@ -3614,6 +3699,10 @@ msgstr "Última indexação" msgid "Last month" msgstr "Mês passado" +#: src/views/dns/DDNSManager.vue:87 +msgid "Last run" +msgstr "Última execução" + #: src/views/dashboard/NginxDashBoard.vue:138 msgid "Last update" msgstr "Última atualização" @@ -3883,6 +3972,10 @@ msgstr "" msgid "Manage Configs" msgstr "Gerir Configurações" +#: src/views/dns/DNSDomainList.vue:236 +msgid "Manage Records" +msgstr "Gerir registos" + #: src/routes/modules/sites.ts:10 src/views/site/site_list/SiteList.vue:45 msgid "Manage Sites" msgstr "Gerir Sites" @@ -4053,7 +4146,7 @@ msgstr "Modificado em" msgid "Modify" msgstr "Modificar" -#: src/routes/modules/certificates.ts:44 +#: src/routes/modules/certificates.ts:36 #: src/views/certificate/CertificateEditor.vue:84 msgid "Modify Certificate" msgstr "Modificar Certificado" @@ -4114,11 +4207,13 @@ msgstr "N/D" #: src/views/certificate/components/CertificateBasicInfo.vue:44 #: src/views/certificate/components/CertificateBasicInfo.vue:58 #: src/views/certificate/components/CertificateBasicInfo.vue:70 -#: src/views/certificate/DNSCredential.vue:17 #: src/views/config/components/ConfigRightPanel/Basic.vue:34 #: src/views/config/components/Delete.vue:123 #: src/views/config/components/Mkdir.vue:64 -#: src/views/config/configColumns.tsx:17 src/views/namespace/columns.ts:9 +#: src/views/config/configColumns.tsx:17 +#: src/views/dns/components/DNSRecordForm.vue:63 +#: src/views/dns/components/DNSRecordTable.vue:17 +#: src/views/dns/DNSCredential.vue:17 src/views/namespace/columns.ts:9 #: src/views/nginx_log/NginxLogList.vue:155 src/views/node/nodeColumns.tsx:8 #: src/views/preference/components/AuthSettings/AddPasskey.vue:81 #: src/views/site/site_edit/components/RightPanel/Basic.vue:36 @@ -4146,6 +4241,14 @@ msgstr "Espaço de nomes" msgid "Namespaces" msgstr "Espaços de nomes" +#: src/views/dns/DNSDomainList.vue:251 +msgid "" +"Need more DNS providers? Support us through donations or contact us for " +"commercial collaboration" +msgstr "" +"Precisa de mais fornecedores de DNS? Apoie-nos através de doações ou " +"contacte-nos para colaboração comercial" + #: src/views/dashboard/NginxDashBoard.vue:195 msgid "Need to enable the stub_status module" msgstr "É necessário ativar o módulo stub_status" @@ -4540,6 +4643,10 @@ msgstr "Não indexado" msgid "Not Loaded" msgstr "Não carregado" +#: src/views/dns/DDNSManager.vue:102 +msgid "Not run yet" +msgstr "Ainda não executado" + #: src/components/AutoCertForm/AutoCertForm.vue:230 msgid "Not supported for IP certificates" msgstr "Não suportado para certificados de IP" @@ -4549,7 +4656,7 @@ msgid "Not Valid Before: %{date}" msgstr "Não Válido Antes de: %{date}" #: src/components/AutoCertForm/AutoCertForm.vue:150 -#: src/views/certificate/DNSCredential.vue:89 +#: src/views/dns/DNSCredential.vue:89 msgid "Note" msgstr "Nota" @@ -4681,10 +4788,6 @@ msgstr "OK" msgid "On" msgstr "Ligado" -#: src/views/certificate/DNSCredential.vue:99 -msgid "Once the verification is complete, the records will be removed." -msgstr "Assim que a verificação estiver concluída, os registos serão removidos." - #: src/components/NamespaceTabs/NamespaceTabs.vue:164 #: src/components/NodeCard/NodeCard.vue:51 #: src/components/NodeSelector/NodeSelector.vue:65 @@ -4977,7 +5080,7 @@ msgstr "Por favor, preencha todos os campos corretamente" msgid "Please fill in required S3 configuration fields" msgstr "Por favor, preencha os campos de configuração do S3 necessários" -#: src/views/certificate/DNSCredential.vue:93 +#: src/views/dns/DNSCredential.vue:93 msgid "" "Please fill in the API authentication credentials provided by your DNS " "provider." @@ -5044,7 +5147,7 @@ msgstr "Por favor introduza o seu nome de utilizador!" msgid "Please log in." msgstr "Por favor, faça login." -#: src/views/certificate/DNSCredential.vue:102 +#: src/views/dns/DNSCredential.vue:96 msgid "Please note that the unit of time configurations below are all in seconds." msgstr "Note que as definições da unidade de tempo abaixo estão todas em segundos." @@ -5126,6 +5229,11 @@ msgstr "Preferencia" msgid "Preparing lego configurations" msgstr "Preparando configurações lego" +#: src/views/dns/components/DNSRecordForm.vue:81 +#: src/views/dns/components/DNSRecordTable.vue:33 +msgid "Priority" +msgstr "Prioridade" + #: src/components/AutoCertForm/AutoCertForm.vue:206 msgid "Private CA:" msgstr "CA privada:" @@ -5189,7 +5297,8 @@ msgstr "" "estiver a usar um proxy inverso, configure o protocolo separadamente no " "proxy inverso." -#: src/views/certificate/DNSCredential.vue:26 +#: src/views/dns/DDNSManager.vue:70 src/views/dns/DNSCredential.vue:26 +#: src/views/dns/DNSDomainList.vue:177 src/views/dns/DNSDomainList.vue:198 msgid "Provider" msgstr "Provedor" @@ -5201,6 +5310,12 @@ msgstr "Fornecedor não encontrado: {0}" msgid "Province / Region" msgstr "Província / Região" +#: src/views/dns/components/DNSRecordForm.vue:87 +#: src/views/dns/components/DNSRecordTable.vue:51 +#: src/views/dns/components/DNSRecordTable.vue:81 +msgid "Proxied" +msgstr "Proxied" + #: src/views/certificate/ACMEUser.vue:63 msgid "Proxy" msgstr "Proxy" @@ -5295,6 +5410,22 @@ msgstr "Verificar novamente" msgid "Recommended:" msgstr "Recomendado:" +#: src/views/dns/DNSRecordManager.vue:113 +msgid "Record created" +msgstr "Registo criado" + +#: src/views/dns/DNSRecordManager.vue:120 +msgid "Record deleted" +msgstr "Registo eliminado" + +#: src/views/dns/DNSRecordManager.vue:109 +msgid "Record updated" +msgstr "Registo atualizado" + +#: src/views/dns/DDNSManager.vue:221 +msgid "Records" +msgstr "Registos" + #: src/components/TwoFA/Authorization.vue:79 msgid "Recovery" msgstr "Recuperação" @@ -5324,7 +5455,8 @@ msgstr "Mensagens de Redirecionamento (3xx)" msgid "Referer" msgstr "Referência" -#: src/language/curd.ts:70 +#: src/language/curd.ts:70 src/views/dns/DDNSManager.vue:161 +#: src/views/dns/DNSRecordManager.vue:165 msgid "Refresh" msgstr "Atualizar" @@ -5566,7 +5698,7 @@ msgstr "Solicitado com parâmetros errados" msgid "Requests Per Connection" msgstr "Pedidos por ligação" -#: src/language/curd.ts:13 +#: src/language/curd.ts:13 src/views/dns/components/DNSRecordFilter.vue:65 #: src/views/nginx_log/structured/components/SearchFilters.vue:214 #: src/views/nginx_log/structured/StructuredLogViewer.vue:745 msgid "Reset" @@ -5807,6 +5939,7 @@ msgstr "Sábado" #: src/views/config/components/ConfigLeftPanel.vue:283 #: src/views/config/components/ConfigName.vue:58 #: src/views/dashboard/components/SiteHealthCheckModal.vue:713 +#: src/views/dns/DDNSManager.vue:247 src/views/dns/DNSRecordManager.vue:215 #: src/views/preference/components/AuthSettings/Passkey.vue:131 #: src/views/preference/Preference.vue:124 #: src/views/site/site_edit/components/ConfigName/ConfigName.vue:52 @@ -5914,12 +6047,13 @@ msgstr "Agendamento" msgid "Schedule Type" msgstr "Tipo de agendamento" -#: src/views/certificate/components/DNSChallenge.vue:77 +#: src/views/dns/components/DNSChallenge.vue:78 msgid "SDK" msgstr "SDK" #: src/language/constants.ts:62 src/language/curd.ts:12 #: src/views/config/configColumns.tsx:5 +#: src/views/dns/components/DNSRecordFilter.vue:62 #: src/views/nginx_log/structured/components/SearchFilters.vue:217 #: src/views/site/site_list/columns.tsx:17 src/views/stream/columns.tsx:13 msgid "Search" @@ -5978,10 +6112,18 @@ msgstr "" msgid "Select all" msgstr "Selecionar tudo" +#: src/language/constants.ts:68 +msgid "Select Credential" +msgstr "Selecionar credencial" + #: src/views/certificate/ACMEUser.vue:45 msgid "Select or enter a CA directory URL" msgstr "Selecione ou insira um URL de diretório CA" +#: src/language/constants.ts:67 +msgid "Select Provider" +msgstr "Selecionar fornecedor" + #: src/language/curd.ts:59 msgid "Selected {count} files" msgstr "{count} ficheiros selecionados" @@ -6311,6 +6453,7 @@ msgstr "Estático" #: src/views/certificate/ACMEUser.vue:75 #: src/views/certificate/CertificateList/certColumns.tsx:63 #: src/views/dashboard/components/ModulesTable.vue:75 +#: src/views/dns/DDNSManager.vue:75 #: src/views/nginx_log/structured/components/SearchFilters.vue:106 #: src/views/nginx_log/structured/StructuredLogViewer.vue:241 #: src/views/nginx_log/structured/StructuredLogViewer.vue:521 @@ -6542,6 +6685,10 @@ msgstr "Restauro do sistema" msgid "System restored successfully." msgstr "Sistema restaurado com sucesso." +#: src/views/dns/DDNSManager.vue:83 +msgid "Targets" +msgstr "Alvos" + #: src/constants/errors/self_check.ts:3 msgid "Task is not fixable" msgstr "A tarefa não é reparável" @@ -7091,6 +7238,14 @@ msgstr "" msgid "Try adjusting your search criteria or time range." msgstr "Tente ajustar os seus critérios de pesquisa ou o intervalo de tempo." +#: src/views/dns/components/DNSRecordTable.vue:29 +msgid "TTL" +msgstr "TTL" + +#: src/views/dns/components/DNSRecordForm.vue:78 +msgid "TTL (seconds)" +msgstr "TTL (segundos)" + #: src/views/backup/AutoBackup/components/CronEditor.vue:28 msgid "Tuesday" msgstr "Terça-feira" @@ -7103,6 +7258,9 @@ msgstr "Autenticação de dois fatores necessária" #: src/views/certificate/CertificateList/certColumns.tsx:24 #: src/views/config/components/Delete.vue:122 #: src/views/dashboard/components/ModulesTable.vue:62 +#: src/views/dns/components/DNSRecordFilter.vue:49 +#: src/views/dns/components/DNSRecordForm.vue:57 +#: src/views/dns/components/DNSRecordTable.vue:21 #: src/views/nginx_log/NginxLogList.vue:146 #: src/views/notification/notificationColumns.tsx:8 #: src/views/preference/components/ExternalNotify/columns.tsx:19 @@ -7113,6 +7271,10 @@ msgstr "Tipo" msgid "Type %{delete} to confirm" msgstr "Digite %{delete} para confirmar" +#: src/views/dns/DDNSManager.vue:228 +msgid "Type or select A/AAAA records" +msgstr "Digite ou selecione registros A/AAAA" + #: src/views/nginx_log/structured/components/SearchFilters.vue:142 msgid "Type or select browser" msgstr "Digite ou selecione o navegador" @@ -7168,9 +7330,9 @@ msgstr "Atualização bem-sucedida" #: src/views/backup/AutoBackup/AutoBackup.vue:236 #: src/views/certificate/ACMEUser.vue:124 -#: src/views/certificate/DNSCredential.vue:65 #: src/views/config/components/ConfigRightPanel/Basic.vue:54 -#: src/views/config/configColumns.tsx:44 src/views/namespace/columns.ts:91 +#: src/views/config/configColumns.tsx:44 src/views/dns/DNSCredential.vue:65 +#: src/views/dns/DNSDomainList.vue:205 src/views/namespace/columns.ts:91 #: src/views/node/nodeColumns.tsx:89 #: src/views/site/site_edit/components/RightPanel/Basic.vue:39 #: src/views/site/site_list/columns.tsx:113 src/views/stream/columns.tsx:80 @@ -7243,6 +7405,10 @@ msgstr "Uptime:" msgid "URL" msgstr "URL" +#: src/views/dns/components/DNSRecordForm.vue:64 +msgid "Use @ for root" +msgstr "Use @ para a raiz" + #: src/components/TwoFA/Authorization.vue:121 msgid "Use OTP" msgstr "Usar OTP" @@ -7308,6 +7474,8 @@ msgid "Validate SSL Certificate" msgstr "Validar certificado SSL" #: src/views/dashboard/components/PerformanceTablesCard.vue:22 +#: src/views/dns/components/DNSRecordForm.vue:66 +#: src/views/dns/components/DNSRecordTable.vue:25 msgid "Value" msgstr "Valor" @@ -7404,14 +7572,6 @@ msgstr "" msgid "We do not accept any feature requests" msgstr "Não aceitamos pedidos de funcionalidades" -#: src/views/certificate/DNSCredential.vue:96 -msgid "" -"We will add one or more TXT records to the DNS records of your domain for " -"ownership verification." -msgstr "" -"Adicionaremos um ou mais registos TXT aos registos DNS do seu domínio para " -"verificação de propriedade." - #: src/views/site/site_edit/components/Cert/ObtainCert.vue:142 msgid "" "We will remove the HTTPChallenge configuration from this file and reload " @@ -7448,6 +7608,11 @@ msgstr "Semanal" msgid "Weekly on %{day} at %{time}" msgstr "Semanalmente no %{day} às %{time}" +#: src/views/dns/components/DNSRecordForm.vue:84 +#: src/views/dns/components/DNSRecordTable.vue:37 +msgid "Weight" +msgstr "Peso" + #: src/views/certificate/ACMEUser.vue:119 msgid "" "When Enabled, Nginx UI will automatically re-register users upon startup. " @@ -7498,7 +7663,7 @@ msgstr "Processos de trabalho" msgid "Workers" msgstr "Workers" -#: src/layouts/HeaderLayout.vue:61 src/routes/index.ts:61 +#: src/layouts/HeaderLayout.vue:61 src/routes/index.ts:63 #: src/views/workspace/WorkSpace.vue:51 msgid "Workspace" msgstr "Espaço de Trabalho" @@ -7605,6 +7770,16 @@ msgstr "As suas chaves de acesso" msgid "Zero-allocation pipeline" msgstr "Pipeline sem alocação" +#~ msgid "Once the verification is complete, the records will be removed." +#~ msgstr "Assim que a verificação estiver concluída, os registos serão removidos." + +#~ msgid "" +#~ "We will add one or more TXT records to the DNS records of your domain for " +#~ "ownership verification." +#~ msgstr "" +#~ "Adicionaremos um ou mais registos TXT aos registos DNS do seu domínio para " +#~ "verificação de propriedade." + #~ msgid "Settings" #~ msgstr "Configurações" @@ -7626,9 +7801,6 @@ msgstr "Pipeline sem alocação" #~ msgid "Tested in isolated sandbox mode" #~ msgstr "Testado em modo sandbox isolado" -#~ msgid "All" -#~ msgstr "Todos" - #~ msgid "Based on M2 Pro (12 cores) testing" #~ msgstr "Com base em testes com M2 Pro (12 núcleos)" @@ -7833,9 +8005,6 @@ msgstr "Pipeline sem alocação" #~ msgid "Are you sure you want to apply to all selected?" #~ msgstr "Tem a certeza que deseja aplicar a todos os selecionados?" -#~ msgid "Are you sure you want to delete this item?" -#~ msgstr "Tem certeza que pretende eliminar este item?" - #~ msgid "Are you sure you want to recover this item?" #~ msgstr "Tem certeza que pretende recuperar este item?" diff --git a/app/src/language/ru_RU/app.po b/app/src/language/ru_RU/app.po index e4da3849..476fefdc 100644 --- a/app/src/language/ru_RU/app.po +++ b/app/src/language/ru_RU/app.po @@ -192,8 +192,10 @@ msgstr "Действие" #: src/views/backup/AutoBackup/AutoBackup.vue:273 #: src/views/certificate/ACMEUser.vue:131 #: src/views/certificate/CertificateList/certColumns.tsx:92 -#: src/views/certificate/DNSCredential.vue:71 -#: src/views/config/configColumns.tsx:51 src/views/namespace/columns.ts:97 +#: src/views/config/configColumns.tsx:51 +#: src/views/dns/components/DNSRecordTable.vue:41 +#: src/views/dns/DDNSManager.vue:91 src/views/dns/DNSCredential.vue:71 +#: src/views/dns/DNSDomainList.vue:211 src/views/namespace/columns.ts:97 #: src/views/nginx_log/NginxLogList.vue:338 src/views/node/nodeColumns.tsx:96 #: src/views/notification/notificationColumns.tsx:72 #: src/views/preference/components/ExternalNotify/columns.tsx:85 @@ -247,6 +249,10 @@ msgstr "Добавить заголовок" msgid "Add Location" msgstr "Добавить Location" +#: src/views/dns/DNSRecordManager.vue:171 +msgid "Add Record" +msgstr "Добавить запись" + #: src/components/NgxConfigEditor/NgxServer.vue:92 msgid "Add Server" msgstr "Добавить сервер" @@ -267,7 +273,7 @@ msgstr "Добавить upstream" msgid "Added successfully" msgstr "Добавлено успешно" -#: src/views/certificate/components/DNSChallenge.vue:97 +#: src/views/dns/components/DNSChallenge.vue:98 msgid "Additional" msgstr "Дополнительно" @@ -306,6 +312,10 @@ msgstr "Дополнительные настройки" msgid "Afterwards, refresh this page and click add passkey again." msgstr "После этого обновите эту страницу и снова нажмите «Добавить ключ доступа»." +#: src/views/dns/components/DNSRecordFilter.vue:55 +msgid "All" +msgstr "Все" + #: src/views/system/Licenses.vue:152 msgid "All Components" msgstr "Все компоненты" @@ -347,7 +357,7 @@ msgstr "Любой доступный IP-адрес можно использо msgid "API Base Url" msgstr "Базовый URL API" -#: src/views/certificate/components/DNSChallenge.vue:70 +#: src/views/dns/components/DNSChallenge.vue:71 msgid "API Document" msgstr "API Документ" @@ -383,6 +393,10 @@ msgstr "Вы уверены, что хотите немедленно удали msgid "Are you sure to delete this passkey immediately?" msgstr "Вы уверены, что хотите немедленно удалить этот ключ доступа?" +#: src/views/dns/components/DNSRecordTable.vue:90 +msgid "Are you sure to delete this record?" +msgstr "Вы уверены, что хотите удалить эту запись?" + #: src/views/preference/components/AuthSettings/RecoveryCodes.vue:155 msgid "Are you sure to generate new recovery codes?" msgstr "Вы уверены, что хотите сгенерировать новые коды восстановления?" @@ -556,7 +570,7 @@ msgstr "Сред./PV" #: src/views/certificate/components/CertificateActions.vue:22 #: src/views/config/components/ConfigLeftPanel.vue:274 #: src/views/config/ConfigList.vue:120 src/views/config/ConfigList.vue:217 -#: src/views/nginx_log/NginxLog.vue:129 +#: src/views/dns/DNSRecordManager.vue:223 src/views/nginx_log/NginxLog.vue:129 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:183 #: src/views/stream/components/StreamEditor.vue:147 msgid "Back" @@ -714,6 +728,10 @@ msgstr "Браузер" msgid "Browser Statistics" msgstr "Статистика браузера" +#: src/views/dns/DNSDomainList.vue:257 +msgid "Business contact:" +msgstr "Деловой контакт:" + #: src/views/nginx_log/components/IndexingSettingsModal.vue:316 msgid "" "By enabling advanced indexing, you acknowledge that your system meets the " @@ -786,6 +804,7 @@ msgstr "" #: src/components/NgxConfigEditor/NgxUpstream.vue:32 src/language/curd.ts:37 #: src/views/config/components/Delete.vue:98 #: src/views/dashboard/components/SiteHealthCheckModal.vue:710 +#: src/views/dns/DDNSManager.vue:244 src/views/dns/DNSRecordManager.vue:212 #: src/views/nginx_log/components/IndexingSettingsModal.vue:102 #: src/views/nginx_log/indexing/IndexManagement.vue:33 #: src/views/nginx_log/indexing/IndexManagement.vue:59 @@ -932,7 +951,7 @@ msgstr "Тип сертификата" msgid "Certificates" msgstr "Сертификаты" -#: src/routes/modules/certificates.ts:36 +#: src/routes/modules/certificates.ts:28 msgid "Certificates List" msgstr "Список сертификатов" @@ -1313,7 +1332,7 @@ msgstr "Путь конфигурации пуст" msgid "Config Template" msgstr "Шаблон конфигурации" -#: src/views/certificate/DNSCredential.vue:52 +#: src/views/dns/DNSCredential.vue:52 msgid "Configuration" msgstr "Конфигурация" @@ -1341,6 +1360,14 @@ msgstr "Название конфигурации" msgid "Configurations" msgstr "Конфигурации" +#: src/views/dns/DDNSManager.vue:201 +msgid "Configure" +msgstr "Настроить" + +#: src/views/dns/DDNSManager.vue:211 +msgid "Configure DDNS" +msgstr "Настройка DDNS" + #: src/views/site/site_add/SiteAdd.vue:81 msgid "Configure SSL" msgstr "Настроить SSL" @@ -1464,6 +1491,10 @@ msgstr "Создать файл" msgid "Create Folder" msgstr "Создать папку" +#: src/views/dns/DNSRecordManager.vue:200 +msgid "Create Record" +msgstr "Создать запись" + #: src/views/backup/components/BackupCreator.vue:75 msgid "" "Create system backups including Nginx configuration and Nginx UI settings. " @@ -1490,11 +1521,12 @@ msgstr "Создано успешно" msgid "Creating client facilitates communication with the CA server" msgstr "Создание клиента облегчает связь с сервером CA" -#: src/components/AutoCertForm/DNSChallenge.vue:105 +#: src/components/AutoCertForm/DNSChallenge.vue:131 +#: src/views/dns/DDNSManager.vue:65 src/views/dns/DNSDomainList.vue:109 msgid "Credential" msgstr "Учетные данные" -#: src/views/certificate/components/DNSChallenge.vue:86 +#: src/routes/modules/dns.ts:20 src/views/dns/components/DNSChallenge.vue:87 msgid "Credentials" msgstr "Учетные данные" @@ -1609,6 +1641,18 @@ msgstr "Дни" msgid "Db file not found" msgstr "Файл базы данных не найден" +#: src/routes/modules/dns.ts:36 +msgid "DDNS" +msgstr "DDNS" + +#: src/views/dns/DDNSManager.vue:153 +msgid "DDNS Overview" +msgstr "Обзор DDNS" + +#: src/views/dns/DDNSManager.vue:135 +msgid "DDNS saved" +msgstr "DDNS сохранено" + #: src/constants/errors/geolite.ts:12 msgid "Decompression succeeded but failed to delete compressed file: {0}" msgstr "Разархивирование успешно завершено, но не удалось удалить сжатый файл: {0}" @@ -1633,6 +1677,7 @@ msgstr "Определите имя и размер зоны общей памя #: src/views/config/components/Delete.vue:65 #: src/views/config/components/Delete.vue:97 #: src/views/config/ConfigList.vue:199 +#: src/views/dns/components/DNSRecordTable.vue:94 #: src/views/site/site_list/SiteList.vue:100 #: src/views/stream/StreamList.vue:110 msgid "Delete" @@ -1874,7 +1919,8 @@ msgid "Disable stream %{name} from %{node} successfully" msgstr "Поток %{name} отключен от %{node} успешно" #: src/views/backup/AutoBackup/AutoBackup.vue:175 -#: src/views/node/nodeColumns.tsx:60 src/views/node/nodeColumns.tsx:78 +#: src/views/dns/DDNSManager.vue:175 src/views/node/nodeColumns.tsx:60 +#: src/views/node/nodeColumns.tsx:78 #: src/views/preference/tabs/HTTPSettings.vue:24 #: src/views/preference/tabs/NodeSettings.vue:25 #: src/views/preference/tabs/NodeSettings.vue:30 @@ -1899,16 +1945,35 @@ msgstr "Отключено" msgid "Disk IO" msgstr "Нагрузка на Диск IO" -#: src/routes/modules/certificates.ts:28 -#: src/views/certificate/DNSCredential.vue:79 +#: src/routes/modules/dns.ts:11 +msgid "DNS" +msgstr "DNS" + +#: src/views/dns/DNSCredential.vue:79 msgid "DNS Credentials" msgstr "DNS учетные данные" -#: src/components/AutoCertForm/DNSChallenge.vue:95 -#: src/views/certificate/components/DNSChallenge.vue:59 +#: src/routes/modules/dns.ts:28 src/views/dns/DNSDomainList.vue:228 +msgid "DNS Domains" +msgstr "Домены DNS" + +#: src/views/dns/components/DNSRecordTable.vue:81 +msgid "DNS Only" +msgstr "Только DNS" + +#: src/components/AutoCertForm/DNSChallenge.vue:121 +#: src/views/dns/components/DNSChallenge.vue:60 msgid "DNS Provider" msgstr "Провайдер DNS" +#: src/views/dns/DNSDomainList.vue:244 +msgid "DNS Provider Support" +msgstr "Поддержка DNS-провайдера" + +#: src/routes/modules/dns.ts:44 src/views/dns/DNSRecordManager.vue:58 +msgid "DNS Records" +msgstr "DNS-записи" + #: src/views/dashboard/components/SiteHealthCheckModal.vue:678 msgid "DNS Resolver" msgstr "DNS-резолвер" @@ -1969,6 +2034,7 @@ msgid "Document Count" msgstr "Количество документов" #: src/views/certificate/components/DNSIssueCertificate.vue:119 +#: src/views/dns/DDNSManager.vue:60 src/views/dns/DNSDomainList.vue:98 msgid "Domain" msgstr "Домен" @@ -2057,7 +2123,7 @@ msgstr "Ключ HMAC EAB" msgid "EAB Key ID" msgstr "ID ключа EAB" -#: src/language/curd.ts:8 +#: src/language/curd.ts:8 src/views/dns/components/DNSRecordTable.vue:87 msgid "Edit" msgstr "Редактировать" @@ -2071,6 +2137,10 @@ msgstr "Редактировать %{n}" msgid "Edit Configuration" msgstr "Редактировать Конфигурацию" +#: src/views/dns/DNSRecordManager.vue:200 +msgid "Edit Record" +msgstr "Редактировать запись" + #: src/routes/modules/sites.ts:34 msgid "Edit Site" msgstr "Редактировать Сайт" @@ -2121,6 +2191,10 @@ msgstr "Включить автодополнение кода" msgid "Enable compression for content transfer" msgstr "Включить сжатие для передачи контента" +#: src/views/dns/DDNSManager.vue:218 +msgid "Enable DDNS" +msgstr "Включить DDNS" + #: src/views/dashboard/components/SiteHealthCheckModal.vue:473 msgid "Enable Health Check" msgstr "Включить проверку работоспособности" @@ -2208,7 +2282,8 @@ msgid "Enable TOTP" msgstr "Включить TOTP" #: src/views/backup/AutoBackup/AutoBackup.vue:174 -#: src/views/node/nodeColumns.tsx:69 src/views/node/nodeColumns.tsx:75 +#: src/views/dns/DDNSManager.vue:175 src/views/node/nodeColumns.tsx:69 +#: src/views/node/nodeColumns.tsx:75 #: src/views/preference/components/ExternalNotify/columns.tsx:47 #: src/views/preference/tabs/HTTPSettings.vue:24 #: src/views/preference/tabs/LogrotateSettings.vue:20 @@ -3180,14 +3255,19 @@ msgstr "Более высокое значение означает лучшее msgid "History" msgstr "История" -#: src/routes/index.ts:52 +#: src/routes/index.ts:54 msgid "Home" msgstr "Главная" +#: src/views/dns/components/DNSRecordFilter.vue:42 #: src/views/preference/tabs/ServerSettings.vue:19 msgid "Host" msgstr "Хост" +#: src/views/dns/components/DNSRecordFilter.vue:45 +msgid "Host, e.g. @ or www" +msgstr "Хост, напр. @ или www" + #: src/views/backup/AutoBackup/components/CronEditor.vue:159 #: src/views/nginx_log/dashboard/components/HourlyChart.vue:87 msgid "Hour" @@ -3260,7 +3340,7 @@ msgstr "" msgid "Import" msgstr "Импорт" -#: src/routes/modules/certificates.ts:54 +#: src/routes/modules/certificates.ts:46 #: src/views/certificate/CertificateEditor.vue:84 msgid "Import Certificate" msgstr "Импортировать сертификат" @@ -3383,10 +3463,15 @@ msgstr "" "Установка не разрешена через 10 минут после запуска системы, пожалуйста, " "перезапустите Nginx UI." +#: src/views/dns/DDNSManager.vue:79 #: src/views/preference/tabs/LogrotateSettings.vue:26 msgid "Interval" msgstr "Интервал" +#: src/views/dns/DDNSManager.vue:232 +msgid "Interval (seconds)" +msgstr "Интервал (секунды)" + #: src/views/certificate/ACMEUser.vue:166 msgid "Invalid" msgstr "Недействительно" @@ -3615,6 +3700,10 @@ msgstr "Последняя индексация" msgid "Last month" msgstr "Прошлый месяц" +#: src/views/dns/DDNSManager.vue:87 +msgid "Last run" +msgstr "Последний запуск" + #: src/views/dashboard/NginxDashBoard.vue:138 msgid "Last update" msgstr "Последнее обновление" @@ -3884,6 +3973,10 @@ msgstr "" msgid "Manage Configs" msgstr "Конфигурации" +#: src/views/dns/DNSDomainList.vue:236 +msgid "Manage Records" +msgstr "Управление записями" + #: src/routes/modules/sites.ts:10 src/views/site/site_list/SiteList.vue:45 msgid "Manage Sites" msgstr "Сайты" @@ -4054,7 +4147,7 @@ msgstr "Изменено" msgid "Modify" msgstr "Изменить" -#: src/routes/modules/certificates.ts:44 +#: src/routes/modules/certificates.ts:36 #: src/views/certificate/CertificateEditor.vue:84 msgid "Modify Certificate" msgstr "Изменить сертификат" @@ -4115,11 +4208,13 @@ msgstr "Н/Д" #: src/views/certificate/components/CertificateBasicInfo.vue:44 #: src/views/certificate/components/CertificateBasicInfo.vue:58 #: src/views/certificate/components/CertificateBasicInfo.vue:70 -#: src/views/certificate/DNSCredential.vue:17 #: src/views/config/components/ConfigRightPanel/Basic.vue:34 #: src/views/config/components/Delete.vue:123 #: src/views/config/components/Mkdir.vue:64 -#: src/views/config/configColumns.tsx:17 src/views/namespace/columns.ts:9 +#: src/views/config/configColumns.tsx:17 +#: src/views/dns/components/DNSRecordForm.vue:63 +#: src/views/dns/components/DNSRecordTable.vue:17 +#: src/views/dns/DNSCredential.vue:17 src/views/namespace/columns.ts:9 #: src/views/nginx_log/NginxLogList.vue:155 src/views/node/nodeColumns.tsx:8 #: src/views/preference/components/AuthSettings/AddPasskey.vue:81 #: src/views/site/site_edit/components/RightPanel/Basic.vue:36 @@ -4147,6 +4242,14 @@ msgstr "Пространство имен" msgid "Namespaces" msgstr "Пространства имен" +#: src/views/dns/DNSDomainList.vue:251 +msgid "" +"Need more DNS providers? Support us through donations or contact us for " +"commercial collaboration" +msgstr "" +"Нужно больше DNS-провайдеров? Поддержите нас пожертвованиями или свяжитесь " +"с нами для коммерческого сотрудничества" + #: src/views/dashboard/NginxDashBoard.vue:195 msgid "Need to enable the stub_status module" msgstr "Необходимо включить модуль stub_status" @@ -4541,6 +4644,10 @@ msgstr "Не проиндексировано" msgid "Not Loaded" msgstr "Не загружено" +#: src/views/dns/DDNSManager.vue:102 +msgid "Not run yet" +msgstr "Еще не запущено" + #: src/components/AutoCertForm/AutoCertForm.vue:230 msgid "Not supported for IP certificates" msgstr "Не поддерживается для IP-сертификатов" @@ -4550,7 +4657,7 @@ msgid "Not Valid Before: %{date}" msgstr "Действителен до: %{date}" #: src/components/AutoCertForm/AutoCertForm.vue:150 -#: src/views/certificate/DNSCredential.vue:89 +#: src/views/dns/DNSCredential.vue:89 msgid "Note" msgstr "Заметка" @@ -4682,10 +4789,6 @@ msgstr "ОК" msgid "On" msgstr "Вкл" -#: src/views/certificate/DNSCredential.vue:99 -msgid "Once the verification is complete, the records will be removed." -msgstr "После завершения проверки записи будут удалены." - #: src/components/NamespaceTabs/NamespaceTabs.vue:164 #: src/components/NodeCard/NodeCard.vue:51 #: src/components/NodeSelector/NodeSelector.vue:65 @@ -4980,7 +5083,7 @@ msgstr "Пожалуйста, заполните все поля правиль msgid "Please fill in required S3 configuration fields" msgstr "Пожалуйста, заполните обязательные поля конфигурации S3" -#: src/views/certificate/DNSCredential.vue:93 +#: src/views/dns/DNSCredential.vue:93 msgid "" "Please fill in the API authentication credentials provided by your DNS " "provider." @@ -5048,7 +5151,7 @@ msgstr "Введите ваше имя пользователя!" msgid "Please log in." msgstr "Пожалуйста, войдите в систему." -#: src/views/certificate/DNSCredential.vue:102 +#: src/views/dns/DNSCredential.vue:96 msgid "Please note that the unit of time configurations below are all in seconds." msgstr "" "Обратите внимание, что единица измерения времени в конфигурациях ниже " @@ -5132,6 +5235,11 @@ msgstr "Настройки" msgid "Preparing lego configurations" msgstr "Подготовка конфигураций Lego" +#: src/views/dns/components/DNSRecordForm.vue:81 +#: src/views/dns/components/DNSRecordTable.vue:33 +msgid "Priority" +msgstr "Приоритет" + #: src/components/AutoCertForm/AutoCertForm.vue:206 msgid "Private CA:" msgstr "Частный CA:" @@ -5195,7 +5303,8 @@ msgstr "" "использовании обратного прокси настройте протокол отдельно в обратном " "прокси." -#: src/views/certificate/DNSCredential.vue:26 +#: src/views/dns/DDNSManager.vue:70 src/views/dns/DNSCredential.vue:26 +#: src/views/dns/DNSDomainList.vue:177 src/views/dns/DNSDomainList.vue:198 msgid "Provider" msgstr "Провайдер" @@ -5207,6 +5316,12 @@ msgstr "Поставщик не найден: {0}" msgid "Province / Region" msgstr "Провинция / Регион" +#: src/views/dns/components/DNSRecordForm.vue:87 +#: src/views/dns/components/DNSRecordTable.vue:51 +#: src/views/dns/components/DNSRecordTable.vue:81 +msgid "Proxied" +msgstr "Проксированный" + #: src/views/certificate/ACMEUser.vue:63 msgid "Proxy" msgstr "Прокси" @@ -5301,6 +5416,22 @@ msgstr "Проверить снова" msgid "Recommended:" msgstr "Рекомендуется:" +#: src/views/dns/DNSRecordManager.vue:113 +msgid "Record created" +msgstr "Запись создана" + +#: src/views/dns/DNSRecordManager.vue:120 +msgid "Record deleted" +msgstr "Запись удалена" + +#: src/views/dns/DNSRecordManager.vue:109 +msgid "Record updated" +msgstr "Запись обновлена" + +#: src/views/dns/DDNSManager.vue:221 +msgid "Records" +msgstr "Записи" + #: src/components/TwoFA/Authorization.vue:79 msgid "Recovery" msgstr "Восстановление" @@ -5330,7 +5461,8 @@ msgstr "Сообщения о перенаправлении (3xx)" msgid "Referer" msgstr "Реферер" -#: src/language/curd.ts:70 +#: src/language/curd.ts:70 src/views/dns/DDNSManager.vue:161 +#: src/views/dns/DNSRecordManager.vue:165 msgid "Refresh" msgstr "Обновить" @@ -5572,7 +5704,7 @@ msgstr "Запрос с неправильными параметрами" msgid "Requests Per Connection" msgstr "Запросов на соединение" -#: src/language/curd.ts:13 +#: src/language/curd.ts:13 src/views/dns/components/DNSRecordFilter.vue:65 #: src/views/nginx_log/structured/components/SearchFilters.vue:214 #: src/views/nginx_log/structured/StructuredLogViewer.vue:745 msgid "Reset" @@ -5813,6 +5945,7 @@ msgstr "Суббота" #: src/views/config/components/ConfigLeftPanel.vue:283 #: src/views/config/components/ConfigName.vue:58 #: src/views/dashboard/components/SiteHealthCheckModal.vue:713 +#: src/views/dns/DDNSManager.vue:247 src/views/dns/DNSRecordManager.vue:215 #: src/views/preference/components/AuthSettings/Passkey.vue:131 #: src/views/preference/Preference.vue:124 #: src/views/site/site_edit/components/ConfigName/ConfigName.vue:52 @@ -5920,12 +6053,13 @@ msgstr "Расписание" msgid "Schedule Type" msgstr "Тип расписания" -#: src/views/certificate/components/DNSChallenge.vue:77 +#: src/views/dns/components/DNSChallenge.vue:78 msgid "SDK" msgstr "SDK" #: src/language/constants.ts:62 src/language/curd.ts:12 #: src/views/config/configColumns.tsx:5 +#: src/views/dns/components/DNSRecordFilter.vue:62 #: src/views/nginx_log/structured/components/SearchFilters.vue:217 #: src/views/site/site_list/columns.tsx:17 src/views/stream/columns.tsx:13 msgid "Search" @@ -5984,10 +6118,18 @@ msgstr "" msgid "Select all" msgstr "Выбрать все" +#: src/language/constants.ts:68 +msgid "Select Credential" +msgstr "Выберите учетные данные" + #: src/views/certificate/ACMEUser.vue:45 msgid "Select or enter a CA directory URL" msgstr "Выберите или введите URL-адрес каталога CA" +#: src/language/constants.ts:67 +msgid "Select Provider" +msgstr "Выбрать поставщика" + #: src/language/curd.ts:59 msgid "Selected {count} files" msgstr "Выбрано {count} файлов" @@ -6311,6 +6453,7 @@ msgstr "Статический" #: src/views/certificate/ACMEUser.vue:75 #: src/views/certificate/CertificateList/certColumns.tsx:63 #: src/views/dashboard/components/ModulesTable.vue:75 +#: src/views/dns/DDNSManager.vue:75 #: src/views/nginx_log/structured/components/SearchFilters.vue:106 #: src/views/nginx_log/structured/StructuredLogViewer.vue:241 #: src/views/nginx_log/structured/StructuredLogViewer.vue:521 @@ -6542,6 +6685,10 @@ msgstr "Восстановление системы" msgid "System restored successfully." msgstr "Система успешно восстановлена." +#: src/views/dns/DDNSManager.vue:83 +msgid "Targets" +msgstr "Цели" + #: src/constants/errors/self_check.ts:3 msgid "Task is not fixable" msgstr "Задача не подлежит исправлению" @@ -7083,6 +7230,14 @@ msgstr "Попробуйте изменить критерии поиска ил msgid "Try adjusting your search criteria or time range." msgstr "Попробуйте изменить критерии поиска или временной диапазон." +#: src/views/dns/components/DNSRecordTable.vue:29 +msgid "TTL" +msgstr "TTL" + +#: src/views/dns/components/DNSRecordForm.vue:78 +msgid "TTL (seconds)" +msgstr "TTL (секунды)" + #: src/views/backup/AutoBackup/components/CronEditor.vue:28 msgid "Tuesday" msgstr "Вторник" @@ -7095,6 +7250,9 @@ msgstr "Требуется двухфакторная аутентификаци #: src/views/certificate/CertificateList/certColumns.tsx:24 #: src/views/config/components/Delete.vue:122 #: src/views/dashboard/components/ModulesTable.vue:62 +#: src/views/dns/components/DNSRecordFilter.vue:49 +#: src/views/dns/components/DNSRecordForm.vue:57 +#: src/views/dns/components/DNSRecordTable.vue:21 #: src/views/nginx_log/NginxLogList.vue:146 #: src/views/notification/notificationColumns.tsx:8 #: src/views/preference/components/ExternalNotify/columns.tsx:19 @@ -7105,6 +7263,10 @@ msgstr "Тип" msgid "Type %{delete} to confirm" msgstr "Введите %{delete} для подтверждения" +#: src/views/dns/DDNSManager.vue:228 +msgid "Type or select A/AAAA records" +msgstr "Введите или выберите записи A/AAAA" + #: src/views/nginx_log/structured/components/SearchFilters.vue:142 msgid "Type or select browser" msgstr "Введите или выберите браузер" @@ -7160,9 +7322,9 @@ msgstr "Успешно обновлено" #: src/views/backup/AutoBackup/AutoBackup.vue:236 #: src/views/certificate/ACMEUser.vue:124 -#: src/views/certificate/DNSCredential.vue:65 #: src/views/config/components/ConfigRightPanel/Basic.vue:54 -#: src/views/config/configColumns.tsx:44 src/views/namespace/columns.ts:91 +#: src/views/config/configColumns.tsx:44 src/views/dns/DNSCredential.vue:65 +#: src/views/dns/DNSDomainList.vue:205 src/views/namespace/columns.ts:91 #: src/views/node/nodeColumns.tsx:89 #: src/views/site/site_edit/components/RightPanel/Basic.vue:39 #: src/views/site/site_list/columns.tsx:113 src/views/stream/columns.tsx:80 @@ -7235,6 +7397,10 @@ msgstr "Аптайм:" msgid "URL" msgstr "URL" +#: src/views/dns/components/DNSRecordForm.vue:64 +msgid "Use @ for root" +msgstr "Используйте @ для корневой записи" + #: src/components/TwoFA/Authorization.vue:121 msgid "Use OTP" msgstr "Использовать OTP" @@ -7300,6 +7466,8 @@ msgid "Validate SSL Certificate" msgstr "Проверить SSL-сертификат" #: src/views/dashboard/components/PerformanceTablesCard.vue:22 +#: src/views/dns/components/DNSRecordForm.vue:66 +#: src/views/dns/components/DNSRecordTable.vue:25 msgid "Value" msgstr "Значение" @@ -7396,14 +7564,6 @@ msgstr "" msgid "We do not accept any feature requests" msgstr "Мы не принимаем запросы на новые функции" -#: src/views/certificate/DNSCredential.vue:96 -msgid "" -"We will add one or more TXT records to the DNS records of your domain for " -"ownership verification." -msgstr "" -"Мы добавим одну или несколько записей TXT в DNS записи вашего домена для " -"подтверждения права собственности." - #: src/views/site/site_edit/components/Cert/ObtainCert.vue:142 msgid "" "We will remove the HTTPChallenge configuration from this file and reload " @@ -7440,6 +7600,11 @@ msgstr "Еженедельно" msgid "Weekly on %{day} at %{time}" msgstr "Еженедельно по %{day} в %{time}" +#: src/views/dns/components/DNSRecordForm.vue:84 +#: src/views/dns/components/DNSRecordTable.vue:37 +msgid "Weight" +msgstr "Вес" + #: src/views/certificate/ACMEUser.vue:119 msgid "" "When Enabled, Nginx UI will automatically re-register users upon startup. " @@ -7491,7 +7656,7 @@ msgstr "Рабочие процессы" msgid "Workers" msgstr "Рабочие процессы" -#: src/layouts/HeaderLayout.vue:61 src/routes/index.ts:61 +#: src/layouts/HeaderLayout.vue:61 src/routes/index.ts:63 #: src/views/workspace/WorkSpace.vue:51 msgid "Workspace" msgstr "Рабочее пространство" @@ -7595,6 +7760,16 @@ msgstr "Ваши ключи доступа" msgid "Zero-allocation pipeline" msgstr "Конвейер без выделения памяти" +#~ msgid "Once the verification is complete, the records will be removed." +#~ msgstr "После завершения проверки записи будут удалены." + +#~ msgid "" +#~ "We will add one or more TXT records to the DNS records of your domain for " +#~ "ownership verification." +#~ msgstr "" +#~ "Мы добавим одну или несколько записей TXT в DNS записи вашего домена для " +#~ "подтверждения права собственности." + #~ msgid "Settings" #~ msgstr "Настройки" @@ -7616,9 +7791,6 @@ msgstr "Конвейер без выделения памяти" #~ msgid "Tested in isolated sandbox mode" #~ msgstr "Протестировано в изолированном песочнице" -#~ msgid "All" -#~ msgstr "Все" - #~ msgid "Based on M2 Pro (12 cores) testing" #~ msgstr "На основе тестирования M2 Pro (12 ядер)" @@ -7823,9 +7995,6 @@ msgstr "Конвейер без выделения памяти" #~ msgid "Are you sure you want to apply to all selected?" #~ msgstr "Вы уверены, что хотите применить ко всем выбранным?" -#~ msgid "Are you sure you want to delete this item?" -#~ msgstr "Вы уверены, что хотите удалить этот элемент?" - #~ msgid "Are you sure you want to recover this item?" #~ msgstr "Вы уверены, что хотите восстановить этот элемент?" @@ -8045,9 +8214,6 @@ msgstr "Конвейер без выделения памяти" #~ msgid "Dark" #~ msgstr "Тёмный" -#~ msgid "Light" -#~ msgstr "Светлая" - #~ msgid "Theme" #~ msgstr "Тема" diff --git a/app/src/language/tr_TR/app.po b/app/src/language/tr_TR/app.po index 7681992b..00495d90 100644 --- a/app/src/language/tr_TR/app.po +++ b/app/src/language/tr_TR/app.po @@ -188,8 +188,10 @@ msgstr "Eylem" #: src/views/backup/AutoBackup/AutoBackup.vue:273 #: src/views/certificate/ACMEUser.vue:131 #: src/views/certificate/CertificateList/certColumns.tsx:92 -#: src/views/certificate/DNSCredential.vue:71 -#: src/views/config/configColumns.tsx:51 src/views/namespace/columns.ts:97 +#: src/views/config/configColumns.tsx:51 +#: src/views/dns/components/DNSRecordTable.vue:41 +#: src/views/dns/DDNSManager.vue:91 src/views/dns/DNSCredential.vue:71 +#: src/views/dns/DNSDomainList.vue:211 src/views/namespace/columns.ts:97 #: src/views/nginx_log/NginxLogList.vue:338 src/views/node/nodeColumns.tsx:96 #: src/views/notification/notificationColumns.tsx:72 #: src/views/preference/components/ExternalNotify/columns.tsx:85 @@ -243,6 +245,10 @@ msgstr "Başlık Ekle" msgid "Add Location" msgstr "Konum ekle" +#: src/views/dns/DNSRecordManager.vue:171 +msgid "Add Record" +msgstr "Kayıt Ekle" + #: src/components/NgxConfigEditor/NgxServer.vue:92 msgid "Add Server" msgstr "Sunucu Ekle" @@ -263,7 +269,7 @@ msgstr "Upstream ekle" msgid "Added successfully" msgstr "Başarıyla eklendi" -#: src/views/certificate/components/DNSChallenge.vue:97 +#: src/views/dns/components/DNSChallenge.vue:98 msgid "Additional" msgstr "İlave bilgi" @@ -302,6 +308,10 @@ msgstr "Gelişmiş Ayarlar" msgid "Afterwards, refresh this page and click add passkey again." msgstr "Daha sonra bu sayfayı yenileyin ve tekrar parola anahtarı ekle'ye tıklayın." +#: src/views/dns/components/DNSRecordFilter.vue:55 +msgid "All" +msgstr "Tümü" + #: src/views/system/Licenses.vue:152 msgid "All Components" msgstr "Tüm Bileşenler" @@ -345,7 +355,7 @@ msgstr "" msgid "API Base Url" msgstr "API Temel Bağlantı Adresi" -#: src/views/certificate/components/DNSChallenge.vue:70 +#: src/views/dns/components/DNSChallenge.vue:71 msgid "API Document" msgstr "API Dökümanı" @@ -381,6 +391,10 @@ msgstr "Bu yasaklı IP'yi hemen sileceğinizden emin misiniz?" msgid "Are you sure to delete this passkey immediately?" msgstr "Bu geçiş anahtarını hemen silmek istediğinizden emin misiniz?" +#: src/views/dns/components/DNSRecordTable.vue:90 +msgid "Are you sure to delete this record?" +msgstr "Bu kaydı silmek istediğinizden emin misiniz?" + #: src/views/preference/components/AuthSettings/RecoveryCodes.vue:155 msgid "Are you sure to generate new recovery codes?" msgstr "Yeni kurtarma kodları oluşturulacaktır. Emin misiniz?" @@ -554,7 +568,7 @@ msgstr "Ort./PV" #: src/views/certificate/components/CertificateActions.vue:22 #: src/views/config/components/ConfigLeftPanel.vue:274 #: src/views/config/ConfigList.vue:120 src/views/config/ConfigList.vue:217 -#: src/views/nginx_log/NginxLog.vue:129 +#: src/views/dns/DNSRecordManager.vue:223 src/views/nginx_log/NginxLog.vue:129 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:183 #: src/views/stream/components/StreamEditor.vue:147 msgid "Back" @@ -704,6 +718,10 @@ msgstr "Tarayıcı" msgid "Browser Statistics" msgstr "Tarayıcı İstatistikleri" +#: src/views/dns/DNSDomainList.vue:257 +msgid "Business contact:" +msgstr "İş iletişimi:" + #: src/views/nginx_log/components/IndexingSettingsModal.vue:316 msgid "" "By enabling advanced indexing, you acknowledge that your system meets the " @@ -774,6 +792,7 @@ msgstr "" #: src/components/NgxConfigEditor/NgxUpstream.vue:32 src/language/curd.ts:37 #: src/views/config/components/Delete.vue:98 #: src/views/dashboard/components/SiteHealthCheckModal.vue:710 +#: src/views/dns/DDNSManager.vue:244 src/views/dns/DNSRecordManager.vue:212 #: src/views/nginx_log/components/IndexingSettingsModal.vue:102 #: src/views/nginx_log/indexing/IndexManagement.vue:33 #: src/views/nginx_log/indexing/IndexManagement.vue:59 @@ -920,7 +939,7 @@ msgstr "Sertifika Türü" msgid "Certificates" msgstr "Sertifikalar" -#: src/routes/modules/certificates.ts:36 +#: src/routes/modules/certificates.ts:28 msgid "Certificates List" msgstr "Sertifika Listesi" @@ -1307,7 +1326,7 @@ msgstr "Yapılandırma yolu boş" msgid "Config Template" msgstr "Yapılandırma Şablonu" -#: src/views/certificate/DNSCredential.vue:52 +#: src/views/dns/DNSCredential.vue:52 msgid "Configuration" msgstr "Yapılandırma" @@ -1335,6 +1354,14 @@ msgstr "Yapılandırma Adı" msgid "Configurations" msgstr "Yapılandırmalar" +#: src/views/dns/DDNSManager.vue:201 +msgid "Configure" +msgstr "Yapılandır" + +#: src/views/dns/DDNSManager.vue:211 +msgid "Configure DDNS" +msgstr "DDNS Yapılandır" + #: src/views/site/site_add/SiteAdd.vue:81 msgid "Configure SSL" msgstr "SSL'yi Yapılandırma" @@ -1458,6 +1485,10 @@ msgstr "Dosya Oluştur" msgid "Create Folder" msgstr "Klasör Ekle" +#: src/views/dns/DNSRecordManager.vue:200 +msgid "Create Record" +msgstr "Kayıt Oluştur" + #: src/views/backup/components/BackupCreator.vue:75 msgid "" "Create system backups including Nginx configuration and Nginx UI settings. " @@ -1483,11 +1514,12 @@ msgstr "Başarıyla oluşturuldu" msgid "Creating client facilitates communication with the CA server" msgstr "İstemci oluşturmak, CA sunucusuyla iletişimi kolaylaştırır" -#: src/components/AutoCertForm/DNSChallenge.vue:105 +#: src/components/AutoCertForm/DNSChallenge.vue:131 +#: src/views/dns/DDNSManager.vue:65 src/views/dns/DNSDomainList.vue:109 msgid "Credential" msgstr "Kimlik bilgisi" -#: src/views/certificate/components/DNSChallenge.vue:86 +#: src/routes/modules/dns.ts:20 src/views/dns/components/DNSChallenge.vue:87 msgid "Credentials" msgstr "Kimlik bilgileri" @@ -1602,6 +1634,18 @@ msgstr "Günler" msgid "Db file not found" msgstr "Veritabanı dosyası bulunamadı" +#: src/routes/modules/dns.ts:36 +msgid "DDNS" +msgstr "DDNS" + +#: src/views/dns/DDNSManager.vue:153 +msgid "DDNS Overview" +msgstr "DDNS Genel Bakış" + +#: src/views/dns/DDNSManager.vue:135 +msgid "DDNS saved" +msgstr "DDNS kaydedildi" + #: src/constants/errors/geolite.ts:12 msgid "Decompression succeeded but failed to delete compressed file: {0}" msgstr "Çözümleme başarılı oldu ancak sıkıştırılmış dosya silinemedi: {0}" @@ -1628,6 +1672,7 @@ msgstr "" #: src/views/config/components/Delete.vue:65 #: src/views/config/components/Delete.vue:97 #: src/views/config/ConfigList.vue:199 +#: src/views/dns/components/DNSRecordTable.vue:94 #: src/views/site/site_list/SiteList.vue:100 #: src/views/stream/StreamList.vue:110 msgid "Delete" @@ -1869,7 +1914,8 @@ msgid "Disable stream %{name} from %{node} successfully" msgstr "Akış %{name}, %{node} üzerinden başarıyla devre dışı bırakıldı" #: src/views/backup/AutoBackup/AutoBackup.vue:175 -#: src/views/node/nodeColumns.tsx:60 src/views/node/nodeColumns.tsx:78 +#: src/views/dns/DDNSManager.vue:175 src/views/node/nodeColumns.tsx:60 +#: src/views/node/nodeColumns.tsx:78 #: src/views/preference/tabs/HTTPSettings.vue:24 #: src/views/preference/tabs/NodeSettings.vue:25 #: src/views/preference/tabs/NodeSettings.vue:30 @@ -1894,16 +1940,35 @@ msgstr "Bağlantı kesildi" msgid "Disk IO" msgstr "Disk IO" -#: src/routes/modules/certificates.ts:28 -#: src/views/certificate/DNSCredential.vue:79 +#: src/routes/modules/dns.ts:11 +msgid "DNS" +msgstr "DNS" + +#: src/views/dns/DNSCredential.vue:79 msgid "DNS Credentials" msgstr "DNS Kimlik Bilgileri" -#: src/components/AutoCertForm/DNSChallenge.vue:95 -#: src/views/certificate/components/DNSChallenge.vue:59 +#: src/routes/modules/dns.ts:28 src/views/dns/DNSDomainList.vue:228 +msgid "DNS Domains" +msgstr "DNS Alanları" + +#: src/views/dns/components/DNSRecordTable.vue:81 +msgid "DNS Only" +msgstr "Yalnızca DNS" + +#: src/components/AutoCertForm/DNSChallenge.vue:121 +#: src/views/dns/components/DNSChallenge.vue:60 msgid "DNS Provider" msgstr "DNS Sağlayıcısı" +#: src/views/dns/DNSDomainList.vue:244 +msgid "DNS Provider Support" +msgstr "DNS Sağlayıcı Desteği" + +#: src/routes/modules/dns.ts:44 src/views/dns/DNSRecordManager.vue:58 +msgid "DNS Records" +msgstr "DNS Kayıtları" + #: src/views/dashboard/components/SiteHealthCheckModal.vue:678 msgid "DNS Resolver" msgstr "DNS Çözümleyici" @@ -1964,6 +2029,7 @@ msgid "Document Count" msgstr "Belge Sayısı" #: src/views/certificate/components/DNSIssueCertificate.vue:119 +#: src/views/dns/DDNSManager.vue:60 src/views/dns/DNSDomainList.vue:98 msgid "Domain" msgstr "Alan Adı" @@ -2054,7 +2120,7 @@ msgstr "EAB HMAC Anahtarı" msgid "EAB Key ID" msgstr "EAB Anahtar Kimliği" -#: src/language/curd.ts:8 +#: src/language/curd.ts:8 src/views/dns/components/DNSRecordTable.vue:87 msgid "Edit" msgstr "Düzenle" @@ -2068,6 +2134,10 @@ msgstr "Düzenle %{n}" msgid "Edit Configuration" msgstr "Yapılandırmayı Düzenle" +#: src/views/dns/DNSRecordManager.vue:200 +msgid "Edit Record" +msgstr "Kaydı Düzenle" + #: src/routes/modules/sites.ts:34 msgid "Edit Site" msgstr "Siteyi Düzenle" @@ -2118,6 +2188,10 @@ msgstr "Kod Tamamlamayı Etkinleştir" msgid "Enable compression for content transfer" msgstr "İçerik transferi için sıkıştırmayı etkinleştir" +#: src/views/dns/DDNSManager.vue:218 +msgid "Enable DDNS" +msgstr "DDNS'yi Etkinleştir" + #: src/views/dashboard/components/SiteHealthCheckModal.vue:473 msgid "Enable Health Check" msgstr "Sağlık Kontrolünü Etkinleştir" @@ -2205,7 +2279,8 @@ msgid "Enable TOTP" msgstr "TOTP'yi Etkinleştir" #: src/views/backup/AutoBackup/AutoBackup.vue:174 -#: src/views/node/nodeColumns.tsx:69 src/views/node/nodeColumns.tsx:75 +#: src/views/dns/DDNSManager.vue:175 src/views/node/nodeColumns.tsx:69 +#: src/views/node/nodeColumns.tsx:75 #: src/views/preference/components/ExternalNotify/columns.tsx:47 #: src/views/preference/tabs/HTTPSettings.vue:24 #: src/views/preference/tabs/LogrotateSettings.vue:20 @@ -3174,14 +3249,19 @@ msgstr "Daha yüksek bir değer, daha iyi bağlantı yeniden kullanımı anlamı msgid "History" msgstr "Geçmiş" -#: src/routes/index.ts:52 +#: src/routes/index.ts:54 msgid "Home" msgstr "Anasayfa" +#: src/views/dns/components/DNSRecordFilter.vue:42 #: src/views/preference/tabs/ServerSettings.vue:19 msgid "Host" msgstr "Host" +#: src/views/dns/components/DNSRecordFilter.vue:45 +msgid "Host, e.g. @ or www" +msgstr "Host, örn. @ veya www" + #: src/views/backup/AutoBackup/components/CronEditor.vue:159 #: src/views/nginx_log/dashboard/components/HourlyChart.vue:87 msgid "Hour" @@ -3258,7 +3338,7 @@ msgstr "" msgid "Import" msgstr "İçe Aktar" -#: src/routes/modules/certificates.ts:54 +#: src/routes/modules/certificates.ts:46 #: src/views/certificate/CertificateEditor.vue:84 msgid "Import Certificate" msgstr "Sertifika İçe Aktar" @@ -3381,10 +3461,15 @@ msgstr "" "Sistem başlangıcından 10 dakika sonra kuruluma izin verilmez, lütfen Nginx " "UI'yi yeniden başlatın." +#: src/views/dns/DDNSManager.vue:79 #: src/views/preference/tabs/LogrotateSettings.vue:26 msgid "Interval" msgstr "Aralık" +#: src/views/dns/DDNSManager.vue:232 +msgid "Interval (seconds)" +msgstr "Aralık (saniye)" + #: src/views/certificate/ACMEUser.vue:166 msgid "Invalid" msgstr "Geçersiz" @@ -3613,6 +3698,10 @@ msgstr "Son Dizinlenme" msgid "Last month" msgstr "Geçen ay" +#: src/views/dns/DDNSManager.vue:87 +msgid "Last run" +msgstr "Son çalıştırma" + #: src/views/dashboard/NginxDashBoard.vue:138 msgid "Last update" msgstr "Son güncelleme" @@ -3881,6 +3970,10 @@ msgstr "" msgid "Manage Configs" msgstr "Yapılandırmaları Yönet" +#: src/views/dns/DNSDomainList.vue:236 +msgid "Manage Records" +msgstr "Kayıtları Yönet" + #: src/routes/modules/sites.ts:10 src/views/site/site_list/SiteList.vue:45 msgid "Manage Sites" msgstr "Siteleri Yönet" @@ -4051,7 +4144,7 @@ msgstr "Değiştirilme Tarihi" msgid "Modify" msgstr "Değiştir" -#: src/routes/modules/certificates.ts:44 +#: src/routes/modules/certificates.ts:36 #: src/views/certificate/CertificateEditor.vue:84 msgid "Modify Certificate" msgstr "Sertifikayı Düzenle" @@ -4112,11 +4205,13 @@ msgstr "Yok" #: src/views/certificate/components/CertificateBasicInfo.vue:44 #: src/views/certificate/components/CertificateBasicInfo.vue:58 #: src/views/certificate/components/CertificateBasicInfo.vue:70 -#: src/views/certificate/DNSCredential.vue:17 #: src/views/config/components/ConfigRightPanel/Basic.vue:34 #: src/views/config/components/Delete.vue:123 #: src/views/config/components/Mkdir.vue:64 -#: src/views/config/configColumns.tsx:17 src/views/namespace/columns.ts:9 +#: src/views/config/configColumns.tsx:17 +#: src/views/dns/components/DNSRecordForm.vue:63 +#: src/views/dns/components/DNSRecordTable.vue:17 +#: src/views/dns/DNSCredential.vue:17 src/views/namespace/columns.ts:9 #: src/views/nginx_log/NginxLogList.vue:155 src/views/node/nodeColumns.tsx:8 #: src/views/preference/components/AuthSettings/AddPasskey.vue:81 #: src/views/site/site_edit/components/RightPanel/Basic.vue:36 @@ -4144,6 +4239,14 @@ msgstr "İsim alanı" msgid "Namespaces" msgstr "İsim Alanları" +#: src/views/dns/DNSDomainList.vue:251 +msgid "" +"Need more DNS providers? Support us through donations or contact us for " +"commercial collaboration" +msgstr "" +"Daha fazla DNS sağlayıcıya mı ihtiyacınız var? Bağış yaparak bize destek " +"olun veya ticari işbirliği için bizimle iletişime geçin" + #: src/views/dashboard/NginxDashBoard.vue:195 msgid "Need to enable the stub_status module" msgstr "stub_status modülünün etkinleştirilmesi gerekiyor" @@ -4538,6 +4641,10 @@ msgstr "Dizine Alınmamış" msgid "Not Loaded" msgstr "Yüklenmedi" +#: src/views/dns/DDNSManager.vue:102 +msgid "Not run yet" +msgstr "Henüz çalıştırılmadı" + #: src/components/AutoCertForm/AutoCertForm.vue:230 msgid "Not supported for IP certificates" msgstr "IP sertifikaları için desteklenmiyor" @@ -4547,7 +4654,7 @@ msgid "Not Valid Before: %{date}" msgstr "Geçerlilik Başlangıç Tarihi: %{date}" #: src/components/AutoCertForm/AutoCertForm.vue:150 -#: src/views/certificate/DNSCredential.vue:89 +#: src/views/dns/DNSCredential.vue:89 msgid "Note" msgstr "Not" @@ -4678,10 +4785,6 @@ msgstr "Tamam" msgid "On" msgstr "Açık" -#: src/views/certificate/DNSCredential.vue:99 -msgid "Once the verification is complete, the records will be removed." -msgstr "Doğrulama tamamlandığında, kayıtlar kaldırılacaktır." - #: src/components/NamespaceTabs/NamespaceTabs.vue:164 #: src/components/NodeCard/NodeCard.vue:51 #: src/components/NodeSelector/NodeSelector.vue:65 @@ -4973,7 +5076,7 @@ msgstr "Lütfen tüm alanları doğru şekilde doldurun" msgid "Please fill in required S3 configuration fields" msgstr "Lütfen gerekli S3 yapılandırma alanlarını doldurun" -#: src/views/certificate/DNSCredential.vue:93 +#: src/views/dns/DNSCredential.vue:93 msgid "" "Please fill in the API authentication credentials provided by your DNS " "provider." @@ -5039,7 +5142,7 @@ msgstr "Lütfen kullanıcı adınızı girin!" msgid "Please log in." msgstr "Lütfen giriş yapın." -#: src/views/certificate/DNSCredential.vue:102 +#: src/views/dns/DNSCredential.vue:96 msgid "Please note that the unit of time configurations below are all in seconds." msgstr "" "Lütfen aşağıdaki zaman yapılandırmalarının birimlerinin saniye cinsinden " @@ -5123,6 +5226,11 @@ msgstr "Tercih" msgid "Preparing lego configurations" msgstr "Lego yapılandırmaları hazırlanıyor" +#: src/views/dns/components/DNSRecordForm.vue:81 +#: src/views/dns/components/DNSRecordTable.vue:33 +msgid "Priority" +msgstr "Öncelik" + #: src/components/AutoCertForm/AutoCertForm.vue:206 msgid "Private CA:" msgstr "Özel CA:" @@ -5185,7 +5293,8 @@ msgstr "" "Protokol yapılandırması yalnızca doğrudan bağlantı sırasında geçerlidir. " "Ters proxy kullanıyorsanız, protokolü ters proxyda ayrı olarak yapılandırın." -#: src/views/certificate/DNSCredential.vue:26 +#: src/views/dns/DDNSManager.vue:70 src/views/dns/DNSCredential.vue:26 +#: src/views/dns/DNSDomainList.vue:177 src/views/dns/DNSDomainList.vue:198 msgid "Provider" msgstr "Sağlayıcı" @@ -5197,6 +5306,12 @@ msgstr "Sağlayıcı bulunamadı: {0}" msgid "Province / Region" msgstr "İl / Bölge" +#: src/views/dns/components/DNSRecordForm.vue:87 +#: src/views/dns/components/DNSRecordTable.vue:51 +#: src/views/dns/components/DNSRecordTable.vue:81 +msgid "Proxied" +msgstr "Proxy'li" + #: src/views/certificate/ACMEUser.vue:63 msgid "Proxy" msgstr "Proxy" @@ -5291,6 +5406,22 @@ msgstr "Yeniden kontrol et" msgid "Recommended:" msgstr "Önerilen:" +#: src/views/dns/DNSRecordManager.vue:113 +msgid "Record created" +msgstr "Kayıt oluşturuldu" + +#: src/views/dns/DNSRecordManager.vue:120 +msgid "Record deleted" +msgstr "Kayıt silindi" + +#: src/views/dns/DNSRecordManager.vue:109 +msgid "Record updated" +msgstr "Kayıt güncellendi" + +#: src/views/dns/DDNSManager.vue:221 +msgid "Records" +msgstr "Kayıtlar" + #: src/components/TwoFA/Authorization.vue:79 msgid "Recovery" msgstr "Kurtarma" @@ -5320,7 +5451,8 @@ msgstr "Yönlendirme Mesajları (3xx)" msgid "Referer" msgstr "Referer" -#: src/language/curd.ts:70 +#: src/language/curd.ts:70 src/views/dns/DDNSManager.vue:161 +#: src/views/dns/DNSRecordManager.vue:165 msgid "Refresh" msgstr "Yenile" @@ -5572,7 +5704,7 @@ msgstr "Yanlış parametrelerle istek yapıldı" msgid "Requests Per Connection" msgstr "Bağlantı Başına İstek Sayısı" -#: src/language/curd.ts:13 +#: src/language/curd.ts:13 src/views/dns/components/DNSRecordFilter.vue:65 #: src/views/nginx_log/structured/components/SearchFilters.vue:214 #: src/views/nginx_log/structured/StructuredLogViewer.vue:745 msgid "Reset" @@ -5812,6 +5944,7 @@ msgstr "Cumartesi" #: src/views/config/components/ConfigLeftPanel.vue:283 #: src/views/config/components/ConfigName.vue:58 #: src/views/dashboard/components/SiteHealthCheckModal.vue:713 +#: src/views/dns/DDNSManager.vue:247 src/views/dns/DNSRecordManager.vue:215 #: src/views/preference/components/AuthSettings/Passkey.vue:131 #: src/views/preference/Preference.vue:124 #: src/views/site/site_edit/components/ConfigName/ConfigName.vue:52 @@ -5917,12 +6050,13 @@ msgstr "Zamanlama" msgid "Schedule Type" msgstr "Zamanlama Türü" -#: src/views/certificate/components/DNSChallenge.vue:77 +#: src/views/dns/components/DNSChallenge.vue:78 msgid "SDK" msgstr "SDK" #: src/language/constants.ts:62 src/language/curd.ts:12 #: src/views/config/configColumns.tsx:5 +#: src/views/dns/components/DNSRecordFilter.vue:62 #: src/views/nginx_log/structured/components/SearchFilters.vue:217 #: src/views/site/site_list/columns.tsx:17 src/views/stream/columns.tsx:13 msgid "Search" @@ -5981,10 +6115,18 @@ msgstr "" msgid "Select all" msgstr "Tümünü seç" +#: src/language/constants.ts:68 +msgid "Select Credential" +msgstr "Kimlik Bilgilerini Seç" + #: src/views/certificate/ACMEUser.vue:45 msgid "Select or enter a CA directory URL" msgstr "Bir CA dizini URL'si seçin veya girin" +#: src/language/constants.ts:67 +msgid "Select Provider" +msgstr "Sağlayıcı Seç" + #: src/language/curd.ts:59 msgid "Selected {count} files" msgstr "Seçilen {count} dosya" @@ -6310,6 +6452,7 @@ msgstr "Statik" #: src/views/certificate/ACMEUser.vue:75 #: src/views/certificate/CertificateList/certColumns.tsx:63 #: src/views/dashboard/components/ModulesTable.vue:75 +#: src/views/dns/DDNSManager.vue:75 #: src/views/nginx_log/structured/components/SearchFilters.vue:106 #: src/views/nginx_log/structured/StructuredLogViewer.vue:241 #: src/views/nginx_log/structured/StructuredLogViewer.vue:521 @@ -6541,6 +6684,10 @@ msgstr "Sistem Geri Yükleme" msgid "System restored successfully." msgstr "Sistem başarıyla geri yüklendi." +#: src/views/dns/DDNSManager.vue:83 +msgid "Targets" +msgstr "Hedefler" + #: src/constants/errors/self_check.ts:3 msgid "Task is not fixable" msgstr "Görev düzeltilemez" @@ -7080,6 +7227,14 @@ msgstr "Arama kriterlerinizi ayarlamayı veya farklı sayfalara gitmeyi deneyin. msgid "Try adjusting your search criteria or time range." msgstr "Arama kriterlerinizi veya zaman aralığınızı ayarlamayı deneyin." +#: src/views/dns/components/DNSRecordTable.vue:29 +msgid "TTL" +msgstr "TTL" + +#: src/views/dns/components/DNSRecordForm.vue:78 +msgid "TTL (seconds)" +msgstr "TTL (saniye)" + #: src/views/backup/AutoBackup/components/CronEditor.vue:28 msgid "Tuesday" msgstr "Salı" @@ -7092,6 +7247,9 @@ msgstr "İki faktörlü kimlik doğrulama gerekiyor" #: src/views/certificate/CertificateList/certColumns.tsx:24 #: src/views/config/components/Delete.vue:122 #: src/views/dashboard/components/ModulesTable.vue:62 +#: src/views/dns/components/DNSRecordFilter.vue:49 +#: src/views/dns/components/DNSRecordForm.vue:57 +#: src/views/dns/components/DNSRecordTable.vue:21 #: src/views/nginx_log/NginxLogList.vue:146 #: src/views/notification/notificationColumns.tsx:8 #: src/views/preference/components/ExternalNotify/columns.tsx:19 @@ -7102,6 +7260,10 @@ msgstr "Tür" msgid "Type %{delete} to confirm" msgstr "Onaylamak için %{delete} yazın" +#: src/views/dns/DDNSManager.vue:228 +msgid "Type or select A/AAAA records" +msgstr "A/AAAA kayıtlarını yazın veya seçin" + #: src/views/nginx_log/structured/components/SearchFilters.vue:142 msgid "Type or select browser" msgstr "Tarayıcı yazın veya seçin" @@ -7157,9 +7319,9 @@ msgstr "Başarıyla güncellendi" #: src/views/backup/AutoBackup/AutoBackup.vue:236 #: src/views/certificate/ACMEUser.vue:124 -#: src/views/certificate/DNSCredential.vue:65 #: src/views/config/components/ConfigRightPanel/Basic.vue:54 -#: src/views/config/configColumns.tsx:44 src/views/namespace/columns.ts:91 +#: src/views/config/configColumns.tsx:44 src/views/dns/DNSCredential.vue:65 +#: src/views/dns/DNSDomainList.vue:205 src/views/namespace/columns.ts:91 #: src/views/node/nodeColumns.tsx:89 #: src/views/site/site_edit/components/RightPanel/Basic.vue:39 #: src/views/site/site_list/columns.tsx:113 src/views/stream/columns.tsx:80 @@ -7232,6 +7394,10 @@ msgstr "Çalışma Süresi:" msgid "URL" msgstr "URL" +#: src/views/dns/components/DNSRecordForm.vue:64 +msgid "Use @ for root" +msgstr "Kök için @ kullanın" + #: src/components/TwoFA/Authorization.vue:121 msgid "Use OTP" msgstr "OTP Kullan" @@ -7297,6 +7463,8 @@ msgid "Validate SSL Certificate" msgstr "SSL Sertifikasını Doğrula" #: src/views/dashboard/components/PerformanceTablesCard.vue:22 +#: src/views/dns/components/DNSRecordForm.vue:66 +#: src/views/dns/components/DNSRecordTable.vue:25 msgid "Value" msgstr "Değer" @@ -7392,14 +7560,6 @@ msgstr "" msgid "We do not accept any feature requests" msgstr "Herhangi bir özellik talebini kabul etmiyoruz" -#: src/views/certificate/DNSCredential.vue:96 -msgid "" -"We will add one or more TXT records to the DNS records of your domain for " -"ownership verification." -msgstr "" -"Mülkiyet doğrulaması için alan adınızın DNS kayıtlarına bir veya daha fazla " -"TXT kaydı ekleyeceğiz." - #: src/views/site/site_edit/components/Cert/ObtainCert.vue:142 msgid "" "We will remove the HTTPChallenge configuration from this file and reload " @@ -7436,6 +7596,11 @@ msgstr "Haftalık" msgid "Weekly on %{day} at %{time}" msgstr "Haftalık olarak %{day} günü %{time}" +#: src/views/dns/components/DNSRecordForm.vue:84 +#: src/views/dns/components/DNSRecordTable.vue:37 +msgid "Weight" +msgstr "Ağırlık" + #: src/views/certificate/ACMEUser.vue:119 msgid "" "When Enabled, Nginx UI will automatically re-register users upon startup. " @@ -7487,7 +7652,7 @@ msgstr "Çalışan Süreçler" msgid "Workers" msgstr "Çalışanlar" -#: src/layouts/HeaderLayout.vue:61 src/routes/index.ts:61 +#: src/layouts/HeaderLayout.vue:61 src/routes/index.ts:63 #: src/views/workspace/WorkSpace.vue:51 msgid "Workspace" msgstr "Çalışma alanı" @@ -7592,6 +7757,16 @@ msgstr "Geçiş Anahtarlarınız" msgid "Zero-allocation pipeline" msgstr "Tahsisatsız boru hattı" +#~ msgid "Once the verification is complete, the records will be removed." +#~ msgstr "Doğrulama tamamlandığında, kayıtlar kaldırılacaktır." + +#~ msgid "" +#~ "We will add one or more TXT records to the DNS records of your domain for " +#~ "ownership verification." +#~ msgstr "" +#~ "Mülkiyet doğrulaması için alan adınızın DNS kayıtlarına bir veya daha fazla " +#~ "TXT kaydı ekleyeceğiz." + #~ msgid "Settings" #~ msgstr "Ayarlar" @@ -7613,9 +7788,6 @@ msgstr "Tahsisatsız boru hattı" #~ msgid "Tested in isolated sandbox mode" #~ msgstr "İzole sandbox modunda test edildi" -#~ msgid "All" -#~ msgstr "Tümü" - #~ msgid "Based on M2 Pro (12 cores) testing" #~ msgstr "M2 Pro (12 çekirdek) testlerine dayalı" @@ -7820,9 +7992,6 @@ msgstr "Tahsisatsız boru hattı" #~ msgid "Are you sure you want to apply to all selected?" #~ msgstr "Tüm seçilenlere uygulamak istediğinizden emin misiniz?" -#~ msgid "Are you sure you want to delete this item?" -#~ msgstr "Bu öğeyi silmek istediğinizden emin misiniz?" - #~ msgid "Are you sure you want to recover this item?" #~ msgstr "Bu öğeyi kurtarmak istediğinizden emin misiniz?" diff --git a/app/src/language/uk_UA/app.po b/app/src/language/uk_UA/app.po index 6c149820..3f4800d1 100644 --- a/app/src/language/uk_UA/app.po +++ b/app/src/language/uk_UA/app.po @@ -192,8 +192,10 @@ msgstr "Дія" #: src/views/backup/AutoBackup/AutoBackup.vue:273 #: src/views/certificate/ACMEUser.vue:131 #: src/views/certificate/CertificateList/certColumns.tsx:92 -#: src/views/certificate/DNSCredential.vue:71 -#: src/views/config/configColumns.tsx:51 src/views/namespace/columns.ts:97 +#: src/views/config/configColumns.tsx:51 +#: src/views/dns/components/DNSRecordTable.vue:41 +#: src/views/dns/DDNSManager.vue:91 src/views/dns/DNSCredential.vue:71 +#: src/views/dns/DNSDomainList.vue:211 src/views/namespace/columns.ts:97 #: src/views/nginx_log/NginxLogList.vue:338 src/views/node/nodeColumns.tsx:96 #: src/views/notification/notificationColumns.tsx:72 #: src/views/preference/components/ExternalNotify/columns.tsx:85 @@ -247,6 +249,10 @@ msgstr "Додати заголовок" msgid "Add Location" msgstr "Додати локацію" +#: src/views/dns/DNSRecordManager.vue:171 +msgid "Add Record" +msgstr "Додати запис" + #: src/components/NgxConfigEditor/NgxServer.vue:92 msgid "Add Server" msgstr "Додати сервер" @@ -267,7 +273,7 @@ msgstr "Додати upstream" msgid "Added successfully" msgstr "Успішно додано" -#: src/views/certificate/components/DNSChallenge.vue:97 +#: src/views/dns/components/DNSChallenge.vue:98 msgid "Additional" msgstr "Додатково" @@ -306,6 +312,10 @@ msgstr "Розширені налаштування" msgid "Afterwards, refresh this page and click add passkey again." msgstr "Після цього оновіть цю сторінку та натисніть «Додати ключ доступу» знову." +#: src/views/dns/components/DNSRecordFilter.vue:55 +msgid "All" +msgstr "Усі" + #: src/views/system/Licenses.vue:152 msgid "All Components" msgstr "Усі компоненти" @@ -349,7 +359,7 @@ msgstr "" msgid "API Base Url" msgstr "Базова URL-адреса API" -#: src/views/certificate/components/DNSChallenge.vue:70 +#: src/views/dns/components/DNSChallenge.vue:71 msgid "API Document" msgstr "API Документація" @@ -385,6 +395,10 @@ msgstr "Ви впевнені, що хочите видалити цю забо msgid "Are you sure to delete this passkey immediately?" msgstr "Ви впевнені, що хочете видалити цей ключ?" +#: src/views/dns/components/DNSRecordTable.vue:90 +msgid "Are you sure to delete this record?" +msgstr "Ви впевнені, що хочете видалити цей запис?" + #: src/views/preference/components/AuthSettings/RecoveryCodes.vue:155 msgid "Are you sure to generate new recovery codes?" msgstr "Підтверджуєте генерацію нових кодів відновлення?" @@ -558,7 +572,7 @@ msgstr "Середн./PV" #: src/views/certificate/components/CertificateActions.vue:22 #: src/views/config/components/ConfigLeftPanel.vue:274 #: src/views/config/ConfigList.vue:120 src/views/config/ConfigList.vue:217 -#: src/views/nginx_log/NginxLog.vue:129 +#: src/views/dns/DNSRecordManager.vue:223 src/views/nginx_log/NginxLog.vue:129 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:183 #: src/views/stream/components/StreamEditor.vue:147 msgid "Back" @@ -714,6 +728,10 @@ msgstr "Браузер" msgid "Browser Statistics" msgstr "Статистика браузера" +#: src/views/dns/DNSDomainList.vue:257 +msgid "Business contact:" +msgstr "Діловий контакт:" + #: src/views/nginx_log/components/IndexingSettingsModal.vue:316 msgid "" "By enabling advanced indexing, you acknowledge that your system meets the " @@ -785,6 +803,7 @@ msgstr "" #: src/components/NgxConfigEditor/NgxUpstream.vue:32 src/language/curd.ts:37 #: src/views/config/components/Delete.vue:98 #: src/views/dashboard/components/SiteHealthCheckModal.vue:710 +#: src/views/dns/DDNSManager.vue:244 src/views/dns/DNSRecordManager.vue:212 #: src/views/nginx_log/components/IndexingSettingsModal.vue:102 #: src/views/nginx_log/indexing/IndexManagement.vue:33 #: src/views/nginx_log/indexing/IndexManagement.vue:59 @@ -930,7 +949,7 @@ msgstr "Тип сертифіката" msgid "Certificates" msgstr "Сертифікати" -#: src/routes/modules/certificates.ts:36 +#: src/routes/modules/certificates.ts:28 msgid "Certificates List" msgstr "Список сертифікатів" @@ -1309,7 +1328,7 @@ msgstr "Конфігурація порожній" msgid "Config Template" msgstr "Шаблон конфігурації" -#: src/views/certificate/DNSCredential.vue:52 +#: src/views/dns/DNSCredential.vue:52 msgid "Configuration" msgstr "Конфігурація" @@ -1337,6 +1356,14 @@ msgstr "Назва конфігурації" msgid "Configurations" msgstr "Конфігурації" +#: src/views/dns/DDNSManager.vue:201 +msgid "Configure" +msgstr "Налаштувати" + +#: src/views/dns/DDNSManager.vue:211 +msgid "Configure DDNS" +msgstr "Налаштувати DDNS" + #: src/views/site/site_add/SiteAdd.vue:81 msgid "Configure SSL" msgstr "Налаштувати SSL" @@ -1460,6 +1487,10 @@ msgstr "Створити файл" msgid "Create Folder" msgstr "Створити папку" +#: src/views/dns/DNSRecordManager.vue:200 +msgid "Create Record" +msgstr "Створити запис" + #: src/views/backup/components/BackupCreator.vue:75 msgid "" "Create system backups including Nginx configuration and Nginx UI settings. " @@ -1486,11 +1517,12 @@ msgstr "Успішно створено" msgid "Creating client facilitates communication with the CA server" msgstr "Створення клієнта сприяє комунікації з сервером CA" -#: src/components/AutoCertForm/DNSChallenge.vue:105 +#: src/components/AutoCertForm/DNSChallenge.vue:131 +#: src/views/dns/DDNSManager.vue:65 src/views/dns/DNSDomainList.vue:109 msgid "Credential" msgstr "Облікові дані" -#: src/views/certificate/components/DNSChallenge.vue:86 +#: src/routes/modules/dns.ts:20 src/views/dns/components/DNSChallenge.vue:87 msgid "Credentials" msgstr "Повноваження" @@ -1641,6 +1673,18 @@ msgstr "Дні" msgid "Db file not found" msgstr "Файл бази даних не знайдено" +#: src/routes/modules/dns.ts:36 +msgid "DDNS" +msgstr "DDNS" + +#: src/views/dns/DDNSManager.vue:153 +msgid "DDNS Overview" +msgstr "Огляд DDNS" + +#: src/views/dns/DDNSManager.vue:135 +msgid "DDNS saved" +msgstr "DDNS збережено" + #: src/constants/errors/geolite.ts:12 msgid "Decompression succeeded but failed to delete compressed file: {0}" msgstr "Розпакування успішне, але не вдалося видалити стиснений файл: {0}" @@ -1665,6 +1709,7 @@ msgstr "Вкажіть назву та розмір зони спільної п #: src/views/config/components/Delete.vue:65 #: src/views/config/components/Delete.vue:97 #: src/views/config/ConfigList.vue:199 +#: src/views/dns/components/DNSRecordTable.vue:94 #: src/views/site/site_list/SiteList.vue:100 #: src/views/stream/StreamList.vue:110 msgid "Delete" @@ -1942,7 +1987,8 @@ msgid "Disable stream %{name} from %{node} successfully" msgstr "Потік %{name} успішно вимкнено з %{node}" #: src/views/backup/AutoBackup/AutoBackup.vue:175 -#: src/views/node/nodeColumns.tsx:60 src/views/node/nodeColumns.tsx:78 +#: src/views/dns/DDNSManager.vue:175 src/views/node/nodeColumns.tsx:60 +#: src/views/node/nodeColumns.tsx:78 #: src/views/preference/tabs/HTTPSettings.vue:24 #: src/views/preference/tabs/NodeSettings.vue:25 #: src/views/preference/tabs/NodeSettings.vue:30 @@ -1967,16 +2013,35 @@ msgstr "Відключено" msgid "Disk IO" msgstr "Дисковий ввід/вивід" -#: src/routes/modules/certificates.ts:28 -#: src/views/certificate/DNSCredential.vue:79 +#: src/routes/modules/dns.ts:11 +msgid "DNS" +msgstr "DNS" + +#: src/views/dns/DNSCredential.vue:79 msgid "DNS Credentials" msgstr "DNS облікові дані" -#: src/components/AutoCertForm/DNSChallenge.vue:95 -#: src/views/certificate/components/DNSChallenge.vue:59 +#: src/routes/modules/dns.ts:28 src/views/dns/DNSDomainList.vue:228 +msgid "DNS Domains" +msgstr "Домени DNS" + +#: src/views/dns/components/DNSRecordTable.vue:81 +msgid "DNS Only" +msgstr "Лише DNS" + +#: src/components/AutoCertForm/DNSChallenge.vue:121 +#: src/views/dns/components/DNSChallenge.vue:60 msgid "DNS Provider" msgstr "DNS-провайдер" +#: src/views/dns/DNSDomainList.vue:244 +msgid "DNS Provider Support" +msgstr "Підтримка DNS-провайдера" + +#: src/routes/modules/dns.ts:44 src/views/dns/DNSRecordManager.vue:58 +msgid "DNS Records" +msgstr "DNS-записи" + #: src/views/dashboard/components/SiteHealthCheckModal.vue:678 msgid "DNS Resolver" msgstr "DNS-резолвер" @@ -2037,6 +2102,7 @@ msgid "Document Count" msgstr "Кількість документів" #: src/views/certificate/components/DNSIssueCertificate.vue:119 +#: src/views/dns/DDNSManager.vue:60 src/views/dns/DNSDomainList.vue:98 msgid "Domain" msgstr "Домен" @@ -2125,7 +2191,7 @@ msgstr "Ключ HMAC EAB" msgid "EAB Key ID" msgstr "ID ключа EAB" -#: src/language/curd.ts:8 +#: src/language/curd.ts:8 src/views/dns/components/DNSRecordTable.vue:87 msgid "Edit" msgstr "Редагувати" @@ -2139,6 +2205,10 @@ msgstr "Редагувати %{n}" msgid "Edit Configuration" msgstr "Редагувати конфігурацію" +#: src/views/dns/DNSRecordManager.vue:200 +msgid "Edit Record" +msgstr "Редагувати запис" + #: src/routes/modules/sites.ts:34 msgid "Edit Site" msgstr "Редагувати сайт" @@ -2189,6 +2259,10 @@ msgstr "Увімкнути автодоповнення коду" msgid "Enable compression for content transfer" msgstr "Увімкнути стиснення для передачі вмісту" +#: src/views/dns/DDNSManager.vue:218 +msgid "Enable DDNS" +msgstr "Увімкнути DDNS" + #: src/views/dashboard/components/SiteHealthCheckModal.vue:473 msgid "Enable Health Check" msgstr "Увімкнути перевірку стану" @@ -2276,7 +2350,8 @@ msgid "Enable TOTP" msgstr "Увімкнути TOTP" #: src/views/backup/AutoBackup/AutoBackup.vue:174 -#: src/views/node/nodeColumns.tsx:69 src/views/node/nodeColumns.tsx:75 +#: src/views/dns/DDNSManager.vue:175 src/views/node/nodeColumns.tsx:69 +#: src/views/node/nodeColumns.tsx:75 #: src/views/preference/components/ExternalNotify/columns.tsx:47 #: src/views/preference/tabs/HTTPSettings.vue:24 #: src/views/preference/tabs/LogrotateSettings.vue:20 @@ -3246,14 +3321,19 @@ msgstr "Вище значення означає краще повторне в msgid "History" msgstr "Історія" -#: src/routes/index.ts:52 +#: src/routes/index.ts:54 msgid "Home" msgstr "Головна" +#: src/views/dns/components/DNSRecordFilter.vue:42 #: src/views/preference/tabs/ServerSettings.vue:19 msgid "Host" msgstr "Хост" +#: src/views/dns/components/DNSRecordFilter.vue:45 +msgid "Host, e.g. @ or www" +msgstr "Хост, напр. @ або www" + #: src/views/backup/AutoBackup/components/CronEditor.vue:159 #: src/views/nginx_log/dashboard/components/HourlyChart.vue:87 msgid "Hour" @@ -3326,7 +3406,7 @@ msgstr "" msgid "Import" msgstr "Імпорт" -#: src/routes/modules/certificates.ts:54 +#: src/routes/modules/certificates.ts:46 #: src/views/certificate/CertificateEditor.vue:84 msgid "Import Certificate" msgstr "Імпортувати сертифікат" @@ -3449,10 +3529,15 @@ msgstr "" "Після 10 хвилин після запуску системи установка заборонена. Будь ласка, " "перезапустіть Nginx UI." +#: src/views/dns/DDNSManager.vue:79 #: src/views/preference/tabs/LogrotateSettings.vue:26 msgid "Interval" msgstr "Інтервал" +#: src/views/dns/DDNSManager.vue:232 +msgid "Interval (seconds)" +msgstr "Інтервал (секунди)" + #: src/views/certificate/ACMEUser.vue:166 msgid "Invalid" msgstr "Недійсний" @@ -3681,6 +3766,10 @@ msgstr "Останнє індексування" msgid "Last month" msgstr "Минулий місяць" +#: src/views/dns/DDNSManager.vue:87 +msgid "Last run" +msgstr "Останній запуск" + #: src/views/dashboard/NginxDashBoard.vue:138 msgid "Last update" msgstr "Останнє оновлення" @@ -3950,6 +4039,10 @@ msgstr "" msgid "Manage Configs" msgstr "Керування конфігураціями" +#: src/views/dns/DNSDomainList.vue:236 +msgid "Manage Records" +msgstr "Керування записами" + #: src/routes/modules/sites.ts:10 src/views/site/site_list/SiteList.vue:45 msgid "Manage Sites" msgstr "Керування сайтами" @@ -4120,7 +4213,7 @@ msgstr "Змінено" msgid "Modify" msgstr "Змінити" -#: src/routes/modules/certificates.ts:44 +#: src/routes/modules/certificates.ts:36 #: src/views/certificate/CertificateEditor.vue:84 msgid "Modify Certificate" msgstr "Редагувати сертифікат" @@ -4181,11 +4274,13 @@ msgstr "Н/Д" #: src/views/certificate/components/CertificateBasicInfo.vue:44 #: src/views/certificate/components/CertificateBasicInfo.vue:58 #: src/views/certificate/components/CertificateBasicInfo.vue:70 -#: src/views/certificate/DNSCredential.vue:17 #: src/views/config/components/ConfigRightPanel/Basic.vue:34 #: src/views/config/components/Delete.vue:123 #: src/views/config/components/Mkdir.vue:64 -#: src/views/config/configColumns.tsx:17 src/views/namespace/columns.ts:9 +#: src/views/config/configColumns.tsx:17 +#: src/views/dns/components/DNSRecordForm.vue:63 +#: src/views/dns/components/DNSRecordTable.vue:17 +#: src/views/dns/DNSCredential.vue:17 src/views/namespace/columns.ts:9 #: src/views/nginx_log/NginxLogList.vue:155 src/views/node/nodeColumns.tsx:8 #: src/views/preference/components/AuthSettings/AddPasskey.vue:81 #: src/views/site/site_edit/components/RightPanel/Basic.vue:36 @@ -4213,6 +4308,14 @@ msgstr "Простір імен" msgid "Namespaces" msgstr "Простори імен" +#: src/views/dns/DNSDomainList.vue:251 +msgid "" +"Need more DNS providers? Support us through donations or contact us for " +"commercial collaboration" +msgstr "" +"Потрібно більше DNS-провайдерів? Підтримайте нас через пожертви або " +"зв’яжіться з нами для комерційної співпраці" + #: src/views/dashboard/NginxDashBoard.vue:195 msgid "Need to enable the stub_status module" msgstr "Потрібно активувати модуль stub_status" @@ -4607,6 +4710,10 @@ msgstr "Не індексовано" msgid "Not Loaded" msgstr "Не завантажено" +#: src/views/dns/DDNSManager.vue:102 +msgid "Not run yet" +msgstr "Ще не запущено" + #: src/components/AutoCertForm/AutoCertForm.vue:230 msgid "Not supported for IP certificates" msgstr "Не підтримується для IP-сертифікатів" @@ -4616,7 +4723,7 @@ msgid "Not Valid Before: %{date}" msgstr "Не дійсний до: %{date}" #: src/components/AutoCertForm/AutoCertForm.vue:150 -#: src/views/certificate/DNSCredential.vue:89 +#: src/views/dns/DNSCredential.vue:89 msgid "Note" msgstr "Примітка" @@ -4748,10 +4855,6 @@ msgstr "Гаразд" msgid "On" msgstr "Увімкнено" -#: src/views/certificate/DNSCredential.vue:99 -msgid "Once the verification is complete, the records will be removed." -msgstr "Після завершення перевірки записи будуть видалені." - #: src/components/NamespaceTabs/NamespaceTabs.vue:164 #: src/components/NodeCard/NodeCard.vue:51 #: src/components/NodeSelector/NodeSelector.vue:65 @@ -5044,7 +5147,7 @@ msgstr "Будь ласка, заповніть усі поля правильн msgid "Please fill in required S3 configuration fields" msgstr "Будь ласка, заповніть обов’язкові поля конфігурації S3" -#: src/views/certificate/DNSCredential.vue:93 +#: src/views/dns/DNSCredential.vue:93 msgid "" "Please fill in the API authentication credentials provided by your DNS " "provider." @@ -5110,7 +5213,7 @@ msgstr "Будь ласка, введіть ваше ім'я користува msgid "Please log in." msgstr "Будь ласка, увійдіть." -#: src/views/certificate/DNSCredential.vue:102 +#: src/views/dns/DNSCredential.vue:96 msgid "Please note that the unit of time configurations below are all in seconds." msgstr "" "Будь ласка, зверніть увагу, що одиницею виміру часу в наведених нижче " @@ -5194,6 +5297,11 @@ msgstr "Налаштування" msgid "Preparing lego configurations" msgstr "Підготовка конфігурацій Lego" +#: src/views/dns/components/DNSRecordForm.vue:81 +#: src/views/dns/components/DNSRecordTable.vue:33 +msgid "Priority" +msgstr "Пріоритет" + #: src/components/AutoCertForm/AutoCertForm.vue:206 msgid "Private CA:" msgstr "Приватний CA:" @@ -5257,7 +5365,8 @@ msgstr "" "використовуєте зворотний проксі, налаштуйте протокол окремо у зворотному " "проксі." -#: src/views/certificate/DNSCredential.vue:26 +#: src/views/dns/DDNSManager.vue:70 src/views/dns/DNSCredential.vue:26 +#: src/views/dns/DNSDomainList.vue:177 src/views/dns/DNSDomainList.vue:198 msgid "Provider" msgstr "Провайдер" @@ -5269,6 +5378,12 @@ msgstr "Постачальника не знайдено: {0}" msgid "Province / Region" msgstr "Провінція / Регіон" +#: src/views/dns/components/DNSRecordForm.vue:87 +#: src/views/dns/components/DNSRecordTable.vue:51 +#: src/views/dns/components/DNSRecordTable.vue:81 +msgid "Proxied" +msgstr "Проксі" + #: src/views/certificate/ACMEUser.vue:63 msgid "Proxy" msgstr "Проксі" @@ -5363,6 +5478,22 @@ msgstr "Перевірити знову" msgid "Recommended:" msgstr "Рекомендовано:" +#: src/views/dns/DNSRecordManager.vue:113 +msgid "Record created" +msgstr "Запис створено" + +#: src/views/dns/DNSRecordManager.vue:120 +msgid "Record deleted" +msgstr "Запис видалено" + +#: src/views/dns/DNSRecordManager.vue:109 +msgid "Record updated" +msgstr "Запис оновлено" + +#: src/views/dns/DDNSManager.vue:221 +msgid "Records" +msgstr "Записи" + #: src/components/TwoFA/Authorization.vue:79 msgid "Recovery" msgstr "Відновлення" @@ -5393,7 +5524,8 @@ msgstr "Повідомлення про перенаправлення (3xx)" msgid "Referer" msgstr "Реферер" -#: src/language/curd.ts:70 +#: src/language/curd.ts:70 src/views/dns/DDNSManager.vue:161 +#: src/views/dns/DNSRecordManager.vue:165 msgid "Refresh" msgstr "Оновити" @@ -5637,7 +5769,7 @@ msgstr "Запит з неправильними параметрами" msgid "Requests Per Connection" msgstr "Запитів на зʼєднання" -#: src/language/curd.ts:13 +#: src/language/curd.ts:13 src/views/dns/components/DNSRecordFilter.vue:65 #: src/views/nginx_log/structured/components/SearchFilters.vue:214 #: src/views/nginx_log/structured/StructuredLogViewer.vue:745 msgid "Reset" @@ -5880,6 +6012,7 @@ msgstr "Субота" #: src/views/config/components/ConfigLeftPanel.vue:283 #: src/views/config/components/ConfigName.vue:58 #: src/views/dashboard/components/SiteHealthCheckModal.vue:713 +#: src/views/dns/DDNSManager.vue:247 src/views/dns/DNSRecordManager.vue:215 #: src/views/preference/components/AuthSettings/Passkey.vue:131 #: src/views/preference/Preference.vue:124 #: src/views/site/site_edit/components/ConfigName/ConfigName.vue:52 @@ -5987,12 +6120,13 @@ msgstr "Розклад" msgid "Schedule Type" msgstr "Тип розкладу" -#: src/views/certificate/components/DNSChallenge.vue:77 +#: src/views/dns/components/DNSChallenge.vue:78 msgid "SDK" msgstr "SDK" #: src/language/constants.ts:62 src/language/curd.ts:12 #: src/views/config/configColumns.tsx:5 +#: src/views/dns/components/DNSRecordFilter.vue:62 #: src/views/nginx_log/structured/components/SearchFilters.vue:217 #: src/views/site/site_list/columns.tsx:17 src/views/stream/columns.tsx:13 msgid "Search" @@ -6051,10 +6185,18 @@ msgstr "" msgid "Select all" msgstr "Вибрати все" +#: src/language/constants.ts:68 +msgid "Select Credential" +msgstr "Виберіть облікові дані" + #: src/views/certificate/ACMEUser.vue:45 msgid "Select or enter a CA directory URL" msgstr "Виберіть або введіть URL-адресу каталогу CA" +#: src/language/constants.ts:67 +msgid "Select Provider" +msgstr "Виберіть постачальника" + #: src/language/curd.ts:59 msgid "Selected {count} files" msgstr "Вибрано {count} файлів" @@ -6382,6 +6524,7 @@ msgstr "Статичний" #: src/views/certificate/ACMEUser.vue:75 #: src/views/certificate/CertificateList/certColumns.tsx:63 #: src/views/dashboard/components/ModulesTable.vue:75 +#: src/views/dns/DDNSManager.vue:75 #: src/views/nginx_log/structured/components/SearchFilters.vue:106 #: src/views/nginx_log/structured/StructuredLogViewer.vue:241 #: src/views/nginx_log/structured/StructuredLogViewer.vue:521 @@ -6613,6 +6756,10 @@ msgstr "Відновлення системи" msgid "System restored successfully." msgstr "Систему успішно відновлено." +#: src/views/dns/DDNSManager.vue:83 +msgid "Targets" +msgstr "Цілі" + #: src/constants/errors/self_check.ts:3 msgid "Task is not fixable" msgstr "Завдання не підлягає виправленню" @@ -7152,6 +7299,14 @@ msgstr "Спробуйте змінити критерії пошуку або msgid "Try adjusting your search criteria or time range." msgstr "Спробуйте змінити критерії пошуку або часовий діапазон." +#: src/views/dns/components/DNSRecordTable.vue:29 +msgid "TTL" +msgstr "TTL" + +#: src/views/dns/components/DNSRecordForm.vue:78 +msgid "TTL (seconds)" +msgstr "TTL (секунди)" + #: src/views/backup/AutoBackup/components/CronEditor.vue:28 msgid "Tuesday" msgstr "Вівторок" @@ -7164,6 +7319,9 @@ msgstr "Потрібна двофакторна аутентифікація" #: src/views/certificate/CertificateList/certColumns.tsx:24 #: src/views/config/components/Delete.vue:122 #: src/views/dashboard/components/ModulesTable.vue:62 +#: src/views/dns/components/DNSRecordFilter.vue:49 +#: src/views/dns/components/DNSRecordForm.vue:57 +#: src/views/dns/components/DNSRecordTable.vue:21 #: src/views/nginx_log/NginxLogList.vue:146 #: src/views/notification/notificationColumns.tsx:8 #: src/views/preference/components/ExternalNotify/columns.tsx:19 @@ -7174,6 +7332,10 @@ msgstr "Тип" msgid "Type %{delete} to confirm" msgstr "Введіть %{delete} для підтвердження" +#: src/views/dns/DDNSManager.vue:228 +msgid "Type or select A/AAAA records" +msgstr "Введіть або виберіть записи A/AAAA" + #: src/views/nginx_log/structured/components/SearchFilters.vue:142 msgid "Type or select browser" msgstr "Введіть або виберіть браузер" @@ -7229,9 +7391,9 @@ msgstr "Успішно оновлено" #: src/views/backup/AutoBackup/AutoBackup.vue:236 #: src/views/certificate/ACMEUser.vue:124 -#: src/views/certificate/DNSCredential.vue:65 #: src/views/config/components/ConfigRightPanel/Basic.vue:54 -#: src/views/config/configColumns.tsx:44 src/views/namespace/columns.ts:91 +#: src/views/config/configColumns.tsx:44 src/views/dns/DNSCredential.vue:65 +#: src/views/dns/DNSDomainList.vue:205 src/views/namespace/columns.ts:91 #: src/views/node/nodeColumns.tsx:89 #: src/views/site/site_edit/components/RightPanel/Basic.vue:39 #: src/views/site/site_list/columns.tsx:113 src/views/stream/columns.tsx:80 @@ -7304,6 +7466,10 @@ msgstr "Час роботи:" msgid "URL" msgstr "URL" +#: src/views/dns/components/DNSRecordForm.vue:64 +msgid "Use @ for root" +msgstr "Використовуйте @ для кореня" + #: src/components/TwoFA/Authorization.vue:121 msgid "Use OTP" msgstr "Використовувати OTP" @@ -7369,6 +7535,8 @@ msgid "Validate SSL Certificate" msgstr "Перевірити SSL-сертифікат" #: src/views/dashboard/components/PerformanceTablesCard.vue:22 +#: src/views/dns/components/DNSRecordForm.vue:66 +#: src/views/dns/components/DNSRecordTable.vue:25 msgid "Value" msgstr "Значення" @@ -7465,14 +7633,6 @@ msgstr "" msgid "We do not accept any feature requests" msgstr "Ми не приймаємо жодних запитів на функції" -#: src/views/certificate/DNSCredential.vue:96 -msgid "" -"We will add one or more TXT records to the DNS records of your domain for " -"ownership verification." -msgstr "" -"Ми додамо один або кілька TXT-записів до DNS-записів вашого домену для " -"підтвердження власності." - #: src/views/site/site_edit/components/Cert/ObtainCert.vue:142 msgid "" "We will remove the HTTPChallenge configuration from this file and reload " @@ -7509,6 +7669,11 @@ msgstr "Щотижня" msgid "Weekly on %{day} at %{time}" msgstr "Щотижня в %{day} о %{time}" +#: src/views/dns/components/DNSRecordForm.vue:84 +#: src/views/dns/components/DNSRecordTable.vue:37 +msgid "Weight" +msgstr "Вага" + #: src/views/certificate/ACMEUser.vue:119 msgid "" "When Enabled, Nginx UI will automatically re-register users upon startup. " @@ -7559,7 +7724,7 @@ msgstr "Робочі процеси" msgid "Workers" msgstr "Робочі процеси" -#: src/layouts/HeaderLayout.vue:61 src/routes/index.ts:61 +#: src/layouts/HeaderLayout.vue:61 src/routes/index.ts:63 #: src/views/workspace/WorkSpace.vue:51 msgid "Workspace" msgstr "Робоча область" @@ -7662,6 +7827,16 @@ msgstr "Ваші ключі доступу" msgid "Zero-allocation pipeline" msgstr "Конвеєр без виділення пам’яті" +#~ msgid "Once the verification is complete, the records will be removed." +#~ msgstr "Після завершення перевірки записи будуть видалені." + +#~ msgid "" +#~ "We will add one or more TXT records to the DNS records of your domain for " +#~ "ownership verification." +#~ msgstr "" +#~ "Ми додамо один або кілька TXT-записів до DNS-записів вашого домену для " +#~ "підтвердження власності." + #~ msgid "Settings" #~ msgstr "Налаштування" @@ -7683,9 +7858,6 @@ msgstr "Конвеєр без виділення пам’яті" #~ msgid "Tested in isolated sandbox mode" #~ msgstr "Протестовано в ізольованому пісочниці" -#~ msgid "All" -#~ msgstr "Усі" - #~ msgid "Based on M2 Pro (12 cores) testing" #~ msgstr "На основі тестування M2 Pro (12 ядер)" @@ -7890,9 +8062,6 @@ msgstr "Конвеєр без виділення пам’яті" #~ msgid "Are you sure you want to apply to all selected?" #~ msgstr "Ви впевнені, що бажаєте застосувати до всіх вибраних?" -#~ msgid "Are you sure you want to delete this item?" -#~ msgstr "Ви впевнені, що хочете видалити цей елемент?" - #~ msgid "Are you sure you want to recover this item?" #~ msgstr "Ви впевнені, що бажаєте відновити цей елемент?" diff --git a/app/src/language/vi_VN/app.po b/app/src/language/vi_VN/app.po index 272ab51a..c2df79b6 100644 --- a/app/src/language/vi_VN/app.po +++ b/app/src/language/vi_VN/app.po @@ -182,8 +182,10 @@ msgstr "Hành động" #: src/views/backup/AutoBackup/AutoBackup.vue:273 #: src/views/certificate/ACMEUser.vue:131 #: src/views/certificate/CertificateList/certColumns.tsx:92 -#: src/views/certificate/DNSCredential.vue:71 -#: src/views/config/configColumns.tsx:51 src/views/namespace/columns.ts:97 +#: src/views/config/configColumns.tsx:51 +#: src/views/dns/components/DNSRecordTable.vue:41 +#: src/views/dns/DDNSManager.vue:91 src/views/dns/DNSCredential.vue:71 +#: src/views/dns/DNSDomainList.vue:211 src/views/namespace/columns.ts:97 #: src/views/nginx_log/NginxLogList.vue:338 src/views/node/nodeColumns.tsx:96 #: src/views/notification/notificationColumns.tsx:72 #: src/views/preference/components/ExternalNotify/columns.tsx:85 @@ -237,6 +239,10 @@ msgstr "Thêm tiêu đề" msgid "Add Location" msgstr "Thêm Location" +#: src/views/dns/DNSRecordManager.vue:171 +msgid "Add Record" +msgstr "Thêm bản ghi" + #: src/components/NgxConfigEditor/NgxServer.vue:92 msgid "Add Server" msgstr "Thêm máy chủ" @@ -257,7 +263,7 @@ msgstr "Thêm upstream" msgid "Added successfully" msgstr "Đã thêm thành công" -#: src/views/certificate/components/DNSChallenge.vue:97 +#: src/views/dns/components/DNSChallenge.vue:98 msgid "Additional" msgstr "Bổ sung" @@ -296,6 +302,10 @@ msgstr "Cài đặt nâng cao" msgid "Afterwards, refresh this page and click add passkey again." msgstr "Sau đó, làm mới trang này và nhấp vào thêm khóa truy cập một lần nữa." +#: src/views/dns/components/DNSRecordFilter.vue:55 +msgid "All" +msgstr "Tất cả" + #: src/views/system/Licenses.vue:152 msgid "All Components" msgstr "Tất cả các thành phần" @@ -339,7 +349,7 @@ msgstr "" msgid "API Base Url" msgstr "URL Cơ sở API" -#: src/views/certificate/components/DNSChallenge.vue:70 +#: src/views/dns/components/DNSChallenge.vue:71 msgid "API Document" msgstr "Tài liệu API" @@ -375,6 +385,10 @@ msgstr "Bạn có chắc chắn muốn xóa IP bị cấm này ngay lập tức msgid "Are you sure to delete this passkey immediately?" msgstr "Bạn có chắc chắn muốn xóa ngay lập tức khóa truy cập này không?" +#: src/views/dns/components/DNSRecordTable.vue:90 +msgid "Are you sure to delete this record?" +msgstr "Bạn có chắc chắn muốn xóa bản ghi này không?" + #: src/views/preference/components/AuthSettings/RecoveryCodes.vue:155 msgid "Are you sure to generate new recovery codes?" msgstr "Bạn có chắc chắn muốn tạo mã khôi phục mới không?" @@ -544,7 +558,7 @@ msgstr "TB/PV" #: src/views/certificate/components/CertificateActions.vue:22 #: src/views/config/components/ConfigLeftPanel.vue:274 #: src/views/config/ConfigList.vue:120 src/views/config/ConfigList.vue:217 -#: src/views/nginx_log/NginxLog.vue:129 +#: src/views/dns/DNSRecordManager.vue:223 src/views/nginx_log/NginxLog.vue:129 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:183 #: src/views/stream/components/StreamEditor.vue:147 msgid "Back" @@ -694,6 +708,10 @@ msgstr "Trình duyệt" msgid "Browser Statistics" msgstr "Thống kê trình duyệt" +#: src/views/dns/DNSDomainList.vue:257 +msgid "Business contact:" +msgstr "Liên hệ kinh doanh:" + #: src/views/nginx_log/components/IndexingSettingsModal.vue:316 msgid "" "By enabling advanced indexing, you acknowledge that your system meets the " @@ -764,6 +782,7 @@ msgstr "" #: src/components/NgxConfigEditor/NgxUpstream.vue:32 src/language/curd.ts:37 #: src/views/config/components/Delete.vue:98 #: src/views/dashboard/components/SiteHealthCheckModal.vue:710 +#: src/views/dns/DDNSManager.vue:244 src/views/dns/DNSRecordManager.vue:212 #: src/views/nginx_log/components/IndexingSettingsModal.vue:102 #: src/views/nginx_log/indexing/IndexManagement.vue:33 #: src/views/nginx_log/indexing/IndexManagement.vue:59 @@ -909,7 +928,7 @@ msgstr "Loại chứng chỉ" msgid "Certificates" msgstr "Chứng chỉ" -#: src/routes/modules/certificates.ts:36 +#: src/routes/modules/certificates.ts:28 msgid "Certificates List" msgstr "Danh sách chứng chỉ" @@ -1287,7 +1306,7 @@ msgstr "Đường dẫn cấu hình trống" msgid "Config Template" msgstr "Mẫu cấu hình" -#: src/views/certificate/DNSCredential.vue:52 +#: src/views/dns/DNSCredential.vue:52 msgid "Configuration" msgstr "Cấu hình" @@ -1315,6 +1334,14 @@ msgstr "Tên cấu hình" msgid "Configurations" msgstr "Cấu hình" +#: src/views/dns/DDNSManager.vue:201 +msgid "Configure" +msgstr "Cấu hình" + +#: src/views/dns/DDNSManager.vue:211 +msgid "Configure DDNS" +msgstr "Cấu hình DDNS" + #: src/views/site/site_add/SiteAdd.vue:81 msgid "Configure SSL" msgstr "Cấu hình SSL" @@ -1436,6 +1463,10 @@ msgstr "Tạo tệp" msgid "Create Folder" msgstr "Tạo thư mục" +#: src/views/dns/DNSRecordManager.vue:200 +msgid "Create Record" +msgstr "Tạo bản ghi" + #: src/views/backup/components/BackupCreator.vue:75 msgid "" "Create system backups including Nginx configuration and Nginx UI settings. " @@ -1461,11 +1492,12 @@ msgstr "Tạo thành công" msgid "Creating client facilitates communication with the CA server" msgstr "Tạo client để giao tiếp với CA server" -#: src/components/AutoCertForm/DNSChallenge.vue:105 +#: src/components/AutoCertForm/DNSChallenge.vue:131 +#: src/views/dns/DDNSManager.vue:65 src/views/dns/DNSDomainList.vue:109 msgid "Credential" msgstr "Chứng chỉ" -#: src/views/certificate/components/DNSChallenge.vue:86 +#: src/routes/modules/dns.ts:20 src/views/dns/components/DNSChallenge.vue:87 msgid "Credentials" msgstr "Chứng chỉ" @@ -1580,6 +1612,18 @@ msgstr "Ngày" msgid "Db file not found" msgstr "Tệp cơ sở dữ liệu không tìm thấy" +#: src/routes/modules/dns.ts:36 +msgid "DDNS" +msgstr "DDNS" + +#: src/views/dns/DDNSManager.vue:153 +msgid "DDNS Overview" +msgstr "Tổng quan DDNS" + +#: src/views/dns/DDNSManager.vue:135 +msgid "DDNS saved" +msgstr "Đã lưu DDNS" + #: src/constants/errors/geolite.ts:12 msgid "Decompression succeeded but failed to delete compressed file: {0}" msgstr "Giải nén thành công nhưng không thể xóa tệp đã nén: {0}" @@ -1604,6 +1648,7 @@ msgstr "Xác định tên và kích thước vùng bộ nhớ dùng chung, ví d #: src/views/config/components/Delete.vue:65 #: src/views/config/components/Delete.vue:97 #: src/views/config/ConfigList.vue:199 +#: src/views/dns/components/DNSRecordTable.vue:94 #: src/views/site/site_list/SiteList.vue:100 #: src/views/stream/StreamList.vue:110 msgid "Delete" @@ -1845,7 +1890,8 @@ msgid "Disable stream %{name} from %{node} successfully" msgstr "Đã vô hiệu hóa luồng %{name} từ %{node} thành công" #: src/views/backup/AutoBackup/AutoBackup.vue:175 -#: src/views/node/nodeColumns.tsx:60 src/views/node/nodeColumns.tsx:78 +#: src/views/dns/DDNSManager.vue:175 src/views/node/nodeColumns.tsx:60 +#: src/views/node/nodeColumns.tsx:78 #: src/views/preference/tabs/HTTPSettings.vue:24 #: src/views/preference/tabs/NodeSettings.vue:25 #: src/views/preference/tabs/NodeSettings.vue:30 @@ -1870,16 +1916,35 @@ msgstr "Ngắt kết nối" msgid "Disk IO" msgstr "Disk IO" -#: src/routes/modules/certificates.ts:28 -#: src/views/certificate/DNSCredential.vue:79 +#: src/routes/modules/dns.ts:11 +msgid "DNS" +msgstr "DNS" + +#: src/views/dns/DNSCredential.vue:79 msgid "DNS Credentials" msgstr "Xác thực DNS" -#: src/components/AutoCertForm/DNSChallenge.vue:95 -#: src/views/certificate/components/DNSChallenge.vue:59 +#: src/routes/modules/dns.ts:28 src/views/dns/DNSDomainList.vue:228 +msgid "DNS Domains" +msgstr "Tên miền DNS" + +#: src/views/dns/components/DNSRecordTable.vue:81 +msgid "DNS Only" +msgstr "Chỉ DNS" + +#: src/components/AutoCertForm/DNSChallenge.vue:121 +#: src/views/dns/components/DNSChallenge.vue:60 msgid "DNS Provider" msgstr "Nhà cung cấp DNS" +#: src/views/dns/DNSDomainList.vue:244 +msgid "DNS Provider Support" +msgstr "Hỗ trợ nhà cung cấp DNS" + +#: src/routes/modules/dns.ts:44 src/views/dns/DNSRecordManager.vue:58 +msgid "DNS Records" +msgstr "Bản ghi DNS" + #: src/views/dashboard/components/SiteHealthCheckModal.vue:678 msgid "DNS Resolver" msgstr "Bộ phân giải DNS" @@ -1940,6 +2005,7 @@ msgid "Document Count" msgstr "Số lượng tài liệu" #: src/views/certificate/components/DNSIssueCertificate.vue:119 +#: src/views/dns/DDNSManager.vue:60 src/views/dns/DNSDomainList.vue:98 msgid "Domain" msgstr "Tên miền" @@ -2029,7 +2095,7 @@ msgstr "Khóa HMAC EAB" msgid "EAB Key ID" msgstr "ID khóa EAB" -#: src/language/curd.ts:8 +#: src/language/curd.ts:8 src/views/dns/components/DNSRecordTable.vue:87 msgid "Edit" msgstr "Chỉnh sửa" @@ -2043,6 +2109,10 @@ msgstr "Sửa %{n}" msgid "Edit Configuration" msgstr "Sửa cấu hình" +#: src/views/dns/DNSRecordManager.vue:200 +msgid "Edit Record" +msgstr "Chỉnh sửa bản ghi" + #: src/routes/modules/sites.ts:34 msgid "Edit Site" msgstr "Sửa trang web" @@ -2093,6 +2163,10 @@ msgstr "Bật hoàn thành mã" msgid "Enable compression for content transfer" msgstr "Bật nén để chuyển nội dung" +#: src/views/dns/DDNSManager.vue:218 +msgid "Enable DDNS" +msgstr "Bật DDNS" + #: src/views/dashboard/components/SiteHealthCheckModal.vue:473 msgid "Enable Health Check" msgstr "Bật kiểm tra tình trạng" @@ -2180,7 +2254,8 @@ msgid "Enable TOTP" msgstr "Bật TOTP" #: src/views/backup/AutoBackup/AutoBackup.vue:174 -#: src/views/node/nodeColumns.tsx:69 src/views/node/nodeColumns.tsx:75 +#: src/views/dns/DDNSManager.vue:175 src/views/node/nodeColumns.tsx:69 +#: src/views/node/nodeColumns.tsx:75 #: src/views/preference/components/ExternalNotify/columns.tsx:47 #: src/views/preference/tabs/HTTPSettings.vue:24 #: src/views/preference/tabs/LogrotateSettings.vue:20 @@ -3146,14 +3221,19 @@ msgstr "Giá trị cao hơn có nghĩa là tái sử dụng kết nối tốt h msgid "History" msgstr "Lịch sử" -#: src/routes/index.ts:52 +#: src/routes/index.ts:54 msgid "Home" msgstr "Trang chủ" +#: src/views/dns/components/DNSRecordFilter.vue:42 #: src/views/preference/tabs/ServerSettings.vue:19 msgid "Host" msgstr "Máy chủ" +#: src/views/dns/components/DNSRecordFilter.vue:45 +msgid "Host, e.g. @ or www" +msgstr "Máy chủ, vd: @ hoặc www" + #: src/views/backup/AutoBackup/components/CronEditor.vue:159 #: src/views/nginx_log/dashboard/components/HourlyChart.vue:87 msgid "Hour" @@ -3225,7 +3305,7 @@ msgstr "" msgid "Import" msgstr "Nhập" -#: src/routes/modules/certificates.ts:54 +#: src/routes/modules/certificates.ts:46 #: src/views/certificate/CertificateEditor.vue:84 msgid "Import Certificate" msgstr "Nhập chứng chỉ" @@ -3348,10 +3428,15 @@ msgstr "" "Không được phép cài đặt sau 10 phút khởi động hệ thống, vui lòng khởi động " "lại Nginx UI." +#: src/views/dns/DDNSManager.vue:79 #: src/views/preference/tabs/LogrotateSettings.vue:26 msgid "Interval" msgstr "Khoảng thời gian" +#: src/views/dns/DDNSManager.vue:232 +msgid "Interval (seconds)" +msgstr "Khoảng thời gian (giây)" + #: src/views/certificate/ACMEUser.vue:166 msgid "Invalid" msgstr "Không hợp lệ" @@ -3580,6 +3665,10 @@ msgstr "Lần lập chỉ mục cuối" msgid "Last month" msgstr "Tháng trước" +#: src/views/dns/DDNSManager.vue:87 +msgid "Last run" +msgstr "Lần chạy cuối" + #: src/views/dashboard/NginxDashBoard.vue:138 msgid "Last update" msgstr "Cập nhật cuối cùng" @@ -3849,6 +3938,10 @@ msgstr "" msgid "Manage Configs" msgstr "Quản lý cấu hình" +#: src/views/dns/DNSDomainList.vue:236 +msgid "Manage Records" +msgstr "Quản lý bản ghi" + #: src/routes/modules/sites.ts:10 src/views/site/site_list/SiteList.vue:45 msgid "Manage Sites" msgstr "Quản lý Website" @@ -4019,7 +4112,7 @@ msgstr "Đã sửa đổi lúc" msgid "Modify" msgstr "Sửa đổi" -#: src/routes/modules/certificates.ts:44 +#: src/routes/modules/certificates.ts:36 #: src/views/certificate/CertificateEditor.vue:84 msgid "Modify Certificate" msgstr "Sửa đổi chứng chỉ" @@ -4080,11 +4173,13 @@ msgstr "Không có" #: src/views/certificate/components/CertificateBasicInfo.vue:44 #: src/views/certificate/components/CertificateBasicInfo.vue:58 #: src/views/certificate/components/CertificateBasicInfo.vue:70 -#: src/views/certificate/DNSCredential.vue:17 #: src/views/config/components/ConfigRightPanel/Basic.vue:34 #: src/views/config/components/Delete.vue:123 #: src/views/config/components/Mkdir.vue:64 -#: src/views/config/configColumns.tsx:17 src/views/namespace/columns.ts:9 +#: src/views/config/configColumns.tsx:17 +#: src/views/dns/components/DNSRecordForm.vue:63 +#: src/views/dns/components/DNSRecordTable.vue:17 +#: src/views/dns/DNSCredential.vue:17 src/views/namespace/columns.ts:9 #: src/views/nginx_log/NginxLogList.vue:155 src/views/node/nodeColumns.tsx:8 #: src/views/preference/components/AuthSettings/AddPasskey.vue:81 #: src/views/site/site_edit/components/RightPanel/Basic.vue:36 @@ -4112,6 +4207,14 @@ msgstr "Không gian tên" msgid "Namespaces" msgstr "Không gian tên" +#: src/views/dns/DNSDomainList.vue:251 +msgid "" +"Need more DNS providers? Support us through donations or contact us for " +"commercial collaboration" +msgstr "" +"Cần thêm nhà cung cấp DNS? Hãy hỗ trợ chúng tôi qua quyên góp hoặc liên hệ " +"để hợp tác thương mại" + #: src/views/dashboard/NginxDashBoard.vue:195 msgid "Need to enable the stub_status module" msgstr "Cần bật module stub_status" @@ -4506,6 +4609,10 @@ msgstr "Chưa được lập chỉ mục" msgid "Not Loaded" msgstr "Chưa tải" +#: src/views/dns/DDNSManager.vue:102 +msgid "Not run yet" +msgstr "Chưa được chạy" + #: src/components/AutoCertForm/AutoCertForm.vue:230 msgid "Not supported for IP certificates" msgstr "Không hỗ trợ cho chứng chỉ IP" @@ -4515,7 +4622,7 @@ msgid "Not Valid Before: %{date}" msgstr "Không hợp lệ trước: %{date}" #: src/components/AutoCertForm/AutoCertForm.vue:150 -#: src/views/certificate/DNSCredential.vue:89 +#: src/views/dns/DNSCredential.vue:89 msgid "Note" msgstr "Ghi chú" @@ -4644,10 +4751,6 @@ msgstr "Đồng ý" msgid "On" msgstr "Bật" -#: src/views/certificate/DNSCredential.vue:99 -msgid "Once the verification is complete, the records will be removed." -msgstr "Sau khi quá trình xác minh hoàn tất, bản ghi sẽ bị xóa." - #: src/components/NamespaceTabs/NamespaceTabs.vue:164 #: src/components/NodeCard/NodeCard.vue:51 #: src/components/NodeSelector/NodeSelector.vue:65 @@ -4940,7 +5043,7 @@ msgstr "Vui lòng điền đầy đủ và chính xác tất cả các trường msgid "Please fill in required S3 configuration fields" msgstr "Vui lòng điền vào các trường cấu hình S3 bắt buộc" -#: src/views/certificate/DNSCredential.vue:93 +#: src/views/dns/DNSCredential.vue:93 msgid "" "Please fill in the API authentication credentials provided by your DNS " "provider." @@ -5001,7 +5104,7 @@ msgstr "Vui lòng nhập username!" msgid "Please log in." msgstr "Vui lòng đăng nhập." -#: src/views/certificate/DNSCredential.vue:102 +#: src/views/dns/DNSCredential.vue:96 msgid "Please note that the unit of time configurations below are all in seconds." msgstr "Lưu ý đơn vị cấu hình thời gian bên dưới được tính bằng giây." @@ -5081,6 +5184,11 @@ msgstr "Cài đặt" msgid "Preparing lego configurations" msgstr "Chuẩn bị cấu hình Lego" +#: src/views/dns/components/DNSRecordForm.vue:81 +#: src/views/dns/components/DNSRecordTable.vue:33 +msgid "Priority" +msgstr "Ưu tiên" + #: src/components/AutoCertForm/AutoCertForm.vue:206 msgid "Private CA:" msgstr "CA riêng:" @@ -5143,7 +5251,8 @@ msgstr "" "Cấu hình giao thức chỉ có hiệu lực khi kết nối trực tiếp. Nếu sử dụng proxy " "ngược, vui lòng cấu hình giao thức riêng trong proxy ngược." -#: src/views/certificate/DNSCredential.vue:26 +#: src/views/dns/DDNSManager.vue:70 src/views/dns/DNSCredential.vue:26 +#: src/views/dns/DNSDomainList.vue:177 src/views/dns/DNSDomainList.vue:198 msgid "Provider" msgstr "Nhà cung cấp" @@ -5155,6 +5264,12 @@ msgstr "Không tìm thấy nhà cung cấp: {0}" msgid "Province / Region" msgstr "Tỉnh / Vùng" +#: src/views/dns/components/DNSRecordForm.vue:87 +#: src/views/dns/components/DNSRecordTable.vue:51 +#: src/views/dns/components/DNSRecordTable.vue:81 +msgid "Proxied" +msgstr "Được proxy" + #: src/views/certificate/ACMEUser.vue:63 msgid "Proxy" msgstr "Proxy" @@ -5249,6 +5364,22 @@ msgstr "Kiểm tra lại" msgid "Recommended:" msgstr "Đề xuất:" +#: src/views/dns/DNSRecordManager.vue:113 +msgid "Record created" +msgstr "Đã tạo bản ghi" + +#: src/views/dns/DNSRecordManager.vue:120 +msgid "Record deleted" +msgstr "Đã xóa bản ghi" + +#: src/views/dns/DNSRecordManager.vue:109 +msgid "Record updated" +msgstr "Bản ghi đã được cập nhật" + +#: src/views/dns/DDNSManager.vue:221 +msgid "Records" +msgstr "Bản ghi" + #: src/components/TwoFA/Authorization.vue:79 msgid "Recovery" msgstr "Khôi phục" @@ -5278,7 +5409,8 @@ msgstr "Thông điệp chuyển hướng (3xx)" msgid "Referer" msgstr "Người giới thiệu" -#: src/language/curd.ts:70 +#: src/language/curd.ts:70 src/views/dns/DDNSManager.vue:161 +#: src/views/dns/DNSRecordManager.vue:165 msgid "Refresh" msgstr "Làm mới" @@ -5520,7 +5652,7 @@ msgstr "Yêu cầu có chứa tham số sai" msgid "Requests Per Connection" msgstr "Yêu cầu mỗi kết nối" -#: src/language/curd.ts:13 +#: src/language/curd.ts:13 src/views/dns/components/DNSRecordFilter.vue:65 #: src/views/nginx_log/structured/components/SearchFilters.vue:214 #: src/views/nginx_log/structured/StructuredLogViewer.vue:745 msgid "Reset" @@ -5761,6 +5893,7 @@ msgstr "Thứ Bảy" #: src/views/config/components/ConfigLeftPanel.vue:283 #: src/views/config/components/ConfigName.vue:58 #: src/views/dashboard/components/SiteHealthCheckModal.vue:713 +#: src/views/dns/DDNSManager.vue:247 src/views/dns/DNSRecordManager.vue:215 #: src/views/preference/components/AuthSettings/Passkey.vue:131 #: src/views/preference/Preference.vue:124 #: src/views/site/site_edit/components/ConfigName/ConfigName.vue:52 @@ -5866,12 +5999,13 @@ msgstr "Lịch trình" msgid "Schedule Type" msgstr "Loại lịch trình" -#: src/views/certificate/components/DNSChallenge.vue:77 +#: src/views/dns/components/DNSChallenge.vue:78 msgid "SDK" msgstr "SDK" #: src/language/constants.ts:62 src/language/curd.ts:12 #: src/views/config/configColumns.tsx:5 +#: src/views/dns/components/DNSRecordFilter.vue:62 #: src/views/nginx_log/structured/components/SearchFilters.vue:217 #: src/views/site/site_list/columns.tsx:17 src/views/stream/columns.tsx:13 msgid "Search" @@ -5930,10 +6064,18 @@ msgstr "" msgid "Select all" msgstr "Chọn tất cả" +#: src/language/constants.ts:68 +msgid "Select Credential" +msgstr "Chọn thông tin xác thực" + #: src/views/certificate/ACMEUser.vue:45 msgid "Select or enter a CA directory URL" msgstr "Chọn hoặc nhập URL thư mục CA" +#: src/language/constants.ts:67 +msgid "Select Provider" +msgstr "Chọn nhà cung cấp" + #: src/language/curd.ts:59 msgid "Selected {count} files" msgstr "Đã chọn {count} tệp" @@ -6257,6 +6399,7 @@ msgstr "Tĩnh" #: src/views/certificate/ACMEUser.vue:75 #: src/views/certificate/CertificateList/certColumns.tsx:63 #: src/views/dashboard/components/ModulesTable.vue:75 +#: src/views/dns/DDNSManager.vue:75 #: src/views/nginx_log/structured/components/SearchFilters.vue:106 #: src/views/nginx_log/structured/StructuredLogViewer.vue:241 #: src/views/nginx_log/structured/StructuredLogViewer.vue:521 @@ -6488,6 +6631,10 @@ msgstr "Khôi phục hệ thống" msgid "System restored successfully." msgstr "Hệ thống đã được khôi phục thành công." +#: src/views/dns/DDNSManager.vue:83 +msgid "Targets" +msgstr "Mục tiêu" + #: src/constants/errors/self_check.ts:3 msgid "Task is not fixable" msgstr "Nhiệm vụ không thể sửa chữa" @@ -7027,6 +7174,14 @@ msgstr "Hãy thử điều chỉnh tiêu chí tìm kiếm hoặc điều hướn msgid "Try adjusting your search criteria or time range." msgstr "Hãy thử điều chỉnh tiêu chí tìm kiếm hoặc khoảng thời gian." +#: src/views/dns/components/DNSRecordTable.vue:29 +msgid "TTL" +msgstr "TTL" + +#: src/views/dns/components/DNSRecordForm.vue:78 +msgid "TTL (seconds)" +msgstr "TTL (giây)" + #: src/views/backup/AutoBackup/components/CronEditor.vue:28 msgid "Tuesday" msgstr "Thứ Ba" @@ -7039,6 +7194,9 @@ msgstr "Yêu cầu xác thực hai yếu tố" #: src/views/certificate/CertificateList/certColumns.tsx:24 #: src/views/config/components/Delete.vue:122 #: src/views/dashboard/components/ModulesTable.vue:62 +#: src/views/dns/components/DNSRecordFilter.vue:49 +#: src/views/dns/components/DNSRecordForm.vue:57 +#: src/views/dns/components/DNSRecordTable.vue:21 #: src/views/nginx_log/NginxLogList.vue:146 #: src/views/notification/notificationColumns.tsx:8 #: src/views/preference/components/ExternalNotify/columns.tsx:19 @@ -7049,6 +7207,10 @@ msgstr "Loại" msgid "Type %{delete} to confirm" msgstr "Nhập %{delete} để xác nhận" +#: src/views/dns/DDNSManager.vue:228 +msgid "Type or select A/AAAA records" +msgstr "Nhập hoặc chọn bản ghi A/AAAA" + #: src/views/nginx_log/structured/components/SearchFilters.vue:142 msgid "Type or select browser" msgstr "Nhập hoặc chọn trình duyệt" @@ -7104,9 +7266,9 @@ msgstr "Cập nhật thành công" #: src/views/backup/AutoBackup/AutoBackup.vue:236 #: src/views/certificate/ACMEUser.vue:124 -#: src/views/certificate/DNSCredential.vue:65 #: src/views/config/components/ConfigRightPanel/Basic.vue:54 -#: src/views/config/configColumns.tsx:44 src/views/namespace/columns.ts:91 +#: src/views/config/configColumns.tsx:44 src/views/dns/DNSCredential.vue:65 +#: src/views/dns/DNSDomainList.vue:205 src/views/namespace/columns.ts:91 #: src/views/node/nodeColumns.tsx:89 #: src/views/site/site_edit/components/RightPanel/Basic.vue:39 #: src/views/site/site_list/columns.tsx:113 src/views/stream/columns.tsx:80 @@ -7179,6 +7341,10 @@ msgstr "Thời gian hoạt động:" msgid "URL" msgstr "URL" +#: src/views/dns/components/DNSRecordForm.vue:64 +msgid "Use @ for root" +msgstr "Sử dụng @ cho gốc" + #: src/components/TwoFA/Authorization.vue:121 msgid "Use OTP" msgstr "Sử dụng OTP" @@ -7244,6 +7410,8 @@ msgid "Validate SSL Certificate" msgstr "Xác thực chứng chỉ SSL" #: src/views/dashboard/components/PerformanceTablesCard.vue:22 +#: src/views/dns/components/DNSRecordForm.vue:66 +#: src/views/dns/components/DNSRecordTable.vue:25 msgid "Value" msgstr "Giá trị" @@ -7339,14 +7507,6 @@ msgstr "" msgid "We do not accept any feature requests" msgstr "Chúng tôi không chấp nhận bất kỳ yêu cầu tính năng nào" -#: src/views/certificate/DNSCredential.vue:96 -msgid "" -"We will add one or more TXT records to the DNS records of your domain for " -"ownership verification." -msgstr "" -"Chúng tôi sẽ thêm một hoặc nhiều bản ghi TXT để xác minh quyền sở hữu tên " -"miền của bạn." - #: src/views/site/site_edit/components/Cert/ObtainCert.vue:142 msgid "" "We will remove the HTTPChallenge configuration from this file and reload " @@ -7383,6 +7543,11 @@ msgstr "Hàng tuần" msgid "Weekly on %{day} at %{time}" msgstr "Hàng tuần vào %{day} lúc %{time}" +#: src/views/dns/components/DNSRecordForm.vue:84 +#: src/views/dns/components/DNSRecordTable.vue:37 +msgid "Weight" +msgstr "Trọng lượng" + #: src/views/certificate/ACMEUser.vue:119 msgid "" "When Enabled, Nginx UI will automatically re-register users upon startup. " @@ -7431,7 +7596,7 @@ msgstr "Tiến trình công nhân" msgid "Workers" msgstr "Công nhân" -#: src/layouts/HeaderLayout.vue:61 src/routes/index.ts:61 +#: src/layouts/HeaderLayout.vue:61 src/routes/index.ts:63 #: src/views/workspace/WorkSpace.vue:51 msgid "Workspace" msgstr "Không gian làm việc" @@ -7534,6 +7699,16 @@ msgstr "Khóa truy cập của bạn" msgid "Zero-allocation pipeline" msgstr "Đường ống không cấp phát" +#~ msgid "Once the verification is complete, the records will be removed." +#~ msgstr "Sau khi quá trình xác minh hoàn tất, bản ghi sẽ bị xóa." + +#~ msgid "" +#~ "We will add one or more TXT records to the DNS records of your domain for " +#~ "ownership verification." +#~ msgstr "" +#~ "Chúng tôi sẽ thêm một hoặc nhiều bản ghi TXT để xác minh quyền sở hữu tên " +#~ "miền của bạn." + #~ msgid "Settings" #~ msgstr "Cài đặt" @@ -7555,9 +7730,6 @@ msgstr "Đường ống không cấp phát" #~ msgid "Tested in isolated sandbox mode" #~ msgstr "Đã kiểm tra trong chế độ sandbox cách ly" -#~ msgid "All" -#~ msgstr "Tất cả" - #~ msgid "Based on M2 Pro (12 cores) testing" #~ msgstr "Dựa trên thử nghiệm M2 Pro (12 lõi)" @@ -7762,9 +7934,6 @@ msgstr "Đường ống không cấp phát" #~ msgid "Are you sure you want to apply to all selected?" #~ msgstr "Bạn có chắc chắn muốn áp dụng cho tất cả các mục đã chọn không?" -#~ msgid "Are you sure you want to delete this item?" -#~ msgstr "Bạn có chắc chắn muốn xóa mục này không?" - #~ msgid "Are you sure you want to recover this item?" #~ msgstr "Bạn có chắc chắn muốn khôi phục mục này không?" diff --git a/app/src/language/zh_CN/app.po b/app/src/language/zh_CN/app.po index 836592b0..1ea1e11f 100644 --- a/app/src/language/zh_CN/app.po +++ b/app/src/language/zh_CN/app.po @@ -182,8 +182,10 @@ msgstr "操作" #: src/views/backup/AutoBackup/AutoBackup.vue:273 #: src/views/certificate/ACMEUser.vue:131 #: src/views/certificate/CertificateList/certColumns.tsx:92 -#: src/views/certificate/DNSCredential.vue:71 -#: src/views/config/configColumns.tsx:51 src/views/namespace/columns.ts:97 +#: src/views/config/configColumns.tsx:51 +#: src/views/dns/components/DNSRecordTable.vue:41 +#: src/views/dns/DDNSManager.vue:91 src/views/dns/DNSCredential.vue:71 +#: src/views/dns/DNSDomainList.vue:211 src/views/namespace/columns.ts:97 #: src/views/nginx_log/NginxLogList.vue:338 src/views/node/nodeColumns.tsx:96 #: src/views/notification/notificationColumns.tsx:72 #: src/views/preference/components/ExternalNotify/columns.tsx:85 @@ -237,6 +239,10 @@ msgstr "添加标头" msgid "Add Location" msgstr "添加 Location" +#: src/views/dns/DNSRecordManager.vue:171 +msgid "Add Record" +msgstr "添加记录" + #: src/components/NgxConfigEditor/NgxServer.vue:92 msgid "Add Server" msgstr "添加服务器" @@ -257,7 +263,7 @@ msgstr "添加上游" msgid "Added successfully" msgstr "添加成功" -#: src/views/certificate/components/DNSChallenge.vue:97 +#: src/views/dns/components/DNSChallenge.vue:98 msgid "Additional" msgstr "额外选项" @@ -294,6 +300,10 @@ msgstr "高级设置" msgid "Afterwards, refresh this page and click add passkey again." msgstr "之后,请刷新此页面并再次点击添加通行密钥。" +#: src/views/dns/components/DNSRecordFilter.vue:55 +msgid "All" +msgstr "全部" + #: src/views/system/Licenses.vue:152 msgid "All Components" msgstr "所有组件" @@ -331,7 +341,7 @@ msgstr "任何可访问的 IP 地址均可用于私有证书颁发机构" msgid "API Base Url" msgstr "API 地址" -#: src/views/certificate/components/DNSChallenge.vue:70 +#: src/views/dns/components/DNSChallenge.vue:71 msgid "API Document" msgstr "API 文档" @@ -367,6 +377,10 @@ msgstr "您确定要立即删除这个被禁用的 IP 吗?" msgid "Are you sure to delete this passkey immediately?" msgstr "您确定要立即删除这个 Passkey 吗?" +#: src/views/dns/components/DNSRecordTable.vue:90 +msgid "Are you sure to delete this record?" +msgstr "确定要删除这条记录吗?" + #: src/views/preference/components/AuthSettings/RecoveryCodes.vue:155 msgid "Are you sure to generate new recovery codes?" msgstr "您确定要生成新的恢复代码吗?" @@ -536,7 +550,7 @@ msgstr "平均/PV" #: src/views/certificate/components/CertificateActions.vue:22 #: src/views/config/components/ConfigLeftPanel.vue:274 #: src/views/config/ConfigList.vue:120 src/views/config/ConfigList.vue:217 -#: src/views/nginx_log/NginxLog.vue:129 +#: src/views/dns/DNSRecordManager.vue:223 src/views/nginx_log/NginxLog.vue:129 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:183 #: src/views/stream/components/StreamEditor.vue:147 msgid "Back" @@ -682,6 +696,10 @@ msgstr "浏览器" msgid "Browser Statistics" msgstr "浏览器统计" +#: src/views/dns/DNSDomainList.vue:257 +msgid "Business contact:" +msgstr "商务联系:" + #: src/views/nginx_log/components/IndexingSettingsModal.vue:316 msgid "" "By enabling advanced indexing, you acknowledge that your system meets the " @@ -747,6 +765,7 @@ msgstr "基于 worker_processes * worker_connections 计算得出。实际性能 #: src/components/NgxConfigEditor/NgxUpstream.vue:32 src/language/curd.ts:37 #: src/views/config/components/Delete.vue:98 #: src/views/dashboard/components/SiteHealthCheckModal.vue:710 +#: src/views/dns/DDNSManager.vue:244 src/views/dns/DNSRecordManager.vue:212 #: src/views/nginx_log/components/IndexingSettingsModal.vue:102 #: src/views/nginx_log/indexing/IndexManagement.vue:33 #: src/views/nginx_log/indexing/IndexManagement.vue:59 @@ -892,7 +911,7 @@ msgstr "证书类型" msgid "Certificates" msgstr "证书" -#: src/routes/modules/certificates.ts:36 +#: src/routes/modules/certificates.ts:28 msgid "Certificates List" msgstr "证书列表" @@ -1250,7 +1269,7 @@ msgstr "配置路径为空" msgid "Config Template" msgstr "配置模板" -#: src/views/certificate/DNSCredential.vue:52 +#: src/views/dns/DNSCredential.vue:52 msgid "Configuration" msgstr "配置" @@ -1278,6 +1297,14 @@ msgstr "配置名称" msgid "Configurations" msgstr "配置" +#: src/views/dns/DDNSManager.vue:201 +msgid "Configure" +msgstr "配置" + +#: src/views/dns/DDNSManager.vue:211 +msgid "Configure DDNS" +msgstr "配置 DDNS" + #: src/views/site/site_add/SiteAdd.vue:81 msgid "Configure SSL" msgstr "配置 SSL" @@ -1399,6 +1426,10 @@ msgstr "创建文件" msgid "Create Folder" msgstr "创建文件夹" +#: src/views/dns/DNSRecordManager.vue:200 +msgid "Create Record" +msgstr "创建记录" + #: src/views/backup/components/BackupCreator.vue:75 msgid "" "Create system backups including Nginx configuration and Nginx UI settings. " @@ -1422,11 +1453,12 @@ msgstr "创建成功" msgid "Creating client facilitates communication with the CA server" msgstr "正在创建客户端用于与 CA 服务器通信" -#: src/components/AutoCertForm/DNSChallenge.vue:105 +#: src/components/AutoCertForm/DNSChallenge.vue:131 +#: src/views/dns/DDNSManager.vue:65 src/views/dns/DNSDomainList.vue:109 msgid "Credential" msgstr "DNS 凭证" -#: src/views/certificate/components/DNSChallenge.vue:86 +#: src/routes/modules/dns.ts:20 src/views/dns/components/DNSChallenge.vue:87 msgid "Credentials" msgstr "凭证" @@ -1541,6 +1573,18 @@ msgstr "天" msgid "Db file not found" msgstr "数据库文件未找到" +#: src/routes/modules/dns.ts:36 +msgid "DDNS" +msgstr "DDNS" + +#: src/views/dns/DDNSManager.vue:153 +msgid "DDNS Overview" +msgstr "DDNS 概览" + +#: src/views/dns/DDNSManager.vue:135 +msgid "DDNS saved" +msgstr "DDNS 已保存" + #: src/constants/errors/geolite.ts:12 msgid "Decompression succeeded but failed to delete compressed file: {0}" msgstr "解压成功但删除压缩文件失败: {0}" @@ -1565,6 +1609,7 @@ msgstr "定义共享内存区名称和大小,例如 proxy_cache:10m" #: src/views/config/components/Delete.vue:65 #: src/views/config/components/Delete.vue:97 #: src/views/config/ConfigList.vue:199 +#: src/views/dns/components/DNSRecordTable.vue:94 #: src/views/site/site_list/SiteList.vue:100 #: src/views/stream/StreamList.vue:110 msgid "Delete" @@ -1806,7 +1851,8 @@ msgid "Disable stream %{name} from %{node} successfully" msgstr "在 %{node} 上禁用 %{name} 成功" #: src/views/backup/AutoBackup/AutoBackup.vue:175 -#: src/views/node/nodeColumns.tsx:60 src/views/node/nodeColumns.tsx:78 +#: src/views/dns/DDNSManager.vue:175 src/views/node/nodeColumns.tsx:60 +#: src/views/node/nodeColumns.tsx:78 #: src/views/preference/tabs/HTTPSettings.vue:24 #: src/views/preference/tabs/NodeSettings.vue:25 #: src/views/preference/tabs/NodeSettings.vue:30 @@ -1831,16 +1877,35 @@ msgstr "已断开连接" msgid "Disk IO" msgstr "磁盘 IO" -#: src/routes/modules/certificates.ts:28 -#: src/views/certificate/DNSCredential.vue:79 +#: src/routes/modules/dns.ts:11 +msgid "DNS" +msgstr "DNS" + +#: src/views/dns/DNSCredential.vue:79 msgid "DNS Credentials" msgstr "DNS 凭证" -#: src/components/AutoCertForm/DNSChallenge.vue:95 -#: src/views/certificate/components/DNSChallenge.vue:59 +#: src/routes/modules/dns.ts:28 src/views/dns/DNSDomainList.vue:228 +msgid "DNS Domains" +msgstr "DNS 域名" + +#: src/views/dns/components/DNSRecordTable.vue:81 +msgid "DNS Only" +msgstr "仅DNS" + +#: src/components/AutoCertForm/DNSChallenge.vue:121 +#: src/views/dns/components/DNSChallenge.vue:60 msgid "DNS Provider" msgstr "DNS 提供商" +#: src/views/dns/DNSDomainList.vue:244 +msgid "DNS Provider Support" +msgstr "DNS 提供商支持" + +#: src/routes/modules/dns.ts:44 src/views/dns/DNSRecordManager.vue:58 +msgid "DNS Records" +msgstr "DNS 记录" + #: src/views/dashboard/components/SiteHealthCheckModal.vue:678 msgid "DNS Resolver" msgstr "DNS 解析器" @@ -1901,6 +1966,7 @@ msgid "Document Count" msgstr "文档数量" #: src/views/certificate/components/DNSIssueCertificate.vue:119 +#: src/views/dns/DDNSManager.vue:60 src/views/dns/DNSDomainList.vue:98 msgid "Domain" msgstr "域名" @@ -1986,7 +2052,7 @@ msgstr "EAB HMAC 密钥" msgid "EAB Key ID" msgstr "EAB 密钥 ID" -#: src/language/curd.ts:8 +#: src/language/curd.ts:8 src/views/dns/components/DNSRecordTable.vue:87 msgid "Edit" msgstr "编辑" @@ -2000,6 +2066,10 @@ msgstr "编辑 %{n}" msgid "Edit Configuration" msgstr "编辑配置" +#: src/views/dns/DNSRecordManager.vue:200 +msgid "Edit Record" +msgstr "编辑记录" + #: src/routes/modules/sites.ts:34 msgid "Edit Site" msgstr "编辑站点" @@ -2050,6 +2120,10 @@ msgstr "启动代码补全" msgid "Enable compression for content transfer" msgstr "启用内容传输压缩" +#: src/views/dns/DDNSManager.vue:218 +msgid "Enable DDNS" +msgstr "启用 DDNS" + #: src/views/dashboard/components/SiteHealthCheckModal.vue:473 msgid "Enable Health Check" msgstr "启用健康检查" @@ -2137,7 +2211,8 @@ msgid "Enable TOTP" msgstr "启用 TOTP" #: src/views/backup/AutoBackup/AutoBackup.vue:174 -#: src/views/node/nodeColumns.tsx:69 src/views/node/nodeColumns.tsx:75 +#: src/views/dns/DDNSManager.vue:175 src/views/node/nodeColumns.tsx:69 +#: src/views/node/nodeColumns.tsx:75 #: src/views/preference/components/ExternalNotify/columns.tsx:47 #: src/views/preference/tabs/HTTPSettings.vue:24 #: src/views/preference/tabs/LogrotateSettings.vue:20 @@ -3080,14 +3155,19 @@ msgstr "更高的值意味着更好的连接再利用" msgid "History" msgstr "历史" -#: src/routes/index.ts:52 +#: src/routes/index.ts:54 msgid "Home" msgstr "首页" +#: src/views/dns/components/DNSRecordFilter.vue:42 #: src/views/preference/tabs/ServerSettings.vue:19 msgid "Host" msgstr "主机" +#: src/views/dns/components/DNSRecordFilter.vue:45 +msgid "Host, e.g. @ or www" +msgstr "主机,例如 @ 或 www" + #: src/views/backup/AutoBackup/components/CronEditor.vue:159 #: src/views/nginx_log/dashboard/components/HourlyChart.vue:87 msgid "Hour" @@ -3153,7 +3233,7 @@ msgstr "如果您的域名有 CNAME 记录且无法获取证书,则需要启 msgid "Import" msgstr "导入" -#: src/routes/modules/certificates.ts:54 +#: src/routes/modules/certificates.ts:46 #: src/views/certificate/CertificateEditor.vue:84 msgid "Import Certificate" msgstr "导入证书" @@ -3272,10 +3352,15 @@ msgid "" "restart the Nginx UI." msgstr "系统启动 10 分钟后不允许安装,请重启 Nginx UI。" +#: src/views/dns/DDNSManager.vue:79 #: src/views/preference/tabs/LogrotateSettings.vue:26 msgid "Interval" msgstr "间隔" +#: src/views/dns/DDNSManager.vue:232 +msgid "Interval (seconds)" +msgstr "间隔(秒)" + #: src/views/certificate/ACMEUser.vue:166 msgid "Invalid" msgstr "无效的" @@ -3502,6 +3587,10 @@ msgstr "最后索引时间" msgid "Last month" msgstr "上个月" +#: src/views/dns/DDNSManager.vue:87 +msgid "Last run" +msgstr "上次运行" + #: src/views/dashboard/NginxDashBoard.vue:138 msgid "Last update" msgstr "上次更新" @@ -3762,6 +3851,10 @@ msgstr "在获取签发证书前,请确保配置文件中已将 .well-known msgid "Manage Configs" msgstr "配置管理" +#: src/views/dns/DNSDomainList.vue:236 +msgid "Manage Records" +msgstr "管理记录" + #: src/routes/modules/sites.ts:10 src/views/site/site_list/SiteList.vue:45 msgid "Manage Sites" msgstr "网站管理" @@ -3932,7 +4025,7 @@ msgstr "修改时间" msgid "Modify" msgstr "修改" -#: src/routes/modules/certificates.ts:44 +#: src/routes/modules/certificates.ts:36 #: src/views/certificate/CertificateEditor.vue:84 msgid "Modify Certificate" msgstr "修改证书" @@ -3993,11 +4086,13 @@ msgstr "不适用" #: src/views/certificate/components/CertificateBasicInfo.vue:44 #: src/views/certificate/components/CertificateBasicInfo.vue:58 #: src/views/certificate/components/CertificateBasicInfo.vue:70 -#: src/views/certificate/DNSCredential.vue:17 #: src/views/config/components/ConfigRightPanel/Basic.vue:34 #: src/views/config/components/Delete.vue:123 #: src/views/config/components/Mkdir.vue:64 -#: src/views/config/configColumns.tsx:17 src/views/namespace/columns.ts:9 +#: src/views/config/configColumns.tsx:17 +#: src/views/dns/components/DNSRecordForm.vue:63 +#: src/views/dns/components/DNSRecordTable.vue:17 +#: src/views/dns/DNSCredential.vue:17 src/views/namespace/columns.ts:9 #: src/views/nginx_log/NginxLogList.vue:155 src/views/node/nodeColumns.tsx:8 #: src/views/preference/components/AuthSettings/AddPasskey.vue:81 #: src/views/site/site_edit/components/RightPanel/Basic.vue:36 @@ -4025,6 +4120,12 @@ msgstr "命名空间" msgid "Namespaces" msgstr "命名空间" +#: src/views/dns/DNSDomainList.vue:251 +msgid "" +"Need more DNS providers? Support us through donations or contact us for " +"commercial collaboration" +msgstr "需要更多 DNS 提供商?通过捐赠支持我们或联系我们进行商业合作" + #: src/views/dashboard/NginxDashBoard.vue:195 msgid "Need to enable the stub_status module" msgstr "需要启用 stub_status 模块" @@ -4415,6 +4516,10 @@ msgstr "未索引" msgid "Not Loaded" msgstr "未加载" +#: src/views/dns/DDNSManager.vue:102 +msgid "Not run yet" +msgstr "尚未运行" + #: src/components/AutoCertForm/AutoCertForm.vue:230 msgid "Not supported for IP certificates" msgstr "不支持 IP 证书" @@ -4424,7 +4529,7 @@ msgid "Not Valid Before: %{date}" msgstr "此前无效: %{date}" #: src/components/AutoCertForm/AutoCertForm.vue:150 -#: src/views/certificate/DNSCredential.vue:89 +#: src/views/dns/DNSCredential.vue:89 msgid "Note" msgstr "注意" @@ -4547,10 +4652,6 @@ msgstr "确定" msgid "On" msgstr "开启" -#: src/views/certificate/DNSCredential.vue:99 -msgid "Once the verification is complete, the records will be removed." -msgstr "一旦验证完成,这些记录将被删除。" - #: src/components/NamespaceTabs/NamespaceTabs.vue:164 #: src/components/NodeCard/NodeCard.vue:51 #: src/components/NodeSelector/NodeSelector.vue:65 @@ -4835,7 +4936,7 @@ msgstr "请正确填写所有字段" msgid "Please fill in required S3 configuration fields" msgstr "请填写必填的 S3 配置字段" -#: src/views/certificate/DNSCredential.vue:93 +#: src/views/dns/DNSCredential.vue:93 msgid "" "Please fill in the API authentication credentials provided by your DNS " "provider." @@ -4892,7 +4993,7 @@ msgstr "请输入您的用户名!" msgid "Please log in." msgstr "请登录。" -#: src/views/certificate/DNSCredential.vue:102 +#: src/views/dns/DNSCredential.vue:96 msgid "Please note that the unit of time configurations below are all in seconds." msgstr "请注意,下面的时间单位配置均以秒为单位。" @@ -4972,6 +5073,11 @@ msgstr "偏好设置" msgid "Preparing lego configurations" msgstr "正在准备 Lego 的配置" +#: src/views/dns/components/DNSRecordForm.vue:81 +#: src/views/dns/components/DNSRecordTable.vue:33 +msgid "Priority" +msgstr "优先级" + #: src/components/AutoCertForm/AutoCertForm.vue:206 msgid "Private CA:" msgstr "私有 CA:" @@ -5032,7 +5138,8 @@ msgid "" "proxy." msgstr "协议配置仅在直接连接时生效。如果使用反向代理,请在反向代理中单独配置协议。" -#: src/views/certificate/DNSCredential.vue:26 +#: src/views/dns/DDNSManager.vue:70 src/views/dns/DNSCredential.vue:26 +#: src/views/dns/DNSDomainList.vue:177 src/views/dns/DNSDomainList.vue:198 msgid "Provider" msgstr "提供商" @@ -5044,6 +5151,12 @@ msgstr "未找到提供商:{0}" msgid "Province / Region" msgstr "省份 / 地区" +#: src/views/dns/components/DNSRecordForm.vue:87 +#: src/views/dns/components/DNSRecordTable.vue:51 +#: src/views/dns/components/DNSRecordTable.vue:81 +msgid "Proxied" +msgstr "已代理" + #: src/views/certificate/ACMEUser.vue:63 msgid "Proxy" msgstr "代理" @@ -5138,6 +5251,22 @@ msgstr "重新检查" msgid "Recommended:" msgstr "推荐:" +#: src/views/dns/DNSRecordManager.vue:113 +msgid "Record created" +msgstr "记录已创建" + +#: src/views/dns/DNSRecordManager.vue:120 +msgid "Record deleted" +msgstr "记录已删除" + +#: src/views/dns/DNSRecordManager.vue:109 +msgid "Record updated" +msgstr "记录已更新" + +#: src/views/dns/DDNSManager.vue:221 +msgid "Records" +msgstr "记录" + #: src/components/TwoFA/Authorization.vue:79 msgid "Recovery" msgstr "恢复" @@ -5165,7 +5294,8 @@ msgstr "重定向消息 (3xx)" msgid "Referer" msgstr "来源" -#: src/language/curd.ts:70 +#: src/language/curd.ts:70 src/views/dns/DDNSManager.vue:161 +#: src/views/dns/DNSRecordManager.vue:165 msgid "Refresh" msgstr "刷新" @@ -5405,7 +5535,7 @@ msgstr "请求参数错误" msgid "Requests Per Connection" msgstr "每次连接请求数" -#: src/language/curd.ts:13 +#: src/language/curd.ts:13 src/views/dns/components/DNSRecordFilter.vue:65 #: src/views/nginx_log/structured/components/SearchFilters.vue:214 #: src/views/nginx_log/structured/StructuredLogViewer.vue:745 msgid "Reset" @@ -5641,6 +5771,7 @@ msgstr "星期六" #: src/views/config/components/ConfigLeftPanel.vue:283 #: src/views/config/components/ConfigName.vue:58 #: src/views/dashboard/components/SiteHealthCheckModal.vue:713 +#: src/views/dns/DDNSManager.vue:247 src/views/dns/DNSRecordManager.vue:215 #: src/views/preference/components/AuthSettings/Passkey.vue:131 #: src/views/preference/Preference.vue:124 #: src/views/site/site_edit/components/ConfigName/ConfigName.vue:52 @@ -5746,12 +5877,13 @@ msgstr "计划" msgid "Schedule Type" msgstr "计划类型" -#: src/views/certificate/components/DNSChallenge.vue:77 +#: src/views/dns/components/DNSChallenge.vue:78 msgid "SDK" msgstr "SDK" #: src/language/constants.ts:62 src/language/curd.ts:12 #: src/views/config/configColumns.tsx:5 +#: src/views/dns/components/DNSRecordFilter.vue:62 #: src/views/nginx_log/structured/components/SearchFilters.vue:217 #: src/views/site/site_list/columns.tsx:17 src/views/stream/columns.tsx:13 msgid "Search" @@ -5808,10 +5940,18 @@ msgstr "选择一个预定义的 CA 目录或输入自定义目录。留空则 msgid "Select all" msgstr "全选" +#: src/language/constants.ts:68 +msgid "Select Credential" +msgstr "选择凭证" + #: src/views/certificate/ACMEUser.vue:45 msgid "Select or enter a CA directory URL" msgstr "选择或输入 CA 目录 URL" +#: src/language/constants.ts:67 +msgid "Select Provider" +msgstr "选择提供商" + #: src/language/curd.ts:59 msgid "Selected {count} files" msgstr "已选择 {count} 个文件" @@ -6131,6 +6271,7 @@ msgstr "静态" #: src/views/certificate/ACMEUser.vue:75 #: src/views/certificate/CertificateList/certColumns.tsx:63 #: src/views/dashboard/components/ModulesTable.vue:75 +#: src/views/dns/DDNSManager.vue:75 #: src/views/nginx_log/structured/components/SearchFilters.vue:106 #: src/views/nginx_log/structured/StructuredLogViewer.vue:241 #: src/views/nginx_log/structured/StructuredLogViewer.vue:521 @@ -6358,6 +6499,10 @@ msgstr "系统还原" msgid "System restored successfully." msgstr "系统恢复成功。" +#: src/views/dns/DDNSManager.vue:83 +msgid "Targets" +msgstr "目标" + #: src/constants/errors/self_check.ts:3 msgid "Task is not fixable" msgstr "任务不可修复" @@ -6839,6 +6984,14 @@ msgstr "尝试调整搜索条件或导航到其他页面。" msgid "Try adjusting your search criteria or time range." msgstr "尝试调整您的搜索条件或时间范围。" +#: src/views/dns/components/DNSRecordTable.vue:29 +msgid "TTL" +msgstr "TTL" + +#: src/views/dns/components/DNSRecordForm.vue:78 +msgid "TTL (seconds)" +msgstr "TTL(秒)" + #: src/views/backup/AutoBackup/components/CronEditor.vue:28 msgid "Tuesday" msgstr "星期二" @@ -6851,6 +7004,9 @@ msgstr "需要两步验证" #: src/views/certificate/CertificateList/certColumns.tsx:24 #: src/views/config/components/Delete.vue:122 #: src/views/dashboard/components/ModulesTable.vue:62 +#: src/views/dns/components/DNSRecordFilter.vue:49 +#: src/views/dns/components/DNSRecordForm.vue:57 +#: src/views/dns/components/DNSRecordTable.vue:21 #: src/views/nginx_log/NginxLogList.vue:146 #: src/views/notification/notificationColumns.tsx:8 #: src/views/preference/components/ExternalNotify/columns.tsx:19 @@ -6861,6 +7017,10 @@ msgstr "类型" msgid "Type %{delete} to confirm" msgstr "输入 %{delete} 以确认" +#: src/views/dns/DDNSManager.vue:228 +msgid "Type or select A/AAAA records" +msgstr "输入或选择 A/AAAA 记录" + #: src/views/nginx_log/structured/components/SearchFilters.vue:142 msgid "Type or select browser" msgstr "输入或选择浏览器" @@ -6916,9 +7076,9 @@ msgstr "更新成功" #: src/views/backup/AutoBackup/AutoBackup.vue:236 #: src/views/certificate/ACMEUser.vue:124 -#: src/views/certificate/DNSCredential.vue:65 #: src/views/config/components/ConfigRightPanel/Basic.vue:54 -#: src/views/config/configColumns.tsx:44 src/views/namespace/columns.ts:91 +#: src/views/config/configColumns.tsx:44 src/views/dns/DNSCredential.vue:65 +#: src/views/dns/DNSDomainList.vue:205 src/views/namespace/columns.ts:91 #: src/views/node/nodeColumns.tsx:89 #: src/views/site/site_edit/components/RightPanel/Basic.vue:39 #: src/views/site/site_list/columns.tsx:113 src/views/stream/columns.tsx:80 @@ -6991,6 +7151,10 @@ msgstr "运行时间:" msgid "URL" msgstr "URL" +#: src/views/dns/components/DNSRecordForm.vue:64 +msgid "Use @ for root" +msgstr "使用 @ 表示根域名" + #: src/components/TwoFA/Authorization.vue:121 msgid "Use OTP" msgstr "使用二步验证码" @@ -7056,6 +7220,8 @@ msgid "Validate SSL Certificate" msgstr "验证 SSL 证书" #: src/views/dashboard/components/PerformanceTablesCard.vue:22 +#: src/views/dns/components/DNSRecordForm.vue:66 +#: src/views/dns/components/DNSRecordTable.vue:25 msgid "Value" msgstr "值" @@ -7147,12 +7313,6 @@ msgstr "" msgid "We do not accept any feature requests" msgstr "我们不接受任何功能请求" -#: src/views/certificate/DNSCredential.vue:96 -msgid "" -"We will add one or more TXT records to the DNS records of your domain for " -"ownership verification." -msgstr "我们将在您域名的 DNS 记录中添加一个或多个 TXT 记录,以核实域名所有权。" - #: src/views/site/site_edit/components/Cert/ObtainCert.vue:142 msgid "" "We will remove the HTTPChallenge configuration from this file and reload " @@ -7187,6 +7347,11 @@ msgstr "每周" msgid "Weekly on %{day} at %{time}" msgstr "每周%{day}的%{time}" +#: src/views/dns/components/DNSRecordForm.vue:84 +#: src/views/dns/components/DNSRecordTable.vue:37 +msgid "Weight" +msgstr "权重" + #: src/views/certificate/ACMEUser.vue:119 msgid "" "When Enabled, Nginx UI will automatically re-register users upon startup. " @@ -7230,7 +7395,7 @@ msgstr "工作进程" msgid "Workers" msgstr "Workers" -#: src/layouts/HeaderLayout.vue:61 src/routes/index.ts:61 +#: src/layouts/HeaderLayout.vue:61 src/routes/index.ts:63 #: src/views/workspace/WorkSpace.vue:51 msgid "Workspace" msgstr "工作区" @@ -7326,6 +7491,14 @@ msgstr "你的 Passkeys" msgid "Zero-allocation pipeline" msgstr "零分配管道" +#~ msgid "Once the verification is complete, the records will be removed." +#~ msgstr "一旦验证完成,这些记录将被删除。" + +#~ msgid "" +#~ "We will add one or more TXT records to the DNS records of your domain for " +#~ "ownership verification." +#~ msgstr "我们将在您域名的 DNS 记录中添加一个或多个 TXT 记录,以核实域名所有权。" + #~ msgid "Settings" #~ msgstr "设置" @@ -7347,9 +7520,6 @@ msgstr "零分配管道" #~ msgid "Tested in isolated sandbox mode" #~ msgstr "已在隔离沙箱模式下测试" -#~ msgid "All" -#~ msgstr "全部" - #~ msgid "Based on M2 Pro (12 cores) testing" #~ msgstr "基于 M2 Pro (12 核)测试" @@ -7548,9 +7718,6 @@ msgstr "零分配管道" #~ msgid "Are you sure you want to apply to all selected?" #~ msgstr "您确定要应用于所有选定的对象吗?" -#~ msgid "Are you sure you want to delete this item?" -#~ msgstr "你确定要删除这个项目吗?" - #~ msgid "Are you sure you want to recover this item?" #~ msgstr "您确定要恢复这个项目吗?" @@ -7822,9 +7989,6 @@ msgstr "零分配管道" #~ msgid "Dark" #~ msgstr "深色" -#~ msgid "Light" -#~ msgstr "浅色" - #~ msgid "Theme" #~ msgstr "主题" diff --git a/app/src/language/zh_TW/app.po b/app/src/language/zh_TW/app.po index 1a34864d..51e485ce 100644 --- a/app/src/language/zh_TW/app.po +++ b/app/src/language/zh_TW/app.po @@ -186,8 +186,10 @@ msgstr "操作" #: src/views/backup/AutoBackup/AutoBackup.vue:273 #: src/views/certificate/ACMEUser.vue:131 #: src/views/certificate/CertificateList/certColumns.tsx:92 -#: src/views/certificate/DNSCredential.vue:71 -#: src/views/config/configColumns.tsx:51 src/views/namespace/columns.ts:97 +#: src/views/config/configColumns.tsx:51 +#: src/views/dns/components/DNSRecordTable.vue:41 +#: src/views/dns/DDNSManager.vue:91 src/views/dns/DNSCredential.vue:71 +#: src/views/dns/DNSDomainList.vue:211 src/views/namespace/columns.ts:97 #: src/views/nginx_log/NginxLogList.vue:338 src/views/node/nodeColumns.tsx:96 #: src/views/notification/notificationColumns.tsx:72 #: src/views/preference/components/ExternalNotify/columns.tsx:85 @@ -241,6 +243,10 @@ msgstr "添加標頭" msgid "Add Location" msgstr "新增 Location" +#: src/views/dns/DNSRecordManager.vue:171 +msgid "Add Record" +msgstr "新增記錄" + #: src/components/NgxConfigEditor/NgxServer.vue:92 msgid "Add Server" msgstr "新增伺服器" @@ -261,7 +267,7 @@ msgstr "添加上游" msgid "Added successfully" msgstr "新增成功" -#: src/views/certificate/components/DNSChallenge.vue:97 +#: src/views/dns/components/DNSChallenge.vue:98 msgid "Additional" msgstr "其他設定" @@ -298,6 +304,10 @@ msgstr "進階設定" msgid "Afterwards, refresh this page and click add passkey again." msgstr "之後,請重新整理此頁面並再次點擊新增通行金鑰。" +#: src/views/dns/components/DNSRecordFilter.vue:55 +msgid "All" +msgstr "全部" + #: src/views/system/Licenses.vue:152 msgid "All Components" msgstr "所有組件" @@ -335,7 +345,7 @@ msgstr "任何可訪問的 IP 地址均可用於私有證書頒發機構" msgid "API Base Url" msgstr "API 基礎網址" -#: src/views/certificate/components/DNSChallenge.vue:70 +#: src/views/dns/components/DNSChallenge.vue:71 msgid "API Document" msgstr "API 文件" @@ -371,6 +381,10 @@ msgstr "您確定要刪除這個被停用的 IP 嗎?" msgid "Are you sure to delete this passkey immediately?" msgstr "您確定要刪除這個被停用的通行金鑰嗎?" +#: src/views/dns/components/DNSRecordTable.vue:90 +msgid "Are you sure to delete this record?" +msgstr "確定要刪除這條記錄嗎?" + #: src/views/preference/components/AuthSettings/RecoveryCodes.vue:155 msgid "Are you sure to generate new recovery codes?" msgstr "您確定要生成新的復原代碼嗎?" @@ -540,7 +554,7 @@ msgstr "平均 /PV" #: src/views/certificate/components/CertificateActions.vue:22 #: src/views/config/components/ConfigLeftPanel.vue:274 #: src/views/config/ConfigList.vue:120 src/views/config/ConfigList.vue:217 -#: src/views/nginx_log/NginxLog.vue:129 +#: src/views/dns/DNSRecordManager.vue:223 src/views/nginx_log/NginxLog.vue:129 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:183 #: src/views/stream/components/StreamEditor.vue:147 msgid "Back" @@ -686,6 +700,10 @@ msgstr "瀏覽器" msgid "Browser Statistics" msgstr "瀏覽器統計" +#: src/views/dns/DNSDomainList.vue:257 +msgid "Business contact:" +msgstr "商務聯繫:" + #: src/views/nginx_log/components/IndexingSettingsModal.vue:316 msgid "" "By enabling advanced indexing, you acknowledge that your system meets the " @@ -751,6 +769,7 @@ msgstr "基於 worker_processes * worker_connections 計算得出。實際效能 #: src/components/NgxConfigEditor/NgxUpstream.vue:32 src/language/curd.ts:37 #: src/views/config/components/Delete.vue:98 #: src/views/dashboard/components/SiteHealthCheckModal.vue:710 +#: src/views/dns/DDNSManager.vue:244 src/views/dns/DNSRecordManager.vue:212 #: src/views/nginx_log/components/IndexingSettingsModal.vue:102 #: src/views/nginx_log/indexing/IndexManagement.vue:33 #: src/views/nginx_log/indexing/IndexManagement.vue:59 @@ -896,7 +915,7 @@ msgstr "證書類型" msgid "Certificates" msgstr "憑證" -#: src/routes/modules/certificates.ts:36 +#: src/routes/modules/certificates.ts:28 msgid "Certificates List" msgstr "憑證列表" @@ -1254,7 +1273,7 @@ msgstr "設定路徑為空" msgid "Config Template" msgstr "配置模板" -#: src/views/certificate/DNSCredential.vue:52 +#: src/views/dns/DNSCredential.vue:52 msgid "Configuration" msgstr "配置" @@ -1282,6 +1301,14 @@ msgstr "設定名稱" msgid "Configurations" msgstr "設定" +#: src/views/dns/DDNSManager.vue:201 +msgid "Configure" +msgstr "配置" + +#: src/views/dns/DDNSManager.vue:211 +msgid "Configure DDNS" +msgstr "配置 DDNS" + #: src/views/site/site_add/SiteAdd.vue:81 msgid "Configure SSL" msgstr "設定 SSL" @@ -1403,6 +1430,10 @@ msgstr "建立檔案" msgid "Create Folder" msgstr "建立資料夾" +#: src/views/dns/DNSRecordManager.vue:200 +msgid "Create Record" +msgstr "建立記錄" + #: src/views/backup/components/BackupCreator.vue:75 msgid "" "Create system backups including Nginx configuration and Nginx UI settings. " @@ -1426,11 +1457,12 @@ msgstr "建立成功" msgid "Creating client facilitates communication with the CA server" msgstr "建立客戶端方便與 CA 伺服器通訊" -#: src/components/AutoCertForm/DNSChallenge.vue:105 +#: src/components/AutoCertForm/DNSChallenge.vue:131 +#: src/views/dns/DDNSManager.vue:65 src/views/dns/DNSDomainList.vue:109 msgid "Credential" msgstr "認證" -#: src/views/certificate/components/DNSChallenge.vue:86 +#: src/routes/modules/dns.ts:20 src/views/dns/components/DNSChallenge.vue:87 msgid "Credentials" msgstr "認證資訊" @@ -1545,6 +1577,18 @@ msgstr "天" msgid "Db file not found" msgstr "資料庫檔案未找到" +#: src/routes/modules/dns.ts:36 +msgid "DDNS" +msgstr "DDNS" + +#: src/views/dns/DDNSManager.vue:153 +msgid "DDNS Overview" +msgstr "DDNS 概覽" + +#: src/views/dns/DDNSManager.vue:135 +msgid "DDNS saved" +msgstr "DDNS 已儲存" + #: src/constants/errors/geolite.ts:12 msgid "Decompression succeeded but failed to delete compressed file: {0}" msgstr "解壓成功但刪除壓縮檔案失敗: {0}" @@ -1569,6 +1613,7 @@ msgstr "定義共享記憶體區域名稱和大小,例如 proxy_cache:10m" #: src/views/config/components/Delete.vue:65 #: src/views/config/components/Delete.vue:97 #: src/views/config/ConfigList.vue:199 +#: src/views/dns/components/DNSRecordTable.vue:94 #: src/views/site/site_list/SiteList.vue:100 #: src/views/stream/StreamList.vue:110 msgid "Delete" @@ -1810,7 +1855,8 @@ msgid "Disable stream %{name} from %{node} successfully" msgstr "已成功從 %{node} 停用串流 %{name}" #: src/views/backup/AutoBackup/AutoBackup.vue:175 -#: src/views/node/nodeColumns.tsx:60 src/views/node/nodeColumns.tsx:78 +#: src/views/dns/DDNSManager.vue:175 src/views/node/nodeColumns.tsx:60 +#: src/views/node/nodeColumns.tsx:78 #: src/views/preference/tabs/HTTPSettings.vue:24 #: src/views/preference/tabs/NodeSettings.vue:25 #: src/views/preference/tabs/NodeSettings.vue:30 @@ -1835,16 +1881,35 @@ msgstr "已斷開連接" msgid "Disk IO" msgstr "磁碟 IO" -#: src/routes/modules/certificates.ts:28 -#: src/views/certificate/DNSCredential.vue:79 +#: src/routes/modules/dns.ts:11 +msgid "DNS" +msgstr "DNS" + +#: src/views/dns/DNSCredential.vue:79 msgid "DNS Credentials" msgstr "DNS 認證" -#: src/components/AutoCertForm/DNSChallenge.vue:95 -#: src/views/certificate/components/DNSChallenge.vue:59 +#: src/routes/modules/dns.ts:28 src/views/dns/DNSDomainList.vue:228 +msgid "DNS Domains" +msgstr "DNS 網域" + +#: src/views/dns/components/DNSRecordTable.vue:81 +msgid "DNS Only" +msgstr "僅DNS" + +#: src/components/AutoCertForm/DNSChallenge.vue:121 +#: src/views/dns/components/DNSChallenge.vue:60 msgid "DNS Provider" msgstr "DNS 供應商" +#: src/views/dns/DNSDomainList.vue:244 +msgid "DNS Provider Support" +msgstr "DNS 供應商支援" + +#: src/routes/modules/dns.ts:44 src/views/dns/DNSRecordManager.vue:58 +msgid "DNS Records" +msgstr "DNS 記錄" + #: src/views/dashboard/components/SiteHealthCheckModal.vue:678 msgid "DNS Resolver" msgstr "DNS 解析器" @@ -1905,6 +1970,7 @@ msgid "Document Count" msgstr "文件數量" #: src/views/certificate/components/DNSIssueCertificate.vue:119 +#: src/views/dns/DDNSManager.vue:60 src/views/dns/DNSDomainList.vue:98 msgid "Domain" msgstr "網域" @@ -1990,7 +2056,7 @@ msgstr "EAB HMAC 密鑰" msgid "EAB Key ID" msgstr "EAB 密鑰 ID" -#: src/language/curd.ts:8 +#: src/language/curd.ts:8 src/views/dns/components/DNSRecordTable.vue:87 msgid "Edit" msgstr "編輯" @@ -2004,6 +2070,10 @@ msgstr "編輯 %{n}" msgid "Edit Configuration" msgstr "編輯設定" +#: src/views/dns/DNSRecordManager.vue:200 +msgid "Edit Record" +msgstr "編輯記錄" + #: src/routes/modules/sites.ts:34 msgid "Edit Site" msgstr "編輯網站" @@ -2054,6 +2124,10 @@ msgstr "啟用代碼補全" msgid "Enable compression for content transfer" msgstr "啟用內容傳輸壓縮" +#: src/views/dns/DDNSManager.vue:218 +msgid "Enable DDNS" +msgstr "啟用 DDNS" + #: src/views/dashboard/components/SiteHealthCheckModal.vue:473 msgid "Enable Health Check" msgstr "啟用健康檢查" @@ -2141,7 +2215,8 @@ msgid "Enable TOTP" msgstr "啟用 TOTP" #: src/views/backup/AutoBackup/AutoBackup.vue:174 -#: src/views/node/nodeColumns.tsx:69 src/views/node/nodeColumns.tsx:75 +#: src/views/dns/DDNSManager.vue:175 src/views/node/nodeColumns.tsx:69 +#: src/views/node/nodeColumns.tsx:75 #: src/views/preference/components/ExternalNotify/columns.tsx:47 #: src/views/preference/tabs/HTTPSettings.vue:24 #: src/views/preference/tabs/LogrotateSettings.vue:20 @@ -3084,14 +3159,19 @@ msgstr "數值越高表示連線重複使用率越好" msgid "History" msgstr "歷史" -#: src/routes/index.ts:52 +#: src/routes/index.ts:54 msgid "Home" msgstr "首頁" +#: src/views/dns/components/DNSRecordFilter.vue:42 #: src/views/preference/tabs/ServerSettings.vue:19 msgid "Host" msgstr "主機" +#: src/views/dns/components/DNSRecordFilter.vue:45 +msgid "Host, e.g. @ or www" +msgstr "主機,例如 @ 或 www" + #: src/views/backup/AutoBackup/components/CronEditor.vue:159 #: src/views/nginx_log/dashboard/components/HourlyChart.vue:87 msgid "Hour" @@ -3157,7 +3237,7 @@ msgstr "如果您的域名有 CNAME 記錄且無法取得證書,您需要啟 msgid "Import" msgstr "匯入" -#: src/routes/modules/certificates.ts:54 +#: src/routes/modules/certificates.ts:46 #: src/views/certificate/CertificateEditor.vue:84 msgid "Import Certificate" msgstr "匯入憑證" @@ -3276,10 +3356,15 @@ msgid "" "restart the Nginx UI." msgstr "系統啟動 10 分鐘後不允許安裝,請重新啟動 Nginx UI。" +#: src/views/dns/DDNSManager.vue:79 #: src/views/preference/tabs/LogrotateSettings.vue:26 msgid "Interval" msgstr "間隔" +#: src/views/dns/DDNSManager.vue:232 +msgid "Interval (seconds)" +msgstr "間隔(秒)" + #: src/views/certificate/ACMEUser.vue:166 msgid "Invalid" msgstr "無效" @@ -3506,6 +3591,10 @@ msgstr "最後索引時間" msgid "Last month" msgstr "上個月" +#: src/views/dns/DDNSManager.vue:87 +msgid "Last run" +msgstr "上次執行" + #: src/views/dashboard/NginxDashBoard.vue:138 msgid "Last update" msgstr "最後更新時間" @@ -3766,6 +3855,10 @@ msgstr "在取得憑證前,請確保您已將 .well-known 目錄反向代理 msgid "Manage Configs" msgstr "管理設定" +#: src/views/dns/DNSDomainList.vue:236 +msgid "Manage Records" +msgstr "管理記錄" + #: src/routes/modules/sites.ts:10 src/views/site/site_list/SiteList.vue:45 msgid "Manage Sites" msgstr "管理網站" @@ -3936,7 +4029,7 @@ msgstr "修改於" msgid "Modify" msgstr "修改" -#: src/routes/modules/certificates.ts:44 +#: src/routes/modules/certificates.ts:36 #: src/views/certificate/CertificateEditor.vue:84 msgid "Modify Certificate" msgstr "修改憑證" @@ -3997,11 +4090,13 @@ msgstr "不適用" #: src/views/certificate/components/CertificateBasicInfo.vue:44 #: src/views/certificate/components/CertificateBasicInfo.vue:58 #: src/views/certificate/components/CertificateBasicInfo.vue:70 -#: src/views/certificate/DNSCredential.vue:17 #: src/views/config/components/ConfigRightPanel/Basic.vue:34 #: src/views/config/components/Delete.vue:123 #: src/views/config/components/Mkdir.vue:64 -#: src/views/config/configColumns.tsx:17 src/views/namespace/columns.ts:9 +#: src/views/config/configColumns.tsx:17 +#: src/views/dns/components/DNSRecordForm.vue:63 +#: src/views/dns/components/DNSRecordTable.vue:17 +#: src/views/dns/DNSCredential.vue:17 src/views/namespace/columns.ts:9 #: src/views/nginx_log/NginxLogList.vue:155 src/views/node/nodeColumns.tsx:8 #: src/views/preference/components/AuthSettings/AddPasskey.vue:81 #: src/views/site/site_edit/components/RightPanel/Basic.vue:36 @@ -4029,6 +4124,12 @@ msgstr "命名空間" msgid "Namespaces" msgstr "命名空間" +#: src/views/dns/DNSDomainList.vue:251 +msgid "" +"Need more DNS providers? Support us through donations or contact us for " +"commercial collaboration" +msgstr "需要更多DNS供應商?透過捐贈支持我們或聯繫我們進行商業合作" + #: src/views/dashboard/NginxDashBoard.vue:195 msgid "Need to enable the stub_status module" msgstr "需要啟用 stub_status 模組" @@ -4419,6 +4520,10 @@ msgstr "未索引" msgid "Not Loaded" msgstr "未載入" +#: src/views/dns/DDNSManager.vue:102 +msgid "Not run yet" +msgstr "尚未執行" + #: src/components/AutoCertForm/AutoCertForm.vue:230 msgid "Not supported for IP certificates" msgstr "不支援 IP 證書" @@ -4428,7 +4533,7 @@ msgid "Not Valid Before: %{date}" msgstr "此前無效:%{date}" #: src/components/AutoCertForm/AutoCertForm.vue:150 -#: src/views/certificate/DNSCredential.vue:89 +#: src/views/dns/DNSCredential.vue:89 msgid "Note" msgstr "備註" @@ -4551,10 +4656,6 @@ msgstr "確定" msgid "On" msgstr "開啟" -#: src/views/certificate/DNSCredential.vue:99 -msgid "Once the verification is complete, the records will be removed." -msgstr "驗證完成後,記錄將被刪除。" - #: src/components/NamespaceTabs/NamespaceTabs.vue:164 #: src/components/NodeCard/NodeCard.vue:51 #: src/components/NodeSelector/NodeSelector.vue:65 @@ -4841,7 +4942,7 @@ msgstr "請正確填寫所有欄位" msgid "Please fill in required S3 configuration fields" msgstr "請填寫必填的 S3 配置欄位" -#: src/views/certificate/DNSCredential.vue:93 +#: src/views/dns/DNSCredential.vue:93 msgid "" "Please fill in the API authentication credentials provided by your DNS " "provider." @@ -4898,7 +4999,7 @@ msgstr "請輸入您的使用者名稱!" msgid "Please log in." msgstr "請登入。" -#: src/views/certificate/DNSCredential.vue:102 +#: src/views/dns/DNSCredential.vue:96 msgid "Please note that the unit of time configurations below are all in seconds." msgstr "請注意,以下時間設定單位均為秒。" @@ -4978,6 +5079,11 @@ msgstr "偏好設定" msgid "Preparing lego configurations" msgstr "準備 Lego 設定" +#: src/views/dns/components/DNSRecordForm.vue:81 +#: src/views/dns/components/DNSRecordTable.vue:33 +msgid "Priority" +msgstr "優先級" + #: src/components/AutoCertForm/AutoCertForm.vue:206 msgid "Private CA:" msgstr "私有 CA:" @@ -5038,7 +5144,8 @@ msgid "" "proxy." msgstr "協議配置僅在直接連接時生效。如果使用反向代理,請在反向代理中單獨配置協議。" -#: src/views/certificate/DNSCredential.vue:26 +#: src/views/dns/DDNSManager.vue:70 src/views/dns/DNSCredential.vue:26 +#: src/views/dns/DNSDomainList.vue:177 src/views/dns/DNSDomainList.vue:198 msgid "Provider" msgstr "供應商" @@ -5050,6 +5157,12 @@ msgstr "未找到提供者:{0}" msgid "Province / Region" msgstr "省份 / 地區" +#: src/views/dns/components/DNSRecordForm.vue:87 +#: src/views/dns/components/DNSRecordTable.vue:51 +#: src/views/dns/components/DNSRecordTable.vue:81 +msgid "Proxied" +msgstr "已代理" + #: src/views/certificate/ACMEUser.vue:63 msgid "Proxy" msgstr "代理伺服器" @@ -5144,6 +5257,22 @@ msgstr "重新檢查" msgid "Recommended:" msgstr "推薦:" +#: src/views/dns/DNSRecordManager.vue:113 +msgid "Record created" +msgstr "記錄已建立" + +#: src/views/dns/DNSRecordManager.vue:120 +msgid "Record deleted" +msgstr "記錄已刪除" + +#: src/views/dns/DNSRecordManager.vue:109 +msgid "Record updated" +msgstr "記錄已更新" + +#: src/views/dns/DDNSManager.vue:221 +msgid "Records" +msgstr "記錄" + #: src/components/TwoFA/Authorization.vue:79 msgid "Recovery" msgstr "恢復" @@ -5171,7 +5300,8 @@ msgstr "重新導向訊息 (3xx)" msgid "Referer" msgstr "來源" -#: src/language/curd.ts:70 +#: src/language/curd.ts:70 src/views/dns/DDNSManager.vue:161 +#: src/views/dns/DNSRecordManager.vue:165 msgid "Refresh" msgstr "重新整理" @@ -5411,7 +5541,7 @@ msgstr "請求參數錯誤" msgid "Requests Per Connection" msgstr "每連線請求數量" -#: src/language/curd.ts:13 +#: src/language/curd.ts:13 src/views/dns/components/DNSRecordFilter.vue:65 #: src/views/nginx_log/structured/components/SearchFilters.vue:214 #: src/views/nginx_log/structured/StructuredLogViewer.vue:745 msgid "Reset" @@ -5647,6 +5777,7 @@ msgstr "星期六" #: src/views/config/components/ConfigLeftPanel.vue:283 #: src/views/config/components/ConfigName.vue:58 #: src/views/dashboard/components/SiteHealthCheckModal.vue:713 +#: src/views/dns/DDNSManager.vue:247 src/views/dns/DNSRecordManager.vue:215 #: src/views/preference/components/AuthSettings/Passkey.vue:131 #: src/views/preference/Preference.vue:124 #: src/views/site/site_edit/components/ConfigName/ConfigName.vue:52 @@ -5752,12 +5883,13 @@ msgstr "計劃" msgid "Schedule Type" msgstr "計劃類型" -#: src/views/certificate/components/DNSChallenge.vue:77 +#: src/views/dns/components/DNSChallenge.vue:78 msgid "SDK" msgstr "SDK" #: src/language/constants.ts:62 src/language/curd.ts:12 #: src/views/config/configColumns.tsx:5 +#: src/views/dns/components/DNSRecordFilter.vue:62 #: src/views/nginx_log/structured/components/SearchFilters.vue:217 #: src/views/site/site_list/columns.tsx:17 src/views/stream/columns.tsx:13 msgid "Search" @@ -5814,10 +5946,18 @@ msgstr "選擇一個預定義的 CA 目錄或輸入自訂目錄。留空則使 msgid "Select all" msgstr "全選" +#: src/language/constants.ts:68 +msgid "Select Credential" +msgstr "選擇憑證" + #: src/views/certificate/ACMEUser.vue:45 msgid "Select or enter a CA directory URL" msgstr "選擇或輸入 CA 目錄 URL" +#: src/language/constants.ts:67 +msgid "Select Provider" +msgstr "選擇提供商" + #: src/language/curd.ts:59 msgid "Selected {count} files" msgstr "已選擇 {count} 個檔案" @@ -6137,6 +6277,7 @@ msgstr "靜態" #: src/views/certificate/ACMEUser.vue:75 #: src/views/certificate/CertificateList/certColumns.tsx:63 #: src/views/dashboard/components/ModulesTable.vue:75 +#: src/views/dns/DDNSManager.vue:75 #: src/views/nginx_log/structured/components/SearchFilters.vue:106 #: src/views/nginx_log/structured/StructuredLogViewer.vue:241 #: src/views/nginx_log/structured/StructuredLogViewer.vue:521 @@ -6364,6 +6505,10 @@ msgstr "系統恢復" msgid "System restored successfully." msgstr "系統已成功恢復。" +#: src/views/dns/DDNSManager.vue:83 +msgid "Targets" +msgstr "目標" + #: src/constants/errors/self_check.ts:3 msgid "Task is not fixable" msgstr "任務無法修復" @@ -6845,6 +6990,14 @@ msgstr "嘗試調整搜索條件或導航到其他頁面。" msgid "Try adjusting your search criteria or time range." msgstr "嘗試調整您的搜尋條件或時間範圍。" +#: src/views/dns/components/DNSRecordTable.vue:29 +msgid "TTL" +msgstr "TTL" + +#: src/views/dns/components/DNSRecordForm.vue:78 +msgid "TTL (seconds)" +msgstr "TTL(秒)" + #: src/views/backup/AutoBackup/components/CronEditor.vue:28 msgid "Tuesday" msgstr "星期二" @@ -6857,6 +7010,9 @@ msgstr "需要多重因素驗證" #: src/views/certificate/CertificateList/certColumns.tsx:24 #: src/views/config/components/Delete.vue:122 #: src/views/dashboard/components/ModulesTable.vue:62 +#: src/views/dns/components/DNSRecordFilter.vue:49 +#: src/views/dns/components/DNSRecordForm.vue:57 +#: src/views/dns/components/DNSRecordTable.vue:21 #: src/views/nginx_log/NginxLogList.vue:146 #: src/views/notification/notificationColumns.tsx:8 #: src/views/preference/components/ExternalNotify/columns.tsx:19 @@ -6867,6 +7023,10 @@ msgstr "類型" msgid "Type %{delete} to confirm" msgstr "輸入 %{delete} 以確認" +#: src/views/dns/DDNSManager.vue:228 +msgid "Type or select A/AAAA records" +msgstr "輸入或選擇 A/AAAA 記錄" + #: src/views/nginx_log/structured/components/SearchFilters.vue:142 msgid "Type or select browser" msgstr "輸入或選擇瀏覽器" @@ -6922,9 +7082,9 @@ msgstr "更新成功" #: src/views/backup/AutoBackup/AutoBackup.vue:236 #: src/views/certificate/ACMEUser.vue:124 -#: src/views/certificate/DNSCredential.vue:65 #: src/views/config/components/ConfigRightPanel/Basic.vue:54 -#: src/views/config/configColumns.tsx:44 src/views/namespace/columns.ts:91 +#: src/views/config/configColumns.tsx:44 src/views/dns/DNSCredential.vue:65 +#: src/views/dns/DNSDomainList.vue:205 src/views/namespace/columns.ts:91 #: src/views/node/nodeColumns.tsx:89 #: src/views/site/site_edit/components/RightPanel/Basic.vue:39 #: src/views/site/site_list/columns.tsx:113 src/views/stream/columns.tsx:80 @@ -6997,6 +7157,10 @@ msgstr "運作時間:" msgid "URL" msgstr "URL" +#: src/views/dns/components/DNSRecordForm.vue:64 +msgid "Use @ for root" +msgstr "使用 @ 表示根域名" + #: src/components/TwoFA/Authorization.vue:121 msgid "Use OTP" msgstr "使用一次性密碼" @@ -7062,6 +7226,8 @@ msgid "Validate SSL Certificate" msgstr "驗證 SSL 憑證" #: src/views/dashboard/components/PerformanceTablesCard.vue:22 +#: src/views/dns/components/DNSRecordForm.vue:66 +#: src/views/dns/components/DNSRecordTable.vue:25 msgid "Value" msgstr "數值" @@ -7153,12 +7319,6 @@ msgstr "" msgid "We do not accept any feature requests" msgstr "我們不接受任何功能請求" -#: src/views/certificate/DNSCredential.vue:96 -msgid "" -"We will add one or more TXT records to the DNS records of your domain for " -"ownership verification." -msgstr "我們將在您的網域的 DNS 記錄中新增一個或多個 TXT 記錄以進行所有權驗證。" - #: src/views/site/site_edit/components/Cert/ObtainCert.vue:142 msgid "" "We will remove the HTTPChallenge configuration from this file and reload " @@ -7193,6 +7353,11 @@ msgstr "每週" msgid "Weekly on %{day} at %{time}" msgstr "每週 %{day} 的 %{time}" +#: src/views/dns/components/DNSRecordForm.vue:84 +#: src/views/dns/components/DNSRecordTable.vue:37 +msgid "Weight" +msgstr "權重" + #: src/views/certificate/ACMEUser.vue:119 msgid "" "When Enabled, Nginx UI will automatically re-register users upon startup. " @@ -7236,7 +7401,7 @@ msgstr "worker 行程" msgid "Workers" msgstr "worker" -#: src/layouts/HeaderLayout.vue:61 src/routes/index.ts:61 +#: src/layouts/HeaderLayout.vue:61 src/routes/index.ts:63 #: src/views/workspace/WorkSpace.vue:51 msgid "Workspace" msgstr "工作區" @@ -7332,6 +7497,14 @@ msgstr "您的通行金鑰" msgid "Zero-allocation pipeline" msgstr "零分配管道" +#~ msgid "Once the verification is complete, the records will be removed." +#~ msgstr "驗證完成後,記錄將被刪除。" + +#~ msgid "" +#~ "We will add one or more TXT records to the DNS records of your domain for " +#~ "ownership verification." +#~ msgstr "我們將在您的網域的 DNS 記錄中新增一個或多個 TXT 記錄以進行所有權驗證。" + #~ msgid "Settings" #~ msgstr "設定" @@ -7353,9 +7526,6 @@ msgstr "零分配管道" #~ msgid "Tested in isolated sandbox mode" #~ msgstr "已在隔離沙箱模式下測試" -#~ msgid "All" -#~ msgstr "全部" - #~ msgid "Based on M2 Pro (12 cores) testing" #~ msgstr "基於 M2 Pro (12 核)測試" @@ -7554,9 +7724,6 @@ msgstr "零分配管道" #~ msgid "Are you sure you want to apply to all selected?" #~ msgstr "您確定要應用於所有選擇項目嗎?" -#~ msgid "Are you sure you want to delete this item?" -#~ msgstr "您確定要刪除此項目嗎?" - #~ msgid "Are you sure you want to recover this item?" #~ msgstr "您確定要恢復此項目嗎?" @@ -7795,9 +7962,6 @@ msgstr "零分配管道" #~ msgid "Dark" #~ msgstr "深色" -#~ msgid "Light" -#~ msgstr "淺色" - #~ msgid "Theme" #~ msgstr "主題" diff --git a/app/src/pinia/index.ts b/app/src/pinia/index.ts index ec87dc28..4b0e0082 100644 --- a/app/src/pinia/index.ts +++ b/app/src/pinia/index.ts @@ -1,4 +1,5 @@ import { useAppStore } from './moudule/app' +import { useDnsStore } from './moudule/dns' import { useGlobalStore } from './moudule/global' import { useProxyAvailabilityStore } from './moudule/proxyAvailability' import { useSettingsStore } from './moudule/settings' @@ -11,6 +12,7 @@ export type { EventHandler, EventSubscription, WebSocketMessage } from './moudul export { useAppStore, + useDnsStore, useGlobalStore, useProxyAvailabilityStore, useSettingsStore, diff --git a/app/src/pinia/moudule/dns.ts b/app/src/pinia/moudule/dns.ts new file mode 100644 index 00000000..8bba2e90 --- /dev/null +++ b/app/src/pinia/moudule/dns.ts @@ -0,0 +1,127 @@ +import type { Pagination } from '@/api/curd' +import type { DDNSConfig, DDNSDomainItem, DNSDomain, DNSRecord, DomainListParams, RecordListParams, RecordPayload, UpdateDDNSPayload } from '@/api/dns' +import { defineStore } from 'pinia' +import { dnsApi } from '@/api/dns' + +interface DnsState { + domains: DNSDomain[] + pagination?: Pagination + isLoading: boolean + currentDomain?: DNSDomain + records: DNSRecord[] + recordsLoading: boolean + recordsPagination?: Pagination + ddnsConfig?: DDNSConfig + ddnsLoading: boolean + ddnsList: DDNSDomainItem[] + ddnsListLoading: boolean +} + +export const useDnsStore = defineStore('dns-store', { + state: (): DnsState => ({ + domains: [], + pagination: undefined, + isLoading: false, + currentDomain: undefined, + records: [], + recordsLoading: false, + recordsPagination: undefined, + ddnsConfig: undefined, + ddnsLoading: false, + ddnsList: [], + ddnsListLoading: false, + }), + actions: { + async fetchDomains(params?: DomainListParams) { + this.isLoading = true + try { + const response = await dnsApi.getList(params) + this.domains = response.data + this.pagination = response.pagination + } + finally { + this.isLoading = false + } + }, + async fetchDomainDetail(id: number) { + const data = await dnsApi.getItem(id) + this.currentDomain = data + return data + }, + async fetchRecords(domainId: number, params?: RecordListParams) { + this.recordsLoading = true + try { + const { data, pagination } = await dnsApi.listRecords(domainId, params) + this.records = data + this.recordsPagination = pagination + } + finally { + this.recordsLoading = false + } + }, + async createRecord(domainId: number, payload: RecordPayload) { + const data = await dnsApi.createRecord(domainId, payload) + this.records.unshift(data) + return data + }, + async updateRecord(domainId: number, recordId: string, payload: RecordPayload) { + const data = await dnsApi.updateRecord(domainId, recordId, payload) + const index = this.records.findIndex(item => item.id === recordId) + if (index !== -1) + this.records.splice(index, 1, data) + return data + }, + async deleteRecord(domainId: number, recordId: string) { + await dnsApi.deleteRecord(domainId, recordId) + this.records = this.records.filter(item => item.id !== recordId) + }, + async fetchDDNSConfig(domainId: number) { + this.ddnsLoading = true + try { + this.ddnsConfig = await dnsApi.getDDNSConfig(domainId) + return this.ddnsConfig + } + finally { + this.ddnsLoading = false + } + }, + async updateDDNSConfig(domainId: number, payload: UpdateDDNSPayload) { + this.ddnsLoading = true + try { + this.ddnsConfig = await dnsApi.updateDDNSConfig(domainId, payload) + return this.ddnsConfig + } + finally { + this.ddnsLoading = false + } + }, + resetRecords() { + this.records = [] + this.recordsPagination = undefined + }, + resetDDNS() { + this.ddnsConfig = undefined + }, + async fetchDDNSList() { + this.ddnsListLoading = true + try { + const res = await dnsApi.listDDNS() + this.ddnsList = res.data + return res.data + } + finally { + this.ddnsListLoading = false + } + }, + async refreshDDNSItem(domainId: number) { + const cfg = await this.fetchDDNSConfig(domainId) + const itemIndex = this.ddnsList.findIndex(item => item.id === domainId) + if (itemIndex !== -1 && cfg) { + this.ddnsList.splice(itemIndex, 1, { + ...this.ddnsList[itemIndex], + config: cfg, + }) + } + }, + }, +}) diff --git a/app/src/routes/index.ts b/app/src/routes/index.ts index f4063c53..25819182 100644 --- a/app/src/routes/index.ts +++ b/app/src/routes/index.ts @@ -8,6 +8,7 @@ import { backupRoutes } from './modules/backup' import { certificatesRoutes } from './modules/certificates' import { configRoutes } from './modules/config' import { dashboardRoutes } from './modules/dashboard' +import { dnsRoutes } from './modules/dns' import { errorRoutes } from './modules/error' import { namespacesRoutes } from './modules/namespaces' import { nginxLogRoutes } from './modules/nginx_log' @@ -30,6 +31,7 @@ const mainLayoutChildren: RouteRecordRaw[] = [ ...upstreamRoutes, ...configRoutes, ...certificatesRoutes, + ...dnsRoutes, ...terminalRoutes, ...nginxLogRoutes, ...namespacesRoutes, diff --git a/app/src/routes/modules/certificates.ts b/app/src/routes/modules/certificates.ts index 8f36d867..a8874606 100644 --- a/app/src/routes/modules/certificates.ts +++ b/app/src/routes/modules/certificates.ts @@ -20,14 +20,6 @@ export const certificatesRoutes: RouteRecordRaw[] = [ name: () => $gettext('ACME User'), }, }, - { - path: 'dns_credential', - name: 'DNS Credentials', - component: () => import('@/views/certificate/DNSCredential.vue'), - meta: { - name: () => $gettext('DNS Credentials'), - }, - }, { path: 'list', name: 'Certificates List', diff --git a/app/src/routes/modules/dns.ts b/app/src/routes/modules/dns.ts new file mode 100644 index 00000000..c0c33008 --- /dev/null +++ b/app/src/routes/modules/dns.ts @@ -0,0 +1,51 @@ +import type { RouteRecordRaw } from 'vue-router' +import { CloudServerOutlined } from '@ant-design/icons-vue' + +export const dnsRoutes: RouteRecordRaw[] = [ + { + path: 'dns', + name: 'DNS', + component: () => import('@/layouts/BaseRouterView.vue'), + redirect: '/dns/domains', + meta: { + name: () => $gettext('DNS'), + icon: CloudServerOutlined, + }, + children: [ + { + path: 'credentials', + name: 'DNS Credentials', + component: () => import('@/views/dns/DNSCredential.vue'), + meta: { + name: () => $gettext('Credentials'), + }, + }, + { + path: 'domains', + name: 'DNS Domains', + component: () => import('@/views/dns/DNSDomainList.vue'), + meta: { + name: () => $gettext('DNS Domains'), + }, + }, + { + path: 'ddns', + name: 'DNS DDNS', + component: () => import('@/views/dns/DDNSManager.vue'), + meta: { + name: () => $gettext('DDNS'), + }, + }, + { + path: 'domains/:id/records', + name: 'DNS Domain Records', + component: () => import('@/views/dns/DNSRecordManager.vue'), + meta: { + name: () => $gettext('DNS Records'), + hiddenInSidebar: true, + lastRouteName: 'DNS Domains', + }, + }, + ], + }, +] diff --git a/app/src/views/dns/DDNSManager.vue b/app/src/views/dns/DDNSManager.vue new file mode 100644 index 00000000..4a6d3b3a --- /dev/null +++ b/app/src/views/dns/DDNSManager.vue @@ -0,0 +1,259 @@ + + + + + diff --git a/app/src/views/certificate/DNSCredential.vue b/app/src/views/dns/DNSCredential.vue similarity index 90% rename from app/src/views/certificate/DNSCredential.vue rename to app/src/views/dns/DNSCredential.vue index 7c6d7c95..fc0129f9 100644 --- a/app/src/views/certificate/DNSCredential.vue +++ b/app/src/views/dns/DNSCredential.vue @@ -92,12 +92,6 @@ const columns: StdTableColumn[] = [{

{{ $gettext('Please fill in the API authentication credentials provided by your DNS provider.') }}

-

- {{ $gettext('We will add one or more TXT records to the DNS records of your domain for ownership verification.') }} -

-

- {{ $gettext('Once the verification is complete, the records will be removed.') }} -

{{ $gettext('Please note that the unit of time configurations below are all in seconds.') }}

diff --git a/app/src/views/dns/DNSDomainList.vue b/app/src/views/dns/DNSDomainList.vue new file mode 100644 index 00000000..9ed1d75b --- /dev/null +++ b/app/src/views/dns/DNSDomainList.vue @@ -0,0 +1,269 @@ + + + + + diff --git a/app/src/views/dns/DNSRecordManager.vue b/app/src/views/dns/DNSRecordManager.vue new file mode 100644 index 00000000..083ef219 --- /dev/null +++ b/app/src/views/dns/DNSRecordManager.vue @@ -0,0 +1,233 @@ + + + + + diff --git a/app/src/views/certificate/components/DNSChallenge.vue b/app/src/views/dns/components/DNSChallenge.vue similarity index 96% rename from app/src/views/certificate/components/DNSChallenge.vue rename to app/src/views/dns/components/DNSChallenge.vue index e095dc0d..19a0f4ea 100644 --- a/app/src/views/certificate/components/DNSChallenge.vue +++ b/app/src/views/dns/components/DNSChallenge.vue @@ -5,6 +5,7 @@ import type { Ref } from 'vue' import type { DNSProvider } from '@/api/auto_cert' import type { DnsCredential } from '@/api/dns_credential' import auto_cert from '@/api/auto_cert' +import { filterAllowedDnsProviders } from '@/constants/dns_providers' const providers = ref([]) as Ref @@ -22,7 +23,7 @@ async function init() { } auto_cert.get_dns_providers().then(r => { - providers.value = r + providers.value = filterAllowedDnsProviders(r) }).then(() => { init() }) diff --git a/app/src/views/dns/components/DNSRecordFilter.vue b/app/src/views/dns/components/DNSRecordFilter.vue new file mode 100644 index 00000000..24af6d35 --- /dev/null +++ b/app/src/views/dns/components/DNSRecordFilter.vue @@ -0,0 +1,74 @@ + + + + + diff --git a/app/src/views/dns/components/DNSRecordForm.vue b/app/src/views/dns/components/DNSRecordForm.vue new file mode 100644 index 00000000..5439b6bc --- /dev/null +++ b/app/src/views/dns/components/DNSRecordForm.vue @@ -0,0 +1,95 @@ + + + + + diff --git a/app/src/views/dns/components/DNSRecordTable.vue b/app/src/views/dns/components/DNSRecordTable.vue new file mode 100644 index 00000000..b6703d61 --- /dev/null +++ b/app/src/views/dns/components/DNSRecordTable.vue @@ -0,0 +1,110 @@ + + + + + diff --git a/docs/guide/config-cert.md b/docs/guide/config-cert.md index bec0918e..3b1bfa2e 100644 --- a/docs/guide/config-cert.md +++ b/docs/guide/config-cert.md @@ -41,3 +41,14 @@ By default, Nginx UI will automatically renew the certificate every 7 days. This option is used to set the port for backend listening in the HTTP01 challenge mode when obtaining Let's Encrypt certificates. The HTTP01 challenge is a domain validation method used by Let's Encrypt to verify that you control the domain for which you're requesting a certificate. + +## DNS Domain Management + +- Version:`>= v2.2.2` +- Supported providers: Alibaba Cloud DNS, Tencent Cloud DNS, Cloudflare + +You can now register DNS domains inside Nginx-UI (Certificates → DNS Domains) and bind them to an existing DNS Credential. +For every registered domain the UI exposes a full DNS record management experience (list, create, update, delete) that talks directly to the provider's API. +This allows you to verify domains for certificate issuance and perform day-to-day DNS maintenance without leaving the dashboard. + +> Make sure the selected DNS Credential contains the API tokens and permissions required by the provider to edit DNS records. diff --git a/go.mod b/go.mod index 71f62120..0b677a51 100644 --- a/go.mod +++ b/go.mod @@ -6,9 +6,14 @@ require ( code.pfad.fr/risefront v1.0.0 github.com/0xJacky/pofile v1.1.1 github.com/BurntSushi/toml v1.5.0 - github.com/blevesearch/bleve/v2 v2.5.5 + github.com/alibabacloud-go/alidns-20150109/v4 v4.7.0 + github.com/alibabacloud-go/darabonba-openapi/v2 v2.1.13 + github.com/alibabacloud-go/tea v1.3.13 + github.com/alibabacloud-go/tea-utils/v2 v2.0.8 + github.com/blevesearch/bleve/v2 v2.5.6 github.com/caarlos0/env/v11 v11.3.1 github.com/casdoor/casdoor-go-sdk v1.39.0 + github.com/cloudflare/cloudflare-go v0.116.0 github.com/creack/pty v1.1.24 github.com/dgraph-io/ristretto/v2 v2.3.0 github.com/docker/docker v28.5.2+incompatible @@ -29,7 +34,7 @@ require ( github.com/golang-jwt/jwt/v5 v5.3.0 github.com/google/uuid v1.6.0 github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 - github.com/mark3labs/mcp-go v0.43.1 + github.com/mark3labs/mcp-go v0.43.2 github.com/minio/minio-go/v7 v7.0.97 github.com/minio/selfupdate v0.6.0 github.com/nikoksr/notify v1.3.0 @@ -40,10 +45,12 @@ require ( github.com/pretty66/websocketproxy v0.0.0-20220507015215-930b3a686308 github.com/samber/lo v1.52.0 github.com/sashabaranov/go-openai v1.41.2 - github.com/shirou/gopsutil/v4 v4.25.10 + github.com/shirou/gopsutil/v4 v4.25.11 github.com/spf13/afero v1.15.0 github.com/spf13/cast v1.10.0 github.com/stretchr/testify v1.11.1 + github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.3.8 + github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod v1.3.7 github.com/tufanbarisyildirim/gonginx v0.0.0-20250620092546-c3e307e36701 github.com/ulikunitz/xz v0.5.15 github.com/uozi-tech/cosy v1.27.7 @@ -87,32 +94,29 @@ require ( github.com/RoaringBitmap/roaring/v2 v2.14.4 // indirect github.com/akamai/AkamaiOPEN-edgegrid-golang/v11 v11.1.0 // indirect github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.5 // indirect - github.com/alibabacloud-go/darabonba-openapi/v2 v2.1.13 // indirect github.com/alibabacloud-go/debug v1.0.1 // indirect github.com/alibabacloud-go/endpoint-util v1.1.1 // indirect - github.com/alibabacloud-go/tea v1.3.13 // indirect - github.com/alibabacloud-go/tea-utils/v2 v2.0.8 // indirect github.com/aliyun/aliyun-log-go-sdk v0.1.112 // indirect - github.com/aliyun/credentials-go v1.4.7 // indirect - github.com/aws/aws-sdk-go-v2 v1.40.0 // indirect - github.com/aws/aws-sdk-go-v2/config v1.32.2 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.19.2 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.14 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.14 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.14 // indirect + github.com/aliyun/credentials-go v1.4.9 // indirect + github.com/aws/aws-sdk-go-v2 v1.40.1 // indirect + github.com/aws/aws-sdk-go-v2/config v1.32.3 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.19.3 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.15 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.15 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.15 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.8.4 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.3 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.14 // indirect - github.com/aws/aws-sdk-go-v2/service/lightsail v1.50.8 // indirect - github.com/aws/aws-sdk-go-v2/service/route53 v1.61.0 // indirect - github.com/aws/aws-sdk-go-v2/service/signin v1.0.2 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.30.5 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.10 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.41.2 // indirect - github.com/aws/smithy-go v1.23.2 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.4 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.15 // indirect + github.com/aws/aws-sdk-go-v2/service/lightsail v1.50.9 // indirect + github.com/aws/aws-sdk-go-v2/service/route53 v1.61.1 // indirect + github.com/aws/aws-sdk-go-v2/service/signin v1.0.3 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.30.6 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.11 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.41.3 // indirect + github.com/aws/smithy-go v1.24.0 // indirect github.com/aziontech/azionapi-go-sdk v0.144.0 // indirect github.com/bahlo/generic-list-go v0.2.0 // indirect - github.com/baidubce/bce-sdk-go v0.9.252 // indirect + github.com/baidubce/bce-sdk-go v0.9.253 // indirect github.com/benbjohnson/clock v1.3.5 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bits-and-blooms/bitset v1.24.4 // indirect @@ -166,7 +170,7 @@ require ( github.com/gin-contrib/pprof v1.5.3 // indirect github.com/gin-contrib/sse v1.1.0 // indirect github.com/go-acme/alidns-20150109/v4 v4.7.0 // indirect - github.com/go-acme/esa-20240910/v2 v2.40.1 // indirect + github.com/go-acme/esa-20240910/v2 v2.40.2 // indirect github.com/go-acme/tencentclouddnspod v1.1.25 // indirect github.com/go-acme/tencentedgdeone v1.1.48 // indirect github.com/go-errors/errors v1.5.1 // indirect @@ -186,7 +190,7 @@ require ( github.com/go-viper/mapstructure/v2 v2.4.0 // indirect github.com/go-webauthn/x v0.1.26 // indirect github.com/goccy/go-json v0.10.5 // indirect - github.com/goccy/go-yaml v1.18.0 // indirect + github.com/goccy/go-yaml v1.19.0 // indirect github.com/gofrs/flock v0.13.0 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang-jwt/jwt/v4 v4.5.2 // indirect @@ -194,7 +198,7 @@ require ( github.com/golang/snappy v1.0.0 // indirect github.com/google/go-querystring v1.1.0 // indirect github.com/google/go-tpm v0.9.7 // indirect - github.com/google/pprof v0.0.0-20251114195745-4902fdda35c8 // indirect + github.com/google/pprof v0.0.0-20251208000136-3d256cb9ff16 // indirect github.com/google/s2a-go v0.1.9 // indirect github.com/googleapis/enterprise-certificate-proxy v0.3.7 // indirect github.com/googleapis/gax-go/v2 v2.15.0 // indirect @@ -205,7 +209,7 @@ require ( github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-retryablehttp v0.7.8 // indirect github.com/hashicorp/go-uuid v1.0.3 // indirect - github.com/huaweicloud/huaweicloud-sdk-go-v3 v0.1.178 // indirect + github.com/huaweicloud/huaweicloud-sdk-go-v3 v0.1.179 // indirect github.com/iij/doapi v0.0.0-20190504054126-0bbf12d6d7df // indirect github.com/imega/luaformatter v0.0.0-20211025140405-86b0a68d6bef // indirect github.com/infobloxopen/infoblox-go-client/v2 v2.11.0 // indirect @@ -218,7 +222,7 @@ require ( github.com/jonboulle/clockwork v0.5.0 // indirect github.com/json-iterator/go v1.1.13-0.20220915233716-71ac16282d12 // indirect github.com/k0kubun/go-ansi v0.0.0-20180517002512-3bf9e2903213 // indirect - github.com/klauspost/compress v1.18.1 // indirect + github.com/klauspost/compress v1.18.2 // indirect github.com/klauspost/cpuid/v2 v2.3.0 // indirect github.com/klauspost/crc32 v1.3.0 // indirect github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b // indirect @@ -280,17 +284,17 @@ require ( github.com/prometheus/client_model v0.6.2 // indirect github.com/prometheus/common v0.67.4 // indirect github.com/prometheus/procfs v0.19.2 // indirect - github.com/prometheus/prometheus v0.307.3 // indirect + github.com/prometheus/prometheus v0.308.0 // indirect github.com/quic-go/qpack v0.6.0 // indirect - github.com/quic-go/quic-go v0.57.0 // indirect - github.com/redis/go-redis/v9 v9.17.0 // indirect + github.com/quic-go/quic-go v0.57.1 // indirect + github.com/redis/go-redis/v9 v9.17.2 // indirect github.com/regfish/regfish-dnsapi-go v0.1.1 // indirect github.com/robfig/cron/v3 v3.0.1 // indirect github.com/rs/xid v1.6.0 // indirect github.com/sacloud/api-client-go v0.3.3 // indirect github.com/sacloud/go-http v0.1.9 // indirect github.com/sacloud/iaas-api-go v1.22.0 // indirect - github.com/sacloud/packages-go v0.0.11 // indirect + github.com/sacloud/packages-go v0.0.12 // indirect github.com/sagikazarmark/locafero v0.12.0 // indirect github.com/scaleway/scaleway-sdk-go v1.0.0-beta.35 // indirect github.com/selectel/domains-go v1.1.0 // indirect @@ -308,10 +312,9 @@ require ( github.com/stretchr/objx v0.5.3 // indirect github.com/subosito/gotenv v1.6.0 // indirect github.com/technoweenie/multipartstreamer v1.0.1 // indirect - github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.3.3 // indirect github.com/timtadh/data-structures v0.6.2 // indirect github.com/timtadh/lexmachine v0.2.3 // indirect - github.com/tinylib/msgp v1.5.0 // indirect + github.com/tinylib/msgp v1.6.1 // indirect github.com/tjfoc/gmsm v1.4.1 // indirect github.com/tklauser/go-sysconf v0.3.16 // indirect github.com/tklauser/numcpus v0.11.0 // indirect @@ -319,14 +322,14 @@ require ( github.com/twitchyliquid64/golang-asm v0.15.1 // indirect github.com/ugorji/go/codec v1.3.1 // indirect github.com/ultradns/ultradns-go-sdk v1.8.1-20250722213956-faef419 // indirect - github.com/vinyldns/go-vinyldns v0.9.16 // indirect + github.com/vinyldns/go-vinyldns v0.9.17 // indirect github.com/volcengine/volc-sdk-golang v1.0.229 // indirect github.com/vultr/govultr/v3 v3.25.0 // indirect github.com/wk8/go-ordered-map/v2 v2.1.8 // indirect github.com/x448/float16 v0.8.4 // indirect - github.com/yandex-cloud/go-genproto v0.38.0 // indirect - github.com/yandex-cloud/go-sdk/services/dns v0.0.20 // indirect - github.com/yandex-cloud/go-sdk/v2 v2.28.0 // indirect + github.com/yandex-cloud/go-genproto v0.40.0 // indirect + github.com/yandex-cloud/go-sdk/services/dns v0.0.22 // indirect + github.com/yandex-cloud/go-sdk/v2 v2.31.0 // indirect github.com/yosida95/uritemplate/v3 v3.0.2 // indirect github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 // indirect github.com/yusufpapurcu/wmi v1.2.4 // indirect @@ -351,12 +354,12 @@ require ( golang.org/x/text v0.31.0 // indirect golang.org/x/time v0.14.0 // indirect golang.org/x/tools v0.39.0 // indirect - google.golang.org/api v0.256.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20251111163417-95abcf5c77ba // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20251111163417-95abcf5c77ba // indirect + google.golang.org/api v0.257.0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20251202230838-ff82c1b0f217 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20251202230838-ff82c1b0f217 // indirect google.golang.org/protobuf v1.36.10 // indirect gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect - gopkg.in/ns1/ns1-go.v2 v2.15.2 // indirect + gopkg.in/ns1/ns1-go.v2 v2.16.0 // indirect gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/go.sum b/go.sum index 57dc3053..4cc1ab92 100644 --- a/go.sum +++ b/go.sum @@ -705,6 +705,8 @@ github.com/alibabacloud-go/alibabacloud-gateway-pop v0.0.6/go.mod h1:4EUIoxs/do2 github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.4/go.mod h1:sCavSAvdzOjul4cEqeVtvlSaSScfNsTQ+46HwlTL1hc= github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.5 h1:zE8vH9C7JiZLNJJQ5OwjU9mSi4T9ef9u3BURT6LCLC8= github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.5/go.mod h1:tWnyE9AjF8J8qqLk645oUmVUnFybApTQWklQmi5tY6g= +github.com/alibabacloud-go/alidns-20150109/v4 v4.7.0 h1:FbnXG/mzQRmLyMmm+77UWmERBG9WN4pEyP4RPxu0BV4= +github.com/alibabacloud-go/alidns-20150109/v4 v4.7.0/go.mod h1:tQC0GWirFd1oSCd+gvIsECDex/nQjO8LFDZ0ZBEGOgY= github.com/alibabacloud-go/darabonba-array v0.1.0 h1:vR8s7b1fWAQIjEjWnuF0JiKsCvclSRTfDzZHTYqfufY= github.com/alibabacloud-go/darabonba-array v0.1.0/go.mod h1:BLKxr0brnggqOJPqT09DFJ8g3fsDshapUD3C3aOEFaI= github.com/alibabacloud-go/darabonba-encode-util v0.0.2 h1:1uJGrbsGEVqWcWxrS9MyC2NG0Ax+GpOM5gtupki31XE= @@ -751,6 +753,10 @@ github.com/aliyun/credentials-go v1.3.6/go.mod h1:1LxUuX7L5YrZUWzBrRyk0SwSdH4OmP github.com/aliyun/credentials-go v1.4.5/go.mod h1:Jm6d+xIgwJVLVWT561vy67ZRP4lPTQxMbEYRuT2Ti1U= github.com/aliyun/credentials-go v1.4.7 h1:T17dLqEtPUFvjDRRb5giVvLh6dFT8IcNFJJb7MeyCxw= github.com/aliyun/credentials-go v1.4.7/go.mod h1:Jm6d+xIgwJVLVWT561vy67ZRP4lPTQxMbEYRuT2Ti1U= +github.com/aliyun/credentials-go v1.4.8 h1:MEfZGWGC3L1icM1nGcYF8rWdQBG2k1Sya2pq9uRwd30= +github.com/aliyun/credentials-go v1.4.8/go.mod h1:Jm6d+xIgwJVLVWT561vy67ZRP4lPTQxMbEYRuT2Ti1U= +github.com/aliyun/credentials-go v1.4.9 h1:E50Nu/wLHorolzVYpiwf11VK2RW5hNT9RjCiSKtRx6s= +github.com/aliyun/credentials-go v1.4.9/go.mod h1:Jm6d+xIgwJVLVWT561vy67ZRP4lPTQxMbEYRuT2Ti1U= github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/apache/arrow/go/v10 v10.0.1/go.mod h1:YvhnlEePVnBS4+0z3fhPfUy7W1Ikj0Ih0vcRo/gZ1M0= @@ -770,60 +776,92 @@ github.com/aws/aws-sdk-go v1.40.45/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm github.com/aws/aws-sdk-go-v2 v1.9.1/go.mod h1:cK/D0BBs0b/oWPIcX/Z/obahJK1TT7IPVjy53i/mX/4= github.com/aws/aws-sdk-go-v2 v1.40.0 h1:/WMUA0kjhZExjOQN2z3oLALDREea1A7TobfuiBrKlwc= github.com/aws/aws-sdk-go-v2 v1.40.0/go.mod h1:c9pm7VwuW0UPxAEYGyTmyurVcNrbF6Rt/wixFqDhcjE= +github.com/aws/aws-sdk-go-v2 v1.40.1 h1:difXb4maDZkRH0x//Qkwcfpdg1XQVXEAEs2DdXldFFc= +github.com/aws/aws-sdk-go-v2 v1.40.1/go.mod h1:MayyLB8y+buD9hZqkCW3kX1AKq07Y5pXxtgB+rRFhz0= github.com/aws/aws-sdk-go-v2/config v1.32.1 h1:iODUDLgk3q8/flEC7ymhmxjfoAnBDwEEYEVyKZ9mzjU= github.com/aws/aws-sdk-go-v2/config v1.32.1/go.mod h1:xoAgo17AGrPpJBSLg81W+ikM0cpOZG8ad04T2r+d5P0= github.com/aws/aws-sdk-go-v2/config v1.32.2 h1:4liUsdEpUUPZs5WVapsJLx5NPmQhQdez7nYFcovrytk= github.com/aws/aws-sdk-go-v2/config v1.32.2/go.mod h1:l0hs06IFz1eCT+jTacU/qZtC33nvcnLADAPL/XyrkZI= +github.com/aws/aws-sdk-go-v2/config v1.32.3 h1:cpz7H2uMNTDa0h/5CYL5dLUEzPSLo2g0NkbxTRJtSSU= +github.com/aws/aws-sdk-go-v2/config v1.32.3/go.mod h1:srtPKaJJe3McW6T/+GMBZyIPc+SeqJsNPJsd4mOYZ6s= github.com/aws/aws-sdk-go-v2/credentials v1.19.1 h1:JeW+EwmtTE0yXFK8SmklrFh/cGTTXsQJumgMZNlbxfM= github.com/aws/aws-sdk-go-v2/credentials v1.19.1/go.mod h1:BOoXiStwTF+fT2XufhO0Efssbi1CNIO/ZXpZu87N0pw= github.com/aws/aws-sdk-go-v2/credentials v1.19.2 h1:qZry8VUyTK4VIo5aEdUcBjPZHL2v4FyQ3QEOaWcFLu4= github.com/aws/aws-sdk-go-v2/credentials v1.19.2/go.mod h1:YUqm5a1/kBnoK+/NY5WEiMocZihKSo15/tJdmdXnM5g= +github.com/aws/aws-sdk-go-v2/credentials v1.19.3 h1:01Ym72hK43hjwDeJUfi1l2oYLXBAOR8gNSZNmXmvuas= +github.com/aws/aws-sdk-go-v2/credentials v1.19.3/go.mod h1:55nWF/Sr9Zvls0bGnWkRxUdhzKqj9uRNlPvgV1vgxKc= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.14 h1:WZVR5DbDgxzA0BJeudId89Kmgy6DIU4ORpxwsVHz0qA= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.14/go.mod h1:Dadl9QO0kHgbrH1GRqGiZdYtW5w+IXXaBNCHTIaheM4= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.15 h1:utxLraaifrSBkeyII9mIbVwXXWrZdlPO7FIKmyLCEcY= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.15/go.mod h1:hW6zjYUDQwfz3icf4g2O41PHi77u10oAzJ84iSzR/lo= github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.14 h1:PZHqQACxYb8mYgms4RZbhZG0a7dPW06xOjmaH0EJC/I= github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.14/go.mod h1:VymhrMJUWs69D8u0/lZ7jSB6WgaG/NqHi3gX0aYf6U0= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.15 h1:Y5YXgygXwDI5P4RkteB5yF7v35neH7LfJKBG+hzIons= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.15/go.mod h1:K+/1EpG42dFSY7CBj+Fruzm8PsCGWTXJ3jdeJ659oGQ= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.14 h1:bOS19y6zlJwagBfHxs0ESzr1XCOU2KXJCWcq3E2vfjY= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.14/go.mod h1:1ipeGBMAxZ0xcTm6y6paC2C/J6f6OO7LBODV9afuAyM= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.15 h1:AvltKnW9ewxX2hFmQS0FyJH93aSvJVUEFvXfU+HWtSE= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.15/go.mod h1:3I4oCdZdmgrREhU74qS1dK9yZ62yumob+58AbFR4cQA= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.4 h1:WKuaxf++XKWlHWu9ECbMlha8WOEGm0OUEZqm4K/Gcfk= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.4/go.mod h1:ZWy7j6v1vWGmPReu0iSGvRiise4YI5SkR3OHKTZ6Wuc= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.8.1/go.mod h1:CM+19rL1+4dFWnOQKwDc7H1KwXTz+h61oUSHyhV0b3o= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.3 h1:x2Ibm/Af8Fi+BH+Hsn9TXGdT+hKbDd5XOTZxTMxDk7o= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.3/go.mod h1:IW1jwyrQgMdhisceG8fQLmQIydcT/jWY21rFhzgaKwo= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.4 h1:0ryTNEdJbzUCEWkVXEXoqlXV72J5keC1GvILMOuD00E= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.4/go.mod h1:HQ4qwNZh32C3CBeO6iJLQlgtMzqeG17ziAA/3KDJFow= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.14 h1:FIouAnCE46kyYqyhs0XEBDFFSREtdnr8HQuLPQPLCrY= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.14/go.mod h1:UTwDc5COa5+guonQU8qBikJo1ZJ4ln2r1MkF7Dqag1E= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.15 h1:3/u/4yZOffg5jdNk1sDpOQ4Y+R6Xbh+GzpDrSZjuy3U= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.15/go.mod h1:4Zkjq0FKjE78NKjabuM4tRXKFzUJWXgP0ItEZK8l7JU= github.com/aws/aws-sdk-go-v2/service/lightsail v1.50.7 h1:o5kT+nFYZbestjv0GWibkVS3bCf+ZijhGiMc3Xxj/hg= github.com/aws/aws-sdk-go-v2/service/lightsail v1.50.7/go.mod h1:x+omzRoqYYFX+H8/va+Gt2Yg4xGaHZMRowr77Y/UGIA= github.com/aws/aws-sdk-go-v2/service/lightsail v1.50.8 h1:jhwva7OKpYXrTQmCG4L7lF2FvB2irs1oRyGAwmQ4lmA= github.com/aws/aws-sdk-go-v2/service/lightsail v1.50.8/go.mod h1:x+omzRoqYYFX+H8/va+Gt2Yg4xGaHZMRowr77Y/UGIA= +github.com/aws/aws-sdk-go-v2/service/lightsail v1.50.9 h1:AqDkPN2Q6yxpgDRSFTLQLVS/x0Vk9yoWU6CGGRkBzV8= +github.com/aws/aws-sdk-go-v2/service/lightsail v1.50.9/go.mod h1:BupPA68GEYJPxIh3JNLDcqGRVWUEmYfYUN0A9YMW35I= github.com/aws/aws-sdk-go-v2/service/route53 v1.60.1 h1:dU7oc4LXR9j4mi1DtD8549D/rUtKA4rcWNY1HPoKzx8= github.com/aws/aws-sdk-go-v2/service/route53 v1.60.1/go.mod h1:Wa3q5R2uwIfIL3HZH+vG1/P9y7CjjfzTgcz5IWXlsZs= github.com/aws/aws-sdk-go-v2/service/route53 v1.61.0 h1:W3+0Cbc9awFBr9Yt7nFUkvB4N4e7vVIGtKD1qDttXn4= github.com/aws/aws-sdk-go-v2/service/route53 v1.61.0/go.mod h1:Wa3q5R2uwIfIL3HZH+vG1/P9y7CjjfzTgcz5IWXlsZs= +github.com/aws/aws-sdk-go-v2/service/route53 v1.61.1 h1:ik9tMw+xWZqzffOtGH3PfV0Yy/V+QsCb1XYXXXjUskk= +github.com/aws/aws-sdk-go-v2/service/route53 v1.61.1/go.mod h1:JRqmldxIPU6uck5bcFS8ExwwG2mUwfy+jiUmismOxJs= github.com/aws/aws-sdk-go-v2/service/signin v1.0.1 h1:BDgIUYGEo5TkayOWv/oBLPphWwNm/A91AebUjAu5L5g= github.com/aws/aws-sdk-go-v2/service/signin v1.0.1/go.mod h1:iS6EPmNeqCsGo+xQmXv0jIMjyYtQfnwg36zl2FwEouk= github.com/aws/aws-sdk-go-v2/service/signin v1.0.2 h1:MxMBdKTYBjPQChlJhi4qlEueqB1p1KcbTEa7tD5aqPs= github.com/aws/aws-sdk-go-v2/service/signin v1.0.2/go.mod h1:iS6EPmNeqCsGo+xQmXv0jIMjyYtQfnwg36zl2FwEouk= +github.com/aws/aws-sdk-go-v2/service/signin v1.0.3 h1:d/6xOGIllc/XW1lzG9a4AUBMmpLA9PXcQnVPTuHHcik= +github.com/aws/aws-sdk-go-v2/service/signin v1.0.3/go.mod h1:fQ7E7Qj9GiW8y0ClD7cUJk3Bz5Iw8wZkWDHsTe8vDKs= github.com/aws/aws-sdk-go-v2/service/sso v1.30.4 h1:U//SlnkE1wOQiIImxzdY5PXat4Wq+8rlfVEw4Y7J8as= github.com/aws/aws-sdk-go-v2/service/sso v1.30.4/go.mod h1:av+ArJpoYf3pgyrj6tcehSFW+y9/QvAY8kMooR9bZCw= github.com/aws/aws-sdk-go-v2/service/sso v1.30.5 h1:ksUT5KtgpZd3SAiFJNJ0AFEJVva3gjBmN7eXUZjzUwQ= github.com/aws/aws-sdk-go-v2/service/sso v1.30.5/go.mod h1:av+ArJpoYf3pgyrj6tcehSFW+y9/QvAY8kMooR9bZCw= +github.com/aws/aws-sdk-go-v2/service/sso v1.30.6 h1:8sTTiw+9yuNXcfWeqKF2x01GqCF49CpP4Z9nKrrk/ts= +github.com/aws/aws-sdk-go-v2/service/sso v1.30.6/go.mod h1:8WYg+Y40Sn3X2hioaaWAAIngndR8n1XFdRPPX+7QBaM= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.9 h1:LU8S9W/mPDAU9q0FjCLi0TrCheLMGwzbRpvUMwYspcA= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.9/go.mod h1:/j67Z5XBVDx8nZVp9EuFM9/BS5dvBznbqILGuu73hug= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.10 h1:GtsxyiF3Nd3JahRBJbxLCCdYW9ltGQYrFWg8XdkGDd8= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.10/go.mod h1:/j67Z5XBVDx8nZVp9EuFM9/BS5dvBznbqILGuu73hug= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.11 h1:E+KqWoVsSrj1tJ6I/fjDIu5xoS2Zacuu1zT+H7KtiIk= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.11/go.mod h1:qyWHz+4lvkXcr3+PoGlGHEI+3DLLiU6/GdrFfMaAhB0= github.com/aws/aws-sdk-go-v2/service/sts v1.41.1 h1:GdGmKtG+/Krag7VfyOXV17xjTCz0i9NT+JnqLTOI5nA= github.com/aws/aws-sdk-go-v2/service/sts v1.41.1/go.mod h1:6TxbXoDSgBQ225Qd8Q+MbxUxUh6TtNKwbRt/EPS9xso= github.com/aws/aws-sdk-go-v2/service/sts v1.41.2 h1:a5UTtD4mHBU3t0o6aHQZFJTNKVfxFWfPX7J0Lr7G+uY= github.com/aws/aws-sdk-go-v2/service/sts v1.41.2/go.mod h1:6TxbXoDSgBQ225Qd8Q+MbxUxUh6TtNKwbRt/EPS9xso= +github.com/aws/aws-sdk-go-v2/service/sts v1.41.3 h1:tzMkjh0yTChUqJDgGkcDdxvZDSrJ/WB6R6ymI5ehqJI= +github.com/aws/aws-sdk-go-v2/service/sts v1.41.3/go.mod h1:T270C0R5sZNLbWUe8ueiAF42XSZxxPocTaGSgs5c/60= github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= github.com/aws/smithy-go v1.23.2 h1:Crv0eatJUQhaManss33hS5r40CG3ZFH+21XSkqMrIUM= github.com/aws/smithy-go v1.23.2/go.mod h1:LEj2LM3rBRQJxPZTB4KuzZkaZYnZPnvgIhb4pu07mx0= +github.com/aws/smithy-go v1.24.0 h1:LpilSUItNPFr1eY85RYgTIg5eIEPtvFbskaFcmmIUnk= +github.com/aws/smithy-go v1.24.0/go.mod h1:LEj2LM3rBRQJxPZTB4KuzZkaZYnZPnvgIhb4pu07mx0= github.com/aziontech/azionapi-go-sdk v0.144.0 h1:T+/w18o+FCiZsk3Z0ACBVVe7c/5EGLG15S3P8JfuPfo= github.com/aziontech/azionapi-go-sdk v0.144.0/go.mod h1:OKxP/R0iVXnJJakYwMhh2BGAXnud8Ruy55Ak9ANuWoU= github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPnH1Wvgk= github.com/bahlo/generic-list-go v0.2.0/go.mod h1:2KvAjgMlE5NNynlg/5iLrrCCZ2+5xWbdbCW3pNTGyYg= github.com/baidubce/bce-sdk-go v0.9.252 h1:TONS/utgfEkDjvHllVZFBrTsjsNhk51rhWuj3ppcL4s= github.com/baidubce/bce-sdk-go v0.9.252/go.mod h1:zbYJMQwE4IZuyrJiFO8tO8NbtYiKTFTbwh4eIsqjVdg= +github.com/baidubce/bce-sdk-go v0.9.253 h1:ZC+tW3C1cl0AjPkZYJbM52Jz9cTSLY+tU4Qg5XiBthM= +github.com/baidubce/bce-sdk-go v0.9.253/go.mod h1:zbYJMQwE4IZuyrJiFO8tO8NbtYiKTFTbwh4eIsqjVdg= github.com/bboreham/go-loser v0.0.0-20230920113527-fcc2c21820a3 h1:6df1vn4bBlDDo4tARvBm7l6KA9iVMnE3NWizDeWSrps= github.com/bboreham/go-loser v0.0.0-20230920113527-fcc2c21820a3/go.mod h1:CIWtjkly68+yqLPbvwwR/fjNJA/idrtULjZWh2v1ys0= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= @@ -839,6 +877,8 @@ github.com/bits-and-blooms/bitset v1.24.4/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6 github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= github.com/blevesearch/bleve/v2 v2.5.5 h1:lzC89QUCco+y1qBnJxGqm4AbtsdsnlUvq0kXok8n3C8= github.com/blevesearch/bleve/v2 v2.5.5/go.mod h1:t5WoESS5TDteTdnjhhvpA1BpLYErOBX2IQViTMLK7wo= +github.com/blevesearch/bleve/v2 v2.5.6 h1:YdixQmOUuZHojQRe8Te7BY2cRirbzpbcpybAFs0m2DI= +github.com/blevesearch/bleve/v2 v2.5.6/go.mod h1:t5WoESS5TDteTdnjhhvpA1BpLYErOBX2IQViTMLK7wo= github.com/blevesearch/bleve_index_api v1.2.11 h1:bXQ54kVuwP8hdrXUSOnvTQfgK0KI1+f9A0ITJT8tX1s= github.com/blevesearch/bleve_index_api v1.2.11/go.mod h1:rKQDl4u51uwafZxFrPD1R7xFOwKnzZW7s/LSeK4lgo0= github.com/blevesearch/geo v0.2.4 h1:ECIGQhw+QALCZaDcogRTNSJYQXRtC8/m8IKiA706cqk= @@ -916,6 +956,7 @@ github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F9 github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= +github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= @@ -927,10 +968,13 @@ github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5P github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= +github.com/clbanning/mxj v1.8.4 h1:HuhwZtbyvyOw+3Z1AowPkU87JkJUSv751ELWaiTpj8I= github.com/clbanning/mxj v1.8.4/go.mod h1:BVjHeAH+rl9rs6f+QIpeRl0tfu10SXn1pUSa5PVGJng= github.com/clbanning/mxj/v2 v2.7.0 h1:WA/La7UGCanFe5NpHF0Q3DNtnCsVoxbPKuyBNHWRyME= github.com/clbanning/mxj/v2 v2.7.0/go.mod h1:hNiWqW14h+kc+MdF9C6/YoRfjEJoR3ou6tn/Qo+ve2s= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cloudflare/cloudflare-go v0.116.0 h1:iRPMnTtnswRpELO65NTwMX4+RTdxZl+Xf/zi+HPE95s= +github.com/cloudflare/cloudflare-go v0.116.0/go.mod h1:Ds6urDwn/TF2uIU24mu7H91xkKP8gSAHxQ44DSZgVmU= github.com/cloudwego/base64x v0.1.6 h1:t11wG9AECkCDk5fMSoxmufanudBtJ+/HemLstXDLI2M= github.com/cloudwego/base64x v0.1.6/go.mod h1:OFcloc187FXDaYHvrNIjxSe8ncn0OOM8gEHfghB2IPU= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= @@ -1067,8 +1111,8 @@ github.com/gin-gonic/gin v1.11.0 h1:OW/6PLjyusp2PPXtyxKHU0RbX6I/l28FTdDlae5ueWk= github.com/gin-gonic/gin v1.11.0/go.mod h1:+iq/FyxlGzII0KHiBGjuNn4UNENUlKbGlNmc+W50Dls= github.com/go-acme/alidns-20150109/v4 v4.7.0 h1:PqJ/wR0JTpL4v0Owu1uM7bPQ1Yww0eQLAuuSdLjjQaQ= github.com/go-acme/alidns-20150109/v4 v4.7.0/go.mod h1:btQvB6xZoN6ykKB74cPhiR+uvhrEE2AFVXm6RDmCHm0= -github.com/go-acme/esa-20240910/v2 v2.40.1 h1:pog3UlF5d+3LPoo1L8u8PqB189recIXX8T7pGoEz18A= -github.com/go-acme/esa-20240910/v2 v2.40.1/go.mod h1:ZYdN9EN9ikn26SNapxCVjZ65pHT/1qm4fzuJ7QGVX6g= +github.com/go-acme/esa-20240910/v2 v2.40.2 h1:Hm1sADNILzLNAwp6iVCDCNllxVcDFnDwJKVoUyYSbIE= +github.com/go-acme/esa-20240910/v2 v2.40.2/go.mod h1:ZYdN9EN9ikn26SNapxCVjZ65pHT/1qm4fzuJ7QGVX6g= github.com/go-acme/lego/v4 v4.28.1 h1:zt301JYF51UIEkpSXsdeGq9hRePeFzQCq070OdAmP0Q= github.com/go-acme/lego/v4 v4.28.1/go.mod h1:bzjilr03IgbaOwlH396hq5W56Bi0/uoRwW/JM8hP7m4= github.com/go-acme/lego/v4 v4.29.0 h1:vKMEtvoKb0gOO9rWO9zMBwE4CgI5A5CWDsK4QEeBqzo= @@ -1170,6 +1214,8 @@ github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PU github.com/goccy/go-yaml v1.9.8/go.mod h1:JubOolP3gh0HpiBc4BLRD4YmjEjHAmIIB2aaXKkTfoE= github.com/goccy/go-yaml v1.18.0 h1:8W7wMFS12Pcas7KU+VVkaiCng+kG8QiFeFwzFb+rwuw= github.com/goccy/go-yaml v1.18.0/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA= +github.com/goccy/go-yaml v1.19.0 h1:EmkZ9RIsX+Uq4DYFowegAuJo8+xdX3T/2dwNPXbxEYE= +github.com/goccy/go-yaml v1.19.0/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/flock v0.13.0 h1:95JolYOvGMqeH31+FC7D2+uULf6mG61mEZ/A8dRYMzw= github.com/gofrs/flock v0.13.0/go.mod h1:jxeyy9R1auM5S6JYDBhDt+E2TCo7DkratH4Pgi8P+Z0= @@ -1284,6 +1330,8 @@ github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20251114195745-4902fdda35c8 h1:3DsUAV+VNEQa2CUVLxCY3f87278uWfIDhJnbdvDjvmE= github.com/google/pprof v0.0.0-20251114195745-4902fdda35c8/go.mod h1:I6V7YzU0XDpsHqbsyrghnFZLO1gwK6NPTNvmetQIk9U= +github.com/google/pprof v0.0.0-20251208000136-3d256cb9ff16 h1:ptucaU8cwiAc+/jqDblz0kb1ECLqPTeX/qQym8OBYzY= +github.com/google/pprof v0.0.0-20251208000136-3d256cb9ff16/go.mod h1:67FPmZWbr+KDT/VlpWtw6sO9XSjpJmLuHpoLmWiTGgY= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/s2a-go v0.1.3/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0= @@ -1399,6 +1447,8 @@ github.com/huaweicloud/huaweicloud-sdk-go-v3 v0.1.177 h1:q+VNuW4FgmA9+/+1OPjvF+W github.com/huaweicloud/huaweicloud-sdk-go-v3 v0.1.177/go.mod h1:M+yna96Fx9o5GbIUnF3OvVvQGjgfVSyeJbV9Yb1z/wI= github.com/huaweicloud/huaweicloud-sdk-go-v3 v0.1.178 h1:eNVkjzdPMgM2qih9aECiFUI8S9zgpOwXxeBPAwQqtvU= github.com/huaweicloud/huaweicloud-sdk-go-v3 v0.1.178/go.mod h1:M+yna96Fx9o5GbIUnF3OvVvQGjgfVSyeJbV9Yb1z/wI= +github.com/huaweicloud/huaweicloud-sdk-go-v3 v0.1.179 h1:1RVM10qJ+vHnVzu37ltVcth5lxHjmOBbdim8X5gtAy0= +github.com/huaweicloud/huaweicloud-sdk-go-v3 v0.1.179/go.mod h1:M+yna96Fx9o5GbIUnF3OvVvQGjgfVSyeJbV9Yb1z/wI= github.com/hudl/fargo v1.4.0/go.mod h1:9Ai6uvFy5fQNq6VPKtg+Ceq1+eTY4nKUlR2JElEOcDo= github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= @@ -1526,6 +1576,8 @@ github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47e github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= github.com/klauspost/compress v1.18.1 h1:bcSGx7UbpBqMChDtsF28Lw6v/G94LPrrbMbdC3JH2co= github.com/klauspost/compress v1.18.1/go.mod h1:ZQFFVG+MdnR0P+l6wpXgIL4NTtwiKIdBnrBd8Nrxr+0= +github.com/klauspost/compress v1.18.2 h1:iiPHWW0YrcFgpBYhsA6D1+fqHssJscY/Tm/y2Uqnapk= +github.com/klauspost/compress v1.18.2/go.mod h1:R0h/fSBs8DE4ENlcrlib3PsXS61voFxhIs2DeRhCvJ4= github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y= @@ -1586,6 +1638,8 @@ github.com/mailru/easyjson v0.9.1 h1:LbtsOm5WAswyWbvTEOqhypdPeZzHavpZx96/n553mR8 github.com/mailru/easyjson v0.9.1/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUto+XFtTU= github.com/mark3labs/mcp-go v0.43.1 h1:WXNVd+bRM/7mOzCM9zulSwn/s9YEdAxbmeh9LoRHEXY= github.com/mark3labs/mcp-go v0.43.1/go.mod h1:YnJfOL382MIWDx1kMY+2zsRHU/q78dBg9aFb8W6Thdw= +github.com/mark3labs/mcp-go v0.43.2 h1:21PUSlWWiSbUPQwXIJ5WKlETixpFpq+WBpbMGDSVy/I= +github.com/mark3labs/mcp-go v0.43.2/go.mod h1:YnJfOL382MIWDx1kMY+2zsRHU/q78dBg9aFb8W6Thdw= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= @@ -1790,6 +1844,7 @@ github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2 github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= github.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= +github.com/pierrec/lz4 v2.6.1+incompatible h1:9UY3+iC23yxF0UfGaYrGplQ+79Rg+h/q9FV9ix19jjM= github.com/pierrec/lz4 v2.6.1+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pierrec/lz4/v4 v4.1.22 h1:cKFw6uJDK+/gfw5BcDL0JL5aBsAFdsIT18eRtLj7VIU= @@ -1860,17 +1915,26 @@ github.com/prometheus/procfs v0.19.2 h1:zUMhqEW66Ex7OXIiDkll3tl9a1ZdilUOd/F6ZXw4 github.com/prometheus/procfs v0.19.2/go.mod h1:M0aotyiemPhBCM0z5w87kL22CxfcH05ZpYlu+b4J7mw= github.com/prometheus/prometheus v0.307.3 h1:zGIN3EpiKacbMatcUL2i6wC26eRWXdoXfNPjoBc2l34= github.com/prometheus/prometheus v0.307.3/go.mod h1:sPbNW+KTS7WmzFIafC3Inzb6oZVaGLnSvwqTdz2jxRQ= +github.com/prometheus/prometheus v0.308.0 h1:kVh/5m1n6m4cSK9HYTDEbMxzuzCWyEdPdKSxFRxXj04= +github.com/prometheus/prometheus v0.308.0/go.mod h1:xXYKzScyqyFHihpS0UsXpC2F3RA/CygOs7wb4mpdusE= github.com/prometheus/sigv4 v0.2.1 h1:hl8D3+QEzU9rRmbKIRwMKRwaFGyLkbPdH5ZerglRHY0= github.com/prometheus/sigv4 v0.2.1/go.mod h1:ySk6TahIlsR2sxADuHy4IBFhwEjRGGsfbbLGhFYFj6Q= +github.com/prometheus/sigv4 v0.3.0 h1:QIG7nTbu0JTnNidGI1Uwl5AGVIChWUACxn2B/BQ1kms= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/quic-go/qpack v0.6.0 h1:g7W+BMYynC1LbYLSqRt8PBg5Tgwxn214ZZR34VIOjz8= github.com/quic-go/qpack v0.6.0/go.mod h1:lUpLKChi8njB4ty2bFLX2x4gzDqXwUpaO1DP9qMDZII= github.com/quic-go/quic-go v0.57.0 h1:AsSSrrMs4qI/hLrKlTH/TGQeTMY0ib1pAOX7vA3AdqE= github.com/quic-go/quic-go v0.57.0/go.mod h1:ly4QBAjHA2VhdnxhojRsCUOeJwKYg+taDlos92xb1+s= +github.com/quic-go/quic-go v0.57.1 h1:25KAAR9QR8KZrCZRThWMKVAwGoiHIrNbT72ULHTuI10= +github.com/quic-go/quic-go v0.57.1/go.mod h1:ly4QBAjHA2VhdnxhojRsCUOeJwKYg+taDlos92xb1+s= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/redis/go-redis/v9 v9.17.0 h1:K6E+ZlYN95KSMmZeEQPbU/c++wfmEvfFB17yEAq/VhM= github.com/redis/go-redis/v9 v9.17.0/go.mod h1:u410H11HMLoB+TP67dz8rL9s6QW2j76l0//kSOd3370= +github.com/redis/go-redis/v9 v9.17.1 h1:7tl732FjYPRT9H9aNfyTwKg9iTETjWjGKEJ2t/5iWTs= +github.com/redis/go-redis/v9 v9.17.1/go.mod h1:u410H11HMLoB+TP67dz8rL9s6QW2j76l0//kSOd3370= +github.com/redis/go-redis/v9 v9.17.2 h1:P2EGsA4qVIM3Pp+aPocCJ7DguDHhqrXNhVcEp4ViluI= +github.com/redis/go-redis/v9 v9.17.2/go.mod h1:u410H11HMLoB+TP67dz8rL9s6QW2j76l0//kSOd3370= github.com/regfish/regfish-dnsapi-go v0.1.1 h1:TJFtbePHkd47q5GZwYl1h3DIYXmoxdLjW/SBsPtB5IE= github.com/regfish/regfish-dnsapi-go v0.1.1/go.mod h1:ubIgXSfqarSnl3XHSn8hIFwFF3h0yrq0ZiWD93Y2VjY= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= @@ -1902,6 +1966,8 @@ github.com/sacloud/iaas-api-go v1.22.0 h1:nvLQNuxcfxILvoxA6WcnTjU9A8yv8dPI1OSYHA github.com/sacloud/iaas-api-go v1.22.0/go.mod h1:PLcolyFlby/0ExZTOdUf9xzhkEMBuVzORadXDNN21no= github.com/sacloud/packages-go v0.0.11 h1:hrRWLmfPM9w7GBs6xb5/ue6pEMl8t1UuDKyR/KfteHo= github.com/sacloud/packages-go v0.0.11/go.mod h1:XNF5MCTWcHo9NiqWnYctVbASSSZR3ZOmmQORIzcurJ8= +github.com/sacloud/packages-go v0.0.12 h1:MKeZNN3FQn1heqUSRBrbZw89YusZA1n4kammjMFZYvQ= +github.com/sacloud/packages-go v0.0.12/go.mod h1:XNF5MCTWcHo9NiqWnYctVbASSSZR3ZOmmQORIzcurJ8= github.com/sagikazarmark/crypt v0.10.0/go.mod h1:gwTNHQVoOS3xp9Xvz5LLR+1AauC5M6880z5NWzdhOyQ= github.com/sagikazarmark/locafero v0.12.0 h1:/NQhBAkUb4+fH1jivKHWusDYFjMOOKU88eegjfxfHb4= github.com/sagikazarmark/locafero v0.12.0/go.mod h1:sZh36u/YSZ918v0Io+U9ogLYQJ9tLLBmM4eneO6WwsI= @@ -1919,6 +1985,8 @@ github.com/selectel/go-selvpcclient/v4 v4.1.0 h1:22lBp+rzg9g2MP4iiGhpVAcCt0kMv7I github.com/selectel/go-selvpcclient/v4 v4.1.0/go.mod h1:eFhL1KUW159KOJVeGO7k/Uxl0TYd/sBkWXjuF5WxmYk= github.com/shirou/gopsutil/v4 v4.25.10 h1:at8lk/5T1OgtuCp+AwrDofFRjnvosn0nkN2OLQ6g8tA= github.com/shirou/gopsutil/v4 v4.25.10/go.mod h1:+kSwyC8DRUD9XXEHCAFjK+0nuArFJM0lva+StQAcskM= +github.com/shirou/gopsutil/v4 v4.25.11 h1:X53gB7muL9Gnwwo2evPSE+SfOrltMoR6V3xJAXZILTY= +github.com/shirou/gopsutil/v4 v4.25.11/go.mod h1:EivAfP5x2EhLp2ovdpKSozecVXn1TmuG7SMzs/Wh4PU= github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k= @@ -2016,6 +2084,13 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.3.2 h1:ChHu7L github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.3.2/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.3.3 h1:r05ohLc0LVEpiEQeOJ5QwCiKk6XM9kjTca6+UAbNR/8= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.3.3/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.3.7/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.3.8 h1:DdeB0VtEs8UmJSPdNCTeqMW5ifX3Phlvu0o0WJXZ6yE= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.3.8/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod v1.3.3 h1:UqQW9k0+cln314ziJMtIiQGKXjL/BVLzO/RekmdkrGM= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod v1.3.3/go.mod h1:7qUfXEVLNQwbad2dSrbqCCGrE+5e/j69HbgtmMp1IlU= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod v1.3.7 h1:lbQreENxWLI6SeKbjvbKnTgMsBPGaFeJ0OYX74utwxA= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod v1.3.7/go.mod h1:+wjQc7L2X9CUvczJ+2pAdZiv8teqkrCfBD2x1vpKWhw= github.com/timtadh/data-structures v0.5.3/go.mod h1:9R4XODhJ8JdWFEI8P/HJKqxuJctfBQw6fDibMQny2oU= github.com/timtadh/data-structures v0.6.1/go.mod h1:uYUnI1cQi/5yMCc7s23I+x8Mn8BCMf4WgK+7/4QSEk4= github.com/timtadh/data-structures v0.6.2 h1:zybDnU5NLjJ7WKMDJpvVwczQuf1wSLBgdRHZ9O4AqJ0= @@ -2026,6 +2101,8 @@ github.com/timtadh/lexmachine v0.2.3 h1:ZqlfHnfMcAygtbNM5Gv7jQf8hmM8LfVzDjfCrq23 github.com/timtadh/lexmachine v0.2.3/go.mod h1:oK1NW+93fQSIF6s+J6sXBFWsCPCFbNmrwKV1i0aqvW0= github.com/tinylib/msgp v1.5.0 h1:GWnqAE54wmnlFazjq2+vgr736Akg58iiHImh+kPY2pc= github.com/tinylib/msgp v1.5.0/go.mod h1:cvjFkb4RiC8qSBOPMGPSzSAx47nAsfhLVTCZZNuHv5o= +github.com/tinylib/msgp v1.6.1 h1:ESRv8eL3u+DNHUoSAAQRE50Hm162zqAnBoGv9PzScPY= +github.com/tinylib/msgp v1.6.1/go.mod h1:RSp0LW9oSxFut3KzESt5Voq4GVWyS+PSulT77roAqEA= github.com/tjfoc/gmsm v1.3.2/go.mod h1:HaUcFuY0auTiaHB9MHFGCPx5IaLhTUd2atbCFBQXn9w= github.com/tjfoc/gmsm v1.4.1 h1:aMe1GlZb+0bLjn+cKTPEvvn9oUEBlJitaZiiBwsbgho= github.com/tjfoc/gmsm v1.4.1/go.mod h1:j4INPkHWMrhJb38G+J6W4Tw0AbuN8Thu3PbdVYhVcTE= @@ -2060,6 +2137,8 @@ github.com/urfave/cli/v3 v3.6.1 h1:j8Qq8NyUawj/7rTYdBGrxcH7A/j7/G8Q5LhWEW4G3Mo= github.com/urfave/cli/v3 v3.6.1/go.mod h1:ysVLtOEmg2tOy6PknnYVhDoouyC/6N42TMeoMzskhso= github.com/vinyldns/go-vinyldns v0.9.16 h1:GZJStDkcCk1F1AcRc64LuuMh+ENL8pHA0CVd4ulRMcQ= github.com/vinyldns/go-vinyldns v0.9.16/go.mod h1:5qIJOdmzAnatKjurI+Tl4uTus7GJKJxb+zitufjHs3Q= +github.com/vinyldns/go-vinyldns v0.9.17 h1:hfPZfCaxcRBX6Gsgl42rLCeoal58/BH8kkvJShzjjdI= +github.com/vinyldns/go-vinyldns v0.9.17/go.mod h1:pwWhE9K/leGDOIduVhRGvQ3ecVMHWRfEnKYUTEU3gB4= github.com/volcengine/volc-sdk-golang v1.0.228 h1:nbl99ln9sQBcSyMQEhhYqii3uhj8HtyiNclKJoKHHxo= github.com/volcengine/volc-sdk-golang v1.0.228/go.mod h1:zHJlaqiMbIB+0mcrsZPTwOb3FB7S/0MCfqlnO8R7hlM= github.com/volcengine/volc-sdk-golang v1.0.229 h1:gOkDltTS6Fta8OyfYrbeY9bqCHHyiJuGYNJpR5MR+Fo= @@ -2080,14 +2159,20 @@ github.com/yandex-cloud/go-genproto v0.37.0 h1:dbuj5qaG5+tIEKMV5fsyKtVILS9QehLcg github.com/yandex-cloud/go-genproto v0.37.0/go.mod h1:0LDD/IZLIUIV4iPH+YcF+jysO3jkSvADFGm4dCAuwQo= github.com/yandex-cloud/go-genproto v0.38.0 h1:uB3btG7mLOnu53ehYtRARCk04+80sBpxDrSkP3qC6G8= github.com/yandex-cloud/go-genproto v0.38.0/go.mod h1:0LDD/IZLIUIV4iPH+YcF+jysO3jkSvADFGm4dCAuwQo= +github.com/yandex-cloud/go-genproto v0.40.0 h1:IqbMFh5Zxd/gtE/7N2VK+HExpX5m7r9C7f5t8QAOO5Q= +github.com/yandex-cloud/go-genproto v0.40.0/go.mod h1:0LDD/IZLIUIV4iPH+YcF+jysO3jkSvADFGm4dCAuwQo= github.com/yandex-cloud/go-sdk/services/dns v0.0.19 h1:pyb18CWTZqjI09qQaq5Aimt4JMtr9TRzVPZa9mIquzw= github.com/yandex-cloud/go-sdk/services/dns v0.0.19/go.mod h1:PuDXvm5p1NC7/f1n80AjlSw9qJZJslm4tl2YF3yXkWo= github.com/yandex-cloud/go-sdk/services/dns v0.0.20 h1:xHBRa+IIYpTgMbTbmZf7aEKIqrJMcZGIF8ea4XIyLX0= github.com/yandex-cloud/go-sdk/services/dns v0.0.20/go.mod h1:8nYQULLJbbe51qdBY7Ay5v8wtDgdH7nHCMZs4XkwzLg= +github.com/yandex-cloud/go-sdk/services/dns v0.0.22 h1:haRF2xulpDJh8rdrcnWPJA/F44vfIpxI/DpssS3C2zI= +github.com/yandex-cloud/go-sdk/services/dns v0.0.22/go.mod h1:aUObcKIBDNfSL6HDxsKBFibpUrt2mi8hZe/LJJWAX04= github.com/yandex-cloud/go-sdk/v2 v2.27.0 h1:dtgU/LJw6xE+iT295JvHmZt65fx74ljPXffTF20DHtg= github.com/yandex-cloud/go-sdk/v2 v2.27.0/go.mod h1:nAzWojX+/ODtyFVhn9UIGPDT/cd6/BicOQWZQ49Sskg= github.com/yandex-cloud/go-sdk/v2 v2.28.0 h1:KDOrN75xokZBYbgjq6Pjvo+hEpu32xFhErtomLBML5s= github.com/yandex-cloud/go-sdk/v2 v2.28.0/go.mod h1:6vmAhqoCVYSJEb5OuhHUqIdxDy2b9uUXp1e5sqMhTmo= +github.com/yandex-cloud/go-sdk/v2 v2.31.0 h1:XIZF7ytMjYx6mGJwPvw5FOW5FLQjlZchOg3I15z1wRE= +github.com/yandex-cloud/go-sdk/v2 v2.31.0/go.mod h1:uZmBy4IlNI8Z9AnPsTTb8QDFs4r3oHvKdTrqAhGllTw= github.com/yosida95/uritemplate/v3 v3.0.2 h1:Ed3Oyj9yrmi9087+NczuL5BwkIc4wvTb5zIM+UJPGz4= github.com/yosida95/uritemplate/v3 v3.0.2/go.mod h1:ILOh0sOhIJR3+L/8afwt/kE++YT040gmv5BQTMR2HP4= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= @@ -2787,6 +2872,8 @@ google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45 google.golang.org/api v0.122.0/go.mod h1:gcitW0lvnyWjSp9nKxAbdHKIZ6vF4aajGueeslZOyms= google.golang.org/api v0.256.0 h1:u6Khm8+F9sxbCTYNoBHg6/Hwv0N/i+V94MvkOSor6oI= google.golang.org/api v0.256.0/go.mod h1:KIgPhksXADEKJlnEoRa9qAII4rXcy40vfI8HRqcU964= +google.golang.org/api v0.257.0 h1:8Y0lzvHlZps53PEaw+G29SsQIkuKrumGWs9puiexNAA= +google.golang.org/api v0.257.0/go.mod h1:4eJrr+vbVaZSqs7vovFd1Jb/A6ml6iw2e6FBYf3GAO4= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -2931,8 +3018,16 @@ google.golang.org/genproto v0.0.0-20250603155806-513f23925822 h1:rHWScKit0gvAPuO google.golang.org/genproto v0.0.0-20250603155806-513f23925822/go.mod h1:HubltRL7rMh0LfnQPkMH4NPDFEWp0jw3vixw7jEM53s= google.golang.org/genproto/googleapis/api v0.0.0-20251111163417-95abcf5c77ba h1:B14OtaXuMaCQsl2deSvNkyPKIzq3BjfxQp8d00QyWx4= google.golang.org/genproto/googleapis/api v0.0.0-20251111163417-95abcf5c77ba/go.mod h1:G5IanEx8/PgI9w6CFcYQf7jMtHQhZruvfM1i3qOqk5U= +google.golang.org/genproto/googleapis/api v0.0.0-20251124214823-79d6a2a48846 h1:ZdyUkS9po3H7G0tuh955QVyyotWvOD4W0aEapeGeUYk= +google.golang.org/genproto/googleapis/api v0.0.0-20251124214823-79d6a2a48846/go.mod h1:Fk4kyraUvqD7i5H6S43sj2W98fbZa75lpZz/eUyhfO0= +google.golang.org/genproto/googleapis/api v0.0.0-20251202230838-ff82c1b0f217 h1:fCvbg86sFXwdrl5LgVcTEvNC+2txB5mgROGmRL5mrls= +google.golang.org/genproto/googleapis/api v0.0.0-20251202230838-ff82c1b0f217/go.mod h1:+rXWjjaukWZun3mLfjmVnQi18E1AsFbDN9QdJ5YXLto= google.golang.org/genproto/googleapis/rpc v0.0.0-20251111163417-95abcf5c77ba h1:UKgtfRM7Yh93Sya0Fo8ZzhDP4qBckrrxEr2oF5UIVb8= google.golang.org/genproto/googleapis/rpc v0.0.0-20251111163417-95abcf5c77ba/go.mod h1:7i2o+ce6H/6BluujYR+kqX3GKH+dChPTQU19wjRPiGk= +google.golang.org/genproto/googleapis/rpc v0.0.0-20251124214823-79d6a2a48846 h1:Wgl1rcDNThT+Zn47YyCXOXyX/COgMTIdhJ717F0l4xk= +google.golang.org/genproto/googleapis/rpc v0.0.0-20251124214823-79d6a2a48846/go.mod h1:7i2o+ce6H/6BluujYR+kqX3GKH+dChPTQU19wjRPiGk= +google.golang.org/genproto/googleapis/rpc v0.0.0-20251202230838-ff82c1b0f217 h1:gRkg/vSppuSQoDjxyiGfN4Upv/h/DQmIR10ZU8dh4Ww= +google.golang.org/genproto/googleapis/rpc v0.0.0-20251202230838-ff82c1b0f217/go.mod h1:7i2o+ce6H/6BluujYR+kqX3GKH+dChPTQU19wjRPiGk= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -3020,6 +3115,8 @@ gopkg.in/ns1/ns1-go.v2 v2.15.1 h1:8rri2TzAPYcVbBGXn48+dz1Xg30PzHfZ4k8A9JOS0Z0= gopkg.in/ns1/ns1-go.v2 v2.15.1/go.mod h1:pfaU0vECVP7DIOr453z03HXS6dFJpXdNRwOyRzwmPSc= gopkg.in/ns1/ns1-go.v2 v2.15.2 h1:aBVyKeEH3rBFWwX72xPPjEuRL4+Lp5P9GlAcrzu0Y5M= gopkg.in/ns1/ns1-go.v2 v2.15.2/go.mod h1:pfaU0vECVP7DIOr453z03HXS6dFJpXdNRwOyRzwmPSc= +gopkg.in/ns1/ns1-go.v2 v2.16.0 h1:mUczKFnrCystSV7yIODzVSbENoud3T7DwstmyVZfqg4= +gopkg.in/ns1/ns1-go.v2 v2.16.0/go.mod h1:pfaU0vECVP7DIOr453z03HXS6dFJpXdNRwOyRzwmPSc= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= diff --git a/internal/cron/cron.go b/internal/cron/cron.go index d99f0a40..bc60b8a9 100644 --- a/internal/cron/cron.go +++ b/internal/cron/cron.go @@ -47,6 +47,11 @@ func InitCronJobs(ctx context.Context) { logger.Fatalf("AutoBackup Err: %v\n", err) } + // Initialize DDNS jobs + if err := setupDDNSJobs(s); err != nil { + logger.Fatalf("DDNS Err: %v\n", err) + } + // Initialize upstream availability testing job _, err = setupUpstreamAvailabilityJob(s) if err != nil { diff --git a/internal/cron/dns_ddns.go b/internal/cron/dns_ddns.go new file mode 100644 index 00000000..397e2539 --- /dev/null +++ b/internal/cron/dns_ddns.go @@ -0,0 +1,93 @@ +package cron + +import ( + "context" + "fmt" + "sync" + "time" + + "github.com/0xJacky/Nginx-UI/internal/dns" + "github.com/go-co-op/gocron/v2" + "github.com/uozi-tech/cosy/logger" +) + +var ( + ddnsJobs = make(map[uint64]gocron.Job) + ddnsMu sync.RWMutex +) + +func setupDDNSJobs(s gocron.Scheduler) error { + schedules, err := dns.ListEnabledDDNSSchedules(context.Background()) + if err != nil { + return fmt.Errorf("load ddns schedules: %w", err) + } + + for _, schedule := range schedules { + if err := addDDNSJob(s, schedule.DomainID, schedule.IntervalSeconds); err != nil { + logger.Errorf("Add DDNS job %d failed: %v", schedule.DomainID, err) + } + } + + return nil +} + +func addDDNSJob(s gocron.Scheduler, domainID uint64, intervalSeconds int) error { + if intervalSeconds <= 0 { + return fmt.Errorf("invalid ddns interval for domain %d", domainID) + } + + ddnsMu.Lock() + defer ddnsMu.Unlock() + + if job, exists := ddnsJobs[domainID]; exists { + if err := s.RemoveJob(job.ID()); err != nil { + logger.Warnf("Remove existing DDNS job %d failed: %v", domainID, err) + } + delete(ddnsJobs, domainID) + } + + job, err := s.NewJob( + gocron.DurationJob(time.Duration(intervalSeconds)*time.Second), + gocron.NewTask(executeDDNSJob, domainID), + gocron.WithName(fmt.Sprintf("ddns_%d", domainID)), + gocron.WithSingletonMode(gocron.LimitModeReschedule), + gocron.WithStartAt(gocron.WithStartImmediately()), + ) + if err != nil { + return fmt.Errorf("create ddns job: %w", err) + } + + ddnsJobs[domainID] = job + logger.Infof("Added DDNS job %d with interval %ds", domainID, intervalSeconds) + return nil +} + +func removeDDNSJob(s gocron.Scheduler, domainID uint64) error { + ddnsMu.Lock() + defer ddnsMu.Unlock() + + if job, exists := ddnsJobs[domainID]; exists { + if err := s.RemoveJob(job.ID()); err != nil { + return fmt.Errorf("remove ddns job: %w", err) + } + delete(ddnsJobs, domainID) + logger.Infof("Removed DDNS job %d", domainID) + } + return nil +} + +// AddOrUpdateDDNSJob adds or replaces a DDNS job using the global scheduler. +func AddOrUpdateDDNSJob(domainID uint64, intervalSeconds int) error { + return addDDNSJob(s, domainID, intervalSeconds) +} + +// RemoveDDNSJob removes a DDNS job from the global scheduler. +func RemoveDDNSJob(domainID uint64) error { + return removeDDNSJob(s, domainID) +} + +func executeDDNSJob(domainID uint64) { + if err := dns.RunDDNSUpdate(context.Background(), domainID); err != nil { + logger.Errorf("DDNS job %d failed: %v", domainID, err) + } +} diff --git a/internal/dns/ddns.go b/internal/dns/ddns.go new file mode 100644 index 00000000..d4ba19d2 --- /dev/null +++ b/internal/dns/ddns.go @@ -0,0 +1,463 @@ +package dns + +import ( + "context" + "errors" + "fmt" + "io" + "net" + "net/http" + "regexp" + "strings" + "time" + + "github.com/0xJacky/Nginx-UI/model" + "github.com/0xJacky/Nginx-UI/query" + "github.com/uozi-tech/cosy" +) + +const ( + minDDNSIntervalSeconds = 60 + defaultDDNSIntervalSeconds = 300 + ipDetectTimeout = 8 * time.Second +) + +var ( + ipv4Endpoints = []string{ + "https://api.ipify.org", + "https://ipv4.icanhazip.com", + "https://v4.ident.me", + "https://ipv4.ifconfig.co", + "https://myip.ipip.net", + } + ipv6Endpoints = []string{ + "https://api64.ipify.org", + "https://ipv6.icanhazip.com", + "https://v6.ident.me", + "https://ipv6.ifconfig.co", + "https://myip.ipip.net", + } + ipRegex = regexp.MustCompile(`(?i)(?:[0-9a-f]{0,4}:){2,7}[0-9a-f]{0,4}|(?:\d{1,3}\.){3}\d{1,3}`) +) + +// DefaultDDNSInterval returns the default polling interval in seconds. +func DefaultDDNSInterval() int { + return defaultDDNSIntervalSeconds +} + +// DDNSUpdateInput carries payload for updating a DDNS configuration. +type DDNSUpdateInput struct { + Enabled bool + IntervalSeconds int + RecordIDs []string +} + +// DDNSSchedule describes an enabled DDNS task. +type DDNSSchedule struct { + DomainID uint64 + IntervalSeconds int +} + +// GetDDNSConfig returns the current DDNS configuration for a domain with defaults applied. +func (s *Service) GetDDNSConfig(ctx context.Context, domainID uint64) (*model.DDNSConfig, error) { + domain, err := loadDomain(ctx, domainID) + if err != nil { + return nil, err + } + + cfg := domain.DDNSConfig + if cfg == nil { + return &model.DDNSConfig{ + Enabled: false, + IntervalSeconds: defaultDDNSIntervalSeconds, + Targets: []model.DDNSRecordTarget{}, + }, nil + } + + cfg.IntervalSeconds = sanitizeInterval(cfg.IntervalSeconds) + return cfg, nil +} + +// UpdateDDNSConfig validates and persists DDNS configuration for the given domain. +func (s *Service) UpdateDDNSConfig(ctx context.Context, domainID uint64, input DDNSUpdateInput) (*model.DDNSConfig, error) { + interval := sanitizeInterval(input.IntervalSeconds) + if interval < minDDNSIntervalSeconds { + return nil, ErrInvalidDDNSInterval + } + + domain, provider, err := s.prepareProvider(ctx, domainID) + if err != nil { + return nil, err + } + + existing := domain.DDNSConfig + + targets := []model.DDNSRecordTarget{} + var ipSnapshot *ipSnapshot + if input.Enabled { + if len(input.RecordIDs) == 0 { + return nil, ErrDDNSTargetRequired + } + + records, err := fetchProviderRecords(ctx, provider, domain.Domain) + if err != nil { + return nil, err + } + recordMap := indexRecordsByID(records) + recordByName := indexRecordsByName(records) + + seen := map[string]struct{}{} + for _, id := range input.RecordIDs { + trimmed := strings.TrimSpace(id) + if trimmed == "" { + continue + } + if _, ok := seen[trimmed]; ok { + continue + } + record, ok := recordMap[trimmed] + if !ok { + record, ok = recordByName[strings.ToLower(trimmed)] + } + + if ok { + recordType := strings.ToUpper(record.Type) + if recordType != "A" && recordType != "AAAA" { + return nil, cosy.WrapErrorWithParams(ErrInvalidDDNSTargetType, recordType) + } + targets = append(targets, model.DDNSRecordTarget{ + ID: record.ID, + Name: record.Name, + Type: recordType, + }) + seen[trimmed] = struct{}{} + continue + } + + // If record does not exist, create a new A/AAAA record using detected IPs. + if ipSnapshot == nil { + snapshot, ipErr := resolvePublicIPs(ctx) + if ipErr != nil { + return nil, ipErr + } + ipSnapshot = &snapshot + } + + recordType := "A" + content := ipSnapshot.IPv4 + if content == "" && ipSnapshot.IPv6 != "" { + recordType = "AAAA" + content = ipSnapshot.IPv6 + } + if content == "" { + return nil, ErrDDNSIPUnavailable + } + + newRecord, err := provider.CreateRecord(ctx, domain.Domain, sanitizeRecordInput(RecordInput{ + Type: recordType, + Name: trimmed, + Content: content, + TTL: 600, + })) + if err != nil { + return nil, cosy.WrapErrorWithParams(ErrDDNSRecordNotFound, trimmed) + } + + targets = append(targets, model.DDNSRecordTarget{ + ID: newRecord.ID, + Name: newRecord.Name, + Type: strings.ToUpper(newRecord.Type), + }) + seen[trimmed] = struct{}{} + } + + if len(targets) == 0 { + return nil, ErrDDNSTargetRequired + } + } + + cfg := &model.DDNSConfig{ + Enabled: input.Enabled, + IntervalSeconds: interval, + Targets: targets, + } + + if existing != nil { + cfg.LastIPv4 = existing.LastIPv4 + cfg.LastIPv6 = existing.LastIPv6 + cfg.LastRunAt = existing.LastRunAt + cfg.LastError = existing.LastError + + // Reset runtime error when disabling + if !input.Enabled { + cfg.LastError = "" + } + } + + if err := saveDDNSConfig(ctx, domainID, cfg); err != nil { + return nil, err + } + + return cfg, nil +} + +// ListEnabledDDNSSchedules returns schedules for enabled DDNS domains. +func ListEnabledDDNSSchedules(ctx context.Context) ([]DDNSSchedule, error) { + domains, err := query.DnsDomain.WithContext(ctx).Find() + if err != nil { + return nil, err + } + + schedules := make([]DDNSSchedule, 0, len(domains)) + for _, domain := range domains { + cfg := domain.DDNSConfig + if cfg == nil || !cfg.Enabled || len(cfg.Targets) == 0 { + continue + } + schedules = append(schedules, DDNSSchedule{ + DomainID: domain.ID, + IntervalSeconds: sanitizeInterval(cfg.IntervalSeconds), + }) + } + + return schedules, nil +} + +// ListDDNSDomains returns all domains with DDNS configuration for overview pages. +func ListDDNSDomains(ctx context.Context) ([]*model.DnsDomain, error) { + dao := query.DnsDomain + return dao.WithContext(ctx). + Preload(dao.DnsCredential). + Find() +} + +// RunDDNSUpdate executes DDNS update for the given domain ID. +func RunDDNSUpdate(ctx context.Context, domainID uint64) error { + return NewService().runDDNSUpdate(ctx, domainID) +} + +func (s *Service) runDDNSUpdate(ctx context.Context, domainID uint64) error { + domain, provider, err := s.prepareProvider(ctx, domainID) + if err != nil { + return err + } + + cfg := domain.DDNSConfig + if cfg == nil || !cfg.Enabled || len(cfg.Targets) == 0 { + return nil + } + + cfg.IntervalSeconds = sanitizeInterval(cfg.IntervalSeconds) + + ipSnapshot, ipErr := resolvePublicIPs(ctx) + if ipErr != nil { + // keep running; errors will be recorded + } + + records, err := fetchProviderRecords(ctx, provider, domain.Domain) + if err != nil { + return err + } + recordMap := indexRecordsByID(records) + + var updateErrs []string + + now := time.Now() + + for _, target := range cfg.Targets { + record, ok := recordMap[target.ID] + if !ok { + updateErrs = append(updateErrs, fmt.Sprintf("record %s missing", target.ID)) + continue + } + + recordType := strings.ToUpper(record.Type) + var nextIP string + switch recordType { + case "A": + nextIP = ipSnapshot.IPv4 + if nextIP != "" { + cfg.LastIPv4 = nextIP + } + case "AAAA": + nextIP = ipSnapshot.IPv6 + if nextIP != "" { + cfg.LastIPv6 = nextIP + } + default: + updateErrs = append(updateErrs, fmt.Sprintf("record %s has unsupported type %s", target.ID, recordType)) + continue + } + + if nextIP == "" { + updateErrs = append(updateErrs, fmt.Sprintf("record %s missing detected IP", target.ID)) + continue + } + + if record.Content == nextIP { + continue + } + + ctxWithTimeout, cancel := context.WithTimeout(ctx, providerTimeout) + _, err = provider.UpdateRecord(ctxWithTimeout, domain.Domain, record.ID, sanitizeRecordInput(RecordInput{ + Type: recordType, + Name: record.Name, + Content: nextIP, + TTL: record.TTL, + Priority: record.Priority, + Weight: record.Weight, + Proxied: record.Proxied, + })) + cancel() + + if err != nil { + updateErrs = append(updateErrs, fmt.Sprintf("%s: %v", record.ID, err)) + } + } + + cfg.LastRunAt = &now + if ipErr != nil { + updateErrs = append(updateErrs, ipErr.Error()) + } + + cfg.LastError = strings.Join(updateErrs, "; ") + + return saveDDNSConfig(ctx, domainID, cfg) +} + +type ipSnapshot struct { + IPv4 string + IPv6 string +} + +func resolvePublicIPs(ctx context.Context) (ipSnapshot, error) { + var snapshot ipSnapshot + var errs []string + + ipCtx, cancel := context.WithTimeout(ctx, ipDetectTimeout) + defer cancel() + + if ip, err := fetchAnyIP(ipCtx, ipv4Endpoints); err == nil { + snapshot.IPv4 = ip + } else { + errs = append(errs, fmt.Sprintf("ipv4: %v", err)) + } + + if ip, err := fetchAnyIP(ipCtx, ipv6Endpoints); err == nil { + snapshot.IPv6 = ip + } else { + errs = append(errs, fmt.Sprintf("ipv6: %v", err)) + } + + if len(errs) > 0 { + return snapshot, fmt.Errorf("public ip resolve errors: %s", strings.Join(errs, "; ")) + } + + return snapshot, nil +} + +func fetchIP(ctx context.Context, endpoint string) (string, error) { + req, err := http.NewRequestWithContext(ctx, http.MethodGet, endpoint, nil) + if err != nil { + return "", err + } + q := req.URL.Query() + q.Set("format", "text") + req.URL.RawQuery = q.Encode() + + resp, err := http.DefaultClient.Do(req) + if err != nil { + return "", err + } + defer resp.Body.Close() + + body, err := io.ReadAll(resp.Body) + if err != nil && !errors.Is(err, context.Canceled) && !errors.Is(err, context.DeadlineExceeded) { + return "", err + } + + ipStr := strings.TrimSpace(string(body)) + parsed, err := parseIPString(ipStr) + if err != nil { + return "", fmt.Errorf("invalid ip from %s: %v", endpoint, err) + } + return parsed, nil +} + +func fetchAnyIP(ctx context.Context, endpoints []string) (string, error) { + var errs []string + for _, ep := range endpoints { + if ip, err := fetchIP(ctx, ep); err == nil { + return ip, nil + } else { + errs = append(errs, fmt.Sprintf("%s: %v", ep, err)) + } + } + return "", fmt.Errorf(strings.Join(errs, "; ")) +} + +func parseIPString(val string) (string, error) { + trimmed := strings.TrimSpace(val) + if trimmed == "" { + return "", fmt.Errorf("empty ip string") + } + + if ip := net.ParseIP(trimmed); ip != nil { + return ip.String(), nil + } + + for _, token := range strings.Fields(trimmed) { + cleaned := strings.Trim(token, " ,;[](){}<>") + if ip := net.ParseIP(cleaned); ip != nil { + return ip.String(), nil + } + } + + if matches := ipRegex.FindAllString(trimmed, -1); len(matches) > 0 { + for _, candidate := range matches { + if ip := net.ParseIP(candidate); ip != nil { + return ip.String(), nil + } + } + } + + return "", fmt.Errorf("no valid ip found") +} + +func sanitizeInterval(value int) int { + if value < minDDNSIntervalSeconds { + return minDDNSIntervalSeconds + } + return value +} + +func fetchProviderRecords(ctx context.Context, provider Provider, domain string) ([]Record, error) { + ctxWithTimeout, cancel := context.WithTimeout(ctx, providerTimeout) + defer cancel() + return provider.ListRecords(ctxWithTimeout, domain, RecordFilter{}) +} + +func indexRecordsByID(records []Record) map[string]Record { + result := make(map[string]Record, len(records)) + for _, record := range records { + result[record.ID] = record + } + return result +} + +func indexRecordsByName(records []Record) map[string]Record { + result := make(map[string]Record, len(records)) + for _, record := range records { + result[strings.ToLower(record.Name)] = record + } + return result +} + +func saveDDNSConfig(ctx context.Context, domainID uint64, cfg *model.DDNSConfig) error { + return model.UseDB().WithContext(ctx). + Model(&model.DnsDomain{}). + Where("id = ?", domainID). + Updates(&model.DnsDomain{ + DDNSConfig: cfg, + }).Error +} diff --git a/internal/dns/errors.go b/internal/dns/errors.go new file mode 100644 index 00000000..e6bd12d2 --- /dev/null +++ b/internal/dns/errors.go @@ -0,0 +1,19 @@ +package dns + +import ( + "github.com/uozi-tech/cosy" +) + +// DNS domain errors +var ( + ErrDomainNotFound = cosy.NewError(40401, "DNS domain not found") + ErrDuplicateDomain = cosy.NewError(50001, "Domain already exists for this credential") + ErrInvalidDomain = cosy.NewError(50002, "Invalid domain name format") + ErrCredentialNotFound = cosy.NewError(50003, "DNS credential not found") + ErrInvalidCredential = cosy.NewError(50004, "Invalid DNS credential configuration") + ErrDDNSTargetRequired = cosy.NewError(40010, "DDNS requires at least one record") + ErrInvalidDDNSTargetType = cosy.NewError(40011, "DDNS only supports A and AAAA records") + ErrDDNSRecordNotFound = cosy.NewError(40402, "DDNS target record not found") + ErrInvalidDDNSInterval = cosy.NewError(40012, "DDNS interval must be at least 60 seconds") + ErrDDNSIPUnavailable = cosy.NewError(50005, "DDNS cannot detect a public IP to create records") +) diff --git a/internal/dns/provider.go b/internal/dns/provider.go new file mode 100644 index 00000000..b9a864d7 --- /dev/null +++ b/internal/dns/provider.go @@ -0,0 +1,90 @@ +package dns + +import ( + "context" + "errors" + "fmt" + "strings" + "sync" +) + +// Record represents a DNS record managed through a provider. +type Record struct { + ID string `json:"id"` + Type string `json:"type"` + Name string `json:"name"` + Content string `json:"content"` + TTL int `json:"ttl"` + Priority *int `json:"priority,omitempty"` + Weight *int `json:"weight,omitempty"` + Proxied *bool `json:"proxied,omitempty"` +} + +// RecordFilter allows narrowing down provider queries. +type RecordFilter struct { + Type string + Name string +} + +// RecordInput represents the payload required to create or update a DNS record. +type RecordInput struct { + Type string `json:"type"` + Name string `json:"name"` + Content string `json:"content"` + TTL int `json:"ttl"` + Priority *int `json:"priority,omitempty"` + Weight *int `json:"weight,omitempty"` + Proxied *bool `json:"proxied,omitempty"` +} + +// Credential holds the secrets and metadata bound to a DNS provider. +type Credential struct { + ID uint64 + Name string + Provider string + Code string + Values map[string]string + Additional map[string]string +} + +// Provider describes the CRUD contract every DNS vendor must implement. +type Provider interface { + ListRecords(ctx context.Context, domain string, filter RecordFilter) ([]Record, error) + CreateRecord(ctx context.Context, domain string, input RecordInput) (Record, error) + UpdateRecord(ctx context.Context, domain string, recordID string, input RecordInput) (Record, error) + DeleteRecord(ctx context.Context, domain string, recordID string) error +} + +// Factory constructs a provider using the given credential. +type Factory func(*Credential) (Provider, error) + +var ( + registryMu sync.RWMutex + registry = map[string]Factory{} + + // ErrProviderNotRegistered indicates that the requested provider is not available. + ErrProviderNotRegistered = errors.New("dns provider not registered") +) + +// RegisterProvider registers a provider factory for a given provider code. +func RegisterProvider(code string, factory Factory) { + registryMu.Lock() + defer registryMu.Unlock() + + key := strings.ToLower(code) + registry[key] = factory +} + +// NewProvider returns an initialized provider for the given credential code. +func NewProvider(code string, credential *Credential) (Provider, error) { + registryMu.RLock() + factory, ok := registry[strings.ToLower(code)] + registryMu.RUnlock() + + if !ok { + return nil, fmt.Errorf("%w: %s", ErrProviderNotRegistered, code) + } + + return factory(credential) +} + diff --git a/internal/dns/providers/alidns/provider.go b/internal/dns/providers/alidns/provider.go new file mode 100644 index 00000000..b9a46a5d --- /dev/null +++ b/internal/dns/providers/alidns/provider.go @@ -0,0 +1,288 @@ +package alidns + +import ( + "context" + "fmt" + "strings" + "time" + + aliclient "github.com/alibabacloud-go/alidns-20150109/v4/client" + openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client" + utilruntime "github.com/alibabacloud-go/tea-utils/v2/service" + "github.com/alibabacloud-go/tea/dara" + + "github.com/0xJacky/Nginx-UI/internal/dns" +) + +const ( + defaultRegion = "cn-hangzhou" + defaultLineName = "default" +) + +type provider struct { + client *aliclient.Client +} + +func init() { + dns.RegisterProvider("alidns", newProvider) +} + +func newProvider(cred *dns.Credential) (dns.Provider, error) { + accessKey := firstNonEmpty( + cred.Values["ALICLOUD_ACCESS_KEY"], + cred.Values["ALICLOUD_ACCESS_KEY_ID"], + ) + secretKey := firstNonEmpty( + cred.Values["ALICLOUD_SECRET_KEY"], + cred.Values["ALICLOUD_ACCESS_KEY_SECRET"], + ) + + if accessKey == "" || secretKey == "" { + return nil, fmt.Errorf("alidns: missing access key or secret") + } + + region := firstNonEmpty( + cred.Values["ALICLOUD_REGION_ID"], + cred.Additional["ALICLOUD_REGION_ID"], + defaultRegion, + ) + + timeout := int(defaultTimeout().Milliseconds()) + + cfg := new(openapi.Config). + SetAccessKeyId(accessKey). + SetAccessKeySecret(secretKey). + SetRegionId(region). + SetReadTimeout(timeout). + SetConnectTimeout(timeout) + + if token := firstNonEmpty( + cred.Values["ALICLOUD_SECURITY_TOKEN"], + cred.Additional["ALICLOUD_SECURITY_TOKEN"], + ); token != "" { + cfg = cfg.SetSecurityToken(token) + } + + client, err := aliclient.NewClient(cfg) + if err != nil { + return nil, fmt.Errorf("alidns: new client: %w", err) + } + + return &provider{client: client}, nil +} + +func (p *provider) ListRecords(ctx context.Context, domain string, filter dns.RecordFilter) ([]dns.Record, error) { + request := &aliclient.DescribeDomainRecordsRequest{ + DomainName: dara.String(domain), + PageSize: dara.Int64(500), + } + + if filter.Name != "" { + request.RRKeyWord = dara.String(filter.Name) + } + + if filter.Type != "" { + request.TypeKeyWord = dara.String(strings.ToUpper(filter.Type)) + } + + response, err := p.client.DescribeDomainRecordsWithOptions(request, runtimeOptions(ctx)) + if err != nil { + return nil, fmt.Errorf("alidns: list records: %w", err) + } + + if response.Body == nil || response.Body.DomainRecords == nil { + return []dns.Record{}, nil + } + + items := response.Body.DomainRecords.Record + result := make([]dns.Record, 0, len(items)) + for _, item := range items { + if item == nil { + continue + } + record := dns.Record{ + ID: stringValue(item.RecordId), + Type: stringValue(item.Type), + Name: rrToName(stringValue(item.RR)), + Content: stringValue(item.Value), + TTL: int(int64Value(item.TTL)), + Weight: intPointerFrom32(item.Weight), + } + if item.Priority != nil { + value := int(int64Value(item.Priority)) + record.Priority = &value + } + result = append(result, record) + } + + return result, nil +} + +func (p *provider) CreateRecord(ctx context.Context, domain string, input dns.RecordInput) (dns.Record, error) { + request := &aliclient.AddDomainRecordRequest{ + DomainName: dara.String(domain), + Type: dara.String(strings.ToUpper(strings.TrimSpace(input.Type))), + RR: dara.String(rrFromName(input.Name)), + Value: dara.String(strings.TrimSpace(input.Content)), + TTL: dara.Int64(int64(input.TTL)), + Line: dara.String(defaultLineName), + } + + if input.Priority != nil { + request.Priority = dara.Int64(int64(*input.Priority)) + } + + response, err := p.client.AddDomainRecordWithOptions(request, runtimeOptions(ctx)) + if err != nil { + errMsg := err.Error() + if strings.Contains(errMsg, "DomainRecordDuplicate") { + return dns.Record{}, fmt.Errorf("alidns: a DNS record with the same name, type, and line already exists") + } + return dns.Record{}, fmt.Errorf("alidns: add record: %w", err) + } + + recordID := "" + if response.Body != nil && response.Body.RecordId != nil { + recordID = *response.Body.RecordId + } + + if recordID == "" { + return dns.Record{}, fmt.Errorf("alidns: empty record id") + } + + return p.describeRecord(ctx, recordID) +} + +func (p *provider) UpdateRecord(ctx context.Context, _ string, recordID string, input dns.RecordInput) (dns.Record, error) { + request := &aliclient.UpdateDomainRecordRequest{ + RecordId: dara.String(recordID), + Type: dara.String(strings.ToUpper(strings.TrimSpace(input.Type))), + RR: dara.String(rrFromName(input.Name)), + Value: dara.String(strings.TrimSpace(input.Content)), + TTL: dara.Int64(int64(input.TTL)), + Line: dara.String(defaultLineName), + } + + if input.Priority != nil { + request.Priority = dara.Int64(int64(*input.Priority)) + } + + if _, err := p.client.UpdateDomainRecordWithOptions(request, runtimeOptions(ctx)); err != nil { + errMsg := err.Error() + if strings.Contains(errMsg, "DomainRecordDuplicate") { + // If the record already exists with the same values during update, + // treat it as success and return the current record + return p.describeRecord(ctx, recordID) + } + return dns.Record{}, fmt.Errorf("alidns: update record: %w", err) + } + + return p.describeRecord(ctx, recordID) +} + +func (p *provider) DeleteRecord(ctx context.Context, _ string, recordID string) error { + request := &aliclient.DeleteDomainRecordRequest{ + RecordId: dara.String(recordID), + } + + if _, err := p.client.DeleteDomainRecordWithOptions(request, runtimeOptions(ctx)); err != nil { + return fmt.Errorf("alidns: delete record: %w", err) + } + + return nil +} + +func (p *provider) describeRecord(ctx context.Context, recordID string) (dns.Record, error) { + request := &aliclient.DescribeDomainRecordInfoRequest{ + RecordId: dara.String(recordID), + } + + resp, err := p.client.DescribeDomainRecordInfoWithOptions(request, runtimeOptions(ctx)) + if err != nil { + return dns.Record{}, fmt.Errorf("alidns: describe record: %w", err) + } + + if resp.Body == nil { + return dns.Record{}, fmt.Errorf("alidns: describe record: empty body") + } + + record := dns.Record{ + ID: stringValue(resp.Body.RecordId), + Type: stringValue(resp.Body.Type), + Name: rrToName(stringValue(resp.Body.RR)), + Content: stringValue(resp.Body.Value), + TTL: int(int64Value(resp.Body.TTL)), + } + + if resp.Body.Priority != nil { + value := int(int64Value(resp.Body.Priority)) + record.Priority = &value + } + + return record, nil +} + +func runtimeOptions(ctx context.Context) *utilruntime.RuntimeOptions { + timeout := defaultTimeout() + opts := &utilruntime.RuntimeOptions{} + opts.SetConnectTimeout(int(timeout.Milliseconds())) + opts.SetReadTimeout(int(timeout.Milliseconds())) + opts.SetAutoretry(true) + opts.SetMaxAttempts(3) + opts.SetBackoffPolicy("exponential") + opts.SetBackoffPeriod(1) + return opts +} + +func defaultTimeout() time.Duration { + return 10 * time.Second +} + +func rrFromName(name string) string { + name = strings.TrimSpace(name) + if name == "" || name == "@" { + return "@" + } + return name +} + +func rrToName(rr string) string { + if rr == "" { + return "@" + } + return rr +} + +func stringValue(value *string) string { + if value == nil { + return "" + } + return *value +} + +func int64Value(value *int64) int64 { + if value == nil { + return 0 + } + return *value +} + +func intPointerFrom32(value *int32) *int { + if value == nil { + return nil + } + v := int(*value) + if v == 0 { + return nil + } + return &v +} + +func firstNonEmpty(values ...string) string { + for _, value := range values { + if v := strings.TrimSpace(value); v != "" { + return v + } + } + return "" +} diff --git a/internal/dns/providers/cloudflare/provider.go b/internal/dns/providers/cloudflare/provider.go new file mode 100644 index 00000000..418589fb --- /dev/null +++ b/internal/dns/providers/cloudflare/provider.go @@ -0,0 +1,266 @@ +package cloudflare + +import ( + "context" + "fmt" + "net/http" + "strings" + "sync" + "time" + + cf "github.com/cloudflare/cloudflare-go" + + "github.com/0xJacky/Nginx-UI/internal/dns" +) + +const defaultTimeout = 10 * time.Second + +type provider struct { + client *cf.API + zoneCache sync.Map +} + +func init() { + dns.RegisterProvider("cloudflare", newProvider) +} + +func newProvider(cred *dns.Credential) (dns.Provider, error) { + httpClient := &http.Client{Timeout: defaultTimeout} + + opts := []cf.Option{ + cf.HTTPClient(httpClient), + } + + if baseURL := firstNonEmpty( + cred.Additional["CLOUDFLARE_BASE_URL"], + cred.Additional["CF_BASE_URL"], + ); baseURL != "" { + opts = append(opts, cf.BaseURL(baseURL)) + } + + token := firstNonEmpty( + cred.Values["CLOUDFLARE_DNS_API_TOKEN"], + cred.Values["CF_DNS_API_TOKEN"], + cred.Values["CLOUDFLARE_API_TOKEN"], + cred.Values["CF_API_TOKEN"], + ) + + var ( + api *cf.API + err error + ) + + if token != "" { + api, err = cf.NewWithAPIToken(token, opts...) + } else { + email := firstNonEmpty( + cred.Values["CLOUDFLARE_EMAIL"], + cred.Values["CF_API_EMAIL"], + ) + key := firstNonEmpty( + cred.Values["CLOUDFLARE_API_KEY"], + cred.Values["CF_API_KEY"], + ) + if email == "" || key == "" { + return nil, fmt.Errorf("cloudflare: missing API credentials") + } + api, err = cf.New(key, email, opts...) + } + + if err != nil { + return nil, fmt.Errorf("cloudflare: %w", err) + } + + return &provider{ + client: api, + }, nil +} + +func (p *provider) ListRecords(ctx context.Context, domain string, filter dns.RecordFilter) ([]dns.Record, error) { + zoneID, err := p.zoneID(domain) + if err != nil { + return nil, err + } + + params := cf.ListDNSRecordsParams{ + Type: strings.ToUpper(strings.TrimSpace(filter.Type)), + } + + if params.Type == "" { + params.Type = "" + } + + if filter.Name != "" { + params.Name = buildFQDN(domain, filter.Name) + } + + records, _, err := p.client.ListDNSRecords(ctx, cf.ZoneIdentifier(zoneID), params) + if err != nil { + return nil, fmt.Errorf("cloudflare: list records: %w", err) + } + + result := make([]dns.Record, 0, len(records)) + for _, record := range records { + result = append(result, dns.Record{ + ID: record.ID, + Type: record.Type, + Name: toRelativeName(record.Name, domain), + Content: record.Content, + TTL: record.TTL, + Priority: toOptionalInt(record.Priority), + Proxied: record.Proxied, + }) + } + + return result, nil +} + +func (p *provider) CreateRecord(ctx context.Context, domain string, input dns.RecordInput) (dns.Record, error) { + zoneID, err := p.zoneID(domain) + if err != nil { + return dns.Record{}, err + } + + params := cf.CreateDNSRecordParams{ + Type: strings.ToUpper(strings.TrimSpace(input.Type)), + Name: buildFQDN(domain, input.Name), + Content: strings.TrimSpace(input.Content), + TTL: input.TTL, + Proxied: input.Proxied, + } + + if input.Priority != nil { + value := uint16(max(*input.Priority, 0)) + params.Priority = &value + } + + record, err := p.client.CreateDNSRecord(ctx, cf.ZoneIdentifier(zoneID), params) + if err != nil { + return dns.Record{}, fmt.Errorf("cloudflare: create record: %w", err) + } + + return dns.Record{ + ID: record.ID, + Type: record.Type, + Name: toRelativeName(record.Name, domain), + Content: record.Content, + TTL: record.TTL, + Priority: toOptionalInt(record.Priority), + Proxied: record.Proxied, + }, nil +} + +func (p *provider) UpdateRecord(ctx context.Context, domain string, recordID string, input dns.RecordInput) (dns.Record, error) { + zoneID, err := p.zoneID(domain) + if err != nil { + return dns.Record{}, err + } + + params := cf.UpdateDNSRecordParams{ + ID: recordID, + Type: strings.ToUpper(strings.TrimSpace(input.Type)), + Name: buildFQDN(domain, input.Name), + Content: strings.TrimSpace(input.Content), + TTL: input.TTL, + Proxied: input.Proxied, + } + + if input.Priority != nil { + value := uint16(max(*input.Priority, 0)) + params.Priority = &value + } + + record, err := p.client.UpdateDNSRecord(ctx, cf.ZoneIdentifier(zoneID), params) + if err != nil { + return dns.Record{}, fmt.Errorf("cloudflare: update record: %w", err) + } + + return dns.Record{ + ID: record.ID, + Type: record.Type, + Name: toRelativeName(record.Name, domain), + Content: record.Content, + TTL: record.TTL, + Priority: toOptionalInt(record.Priority), + Proxied: record.Proxied, + }, nil +} + +func (p *provider) DeleteRecord(ctx context.Context, domain string, recordID string) error { + zoneID, err := p.zoneID(domain) + if err != nil { + return err + } + + if err := p.client.DeleteDNSRecord(ctx, cf.ZoneIdentifier(zoneID), recordID); err != nil { + return fmt.Errorf("cloudflare: delete record: %w", err) + } + + return nil +} + +func (p *provider) zoneID(domain string) (string, error) { + normalized := strings.TrimSuffix(strings.ToLower(strings.TrimSpace(domain)), ".") + if zoneID, ok := p.zoneCache.Load(normalized); ok { + return zoneID.(string), nil + } + + id, err := p.client.ZoneIDByName(normalized) + if err != nil { + return "", fmt.Errorf("cloudflare: resolve zone id: %w", err) + } + + p.zoneCache.Store(normalized, id) + return id, nil +} + +func firstNonEmpty(values ...string) string { + for _, value := range values { + if strings.TrimSpace(value) != "" { + return strings.TrimSpace(value) + } + } + return "" +} + +func buildFQDN(domain, name string) string { + name = strings.TrimSpace(name) + domain = strings.TrimSuffix(strings.TrimSpace(domain), ".") + if name == "" || name == "@" { + return domain + } + if strings.HasSuffix(name, "."+domain) { + return name + } + if name == domain { + return domain + } + return name + "." + domain +} + +func toRelativeName(fqdn, domain string) string { + fqdn = strings.TrimSuffix(strings.TrimSpace(fqdn), ".") + domain = strings.TrimSuffix(strings.TrimSpace(domain), ".") + if fqdn == domain { + return "@" + } + if strings.HasSuffix(fqdn, "."+domain) { + return strings.TrimSuffix(fqdn, "."+domain) + } + return fqdn +} + +func toOptionalInt(value *uint16) *int { + if value == nil { + return nil + } + v := int(*value) + return &v +} + +func max(a, b int) int { + if a > b { + return a + } + return b +} diff --git a/internal/dns/providers/tencentcloud/provider.go b/internal/dns/providers/tencentcloud/provider.go new file mode 100644 index 00000000..bf7a96b8 --- /dev/null +++ b/internal/dns/providers/tencentcloud/provider.go @@ -0,0 +1,296 @@ +package tencentcloud + +import ( + "context" + "errors" + "fmt" + "strconv" + "strings" + "time" + + "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common" + tcerrors "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/errors" + "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/profile" + dnspod "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod/v20210323" + + "github.com/0xJacky/Nginx-UI/internal/dns" +) + +const ( + defaultRecordLine = "默认" + tencentEndpoint = "dnspod.tencentcloudapi.com" +) + +type provider struct { + client *dnspod.Client +} + +func init() { + dns.RegisterProvider("tencentcloud", newProvider) +} + +func newProvider(cred *dns.Credential) (dns.Provider, error) { + secretID := strings.TrimSpace(firstNonEmpty( + cred.Values["TENCENTCLOUD_SECRET_ID"], + cred.Values["QCLOUD_SECRET_ID"], + )) + secretKey := strings.TrimSpace(firstNonEmpty( + cred.Values["TENCENTCLOUD_SECRET_KEY"], + cred.Values["QCLOUD_SECRET_KEY"], + )) + + if secretID == "" || secretKey == "" { + return nil, fmt.Errorf("tencentcloud: missing secret id or secret key") + } + + var credential common.CredentialIface + if token := strings.TrimSpace(firstNonEmpty( + cred.Values["TENCENTCLOUD_SESSION_TOKEN"], + )); token != "" { + credential = common.NewTokenCredential(secretID, secretKey, token) + } else { + credential = common.NewCredential(secretID, secretKey) + } + + cp := profile.NewClientProfile() + cp.HttpProfile = &profile.HttpProfile{ + Endpoint: tencentEndpoint, + ReqTimeout: int(defaultTimeout().Seconds()), + } + + client, err := dnspod.NewClient(credential, "", cp) + if err != nil { + return nil, fmt.Errorf("tencentcloud: new client: %w", err) + } + + return &provider{client: client}, nil +} + +func (p *provider) ListRecords(ctx context.Context, domain string, filter dns.RecordFilter) ([]dns.Record, error) { + req := dnspod.NewDescribeRecordListRequest() + req.Domain = common.StringPtr(domain) + req.Offset = common.Uint64Ptr(0) + req.Limit = common.Uint64Ptr(3000) + + if filter.Name != "" { + req.Subdomain = common.StringPtr(filter.Name) + } + if filter.Type != "" { + req.RecordType = common.StringPtr(strings.ToUpper(filter.Type)) + } + + resp, err := p.client.DescribeRecordListWithContext(ctx, req) + if err != nil { + if isTencentNoDataError(err) { + return []dns.Record{}, nil + } + return nil, fmt.Errorf("tencentcloud: list records: %w", err) + } + + if resp.Response == nil || len(resp.Response.RecordList) == 0 { + return []dns.Record{}, nil + } + + result := make([]dns.Record, 0, len(resp.Response.RecordList)) + for _, item := range resp.Response.RecordList { + if item == nil { + continue + } + record := dns.Record{ + ID: uint64ToString(item.RecordId), + Type: stringValue(item.Type), + Name: normalizeName(stringValue(item.Name)), + Content: stringValue(item.Value), + TTL: int(uint64Value(item.TTL)), + Weight: uint64Pointer(item.Weight), + Priority: uint64Pointer(item.MX), + } + result = append(result, record) + } + + return result, nil +} + +func (p *provider) CreateRecord(ctx context.Context, domain string, input dns.RecordInput) (dns.Record, error) { + req := dnspod.NewCreateRecordRequest() + req.Domain = common.StringPtr(domain) + req.SubDomain = common.StringPtr(normalizeSubDomain(input.Name)) + req.RecordType = common.StringPtr(strings.ToUpper(strings.TrimSpace(input.Type))) + req.RecordLine = common.StringPtr(defaultRecordLine) + req.Value = common.StringPtr(strings.TrimSpace(input.Content)) + req.TTL = common.Uint64Ptr(uint64(input.TTL)) + + if input.Priority != nil { + mx := uint64(max(*input.Priority, 0)) + req.MX = &mx + } + + if input.Weight != nil { + weight := uint64(max(*input.Weight, 0)) + req.Weight = &weight + } + + resp, err := p.client.CreateRecordWithContext(ctx, req) + if err != nil { + return dns.Record{}, fmt.Errorf("tencentcloud: create record: %w", err) + } + + if resp.Response == nil || resp.Response.RecordId == nil { + return dns.Record{}, fmt.Errorf("tencentcloud: create record: empty response") + } + + return p.describeRecord(ctx, domain, strconv.FormatUint(*resp.Response.RecordId, 10)) +} + +func (p *provider) UpdateRecord(ctx context.Context, domain string, recordID string, input dns.RecordInput) (dns.Record, error) { + id, err := strconv.ParseUint(recordID, 10, 64) + if err != nil { + return dns.Record{}, fmt.Errorf("tencentcloud: invalid record id: %w", err) + } + + req := dnspod.NewModifyRecordRequest() + req.Domain = common.StringPtr(domain) + req.RecordId = common.Uint64Ptr(id) + req.SubDomain = common.StringPtr(normalizeSubDomain(input.Name)) + req.RecordType = common.StringPtr(strings.ToUpper(strings.TrimSpace(input.Type))) + req.RecordLine = common.StringPtr(defaultRecordLine) + req.Value = common.StringPtr(strings.TrimSpace(input.Content)) + req.TTL = common.Uint64Ptr(uint64(input.TTL)) + + if input.Priority != nil { + mx := uint64(max(*input.Priority, 0)) + req.MX = &mx + } + if input.Weight != nil { + weight := uint64(max(*input.Weight, 0)) + req.Weight = &weight + } + + if _, err := p.client.ModifyRecordWithContext(ctx, req); err != nil { + return dns.Record{}, fmt.Errorf("tencentcloud: update record: %w", err) + } + + return p.describeRecord(ctx, domain, recordID) +} + +func (p *provider) DeleteRecord(ctx context.Context, domain string, recordID string) error { + id, err := strconv.ParseUint(recordID, 10, 64) + if err != nil { + return fmt.Errorf("tencentcloud: invalid record id: %w", err) + } + + req := dnspod.NewDeleteRecordRequest() + req.Domain = common.StringPtr(domain) + req.RecordId = common.Uint64Ptr(id) + + if _, err := p.client.DeleteRecordWithContext(ctx, req); err != nil { + return fmt.Errorf("tencentcloud: delete record: %w", err) + } + + return nil +} + +func (p *provider) describeRecord(ctx context.Context, domain string, recordID string) (dns.Record, error) { + id, err := strconv.ParseUint(recordID, 10, 64) + if err != nil { + return dns.Record{}, fmt.Errorf("tencentcloud: invalid record id: %w", err) + } + + req := dnspod.NewDescribeRecordRequest() + req.Domain = common.StringPtr(domain) + req.RecordId = common.Uint64Ptr(id) + + resp, err := p.client.DescribeRecordWithContext(ctx, req) + if err != nil { + return dns.Record{}, fmt.Errorf("tencentcloud: describe record: %w", err) + } + + if resp.Response == nil || resp.Response.RecordInfo == nil { + return dns.Record{}, fmt.Errorf("tencentcloud: describe record: empty response") + } + + info := resp.Response.RecordInfo + record := dns.Record{ + ID: recordID, + Type: stringValue(info.RecordType), + Name: normalizeName(stringValue(info.SubDomain)), + Content: stringValue(info.Value), + TTL: int(uint64Value(info.TTL)), + Weight: uint64Pointer(info.Weight), + Priority: uint64Pointer(info.MX), + } + + return record, nil +} + +func normalizeSubDomain(name string) string { + name = strings.TrimSpace(name) + if name == "" || name == "@" { + return "@" + } + return name +} + +func normalizeName(name string) string { + if name == "" { + return "@" + } + return name +} + +func uint64ToString(value *uint64) string { + if value == nil { + return "" + } + return strconv.FormatUint(*value, 10) +} + +func uint64Value(value *uint64) uint64 { + if value == nil { + return 0 + } + return *value +} + +func uint64Pointer(value *uint64) *int { + if value == nil || *value == 0 { + return nil + } + v := int(*value) + return &v +} + +func stringValue(value *string) string { + if value == nil { + return "" + } + return *value +} + +func defaultTimeout() time.Duration { + return 10 * time.Second +} + +func max(a, b int) int { + if a > b { + return a + } + return b +} + +func firstNonEmpty(values ...string) string { + for _, value := range values { + if v := strings.TrimSpace(value); v != "" { + return v + } + } + return "" +} + +func isTencentNoDataError(err error) bool { + var sdkErr *tcerrors.TencentCloudSDKError + if errors.As(err, &sdkErr) { + return sdkErr.Code == "ResourceNotFound.NoDataOfRecord" + } + return false +} diff --git a/internal/dns/service.go b/internal/dns/service.go new file mode 100644 index 00000000..6a3098d9 --- /dev/null +++ b/internal/dns/service.go @@ -0,0 +1,336 @@ +package dns + +import ( + "context" + "errors" + "regexp" + "strings" + "time" + + "github.com/0xJacky/Nginx-UI/model" + "github.com/0xJacky/Nginx-UI/query" + "github.com/samber/lo" + "github.com/uozi-tech/cosy" + "gorm.io/gorm" +) + +const providerTimeout = 10 * time.Second + +var domainPattern = regexp.MustCompile(`^(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z0-9-]{2,}$`) + +// DomainInput represents the payload required to create or update a domain. +type DomainInput struct { + Domain string + Description string + DnsCredentialID uint64 +} + +// DomainListOptions controls domain pagination and filtering. +type DomainListOptions struct { + Page int + PerPage int + Keyword string + DnsCredential uint64 +} + +// RecordListOptions wraps filters for listing DNS records. +type RecordListOptions struct { + Filter RecordFilter +} + +// NormalizeDomain trims and validates a domain value for persistence. +func NormalizeDomain(value string) (string, error) { + return normalizeDomain(value) +} + +// EnsureDomainUnique verifies the domain is unique under the given credential, excluding an existing ID when provided. +func EnsureDomainUnique(ctx context.Context, domain string, credentialID uint64, excludeID uint64) error { + return ensureDomainUnique(ctx, domain, credentialID, excludeID) +} + +// LoadCredential fetches a DNS credential by ID with consistent error mapping. +func LoadCredential(ctx context.Context, id uint64) (*model.DnsCredential, error) { + return loadCredential(ctx, id) +} + +// Service implements domain and record operations. +type Service struct{} + +// NewService builds a DNS service. +func NewService() *Service { + return &Service{} +} + +// ListDomains returns paginated domains with their credentials. +func (s *Service) ListDomains(ctx context.Context, opts DomainListOptions) ([]*model.DnsDomain, int64, error) { + page := lo.If(opts.Page < 1, 1).Else(opts.Page) + perPage := lo.If(opts.PerPage <= 0, 50).Else(opts.PerPage) + offset := (page - 1) * perPage + + dao := query.DnsDomain + d := dao.WithContext(ctx).Preload(dao.DnsCredential) + + if opts.DnsCredential > 0 { + d = d.Where(dao.DnsCredentialID.Eq(opts.DnsCredential)) + } + + if opts.Keyword != "" { + keyword := "%" + opts.Keyword + "%" + d = d.Where(dao.Domain.Like(keyword)). + Or(dao.Description.Like(keyword)) + } + + return d.Order(dao.UpdatedAt.Desc()).FindByPage(offset, perPage) +} + +// CreateDomain stores a new domain bound to a credential. +func (s *Service) CreateDomain(ctx context.Context, input DomainInput) (*model.DnsDomain, error) { + validDomain, err := normalizeDomain(input.Domain) + if err != nil { + return nil, err + } + + cred, err := loadCredential(ctx, input.DnsCredentialID) + if err != nil { + return nil, err + } + + if err := ensureDomainUnique(ctx, validDomain, input.DnsCredentialID, 0); err != nil { + return nil, err + } + + domain := &model.DnsDomain{ + Domain: validDomain, + Description: strings.TrimSpace(input.Description), + DnsCredentialID: cred.ID, + } + + if err := query.DnsDomain.WithContext(ctx).Create(domain); err != nil { + return nil, err + } + + domain.DnsCredential = cred + return domain, nil +} + +// GetDomain returns a single domain with credential information. +func (s *Service) GetDomain(ctx context.Context, id uint64) (*model.DnsDomain, error) { + return loadDomain(ctx, id) +} + +// UpdateDomain updates domain metadata and credential association. +func (s *Service) UpdateDomain(ctx context.Context, id uint64, input DomainInput) (*model.DnsDomain, error) { + domain, err := loadDomain(ctx, id) + if err != nil { + return nil, err + } + + newDomain, err := normalizeDomain(input.Domain) + if err != nil { + return nil, err + } + + cred, err := loadCredential(ctx, input.DnsCredentialID) + if err != nil { + return nil, err + } + + if err := ensureDomainUnique(ctx, newDomain, cred.ID, domain.ID); err != nil { + return nil, err + } + + _, err = query.DnsDomain.WithContext(ctx). + Where(query.DnsDomain.ID.Eq(domain.ID)). + Updates(&model.DnsDomain{ + Domain: newDomain, + Description: strings.TrimSpace(input.Description), + DnsCredentialID: cred.ID, + }) + if err != nil { + return nil, err + } + + return loadDomain(ctx, id) +} + +// DeleteDomain removes the domain entry. +func (s *Service) DeleteDomain(ctx context.Context, id uint64) error { + _, err := query.DnsDomain.WithContext(ctx).Where(query.DnsDomain.ID.Eq(id)).Delete() + return err +} + +// ListRecords lists DNS records for the given domain. +func (s *Service) ListRecords(ctx context.Context, domainID uint64, opts RecordListOptions) ([]Record, error) { + domain, provider, err := s.prepareProvider(ctx, domainID) + if err != nil { + return nil, err + } + + ctxWithTimeout, cancel := context.WithTimeout(ctx, providerTimeout) + defer cancel() + + return provider.ListRecords(ctxWithTimeout, domain.Domain, opts.Filter) +} + +// CreateRecord creates a DNS record under the domain. +func (s *Service) CreateRecord(ctx context.Context, domainID uint64, input RecordInput) (Record, error) { + domain, provider, err := s.prepareProvider(ctx, domainID) + if err != nil { + return Record{}, err + } + + ctxWithTimeout, cancel := context.WithTimeout(ctx, providerTimeout) + defer cancel() + + return provider.CreateRecord(ctxWithTimeout, domain.Domain, sanitizeRecordInput(input)) +} + +// UpdateRecord updates a DNS record. +func (s *Service) UpdateRecord(ctx context.Context, domainID uint64, recordID string, input RecordInput) (Record, error) { + domain, provider, err := s.prepareProvider(ctx, domainID) + if err != nil { + return Record{}, err + } + + ctxWithTimeout, cancel := context.WithTimeout(ctx, providerTimeout) + defer cancel() + + return provider.UpdateRecord(ctxWithTimeout, domain.Domain, recordID, sanitizeRecordInput(input)) +} + +// DeleteRecord deletes a DNS record. +func (s *Service) DeleteRecord(ctx context.Context, domainID uint64, recordID string) error { + domain, provider, err := s.prepareProvider(ctx, domainID) + if err != nil { + return err + } + + ctxWithTimeout, cancel := context.WithTimeout(ctx, providerTimeout) + defer cancel() + + return provider.DeleteRecord(ctxWithTimeout, domain.Domain, recordID) +} + +func (s *Service) prepareProvider(ctx context.Context, domainID uint64) (*model.DnsDomain, Provider, error) { + domain, err := loadDomain(ctx, domainID) + if err != nil { + return nil, nil, err + } + + cred := domain.DnsCredential + if cred == nil { + return nil, nil, ErrCredentialNotFound + } + + providerCred, err := toProviderCredential(cred) + if err != nil { + return nil, nil, err + } + + provider, err := NewProvider(providerCred.Code, providerCred) + if err != nil { + return nil, nil, err + } + + return domain, provider, nil +} + +func loadCredential(ctx context.Context, id uint64) (*model.DnsCredential, error) { + credential, err := query.DnsCredential.WithContext(ctx).FirstByID(id) + if err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, ErrCredentialNotFound + } + return nil, err + } + + return credential, nil +} + +func loadDomain(ctx context.Context, id uint64) (*model.DnsDomain, error) { + dao := query.DnsDomain + domain, err := dao.WithContext(ctx). + Preload(dao.DnsCredential). + Where(dao.ID.Eq(id)). + First() + if err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, ErrDomainNotFound + } + return nil, err + } + + return domain, nil +} + +func ensureDomainUnique(ctx context.Context, domain string, credentialID uint64, excludeID uint64) error { + dao := query.DnsDomain + d := dao.WithContext(ctx).Where( + dao.DnsCredentialID.Eq(credentialID), + dao.Domain.Eq(domain), + ) + + if excludeID > 0 { + d = d.Where(dao.ID.Neq(excludeID)) + } + + count, err := d.Count() + if err != nil { + return err + } + if count > 0 { + return ErrDuplicateDomain + } + + return nil +} + +func normalizeDomain(value string) (string, error) { + domain := strings.Trim(strings.ToLower(value), ".") + if domain == "" || !domainPattern.MatchString(domain) { + return "", cosy.WrapErrorWithParams(ErrInvalidDomain, value) + } + return domain, nil +} + +func toProviderCredential(credential *model.DnsCredential) (*Credential, error) { + if credential == nil || credential.Config == nil || credential.Config.Configuration == nil { + return nil, ErrInvalidCredential + } + + values := make(map[string]string) + for key, val := range credential.Config.Configuration.Credentials { + if trimmed := strings.TrimSpace(val); trimmed != "" { + values[key] = trimmed + } + } + if len(values) == 0 { + return nil, ErrInvalidCredential + } + + additional := make(map[string]string) + for key, val := range credential.Config.Configuration.Additional { + if trimmed := strings.TrimSpace(val); trimmed != "" { + additional[key] = trimmed + } + } + + return &Credential{ + ID: credential.ID, + Name: credential.Name, + Provider: credential.Provider, + Code: credential.Config.Code, + Values: values, + Additional: additional, + }, nil +} + +func sanitizeRecordInput(input RecordInput) RecordInput { + input.Name = strings.TrimSpace(input.Name) + input.Content = strings.TrimSpace(input.Content) + input.Type = strings.ToUpper(strings.TrimSpace(input.Type)) + if input.TTL <= 0 { + input.TTL = 600 + } + return input +} diff --git a/internal/dns/service_test.go b/internal/dns/service_test.go new file mode 100644 index 00000000..578b3980 --- /dev/null +++ b/internal/dns/service_test.go @@ -0,0 +1,137 @@ +package dns_test + +import ( + "context" + "sync" + "testing" + + certdns "github.com/0xJacky/Nginx-UI/internal/cert/dns" + dnsSvc "github.com/0xJacky/Nginx-UI/internal/dns" + "github.com/0xJacky/Nginx-UI/model" + "github.com/0xJacky/Nginx-UI/query" + "github.com/stretchr/testify/require" + "gorm.io/driver/sqlite" + "gorm.io/gorm" +) + +func TestDomainLifecycle(t *testing.T) { + registerMockProvider() + + q := setupTestQuery(t) + ctx := context.Background() + service := dnsSvc.NewService() + + cred := createCredential(t, q) + + domain, err := service.CreateDomain(ctx, dnsSvc.DomainInput{ + Domain: "Example.com.", + Description: "Test domain", + DnsCredentialID: cred.ID, + }) + require.NoError(t, err) + require.Equal(t, "example.com", domain.Domain) + + _, err = service.CreateDomain(ctx, dnsSvc.DomainInput{ + Domain: "example.com", + Description: "duplicate", + DnsCredentialID: cred.ID, + }) + require.ErrorIs(t, err, dnsSvc.ErrDuplicateDomain) + + list, total, err := service.ListDomains(ctx, dnsSvc.DomainListOptions{ + Page: 1, + PerPage: 10, + }) + require.NoError(t, err) + require.Equal(t, int64(1), total) + require.Len(t, list, 1) + + records, err := service.ListRecords(ctx, domain.ID, dnsSvc.RecordListOptions{}) + require.NoError(t, err) + require.Len(t, records, 1) + require.Equal(t, "mock", records[0].Type) +} + +func setupTestQuery(tb testing.TB) *query.Query { + tb.Helper() + + db, err := gorm.Open(sqlite.Open("file::memory:?cache=shared"), &gorm.Config{}) + require.NoError(tb, err) + + require.NoError(tb, db.AutoMigrate(&model.DnsCredential{}, &model.DnsDomain{})) + + model.Use(db) + q := query.Use(db) + query.SetDefault(db) + + return q +} + +func createCredential(tb testing.TB, q *query.Query) *model.DnsCredential { + tb.Helper() + + cred := &model.DnsCredential{ + Name: "Mock Credential", + Provider: "Mock", + Config: &certdns.Config{ + Code: "mock", + Configuration: &certdns.Configuration{ + Credentials: map[string]string{ + "TOKEN": "foo", + }, + Additional: map[string]string{}, + }, + }, + } + + err := q.DnsCredential.Create(cred) + require.NoError(tb, err) + + return cred +} + +var registerOnce sync.Once + +func registerMockProvider() { + registerOnce.Do(func() { + dnsSvc.RegisterProvider("mock", func(*dnsSvc.Credential) (dnsSvc.Provider, error) { + return &mockProvider{}, nil + }) + }) +} + +type mockProvider struct{} + +func (m *mockProvider) ListRecords(ctx context.Context, domain string, filter dnsSvc.RecordFilter) ([]dnsSvc.Record, error) { + return []dnsSvc.Record{{ + ID: "1", + Type: "mock", + Name: "@", + Content: "127.0.0.1", + TTL: 60, + }}, nil +} + +func (m *mockProvider) CreateRecord(ctx context.Context, domain string, input dnsSvc.RecordInput) (dnsSvc.Record, error) { + return dnsSvc.Record{ + ID: "1", + Type: input.Type, + Name: input.Name, + Content: input.Content, + TTL: input.TTL, + }, nil +} + +func (m *mockProvider) UpdateRecord(ctx context.Context, domain string, recordID string, input dnsSvc.RecordInput) (dnsSvc.Record, error) { + return dnsSvc.Record{ + ID: recordID, + Type: input.Type, + Name: input.Name, + Content: input.Content, + TTL: input.TTL, + }, nil +} + +func (m *mockProvider) DeleteRecord(ctx context.Context, domain string, recordID string) error { + return nil +} diff --git a/model/dns_ddns.go b/model/dns_ddns.go new file mode 100644 index 00000000..408233ee --- /dev/null +++ b/model/dns_ddns.go @@ -0,0 +1,21 @@ +package model + +import "time" + +// DDNSRecordTarget represents a DNS record to be managed by DDNS. +type DDNSRecordTarget struct { + ID string `json:"id"` + Name string `json:"name"` + Type string `json:"type"` +} + +// DDNSConfig stores per-domain DDNS configuration and runtime status. +type DDNSConfig struct { + Enabled bool `json:"enabled"` + IntervalSeconds int `json:"interval_seconds"` + Targets []DDNSRecordTarget `json:"targets"` + LastIPv4 string `json:"last_ipv4,omitempty"` + LastIPv6 string `json:"last_ipv6,omitempty"` + LastRunAt *time.Time `json:"last_run_at,omitempty"` + LastError string `json:"last_error,omitempty"` +} diff --git a/model/dns_domain.go b/model/dns_domain.go new file mode 100644 index 00000000..85cb1db8 --- /dev/null +++ b/model/dns_domain.go @@ -0,0 +1,12 @@ +package model + +// DnsDomain represents a managed domain bound to a DNS credential. +type DnsDomain struct { + Model + + Domain string `json:"domain" gorm:"size:255;not null;uniqueIndex:idx_dns_domain_credential"` + Description string `json:"description"` + DnsCredentialID uint64 `json:"dns_credential_id" gorm:"not null;uniqueIndex:idx_dns_domain_credential"` + DnsCredential *DnsCredential `json:"dns_credential,omitempty" gorm:"constraint:OnDelete:CASCADE;"` + DDNSConfig *DDNSConfig `json:"ddns_config,omitempty" gorm:"column:ddns_config;serializer:json"` +} diff --git a/model/model.go b/model/model.go index e381b273..b2d9aa6d 100644 --- a/model/model.go +++ b/model/model.go @@ -42,6 +42,7 @@ func GenerateAllModel() []any { Site{}, Stream{}, DnsCredential{}, + DnsDomain{}, Node{}, Notification{}, AcmeUser{}, diff --git a/package.json b/package.json index 5139aee3..85bbcb6f 100644 --- a/package.json +++ b/package.json @@ -3,8 +3,8 @@ "type": "module", "scripts": { "dev": "pnpm --filter nginx-ui-app-next dev", - "docs:dev": "pnpm --filter nginx-ui-docs docs:dev", "gettext:extract": "pnpm --filter nginx-ui-app-next gettext:extract", + "docs:dev": "pnpm --filter nginx-ui-docs docs:dev", "typecheck": "pnpm --filter nginx-ui-app-next typecheck", "lint": "pnpm --filter nginx-ui-app-next lint", "lint:fix": "pnpm --filter nginx-ui-app-next lint:fix", diff --git a/query/dns_domains.gen.go b/query/dns_domains.gen.go new file mode 100644 index 00000000..880825e5 --- /dev/null +++ b/query/dns_domains.gen.go @@ -0,0 +1,469 @@ +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. + +package query + +import ( + "context" + "strings" + + "gorm.io/gorm" + "gorm.io/gorm/clause" + "gorm.io/gorm/schema" + + "gorm.io/gen" + "gorm.io/gen/field" + + "gorm.io/plugin/dbresolver" + + "github.com/0xJacky/Nginx-UI/model" +) + +func newDnsDomain(db *gorm.DB, opts ...gen.DOOption) dnsDomain { + _dnsDomain := dnsDomain{} + + _dnsDomain.dnsDomainDo.UseDB(db, opts...) + _dnsDomain.dnsDomainDo.UseModel(&model.DnsDomain{}) + + tableName := _dnsDomain.dnsDomainDo.TableName() + _dnsDomain.ALL = field.NewAsterisk(tableName) + _dnsDomain.ID = field.NewUint64(tableName, "id") + _dnsDomain.CreatedAt = field.NewTime(tableName, "created_at") + _dnsDomain.UpdatedAt = field.NewTime(tableName, "updated_at") + _dnsDomain.DeletedAt = field.NewField(tableName, "deleted_at") + _dnsDomain.Domain = field.NewString(tableName, "domain") + _dnsDomain.Description = field.NewString(tableName, "description") + _dnsDomain.DnsCredentialID = field.NewUint64(tableName, "dns_credential_id") + _dnsDomain.DDNSConfig = field.NewField(tableName, "ddns_config") + _dnsDomain.DnsCredential = dnsDomainBelongsToDnsCredential{ + db: db.Session(&gorm.Session{}), + + RelationField: field.NewRelation("DnsCredential", "model.DnsCredential"), + } + + _dnsDomain.fillFieldMap() + + return _dnsDomain +} + +type dnsDomain struct { + dnsDomainDo + + ALL field.Asterisk + ID field.Uint64 + CreatedAt field.Time + UpdatedAt field.Time + DeletedAt field.Field + Domain field.String + Description field.String + DnsCredentialID field.Uint64 + DDNSConfig field.Field + DnsCredential dnsDomainBelongsToDnsCredential + + fieldMap map[string]field.Expr +} + +func (d dnsDomain) Table(newTableName string) *dnsDomain { + d.dnsDomainDo.UseTable(newTableName) + return d.updateTableName(newTableName) +} + +func (d dnsDomain) As(alias string) *dnsDomain { + d.dnsDomainDo.DO = *(d.dnsDomainDo.As(alias).(*gen.DO)) + return d.updateTableName(alias) +} + +func (d *dnsDomain) updateTableName(table string) *dnsDomain { + d.ALL = field.NewAsterisk(table) + d.ID = field.NewUint64(table, "id") + d.CreatedAt = field.NewTime(table, "created_at") + d.UpdatedAt = field.NewTime(table, "updated_at") + d.DeletedAt = field.NewField(table, "deleted_at") + d.Domain = field.NewString(table, "domain") + d.Description = field.NewString(table, "description") + d.DnsCredentialID = field.NewUint64(table, "dns_credential_id") + d.DDNSConfig = field.NewField(table, "ddns_config") + + d.fillFieldMap() + + return d +} + +func (d *dnsDomain) GetFieldByName(fieldName string) (field.OrderExpr, bool) { + _f, ok := d.fieldMap[fieldName] + if !ok || _f == nil { + return nil, false + } + _oe, ok := _f.(field.OrderExpr) + return _oe, ok +} + +func (d *dnsDomain) fillFieldMap() { + d.fieldMap = make(map[string]field.Expr, 9) + d.fieldMap["id"] = d.ID + d.fieldMap["created_at"] = d.CreatedAt + d.fieldMap["updated_at"] = d.UpdatedAt + d.fieldMap["deleted_at"] = d.DeletedAt + d.fieldMap["domain"] = d.Domain + d.fieldMap["description"] = d.Description + d.fieldMap["dns_credential_id"] = d.DnsCredentialID + d.fieldMap["ddns_config"] = d.DDNSConfig + +} + +func (d dnsDomain) clone(db *gorm.DB) dnsDomain { + d.dnsDomainDo.ReplaceConnPool(db.Statement.ConnPool) + d.DnsCredential.db = db.Session(&gorm.Session{Initialized: true}) + d.DnsCredential.db.Statement.ConnPool = db.Statement.ConnPool + return d +} + +func (d dnsDomain) replaceDB(db *gorm.DB) dnsDomain { + d.dnsDomainDo.ReplaceDB(db) + d.DnsCredential.db = db.Session(&gorm.Session{}) + return d +} + +type dnsDomainBelongsToDnsCredential struct { + db *gorm.DB + + field.RelationField +} + +func (a dnsDomainBelongsToDnsCredential) Where(conds ...field.Expr) *dnsDomainBelongsToDnsCredential { + if len(conds) == 0 { + return &a + } + + exprs := make([]clause.Expression, 0, len(conds)) + for _, cond := range conds { + exprs = append(exprs, cond.BeCond().(clause.Expression)) + } + a.db = a.db.Clauses(clause.Where{Exprs: exprs}) + return &a +} + +func (a dnsDomainBelongsToDnsCredential) WithContext(ctx context.Context) *dnsDomainBelongsToDnsCredential { + a.db = a.db.WithContext(ctx) + return &a +} + +func (a dnsDomainBelongsToDnsCredential) Session(session *gorm.Session) *dnsDomainBelongsToDnsCredential { + a.db = a.db.Session(session) + return &a +} + +func (a dnsDomainBelongsToDnsCredential) Model(m *model.DnsDomain) *dnsDomainBelongsToDnsCredentialTx { + return &dnsDomainBelongsToDnsCredentialTx{a.db.Model(m).Association(a.Name())} +} + +func (a dnsDomainBelongsToDnsCredential) Unscoped() *dnsDomainBelongsToDnsCredential { + a.db = a.db.Unscoped() + return &a +} + +type dnsDomainBelongsToDnsCredentialTx struct{ tx *gorm.Association } + +func (a dnsDomainBelongsToDnsCredentialTx) Find() (result *model.DnsCredential, err error) { + return result, a.tx.Find(&result) +} + +func (a dnsDomainBelongsToDnsCredentialTx) Append(values ...*model.DnsCredential) (err error) { + targetValues := make([]interface{}, len(values)) + for i, v := range values { + targetValues[i] = v + } + return a.tx.Append(targetValues...) +} + +func (a dnsDomainBelongsToDnsCredentialTx) Replace(values ...*model.DnsCredential) (err error) { + targetValues := make([]interface{}, len(values)) + for i, v := range values { + targetValues[i] = v + } + return a.tx.Replace(targetValues...) +} + +func (a dnsDomainBelongsToDnsCredentialTx) Delete(values ...*model.DnsCredential) (err error) { + targetValues := make([]interface{}, len(values)) + for i, v := range values { + targetValues[i] = v + } + return a.tx.Delete(targetValues...) +} + +func (a dnsDomainBelongsToDnsCredentialTx) Clear() error { + return a.tx.Clear() +} + +func (a dnsDomainBelongsToDnsCredentialTx) Count() int64 { + return a.tx.Count() +} + +func (a dnsDomainBelongsToDnsCredentialTx) Unscoped() *dnsDomainBelongsToDnsCredentialTx { + a.tx = a.tx.Unscoped() + return &a +} + +type dnsDomainDo struct{ gen.DO } + +// FirstByID Where("id=@id") +func (d dnsDomainDo) FirstByID(id uint64) (result *model.DnsDomain, err error) { + var params []interface{} + + var generateSQL strings.Builder + params = append(params, id) + generateSQL.WriteString("id=? ") + + var executeSQL *gorm.DB + executeSQL = d.UnderlyingDB().Where(generateSQL.String(), params...).Take(&result) // ignore_security_alert + err = executeSQL.Error + + return +} + +// DeleteByID update @@table set deleted_at=strftime('%Y-%m-%d %H:%M:%S','now') where id=@id +func (d dnsDomainDo) DeleteByID(id uint64) (err error) { + var params []interface{} + + var generateSQL strings.Builder + params = append(params, id) + generateSQL.WriteString("update dns_domains set deleted_at=strftime('%Y-%m-%d %H:%M:%S','now') where id=? ") + + var executeSQL *gorm.DB + executeSQL = d.UnderlyingDB().Exec(generateSQL.String(), params...) // ignore_security_alert + err = executeSQL.Error + + return +} + +func (d dnsDomainDo) Debug() *dnsDomainDo { + return d.withDO(d.DO.Debug()) +} + +func (d dnsDomainDo) WithContext(ctx context.Context) *dnsDomainDo { + return d.withDO(d.DO.WithContext(ctx)) +} + +func (d dnsDomainDo) ReadDB() *dnsDomainDo { + return d.Clauses(dbresolver.Read) +} + +func (d dnsDomainDo) WriteDB() *dnsDomainDo { + return d.Clauses(dbresolver.Write) +} + +func (d dnsDomainDo) Session(config *gorm.Session) *dnsDomainDo { + return d.withDO(d.DO.Session(config)) +} + +func (d dnsDomainDo) Clauses(conds ...clause.Expression) *dnsDomainDo { + return d.withDO(d.DO.Clauses(conds...)) +} + +func (d dnsDomainDo) Returning(value interface{}, columns ...string) *dnsDomainDo { + return d.withDO(d.DO.Returning(value, columns...)) +} + +func (d dnsDomainDo) Not(conds ...gen.Condition) *dnsDomainDo { + return d.withDO(d.DO.Not(conds...)) +} + +func (d dnsDomainDo) Or(conds ...gen.Condition) *dnsDomainDo { + return d.withDO(d.DO.Or(conds...)) +} + +func (d dnsDomainDo) Select(conds ...field.Expr) *dnsDomainDo { + return d.withDO(d.DO.Select(conds...)) +} + +func (d dnsDomainDo) Where(conds ...gen.Condition) *dnsDomainDo { + return d.withDO(d.DO.Where(conds...)) +} + +func (d dnsDomainDo) Order(conds ...field.Expr) *dnsDomainDo { + return d.withDO(d.DO.Order(conds...)) +} + +func (d dnsDomainDo) Distinct(cols ...field.Expr) *dnsDomainDo { + return d.withDO(d.DO.Distinct(cols...)) +} + +func (d dnsDomainDo) Omit(cols ...field.Expr) *dnsDomainDo { + return d.withDO(d.DO.Omit(cols...)) +} + +func (d dnsDomainDo) Join(table schema.Tabler, on ...field.Expr) *dnsDomainDo { + return d.withDO(d.DO.Join(table, on...)) +} + +func (d dnsDomainDo) LeftJoin(table schema.Tabler, on ...field.Expr) *dnsDomainDo { + return d.withDO(d.DO.LeftJoin(table, on...)) +} + +func (d dnsDomainDo) RightJoin(table schema.Tabler, on ...field.Expr) *dnsDomainDo { + return d.withDO(d.DO.RightJoin(table, on...)) +} + +func (d dnsDomainDo) Group(cols ...field.Expr) *dnsDomainDo { + return d.withDO(d.DO.Group(cols...)) +} + +func (d dnsDomainDo) Having(conds ...gen.Condition) *dnsDomainDo { + return d.withDO(d.DO.Having(conds...)) +} + +func (d dnsDomainDo) Limit(limit int) *dnsDomainDo { + return d.withDO(d.DO.Limit(limit)) +} + +func (d dnsDomainDo) Offset(offset int) *dnsDomainDo { + return d.withDO(d.DO.Offset(offset)) +} + +func (d dnsDomainDo) Scopes(funcs ...func(gen.Dao) gen.Dao) *dnsDomainDo { + return d.withDO(d.DO.Scopes(funcs...)) +} + +func (d dnsDomainDo) Unscoped() *dnsDomainDo { + return d.withDO(d.DO.Unscoped()) +} + +func (d dnsDomainDo) Create(values ...*model.DnsDomain) error { + if len(values) == 0 { + return nil + } + return d.DO.Create(values) +} + +func (d dnsDomainDo) CreateInBatches(values []*model.DnsDomain, batchSize int) error { + return d.DO.CreateInBatches(values, batchSize) +} + +// Save : !!! underlying implementation is different with GORM +// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values) +func (d dnsDomainDo) Save(values ...*model.DnsDomain) error { + if len(values) == 0 { + return nil + } + return d.DO.Save(values) +} + +func (d dnsDomainDo) First() (*model.DnsDomain, error) { + if result, err := d.DO.First(); err != nil { + return nil, err + } else { + return result.(*model.DnsDomain), nil + } +} + +func (d dnsDomainDo) Take() (*model.DnsDomain, error) { + if result, err := d.DO.Take(); err != nil { + return nil, err + } else { + return result.(*model.DnsDomain), nil + } +} + +func (d dnsDomainDo) Last() (*model.DnsDomain, error) { + if result, err := d.DO.Last(); err != nil { + return nil, err + } else { + return result.(*model.DnsDomain), nil + } +} + +func (d dnsDomainDo) Find() ([]*model.DnsDomain, error) { + result, err := d.DO.Find() + return result.([]*model.DnsDomain), err +} + +func (d dnsDomainDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.DnsDomain, err error) { + buf := make([]*model.DnsDomain, 0, batchSize) + err = d.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error { + defer func() { results = append(results, buf...) }() + return fc(tx, batch) + }) + return results, err +} + +func (d dnsDomainDo) FindInBatches(result *[]*model.DnsDomain, batchSize int, fc func(tx gen.Dao, batch int) error) error { + return d.DO.FindInBatches(result, batchSize, fc) +} + +func (d dnsDomainDo) Attrs(attrs ...field.AssignExpr) *dnsDomainDo { + return d.withDO(d.DO.Attrs(attrs...)) +} + +func (d dnsDomainDo) Assign(attrs ...field.AssignExpr) *dnsDomainDo { + return d.withDO(d.DO.Assign(attrs...)) +} + +func (d dnsDomainDo) Joins(fields ...field.RelationField) *dnsDomainDo { + for _, _f := range fields { + d = *d.withDO(d.DO.Joins(_f)) + } + return &d +} + +func (d dnsDomainDo) Preload(fields ...field.RelationField) *dnsDomainDo { + for _, _f := range fields { + d = *d.withDO(d.DO.Preload(_f)) + } + return &d +} + +func (d dnsDomainDo) FirstOrInit() (*model.DnsDomain, error) { + if result, err := d.DO.FirstOrInit(); err != nil { + return nil, err + } else { + return result.(*model.DnsDomain), nil + } +} + +func (d dnsDomainDo) FirstOrCreate() (*model.DnsDomain, error) { + if result, err := d.DO.FirstOrCreate(); err != nil { + return nil, err + } else { + return result.(*model.DnsDomain), nil + } +} + +func (d dnsDomainDo) FindByPage(offset int, limit int) (result []*model.DnsDomain, count int64, err error) { + result, err = d.Offset(offset).Limit(limit).Find() + if err != nil { + return + } + + if size := len(result); 0 < limit && 0 < size && size < limit { + count = int64(size + offset) + return + } + + count, err = d.Offset(-1).Limit(-1).Count() + return +} + +func (d dnsDomainDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) { + count, err = d.Count() + if err != nil { + return + } + + err = d.Offset(offset).Limit(limit).Scan(result) + return +} + +func (d dnsDomainDo) Scan(result interface{}) (err error) { + return d.DO.Scan(result) +} + +func (d dnsDomainDo) Delete(models ...*model.DnsDomain) (result gen.ResultInfo, err error) { + return d.DO.Delete(models) +} + +func (d *dnsDomainDo) withDO(do gen.Dao) *dnsDomainDo { + d.DO = *do.(*gen.DO) + return d +} diff --git a/query/gen.go b/query/gen.go index 70e4acdb..c8b6bc10 100644 --- a/query/gen.go +++ b/query/gen.go @@ -25,6 +25,7 @@ var ( Config *config ConfigBackup *configBackup DnsCredential *dnsCredential + DnsDomain *dnsDomain ExternalNotify *externalNotify LLMSession *lLMSession Namespace *namespace @@ -49,6 +50,7 @@ func SetDefault(db *gorm.DB, opts ...gen.DOOption) { Config = &Q.Config ConfigBackup = &Q.ConfigBackup DnsCredential = &Q.DnsCredential + DnsDomain = &Q.DnsDomain ExternalNotify = &Q.ExternalNotify LLMSession = &Q.LLMSession Namespace = &Q.Namespace @@ -74,6 +76,7 @@ func Use(db *gorm.DB, opts ...gen.DOOption) *Query { Config: newConfig(db, opts...), ConfigBackup: newConfigBackup(db, opts...), DnsCredential: newDnsCredential(db, opts...), + DnsDomain: newDnsDomain(db, opts...), ExternalNotify: newExternalNotify(db, opts...), LLMSession: newLLMSession(db, opts...), Namespace: newNamespace(db, opts...), @@ -100,6 +103,7 @@ type Query struct { Config config ConfigBackup configBackup DnsCredential dnsCredential + DnsDomain dnsDomain ExternalNotify externalNotify LLMSession lLMSession Namespace namespace @@ -127,6 +131,7 @@ func (q *Query) clone(db *gorm.DB) *Query { Config: q.Config.clone(db), ConfigBackup: q.ConfigBackup.clone(db), DnsCredential: q.DnsCredential.clone(db), + DnsDomain: q.DnsDomain.clone(db), ExternalNotify: q.ExternalNotify.clone(db), LLMSession: q.LLMSession.clone(db), Namespace: q.Namespace.clone(db), @@ -161,6 +166,7 @@ func (q *Query) ReplaceDB(db *gorm.DB) *Query { Config: q.Config.replaceDB(db), ConfigBackup: q.ConfigBackup.replaceDB(db), DnsCredential: q.DnsCredential.replaceDB(db), + DnsDomain: q.DnsDomain.replaceDB(db), ExternalNotify: q.ExternalNotify.replaceDB(db), LLMSession: q.LLMSession.replaceDB(db), Namespace: q.Namespace.replaceDB(db), @@ -185,6 +191,7 @@ type queryCtx struct { Config *configDo ConfigBackup *configBackupDo DnsCredential *dnsCredentialDo + DnsDomain *dnsDomainDo ExternalNotify *externalNotifyDo LLMSession *lLMSessionDo Namespace *namespaceDo @@ -209,6 +216,7 @@ func (q *Query) WithContext(ctx context.Context) *queryCtx { Config: q.Config.WithContext(ctx), ConfigBackup: q.ConfigBackup.WithContext(ctx), DnsCredential: q.DnsCredential.WithContext(ctx), + DnsDomain: q.DnsDomain.WithContext(ctx), ExternalNotify: q.ExternalNotify.WithContext(ctx), LLMSession: q.LLMSession.WithContext(ctx), Namespace: q.Namespace.WithContext(ctx), diff --git a/router/routers.go b/router/routers.go index bf9fdfd3..3629cf4e 100644 --- a/router/routers.go +++ b/router/routers.go @@ -10,6 +10,7 @@ import ( "github.com/0xJacky/Nginx-UI/api/cluster" "github.com/0xJacky/Nginx-UI/api/config" "github.com/0xJacky/Nginx-UI/api/crypto" + dnsapi "github.com/0xJacky/Nginx-UI/api/dns" "github.com/0xJacky/Nginx-UI/api/event" "github.com/0xJacky/Nginx-UI/api/external_notify" "github.com/0xJacky/Nginx-UI/api/geolite" @@ -89,6 +90,7 @@ func InitRouter() { certificate.InitCertificateRouter(g) certificate.InitDNSCredentialRouter(g) certificate.InitAcmeUserRouter(g) + dnsapi.InitRouter(g) system.InitPrivateRouter(g) settings.InitRouter(g) llm.InitRouter(g)