* feat: dns management

* refactor(dns): streamline domain management functions and enhance validation

* feat(dns): add value suggestions for DNS record input with autocomplete functionality

* fix(dns): handle edge case in record listing pagination

* fix(dns): update credential property name for consistency and add cleanup on component unmount

* feat(dns): implement DDNS management #1194, #1140
This commit is contained in:
Jacky
2025-12-08 17:45:30 +08:00
committed by GitHub
parent f520a4459a
commit 9225c96250
56 changed files with 7743 additions and 782 deletions
+115
View File
@@ -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"`
}
+292
View File
@@ -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(&params)
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
}
}
+30
View File
@@ -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)
}
}
+8
View File
@@ -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']
+110
View File
@@ -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<DNSDomain>(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<DNSRecord>(`${baseDomainUrl}/${domainId}/records`, payload)
},
updateRecord(domainId: number, recordId: string, payload: RecordPayload) {
return http.put<DNSRecord>(`${baseDomainUrl}/${domainId}/records/${recordId}`, payload)
},
deleteRecord(domainId: number, recordId: string) {
return http.delete(`${baseDomainUrl}/${domainId}/records/${recordId}`)
},
getDDNSConfig(domainId: number) {
return http.get<DDNSConfig>(`${baseDomainUrl}/${domainId}/ddns`)
},
updateDDNSConfig(domainId: number, payload: UpdateDDNSPayload) {
return http.put<DDNSConfig>(`${baseDomainUrl}/${domainId}/ddns`, payload)
},
listDDNS() {
return http.get<{ data: DDNSDomainItem[] }>(`/dns/ddns`)
},
}
export type { DnsCredential }
@@ -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<DNSProvider[]>
const credentials = ref<SelectProps['options']>([])
@@ -20,8 +21,9 @@ const code = computed(() => {
return data.value.code
})
const providerIdx = ref<number>()
const providerIdx = ref<number | undefined>(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) {
/>
</AFormItem>
<AFormItem
v-if="(providerIdx ?? -1) > -1"
v-if="(providerIdx !== undefined && providerIdx !== null && providerIdx > -1)"
:label="$gettext('Credential')"
:rules="[{ required: true }]"
>
<ASelect
v-model:value="data.dns_credential_id as any"
v-model:value="(data.dns_credential_id as any)"
:options="credentials"
/>
</AFormItem>
+31
View File
@@ -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<DNSProvider, 'code' | 'provider' | 'name'> | null
const allowedProviderSet = new Set<string>(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<T extends Pick<DNSProvider, 'code' | 'provider' | 'name'>>(list: T[]) {
return list.filter(item => isAllowedDnsProvider(item))
}
+216 -47
View File
@@ -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 "هل أنت متأكد أنك تريد استرداد هذا العنصر؟"
+3
View File
@@ -63,4 +63,7 @@ export const msg = [
$gettext('Access Log'),
$gettext('Error Log'),
$gettext('Select Provider'),
$gettext('Select Credential'),
]
+218 -49
View File
@@ -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?"
+206 -41
View File
@@ -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 ""
+218 -52
View File
@@ -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"
+218 -52
View File
@@ -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"
+214 -47
View File
@@ -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 Pro12コア)でのテストに基づく"
@@ -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 "このアイテムを復元してもよろしいですか?"
+214 -47
View File
@@ -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 "정말로 이 항목을 복구하시겠습니까?"
+210 -30
View File
@@ -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 ""
+218 -49
View File
@@ -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?"
+218 -52
View File
@@ -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 "Тема"
+218 -49
View File
@@ -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?"
+218 -49
View File
@@ -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 "Ви впевнені, що бажаєте відновити цей елемент?"
+218 -49
View File
@@ -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?"
+214 -50
View File
@@ -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 "主题"
+214 -50
View File
@@ -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 "主題"
+2
View File
@@ -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,
+127
View File
@@ -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,
})
}
},
},
})
+2
View File
@@ -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,
-8
View File
@@ -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',
+51
View File
@@ -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',
},
},
],
},
]
+259
View File
@@ -0,0 +1,259 @@
<script setup lang="ts">
import type { DDNSDomainItem, DNSRecord, UpdateDDNSPayload } from '@/api/dns'
import { ReloadOutlined } from '@ant-design/icons-vue'
import { message } from 'ant-design-vue'
import dayjs from 'dayjs'
import { computed, onMounted, ref } from 'vue'
import { dnsApi } from '@/api/dns'
import { useDnsStore } from '@/pinia/moudule/dns'
const store = useDnsStore()
const loading = computed(() => store.ddnsListLoading)
const items = computed(() => store.ddnsList)
const drawerOpen = ref(false)
const saving = ref(false)
const currentDomain = ref<DDNSDomainItem | null>(null)
const ddnsForm = ref<UpdateDDNSPayload>({
enabled: false,
interval_seconds: 300,
record_ids: [],
})
const records = ref<DNSRecord[]>([])
const recordsLoading = ref(false)
const recordOptions = computed(() => {
const opts = new Map<string, { value: string, label: string }>()
records.value
.filter(item => {
const type = item.type?.toUpperCase?.()
return type === 'A' || type === 'AAAA'
})
.forEach(item => {
opts.set(item.id, {
value: item.id,
label: `${item.name} (${item.type.toUpperCase?.() ?? ''})`,
})
})
currentDomain.value?.config.targets?.forEach(target => {
opts.set(target.id, {
value: target.id,
label: `${target.name} (${target.type})`,
})
})
return Array.from(opts.values())
})
function filterRecordOption(input: string, option?: { label: string, value: string }) {
if (!option)
return false
const keyword = input.toLowerCase()
return option.label.toLowerCase().includes(keyword)
}
const columns = [
{
title: $gettext('Domain'),
dataIndex: 'domain',
key: 'domain',
},
{
title: $gettext('Credential'),
key: 'credential',
customRender: ({ record }: { record: DDNSDomainItem }) => record.credential_name ?? '-',
},
{
title: $gettext('Provider'),
key: 'provider',
customRender: ({ record }: { record: DDNSDomainItem }) => record.credential_provider ?? '-',
},
{
title: $gettext('Status'),
key: 'status',
},
{
title: $gettext('Interval'),
key: 'interval',
},
{
title: $gettext('Targets'),
key: 'targets',
},
{
title: $gettext('Last run'),
key: 'last',
},
{
title: $gettext('Actions'),
key: 'actions',
},
]
async function init() {
await store.fetchDDNSList()
}
function formatTime(value?: string) {
if (!value)
return $gettext('Not run yet')
return dayjs(value).format('YYYY-MM-DD HH:mm:ss')
}
async function openDrawer(record: DDNSDomainItem) {
currentDomain.value = record
ddnsForm.value = {
enabled: record.config.enabled,
interval_seconds: record.config.interval_seconds,
record_ids: record.config.targets?.map(t => t.id) ?? [],
}
drawerOpen.value = true
await loadRecords(record.id)
}
async function loadRecords(domainId: number) {
recordsLoading.value = true
try {
const res = await dnsApi.listRecords(domainId, { per_page: 200 })
records.value = res.data
}
finally {
recordsLoading.value = false
}
}
async function saveDDNS() {
if (!currentDomain.value)
return
saving.value = true
try {
await store.updateDDNSConfig(currentDomain.value.id, ddnsForm.value)
await store.refreshDDNSItem(currentDomain.value.id)
message.success($gettext('DDNS saved'))
drawerOpen.value = false
}
finally {
saving.value = false
}
}
onMounted(() => {
init()
})
</script>
<template>
<div class="ddns-page">
<ACard>
<template #title>
<ASpace align="center">
{{ $gettext('DDNS Overview') }}
</ASpace>
</template>
<template #extra>
<AButton type="link" size="small" :loading="loading" @click="init">
<template #icon>
<ReloadOutlined />
</template>
{{ $gettext('Refresh') }}
</AButton>
</template>
<ATable
:loading="loading"
:data-source="items"
:columns="columns"
row-key="id"
:pagination="false"
>
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'status'">
<ATag :color="record.config.enabled ? 'green' : 'default'">
{{ record.config.enabled ? $gettext('Enabled') : $gettext('Disabled') }}
</ATag>
<div v-if="record.config.last_error" class="text-red-500 text-xs">
{{ record.config.last_error }}
</div>
</template>
<template v-else-if="column.key === 'interval'">
{{ record.config.interval_seconds }}s
</template>
<template v-else-if="column.key === 'targets'">
<ASpace wrap size="small">
<ATag v-for="target in record.config.targets" :key="target.id">
{{ target.name }} ({{ target.type }})
</ATag>
<span v-if="!record.config.targets?.length">-</span>
</ASpace>
</template>
<template v-else-if="column.key === 'last'">
<div>{{ formatTime(record.config.last_run_at) }}</div>
<div class="text-xs text-gray-500">
IPv4: {{ record.config.last_ipv4 || '-' }} | IPv6: {{ record.config.last_ipv6 || '-' }}
</div>
</template>
<template v-else-if="column.key === 'actions'">
<ASpace>
<AButton size="small" type="link" @click="openDrawer(record as DDNSDomainItem)">
{{ $gettext('Configure') }}
</AButton>
</ASpace>
</template>
</template>
</ATable>
</ACard>
<ADrawer
:open="drawerOpen"
:title="currentDomain ? `${$gettext('Configure DDNS')} - ${currentDomain.domain}` : ''"
width="520"
@close="drawerOpen = false"
>
<ASkeleton v-if="recordsLoading" active />
<template v-else>
<AForm layout="vertical">
<AFormItem :label="$gettext('Enable DDNS')">
<ASwitch v-model:checked="ddnsForm.enabled" />
</AFormItem>
<AFormItem :label="$gettext('Records')">
<ASelect
v-model:value="ddnsForm.record_ids"
mode="tags"
show-search
:filter-option="(filterRecordOption as any)"
:options="recordOptions"
:placeholder="$gettext('Type or select A/AAAA records')"
:disabled="!ddnsForm.enabled"
/>
</AFormItem>
<AFormItem :label="$gettext('Interval (seconds)')">
<AInputNumber
v-model:value="ddnsForm.interval_seconds"
:min="60"
:step="60"
:disabled="!ddnsForm.enabled"
style="width: 200px"
/>
</AFormItem>
</AForm>
<div class="flex gap-2 mt-4">
<AButton @click="drawerOpen = false">
{{ $gettext('Cancel') }}
</AButton>
<AButton type="primary" :loading="saving" @click="saveDDNS">
{{ $gettext('Save') }}
</AButton>
</div>
</template>
</ADrawer>
</div>
</template>
<style scoped>
.ddns-page {
padding-bottom: 16px;
}
</style>
@@ -92,12 +92,6 @@ const columns: StdTableColumn[] = [{
<p>
{{ $gettext('Please fill in the API authentication credentials provided by your DNS provider.') }}
</p>
<p>
{{ $gettext('We will add one or more TXT records to the DNS records of your domain for ownership verification.') }}
</p>
<p>
{{ $gettext('Once the verification is complete, the records will be removed.') }}
</p>
<p>
{{ $gettext('Please note that the unit of time configurations below are all in seconds.') }}
</p>
+269
View File
@@ -0,0 +1,269 @@
<script setup lang="tsx">
import type { CustomRenderArgs, StdTableColumn } from '@uozi-admin/curd'
import type { SelectProps } from 'ant-design-vue'
import type { DNSProvider } from '@/api/auto_cert'
import type { DNSDomain } from '@/api/dns'
import { HeartOutlined, MailOutlined, StarOutlined } from '@ant-design/icons-vue'
import { datetimeRender, StdCurd } from '@uozi-admin/curd'
import { FormItem, Select } from 'ant-design-vue'
import { computed, onMounted, reactive, ref } from 'vue'
import { useRouter } from 'vue-router'
import auto_cert from '@/api/auto_cert'
import { dnsApi } from '@/api/dns'
import dns_credential from '@/api/dns_credential'
import { filterAllowedDnsProviders } from '@/constants/dns_providers'
const router = useRouter()
type SelectOptionList = NonNullable<SelectProps['options']>
interface DomainForm extends Omit<DNSDomain, 'dns_credential_id'> {
dns_credential_id?: number
selected_provider?: string
provider_initialized?: boolean
}
const dnsProviders = ref<DNSProvider[]>([])
const isLoadingProviders = ref(false)
const credentialOptions = reactive<Record<string, SelectOptionList>>({})
const credentialLoadingMap = reactive<Record<string, boolean>>({})
const providerOptions = computed<SelectOptionList>(() => {
const list: SelectOptionList = []
dnsProviders.value.forEach(provider => {
const label = provider.name ?? provider.provider ?? ''
if (label) {
list.push({
label,
value: label,
})
}
})
return list
})
onMounted(async () => {
isLoadingProviders.value = true
try {
const list = await auto_cert.get_dns_providers()
dnsProviders.value = filterAllowedDnsProviders(list)
}
finally {
isLoadingProviders.value = false
}
})
function clearCredentialSelection(formData: DomainForm) {
formData.dns_credential_id = undefined
}
async function ensureCredentialOptions(provider: string) {
if (!provider || credentialOptions[provider])
return
credentialLoadingMap[provider] = true
try {
const response = await dns_credential.getList({ provider })
const list = response?.data ?? []
credentialOptions[provider] = list.map(item => ({
label: item.name,
value: item.id,
}))
}
finally {
credentialLoadingMap[provider] = false
}
}
function filterOption(input: string, option?: { label?: string | number }) {
if (!option?.label)
return false
return option.label.toString().toLowerCase().includes(input.toLowerCase())
}
interface DomainEditContext {
formData: DomainForm
mode: 'add' | 'edit'
}
function resolveProviderName(record: DomainForm) {
return record.dns_credential?.provider
?? ''
}
function resolveCredentialName(record: DomainForm) {
return record.dns_credential?.name ?? '-'
}
const columns: StdTableColumn[] = [{
title: () => $gettext('Domain'),
dataIndex: 'domain',
sorter: true,
search: true,
edit: {
type: 'input',
formItem: {
required: true,
},
},
}, {
title: () => $gettext('Credential'),
dataIndex: 'dns_credential_id',
customRender: ({ record }: CustomRenderArgs & { record: DNSDomain }) => {
return resolveCredentialName(record as DomainForm)
},
edit: {
type: (context: DomainEditContext) => {
const formData = context.formData
if (!formData.provider_initialized) {
formData.selected_provider = context.mode === 'edit'
? resolveProviderName(formData)
: ''
formData.provider_initialized = true
}
const providerRef = computed({
get: () => {
return formData.selected_provider ?? ''
},
set: (value: string) => {
formData.selected_provider = value
},
})
const mergedProviderOptions = computed<SelectOptionList>(() => {
const base = providerOptions.value
if (
providerRef.value
&& !base.some(option => option.value === providerRef.value)
) {
return [
...base,
{
label: providerRef.value,
value: providerRef.value,
},
]
}
return base
})
if (providerRef.value)
ensureCredentialOptions(providerRef.value)
const credentialList: SelectOptionList = providerRef.value ? credentialOptions[providerRef.value] ?? [] : []
const credentialField = providerRef.value
? (
<FormItem key="credential" label={$gettext('Credential')} required>
<Select
v-model:value={formData.dns_credential_id}
options={credentialList}
placeholder={$gettext('Select Credential')}
loading={Boolean(credentialLoadingMap[providerRef.value] && !credentialList.length)}
showSearch
filterOption={filterOption}
/>
</FormItem>
)
: null
function handleProviderChange(value: string) {
providerRef.value = value
clearCredentialSelection(formData)
if (value)
ensureCredentialOptions(value)
}
return (
<div class="flex flex-col gap-4">
<FormItem label={$gettext('Provider')} required>
<Select
value={providerRef.value || undefined}
options={mergedProviderOptions.value}
placeholder={$gettext('Select Provider')}
showSearch
filterOption={filterOption}
loading={isLoadingProviders.value}
onChange={handleProviderChange}
/>
</FormItem>
{credentialField}
</div>
)
},
formItem: {
hiddenLabelInEdit: true,
},
rules: [{ required: true }],
},
}, {
title: () => $gettext('Provider'),
dataIndex: 'credential.provider',
customRender: ({ record }: CustomRenderArgs & { record: DNSDomain }) => {
return resolveProviderName(record as DomainForm) || '--'
},
pure: true,
}, {
title: () => $gettext('Updated at'),
dataIndex: 'updated_at',
customRender: datetimeRender,
sorter: true,
pure: true,
}, {
title: () => $gettext('Actions'),
dataIndex: 'actions',
fixed: 'right',
}]
function goToRecords(record: DNSDomain) {
router.push({
name: 'DNS Domain Records',
params: {
id: record.id,
},
})
}
</script>
<template>
<StdCurd
:title="$gettext('DNS Domains')"
:api="dnsApi"
:columns
disable-export
disable-view
>
<template #beforeActions="{ record }">
<AButton size="small" type="link" @click="goToRecords(record as DNSDomain)">
{{ $gettext('Manage Records') }}
</AButton>
</template>
<template #afterForm>
<div class="mt-4 p-4 bg-gray-50 dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700">
<ATypographyTitle :level="5" class="mb-3">
<HeartOutlined class="mr-2 text-red-500" />
{{ $gettext('DNS Provider Support') }}
</ATypographyTitle>
<div class="space-y-2">
<div class="flex items-center space-x-2">
<StarOutlined class="text-yellow-500 flex-shrink-0" />
<ATypographyText class="text-sm">
{{ $gettext('Need more DNS providers? Support us through donations or contact us for commercial collaboration') }}
</ATypographyText>
</div>
<div class="flex items-center space-x-2">
<MailOutlined class="text-blue-500 flex-shrink-0" />
<ATypographyText class="text-sm">
{{ $gettext('Business contact:') }}
<a href="mailto:business@uozi.com" class="text-blue-600 hover:text-blue-800 dark:text-blue-400 dark:hover:text-blue-300">business@uozi.com</a>
</ATypographyText>
</div>
</div>
</div>
</template>
</StdCurd>
</template>
<style scoped lang="less">
</style>
+233
View File
@@ -0,0 +1,233 @@
<script setup lang="ts">
import type { DNSRecord, RecordListParams, RecordPayload } from '@/api/dns'
import { PlusOutlined, ReloadOutlined } from '@ant-design/icons-vue'
import { message } from 'ant-design-vue'
import { computed, onBeforeUnmount, onMounted, ref } from 'vue'
import { useRoute, useRouter } from 'vue-router'
import FooterToolBar from '@/components/FooterToolbar'
import { useDnsStore } from '@/pinia/moudule/dns'
import DNSRecordFilter from '@/views/dns/components/DNSRecordFilter.vue'
import DNSRecordForm from '@/views/dns/components/DNSRecordForm.vue'
import DNSRecordTable from '@/views/dns/components/DNSRecordTable.vue'
const route = useRoute()
const store = useDnsStore()
const router = useRouter()
const filters = ref<RecordListParams>({
name: '',
type: '',
})
const pagination = ref({
current: 1,
pageSize: 50,
total: 0,
})
const pageSizeOptions = ['20', '50', '100', '200']
const domainId = computed(() => Number(route.params.id))
const isDrawerOpen = ref(false)
const editingRecord = ref<DNSRecord | null>(null)
const formModel = ref<RecordPayload>({
type: 'A',
name: '@',
content: '',
ttl: 600,
})
const showProxiedToggle = computed(() => {
const provider = store.currentDomain?.dns_credential?.provider ?? ''
return provider.toLowerCase().includes('cloudflare')
})
const contentSuggestions = computed(() => {
const unique = new Set<string>()
store.records.forEach(record => {
const type = record.type?.toUpperCase?.() ?? ''
if (record.content && (type === 'A' || type === 'CNAME')) {
unique.add(record.content)
}
})
return Array.from(unique)
})
const pageTitle = computed(() => {
return store.currentDomain?.domain ?? $gettext('DNS Records')
})
async function initData() {
await store.fetchDomainDetail(domainId.value)
pagination.value.current = 1
await fetchRecords()
}
async function fetchRecords() {
await store.fetchRecords(domainId.value, {
...filters.value,
page: pagination.value.current,
per_page: pagination.value.pageSize,
})
const meta = store.recordsPagination
pagination.value = {
current: meta?.current_page ?? pagination.value.current,
pageSize: meta?.per_page ?? pagination.value.pageSize,
total: meta?.total ?? 0,
}
}
function openCreateDrawer() {
editingRecord.value = null
formModel.value = {
type: 'A',
name: '@',
content: '',
ttl: 600,
}
isDrawerOpen.value = true
}
function openEditDrawer(record: DNSRecord) {
editingRecord.value = record
formModel.value = {
type: record.type,
name: record.name,
content: record.content,
ttl: record.ttl,
priority: record.priority,
weight: record.weight,
proxied: record.proxied,
}
isDrawerOpen.value = true
}
async function handleSubmit() {
if (editingRecord.value) {
await store.updateRecord(domainId.value, editingRecord.value.id, formModel.value)
message.success($gettext('Record updated'))
}
else {
await store.createRecord(domainId.value, formModel.value)
message.success($gettext('Record created'))
}
isDrawerOpen.value = false
}
async function handleDelete(record: DNSRecord) {
await store.deleteRecord(domainId.value, record.id)
message.success($gettext('Record deleted'))
}
function handleFilterSubmit() {
pagination.value.current = 1
fetchRecords()
}
function handlePageChange(page: number, pageSize: number) {
pagination.value.current = page
pagination.value.pageSize = pageSize
fetchRecords()
}
function handlePageSizeChange(current: number, size: number) {
pagination.value.current = current
pagination.value.pageSize = size
fetchRecords()
}
onMounted(() => {
initData()
})
onBeforeUnmount(() => {
store.resetRecords()
})
</script>
<template>
<div class="record-manager">
<ACard>
<template #title>
<ASpace align="center">
{{ pageTitle }}
<ATag v-if="store.currentDomain?.dns_credential?.provider">
{{ store.currentDomain?.dns_credential?.provider }}
</ATag>
</ASpace>
</template>
<template #extra>
<AButton type="link" size="small" @click="fetchRecords">
<template #icon>
<ReloadOutlined />
</template>
{{ $gettext('Refresh') }}
</AButton>
<AButton type="link" size="small" @click="openCreateDrawer">
<template #icon>
<PlusOutlined />
</template>
{{ $gettext('Add Record') }}
</AButton>
</template>
<DNSRecordFilter v-model:filters="filters" @submit="handleFilterSubmit" />
<DNSRecordTable
class="mt-4"
:records="store.records"
:loading="store.recordsLoading"
:show-proxied="showProxiedToggle"
@edit="openEditDrawer"
@delete="handleDelete"
/>
<div class="mt-4 flex justify-end">
<APagination
:current="pagination.current"
:page-size="pagination.pageSize"
:total="pagination.total"
:show-size-changer="true"
:page-size-options="pageSizeOptions"
@change="handlePageChange"
@show-size-change="handlePageSizeChange"
/>
</div>
</ACard>
<ADrawer
:open="isDrawerOpen"
:title="editingRecord ? $gettext('Edit Record') : $gettext('Create Record')"
width="480"
@close="isDrawerOpen = false"
>
<DNSRecordForm
v-model:record="formModel"
:show-proxied="showProxiedToggle"
:value-suggestions="contentSuggestions"
/>
<template #footer>
<ASpace>
<AButton @click="isDrawerOpen = false">
{{ $gettext('Cancel') }}
</AButton>
<AButton type="primary" @click="handleSubmit">
{{ $gettext('Save') }}
</AButton>
</ASpace>
</template>
</ADrawer>
<FooterToolBar>
<AButton @click="router.push('/dns/domains')">
{{ $gettext('Back') }}
</AButton>
</FooterToolBar>
</div>
</template>
<style scoped lang="less">
.record-manager {
padding-bottom: 24px;
}
</style>
@@ -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<DNSProvider[]>
@@ -22,7 +23,7 @@ async function init() {
}
auto_cert.get_dns_providers().then(r => {
providers.value = r
providers.value = filterAllowedDnsProviders(r)
}).then(() => {
init()
})
@@ -0,0 +1,74 @@
<script setup lang="ts">
import type { RecordListParams } from '@/api/dns'
const emit = defineEmits<{
(event: 'submit'): void
}>()
const filters = defineModel<RecordListParams>('filters', {
default: () => ({
type: '',
name: '',
}),
})
const recordTypes = [
'',
'A',
'AAAA',
'CNAME',
'TXT',
'MX',
'NS',
'SRV',
'CAA',
]
function handleSubmit() {
emit('submit')
}
function handleReset() {
filters.value = {
type: '',
name: '',
}
emit('submit')
}
</script>
<template>
<AForm layout="inline" @submit.prevent>
<AFormItem :label="$gettext('Host')">
<AInput
v-model:value="filters.name"
:placeholder="$gettext('Host, e.g. @ or www')"
style="width: 200px;"
/>
</AFormItem>
<AFormItem :label="$gettext('Type')">
<ASelect
v-model:value="filters.type"
style="width: 160px;"
>
<ASelectOption v-for="type in recordTypes" :key="type" :value="type">
{{ type || $gettext('All') }}
</ASelectOption>
</ASelect>
</AFormItem>
<AFormItem>
<ASpace>
<AButton type="primary" @click="handleSubmit">
{{ $gettext('Search') }}
</AButton>
<AButton @click="handleReset">
{{ $gettext('Reset') }}
</AButton>
</ASpace>
</AFormItem>
</AForm>
</template>
<style scoped lang="less">
</style>
@@ -0,0 +1,95 @@
<script setup lang="ts">
import type { RecordPayload } from '@/api/dns'
import { computed } from 'vue'
const props = defineProps<{
showProxied?: boolean
valueSuggestions?: string[]
}>()
const formModel = defineModel<RecordPayload>('record', {
required: true,
default: () => ({
type: 'A',
name: '@',
content: '',
ttl: 600,
}),
})
const recordTypes = [
'A',
'AAAA',
'CNAME',
'TXT',
'MX',
'NS',
'SRV',
'CAA',
]
const showPriority = computed(() => {
const type = formModel.value.type.toUpperCase()
return ['MX', 'SRV'].includes(type)
})
const showWeight = computed(() => {
const type = formModel.value.type.toUpperCase()
return ['SRV'].includes(type)
})
const isValueAutocompleteEnabled = computed(() => {
const type = formModel.value.type?.toUpperCase?.() ?? ''
return type === 'A' || type === 'CNAME'
})
function handleValueKeydown(event: KeyboardEvent) {
if (!isValueAutocompleteEnabled.value)
return
if (event.key === 'Enter') {
event.preventDefault()
}
}
</script>
<template>
<AForm layout="vertical">
<AFormItem :label="$gettext('Type')" :rules="[{ required: true }]">
<ASelect
v-model:value="formModel.type"
:options="recordTypes.map(value => ({ label: value, value }))"
/>
</AFormItem>
<AFormItem :label="$gettext('Name')" :rules="[{ required: true }]">
<AInput v-model:value="formModel.name" :placeholder="$gettext('Use @ for root')" />
</AFormItem>
<AFormItem :label="$gettext('Value')" :rules="[{ required: true }]">
<AAutoComplete
v-if="isValueAutocompleteEnabled"
v-model:value="formModel.content"
:options="(props.valueSuggestions ?? []).filter(Boolean).map(value => ({ value }))"
:filter-option="(input, option) => option?.value?.toLowerCase().includes(input.toLowerCase()) ?? false"
style="width: 100%;"
>
<ATextarea v-model:value="formModel.content" auto-size @keydown.enter="handleValueKeydown" />
</AAutoComplete>
<ATextarea v-else v-model:value="formModel.content" auto-size />
</AFormItem>
<AFormItem :label="$gettext('TTL (seconds)')" :rules="[{ required: true, type: 'number', min: 1 }]">
<AInputNumber v-model:value="formModel.ttl" :min="1" :step="60" style="width: 100%;" />
</AFormItem>
<AFormItem v-if="showPriority" :label="$gettext('Priority')" :rules="[{ required: true, type: 'number', min: 0 }]">
<AInputNumber v-model:value="formModel.priority" :min="0" style="width: 100%;" />
</AFormItem>
<AFormItem v-if="showWeight" :label="$gettext('Weight')">
<AInputNumber v-model:value="formModel.weight" :min="0" :max="100" style="width: 100%;" />
</AFormItem>
<AFormItem v-if="props.showProxied" :label="$gettext('Proxied')">
<ASwitch v-model:checked="formModel.proxied" />
</AFormItem>
</AForm>
</template>
<style scoped lang="less">
</style>
@@ -0,0 +1,110 @@
<script setup lang="ts">
import type { DNSRecord } from '@/api/dns'
import { computed } from 'vue'
const props = defineProps<{
records: DNSRecord[]
loading?: boolean
showProxied?: boolean
}>()
const emit = defineEmits<{
(event: 'edit', record: DNSRecord): void
(event: 'delete', record: DNSRecord): void
}>()
const baseColumns = [{
title: $gettext('Name'),
dataIndex: 'name',
width: 160,
}, {
title: $gettext('Type'),
dataIndex: 'type',
width: 100,
}, {
title: $gettext('Value'),
dataIndex: 'content',
width: 240,
}, {
title: $gettext('TTL'),
dataIndex: 'ttl',
width: 100,
}, {
title: $gettext('Priority'),
dataIndex: 'priority',
width: 100,
}, {
title: $gettext('Weight'),
dataIndex: 'weight',
width: 100,
}, {
title: $gettext('Actions'),
dataIndex: 'actions',
width: 180,
fixed: 'right',
}]
const columns = computed(() => {
const list = baseColumns.slice()
if (props.showProxied) {
list.splice(list.length - 1, 0, {
title: $gettext('Proxied'),
dataIndex: 'proxied',
width: 120,
})
}
return list
})
function handleEdit(record: DNSRecord) {
emit('edit', record)
}
function handleDelete(record: DNSRecord) {
emit('delete', record)
}
</script>
<template>
<ATable
class="dns-record-table"
row-key="id"
:columns="(columns as any)"
:data-source="records"
:loading
:scroll="{ x: 'max-content' }"
:pagination="false"
>
<template #bodyCell="{ column, record }">
<template v-if="column.dataIndex === 'proxied'">
<ATag :color="(record as DNSRecord).proxied ? 'green' : 'default'">
{{ (record as DNSRecord).proxied ? $gettext('Proxied') : $gettext('DNS Only') }}
</ATag>
</template>
<template v-else-if="column.dataIndex === 'actions'">
<ASpace>
<AButton type="link" size="small" @click="handleEdit(record as DNSRecord)">
{{ $gettext('Edit') }}
</AButton>
<APopconfirm
:title="$gettext('Are you sure to delete this record?')"
@confirm="handleDelete(record as DNSRecord)"
>
<AButton type="link" danger size="small">
{{ $gettext('Delete') }}
</AButton>
</APopconfirm>
</ASpace>
</template>
</template>
</ATable>
</template>
<style scoped lang="less">
.dns-record-table {
:deep(.ant-table-cell) {
white-space: normal;
word-break: break-word;
}
}
</style>
+11
View File
@@ -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.
+45 -42
View File
@@ -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
+99 -2
View File
@@ -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=
+5
View File
@@ -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 {
+93
View File
@@ -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)
}
}
+463
View File
@@ -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
}
+19
View File
@@ -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")
)
+90
View File
@@ -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)
}
+288
View File
@@ -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 ""
}
@@ -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
}
@@ -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
}
+336
View File
@@ -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
}
+137
View File
@@ -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
}
+21
View File
@@ -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"`
}
+12
View File
@@ -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"`
}
+1
View File
@@ -42,6 +42,7 @@ func GenerateAllModel() []any {
Site{},
Stream{},
DnsCredential{},
DnsDomain{},
Node{},
Notification{},
AcmeUser{},
+1 -1
View File
@@ -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",
+469
View File
@@ -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
}
+8
View File
@@ -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),
+2
View File
@@ -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)