From 7dd722f9b85ea9064f1f2b2703f9643cd75277bf Mon Sep 17 00:00:00 2001 From: rustmailer Date: Sun, 19 Apr 2026 01:01:46 +0800 Subject: [PATCH] feat: add attachment search view --- src/main.rs | 11 +- src/modules/account/migration.rs | 4 +- src/modules/account/state.rs | 21 +- src/modules/cache/imap/download/flow.rs | 118 +- src/modules/cache/imap/download/rebuild.rs | 100 +- src/modules/cache/imap/task.rs | 2 +- src/modules/dashboard/mod.rs | 71 +- src/modules/envelope/extractor.rs | 56 +- src/modules/mailbox/delete.rs | 4 +- src/modules/message/delete.rs | 4 +- src/modules/message/list.rs | 4 +- src/modules/message/search.rs | 90 +- src/modules/message/tags.rs | 2 +- src/modules/rest/api/account.rs | 10 +- src/modules/rest/api/attachment.rs | 195 + src/modules/rest/api/message.rs | 36 +- src/modules/rest/api/mod.rs | 6 +- src/modules/settings/dir.rs | 30 +- src/modules/store/storage.rs | 2 +- src/modules/store/tantivy/attachment.rs | 984 +++++ .../store/tantivy/{manager.rs => envelope.rs} | 209 +- src/modules/store/tantivy/fields.rs | 43 +- src/modules/store/tantivy/mod.rs | 48 +- src/modules/store/tantivy/model.rs | 250 +- src/modules/store/tantivy/schema.rs | 117 +- web/src/api/attachment/api.ts | 76 + web/src/api/index.ts | 4 +- .../components/layout/data/sidebar-data.ts | 7 +- web/src/components/pagination.tsx | 2 +- .../features/attachment/account-popover.tsx | 203 ++ .../features/attachment/attachment-filter.tsx | 72 + .../features/attachment/attachment-icon.tsx | 72 + .../attachment/attachment-metadata-filter.tsx | 85 + .../attachment-metadata-selector.tsx | 137 + web/src/features/attachment/bulk-actions.tsx | 169 + .../attachment/bulk-add-tag-dialog.tsx | 259 ++ web/src/features/attachment/context/index.tsx | 66 + web/src/features/attachment/delete-dialog.tsx | 115 + .../attachment/delete-mailbox-dialog.tsx | 105 + .../features/attachment/edit-tag-dialog.tsx | 245 ++ web/src/features/attachment/filter-reset.tsx | 57 + web/src/features/attachment/index.tsx | 170 + .../attachment/mail-display-dialog.tsx | 61 + .../features/attachment/mail-list-table.tsx | 296 ++ web/src/features/attachment/mail-list.tsx | 278 ++ .../features/attachment/mail-message-view.tsx | 432 +++ .../features/attachment/mailbox-popover.tsx | 401 ++ .../attachment/more-filters-popover.tsx | 189 + .../attachment/nested-email-dialog.tsx | 191 + .../attachment/restore-message-dialog.tsx | 186 + .../features/attachment/sender-popover.tsx | 88 + .../table/data-table-column-header.tsx | 83 + .../table/data-table-row-actions.tsx | 71 + web/src/features/attachment/table/table.tsx | 168 + web/src/features/attachment/table/toolbar.tsx | 60 + .../attachment/table/view-options.tsx | 80 + .../attachment/tag-filter-popover.tsx | 209 ++ .../features/attachment/text-search-input.tsx | 227 ++ web/src/features/attachment/thread-dialog.tsx | 221 ++ web/src/features/attachment/time-popover.tsx | 244 ++ web/src/features/search/account-popover.tsx | 2 +- web/src/features/search/contact-popover.tsx | 2 +- web/src/features/search/filter-reset.tsx | 2 +- web/src/features/search/index.tsx | 8 +- web/src/features/search/mail-list-table.tsx | 155 +- web/src/features/search/mailbox-popover.tsx | 2 +- .../features/search/more-filters-popover.tsx | 4 +- web/src/features/search/table/table.tsx | 3 +- web/src/features/search/table/toolbar.tsx | 35 +- .../features/search/table/view-options.tsx | 2 +- .../features/search/tag-filter-popover.tsx | 2 +- web/src/features/search/time-popover.tsx | 71 +- web/src/hooks/use-attachment-senders.ts | 26 + .../hooks/use-available-attachment-tags.ts | 66 + web/src/hooks/use-search-attachments.ts | 152 + web/src/locales/ar.json | 3210 +++++++++-------- web/src/locales/da.json | 3210 +++++++++-------- web/src/locales/de.json | 3210 +++++++++-------- web/src/locales/en.json | 2940 +++++++-------- web/src/locales/es.json | 3210 +++++++++-------- web/src/locales/fi.json | 3210 +++++++++-------- web/src/locales/fr.json | 3210 +++++++++-------- web/src/locales/it.json | 3210 +++++++++-------- web/src/locales/jp.json | 3202 ++++++++-------- web/src/locales/ko.json | 3210 +++++++++-------- web/src/locales/nl.json | 3210 +++++++++-------- web/src/locales/no.json | 3210 +++++++++-------- web/src/locales/pl.json | 2944 +++++++-------- web/src/locales/pt.json | 3210 +++++++++-------- web/src/locales/ru.json | 3210 +++++++++-------- web/src/locales/sv.json | 3210 +++++++++-------- web/src/locales/zh-tw.json | 3210 +++++++++-------- web/src/locales/zh.json | 2942 +++++++-------- web/src/routeTree.gen.ts | 28 + .../_authenticated/attachment/index.tsx | 23 + .../routes/_authenticated/search/index.tsx | 4 +- 96 files changed, 36331 insertions(+), 28970 deletions(-) create mode 100644 src/modules/rest/api/attachment.rs create mode 100644 src/modules/store/tantivy/attachment.rs rename src/modules/store/tantivy/{manager.rs => envelope.rs} (88%) create mode 100644 web/src/api/attachment/api.ts create mode 100644 web/src/features/attachment/account-popover.tsx create mode 100644 web/src/features/attachment/attachment-filter.tsx create mode 100644 web/src/features/attachment/attachment-icon.tsx create mode 100644 web/src/features/attachment/attachment-metadata-filter.tsx create mode 100644 web/src/features/attachment/attachment-metadata-selector.tsx create mode 100644 web/src/features/attachment/bulk-actions.tsx create mode 100644 web/src/features/attachment/bulk-add-tag-dialog.tsx create mode 100644 web/src/features/attachment/context/index.tsx create mode 100644 web/src/features/attachment/delete-dialog.tsx create mode 100644 web/src/features/attachment/delete-mailbox-dialog.tsx create mode 100644 web/src/features/attachment/edit-tag-dialog.tsx create mode 100644 web/src/features/attachment/filter-reset.tsx create mode 100644 web/src/features/attachment/index.tsx create mode 100644 web/src/features/attachment/mail-display-dialog.tsx create mode 100644 web/src/features/attachment/mail-list-table.tsx create mode 100644 web/src/features/attachment/mail-list.tsx create mode 100644 web/src/features/attachment/mail-message-view.tsx create mode 100644 web/src/features/attachment/mailbox-popover.tsx create mode 100644 web/src/features/attachment/more-filters-popover.tsx create mode 100644 web/src/features/attachment/nested-email-dialog.tsx create mode 100644 web/src/features/attachment/restore-message-dialog.tsx create mode 100644 web/src/features/attachment/sender-popover.tsx create mode 100644 web/src/features/attachment/table/data-table-column-header.tsx create mode 100644 web/src/features/attachment/table/data-table-row-actions.tsx create mode 100644 web/src/features/attachment/table/table.tsx create mode 100644 web/src/features/attachment/table/toolbar.tsx create mode 100644 web/src/features/attachment/table/view-options.tsx create mode 100644 web/src/features/attachment/tag-filter-popover.tsx create mode 100644 web/src/features/attachment/text-search-input.tsx create mode 100644 web/src/features/attachment/thread-dialog.tsx create mode 100644 web/src/features/attachment/time-popover.tsx create mode 100644 web/src/hooks/use-attachment-senders.ts create mode 100644 web/src/hooks/use-available-attachment-tags.ts create mode 100644 web/src/hooks/use-search-attachments.ts create mode 100644 web/src/routes/_authenticated/attachment/index.tsx diff --git a/src/main.rs b/src/main.rs index 30ca327..b3ad707 100644 --- a/src/main.rs +++ b/src/main.rs @@ -23,13 +23,13 @@ use bichon::{ modules::{ cache::imap::task::SYNC_TASKS, common::rustls::BichonTls, - context::{executors::BichonContext, Initialize}, - error::{code::ErrorCode, BichonResult}, + context::{Initialize, executors::BichonContext}, + error::{BichonResult, code::ErrorCode}, logger, rest::start_http_server, settings::cli::SETTINGS, - smtp::{start_smtp_server, SmtpServer}, - store::{storage::BLOB_MANAGER, tantivy::manager::INDEX_MANAGER}, + smtp::{SmtpServer, start_smtp_server}, + store::{storage::BLOB_MANAGER, tantivy::{attachment::ATTACHMENT_MANAGER, envelope::ENVELOPE_MANAGER}}, tasks::PeriodicTasks, }, raise_error, @@ -95,7 +95,8 @@ async fn main() -> BichonResult<()> { } SYNC_TASKS.shutdown().await; - INDEX_MANAGER.shutdown().await; + ENVELOPE_MANAGER.shutdown().await; + ATTACHMENT_MANAGER.shutdown().await; BLOB_MANAGER.shutdown().await; info!("Bichon server stopped."); Ok(()) diff --git a/src/modules/account/migration.rs b/src/modules/account/migration.rs index 279a8b6..2edae04 100644 --- a/src/modules/account/migration.rs +++ b/src/modules/account/migration.rs @@ -35,7 +35,7 @@ use crate::{ cache::imap::mailbox::MailBox, database::{list_all_impl, secondary_find_impl, with_transaction}, error::BichonResult, - store::tantivy::manager::INDEX_MANAGER, + store::tantivy::envelope::ENVELOPE_MANAGER, users::{role::DEFAULT_ACCOUNT_MANAGER_ROLE_ID, UserModel, DEFAULT_ADMIN_USER_ID}, }, utc_now, @@ -372,7 +372,7 @@ impl AccountV4 { OAuth2AccessToken::try_delete(account.id).await?; UserModel::cleanup_account(account.id).await?; MailBox::clean(account.id).await?; - INDEX_MANAGER.delete_account_envelopes(account.id).await?; + ENVELOPE_MANAGER.delete_account_envelopes(account.id).await?; Self::delete_account(account.id).await?; info!("Sequential cleanup completed for account: {}", account.id); Ok(()) diff --git a/src/modules/account/state.rs b/src/modules/account/state.rs index f37d699..0ff079d 100644 --- a/src/modules/account/state.rs +++ b/src/modules/account/state.rs @@ -96,10 +96,27 @@ pub struct AccountError { } impl DownloadState { - pub async fn init(account_id: u64) -> BichonResult<()> { - let state = DownloadState { + pub fn empty(account_id: u64) -> Self { + DownloadState { account_id, ..Default::default() + } + } + + pub async fn init(account_id: u64) -> BichonResult<()> { + let now = utc_now!(); + let state = DownloadState { + account_id, + last_trigger_at: now, + active_session: Some(DownloadSession { + start_time: now, + status: DownloadStatus::Running, + trigger: TriggerType::Scheduled, + ..Default::default() + }), + history: Default::default(), + last_finished_at: Default::default(), + global_errors: Default::default(), }; upsert_impl(DB_MANAGER.envelope_db(), state).await } diff --git a/src/modules/cache/imap/download/flow.rs b/src/modules/cache/imap/download/flow.rs index aa390ed..8a2500f 100644 --- a/src/modules/cache/imap/download/flow.rs +++ b/src/modules/cache/imap/download/flow.rs @@ -24,23 +24,19 @@ use crate::{ }, cache::{ imap::{ + download::rebuild::{rebuild_mailbox_cache, rebuild_mailbox_cache_by_date}, find_intersecting_mailboxes, find_missing_mailboxes, mailbox::MailBox, - download::rebuild::{ - rebuild_mailbox_cache, rebuild_mailbox_cache_by_date, - DEFAULT_MAX_CONCURRENT_PER_ACCOUNT, - }, }, SEMAPHORE, }, - error::{code::ErrorCode, BichonError, BichonResult}, + error::{code::ErrorCode, BichonResult}, imap::executor::ImapExecutor, - store::tantivy::manager::INDEX_MANAGER, + store::tantivy::envelope::ENVELOPE_MANAGER, }, raise_error, }; -use std::{sync::Arc, time::Instant}; -use tokio::sync::Semaphore; +use std::time::Instant; use tokio_util::sync::CancellationToken; use tracing::{debug, error, info, warn}; @@ -564,7 +560,9 @@ pub async fn reconcile_mailboxes( //Mail folders that are not locally need to be downloaded. if !missing_mailboxes.is_empty() { MailBox::batch_insert(&missing_mailboxes).await?; - let mut handles = Vec::new(); + + let mut has_error = false; + let mut last_err = None; for mailbox in &missing_mailboxes { if token.is_cancelled() { DownloadState::update_session_status( @@ -579,8 +577,7 @@ pub async fn reconcile_mailboxes( let account = account.clone(); let mailbox = mailbox.clone(); - let local_semaphore = Arc::new(Semaphore::new(DEFAULT_MAX_CONCURRENT_PER_ACCOUNT)); - let global_permit = match SEMAPHORE.clone().acquire_owned().await { + let _global_permit = match SEMAPHORE.clone().acquire_owned().await { Ok(permit) => permit, Err(err) => { error!( @@ -591,74 +588,47 @@ pub async fn reconcile_mailboxes( } }; - let local_permit = match local_semaphore.clone().acquire_owned().await { - Ok(permit) => permit, - Err(err) => { - error!( - "Failed to acquire local semaphore permit for account {} mailbox '{}': {:#?}", - account.id, &mailbox.name, err - ); - drop(global_permit); - continue; + let result = match &account.date_since { + Some(date_since) => { + rebuild_mailbox_cache_by_date( + &account, + mailbox.id, + &date_since.since_date()?, + &mailbox, + FetchDirection::Since, + token.clone(), + ) + .await } - }; - let token_clone = token.clone(); - let handle: tokio::task::JoinHandle> = - tokio::spawn(async move { - let _global_permit = global_permit; - let _local_permit = local_permit; - match &account.date_since { - Some(date_since) => { - rebuild_mailbox_cache_by_date( - &account, - mailbox.id, - &date_since.since_date()?, - &mailbox, - FetchDirection::Since, - token_clone, - ) - .await - } - None => match &account.date_before { - Some(r) => { - rebuild_mailbox_cache_by_date( - &account, - mailbox.id, - &r.calculate_date()?, - &mailbox, - FetchDirection::Before, - token_clone, - ) - .await - } - None => { - rebuild_mailbox_cache(&account, &mailbox, &mailbox, token_clone) - .await - } - }, + None => match &account.date_before { + Some(r) => { + rebuild_mailbox_cache_by_date( + &account, + mailbox.id, + &r.calculate_date()?, + &mailbox, + FetchDirection::Before, + token.clone(), + ) + .await } - }); - handles.push(handle); - } - } + None => { + rebuild_mailbox_cache(&account, &mailbox, &mailbox, token.clone()).await + } + }, + }; - let mut has_error = false; - let mut last_err = None; - - for task in handles { - match task.await { - Ok(Ok(_)) => {} - Ok(Err(err)) => { - has_error = true; - tracing::error!("Folder sync task failed: {:#?}", err); - last_err = Some(err); - } - Err(e) => { - has_error = true; - tracing::error!("Task panicked or runtime error: {:#?}", e); + match result { + Ok(_) => {} + Err(err) => { + has_error = true; + tracing::error!("Folder sync task failed: {:#?}", err); + last_err = Some(err); + } } } } + if has_error { if let Some(e) = last_err { return Err(e); @@ -680,7 +650,7 @@ async fn perform_incremental_sync( token: CancellationToken, ) -> BichonResult<()> { if remote_mailbox.exists > 0 { - let local_max_uid = INDEX_MANAGER + let local_max_uid = ENVELOPE_MANAGER .get_max_uid(account.id, local_mailbox.id) .await?; match local_max_uid { diff --git a/src/modules/cache/imap/download/rebuild.rs b/src/modules/cache/imap/download/rebuild.rs index f2061d7..95f39e4 100644 --- a/src/modules/cache/imap/download/rebuild.rs +++ b/src/modules/cache/imap/download/rebuild.rs @@ -24,23 +24,22 @@ use crate::{ }, cache::{ imap::{ + download::flow::{ + fetch_and_save_by_date, fetch_and_save_full_mailbox, FetchDirection, + }, mailbox::MailBox, - download::flow::{fetch_and_save_by_date, fetch_and_save_full_mailbox, FetchDirection}, }, SEMAPHORE, }, - error::{code::ErrorCode, BichonError, BichonResult}, - store::tantivy::manager::INDEX_MANAGER, + error::{code::ErrorCode, BichonResult}, + store::tantivy::envelope::ENVELOPE_MANAGER, }, raise_error, }; -use std::sync::Arc; -use tokio::sync::Semaphore; + use tokio_util::sync::CancellationToken; use tracing::{error, info}; -pub const DEFAULT_MAX_CONCURRENT_PER_ACCOUNT: usize = 3; - pub async fn rebuild_cache( account: &AccountModel, remote_mailboxes: &[MailBox], @@ -53,9 +52,9 @@ pub async fn rebuild_cache( ) .await?; - let local_semaphore = Arc::new(Semaphore::new(DEFAULT_MAX_CONCURRENT_PER_ACCOUNT)); + let mut has_error = false; + let mut last_err = None; - let mut handles = Vec::new(); for mailbox in remote_mailboxes { if token.is_cancelled() { DownloadState::update_session_status( @@ -85,7 +84,7 @@ pub async fn rebuild_cache( let account = account.clone(); let mailbox = mailbox.clone(); - let global_permit = match SEMAPHORE.clone().acquire_owned().await { + let _global_permit = match SEMAPHORE.clone().acquire_owned().await { Ok(permit) => permit, Err(err) => { error!( @@ -96,43 +95,16 @@ pub async fn rebuild_cache( } }; - let local_permit = match local_semaphore.clone().acquire_owned().await { - Ok(permit) => permit, + match fetch_and_save_full_mailbox(&account, &mailbox, token.clone()).await { + Ok(_) => {}, Err(err) => { - error!( - "Failed to acquire local semaphore permit for account {} mailbox '{}': {:#?}", - account.id, &mailbox.name, err - ); - drop(global_permit); - continue; - } - }; - let token_clone = token.clone(); - let handle: tokio::task::JoinHandle> = tokio::spawn(async move { - let _global_permit = global_permit; - let _local_permit = local_permit; - fetch_and_save_full_mailbox(&account, &mailbox, token_clone).await - }); - handles.push(handle); - } - - let mut has_error = false; - let mut last_err = None; - - for task in handles { - match task.await { - Ok(Ok(_)) => {} - Ok(Err(err)) => { has_error = true; tracing::error!("Folder sync task failed: {:#?}", err); last_err = Some(err); } - Err(e) => { - has_error = true; - tracing::error!("Task panicked or runtime error: {:#?}", e); - } } } + if has_error { if let Some(e) = last_err { return Err(e); @@ -159,8 +131,8 @@ pub async fn rebuild_cache_by_date( ) .await?; - let mut handles = Vec::new(); - let local_semaphore = Arc::new(Semaphore::new(DEFAULT_MAX_CONCURRENT_PER_ACCOUNT)); + let mut has_error = false; + let mut last_err = None; for mailbox in remote_mailboxes { if token.is_cancelled() { @@ -194,7 +166,7 @@ pub async fn rebuild_cache_by_date( let date = date.to_string(); let direction = direction.clone(); - let global_permit = match SEMAPHORE.clone().acquire_owned().await { + let _global_permit = match SEMAPHORE.clone().acquire_owned().await { Ok(permit) => permit, Err(err) => { error!( @@ -204,46 +176,18 @@ pub async fn rebuild_cache_by_date( continue; } }; - - let local_permit = match local_semaphore.clone().acquire_owned().await { - Ok(permit) => permit, + match fetch_and_save_by_date(&account, date.as_str(), &mailbox, direction, token.clone()) + .await + { + Ok(_) => {} Err(err) => { - error!( - "Failed to acquire local semaphore permit for account {} mailbox '{}': {:#?}", - account.id, &mailbox.name, err - ); - drop(global_permit); - continue; - } - }; - let token_clone = token.clone(); - let handle: tokio::task::JoinHandle> = - tokio::spawn(async move { - let _global_permit = global_permit; - let _local_permit = local_permit; - fetch_and_save_by_date(&account, date.as_str(), &mailbox, direction, token_clone) - .await - }); - handles.push(handle); - } - - let mut has_error = false; - let mut last_err = None; - - for task in handles { - match task.await { - Ok(Ok(_)) => {} - Ok(Err(err)) => { has_error = true; tracing::error!("Folder sync task failed: {:#?}", err); last_err = Some(err); } - Err(e) => { - has_error = true; - tracing::error!("Task panicked or runtime error: {:#?}", e); - } } } + if has_error { if let Some(e) = last_err { return Err(e); @@ -263,7 +207,7 @@ pub async fn rebuild_mailbox_cache( remote_mailbox: &MailBox, token: CancellationToken, ) -> BichonResult<()> { - INDEX_MANAGER + ENVELOPE_MANAGER .delete_mailbox_envelopes(account.id, vec![local_mailbox.id]) .await?; @@ -297,7 +241,7 @@ pub async fn rebuild_mailbox_cache_by_date( direction: FetchDirection, token: CancellationToken, ) -> BichonResult<()> { - INDEX_MANAGER + ENVELOPE_MANAGER .delete_mailbox_envelopes(account.id, vec![local_mailbox_id]) .await?; if remote.exists == 0 { diff --git a/src/modules/cache/imap/task.rs b/src/modules/cache/imap/task.rs index 6b79912..c9f450d 100644 --- a/src/modules/cache/imap/task.rs +++ b/src/modules/cache/imap/task.rs @@ -140,7 +140,7 @@ impl AccountSyncTask { account_id ); token.cancel(); - if let Err(_) = tokio::time::timeout(Duration::from_secs(10), handler.stop()).await + if let Err(_) = tokio::time::timeout(Duration::from_secs(5), handler.stop()).await { error!( "Shutdown: Account {} download task forced timeout.", diff --git a/src/modules/dashboard/mod.rs b/src/modules/dashboard/mod.rs index 64fdc84..60cacef 100644 --- a/src/modules/dashboard/mod.rs +++ b/src/modules/dashboard/mod.rs @@ -17,7 +17,7 @@ // along with this program. If not, see . use crate::modules::{ - store::tantivy::{manager::INDEX_MANAGER, schema::SchemaTools}, + store::tantivy::{envelope::ENVELOPE_MANAGER, fields::F_ID, schema::SchemaTools}, users::permissions::Permission, }; use poem_openapi::Object; @@ -66,9 +66,9 @@ impl DashboardStats { Some(context.user.account_access_map.keys().cloned().collect()) }; - let mut stat = INDEX_MANAGER.get_dashboard_stats(&authorized_ids).await?; + let mut stat = ENVELOPE_MANAGER.get_dashboard_stats(&authorized_ids).await?; - stat.top_largest_emails = INDEX_MANAGER.top_10_largest_emails(&authorized_ids).await?; + stat.top_largest_emails = ENVELOPE_MANAGER.top_10_largest_emails(&authorized_ids).await?; stat.account_count = if has_all_accounts { AccountModel::count().await? @@ -76,13 +76,13 @@ impl DashboardStats { authorized_ids.as_ref().map(|ids| ids.len()).unwrap_or(0) }; - stat.email_count = INDEX_MANAGER.total_emails(&authorized_ids)?; + stat.email_count = ENVELOPE_MANAGER.total_emails(&authorized_ids)?; if has_all_accounts { - stat.storage_usage_bytes = get_total_size(&DATA_DIR_MANAGER.eml_dir) + stat.storage_usage_bytes = get_total_size(&DATA_DIR_MANAGER.storage_dir) .map_err(|e| raise_error!(format!("{:#?}", e), ErrorCode::InternalError))?; - stat.index_usage_bytes = get_total_size(&&DATA_DIR_MANAGER.tantivy_dir) + stat.index_usage_bytes = get_total_size(&&DATA_DIR_MANAGER.envelope_dir) .map_err(|e| raise_error!(format!("{:#?}", e), ErrorCode::InternalError))?; } else { stat.storage_usage_bytes = 0; @@ -139,13 +139,13 @@ impl LargestEmail { let value = document.get_first(fields.f_id).ok_or_else(|| { raise_error!( - format!("'{}' field not found", stringify!(field)), + format!("'{}' field not found", F_ID), ErrorCode::InternalError ) })?; let id = value.as_str().map(|s| s.to_string()).ok_or_else(|| { raise_error!( - format!("'{}' field is not a string", stringify!(field)), + format!("'{}' field is not a string", F_ID), ErrorCode::InternalError ) })?; @@ -159,3 +159,58 @@ impl LargestEmail { Ok(envelope) } } + +#[derive(Clone, Debug, Default, Eq, PartialEq, Deserialize, Serialize, Object)] +pub struct LargestAttachment { + pub name: String, // Attachment name + pub size_bytes: u64, // Attachment size in bytes + pub id: String, +} + +impl LargestAttachment { + pub fn from_tantivy_doc(document: &TantivyDocument) -> BichonResult { + let fields = SchemaTools::attachment_fields(); + let value = document.get_first(fields.f_size).ok_or_else(|| { + raise_error!( + "miss 'size' field in tantivy document".into(), + ErrorCode::InternalError + ) + })?; + let size_bytes = value.as_u64().ok_or_else(|| { + raise_error!("'size' field is not a u64".into(), ErrorCode::InternalError) + })?; + let value = document.get_first(fields.f_name_exact).ok_or_else(|| { + raise_error!( + "'name_exact' field not found".into(), + ErrorCode::InternalError + ) + })?; + let name = value.as_str().map(|s| s.to_string()).ok_or_else(|| { + raise_error!( + "'name_exact' field is not a string".into(), + ErrorCode::InternalError + ) + })?; + + let value = document.get_first(fields.f_id).ok_or_else(|| { + raise_error!( + format!("'{}' field not found", F_ID), + ErrorCode::InternalError + ) + })?; + let id = value.as_str().map(|s| s.to_string()).ok_or_else(|| { + raise_error!( + format!("'{}' field is not a string", F_ID), + ErrorCode::InternalError + ) + })?; + + let envelope = LargestAttachment { + name, + size_bytes, + id, + }; + + Ok(envelope) + } +} diff --git a/src/modules/envelope/extractor.rs b/src/modules/envelope/extractor.rs index 92710c7..ed80aab 100644 --- a/src/modules/envelope/extractor.rs +++ b/src/modules/envelope/extractor.rs @@ -22,8 +22,9 @@ use crate::modules::error::code::ErrorCode; use crate::modules::error::BichonResult; use crate::modules::message::content::AttachmentInfo; use crate::modules::store::storage::{DetachedEmail, BLOB_MANAGER}; -use crate::modules::store::tantivy::manager::INDEX_MANAGER; -use crate::modules::store::tantivy::model::EnvelopeWithAttachments; +use crate::modules::store::tantivy::attachment::ATTACHMENT_MANAGER; +use crate::modules::store::tantivy::envelope::ENVELOPE_MANAGER; +use crate::modules::store::tantivy::model::{AttachmentModel, EnvelopeWithAttachments}; use crate::modules::utils::html::extract_text; use crate::modules::utils::{compute_content_hash, hex_hash}; use crate::{id, modules::store::envelope::Envelope}; @@ -31,6 +32,7 @@ use crate::{raise_error, utc_now}; use async_imap::types::Fetch; use bytes::Bytes; use mail_parser::{Address, HeaderName, Message, MessageParser, MimeHeaders}; +use tantivy::TantivyDocument; use tracing::error; use uuid::Uuid; @@ -154,12 +156,43 @@ async fn extract_envelope_core( let attachment_count = message.attachment_count(); let attachments = detach_and_store_attachments(body, &message, &email_content_hash).await; - let inline_with_id_count = attachments + let envelope_id = Uuid::new_v4().to_string(); + let now = utc_now!(); + + let attachment_docs: Vec = attachments .iter() - .filter(|a| a.inline && a.content_id.is_some()) - .count(); + .filter(|a| !a.inline || a.content_id.is_none()) + .map(|a| AttachmentModel { + id: Uuid::new_v4().to_string(), + envelope_id: envelope_id.clone(), + account_id, + account_email: None, + mailbox_id, + mailbox_name: None, + subject: subject.clone(), + content_hash: a.content_hash.clone(), + from: from.clone(), + date, + ingest_at: now, + size: a.size as u64, + ext: a.get_extension(), + category: a.get_category().to_string(), + content_type: a.file_type.clone(), + shard_id: 0, + text: None, + has_text: false, + is_ocr: false, + page_count: None, + is_indexed: false, + is_message: a.is_message, + name: a.filename.clone(), + tags: None, + auto_tags: None, + }).map(|a|a.into_document()) + .collect(); + let envelope = Envelope { - id: Uuid::new_v4().to_string(), + id: envelope_id, message_id, account_id, mailbox_id, @@ -172,11 +205,11 @@ async fn extract_envelope_core( bcc, date, internal_date, - ingest_at: utc_now!(), + ingest_at: now, size, thread_id, attachment_count, - regular_attachment_count: attachment_count - inline_with_id_count, + regular_attachment_count: attachment_docs.len(), tags: None, account_email: None, mailbox_name: None, @@ -188,7 +221,10 @@ async fn extract_envelope_core( attachments: Some(attachments), }; let doc = ea.to_document(&body_text, 0)?; - INDEX_MANAGER.queue(doc).await; + ENVELOPE_MANAGER.queue(doc).await; + for doc in attachment_docs { + ATTACHMENT_MANAGER.queue(doc).await; + } Ok(()) } @@ -369,7 +405,7 @@ pub async fn reattach_eml_content( account_id: u64, envelope_id: String, ) -> BichonResult<(Envelope, Bytes)> { - let e = INDEX_MANAGER + let e = ENVELOPE_MANAGER .get_envelope_by_id(account_id, &envelope_id) .await? .ok_or_else(|| { diff --git a/src/modules/mailbox/delete.rs b/src/modules/mailbox/delete.rs index ab7c303..ace21e4 100644 --- a/src/modules/mailbox/delete.rs +++ b/src/modules/mailbox/delete.rs @@ -17,7 +17,7 @@ // along with this program. If not, see . use crate::modules::{ - cache::imap::mailbox::MailBox, error::BichonResult, store::tantivy::manager::INDEX_MANAGER, + cache::imap::mailbox::MailBox, error::BichonResult, store::tantivy::envelope::ENVELOPE_MANAGER, }; pub async fn delete_mailbox_impl(account_id: u64, mailbox_id: u64) -> BichonResult<()> { @@ -42,7 +42,7 @@ pub async fn delete_mailbox_impl(account_id: u64, mailbox_id: u64) -> BichonResu MailBox::delete(*id).await?; } - INDEX_MANAGER + ENVELOPE_MANAGER .delete_mailbox_envelopes(account_id, ids_to_delete.clone()) .await?; Ok(()) diff --git a/src/modules/message/delete.rs b/src/modules/message/delete.rs index 8dfbb24..6171521 100644 --- a/src/modules/message/delete.rs +++ b/src/modules/message/delete.rs @@ -17,9 +17,9 @@ // along with this program. If not, see . use crate::modules::error::BichonResult; -use crate::modules::store::tantivy::manager::INDEX_MANAGER; +use crate::modules::store::tantivy::envelope::ENVELOPE_MANAGER; use std::collections::HashMap; pub async fn delete_messages_impl(request: HashMap>) -> BichonResult<()> { - INDEX_MANAGER.delete_envelopes_multi_account(request).await + ENVELOPE_MANAGER.delete_envelopes_multi_account(request).await } diff --git a/src/modules/message/list.rs b/src/modules/message/list.rs index 5fba652..836c1d1 100644 --- a/src/modules/message/list.rs +++ b/src/modules/message/list.rs @@ -20,7 +20,7 @@ use crate::modules::{ account::migration::AccountModel, error::BichonResult, rest::response::DataPage, - store::{envelope::Envelope, tantivy::manager::INDEX_MANAGER}, + store::{envelope::Envelope, tantivy::envelope::ENVELOPE_MANAGER}, }; pub async fn get_thread_messages( @@ -30,7 +30,7 @@ pub async fn get_thread_messages( page_size: u64, ) -> BichonResult> { AccountModel::check_account_exists(account_id).await?; - INDEX_MANAGER + ENVELOPE_MANAGER .list_thread_envelopes(account_id, thread_id, page, page_size, true) .await } diff --git a/src/modules/message/search.rs b/src/modules/message/search.rs index 995dcb9..231e48d 100644 --- a/src/modules/message/search.rs +++ b/src/modules/message/search.rs @@ -24,13 +24,18 @@ use crate::{ modules::{ error::{code::ErrorCode, BichonResult}, rest::response::DataPage, - store::{envelope::Envelope, tantivy::manager::INDEX_MANAGER}, + store::{ + envelope::Envelope, + tantivy::{ + attachment::ATTACHMENT_MANAGER, envelope::ENVELOPE_MANAGER, model::AttachmentModel, + }, + }, }, raise_error, }; #[derive(Debug, Clone, Default, Eq, PartialEq, Serialize, Deserialize, Object)] -pub struct SearchFilter { +pub struct EmailSearchFilter { pub text: Option, pub subject: Option, pub body: Option, @@ -61,14 +66,14 @@ pub enum SortBy { } #[derive(Debug, Clone, Default, Eq, PartialEq, Serialize, Deserialize, Object)] -pub struct SearchRequest { - filter: SearchFilter, +pub struct EmailSearchRequest { + filter: EmailSearchFilter, page: u64, page_size: u64, sort_by: Option, desc: Option, } -impl SearchRequest { +impl EmailSearchRequest { pub fn validate(&self) -> BichonResult<()> { if self.page == 0 || self.page_size == 0 { return Err(raise_error!( @@ -89,10 +94,81 @@ impl SearchRequest { pub async fn search_messages_impl( accounts: Option>, - request: SearchRequest, + request: EmailSearchRequest, ) -> BichonResult> { request.validate()?; - INDEX_MANAGER + ENVELOPE_MANAGER + .search( + accounts, + request.filter, + request.page, + request.page_size, + request.desc.unwrap_or(true), + request.sort_by.unwrap_or(SortBy::DATE), + ) + .await +} + +#[derive(Debug, Clone, Default, Eq, PartialEq, Serialize, Deserialize, Object)] +pub struct AttachmentSearchFilter { + pub text: Option, + pub subject: Option, + pub from: Option, + pub since: Option, + pub before: Option, + pub account_ids: Option>, + pub mailbox_ids: Option>, + pub min_size: Option, + pub max_size: Option, + + pub attachment_name: Option, + + pub tags: Option>, + pub attachment_extension: Option, + pub attachment_category: Option, + pub attachment_content_type: Option, + + pub is_ocr: Option, + pub is_message: Option, + pub has_text: Option, + + pub min_page_count: Option, + pub max_page_count: Option, +} + +#[derive(Debug, Clone, Default, Eq, PartialEq, Serialize, Deserialize, Object)] +pub struct AttachmentSearchRequest { + filter: AttachmentSearchFilter, + page: u64, + page_size: u64, + sort_by: Option, + desc: Option, +} +impl AttachmentSearchRequest { + pub fn validate(&self) -> BichonResult<()> { + if self.page == 0 || self.page_size == 0 { + return Err(raise_error!( + "Both page and page_size must be greater than 0.".into(), + ErrorCode::InvalidParameter + )); + } + if self.page_size > 500 { + return Err(raise_error!( + "The page_size exceeds the maximum allowed limit of 500.".into(), + ErrorCode::InvalidParameter + )); + } + + Ok(()) + } +} + +pub async fn search_attachment_impl( + accounts: Option>, + request: AttachmentSearchRequest, +) -> BichonResult> { + request.validate()?; + ATTACHMENT_MANAGER .search( accounts, request.filter, diff --git a/src/modules/message/tags.rs b/src/modules/message/tags.rs index d20ac07..c048567 100644 --- a/src/modules/message/tags.rs +++ b/src/modules/message/tags.rs @@ -23,7 +23,7 @@ use serde::{Deserialize, Serialize}; #[derive(Debug, Clone, Default, Eq, PartialEq, Serialize, Deserialize, Object)] pub struct TagsRequest { - pub updates: HashMap>, // account_id -> envelope_ids + pub updates: HashMap>, pub tags: Vec, pub action: TagAction, } diff --git a/src/modules/rest/api/account.rs b/src/modules/rest/api/account.rs index 725b05a..033d94f 100644 --- a/src/modules/rest/api/account.rs +++ b/src/modules/rest/api/account.rs @@ -27,13 +27,11 @@ use crate::modules::account::state::DownloadState; use crate::modules::account::view::AccountResp; use crate::modules::common::auth::ClientContext; use crate::modules::common::paginated::paginate_vec; -use crate::modules::error::code::ErrorCode; use crate::modules::rest::api::ApiTags; use crate::modules::rest::response::DataPage; use crate::modules::rest::ApiResult; use crate::modules::users::permissions::Permission; use crate::modules::users::UserModel; -use crate::raise_error; use poem_openapi::param::{Path, Query}; use poem_openapi::payload::Json; use poem_openapi::OpenApi; @@ -201,12 +199,8 @@ impl AccountApi { context .require_permission(Some(account_id), Permission::ACCOUNT_READ_DETAILS) .await?; - let state = DownloadState::get(account_id).await?.ok_or_else(|| { - raise_error!( - "account download state is not found".into(), - ErrorCode::ResourceNotFound - ) - })?; + let state = DownloadState::get(account_id).await?; + let state = state.unwrap_or(DownloadState::empty(account_id)); Ok(Json(state)) } diff --git a/src/modules/rest/api/attachment.rs b/src/modules/rest/api/attachment.rs new file mode 100644 index 0000000..70e52e1 --- /dev/null +++ b/src/modules/rest/api/attachment.rs @@ -0,0 +1,195 @@ +// +// Copyright (c) 2025-2026 rustmailer.com (https://rustmailer.com) +// +// This file is part of the Bichon Email Archiving Project +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +use crate::modules::common::auth::ClientContext; +use crate::modules::message::attachment::AttachmentMetadata; +use crate::modules::message::search::search_attachment_impl; +use crate::modules::message::search::AttachmentSearchRequest; +use crate::modules::message::tags::TagCount; +use crate::modules::message::tags::TagsRequest; +use crate::modules::rest::api::ApiTags; +use crate::modules::rest::response::DataPage; +use crate::modules::rest::ApiResult; +use crate::modules::rest::ErrorCode; +use crate::modules::store::tantivy::attachment::ATTACHMENT_MANAGER; +use crate::modules::store::tantivy::model::AttachmentModel; +use crate::modules::users::permissions::Permission; +use crate::modules::utils::validate_tag; +use crate::raise_error; +use poem_openapi::param::Path; +use poem_openapi::payload::Json; +use poem_openapi::OpenApi; +use std::collections::HashSet; + +pub struct AttachmentApi; + +#[OpenApi(prefix_path = "/api/v1", tag = "ApiTags::Attachment")] +impl AttachmentApi { + /// Searches messages across all mailboxes using various filter criteria. + /// The search filters are provided in the request body. + #[oai( + path = "/search-attachment", + method = "post", + operation_id = "search_attachment" + )] + async fn search_attachment( + &self, + payload: Json, + context: ClientContext, + ) -> ApiResult>> { + let authorized_ids: Option> = if context + .has_permission(None, Permission::DATA_READ_ALL) + .await + { + None + } else { + Some(context.user.account_access_map.keys().cloned().collect()) + }; + Ok(Json( + search_attachment_impl(authorized_ids, payload.0).await?, + )) + } + + /// Retrieves the attachment (metadata) of a specific message. + #[oai( + path = "/attachment/:account_id/:attachment_id", + method = "get", + operation_id = "get_attachment" + )] + async fn get_attachment( + &self, + /// The ID of the account. + account_id: Path, + /// The ID of the attachment. + attachment_id: Path, + context: ClientContext, + ) -> ApiResult> { + let account_id = account_id.0; + context + .require_permission(Some(account_id), Permission::DATA_READ) + .await?; + let attachment_id = attachment_id.0; + let a = ATTACHMENT_MANAGER + .get_attachment_by_id(account_id, &attachment_id) + .await? + .ok_or_else(|| { + raise_error!( + format!( + "Attachment not found: account_id={} envelope_id={}", + account_id, &attachment_id + ), + ErrorCode::ResourceNotFound + ) + })?; + Ok(Json(a)) + } + + /// Returns all facets in the index along with their document counts. + #[oai( + path = "/all-attachment-tags", + method = "get", + operation_id = "get_all_attachment_tags" + )] + async fn get_all_attachment_tags( + &self, + context: ClientContext, + ) -> ApiResult>> { + let authorized_ids: Option> = if context + .has_permission(None, Permission::DATA_READ_ALL) + .await + { + None + } else { + Some(context.user.account_access_map.keys().cloned().collect()) + }; + Ok(Json(ATTACHMENT_MANAGER.get_all_tags(authorized_ids).await?)) + } + + /// Adds or removes facet tags for multiple emails across accounts. + #[oai( + path = "/update-attachment-tags", + method = "post", + operation_id = "update_attachment_tags" + )] + async fn update_attachment_tags( + &self, + req: Json, + context: ClientContext, + ) -> ApiResult<()> { + let req = req.0; + for tag in &req.tags { + validate_tag(tag) + .map_err(|e| raise_error!(format!("{}", e), ErrorCode::InvalidParameter))?; + } + + for account_id in req.updates.keys() { + context + .require_permission(Some(*account_id), Permission::DATA_MANAGE) + .await?; + } + + ATTACHMENT_MANAGER.update_attachment_tags(req).await?; + Ok(()) + } + + /// Retrieves a unique list of all contact email addresses across authorized accounts. + #[oai( + path = "/attachment-senders", + method = "get", + operation_id = "get_attachment_senders" + )] + async fn get_attachment_senders( + &self, + context: ClientContext, + ) -> ApiResult>> { + let authorized_ids: Option> = if context + .has_permission(None, Permission::DATA_READ_ALL) + .await + { + None + } else { + Some(context.user.account_access_map.keys().cloned().collect()) + }; + Ok(Json( + ATTACHMENT_MANAGER.get_all_senders(authorized_ids).await?, + )) + } + + /// Retrieves unique metadata for all attachments across authorized accounts. + #[oai( + path = "/attachment_metadata", + method = "get", + operation_id = "get_attachment_metadata" + )] + async fn get_attachment_metadata( + &self, + context: ClientContext, + ) -> ApiResult> { + let authorized_ids: Option> = if context + .has_permission(None, Permission::DATA_READ_ALL) + .await + { + None + } else { + Some(context.user.account_access_map.keys().cloned().collect()) + }; + Ok(Json( + ATTACHMENT_MANAGER.collect_attachment_metadata(authorized_ids)?, + )) + } +} diff --git a/src/modules/rest/api/message.rs b/src/modules/rest/api/message.rs index 8dc6a0d..756b7e3 100644 --- a/src/modules/rest/api/message.rs +++ b/src/modules/rest/api/message.rs @@ -22,13 +22,12 @@ use crate::modules::message::append::restore_emails; use crate::modules::message::append::RestoreMessagesRequest; use crate::modules::message::attachment::retrieve_attachment_content; use crate::modules::message::attachment::retrieve_nested_attachment_content; -use crate::modules::message::attachment::AttachmentMetadata; use crate::modules::message::content::retrieve_nested_eml_content; use crate::modules::message::content::FullNestedMessageContent; use crate::modules::message::content::{retrieve_email_content, FullMessageContent}; use crate::modules::message::delete::delete_messages_impl; use crate::modules::message::list::get_thread_messages; -use crate::modules::message::search::{search_messages_impl, SearchRequest}; +use crate::modules::message::search::{search_messages_impl, EmailSearchRequest}; use crate::modules::message::tags::TagCount; use crate::modules::message::tags::TagsRequest; use crate::modules::rest::api::ApiTags; @@ -37,7 +36,7 @@ use crate::modules::rest::ApiResult; use crate::modules::rest::ErrorCode; use crate::modules::store::envelope::Envelope; use crate::modules::store::storage::get_reader; -use crate::modules::store::tantivy::manager::INDEX_MANAGER; +use crate::modules::store::tantivy::envelope::ENVELOPE_MANAGER; use crate::modules::users::permissions::Permission; use crate::modules::utils::validate_tag; use crate::raise_error; @@ -82,7 +81,7 @@ impl MessageApi { )] async fn search_messages( &self, - payload: Json, + payload: Json, context: ClientContext, ) -> ApiResult>> { let authorized_ids: Option> = if context @@ -191,7 +190,7 @@ impl MessageApi { .require_permission(Some(account_id), Permission::DATA_READ) .await?; let envelope_id = envelope_id.0; - let e = INDEX_MANAGER + let e = ENVELOPE_MANAGER .get_envelope_by_id(account_id, &envelope_id) .await? .ok_or_else(|| { @@ -335,7 +334,7 @@ impl MessageApi { } else { Some(context.user.account_access_map.keys().cloned().collect()) }; - Ok(Json(INDEX_MANAGER.get_all_tags(authorized_ids).await?)) + Ok(Json(ENVELOPE_MANAGER.get_all_tags(authorized_ids).await?)) } /// Adds or removes facet tags for multiple emails across accounts. @@ -361,7 +360,7 @@ impl MessageApi { .await?; } - INDEX_MANAGER.update_envelope_tags(req).await?; + ENVELOPE_MANAGER.update_envelope_tags(req).await?; Ok(()) } @@ -372,27 +371,6 @@ impl MessageApi { operation_id = "get_all_contacts" )] async fn get_all_contacts(&self, context: ClientContext) -> ApiResult>> { - let authorized_ids: Option> = if context - .has_permission(None, Permission::DATA_READ_ALL) - .await - { - None - } else { - Some(context.user.account_access_map.keys().cloned().collect()) - }; - Ok(Json(INDEX_MANAGER.get_all_contacts(authorized_ids).await?)) - } - - /// Retrieves unique metadata for all attachments across authorized accounts. - #[oai( - path = "/attachment_metadata", - method = "get", - operation_id = "get_attachment_metadata" - )] - async fn get_attachment_metadata( - &self, - context: ClientContext, - ) -> ApiResult> { let authorized_ids: Option> = if context .has_permission(None, Permission::DATA_READ_ALL) .await @@ -402,7 +380,7 @@ impl MessageApi { Some(context.user.account_access_map.keys().cloned().collect()) }; Ok(Json( - INDEX_MANAGER.collect_attachment_metadata(authorized_ids)?, + ENVELOPE_MANAGER.get_all_contacts(authorized_ids).await?, )) } } diff --git a/src/modules/rest/api/mod.rs b/src/modules/rest/api/mod.rs index 3b1724a..5d35ab1 100644 --- a/src/modules/rest/api/mod.rs +++ b/src/modules/rest/api/mod.rs @@ -27,11 +27,12 @@ use system::SystemApi; use crate::{ bichon_version, - modules::rest::api::{import::ImportApi, users::UsersApi}, + modules::rest::api::{attachment::AttachmentApi, import::ImportApi, users::UsersApi}, }; pub mod access_token; pub mod account; +pub mod attachment; pub mod auto_config; pub mod import; pub mod mailbox; @@ -43,6 +44,7 @@ pub mod users; #[derive(Tags)] pub enum ApiTags { AccessToken, + Attachment, AutoConfig, Account, Mailbox, @@ -55,6 +57,7 @@ pub enum ApiTags { type RustMailOpenApi = ( AccessTokenApi, + AttachmentApi, AutoConfigApi, AccountApi, SystemApi, @@ -69,6 +72,7 @@ pub fn create_openapi_service() -> OpenApiService { OpenApiService::new( ( AccessTokenApi, + AttachmentApi, AutoConfigApi, AccountApi, SystemApi, diff --git a/src/modules/settings/dir.rs b/src/modules/settings/dir.rs index 0217a00..eb926b0 100644 --- a/src/modules/settings/dir.rs +++ b/src/modules/settings/dir.rs @@ -27,11 +27,13 @@ use std::sync::LazyLock; pub const META_FILE: &str = "meta.db"; pub const MAILBOX_FILE: &str = "mailbox.db"; -const ENVELOPE_DIR: &str = "envelope"; -const EML_DIR: &str = "bichon-emls"; +const INDICES: &str = "bichon-indices"; +const MAIL_METADATA: &str = "mail_metadata"; +const ATTACHMENT_METADATA: &str = "attachment_metadata"; +const STORAGE: &str = "bichon-storage"; const TMP_DIR: &str = "tmp"; const LOG_DIR: &str = "logs"; -const TANTIVY_DIR: &str = "tantivy"; + const TLS_CERT: &str = "cert.pem"; const TLS_KEY: &str = "key.pem"; @@ -46,8 +48,9 @@ pub struct DataDirManager { pub temp_dir: PathBuf, pub tls_cert: PathBuf, pub tls_key: PathBuf, - pub tantivy_dir: PathBuf, - pub eml_dir: PathBuf, + pub envelope_dir: PathBuf, + pub attachment_dir: PathBuf, + pub storage_dir: PathBuf, pub log_dir: PathBuf, } @@ -59,7 +62,7 @@ impl Initialize for DataDirManager { .map_err(|e| raise_error!(format!("{:#?}", e), ErrorCode::InternalError))?; std::fs::create_dir_all(&DATA_DIR_MANAGER.temp_dir) .map_err(|e| raise_error!(format!("{:#?}", e), ErrorCode::InternalError))?; - std::fs::create_dir_all(&DATA_DIR_MANAGER.eml_dir) + std::fs::create_dir_all(&DATA_DIR_MANAGER.storage_dir) .map_err(|e| raise_error!(format!("{:#?}", e), ErrorCode::InternalError))?; Ok(()) } @@ -68,15 +71,15 @@ impl Initialize for DataDirManager { impl DataDirManager { pub fn new(root_dir: PathBuf) -> Self { let index_dir = if let Some(ref index_dir) = SETTINGS.bichon_index_dir { - PathBuf::from(index_dir) + PathBuf::from(index_dir).join(INDICES) } else { - root_dir.join(ENVELOPE_DIR) + root_dir.join(INDICES) }; - let eml_dir = if let Some(ref data_dir) = SETTINGS.bichon_data_dir { - PathBuf::from(data_dir).join(EML_DIR) + let storage_dir = if let Some(ref data_dir) = SETTINGS.bichon_data_dir { + PathBuf::from(data_dir).join(STORAGE) } else { - root_dir.join(EML_DIR) + root_dir.join(STORAGE) }; Self { @@ -86,9 +89,10 @@ impl DataDirManager { tls_key: root_dir.join(TLS_KEY), tls_cert: root_dir.join(TLS_CERT), log_dir: root_dir.join(LOG_DIR), - tantivy_dir: index_dir.join(TANTIVY_DIR), + envelope_dir: index_dir.join(MAIL_METADATA), + attachment_dir: index_dir.join(ATTACHMENT_METADATA), temp_dir: root_dir.join(TMP_DIR), - eml_dir, + storage_dir, } } } diff --git a/src/modules/store/storage.rs b/src/modules/store/storage.rs index c355ea4..0f0823b 100644 --- a/src/modules/store/storage.rs +++ b/src/modules/store/storage.rs @@ -87,7 +87,7 @@ impl BlobManager { } pub fn new() -> Self { - let db = Database::builder(&DATA_DIR_MANAGER.eml_dir) + let db = Database::builder(&DATA_DIR_MANAGER.storage_dir) .cache_size(64 * 1024 * 1024) .max_cached_files(Some(400)) .journal_compression(CompressionType::None) diff --git a/src/modules/store/tantivy/attachment.rs b/src/modules/store/tantivy/attachment.rs new file mode 100644 index 0000000..b260c97 --- /dev/null +++ b/src/modules/store/tantivy/attachment.rs @@ -0,0 +1,984 @@ +// +// Copyright (c) 2025 rustmailer.com (https://rustmailer.com) +// +// This file is part of the Bichon Email Archiving Project +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +use std::{ + collections::{HashMap, HashSet}, + ops::Bound, + path::PathBuf, + sync::{Arc, LazyLock}, + time::Duration, +}; + +use crate::{ + modules::{ + common::signal::SIGNAL_MANAGER, + dashboard::{Group, LargestAttachment}, + error::{code::ErrorCode, BichonResult}, + message::{ + attachment::AttachmentMetadata, + search::{AttachmentSearchFilter, SortBy}, + tags::{TagAction, TagCount, TagsRequest}, + }, + rest::response::DataPage, + settings::dir::DATA_DIR_MANAGER, + store::tantivy::{ + fatal_commit, + fields::{ + F_ATTACHMENT_CATEGORY, F_ATTACHMENT_CONTENT_TYPE, F_ATTACHMENT_EXT, F_DATE, F_SIZE, + F_TAGS, + }, + model::{extract_senders, AttachmentModel}, + schema::SchemaTools, + }, + }, + raise_error, +}; + +use serde_json::json; +use tantivy::{ + aggregation::{ + agg_req::Aggregations, + agg_result::{AggregationResult, BucketResult}, + AggregationCollector, Key, + }, + collector::{Count, FacetCollector, TopDocs}, + indexer::{LogMergePolicy, UserOperation}, + query::{AllQuery, BooleanQuery, EmptyQuery, Occur, Query, QueryParser, RangeQuery, TermQuery}, + schema::{Field, IndexRecordOption, Value}, + DocAddress, Index, IndexReader, IndexWriter, Order, TantivyDocument, Term, +}; +use tantivy::{schema::Facet, Searcher}; +use tokio::{ + sync::{mpsc, Mutex}, + task::{self, JoinHandle}, +}; +use tracing::info; + +pub static ATTACHMENT_MANAGER: LazyLock = LazyLock::new(IndexManager::new); + +pub struct IndexManager { + index: Arc, + index_writer: Arc>, + sender: mpsc::Sender, + reader: IndexReader, + query_parser: QueryParser, + handle: Mutex>>, +} + +impl IndexManager { + pub async fn shutdown(&self) { + let mut guard = self.handle.lock().await; + if let Some(handle) = guard.take() { + let _ = handle.await; + } + } + pub fn new() -> Self { + let index = Self::open_or_create_index(&DATA_DIR_MANAGER.attachment_dir); + let mut merge_policy = LogMergePolicy::default(); + merge_policy.set_min_num_segments(25); + merge_policy.set_min_layer_size(10_000); + merge_policy.set_max_docs_before_merge(100_000); + + let index_writer = index + .writer_with_num_threads(4, 67_108_864) + .unwrap_or_else(|e| { + panic!( + "Failed to create IndexWriter with 4 threads and 64MB buffer for {:?}: {}", + &DATA_DIR_MANAGER.envelope_dir, e + ) + }); + index_writer.set_merge_policy(Box::new(merge_policy)); + let index_writer = Arc::new(Mutex::new(index_writer)); + let reader = index.reader().unwrap_or_else(|e| { + panic!( + "Failed to create IndexReader for {:?}: {}", + &DATA_DIR_MANAGER.envelope_dir, e + ) + }); + let mut query_parser = + QueryParser::for_index(&index, SchemaTools::attachment_default_fields()); + query_parser.set_conjunction_by_default(); + + let (sender, mut receiver) = mpsc::channel::(100); + + let writer = index_writer.clone(); + let handler = task::spawn(async move { + let mut shutdown = SIGNAL_MANAGER.subscribe(); + let mut commit_interval = tokio::time::interval(Duration::from_secs(60)); + let mut pending_count = 0; + let commit_threshold = 1000; + loop { + tokio::select! { + maybe_msg = receiver.recv() => { + match maybe_msg { + Some(doc) => { + let mut writer = writer.lock().await; + let mut batch_count = 0; + match writer.add_document(doc) { + Ok(_) => { + batch_count += 1; + } + Err(e) => { + eprintln!("[ERROR] Failed to add document: {e:?}"); + tracing::error!("Tantivy: Failed to add document: {e:?}"); + } + } + while let Ok(next_doc) = receiver.try_recv() { + match writer.add_document(next_doc) { + Ok(_) => batch_count += 1, + Err(e) => { + eprintln!("[ERROR] Failed to add document: {e:?}"); + tracing::error!("Tantivy: Failed to add document: {e:?}"); + } + } + } + if batch_count > 0 { + pending_count += batch_count; + } + if pending_count >= commit_threshold { + tracing::info!( + "Tantivy: Reached threshold ({} docs), committing...", + pending_count + ); + fatal_commit(&mut writer); + pending_count = 0; + commit_interval.reset(); + } + } + None => { + tracing::info!("Tantivy: Receiver closed. Finalizing..."); + if pending_count > 0 { + let mut writer = writer.lock().await; + fatal_commit(&mut writer); + } + break; + }, + } + } + _ = commit_interval.tick() => { + if pending_count > 0 { + let mut writer = writer.lock().await; + fatal_commit(&mut writer); + pending_count = 0; + tracing::debug!("Tantivy: Periodic commit finished."); + } + } + _ = shutdown.recv() => { + tracing::info!("Tantivy: Shutdown signal received. Performing final commit..."); + if pending_count > 0 { + let mut writer = writer.lock().await; + fatal_commit(&mut writer); + } + tracing::info!("Tantivy: Shutdown cleanup complete."); + break; + } + } + } + }); + Self { + index: Arc::new(index), + index_writer, + sender, + reader, + query_parser, + handle: Mutex::new(Some(handler)), + } + } + + pub async fn queue(&self, doc: TantivyDocument) { + let _ = self.sender.send(doc).await; + } + + fn open_or_create_index(index_dir: &PathBuf) -> Index { + let need_create = !index_dir.exists() + || index_dir + .read_dir() + .map(|mut d| d.next().is_none()) + .unwrap_or(true); + if need_create { + info!( + "Attachment index not found or empty, creating new index at {}", + index_dir.display() + ); + std::fs::create_dir_all(&index_dir).unwrap_or_else(|e| { + panic!("Failed to create index directory {:?}: {}", index_dir, e) + }); + Index::create_in_dir(&index_dir, SchemaTools::attachment_schema()) + .unwrap_or_else(|e| panic!("Failed to create index in {:?}: {}", index_dir, e)) + } else { + info!( + "Opening existing attachment index at {}", + index_dir.display() + ); + Self::open(&index_dir) + } + } + + fn open(index_dir: &PathBuf) -> Index { + Index::open_in_dir(index_dir) + .unwrap_or_else(|e| panic!("Failed to open index in {:?}: {}", index_dir, e)) + } + + fn account_query(&self, account_id: u64) -> Box { + let account_term = + Term::from_field_u64(SchemaTools::attachment_fields().f_account_id, account_id); + Box::new(TermQuery::new(account_term, IndexRecordOption::Basic)) + } + + fn mailbox_query(&self, account_id: u64, mailbox_id: u64) -> Box { + let account_query = TermQuery::new( + Term::from_field_u64(SchemaTools::attachment_fields().f_account_id, account_id), + IndexRecordOption::Basic, + ); + let mailbox_query = TermQuery::new( + Term::from_field_u64(SchemaTools::attachment_fields().f_mailbox_id, mailbox_id), + IndexRecordOption::Basic, + ); + let boolean_query = BooleanQuery::new(vec![ + (Occur::Must, Box::new(account_query)), + (Occur::Must, Box::new(mailbox_query)), + ]); + Box::new(boolean_query) + } + + fn attachment_query(&self, account_id: u64, aid: &str) -> Box { + let account_id_query = TermQuery::new( + Term::from_field_u64(SchemaTools::attachment_fields().f_account_id, account_id), + IndexRecordOption::Basic, + ); + let envelope_id_query = TermQuery::new( + Term::from_field_text(SchemaTools::attachment_fields().f_id, aid), + IndexRecordOption::Basic, + ); + let boolean_query = BooleanQuery::new(vec![ + (Occur::Must, Box::new(account_id_query)), + (Occur::Must, Box::new(envelope_id_query)), + ]); + Box::new(boolean_query) + } + + fn filter_query( + &self, + accounts: Option>, + filter: AttachmentSearchFilter, + parser: QueryParser, + ) -> BichonResult> { + let f = SchemaTools::attachment_fields(); + let mut subqueries: Vec<(Occur, Box)> = Vec::new(); + + if let Some(authorized_ids) = accounts { + if authorized_ids.is_empty() { + let term = Term::from_field_u64(f.f_account_id, u64::MAX); + subqueries.push(( + Occur::Must, + Box::new(TermQuery::new(term, IndexRecordOption::Basic)), + )); + } else { + let mut account_must_queries = Vec::new(); + for id in authorized_ids { + let term = Term::from_field_u64(f.f_account_id, id); + account_must_queries.push(( + Occur::Should, + Box::new(TermQuery::new(term, IndexRecordOption::Basic)) as Box, + )); + } + subqueries.push(( + Occur::Must, + Box::new(BooleanQuery::new(account_must_queries)), + )); + } + } + + if let Some(ref text) = filter.text { + let query = parser + .parse_query(text) + .map_err(|e| raise_error!(format!("{:#?}", e), ErrorCode::InvalidParameter))?; + subqueries.push((Occur::Must, Box::new(query))); + } + + if let Some(ref subject_val) = filter.subject { + let term = Term::from_field_text(f.f_subject, subject_val); + let query = TermQuery::new(term, IndexRecordOption::Basic); + subqueries.push((Occur::Must, Box::new(query))); + } + + if let Some(ref tags) = filter.tags { + if !tags.is_empty() { + let mut should_queries: Vec<(Occur, Box)> = Vec::new(); + + for tag in tags { + let facet = Facet::from_text(tag).map_err(|e| { + raise_error!(format!("{:#?}", e), ErrorCode::InvalidParameter) + })?; + + let term = Term::from_facet(f.f_tags, &facet); + + should_queries.push(( + Occur::Should, + Box::new(TermQuery::new(term, IndexRecordOption::Basic)), + )); + } + subqueries.push((Occur::Must, Box::new(BooleanQuery::new(should_queries)))); + } + } + + if let Some(from_query) = &filter.from { + let term = Term::from_field_text(f.f_from, from_query); + let query = TermQuery::new(term, IndexRecordOption::Basic); + subqueries.push((Occur::Must, Box::new(query))); + } + + if let Some(ref name) = filter.attachment_name { + let query_parser = + QueryParser::for_index(&self.index, vec![f.f_name_text, f.f_name_exact]); + if let Ok(q) = query_parser.parse_query(name) { + subqueries.push((Occur::Must, q)); + } + } + + if let Some(ref extension) = filter.attachment_extension { + let term = Term::from_field_text(f.f_ext, extension); + let query = TermQuery::new(term, IndexRecordOption::Basic); + subqueries.push((Occur::Must, Box::new(query))); + } + + if let Some(ref category) = filter.attachment_category { + let term = Term::from_field_text(f.f_category, category); + let query = TermQuery::new(term, IndexRecordOption::Basic); + subqueries.push((Occur::Must, Box::new(query))); + } + + if let Some(ref content_type) = filter.attachment_content_type { + let term = Term::from_field_text(f.f_content_type, content_type); + let query = TermQuery::new(term, IndexRecordOption::Basic); + subqueries.push((Occur::Must, Box::new(query))); + } + + let start_bound = if let Some(from) = filter.since { + Bound::Included(Term::from_field_i64(f.f_date, from)) + } else { + Bound::Unbounded + }; + + let end_bound = if let Some(to) = filter.before { + Bound::Included(Term::from_field_i64(f.f_date, to)) + } else { + Bound::Unbounded + }; + + if start_bound != Bound::Unbounded || end_bound != Bound::Unbounded { + let q = RangeQuery::new(start_bound, end_bound); + subqueries.push((Occur::Must, Box::new(q))); + } + + if let Some(account_ids) = filter.account_ids { + let mut should_queries: Vec<(Occur, Box)> = Vec::new(); + for id in account_ids { + let term = Term::from_field_u64(f.f_account_id, id); + should_queries.push(( + Occur::Should, + Box::new(TermQuery::new(term, IndexRecordOption::Basic)), + )); + } + subqueries.push((Occur::Must, Box::new(BooleanQuery::new(should_queries)))); + } + + if let Some(mailbox_ids) = filter.mailbox_ids { + let mut should_queries: Vec<(Occur, Box)> = Vec::new(); + for id in mailbox_ids { + let term = Term::from_field_u64(f.f_mailbox_id, id); + should_queries.push(( + Occur::Should, + Box::new(TermQuery::new(term, IndexRecordOption::Basic)), + )); + } + subqueries.push((Occur::Must, Box::new(BooleanQuery::new(should_queries)))); + } + + let start_bound = if let Some(from) = filter.min_size { + Bound::Included(Term::from_field_u64(f.f_size, from)) + } else { + Bound::Unbounded + }; + + let end_bound = if let Some(to) = filter.max_size { + Bound::Included(Term::from_field_u64(f.f_size, to)) + } else { + Bound::Unbounded + }; + + if start_bound != Bound::Unbounded || end_bound != Bound::Unbounded { + let q = RangeQuery::new(start_bound, end_bound); + subqueries.push((Occur::Must, Box::new(q))); + } + + let mut add_bool_filter = |field: Field, value: Option| { + if let Some(v) = value { + let term = Term::from_field_bool(field, v); + let query = TermQuery::new(term, IndexRecordOption::Basic); + subqueries.push((Occur::Must, Box::new(query))); + } + }; + + add_bool_filter(f.f_is_ocr, filter.is_ocr); + add_bool_filter(f.f_is_message, filter.is_message); + add_bool_filter(f.f_has_text, filter.has_text); + + let start_bound = if let Some(from) = filter.min_page_count { + Bound::Included(Term::from_field_u64(f.f_page_count, from)) + } else { + Bound::Unbounded + }; + + let end_bound = if let Some(to) = filter.max_page_count { + Bound::Included(Term::from_field_u64(f.f_page_count, to)) + } else { + Bound::Unbounded + }; + + if start_bound != Bound::Unbounded || end_bound != Bound::Unbounded { + let q = RangeQuery::new(start_bound, end_bound); + subqueries.push((Occur::Must, Box::new(q))); + } + + if subqueries.is_empty() { + return Ok(Box::new(AllQuery)); + } + + Ok(Box::new(BooleanQuery::new(subqueries))) + } + + pub async fn get_attachment_by_id( + &self, + account_id: u64, + id: &str, + ) -> BichonResult> { + let searcher = self.create_searcher()?; + let f = SchemaTools::attachment_fields(); + + let query = BooleanQuery::new(vec![ + ( + Occur::Must, + Box::new(TermQuery::new( + Term::from_field_u64(f.f_account_id, account_id), + IndexRecordOption::Basic, + )), + ), + ( + Occur::Must, + Box::new(TermQuery::new( + Term::from_field_text(f.f_id, id), + IndexRecordOption::Basic, + )), + ), + ]); + + let docs: Vec<(f32, DocAddress)> = searcher + .search(&query, &TopDocs::with_limit(1).order_by_score()) + .map_err(|e| raise_error!(format!("{:#?}", e), ErrorCode::InternalError))?; + + if let Some((_, doc_address)) = docs.first() { + let doc: TantivyDocument = searcher + .doc(*doc_address) + .map_err(|e| raise_error!(format!("{:#?}", e), ErrorCode::InternalError))?; + let attachment = AttachmentModel::from_tantivy_doc(&doc)?; + Ok(Some(attachment)) + } else { + Ok(None) + } + } + + pub async fn top_10_largest_attachments( + &self, + accounts: &Option>, + ) -> BichonResult> { + self.reader + .reload() + .map_err(|e| raise_error!(format!("{:#?}", e), ErrorCode::InternalError))?; + let searcher = self.reader.searcher(); + + let query: Box = match accounts { + Some(ref ids) if !ids.is_empty() => { + let mut subqueries = Vec::new(); + for &id in ids { + let term = + Term::from_field_u64(SchemaTools::attachment_fields().f_account_id, id); + subqueries.push(( + Occur::Should, + Box::new(TermQuery::new(term, IndexRecordOption::Basic)) as Box, + )); + } + Box::new(BooleanQuery::new(subqueries)) + } + Some(_) => Box::new(EmptyQuery), + None => Box::new(AllQuery), + }; + + let attachment_docs: Vec<(Option, DocAddress)> = searcher + .search( + &query, + &TopDocs::with_limit(10).order_by_fast_field(F_SIZE, Order::Desc), + ) + .map_err(|e| raise_error!(format!("{:#?}", e), ErrorCode::InternalError))?; + + let mut result = Vec::new(); + for (_, doc_address) in attachment_docs { + let doc: TantivyDocument = searcher + .doc(doc_address) + .map_err(|e| raise_error!(format!("{:#?}", e), ErrorCode::InternalError))?; + let att = LargestAttachment::from_tantivy_doc(&doc)?; + result.push(att); + } + Ok(result) + } + + pub async fn delete_account_attachments(&self, account_id: u64) -> BichonResult<()> { + let query = self.account_query(account_id); + let mut writer = self.index_writer.lock().await; + writer + .delete_query(query) + .map_err(|e| raise_error!(format!("{:#?}", e), ErrorCode::InternalError))?; + writer + .commit() + .map_err(|e| raise_error!(format!("{:#?}", e), ErrorCode::InternalError))?; + Ok(()) + } + + pub async fn delete_mailbox_envelopes( + &self, + account_id: u64, + mailbox_ids: Vec, + ) -> BichonResult<()> { + if mailbox_ids.is_empty() { + return Ok(()); + } + + let mut queries: Vec> = Vec::with_capacity(mailbox_ids.len()); + for mailbox_id in mailbox_ids { + queries.push(self.mailbox_query(account_id, mailbox_id)); + } + let mut writer = self.index_writer.lock().await; + for query in queries { + writer + .delete_query(query) + .map_err(|e| raise_error!(format!("{:#?}", e), ErrorCode::InternalError))?; + } + writer + .commit() + .map_err(|e| raise_error!(format!("{:#?}", e), ErrorCode::InternalError))?; + Ok(()) + } + + pub async fn delete_envelopes_multi_account( + &self, + deletes: HashMap>, + ) -> BichonResult<()> { + if deletes.is_empty() { + tracing::warn!("delete_envelopes_multi_account: deletes is empty, nothing to delete"); + return Ok(()); + } + + let mut writer = self.index_writer.lock().await; + for (account_id, envelope_ids) in deletes { + let unique_ids: HashSet<&String> = envelope_ids.iter().collect(); + if unique_ids.is_empty() { + continue; + } + for eid in unique_ids { + let query = self.attachment_query(account_id, eid); + writer + .delete_query(query) + .map_err(|e| raise_error!(format!("{:#?}", e), ErrorCode::InternalError))?; + } + } + writer + .commit() + .map_err(|e| raise_error!(format!("{:#?}", e), ErrorCode::InternalError))?; + Ok(()) + } + + fn collect_facets_recursive( + query: &dyn Query, + searcher: &Searcher, + parent_facet: &str, + all_facets: &mut Vec, + field_name: &str, + ) -> BichonResult<()> { + let mut facet_collector = FacetCollector::for_field(field_name); + facet_collector.add_facet(parent_facet); + + let facet_counts = searcher + .search(query, &facet_collector) + .map_err(|e| raise_error!(format!("{:#?}", e), ErrorCode::InternalError))?; + + for (facet, count) in facet_counts.get(parent_facet) { + all_facets.push(TagCount { + tag: facet.to_string(), + count, + }); + Self::collect_facets_recursive( + query, + searcher, + &facet.to_string(), + all_facets, + field_name, + )?; + } + + Ok(()) + } + + pub async fn get_all_tags( + &self, + accounts: Option>, + ) -> BichonResult> { + let searcher = self.reader.searcher(); + + let query: Box = match accounts { + Some(ref ids) if !ids.is_empty() => { + let mut subqueries = Vec::new(); + for &id in ids { + let term = + Term::from_field_u64(SchemaTools::attachment_fields().f_account_id, id); + subqueries.push(( + Occur::Should, + Box::new(TermQuery::new(term, IndexRecordOption::Basic)) as Box, + )); + } + Box::new(BooleanQuery::new(subqueries)) + } + Some(_) => Box::new(EmptyQuery), + None => Box::new(AllQuery), + }; + + let mut all_facets = Vec::new(); + Self::collect_facets_recursive(&query, &searcher, "/", &mut all_facets, F_TAGS)?; + Ok(all_facets) + } + + pub async fn update_attachment_tags(&self, request: TagsRequest) -> BichonResult<()> { + if request.updates.is_empty() { + tracing::warn!("update_attachment_tags: request is empty, nothing to update"); + return Ok(()); + } + let searcher = self.create_searcher()?; + let mut writer = self.index_writer.lock().await; + + let f_tags = SchemaTools::attachment_fields().f_tags; + let f_id = SchemaTools::attachment_fields().f_id; + let deduplicated_updates: HashMap> = request + .updates + .into_iter() + .map(|(account_id, envelope_ids)| (account_id, envelope_ids.into_iter().collect())) + .collect(); + + let mut operations = Vec::new(); + + for (account_id, att_ids) in &deduplicated_updates { + for aid in att_ids { + let query = self.attachment_query(*account_id, aid); + let docs = searcher + .search(query.as_ref(), &TopDocs::with_limit(1).order_by_score()) + .map_err(|e| raise_error!(format!("{:#?}", e), ErrorCode::InternalError))?; + + if let Some((_, doc_address)) = docs.first() { + let old_doc: TantivyDocument = searcher + .doc(*doc_address) + .map_err(|e| raise_error!(format!("{:#?}", e), ErrorCode::InternalError))?; + + let mut current_tags: HashSet = old_doc + .get_all(f_tags) + .filter_map(|val| val.as_facet()) + .map(|facet| facet.to_string()) + .collect(); + + match request.action { + TagAction::Add => { + for tag in &request.tags { + current_tags.insert(tag.clone()); + } + } + TagAction::Remove => { + for tag in &request.tags { + current_tags.remove(tag); + } + } + TagAction::Overwrite => { + current_tags = request.tags.iter().cloned().collect(); + } + } + + let mut new_doc = TantivyDocument::new(); + + for (field, value) in old_doc.field_values() { + if field != f_tags { + new_doc.add_field_value(field, value); + } + } + for tag in current_tags { + new_doc.add_facet(f_tags, &tag); + } + + let delete_term = Term::from_field_text(f_id, aid); + operations.push(UserOperation::Delete(delete_term)); + operations.push(UserOperation::Add(new_doc)); + } + } + } + + writer + .run(operations) + .map_err(|e| raise_error!(format!("{:#?}", e), ErrorCode::InternalError))?; + + // commit + writer + .commit() + .map_err(|e| raise_error!(format!("{:#?}", e), ErrorCode::InternalError))?; + + Ok(()) + } + + pub async fn search( + &self, + accounts: Option>, + filter: AttachmentSearchFilter, + page: u64, + page_size: u64, + desc: bool, + sort_by: SortBy, + ) -> BichonResult> { + assert!(page > 0, "Page number must be greater than 0"); + assert!(page_size > 0, "Page size must be greater than 0"); + let query = self.filter_query(accounts, filter, self.query_parser.clone())?; + let searcher = self.create_searcher()?; + let total = searcher + .search(&query, &Count) + .map_err(|e| raise_error!(format!("{:#?}", e), ErrorCode::InternalError))? + as u64; + + if total == 0 { + return Ok(DataPage { + current_page: Some(page), + page_size: Some(page_size), + total_items: 0, + items: vec![], + total_pages: Some(0), + }); + } + let offset = (page - 1) * page_size; + let total_pages = total.div_ceil(page_size); + if offset > total { + return Ok(DataPage { + current_page: Some(page), + page_size: Some(page_size), + total_items: total, + items: vec![], + total_pages: Some(total_pages), + }); + } + + let order = if desc { Order::Desc } else { Order::Asc }; + let attachment_docs: Vec; + + match sort_by { + SortBy::DATE => { + let date_docs: Vec<(Option, DocAddress)> = searcher + .search( + &query, + &TopDocs::with_limit(page_size as usize) + .and_offset(offset as usize) + .order_by_fast_field(F_DATE, order), + ) + .map_err(|e| raise_error!(format!("{:#?}", e), ErrorCode::InternalError))?; + attachment_docs = date_docs.into_iter().map(|(_, addr)| addr).collect(); + } + SortBy::SIZE => { + let size_docs: Vec<(Option, DocAddress)> = searcher + .search( + &query, + &TopDocs::with_limit(page_size as usize) + .and_offset(offset as usize) + .order_by_fast_field(F_SIZE, order), + ) + .map_err(|e| raise_error!(format!("{:#?}", e), ErrorCode::InternalError))?; + attachment_docs = size_docs.into_iter().map(|(_, addr)| addr).collect(); + } + } + + let mut result = Vec::new(); + + for doc_address in attachment_docs { + let doc: TantivyDocument = searcher + .doc(doc_address) + .map_err(|e| raise_error!(format!("{:#?}", e), ErrorCode::InternalError))?; + let envelope = AttachmentModel::from_tantivy_doc(&doc)?; + result.push(envelope); + } + Ok(DataPage { + current_page: Some(page), + page_size: Some(page_size), + total_items: total, + items: result, + total_pages: Some(total_pages), + }) + } + + fn create_searcher(&self) -> BichonResult { + self.reader + .reload() + .map_err(|e| raise_error!(format!("{:#?}", e), ErrorCode::InternalError))?; + Ok(self.reader.searcher()) + } + + pub async fn get_all_senders( + &self, + accounts: Option>, + ) -> BichonResult> { + let searcher = self.create_searcher()?; + + let query: Box = match accounts { + Some(ref ids) if !ids.is_empty() => { + let mut subqueries = Vec::new(); + for &id in ids { + let term = + Term::from_field_u64(SchemaTools::attachment_fields().f_account_id, id); + subqueries.push(( + Occur::Should, + Box::new(TermQuery::new(term, IndexRecordOption::Basic)) as Box, + )); + } + Box::new(BooleanQuery::new(subqueries)) + } + Some(_) => Box::new(EmptyQuery), + None => Box::new(AllQuery), + }; + + let mut contacts_set: HashSet = HashSet::new(); + + let top_docs = searcher + .search(&query, &TopDocs::with_limit(1_000_000).order_by_score()) + .map_err(|e| raise_error!(format!("{:#?}", e), ErrorCode::InternalError))?; + + for (_score, doc_address) in top_docs { + let doc: TantivyDocument = searcher + .doc(doc_address) + .map_err(|e| raise_error!(format!("{:#?}", e), ErrorCode::InternalError))?; + let contacts = extract_senders(&doc).await?; + for value in contacts { + contacts_set.insert(value); + } + } + Ok(contacts_set) + } + + pub fn collect_attachment_metadata( + &self, + accounts: Option>, + ) -> BichonResult { + let searcher = self.create_searcher()?; + let aggregations: Aggregations = serde_json::from_value(json!({ + "exts": { + "terms": { + "field": F_ATTACHMENT_EXT, + "size": 1000 + } + }, + "cats": { + "terms": { + "field": F_ATTACHMENT_CATEGORY, + "size": 1000 + } + }, + "content_types": { + "terms": { + "field": F_ATTACHMENT_CONTENT_TYPE, + "size": 1000 + } + }, + })) + .unwrap(); + + let query: Box = match accounts { + Some(ref ids) if !ids.is_empty() => { + let mut subqueries = Vec::new(); + for &id in ids { + let term = + Term::from_field_u64(SchemaTools::attachment_fields().f_account_id, id); + subqueries.push(( + Occur::Should, + Box::new(TermQuery::new(term, IndexRecordOption::Basic)) as Box, + )); + } + Box::new(BooleanQuery::new(subqueries)) + } + Some(_) => Box::new(EmptyQuery), + None => Box::new(AllQuery), + }; + + let agg_collector = AggregationCollector::from_aggs(aggregations, Default::default()); + let agg_results = searcher + .search(&query, &agg_collector) + .map_err(|e| raise_error!(format!("{:#?}", e), ErrorCode::InternalError))?; + + let mut exts = Vec::with_capacity(20); + let extensions = agg_results.0.get("exts").unwrap(); + if let AggregationResult::BucketResult(BucketResult::Terms { buckets, .. }) = extensions { + for entry in buckets { + if let Key::Str(ext) = &entry.key { + exts.push(Group { + key: ext.clone(), + count: entry.doc_count, + }); + } + } + } + + let mut cats = Vec::with_capacity(20); + let categories = agg_results.0.get("cats").unwrap(); + if let AggregationResult::BucketResult(BucketResult::Terms { buckets, .. }) = categories { + for entry in buckets { + if let Key::Str(cat) = &entry.key { + cats.push(Group { + key: cat.clone(), + count: entry.doc_count, + }); + } + } + } + + let mut ctypes = Vec::with_capacity(20); + let content_types = agg_results.0.get("content_types").unwrap(); + if let AggregationResult::BucketResult(BucketResult::Terms { buckets, .. }) = content_types + { + for entry in buckets { + if let Key::Str(content_type) = &entry.key { + ctypes.push(Group { + key: content_type.clone(), + count: entry.doc_count, + }); + } + } + } + + Ok(AttachmentMetadata { + extensions: exts, + categories: cats, + content_types: ctypes, + }) + } +} diff --git a/src/modules/store/tantivy/manager.rs b/src/modules/store/tantivy/envelope.rs similarity index 88% rename from src/modules/store/tantivy/manager.rs rename to src/modules/store/tantivy/envelope.rs index b907589..e3856c1 100644 --- a/src/modules/store/tantivy/manager.rs +++ b/src/modules/store/tantivy/envelope.rs @@ -31,8 +31,7 @@ use crate::{ dashboard::{DashboardStats, Group, LargestEmail, TimeBucket}, error::{code::ErrorCode, BichonResult}, message::{ - attachment::AttachmentMetadata, - search::{SearchFilter, SortBy}, + search::{EmailSearchFilter, SortBy}, tags::{TagAction, TagCount, TagsRequest}, }, rest::response::DataPage, @@ -41,9 +40,9 @@ use crate::{ envelope::Envelope, storage::BLOB_MANAGER, tantivy::{ + fatal_commit, fields::{ - F_ACCOUNT_ID, F_ATTACHMENT_CATEGORY, F_ATTACHMENT_CONTENT_TYPE, - F_ATTACHMENT_EXT, F_DATE, F_FROM, F_REGULAR_ATTACHMENT_COUNT, F_SIZE, F_TAGS, + F_ACCOUNT_ID, F_DATE, F_FROM, F_REGULAR_ATTACHMENT_COUNT, F_SIZE, F_TAGS, F_THREAD_ID, F_UID, }, model::{extract_contacts, EnvelopeWithAttachments}, @@ -77,9 +76,10 @@ use tokio::{ }; use tracing::{info, warn}; -pub static INDEX_MANAGER: LazyLock = LazyLock::new(IndexManager::new); +pub static ENVELOPE_MANAGER: LazyLock = LazyLock::new(IndexManager::new); pub struct IndexManager { + index: Arc, index_writer: Arc>, sender: mpsc::Sender, reader: IndexReader, @@ -95,18 +95,18 @@ impl IndexManager { } } pub fn new() -> Self { - let index = Self::open_or_create_index(&DATA_DIR_MANAGER.tantivy_dir); + let index = Self::open_or_create_index(&DATA_DIR_MANAGER.envelope_dir); let mut merge_policy = LogMergePolicy::default(); merge_policy.set_min_num_segments(25); merge_policy.set_min_layer_size(10_000); merge_policy.set_max_docs_before_merge(100_000); let index_writer = index - .writer_with_num_threads(4, 134_217_728) + .writer_with_num_threads(4, 67_108_864) .unwrap_or_else(|e| { panic!( - "Failed to create IndexWriter with 4 threads and 128MB buffer for {:?}: {}", - &DATA_DIR_MANAGER.tantivy_dir, e + "Failed to create IndexWriter with 4 threads and 64MB buffer for {:?}: {}", + &DATA_DIR_MANAGER.envelope_dir, e ) }); index_writer.set_merge_policy(Box::new(merge_policy)); @@ -114,7 +114,7 @@ impl IndexManager { let reader = index.reader().unwrap_or_else(|e| { panic!( "Failed to create IndexReader for {:?}: {}", - &DATA_DIR_MANAGER.tantivy_dir, e + &DATA_DIR_MANAGER.envelope_dir, e ) }); let mut query_parser = QueryParser::for_index(&index, SchemaTools::email_default_fields()); @@ -125,7 +125,7 @@ impl IndexManager { let writer = index_writer.clone(); let handler = task::spawn(async move { let mut shutdown = SIGNAL_MANAGER.subscribe(); - let mut commit_interval = tokio::time::interval(Duration::from_secs(30)); + let mut commit_interval = tokio::time::interval(Duration::from_secs(60)); let mut pending_count = 0; let commit_threshold = 1000; loop { @@ -134,17 +134,33 @@ impl IndexManager { match maybe_msg { Some(doc) => { let mut writer = writer.lock().await; - if let Err(e) = writer.add_document(doc) { - eprintln!("[ERROR] Failed to add document: {e:?}"); - tracing::error!("Tantivy: Failed to add document: {e:?}"); + let mut batch_count = 0; + match writer.add_document(doc) { + Ok(_) => { + batch_count += 1; + } + Err(e) => { + eprintln!("[ERROR] Failed to add document: {e:?}"); + tracing::error!("Tantivy: Failed to add document: {e:?}"); + } } - pending_count += 1; while let Ok(next_doc) = receiver.try_recv() { - let _ = writer.add_document(next_doc); - pending_count += 1; + match writer.add_document(next_doc) { + Ok(_) => batch_count += 1, + Err(e) => { + eprintln!("[ERROR] Failed to add document: {e:?}"); + tracing::error!("Tantivy: Failed to add document: {e:?}"); + } + } + } + if batch_count > 0 { + pending_count += batch_count; } if pending_count >= commit_threshold { - tracing::info!("Tantivy: Reached threshold ({}), committing...", pending_count); + tracing::info!( + "Tantivy: Reached threshold ({} docs), committing...", + pending_count + ); fatal_commit(&mut writer); pending_count = 0; commit_interval.reset(); @@ -181,6 +197,7 @@ impl IndexManager { } }); Self { + index: Arc::new(index), index_writer, sender, reader, @@ -261,7 +278,7 @@ impl IndexManager { fn filter_query( &self, accounts: Option>, - filter: SearchFilter, + filter: EmailSearchFilter, parser: QueryParser, ) -> BichonResult> { let f = SchemaTools::email_fields(); @@ -359,8 +376,15 @@ impl IndexManager { } if let Some(ref name) = filter.attachment_name { - if let Ok(query) = RegexQuery::from_pattern(name.as_str(), f.f_attachment_name) { - subqueries.push((Occur::Must, Box::new(query))); + if name.contains('.') { + let term = Term::from_field_text(f.f_attachment_name_exact, name); + let query = TermQuery::new(term, IndexRecordOption::Basic); + subqueries.push((Occur::Should, Box::new(query))); + } + + let query_parser = QueryParser::for_index(&self.index, vec![f.f_attachment_name_text]); + if let Ok(q) = query_parser.parse_query(name) { + subqueries.push((Occur::Must, q)); } } @@ -978,7 +1002,7 @@ impl IndexManager { pub async fn search( &self, accounts: Option>, - filter: SearchFilter, + filter: EmailSearchFilter, page: u64, page_size: u64, desc: bool, @@ -1179,102 +1203,6 @@ impl IndexManager { }) } - pub fn collect_attachment_metadata( - &self, - accounts: Option>, - ) -> BichonResult { - let searcher = self.create_searcher()?; - - let aggregations: Aggregations = serde_json::from_value(json!({ - "exts": { - "terms": { - "field": F_ATTACHMENT_EXT, - "size": 1000 - } - }, - "cats": { - "terms": { - "field": F_ATTACHMENT_CATEGORY, - "size": 1000 - } - }, - "content_types": { - "terms": { - "field": F_ATTACHMENT_CONTENT_TYPE, - "size": 1000 - } - }, - })) - .unwrap(); - - let query: Box = match accounts { - Some(ref ids) if !ids.is_empty() => { - let mut subqueries = Vec::new(); - for &id in ids { - let term = Term::from_field_u64(SchemaTools::email_fields().f_account_id, id); - subqueries.push(( - Occur::Should, - Box::new(TermQuery::new(term, IndexRecordOption::Basic)) as Box, - )); - } - Box::new(BooleanQuery::new(subqueries)) - } - Some(_) => Box::new(EmptyQuery), - None => Box::new(AllQuery), - }; - - let agg_collector = AggregationCollector::from_aggs(aggregations, Default::default()); - let agg_results = searcher - .search(&query, &agg_collector) - .map_err(|e| raise_error!(format!("{:#?}", e), ErrorCode::InternalError))?; - - let mut exts = Vec::with_capacity(20); - let extensions = agg_results.0.get("exts").unwrap(); - if let AggregationResult::BucketResult(BucketResult::Terms { buckets, .. }) = extensions { - for entry in buckets { - if let Key::Str(ext) = &entry.key { - exts.push(Group { - key: ext.clone(), - count: entry.doc_count, - }); - } - } - } - - let mut cats = Vec::with_capacity(20); - let categories = agg_results.0.get("cats").unwrap(); - if let AggregationResult::BucketResult(BucketResult::Terms { buckets, .. }) = categories { - for entry in buckets { - if let Key::Str(cat) = &entry.key { - cats.push(Group { - key: cat.clone(), - count: entry.doc_count, - }); - } - } - } - - let mut ctypes = Vec::with_capacity(20); - let content_types = agg_results.0.get("content_types").unwrap(); - if let AggregationResult::BucketResult(BucketResult::Terms { buckets, .. }) = content_types - { - for entry in buckets { - if let Key::Str(content_type) = &entry.key { - ctypes.push(Group { - key: content_type.clone(), - count: entry.doc_count, - }); - } - } - } - - Ok(AttachmentMetadata { - extensions: exts, - categories: cats, - content_types: ctypes, - }) - } - pub async fn get_dashboard_stats( &self, accounts: &Option>, @@ -1422,7 +1350,7 @@ impl IndexManager { let account_id = *account_id; tokio::spawn(async move { if let Err(e) = - INDEX_MANAGER.delete_account_envelopes(account_id).await + ENVELOPE_MANAGER.delete_account_envelopes(account_id).await { tracing::error!( account_id = account_id, @@ -1469,46 +1397,3 @@ impl IndexManager { Ok(stats) } } - -fn fatal_commit(writer: &mut IndexWriter) { - const MAX_RETRIES: usize = 3; - const RETRY_DELAY_MS: u64 = 1000; - - for attempt in 0..=MAX_RETRIES { - match writer.commit() { - Ok(_) => { - if attempt > 0 { - eprintln!("[INFO] Commit succeeded on attempt {}", attempt + 1); - } - return; - } - Err(e) => match &e { - tantivy::TantivyError::IoError(io_error) => { - if attempt < MAX_RETRIES { - eprintln!( - "[WARN] Commit failed (attempt {}/{}): {:?}. Retrying in {}ms...", - attempt + 1, - MAX_RETRIES + 1, - io_error, - RETRY_DELAY_MS * (attempt as u64 + 1) - ); - std::thread::sleep(std::time::Duration::from_millis( - RETRY_DELAY_MS * (attempt as u64 + 1), - )); - } else { - eprintln!( - "[FATAL] Tantivy commit failed after {} attempts: {:?}", - MAX_RETRIES + 1, - io_error - ); - std::process::exit(1); - } - } - _ => { - eprintln!("[FATAL] Tantivy commit failed with non-IO error: {e:?}"); - std::process::exit(1); - } - }, - } - } -} diff --git a/src/modules/store/tantivy/fields.rs b/src/modules/store/tantivy/fields.rs index 3c656fc..e2f4e04 100644 --- a/src/modules/store/tantivy/fields.rs +++ b/src/modules/store/tantivy/fields.rs @@ -39,13 +39,24 @@ pub const F_THREAD_ID: &str = "thread_id"; pub const F_ATTACHMENT_COUNT: &str = "attachment_count"; pub const F_REGULAR_ATTACHMENT_COUNT: &str = "regular_attachment_count"; pub const F_ATTACHMENTS: &str = "attachments"; -pub const F_ATTACHMENT_NAME: &str = "attachment_name"; +pub const F_ATTACHMENT_NAME_TEXT: &str = "attachment_name_text"; +pub const F_ATTACHMENT_NAME_EXACT: &str = "attachment_name_exact"; pub const F_ATTACHMENT_CONTENT_HASH: &str = "attachment_content_hash"; pub const F_ATTACHMENT_EXT: &str = "attachment_ext"; pub const F_ATTACHMENT_CATEGORY: &str = "attachment_category"; pub const F_ATTACHMENT_CONTENT_TYPE: &str = "attachment_content_type"; +pub const F_ENVELOPE_ID: &str = "eid"; +pub const F_TEXT: &str = "text"; +pub const F_HAS_TEXT: &str = "has_text"; +pub const F_IS_OCR: &str = "is_ocr"; +pub const F_IS_INDEXED: &str = "is_indexed"; +pub const F_IS_MESSAGE: &str = "is_message"; +pub const F_NAME_TEXT: &str = "name_text"; +pub const F_NAME_EXACT: &str = "name_exact"; +pub const F_PAGE_COUNT: &str = "page_count"; pub const F_TAGS: &str = "tags"; +pub const F_AUTO_TAGS: &str = "auto_tags"; pub const F_SHARD_ID: &str = "shard_id"; pub struct EmailFields { @@ -70,7 +81,8 @@ pub struct EmailFields { pub f_attachment_count: Field, pub f_regular_attachment_count: Field, pub f_attachments: Field, - pub f_attachment_name: Field, + pub f_attachment_name_text: Field, + pub f_attachment_name_exact: Field, pub f_attachment_content_hash: Field, pub f_attachment_ext: Field, pub f_attachment_category: Field, @@ -78,3 +90,30 @@ pub struct EmailFields { pub f_tags: Field, pub f_shard_id: Field, } + +pub struct AttachmentFields { + pub f_id: Field, + pub f_envelope_id: Field, // envelope id + pub f_account_id: Field, + pub f_mailbox_id: Field, + pub f_from: Field, + pub f_subject: Field, + pub f_content_hash: Field, + pub f_text: Field, + pub f_has_text: Field, + pub f_is_ocr: Field, + pub f_page_count: Field, + pub f_is_indexed: Field, + pub f_ingest_at: Field, + pub f_date: Field, + pub f_size: Field, + pub f_is_message: Field, + pub f_name_text: Field, // TEXT + pub f_name_exact: Field, // STRING + pub f_ext: Field, + pub f_category: Field, + pub f_content_type: Field, + pub f_shard_id: Field, + pub f_tags: Field, + pub f_auto_tags: Field, +} diff --git a/src/modules/store/tantivy/mod.rs b/src/modules/store/tantivy/mod.rs index e3cf3b2..665f7de 100644 --- a/src/modules/store/tantivy/mod.rs +++ b/src/modules/store/tantivy/mod.rs @@ -16,7 +16,53 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . +use tantivy::IndexWriter; + +pub mod attachment; +pub mod envelope; pub mod fields; -pub mod manager; pub mod model; pub mod schema; + +pub fn fatal_commit(writer: &mut IndexWriter) { + const MAX_RETRIES: usize = 3; + const RETRY_DELAY_MS: u64 = 1000; + + for attempt in 0..=MAX_RETRIES { + match writer.commit() { + Ok(_) => { + if attempt > 0 { + eprintln!("[INFO] Commit succeeded on attempt {}", attempt + 1); + } + return; + } + Err(e) => match &e { + tantivy::TantivyError::IoError(io_error) => { + if attempt < MAX_RETRIES { + eprintln!( + "[WARN] Commit failed (attempt {}/{}): {:?}. Retrying in {}ms...", + attempt + 1, + MAX_RETRIES + 1, + io_error, + RETRY_DELAY_MS * (attempt as u64 + 1) + ); + std::thread::sleep(std::time::Duration::from_millis( + RETRY_DELAY_MS * (attempt as u64 + 1), + )); + } else { + eprintln!( + "[FATAL] Tantivy commit failed after {} attempts: {:?}", + MAX_RETRIES + 1, + io_error + ); + std::process::exit(1); + } + } + _ => { + eprintln!("[FATAL] Tantivy commit failed with non-IO error: {e:?}"); + std::process::exit(1); + } + }, + } + } +} diff --git a/src/modules/store/tantivy/model.rs b/src/modules/store/tantivy/model.rs index f31e7d6..5c0533f 100644 --- a/src/modules/store/tantivy/model.rs +++ b/src/modules/store/tantivy/model.rs @@ -1,3 +1,5 @@ +use poem_openapi::Object; +use serde::{Deserialize, Serialize}; use std::collections::HashSet; use tantivy::{schema::Value, TantivyDocument}; @@ -7,7 +9,19 @@ use crate::{ cache::imap::mailbox::MailBox, error::{code::ErrorCode, BichonResult}, message::content::AttachmentInfo, - store::{envelope::Envelope, tantivy::schema::SchemaTools}, + store::{ + envelope::Envelope, + tantivy::{ + fields::{ + F_ACCOUNT_ID, F_ATTACHMENTS, F_ATTACHMENT_CATEGORY, F_ATTACHMENT_CONTENT_TYPE, + F_ATTACHMENT_COUNT, F_CONTENT_HASH, F_DATE, F_ENVELOPE_ID, F_FROM, F_HAS_TEXT, + F_ID, F_INGEST_AT, F_INTERNAL_DATE, F_IS_INDEXED, F_IS_MESSAGE, F_IS_OCR, + F_MAILBOX_ID, F_MESSAGE_ID, F_PREVIEW, F_REGULAR_ATTACHMENT_COUNT, F_SHARD_ID, + F_SIZE, F_SUBJECT, F_TEXT, F_THREAD_ID, F_UID, + }, + schema::SchemaTools, + }, + }, }, raise_error, }; @@ -56,7 +70,8 @@ impl EnvelopeWithAttachments { for att in atts { if !att.is_inline() { if let Some(ref filename) = att.filename { - doc.add_text(fields.f_attachment_name, filename); + doc.add_text(fields.f_attachment_name_text, filename); + doc.add_text(fields.f_attachment_name_exact, filename); } if let Some(ext) = att.get_extension() { doc.add_text(fields.f_attachment_ext, ext); @@ -85,7 +100,7 @@ impl EnvelopeWithAttachments { pub fn from_tantivy_doc(doc: &TantivyDocument) -> BichonResult { let fields = SchemaTools::email_fields(); - let attachments_raw = extract_string_field(doc, fields.f_attachments).ok(); + let attachments_raw = extract_string_field(doc, fields.f_attachments, F_ATTACHMENTS).ok(); let attachments: Option> = attachments_raw.and_then(|json| serde_json::from_str(&json).ok()); @@ -95,35 +110,39 @@ impl EnvelopeWithAttachments { .map(|f| f.to_string()) .collect(); - let account_id = extract_u64_field(doc, fields.f_account_id)?; - let mailbox_id = extract_u64_field(doc, fields.f_mailbox_id)?; + let account_id = extract_u64_field(doc, fields.f_account_id, F_ACCOUNT_ID)?; + let mailbox_id = extract_u64_field(doc, fields.f_mailbox_id, F_MAILBOX_ID)?; let account = AccountModel::get(account_id)?; let mailbox = MailBox::get(mailbox_id)?; let envelope = Envelope { - id: extract_string_field(doc, fields.f_id)?, - message_id: extract_string_field(doc, fields.f_message_id)?, + id: extract_string_field(doc, fields.f_id, F_ID)?, + message_id: extract_string_field(doc, fields.f_message_id, F_MESSAGE_ID)?, account_id, account_email: Some(account.email), mailbox_id, mailbox_name: Some(mailbox.name), - uid: extract_u64_field(doc, fields.f_uid)? as u32, - subject: extract_string_field(doc, fields.f_subject)?, - preview: extract_string_field(doc, fields.f_preview).unwrap_or_default(), - from: extract_string_field(doc, fields.f_from)?, + uid: extract_u64_field(doc, fields.f_uid, F_UID)? as u32, + subject: extract_string_field(doc, fields.f_subject, F_SUBJECT)?, + preview: extract_string_field(doc, fields.f_preview, F_PREVIEW).unwrap_or_default(), + from: extract_string_field(doc, fields.f_from, F_FROM)?, to: extract_vec_string_field(doc, fields.f_to)?, cc: extract_vec_string_field(doc, fields.f_cc)?, bcc: extract_vec_string_field(doc, fields.f_bcc)?, - date: extract_i64_field(doc, fields.f_date)?, - internal_date: extract_i64_field(doc, fields.f_internal_date)?, - size: extract_u64_field(doc, fields.f_size)? as u32, - thread_id: extract_string_field(doc, fields.f_thread_id)?, - attachment_count: extract_u64_field(doc, fields.f_attachment_count)? as usize, - regular_attachment_count: extract_u64_field(doc, fields.f_regular_attachment_count)? + date: extract_i64_field(doc, fields.f_date, F_DATE)?, + internal_date: extract_i64_field(doc, fields.f_internal_date, F_INTERNAL_DATE)?, + size: extract_u64_field(doc, fields.f_size, F_SIZE)? as u32, + thread_id: extract_string_field(doc, fields.f_thread_id, F_THREAD_ID)?, + attachment_count: extract_u64_field(doc, fields.f_attachment_count, F_ATTACHMENT_COUNT)? as usize, + regular_attachment_count: extract_u64_field( + doc, + fields.f_regular_attachment_count, + F_REGULAR_ATTACHMENT_COUNT, + )? as usize, tags: if tags.is_empty() { None } else { Some(tags) }, - content_hash: extract_string_field(doc, fields.f_content_hash)?, - ingest_at: extract_i64_field(doc, fields.f_ingest_at)?, + content_hash: extract_string_field(doc, fields.f_content_hash, F_CONTENT_HASH)?, + ingest_at: extract_i64_field(doc, fields.f_ingest_at, F_INGEST_AT)?, }; Ok(EnvelopeWithAttachments { @@ -136,16 +155,37 @@ impl EnvelopeWithAttachments { fn extract_u64_field( document: &TantivyDocument, field: tantivy::schema::Field, + field_name: &str, ) -> BichonResult { + extract_option_u64_field(document, field)?.ok_or_else(|| { + raise_error!( + format!("'{}' field is not a u64", field_name), + ErrorCode::InternalError + ) + }) +} + +fn extract_option_u64_field( + document: &TantivyDocument, + field: tantivy::schema::Field, +) -> BichonResult> { + Ok(document.get_first(field).and_then(|v| v.as_u64())) +} + +fn extract_bool_field( + document: &TantivyDocument, + field: tantivy::schema::Field, + field_name: &str, +) -> BichonResult { let value = document.get_first(field).ok_or_else(|| { raise_error!( - format!("miss '{}' field in tantivy document", stringify!(field)), + format!("miss '{}' field in tantivy document", field_name), ErrorCode::InternalError ) })?; - value.as_u64().ok_or_else(|| { + value.as_bool().ok_or_else(|| { raise_error!( - format!("'{}' field is not a u64", stringify!(field)), + format!("'{}' field is not a u64", field_name), ErrorCode::InternalError ) }) @@ -154,16 +194,17 @@ fn extract_u64_field( fn extract_i64_field( document: &TantivyDocument, field: tantivy::schema::Field, + field_name: &str, ) -> BichonResult { let value = document.get_first(field).ok_or_else(|| { raise_error!( - format!("miss '{}' field in tantivy document", stringify!(field)), + format!("miss '{}' field in tantivy document", field_name), ErrorCode::InternalError ) })?; value.as_i64().ok_or_else(|| { raise_error!( - format!("'{}' field is not a i64", stringify!(field)), + format!("'{}' field is not a i64", field_name), ErrorCode::InternalError ) }) @@ -172,21 +213,26 @@ fn extract_i64_field( fn extract_string_field( document: &TantivyDocument, field: tantivy::schema::Field, + field_name: &str, ) -> BichonResult { - let value = document.get_first(field).ok_or_else(|| { + extract_option_string_field(document, field)?.ok_or_else(|| { raise_error!( - format!("'{}' field not found", stringify!(field)), - ErrorCode::InternalError - ) - })?; - value.as_str().map(|s| s.to_string()).ok_or_else(|| { - raise_error!( - format!("'{}' field is not a string", stringify!(field)), + format!("'{}' field is not a string", field_name), ErrorCode::InternalError ) }) } +fn extract_option_string_field( + document: &TantivyDocument, + field: tantivy::schema::Field, +) -> BichonResult> { + Ok(document + .get_first(field) + .and_then(|v| v.as_str()) + .map(|s| s.to_string())) +} + fn extract_vec_string_field( document: &TantivyDocument, field: tantivy::schema::Field, @@ -202,7 +248,7 @@ pub async fn extract_contacts(doc: &TantivyDocument) -> BichonResult BichonResult BichonResult> { + let fields = SchemaTools::attachment_fields(); + let mut senders = HashSet::new(); + + if let Ok(from_val) = extract_string_field(doc, fields.f_from, F_FROM) { + if !from_val.is_empty() { + senders.insert(from_val); + } + } + + Ok(senders) +} + +#[derive(Clone, Debug, Default, Eq, PartialEq, Deserialize, Serialize, Object)] +pub struct AttachmentModel { + pub id: String, + pub envelope_id: String, + pub account_id: u64, + pub account_email: Option, + pub mailbox_id: u64, + pub mailbox_name: Option, + pub subject: String, + pub content_hash: String, + pub from: String, + pub date: i64, + pub ingest_at: i64, + pub size: u64, + pub ext: Option, + pub category: String, + pub content_type: String, + pub shard_id: u64, + pub text: Option, + pub has_text: bool, + pub is_ocr: bool, + pub page_count: Option, + pub is_indexed: bool, + pub is_message: bool, + pub name: Option, + pub tags: Option>, + pub auto_tags: Option>, +} + +impl AttachmentModel { + pub fn into_document(self) -> TantivyDocument { + let f = SchemaTools::attachment_fields(); + let mut doc = TantivyDocument::new(); + + doc.add_text(f.f_id, self.id); + doc.add_text(f.f_envelope_id, self.envelope_id); + doc.add_u64(f.f_account_id, self.account_id); + doc.add_u64(f.f_mailbox_id, self.mailbox_id); + doc.add_text(f.f_subject, self.subject); + doc.add_text(f.f_content_hash, self.content_hash); + doc.add_text(f.f_from, self.from); + doc.add_i64(f.f_date, self.date); + doc.add_i64(f.f_ingest_at, self.ingest_at); + doc.add_u64(f.f_size, self.size); + if let Some(ext) = self.ext { + doc.add_text(f.f_ext, ext); + } + doc.add_text(f.f_category, self.category); + doc.add_text(f.f_content_type, self.content_type); + doc.add_u64(f.f_shard_id, self.shard_id); + + if let Some(text) = self.text { + doc.add_text(f.f_text, text); + } + + doc.add_bool(f.f_has_text, self.has_text); + doc.add_bool(f.f_is_ocr, self.is_ocr); + + if let Some(page_count) = self.page_count { + doc.add_u64(f.f_page_count, page_count); + } + + doc.add_bool(f.f_is_indexed, self.is_indexed); + doc.add_bool(f.f_is_message, self.is_message); + + if let Some(name) = self.name { + doc.add_text(f.f_name_text, name.clone()); + doc.add_text(f.f_name_exact, name); + } + + doc + } + + pub fn from_tantivy_doc(doc: &TantivyDocument) -> BichonResult { + let f = SchemaTools::attachment_fields(); + + let tags: Vec = doc + .get_all(f.f_tags) + .filter_map(|value| value.as_facet()) + .map(|f| f.to_string()) + .collect(); + + let auto_tags: Vec = doc + .get_all(f.f_auto_tags) + .filter_map(|value| value.as_facet()) + .map(|f| f.to_string()) + .collect(); + let account_id = extract_u64_field(doc, f.f_account_id, F_ACCOUNT_ID)?; + let mailbox_id = extract_u64_field(doc, f.f_mailbox_id, F_MAILBOX_ID)?; + let account = AccountModel::get(account_id)?; + let mailbox = MailBox::get(mailbox_id)?; + Ok(Self { + id: extract_string_field(doc, f.f_id, F_ID)?, + envelope_id: extract_string_field(doc, f.f_envelope_id, F_ENVELOPE_ID)?, + account_id, + account_email: Some(account.email), + mailbox_id, + mailbox_name: Some(mailbox.name), + subject: extract_string_field(doc, f.f_subject, F_SUBJECT)?, + content_hash: extract_string_field(doc, f.f_content_hash, F_CONTENT_HASH)?, + from: extract_string_field(doc, f.f_from, F_FROM)?, + date: extract_i64_field(doc, f.f_date, F_DATE)?, + ingest_at: extract_i64_field(doc, f.f_ingest_at, F_INGEST_AT)?, + size: extract_u64_field(doc, f.f_size, F_SIZE)?, + ext: extract_option_string_field(doc, f.f_ext)?, + category: extract_string_field(doc, f.f_category, F_ATTACHMENT_CATEGORY)?, + content_type: extract_string_field(doc, f.f_content_type, F_ATTACHMENT_CONTENT_TYPE)?, + shard_id: extract_u64_field(doc, f.f_shard_id, F_SHARD_ID)?, + text: extract_string_field(doc, f.f_text, F_TEXT).ok(), + has_text: extract_bool_field(doc, f.f_has_text, F_HAS_TEXT)?, + is_ocr: extract_bool_field(doc, f.f_is_ocr, F_IS_OCR)?, + page_count: extract_option_u64_field(doc, f.f_page_count)?, + is_indexed: extract_bool_field(doc, f.f_is_indexed, F_IS_INDEXED)?, + is_message: extract_bool_field(doc, f.f_is_message, F_IS_MESSAGE)?, + name: extract_option_string_field(doc, f.f_name_exact)?, + tags: if tags.is_empty() { None } else { Some(tags) }, + auto_tags: if auto_tags.is_empty() { + None + } else { + Some(auto_tags) + }, + }) + } +} diff --git a/src/modules/store/tantivy/schema.rs b/src/modules/store/tantivy/schema.rs index d4edb86..84d5623 100644 --- a/src/modules/store/tantivy/schema.rs +++ b/src/modules/store/tantivy/schema.rs @@ -21,11 +21,13 @@ use tantivy::schema::{FacetOptions, Field, INDEXED}; use tantivy::schema::{Schema, FAST, STORED, STRING, TEXT}; use crate::modules::store::tantivy::fields::{ - EmailFields, F_ACCOUNT_ID, F_ATTACHMENTS, F_ATTACHMENT_CATEGORY, F_ATTACHMENT_CONTENT_HASH, - F_ATTACHMENT_CONTENT_TYPE, F_ATTACHMENT_COUNT, F_ATTACHMENT_EXT, F_ATTACHMENT_NAME, F_BCC, - F_BODY, F_CC, F_CONTENT_HASH, F_DATE, F_FROM, F_ID, F_INGEST_AT, F_INTERNAL_DATE, F_MAILBOX_ID, - F_MESSAGE_ID, F_PREVIEW, F_REGULAR_ATTACHMENT_COUNT, F_SHARD_ID, F_SIZE, F_SUBJECT, F_TAGS, - F_THREAD_ID, F_TO, F_UID, + AttachmentFields, EmailFields, F_ACCOUNT_ID, F_ATTACHMENTS, F_ATTACHMENT_CATEGORY, + F_ATTACHMENT_CONTENT_HASH, F_ATTACHMENT_CONTENT_TYPE, F_ATTACHMENT_COUNT, F_ATTACHMENT_EXT, + F_ATTACHMENT_NAME_EXACT, F_ATTACHMENT_NAME_TEXT, F_AUTO_TAGS, F_BCC, F_BODY, F_CC, + F_CONTENT_HASH, F_DATE, F_ENVELOPE_ID, F_FROM, F_HAS_TEXT, F_ID, F_INGEST_AT, F_INTERNAL_DATE, + F_IS_INDEXED, F_IS_MESSAGE, F_IS_OCR, F_MAILBOX_ID, F_MESSAGE_ID, F_NAME_EXACT, F_NAME_TEXT, + F_PAGE_COUNT, F_PREVIEW, F_REGULAR_ATTACHMENT_COUNT, F_SHARD_ID, F_SIZE, F_SUBJECT, F_TAGS, + F_TEXT, F_THREAD_ID, F_TO, F_UID, }; static EMAIL_FIELDS: LazyLock> = LazyLock::new(|| { @@ -33,6 +35,11 @@ static EMAIL_FIELDS: LazyLock> = LazyLock::new(|| { Arc::new(fields) }); +static ATTACHMENT_FIELDS: LazyLock> = LazyLock::new(|| { + let (_, fields) = SchemaTools::create_attachment_schema(); + Arc::new(fields) +}); + pub struct SchemaTools; impl SchemaTools { @@ -50,15 +57,35 @@ impl SchemaTools { vec![ fields.f_subject, fields.f_body, - fields.f_attachment_name, + fields.f_attachment_name_text, + fields.f_attachment_name_exact, fields.f_from, fields.f_to, ] } + pub fn attachment_schema() -> Schema { + let (schema, _) = Self::create_attachment_schema(); + schema + } + + pub fn attachment_fields() -> &'static AttachmentFields { + &ATTACHMENT_FIELDS + } + + pub fn attachment_default_fields() -> Vec { + let fields = Self::attachment_fields(); + vec![ + fields.f_subject, + fields.f_text, + fields.f_name_exact, + fields.f_name_text, + fields.f_from, + ] + } + pub fn create_email_schema() -> (Schema, EmailFields) { let mut builder = Schema::builder(); - let f_id = builder.add_text_field(F_ID, STRING | STORED | FAST); let f_message_id = builder.add_text_field(F_MESSAGE_ID, STRING | STORED); let f_account_id = builder.add_u64_field(F_ACCOUNT_ID, INDEXED | STORED | FAST); @@ -67,7 +94,7 @@ impl SchemaTools { let f_subject = builder.add_text_field(F_SUBJECT, TEXT | STORED); let f_body = builder.add_text_field(F_BODY, TEXT); let f_preview = builder.add_text_field(F_PREVIEW, STORED); - let f_content_hash = builder.add_text_field(F_CONTENT_HASH, STRING | FAST | STORED); + let f_content_hash = builder.add_text_field(F_CONTENT_HASH, STRING | STORED | FAST); let f_from = builder.add_text_field(F_FROM, STRING | STORED | FAST); let f_to = builder.add_text_field(F_TO, STRING | STORED); let f_cc = builder.add_text_field(F_CC, STRING | STORED); @@ -80,20 +107,18 @@ impl SchemaTools { let f_attachment_count = builder.add_u64_field(F_ATTACHMENT_COUNT, INDEXED | STORED | FAST); let f_regular_attachment_count = builder.add_u64_field(F_REGULAR_ATTACHMENT_COUNT, INDEXED | STORED | FAST); - let f_attachment_name = builder.add_text_field(F_ATTACHMENT_NAME, TEXT); + let f_attachment_name_text = builder.add_text_field(F_ATTACHMENT_NAME_TEXT, TEXT); + let f_attachment_name_exact = builder.add_text_field(F_ATTACHMENT_NAME_EXACT, STRING); let f_attachments = builder.add_text_field(F_ATTACHMENTS, STORED); let f_attachment_content_hash = - builder.add_text_field(F_ATTACHMENT_CONTENT_HASH, STRING | FAST | STORED); - - let f_attachment_ext = builder.add_text_field(F_ATTACHMENT_EXT, STRING | FAST | STORED); + builder.add_text_field(F_ATTACHMENT_CONTENT_HASH, STRING | STORED | FAST); + let f_attachment_ext = builder.add_text_field(F_ATTACHMENT_EXT, STRING | STORED | FAST); let f_attachment_category = - builder.add_text_field(F_ATTACHMENT_CATEGORY, STRING | FAST | STORED); + builder.add_text_field(F_ATTACHMENT_CATEGORY, STRING | STORED | FAST); let f_attachment_content_type = - builder.add_text_field(F_ATTACHMENT_CONTENT_TYPE, STRING | FAST | STORED); - + builder.add_text_field(F_ATTACHMENT_CONTENT_TYPE, STRING | STORED | FAST); let f_tags = builder.add_facet_field(F_TAGS, FacetOptions::default().set_stored()); let f_shard_id = builder.add_u64_field(F_SHARD_ID, INDEXED | STORED | FAST); - let fields = EmailFields { f_id, f_message_id, @@ -116,7 +141,8 @@ impl SchemaTools { f_attachment_count, f_regular_attachment_count, f_attachments, - f_attachment_name, + f_attachment_name_text, + f_attachment_name_exact, f_attachment_content_hash, f_attachment_ext, f_attachment_category, @@ -126,4 +152,61 @@ impl SchemaTools { }; (builder.build(), fields) } + + pub fn create_attachment_schema() -> (Schema, AttachmentFields) { + let mut builder = Schema::builder(); + let f_id = builder.add_text_field(F_ID, STRING | STORED | FAST); + let f_envelope_id = builder.add_text_field(F_ENVELOPE_ID, STRING | STORED | FAST); + let f_account_id = builder.add_u64_field(F_ACCOUNT_ID, INDEXED | STORED | FAST); + let f_mailbox_id = builder.add_u64_field(F_MAILBOX_ID, INDEXED | STORED | FAST); + let f_subject = builder.add_text_field(F_SUBJECT, TEXT | STORED); + let f_content_hash = builder.add_text_field(F_CONTENT_HASH, STRING | STORED | FAST); + let f_from = builder.add_text_field(F_FROM, STRING | STORED | FAST); + let f_date = builder.add_i64_field(F_DATE, INDEXED | STORED | FAST); + let f_ingest_at = builder.add_i64_field(F_INGEST_AT, INDEXED | STORED | FAST); + let f_size = builder.add_u64_field(F_SIZE, INDEXED | STORED | FAST); + let f_ext = builder.add_text_field(F_ATTACHMENT_EXT, STRING | STORED | FAST); + let f_category = builder.add_text_field(F_ATTACHMENT_CATEGORY, STRING | STORED | FAST); + let f_content_type = + builder.add_text_field(F_ATTACHMENT_CONTENT_TYPE, STRING | STORED | FAST); + let f_shard_id = builder.add_u64_field(F_SHARD_ID, INDEXED | STORED | FAST); + let f_text = builder.add_text_field(F_TEXT, TEXT); + let f_has_text = builder.add_bool_field(F_HAS_TEXT, INDEXED | STORED | FAST); + let f_is_ocr = builder.add_bool_field(F_IS_OCR, INDEXED | STORED | FAST); + let f_page_count = builder.add_u64_field(F_PAGE_COUNT, INDEXED | STORED | FAST); + let f_is_indexed = builder.add_bool_field(F_IS_INDEXED, INDEXED | STORED | FAST); + let f_is_message = builder.add_bool_field(F_IS_MESSAGE, INDEXED | STORED | FAST); + let f_name_text = builder.add_text_field(F_NAME_TEXT, TEXT); + let f_name_exact = builder.add_text_field(F_NAME_EXACT, STRING | STORED); + let f_tags = builder.add_facet_field(F_TAGS, FacetOptions::default().set_stored()); + let f_auto_tags = + builder.add_facet_field(F_AUTO_TAGS, FacetOptions::default().set_stored()); + let fields = AttachmentFields { + f_id, + f_envelope_id, + f_account_id, + f_mailbox_id, + f_subject, + f_content_hash, + f_from, + f_date, + f_ingest_at, + f_size, + f_ext, + f_category, + f_content_type, + f_shard_id, + f_text, + f_has_text, + f_is_ocr, + f_page_count, + f_is_indexed, + f_is_message, + f_name_text, + f_name_exact, + f_tags, + f_auto_tags, + }; + (builder.build(), fields) + } } diff --git a/web/src/api/attachment/api.ts b/web/src/api/attachment/api.ts new file mode 100644 index 0000000..c64e5e5 --- /dev/null +++ b/web/src/api/attachment/api.ts @@ -0,0 +1,76 @@ +// +// Copyright (c) 2025-2026 rustmailer.com (https://rustmailer.com) +// +// This file is part of the Bichon Email Archiving Project +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + + +import axiosInstance from "@/api/axiosInstance"; +import { PaginatedResponse } from ".."; +import { TagCount } from "../search/api"; + + +export interface AttachmentModel { + id: string; + envelope_id: string; + account_id: number; + account_email: string, + mailbox_id: number; + mailbox_name: string; + subject: string; + content_hash: string; + from: string; + date: number; + ingest_at: number; + size: number; + + ext?: string; + category: string; + content_type: string; + shard_id: number; + text?: string; + has_text: boolean; + is_ocr: boolean; + page_count?: number; + + is_indexed: boolean; + is_message: boolean; + name?: string; + tags?: string[]; + auto_tags?: string[]; +} + +export const search_attachment = async (payload: Record) => { + const response = await axiosInstance.post>("api/v1/search-attachment", payload); + return response.data; +}; + +export const get_all_attachment_tags = async () => { + const response = await axiosInstance.get("api/v1/all-attachment-tags"); + return response.data; +} + +export const update_attachment_tags = async (data: Record) => { + const response = await axiosInstance.post("api/v1//update-attachment-tags", data); + return response.data; +}; + + +export const get_attachment_senders = async () => { + const response = await axiosInstance.get("api/v1/attachment-senders"); + return response.data; +} + + diff --git a/web/src/api/index.ts b/web/src/api/index.ts index 031c125..9d06c44 100644 --- a/web/src/api/index.ts +++ b/web/src/api/index.ts @@ -31,8 +31,8 @@ export interface EmailEnvelope { message_id: string; account_id: number; mailbox_id: number; - account_email?: string; - mailbox_name?: string; + account_email: string; + mailbox_name: string; uid: number; subject: string; preview: string; diff --git a/web/src/components/layout/data/sidebar-data.ts b/web/src/components/layout/data/sidebar-data.ts index 28b9d68..2012f48 100644 --- a/web/src/components/layout/data/sidebar-data.ts +++ b/web/src/components/layout/data/sidebar-data.ts @@ -22,7 +22,7 @@ import { IconLayoutDashboard, IconSettings } from '@tabler/icons-react' -import { IdCard, Inbox, Search, Users2 } from 'lucide-react' +import { IdCard, Inbox, Paperclip, Search, Users2 } from 'lucide-react' import { type SidebarData } from '../types' import { useTranslation } from 'react-i18next' import { useCurrentUser } from '@/hooks/use-current-user' @@ -56,6 +56,11 @@ export function useSidebarData(): SidebarData { title: t('common.search'), url: '/search', icon: Search, + }, + { + title: t('navigation.attachment'), + url: '/attachment', + icon: Paperclip, } ], }, diff --git a/web/src/components/pagination.tsx b/web/src/components/pagination.tsx index dc3ef5f..81496b2 100644 --- a/web/src/components/pagination.tsx +++ b/web/src/components/pagination.tsx @@ -45,7 +45,7 @@ interface PaginationProps { setPageSize: (pageSize: number) => void } -export function EnvelopeListPagination({ +export function AttachmentListPagination({ totalItems, pageIndex, pageSize, diff --git a/web/src/features/attachment/account-popover.tsx b/web/src/features/attachment/account-popover.tsx new file mode 100644 index 0000000..29b4a54 --- /dev/null +++ b/web/src/features/attachment/account-popover.tsx @@ -0,0 +1,203 @@ +// +// Copyright (c) 2025-2026 rustmailer.com (https://rustmailer.com) +// +// This file is part of the Bichon Email Archiving Project +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +import * as React from 'react' +import { AtSign, ChevronDown, X } from 'lucide-react' +import { useTranslation } from 'react-i18next' + +import { Badge } from '@/components/ui/badge' +import { Button } from '@/components/ui/button' +import { Checkbox } from '@/components/ui/checkbox' +import { Input } from '@/components/ui/input' +import { Label } from '@/components/ui/label' +import { ScrollArea } from '@/components/ui/scroll-area' +import { + Popover, + PopoverContent, + PopoverTrigger, +} from '@/components/ui/popover' + +import useMinimalAccountList from '@/hooks/use-minimal-account-list' +import { cn } from '@/lib/utils' +import { useSearchContext } from './context' + +export function AccountPopover() { + const { t } = useTranslation() + const { filter, setFilter } = useSearchContext() + const [search, setSearch] = React.useState('') + const { minimalList = [] } = useMinimalAccountList() + + const selectedIds: number[] = filter.account_ids ?? [] + + const toggleAccount = (id: number) => { + setFilter(prev => { + const next = { ...prev } + const set = new Set(next.account_ids ?? []) + + if (set.has(id)) { + set.delete(id) + } else { + set.add(id) + } + + if (set.size === 0) { + delete next.account_ids + delete next.mailbox_ids + } else { + next.account_ids = Array.from(set).sort() + delete next.mailbox_ids + } + + return next + }) + } + + const clearAccounts = () => { + setFilter(prev => { + const next = { ...prev } + delete next.account_ids + delete next.mailbox_ids + return next + }) + } + + const filtered = React.useMemo(() => { + const q = search.toLowerCase() + + return minimalList + .filter(a => + !q || + a.email.toLowerCase().includes(q) || + String(a.id).includes(q) + ) + .sort((a, b) => { + const aSel = selectedIds.includes(a.id) + const bSel = selectedIds.includes(b.id) + + if (aSel && !bSel) return -1 + if (!aSel && bSel) return 1 + return a.id - b.id + }) + }, [minimalList, search, selectedIds]) + + return ( + + + + + + +
+ setSearch(e.target.value)} + placeholder={t('search_accounts.search_placeholder')} + className="h-8 text-sm" + /> +
+ {!search && selectedIds.length > 0 && ( +
+ +
+
+ )} + + {filtered.length === 0 ? ( +

+ {t('search_accounts.no_accounts_found')} +

+ ) : ( + filtered.map(account => { + const checked = selectedIds.includes(account.id) + const id = `account-${account.id}` + + return ( +
toggleAccount(account.id)} + className={cn( + 'flex items-center gap-2 px-2 py-1.5 rounded-md cursor-pointer', + 'hover:bg-accent transition-colors' + )} + > + + toggleAccount(account.id) + } + onClick={e => e.stopPropagation()} + /> + + +
+ ) + }) + )} +
+ + + ) +} \ No newline at end of file diff --git a/web/src/features/attachment/attachment-filter.tsx b/web/src/features/attachment/attachment-filter.tsx new file mode 100644 index 0000000..6c9334a --- /dev/null +++ b/web/src/features/attachment/attachment-filter.tsx @@ -0,0 +1,72 @@ +// +// Copyright (c) 2025-2026 rustmailer.com (https://rustmailer.com) +// +// This file is part of the Bichon Email Archiving Project +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + + +import { Paperclip, Check } from 'lucide-react' +import { useTranslation } from 'react-i18next' +import { useSearchContext } from './context' +import { Button } from '@/components/ui/button' +import { cn } from '@/lib/utils' + +export function AttachmentFilter() { + const { t } = useTranslation() + const { filter, setFilter } = useSearchContext() + + const hasAttachment = filter?.has_attachment === true + + const toggleAttachment = () => { + setFilter((prev) => { + const next = { ...prev } + if (next.has_attachment) { + delete next.has_attachment + } else { + next.has_attachment = true + } + return next + }) + } + + return ( + + ) +} \ No newline at end of file diff --git a/web/src/features/attachment/attachment-icon.tsx b/web/src/features/attachment/attachment-icon.tsx new file mode 100644 index 0000000..235280d --- /dev/null +++ b/web/src/features/attachment/attachment-icon.tsx @@ -0,0 +1,72 @@ +import { + FileText, + FileImage, + FileVideo, + FileAudio, + FileArchive, + FileCode, + FilePlus, + Presentation, + FileSpreadsheet, + FileLock +} from "lucide-react"; +import { cn } from "@/lib/utils"; + +interface AttachmentIconProps { + contentType: string; + className?: string; +} + +export function AttachmentIcon({ contentType, className }: AttachmentIconProps) { + const type = contentType.toLowerCase(); + + const getIconConfig = () => { + if (type.includes("pdf")) { + return { Icon: FileText, color: "text-red-600" }; + } + if (type.includes("word") || type.includes("officedocument.word") || type === "application/msword") { + return { Icon: FileText, color: "text-blue-600" }; + } + if (type.includes("presentation") || type.includes("powerpoint")) { + return { Icon: Presentation, color: "text-orange-600" }; + } + if (type.includes("spreadsheet") || type.includes("excel") || type.includes("csv")) { + return { Icon: FileSpreadsheet, color: "text-green-600" }; + } + + if (type.startsWith("image/")) { + return { Icon: FileImage, color: "text-purple-600" }; + } + + if (type.startsWith("video/")) { + return { Icon: FileVideo, color: "text-pink-600" }; + } + + if (type.startsWith("audio/")) { + return { Icon: FileAudio, color: "text-amber-600" }; + } + + if (type.includes("zip") || type.includes("tar") || type.includes("rar") || type.includes("7z")) { + return { Icon: FileArchive, color: "text-gray-600" }; + } + + if (type.startsWith("text/") || type.includes("json") || type.includes("javascript") || type.includes("xml")) { + return { Icon: FileCode, color: "text-sky-600" }; + } + + if (type.includes("encrypted") || type.includes("pkcs")) { + return { Icon: FileLock, color: "text-yellow-700" }; + } + + return { Icon: FilePlus, color: "text-muted-foreground" }; + }; + + const { Icon, color } = getIconConfig(); + + return ( + + ); +} \ No newline at end of file diff --git a/web/src/features/attachment/attachment-metadata-filter.tsx b/web/src/features/attachment/attachment-metadata-filter.tsx new file mode 100644 index 0000000..be2f1eb --- /dev/null +++ b/web/src/features/attachment/attachment-metadata-filter.tsx @@ -0,0 +1,85 @@ +import * as React from "react" +import { ChevronDown } from "lucide-react" +import { useTranslation } from "react-i18next" +import { useSearchContext } from "./context" +import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover" +import { Button } from "@/components/ui/button" +import { cn } from "@/lib/utils" +import { MetadataSelectorField } from "./attachment-metadata-selector" +import { useAttachmentMetadata } from "@/hooks/use-attachment-metadata" + +interface MetaFilterProps { + type: 'extension' | 'category' | 'content_type' + icon: React.ReactNode +} + +export function MetadataFilter({ type, icon }: MetaFilterProps) { + const { t } = useTranslation() + const { filter, setFilter } = useSearchContext() + const [open, setOpen] = React.useState(false) + const { data: meta, isLoading } = useAttachmentMetadata(open) + + const filterKey = `attachment_${type}` as const + const currentValue = filter[filterKey] as string + + const optionsMap = { + extension: meta?.extensions || [], + category: meta?.categories || [], + content_type: meta?.content_types || [] + } + + const handleSelect = (value: string | undefined) => { + setFilter(prev => { + const next = { ...prev } + delete next.attachment_extension + delete next.attachment_category + delete next.attachment_content_type + if (value) { + next[filterKey] = value + } + + return next + }) + setOpen(false) + } + + const handleReset = () => { + setFilter(prev => { + const next = { ...prev } + delete next[filterKey] + return next + }) + setOpen(false) + } + + return ( + + + + + + + + + ) +} \ No newline at end of file diff --git a/web/src/features/attachment/attachment-metadata-selector.tsx b/web/src/features/attachment/attachment-metadata-selector.tsx new file mode 100644 index 0000000..d980158 --- /dev/null +++ b/web/src/features/attachment/attachment-metadata-selector.tsx @@ -0,0 +1,137 @@ +// +// Copyright (c) 2025-2026 rustmailer.com (https://rustmailer.com) +// +// This file is part of the Bichon Email Archiving Project +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + + +import * as React from "react" +import { Check, X } from "lucide-react" +import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover" +import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList } from "@/components/ui/command" +import { cn } from "@/lib/utils" +import { useTranslation } from "react-i18next" +import { Group } from "@/api/system/api" + +interface MetadataSelectorFieldProps { + label: string + value?: string + options: Group[] + isLoading: boolean + onSelect: (val: string | undefined) => void + onReset: () => void +} + +export function MetadataSelectorField({ + label, + value, + options, + isLoading, + onSelect, + onReset +}: MetadataSelectorFieldProps) { + const { t } = useTranslation() + const [searchTerm, setSearchTerm] = React.useState("") + + const filteredOptions = React.useMemo(() => { + return options.filter(opt => + opt.key.toLowerCase().includes(searchTerm.toLowerCase()) + ) + }, [options, searchTerm]) + + return ( + + + + + + + + + + {isLoading && ( +
+ {t('common.loading')} +
+ )} + + {t('common.noData')} + + + + {filteredOptions.map((opt) => ( + { + value === opt.key ? onReset() : onSelect(opt.key) + }} + className="flex items-center justify-between py-2 px-3 cursor-pointer text-xs" + > + {opt.key} + +
+ {/* count */} + + {opt.count} + + + {value === opt.key && ( + + )} +
+
+ ))} +
+
+
+
+
+ ) +} \ No newline at end of file diff --git a/web/src/features/attachment/bulk-actions.tsx b/web/src/features/attachment/bulk-actions.tsx new file mode 100644 index 0000000..4c7b4e6 --- /dev/null +++ b/web/src/features/attachment/bulk-actions.tsx @@ -0,0 +1,169 @@ +// +// Copyright (c) 2025-2026 rustmailer.com (https://rustmailer.com) +// +// This file is part of the Bichon Email Archiving Project +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + + + +import { useRef } from 'react' +import { X, TagIcon } from 'lucide-react' +import { cn } from '@/lib/utils' +import { Badge } from '@/components/ui/badge' +import { Button } from '@/components/ui/button' +import { Separator } from '@/components/ui/separator' +import { + Tooltip, + TooltipTrigger, + TooltipContent, +} from '@/components/ui/tooltip' +import { useSearchContext } from './context' +import { useTranslation } from 'react-i18next' + +type MailBulkActionsProps = { + children?: React.ReactNode +} + +export function AttachmentBulkActions({ children }: MailBulkActionsProps) { + const { selected, setSelected, setOpen } = useSearchContext() + const toolbarRef = useRef(null) + const { t } = useTranslation() + + const selectedCount = Array.from(selected.values()) + .reduce((sum, set) => sum + set.size, 0) + + const handleClearSelection = () => { + setSelected(new Map()) + } + + const handleUpdateTags = () => { + setOpen('update-tags') + } + + const handleKeyDown = (e: React.KeyboardEvent) => { + const buttons = toolbarRef.current?.querySelectorAll('button') + if (!buttons || buttons.length === 0) return + + const currentIndex = Array.from(buttons).findIndex( + btn => btn === document.activeElement + ) + + switch (e.key) { + case 'ArrowRight': { + e.preventDefault() + const next = (currentIndex + 1) % buttons.length + buttons[next]?.focus() + break + } + case 'ArrowLeft': { + e.preventDefault() + const prev = currentIndex === 0 ? buttons.length - 1 : currentIndex - 1 + buttons[prev]?.focus() + break + } + case 'Home': + e.preventDefault() + buttons[0]?.focus() + break + case 'End': + e.preventDefault() + buttons[buttons.length - 1]?.focus() + break + case 'Escape': { + const target = e.target as HTMLElement + const active = document.activeElement as HTMLElement + const isFromDropdown = + target.closest('[data-slot="dropdown-menu-trigger"]') || + active.closest('[data-slot="dropdown-menu-trigger"]') || + target.closest('[data-slot="dropdown-menu-content"]') || + active.closest('[data-slot="dropdown-menu-content"]') + + if (!isFromDropdown) { + e.preventDefault() + handleClearSelection() + } + break + } + } + } + + if (selectedCount === 0) return null + + return ( + <> +
+
+ + + + + + +
+ + {selectedCount} + {' '} +
+ + + + + + + {t('search.bulkActions.manageTags')} + + + {children} +
+
+ + ) +} + diff --git a/web/src/features/attachment/bulk-add-tag-dialog.tsx b/web/src/features/attachment/bulk-add-tag-dialog.tsx new file mode 100644 index 0000000..c21114d --- /dev/null +++ b/web/src/features/attachment/bulk-add-tag-dialog.tsx @@ -0,0 +1,259 @@ +// +// Copyright (c) 2025-2026 rustmailer.com (https://rustmailer.com) +// +// This file is part of the Bichon Email Archiving Project +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +import { Button } from '@/components/ui/button'; +import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/components/ui/dialog'; +import { Badge } from '@/components/ui/badge'; +import { Command, CommandGroup, CommandInput, CommandItem, CommandList } from '@/components/ui/command'; +import { Plus, Tag as TagIcon, X, Loader2, Check, AlertTriangle } from 'lucide-react'; +import { useState } from 'react'; +import { useAvailableTags } from '@/hooks/use-available-tags'; +import { TagAction, useUpdateTags } from '@/hooks/use-update-tags'; +import { toast } from '@/hooks/use-toast'; +import { validateTag } from '@/lib/utils'; +import { useTranslation } from 'react-i18next'; +import { useQueryClient } from '@tanstack/react-query'; +import { useSearchContext } from './context'; +import { Tabs, TabsList, TabsTrigger } from '@/components/ui/tabs'; + +interface Props { + open: boolean + onOpenChange: (open: boolean) => void +} + +export function UpdateTagsDialog({ open, onOpenChange }: Props) { + const { tags: availableTags } = useAvailableTags(); + const queryClient = useQueryClient(); + const { mutate, isPending } = useUpdateTags(); + const [selectedTags, setSelectedTags] = useState([]); + const [inputValue, setInputValue] = useState(''); + const [commandOpen, setCommandOpen] = useState(false); + const [action, setAction] = useState('Overwrite'); + const { t } = useTranslation(); + + const { selected } = useSearchContext() + + const handleAddTag = (tag: string) => { + const normalized = tag.toLowerCase().trim(); + const result = validateTag(normalized); + if (!result.valid) { + toast({ + title: t('search.updateTags.invalidTitle'), + description: result.error, + variant: 'destructive', + }); + return; + } + if (normalized && !selectedTags.includes(normalized)) { + setSelectedTags(prev => [...prev, normalized]); + } + setInputValue(''); + setCommandOpen(false); + }; + + const handleRemoveTag = (tag: string) => { + setSelectedTags(prev => prev.filter(t => t !== tag)); + }; + + const handleSubmit = () => { + if (inputValue.trim()) { + const normalized = inputValue.toLowerCase().trim(); + const result = validateTag(normalized); + + if (!result.valid) { + toast({ + title: t('search.updateTags.invalidTitle'), + description: result.error, + variant: 'destructive', + }); + return; + } + + if (!selectedTags.includes(normalized)) { + setSelectedTags(prev => [...prev, normalized]); + } + + setInputValue(''); + } + + const updates: Record = {}; + + selected.forEach((tagSet, accountId) => { + updates[accountId] = Array.from(tagSet); + }); + + let finalTags = inputValue.trim() + ? [...selectedTags, inputValue.toLowerCase().trim()] + : selectedTags; + + if (finalTags.length === 0 && action !== 'Overwrite') { + return; + } + + mutate( + { + updates, + tags: finalTags, + action + }, + { + onSuccess: () => { + toast({ + title: t('search.updateTags.updatedTitle'), + description: ( +
+ + {t('search.updateTags.updatedDesc')} +
+ ), + }); + queryClient.invalidateQueries({ queryKey: ['all-tags'] }); + onOpenChange(false); + }, + onError: (error: any) => { + toast({ + title: t('search.updateTags.updateFailedTitle'), + description: error?.message || t('search.updateTags.tryAgain'), + variant: 'destructive', + }); + }, + } + ); + }; + + const filteredSuggestions = availableTags.filter( + tag => !selectedTags.includes(tag) && tag.includes(inputValue.toLowerCase()) + ); + + return ( + + + + + + {t('search.updateTags.title')} + + + setAction(v as TagAction)} className="w-full"> + + {t('search.updateTags.actionAdd', "Add")} + {t('search.updateTags.actionRemove', "remove")} + {t('search.updateTags.actionOverwrite', "overwrite")} + + +
+
+ {selectedTags.length === 0 ? ( +

{t('search.updateTags.none')}

+ ) : ( + selectedTags.map(tag => ( + + {tag} + + + )) + )} +
+ e.stopPropagation()} > +
+
+ setCommandOpen(true)} + className="h-9 pr-10" + onKeyDown={(e) => { + if (e.key === 'Enter' && inputValue.trim()) { + e.preventDefault(); + e.stopPropagation(); + handleAddTag(inputValue); + } + }} + /> + {inputValue.trim() && ( + + )} +
+ {inputValue.trim() && filteredSuggestions.length === 0 && ( +
+ {t('search.updateTags.createHint', { tag: inputValue })} +
+ )} + {commandOpen && inputValue && filteredSuggestions.length > 0 && ( + + + {filteredSuggestions.map(tag => ( + handleAddTag(tag)} + className="cursor-pointer" + > + + {tag} + + ))} + + + )} +
+
+
+ +
+

+ {t('search.updateTags.selectedCount', { count: selectedTags.length })} +

+
+ + +
+
+ {action == "Overwrite" &&
+ +

+ {t('search.updateTags.overwriteWarning')} +

+
} +
+
+ ); +} diff --git a/web/src/features/attachment/context/index.tsx b/web/src/features/attachment/context/index.tsx new file mode 100644 index 0000000..facd492 --- /dev/null +++ b/web/src/features/attachment/context/index.tsx @@ -0,0 +1,66 @@ +// +// Copyright (c) 2025-2026 rustmailer.com (https://rustmailer.com) +// +// This file is part of the Bichon Email Archiving Project +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + + +import React from 'react' +import { SortingState } from '@tanstack/react-table' +import { AttachmentModel } from '@/api/attachment/api' + +export type SearchDialogType = 'mailbox' | 'display' | 'delete' | 'filters' | 'tags' | 'edit-tags' | 'update-tags' | 'restore' | 'delete-mailbox' + +interface SearchContextType { + open: SearchDialogType | null + setOpen: (str: SearchDialogType | null) => void + currentEnvelope: AttachmentModel | undefined + setCurrentEnvelope: React.Dispatch> + selected: Map> + setSelected: React.Dispatch>>> + deleteMailboxId: string | undefined + setDeleteMailboxId: React.Dispatch> + selectedAccountId: number | undefined + setSelectedAccountId: React.Dispatch> + selectedTags: string[] + sorting: SortingState + setSorting: React.Dispatch> + filter: Record + setFilter: React.Dispatch>> + handleTagToggle: (tag: string) => void +} + +const SearchContext = React.createContext(null) + +interface Props { + children: React.ReactNode + value: SearchContextType +} + +export default function SearchProvider({ children, value }: Props) { + return {children} +} + +export const useSearchContext = () => { + const searchContext = React.useContext(SearchContext) + + if (!searchContext) { + throw new Error( + 'useSearchContext has to be used within ' + ) + } + + return searchContext +} diff --git a/web/src/features/attachment/delete-dialog.tsx b/web/src/features/attachment/delete-dialog.tsx new file mode 100644 index 0000000..77e2173 --- /dev/null +++ b/web/src/features/attachment/delete-dialog.tsx @@ -0,0 +1,115 @@ +// +// Copyright (c) 2025-2026 rustmailer.com (https://rustmailer.com) +// +// This file is part of the Bichon Email Archiving Project +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +import { IconAlertTriangle } from '@tabler/icons-react' +import { toast } from '@/hooks/use-toast' +import { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert' +import { ConfirmDialog } from '@/components/confirm-dialog' +import { useMutation, useQueryClient } from '@tanstack/react-query' +import { delete_messages } from '@/api/mailbox/envelope/api' +import { useSearchContext } from './context' +import { mapToRecordOfArrays } from '@/lib/utils' +import { useTranslation } from 'react-i18next' + +interface Props { + open: boolean + onOpenChange: (open: boolean) => void +} + +export function EnvelopeDeleteDialog({ open, onOpenChange }: Props) { + const queryClient = useQueryClient() + const { toDelete, setToDelete, setSelected } = useSearchContext() + const { t } = useTranslation() + + const deleteMutation = useMutation({ + mutationFn: ({ payload }: { payload: Record }) => + delete_messages(payload), + retry: false, + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: ['search-messages'], exact: false }) + queryClient.invalidateQueries({ queryKey: ['all-tags'] }) + onOpenChange(false) + setToDelete(new Map()) + setSelected(new Map()) + toast({ + title: t('search.delete.successTitle'), + description: t('search.delete.successDesc'), + }) + }, + onError: (error: any) => { + toast({ + title: t('search.delete.errorTitle'), + description: `${error.message}`, + variant: 'destructive', + }) + }, + }) + + const handleDelete = () => { + const payload = mapToRecordOfArrays(toDelete) + deleteMutation.mutate({ payload }) + } + + const isLoading = deleteMutation.isPending + + const emailCount = Array.from(toDelete.values()).reduce( + (sum, set) => sum + set.size, + 0 + ) + + return ( + + {' '} + {t('search.delete.title')} + + } + desc={ +
+

+ {t('search.delete.confirmPrefix')}{' '} + + {t('search.delete.countLabel', { count: emailCount })} + + ? +
+ {t('search.delete.confirmDetail')} +

+ + + {t('search.delete.warningTitle')} + + {t('search.delete.warningDesc')} + + +
+ } + confirmText={t('search.delete.confirmButton')} + /> + ) +} diff --git a/web/src/features/attachment/delete-mailbox-dialog.tsx b/web/src/features/attachment/delete-mailbox-dialog.tsx new file mode 100644 index 0000000..dafb2db --- /dev/null +++ b/web/src/features/attachment/delete-mailbox-dialog.tsx @@ -0,0 +1,105 @@ +// +// Copyright (c) 2025-2026 rustmailer.com (https://rustmailer.com) +// +// This file is part of the Bichon Email Archiving Project +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +import { IconAlertTriangle } from '@tabler/icons-react'; +import { toast } from '@/hooks/use-toast'; +import { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert'; +import { ConfirmDialog } from '@/components/confirm-dialog'; +import { useMutation, useQueryClient } from '@tanstack/react-query'; +import { useTranslation } from 'react-i18next'; +import { delete_mailbox } from '@/api/mailbox/api'; +import { useSearchContext } from './context'; + +interface Props { + open: boolean; + onOpenChange: (open: boolean) => void; +} + +export function MailBoxDeleteDialog({ open, onOpenChange }: Props) { + const queryClient = useQueryClient(); + const { selectedAccountId, deleteMailboxId, setDeleteMailboxId } = useSearchContext(); + const { t } = useTranslation(); + + const deleteMutation = useMutation({ + mutationFn: ({ accountId, mailboxId }: { accountId: number; mailboxId: string }) => + delete_mailbox(accountId, mailboxId), + retry: false, + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: ['search-mailboxes', selectedAccountId] }); + onOpenChange(false); + setDeleteMailboxId(undefined); + toast({ + title: t('mailbox.deleteMailboxDialog.successTitle'), + description: t('mailbox.deleteMailboxDialog.successDesc'), + }); + }, + onError: (error: any) => { + toast({ + title: t('mailbox.deleteMailboxDialog.errorTitle'), + description: error.message || "Delete failed", + variant: 'destructive', + }); + }, + }); + + const handleDelete = () => { + if (selectedAccountId && deleteMailboxId) { + deleteMutation.mutate({ + accountId: selectedAccountId, + mailboxId: deleteMailboxId + }); + } + }; + + const isLoading = deleteMutation.isPending; + + return ( + { + onOpenChange(isOpen); + if (!isOpen) setDeleteMailboxId(undefined); + }} + handleConfirm={handleDelete} + className="max-w-xl" + isLoading={isLoading} + title={ + + {' '} + {t('mailbox.deleteMailboxDialog.title')} + + } + desc={ +
+

+ {t('mailbox.deleteMailboxDialog.desc')} +

+ + {t('mailbox.deleteMailboxDialog.warningTitle')} + {t('mailbox.deleteMailboxDialog.warningDesc')} + +
+ } + confirmText={t('mailbox.deleteMailboxDialog.confirm')} + destructive + /> + ); +} diff --git a/web/src/features/attachment/edit-tag-dialog.tsx b/web/src/features/attachment/edit-tag-dialog.tsx new file mode 100644 index 0000000..832dfef --- /dev/null +++ b/web/src/features/attachment/edit-tag-dialog.tsx @@ -0,0 +1,245 @@ +// +// Copyright (c) 2025-2026 rustmailer.com (https://rustmailer.com) +// +// This file is part of the Bichon Email Archiving Project +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +import { Button } from '@/components/ui/button'; +import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/components/ui/dialog'; +import { Badge } from '@/components/ui/badge'; +import { Command, CommandGroup, CommandInput, CommandItem, CommandList } from '@/components/ui/command'; +import { Plus, Tag as TagIcon, X, Loader2, Check } from 'lucide-react'; +import { useState, useEffect } from 'react'; +import { useAvailableTags } from '@/hooks/use-available-tags'; +import { useUpdateTags } from '@/hooks/use-update-tags'; +import { toast } from '@/hooks/use-toast'; +import { validateTag } from '@/lib/utils'; +import { useTranslation } from 'react-i18next'; +import { useQueryClient } from '@tanstack/react-query'; +import { useSearchContext } from './context'; + +interface Props { + open: boolean + onOpenChange: (open: boolean) => void +} + +export function EditTagsDialog({ open, onOpenChange }: Props) { + const { tags: availableTags } = useAvailableTags(); + const queryClient = useQueryClient(); + const { mutate, isPending } = useUpdateTags(); + const [selectedTags, setSelectedTags] = useState([]); + const [inputValue, setInputValue] = useState(''); + const [commandOpen, setCommandOpen] = useState(false); + const { t } = useTranslation(); + + const { currentEnvelope } = useSearchContext() + + useEffect(() => { + if (open && currentEnvelope) { + setSelectedTags(currentEnvelope.tags || []); + } + }, [open, currentEnvelope]); + + if (!currentEnvelope) return null; + + const handleAddTag = (tag: string) => { + const normalized = tag.toLowerCase().trim(); + const result = validateTag(normalized); + if (!result.valid) { + toast({ + title: t('search.addTags.invalidTitle'), + description: result.error, + variant: 'destructive', + }); + return; + } + if (normalized && !selectedTags.includes(normalized)) { + setSelectedTags(prev => [...prev, normalized]); + } + setInputValue(''); + setCommandOpen(false); + }; + + const handleRemoveTag = (tag: string) => { + setSelectedTags(prev => prev.filter(t => t !== tag)); + }; + + const handleSave = () => { + if (inputValue.trim()) { + const normalized = inputValue.toLowerCase().trim(); + const result = validateTag(normalized); + + if (!result.valid) { + toast({ + title: t('search.addTags.invalidTitle'), + description: result.error, + variant: 'destructive', + }); + return; + } + + if (!selectedTags.includes(normalized)) { + setSelectedTags(prev => [...prev, normalized]); + } + + setInputValue(''); + } + + const updates = { + [currentEnvelope.account_id]: [currentEnvelope.id], + }; + + mutate( + { + updates, + tags: inputValue.trim() + ? [...selectedTags, inputValue.toLowerCase().trim()] + : selectedTags, + action: "Overwrite" + }, + { + onSuccess: () => { + toast({ + title: t('search.addTags.updatedTitle'), + description: ( +
+ + {t('search.addTags.updatedDesc')} +
+ ), + }); + queryClient.invalidateQueries({ queryKey: ['all-tags'] }); + onOpenChange(false); + }, + onError: (error: any) => { + toast({ + title: t('search.addTags.updateFailedTitle'), + description: error?.message || t('search.addTags.tryAgain'), + variant: 'destructive', + }); + }, + } + ); + }; + + const filteredSuggestions = availableTags.filter( + tag => !selectedTags.includes(tag) && tag.includes(inputValue.toLowerCase()) + ); + + return ( + + + + + + {t('search.addTags.title')} + + + +
+
+ {selectedTags.length === 0 ? ( +

{t('search.addTags.none')}

+ ) : ( + selectedTags.map(tag => ( + + {tag} + + + )) + )} +
+ e.stopPropagation()}> +
+
+ setCommandOpen(true)} + className="h-9 pr-10" + onKeyDown={(e) => { + if (e.key === 'Enter' && inputValue.trim()) { + e.preventDefault(); + e.stopPropagation(); + handleAddTag(inputValue); + } + }} + /> + {inputValue.trim() && ( + + )} +
+ {inputValue.trim() && filteredSuggestions.length === 0 && ( +
+ {t('search.addTags.createHint', { tag: inputValue })} +
+ )} + {commandOpen && inputValue && filteredSuggestions.length > 0 && ( + + + {filteredSuggestions.map(tag => ( + handleAddTag(tag)} + className="cursor-pointer" + > + + {tag} + + ))} + + + )} +
+
+
+ +
+

+ {t('search.addTags.selectedCount', { count: selectedTags.length })} +

+
+ + +
+
+
+
+ ); +} diff --git a/web/src/features/attachment/filter-reset.tsx b/web/src/features/attachment/filter-reset.tsx new file mode 100644 index 0000000..da8aec2 --- /dev/null +++ b/web/src/features/attachment/filter-reset.tsx @@ -0,0 +1,57 @@ +// +// Copyright (c) 2025-2026 rustmailer.com (https://rustmailer.com) +// +// This file is part of the Bichon Email Archiving Project +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + + +import { X } from "lucide-react" +import { Button } from "@/components/ui/button" +import { useSearchContext } from "./context" +import { cn } from "@/lib/utils" +import { useTranslation } from "react-i18next"; + +export function FilterResetButton() { + const { filter, setFilter } = useSearchContext(); + const { t } = useTranslation() + const { q, ...restFilters } = filter; + + const activeFiltersCount = Object.keys(restFilters).filter(key => { + const value = restFilters[key]; + if (Array.isArray(value)) return value.length > 0; + return value !== undefined && value !== null && value !== ''; + }).length; + + if (activeFiltersCount === 0) return null; + + return ( + + ); +} \ No newline at end of file diff --git a/web/src/features/attachment/index.tsx b/web/src/features/attachment/index.tsx new file mode 100644 index 0000000..4af99c4 --- /dev/null +++ b/web/src/features/attachment/index.tsx @@ -0,0 +1,170 @@ +// +// Copyright (c) 2025-2026 rustmailer.com (https://rustmailer.com) +// +// This file is part of the Bichon Email Archiving Project +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + + +import { Card, CardContent } from '@/components/ui/card'; +import { FixedHeader } from '@/components/layout/fixed-header'; +import { Main } from '@/components/layout/main'; +import { AttachmentListPagination } from '@/components/pagination'; +import React from 'react'; +import SearchProvider, { SearchDialogType } from './context'; +import useDialogState from '@/hooks/use-dialog-state'; +import { useTranslation } from 'react-i18next'; +import { AttachmentListTable } from './mail-list-table'; +import { SortingState } from '@tanstack/react-table'; +import { useSearchAttachments } from '@/hooks/use-search-attachments'; +import { AttachmentModel } from '@/api/attachment/api'; + +export default function AttachmentSearch() { + const { t } = useTranslation() + const [selectedAttachment, setSelectedAttachment] = React.useState(undefined); + const [open, setOpen] = useDialogState(null) + const [selected, setSelected] = React.useState>>(new Map()); + const [selectedTags, setSelectedTags] = React.useState([]); + const [sorting, setSorting] = React.useState([{ id: "date", desc: true }]); + const [deleteMailboxId, setDeleteMailboxId] = React.useState(undefined); + const [selectedAccountId, setSelectedAccountId] = React.useState(undefined); + + const { + attachments, + total, + totalPages, + isLoading, + page, + pageSize, + setPage, + setSearchPageSize, + setSortBy, + setSortOrder, + filter, + setFilter + } = useSearchAttachments(); + + const handleSetPageSize = (pageSize: number) => { + setPage(1); + setSearchPageSize(pageSize) + } + + const handleTagToggle = (tag: string) => { + setSelectedTags(prev => + prev.includes(tag) + ? prev.filter(t => t !== tag) + : [...prev, tag] + ); + }; + + return ( + <> + +
+ +
+
+
+ {isLoading && ( + + +
+
+

{t('search.searching')}

+
+
+
+ )} + + { + setOpen('display'); + setSelectedAttachment(att); + }} + setSortBy={setSortBy} + setSortOrder={setSortOrder} + /> + {total > 0 && page < totalPages} + pageIndex={page - 1} + pageSize={pageSize} + setPageIndex={(index) => setPage(index + 1)} + setPageSize={handleSetPageSize} + />} +
+
+
+ + {/* setOpen('display')} + /> + + setOpen('delete')} + /> + + setOpen('edit-tags')} + /> + + setOpen('update-tags')} + /> + + setOpen('restore')} + /> + + setOpen('delete-mailbox')} + /> */} +
+
+ + ); +} diff --git a/web/src/features/attachment/mail-display-dialog.tsx b/web/src/features/attachment/mail-display-dialog.tsx new file mode 100644 index 0000000..246162a --- /dev/null +++ b/web/src/features/attachment/mail-display-dialog.tsx @@ -0,0 +1,61 @@ +// +// Copyright (c) 2025-2026 rustmailer.com (https://rustmailer.com) +// +// This file is part of the Bichon Email Archiving Project +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + + +import { useSearchContext } from './context' +import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/components/ui/dialog' +import { ScrollArea } from '@/components/ui/scroll-area' +import { MailMessageView } from './mail-message-view' +import { useTranslation } from 'react-i18next' + + +interface Props { + open: boolean + onOpenChange: (open: boolean) => void +} + +export function MailDisplayDrawer({ open, onOpenChange }: Props) { + const { t } = useTranslation() + const { currentEnvelope } = useSearchContext() + + + return ( + + + +
+ + {t('mail.emailViewer')} + +
+
+ +
+ {currentEnvelope ? ( + + ) : ( +
{t('mail.noMessageSelected')}
+ )} +
+
+
+
) +} \ No newline at end of file diff --git a/web/src/features/attachment/mail-list-table.tsx b/web/src/features/attachment/mail-list-table.tsx new file mode 100644 index 0000000..0462a3a --- /dev/null +++ b/web/src/features/attachment/mail-list-table.tsx @@ -0,0 +1,296 @@ +// +// Copyright (c) 2025-2026 rustmailer.com (https://rustmailer.com) +// +// This file is part of the Bichon Email Archiving Project +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + + +import { dateFnsLocaleMap, formatBytes } from "@/lib/utils" +import { format, formatDistanceToNow } from "date-fns" +import { Skeleton } from "@/components/ui/skeleton" +import { Checkbox } from "@/components/ui/checkbox" +import { useSearchContext } from "./context" +import { AttachmentBulkActions } from "./bulk-actions" +import { useTranslation } from 'react-i18next' +import { enUS } from "date-fns/locale" +import { ColumnDef } from "@tanstack/react-table" +import LongText from "@/components/long-text" +import { DataTableColumnHeader } from "./table/data-table-column-header" +import { SearchTable } from "./table/table" +import { DataTableRowActions } from "./table/data-table-row-actions" +import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip' +import { DataTableToolbar } from "./table/toolbar" +import { AttachmentModel } from "@/api/attachment/api" +import { useSearchAttachments } from "@/hooks/use-search-attachments" +import { FileIcon } from "lucide-react" +import { AttachmentIcon } from "./attachment-icon" + +interface MailListProps { + items: AttachmentModel[] + isLoading: boolean + onAttachmentChanged: (attachment: AttachmentModel) => void + setSortBy: (sortBy: "DATE" | "SIZE") => void + setSortOrder: (value: "desc" | "asc") => void +} + +export function AttachmentListTable({ + items, + isLoading, + onAttachmentChanged, + setSortBy, + setSortOrder +}: MailListProps) { + const { t, i18n } = useTranslation() + + const locale = dateFnsLocaleMap[i18n.language.toLowerCase()] ?? enUS + const { selected, setSelected } = useSearchContext() + + const columns: ColumnDef[] = [ + { + accessorKey: "id", + header: () => ( + 0 + ? true + : totalSelected > 0 + ? "indeterminate" + : false + } + onCheckedChange={handleToggleAll} + className="h-4 w-4" + /> + ), + cell: ({ row }) => ( + toggleSelected(row.original.account_id, row.original.id)} + onClick={(e) => e.stopPropagation()} + className="h-4 w-4 shrink-0" + /> + ), + meta: { className: 'text-left text-sm' }, + minSize: 25, + maxSize: 25, + }, + { + accessorKey: "source", + header: t('attachment.source'), + cell: ({ row }) => { + const { from, account_email, mailbox_name, account_id, mailbox_id } = row.original; + const { setFilter } = useSearchAttachments(); + const accountPrefix = account_email.split('@')[0]; + + return ( +
+
{ + e.stopPropagation(); + setFilter((prev: any) => ({ ...prev, from: from })); + }} + > + + {from} + +
+ +
+ { + e.stopPropagation(); + setFilter((prev: any) => ({ ...prev, account_ids: [account_id], mailbox_ids: undefined })); + }} + > + {accountPrefix} + + + / + { + e.stopPropagation(); + setFilter((prev: any) => ({ ...prev, account_ids: [account_id], mailbox_ids: [mailbox_id] })); + }} + > + {mailbox_name} + +
+
+ ); + }, + meta: { className: 'text-left' } + }, + { + accessorKey: "subject", + header: t('attachment.subject'), + cell: ({ row }) => {row.original.subject}, + meta: { className: 'text-left text-xs' }, + minSize: 300, + maxSize: 300, + }, + { + accessorKey: "name", + header: t('attachment.name'), + cell: ({ row }) => { + const { name, content_type } = row.original; + const safeName = name ?? "n/a"; + + const shortContentType = content_type + ? content_type.split('/').pop()?.toUpperCase().replace('X-', '') + : "UNK"; + + return ( +
+
+ + + {safeName} + +
+
+ + {shortContentType} + +
+
+ ); + }, + meta: { className: 'text-left text-xs' }, + }, + { + accessorKey: 'size', + header: ({ column }) => ( + + ), + cell: ({ row }) => {formatBytes(row.original.size)}, + meta: { className: 'text-left text-xs' }, + minSize: 80, + maxSize: 80, + }, + { + accessorKey: 'date', + header: ({ column }) => ( + + ), + cell: ({ row }) => { + const date = new Date(row.original.date) + const title = format(date, 'yyyy-MM-dd HH:mm:ss') + return ( + + + + {formatDistanceToNow(date, { addSuffix: true, locale })} + + + {title} + + ) + }, + meta: { className: 'text-left text-xs' }, + minSize: 100, + maxSize: 100, + }, + { + id: 'actions', + header: t('users.columns.actions'), + cell: DataTableRowActions, + meta: { className: 'text-left text-xs' }, + minSize: 60, + maxSize: 60, + }, + ] + + const handleToggleAll = () => { + const total = Array.from(selected.values()).reduce((sum, set) => sum + set.size, 0) + + if (total === items.length && items.length > 0) { + setSelected(new Map()) + } else { + setSelected(prev => { + const next = new Map(prev) + for (const item of items) { + const set = new Set(next.get(item.account_id) || []) + set.add(item.id) + next.set(item.account_id, set) + } + return next + }) + } + } + + const toggleSelected = (accountId: number, mailId: string) => { + setSelected(prev => { + const next = new Map(prev) + const set = new Set(next.get(accountId) || []) + + if (set.has(mailId)) { + set.delete(mailId) + if (set.size === 0) next.delete(accountId) + else next.set(accountId, set) + } else { + set.add(mailId) + next.set(accountId, set) + } + return next + }) + } + + const totalSelected = Array.from(selected.values()).reduce((sum, set) => sum + set.size, 0) + + const hasSelected = (accountId: number, mailId: string) => selected.get(accountId)?.has(mailId) ?? false + + if (isLoading) { + return ( +
+ {Array.from({ length: 8 }).map((_, i) => ( +
+ + + + +
+ ))} +
+ ) + } + + return ( + <> + { + const target = e.target as HTMLElement + if (target.closest('input[type="checkbox"], button')) return + onAttachmentChanged(row.original) + }} + setSortBy={setSortBy} + setSortOrder={setSortOrder} + > + {(table) => { + return + }} + + + {totalSelected > 0 && } + + ) +} diff --git a/web/src/features/attachment/mail-list.tsx b/web/src/features/attachment/mail-list.tsx new file mode 100644 index 0000000..24e5f56 --- /dev/null +++ b/web/src/features/attachment/mail-list.tsx @@ -0,0 +1,278 @@ +// +// Copyright (c) 2025-2026 rustmailer.com (https://rustmailer.com) +// +// This file is part of the Bichon Email Archiving Project +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + + +import { cn, dateFnsLocaleMap, formatBytes } from "@/lib/utils" +import { formatDistanceToNow } from "date-fns" +import { MailIcon, MoreVertical, Paperclip, TagIcon, Trash2 } from "lucide-react" +import { Skeleton } from "@/components/ui/skeleton" +import { Checkbox } from "@/components/ui/checkbox" +import { EmailEnvelope } from "@/api" +import { useSearchContext } from "./context" +import { AttachmentBulkActions } from "./bulk-actions" +import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from "@/components/ui/dropdown-menu" +import { Button } from "@/components/ui/button" +import { Badge } from "@/components/ui/badge" +import { useTranslation } from 'react-i18next' +import { enUS } from "date-fns/locale" + +interface MailListProps { + items: EmailEnvelope[] + isLoading: boolean + onEnvelopeChanged: (envelope: EmailEnvelope) => void +} + +export function MailList({ + items, + isLoading, + onEnvelopeChanged +}: MailListProps) { + const { t, i18n } = useTranslation() + + const locale = dateFnsLocaleMap[i18n.language.toLowerCase()] ?? enUS; + const { setOpen, currentEnvelope, setCurrentEnvelope, selected, setSelected, setToDelete } = useSearchContext() + + const handleToggleAll = () => { + const total = Array.from(selected.values()) + .reduce((sum, set) => sum + set.size, 0); + + if (total === items.length && items.length > 0) { + setSelected(new Map()); + } else { + setSelected(prev => { + const next = new Map(prev); + for (const item of items) { + const set = new Set(next.get(item.account_id) || []); + set.add(item.id); + next.set(item.account_id, set); + } + return next; + }); + } + } + + const toggleToDelete = (accountId: number, mailId: string) => { + setToDelete(prev => { + const next = new Map(prev); + const set = new Set(next.get(accountId) || []); + + if (set.has(mailId)) { + set.delete(mailId); + if (set.size === 0) next.delete(accountId); + else next.set(accountId, set); + } else { + set.add(mailId); + next.set(accountId, set); + } + + return next; + }); + }; + + const toggleSelected = (accountId: number, mailId: string) => { + setSelected(prev => { + const next = new Map(prev); + const set = new Set(next.get(accountId) || []); + + if (set.has(mailId)) { + set.delete(mailId); + if (set.size === 0) next.delete(accountId); + else next.set(accountId, set); + } else { + set.add(mailId); + next.set(accountId, set); + } + + return next; + }); + } + + const totalSelected = Array.from(selected.values()) + .reduce((sum, set) => sum + set.size, 0); + + const hasSelected = (accountId: number, mailId: string) => { + return selected.get(accountId)?.has(mailId) ?? false; + } + + const handleDelete = (envelope: EmailEnvelope) => { + setToDelete(new Map()); + toggleToDelete(envelope.account_id, envelope.id) + setOpen("delete") + } + + if (isLoading) { + return ( +
+ {Array.from({ length: 8 }).map((_, i) => ( +
+ + + + +
+ ))} +
+ ) + } + + return ( +
+ {items.length > 0 && ( +
+ 0 + ? true + : totalSelected > 0 + ? "indeterminate" + : false + } + onCheckedChange={handleToggleAll} + className="h-4 w-4" + /> + + {totalSelected > 0 + ? `${t('search.bulkActions.selected', { count: totalSelected })}` + : t('common.selectAll')} + +
+ )} + + {items.map((item, index) => { + const hasAttachments = item.regular_attachment_count > 0 + const isSelectedRow = currentEnvelope?.id === item.id + const isChecked = hasSelected(item.account_id, item.id) + + return ( +
{ + const target = e.target as HTMLElement + if (target.closest('input[type="checkbox"], button')) return + onEnvelopeChanged(item) + }} + > + toggleSelected(item.account_id, item.id)} + onClick={(e) => e.stopPropagation()} + className="h-4 w-4 shrink-0" + /> + + +
+ +
+
+

{item.from}

+

+ {item.subject} +

+
+
+ {item.account_email} + + {item.mailbox_name} +
+

+ {item.subject} +

+ +
+ {item.tags?.map((tag, i) => ( + {tag} + ))} +
+
+
+ + {hasAttachments && ( +
+ + {item.regular_attachment_count} +
+ )} + + {formatBytes(item.size)} + + + {item.date && formatDistanceToNow(new Date(item.date), { addSuffix: true, locale })} + + + + + + + + + e.stopPropagation()} + onSelect={(e) => { + e.stopPropagation(); + setCurrentEnvelope(item); + setOpen("edit-tags"); + }} + > + + {t('search.editTag')} + + e.stopPropagation()} + onSelect={(e) => { + e.stopPropagation(); + setCurrentEnvelope(item); + setOpen("restore"); + }} + > + + {t('restore_message.restore_to_imap')} + + e.stopPropagation()} + onSelect={(e) => { + e.stopPropagation(); + handleDelete(item); + }} + > + + {t('common.delete')} + + + +
+
+
+ ) + })} + {totalSelected > 0 && } +
+ ) +} diff --git a/web/src/features/attachment/mail-message-view.tsx b/web/src/features/attachment/mail-message-view.tsx new file mode 100644 index 0000000..bd3c24e --- /dev/null +++ b/web/src/features/attachment/mail-message-view.tsx @@ -0,0 +1,432 @@ +// +// Copyright (c) 2025-2026 rustmailer.com (https://rustmailer.com) +// +// This file is part of the Bichon Email Archiving Project +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + + +import { useEffect, useState } from 'react'; +import { useMutation } from '@tanstack/react-query'; +import { Loader, Download, Trash2, MessageSquareMore, FileText, FileImage, FileVideo, FileArchive, FileSpreadsheet, FileCode, FileIcon, FileAudio, Upload } from 'lucide-react'; + +import { Button } from '@/components/ui/button'; +import { Separator } from '@/components/ui/separator'; +import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip'; +import { toast } from '@/hooks/use-toast'; +import { formatBytes } from '@/lib/utils'; +import EmailIframe from '@/components/mail-iframe'; +import { + AttachmentInfo, + download_attachment, + download_message, + getContent, + load_message, +} from '@/api/mailbox/envelope/api'; +import { AxiosError } from 'axios'; +import { useSearchContext } from './context'; +import { MailThreadDialog } from './thread-dialog'; +import useMinimalAccountList from '@/hooks/use-minimal-account-list'; +import { useTranslation } from 'react-i18next'; +import { NestedEmailDialog } from './nested-email-dialog'; + + +interface MailMessageViewProps { + envelope: { + id: string; + account_id: number, + from?: string; + to?: string[]; + cc?: string[]; + bcc?: string[]; + subject?: string; + internal_date?: number; + }; + showActions?: boolean; + showHeader?: boolean; + showAttachments?: boolean; +} + +const Multilines: React.FC<{ title: string; lines: string[] }> = ({ title, lines }) => { + const { t } = useTranslation() + const [expanded, setExpanded] = useState(false); + return ( +
+
+ {title}: +
+
    + {lines.slice(0, expanded ? lines.length : 3).map((ref, i) => ( +
  • {ref}
  • + ))} +
+ {lines.length > 3 && ( + + )} +
+
+
+ ); +}; + +export const getFileConfig = (mimeType: string) => { + const type = mimeType.toLowerCase(); + if (type.includes('pdf')) { + return { icon: , color: 'text-red-600 bg-red-50 border-red-100' }; + } + if (type.includes('image/')) { + return { icon: , color: 'text-blue-600 bg-blue-50 border-blue-100' }; + } + if (type.includes('audio/')) { + return { icon: , color: 'text-purple-600 bg-purple-50 border-purple-100' }; + } + + if (type.includes('video/')) { + return { icon: , color: 'text-indigo-600 bg-indigo-50 border-indigo-100' }; + } + if (type.includes('spreadsheet') || type.includes('excel') || type.includes('csv')) { + return { icon: , color: 'text-green-600 bg-green-50 border-green-100' }; + } + if (type.includes('zip') || type.includes('compressed') || type.includes('archive')) { + return { icon: , color: 'text-orange-600 bg-orange-50 border-orange-100' }; + } + if (type.includes('text/') || type.includes('json') || type.includes('javascript')) { + return { icon: , color: 'text-slate-600 bg-slate-50 border-slate-100' }; + } + + return { icon: , color: 'text-gray-600 bg-gray-50 border-gray-100' }; +}; + +export function MailMessageView({ + envelope, + showActions = true, + showAttachments = true, + showHeader = true +}: MailMessageViewProps) { + const { t } = useTranslation() + const { setToDelete, setOpen, setSelected } = useSearchContext(); + const [content, setContent] = useState(null); + const [contentType, setContentType] = useState<'Plain' | 'Html' | null>(null); + const [attachments, setAttachments] = useState(null); + const [loading, setLoading] = useState(true); + const [downloadingAttachmentFileName, setDownloadingAttachmentFileName] = useState(null); + const [nestedEmlFile, setNestedEmlFile] = useState(null); + const { getEmailById } = useMinimalAccountList(); + const [threadOpen, setThreadOpen] = useState(false); + + const downloadAttachmentMutation = useMutation({ + mutationFn: ({ content_hash }: { content_hash: string }) => + download_attachment(envelope.account_id, envelope.id, content_hash, downloadingAttachmentFileName!), + onSuccess: () => setDownloadingAttachmentFileName(null), + onError: (error: any) => { + setDownloadingAttachmentFileName(null); + toast({ + title: t('mail.failedToDownloadFile'), + description: error.message, + variant: 'destructive', + }); + }, + }); + + const loadMessageMutation = useMutation({ + mutationFn: () => load_message(envelope.account_id, envelope.id), + onSuccess: (data) => { + setLoading(false); + setContent(getContent(data)); + if (data.attachments) setAttachments(data.attachments); + setContentType(data.html ? 'Html' : 'Plain'); + }, + onError: (error: any) => { + setLoading(false); + toast({ + title: t('mail.failedToLoadEmail'), + description: error.message, + variant: 'destructive', + }); + }, + }); + + useEffect(() => { + setLoading(true); + loadMessageMutation.mutate(); + }, [envelope.id]); + + + const handleViewNestedEml = (attachment: AttachmentInfo) => { + setNestedEmlFile(attachment); + }; + + const toggleToDelete = (accountId: number, mailId: string) => { + setToDelete(prev => { + const next = new Map(prev); + const set = new Set(next.get(accountId) || []); + + if (set.has(mailId)) { + set.delete(mailId); + if (set.size === 0) next.delete(accountId); + else next.set(accountId, set); + } else { + set.add(mailId); + next.set(accountId, set); + } + + return next; + }); + }; + + const handleDelete = () => { + if (envelope) { + toggleToDelete(envelope.account_id, envelope.id) + setOpen("delete") + } + } + + + const downloadEmlFile = async () => { + try { + toast({ title: t('mail.downloadStarted'), description: t('mail.isBeingDownloaded', { id: envelope.id }) }); + await download_message(envelope.account_id, envelope.id); + toast({ title: t('mail.downloadComplete'), description: t('mail.downloaded', { id: envelope.id }) }); + } catch (error) { + let msg = t('mail.downloadFailed'); + if (error instanceof AxiosError) { + msg = error.response?.data?.message || error.response?.data?.error || error.message; + if (error.response?.status) msg = `${error.response.status}: ${msg}`; + } else if (error instanceof Error) { + msg = error.message; + } + toast({ title: t('mail.downloadFailed'), description: msg, variant: 'destructive' }); + } + }; + + return ( +
+ {showHeader &&
+
+ {t('mail.account')}: + {getEmailById(envelope.account_id)} +
+
+ {t('mail.id')}: + {envelope.id} +
+ {envelope.from && ( +
+ {t('mail.from')}: + {envelope.from} +
+ )} + {envelope.to && envelope.to.length > 0 && } + {envelope.cc && envelope.cc.length > 0 && } + {envelope.bcc && envelope.bcc.length > 0 && } + {envelope.subject && ( +
+ {t('mail.subject')}: + {envelope.subject} +
+ )} + {envelope.internal_date && ( +
+ {t('mail.date')}: + {formatTimestamp(envelope.internal_date)} +
+ )} +
} + + {showActions && ( + <> +
+ +
+
+ + + + + {t('mail.delete')} + + + + + + + {t('mail.download')} + + + + + + + {t('mail.viewThread')} + + + + + + + {t('restore_message.restore_to_imap', 'Restore Mail')} + +
+ + )} + {showAttachments && } + {showAttachments && ( +
+ {loading ? ( + + ) : attachments && attachments.length > 0 ? ( + (() => { + const nonInline = attachments.filter((a) => !a.inline); + + return nonInline.length > 0 ? ( +
+ {nonInline.map((attachment, i) => { + const { icon, color } = getFileConfig(attachment.file_type); + const is_message = attachment.is_message; + + return
+
+
+ {icon} +
+
+ + {attachment.filename} + + + {attachment.file_type.split('/').pop()} + +
+
+
+ {is_message && ( + + + + + {t('mail.viewNestedEmail', 'View Embedded Email')} + + )} + + {formatBytes(attachment.size)} + + {downloadingAttachmentFileName === attachment.filename ? ( + + ) : ( + { + setDownloadingAttachmentFileName(attachment.filename); + downloadAttachmentMutation.mutate({ content_hash: attachment.content_hash }); + }} + /> + )} +
+
+ })} +
+ ) : ( + + {t('mail.onlyNonInlineAttachments')} + + ); + })() + ) : ( + {t('mail.noAttachments')} + )} +
+ )} + {showAttachments && } +
+ {loading ? ( +
+ + loading... +
+ ) : content ? ( +
+ {contentType === 'Html' ? ( + + ) : ( +
{content}
+ )} +
+ ) : ( +
No content available
+ )} +
+ + + !open && setNestedEmlFile(null)} + accountId={envelope.account_id} + envelopeId={envelope.id} + fileName={nestedEmlFile?.filename || ''} + content_hash={nestedEmlFile?.content_hash} + /> +
+ ); +} + +export function formatTimestamp(milliseconds: number): string { + const date = new Date(milliseconds); + const year = date.getFullYear(); + const month = String(date.getMonth() + 1).padStart(2, '0'); + const day = String(date.getDate()).padStart(2, '0'); + const hours = String(date.getHours()).padStart(2, '0'); + const minutes = String(date.getMinutes()).padStart(2, '0'); + const seconds = String(date.getSeconds()).padStart(2, '0'); + const timezoneOffset = date.getTimezoneOffset(); + const offsetSign = timezoneOffset > 0 ? '-' : '+'; + const offsetHours = String(Math.floor(Math.abs(timezoneOffset) / 60)).padStart(2, '0'); + const offsetMinutes = String(Math.abs(timezoneOffset) % 60).padStart(2, '0'); + return `${year}-${month}-${day}T${hours}:${minutes}:${seconds}${offsetSign}${offsetHours}:${offsetMinutes}`; +} \ No newline at end of file diff --git a/web/src/features/attachment/mailbox-popover.tsx b/web/src/features/attachment/mailbox-popover.tsx new file mode 100644 index 0000000..00fc39b --- /dev/null +++ b/web/src/features/attachment/mailbox-popover.tsx @@ -0,0 +1,401 @@ +// +// Copyright (c) 2025-2026 rustmailer.com (https://rustmailer.com) +// +// This file is part of the Bichon Email Archiving Project +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + + +import * as React from 'react'; +import { + ChevronDown, Folders, X, TreeDeciduous, FolderIcon, + MoreVertical, Trash2, Search, + Check +} from 'lucide-react'; +import { useQuery, useQueryClient } from '@tanstack/react-query'; +import { useTranslation } from 'react-i18next'; +import { animated, useSpring } from '@react-spring/web'; +import { styled } from '@mui/material/styles'; +import Collapse from '@mui/material/Collapse'; +import { TransitionProps } from '@mui/material/transitions'; + +import { + TreeItemCheckbox, + TreeItemContent, + TreeItemDragAndDropOverlay, + TreeItemIcon, + TreeItemIconContainer, + TreeItemLabel, + TreeItemProvider, + TreeItemRoot, + useTreeItemModel, +} from '@mui/x-tree-view'; +import { RichTreeView } from '@mui/x-tree-view/RichTreeView'; +import { useTreeItem, UseTreeItemParameters } from '@mui/x-tree-view/useTreeItem'; + +import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover'; +import { Button } from '@/components/ui/button'; +import { ScrollArea } from '@/components/ui/scroll-area'; +import { Input } from '@/components/ui/input'; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuTrigger, +} from '@/components/ui/dropdown-menu'; +import { cn } from '@/lib/utils'; + +import { list_mailboxes } from '@/api/mailbox/api'; +import useMinimalAccountList from '@/hooks/use-minimal-account-list'; +import { useSearchContext } from './context'; +import { buildTree, ExtendedTreeItemProps } from '@/lib/build-tree'; + +const CustomCollapse = styled(Collapse)({ padding: 0 }); +const AnimatedCollapse = animated(CustomCollapse); + +function TransitionComponent(props: TransitionProps) { + const style = useSpring({ + to: { + opacity: props.in ? 1 : 0, + transform: `translate3d(0,${props.in ? 0 : 20}px,0)`, + }, + }); + return ; +} + +interface CustomTreeItemProps + extends Omit, + Omit, 'onFocus'> { } + +interface CustomLabelProps { + exists?: number; + attributes?: { attr: string; extension: string | null }[], + children: React.ReactNode; + id: string; + icon?: React.ElementType; + expandable?: boolean; + onDelete: (id: string) => void; +} + +function CustomLabel({ + expandable, + exists, + attributes, + children, + id, + onDelete, + ...other +}: CustomLabelProps) { + const { t } = useTranslation() + return ( + + + + {children} + +
+ + + + + + { + e.stopPropagation(); + }} + onSelect={(e) => { + e.preventDefault(); + onDelete(id); + }} + > + + {t('common.delete')} + + + +
+
+ ); +} + +export function MailboxPopover() { + const { t } = useTranslation(); + const { filter, setFilter, setOpen, setDeleteMailboxId, setSelectedAccountId } = useSearchContext(); + const { minimalList = [] } = useMinimalAccountList(); + + const [localOpen, setLocalOpen] = React.useState(false); + const [search, setSearch] = React.useState(''); + + const accountIds: number[] = filter.account_ids ?? []; + const selectedMailboxIds: number[] = filter.mailbox_ids ?? []; + + const [localSelectedIds, setLocalSelectedIds] = React.useState([]); + const [activeAccountId, setActiveAccountId] = React.useState(undefined); + + const queryClient = useQueryClient(); + + React.useEffect(() => { + if (localOpen) { + const globalMailboxIds = filter.mailbox_ids ?? []; + setLocalSelectedIds(globalMailboxIds); + + const currentAccountIds = filter.account_ids ?? []; + if (currentAccountIds.length > 0) { + if (!activeAccountId || !currentAccountIds.includes(activeAccountId)) { + setActiveAccountId(currentAccountIds[0]); + } + } else { + setActiveAccountId(undefined); + } + } + }, [localOpen, activeAccountId, filter.account_ids, filter.mailbox_ids]); + + const { data: activeMailboxes = [], isLoading: activeIsLoading } = useQuery({ + queryKey: ['search-mailboxes', activeAccountId], + queryFn: () => list_mailboxes(activeAccountId!, false), + enabled: !!activeAccountId, + }); + + const treeData = React.useMemo(() => { + const filtered = search.trim() + ? activeMailboxes.filter(m => m.name.toLowerCase().includes(search.toLowerCase())) + : activeMailboxes; + return buildTree(filtered); + }, [activeMailboxes, search]); + + const disabled = accountIds.length === 0; + + const handleApply = () => { + setFilter(prev => ({ + ...prev, + mailbox_ids: localSelectedIds.length > 0 ? localSelectedIds : undefined + })); + setLocalOpen(false); + }; + + const handleDeleteClick = (id: string) => { + setDeleteMailboxId(id); + setSelectedAccountId(activeAccountId); + setOpen('delete-mailbox'); + }; + + + const CustomTreeItem = React.forwardRef(function CustomTreeItem( + props: CustomTreeItemProps, + ref: React.Ref, + ) { + const { id, itemId, label, disabled, children, ...other } = props; + const { + getContextProviderProps, + getRootProps, + getContentProps, + getLabelProps, + getIconContainerProps, + getCheckboxProps, + getGroupTransitionProps, + getDragAndDropOverlayProps, + status, + } = useTreeItem({ id, itemId, children, label, disabled, rootRef: ref }); + + const item = useTreeItemModel(itemId)!; + + + return ( + + + + + + + + + + + + {children && } + + + ); + }); + + return ( + + + + + + +
+
+ + setSearch(e.target.value)} + placeholder={t('search_mailbox.search_placeholder')} + className="h-9 pl-8 text-xs bg-background" + /> +
+ {localSelectedIds.length > 0 && ( + + )} +
+ +
+
+ +
+ {accountIds.map(id => { + const acc = minimalList.find(a => a.id === id); + const isActive = activeAccountId === id; + const cachedData = queryClient.getQueryData(['search-mailboxes', id]); + const count = cachedData?.filter(m => localSelectedIds.includes(m.id)).length ?? 0; + + return ( + + ); + })} +
+
+
+
+ +
+ {activeIsLoading ? ( +
+ {[1, 2, 3, 4, 5].map(i => ( +
+ ))} +
+ ) : activeAccountId ? ( + { + setLocalSelectedIds(itemIds.map(id => parseInt(id)).filter(id => !isNaN(id))); + }} + slots={{ item: CustomTreeItem }} + sx={{ width: '100%' }} + /> + ) : ( +
+ +

{t('search_mailbox.select_account_tip')}

+
+ )} +
+ + +
+
+ {t('search_mailbox.selected_total')}: {localSelectedIds.length} +
+
+ + +
+
+
+
+ + + ); +} \ No newline at end of file diff --git a/web/src/features/attachment/more-filters-popover.tsx b/web/src/features/attachment/more-filters-popover.tsx new file mode 100644 index 0000000..6c231a0 --- /dev/null +++ b/web/src/features/attachment/more-filters-popover.tsx @@ -0,0 +1,189 @@ +// +// Copyright (c) 2025-2026 rustmailer.com (https://rustmailer.com) +// +// This file is part of the Bichon Email Archiving Project +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +import * as React from "react" +import { Label } from "@/components/ui/label" +import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select" +import { Separator } from "@/components/ui/separator" +import { Info, ListFilter } from "lucide-react" +import { useTranslation } from "react-i18next" +import { useSearchContext } from "./context" +import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover" +import { Button } from "@/components/ui/button" +import { Badge } from "@/components/ui/badge" +import { Checkbox } from "@/components/ui/checkbox" +import { cn } from "@/lib/utils" +import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip" + +const SIZES = { + tiny: { min: undefined, max: 15 * 1024 }, + small: { min: undefined, max: 2 * 1024 * 1024 }, + medium: { min: 2 * 1024 * 1024, max: 10 * 1024 * 1024 }, + large: { min: 10 * 1024 * 1024, max: 20 * 1024 * 1024 }, + huge: { min: 20 * 1024 * 1024, max: undefined }, +}; + +const getPresetFromSize = (min?: number, max?: number) => { + if (min === SIZES.huge.min) return 'huge'; + if (min === SIZES.large.min && max === SIZES.large.max) return 'large'; + if (min === SIZES.medium.min && max === SIZES.medium.max) return 'medium'; + if (!min && max === SIZES.small.max) return 'small'; + if (!min && max === SIZES.tiny.max) return 'tiny'; + return 'any'; +}; + +export function MoreFiltersPopover() { + const { t } = useTranslation(); + const { filter, setFilter } = useSearchContext(); + const [open, setOpen] = React.useState(false); + + const [localState, setLocalState] = React.useState({ + size_preset: getPresetFromSize(filter?.min_size, filter?.max_size), + is_message: filter?.is_message || false + }); + + React.useEffect(() => { + if (open) { + setLocalState({ + size_preset: getPresetFromSize(filter?.min_size, filter?.max_size), + is_message: filter?.is_message || false + }); + } + }, [open, filter]); + + const handleApply = () => { + setFilter(prev => { + const next = { ...prev }; + + if (localState.is_message) next.is_message = true; + else delete next.is_message; + + const range = SIZES[localState.size_preset as keyof typeof SIZES] || { min: undefined, max: undefined }; + if (range.min) next.min_size = range.min; else delete next.min_size; + if (range.max) next.max_size = range.max; else delete next.max_size; + + return next; + }); + setOpen(false); + }; + + const activeCount = [ + filter?.min_size, + filter?.max_size, + filter?.is_message, + ].filter(Boolean).length; + + return ( + + + + + + +
+

{t('search_more.title')}

+ {activeCount > 0 && ( + + )} +
+ +
+ { + const isChecked = checked as boolean; + setLocalState(prev => ({ + ...prev, + is_message: isChecked + })); + }} + /> + + + + + + + +

{t('search_more.is_message_desc')}

+
+
+
+
+
+ + +
+ + +
+
+ ); +} \ No newline at end of file diff --git a/web/src/features/attachment/nested-email-dialog.tsx b/web/src/features/attachment/nested-email-dialog.tsx new file mode 100644 index 0000000..74b5462 --- /dev/null +++ b/web/src/features/attachment/nested-email-dialog.tsx @@ -0,0 +1,191 @@ +// +// Copyright (c) 2025-2026 rustmailer.com (https://rustmailer.com) +// +// This file is part of the Bichon Email Archiving Project +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +import { EmailEnvelope } from '@/api'; +import { AttachmentInfo, download_nested_attachment, load_nested_message } from '@/api/mailbox/envelope/api'; +import EmailIframe from '@/components/mail-iframe'; +import { Dialog, DialogContent } from '@/components/ui/dialog'; +import { Separator } from '@/components/ui/separator'; +import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip'; +import { formatBytes, formatTimestamp } from '@/lib/utils'; +import { useQuery } from '@tanstack/react-query'; +import { Download, Loader, Mail } from 'lucide-react'; +import { useTranslation } from 'react-i18next'; +import { getFileConfig } from './mail-message-view'; + +const MessageHeader = ({ + envelope, + attachments, + onDownload +}: { + envelope: EmailEnvelope, + attachments?: AttachmentInfo[], + onDownload: (nested_content_hash: string) => void +}) => { + const { t } = useTranslation(); + const displayAttachments = attachments || []; + + return ( +
+
+

+ {envelope.subject || `(${t('mail.noSubject')})`} +

+
+ {formatTimestamp(envelope.date)} +
+
+ + +
+ {/* From */} +
+ + {t('mail.from')} + + + {envelope.from} + +
+ + {envelope.to && envelope.to.length > 0 && ( +
+ + {t('mail.to')} + +
+ {envelope.to.map((addr, i) => ( + + {addr}{i < envelope.to.length - 1 ? ',' : ''} + + ))} +
+
+ )} + + {envelope.cc && envelope.cc.length > 0 && ( +
+ + {t('mail.cc')} + +
+ {envelope.cc.map((addr, i) => ( + + {addr}{i < envelope.cc.length - 1 ? ',' : ''} + + ))} +
+
+ )} + + {envelope.bcc && envelope.bcc.length > 0 && ( +
+ + {t('mail.bcc')} + +
+ {envelope.bcc.map((addr, i) => ( + + {addr}{i < envelope.bcc.length - 1 ? ',' : ''} + + ))} +
+
+ )} +
+ + {displayAttachments.length > 0 && ( +
+
+ {displayAttachments.map((att, i) => { + const { icon, color } = getFileConfig(att.file_type); + return ( + + + + + {t('mail.clickToDownload')} + + ); + })} +
+
+ )} +
+ ); +}; + + + +export function NestedEmailDialog({ open, onOpenChange, accountId, envelopeId, fileName, content_hash }: any) { + + const { data, isLoading } = useQuery({ + queryKey: ['nested-message', accountId, envelopeId, content_hash], + queryFn: () => load_nested_message(accountId, envelopeId, content_hash), + enabled: open && !!content_hash, + }); + + return ( + + +
+
+ + {fileName} +
+
+ +
+ {isLoading ? ( +
+ ) : data && ( +
+ download_nested_attachment(accountId, envelopeId, content_hash, nested_content_hash)} + /> + +
+ {data.html ? ( + + ) : ( +
+                                        {data.text}
+                                    
+ )} +
+
+ )} +
+
+
+ ); +} diff --git a/web/src/features/attachment/restore-message-dialog.tsx b/web/src/features/attachment/restore-message-dialog.tsx new file mode 100644 index 0000000..07a6a7c --- /dev/null +++ b/web/src/features/attachment/restore-message-dialog.tsx @@ -0,0 +1,186 @@ +// +// Copyright (c) 2025-2026 rustmailer.com (https://rustmailer.com) +// +// This file is part of the Bichon Email Archiving Project +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + + +import { restore_message } from '@/api/mailbox/envelope/api' +import { ConfirmDialog } from '@/components/confirm-dialog' +import { toast } from '@/hooks/use-toast' +import { useMutation } from '@tanstack/react-query' +import { AxiosError } from 'axios' +import { useTranslation } from 'react-i18next' +import { ToastAction } from '@/components/ui/toast' +import { useSearchContext } from './context' +import { EmailEnvelope } from '@/api' + +function MessageSummary({ envelope, t }: { envelope: EmailEnvelope, t: (key: string) => string }) { + return ( +
+
+ + {t("mail.subject")}: +
+ {envelope.subject || (No subject)} +
+ + {t("mail.from")}: +
+ {envelope.from} +
+ + {envelope.to?.length > 0 && ( + <> + {t("mail.to")}: +
+ {envelope.to.slice(0, 2).join(", ")} + {envelope.to.length > 2 && " …"} +
+ + )} + + {t("mail.date")}: +
+ {new Date(envelope.date).toLocaleString()} +
+ + {envelope.mailbox_name && ( + <> + {t("search.mailbox")}: +
+ {envelope.mailbox_name} +
+ + )} +
+
+ ); +} + + + +interface RestoreMessageDialogProps { + open: boolean + onOpenChange: (open: boolean) => void +} + +export function RestoreMessageDialog({ + open, + onOpenChange +}: RestoreMessageDialogProps) { + const { t } = useTranslation() + const { currentEnvelope, selected } = useSearchContext() + + const accountsWithSelection = Array.from(selected.entries()).filter(([_, ids]) => ids.size > 0); + const selectedCount = accountsWithSelection.reduce((sum, [_, set]) => sum + set.size, 0); + const accountCount = accountsWithSelection.length; + + const isBulk = selectedCount > 0; + + + const restoreMutation = useMutation({ + mutationFn: async () => { + if (isBulk) { + const promises = accountsWithSelection.map(([accountId, ids]) => + restore_message(accountId, Array.from(ids)) + ); + return Promise.all(promises); + } else if (currentEnvelope) { + return restore_message(currentEnvelope.account_id, [currentEnvelope.id]); + } + }, + onSuccess: handleRestoreSuccess, + onError: handleRestoreError, + }); + + function handleRestoreSuccess() { + toast({ + title: t('restore_message.success', 'Messages restored'), + description: t( + 'restore_message.successDesc', + 'The selected messages have been restored to the IMAP server.' + ), + action: ( + + {t('common.close')} + + ), + }); + onOpenChange(false); + } + + function handleRestoreError(error: AxiosError) { + const errorMessage = + (error.response?.data as { message?: string })?.message || + error.message || + t('restore_message.failed', 'Failed to restore messages'); + + toast({ + variant: 'destructive', + title: t( + 'restore_message.failedTitle', + 'Restore failed' + ), + description: errorMessage, + action: ( + + {t('common.tryAgain')} + + ), + }); + + console.error(error); + } + + + return ( + +

+ {t( + 'restore_message.desc', + 'This action will append the selected messages to their corresponding mailboxes on the IMAP server.' + )} +

+ + {isBulk ? ( +
+
+ {t('restore_message.summary', 'Summary')} + + {selectedCount} {t('restore_message.messages', 'messages')} + +
+
+

• {t('restore_message.accountsInvolved', 'Accounts involved')}: {accountCount}

+

• {t('restore_message.bulkWarning', 'Messages will be restored to their original folders.')}

+
+
+ ) : ( + currentEnvelope && + )} +
} + confirmText={t('restore_message.confirm', 'Restore')} + handleConfirm={() => restoreMutation.mutate()} + className="sm:max-w-sm" + isLoading={restoreMutation.isPending} + disabled={restoreMutation.isPending || (!isBulk && !currentEnvelope)} + /> + ) +} diff --git a/web/src/features/attachment/sender-popover.tsx b/web/src/features/attachment/sender-popover.tsx new file mode 100644 index 0000000..c9bd3e0 --- /dev/null +++ b/web/src/features/attachment/sender-popover.tsx @@ -0,0 +1,88 @@ +// +// Copyright (c) 2025-2026 rustmailer.com (https://rustmailer.com) +// +// This file is part of the Bichon Email Archiving Project +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +import * as React from "react" +import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover" +import { Button } from "@/components/ui/button" +import { cn } from "@/lib/utils" +import { ChevronDown, Mail } from "lucide-react" +import { useTranslation } from 'react-i18next' +import { useSearchContext } from "./context" +import { userAttachmentSenders } from "@/hooks/use-attachment-senders" +import { Group } from "@/api/system/api" +import { MetadataSelectorField } from "./attachment-metadata-selector" + +export function SenderFilterPopover() { + const { t } = useTranslation() + const { filter, setFilter } = useSearchContext() + const { senders, isLoading } = userAttachmentSenders("") + + const activeCount = filter.from ? 1 : 0 + const senderOptions: Group[] = React.useMemo(() => { + return senders.map(email => ({ + key: email, + count: 0 + })) + }, [senders]) + + const updateFilter = (email: string | undefined) => { + setFilter(prev => ({ + ...prev, + from: email + })) + } + + return ( + + + + + + +
+ updateFilter(val)} + onReset={() => updateFilter(undefined)} + /> +
+
+
+ ) +} \ No newline at end of file diff --git a/web/src/features/attachment/table/data-table-column-header.tsx b/web/src/features/attachment/table/data-table-column-header.tsx new file mode 100644 index 0000000..041e72a --- /dev/null +++ b/web/src/features/attachment/table/data-table-column-header.tsx @@ -0,0 +1,83 @@ +// +// Copyright (c) 2025-2026 rustmailer.com (https://rustmailer.com) +// +// This file is part of the Bichon Email Archiving Project +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + + +import { + ArrowDownIcon, + ArrowUpIcon, + CaretSortIcon, +} from '@radix-ui/react-icons' +import { Column } from '@tanstack/react-table' +import { cn } from '@/lib/utils' +import { Button } from '@/components/ui/button' +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuTrigger, +} from '@/components/ui/dropdown-menu' +import { useTranslation } from 'react-i18next' + +interface DataTableColumnHeaderProps + extends React.HTMLAttributes { + column: Column + title: string +} + +export function DataTableColumnHeader({ + column, + title, + className, +}: DataTableColumnHeaderProps) { + if (!column.getCanSort()) { + return
{title}
+ } + const { t } = useTranslation() + return ( +
+ + + + + + column.toggleSorting(false)}> + + {t('table.asc')} + + column.toggleSorting(true)}> + + {t('table.desc')} + + + +
+ ) +} diff --git a/web/src/features/attachment/table/data-table-row-actions.tsx b/web/src/features/attachment/table/data-table-row-actions.tsx new file mode 100644 index 0000000..7d4fe81 --- /dev/null +++ b/web/src/features/attachment/table/data-table-row-actions.tsx @@ -0,0 +1,71 @@ +// +// Copyright (c) 2025-2026 rustmailer.com (https://rustmailer.com) +// +// This file is part of the Bichon Email Archiving Project +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + + +import { Row } from '@tanstack/react-table' +import { Button } from '@/components/ui/button' +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuShortcut, + DropdownMenuTrigger, +} from '@/components/ui/dropdown-menu' +import { useTranslation } from 'react-i18next' +import { MoreVertical, TagIcon } from 'lucide-react' +import { useSearchContext } from '../context' +import { AttachmentModel } from '@/api/attachment/api' + +interface DataTableRowActionsProps { + row: Row +} + +export function DataTableRowActions({ row }: DataTableRowActionsProps) { + const { setOpen, setCurrentEnvelope, setSelected } = useSearchContext() + const { t } = useTranslation() + + return ( + <> + + + + + + { + e.stopPropagation() + setCurrentEnvelope(row.original) + setOpen("edit-tags") + }} + > + {t('attachment.editTag')} + + + + + + + + ) +} diff --git a/web/src/features/attachment/table/table.tsx b/web/src/features/attachment/table/table.tsx new file mode 100644 index 0000000..8c10049 --- /dev/null +++ b/web/src/features/attachment/table/table.tsx @@ -0,0 +1,168 @@ +// +// Copyright (c) 2025-2026 rustmailer.com (https://rustmailer.com) +// +// This file is part of the Bichon Email Archiving Project +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + + +import { useState, MouseEvent as ReactMouseEvent, useEffect } from 'react' +import { + ColumnDef, + ColumnFiltersState, + Row, + RowData, + flexRender, + getCoreRowModel, + getFacetedRowModel, + getFacetedUniqueValues, + getFilteredRowModel, + getSortedRowModel, + useReactTable, +} from '@tanstack/react-table' +import { type Table } from '@tanstack/react-table' +import { + Table as ShadcnTable, + TableBody, + TableCell, + TableHead, + TableHeader, + TableRow, +} from '@/components/ui/table' +import { useTranslation } from 'react-i18next' +import { cn } from '@/lib/utils' +import { useSearchContext } from '../context' +import { ScrollArea } from '@/components/ui/scroll-area' +import { AttachmentModel } from '@/api/attachment/api' + + + +declare module '@tanstack/react-table' { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + interface ColumnMeta { + className: string + } +} + +interface DataTableProps { + columns: ColumnDef[] + data: AttachmentModel[] + onRowClick: (e: ReactMouseEvent, row: Row) => void + setSortBy: (sortBy: "DATE" | "SIZE") => void + setSortOrder: (value: "desc" | "asc") => void + children?: (table: Table) => React.ReactNode +} + +export function SearchTable({ columns, data, onRowClick, setSortBy, setSortOrder, children }: DataTableProps) { + const { sorting, setSorting } = useSearchContext() + const { t } = useTranslation() + const [rowSelection, setRowSelection] = useState({}) + const [columnFilters, setColumnFilters] = useState([]) + + useEffect(() => { + const [value] = sorting + setSortBy(value.id.toUpperCase() as "DATE" | "SIZE") + setSortOrder(value.desc ? "desc" : "asc") + }, [sorting]) + + const table = useReactTable({ + data, + columns, + state: { + sorting, + rowSelection, + columnFilters, + }, + enableRowSelection: true, + onRowSelectionChange: setRowSelection, + onSortingChange: setSorting, + onColumnFiltersChange: setColumnFilters, + getCoreRowModel: getCoreRowModel(), + getFilteredRowModel: getFilteredRowModel(), + getSortedRowModel: getSortedRowModel(), + getFacetedRowModel: getFacetedRowModel(), + getFacetedUniqueValues: getFacetedUniqueValues(), + }) + + return ( +
+ {children && (<>{children(table)})} + + + + {table.getHeaderGroups().map((headerGroup) => ( + + {headerGroup.headers.map((header) => { + return ( + + {header.isPlaceholder + ? null + : flexRender( + header.column.columnDef.header, + header.getContext() + )} + + ) + })} + + ))} + + + {table.getRowModel().rows?.length ? ( + table.getRowModel().rows.map((row) => ( + onRowClick(e, row)} + > + {row.getVisibleCells().map((cell) => ( + + {flexRender( + cell.column.columnDef.cell, + cell.getContext() + )} + + ))} + + )) + ) : ( + + + {t('common.table.noResults')} + + + )} + + + + +
+ ) +} diff --git a/web/src/features/attachment/table/toolbar.tsx b/web/src/features/attachment/table/toolbar.tsx new file mode 100644 index 0000000..9f72552 --- /dev/null +++ b/web/src/features/attachment/table/toolbar.tsx @@ -0,0 +1,60 @@ +import { type Table } from '@tanstack/react-table' +import { DataTableViewOptions } from './view-options' +import { TagFilterPopover } from '../tag-filter-popover' +import { TimePopover } from '../time-popover' +import { SenderFilterPopover } from '../sender-popover' +import { TextSearchInput } from '../text-search-input' +import { MoreFiltersPopover } from '../more-filters-popover' +import { FilterResetButton } from '../filter-reset' +import { MailboxPopover } from '../mailbox-popover' +import { AccountPopover } from '../account-popover' +import { MetadataFilter } from '../attachment-metadata-filter' +import { FileType, Laptop, Tag } from 'lucide-react' + +type DataTableToolbarProps = { + table: Table +} + +export function DataTableToolbar({ + table, +}: DataTableToolbarProps) { + return ( +
+
+
+ +
+
+
+
+
+ + + + + + } + /> + } + /> + } + /> + + +
+ +
+
+ + +
+
+
+ ) +} \ No newline at end of file diff --git a/web/src/features/attachment/table/view-options.tsx b/web/src/features/attachment/table/view-options.tsx new file mode 100644 index 0000000..c9b7783 --- /dev/null +++ b/web/src/features/attachment/table/view-options.tsx @@ -0,0 +1,80 @@ +import { DropdownMenuTrigger } from '@radix-ui/react-dropdown-menu' +import { MixerHorizontalIcon } from '@radix-ui/react-icons' +import { type Table } from '@tanstack/react-table' +import { Button } from '@/components/ui/button' +import { + DropdownMenu, + DropdownMenuCheckboxItem, + DropdownMenuContent, + DropdownMenuLabel, + DropdownMenuSeparator, +} from '@/components/ui/dropdown-menu' +import React from 'react' +import { useTranslation } from 'react-i18next' + +type DataTableViewOptionsProps = { + table: Table +} + +const defaultColumns = (t: (key: string) => string) => [ + { label: t('search.account'), value: "account_email" }, + { label: t('search.mailbox'), value: "mailbox_name" }, + { label: t('search.from'), value: "from" }, + { label: t('search.to'), value: "to" }, + { label: t('search.subject'), value: "subject" }, + { label: t('search.size'), value: "size" }, + { label: t('search.date'), value: "date" }, +] + + +export function DataTableViewOptions({ + table, +}: DataTableViewOptionsProps) { + const { t } = useTranslation() + + + const columnLabels = React.useMemo(() => { + return Object.fromEntries( + defaultColumns(t).map(col => [col.value, col.label]) + ) + }, [t]); + + + const visibleColumnKeys = React.useMemo(() => { + return new Set(defaultColumns(t).map(c => c.value)) + }, [t]) + + return ( + + + + + + {t('search_view.menu_title')} + + {table + .getAllColumns() + .filter(column => visibleColumnKeys.has(column.id)) + .map((column) => { + return ( + column.toggleVisibility(!!value)} + > + {columnLabels[column.id] ?? column.id} + + ) + })} + + + ) +} diff --git a/web/src/features/attachment/tag-filter-popover.tsx b/web/src/features/attachment/tag-filter-popover.tsx new file mode 100644 index 0000000..d48d867 --- /dev/null +++ b/web/src/features/attachment/tag-filter-popover.tsx @@ -0,0 +1,209 @@ +// +// Copyright (c) 2025-2026 rustmailer.com (https://rustmailer.com) +// +// This file is part of the Bichon Email Archiving Project +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +import * as React from 'react' +import { Tag, ChevronDown, X } from 'lucide-react' +import { useTranslation } from 'react-i18next' + +import { Badge } from '@/components/ui/badge' +import { Button } from '@/components/ui/button' +import { Checkbox } from '@/components/ui/checkbox' +import { Input } from '@/components/ui/input' +import { Label } from '@/components/ui/label' +import { ScrollArea } from '@/components/ui/scroll-area' +import { + Popover, + PopoverContent, + PopoverTrigger, +} from '@/components/ui/popover' +import { cn } from '@/lib/utils' +import { useSearchContext } from './context' +import { useAvailableAttachmentTags } from '@/hooks/use-available-attachment-tags' + +export function TagFilterPopover() { + const { t } = useTranslation() + const [search, setSearch] = React.useState('') + const { filter, setFilter } = useSearchContext() + + const selectedTags = (filter?.tags as string[]) || [] + + const { + tagsCount = [], + isLoading, + } = useAvailableAttachmentTags() + + const handleTagToggle = (tag: string) => { + setFilter(prev => { + const next = { ...prev } + const currentTags = (next.tags as string[]) || [] + const isSelected = currentTags.includes(tag) + + const nextTags = isSelected + ? currentTags.filter(t => t !== tag) + : [...currentTags, tag] + + if (nextTags.length > 0) { + next.tags = nextTags + } else { + delete next.tags + } + + return next + }) + } + + const clearAllTags = () => { + setFilter(prev => { + const next = { ...prev } + delete next.tags + return next + }) + } + + const filteredTags = React.useMemo(() => { + const q = search.toLowerCase() + + return tagsCount + .filter(t => + !q || t.tag.toLowerCase().includes(q) + ) + .sort((a, b) => { + const aSelected = selectedTags.includes(a.tag) + const bSelected = selectedTags.includes(b.tag) + if (aSelected && !bSelected) return -1 + if (!aSelected && bSelected) return 1 + return b.count - a.count + }) + }, [tagsCount, search, selectedTags]) + + return ( + + + + + + +
+ setSearch(e.target.value)} + placeholder={t('tag.search_placeholder')} + className="h-8 text-sm" + autoFocus + /> +
+ + {!search && selectedTags.length > 0 && ( + <> +
+
+ +
+ + {t('tag.clear_all')} + + ({selectedTags.length}) +
+
+ + )} + {isLoading ? ( +
+ {Array.from({ length: 6 }).map((_, i) => ( +
+ ))} +
+ ) : filteredTags.length === 0 ? ( +

+ {t('tag.no_tags_found')} +

+ ) : ( + filteredTags.map(({ tag, count }) => { + const checked = selectedTags.includes(tag) + const id = `tag-${tag}` + + return ( +
handleTagToggle(tag)} + className={cn( + 'flex items-center gap-2 px-2 py-1.5 rounded-md cursor-pointer', + 'hover:bg-accent transition-colors' + )} + > + + handleTagToggle(tag) + } + onClick={(e) => + e.stopPropagation() + } + /> + + + {count} + +
+ ) + }) + )} + + + + ) +} \ No newline at end of file diff --git a/web/src/features/attachment/text-search-input.tsx b/web/src/features/attachment/text-search-input.tsx new file mode 100644 index 0000000..66bb070 --- /dev/null +++ b/web/src/features/attachment/text-search-input.tsx @@ -0,0 +1,227 @@ +// +// Copyright (c) 2025-2026 rustmailer.com (https://rustmailer.com) +// +// This file is part of the Bichon Email Archiving Project +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +import React, { useState, useEffect, useRef } from "react" +import { Input } from "@/components/ui/input" +import { Button } from "@/components/ui/button" +import { Search, X, Clock, Trash2 } from "lucide-react" +import { cn } from "@/lib/utils" +import { useSearchContext } from "./context" +import { useTranslation } from "react-i18next" +import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select" + +const STORAGE_KEY = "bichon_attachment_search_history" +const MAX_HISTORY = 20 + + +type SearchField = "text" | "subject" | "attachment_name" | "from" +const SEARCH_FIELDS: SearchField[] = ["text", "subject", "attachment_name", "from"] + +export function TextSearchInput() { + const { t } = useTranslation() + const { filter, setFilter } = useSearchContext() + + const [value, setValue] = useState("") + const [field, setField] = useState("text") + const [history, setHistory] = useState([]) + const [showHistory, setShowHistory] = useState(false) + + const inputRef = useRef(null) + const containerRef = useRef(null) + + useEffect(() => { + const activeField = SEARCH_FIELDS.find(key => !!filter[key]) || "text" + const activeValue = filter[activeField] as string || "" + + setField(activeField) + setValue(activeValue) + }, [filter]) + + useEffect(() => { + try { + const saved = localStorage.getItem(STORAGE_KEY) + if (saved) setHistory(JSON.parse(saved)) + } catch (err) { + console.warn("Failed to load attachment search history", err) + } + }, []) + + const applyFilter = (currentField: SearchField, searchTerm: string) => { + const trimmed = searchTerm.trim() + + setFilter((prev) => { + const next = { ...prev } + SEARCH_FIELDS.forEach(f => { + delete next[f] + }) + if (trimmed) { + next[currentField] = trimmed + } + return next + }) + + if (trimmed) { + saveToHistory(trimmed) + } + setShowHistory(false) + inputRef.current?.blur() + } + + const saveToHistory = (term: string) => { + setHistory((prev) => { + const trimmed = term.trim() + const newHistory = [trimmed, ...prev.filter((item) => item !== trimmed)].slice(0, MAX_HISTORY) + localStorage.setItem(STORAGE_KEY, JSON.stringify(newHistory)) + return newHistory + }) + } + + const handleSearch = () => applyFilter(field, value) + + const handleClear = () => { + setValue("") + applyFilter(field, "") + } + + const handleSelectHistory = (term: string) => { + setValue(term) + applyFilter(field, term) + } + + const handleClearHistory = (e: React.MouseEvent) => { + e.stopPropagation() + setHistory([]) + localStorage.removeItem(STORAGE_KEY) + } + + useEffect(() => { + const handleClickOutside = (e: MouseEvent) => { + if (containerRef.current && !containerRef.current.contains(e.target as Node)) { + setShowHistory(false) + } + } + document.addEventListener("mousedown", handleClickOutside) + return () => document.removeEventListener("mousedown", handleClickOutside) + }, []) + + return ( +
+
+ +
+ + setValue(e.target.value)} + onFocus={() => setShowHistory(true)} + onKeyDown={(e) => e.key === "Enter" && handleSearch()} + placeholder={t("attachment.search_input_placeholder")} + className="h-9 border-none shadow-none focus-visible:ring-0 pl-9 pr-10 text-sm bg-transparent w-full" + /> + {value && ( + + )} +
+ +
+ {showHistory && ( +
+
+
+ + {t("search_input.recent_title")} +
+ {history.length > 0 && ( + + )} +
+ +
+ {history.length > 0 ? ( + history.map((term, idx) => ( + + )) + ) : ( +
+ {t("search_input.no_history")} +
+ )} +
+
+ )} +
+ ) +} \ No newline at end of file diff --git a/web/src/features/attachment/thread-dialog.tsx b/web/src/features/attachment/thread-dialog.tsx new file mode 100644 index 0000000..b7dadc2 --- /dev/null +++ b/web/src/features/attachment/thread-dialog.tsx @@ -0,0 +1,221 @@ +// +// Copyright (c) 2025-2026 rustmailer.com (https://rustmailer.com) +// +// This file is part of the Bichon Email Archiving Project +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +import { useState } from 'react'; +import { useInfiniteQuery } from '@tanstack/react-query'; +import { ChevronDown, ChevronUp, Loader2, MessageSquareText } from 'lucide-react'; + +import { + Dialog, + DialogContent, + DialogHeader, + DialogTitle, +} from '@/components/ui/dialog'; +import { Button } from '@/components/ui/button'; +import { Card, CardContent, CardHeader } from '@/components/ui/card'; +import { Skeleton } from '@/components/ui/skeleton'; +import { get_thread_messages } from '@/api/mailbox/envelope/api'; +import { MailMessageView } from './mail-message-view'; +import { useSearchContext } from './context'; +import { useTranslation } from 'react-i18next'; +import { format } from 'date-fns'; + +interface MailThreadDialogProps { + open: boolean; + onOpenChange: (open: boolean) => void; +} + +export function MailThreadDialog({ open, onOpenChange }: MailThreadDialogProps) { + const { currentEnvelope } = useSearchContext(); + const [expandedIds, setExpandedIds] = useState>(new Set()); + const { t } = useTranslation(); + + const threadId = currentEnvelope?.thread_id; + const accountId = currentEnvelope?.account_id; + + const { + data, + fetchNextPage, + hasNextPage, + isFetchingNextPage, + isLoading, + isError, + error, + } = useInfiniteQuery({ + queryKey: ['thread', accountId, threadId], + queryFn: ({ pageParam = 1 }) => + get_thread_messages(accountId!, threadId!, pageParam, 10), + getNextPageParam: (lastPage) => + lastPage.current_page && lastPage.total_pages + ? lastPage.current_page < lastPage.total_pages + ? lastPage.current_page + 1 + : undefined + : undefined, + enabled: open && !!accountId && !!threadId, + initialPageParam: 1, + }); + + const allMessages = data?.pages.flatMap((page) => page.items) ?? []; + const totalCount = data?.pages[0]?.total_items ?? 0; + + const toggleExpand = (id: string) => { + setExpandedIds((prev) => { + const next = new Set(prev); + next.has(id) ? next.delete(id) : next.add(id); + return next; + }); + }; + + return ( + + + {/* Header */} + +
+ + +
+ {t('search.thread.title', { count: totalCount })} +
+
+
+
+ + {/* Body */} +
+ {isLoading && } + + {isError && ( +
+ {t('search.thread.error')}: {(error as Error)?.message} +
+ )} + + {!isLoading && allMessages.length === 0 && ( +
+ {t('search.thread.empty')} +
+ )} + + {allMessages + .sort((a, b) => a.date - b.date) + .map((msg) => { + const isExpanded = expandedIds.has(msg.id); + const preview = msg.preview; + const date = new Date(msg.date); + const formattedDate = isNaN(date.getTime()) + ? t('search.thread.invalidDate') + : format(date, 'yyyy-MM-dd HH:mm:ss'); + + return ( + + toggleExpand(msg.id)} + > +
+
+
+ {msg.from} + + + {msg.to.join(', ')} + +
+

+ {msg.subject || t('search.thread.noSubject')} +

+ {!isExpanded && preview && ( +

+ {preview} +

+ )} +
+ +
+ {formattedDate} + {isExpanded ? ( + + ) : ( + + )} +
+
+
+ + {isExpanded && ( + +
+ +
+
+ )} +
+ ); + })} + + {hasNextPage && ( +
+ +
+ )} +
+
+
+ ); +} + +// Skeleton +function ThreadSkeleton() { + return ( +
+ {[...Array(3)].map((_, i) => ( + + + + + + + + + ))} +
+ ); +} diff --git a/web/src/features/attachment/time-popover.tsx b/web/src/features/attachment/time-popover.tsx new file mode 100644 index 0000000..65dc9eb --- /dev/null +++ b/web/src/features/attachment/time-popover.tsx @@ -0,0 +1,244 @@ +// +// Copyright (c) 2025-2026 rustmailer.com (https://rustmailer.com) +// +// This file is part of the Bichon Email Archiving Project +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +import * as React from 'react' +import { CalendarRange, ChevronDown, X } from 'lucide-react' +import { useTranslation } from 'react-i18next' +import { format } from 'date-fns' +import { + Popover, + PopoverContent, + PopoverTrigger, +} from '@/components/ui/popover' +import { Button } from '@/components/ui/button' +import { Input } from '@/components/ui/input' +import { cn } from '@/lib/utils' +import { useSearchContext } from './context' +import { DatePicker } from '@/components/date-picker' + +const DAY = 86400000 + +export function TimePopover() { + const { t } = useTranslation() + const { filter, setFilter } = useSearchContext() + const [customDays, setCustomDays] = React.useState('') + + const since = filter.since + const before = filter.before + + const toDate = (ts: number) => { + return format(ts, t('time.format')) + } + + const label = (s?: number, b?: number) => { + if (!s && !b) return t('time.label') + if (s && b) return `${toDate(s)} → ${toDate(b)}` + if (s) return `${t('time.since')} ${toDate(s)}` + return `${t('time.before')} ${toDate(b!)}` + } + + const setRange = (s?: number, b?: number) => { + setFilter(prev => { + const next = { ...prev } + s ? (next.since = s) : delete next.since + b ? (next.before = b) : delete next.before + return next + }) + } + + const setSince = (s?: number) => setRange(s, before) + const setBefore = (b?: number) => setRange(since, b) + + const handleApplyRecent = () => { + const days = parseInt(customDays) + if (!isNaN(days) && days > 0) { + setRange(Date.now() - days * DAY, undefined) + } + } + + const clear = () => { + setRange() + setCustomDays('') + } + + return ( + + + + + + +
+
+
+ {[1, 7, 30].map(d => ( + setRange(Date.now() - d * DAY, undefined)}> + {d === 1 ? t('time.last_day') : t('time.last_days', { count: d })} + + ))} + {[3, 6].map(m => ( + setRange(Date.now() - m * 30 * DAY, undefined)}> + {t('time.last_months', { count: m })} + + ))} +
+ +
+ + {t('time.recent_prefix')} + + setCustomDays(e.target.value)} + onKeyDown={e => e.key === 'Enter' && handleApplyRecent()} + /> + + {t('time.days_ago_to_now')} + + +
+
+
+ +
+
+ {[1, 2, 3, 5, 10].map(y => ( + setRange(undefined, Date.now() - y * 365 * DAY)} + className="border-orange-200 hover:border-orange-400 hover:text-orange-600" + > + {t('time.over_years_ago', { + count: y, + unit: y === 1 ? t('time.year') : t('time.years') + })} + + ))} +
+
+ +
+
+
+ + {t('time.since').toUpperCase()}: + +
+ setSince(date?.getTime())} + /> +
+
+ +
+ + {t('time.before').toUpperCase()}: + +
+ setBefore(date?.getTime())} + /> +
+
+
+
+ + {(since || before) && ( +
+ +
+ )} +
+
+ ) +} + +function Section({ title, children }: { title: string; children: React.ReactNode }) { + return ( +
+
+ {title} +
+ {children} +
+ ) +} + +function Quick({ + children, + onClick, + className +}: { + children: React.ReactNode; + onClick: () => void; + className?: string +}) { + return ( + + ) +} \ No newline at end of file diff --git a/web/src/features/search/account-popover.tsx b/web/src/features/search/account-popover.tsx index 7ebb14e..0e7e72b 100644 --- a/web/src/features/search/account-popover.tsx +++ b/web/src/features/search/account-popover.tsx @@ -102,7 +102,7 @@ export function AccountPopover() { size="sm" variant="outline" className={cn( - 'h-8 gap-1.5 px-3 rounded-none', + 'h-6 gap-1.5 px-3 rounded-none', selectedIds.length > 0 && 'bg-primary/10 border-primary text-primary' )} diff --git a/web/src/features/search/contact-popover.tsx b/web/src/features/search/contact-popover.tsx index c07b2cd..15d32b2 100644 --- a/web/src/features/search/contact-popover.tsx +++ b/web/src/features/search/contact-popover.tsx @@ -62,7 +62,7 @@ export function MailFilterPopover() { size="sm" variant="outline" className={cn( - 'h-8 rounded-none px-3 gap-1.5 transition-colors', + 'h-6 rounded-none px-3 gap-1.5 transition-colors', activeCount > 0 && 'bg-primary/10 text-primary hover:bg-primary/20' )} > diff --git a/web/src/features/search/filter-reset.tsx b/web/src/features/search/filter-reset.tsx index 673609f..da8aec2 100644 --- a/web/src/features/search/filter-reset.tsx +++ b/web/src/features/search/filter-reset.tsx @@ -42,7 +42,7 @@ export function FilterResetButton() { size="sm" onClick={() => setFilter(q ? { q } : {})} className={cn( - "h-8 px-2 text-xs gap-1.5 font-normal", + "h-6 px-2 text-xs gap-1.5 font-normal", "text-muted-foreground hover:text-destructive hover:bg-destructive/10 transition-colors" )} title={t('search_reset.tooltip')} diff --git a/web/src/features/search/index.tsx b/web/src/features/search/index.tsx index ecd914a..5fad1e5 100644 --- a/web/src/features/search/index.tsx +++ b/web/src/features/search/index.tsx @@ -21,7 +21,7 @@ import { Card, CardContent } from '@/components/ui/card'; import { FixedHeader } from '@/components/layout/fixed-header'; import { Main } from '@/components/layout/main'; import { useSearchMessages } from '@/hooks/use-search-messages'; -import { EnvelopeListPagination } from '@/components/pagination'; +import { AttachmentListPagination } from '@/components/pagination'; import React from 'react'; import { EmailEnvelope } from '@/api'; import { MailDisplayDrawer } from './mail-display-dialog'; @@ -36,7 +36,7 @@ import { SortingState } from '@tanstack/react-table'; import { MailBoxDeleteDialog } from './delete-mailbox-dialog'; import { UpdateTagsDialog } from './bulk-add-tag-dialog'; -export default function Search() { +export default function EmailSearch() { const { t } = useTranslation() const [selectedEnvelope, setSelectedEnvelope] = React.useState(undefined); const [open, setOpen] = useDialogState(null) @@ -125,7 +125,7 @@ export default function Search() { setSortBy={setSortBy} setSortOrder={setSortOrder} /> - {total > 0 && 0 && page < totalPages} pageIndex={page - 1} @@ -156,7 +156,7 @@ export default function Search() { /> setOpen('update-tags')} /> diff --git a/web/src/features/search/mail-list-table.tsx b/web/src/features/search/mail-list-table.tsx index e499789..4386edc 100755 --- a/web/src/features/search/mail-list-table.tsx +++ b/web/src/features/search/mail-list-table.tsx @@ -86,110 +86,54 @@ export function MailListTable({ maxSize: 25, }, { - accessorKey: "account_email", - header: t('search.account'), + accessorKey: "source", + header: t('search.source'), cell: ({ row }) => { + const { from, account_email, mailbox_name, account_id, mailbox_id } = row.original; const { setFilter } = useSearchMessages(); - const { account_email, account_id } = row.original; + const accountPrefix = account_email.split('@')[0]; return ( -
{ - e.stopPropagation(); - setFilter((prev: any) => ({ - ...prev, - account_ids: [account_id], - mailbox_ids: undefined - })) - }} - > -
-
- - {account_email} - -
- ); - }, - meta: { className: 'w-[150px]' }, - minSize: 150, maxSize: 150, - }, - { - accessorKey: "mailbox_name", - header: t('search.mailbox'), - cell: ({ row }) => { - const { setFilter } = useSearchMessages(); - const { mailbox_name, mailbox_id, account_id, tags } = row.original; +
+
{ + e.stopPropagation(); + setFilter((prev: any) => ({ ...prev, from: from })); + }} + > + + {from} + +
- if (!mailbox_name) return null; - const safeTags = tags ?? []; - const visibleTags = safeTags.slice(0, 2); +
+ { + e.stopPropagation(); + setFilter((prev: any) => ({ ...prev, account_ids: [account_id], mailbox_ids: undefined })); + }} + > + {accountPrefix} + - return ( -
{ - e.stopPropagation(); - setFilter((prev: any) => ({ - ...prev, - account_ids: [account_id], - mailbox_ids: [mailbox_id] - })) - }} - > -
-
- -
- + / + { + e.stopPropagation(); + setFilter((prev: any) => ({ ...prev, account_ids: [account_id], mailbox_ids: [mailbox_id] })); + }} + > {mailbox_name} -
- {visibleTags.map((tag, i) => ( - - {tag} - - ))} - {safeTags.length > 2 && ( - - +{safeTags.length - 2} - - )} -
); }, - meta: { className: 'text-xs' }, - maxSize: 120, - }, - { - accessorKey: "from", - header: t('search.from'), - cell: ({ row }) => { - const fromEmail = row.original.from; - const { setFilter } = useSearchMessages(); - - return ( -
{ - e.stopPropagation(); - setFilter((prev: Record) => ({ ...prev, from: fromEmail })) - }} - > -
-
- - {fromEmail} - -
- ); - }, meta: { className: 'text-left text-xs' }, - minSize: 150, - maxSize: 300, }, { accessorKey: "to", @@ -224,20 +168,17 @@ export function MailListTable({
); }, - meta: { className: 'text-left text-xs' }, - minSize: 150, - maxSize: 200, + meta: { className: 'text-left text-xs' } }, { accessorKey: "subject", header: t('search.subject'), cell: ({ row }) => {row.original.subject}, - meta: { className: 'text-left text-xs' }, - maxSize: 450, + meta: { className: 'text-left text-xs' } }, { id: "text_preview", - header: () => null, + header: t('search.preview'), cell: ({ row }) => { const preview = row.original.preview @@ -265,18 +206,18 @@ export function MailListTable({ ) }, - meta: { className: "text-center max-w-[80px]" }, - minSize: 36, - maxSize: 36, + meta: { className: "text-center text-xs" }, enableSorting: false, + minSize: 100, + maxSize: 100, }, { id: "attachment_count", header: () => , cell: ({ row }) => {row.original.regular_attachment_count}, meta: { className: 'text-left text-xs' }, - minSize: 40, - maxSize: 40 + minSize: 30, + maxSize: 30, }, { accessorKey: 'size', @@ -285,8 +226,8 @@ export function MailListTable({ ), cell: ({ row }) => {formatBytes(row.original.size)}, meta: { className: 'text-left text-xs' }, - minSize: 100, - maxSize: 100, + minSize: 80, + maxSize: 80, }, { accessorKey: 'date', @@ -308,15 +249,15 @@ export function MailListTable({ ) }, meta: { className: 'text-left text-xs' }, - minSize: 130, - maxSize: 130, + minSize: 100, + maxSize: 100, }, { id: 'actions', header: t('users.columns.actions'), cell: DataTableRowActions, meta: { className: 'text-right text-xs' }, - minSize: 50, + minSize: 60, maxSize: 60, }, ] diff --git a/web/src/features/search/mailbox-popover.tsx b/web/src/features/search/mailbox-popover.tsx index b31f581..6447fec 100644 --- a/web/src/features/search/mailbox-popover.tsx +++ b/web/src/features/search/mailbox-popover.tsx @@ -271,7 +271,7 @@ export function MailboxPopover() { variant="outline" disabled={disabled} className={cn( - 'h-8 rounded-none px-3 gap-1.5 transition-colors', + 'h-6 rounded-none px-3 gap-1.5 transition-colors', selectedMailboxIds.length > 0 && 'bg-primary/10 text-primary border-primary/20' )} > diff --git a/web/src/features/search/more-filters-popover.tsx b/web/src/features/search/more-filters-popover.tsx index 1fdcdaa..0c9a4d4 100644 --- a/web/src/features/search/more-filters-popover.tsx +++ b/web/src/features/search/more-filters-popover.tsx @@ -129,7 +129,7 @@ export function MoreFiltersPopover() { variant="outline" size="sm" className={cn( - "h-8 gap-2 px-3 rounded-none border-l-0", + "h-6 gap-2 px-3 rounded-none border-l-0", activeCount > 0 && "bg-primary/10 border-primary text-primary" )} > @@ -218,7 +218,7 @@ export function MoreFiltersPopover() { /> {children && (<>{children(table)})} - + {table.getHeaderGroups().map((headerGroup) => ( @@ -159,7 +159,6 @@ export function SearchTable({ columns, data, onRowClick, setSortBy, setSortOrder )} - diff --git a/web/src/features/search/table/toolbar.tsx b/web/src/features/search/table/toolbar.tsx index d00d4fb..bc03150 100644 --- a/web/src/features/search/table/toolbar.tsx +++ b/web/src/features/search/table/toolbar.tsx @@ -16,27 +16,28 @@ type DataTableToolbarProps = { export function DataTableToolbar({ table, }: DataTableToolbarProps) { - - - return ( -
-
- -
-
-
- - - - - - - +
+
+
+
-
+
+
+
+
+ + + + + +
+
+ + +
) diff --git a/web/src/features/search/table/view-options.tsx b/web/src/features/search/table/view-options.tsx index 2ffb6cf..c9b7783 100644 --- a/web/src/features/search/table/view-options.tsx +++ b/web/src/features/search/table/view-options.tsx @@ -50,7 +50,7 @@ export function DataTableViewOptions({ - +
@@ -109,22 +115,26 @@ export function TimePopover() { ))}
-
- {t('time.recent_prefix')} +
+ + {t('time.recent_prefix')} + setCustomDays(e.target.value)} onKeyDown={e => e.key === 'Enter' && handleApplyRecent()} /> - {t('time.days_ago_to_now')} + + {t('time.days_ago_to_now')} +
+
{[1, 2, 3, 5, 10].map(y => ( @@ -148,23 +159,33 @@ export function TimePopover() { ))}
+
-
-
- {t('time.since').toUpperCase()} - setSince(date?.getTime())} - /> +
+
+ + {t('time.since').toUpperCase()}: + +
+ setSince(date?.getTime())} + /> +
-
- {t('time.before').toUpperCase()} - setBefore(date?.getTime())} - /> + +
+ + {t('time.before').toUpperCase()}: + +
+ setBefore(date?.getTime())} + /> +
diff --git a/web/src/hooks/use-attachment-senders.ts b/web/src/hooks/use-attachment-senders.ts new file mode 100644 index 0000000..d907f24 --- /dev/null +++ b/web/src/hooks/use-attachment-senders.ts @@ -0,0 +1,26 @@ +import { useMemo } from 'react'; +import { useQuery } from '@tanstack/react-query'; +import { get_attachment_senders } from '@/api/attachment/api'; + +export const userAttachmentSenders = (searchTerm: string = "") => { + const { data: senders = [], isLoading, isError } = useQuery({ + queryKey: ['attachment-senders', 'all'], + queryFn: get_attachment_senders, + staleTime: 1000 * 60 * 10, + gcTime: 1000 * 60 * 30, + }); + + const filtered = useMemo(() => { + if (!searchTerm) return senders; + const lower = searchTerm.toLowerCase(); + return senders.filter(email => + email.toLowerCase().includes(lower) + ); + }, [senders, searchTerm]); + + return { + senders: filtered, + isLoading, + isError + }; +}; \ No newline at end of file diff --git a/web/src/hooks/use-available-attachment-tags.ts b/web/src/hooks/use-available-attachment-tags.ts new file mode 100644 index 0000000..b15a6ac --- /dev/null +++ b/web/src/hooks/use-available-attachment-tags.ts @@ -0,0 +1,66 @@ +// +// Copyright (c) 2025-2026 rustmailer.com (https://rustmailer.com) +// +// This file is part of the Bichon Email Archiving Project +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + + +import { get_all_attachment_tags } from '@/api/attachment/api'; +import { useQuery } from '@tanstack/react-query'; +import React from 'react'; + +export interface TagCount { + tag: string; + count: number; +} + +interface UseAvailableTagsResult { + tags: string[]; + tagsCount: TagCount[]; + isLoading: boolean; + isError: boolean; + error: unknown; + refetch: () => void; +} + + +export function useAvailableAttachmentTags(): UseAvailableTagsResult { + const { + data: tagsCount = [], + isLoading, + isError, + error, + refetch, + } = useQuery({ + queryKey: ['attachment-tags'], + queryFn: get_all_attachment_tags, + staleTime: 60 * 1000, + retry: false, + refetchOnWindowFocus: false, + }); + + const tags = React.useMemo(() => { + return tagsCount.map(f => f.tag).sort(); + }, [tagsCount]); + + return { + tags, + tagsCount, + isLoading, + isError, + error, + refetch, + }; +} \ No newline at end of file diff --git a/web/src/hooks/use-search-attachments.ts b/web/src/hooks/use-search-attachments.ts new file mode 100644 index 0000000..30617a4 --- /dev/null +++ b/web/src/hooks/use-search-attachments.ts @@ -0,0 +1,152 @@ +// +// Copyright (c) 2025-2026 rustmailer.com (https://rustmailer.com) +// +// This file is part of the Bichon Email Archiving Project +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + + +import { PaginatedResponse } from '@/api'; +import { AttachmentModel, search_attachment } from '@/api/attachment/api'; +import { useQuery } from '@tanstack/react-query'; +import { getRouteApi } from '@tanstack/react-router'; +import React from 'react'; + +const routeApi = getRouteApi('/_authenticated/attachment/') + +export function useSearchAttachments() { + // const queryClient = useQueryClient(); + const search = routeApi.useSearch() + const navigate = routeApi.useNavigate() + + const page = search.page; + const pageSize = search.pageSize; + const sortBy = search.sortBy; + const sortOrder = search.sortOrder; + + const filter = React.useMemo(() => { + if (!search.q) return {}; + try { + return JSON.parse(search.q); + } catch (e) { + console.error("URL 'q' parameter parse error:", e); + return {}; + } + }, [search.q]); + + + + const updateParams = React.useCallback((newParams: Partial) => { + navigate({ + search: (prev) => ({ + ...prev, + ...newParams, + }), + replace: false, + }); + }, [navigate]); + + + const setFilter = React.useCallback((val: any | ((prev: any) => any)) => { + navigate({ + search: (prev) => { + let currentFilter = {}; + try { + currentFilter = prev.q ? JSON.parse(prev.q) : {}; + } catch (e) { + currentFilter = {}; + } + const nextFilter = typeof val === 'function' ? val(currentFilter) : val; + return { + ...prev, + page: 1, + q: Object.keys(nextFilter).length > 0 ? JSON.stringify(nextFilter) : undefined + }; + } + }); + }, [navigate]); + + + const setPage = (p: number) => updateParams({ page: p }); + + const setSearchPageSize = (size: number) => { + localStorage.setItem('bichon_search_attachment_page_size', size.toString()); + updateParams({ pageSize: size, page: 1 }); + }; + + const setSortBy = (val: "DATE" | "SIZE") => updateParams({ sortBy: val }); + const setSortOrder = (val: "desc" | "asc") => updateParams({ sortOrder: val }); + + const onSubmit = (cleaned: Record) => { + if ('has_attachment' in cleaned && cleaned.has_attachment === false) { + delete cleaned.has_attachment; + } + if (Object.keys(cleaned).length > 0) { + const payload = { + ...cleaned, + ...(cleaned.since && { since: cleaned.since.getTime() }), + ...(cleaned.before && { before: cleaned.before.getTime() }), + }; + setFilter(payload); + } else { + setFilter({}); + } + }; + + const reset = () => { + setFilter({}); + } + + const { + data, + isLoading, + isError, + error, + isFetching, + } = useQuery>({ + queryKey: ['search-attachments', filter, page, pageSize, sortBy, sortOrder], + queryFn: () => + search_attachment({ + filter: filter, + page, + page_size: pageSize, + sort_by: sortBy, + desc: sortOrder === "desc" + }), + staleTime: 1000, + retry: false, + }); + + return { + attachments: data?.items ?? [], + total: data?.total_items ?? 0, + totalPages: data?.total_pages ?? 1, + pageSize: data?.page_size ?? pageSize, + setSearchPageSize, + sortBy, + setSortBy, + sortOrder, + setSortOrder, + isLoading, + isError, + error: error as Error | null, + isFetching, + page, + setPage, + onSubmit, + reset, + filter, + setFilter + }; +} \ No newline at end of file diff --git a/web/src/locales/ar.json b/web/src/locales/ar.json index d7d2ac4..3010a34 100644 --- a/web/src/locales/ar.json +++ b/web/src/locales/ar.json @@ -1,1614 +1,1630 @@ { - "common": { - "submit": "إرسال", + "accessTokens": { + "aListOfIpAddressesAllowed": "قائمة بعناوين IP المسموح لها بالوصول إلى المورد. أدخل عنوان IP واحدًا لكل سطر. (اختياري)", + "accountId": "معرّف الحساب", + "accounts": "الحسابات", + "aclRulesForAccessTokens": "تتضمن قواعد قائمة التحكم بالوصول (ACL) لرموز الوصول التحقق من قائمة IP البيضاء وتطبيق تحديد المعدل.", + "actions": { + "delete": "حذف", + "edit": "تعديل", + "openMenu": "فتح القائمة" + }, + "addNew": "إضافة جديد", + "atLeastOneAccountIsRequired": "مطلوب حساب واحد على الأقل.", + "create": "إنشاء", + "createNewAccessTokenHere": "إنشاء رمز وصول جديد هنا.", + "created": "تم الإنشاء", + "createdAt": "تاريخ الإنشاء", + "creating": "جارٍ الإنشاء...", + "creationFailed": "فشل الإنشاء", + "delete": "حذف", + "describeThePurposeOfTheAccessToken": "صف الغرض من رمز الوصول", + "description": "إدارة رموز الوصول الخاصة بك، وضوابط الوصول، وقوائم IP البيضاء، وإعدادات تحديد المعدل هنا.", + "descriptionMustNotExceed255Characters": "يجب ألا يتجاوز الوصف 255 حرفًا.", + "edit": "تعديل", + "editToken": "تعديل الرمز المميز", + "enterIntervalInSeconds": "أدخل الفاصل الزمني بالثواني، مثال: 60", + "enterOneIpAddressPerLine": "أدخل عنوان IP واحدًا لكل سطر، مثال:\n192.168.1.1\n192.168.1.2", + "enterQuota": "أدخل الحصة، مثال: 100", + "expiresAt": "تاريخ الانتهاء", + "filterByEmailAddressOrAccountId": "تصفية حسب عنوان البريد الإلكتروني أو معرّف الحساب...", + "interval": "الفاصل الزمني", + "intervalMustBeAPositiveInteger": "يجب أن يكون الفاصل الزمني عددًا صحيحًا موجبًا.", + "invalidIpAddressesFound": "تم العثور على عناوين IP غير صالحة. يرجى إدخال عناوين IPv4 أو IPv6 صالحة.", + "name": "الاسم", + "noTokens": "لا توجد رموز وصول", + "noTokensDesc": "لم تقم بإنشاء أي رموز وصول بعد. أنشئ واحدًا لبدء استخدام ميزات واجهة برمجة التطبيقات.", + "notUsedYet": "لم يُستخدم بعد", + "quota": "الحصة", + "quotaMustBeAPositiveInteger": "يجب أن تكون الحصة عددًا صحيحًا موجبًا.", + "save": "حفظ", + "saveChanges": "حفظ التغييرات", + "saving": "جارٍ الحفظ...", + "selectAccounts": "اختيار الحسابات", + "selectMultipleAccountsForTheAccessToken": "اختر حسابات متعددة لنطاق تخويل رمز الوصول.", + "theListOfAccountsThatCanBeQueried": "قائمة الحسابات التي يمكن الاستعلام عنها باستخدام رمز وصول.", + "theMaximumNumberOfRequestsAllowed": "الحد الأقصى لعدد الطلبات المسموح بها ضمن الفاصل الزمني. (اختياري)", + "theTimeWindowForTheRateLimit": "النافذة الزمنية (بالثواني) لتحديد المعدل. (اختياري)", + "title": "رموز الوصول", + "token": "الرمز المميز", + "updateFailed": "فشل التحديث", + "updateOrCreationFailed": "فشل {{action}}، يرجى المحاولة مرة أخرى لاحقًا", + "updateTheAccessTokenHere": "تحديث رمز الوصول هنا.", + "updated": "تم التحديث", + "updating": "جارٍ التحديث...", + "yourAccessTokenHasBeenSuccessfully": "تم {{action}} رمز الوصول الخاص بك بنجاح." + }, + "accounts": { + "accessControl": "التحكم في الوصول", + "accessTokenCopiedToClipboard": "تم نسخ رمز الوصول إلى الحافظة", + "access_control": { + "buttons": { "cancel": "إلغاء", - "save": "حفظ", - "save_changes": "حفظ التغييرات", - "delete": "حذف", - "edit": "تعديل", - "search": "بحث", - "add": "إضافة", - "remove": "إزالة", - "create": "إنشاء", - "update": "تحديث", - "confirm": "تأكيد", + "save": "حفظ التخصيص" + }, + "description": "تعيين الأدوار والمستخدمين المفوضين لـ {{email}}", + "role_label": "دور الوصول", + "role_loading": "جاري تحميل الأدوار...", + "role_placeholder": "اختر دوراً", + "title": "تخصيص الوصول للحساب", + "toast": { + "failed_title": "فشل التخصيص", + "success_desc": "تم تعيين الصلاحيات بنجاح لـ {{email}}", + "success_title": "تم التخصيص بنجاح" + }, + "user_empty": "لم يتم العثور على مستخدمين", + "user_label": "اختر المستخدمين المفوضين", + "user_search_placeholder": "بحث باسم المستخدم أو البريد...", + "user_selected_count": "تم اختيار: {{count}} مستخدم", + "validation": { + "role_required": "يرجى اختيار دور للتعيين", + "user_required": "يرجى اختيار مستخدم واحد على الأقل" + } + }, + "accountCreated": "تم إنشاء الحساب", + "accountCreatedDesc": "تم إنشاء حسابك بنجاح.", + "accountCreationFailed": "فشل إنشاء الحساب", + "accountDetails": "تفاصيل الحساب", + "accountHasBeenSuccessfully": "تم {{action}} الحساب بنجاح", + "accountSyncFoldersUpdateFailed": "فشل تحديث مجلدات مزامنة الحساب", + "accountSyncFoldersUpdated": "تم تحديث مجلدات مزامنة الحساب", + "accountUpdateFailed": "فشل تحديث الحساب", + "accountUpdated": "تم تحديث الحساب", + "accountUpdatedDesc": "تم تحديث حسابك بنجاح.", + "actions": "الإجراءات", + "addAccount": "إضافة حساب", + "addConfiguration": "إضافة تكوين", + "addImap": "إضافة IMAP", + "addNewEmailAccountHere": "إضافة حساب بريد إلكتروني جديد هنا. ", + "addNoSync": "إضافة NoSync", + "allMailFolderSelected": "تنبيه: تم تحديد مجلد \"جميع رسائل البريد\"", + "allMailFolderSelectedDesc": "من المحتمل أن يؤدي تحديد المجلدات التي تحمل سمة \"جميع رسائل البريد\" إلى تكرار الرسائل التي تمت مزامنتها بالفعل من مجلدات مثل البريد الوارد والمرسل. قد يستهلك هذا مساحة تخزين أكبر بكثير.", + "allMailSkipped": "تم تحديد المجلدات القياسية. تم تخطي 'جميع رسائل البريد' لتجنب التكرارات.", + "areYouSureYouWantTo": "هل أنت متأكد من أنك تريد {{action}} هذا الحساب؟", + "auth": "المصادقة", + "authType": "نوع_المصادقة", + "autoConfiguring": "جارٍ التكوين التلقائي...", + "beforeRelative": "تنزيل رسائل البريد الإلكتروني القديمة فقط", + "beforeRelativeValue": "تنزيل رسائل البريد الإلكتروني قبل {{value}} {{unit}} مضت", + "capabilities": "الإمكانيات", + "chooseAuthMethod": "اختر طريقة المصادقة لـ IMAP.", + "chooseEncryptionMethod": "اختر طريقة التشفير لـ IMAP.", + "chooseMailboxesToDownload": "اختر صناديق البريد لتنزيلها لـ {{email}}. سيتم تنزيل الصناديق المضافة حديثًا في الدورة التالية.", + "clickHere": "النقر هنا", + "clickSaveWhenDone": "انقر على حفظ عند الانتهاء.", + "continue": "متابعة", + "createdAt": "تاريخ الإنشاء", + "creationFailed": "فشل الإنشاء، يرجى المحاولة مرة أخرى لاحقًا", + "dateSelection": "تحديد التاريخ", + "dateSince": "التاريخ منذ", + "days": "أيام", + "delete": "حذف", + "description": "إدارة وتكوين حسابات البريد الإلكتروني الخاصة بك.", + "detail": "التفاصيل", + "detailsOfTheOAuth2TokensForTheAccount": "تفاصيل رموز OAuth2 للحساب.", + "determinesWhetherThisAccountIsActiveNoSync": "يحدد ما إذا كان هذا الحساب نشطًا. إذا تم تعطيله، فلن يكون قادرًا على استيراد البيانات.", + "disable": "تعطيل", + "disableAccount": "تعطيل الحساب", + "disabled": "معطل", + "downloadAll": "تنزيل جميع رسائل البريد الإلكتروني", + "downloadBatchSize": "حجم دفعة التنزيل", + "downloadBatchSizeDescription": "عدد الرسائل التي يتم جلبها لكل طلب IMAP", + "downloadInterval": "دورة التنزيل (بالدقائق)", + "downloadIntervalPlaceholder": "أدخل الدقائق", + "downloadScope": "استراتيجية التنزيل", + "downloadScopeDescription": "اختر رسائل البريد الإلكتروني التي يجب فهرستها وتنزيلها.", + "duration": "المدة", + "edit": "تعديل", + "email": "البريد الإلكتروني", + "emailAccountRegistration": "تسجيل حساب البريد الإلكتروني", + "emailAccountRegistrationDesc": "يرجى إدخال عنوان بريدك الإلكتروني. في الخطوات التالية، ستقوم بإعداد تفاصيل IMAP. سنستخدم هذا العنوان لمحاولة اكتشاف إعدادات خادم IMAP تلقائيًا.", + "emailAddress": "عنوان البريد الإلكتروني", + "emailCannotBeModified": "لا يمكن تعديل عنوان حساب البريد الإلكتروني أثناء التحرير.", + "emailPlaceholder": "مثال: john.doe@example.com", + "enable": "تفعيل", + "enableAccount": "تفعيل الحساب", + "enabled": "مفعل", + "enabledDescription": "يحدد ما إذا كان هذا الحساب نشطًا. في حالة التعطيل، لن يتم تشغيل عمليات التنزيل ذات الصلة.", + "encryption": "التشفير", + "enterPassword": "أدخل كلمة المرور الخاصة بك", + "enterValue": "الرجاء إدخال قيمة", + "everyMinutes": "كل {{minutes}} دقيقة", + "field": "الحقل", + "fixed": "ثابت", + "folderLimit": "حد المجلد", + "folderLimitDescription": "حدد عدد رسائل البريد الإلكتروني للمزامنة لكل مجلد (الحد الأدنى 100). اتركه فارغًا بلا حدود.", + "folderLimitPlaceholder": "مثال: 1000", + "folderSync": { + "autoSelectDescendants": "تحديد العناصر الفرعية تلقائيًا", + "autoSelectParents": "تحديد العناصر الأصلية تلقائيًا", + "batches": "دفعات", + "collapseAll": "طي الكل", + "expandAll": "توسيع الكل", + "loadingMailboxFolders": "جارٍ تحميل مجلدات البريد…", + "noData": "لا توجد بيانات", + "noFolders": "لا توجد مجلدات للمزامنة" + }, + "foldersConfiguredForSync": "{{count}} مجلد(ات) تم تكوينها للمزامنة", + "foldersSelected": "{{count}} مجلد(ات) محددة", + "goBack": "العودة", + "host": "المُضيف", + "id": "المعرّف", + "imap": "IMAP", + "imapAuthMethod": "طريقة مصادقة IMAP", + "imapEncryption": "تشفير IMAP", + "imapHost": "مُضيف IMAP", + "imapHostPlaceholder": "مثال: imap.example.com", + "imapPassword": "كلمة مرور IMAP", + "imapPort": "منفذ IMAP", + "imapPortPlaceholder": "مثال: 993", + "imapProxy": "استخدم وكيل SOCKS5 لاتصالات IMAP.", + "incSync": "مزامنة تزايدية", + "lastSync": "آخر مزامنة", + "leaveEmptyToKeepExisting": "اترك فارغًا للاحتفاظ بكلمة المرور الحالية، أو أدخل كلمة مرور جديدة لتحديثها.", + "leaveEmptyToKeepPassword": "اترك فارغًا للاحتفاظ بكلمة المرور الحالية", + "login_name": "اسم الدخول", + "minutes": "دقائق", + "months": "أشهر", + "moreAccountTypes": "المزيد من أنواع الحسابات", + "mustBeAtLeast1": "يجب أن يكون 1 على الأقل", + "name": "الاسم", + "nameDescription": "اسم مستخدم IMAP. افتراضياً بريدك الإلكتروني، أو أدخل اسماً مخصصاً.", + "namePlaceholder": "مثال: john.doe", + "noAccountConfigurations": "لا توجد تكوينات للحساب", + "noAccountConfigurationsDesc": "لم تقم بإضافة أي تكوينات للحساب بعد. أضف واحدة لبدء استخدام ميزات الحساب.", + "noOAuth2Tokens": "لا توجد رموز OAuth2", + "none": "لا شيء", + "notAvailable": "غير متاح", + "oauth2Tokens": "رموز OAuth2", + "openMenu": "فتح القائمة", + "optional": "اختياري", + "owner": "المنشئ", + "password": "كلمة_المرور", + "port": "المنفذ", + "recent": "حديث", + "refreshToken": "رمز التحديث", + "refreshTokenCopiedToClipboard": "تم نسخ رمز التحديث إلى الحافظة", + "relative": "نسبي", + "runningState": { + "account": { + "id": "معرّف الحساب" + }, + "common": { "close": "إغلاق", - "yes": "نعم", - "no": "لا", - "ok": "موافق", - "loading": "جاري التحميل...", - "empty": "فارغ", - "noData": "لا توجد بيانات", - "table": { - "noResults": "لا توجد نتائج." - }, - "failed": "فشل", - "notFound": "غير موجود", - "back": "رجوع", - "goBack": "العودة", - "backToHome": "العودة للرئيسية", - "tryAgain": "إعادة المحاولة", - "more": "المزيد", - "actions": "إجراءات", - "filter": "تصفية", - "reset": "إعادة تعيين", - "clear": "مسح", - "error": "خطأ", - "apply": "تطبيق", - "select": "تحديد", - "selectAll": "تحديد الكل", - "deselectAll": "إلغاء تحديد الكل", - "all": "الكل", - "none": "لا شيء", - "showLess": "عرض أقل", - "showMore": "عرض المزيد...", - "project_description": "Bichon هو مشروع مفتوح المصدر.", - "view_on_github_button": "عرض على GitHub", - "op_failed": "فشلت العملية", - "na": "غير متاح", - "retry": "إعادة محاولة", - "deleting": "جاري الحذف..." - }, - "navigation": { - "home": "الرئيسية", - "settings": "الإعدادات", - "accounts": "الحسابات", - "dashboard": "لوحة التحكم", - "mailbox": "صندوق البريد", - "oauth2": "OAuth2", - "accessTokens": "رموز الوصول", - "apiDocs": "توثيق واجهة برمجة التطبيقات", - "general": "عام", - "auth": "المصادقة", - "other": "أخرى", - "users": "مستخدمو النظام" - }, - "auth": { - "welcome": "مرحبًا بك في بيشون", - "username": "اسم المستخدم", - "password": "كلمة المرور", - "login": "تسجيل الدخول", - "loginFailed": "فشل تسجيل الدخول", - "invalidPassword": "كلمة مرور غير صالحة. الرجاء المحاولة مرة أخرى.", - "somethingWentWrong": "حدث خطأ ما", - "sessionExpired": "انتهت صلاحية الجلسة!", - "sessionExpiredDesc": "انتهت جلستك بسبب عدم النشاط. يرجى تسجيل الدخول مرة أخرى للمتابعة.", - "logout": "تسجيل الخروج", - "areYouSureYouWantToLogOut": "هل أنت متأكد أنك تريد تسجيل الخروج؟", - "youWillNeedToLogInAgain": "ستحتاج إلى تسجيل الدخول مرة أخرى للوصول إلى حسابك." - }, - "errors": { - "pageNotFound": "عذرًا! لم يتم العثور على الصفحة!", - "pageNotFoundDesc": "يبدو أن الصفحة التي تبحث عنها غير موجودة أو ربما تمّت إزالتها.", - "somethingWentWrong": "عذرًا! حدث خطأ ما :')", - "somethingWentWrongDesc": "نعتذر عن الإزعاج. الرجاء المحاولة مرة أخرى لاحقًا.", - "internalServerError": "خطأ خادم داخلي!", - "contentNotModified": "لم يتم تعديل المحتوى!", - "networkError": "خطأ في الشبكة", - "networkErrorDesc": "تعذر الاتصال بالخادم. يرجى التحقق من اتصالك بالإنترنت والمحاولة مرة أخرى.", - "forbidden": "ممنوع", - "forbiddenTitle": "الوصول ممنوع", - "forbiddenDesc": "ليس لديك الإذن اللازم لعرض هذا المورد.", - "unauthorized": "غير مصرح به", - "unauthorizedTitle": "وصول غير مصرح به", - "unauthorizedDesc": "يرجى تسجيل الدخول ببيانات الاعتماد المناسبة للوصول إلى هذا المورد.", - "maintenance": "صيانة", - "maintenanceTitle": "الموقع قيد الصيانة!", - "maintenanceDesc": "الموقع غير متاح في الوقت الحالي. سنعود للعمل قريبًا.", - "learnMore": "معرفة المزيد" - }, - "dashboard": { - "title": "لوحة التحكم", - "mailAccounts": "حسابات البريد", - "connected": "متصل", - "totalEmails": "إجمالي رسائل البريد الإلكتروني", - "syncedLocally": "تمت مزامنته محليًا", - "totalEmailSize": "الحجم الإجمالي لرسائل البريد الإلكتروني", - "logicalVolume": "الحجم الأصلي", - "localDataFiles": "ملفات البيانات المحلية", - "actualDiskUsage": "الاستخدام الفعلي للقرص", - "efficiency": "كفاءة التخزين", - "saved": "الموفرة", - "dataStorage": "تخزين البيانات", - "indexSize": "حجم الفهرس", - "metadataSize": "حجم البيانات التعريفية", - "tantivyDatabase": "تعتمد على محرك البحث Tantivy", - "dayTrend": "اتجاه 30 يومًا", - "attachments": "المرفقات", - "topLists": "القوائم الأعلى", - "newEmails": "رسائل بريد إلكتروني جديدة", - "messageDistribution": "توزيع الرسائل", - "attachmentRatio": "نسبة المرفقات", - "attachmentRatioDesc": "{{percent}}% من رسائل البريد الإلكتروني تحتوي على مرفقات", - "noEmailsSynced": "لم تتم مزامنة أي رسائل بريد إلكتروني بعد", - "withAttachments": "مع مرفقات", - "noAttachments": "لا توجد مرفقات", - "top10Senders": "أفضل 10 مرسلين", - "byMessageCount": "حسب عدد الرسائل", - "sender": "المرسل", - "count": "العدد", - "top10LargestEmails": "أكبر 10 رسائل بريد إلكتروني", - "byMessageSize": "حسب حجم الرسالة", - "subject": "الموضوع", - "size": "الحجم", - "noSubject": "(لا يوجد موضوع)", - "top10Accounts": "أفضل 10 حسابات", - "emails": "رسائل البريد الإلكتروني", - "account": "الحساب", - "noRecentActivity": "لا يوجد نشاط حديث", - "noSendersData": "لا توجد بيانات للمرسلين", - "noLargeEmails": "لا توجد رسائل بريد إلكتروني كبيرة", - "noAccountData": "لا توجد بيانات للحساب", - "systemVersion": "إصدار النظام" - }, - "accounts": { - "beforeRelativeValue": "تنزيل رسائل البريد الإلكتروني قبل {{value}} {{unit}} مضت", - "sinceRelativeValue": "تنزيل رسائل البريد الإلكتروني من آخر", - "downloadBatchSize": "حجم دفعة التنزيل", - "downloadBatchSizeDescription": "عدد الرسائل التي يتم جلبها لكل طلب IMAP", - "downloadScopeDescription": "اختر رسائل البريد الإلكتروني التي يجب فهرستها وتنزيلها.", - "downloadScope": "استراتيجية التنزيل", - "selectMode": "اختر وضع التصفية", - "downloadAll": "تنزيل جميع رسائل البريد الإلكتروني", - "sinceFixed": "منذ تاريخ محدد", - "sinceRelative": "تنزيل رسائل البريد الإلكتروني الأخيرة فقط", - "beforeRelative": "تنزيل رسائل البريد الإلكتروني القديمة فقط", - "duration": "المدة", - "unit": "الوحدة", - "accessControl": "التحكم في الوصول", - "owner": "المنشئ", - "access_control": { - "title": "تخصيص الوصول للحساب", - "description": "تعيين الأدوار والمستخدمين المفوضين لـ {{email}}", - "role_label": "دور الوصول", - "role_placeholder": "اختر دوراً", - "role_loading": "جاري تحميل الأدوار...", - "user_label": "اختر المستخدمين المفوضين", - "user_search_placeholder": "بحث باسم المستخدم أو البريد...", - "user_empty": "لم يتم العثور على مستخدمين", - "user_selected_count": "تم اختيار: {{count}} مستخدم", - "buttons": { - "cancel": "إلغاء", - "save": "حفظ التخصيص" - }, - "validation": { - "user_required": "يرجى اختيار مستخدم واحد على الأقل", - "role_required": "يرجى اختيار دور للتعيين" - }, - "toast": { - "success_title": "تم التخصيص بنجاح", - "success_desc": "تم تعيين الصلاحيات بنجاح لـ {{email}}", - "failed_title": "فشل التخصيص" - } - }, - "title": "حسابات البريد الإلكتروني", - "description": "إدارة وتكوين حسابات البريد الإلكتروني الخاصة بك.", - "addImap": "إضافة IMAP", - "addNoSync": "إضافة NoSync", - "moreAccountTypes": "المزيد من أنواع الحسابات", - "noAccountConfigurations": "لا توجد تكوينات للحساب", - "noAccountConfigurationsDesc": "لم تقم بإضافة أي تكوينات للحساب بعد. أضف واحدة لبدء استخدام ميزات الحساب.", - "addConfiguration": "إضافة تكوين", - "useNoProxy": "بدون وكيل", - "login_name": "اسم الدخول", - "name": "الاسم", - "email": "البريد الإلكتروني", + "folders": "صناديق البريد" + }, + "empty": { + "no_active_download": "لا يوجد تنزيل نشط", + "no_errors_current": "لا توجد أخطاء في الجلسة الحالية", + "no_errors_session": "لا توجد أخطاء في هذه الجلسة", + "no_global_errors": "لا توجد أخطاء عامة", + "no_history": "لا يوجد سجل" + }, + "folders": "صناديق البريد", + "latest": "الأحدث", + "loading": { + "fetching_account_state": "جارٍ تحميل حالة الحساب..." + }, + "message": "رسالة", + "session": { + "started_at": "وقت البدء", "status": "الحالة", - "type": "النوع", - "lastSync": "آخر مزامنة", - "actions": "الإجراءات", - "edit": "تعديل", - "delete": "حذف", - "detail": "التفاصيل", - "selectMailboxes": "اختيار صناديق البريد", - "oauth2Tokens": "رموز OAuth2", - "id": "المعرّف", - "enabled": "مفعل", - "auth": "المصادقة", - "incSync": "مزامنة تزايدية", - "state": "الحالة", - "createdAt": "تاريخ الإنشاء", - "updatedAt": "تاريخ التحديث", - "openMenu": "فتح القائمة", - "emailAccountRegistration": "تسجيل حساب البريد الإلكتروني", - "emailAccountRegistrationDesc": "يرجى إدخال عنوان بريدك الإلكتروني. في الخطوات التالية، ستقوم بإعداد تفاصيل IMAP. سنستخدم هذا العنوان لمحاولة اكتشاف إعدادات خادم IMAP تلقائيًا.", - "emailAddress": "عنوان البريد الإلكتروني", - "emailPlaceholder": "مثال: john.doe@example.com", - "namePlaceholder": "مثال: john.doe", - "optional": "اختياري", - "nameDescription": "اسم مستخدم IMAP. افتراضياً بريدك الإلكتروني، أو أدخل اسماً مخصصاً.", - "emailCannotBeModified": "لا يمكن تعديل عنوان حساب البريد الإلكتروني أثناء التحرير.", - "addAccount": "إضافة حساب", - "updateAccount": "تحديث الحساب", - "accountUpdated": "تم تحديث الحساب", - "accountCreated": "تم إنشاء الحساب", - "accountUpdatedDesc": "تم تحديث حسابك بنجاح.", - "accountCreatedDesc": "تم إنشاء حسابك بنجاح.", - "accountUpdateFailed": "فشل تحديث الحساب", - "accountCreationFailed": "فشل إنشاء الحساب", - "updateFailed": "فشل التحديث، يرجى المحاولة مرة أخرى لاحقًا", - "creationFailed": "فشل الإنشاء، يرجى المحاولة مرة أخرى لاحقًا", - "allMailFolderSelected": "تنبيه: تم تحديد مجلد \"جميع رسائل البريد\"", - "accountSyncFoldersUpdated": "تم تحديث مجلدات مزامنة الحساب", - "accountSyncFoldersUpdateFailed": "فشل تحديث مجلدات مزامنة الحساب", - "serverConfiguration": "تكوين الخادم (IMAP)", - "selectedMailboxes": "صناديق البريد المحددة", - "allMailFolderSelectedDesc": "من المحتمل أن يؤدي تحديد المجلدات التي تحمل سمة \"جميع رسائل البريد\" إلى تكرار الرسائل التي تمت مزامنتها بالفعل من مجلدات مثل البريد الوارد والمرسل. قد يستهلك هذا مساحة تخزين أكبر بكثير.", - "allMailSkipped": "تم تحديد المجلدات القياسية. تم تخطي 'جميع رسائل البريد' لتجنب التكرارات.", - "selectAtLeastOneFolder": "يرجى تحديد مجلد واحد على الأقل", - "chooseMailboxesToDownload": "اختر صناديق البريد لتنزيلها لـ {{email}}. سيتم تنزيل الصناديق المضافة حديثًا في الدورة التالية.", - "accountDetails": "تفاصيل الحساب", - "capabilities": "الإمكانيات", - "folderLimit": "حد المجلد", - "everyMinutes": "كل {{minutes}} دقيقة", - "foldersConfiguredForSync": "{{count}} مجلد(ات) تم تكوينها للمزامنة", - "foldersSelected": "{{count}} مجلد(ات) محددة", - "imapHost": "مُضيف IMAP", - "imapHostPlaceholder": "مثال: imap.example.com", - "imapPort": "منفذ IMAP", - "imapPortPlaceholder": "مثال: 993", - "imapEncryption": "تشفير IMAP", - "selectEncryptionMethod": "اختر طريقة تشفير", - "chooseEncryptionMethod": "اختر طريقة التشفير لـ IMAP.", - "imapAuthMethod": "طريقة مصادقة IMAP", - "selectAuthMethod": "اختر طريقة مصادقة", - "chooseAuthMethod": "اختر طريقة المصادقة لـ IMAP.", - "imapPassword": "كلمة مرور IMAP", - "leaveEmptyToKeepPassword": "اترك فارغًا للاحتفاظ بكلمة المرور الحالية", - "enterPassword": "أدخل كلمة المرور الخاصة بك", - "leaveEmptyToKeepExisting": "اترك فارغًا للاحتفاظ بكلمة المرور الحالية، أو أدخل كلمة مرور جديدة لتحديثها.", - "useProxy": "استخدام وكيل", - "selectProxy": "اختر وكيلًا", - "downloadInterval": "دورة التنزيل (بالدقائق)", - "downloadIntervalPlaceholder": "أدخل الدقائق", - "enabledDescription": "يحدد ما إذا كان هذا الحساب نشطًا. في حالة التعطيل، لن يتم تشغيل عمليات التنزيل ذات الصلة.", - "dateSince": "التاريخ منذ", - "none": "لا شيء", - "fixed": "ثابت", - "relative": "نسبي", - "selectDate": "اختر تاريخًا", - "selectUnit": "اختر وحدة", - "days": "أيام", - "months": "أشهر", - "years": "سنوات", - "enterValue": "الرجاء إدخال قيمة", - "mustBeAtLeast1": "يجب أن يكون 1 على الأقل", - "dateSelection": "تحديد التاريخ", - "since": "منذ", - "recent": "حديث", - "notAvailable": "غير متاح", - "host": "المُضيف", - "port": "المنفذ", - "encryption": "التشفير", - "authType": "نوع_المصادقة", - "password": "كلمة_المرور", - "useProxyField": "استخدام وكيل", - "clickSaveWhenDone": "انقر على حفظ عند الانتهاء.", - "step": "الخطوة {{index}}", - "goBack": "العودة", - "autoConfiguring": "جارٍ التكوين التلقائي...", - "continue": "متابعة", - "saveChanges": "حفظ التغييرات", - "submit": "إرسال", - "field": "الحقل", - "value": "القيمة", - "refreshToken": "رمز التحديث", - "accessTokenCopiedToClipboard": "تم نسخ رمز الوصول إلى الحافظة", - "refreshTokenCopiedToClipboard": "تم نسخ رمز التحديث إلى الحافظة", - "noOAuth2Tokens": "لا توجد رموز OAuth2", - "theAccountHasNotCompletedTheAuthorizationProcess": "لم يكمل الحساب عملية التخويل. الرجاء ", - "clickHere": "النقر هنا", - "toAuthorizeTheAccount": " لتخويل الحساب.", - "detailsOfTheOAuth2TokensForTheAccount": "تفاصيل رموز OAuth2 للحساب.", - "updateTheEmailAccountHere": "تحديث حساب البريد الإلكتروني هنا. ", - "addNewEmailAccountHere": "إضافة حساب بريد إلكتروني جديد هنا. ", - "thisAccountIsUsedForIdentificationPurposesOnly": "يستخدم هذا الحساب لأغراض التعريف فقط ولا يتطلب المزامنة مع خادم بريد إلكتروني. إنه يساعد في استيراد بيانات البريد الإلكتروني.", - "determinesWhetherThisAccountIsActiveNoSync": "يحدد ما إذا كان هذا الحساب نشطًا. إذا تم تعطيله، فلن يكون قادرًا على استيراد البيانات.", - "folderSync": { - "noData": "لا توجد بيانات", - "noFolders": "لا توجد مجلدات للمزامنة", - "batches": "دفعات", - "autoSelectDescendants": "تحديد العناصر الفرعية تلقائيًا", - "autoSelectParents": "تحديد العناصر الأصلية تلقائيًا", - "expandAll": "توسيع الكل", - "collapseAll": "طي الكل", - "loadingMailboxFolders": "جارٍ تحميل مجلدات البريد…" - }, - "viewDetails": "عرض التفاصيل", - "runningState": { - "message": "رسالة", - "account": { - "id": "معرّف الحساب" - }, - "tabs": { - "active_session": "الجلسة النشطة", - "history": "السجل", - "global_errors": "الأخطاء العامة", - "folders": "صناديق البريد", - "errors": "أخطاء" - }, - "loading": { - "fetching_account_state": "جارٍ تحميل حالة الحساب..." - }, - "empty": { - "no_active_download": "لا يوجد تنزيل نشط", - "no_errors_current": "لا توجد أخطاء في الجلسة الحالية", - "no_errors_session": "لا توجد أخطاء في هذه الجلسة", - "no_global_errors": "لا توجد أخطاء عامة", - "no_history": "لا يوجد سجل" - }, - "session": { - "status": "الحالة", - "trigger": "المشغّل", - "started_at": "وقت البدء" - }, - "common": { - "folders": "صناديق البريد", - "close": "إغلاق" - }, - "latest": "الأحدث", - "folders": "صناديق البريد" - }, - "steps": { - "complete": "مكتمل", - "emailAddress": "عنوان البريد الإلكتروني", - "imap": "IMAP", - "syncPreferences": "تفضيلات المزامنة", - "summary": "ملخص" - }, - "imapProxy": "استخدم وكيل SOCKS5 لاتصالات IMAP.", - "syncStartDateDescription": "يحدد تاريخ بدء المزامنة - إما محددًا أو نسبيًا للوقت الحالي. يتم استبعاد رسائل البريد الإلكتروني السابقة، {{fixedPart}}.", - "syncAfterDate": "مزامنة البيانات بعد تاريخ محدد", - "syncRecentData": "نقل تاريخ المزامنة بمرور الوقت، مزامنة البيانات الحديثة فقط", - "folderLimitDescription": "حدد عدد رسائل البريد الإلكتروني للمزامنة لكل مجلد (الحد الأدنى 100). اتركه فارغًا بلا حدود.", - "folderLimitPlaceholder": "مثال: 1000", - "imap": "IMAP", - "minutes": "دقائق", - "accountHasBeenSuccessfully": "تم {{action}} الحساب بنجاح", - "enableAccount": "تفعيل الحساب", - "disableAccount": "تعطيل الحساب", - "areYouSureYouWantTo": "هل أنت متأكد من أنك تريد {{action}} هذا الحساب؟", - "enable": "تفعيل", - "disable": "تعطيل", - "thisWillPreventTheAccountFromBeingUsed": "لن يقوم هذا الحساب بمزامنة البيانات من خادم IMAP بعد الآن، ولكن لا تزال البيانات الموجودة متاحة للعرض.", - "disabled": "معطل", - "useDangerous": "الثقة بأي شهادة TLS", - "useDangerousDescription": "فعّل هذا الخيار فقط إذا كنت تتصل بخادم IMAP يستخدم شهادة TLS صادرة عن CA عام أو شهادة موقعة ذاتياً قد لا يتعرف عليها نظامك. هذا الإعداد يتجاوز عملية التحقق الاعتيادية من الشهادة، وقد يعرض الاتصال لهجمات “رجل في الوسط” — فعّله فقط إذا كنت تدرك المخاطر." + "trigger": "المشغّل" + }, + "tabs": { + "active_session": "الجلسة النشطة", + "errors": "أخطاء", + "folders": "صناديق البريد", + "global_errors": "الأخطاء العامة", + "history": "السجل" + } }, - "mailbox": { - "deleteMailboxDialog": { - "title": "حذف مجلد البريد", - "desc": "هل أنت متأكد من رغبتك في حذف مجلد البريد هذا؟ لا يمكن التراجع عن هذا الإجراء.", - "warningTitle": "تحذير", - "warningDesc": "سيؤدي حذف هذا المجلد أيضًا إلى إزالة جميع رسائل البريد الإلكتروني المؤرشفة والمجلدات الفرعية الموجودة بداخله نهائيًا.", - "confirm": "حذف نهائي", - "successTitle": "تم الحذف بنجاح", - "successDesc": "تمت إزالة مجلد البريد ومحتوياته بنجاح.", - "errorTitle": "فشل الحذف" - }, - "title": "صندوق البريد", - "folders": "المجلدات", - "messages": "الرسائل", - "noMessages": "لا توجد رسائل", - "selectFolder": "اختر مجلدًا لعرض الرسائل", - "deleteDialog": { - "title": "حذف رسالة البريد الإلكتروني", - "desc": "هل أنت متأكد أنك تريد حذف {{countText}}؟ سيؤدي هذا الإجراء إلى حذف رسالة (رسائل) البريد الإلكتروني المحددة من قاعدة البيانات المحلية. سيتم حذف رسالة (رسائل) البريد الإلكتروني نهائيًا ولا يمكن استردادها.", - "descCountSingle": "رسالة البريد الإلكتروني هذه", - "descCountMultiple": "رسائل البريد الإلكتروني هذه ({{count}})", - "warningTitle": "تحذير!", - "warningDesc": "يرجى توخي الحذر قبل المتابعة.", - "confirm": "حذف", - "successTitle": "تم حذف الرسائل بنجاح", - "successDesc": "تم حذف الرسائل.", - "errorTitle": "فشل حذف الرسائل" - }, - "thread": { - "title": "المحادثة ({{count}} {{messageLabel}})", - "message": "رسالة", - "messages": "رسائل", - "noSubject": "(لا يوجد موضوع)", - "invalidDate": "تاريخ غير صالح", - "empty": "لا توجد رسائل في هذه المحادثة.", - "loadError": "فشل تحميل المحادثة", - "loadingMore": "جارٍ تحميل المزيد...", - "loadMore": "تحميل المزيد" - }, - "bulkActions": { - "ariaLabel": "إجراءات مجمعة لـ {{count}} {{emailLabel}} محددة", - "email": "رسالة بريد إلكتروني", - "emails": "رسائل بريد إلكتروني", - "selected": "محددة", - "clearSelection": "مسح التحديد", - "clearSelectionWithKey": "مسح التحديد ({{key}})", - "delete": "حذف", - "deleteTooltip": "حذف رسائل البريد الإلكتروني المحددة" - } + "saveChanges": "حفظ التغييرات", + "selectAtLeastOneFolder": "يرجى تحديد مجلد واحد على الأقل", + "selectAuthMethod": "اختر طريقة مصادقة", + "selectDate": "اختر تاريخًا", + "selectEncryptionMethod": "اختر طريقة تشفير", + "selectMailboxes": "اختيار صناديق البريد", + "selectMode": "اختر وضع التصفية", + "selectProxy": "اختر وكيلًا", + "selectUnit": "اختر وحدة", + "selectedMailboxes": "صناديق البريد المحددة", + "serverConfiguration": "تكوين الخادم (IMAP)", + "since": "منذ", + "sinceFixed": "منذ تاريخ محدد", + "sinceRelative": "تنزيل رسائل البريد الإلكتروني الأخيرة فقط", + "sinceRelativeValue": "تنزيل رسائل البريد الإلكتروني من آخر", + "state": "الحالة", + "status": "الحالة", + "step": "الخطوة {{index}}", + "steps": { + "complete": "مكتمل", + "emailAddress": "عنوان البريد الإلكتروني", + "imap": "IMAP", + "summary": "ملخص", + "syncPreferences": "تفضيلات المزامنة" }, - "search": { - "size": "الحجم", - "any": "الكل", - "tiny": "صغير جدًا (<15 كيلوبايت)", - "small": "صغير (<2 ميغابايت)", - "medium": "متوسط (2 - 10 ميغابايت)", - "large": "كبير (10 - 20 ميغابايت)", - "huge": "ضخم (≥20 MB)", - "sort": "فرز", - "sizeDescription": "يشير الحجم إلى الحجم الإجمالي للبريد الإلكتروني، بما في ذلك المرفقات.", - "title": "بحث", - "searching": "جارٍ البحث، يرجى الانتظار...", - "noEmailsFound": "لم يتم العثور على رسائل بريد إلكتروني", - "startSearching": "ابدأ بإدخال كلمة رئيسية، مرسل، أو باستخدام فلاتر متقدمة.", - "adjustSearch": "حاول تعديل معايير البحث أو مسح الفلاتر.", - "tagFilter": "فلتر العلامات", - "from": "من", - "to": "إلى", - "subject": "الموضوع", - "date": "التاريخ", - "editTag": "تعديل العلامة", - "keyword": "كلمة رئيسية", - "sender": "المرسل", - "recipient": "المستلم", - "hasAttachment": "يحتوي على مرفق", - "yes": "نعم", - "no": "لا", - "dateRange": "النطاق الزمني", - "startDate": "تاريخ البدء", - "endDate": "تاريخ الانتهاء", - "advancedFilters": "فلاتر متقدمة", - "searchArchivedEmails": "البحث في رسائل البريد الإلكتروني المؤرشفة", - "fullTextMultiAccount": "نص كامل · متعدد الحسابات · فلاتر متقدمة", - "account": "الحساب", - "mailbox": "صندوق البريد", - "selectAccount": "اختر حسابًا", - "selectMailbox": "اختر صندوق بريد", - "noActiveEmailAccount": "لا يوجد حساب بريد إلكتروني نشط.", - "addEmailAccount": "إضافة حساب بريد إلكتروني", - "noMailboxSelectAccount": "لا يوجد صندوق بريد. يرجى تحديد حساب أولاً.", - "searchInSubjectBody": "البحث في الموضوع، النص، المرفقات...", - "searchingButton": "جارٍ البحث...", - "searchButton": "بحث", - "advanced": "متقدم", - "clear": "مسح", - "since": "منذ:", - "before": "قبل:", - "selectDate": "اختر تاريخًا", - "pleaseSelectAtLeastOne": "يرجى تحديد شرط بحث واحد على الأقل", - "cc": "نسخة", - "bcc": "نسخة مخفية", - "attachmentName": "اسم المرفق", - "messageId": "معرّف الرسالة", - "minSize": "الحد الأدنى للحجم", - "maxSize": "الحد الأقصى للحجم", - "senderRecipients": "المرسل / المستلمون", - "attachmentsSize": "المرفقات والحجم", - "minimumBytes": "الحد الأدنى", - "maximumBytes": "الحد الأقصى", - "originalMessageIdHeader": "عنوان معرّف الرسالة الأصلي للبريد الإلكتروني", - "addTags": { - "title": "تعديل العلامات", - "none": "لم تتم إضافة علامات", - "searchPlaceholder": "بحث أو إنشاء علامة...", - "createHint": "إنشاء علامة جديدة: {{tag}}", - "invalidTitle": "علامة غير صالحة", - "updatedTitle": "تم تحديث العلامات", - "updatedDesc": "تم تحديث العلامات بنجاح", - "updateFailedTitle": "فشل التحديث", - "tryAgain": "يرجى المحاولة مرة أخرى لاحقًا", - "selectedCount": "تم تحديد {{count}} علامة (علامات)", - "cancel": "إلغاء", - "save": "حفظ", - "saving": "جارٍ الحفظ..." - }, - "updateTags": { - "overwriteWarning": "تحذير: سيؤدي هذا إلى الكتابة فوق جميع العلامات الموجودة في العناصر المختارة.", - "title": "تحديث العلامات", - "none": "لم يتم اختيار أي علامات", - "searchPlaceholder": "ابحث أو أنشئ علامة جديدة...", - "createHint": "اضغط Enter لإنشاء علامة جديدة: \"{{tag}}\"", - "selectedCount": "سيتم تطبيق {{count}} من العلامات", - "cancel": "إلغاء", - "invalidTitle": "علامة غير صالحة", - "updatedTitle": "تم تحديث العلامات", - "updatedDesc": "تم تحديث العلامات بنجاح.", - "updateFailedTitle": "فشل التحديث", - "tryAgain": "يرجى المحاولة مرة أخرى لاحقاً.", - "actionAdd": "إضافة", - "actionRemove": "إزالة", - "actionOverwrite": "استبدال", - "submitAdd": "إضافة علامات", - "submitRemove": "إزالة علامات", - "submitOverwrite": "استبدال العلامات", - "savingAdd": "جاري الإضافة...", - "savingRemove": "جاري الإزالة...", - "savingOverwrite": "جاري الاستبدال..." - }, - "thread": { - "title": "المحادثة · {{count}} رسالة", - "error": "فشل تحميل المحادثة", - "empty": "لا توجد رسائل في هذه المحادثة", - "invalidDate": "تاريخ غير صالح", - "noSubject": "(لا يوجد موضوع)", - "loadingMore": "جارٍ التحميل...", - "loadMore": "تحميل المزيد" - }, - "bulkActions": { - "ariaLabel": "تم تحديد {{count}} رسائل. شريط الإجراءات", - "delete": "حذف", - "deleteDesc": "حذف الرسائل المحددة", - "selected": "تم تحديد {{count}}", - "clear": "مسح التحديد", - "manageTags": "إدارة العلامات" - }, - "delete": { - "title": "حذف الرسائل", - "confirmPrefix": "هل أنت متأكد من حذف", - "countLabel": "{{count}} رسائل؟", - "confirmDetail": "هذا الإجراء لا يمكن التراجع عنه.", - "confirmButton": "حذف", - "warningTitle": "تحذير", - "warningDesc": "سيتم حذف الرسائل نهائياً ولا يمكن استعادتها.", - "successTitle": "تم الحذف", - "successDesc": "تم حذف الرسائل بنجاح.", - "errorTitle": "فشل الحذف" - } + "submit": "إرسال", + "syncAfterDate": "مزامنة البيانات بعد تاريخ محدد", + "syncRecentData": "نقل تاريخ المزامنة بمرور الوقت، مزامنة البيانات الحديثة فقط", + "syncStartDateDescription": "يحدد تاريخ بدء المزامنة - إما محددًا أو نسبيًا للوقت الحالي. يتم استبعاد رسائل البريد الإلكتروني السابقة، {{fixedPart}}.", + "theAccountHasNotCompletedTheAuthorizationProcess": "لم يكمل الحساب عملية التخويل. الرجاء ", + "thisAccountIsUsedForIdentificationPurposesOnly": "يستخدم هذا الحساب لأغراض التعريف فقط ولا يتطلب المزامنة مع خادم بريد إلكتروني. إنه يساعد في استيراد بيانات البريد الإلكتروني.", + "thisWillPreventTheAccountFromBeingUsed": "لن يقوم هذا الحساب بمزامنة البيانات من خادم IMAP بعد الآن، ولكن لا تزال البيانات الموجودة متاحة للعرض.", + "title": "حسابات البريد الإلكتروني", + "toAuthorizeTheAccount": " لتخويل الحساب.", + "type": "النوع", + "unit": "الوحدة", + "updateAccount": "تحديث الحساب", + "updateFailed": "فشل التحديث، يرجى المحاولة مرة أخرى لاحقًا", + "updateTheEmailAccountHere": "تحديث حساب البريد الإلكتروني هنا. ", + "updatedAt": "تاريخ التحديث", + "useDangerous": "الثقة بأي شهادة TLS", + "useDangerousDescription": "فعّل هذا الخيار فقط إذا كنت تتصل بخادم IMAP يستخدم شهادة TLS صادرة عن CA عام أو شهادة موقعة ذاتياً قد لا يتعرف عليها نظامك. هذا الإعداد يتجاوز عملية التحقق الاعتيادية من الشهادة، وقد يعرض الاتصال لهجمات “رجل في الوسط” — فعّله فقط إذا كنت تدرك المخاطر.", + "useNoProxy": "بدون وكيل", + "useProxy": "استخدام وكيل", + "useProxyField": "استخدام وكيل", + "value": "القيمة", + "viewDetails": "عرض التفاصيل", + "years": "سنوات" + }, + "apiDocs": { + "choosePreferredType": "اختر نوع توثيق واجهة برمجة التطبيقات المفضل لديك", + "downloadSpecYAML": "تحميل مواصفات YAML", + "openAPIExplorer": "مستكشف OpenAPI", + "reDoc": "ReDoc", + "scalar": "سكالار", + "swaggerUI": "واجهة مستخدم Swagger" + }, + "apiTokens": { + "deleteDialog": { + "cancel": "إلغاء", + "confirm": "حذف", + "deleting": "جاري الحذف...", + "description": "لا يمكن التراجع عن هذا الإجراء. أي تطبيق يستخدم هذا الرمز سيفقد إمكانية الوصول على الفور.", + "title": "حذف رمز الوصول؟" }, - "mail": { - "emailViewer": "عارض البريد الإلكتروني", - "noMessageSelected": "لم يتم تحديد رسالة", - "account": "الحساب", - "from": "من", - "to": "إلى", - "subject": "الموضوع", - "date": "التاريخ", - "tags": "العلامات", - "noTagsYet": "لا توجد علامات بعد", - "id": "المعرّف", - "cc": "نسخة", - "bcc": "نسخة مخفية", - "attachments": "المرفقات", - "download": "تحميل", - "delete": "حذف", - "viewThread": "عرض المحادثة", - "downloadStarted": "بدأ التحميل", - "downloadComplete": "اكتمل التحميل", - "downloadFailed": "فشل التحميل", - "failedToDownloadFile": "فشل تحميل الملف", - "failedToLoadEmail": "فشل تحميل رسالة البريد الإلكتروني.", - "isBeingDownloaded": "جارٍ تحميل {{id}}", - "downloaded": "تم تحميل {{id}}", - "showLess": "إظهار أقل", - "showMore": "إظهار المزيد...", - "onlyNonInlineAttachments": "يتم عرض المرفقات غير المضمنة فقط هنا.", - "noAttachments": "لا توجد مرفقات" + "dialog": { + "createTitle": "إنشاء رمز وصول", + "description": "انقر على حفظ عند الانتهاء.", + "editTitle": "تعديل رمز الوصول", + "save": "حفظ", + "saveChanges": "حفظ التغييرات" }, - "oauth2": { - "title": "OAuth2", - "addConfiguration": "إضافة تكوين", - "id": "المعرّف", - "provider": "المزود", - "clientId": "معرّف العميل", - "clientSecret": "سر العميل", - "redirectUri": "معرّف الموارد المنتظم (URI) لإعادة التوجيه", - "scopes": "النطاقات", - "status": "الحالة", - "enabled": "مفعل", - "disabled": "معطل", - "edit": "تعديل", - "delete": "حذف", - "enable": "تفعيل", - "disable": "تعطيل", - "noConfigurations": "لا توجد تكوينات OAuth2", - "noConfigurationsDesc": "لم تقم بإضافة أي تكوينات OAuth2 بعد. أضف واحدة لبدء استخدام ميزات OAuth2.", - "description": "التعامل التلقائي مع استرداد رمز الوصول، وتخزينه، وتحديثه، مما يضمن تجربة مصادقة سلسة وجاهزة دائمًا.", - "addNew": "إضافة جديد", - "updateHere": "التحديث هنا.", - "createNewHere": "إنشاء جديد هنا.", - "clickSaveWhenDone": "انقر على حفظ عند الانتهاء.", - "quickPresets": "الإعدادات المسبقة السريعة:", - "gmail": "جيميل", - "outlook": "آوتلوك", - "whenDisabled": "عند التعطيل: - سيتم رفض تدفقات التخويل الجديدة على الفور - سيتم إبطال رموز الوصول ورموز التحديث الحالية في غضون دقيقة واحدة - يجب على المستخدمين إعادة التخويل عند إعادة التمكين", - "clientIdLabel": "معرّف العميل:", - "enterYourClientId": "أدخل معرّف العميل الخاص بك", - "theUniqueIdentifierForYourApplication": "المعرّف الفريد لتطبيقك، والمقدم من مزود OAuth.", - "clientSecretLabel": "سر العميل:", - "leaveEmptyToKeepExistingSecret": "اترك فارغًا للاحتفاظ بالسر الحالي", - "enterYourClientSecret": "أدخل سر العميل الخاص بك", - "leaveEmptyToKeepTheExistingSecret": "اترك فارغًا للاحتفاظ بالسر الحالي. أدخل قيمة جديدة فقط إذا كنت تريد تغييرها.", - "aSecretKeyProvidedByTheOAuthProvider": "مفتاح سري مقدم من مزود OAuth لمصادقة تطبيقك.", - "authUrlLabel": "عنوان URL للمصادقة:", - "enterTheAuthorizationUrl": "أدخل عنوان URL للتخويل", - "theUrlWhereUsersWillBeRedirected": "عنوان URL الذي سيتم توجيه المستخدمين إليه لتخويل تطبيقك.", - "tokenUrlLabel": "عنوان URL للرمز المميز:", - "enterTheTokenUrl": "أدخل عنوان URL للرمز المميز", - "theUrlUsedToExchange": "عنوان URL المستخدم لتبادل رمز التخويل برمز وصول.", - "redirectUrlLabel": "عنوان URL لإعادة التوجيه:", - "enterYourRedirectUrl": "أدخل عنوان URL لإعادة التوجيه الخاص بك", - "theRedirectUrlAfterAuthorization": "عنوان URL لإعادة التوجيه بعد التخويل. يجب أن يتطابق مع العنوان المسجل لدى مزود OAuth. استخدم التنسيق http://[host]:[port]/oauth2/callback (أو https://)، حيث يتطابق [host] و[port] مع نشر RustMailer الخاص بك. المسار /oauth2/callback ثابت.", - "scope": "النطاق:", - "enterTheScopeHere": "أدخل النطاق هنا.", - "addScope": "إضافة نطاق", - "key": "المفتاح:", - "enterTheKeyHere": "أدخل المفتاح هنا.", - "value": "القيمة:", - "enterTheValueHere": "أدخل القيمة هنا.", - "addExtraParams": "إضافة معلمات إضافية", - "useProxyOptional": "استخدام وكيل (اختياري):", - "selectAProxy": "اختر وكيلًا", - "noProxyAvailable": "لا يوجد وكيل متاح", - "useSocks5ProxyForOAuthRequests": "استخدم وكيل SOCKS5 لطلبات OAuth عندما يكون الوصول المباشر محظورًا.", - "descriptionLabel": "الوصف:", - "describeThePurposeOfTheOauth2Application": "صف الغرض من تطبيق oauth2", - "optional": "اختياري", - "saving": "جارٍ الحفظ...", - "creating": "جارٍ الإنشاء...", - "saveChanges": "حفظ التغييرات", - "save": "حفظ", - "updated": "تم التحديث", - "created": "تم الإنشاء", - "yourOAuth2ApplicationHasBeenSuccessfully": "تم {{action}} تطبيق OAuth2 الخاص بك بنجاح.", - "updateFailed": "فشل التحديث", - "creationFailed": "فشل الإنشاء", - "updateOrCreationFailed": "فشل {{action}}، يرجى المحاولة مرة أخرى لاحقًا", - "clientSecretIsRequired": "سر العميل مطلوب", - "clientSecretCannotBeEmpty": "لا يمكن أن يكون سر العميل فارغًا", - "keyIsRequired": "المفتاح مطلوب", - "keyCannotBeEmpty": "لا يمكن أن يكون المفتاح فارغًا", - "valueIsRequired": "القيمة مطلوبة", - "valueCannotBeEmpty": "لا يمكن أن تكون القيمة فارغة", - "descriptionMustNotExceed255Characters": "يجب ألا يتجاوز الوصف 255 حرفًا.", - "clientIdIsRequired": "معرّف العميل مطلوب", - "clientIdCannotBeEmpty": "لا يمكن أن يكون معرّف العميل فارغًا", - "authorizationUrlIsRequired": "عنوان URL للتخويل مطلوب", - "authorizationUrlCannotBeEmpty": "لا يمكن أن يكون عنوان URL للتخويل فارغًا", - "invalidAuthorizationUrlFormat": "تنسيق عنوان URL للتخويل غير صالح", - "tokenUrlIsRequired": "عنوان URL للرمز المميز مطلوب", - "tokenUrlCannotBeEmpty": "لا يمكن أن يكون عنوان URL للرمز المميز فارغًا", - "invalidTokenUrlFormat": "تنسيق عنوان URL للرمز المميز غير صالح", - "redirectUriIsRequired": "معرّف الموارد المنتظم (URI) لإعادة التوجيه مطلوب", - "redirectUriCannotBeEmpty": "لا يمكن أن يكون معرّف الموارد المنتظم (URI) لإعادة التوجيه فارغًا", - "invalidRedirectUriFormat": "تنسيق معرّف الموارد المنتظم (URI) لإعادة التوجيه غير صالح", - "authorizeEmailAccount": "تخويل حساب البريد الإلكتروني", - "authorizeAnEmailAccountToStartTheOAuth2AuthorizationProcess": "خوّل حساب بريد إلكتروني لبدء عملية تخويل OAuth2.", - "loadingAccounts": "جارٍ تحميل الحسابات...", - "selectAnAccount": "اختر حسابًا", - "noEmailAccountsRegistered": "لا توجد حسابات بريد إلكتروني مسجلة. يرجى إنشاء واحد.", - "pleaseCreateOne": "يرجى إنشاء واحد.", - "createAccount": "إنشاء حساب", - "authorize": "تخويل", - "getAuthorizeUrlFailed": "فشل الحصول على عنوان URL للتخويل", - "getAuthorizeUrlFailedDesc": "فشل الحصول على عنوان URL للتخويل، يرجى المحاولة مرة أخرى لاحقًا", - "oauth2ClientUpdated": "تم تحديث عميل OAuth2", - "oauth2ClientHasBeenSuccessfully": "تم {{action}} عميل OAuth2 بنجاح.", - "statusUpdateFailed": "فشل تحديث الحالة، يرجى المحاولة مرة أخرى لاحقًا", - "disableOAuth2Client": "تعطيل عميل OAuth2", - "enableOAuth2Client": "تمكين عميل OAuth2", - "areYouSureYouWantTo": "هل أنت متأكد أنك تريد {{action}} عميل OAuth2 هذا؟", - "thisWillPreventTheOAuth2ClientFromBeingUsed": "سيؤدي هذا إلى منع استخدام عميل OAuth2.", - "deleteToken": "حذف الرمز المميز", - "areYouSureYouWantToDelete": "هل أنت متأكد أنك تريد حذف", - "thisActionWillPermanentlyRemoveTheOauth2Record": "سيؤدي هذا الإجراء إلى إزالة سجل OAuth2 نهائيًا من النظام. لا يمكن التراجع عن هذا.", - "enterIdToConfirmDeletion": "أدخل المعرّف لتأكيد الحذف.", - "warning": "تحذير!", - "pleaseBeCareful": "يرجى توخي الحذر، لا يمكن التراجع عن هذه العملية.", - "deleteSuccess": "نجاح الحذف", - "yourOAuth2ApplicationHasBeenSuccessfullyDeleted": "تم حذف تطبيق OAuth2 الخاص بك بنجاح.", - "oauth2DeleteFailed": "فشل حذف OAuth2", - "deleteFailed": "فشل الحذف، يرجى المحاولة مرة أخرى لاحقًا", - "actions": { - "openMenu": "فتح القائمة", - "edit": "تعديل", - "authorize": "تخويل", - "delete": "حذف" - }, - "authFailed": "فشل مصادقة OAuth2", - "error": "خطأ", - "unknownError": "حدث خطأ غير معروف.", - "tryAgain": "حاول مرة أخرى", - "goHome": "الذهاب إلى الرئيسية", - "authSuccess": "نجاح مصادقة OAuth2", - "success": "نجاح", - "successMessage": "تمت مصادقة حساب بريدك الإلكتروني بنجاح عبر OAuth2. تم حفظ رمز الوصول بواسطة النظام وسيتم تحديثه تلقائيًا حسب الحاجة.", - "goToAccounts": "الذهاب إلى الحسابات", - "authAtatus": "حالة مصادقة OAuth2", - "information": "معلومات", - "noStatus": "تعرض هذه الصفحة نتيجة مصادقة OAuth2 الخاصة بك. لا تتوفر حاليًا حالة محددة. يرجى المحاولة مرة أخرى إذا لزم الأمر.", - "backToLogin": "العودة إلى تسجيل الدخول" + "form": { + "1day": "يوم واحد", + "30days": "30 يومًا", + "7days": "7 أيام", + "errorInt": "يجب أن يكون عددًا صحيحًا", + "errorMax": "32 حرفًا كحد أقصى", + "errorNumber": "يجب أن يكون رقمًا", + "errorPositive": "يجب أن يكون أكبر من 0", + "expirationDescription": "ستنتهي صلاحية الرموز تلقائيًا بعد الوقت المحدد.", + "expirationLabel": "تنتهي الصلاحية", + "expirationPlaceholder": "حدد تاريخ الانتهاء", + "nameDescription": "اختياري · 32 حرفًا كحد أقصى", + "nameLabel": "الاسم", + "namePlaceholder": "أعطِ رمز الوصول هذا اسمًا قصيرًا", + "never": "أبدًا" }, - "accessTokens": { - "title": "رموز الوصول", - "name": "الاسم", - "accounts": "الحسابات", - "token": "الرمز المميز", - "createdAt": "تاريخ الإنشاء", - "expiresAt": "تاريخ الانتهاء", - "edit": "تعديل", - "delete": "حذف", - "create": "إنشاء", - "noTokens": "لا توجد رموز وصول", - "noTokensDesc": "لم تقم بإنشاء أي رموز وصول بعد. أنشئ واحدًا لبدء استخدام ميزات واجهة برمجة التطبيقات.", - "description": "إدارة رموز الوصول الخاصة بك، وضوابط الوصول، وقوائم IP البيضاء، وإعدادات تحديد المعدل هنا.", - "editToken": "تعديل الرمز المميز", - "addNew": "إضافة جديد", - "updateTheAccessTokenHere": "تحديث رمز الوصول هنا.", - "createNewAccessTokenHere": "إنشاء رمز وصول جديد هنا.", - "selectAccounts": "اختيار الحسابات", - "selectMultipleAccountsForTheAccessToken": "اختر حسابات متعددة لنطاق تخويل رمز الوصول.", - "enterOneIpAddressPerLine": "أدخل عنوان IP واحدًا لكل سطر، مثال:\n192.168.1.1\n192.168.1.2", - "aListOfIpAddressesAllowed": "قائمة بعناوين IP المسموح لها بالوصول إلى المورد. أدخل عنوان IP واحدًا لكل سطر. (اختياري)", - "enterQuota": "أدخل الحصة، مثال: 100", - "theMaximumNumberOfRequestsAllowed": "الحد الأقصى لعدد الطلبات المسموح بها ضمن الفاصل الزمني. (اختياري)", - "enterIntervalInSeconds": "أدخل الفاصل الزمني بالثواني، مثال: 60", - "theTimeWindowForTheRateLimit": "النافذة الزمنية (بالثواني) لتحديد المعدل. (اختياري)", - "describeThePurposeOfTheAccessToken": "صف الغرض من رمز الوصول", - "updating": "جارٍ التحديث...", - "saving": "جارٍ الحفظ...", - "creating": "جارٍ الإنشاء...", - "saveChanges": "حفظ التغييرات", - "save": "حفظ", - "updated": "تم التحديث", - "created": "تم الإنشاء", - "yourAccessTokenHasBeenSuccessfully": "تم {{action}} رمز الوصول الخاص بك بنجاح.", - "updateFailed": "فشل التحديث", - "creationFailed": "فشل الإنشاء", - "updateOrCreationFailed": "فشل {{action}}، يرجى المحاولة مرة أخرى لاحقًا", - "quotaMustBeAPositiveInteger": "يجب أن تكون الحصة عددًا صحيحًا موجبًا.", - "intervalMustBeAPositiveInteger": "يجب أن يكون الفاصل الزمني عددًا صحيحًا موجبًا.", - "invalidIpAddressesFound": "تم العثور على عناوين IP غير صالحة. يرجى إدخال عناوين IPv4 أو IPv6 صالحة.", - "atLeastOneAccountIsRequired": "مطلوب حساب واحد على الأقل.", - "descriptionMustNotExceed255Characters": "يجب ألا يتجاوز الوصف 255 حرفًا.", - "notUsedYet": "لم يُستخدم بعد", - "theListOfAccountsThatCanBeQueried": "قائمة الحسابات التي يمكن الاستعلام عنها باستخدام رمز وصول.", - "accountId": "معرّف الحساب", - "filterByEmailAddressOrAccountId": "تصفية حسب عنوان البريد الإلكتروني أو معرّف الحساب...", - "aclRulesForAccessTokens": "تتضمن قواعد قائمة التحكم بالوصول (ACL) لرموز الوصول التحقق من قائمة IP البيضاء وتطبيق تحديد المعدل.", - "actions": { - "openMenu": "فتح القائمة", - "edit": "تعديل", - "delete": "حذف" - }, - "quota": "الحصة", - "interval": "الفاصل الزمني" + "list": { + "createdLabel": "تم الإنشاء في", + "deleteBtn": "حذف الرمز", + "expiresOnLabel": "ينتهي في", + "expiresOnShort": "ينتهي في {{date}}", + "lastUsedLabel": "آخر استخدام", + "neverExpires": "لا تنتهي صلاحيته أبدًا", + "neverLabel": "أبدًا", + "neverUsed": "أبدًا", + "statusActive": "نشط", + "statusExpired": "منتهي الصلاحية", + "tokenLabel": "الرمز", + "unnamedToken": "رمز بدون اسم" }, - "settings": { - "appearance": { - "title": "المظهر", - "field": { - "language": "لغة الواجهة", - "theme": "سمة الواجهة" - }, - "description": { - "language": "اختر اللغة المستخدمة في واجهة الويب.", - "theme": "اختر بين الوضع الفاتح أو الداكن." - }, - "placeholder": { - "select_language": "اختر اللغة" - }, - "command": { - "search": "بحث عن لغة...", - "no_results": "لم يتم العثور على لغة." - }, - "theme": { - "light": "فاتح", - "dark": "داكن" - }, - "button": { - "update": "تحديث التفضيلات" - }, - "validation": { - "language": { - "required": "Please select a language." - }, - "theme": { - "required": "Please select a theme." - } - } - }, - "title": "الإعدادات", - "general": "عام", - "proxy": "وكيل", - "name": "الاسم", - "host": "المُضيف", - "port": "المنفذ", - "username": "اسم المستخدم", - "password": "كلمة المرور", - "type": "النوع", - "actions": "الإجراءات", - "edit": "تعديل", - "delete": "حذف", - "add": "إضافة", - "noProxies": "لا توجد وكلاء", - "noProxiesDesc": "لم تقم بإضافة أي تكوينات وكيل بعد. أضف واحدًا لبدء استخدام ميزات الوكيل.", - "root": "الجذر", - "rootTitle": "المستخدم الجذر", - "rootDesc": "إدارة بيانات اعتماد وصول الجذر بما في ذلك الرمز المميز وكلمة المرور.", - "rootAccessManagement": "إدارة وصول الجذر", - "manageRootTokenAndPassword": "إدارة رمز الجذر وكلمة المرور بأمان.", - "resetRootToken": "إعادة تعيين رمز الجذر", - "generateNewToken": "إنشاء رمز مميز جديد، القديم تنتهي صلاحيته على الفور.", - "reset": "إعادة تعيين", - "resetRootPassword": "إعادة تعيين كلمة مرور الجذر", - "changePasswordForFutureLogins": "تغيير كلمة المرور لعمليات تسجيل الدخول المستقبلية.", - "youAreAboutToResetTheRootToken": "أنت على وشك إعادة تعيين رمز الجذر. لا يمكن التراجع عن هذا الإجراء.", - "confirmReset": "تأكيد إعادة التعيين", - "youAreAboutToResetTheRootPassword": "أنت على وشك إعادة تعيين كلمة مرور الجذر. تأكد من تخزينها بأمان.", - "enterNewRootPassword": "أدخل كلمة مرور الجذر الجديدة", - "theRootTokenHasBeenReset": "تمت إعادة تعيين رمز الجذر", - "yourLoginInformationHasBeenUpdated": "تم تحديث معلومات تسجيل الدخول الخاصة بك. لا حاجة لتسجيل الدخول مرة أخرى.", - "invalidPassword": "كلمة مرور غير صالحة", - "rootPasswordMustBeAtLeast6Characters": "يجب أن تتكون كلمة مرور الجذر من 6 أحرف على الأقل.", - "theRootPasswordHasBeenReset": "تمت إعادة تعيين كلمة مرور الجذر", - "useNewPasswordForNextLogin": "استخدم كلمة المرور الجديدة لعملية تسجيل الدخول التالية.", - "failedToCopyText": "فشل نسخ النص", - "filterProxy": "تصفية الوكيل...", - "filterOauth2": "تصفية oauth2...", - "filterAccount": "تصفية الحساب...", - "filterAccessToken": "تصفية رمز الوصول...", - "selectAll": "تحديد الكل", - "theme": "السمة", - "id": "المعرّف", - "url": "عنوان URL", - "createdAt": "تاريخ الإنشاء", - "updatedAt": "تاريخ التحديث", - "enabled": "مفعل", - "useProxy": "استخدام وكيل", - "authUrl": "عنوان URL للمصادقة", - "tokenUrl": "عنوان URL للرمز المميز", - "description": "الوصف", - "token": "الرمز المميز", - "accounts": "الحسابات", - "acl": "قائمة التحكم بالوصول (ACL)", - "lastAccess": "آخر وصول", - "enterProxyIdToConfirmDeletion": "أدخل معرّف الوكيل لتأكيد الحذف.", - "updateTheProxyHere": "تحديث الوكيل هنا. ", - "addNewProxyHere": "إضافة وكيل جديد هنا. ", - "pleaseUseAnIpAddressForBetterReliability": "يرجى استخدام عنوان IP (مثال: 127.0.0.1) بدلاً من اسم المُضيف أو النطاق لتحسين الموثوقية.", - "adding": "جارٍ الإضافة...", - "yourProxyHasBeenSuccessfully": "تم {{action}} الوكيل الخاص بك بنجاح.", - "proxyUpdateOrAddFailed": "فشل {{action}}، يرجى المحاولة مرة أخرى لاحقًا", - "sidebar": { - "profile": "الملف الشخصي", - "apiTokens": "رموز API", - "proxy": "وكيل الشبكة", - "configurations": "تكوينات النظام" - }, - "profile": { - "loadError": "فشل في تحميل معلومات المستخدم.", - "uploadTitle": "رفع الصورة الشخصية", - "maxSize": "حتى {{size}}", - "avatarAlt": "الصورة الشخصية", - "removeAvatar": "إزالة الصورة الشخصية", - "uploadError": "خطأ في رفع الملف", - "field": { - "username": "اسم المستخدم", - "email": "البريد الإلكتروني", - "password": "كلمة المرور" - }, - "placeholder": { - "password_keep": "اتركه فارغًا للاحتفاظ بكلمة المرور الحالية" - }, - "button": { - "update_profile": "تحديث الملف الشخصي", - "permissions": "الصلاحيات", - "view_global_permissions": "عرض الصلاحيات العامة" - }, - "section": { - "roles": "الأدوار", - "accounts": "{{count}} حسابات مرتبطة" - }, - "account": { - "id": "معرّف الحساب: {{id}}" - }, - "toast": { - "updated": "تم تحديث الملف الشخصي بنجاح", - "update_failed": "فشل في تحديث الملف الشخصي" - }, - "validation": { - "username": { - "required": "اسم المستخدم مطلوب", - "min": "يجب أن يكون اسم المستخدم 5 أحرف على الأقل", - "max": "يجب ألا يزيد اسم المستخدم عن 32 حرفًا" - }, - "email": { - "required": "البريد الإلكتروني مطلوب", - "invalid": "يرجى إدخال بريد إلكتروني صالح" - }, - "password": { - "min": "يجب أن تكون كلمة المرور 8 أحرف على الأقل", - "max": "يجب ألا تزيد كلمة المرور عن 256 حرفًا" - } - } - } + "notifications": { + "close": "إغلاق", + "copied": "تم النسخ إلى الحافظة", + "createFailed": "فشل الإنشاء", + "createSuccess": "تم إنشاء رمز الوصول", + "createSuccessDesc": "تم إنشاء رمز الوصول بنجاح.", + "deleteFailed": "فشل حذف رمز الوصول", + "deleteSuccess": "تم حذف رمز الوصول بنجاح", + "genericError": "فشلت العملية. يرجى المحاولة مرة أخرى.", + "tryAgain": "إعادة المحاولة", + "updateFailed": "فشل التحديث", + "updateSuccess": "تم تحديث رمز الوصول", + "updateSuccessDesc": "تم تحديث رمز الوصول بنجاح." }, - "apiDocs": { - "choosePreferredType": "اختر نوع توثيق واجهة برمجة التطبيقات المفضل لديك", - "swaggerUI": "واجهة مستخدم Swagger", - "reDoc": "ReDoc", - "openAPIExplorer": "مستكشف OpenAPI", - "scalar": "سكالار", - "downloadSpecYAML": "تحميل مواصفات YAML" + "page": { + "addBtn": "إضافة رمز", + "emptyDescription": "لم تقم بإنشاء أي رموز API بعد. انقر أدناه لإنشاء واحد.", + "emptyTitle": "لا توجد رموز API", + "loadError": "فشل تحميل رموز API." + } + }, + "attachment": { + "all_fields_desc": "مطابقة اسم المرفق، موضوع الرسالة، والمرسل", + "date": "التاريخ", + "name": "اسم الملف", + "search_input_placeholder": "بحث عن المرفقات (استخدم \" \" للبحث عن عبارة)", + "sender": "المرسل", + "sender_with_count": "المرسل ({{count}})", + "size": "حجم الملف", + "source": "المصدر", + "subject": "الموضوع" + }, + "auth": { + "areYouSureYouWantToLogOut": "هل أنت متأكد أنك تريد تسجيل الخروج؟", + "invalidPassword": "كلمة مرور غير صالحة. الرجاء المحاولة مرة أخرى.", + "login": "تسجيل الدخول", + "loginFailed": "فشل تسجيل الدخول", + "logout": "تسجيل الخروج", + "password": "كلمة المرور", + "sessionExpired": "انتهت صلاحية الجلسة!", + "sessionExpiredDesc": "انتهت جلستك بسبب عدم النشاط. يرجى تسجيل الدخول مرة أخرى للمتابعة.", + "somethingWentWrong": "حدث خطأ ما", + "username": "اسم المستخدم", + "welcome": "مرحبًا بك في بيشون", + "youWillNeedToLogInAgain": "ستحتاج إلى تسجيل الدخول مرة أخرى للوصول إلى حسابك." + }, + "command": { + "dark": "داكن", + "light": "فاتح", + "noResultsFound": "لم يتم العثور على نتائج.", + "theme": "السمة", + "typeCommandOrSearch": "اكتب أمرًا أو ابحث..." + }, + "common": { + "actions": "إجراءات", + "add": "إضافة", + "all": "الكل", + "apply": "تطبيق", + "back": "رجوع", + "backToHome": "العودة للرئيسية", + "cancel": "إلغاء", + "clear": "مسح", + "close": "إغلاق", + "confirm": "تأكيد", + "create": "إنشاء", + "delete": "حذف", + "deleting": "جاري الحذف...", + "deselectAll": "إلغاء تحديد الكل", + "edit": "تعديل", + "empty": "فارغ", + "error": "خطأ", + "failed": "فشل", + "filter": "تصفية", + "goBack": "العودة", + "loading": "جاري التحميل...", + "more": "المزيد", + "na": "غير متاح", + "no": "لا", + "noData": "لا توجد بيانات", + "none": "لا شيء", + "notFound": "غير موجود", + "ok": "موافق", + "op_failed": "فشلت العملية", + "project_description": "Bichon هو مشروع مفتوح المصدر.", + "remove": "إزالة", + "reset": "إعادة تعيين", + "retry": "إعادة محاولة", + "save": "حفظ", + "save_changes": "حفظ التغييرات", + "search": "بحث", + "select": "تحديد", + "selectAll": "تحديد الكل", + "showLess": "عرض أقل", + "showMore": "عرض المزيد...", + "submit": "إرسال", + "table": { + "noResults": "لا توجد نتائج." }, - "dialogs": { - "confirmDelete": "تأكيد الحذف", - "confirmDeleteDesc": "هل أنت متأكد أنك تريد حذف هذا العنصر؟ لا يمكن التراجع عن هذا الإجراء.", - "deleteSuccess": "تم الحذف بنجاح", - "deleteFailed": "فشل الحذف", - "saveSuccess": "تم الحفظ بنجاح", - "saveFailed": "فشل الحفظ", - "createSuccess": "تم الإنشاء بنجاح", - "createFailed": "فشل الإنشاء", - "updateSuccess": "تم التحديث بنجاح", - "updateFailed": "فشل التحديث", - "continue": "متابعة", - "deleting": "جارٍ الحذف...", - "accountDeleted": "تم حذف الحساب", - "accountDeletedDesc": "تم حذف حسابك بنجاح.", - "accountDeleteFailed": "فشل حذف الحساب", - "deleteAccountPermanently": "حذف الحساب نهائيًا", - "youAreDeleting": "أنت تقوم بحذف {{email}}. سيؤدي هذا إلى الإزالة الدائمة لـ:", - "accountCredentials": "بيانات اعتماد الحساب وإعداداته", - "localCachedMetadata": "البيانات الوصفية المخزنة مؤقتًا محليًا وحالة المزامنة", - "imapSyncData": "بيانات مزامنة IMAP", - "oauthTokens": "رموز OAuth وبيانات اعتماد واجهة برمجة التطبيقات", - "typeEmailToConfirm": "اكتب بريد الحساب الإلكتروني للتأكيد:", - "typeToConfirm": "اكتب \"{{email}}\" للتأكيد", - "cannotBeUndone": "لا يمكن التراجع عن هذا الإجراء!", - "allResourcesErased": "سيتم مسح جميع الموارد ذات الصلة نهائيًا.", - "permanentlyDeleteAccount": "حذف الحساب نهائيًا" + "tryAgain": "إعادة المحاولة", + "update": "تحديث", + "view_on_github_button": "عرض على GitHub", + "yes": "نعم" + }, + "dashboard": { + "account": "الحساب", + "actualDiskUsage": "الاستخدام الفعلي للقرص", + "attachmentRatio": "نسبة المرفقات", + "attachmentRatioDesc": "{{percent}}% من رسائل البريد الإلكتروني تحتوي على مرفقات", + "attachments": "المرفقات", + "byMessageCount": "حسب عدد الرسائل", + "byMessageSize": "حسب حجم الرسالة", + "connected": "متصل", + "count": "العدد", + "dataStorage": "تخزين البيانات", + "dayTrend": "اتجاه 30 يومًا", + "efficiency": "كفاءة التخزين", + "emails": "رسائل البريد الإلكتروني", + "indexSize": "حجم الفهرس", + "localDataFiles": "ملفات البيانات المحلية", + "logicalVolume": "الحجم الأصلي", + "mailAccounts": "حسابات البريد", + "messageDistribution": "توزيع الرسائل", + "metadataSize": "حجم البيانات التعريفية", + "newEmails": "رسائل بريد إلكتروني جديدة", + "noAccountData": "لا توجد بيانات للحساب", + "noAttachments": "لا توجد مرفقات", + "noEmailsSynced": "لم تتم مزامنة أي رسائل بريد إلكتروني بعد", + "noLargeEmails": "لا توجد رسائل بريد إلكتروني كبيرة", + "noRecentActivity": "لا يوجد نشاط حديث", + "noSendersData": "لا توجد بيانات للمرسلين", + "noSubject": "(لا يوجد موضوع)", + "saved": "الموفرة", + "sender": "المرسل", + "size": "الحجم", + "subject": "الموضوع", + "syncedLocally": "تمت مزامنته محليًا", + "systemVersion": "إصدار النظام", + "tantivyDatabase": "تعتمد على محرك البحث Tantivy", + "title": "لوحة التحكم", + "top10Accounts": "أفضل 10 حسابات", + "top10LargestEmails": "أكبر 10 رسائل بريد إلكتروني", + "top10Senders": "أفضل 10 مرسلين", + "topLists": "القوائم الأعلى", + "totalEmailSize": "الحجم الإجمالي لرسائل البريد الإلكتروني", + "totalEmails": "إجمالي رسائل البريد الإلكتروني", + "withAttachments": "مع مرفقات" + }, + "dialogs": { + "accountCredentials": "بيانات اعتماد الحساب وإعداداته", + "accountDeleteFailed": "فشل حذف الحساب", + "accountDeleted": "تم حذف الحساب", + "accountDeletedDesc": "تم حذف حسابك بنجاح.", + "allResourcesErased": "سيتم مسح جميع الموارد ذات الصلة نهائيًا.", + "cannotBeUndone": "لا يمكن التراجع عن هذا الإجراء!", + "confirmDelete": "تأكيد الحذف", + "confirmDeleteDesc": "هل أنت متأكد أنك تريد حذف هذا العنصر؟ لا يمكن التراجع عن هذا الإجراء.", + "continue": "متابعة", + "createFailed": "فشل الإنشاء", + "createSuccess": "تم الإنشاء بنجاح", + "deleteAccountPermanently": "حذف الحساب نهائيًا", + "deleteFailed": "فشل الحذف", + "deleteSuccess": "تم الحذف بنجاح", + "deleting": "جارٍ الحذف...", + "imapSyncData": "بيانات مزامنة IMAP", + "localCachedMetadata": "البيانات الوصفية المخزنة مؤقتًا محليًا وحالة المزامنة", + "oauthTokens": "رموز OAuth وبيانات اعتماد واجهة برمجة التطبيقات", + "permanentlyDeleteAccount": "حذف الحساب نهائيًا", + "saveFailed": "فشل الحفظ", + "saveSuccess": "تم الحفظ بنجاح", + "typeEmailToConfirm": "اكتب بريد الحساب الإلكتروني للتأكيد:", + "typeToConfirm": "اكتب \"{{email}}\" للتأكيد", + "updateFailed": "فشل التحديث", + "updateSuccess": "تم التحديث بنجاح", + "youAreDeleting": "أنت تقوم بحذف {{email}}. سيؤدي هذا إلى الإزالة الدائمة لـ:" + }, + "errors": { + "contentNotModified": "لم يتم تعديل المحتوى!", + "forbidden": "ممنوع", + "forbiddenDesc": "ليس لديك الإذن اللازم لعرض هذا المورد.", + "forbiddenTitle": "الوصول ممنوع", + "internalServerError": "خطأ خادم داخلي!", + "learnMore": "معرفة المزيد", + "maintenance": "صيانة", + "maintenanceDesc": "الموقع غير متاح في الوقت الحالي. سنعود للعمل قريبًا.", + "maintenanceTitle": "الموقع قيد الصيانة!", + "networkError": "خطأ في الشبكة", + "networkErrorDesc": "تعذر الاتصال بالخادم. يرجى التحقق من اتصالك بالإنترنت والمحاولة مرة أخرى.", + "pageNotFound": "عذرًا! لم يتم العثور على الصفحة!", + "pageNotFoundDesc": "يبدو أن الصفحة التي تبحث عنها غير موجودة أو ربما تمّت إزالتها.", + "somethingWentWrong": "عذرًا! حدث خطأ ما :')", + "somethingWentWrongDesc": "نعتذر عن الإزعاج. الرجاء المحاولة مرة أخرى لاحقًا.", + "unauthorized": "غير مصرح به", + "unauthorizedDesc": "يرجى تسجيل الدخول ببيانات الاعتماد المناسبة للوصول إلى هذا المورد.", + "unauthorizedTitle": "وصول غير مصرح به" + }, + "mail": { + "account": "الحساب", + "attachments": "المرفقات", + "bcc": "نسخة مخفية", + "cc": "نسخة", + "date": "التاريخ", + "delete": "حذف", + "download": "تحميل", + "downloadComplete": "اكتمل التحميل", + "downloadFailed": "فشل التحميل", + "downloadStarted": "بدأ التحميل", + "downloaded": "تم تحميل {{id}}", + "emailViewer": "عارض البريد الإلكتروني", + "failedToDownloadFile": "فشل تحميل الملف", + "failedToLoadEmail": "فشل تحميل رسالة البريد الإلكتروني.", + "from": "من", + "id": "المعرّف", + "isBeingDownloaded": "جارٍ تحميل {{id}}", + "noAttachments": "لا توجد مرفقات", + "noMessageSelected": "لم يتم تحديد رسالة", + "noTagsYet": "لا توجد علامات بعد", + "onlyNonInlineAttachments": "يتم عرض المرفقات غير المضمنة فقط هنا.", + "showLess": "إظهار أقل", + "showMore": "إظهار المزيد...", + "subject": "الموضوع", + "tags": "العلامات", + "to": "إلى", + "viewThread": "عرض المحادثة" + }, + "mailbox": { + "bulkActions": { + "ariaLabel": "إجراءات مجمعة لـ {{count}} {{emailLabel}} محددة", + "clearSelection": "مسح التحديد", + "clearSelectionWithKey": "مسح التحديد ({{key}})", + "delete": "حذف", + "deleteTooltip": "حذف رسائل البريد الإلكتروني المحددة", + "email": "رسالة بريد إلكتروني", + "emails": "رسائل بريد إلكتروني", + "selected": "محددة" }, - "command": { - "typeCommandOrSearch": "اكتب أمرًا أو ابحث...", - "noResultsFound": "لم يتم العثور على نتائج.", - "theme": "السمة", - "light": "فاتح", - "dark": "داكن" + "deleteDialog": { + "confirm": "حذف", + "desc": "هل أنت متأكد أنك تريد حذف {{countText}}؟ سيؤدي هذا الإجراء إلى حذف رسالة (رسائل) البريد الإلكتروني المحددة من قاعدة البيانات المحلية. سيتم حذف رسالة (رسائل) البريد الإلكتروني نهائيًا ولا يمكن استردادها.", + "descCountMultiple": "رسائل البريد الإلكتروني هذه ({{count}})", + "descCountSingle": "رسالة البريد الإلكتروني هذه", + "errorTitle": "فشل حذف الرسائل", + "successDesc": "تم حذف الرسائل.", + "successTitle": "تم حذف الرسائل بنجاح", + "title": "حذف رسالة البريد الإلكتروني", + "warningDesc": "يرجى توخي الحذر قبل المتابعة.", + "warningTitle": "تحذير!" + }, + "deleteMailboxDialog": { + "confirm": "حذف نهائي", + "desc": "هل أنت متأكد من رغبتك في حذف مجلد البريد هذا؟ لا يمكن التراجع عن هذا الإجراء.", + "errorTitle": "فشل الحذف", + "successDesc": "تمت إزالة مجلد البريد ومحتوياته بنجاح.", + "successTitle": "تم الحذف بنجاح", + "title": "حذف مجلد البريد", + "warningDesc": "سيؤدي حذف هذا المجلد أيضًا إلى إزالة جميع رسائل البريد الإلكتروني المؤرشفة والمجلدات الفرعية الموجودة بداخله نهائيًا.", + "warningTitle": "تحذير" + }, + "folders": "المجلدات", + "messages": "الرسائل", + "noMessages": "لا توجد رسائل", + "selectFolder": "اختر مجلدًا لعرض الرسائل", + "thread": { + "empty": "لا توجد رسائل في هذه المحادثة.", + "invalidDate": "تاريخ غير صالح", + "loadError": "فشل تحميل المحادثة", + "loadMore": "تحميل المزيد", + "loadingMore": "جارٍ تحميل المزيد...", + "message": "رسالة", + "messages": "رسائل", + "noSubject": "(لا يوجد موضوع)", + "title": "المحادثة ({{count}} {{messageLabel}})" + }, + "title": "صندوق البريد" + }, + "navigation": { + "accessTokens": "رموز الوصول", + "accounts": "الحسابات", + "apiDocs": "توثيق واجهة برمجة التطبيقات", + "attachment": "المرفقات", + "auth": "المصادقة", + "dashboard": "لوحة التحكم", + "general": "عام", + "home": "الرئيسية", + "mailbox": "صندوق البريد", + "oauth2": "OAuth2", + "other": "أخرى", + "settings": "الإعدادات", + "users": "مستخدمو النظام" + }, + "oauth2": { + "aSecretKeyProvidedByTheOAuthProvider": "مفتاح سري مقدم من مزود OAuth لمصادقة تطبيقك.", + "actions": { + "authorize": "تخويل", + "delete": "حذف", + "edit": "تعديل", + "openMenu": "فتح القائمة" + }, + "addConfiguration": "إضافة تكوين", + "addExtraParams": "إضافة معلمات إضافية", + "addNew": "إضافة جديد", + "addScope": "إضافة نطاق", + "areYouSureYouWantTo": "هل أنت متأكد أنك تريد {{action}} عميل OAuth2 هذا؟", + "areYouSureYouWantToDelete": "هل أنت متأكد أنك تريد حذف", + "authAtatus": "حالة مصادقة OAuth2", + "authFailed": "فشل مصادقة OAuth2", + "authSuccess": "نجاح مصادقة OAuth2", + "authUrlLabel": "عنوان URL للمصادقة:", + "authorizationUrlCannotBeEmpty": "لا يمكن أن يكون عنوان URL للتخويل فارغًا", + "authorizationUrlIsRequired": "عنوان URL للتخويل مطلوب", + "authorize": "تخويل", + "authorizeAnEmailAccountToStartTheOAuth2AuthorizationProcess": "خوّل حساب بريد إلكتروني لبدء عملية تخويل OAuth2.", + "authorizeEmailAccount": "تخويل حساب البريد الإلكتروني", + "backToLogin": "العودة إلى تسجيل الدخول", + "clickSaveWhenDone": "انقر على حفظ عند الانتهاء.", + "clientId": "معرّف العميل", + "clientIdCannotBeEmpty": "لا يمكن أن يكون معرّف العميل فارغًا", + "clientIdIsRequired": "معرّف العميل مطلوب", + "clientIdLabel": "معرّف العميل:", + "clientSecret": "سر العميل", + "clientSecretCannotBeEmpty": "لا يمكن أن يكون سر العميل فارغًا", + "clientSecretIsRequired": "سر العميل مطلوب", + "clientSecretLabel": "سر العميل:", + "createAccount": "إنشاء حساب", + "createNewHere": "إنشاء جديد هنا.", + "created": "تم الإنشاء", + "creating": "جارٍ الإنشاء...", + "creationFailed": "فشل الإنشاء", + "delete": "حذف", + "deleteFailed": "فشل الحذف، يرجى المحاولة مرة أخرى لاحقًا", + "deleteSuccess": "نجاح الحذف", + "deleteToken": "حذف الرمز المميز", + "describeThePurposeOfTheOauth2Application": "صف الغرض من تطبيق oauth2", + "description": "التعامل التلقائي مع استرداد رمز الوصول، وتخزينه، وتحديثه، مما يضمن تجربة مصادقة سلسة وجاهزة دائمًا.", + "descriptionLabel": "الوصف:", + "descriptionMustNotExceed255Characters": "يجب ألا يتجاوز الوصف 255 حرفًا.", + "disable": "تعطيل", + "disableOAuth2Client": "تعطيل عميل OAuth2", + "disabled": "معطل", + "edit": "تعديل", + "enable": "تفعيل", + "enableOAuth2Client": "تمكين عميل OAuth2", + "enabled": "مفعل", + "enterIdToConfirmDeletion": "أدخل المعرّف لتأكيد الحذف.", + "enterTheAuthorizationUrl": "أدخل عنوان URL للتخويل", + "enterTheKeyHere": "أدخل المفتاح هنا.", + "enterTheScopeHere": "أدخل النطاق هنا.", + "enterTheTokenUrl": "أدخل عنوان URL للرمز المميز", + "enterTheValueHere": "أدخل القيمة هنا.", + "enterYourClientId": "أدخل معرّف العميل الخاص بك", + "enterYourClientSecret": "أدخل سر العميل الخاص بك", + "enterYourRedirectUrl": "أدخل عنوان URL لإعادة التوجيه الخاص بك", + "error": "خطأ", + "getAuthorizeUrlFailed": "فشل الحصول على عنوان URL للتخويل", + "getAuthorizeUrlFailedDesc": "فشل الحصول على عنوان URL للتخويل، يرجى المحاولة مرة أخرى لاحقًا", + "gmail": "جيميل", + "goHome": "الذهاب إلى الرئيسية", + "goToAccounts": "الذهاب إلى الحسابات", + "id": "المعرّف", + "information": "معلومات", + "invalidAuthorizationUrlFormat": "تنسيق عنوان URL للتخويل غير صالح", + "invalidRedirectUriFormat": "تنسيق معرّف الموارد المنتظم (URI) لإعادة التوجيه غير صالح", + "invalidTokenUrlFormat": "تنسيق عنوان URL للرمز المميز غير صالح", + "key": "المفتاح:", + "keyCannotBeEmpty": "لا يمكن أن يكون المفتاح فارغًا", + "keyIsRequired": "المفتاح مطلوب", + "leaveEmptyToKeepExistingSecret": "اترك فارغًا للاحتفاظ بالسر الحالي", + "leaveEmptyToKeepTheExistingSecret": "اترك فارغًا للاحتفاظ بالسر الحالي. أدخل قيمة جديدة فقط إذا كنت تريد تغييرها.", + "loadingAccounts": "جارٍ تحميل الحسابات...", + "noConfigurations": "لا توجد تكوينات OAuth2", + "noConfigurationsDesc": "لم تقم بإضافة أي تكوينات OAuth2 بعد. أضف واحدة لبدء استخدام ميزات OAuth2.", + "noEmailAccountsRegistered": "لا توجد حسابات بريد إلكتروني مسجلة. يرجى إنشاء واحد.", + "noProxyAvailable": "لا يوجد وكيل متاح", + "noStatus": "تعرض هذه الصفحة نتيجة مصادقة OAuth2 الخاصة بك. لا تتوفر حاليًا حالة محددة. يرجى المحاولة مرة أخرى إذا لزم الأمر.", + "oauth2ClientHasBeenSuccessfully": "تم {{action}} عميل OAuth2 بنجاح.", + "oauth2ClientUpdated": "تم تحديث عميل OAuth2", + "oauth2DeleteFailed": "فشل حذف OAuth2", + "optional": "اختياري", + "outlook": "آوتلوك", + "pleaseBeCareful": "يرجى توخي الحذر، لا يمكن التراجع عن هذه العملية.", + "pleaseCreateOne": "يرجى إنشاء واحد.", + "provider": "المزود", + "quickPresets": "الإعدادات المسبقة السريعة:", + "redirectUri": "معرّف الموارد المنتظم (URI) لإعادة التوجيه", + "redirectUriCannotBeEmpty": "لا يمكن أن يكون معرّف الموارد المنتظم (URI) لإعادة التوجيه فارغًا", + "redirectUriIsRequired": "معرّف الموارد المنتظم (URI) لإعادة التوجيه مطلوب", + "redirectUrlLabel": "عنوان URL لإعادة التوجيه:", + "save": "حفظ", + "saveChanges": "حفظ التغييرات", + "saving": "جارٍ الحفظ...", + "scope": "النطاق:", + "scopes": "النطاقات", + "selectAProxy": "اختر وكيلًا", + "selectAnAccount": "اختر حسابًا", + "status": "الحالة", + "statusUpdateFailed": "فشل تحديث الحالة، يرجى المحاولة مرة أخرى لاحقًا", + "success": "نجاح", + "successMessage": "تمت مصادقة حساب بريدك الإلكتروني بنجاح عبر OAuth2. تم حفظ رمز الوصول بواسطة النظام وسيتم تحديثه تلقائيًا حسب الحاجة.", + "theRedirectUrlAfterAuthorization": "عنوان URL لإعادة التوجيه بعد التخويل. يجب أن يتطابق مع العنوان المسجل لدى مزود OAuth. استخدم التنسيق http://[host]:[port]/oauth2/callback (أو https://)، حيث يتطابق [host] و[port] مع نشر RustMailer الخاص بك. المسار /oauth2/callback ثابت.", + "theUniqueIdentifierForYourApplication": "المعرّف الفريد لتطبيقك، والمقدم من مزود OAuth.", + "theUrlUsedToExchange": "عنوان URL المستخدم لتبادل رمز التخويل برمز وصول.", + "theUrlWhereUsersWillBeRedirected": "عنوان URL الذي سيتم توجيه المستخدمين إليه لتخويل تطبيقك.", + "thisActionWillPermanentlyRemoveTheOauth2Record": "سيؤدي هذا الإجراء إلى إزالة سجل OAuth2 نهائيًا من النظام. لا يمكن التراجع عن هذا.", + "thisWillPreventTheOAuth2ClientFromBeingUsed": "سيؤدي هذا إلى منع استخدام عميل OAuth2.", + "title": "OAuth2", + "tokenUrlCannotBeEmpty": "لا يمكن أن يكون عنوان URL للرمز المميز فارغًا", + "tokenUrlIsRequired": "عنوان URL للرمز المميز مطلوب", + "tokenUrlLabel": "عنوان URL للرمز المميز:", + "tryAgain": "حاول مرة أخرى", + "unknownError": "حدث خطأ غير معروف.", + "updateFailed": "فشل التحديث", + "updateHere": "التحديث هنا.", + "updateOrCreationFailed": "فشل {{action}}، يرجى المحاولة مرة أخرى لاحقًا", + "updated": "تم التحديث", + "useProxyOptional": "استخدام وكيل (اختياري):", + "useSocks5ProxyForOAuthRequests": "استخدم وكيل SOCKS5 لطلبات OAuth عندما يكون الوصول المباشر محظورًا.", + "value": "القيمة:", + "valueCannotBeEmpty": "لا يمكن أن تكون القيمة فارغة", + "valueIsRequired": "القيمة مطلوبة", + "warning": "تحذير!", + "whenDisabled": "عند التعطيل: - سيتم رفض تدفقات التخويل الجديدة على الفور - سيتم إبطال رموز الوصول ورموز التحديث الحالية في غضون دقيقة واحدة - يجب على المستخدمين إعادة التخويل عند إعادة التمكين", + "yourOAuth2ApplicationHasBeenSuccessfully": "تم {{action}} تطبيق OAuth2 الخاص بك بنجاح.", + "yourOAuth2ApplicationHasBeenSuccessfullyDeleted": "تم حذف تطبيق OAuth2 الخاص بك بنجاح." + }, + "permission": { + "account": { + "create": "إنشاء حسابات البريد الإلكتروني", + "manage": "إدارة الحسابات المخصصة", + "manage_all": "إدارة جميع إعدادات الحساب", + "read_details": "عرض تفاصيل الحساب" + }, + "category": { + "account": "أذونات الحساب", + "global_data": "البيانات العامة (مسؤول)", + "system_identity": "النظام والهوية" + }, + "data": { + "delete": "حذف رسائل البريد الإلكتروني المخصصة", + "delete_all": "حذف رسائل البريد الإلكتروني من جميع الحسابات", + "export_batch": "تصدير دفعي للبيانات المخصصة", + "export_batch_all": "تصدير دفعي لجميع البيانات", + "import_batch": "استيراد دفعي لبيانات البريد الإلكتروني", + "manage": "إدارة بيانات وصفية للبريد الإلكتروني المخصص", + "manage_all": "إدارة جميع البيانات الوصفية للبريد الإلكتروني", + "raw_download": "تنزيل رسائل البريد الإلكتروني الخام المخصصة", + "raw_download_all": "تنزيل جميع رسائل البريد الإلكتروني الخام", + "read": "قراءة بيانات البريد الإلكتروني المخصصة", + "read_all": "قراءة جميع بيانات البريد الإلكتروني", + "smtp_ingest": "استيعاب رسائل البريد الإلكتروني عبر بروتوكول SMTP" + }, + "dialog": { + "account_description": "أذونات مقيدة بالحساب المحدد.", + "account_title": "أذونات الحساب", + "global_description": "أذونات على مستوى النظام ممنوحة لهذا المستخدم.", + "global_title": "الأذونات العامة" + }, + "scope": { + "account": "الحساب رقم {{id}}", + "global": "عام" + }, + "system": { + "access": "الوصول الأساسي إلى النظام", + "root": "التحكم الكامل في النظام" + }, + "token": { + "manage": "إدارة رموز الوصول" + }, + "user": { + "manage": "إدارة جميع المستخدمين", + "view": "عرض معلومات المستخدم الأساسية" + } + }, + "profile": { + "avatar_alt": "الصورة الشخصية", + "menu": { + "profile": "الملف الشخصي", + "settings": "الإعدادات", + "sign_out": "تسجيل الخروج" + } + }, + "proxyDelete": { + "close": "إغلاق", + "confirmText": "هل أنت متأكد أنك تريد الحذف", + "deleteBtn": "حذف", + "failedDesc": "فشل الحذف، يرجى المحاولة مرة أخرى لاحقًا", + "failedTitle": "فشل حذف الوكيل", + "permanent": "سيؤدي هذا الإجراء إلى إزالة الوكيل نهائيًا من النظام. لا يمكن التراجع عن هذا.", + "proxyIdLabel": "معرّف الوكيل:", + "proxyIdPlaceholder": "أدخل معرّف الوكيل لتأكيد الحذف.", + "successDesc": "تم حذف الوكيل بنجاح.", + "successTitle": "نجاح الحذف", + "title": "حذف الوكيل", + "tryAgain": "حاول مرة أخرى", + "warningDesc": "يرجى توخي الحذر، لا يمكن التراجع عن هذه العملية.", + "warningTitle": "تحذير!" + }, + "restore_message": { + "accountsInvolved": "الحسابات المعنية", + "bulkTitle": "استعادة رسائل متعددة", + "bulkWarning": "ملاحظة: سيتم استعادة الرسائل إلى مجلداتها الأصلية.", + "confirm": "تنفيذ الاستعادة", + "desc": "سيقوم هذا الإجراء بإعادة رفع الرسائل المحددة من Bichon واستعادتها إلى صناديق البريد المقابلة لها على خادم IMAP.", + "failed": "فشلت الاستعادة", + "failedTitle": "فشل في الاستعادة", + "messages": "رسائل", + "restore_to_imap": "استعادة الرسالة", + "success": "تمت الاستعادة بنجاح", + "successDesc": "تمت استعادة الرسائل المحددة بنجاح إلى خادم IMAP.", + "summary": "تفاصيل الاستعادة", + "title": "استعادة رسالة واحدة" + }, + "roles": { + "actions": { + "add": "إضافة دور", + "cancel": "إلغاء", + "close": "إغلاق", + "failed": "فشلت العملية", + "retry": "إعادة المحاولة", + "submit_create": "إنشاء الدور", + "submit_update": "تحديث الدور", + "success_create": "تم إنشاء الدور بنجاح", + "success_update": "تم تحديث الدور بنجاح" + }, + "categories": { + "account_resource": "الوصول إلى موارد الحساب", + "global_data": "الوصول إلى البيانات العالمية", + "identity": "الهوية والإدارة" + }, + "columns": { + "created_at": "تاريخ الإنشاء", + "id": "المعرف", + "name": "الاسم", + "permissions": "الصلاحيات", + "role_type": "نوع الدور", + "updated_at": "تاريخ التحديث" + }, + "delete": { + "alert_desc": "سيؤدي حذف هذا الدور إلى إزالته من جميع المستخدمين المعينين له.", + "alert_title": "تحذير: إجراء دائم.", + "confirm_btn": "حذف الدور", + "confirm_label": "اكتب معرف الدور للتأكيد:", + "deleting": "جاري الحذف...", + "dialog_title": "حذف الدور", + "error_fallback": "تعذر حذف الدور.", + "error_title": "فشل الحذف", + "irreversible": "هذا الإجراء لا يمكن التراجع عنه.", + "placeholder": "اكتب \"{{id}}\"", + "success_desc": "تمت إزالة الدور \"{{name}}\".", + "success_title": "تم حذف الدور", + "warning_text": "أنت تقوم بحذف الدور {{name}} (المعرف: {{id}}) نهائياً." + }, + "description_hint": "تحديد نطاق الوصول والصلاحيات.", + "details": { + "close_btn": "إغلاق", + "desc_account": "الوصول وإجراءات البيانات للحسابات الفردية.", + "desc_global": "الإدارة العالمية والوصول إلى النظام.", + "role_badge": "دور {{type}}", + "title": "الصلاحيات: {{name}}", + "unknown": "دور غير معروف", + "view_permissions": "عرض التفاصيل" + }, + "empty": { + "desc": "لم تقم بإنشاء أي أدوار مخصصة بعد.", + "title": "لم يتم العثور على أدوار" + }, + "form": { + "builtin_badge": "دور مدمج", + "builtin_desc": "هذا الدور محدد مسبقاً وهو للقراءة فقط.", + "desc_label": "الوصف", + "matrix_label": "مصفوفة الصلاحيات ({{type}})", + "name_label": "اسم الدور", + "type_label": "نوع الدور" + }, + "placeholder": { + "filter": "بحث عن أدوار..." + }, + "title": { + "create": "إنشاء دور جديد", + "edit": "تعديل الدور: {{name}}" + }, + "types": { + "Account": "حساب", + "Global": "عالمي" }, "validation": { - "required": "هذا الحقل مطلوب", - "invalidEmail": "عنوان بريد إلكتروني غير صالح", - "invalidUrl": "عنوان URL غير صالح", - "passwordMinLength": "يجب أن تتكون كلمة المرور من {{min}} أحرف على الأقل", - "pleaseEnterPassword": "الرجاء إدخال كلمة المرور الخاصة بك", - "passwordRequired": "كلمة المرور مطلوبة عندما تكون طريقة المصادقة هي كلمة المرور", - "emailRequired": "البريد الإلكتروني مطلوب", - "imapHostRequired": "مُضيف IMAP مطلوب", - "imapHostCannotBeEmpty": "لا يمكن أن يكون مُضيف IMAP فارغًا", - "imapPortMustBePositive": "يجب أن يكون منفذ IMAP عددًا صحيحًا موجبًا", - "imapPortMustBeLessThan65536": "يجب أن يكون منفذ IMAP أقل من 65536", - "folderLimitMustBeNumber": "يجب أن يكون حد المجلد رقمًا", - "folderLimitMustBeAtLeast100": "يجب أن يكون حد المجلد 100 على الأقل", - "incrementalSyncMustBeNumber": "يجب أن يكون فاصل المزامنة التزايدية رقمًا", - "incrementalSyncMustBeAtLeast10": "يجب أن يكون فاصل المزامنة التزايدية 10 دقائق على الأقل", - "pleaseEnterUsernameOrEmail": "الرجاء إدخال اسم المستخدم أو البريد الإلكتروني الخاص بك", - "singleRequestBatchSizeMustBeNumber": "يجب أن يكون حجم الدُفعة رقماً", - "singleRequestBatchSizeTooSmall": "يجب أن يكون حجم الدُفعة على الأقل 10", - "singleRequestBatchSizeTooLarge": "يجب أن يكون حجم الدُفعة على الأكثر 200" - }, - "table": { - "noResults": "لم يتم العثور على نتائج", - "loading": "جارٍ التحميل...", - "page": "الصفحة", - "of": "من", - "rowsPerPage": "الصفوف في الصفحة", - "showing": "عرض", - "to": "إلى", - "results": "النتائج", - "asc": "تصاعدي", - "desc": "تنازلي", - "hide": "إخفاء", - "edit": "تعديل", - "delete": "حذف", - "pagination": { - "selected": "تم تحديد {{selected}} من أصل {{total}} صفوف.", - "fixed_page_size": "{{size}} صفوف في الصفحة.", - "rows_per_page": "عدد الصفوف في الصفحة", - "page_info": "صفحة {{page}} من {{total}}", - "first": "الصفحة الأولى", - "previous": "الصفحة السابقة", - "next": "الصفحة التالية", - "last": "الصفحة الأخيرة" - } - }, - "proxyDelete": { - "title": "حذف الوكيل", - "successTitle": "نجاح الحذف", - "successDesc": "تم حذف الوكيل بنجاح.", - "close": "إغلاق", - "failedTitle": "فشل حذف الوكيل", - "failedDesc": "فشل الحذف، يرجى المحاولة مرة أخرى لاحقًا", - "tryAgain": "حاول مرة أخرى", - "confirmText": "هل أنت متأكد أنك تريد الحذف", - "permanent": "سيؤدي هذا الإجراء إلى إزالة الوكيل نهائيًا من النظام. لا يمكن التراجع عن هذا.", - "proxyIdLabel": "معرّف الوكيل:", - "proxyIdPlaceholder": "أدخل معرّف الوكيل لتأكيد الحذف.", - "warningTitle": "تحذير!", - "warningDesc": "يرجى توخي الحذر، لا يمكن التراجع عن هذه العملية.", - "deleteBtn": "حذف" - }, - "systemConfig": { - "pageTitle": "تكوينات مستوى النظام", - "pageDescription": "يتم تهيئة هذه المعلمات عبر علامات CLI أو متغيرات البيئة. وهي حاليًا للقراءة فقط لضمان اتساق البيئة.", - "status": { - "enabled": "مفعل", - "disabled": "معطل", - "configured": "مكون", - "missing": "مفقود", - "auto": "تلقائي", - "notSet": "غير محدد" - }, - "sections": { - "network": { - "title": "الشبكة", - "desc": "HTTP والوصول العام" - }, - "cors": { - "title": "CORS", - "desc": "قواعد الوصول عبر الأصول" - }, - "logging": { - "title": "التسجيل", - "desc": "سلوك إخراج السجلات" - }, - "storage": { - "title": "التخزين والذاكرة المؤقتة", - "desc": "مسارات قاعدة البيانات والحدود" - }, - "security": { - "title": "الأمان", - "desc": "المصادقة والتشفير" - }, - "performance": { - "title": "الأداء", - "desc": "التزامن والضغط" - }, - "smtp": { - "title": "خادم SMTP", - "desc": "إعدادات استقبال البريد الوارد للأرشفة في الوقت الفعلي" - } - } - }, - "apiTokens": { - "page": { - "loadError": "فشل تحميل رموز API.", - "emptyTitle": "لا توجد رموز API", - "emptyDescription": "لم تقم بإنشاء أي رموز API بعد. انقر أدناه لإنشاء واحد.", - "addBtn": "إضافة رمز" - }, - "list": { - "unnamedToken": "رمز بدون اسم", - "statusActive": "نشط", - "statusExpired": "منتهي الصلاحية", - "neverExpires": "لا تنتهي صلاحيته أبدًا", - "expiresOnShort": "ينتهي في {{date}}", - "tokenLabel": "الرمز", - "createdLabel": "تم الإنشاء في", - "lastUsedLabel": "آخر استخدام", - "expiresOnLabel": "ينتهي في", - "neverUsed": "أبدًا", - "neverLabel": "أبدًا", - "deleteBtn": "حذف الرمز" - }, - "dialog": { - "createTitle": "إنشاء رمز وصول", - "editTitle": "تعديل رمز الوصول", - "description": "انقر على حفظ عند الانتهاء.", - "save": "حفظ", - "saveChanges": "حفظ التغييرات" - }, - "deleteDialog": { - "title": "حذف رمز الوصول؟", - "description": "لا يمكن التراجع عن هذا الإجراء. أي تطبيق يستخدم هذا الرمز سيفقد إمكانية الوصول على الفور.", - "cancel": "إلغاء", - "confirm": "حذف", - "deleting": "جاري الحذف..." - }, - "form": { - "nameLabel": "الاسم", - "namePlaceholder": "أعطِ رمز الوصول هذا اسمًا قصيرًا", - "nameDescription": "اختياري · 32 حرفًا كحد أقصى", - "expirationLabel": "تنتهي الصلاحية", - "expirationPlaceholder": "حدد تاريخ الانتهاء", - "expirationDescription": "ستنتهي صلاحية الرموز تلقائيًا بعد الوقت المحدد.", - "never": "أبدًا", - "1day": "يوم واحد", - "7days": "7 أيام", - "30days": "30 يومًا", - "errorMax": "32 حرفًا كحد أقصى", - "errorNumber": "يجب أن يكون رقمًا", - "errorInt": "يجب أن يكون عددًا صحيحًا", - "errorPositive": "يجب أن يكون أكبر من 0" - }, - "notifications": { - "createSuccess": "تم إنشاء رمز الوصول", - "createSuccessDesc": "تم إنشاء رمز الوصول بنجاح.", - "updateSuccess": "تم تحديث رمز الوصول", - "updateSuccessDesc": "تم تحديث رمز الوصول بنجاح.", - "createFailed": "فشل الإنشاء", - "updateFailed": "فشل التحديث", - "deleteSuccess": "تم حذف رمز الوصول بنجاح", - "deleteFailed": "فشل حذف رمز الوصول", - "copied": "تم النسخ إلى الحافظة", - "genericError": "فشلت العملية. يرجى المحاولة مرة أخرى.", - "close": "إغلاق", - "tryAgain": "إعادة المحاولة" - } - }, - "permission": { - "scope": { - "global": "عام", - "account": "الحساب رقم {{id}}" - }, - "dialog": { - "global_title": "الأذونات العامة", - "account_title": "أذونات الحساب", - "global_description": "أذونات على مستوى النظام ممنوحة لهذا المستخدم.", - "account_description": "أذونات مقيدة بالحساب المحدد." - }, - "category": { - "system_identity": "النظام والهوية", - "global_data": "البيانات العامة (مسؤول)", - "account": "أذونات الحساب" - }, - "system": { - "access": "الوصول الأساسي إلى النظام", - "root": "التحكم الكامل في النظام" - }, - "user": { - "manage": "إدارة جميع المستخدمين", - "view": "عرض معلومات المستخدم الأساسية" - }, - "token": { - "manage": "إدارة رموز الوصول" - }, - "account": { - "create": "إنشاء حسابات البريد الإلكتروني", - "manage": "إدارة الحسابات المخصصة", - "manage_all": "إدارة جميع إعدادات الحساب", - "read_details": "عرض تفاصيل الحساب" - }, - "data": { - "read": "قراءة بيانات البريد الإلكتروني المخصصة", - "read_all": "قراءة جميع بيانات البريد الإلكتروني", - "manage": "إدارة بيانات وصفية للبريد الإلكتروني المخصص", - "manage_all": "إدارة جميع البيانات الوصفية للبريد الإلكتروني", - "raw_download": "تنزيل رسائل البريد الإلكتروني الخام المخصصة", - "raw_download_all": "تنزيل جميع رسائل البريد الإلكتروني الخام", - "delete": "حذف رسائل البريد الإلكتروني المخصصة", - "delete_all": "حذف رسائل البريد الإلكتروني من جميع الحسابات", - "export_batch": "تصدير دفعي للبيانات المخصصة", - "export_batch_all": "تصدير دفعي لجميع البيانات", - "import_batch": "استيراد دفعي لبيانات البريد الإلكتروني", - "smtp_ingest": "استيعاب رسائل البريد الإلكتروني عبر بروتوكول SMTP" - } - }, - "users": { - "columns": { - "id": "المعرف", - "avatar": "الصورة الرمزية", - "username": "اسم المستخدم", - "email": "البريد الإلكتروني", - "roles": "الأدوار والصلاحيات", - "created_at": "تاريخ الإنشاء", - "updated_at": "تاريخ التحديث", - "actions": "الإجراءات" - }, - "buttons": { - "add": "إضافة مستخدم", - "add_new": "مستخدم جديد" - }, - "empty": { - "title": "لم يتم العثور على مستخدمين", - "description": "انقر على الزر أدناه لإضافة المستخدم الأول." - }, - "nav": { - "users": "المستخدمون", - "roles": "الأدوار", - "api_tokens": "رموز API" - }, - "api_tokens": { - "empty": { - "title": "لم يتم العثور على رموز API", - "description": "لم يتم إنشاء أي رموز API في النظام بعد." - }, - "button": { - "generate": "توليد رمز جديد" - }, - "toolbar": { - "search_placeholder": "البحث بالاسم، المالك أو الرمز..." - }, - "table": { - "name": "الاسم", - "type": "النوع", - "last_used": "آخر استخدام", - "expires_at": "تاريخ الانتهاء", - "owner": "المالك", - "created": "تم الإنشاء", - "api_key": "مفتاح API", - "web_ui": "واجهة الويب", - "never": "أبداً", - "permanent": "دائم", - "expired": "منتهي الصلاحية", - "unnamed": "رمز بدون اسم" - }, - "unnamed": "رمز بدون اسم", - "delete": { - "title": "حذف رمز API", - "desc": "أنت على وشك حذف رمز API هذا نهائياً", - "prefix": "بادئة الرمز", - "irreversible": "هذا الإجراء لا يمكن التراجع عنه. ستفقد أي تطبيقات تستخدم هذا الرمز حق الوصول فوراً.", - "confirm_label": "للتأكيد، اكتب {{word}} أدناه:", - "confirm_placeholder": "اكتب \"{{word}}\" للتأكيد", - "warning_title": "تحذير", - "warning_desc": "ستفشل أي نصوص برمجية أو خدمات تستخدم هذا الرمز. تأكد من تحديث أنظمتك.", - "confirm_button": "حذف الرمز", - "deleting": "جاري الحذف..." - }, - "toast": { - "deleted_title": "تم حذف رمز API", - "deleted_desc": "تمت إزالة الرمز \"{{name}}\" بنجاح.", - "delete_failed_title": "فشل الحذف", - "delete_failed": "تعذر حذف الرمز، يرجى المحاولة مرة أخرى." - } - }, - "tokens": { - "schema": { - "name_max": "32 حرفاً كحد أقصى", - "expire_number": "يجب أن يكون رقماً", - "expire_int": "يجب أن يكون رقماً صحيحاً", - "expire_positive": "يجب أن يكون أكبر من 0" - }, - "toast": { - "update_success_title": "تم تحديث الرمز", - "update_success_desc": "تم تحديث رمز الوصول بنجاح.", - "create_success_title": "تم إنشاء الرمز", - "create_success_desc": "تم إنشاء رمز الوصول بنجاح.", - "update_failed_title": "فشل التحديث", - "create_failed_title": "فشل الإنشاء" - }, - "error": { - "fallback": "فشلت العملية، يرجى المحاولة لاحقاً." - }, - "dialog": { - "edit_title": "تعديل رمز الوصول", - "create_title": "إنشاء رمز وصول", - "description": "انقر على حفظ عند الانتهاء." - }, - "fields": { - "name_label": "الاسم", - "name_placeholder": "أعطِ الرمز اسماً قصيراً", - "name_hint": "اختياري · 32 حرفاً كحد أقصى", - "expire_label": "انتهاء الصلاحية", - "expire_placeholder": "اختر مدة الصلاحية", - "expire_hint": "سينتهي الرمز تلقائياً بعد الوقت المحدد." - }, - "expire_options": { - "never": "لا ينتهي أبداً", - "1_day": "يوم واحد", - "7_days": "7 أيام", - "30_days": "30 يوماً" - } - }, - "tokens_action": { - "dialog": { - "title": "رموز API", - "description": "إدارة رموز API لهذا المستخدم." - }, - "empty": { - "title": "لا توجد رموز API", - "description": "هذا المستخدم ليس لديه أي رموز API حالياً." - }, - "buttons": { - "add": "إضافة رمز" - }, - "list": { - "unnamed_token": "رمز بدون اسم", - "status_expired": "منتهي الصلاحية", - "status_active": "نشط", - "expires_on_brief": "ينتهي في {{date}}", - "never_expires": "لا ينتهي أبداً", - "label_token": "الرمز", - "label_created": "تاريخ الإنشاء", - "label_last_used": "آخر استخدام", - "label_expires_at": "ينتهي في", - "never": "أبداً", - "button_delete": "حذف الرمز" - }, - "delete_dialog": { - "title": "حذف رمز الوصول؟", - "description": "هذا الإجراء لا يمكن التراجع عنه." - } - }, - "actions": { - "schema": { - "account_required": "يرجى اختيار حساب", - "role_required": "يرجى اختيار دور", - "username_required": "اسم المستخدم مطلوب", - "username_min": "3 أحرف على الأقل", - "username_max": "32 حرفاً كحد أقصى", - "email_required": "البريد الإلكتروني مطلوب", - "email_invalid": "يرجى إدخال بريد إلكتروني صالح", - "global_role_required": "تعيين دور عالمي واحد على الأقل", - "description_max": "الوصف 256 حرفاً كحد أقصى", - "ip_invalid": "تم اكتشاف عنوان IP غير صالح", - "password_required": "كلمة المرور مطلوبة", - "password_min": "8 أحرف على الأقل", - "password_max": "256 حرفاً كحد أقصى" - }, - "toast": { - "updated": "تم تحديث المستخدم", - "created": "تم إنشاء المستخدم" - }, - "dialog": { - "edit_title": "تعديل المستخدم: {{name}}", - "create_title": "إنشاء مستخدم جديد", - "subtitle": "تكوين الهوية ومستويات الوصول وسياسات الأمان." - }, - "tabs": { - "general": "عام", - "permissions": "صلاحيات الحساب", - "security": "الأمان و ACL" - }, - "sections": { - "basic": "الهوية الأساسية", - "global": "الصلاحيات العالمية", - "mail_access": "التحكم في الوصول إلى البريد", - "mail_access_subtitle": "حسابات البريد الإلكتروني التي يمكن لهذا المستخدم إدارتها.", - "policy": "السياسات" - }, - "fields": { - "username": "اسم المستخدم", - "username_hint": "معرف فريد لتسجيل الدخول.", - "email": "البريد الإلكتروني", - "email_hint": "جهة الاتصال الرئيسية والإشعارات.", - "password": "كلمة المرور", - "password_placeholder_create": "8 أحرف على الأقل", - "password_placeholder_edit": "اتركه فارغاً للاحتفاظ بالحالية", - "password_hint_create": "كلمة مرور آمنة للإعداد الأولي.", - "password_hint_edit": "أدخلها فقط إذا كنت ترغب في التغيير.", - "global_roles_hint": "تعيين صلاحيات النظام.", - "description": "الوصف (اختياري)", - "description_placeholder": "ملاحظات حول هذا المستخدم...", - "description_hint": "ملاحظات داخلية (256 حرفاً كحد أقصى).", - "select_account": "اختر حساباً", - "assign_role": "تعيين دور", - "ip_whitelist": "القائمة البيضاء لـ IP", - "ip_whitelist_hint": "قصر تسجيل الدخول على عناوين IP هذه (واحد في كل سطر).", - "rate_quota": "حصة المعدل", - "burst_interval": "فاصل الانفجار (ثانية)" - }, - "buttons": { - "add_account": "إضافة حساب", - "update": "تحديث المستخدم", - "create": "إنشاء مستخدم" - }, - "states": { - "full_access": "وضع الوصول الكامل", - "full_access_desc": "المسؤولون لديهم حق الوصول الكامل لجميع الحسابات افتراضياً.", - "no_accounts": "لم يتم تعيين حسابات محددة.", - "security_disabled": "سياسات الأمان معطلة." - }, - "api_tokens": "رموز API", - "placeholder": { - "filter": "بحث عن مستخدمين..." - }, - "delete": { - "title": "حذف المستخدم", - "confirm_msg": "أنت تقوم بحذف المستخدم {{name}} (المعرف: {{id}}) نهائياً.", - "irreversible": "هذا الإجراء غير قابل للإلغاء.", - "input_label": "اكتب معرف المستخدم للتأكيد:", - "placeholder": "اكتب \"{{id}}\"", - "alert_title": "تحذير: إجراء دائم.", - "alert_desc": "سيتم حذف المستخدم وجميع البيانات المرتبطة به.", - "button_confirm": "حذف المستخدم", - "button_deleting": "جاري الحذف...", - "toast": { - "success_title": "تم حذف المستخدم", - "success_desc": "تمت إزالة المستخدم \"{{name}}\" بنجاح.", - "failed_title": "فشل الحذف", - "failed_fallback": "تعذر حذف المستخدم." - } - } - } - }, - "roles": { - "title": { - "create": "إنشاء دور جديد", - "edit": "تعديل الدور: {{name}}" - }, - "description_hint": "تحديد نطاق الوصول والصلاحيات.", - "form": { - "name_label": "اسم الدور", - "type_label": "نوع الدور", - "desc_label": "الوصف", - "matrix_label": "مصفوفة الصلاحيات ({{type}})", - "builtin_badge": "دور مدمج", - "builtin_desc": "هذا الدور محدد مسبقاً وهو للقراءة فقط." - }, - "types": { - "Global": "عالمي", - "Account": "حساب" - }, - "categories": { - "identity": "الهوية والإدارة", - "global_data": "الوصول إلى البيانات العالمية", - "account_resource": "الوصول إلى موارد الحساب" - }, - "actions": { - "cancel": "إلغاء", - "submit_create": "إنشاء الدور", - "submit_update": "تحديث الدور", - "success_create": "تم إنشاء الدور بنجاح", - "success_update": "تم تحديث الدور بنجاح", - "failed": "فشلت العملية", - "close": "إغلاق", - "retry": "إعادة المحاولة", - "add": "إضافة دور" - }, - "validation": { - "name_required": "اسم الدور مطلوب", - "perm_required": "يرجى اختيار صلاحية واحدة على الأقل" - }, - "columns": { - "id": "المعرف", - "name": "الاسم", - "role_type": "نوع الدور", - "permissions": "الصلاحيات", - "created_at": "تاريخ الإنشاء", - "updated_at": "تاريخ التحديث" - }, - "placeholder": { - "filter": "بحث عن أدوار..." - }, - "delete": { - "dialog_title": "حذف الدور", - "warning_text": "أنت تقوم بحذف الدور {{name}} (المعرف: {{id}}) نهائياً.", - "irreversible": "هذا الإجراء لا يمكن التراجع عنه.", - "confirm_label": "اكتب معرف الدور للتأكيد:", - "placeholder": "اكتب \"{{id}}\"", - "alert_title": "تحذير: إجراء دائم.", - "alert_desc": "سيؤدي حذف هذا الدور إلى إزالته من جميع المستخدمين المعينين له.", - "confirm_btn": "حذف الدور", - "deleting": "جاري الحذف...", - "success_title": "تم حذف الدور", - "success_desc": "تمت إزالة الدور \"{{name}}\".", - "error_title": "فشل الحذف", - "error_fallback": "تعذر حذف الدور." - }, - "details": { - "title": "الصلاحيات: {{name}}", - "unknown": "دور غير معروف", - "role_badge": "دور {{type}}", - "desc_global": "الإدارة العالمية والوصول إلى النظام.", - "desc_account": "الوصول وإجراءات البيانات للحسابات الفردية.", - "close_btn": "إغلاق", - "view_permissions": "عرض التفاصيل" - }, - "empty": { - "title": "لم يتم العثور على أدوار", - "desc": "لم تقم بإنشاء أي أدوار مخصصة بعد." - } - }, - "profile": { - "avatar_alt": "الصورة الشخصية", - "menu": { - "profile": "الملف الشخصي", - "settings": "الإعدادات", - "sign_out": "تسجيل الخروج" - } - }, - "sign_out": { - "title": "تسجيل الخروج", - "desc": "هل أنت متأكد أنك تريد تسجيل الخروج؟ ستحتاج إلى تسجيل الدخول مرة أخرى للوصول إلى حسابك.", - "confirm": "تسجيل الخروج" - }, - "restore_message": { - "title": "استعادة رسالة واحدة", - "bulkTitle": "استعادة رسائل متعددة", - "bulkWarning": "ملاحظة: سيتم استعادة الرسائل إلى مجلداتها الأصلية.", - "accountsInvolved": "الحسابات المعنية", - "summary": "تفاصيل الاستعادة", - "messages": "رسائل", - "desc": "سيقوم هذا الإجراء بإعادة رفع الرسائل المحددة من Bichon واستعادتها إلى صناديق البريد المقابلة لها على خادم IMAP.", - "confirm": "تنفيذ الاستعادة", - "restore_to_imap": "استعادة الرسالة", - "success": "تمت الاستعادة بنجاح", - "successDesc": "تمت استعادة الرسائل المحددة بنجاح إلى خادم IMAP.", - "failed": "فشلت الاستعادة", - "failedTitle": "فشل في الاستعادة" - }, - "time": { - "label": "الوقت", - "since": "منذ", - "before": "قبل", - "recent_range": "النطاق الأخير (منذ...)", - "historical": "النطاق السابق (قبل...)", - "absolute_range": "نطاق تاريخ محدد", - "last_day": "آخر يوم واحد", - "last_days": "آخر {{count}} أيام", - "last_months": "آخر {{count}} أشهر", - "over_years_ago": "منذ {{count}} {{unit}}", - "year": "سنة", - "years": "سنوات", - "recent_prefix": "الأخيرة:", - "days_ago_to_now": "منذ أيام حتى الآن", - "apply": "تطبيق", - "start_date": "تاريخ البدء", - "end_date": "تاريخ الانتهاء", - "clear_filters": "مسح فلترة الوقت", - "format": "yyyy-MM-dd" - }, - "tag": { - "label": "الوسوم", - "search_placeholder": "بحث عن الوسوم...", - "clear_all": "مسح جميع الوسوم", - "no_tags_found": "لم يتم العثور على وسوم" - }, - "search_accounts": { - "label": "حسابات البريد", - "search_placeholder": "بحث عن حسابات البريد...", - "clear_accounts": "مسح الحسابات المحددة", - "no_accounts_found": "لم يتم العثور على حسابات" - }, - "search_mailbox": { - "label": "مجلدات البريد", - "search_placeholder": "بحث في المجلدات", - "clear_mailboxes": "مسح المجلدات المحددة", - "select_account_first": "يرجى اختيار حساب بريد أولاً", - "no_mailbox_found": "لم يتم العثور على مجلد" - }, - "search_contacts": { - "label": "جهات الاتصال", - "label_with_count": "جهات الاتصال ({{count}})", - "any": "الكل", - "search_placeholder": "بحث في {{field}}...", - "reset_all": "إعادة تعيين جميع جهات الاتصال", - "no_contact_found": "لم يتم العثور على جهات اتصال", - "loading": "جارٍ التحميل...", - "showing_limit": "عرض أول 100 نتيجة فقط • المجموع {{total}}" - }, - "search_more": { - "trigger_label": "متقدم", - "title": "فلاتر متقدمة", - "reset": "إعادة تعيين", - "has_attachment": "يحتوي على مرفق", - "attachment_name_label": "اسم المرفق", - "attachment_name_placeholder": "مثال: invoice.pdf", - "message_size_label": "حجم الرسالة", - "message_id_label": "معرّف Message-ID الأصلي", - "message_id_description": "البحث باستخدام Message-ID في ترويسة البريد", - "apply": "تطبيق الفلاتر", - "size_presets": { - "any": "أي حجم", - "tiny": "صغير جداً (< 15 كيلوبايت)", - "small": "صغير (< 2 ميغابايت)", - "medium": "متوسط (2 – 10 ميغابايت)", - "large": "كبير (10 – 20 ميغابايت)", - "huge": "ضخم (> 20 ميغابايت)" - }, - "any": "الكل", - "search_placeholder": "بحث {{field}}...", - "extension": "امتداد الملف", - "category": "فئة المرفق", - "content_types": "نوع محدد" - }, - "search_view": { - "button_label": "العرض", - "menu_title": "إعدادات الأعمدة" - }, - "search_reset": { - "label": "إعادة تعيين", - "tooltip": "مسح جميع شروط التصفية" - }, - "search_input": { - "placeholder": "بحث في رسائل البريد الإلكتروني... (يدعم Regex)", - "button": "بحث", - "recent_title": "عمليات البحث الأخيرة", - "clear_history": "مسح السجل", - "no_history": "لا يوجد سجل بحث", - "all": "الكل", - "all_fields_desc": "يطابق موضوع الرسالة، النص، المرسل والمستلمين", - "subject": "موضوع الرسالة", - "body": "نص الرسالة" + "name_required": "اسم الدور مطلوب", + "perm_required": "يرجى اختيار صلاحية واحدة على الأقل" } + }, + "search": { + "account": "الحساب", + "addEmailAccount": "إضافة حساب بريد إلكتروني", + "addTags": { + "cancel": "إلغاء", + "createHint": "إنشاء علامة جديدة: {{tag}}", + "invalidTitle": "علامة غير صالحة", + "none": "لم تتم إضافة علامات", + "save": "حفظ", + "saving": "جارٍ الحفظ...", + "searchPlaceholder": "بحث أو إنشاء علامة...", + "selectedCount": "تم تحديد {{count}} علامة (علامات)", + "title": "تعديل العلامات", + "tryAgain": "يرجى المحاولة مرة أخرى لاحقًا", + "updateFailedTitle": "فشل التحديث", + "updatedDesc": "تم تحديث العلامات بنجاح", + "updatedTitle": "تم تحديث العلامات" + }, + "adjustSearch": "حاول تعديل معايير البحث أو مسح الفلاتر.", + "advanced": "متقدم", + "advancedFilters": "فلاتر متقدمة", + "any": "الكل", + "attachmentName": "اسم المرفق", + "attachmentsSize": "المرفقات والحجم", + "bcc": "نسخة مخفية", + "before": "قبل:", + "bulkActions": { + "ariaLabel": "تم تحديد {{count}} رسائل. شريط الإجراءات", + "clear": "مسح التحديد", + "delete": "حذف", + "deleteDesc": "حذف الرسائل المحددة", + "manageTags": "إدارة العلامات", + "selected": "تم تحديد {{count}}" + }, + "cc": "نسخة", + "clear": "مسح", + "date": "التاريخ", + "dateRange": "النطاق الزمني", + "delete": { + "confirmButton": "حذف", + "confirmDetail": "هذا الإجراء لا يمكن التراجع عنه.", + "confirmPrefix": "هل أنت متأكد من حذف", + "countLabel": "{{count}} رسائل؟", + "errorTitle": "فشل الحذف", + "successDesc": "تم حذف الرسائل بنجاح.", + "successTitle": "تم الحذف", + "title": "حذف الرسائل", + "warningDesc": "سيتم حذف الرسائل نهائياً ولا يمكن استعادتها.", + "warningTitle": "تحذير" + }, + "editTag": "تعديل العلامة", + "endDate": "تاريخ الانتهاء", + "from": "من", + "fullTextMultiAccount": "نص كامل · متعدد الحسابات · فلاتر متقدمة", + "hasAttachment": "يحتوي على مرفق", + "huge": "ضخم (≥20 MB)", + "keyword": "كلمة رئيسية", + "large": "كبير (10 - 20 ميغابايت)", + "mailbox": "صندوق البريد", + "maxSize": "الحد الأقصى للحجم", + "maximumBytes": "الحد الأقصى", + "medium": "متوسط (2 - 10 ميغابايت)", + "messageId": "معرّف الرسالة", + "minSize": "الحد الأدنى للحجم", + "minimumBytes": "الحد الأدنى", + "no": "لا", + "noActiveEmailAccount": "لا يوجد حساب بريد إلكتروني نشط.", + "noEmailsFound": "لم يتم العثور على رسائل بريد إلكتروني", + "noMailboxSelectAccount": "لا يوجد صندوق بريد. يرجى تحديد حساب أولاً.", + "originalMessageIdHeader": "عنوان معرّف الرسالة الأصلي للبريد الإلكتروني", + "pleaseSelectAtLeastOne": "يرجى تحديد شرط بحث واحد على الأقل", + "preview": "معاينة", + "recipient": "المستلم", + "searchArchivedEmails": "البحث في رسائل البريد الإلكتروني المؤرشفة", + "searchButton": "بحث", + "searchInSubjectBody": "البحث في الموضوع، النص، المرفقات...", + "searching": "جارٍ البحث، يرجى الانتظار...", + "searchingButton": "جارٍ البحث...", + "selectAccount": "اختر حسابًا", + "selectDate": "اختر تاريخًا", + "selectMailbox": "اختر صندوق بريد", + "sender": "المرسل", + "senderRecipients": "المرسل / المستلمون", + "since": "منذ:", + "size": "الحجم", + "sizeDescription": "يشير الحجم إلى الحجم الإجمالي للبريد الإلكتروني، بما في ذلك المرفقات.", + "small": "صغير (<2 ميغابايت)", + "sort": "فرز", + "source": "المصدر", + "startDate": "تاريخ البدء", + "startSearching": "ابدأ بإدخال كلمة رئيسية، مرسل، أو باستخدام فلاتر متقدمة.", + "subject": "الموضوع", + "tagFilter": "فلتر العلامات", + "thread": { + "empty": "لا توجد رسائل في هذه المحادثة", + "error": "فشل تحميل المحادثة", + "invalidDate": "تاريخ غير صالح", + "loadMore": "تحميل المزيد", + "loadingMore": "جارٍ التحميل...", + "noSubject": "(لا يوجد موضوع)", + "title": "المحادثة · {{count}} رسالة" + }, + "tiny": "صغير جدًا (<15 كيلوبايت)", + "title": "بحث", + "to": "إلى", + "updateTags": { + "actionAdd": "إضافة", + "actionOverwrite": "استبدال", + "actionRemove": "إزالة", + "cancel": "إلغاء", + "createHint": "اضغط Enter لإنشاء علامة جديدة: \"{{tag}}\"", + "invalidTitle": "علامة غير صالحة", + "none": "لم يتم اختيار أي علامات", + "overwriteWarning": "تحذير: سيؤدي هذا إلى الكتابة فوق جميع العلامات الموجودة في العناصر المختارة.", + "savingAdd": "جاري الإضافة...", + "savingOverwrite": "جاري الاستبدال...", + "savingRemove": "جاري الإزالة...", + "searchPlaceholder": "ابحث أو أنشئ علامة جديدة...", + "selectedCount": "سيتم تطبيق {{count}} من العلامات", + "submitAdd": "إضافة علامات", + "submitOverwrite": "استبدال العلامات", + "submitRemove": "إزالة علامات", + "title": "تحديث العلامات", + "tryAgain": "يرجى المحاولة مرة أخرى لاحقاً.", + "updateFailedTitle": "فشل التحديث", + "updatedDesc": "تم تحديث العلامات بنجاح.", + "updatedTitle": "تم تحديث العلامات" + }, + "yes": "نعم" + }, + "search_accounts": { + "clear_accounts": "مسح الحسابات المحددة", + "label": "حسابات البريد", + "no_accounts_found": "لم يتم العثور على حسابات", + "search_placeholder": "بحث عن حسابات البريد..." + }, + "search_contacts": { + "any": "الكل", + "label": "جهات الاتصال", + "label_with_count": "جهات الاتصال ({{count}})", + "loading": "جارٍ التحميل...", + "no_contact_found": "لم يتم العثور على جهات اتصال", + "reset_all": "إعادة تعيين جميع جهات الاتصال", + "search_placeholder": "بحث في {{field}}...", + "showing_limit": "عرض أول 100 نتيجة فقط • المجموع {{total}}" + }, + "search_input": { + "all": "الكل", + "all_fields_desc": "يطابق موضوع الرسالة، النص، المرسل والمستلمين", + "body": "نص الرسالة", + "button": "بحث", + "clear_history": "مسح السجل", + "no_history": "لا يوجد سجل بحث", + "placeholder": "بحث عن الرسائل (استخدم \" \" للبحث عن عبارة)", + "recent_title": "عمليات البحث الأخيرة", + "subject": "موضوع الرسالة" + }, + "search_mailbox": { + "clear_mailboxes": "مسح المجلدات المحددة", + "label": "مجلدات البريد", + "no_mailbox_found": "لم يتم العثور على مجلد", + "search_placeholder": "بحث في المجلدات", + "select_account_first": "يرجى اختيار حساب بريد أولاً" + }, + "search_more": { + "any": "الكل", + "apply": "تطبيق الفلاتر", + "attachment_name_label": "اسم المرفق", + "attachment_name_placeholder": "مثال: invoice.pdf", + "category": "فئة المرفق", + "content_type": "نوع الملف", + "extension": "امتداد الملف", + "has_attachment": "يحتوي على مرفق", + "is_message": "مرفق بتنسيق بريد إلكتروني", + "is_message_desc": "هذا المرفق عبارة عن ملف بريد إلكتروني، على سبيل المثال ملف eml.", + "message_id_description": "البحث باستخدام Message-ID في ترويسة البريد", + "message_id_label": "معرّف Message-ID الأصلي", + "message_size_label": "حجم الرسالة", + "reset": "إعادة تعيين", + "search_placeholder": "بحث {{field}}...", + "size_presets": { + "any": "أي حجم", + "huge": "ضخم (> 20 ميغابايت)", + "large": "كبير (10 – 20 ميغابايت)", + "medium": "متوسط (2 – 10 ميغابايت)", + "small": "صغير (< 2 ميغابايت)", + "tiny": "صغير جداً (< 15 كيلوبايت)" + }, + "title": "فلاتر متقدمة", + "trigger_label": "متقدم" + }, + "search_reset": { + "label": "إعادة تعيين", + "tooltip": "مسح جميع شروط التصفية" + }, + "search_view": { + "button_label": "العرض", + "menu_title": "إعدادات الأعمدة" + }, + "settings": { + "accounts": "الحسابات", + "acl": "قائمة التحكم بالوصول (ACL)", + "actions": "الإجراءات", + "add": "إضافة", + "addNewProxyHere": "إضافة وكيل جديد هنا. ", + "adding": "جارٍ الإضافة...", + "appearance": { + "button": { + "update": "تحديث التفضيلات" + }, + "command": { + "no_results": "لم يتم العثور على لغة.", + "search": "بحث عن لغة..." + }, + "description": { + "language": "اختر اللغة المستخدمة في واجهة الويب.", + "theme": "اختر بين الوضع الفاتح أو الداكن." + }, + "field": { + "language": "لغة الواجهة", + "theme": "سمة الواجهة" + }, + "placeholder": { + "select_language": "اختر اللغة" + }, + "theme": { + "dark": "داكن", + "light": "فاتح" + }, + "title": "المظهر", + "validation": { + "language": { + "required": "Please select a language." + }, + "theme": { + "required": "Please select a theme." + } + } + }, + "authUrl": "عنوان URL للمصادقة", + "changePasswordForFutureLogins": "تغيير كلمة المرور لعمليات تسجيل الدخول المستقبلية.", + "confirmReset": "تأكيد إعادة التعيين", + "createdAt": "تاريخ الإنشاء", + "delete": "حذف", + "description": "الوصف", + "edit": "تعديل", + "enabled": "مفعل", + "enterNewRootPassword": "أدخل كلمة مرور الجذر الجديدة", + "enterProxyIdToConfirmDeletion": "أدخل معرّف الوكيل لتأكيد الحذف.", + "failedToCopyText": "فشل نسخ النص", + "filterAccessToken": "تصفية رمز الوصول...", + "filterAccount": "تصفية الحساب...", + "filterOauth2": "تصفية oauth2...", + "filterProxy": "تصفية الوكيل...", + "general": "عام", + "generateNewToken": "إنشاء رمز مميز جديد، القديم تنتهي صلاحيته على الفور.", + "host": "المُضيف", + "id": "المعرّف", + "invalidPassword": "كلمة مرور غير صالحة", + "lastAccess": "آخر وصول", + "manageRootTokenAndPassword": "إدارة رمز الجذر وكلمة المرور بأمان.", + "name": "الاسم", + "noProxies": "لا توجد وكلاء", + "noProxiesDesc": "لم تقم بإضافة أي تكوينات وكيل بعد. أضف واحدًا لبدء استخدام ميزات الوكيل.", + "password": "كلمة المرور", + "pleaseUseAnIpAddressForBetterReliability": "يرجى استخدام عنوان IP (مثال: 127.0.0.1) بدلاً من اسم المُضيف أو النطاق لتحسين الموثوقية.", + "port": "المنفذ", + "profile": { + "account": { + "id": "معرّف الحساب: {{id}}" + }, + "avatarAlt": "الصورة الشخصية", + "button": { + "permissions": "الصلاحيات", + "update_profile": "تحديث الملف الشخصي", + "view_global_permissions": "عرض الصلاحيات العامة" + }, + "field": { + "email": "البريد الإلكتروني", + "password": "كلمة المرور", + "username": "اسم المستخدم" + }, + "loadError": "فشل في تحميل معلومات المستخدم.", + "maxSize": "حتى {{size}}", + "placeholder": { + "password_keep": "اتركه فارغًا للاحتفاظ بكلمة المرور الحالية" + }, + "removeAvatar": "إزالة الصورة الشخصية", + "section": { + "accounts": "{{count}} حسابات مرتبطة", + "roles": "الأدوار" + }, + "toast": { + "update_failed": "فشل في تحديث الملف الشخصي", + "updated": "تم تحديث الملف الشخصي بنجاح" + }, + "uploadError": "خطأ في رفع الملف", + "uploadTitle": "رفع الصورة الشخصية", + "validation": { + "email": { + "invalid": "يرجى إدخال بريد إلكتروني صالح", + "required": "البريد الإلكتروني مطلوب" + }, + "password": { + "max": "يجب ألا تزيد كلمة المرور عن 256 حرفًا", + "min": "يجب أن تكون كلمة المرور 8 أحرف على الأقل" + }, + "username": { + "max": "يجب ألا يزيد اسم المستخدم عن 32 حرفًا", + "min": "يجب أن يكون اسم المستخدم 5 أحرف على الأقل", + "required": "اسم المستخدم مطلوب" + } + } + }, + "proxy": "وكيل", + "proxyUpdateOrAddFailed": "فشل {{action}}، يرجى المحاولة مرة أخرى لاحقًا", + "reset": "إعادة تعيين", + "resetRootPassword": "إعادة تعيين كلمة مرور الجذر", + "resetRootToken": "إعادة تعيين رمز الجذر", + "root": "الجذر", + "rootAccessManagement": "إدارة وصول الجذر", + "rootDesc": "إدارة بيانات اعتماد وصول الجذر بما في ذلك الرمز المميز وكلمة المرور.", + "rootPasswordMustBeAtLeast6Characters": "يجب أن تتكون كلمة مرور الجذر من 6 أحرف على الأقل.", + "rootTitle": "المستخدم الجذر", + "selectAll": "تحديد الكل", + "sidebar": { + "apiTokens": "رموز API", + "configurations": "تكوينات النظام", + "profile": "الملف الشخصي", + "proxy": "وكيل الشبكة" + }, + "theRootPasswordHasBeenReset": "تمت إعادة تعيين كلمة مرور الجذر", + "theRootTokenHasBeenReset": "تمت إعادة تعيين رمز الجذر", + "theme": "السمة", + "title": "الإعدادات", + "token": "الرمز المميز", + "tokenUrl": "عنوان URL للرمز المميز", + "type": "النوع", + "updateTheProxyHere": "تحديث الوكيل هنا. ", + "updatedAt": "تاريخ التحديث", + "url": "عنوان URL", + "useNewPasswordForNextLogin": "استخدم كلمة المرور الجديدة لعملية تسجيل الدخول التالية.", + "useProxy": "استخدام وكيل", + "username": "اسم المستخدم", + "youAreAboutToResetTheRootPassword": "أنت على وشك إعادة تعيين كلمة مرور الجذر. تأكد من تخزينها بأمان.", + "youAreAboutToResetTheRootToken": "أنت على وشك إعادة تعيين رمز الجذر. لا يمكن التراجع عن هذا الإجراء.", + "yourLoginInformationHasBeenUpdated": "تم تحديث معلومات تسجيل الدخول الخاصة بك. لا حاجة لتسجيل الدخول مرة أخرى.", + "yourProxyHasBeenSuccessfully": "تم {{action}} الوكيل الخاص بك بنجاح." + }, + "sign_out": { + "confirm": "تسجيل الخروج", + "desc": "هل أنت متأكد أنك تريد تسجيل الخروج؟ ستحتاج إلى تسجيل الدخول مرة أخرى للوصول إلى حسابك.", + "title": "تسجيل الخروج" + }, + "systemConfig": { + "pageDescription": "يتم تهيئة هذه المعلمات عبر علامات CLI أو متغيرات البيئة. وهي حاليًا للقراءة فقط لضمان اتساق البيئة.", + "pageTitle": "تكوينات مستوى النظام", + "sections": { + "cors": { + "desc": "قواعد الوصول عبر الأصول", + "title": "CORS" + }, + "logging": { + "desc": "سلوك إخراج السجلات", + "title": "التسجيل" + }, + "network": { + "desc": "HTTP والوصول العام", + "title": "الشبكة" + }, + "performance": { + "desc": "التزامن والضغط", + "title": "الأداء" + }, + "security": { + "desc": "المصادقة والتشفير", + "title": "الأمان" + }, + "smtp": { + "desc": "إعدادات استقبال البريد الوارد للأرشفة في الوقت الفعلي", + "title": "خادم SMTP" + }, + "storage": { + "desc": "مسارات قاعدة البيانات والحدود", + "title": "التخزين والذاكرة المؤقتة" + } + }, + "status": { + "auto": "تلقائي", + "configured": "مكون", + "disabled": "معطل", + "enabled": "مفعل", + "missing": "مفقود", + "notSet": "غير محدد" + } + }, + "table": { + "asc": "تصاعدي", + "delete": "حذف", + "desc": "تنازلي", + "edit": "تعديل", + "hide": "إخفاء", + "loading": "جارٍ التحميل...", + "noResults": "لم يتم العثور على نتائج", + "of": "من", + "page": "الصفحة", + "pagination": { + "first": "الصفحة الأولى", + "fixed_page_size": "{{size}} صفوف في الصفحة.", + "last": "الصفحة الأخيرة", + "next": "الصفحة التالية", + "page_info": "صفحة {{page}} من {{total}}", + "previous": "الصفحة السابقة", + "rows_per_page": "عدد الصفوف في الصفحة", + "selected": "تم تحديد {{selected}} من أصل {{total}} صفوف." + }, + "results": "النتائج", + "rowsPerPage": "الصفوف في الصفحة", + "showing": "عرض", + "to": "إلى" + }, + "tag": { + "clear_all": "مسح جميع الوسوم", + "label": "الوسوم", + "no_tags_found": "لم يتم العثور على وسوم", + "search_placeholder": "بحث عن الوسوم..." + }, + "time": { + "absolute_range": "نطاق تاريخ محدد", + "apply": "تطبيق", + "before": "قبل", + "clear_filters": "مسح فلترة الوقت", + "days_ago_to_now": "منذ أيام حتى الآن", + "end_date": "تاريخ الانتهاء", + "format": "yyyy-MM-dd", + "historical": "النطاق السابق (قبل...)", + "label": "الوقت", + "last_day": "آخر يوم واحد", + "last_days": "آخر {{count}} أيام", + "last_months": "آخر {{count}} أشهر", + "over_years_ago": "منذ {{count}} {{unit}}", + "recent_prefix": "الأخيرة:", + "recent_range": "النطاق الأخير (منذ...)", + "since": "منذ", + "start_date": "تاريخ البدء", + "year": "سنة", + "years": "سنوات" + }, + "users": { + "actions": { + "api_tokens": "رموز API", + "buttons": { + "add_account": "إضافة حساب", + "create": "إنشاء مستخدم", + "update": "تحديث المستخدم" + }, + "delete": { + "alert_desc": "سيتم حذف المستخدم وجميع البيانات المرتبطة به.", + "alert_title": "تحذير: إجراء دائم.", + "button_confirm": "حذف المستخدم", + "button_deleting": "جاري الحذف...", + "confirm_msg": "أنت تقوم بحذف المستخدم {{name}} (المعرف: {{id}}) نهائياً.", + "input_label": "اكتب معرف المستخدم للتأكيد:", + "irreversible": "هذا الإجراء غير قابل للإلغاء.", + "placeholder": "اكتب \"{{id}}\"", + "title": "حذف المستخدم", + "toast": { + "failed_fallback": "تعذر حذف المستخدم.", + "failed_title": "فشل الحذف", + "success_desc": "تمت إزالة المستخدم \"{{name}}\" بنجاح.", + "success_title": "تم حذف المستخدم" + } + }, + "dialog": { + "create_title": "إنشاء مستخدم جديد", + "edit_title": "تعديل المستخدم: {{name}}", + "subtitle": "تكوين الهوية ومستويات الوصول وسياسات الأمان." + }, + "fields": { + "assign_role": "تعيين دور", + "burst_interval": "فاصل الانفجار (ثانية)", + "description": "الوصف (اختياري)", + "description_hint": "ملاحظات داخلية (256 حرفاً كحد أقصى).", + "description_placeholder": "ملاحظات حول هذا المستخدم...", + "email": "البريد الإلكتروني", + "email_hint": "جهة الاتصال الرئيسية والإشعارات.", + "global_roles_hint": "تعيين صلاحيات النظام.", + "ip_whitelist": "القائمة البيضاء لـ IP", + "ip_whitelist_hint": "قصر تسجيل الدخول على عناوين IP هذه (واحد في كل سطر).", + "password": "كلمة المرور", + "password_hint_create": "كلمة مرور آمنة للإعداد الأولي.", + "password_hint_edit": "أدخلها فقط إذا كنت ترغب في التغيير.", + "password_placeholder_create": "8 أحرف على الأقل", + "password_placeholder_edit": "اتركه فارغاً للاحتفاظ بالحالية", + "rate_quota": "حصة المعدل", + "select_account": "اختر حساباً", + "username": "اسم المستخدم", + "username_hint": "معرف فريد لتسجيل الدخول." + }, + "placeholder": { + "filter": "بحث عن مستخدمين..." + }, + "schema": { + "account_required": "يرجى اختيار حساب", + "description_max": "الوصف 256 حرفاً كحد أقصى", + "email_invalid": "يرجى إدخال بريد إلكتروني صالح", + "email_required": "البريد الإلكتروني مطلوب", + "global_role_required": "تعيين دور عالمي واحد على الأقل", + "ip_invalid": "تم اكتشاف عنوان IP غير صالح", + "password_max": "256 حرفاً كحد أقصى", + "password_min": "8 أحرف على الأقل", + "password_required": "كلمة المرور مطلوبة", + "role_required": "يرجى اختيار دور", + "username_max": "32 حرفاً كحد أقصى", + "username_min": "3 أحرف على الأقل", + "username_required": "اسم المستخدم مطلوب" + }, + "sections": { + "basic": "الهوية الأساسية", + "global": "الصلاحيات العالمية", + "mail_access": "التحكم في الوصول إلى البريد", + "mail_access_subtitle": "حسابات البريد الإلكتروني التي يمكن لهذا المستخدم إدارتها.", + "policy": "السياسات" + }, + "states": { + "full_access": "وضع الوصول الكامل", + "full_access_desc": "المسؤولون لديهم حق الوصول الكامل لجميع الحسابات افتراضياً.", + "no_accounts": "لم يتم تعيين حسابات محددة.", + "security_disabled": "سياسات الأمان معطلة." + }, + "tabs": { + "general": "عام", + "permissions": "صلاحيات الحساب", + "security": "الأمان و ACL" + }, + "toast": { + "created": "تم إنشاء المستخدم", + "updated": "تم تحديث المستخدم" + } + }, + "api_tokens": { + "button": { + "generate": "توليد رمز جديد" + }, + "delete": { + "confirm_button": "حذف الرمز", + "confirm_label": "للتأكيد، اكتب {{word}} أدناه:", + "confirm_placeholder": "اكتب \"{{word}}\" للتأكيد", + "deleting": "جاري الحذف...", + "desc": "أنت على وشك حذف رمز API هذا نهائياً", + "irreversible": "هذا الإجراء لا يمكن التراجع عنه. ستفقد أي تطبيقات تستخدم هذا الرمز حق الوصول فوراً.", + "prefix": "بادئة الرمز", + "title": "حذف رمز API", + "warning_desc": "ستفشل أي نصوص برمجية أو خدمات تستخدم هذا الرمز. تأكد من تحديث أنظمتك.", + "warning_title": "تحذير" + }, + "empty": { + "description": "لم يتم إنشاء أي رموز API في النظام بعد.", + "title": "لم يتم العثور على رموز API" + }, + "table": { + "api_key": "مفتاح API", + "created": "تم الإنشاء", + "expired": "منتهي الصلاحية", + "expires_at": "تاريخ الانتهاء", + "last_used": "آخر استخدام", + "name": "الاسم", + "never": "أبداً", + "owner": "المالك", + "permanent": "دائم", + "type": "النوع", + "unnamed": "رمز بدون اسم", + "web_ui": "واجهة الويب" + }, + "toast": { + "delete_failed": "تعذر حذف الرمز، يرجى المحاولة مرة أخرى.", + "delete_failed_title": "فشل الحذف", + "deleted_desc": "تمت إزالة الرمز \"{{name}}\" بنجاح.", + "deleted_title": "تم حذف رمز API" + }, + "toolbar": { + "search_placeholder": "البحث بالاسم، المالك أو الرمز..." + }, + "unnamed": "رمز بدون اسم" + }, + "buttons": { + "add": "إضافة مستخدم", + "add_new": "مستخدم جديد" + }, + "columns": { + "actions": "الإجراءات", + "avatar": "الصورة الرمزية", + "created_at": "تاريخ الإنشاء", + "email": "البريد الإلكتروني", + "id": "المعرف", + "roles": "الأدوار والصلاحيات", + "updated_at": "تاريخ التحديث", + "username": "اسم المستخدم" + }, + "empty": { + "description": "انقر على الزر أدناه لإضافة المستخدم الأول.", + "title": "لم يتم العثور على مستخدمين" + }, + "nav": { + "api_tokens": "رموز API", + "roles": "الأدوار", + "users": "المستخدمون" + }, + "tokens": { + "dialog": { + "create_title": "إنشاء رمز وصول", + "description": "انقر على حفظ عند الانتهاء.", + "edit_title": "تعديل رمز الوصول" + }, + "error": { + "fallback": "فشلت العملية، يرجى المحاولة لاحقاً." + }, + "expire_options": { + "1_day": "يوم واحد", + "30_days": "30 يوماً", + "7_days": "7 أيام", + "never": "لا ينتهي أبداً" + }, + "fields": { + "expire_hint": "سينتهي الرمز تلقائياً بعد الوقت المحدد.", + "expire_label": "انتهاء الصلاحية", + "expire_placeholder": "اختر مدة الصلاحية", + "name_hint": "اختياري · 32 حرفاً كحد أقصى", + "name_label": "الاسم", + "name_placeholder": "أعطِ الرمز اسماً قصيراً" + }, + "schema": { + "expire_int": "يجب أن يكون رقماً صحيحاً", + "expire_number": "يجب أن يكون رقماً", + "expire_positive": "يجب أن يكون أكبر من 0", + "name_max": "32 حرفاً كحد أقصى" + }, + "toast": { + "create_failed_title": "فشل الإنشاء", + "create_success_desc": "تم إنشاء رمز الوصول بنجاح.", + "create_success_title": "تم إنشاء الرمز", + "update_failed_title": "فشل التحديث", + "update_success_desc": "تم تحديث رمز الوصول بنجاح.", + "update_success_title": "تم تحديث الرمز" + } + }, + "tokens_action": { + "buttons": { + "add": "إضافة رمز" + }, + "delete_dialog": { + "description": "هذا الإجراء لا يمكن التراجع عنه.", + "title": "حذف رمز الوصول؟" + }, + "dialog": { + "description": "إدارة رموز API لهذا المستخدم.", + "title": "رموز API" + }, + "empty": { + "description": "هذا المستخدم ليس لديه أي رموز API حالياً.", + "title": "لا توجد رموز API" + }, + "list": { + "button_delete": "حذف الرمز", + "expires_on_brief": "ينتهي في {{date}}", + "label_created": "تاريخ الإنشاء", + "label_expires_at": "ينتهي في", + "label_last_used": "آخر استخدام", + "label_token": "الرمز", + "never": "أبداً", + "never_expires": "لا ينتهي أبداً", + "status_active": "نشط", + "status_expired": "منتهي الصلاحية", + "unnamed_token": "رمز بدون اسم" + } + } + }, + "validation": { + "emailRequired": "البريد الإلكتروني مطلوب", + "folderLimitMustBeAtLeast100": "يجب أن يكون حد المجلد 100 على الأقل", + "folderLimitMustBeNumber": "يجب أن يكون حد المجلد رقمًا", + "imapHostCannotBeEmpty": "لا يمكن أن يكون مُضيف IMAP فارغًا", + "imapHostRequired": "مُضيف IMAP مطلوب", + "imapPortMustBeLessThan65536": "يجب أن يكون منفذ IMAP أقل من 65536", + "imapPortMustBePositive": "يجب أن يكون منفذ IMAP عددًا صحيحًا موجبًا", + "incrementalSyncMustBeAtLeast10": "يجب أن يكون فاصل المزامنة التزايدية 10 دقائق على الأقل", + "incrementalSyncMustBeNumber": "يجب أن يكون فاصل المزامنة التزايدية رقمًا", + "invalidEmail": "عنوان بريد إلكتروني غير صالح", + "invalidUrl": "عنوان URL غير صالح", + "passwordMinLength": "يجب أن تتكون كلمة المرور من {{min}} أحرف على الأقل", + "passwordRequired": "كلمة المرور مطلوبة عندما تكون طريقة المصادقة هي كلمة المرور", + "pleaseEnterPassword": "الرجاء إدخال كلمة المرور الخاصة بك", + "pleaseEnterUsernameOrEmail": "الرجاء إدخال اسم المستخدم أو البريد الإلكتروني الخاص بك", + "required": "هذا الحقل مطلوب", + "singleRequestBatchSizeMustBeNumber": "يجب أن يكون حجم الدُفعة رقماً", + "singleRequestBatchSizeTooLarge": "يجب أن يكون حجم الدُفعة على الأكثر 200", + "singleRequestBatchSizeTooSmall": "يجب أن يكون حجم الدُفعة على الأقل 10" + } } \ No newline at end of file diff --git a/web/src/locales/da.json b/web/src/locales/da.json index f671faf..fc69f33 100644 --- a/web/src/locales/da.json +++ b/web/src/locales/da.json @@ -1,1614 +1,1630 @@ { - "common": { - "submit": "Indsend", + "accessTokens": { + "aListOfIpAddressesAllowed": "En liste over IP-adresser, der har tilladelse til at få adgang til ressourcen. Indtast én IP-adresse pr. linje. (Valgfri)", + "accountId": "Konto-ID", + "accounts": "Konti", + "aclRulesForAccessTokens": "ACL-regler for adgangstokens inkluderer IP-whitelist-verifikation og håndhævelse af hastighedsbegrænsninger.", + "actions": { + "delete": "Slet", + "edit": "Rediger", + "openMenu": "Åbn menu" + }, + "addNew": "Tilføj ny", + "atLeastOneAccountIsRequired": "Mindst én konto er påkrævet.", + "create": "Opret", + "createNewAccessTokenHere": "Opret ny adgangstoken her.", + "created": "Oprettet", + "createdAt": "Oprettet", + "creating": "Opretter...", + "creationFailed": "Oprettelse mislykkedes", + "delete": "Slet", + "describeThePurposeOfTheAccessToken": "Beskriv formålet med adgangstokenet", + "description": "Administrer dine adgangstokens, deres adgangskontroller, IP-whitelister og hastighedsbegrænsninger her.", + "descriptionMustNotExceed255Characters": "Beskrivelse må ikke overstige 255 tegn.", + "edit": "Rediger", + "editToken": "Rediger Token", + "enterIntervalInSeconds": "Indtast interval i sekunder, f.eks. 60", + "enterOneIpAddressPerLine": "Indtast én IP-adresse pr. linje, f.eks.:\n192.168.1.1\n192.168.1.2", + "enterQuota": "Indtast kvote, f.eks. 100", + "expiresAt": "Udløber", + "filterByEmailAddressOrAccountId": "Filtrer efter e-mailadresse eller konto-ID...", + "interval": "Interval", + "intervalMustBeAPositiveInteger": "Interval skal være et positivt heltal.", + "invalidIpAddressesFound": "Ugyldige IP-adresser fundet. Indtast venligst gyldige IPv4- eller IPv6-adresser.", + "name": "Navn", + "noTokens": "Ingen adgangstokens", + "noTokensDesc": "Du har ikke oprettet nogen adgangstokens endnu. Opret en for at begynde at bruge API-funktionalitet.", + "notUsedYet": "Ikke brugt endnu", + "quota": "Kvote", + "quotaMustBeAPositiveInteger": "Kvote skal være et positivt heltal.", + "save": "Gem", + "saveChanges": "Gem ændringer", + "saving": "Gemmer...", + "selectAccounts": "Vælg Konti", + "selectMultipleAccountsForTheAccessToken": "Vælg flere konti for adgangstokenets omfang.", + "theListOfAccountsThatCanBeQueried": "Listen over konti, der kan forespørges ved hjælp af et adgangstoken.", + "theMaximumNumberOfRequestsAllowed": "Det maksimale antal anmodninger, der er tilladt inden for intervallet. (Valgfri)", + "theTimeWindowForTheRateLimit": "Tidsvinduet (i sekunder) for hastighedsbegrænsningen. (Valgfri)", + "title": "Adgangstokens", + "token": "Token", + "updateFailed": "Opdatering mislykkedes", + "updateOrCreationFailed": "{{action}} mislykkedes, prøv venligst igen senere", + "updateTheAccessTokenHere": "Opdater adgangstoken her.", + "updated": "Opdateret", + "updating": "Opdaterer...", + "yourAccessTokenHasBeenSuccessfully": "Dit adgangstoken er blevet {{action}}." + }, + "accounts": { + "accessControl": "Adgangskontrol", + "accessTokenCopiedToClipboard": "Adgangstoken kopieret til udklipsholderen", + "access_control": { + "buttons": { "cancel": "Annuller", - "save": "Gem", - "save_changes": "Gem ændringer", - "delete": "Slet", - "edit": "Rediger", - "search": "Søg", - "add": "Tilføj", - "remove": "Fjern", - "create": "Opret", - "update": "Opdater", - "confirm": "Bekræft", + "save": "Gem tildeling" + }, + "description": "Tildel roller og autoriserede brugere til {{email}}", + "role_label": "Adgangsrolle", + "role_loading": "Indlæser roller...", + "role_placeholder": "Vælg en rolle", + "title": "Tildeling af kontoadgang", + "toast": { + "failed_title": "Tildeling mislykkedes", + "success_desc": "Tilladelser er blevet tildelt {{email}}", + "success_title": "Tildeling fuldført" + }, + "user_empty": "Ingen brugere fundet", + "user_label": "Vælg autoriserede brugere", + "user_search_placeholder": "Søg efter brugernavn eller e-mail...", + "user_selected_count": "Valgt: {{count}} bruger(e)", + "validation": { + "role_required": "Vælg en rolle at tildele", + "user_required": "Vælg mindst én bruger" + } + }, + "accountCreated": "Konto oprettet", + "accountCreatedDesc": "Din konto er blevet oprettet.", + "accountCreationFailed": "Kontooprettelse mislykkedes", + "accountDetails": "Kontodetaljer", + "accountHasBeenSuccessfully": "Kontoen er blevet {{action}}", + "accountSyncFoldersUpdateFailed": "Opdatering af synkroniseringsmapper mislykkedes", + "accountSyncFoldersUpdated": "Synkroniseringsmapper opdateret", + "accountUpdateFailed": "Kontopdatering mislykkedes", + "accountUpdated": "Konto opdateret", + "accountUpdatedDesc": "Din konto er blevet opdateret.", + "actions": "Handlinger", + "addAccount": "Tilføj konto", + "addConfiguration": "Tilføj konfiguration", + "addImap": "Tilføj IMAP", + "addNewEmailAccountHere": "Tilføj ny e-mailkonto her. ", + "addNoSync": "Tilføj NoSync", + "allMailFolderSelected": "Bemærk: Mappen \"Al mail\" er valgt", + "allMailFolderSelectedDesc": "Valg af mapper med attributtet \"Al mail\" vil sandsynligvis resultere i duplikerede meddelelser, der allerede er synkroniseret fra mapper som Indbakke og Sendt. Dette kan optage betydeligt mere lagerplads.", + "allMailSkipped": "Valgte standardmapper. \"Al mail\" blev sprunget over for at undgå dubletter.", + "areYouSureYouWantTo": "Er du sikker på, at du vil {{action}} denne konto?", + "auth": "Godkendelse", + "authType": "godkendelsestype", + "autoConfiguring": "Konfigurerer automatisk...", + "beforeRelative": "Download kun gamle e-mails", + "beforeRelativeValue": "Download e-mails før {{value}} {{unit}} siden", + "capabilities": "Funktioner", + "chooseAuthMethod": "Vælg godkendelsesmetode til IMAP.", + "chooseEncryptionMethod": "Vælg krypteringsmetode til IMAP.", + "chooseMailboxesToDownload": "Vælg postkasser til download for {{email}}. Nye postkasser hentes i næste cyklus.", + "clickHere": "klik her", + "clickSaveWhenDone": "Klik på Gem, når du er færdig.", + "continue": "Fortsæt", + "createdAt": "Oprettet", + "creationFailed": "Oprettelse mislykkedes, prøv venligst igen senere", + "dateSelection": "Datovalg", + "dateSince": "Dato fra", + "days": "Dage", + "delete": "Slet", + "description": "Administrer og konfigurer dine e-mailkonti.", + "detail": "Detaljer", + "detailsOfTheOAuth2TokensForTheAccount": "Detaljer om OAuth2-tokens for kontoen.", + "determinesWhetherThisAccountIsActiveNoSync": "Bestemmer, om denne konto er aktiv. Hvis den er deaktiveret, kan data ikke importeres.", + "disable": "Deaktivér", + "disableAccount": "Deaktivér konto", + "disabled": "Deaktiveret", + "downloadAll": "Download alle e-mails", + "downloadBatchSize": "Download batchstørrelse", + "downloadBatchSizeDescription": "Antal beskeder hentet pr. IMAP-anmodning", + "downloadInterval": "Downloadinterval (minutter)", + "downloadIntervalPlaceholder": "Indtast minutter", + "downloadScope": "Downloadstrategi", + "downloadScopeDescription": "Vælg hvilke e-mails der skal indekseres og downloades.", + "duration": "Varighed", + "edit": "Rediger", + "email": "E-mail", + "emailAccountRegistration": "Registrering af E-mailkonto", + "emailAccountRegistrationDesc": "Indtast venligst din e-mailadresse. I de næste trin konfigurerer du IMAP-detaljer. Vi bruger denne adresse til automatisk at finde IMAP-serverindstillinger.", + "emailAddress": "E-mailadresse", + "emailCannotBeModified": "Kontoens e-mailadresse kan ikke ændres under redigering.", + "emailPlaceholder": "f.eks. hans.hansen@eksempel.dk", + "enable": "Aktivér", + "enableAccount": "Aktivér konto", + "enabled": "Aktiveret", + "enabledDescription": "Afgør om denne konto er aktiv. Hvis den deaktiveres, vil relaterede downloads ikke blive kørt.", + "encryption": "kryptering", + "enterPassword": "Indtast din adgangskode", + "enterValue": "Indtast en værdi", + "everyMinutes": "hvert {{minutes}} minut", + "field": "Felt", + "fixed": "Fast", + "folderLimit": "Mappegrænse", + "folderLimitDescription": "Begræns antallet af e-mails, der skal synkroniseres pr. mappe (minimum 100). Lad stå tomt for ingen grænse.", + "folderLimitPlaceholder": "f.eks. 1000", + "folderSync": { + "autoSelectDescendants": "Vælg efterkommere automatisk", + "autoSelectParents": "Vælg forældre automatisk", + "batches": "batcher", + "collapseAll": "Skjul alle", + "expandAll": "Udvid alle", + "loadingMailboxFolders": "Indlæser postkassemapper…", + "noData": "Ingen data", + "noFolders": "Ingen mapper at synkronisere" + }, + "foldersConfiguredForSync": "{{count}} mappe(r) konfigureret til synkronisering", + "foldersSelected": "{{count}} mappe(r) valgt", + "goBack": "Gå tilbage", + "host": "vært", + "id": "ID", + "imap": "IMAP", + "imapAuthMethod": "IMAP-godkendelsesmetode", + "imapEncryption": "IMAP-kryptering", + "imapHost": "IMAP-vært", + "imapHostPlaceholder": "f.eks. imap.eksempel.dk", + "imapPassword": "IMAP-adgangskode", + "imapPort": "IMAP-port", + "imapPortPlaceholder": "f.eks. 993", + "imapProxy": "Brug en SOCKS5-proxy til IMAP-forbindelser.", + "incSync": "Ink. Synk.", + "lastSync": "Sidste synk.", + "leaveEmptyToKeepExisting": "Lad stå tomt for at beholde den eksisterende adgangskode, eller indtast en ny for at opdatere den.", + "leaveEmptyToKeepPassword": "Lad stå tomt for at beholde nuværende adgangskode", + "login_name": "Logindnavn", + "minutes": "minutter", + "months": "Måneder", + "moreAccountTypes": "Flere kontotyper", + "mustBeAtLeast1": "Skal være mindst 1", + "name": "Navn", + "nameDescription": "IMAP-brugernavn. Standard er din e-mail, ellers angiv et eget.", + "namePlaceholder": "f.eks. Hans Hansen", + "noAccountConfigurations": "Ingen kontokonfigurationer", + "noAccountConfigurationsDesc": "Du har ikke tilføjet nogen kontokonfigurationer endnu. Tilføj en for at begynde at bruge kontofunktioner.", + "noOAuth2Tokens": "Ingen OAuth2-tokens", + "none": "Ingen", + "notAvailable": "ikke tilgængelig", + "oauth2Tokens": "OAuth2-tokens", + "openMenu": "Åbn menu", + "optional": "Valgfri", + "owner": "Oprettet af", + "password": "adgangskode", + "port": "port", + "recent": "nylig", + "refreshToken": "Opdateringstoken", + "refreshTokenCopiedToClipboard": "Opdateringstoken kopieret til udklipsholderen", + "relative": "Relativ", + "runningState": { + "account": { + "id": "Konto-ID" + }, + "common": { "close": "Luk", - "yes": "Ja", - "no": "Nej", - "ok": "OK", - "loading": "Indlæser...", - "empty": "Tom", - "noData": "Ingen data", - "table": { - "noResults": "Ingen resultater." - }, - "failed": "Mislykkedes", - "notFound": "Ikke fundet", - "back": "Tilbage", - "goBack": "Gå tilbage", - "backToHome": "Tilbage til start", - "tryAgain": "Prøv igen", - "more": "Mere", - "actions": "Handlinger", - "filter": "Filter", - "reset": "Nulstil", - "clear": "Ryd", - "error": "Fejl", - "apply": "Anvend", - "select": "Vælg", - "selectAll": "Vælg alle", - "deselectAll": "Fravælg alle", - "all": "Alle", - "none": "Ingen", - "showLess": "Vis mindre", - "showMore": "Vis mere...", - "project_description": "Bichon er et open-source projekt.", - "view_on_github_button": "Vis på GitHub", - "op_failed": "Handlingen mislykkedes", - "na": "N/A", - "retry": "Prøv igen", - "deleting": "Sletter..." - }, - "navigation": { - "home": "Hjem", - "settings": "Indstillinger", - "accounts": "Konti", - "dashboard": "Oversigt", - "mailbox": "Mailboks", - "oauth2": "OAuth2", - "accessTokens": "Adgangstokens", - "apiDocs": "API-dokumentation", - "general": "Generelt", - "auth": "Godkendelse", - "other": "Andet", - "users": "Systembrugere" - }, - "auth": { - "welcome": "Velkommen til Bichon", - "username": "Brugernavn", - "password": "Adgangskode", - "login": "Log ind", - "loginFailed": "Login mislykkedes", - "invalidPassword": "Ugyldig adgangskode. Prøv venligst igen.", - "somethingWentWrong": "Noget gik galt", - "sessionExpired": "Session udløbet!", - "sessionExpiredDesc": "Din session er afsluttet på grund af inaktivitet. Log venligst ind igen for at fortsætte.", - "logout": "Log ud", - "areYouSureYouWantToLogOut": "Er du sikker på, du vil logge ud?", - "youWillNeedToLogInAgain": "Du skal logge ind igen for at få adgang til din konto." - }, - "errors": { - "pageNotFound": "Ups! Siden blev ikke fundet!", - "pageNotFoundDesc": "Siden du leder efter ser ikke ud til at eksistere eller kan være blevet fjernet.", - "somethingWentWrong": "Ups! Noget gik galt :')", - "somethingWentWrongDesc": "Vi beklager ulejligheden. Prøv venligst igen senere.", - "internalServerError": "Intern serverfejl!", - "contentNotModified": "Indhold ikke ændret!", - "networkError": "Netværksfejl", - "networkErrorDesc": "Kan ikke oprette forbindelse til serveren. Tjek din internetforbindelse og prøv igen.", - "forbidden": "Forbudt", - "forbiddenTitle": "Adgang nægtet", - "forbiddenDesc": "Du har ikke tilladelse til at se denne ressource.", - "unauthorized": "Uautoriseret", - "unauthorizedTitle": "Uautoriseret adgang", - "unauthorizedDesc": "Log venligst ind med passende legitimationsoplysninger for at få adgang til denne ressource.", - "maintenance": "Vedligeholdelse", - "maintenanceTitle": "Webstedet er nede for vedligeholdelse!", - "maintenanceDesc": "Siden er utilgængelig i øjeblikket. Vi er snart online igen.", - "learnMore": "Lær mere" - }, - "dashboard": { - "title": "Oversigt", - "mailAccounts": "E-mailkonti", - "connected": "Forbundet", - "totalEmails": "Samlet antal e-mails", - "syncedLocally": "Synkroniseret lokalt", - "totalEmailSize": "Samlet e-mailstørrelse", - "logicalVolume": "Oprindelig størrelse", - "localDataFiles": "Lokale datafiler", - "actualDiskUsage": "Faktisk diskforbrug", - "efficiency": "Lagringseffektivitet", - "saved": "Sparet", - "dataStorage": "Datalagring", - "indexSize": "Indeksstørrelse", - "metadataSize": "Metadatastørrelse", - "tantivyDatabase": "Baseret på Tantivy-søgemaskine", - "dayTrend": "30-dages trend", - "attachments": "Vedhæftninger", - "topLists": "Toplister", - "newEmails": "Nye e-mails", - "messageDistribution": "Meddelelsesfordeling", - "attachmentRatio": "Vedhæftningsforhold", - "attachmentRatioDesc": "{{percent}}% af e-mails har vedhæftninger", - "noEmailsSynced": "Ingen e-mails synkroniseret endnu", - "withAttachments": "Med vedhæftninger", - "noAttachments": "Ingen vedhæftninger", - "top10Senders": "Top 10 Afsendere", - "byMessageCount": "Efter antal meddelelser", - "sender": "Afender", - "count": "Antal", - "top10LargestEmails": "Top 10 Største E-mails", - "byMessageSize": "Efter størrelse", - "subject": "Emne", - "size": "Størrelse", - "noSubject": "(Intet emne)", - "top10Accounts": "Top 10 Konti", - "emails": "E-mails", - "account": "Konto", - "noRecentActivity": "Ingen nylig aktivitet", - "noSendersData": "Ingen afsenderdata", - "noLargeEmails": "Ingen store e-mails", - "noAccountData": "Ingen kontodata", - "systemVersion": "Systemversion" - }, - "accounts": { - "beforeRelativeValue": "Download e-mails før {{value}} {{unit}} siden", - "sinceRelativeValue": "Download e-mails fra de sidste", - "downloadBatchSize": "Download batchstørrelse", - "downloadBatchSizeDescription": "Antal beskeder hentet pr. IMAP-anmodning", - "downloadScopeDescription": "Vælg hvilke e-mails der skal indekseres og downloades.", - "downloadScope": "Downloadstrategi", - "selectMode": "Vælg filtertilstand", - "downloadAll": "Download alle e-mails", - "sinceFixed": "Siden specifik dato", - "sinceRelative": "Download kun seneste e-mails", - "beforeRelative": "Download kun gamle e-mails", - "duration": "Varighed", - "unit": "Enhed", - "accessControl": "Adgangskontrol", - "owner": "Oprettet af", - "access_control": { - "title": "Tildeling af kontoadgang", - "description": "Tildel roller og autoriserede brugere til {{email}}", - "role_label": "Adgangsrolle", - "role_placeholder": "Vælg en rolle", - "role_loading": "Indlæser roller...", - "user_label": "Vælg autoriserede brugere", - "user_search_placeholder": "Søg efter brugernavn eller e-mail...", - "user_empty": "Ingen brugere fundet", - "user_selected_count": "Valgt: {{count}} bruger(e)", - "buttons": { - "cancel": "Annuller", - "save": "Gem tildeling" - }, - "validation": { - "user_required": "Vælg mindst én bruger", - "role_required": "Vælg en rolle at tildele" - }, - "toast": { - "success_title": "Tildeling fuldført", - "success_desc": "Tilladelser er blevet tildelt {{email}}", - "failed_title": "Tildeling mislykkedes" - } - }, - "title": "E-mailkonti", - "description": "Administrer og konfigurer dine e-mailkonti.", - "addImap": "Tilføj IMAP", - "addNoSync": "Tilføj NoSync", - "moreAccountTypes": "Flere kontotyper", - "noAccountConfigurations": "Ingen kontokonfigurationer", - "noAccountConfigurationsDesc": "Du har ikke tilføjet nogen kontokonfigurationer endnu. Tilføj en for at begynde at bruge kontofunktioner.", - "addConfiguration": "Tilføj konfiguration", - "useNoProxy": "Ingen proxy", - "login_name": "Logindnavn", - "name": "Navn", - "email": "E-mail", + "folders": "postkasser" + }, + "empty": { + "no_active_download": "Ingen aktiv download", + "no_errors_current": "Ingen fejl i nuværende session", + "no_errors_session": "Ingen fejl i denne session", + "no_global_errors": "Ingen globale fejl", + "no_history": "Ingen historik" + }, + "folders": "postkasser", + "latest": "SENESTE", + "loading": { + "fetching_account_state": "Henter kontostatus..." + }, + "message": "Besked", + "session": { + "started_at": "Starttid", "status": "Status", - "type": "Type", - "lastSync": "Sidste synk.", - "actions": "Handlinger", - "edit": "Rediger", - "delete": "Slet", - "detail": "Detaljer", - "selectMailboxes": "Vælg postkasser", - "oauth2Tokens": "OAuth2-tokens", - "id": "ID", - "enabled": "Aktiveret", - "auth": "Godkendelse", - "incSync": "Ink. Synk.", - "state": "Tilstand", - "createdAt": "Oprettet", - "updatedAt": "Opdateret", - "openMenu": "Åbn menu", - "emailAccountRegistration": "Registrering af E-mailkonto", - "emailAccountRegistrationDesc": "Indtast venligst din e-mailadresse. I de næste trin konfigurerer du IMAP-detaljer. Vi bruger denne adresse til automatisk at finde IMAP-serverindstillinger.", - "emailAddress": "E-mailadresse", - "emailPlaceholder": "f.eks. hans.hansen@eksempel.dk", - "namePlaceholder": "f.eks. Hans Hansen", - "optional": "Valgfri", - "nameDescription": "IMAP-brugernavn. Standard er din e-mail, ellers angiv et eget.", - "emailCannotBeModified": "Kontoens e-mailadresse kan ikke ændres under redigering.", - "addAccount": "Tilføj konto", - "updateAccount": "Opdater konto", - "accountUpdated": "Konto opdateret", - "accountCreated": "Konto oprettet", - "accountUpdatedDesc": "Din konto er blevet opdateret.", - "accountCreatedDesc": "Din konto er blevet oprettet.", - "accountUpdateFailed": "Kontopdatering mislykkedes", - "accountCreationFailed": "Kontooprettelse mislykkedes", - "updateFailed": "Opdatering mislykkedes, prøv venligst igen senere", - "creationFailed": "Oprettelse mislykkedes, prøv venligst igen senere", - "allMailFolderSelected": "Bemærk: Mappen \"Al mail\" er valgt", - "accountSyncFoldersUpdated": "Synkroniseringsmapper opdateret", - "accountSyncFoldersUpdateFailed": "Opdatering af synkroniseringsmapper mislykkedes", - "serverConfiguration": "Serverkonfiguration (IMAP)", - "selectedMailboxes": "Valgte postkasser", - "allMailFolderSelectedDesc": "Valg af mapper med attributtet \"Al mail\" vil sandsynligvis resultere i duplikerede meddelelser, der allerede er synkroniseret fra mapper som Indbakke og Sendt. Dette kan optage betydeligt mere lagerplads.", - "allMailSkipped": "Valgte standardmapper. \"Al mail\" blev sprunget over for at undgå dubletter.", - "selectAtLeastOneFolder": "Vælg venligst mindst én mappe", - "chooseMailboxesToDownload": "Vælg postkasser til download for {{email}}. Nye postkasser hentes i næste cyklus.", - "accountDetails": "Kontodetaljer", - "capabilities": "Funktioner", - "folderLimit": "Mappegrænse", - "everyMinutes": "hvert {{minutes}} minut", - "foldersConfiguredForSync": "{{count}} mappe(r) konfigureret til synkronisering", - "foldersSelected": "{{count}} mappe(r) valgt", - "imapHost": "IMAP-vært", - "imapHostPlaceholder": "f.eks. imap.eksempel.dk", - "imapPort": "IMAP-port", - "imapPortPlaceholder": "f.eks. 993", - "imapEncryption": "IMAP-kryptering", - "selectEncryptionMethod": "Vælg en krypteringsmetode", - "chooseEncryptionMethod": "Vælg krypteringsmetode til IMAP.", - "imapAuthMethod": "IMAP-godkendelsesmetode", - "selectAuthMethod": "Vælg en godkendelsesmetode", - "chooseAuthMethod": "Vælg godkendelsesmetode til IMAP.", - "imapPassword": "IMAP-adgangskode", - "leaveEmptyToKeepPassword": "Lad stå tomt for at beholde nuværende adgangskode", - "enterPassword": "Indtast din adgangskode", - "leaveEmptyToKeepExisting": "Lad stå tomt for at beholde den eksisterende adgangskode, eller indtast en ny for at opdatere den.", - "useProxy": "Brug Proxy", - "selectProxy": "Vælg en proxy", - "downloadInterval": "Downloadinterval (minutter)", - "downloadIntervalPlaceholder": "Indtast minutter", - "enabledDescription": "Afgør om denne konto er aktiv. Hvis den deaktiveres, vil relaterede downloads ikke blive kørt.", - "dateSince": "Dato fra", - "none": "Ingen", - "fixed": "Fast", - "relative": "Relativ", - "selectDate": "Vælg en dato", - "selectUnit": "Vælg en enhed", - "days": "Dage", - "months": "Måneder", - "years": "År", - "enterValue": "Indtast en værdi", - "mustBeAtLeast1": "Skal være mindst 1", - "dateSelection": "Datovalg", - "since": "siden", - "recent": "nylig", - "notAvailable": "ikke tilgængelig", - "host": "vært", - "port": "port", - "encryption": "kryptering", - "authType": "godkendelsestype", - "password": "adgangskode", - "useProxyField": "brug proxy", - "clickSaveWhenDone": "Klik på Gem, når du er færdig.", - "step": "Trin {{index}}", - "goBack": "Gå tilbage", - "autoConfiguring": "Konfigurerer automatisk...", - "continue": "Fortsæt", - "saveChanges": "Gem ændringer", - "submit": "Indsend", - "field": "Felt", - "value": "Værdi", - "refreshToken": "Opdateringstoken", - "accessTokenCopiedToClipboard": "Adgangstoken kopieret til udklipsholderen", - "refreshTokenCopiedToClipboard": "Opdateringstoken kopieret til udklipsholderen", - "noOAuth2Tokens": "Ingen OAuth2-tokens", - "theAccountHasNotCompletedTheAuthorizationProcess": "Kontoen har ikke fuldført godkendelsesprocessen. Venligst ", - "clickHere": "klik her", - "toAuthorizeTheAccount": " for at godkende kontoen.", - "detailsOfTheOAuth2TokensForTheAccount": "Detaljer om OAuth2-tokens for kontoen.", - "updateTheEmailAccountHere": "Opdater e-mailkontoen her. ", - "addNewEmailAccountHere": "Tilføj ny e-mailkonto her. ", - "thisAccountIsUsedForIdentificationPurposesOnly": "Denne konto bruges kun til identifikationsformål og kræver ikke synkronisering med en e-mailserver. Den hjælper med import af e-mail-data.", - "determinesWhetherThisAccountIsActiveNoSync": "Bestemmer, om denne konto er aktiv. Hvis den er deaktiveret, kan data ikke importeres.", - "folderSync": { - "noData": "Ingen data", - "noFolders": "Ingen mapper at synkronisere", - "batches": "batcher", - "autoSelectDescendants": "Vælg efterkommere automatisk", - "autoSelectParents": "Vælg forældre automatisk", - "expandAll": "Udvid alle", - "collapseAll": "Skjul alle", - "loadingMailboxFolders": "Indlæser postkassemapper…" - }, - "viewDetails": "vis detaljer", - "runningState": { - "message": "Besked", - "account": { - "id": "Konto-ID" - }, - "tabs": { - "active_session": "Aktiv session", - "history": "Historik", - "global_errors": "Globale fejl", - "folders": "Postkasser", - "errors": "Fejl" - }, - "loading": { - "fetching_account_state": "Henter kontostatus..." - }, - "empty": { - "no_active_download": "Ingen aktiv download", - "no_errors_current": "Ingen fejl i nuværende session", - "no_errors_session": "Ingen fejl i denne session", - "no_global_errors": "Ingen globale fejl", - "no_history": "Ingen historik" - }, - "session": { - "status": "Status", - "trigger": "Trigger", - "started_at": "Starttid" - }, - "common": { - "folders": "postkasser", - "close": "Luk" - }, - "latest": "SENESTE", - "folders": "postkasser" - }, - "steps": { - "complete": "Fuldfør", - "emailAddress": "E-mailadresse", - "imap": "IMAP", - "syncPreferences": "Synkroniseringspræferencer", - "summary": "Oversigt" - }, - "imapProxy": "Brug en SOCKS5-proxy til IMAP-forbindelser.", - "syncStartDateDescription": "Definerer synkroniseringens startdato – enten specifik eller relativ til nu. Tidligere e-mails udelukkes, {{fixedPart}}.", - "syncAfterDate": "synkroniserer data efter en specificeret dato", - "syncRecentData": "forskubber synkroniseringsdatoen over tid og synkroniserer kun nylige data", - "folderLimitDescription": "Begræns antallet af e-mails, der skal synkroniseres pr. mappe (minimum 100). Lad stå tomt for ingen grænse.", - "folderLimitPlaceholder": "f.eks. 1000", - "imap": "IMAP", - "minutes": "minutter", - "accountHasBeenSuccessfully": "Kontoen er blevet {{action}}", - "enableAccount": "Aktivér konto", - "disableAccount": "Deaktivér konto", - "areYouSureYouWantTo": "Er du sikker på, at du vil {{action}} denne konto?", - "enable": "Aktivér", - "disable": "Deaktivér", - "thisWillPreventTheAccountFromBeingUsed": "Denne konto vil ikke længere synkronisere data fra IMAP-serveren, men eksisterende data vil stadig være tilgængelige.", - "disabled": "Deaktiveret", - "useDangerous": "Stol på ethvert TLS‑certifikat", - "useDangerousDescription": "Aktivér denne indstilling kun hvis du opretter forbindelse til en IMAP‑server, der bruger et offentligt CA‑certifikat eller et selvsigneret certifikat, som dit system måske ikke genkender. Denne indstilling omgår standard certificeringsvalidering og kan gøre dig sårbar over for man‑in‑the‑middle‑angreb — aktiver kun hvis du forstår risikoen." + "trigger": "Trigger" + }, + "tabs": { + "active_session": "Aktiv session", + "errors": "Fejl", + "folders": "Postkasser", + "global_errors": "Globale fejl", + "history": "Historik" + } }, - "mailbox": { - "deleteMailboxDialog": { - "title": "Slet postkassemappe", - "desc": "Er du sikker på, at du vil slette denne postkassemappe? Denne handling kan ikke fortrydes.", - "warningTitle": "Advarsel", - "warningDesc": "Sletning af denne mappe vil også permanent fjerne alle arkiverede e-mails og undermapper i den.", - "confirm": "Slet permanent", - "successTitle": "Sletning lykkedes", - "successDesc": "Postkassemappen og dens indhold er blevet fjernet.", - "errorTitle": "Sletning mislykkedes" - }, - "title": "Mailboks", - "folders": "Mapper", - "messages": "Meddelelser", - "noMessages": "Ingen meddelelser", - "selectFolder": "Vælg en mappe for at se meddelelser", - "deleteDialog": { - "title": "Slet E-mail", - "desc": "Er du sikker på, at du vil slette {{countText}}? Denne handling fjerner de valgte e-mails fra den lokale database. E-mails slettes permanent og kan ikke gendannes.", - "descCountSingle": "denne e-mail", - "descCountMultiple": "disse {{count}} e-mails", - "warningTitle": "Advarsel!", - "warningDesc": "Vær forsigtig, før du fortsætter.", - "confirm": "Slet", - "successTitle": "Meddelelser slettet", - "successDesc": "Meddelelserne er blevet slettet.", - "errorTitle": "Kunne ikke slette meddelelser" - }, - "thread": { - "title": "Tråd ({{count}} {{messageLabel}})", - "message": "meddelelse", - "messages": "meddelelser", - "noSubject": "(Intet emne)", - "invalidDate": "Ugyldig dato", - "empty": "Ingen meddelelser i denne tråd.", - "loadError": "Kunne ikke indlæse tråd", - "loadingMore": "Indlæser flere...", - "loadMore": "Indlæs flere" - }, - "bulkActions": { - "ariaLabel": "Massehandlinger for {{count}} valgte {{emailLabel}}", - "email": "e-mail", - "emails": "e-mails", - "selected": "valgte", - "clearSelection": "Ryd markering", - "clearSelectionWithKey": "Ryd markering ({{key}})", - "delete": "Slet", - "deleteTooltip": "Slet valgte e-mails" - } + "saveChanges": "Gem ændringer", + "selectAtLeastOneFolder": "Vælg venligst mindst én mappe", + "selectAuthMethod": "Vælg en godkendelsesmetode", + "selectDate": "Vælg en dato", + "selectEncryptionMethod": "Vælg en krypteringsmetode", + "selectMailboxes": "Vælg postkasser", + "selectMode": "Vælg filtertilstand", + "selectProxy": "Vælg en proxy", + "selectUnit": "Vælg en enhed", + "selectedMailboxes": "Valgte postkasser", + "serverConfiguration": "Serverkonfiguration (IMAP)", + "since": "siden", + "sinceFixed": "Siden specifik dato", + "sinceRelative": "Download kun seneste e-mails", + "sinceRelativeValue": "Download e-mails fra de sidste", + "state": "Tilstand", + "status": "Status", + "step": "Trin {{index}}", + "steps": { + "complete": "Fuldfør", + "emailAddress": "E-mailadresse", + "imap": "IMAP", + "summary": "Oversigt", + "syncPreferences": "Synkroniseringspræferencer" }, - "search": { - "size": "Størrelse", - "any": "Alle", - "tiny": "Meget lille (<15 KB)", - "small": "Lille (<2 MB)", - "medium": "Mellem (2 - 10 MB)", - "large": "Stor (10 - 20 MB)", - "huge": "Kæmpestor (≥20 MB)", - "sort": "Sortér", - "sizeDescription": "Størrelsen henviser til den samlede e-mailstørrelse, inklusive vedhæftede filer.", - "title": "Søg", - "searching": "Søger, vent venligst...", - "noEmailsFound": "Ingen e-mails fundet", - "startSearching": "Begynd med at indtaste et søgeord, afsender eller brug avancerede filtre.", - "adjustSearch": "Prøv at justere dine søgekriterier eller ryd filtre.", - "tagFilter": "Etiketfilter", - "from": "Fra", - "to": "Til", - "subject": "Emne", - "date": "Dato", - "editTag": "Rediger etiket", - "keyword": "Søgeord", - "sender": "Afender", - "recipient": "Modtager", - "hasAttachment": "Har vedhæftning", - "yes": "Ja", - "no": "Nej", - "dateRange": "Datointerval", - "startDate": "Startdato", - "endDate": "Slutdato", - "advancedFilters": "Avancerede filtre", - "searchArchivedEmails": "Søg i arkiverede e-mails", - "fullTextMultiAccount": "Fuldtekst · Flere konti · Avancerede filtre", - "account": "Konto", - "mailbox": "Mailboks", - "selectAccount": "Vælg konto", - "selectMailbox": "Vælg mailboks", - "noActiveEmailAccount": "Ingen aktiv e-mailkonto.", - "addEmailAccount": "Tilføj e-mailkonto", - "noMailboxSelectAccount": "Ingen mailboks. Vælg venligst en konto først.", - "searchInSubjectBody": "Søg i emne, indhold, vedhæftninger...", - "searchingButton": "Søger...", - "searchButton": "Søg", - "advanced": "Avanceret", - "clear": "Ryd", - "since": "Siden:", - "before": "Før:", - "selectDate": "Vælg en dato", - "pleaseSelectAtLeastOne": "Vælg venligst mindst ét søgekriterie", - "cc": "Kopi (CC)", - "bcc": "Blindkopi (BCC)", - "attachmentName": "Vedhæftningsfilnavn", - "messageId": "Meddelelses-ID", - "minSize": "Min. størrelse", - "maxSize": "Maks. størrelse", - "senderRecipients": "Afsendere / Modtagere", - "attachmentsSize": "Vedhæftninger & Størrelse", - "minimumBytes": "Minimum", - "maximumBytes": "Maksimum", - "originalMessageIdHeader": "Original Message-ID header for e-mailen", - "addTags": { - "title": "Rediger Etiketter", - "none": "Ingen etiketter tilføjet", - "searchPlaceholder": "Søg eller opret etiket...", - "createHint": "Opret ny etiket: {{tag}}", - "invalidTitle": "Ugyldig etiket", - "updatedTitle": "Etiketter opdateret", - "updatedDesc": "Etiketterne er blevet opdateret", - "updateFailedTitle": "Opdatering mislykkedes", - "tryAgain": "Prøv venligst igen senere", - "selectedCount": "{{count}} etiketter valgt", - "cancel": "Annuller", - "save": "Gem", - "saving": "Gemmer..." - }, - "updateTags": { - "overwriteWarning": "Advarsel: Dette vil overskrive alle eksisterende tags på de valgte elementer.", - "title": "Opdater tags", - "none": "Ingen tags valgt", - "searchPlaceholder": "Søg eller opret nyt tag...", - "createHint": "Tryk på Enter for at oprette nyt tag: \"{{tag}}\"", - "selectedCount": "{{count}} tag(s) vil blive anvendt", - "cancel": "Annuller", - "invalidTitle": "Ugyldigt tag", - "updatedTitle": "Tags opdateret", - "updatedDesc": "Tags er blevet opdateret korrekt.", - "updateFailedTitle": "Opdatering fejlede", - "tryAgain": "Prøv venligst igen senere.", - "actionAdd": "Tilføj", - "actionRemove": "Fjern", - "actionOverwrite": "Overskriv", - "submitAdd": "Tilføj tags", - "submitRemove": "Fjern tags", - "submitOverwrite": "Overskriv tags", - "savingAdd": "Tilføjer...", - "savingRemove": "Fjerner...", - "savingOverwrite": "Overskriver..." - }, - "thread": { - "title": "Tråd · {{count}} meddelelser", - "error": "Kunne ikke indlæse tråd", - "empty": "Ingen meddelelser i denne tråd", - "invalidDate": "Ugyldig dato", - "noSubject": "(Intet emne)", - "loadingMore": "Indlæser...", - "loadMore": "Indlæs mere" - }, - "bulkActions": { - "ariaLabel": "{{count}} meddelelser valgt. Værktøjslinje", - "delete": "Slet", - "deleteDesc": "Slet valgte meddelelser", - "selected": "{{count}} valgt", - "clear": "Ryd valg", - "manageTags": "Administrer tags" - }, - "delete": { - "title": "Slet meddelelser", - "confirmPrefix": "Er du sikker på, at du vil slette", - "countLabel": "{{count}} meddelelse(r)?", - "confirmDetail": "Denne handling kan ikke fortrydes.", - "confirmButton": "Slet", - "warningTitle": "Advarsel", - "warningDesc": "Slettede meddelelser kan ikke gendannes.", - "successTitle": "Slettet", - "successDesc": "Meddelelserne er blevet slettet.", - "errorTitle": "Sletning mislykkedes" - } + "submit": "Indsend", + "syncAfterDate": "synkroniserer data efter en specificeret dato", + "syncRecentData": "forskubber synkroniseringsdatoen over tid og synkroniserer kun nylige data", + "syncStartDateDescription": "Definerer synkroniseringens startdato – enten specifik eller relativ til nu. Tidligere e-mails udelukkes, {{fixedPart}}.", + "theAccountHasNotCompletedTheAuthorizationProcess": "Kontoen har ikke fuldført godkendelsesprocessen. Venligst ", + "thisAccountIsUsedForIdentificationPurposesOnly": "Denne konto bruges kun til identifikationsformål og kræver ikke synkronisering med en e-mailserver. Den hjælper med import af e-mail-data.", + "thisWillPreventTheAccountFromBeingUsed": "Denne konto vil ikke længere synkronisere data fra IMAP-serveren, men eksisterende data vil stadig være tilgængelige.", + "title": "E-mailkonti", + "toAuthorizeTheAccount": " for at godkende kontoen.", + "type": "Type", + "unit": "Enhed", + "updateAccount": "Opdater konto", + "updateFailed": "Opdatering mislykkedes, prøv venligst igen senere", + "updateTheEmailAccountHere": "Opdater e-mailkontoen her. ", + "updatedAt": "Opdateret", + "useDangerous": "Stol på ethvert TLS‑certifikat", + "useDangerousDescription": "Aktivér denne indstilling kun hvis du opretter forbindelse til en IMAP‑server, der bruger et offentligt CA‑certifikat eller et selvsigneret certifikat, som dit system måske ikke genkender. Denne indstilling omgår standard certificeringsvalidering og kan gøre dig sårbar over for man‑in‑the‑middle‑angreb — aktiver kun hvis du forstår risikoen.", + "useNoProxy": "Ingen proxy", + "useProxy": "Brug Proxy", + "useProxyField": "brug proxy", + "value": "Værdi", + "viewDetails": "vis detaljer", + "years": "År" + }, + "apiDocs": { + "choosePreferredType": "Vælg foretrukken type API-dokumentation", + "downloadSpecYAML": "Download Spec YAML", + "openAPIExplorer": "OpenAPI Explorer", + "reDoc": "ReDoc", + "scalar": "Scalar", + "swaggerUI": "Swagger UI" + }, + "apiTokens": { + "deleteDialog": { + "cancel": "Annuller", + "confirm": "Slet", + "deleting": "Sletter...", + "description": "Denne handling kan ikke fortrydes. Enhver applikation, der bruger dette token, mister øjeblikkeligt adgangen.", + "title": "Slet adgangstoken?" }, - "mail": { - "emailViewer": "E-mailfremviser", - "noMessageSelected": "Ingen meddelelse valgt", - "account": "Konto", - "from": "Fra", - "to": "Til", - "subject": "Emne", - "date": "Dato", - "tags": "Etiketter", - "noTagsYet": "Ingen etiketter endnu", - "id": "ID", - "cc": "Kopi", - "bcc": "Blindkopi", - "attachments": "Vedhæftninger", - "download": "Download", - "delete": "Slet", - "viewThread": "Vis tråd", - "downloadStarted": "Download startet", - "downloadComplete": "Download fuldført", - "downloadFailed": "Download mislykkedes", - "failedToDownloadFile": "Kunne ikke downloade fil", - "failedToLoadEmail": "Kunne ikke indlæse e-mail.", - "isBeingDownloaded": "{{id}} downloades", - "downloaded": "{{id}} downloaded", - "showLess": "vis mindre", - "showMore": "vis mere...", - "onlyNonInlineAttachments": "Kun ikke-indlejrede vedhæftninger vises her.", - "noAttachments": "Ingen vedhæftninger" + "dialog": { + "createTitle": "Opret adgangstoken", + "description": "Klik på gem, når du er færdig.", + "editTitle": "Rediger adgangstoken", + "save": "Gem", + "saveChanges": "Gem ændringer" }, - "oauth2": { - "title": "OAuth2", - "addConfiguration": "Tilføj konfiguration", - "id": "ID", - "provider": "Udbyder", - "clientId": "Klient-ID", - "clientSecret": "Klienthemmelighed", - "redirectUri": "Omdirigerings-URI", - "scopes": "Omfang (Scopes)", - "status": "Status", - "enabled": "Aktiveret", - "disabled": "Deaktiveret", - "edit": "Rediger", - "delete": "Slet", - "enable": "Aktiver", - "disable": "Deaktiver", - "noConfigurations": "Ingen OAuth2-konfigurationer", - "noConfigurationsDesc": "Du har ikke tilføjet nogen OAuth2-konfigurationer endnu. Tilføj en for at begynde at bruge OAuth2-funktionalitet.", - "description": "Administrerer automatisk hentning, lagring og opdatering af adgangstokens, hvilket sikrer en problemfri og altid klar godkendelsesoplevelse.", - "addNew": "Tilføj ny", - "updateHere": "Opdater her.", - "createNewHere": "Opret ny her.", - "clickSaveWhenDone": "Klik på Gem, når du er færdig.", - "quickPresets": "Hurtige forudindstillinger:", - "gmail": "Gmail", - "outlook": "Outlook", - "whenDisabled": "Ved deaktivering: - Nye godkendelsesflow afvises øjeblikkeligt - Eksisterende adgangstokens og opdateringstokens tilbagekaldes inden for 1 minut - Brugere skal godkende igen ved genaktivering", - "clientIdLabel": "Klient-ID:", - "enterYourClientId": "Indtast dit Klient-ID", - "theUniqueIdentifierForYourApplication": "Den unikke identifikator for din applikation, leveret af OAuth-udbyderen.", - "clientSecretLabel": "Klienthemmelighed:", - "leaveEmptyToKeepExistingSecret": "Lad stå tomt for at beholde eksisterende hemmelighed", - "enterYourClientSecret": "Indtast din klienthemmelighed", - "leaveEmptyToKeepTheExistingSecret": "Lad stå tomt for at beholde den eksisterende hemmelighed. Indtast kun en ny værdi, hvis du ønsker at ændre den.", - "aSecretKeyProvidedByTheOAuthProvider": "En hemmelig nøgle leveret af OAuth-udbyderen for at godkende din applikation.", - "authUrlLabel": "Godkendelses-URL:", - "enterTheAuthorizationUrl": "Indtast godkendelses-URL", - "theUrlWhereUsersWillBeRedirected": "URL'en, hvor brugere vil blive omdirigeret til for at godkende din applikation.", - "tokenUrlLabel": "Token-URL:", - "enterTheTokenUrl": "Indtast Token-URL", - "theUrlUsedToExchange": "URL'en, der bruges til at udveksle godkendelseskoden med en adgangstoken.", - "redirectUrlLabel": "Omdirigerings-URL:", - "enterYourRedirectUrl": "Indtast din omdirigerings-URL", - "theRedirectUrlAfterAuthorization": "Omdirigerings-URL'en efter godkendelse. Den skal matche den, der er registreret hos OAuth-udbyderen. Brug formatet http://[vært]:[port]/oauth2/callback (eller https://), hvor [vært] og [port] matcher din RustMailer-installation. Stien /oauth2/callback er fast.", - "scope": "Omfang:", - "enterTheScopeHere": "Indtast omfang her.", - "addScope": "Tilføj omfang", - "key": "Nøgle:", - "enterTheKeyHere": "Indtast nøglen her.", - "value": "Værdi:", - "enterTheValueHere": "Indtast værdien her.", - "addExtraParams": "Tilføj ekstra parametre", - "useProxyOptional": "Brug Proxy (valgfri):", - "selectAProxy": "Vælg en proxy", - "noProxyAvailable": "Ingen proxy tilgængelig", - "useSocks5ProxyForOAuthRequests": "Brug SOCKS5-proxy til OAuth-anmodninger, når direkte adgang er blokeret.", - "descriptionLabel": "Beskrivelse:", - "describeThePurposeOfTheOauth2Application": "Beskriv formålet med OAuth2-applikationen", - "optional": "Valgfri", - "saving": "Gemmer...", - "creating": "Opretter...", - "saveChanges": "Gem ændringer", - "save": "Gem", - "updated": "Opdateret", - "created": "Oprettet", - "yourOAuth2ApplicationHasBeenSuccessfully": "Din OAuth2-applikation er blevet {{action}}.", - "updateFailed": "Opdatering mislykkedes", - "creationFailed": "Oprettelse mislykkedes", - "updateOrCreationFailed": "{{action}} mislykkedes, prøv venligst igen senere", - "clientSecretIsRequired": "Klienthemmelighed er påkrævet", - "clientSecretCannotBeEmpty": "Klienthemmelighed kan ikke være tom", - "keyIsRequired": "Nøgle er påkrævet", - "keyCannotBeEmpty": "Nøgle kan ikke være tom", - "valueIsRequired": "Værdi er påkrævet", - "valueCannotBeEmpty": "Værdi kan ikke være tom", - "descriptionMustNotExceed255Characters": "Beskrivelse må ikke overstige 255 tegn.", - "clientIdIsRequired": "Klient-ID er påkrævet", - "clientIdCannotBeEmpty": "Klient-ID kan ikke være tomt", - "authorizationUrlIsRequired": "Godkendelses-URL er påkrævet", - "authorizationUrlCannotBeEmpty": "Godkendelses-URL kan ikke være tom", - "invalidAuthorizationUrlFormat": "Ugyldigt format på godkendelses-URL", - "tokenUrlIsRequired": "Token-URL er påkrævet", - "tokenUrlCannotBeEmpty": "Token-URL kan ikke være tom", - "invalidTokenUrlFormat": "Ugyldigt format på Token-URL", - "redirectUriIsRequired": "Omdirigerings-URI er påkrævet", - "redirectUriCannotBeEmpty": "Omdirigerings-URI kan ikke være tom", - "invalidRedirectUriFormat": "Ugyldigt format på omdirigerings-URI", - "authorizeEmailAccount": "Godkend E-mailkonto", - "authorizeAnEmailAccountToStartTheOAuth2AuthorizationProcess": "Godkend en e-mailkonto for at starte OAuth2-godkendelsesprocessen.", - "loadingAccounts": "Indlæser konti...", - "selectAnAccount": "Vælg en konto", - "noEmailAccountsRegistered": "Ingen e-mailkonti registreret. Opret venligst én.", - "pleaseCreateOne": "Opret venligst én.", - "createAccount": "Opret konto", - "authorize": "Godkend", - "getAuthorizeUrlFailed": "Hentning af godkendelses-URL mislykkedes", - "getAuthorizeUrlFailedDesc": "Kunne ikke hente godkendelses-URL, prøv venligst igen senere", - "oauth2ClientUpdated": "OAuth2-klient opdateret", - "oauth2ClientHasBeenSuccessfully": "OAuth2-klienten er blevet {{action}}.", - "statusUpdateFailed": "Statusopdatering mislykkedes, prøv venligst igen senere", - "disableOAuth2Client": "Deaktiver OAuth2-klient", - "enableOAuth2Client": "Aktiver OAuth2-klient", - "areYouSureYouWantTo": "Er du sikker på, at du vil {{action}} denne OAuth2-klient?", - "thisWillPreventTheOAuth2ClientFromBeingUsed": "Dette vil forhindre, at OAuth2-klienten bliver brugt.", - "deleteToken": "Slet Token", - "areYouSureYouWantToDelete": "Er du sikker på, at du vil slette", - "thisActionWillPermanentlyRemoveTheOauth2Record": "Denne handling vil permanent fjerne OAuth2-posten fra systemet. Dette kan ikke fortrydes.", - "enterIdToConfirmDeletion": "Indtast ID for at bekræfte sletning.", - "warning": "Advarsel!", - "pleaseBeCareful": "Vær forsigtig, denne handling kan ikke fortrydes.", - "deleteSuccess": "Sletning lykkedes", - "yourOAuth2ApplicationHasBeenSuccessfullyDeleted": "Din OAuth2-applikation er blevet slettet.", - "oauth2DeleteFailed": "Sletning af OAuth2 mislykkedes", - "deleteFailed": "Sletning mislykkedes, prøv venligst igen senere", - "actions": { - "openMenu": "Åbn menu", - "edit": "Rediger", - "authorize": "Godkend", - "delete": "Slet" - }, - "authFailed": "OAuth2-godkendelse mislykkedes", - "error": "Fejl", - "unknownError": "Der opstod en ukendt fejl.", - "tryAgain": "Prøv igen", - "goHome": "Gå til Hjem", - "authSuccess": "OAuth2-godkendelse lykkedes", - "success": "Succes", - "successMessage": "Din e-mailkonto er blevet godkendt via OAuth2. Adgangstokenet er blevet gemt af systemet og vil blive opdateret automatisk efter behov.", - "goToAccounts": "Gå til Konti", - "authAtatus": "OAuth2-godkendelsesstatus", - "information": "Information", - "noStatus": "Denne side viser resultatet af din OAuth2-godkendelse. Der er i øjeblikket ingen specifik status tilgængelig. Prøv venligst igen, hvis det er nødvendigt.", - "backToLogin": "Tilbage til login" + "form": { + "1day": "1 dag", + "30days": "30 dage", + "7days": "7 dage", + "errorInt": "Skal være et heltal", + "errorMax": "Max 32 tegn", + "errorNumber": "Skal være et tal", + "errorPositive": "Skal være større end 0", + "expirationDescription": "Tokens udløber automatisk efter den valgte tid.", + "expirationLabel": "Udløb", + "expirationPlaceholder": "Vælg udløb", + "nameDescription": "Valgfrit · Max 32 tegn", + "nameLabel": "Navn", + "namePlaceholder": "Giv dette token et kort navn", + "never": "Aldrig" }, - "accessTokens": { - "title": "Adgangstokens", - "name": "Navn", - "accounts": "Konti", - "token": "Token", - "createdAt": "Oprettet", - "expiresAt": "Udløber", - "edit": "Rediger", - "delete": "Slet", - "create": "Opret", - "noTokens": "Ingen adgangstokens", - "noTokensDesc": "Du har ikke oprettet nogen adgangstokens endnu. Opret en for at begynde at bruge API-funktionalitet.", - "description": "Administrer dine adgangstokens, deres adgangskontroller, IP-whitelister og hastighedsbegrænsninger her.", - "editToken": "Rediger Token", - "addNew": "Tilføj ny", - "updateTheAccessTokenHere": "Opdater adgangstoken her.", - "createNewAccessTokenHere": "Opret ny adgangstoken her.", - "selectAccounts": "Vælg Konti", - "selectMultipleAccountsForTheAccessToken": "Vælg flere konti for adgangstokenets omfang.", - "enterOneIpAddressPerLine": "Indtast én IP-adresse pr. linje, f.eks.:\n192.168.1.1\n192.168.1.2", - "aListOfIpAddressesAllowed": "En liste over IP-adresser, der har tilladelse til at få adgang til ressourcen. Indtast én IP-adresse pr. linje. (Valgfri)", - "enterQuota": "Indtast kvote, f.eks. 100", - "theMaximumNumberOfRequestsAllowed": "Det maksimale antal anmodninger, der er tilladt inden for intervallet. (Valgfri)", - "enterIntervalInSeconds": "Indtast interval i sekunder, f.eks. 60", - "theTimeWindowForTheRateLimit": "Tidsvinduet (i sekunder) for hastighedsbegrænsningen. (Valgfri)", - "describeThePurposeOfTheAccessToken": "Beskriv formålet med adgangstokenet", - "updating": "Opdaterer...", - "saving": "Gemmer...", - "creating": "Opretter...", - "saveChanges": "Gem ændringer", - "save": "Gem", - "updated": "Opdateret", - "created": "Oprettet", - "yourAccessTokenHasBeenSuccessfully": "Dit adgangstoken er blevet {{action}}.", - "updateFailed": "Opdatering mislykkedes", - "creationFailed": "Oprettelse mislykkedes", - "updateOrCreationFailed": "{{action}} mislykkedes, prøv venligst igen senere", - "quotaMustBeAPositiveInteger": "Kvote skal være et positivt heltal.", - "intervalMustBeAPositiveInteger": "Interval skal være et positivt heltal.", - "invalidIpAddressesFound": "Ugyldige IP-adresser fundet. Indtast venligst gyldige IPv4- eller IPv6-adresser.", - "atLeastOneAccountIsRequired": "Mindst én konto er påkrævet.", - "descriptionMustNotExceed255Characters": "Beskrivelse må ikke overstige 255 tegn.", - "notUsedYet": "Ikke brugt endnu", - "theListOfAccountsThatCanBeQueried": "Listen over konti, der kan forespørges ved hjælp af et adgangstoken.", - "accountId": "Konto-ID", - "filterByEmailAddressOrAccountId": "Filtrer efter e-mailadresse eller konto-ID...", - "aclRulesForAccessTokens": "ACL-regler for adgangstokens inkluderer IP-whitelist-verifikation og håndhævelse af hastighedsbegrænsninger.", - "actions": { - "openMenu": "Åbn menu", - "edit": "Rediger", - "delete": "Slet" - }, - "quota": "Kvote", - "interval": "Interval" + "list": { + "createdLabel": "Oprettet", + "deleteBtn": "Slet token", + "expiresOnLabel": "Udløber den", + "expiresOnShort": "Udløber den {{date}}", + "lastUsedLabel": "Sidst brugt", + "neverExpires": "Udløber aldrig", + "neverLabel": "Aldrig", + "neverUsed": "Aldrig", + "statusActive": "Aktiv", + "statusExpired": "Udløbet", + "tokenLabel": "Token", + "unnamedToken": "Navnløst token" }, - "settings": { - "appearance": { - "title": "Udseende", - "field": { - "language": "Grænsefladesprog", - "theme": "Grænsefladetema" - }, - "description": { - "language": "Vælg det sprog, der skal bruges i webbrugerfladen.", - "theme": "Vælg mellem lys eller mørk tilstand for brugerfladen." - }, - "placeholder": { - "select_language": "Vælg sprog" - }, - "command": { - "search": "Søg efter sprog...", - "no_results": "Intet sprog fundet." - }, - "theme": { - "light": "Lys", - "dark": "Mørk" - }, - "button": { - "update": "Opdater indstillinger" - }, - "validation": { - "language": { - "required": "Vælg venligst et sprog." - }, - "theme": { - "required": "Vælg venligst et tema." - } - } - }, - "title": "Indstillinger", - "general": "Generelt", - "proxy": "Proxy", - "name": "Navn", - "host": "Vært", - "port": "Port", - "username": "Brugernavn", - "password": "Adgangskode", - "type": "Type", - "actions": "Handlinger", - "edit": "Rediger", - "delete": "Slet", - "add": "Tilføj", - "noProxies": "Ingen proxyer", - "noProxiesDesc": "Du har ikke tilføjet nogen proxy-konfigurationer endnu. Tilføj en for at begynde at bruge proxy-funktionalitet.", - "root": "Root", - "rootTitle": "Root", - "rootDesc": "Administrer root-adgangsoplysninger, herunder token og adgangskode.", - "rootAccessManagement": "Root-adgangsstyring", - "manageRootTokenAndPassword": "Administrer sikkert root-token og adgangskode.", - "resetRootToken": "Nulstil Root-token", - "generateNewToken": "Generer nyt token, det gamle udløber øjeblikkeligt.", - "reset": "Nulstil", - "resetRootPassword": "Nulstil Root-adgangskode", - "changePasswordForFutureLogins": "Skift adgangskode til fremtidige logins.", - "youAreAboutToResetTheRootToken": "Du er ved at nulstille root-tokenet. Denne handling kan ikke fortrydes.", - "confirmReset": "Bekræft Nulstilling", - "youAreAboutToResetTheRootPassword": "Du er ved at nulstille root-adgangskoden. Sørg for at opbevare den sikkert.", - "enterNewRootPassword": "Indtast ny Root-adgangskode", - "theRootTokenHasBeenReset": "Root-tokenet er blevet nulstillet", - "yourLoginInformationHasBeenUpdated": "Dine loginoplysninger er blevet opdateret. Du behøver ikke at logge ind igen.", - "invalidPassword": "Ugyldig adgangskode", - "rootPasswordMustBeAtLeast6Characters": "Root-adgangskoden skal være mindst 6 tegn lang.", - "theRootPasswordHasBeenReset": "Root-adgangskoden er blevet nulstillet", - "useNewPasswordForNextLogin": "Brug den nye adgangskode til næste login.", - "failedToCopyText": "Kunne ikke kopiere tekst", - "filterProxy": "Filtrer Proxy...", - "filterOauth2": "Filtrer OAuth2...", - "filterAccount": "Filtrer Konto...", - "filterAccessToken": "Filtrer Adgangstoken...", - "selectAll": "Vælg alle", - "theme": "Tema", - "id": "Id", - "url": "Url", - "createdAt": "Oprettet", - "updatedAt": "Opdateret", - "enabled": "Aktiveret", - "useProxy": "Brug Proxy", - "authUrl": "Godkendelses-URL", - "tokenUrl": "Token-URL", - "description": "Beskrivelse", - "token": "Token", - "accounts": "Konti", - "acl": "ACL", - "lastAccess": "Sidste adgang", - "enterProxyIdToConfirmDeletion": "Indtast Proxy-ID for at bekræfte sletning.", - "updateTheProxyHere": "Opdater proxien her. ", - "addNewProxyHere": "Tilføj ny proxy her. ", - "pleaseUseAnIpAddressForBetterReliability": "Brug venligst en IP-adresse (f.eks. 127.0.0.1) i stedet for et værtsnavn eller domæne for bedre pålidelighed.", - "adding": "Tilføjer...", - "yourProxyHasBeenSuccessfully": "Din proxy er blevet {{action}}.", - "proxyUpdateOrAddFailed": "{{action}} mislykkedes, prøv venligst igen senere", - "sidebar": { - "profile": "Profil", - "apiTokens": "API-tokens", - "proxy": "Netværksproxy", - "configurations": "Systemkonfigurationer" - }, - "profile": { - "loadError": "Kunne ikke indlæse brugeroplysninger.", - "uploadTitle": "Upload avatar", - "maxSize": "Op til {{size}}", - "avatarAlt": "Avatar", - "removeAvatar": "Fjern avatar", - "uploadError": "Fejl ved filupload", - "field": { - "username": "Brugernavn", - "email": "E-mail", - "password": "Adgangskode" - }, - "placeholder": { - "password_keep": "Lad feltet være tomt for at beholde nuværende adgangskode" - }, - "button": { - "update_profile": "Opdater profil", - "permissions": "Tilladelser", - "view_global_permissions": "Se globale tilladelser" - }, - "section": { - "roles": "Roller", - "accounts": "{{count}} tilknyttede konti" - }, - "account": { - "id": "Konto-ID: {{id}}" - }, - "toast": { - "updated": "Profilen blev opdateret", - "update_failed": "Kunne ikke opdatere profilen" - }, - "validation": { - "username": { - "required": "Brugernavn er påkrævet", - "min": "Brugernavnet skal være mindst 5 tegn", - "max": "Brugernavnet må højst være 32 tegn" - }, - "email": { - "required": "E-mail er påkrævet", - "invalid": "Indtast en gyldig e-mailadresse" - }, - "password": { - "min": "Adgangskoden skal være mindst 8 tegn", - "max": "Adgangskoden må højst være 256 tegn" - } - } - } + "notifications": { + "close": "Luk", + "copied": "Kopieret til udklipsholder", + "createFailed": "Oprettelse mislykkedes", + "createSuccess": "Adgangstoken oprettet", + "createSuccessDesc": "Adgangstokenet er blevet oprettet med succes.", + "deleteFailed": "Kunne ikke slette token", + "deleteSuccess": "Token slettet", + "genericError": "Operationen mislykkedes. Prøv igen.", + "tryAgain": "Prøv igen", + "updateFailed": "Opdatering mislykkedes", + "updateSuccess": "Adgangstoken opdateret", + "updateSuccessDesc": "Adgangstokenet er blevet opdateret med succes." }, - "apiDocs": { - "choosePreferredType": "Vælg foretrukken type API-dokumentation", - "swaggerUI": "Swagger UI", - "reDoc": "ReDoc", - "openAPIExplorer": "OpenAPI Explorer", - "scalar": "Scalar", - "downloadSpecYAML": "Download Spec YAML" + "page": { + "addBtn": "Tilføj token", + "emptyDescription": "Du har ikke oprettet nogen API-tokens endnu. Klik nedenfor for at oprette en.", + "emptyTitle": "Ingen API-tokens", + "loadError": "Kunne ikke indlæse API-tokens." + } + }, + "attachment": { + "all_fields_desc": "Matcher vedhæftet filnavn, emne og afsender", + "date": "Dato", + "name": "Filnavn", + "search_input_placeholder": "Søg efter vedhæftede filer (brug \" \" til frasesøgning)", + "sender": "Afsender", + "sender_with_count": "Afsender ({{count}})", + "size": "Filstørrelse", + "source": "Kilde", + "subject": "Emne" + }, + "auth": { + "areYouSureYouWantToLogOut": "Er du sikker på, du vil logge ud?", + "invalidPassword": "Ugyldig adgangskode. Prøv venligst igen.", + "login": "Log ind", + "loginFailed": "Login mislykkedes", + "logout": "Log ud", + "password": "Adgangskode", + "sessionExpired": "Session udløbet!", + "sessionExpiredDesc": "Din session er afsluttet på grund af inaktivitet. Log venligst ind igen for at fortsætte.", + "somethingWentWrong": "Noget gik galt", + "username": "Brugernavn", + "welcome": "Velkommen til Bichon", + "youWillNeedToLogInAgain": "Du skal logge ind igen for at få adgang til din konto." + }, + "command": { + "dark": "Mørk", + "light": "Lys", + "noResultsFound": "Ingen resultater fundet.", + "theme": "Tema", + "typeCommandOrSearch": "Skriv en kommando eller søg..." + }, + "common": { + "actions": "Handlinger", + "add": "Tilføj", + "all": "Alle", + "apply": "Anvend", + "back": "Tilbage", + "backToHome": "Tilbage til start", + "cancel": "Annuller", + "clear": "Ryd", + "close": "Luk", + "confirm": "Bekræft", + "create": "Opret", + "delete": "Slet", + "deleting": "Sletter...", + "deselectAll": "Fravælg alle", + "edit": "Rediger", + "empty": "Tom", + "error": "Fejl", + "failed": "Mislykkedes", + "filter": "Filter", + "goBack": "Gå tilbage", + "loading": "Indlæser...", + "more": "Mere", + "na": "N/A", + "no": "Nej", + "noData": "Ingen data", + "none": "Ingen", + "notFound": "Ikke fundet", + "ok": "OK", + "op_failed": "Handlingen mislykkedes", + "project_description": "Bichon er et open-source projekt.", + "remove": "Fjern", + "reset": "Nulstil", + "retry": "Prøv igen", + "save": "Gem", + "save_changes": "Gem ændringer", + "search": "Søg", + "select": "Vælg", + "selectAll": "Vælg alle", + "showLess": "Vis mindre", + "showMore": "Vis mere...", + "submit": "Indsend", + "table": { + "noResults": "Ingen resultater." }, - "dialogs": { - "confirmDelete": "Bekræft Sletning", - "confirmDeleteDesc": "Er du sikker på, at du vil slette dette element? Denne handling kan ikke fortrydes.", - "deleteSuccess": "Sletning lykkedes", - "deleteFailed": "Sletning mislykkedes", - "saveSuccess": "Gemt med succes", - "saveFailed": "Gemning mislykkedes", - "createSuccess": "Oprettet med succes", - "createFailed": "Oprettelse mislykkedes", - "updateSuccess": "Opdateret med succes", - "updateFailed": "Opdatering mislykkedes", - "continue": "Fortsæt", - "deleting": "Sletter...", - "accountDeleted": "Konto slettet", - "accountDeletedDesc": "Din konto er blevet slettet.", - "accountDeleteFailed": "Sletning af konto mislykkedes", - "deleteAccountPermanently": "Slet Konto Permanent", - "youAreDeleting": "Du sletter {{email}}. Dette vil permanent slette:", - "accountCredentials": "Kontooplysninger og indstillinger", - "localCachedMetadata": "Lokalt cachelagret metadata og synkroniseringsstatus", - "imapSyncData": "IMAP-synkroniseringsdata", - "oauthTokens": "OAuth-tokens og API-oplysninger", - "typeEmailToConfirm": "Skriv kontoens e-mailadresse for at bekræfte:", - "typeToConfirm": "Skriv \"{{email}}\" for at bekræfte", - "cannotBeUndone": "Denne handling kan ikke fortrydes!", - "allResourcesErased": "Alle relaterede ressourcer vil blive slettet permanent.", - "permanentlyDeleteAccount": "Slet konto permanent" + "tryAgain": "Prøv igen", + "update": "Opdater", + "view_on_github_button": "Vis på GitHub", + "yes": "Ja" + }, + "dashboard": { + "account": "Konto", + "actualDiskUsage": "Faktisk diskforbrug", + "attachmentRatio": "Vedhæftningsforhold", + "attachmentRatioDesc": "{{percent}}% af e-mails har vedhæftninger", + "attachments": "Vedhæftninger", + "byMessageCount": "Efter antal meddelelser", + "byMessageSize": "Efter størrelse", + "connected": "Forbundet", + "count": "Antal", + "dataStorage": "Datalagring", + "dayTrend": "30-dages trend", + "efficiency": "Lagringseffektivitet", + "emails": "E-mails", + "indexSize": "Indeksstørrelse", + "localDataFiles": "Lokale datafiler", + "logicalVolume": "Oprindelig størrelse", + "mailAccounts": "E-mailkonti", + "messageDistribution": "Meddelelsesfordeling", + "metadataSize": "Metadatastørrelse", + "newEmails": "Nye e-mails", + "noAccountData": "Ingen kontodata", + "noAttachments": "Ingen vedhæftninger", + "noEmailsSynced": "Ingen e-mails synkroniseret endnu", + "noLargeEmails": "Ingen store e-mails", + "noRecentActivity": "Ingen nylig aktivitet", + "noSendersData": "Ingen afsenderdata", + "noSubject": "(Intet emne)", + "saved": "Sparet", + "sender": "Afender", + "size": "Størrelse", + "subject": "Emne", + "syncedLocally": "Synkroniseret lokalt", + "systemVersion": "Systemversion", + "tantivyDatabase": "Baseret på Tantivy-søgemaskine", + "title": "Oversigt", + "top10Accounts": "Top 10 Konti", + "top10LargestEmails": "Top 10 Største E-mails", + "top10Senders": "Top 10 Afsendere", + "topLists": "Toplister", + "totalEmailSize": "Samlet e-mailstørrelse", + "totalEmails": "Samlet antal e-mails", + "withAttachments": "Med vedhæftninger" + }, + "dialogs": { + "accountCredentials": "Kontooplysninger og indstillinger", + "accountDeleteFailed": "Sletning af konto mislykkedes", + "accountDeleted": "Konto slettet", + "accountDeletedDesc": "Din konto er blevet slettet.", + "allResourcesErased": "Alle relaterede ressourcer vil blive slettet permanent.", + "cannotBeUndone": "Denne handling kan ikke fortrydes!", + "confirmDelete": "Bekræft Sletning", + "confirmDeleteDesc": "Er du sikker på, at du vil slette dette element? Denne handling kan ikke fortrydes.", + "continue": "Fortsæt", + "createFailed": "Oprettelse mislykkedes", + "createSuccess": "Oprettet med succes", + "deleteAccountPermanently": "Slet Konto Permanent", + "deleteFailed": "Sletning mislykkedes", + "deleteSuccess": "Sletning lykkedes", + "deleting": "Sletter...", + "imapSyncData": "IMAP-synkroniseringsdata", + "localCachedMetadata": "Lokalt cachelagret metadata og synkroniseringsstatus", + "oauthTokens": "OAuth-tokens og API-oplysninger", + "permanentlyDeleteAccount": "Slet konto permanent", + "saveFailed": "Gemning mislykkedes", + "saveSuccess": "Gemt med succes", + "typeEmailToConfirm": "Skriv kontoens e-mailadresse for at bekræfte:", + "typeToConfirm": "Skriv \"{{email}}\" for at bekræfte", + "updateFailed": "Opdatering mislykkedes", + "updateSuccess": "Opdateret med succes", + "youAreDeleting": "Du sletter {{email}}. Dette vil permanent slette:" + }, + "errors": { + "contentNotModified": "Indhold ikke ændret!", + "forbidden": "Forbudt", + "forbiddenDesc": "Du har ikke tilladelse til at se denne ressource.", + "forbiddenTitle": "Adgang nægtet", + "internalServerError": "Intern serverfejl!", + "learnMore": "Lær mere", + "maintenance": "Vedligeholdelse", + "maintenanceDesc": "Siden er utilgængelig i øjeblikket. Vi er snart online igen.", + "maintenanceTitle": "Webstedet er nede for vedligeholdelse!", + "networkError": "Netværksfejl", + "networkErrorDesc": "Kan ikke oprette forbindelse til serveren. Tjek din internetforbindelse og prøv igen.", + "pageNotFound": "Ups! Siden blev ikke fundet!", + "pageNotFoundDesc": "Siden du leder efter ser ikke ud til at eksistere eller kan være blevet fjernet.", + "somethingWentWrong": "Ups! Noget gik galt :')", + "somethingWentWrongDesc": "Vi beklager ulejligheden. Prøv venligst igen senere.", + "unauthorized": "Uautoriseret", + "unauthorizedDesc": "Log venligst ind med passende legitimationsoplysninger for at få adgang til denne ressource.", + "unauthorizedTitle": "Uautoriseret adgang" + }, + "mail": { + "account": "Konto", + "attachments": "Vedhæftninger", + "bcc": "Blindkopi", + "cc": "Kopi", + "date": "Dato", + "delete": "Slet", + "download": "Download", + "downloadComplete": "Download fuldført", + "downloadFailed": "Download mislykkedes", + "downloadStarted": "Download startet", + "downloaded": "{{id}} downloaded", + "emailViewer": "E-mailfremviser", + "failedToDownloadFile": "Kunne ikke downloade fil", + "failedToLoadEmail": "Kunne ikke indlæse e-mail.", + "from": "Fra", + "id": "ID", + "isBeingDownloaded": "{{id}} downloades", + "noAttachments": "Ingen vedhæftninger", + "noMessageSelected": "Ingen meddelelse valgt", + "noTagsYet": "Ingen etiketter endnu", + "onlyNonInlineAttachments": "Kun ikke-indlejrede vedhæftninger vises her.", + "showLess": "vis mindre", + "showMore": "vis mere...", + "subject": "Emne", + "tags": "Etiketter", + "to": "Til", + "viewThread": "Vis tråd" + }, + "mailbox": { + "bulkActions": { + "ariaLabel": "Massehandlinger for {{count}} valgte {{emailLabel}}", + "clearSelection": "Ryd markering", + "clearSelectionWithKey": "Ryd markering ({{key}})", + "delete": "Slet", + "deleteTooltip": "Slet valgte e-mails", + "email": "e-mail", + "emails": "e-mails", + "selected": "valgte" }, - "command": { - "typeCommandOrSearch": "Skriv en kommando eller søg...", - "noResultsFound": "Ingen resultater fundet.", - "theme": "Tema", - "light": "Lys", - "dark": "Mørk" + "deleteDialog": { + "confirm": "Slet", + "desc": "Er du sikker på, at du vil slette {{countText}}? Denne handling fjerner de valgte e-mails fra den lokale database. E-mails slettes permanent og kan ikke gendannes.", + "descCountMultiple": "disse {{count}} e-mails", + "descCountSingle": "denne e-mail", + "errorTitle": "Kunne ikke slette meddelelser", + "successDesc": "Meddelelserne er blevet slettet.", + "successTitle": "Meddelelser slettet", + "title": "Slet E-mail", + "warningDesc": "Vær forsigtig, før du fortsætter.", + "warningTitle": "Advarsel!" + }, + "deleteMailboxDialog": { + "confirm": "Slet permanent", + "desc": "Er du sikker på, at du vil slette denne postkassemappe? Denne handling kan ikke fortrydes.", + "errorTitle": "Sletning mislykkedes", + "successDesc": "Postkassemappen og dens indhold er blevet fjernet.", + "successTitle": "Sletning lykkedes", + "title": "Slet postkassemappe", + "warningDesc": "Sletning af denne mappe vil også permanent fjerne alle arkiverede e-mails og undermapper i den.", + "warningTitle": "Advarsel" + }, + "folders": "Mapper", + "messages": "Meddelelser", + "noMessages": "Ingen meddelelser", + "selectFolder": "Vælg en mappe for at se meddelelser", + "thread": { + "empty": "Ingen meddelelser i denne tråd.", + "invalidDate": "Ugyldig dato", + "loadError": "Kunne ikke indlæse tråd", + "loadMore": "Indlæs flere", + "loadingMore": "Indlæser flere...", + "message": "meddelelse", + "messages": "meddelelser", + "noSubject": "(Intet emne)", + "title": "Tråd ({{count}} {{messageLabel}})" + }, + "title": "Mailboks" + }, + "navigation": { + "accessTokens": "Adgangstokens", + "accounts": "Konti", + "apiDocs": "API-dokumentation", + "attachment": "Vedhæftede filer", + "auth": "Godkendelse", + "dashboard": "Oversigt", + "general": "Generelt", + "home": "Hjem", + "mailbox": "Mailboks", + "oauth2": "OAuth2", + "other": "Andet", + "settings": "Indstillinger", + "users": "Systembrugere" + }, + "oauth2": { + "aSecretKeyProvidedByTheOAuthProvider": "En hemmelig nøgle leveret af OAuth-udbyderen for at godkende din applikation.", + "actions": { + "authorize": "Godkend", + "delete": "Slet", + "edit": "Rediger", + "openMenu": "Åbn menu" + }, + "addConfiguration": "Tilføj konfiguration", + "addExtraParams": "Tilføj ekstra parametre", + "addNew": "Tilføj ny", + "addScope": "Tilføj omfang", + "areYouSureYouWantTo": "Er du sikker på, at du vil {{action}} denne OAuth2-klient?", + "areYouSureYouWantToDelete": "Er du sikker på, at du vil slette", + "authAtatus": "OAuth2-godkendelsesstatus", + "authFailed": "OAuth2-godkendelse mislykkedes", + "authSuccess": "OAuth2-godkendelse lykkedes", + "authUrlLabel": "Godkendelses-URL:", + "authorizationUrlCannotBeEmpty": "Godkendelses-URL kan ikke være tom", + "authorizationUrlIsRequired": "Godkendelses-URL er påkrævet", + "authorize": "Godkend", + "authorizeAnEmailAccountToStartTheOAuth2AuthorizationProcess": "Godkend en e-mailkonto for at starte OAuth2-godkendelsesprocessen.", + "authorizeEmailAccount": "Godkend E-mailkonto", + "backToLogin": "Tilbage til login", + "clickSaveWhenDone": "Klik på Gem, når du er færdig.", + "clientId": "Klient-ID", + "clientIdCannotBeEmpty": "Klient-ID kan ikke være tomt", + "clientIdIsRequired": "Klient-ID er påkrævet", + "clientIdLabel": "Klient-ID:", + "clientSecret": "Klienthemmelighed", + "clientSecretCannotBeEmpty": "Klienthemmelighed kan ikke være tom", + "clientSecretIsRequired": "Klienthemmelighed er påkrævet", + "clientSecretLabel": "Klienthemmelighed:", + "createAccount": "Opret konto", + "createNewHere": "Opret ny her.", + "created": "Oprettet", + "creating": "Opretter...", + "creationFailed": "Oprettelse mislykkedes", + "delete": "Slet", + "deleteFailed": "Sletning mislykkedes, prøv venligst igen senere", + "deleteSuccess": "Sletning lykkedes", + "deleteToken": "Slet Token", + "describeThePurposeOfTheOauth2Application": "Beskriv formålet med OAuth2-applikationen", + "description": "Administrerer automatisk hentning, lagring og opdatering af adgangstokens, hvilket sikrer en problemfri og altid klar godkendelsesoplevelse.", + "descriptionLabel": "Beskrivelse:", + "descriptionMustNotExceed255Characters": "Beskrivelse må ikke overstige 255 tegn.", + "disable": "Deaktiver", + "disableOAuth2Client": "Deaktiver OAuth2-klient", + "disabled": "Deaktiveret", + "edit": "Rediger", + "enable": "Aktiver", + "enableOAuth2Client": "Aktiver OAuth2-klient", + "enabled": "Aktiveret", + "enterIdToConfirmDeletion": "Indtast ID for at bekræfte sletning.", + "enterTheAuthorizationUrl": "Indtast godkendelses-URL", + "enterTheKeyHere": "Indtast nøglen her.", + "enterTheScopeHere": "Indtast omfang her.", + "enterTheTokenUrl": "Indtast Token-URL", + "enterTheValueHere": "Indtast værdien her.", + "enterYourClientId": "Indtast dit Klient-ID", + "enterYourClientSecret": "Indtast din klienthemmelighed", + "enterYourRedirectUrl": "Indtast din omdirigerings-URL", + "error": "Fejl", + "getAuthorizeUrlFailed": "Hentning af godkendelses-URL mislykkedes", + "getAuthorizeUrlFailedDesc": "Kunne ikke hente godkendelses-URL, prøv venligst igen senere", + "gmail": "Gmail", + "goHome": "Gå til Hjem", + "goToAccounts": "Gå til Konti", + "id": "ID", + "information": "Information", + "invalidAuthorizationUrlFormat": "Ugyldigt format på godkendelses-URL", + "invalidRedirectUriFormat": "Ugyldigt format på omdirigerings-URI", + "invalidTokenUrlFormat": "Ugyldigt format på Token-URL", + "key": "Nøgle:", + "keyCannotBeEmpty": "Nøgle kan ikke være tom", + "keyIsRequired": "Nøgle er påkrævet", + "leaveEmptyToKeepExistingSecret": "Lad stå tomt for at beholde eksisterende hemmelighed", + "leaveEmptyToKeepTheExistingSecret": "Lad stå tomt for at beholde den eksisterende hemmelighed. Indtast kun en ny værdi, hvis du ønsker at ændre den.", + "loadingAccounts": "Indlæser konti...", + "noConfigurations": "Ingen OAuth2-konfigurationer", + "noConfigurationsDesc": "Du har ikke tilføjet nogen OAuth2-konfigurationer endnu. Tilføj en for at begynde at bruge OAuth2-funktionalitet.", + "noEmailAccountsRegistered": "Ingen e-mailkonti registreret. Opret venligst én.", + "noProxyAvailable": "Ingen proxy tilgængelig", + "noStatus": "Denne side viser resultatet af din OAuth2-godkendelse. Der er i øjeblikket ingen specifik status tilgængelig. Prøv venligst igen, hvis det er nødvendigt.", + "oauth2ClientHasBeenSuccessfully": "OAuth2-klienten er blevet {{action}}.", + "oauth2ClientUpdated": "OAuth2-klient opdateret", + "oauth2DeleteFailed": "Sletning af OAuth2 mislykkedes", + "optional": "Valgfri", + "outlook": "Outlook", + "pleaseBeCareful": "Vær forsigtig, denne handling kan ikke fortrydes.", + "pleaseCreateOne": "Opret venligst én.", + "provider": "Udbyder", + "quickPresets": "Hurtige forudindstillinger:", + "redirectUri": "Omdirigerings-URI", + "redirectUriCannotBeEmpty": "Omdirigerings-URI kan ikke være tom", + "redirectUriIsRequired": "Omdirigerings-URI er påkrævet", + "redirectUrlLabel": "Omdirigerings-URL:", + "save": "Gem", + "saveChanges": "Gem ændringer", + "saving": "Gemmer...", + "scope": "Omfang:", + "scopes": "Omfang (Scopes)", + "selectAProxy": "Vælg en proxy", + "selectAnAccount": "Vælg en konto", + "status": "Status", + "statusUpdateFailed": "Statusopdatering mislykkedes, prøv venligst igen senere", + "success": "Succes", + "successMessage": "Din e-mailkonto er blevet godkendt via OAuth2. Adgangstokenet er blevet gemt af systemet og vil blive opdateret automatisk efter behov.", + "theRedirectUrlAfterAuthorization": "Omdirigerings-URL'en efter godkendelse. Den skal matche den, der er registreret hos OAuth-udbyderen. Brug formatet http://[vært]:[port]/oauth2/callback (eller https://), hvor [vært] og [port] matcher din RustMailer-installation. Stien /oauth2/callback er fast.", + "theUniqueIdentifierForYourApplication": "Den unikke identifikator for din applikation, leveret af OAuth-udbyderen.", + "theUrlUsedToExchange": "URL'en, der bruges til at udveksle godkendelseskoden med en adgangstoken.", + "theUrlWhereUsersWillBeRedirected": "URL'en, hvor brugere vil blive omdirigeret til for at godkende din applikation.", + "thisActionWillPermanentlyRemoveTheOauth2Record": "Denne handling vil permanent fjerne OAuth2-posten fra systemet. Dette kan ikke fortrydes.", + "thisWillPreventTheOAuth2ClientFromBeingUsed": "Dette vil forhindre, at OAuth2-klienten bliver brugt.", + "title": "OAuth2", + "tokenUrlCannotBeEmpty": "Token-URL kan ikke være tom", + "tokenUrlIsRequired": "Token-URL er påkrævet", + "tokenUrlLabel": "Token-URL:", + "tryAgain": "Prøv igen", + "unknownError": "Der opstod en ukendt fejl.", + "updateFailed": "Opdatering mislykkedes", + "updateHere": "Opdater her.", + "updateOrCreationFailed": "{{action}} mislykkedes, prøv venligst igen senere", + "updated": "Opdateret", + "useProxyOptional": "Brug Proxy (valgfri):", + "useSocks5ProxyForOAuthRequests": "Brug SOCKS5-proxy til OAuth-anmodninger, når direkte adgang er blokeret.", + "value": "Værdi:", + "valueCannotBeEmpty": "Værdi kan ikke være tom", + "valueIsRequired": "Værdi er påkrævet", + "warning": "Advarsel!", + "whenDisabled": "Ved deaktivering: - Nye godkendelsesflow afvises øjeblikkeligt - Eksisterende adgangstokens og opdateringstokens tilbagekaldes inden for 1 minut - Brugere skal godkende igen ved genaktivering", + "yourOAuth2ApplicationHasBeenSuccessfully": "Din OAuth2-applikation er blevet {{action}}.", + "yourOAuth2ApplicationHasBeenSuccessfullyDeleted": "Din OAuth2-applikation er blevet slettet." + }, + "permission": { + "account": { + "create": "Oprette e-mailkonti", + "manage": "Administrere tildelte konti", + "manage_all": "Administrere alle kontoindstillinger", + "read_details": "Se kontodetaljer" + }, + "category": { + "account": "Kontotilladelser", + "global_data": "Globale data (Administrator)", + "system_identity": "System og identitet" + }, + "data": { + "delete": "Slette tildelte e-mails", + "delete_all": "Slette e-mails fra alle konti", + "export_batch": "Batch-eksportere tildelte data", + "export_batch_all": "Batch-eksportere alle data", + "import_batch": "Batch-importere e-maildata", + "manage": "Administrere tildelte e-mailmetadata", + "manage_all": "Administrere al e-mailmetadata", + "raw_download": "Downloade tildelte rå e-mails", + "raw_download_all": "Downloade alle rå e-mails", + "read": "Læse tildelte e-maildata", + "read_all": "Læse alle e-maildata", + "smtp_ingest": "Indsend e-mails via SMTP-protokol" + }, + "dialog": { + "account_description": "Tilladelser, der er begrænset til den valgte konto.", + "account_title": "Kontotilladelser", + "global_description": "Systemdækkende tilladelser, der er tildelt denne bruger.", + "global_title": "Globale tilladelser" + }, + "scope": { + "account": "Konto #{{id}}", + "global": "Global" + }, + "system": { + "access": "Grundlæggende systemadgang", + "root": "Fuld systemkontrol" + }, + "token": { + "manage": "Administrere adgangstokens" + }, + "user": { + "manage": "Administrere alle brugere", + "view": "Se grundlæggende brugeroplysninger" + } + }, + "profile": { + "avatar_alt": "Avatar", + "menu": { + "profile": "Profil", + "settings": "Indstillinger", + "sign_out": "Log ud" + } + }, + "proxyDelete": { + "close": "Luk", + "confirmText": "Er du sikker på, at du vil slette", + "deleteBtn": "Slet", + "failedDesc": "Sletning mislykkedes, prøv venligst igen senere", + "failedTitle": "Sletning af Proxy mislykkedes", + "permanent": "Denne handling vil permanent fjerne proxien fra systemet. Dette kan ikke fortrydes.", + "proxyIdLabel": "Proxy-ID:", + "proxyIdPlaceholder": "Indtast Proxy-ID for at bekræfte sletning.", + "successDesc": "Proxy er blevet slettet.", + "successTitle": "Sletning lykkedes", + "title": "Slet Proxy", + "tryAgain": "Prøv igen", + "warningDesc": "Vær forsigtig, denne handling kan ikke fortrydes.", + "warningTitle": "Advarsel!" + }, + "restore_message": { + "accountsInvolved": "Involverede konti", + "bulkTitle": "Gendan flere beskeder", + "bulkWarning": "Bemærk: Beskeder vil blive gendannet til deres oprindelige mapper.", + "confirm": "Udfør gendannelse", + "desc": "Denne handling vil gen-uploade valgte beskeder fra Bichon og gendanne dem til deres tilsvarende postkasser på IMAP-serveren.", + "failed": "Gendannelse mislykkedes", + "failedTitle": "Fejl ved gendannelse", + "messages": "beskeder", + "restore_to_imap": "Gendan besked", + "success": "Gendannelse gennemført", + "successDesc": "De valgte beskeder er blevet gendannet til IMAP-serveren.", + "summary": "Gendannelsesdetaljer", + "title": "Gendan enkelt besked" + }, + "roles": { + "actions": { + "add": "Tilføj rolle", + "cancel": "Annuller", + "close": "Luk", + "failed": "Handlingen mislykkedes", + "retry": "Prøv igen", + "submit_create": "Opret rolle", + "submit_update": "Opdater rolle", + "success_create": "Rolle oprettet", + "success_update": "Rolle opdateret" + }, + "categories": { + "account_resource": "Kontoresource adgang", + "global_data": "Global dataadgang", + "identity": "Identitet & Administration" + }, + "columns": { + "created_at": "Oprettet", + "id": "ID", + "name": "Navn", + "permissions": "Rettigheder", + "role_type": "Type", + "updated_at": "Opdateret" + }, + "delete": { + "alert_desc": "Sletning af denne rolle vil fjerne den fra alle tildelte brugere.", + "alert_title": "Advarsel: Permanent handling.", + "confirm_btn": "Slet rolle", + "confirm_label": "Indtast rolle-ID for at bekræfte:", + "deleting": "Sletter...", + "dialog_title": "Slet rolle", + "error_fallback": "Kunne ikke slette rollen.", + "error_title": "Sletning mislykkedes", + "irreversible": "Denne handling kan ikke fortrydes.", + "placeholder": "Indtast \"{{id}}\"", + "success_desc": "Rollen \"{{name}}\" blev fjernet.", + "success_title": "Rolle slettet", + "warning_text": "Du sletter rollen {{name}} (ID: {{id}}) permanent." + }, + "description_hint": "Definer adgangsomfang og rettigheder.", + "details": { + "close_btn": "Luk", + "desc_account": "Adgang og datahandlinger for individuelle konti.", + "desc_global": "Global administration og systemadgang.", + "role_badge": "{{type}} rolle", + "title": "Rettigheder: {{name}}", + "unknown": "Ukendt rolle", + "view_permissions": "Se detaljer" + }, + "empty": { + "desc": "Du har ikke oprettet nogen brugerdefinerede roller endnu.", + "title": "Ingen roller fundet" + }, + "form": { + "builtin_badge": "Indbygget rolle", + "builtin_desc": "Denne rolle er foruddefineret og skrivebeskyttet.", + "desc_label": "Beskrivelse", + "matrix_label": "Rettighedsmatrix ({{type}})", + "name_label": "Rollenavn", + "type_label": "Rolletype" + }, + "placeholder": { + "filter": "Søg efter roller..." + }, + "title": { + "create": "Opret ny rolle", + "edit": "Rediger rolle: {{name}}" + }, + "types": { + "Account": "Konto", + "Global": "Global" }, "validation": { - "required": "Dette felt er påkrævet", - "invalidEmail": "Ugyldig e-mailadresse", - "invalidUrl": "Ugyldig URL", - "passwordMinLength": "Adgangskoden skal være mindst {{min}} tegn lang", - "pleaseEnterPassword": "Indtast venligst din adgangskode", - "passwordRequired": "Adgangskode er påkrævet, når godkendelsesmetoden er Adgangskode", - "emailRequired": "E-mail er påkrævet", - "imapHostRequired": "IMAP-vært er påkrævet", - "imapHostCannotBeEmpty": "IMAP-vært kan ikke være tom", - "imapPortMustBePositive": "IMAP-port skal være et positivt heltal", - "imapPortMustBeLessThan65536": "IMAP-port skal være mindre end 65536", - "folderLimitMustBeNumber": "Mappegrænse skal være et tal", - "folderLimitMustBeAtLeast100": "Mappegrænse skal være mindst 100", - "incrementalSyncMustBeNumber": "Inkrementelt synkroniseringsinterval skal være et tal", - "incrementalSyncMustBeAtLeast10": "Inkrementelt synkroniseringsinterval skal være mindst 10 minutter", - "pleaseEnterUsernameOrEmail": "Indtast dit brugernavn eller din e-mailadresse", - "singleRequestBatchSizeMustBeNumber": "Batch‑størrelse skal være et tal", - "singleRequestBatchSizeTooSmall": "Batch‑størrelse skal være mindst 10", - "singleRequestBatchSizeTooLarge": "Batch‑størrelse skal være højst 200" - }, - "table": { - "noResults": "Ingen resultater fundet", - "loading": "Indlæser...", - "page": "Side", - "of": "af", - "rowsPerPage": "Rækker pr. side", - "showing": "Viser", - "to": "til", - "results": "resultater", - "asc": "Stigende", - "desc": "Faldende", - "hide": "Skjul", - "edit": "Rediger", - "delete": "Slet", - "pagination": { - "selected": "{{selected}} af {{total}} række(r) valgt.", - "fixed_page_size": "{{size}} rækker pr. side.", - "rows_per_page": "Rækker pr. side", - "page_info": "Side {{page}} af {{total}}", - "first": "Gå til første side", - "previous": "Forrige side", - "next": "Næste side", - "last": "Gå til sidste side" - } - }, - "proxyDelete": { - "title": "Slet Proxy", - "successTitle": "Sletning lykkedes", - "successDesc": "Proxy er blevet slettet.", - "close": "Luk", - "failedTitle": "Sletning af Proxy mislykkedes", - "failedDesc": "Sletning mislykkedes, prøv venligst igen senere", - "tryAgain": "Prøv igen", - "confirmText": "Er du sikker på, at du vil slette", - "permanent": "Denne handling vil permanent fjerne proxien fra systemet. Dette kan ikke fortrydes.", - "proxyIdLabel": "Proxy-ID:", - "proxyIdPlaceholder": "Indtast Proxy-ID for at bekræfte sletning.", - "warningTitle": "Advarsel!", - "warningDesc": "Vær forsigtig, denne handling kan ikke fortrydes.", - "deleteBtn": "Slet" - }, - "systemConfig": { - "pageTitle": "Systemkonfigurationer", - "pageDescription": "Disse parametre initialiseres via CLI-flag eller miljøvariabler. De er skrivebeskyttede.", - "status": { - "enabled": "Aktiveret", - "disabled": "Deaktiveret", - "configured": "Konfigureret", - "missing": "Mangler", - "auto": "Auto", - "notSet": "Ikke angivet" - }, - "sections": { - "network": { - "title": "Netværk", - "desc": "HTTP og offentlig adgang" - }, - "cors": { - "title": "CORS", - "desc": "Adgangsregler for cross-origin" - }, - "logging": { - "title": "Logning", - "desc": "Log-output adfærd" - }, - "storage": { - "title": "Lagring & Cache", - "desc": "Database-stier og grænser" - }, - "security": { - "title": "Sikkerhed", - "desc": "Godkendelse & kryptering" - }, - "performance": { - "title": "Ydeevne", - "desc": "Samtidighed & komprimering" - }, - "smtp": { - "title": "SMTP-server", - "desc": "Indstillinger for modtagelse af indgående post til arkivering i realtid" - } - } - }, - "apiTokens": { - "page": { - "loadError": "Kunne ikke indlæse API-tokens.", - "emptyTitle": "Ingen API-tokens", - "emptyDescription": "Du har ikke oprettet nogen API-tokens endnu. Klik nedenfor for at oprette en.", - "addBtn": "Tilføj token" - }, - "list": { - "unnamedToken": "Navnløst token", - "statusActive": "Aktiv", - "statusExpired": "Udløbet", - "neverExpires": "Udløber aldrig", - "expiresOnShort": "Udløber den {{date}}", - "tokenLabel": "Token", - "createdLabel": "Oprettet", - "lastUsedLabel": "Sidst brugt", - "expiresOnLabel": "Udløber den", - "neverUsed": "Aldrig", - "neverLabel": "Aldrig", - "deleteBtn": "Slet token" - }, - "dialog": { - "createTitle": "Opret adgangstoken", - "editTitle": "Rediger adgangstoken", - "description": "Klik på gem, når du er færdig.", - "save": "Gem", - "saveChanges": "Gem ændringer" - }, - "deleteDialog": { - "title": "Slet adgangstoken?", - "description": "Denne handling kan ikke fortrydes. Enhver applikation, der bruger dette token, mister øjeblikkeligt adgangen.", - "cancel": "Annuller", - "confirm": "Slet", - "deleting": "Sletter..." - }, - "form": { - "nameLabel": "Navn", - "namePlaceholder": "Giv dette token et kort navn", - "nameDescription": "Valgfrit · Max 32 tegn", - "expirationLabel": "Udløb", - "expirationPlaceholder": "Vælg udløb", - "expirationDescription": "Tokens udløber automatisk efter den valgte tid.", - "never": "Aldrig", - "1day": "1 dag", - "7days": "7 dage", - "30days": "30 dage", - "errorMax": "Max 32 tegn", - "errorNumber": "Skal være et tal", - "errorInt": "Skal være et heltal", - "errorPositive": "Skal være større end 0" - }, - "notifications": { - "createSuccess": "Adgangstoken oprettet", - "createSuccessDesc": "Adgangstokenet er blevet oprettet med succes.", - "updateSuccess": "Adgangstoken opdateret", - "updateSuccessDesc": "Adgangstokenet er blevet opdateret med succes.", - "createFailed": "Oprettelse mislykkedes", - "updateFailed": "Opdatering mislykkedes", - "deleteSuccess": "Token slettet", - "deleteFailed": "Kunne ikke slette token", - "copied": "Kopieret til udklipsholder", - "genericError": "Operationen mislykkedes. Prøv igen.", - "close": "Luk", - "tryAgain": "Prøv igen" - } - }, - "permission": { - "scope": { - "global": "Global", - "account": "Konto #{{id}}" - }, - "dialog": { - "global_title": "Globale tilladelser", - "account_title": "Kontotilladelser", - "global_description": "Systemdækkende tilladelser, der er tildelt denne bruger.", - "account_description": "Tilladelser, der er begrænset til den valgte konto." - }, - "category": { - "system_identity": "System og identitet", - "global_data": "Globale data (Administrator)", - "account": "Kontotilladelser" - }, - "system": { - "access": "Grundlæggende systemadgang", - "root": "Fuld systemkontrol" - }, - "user": { - "manage": "Administrere alle brugere", - "view": "Se grundlæggende brugeroplysninger" - }, - "token": { - "manage": "Administrere adgangstokens" - }, - "account": { - "create": "Oprette e-mailkonti", - "manage": "Administrere tildelte konti", - "manage_all": "Administrere alle kontoindstillinger", - "read_details": "Se kontodetaljer" - }, - "data": { - "read": "Læse tildelte e-maildata", - "read_all": "Læse alle e-maildata", - "manage": "Administrere tildelte e-mailmetadata", - "manage_all": "Administrere al e-mailmetadata", - "raw_download": "Downloade tildelte rå e-mails", - "raw_download_all": "Downloade alle rå e-mails", - "delete": "Slette tildelte e-mails", - "delete_all": "Slette e-mails fra alle konti", - "export_batch": "Batch-eksportere tildelte data", - "export_batch_all": "Batch-eksportere alle data", - "import_batch": "Batch-importere e-maildata", - "smtp_ingest": "Indsend e-mails via SMTP-protokol" - } - }, - "users": { - "columns": { - "id": "ID", - "avatar": "Avatar", - "username": "Brugernavn", - "email": "E-mail", - "roles": "Roller & rettigheder", - "created_at": "Oprettet", - "updated_at": "Opdateret", - "actions": "Handlinger" - }, - "buttons": { - "add": "Tilføj bruger", - "add_new": "Ny bruger" - }, - "empty": { - "title": "Ingen brugere fundet", - "description": "Klik på knappen nedenfor for at tilføje din første bruger." - }, - "nav": { - "users": "Brugere", - "roles": "Roller", - "api_tokens": "API-tokens" - }, - "api_tokens": { - "empty": { - "title": "Ingen API-tokens fundet", - "description": "Der er endnu ikke genereret nogen API-tokens i systemet." - }, - "button": { - "generate": "Generer nyt token" - }, - "toolbar": { - "search_placeholder": "Søg efter navn, ejer eller token..." - }, - "table": { - "name": "Navn", - "type": "Type", - "last_used": "Sidst brugt", - "expires_at": "Udløber", - "owner": "Ejer", - "created": "Oprettet", - "api_key": "API-nøgle", - "web_ui": "Web UI", - "never": "Aldrig", - "permanent": "Permanent", - "expired": "Udløbet", - "unnamed": "Unavngivet token" - }, - "unnamed": "Unavngivet token", - "delete": { - "title": "Slet API-token", - "desc": "Du er ved at slette dette API-token permanent", - "prefix": "Token præfiks", - "irreversible": "Denne handling kan ikke fortrydes. Applikationer, der bruger dette token, vil øjeblikkeligt miste adgang.", - "confirm_label": "Indtast {{word}} nedenfor for at bekræfte:", - "confirm_placeholder": "Indtast \"{{word}}\" for at bekræfte", - "warning_title": "Advarsel", - "warning_desc": "Scripts eller tjenester, der bruger dette token, vil fejle. Sørg for at have opdateret dine systemer.", - "confirm_button": "Slet token", - "deleting": "Sletter..." - }, - "toast": { - "deleted_title": "API-token slettet", - "deleted_desc": "Tokenet \"{{name}}\" blev slettet korrekt.", - "delete_failed_title": "Sletning mislykkedes", - "delete_failed": "Kunne ikke slette token, prøv venligst igen." - } - }, - "tokens": { - "schema": { - "name_max": "Maks 32 tegn", - "expire_number": "Skal være et tal", - "expire_int": "Skal være et heltal", - "expire_positive": "Skal være større end 0" - }, - "toast": { - "update_success_title": "Token opdateret", - "update_success_desc": "Adgangstoken blev opdateret.", - "create_success_title": "Token oprettet", - "create_success_desc": "Adgangstoken blev oprettet.", - "update_failed_title": "Opdatering mislykkedes", - "create_failed_title": "Oprettelse mislykkedes" - }, - "error": { - "fallback": "Handlingen mislykkedes, prøv igen senere." - }, - "dialog": { - "edit_title": "Rediger adgangstoken", - "create_title": "Opret adgangstoken", - "description": "Klik på gem når du er færdig." - }, - "fields": { - "name_label": "Navn", - "name_placeholder": "Giv tokenet et kort navn", - "name_hint": "Valgfrit · Maks 32 tegn", - "expire_label": "Udløb", - "expire_placeholder": "Vælg udløb", - "expire_hint": "Tokenet udløber automatisk efter den valgte tid." - }, - "expire_options": { - "never": "Udløber aldrig", - "1_day": "1 dag", - "7_days": "7 dage", - "30_days": "30 dage" - } - }, - "tokens_action": { - "dialog": { - "title": "API-tokens", - "description": "Administrer API-tokens for denne bruger." - }, - "empty": { - "title": "Ingen API-tokens", - "description": "Denne bruger har ingen API-tokens i øjeblikket." - }, - "buttons": { - "add": "Tilføj token" - }, - "list": { - "unnamed_token": "Unavngivet token", - "status_expired": "Udløbet", - "status_active": "Aktiv", - "expires_on_brief": "Udløber {{date}}", - "never_expires": "Udløber aldrig", - "label_token": "Token", - "label_created": "Oprettet", - "label_last_used": "Sidst brugt", - "label_expires_at": "Udløbsdato", - "never": "Aldrig", - "button_delete": "Slet token" - }, - "delete_dialog": { - "title": "Slet adgangstoken?", - "description": "Denne handling kan ikke fortrydes." - } - }, - "actions": { - "schema": { - "account_required": "Vælg venligst en konto", - "role_required": "Vælg venligst en rolle", - "username_required": "Brugernavn er påkrævet", - "username_min": "Mindst 3 tegn", - "username_max": "Højst 32 tegn", - "email_required": "E-mail er påkrævet", - "email_invalid": "Indtast en gyldig e-mail", - "global_role_required": "Tildel mindst én global rolle", - "description_max": "Beskrivelse maks 256 tegn", - "ip_invalid": "Ugyldig IP-adresse", - "password_required": "Adgangskode er påkrævet", - "password_min": "Mindst 8 tegn", - "password_max": "Højst 256 tegn" - }, - "toast": { - "updated": "Bruger opdateret", - "created": "Bruger oprettet" - }, - "dialog": { - "edit_title": "Rediger bruger: {{name}}", - "create_title": "Opret ny bruger", - "subtitle": "Konfigurer identitet, adgangsniveauer og sikkerhed." - }, - "tabs": { - "general": "Generelt", - "permissions": "Kontorettigheder", - "security": "Sikkerhed & ACL" - }, - "sections": { - "basic": "Basis identitet", - "global": "Globale rettigheder", - "mail_access": "E-mail adgangskontrol", - "mail_access_subtitle": "E-mailkonti som denne bruger må administrere.", - "policy": "Politikker" - }, - "fields": { - "username": "Brugernavn", - "username_hint": "Unikt ID til login.", - "email": "E-mailadresse", - "email_hint": "Primær kontakt og notifikationer.", - "password": "Adgangskode", - "password_placeholder_create": "Mindst 8 tegn", - "password_placeholder_edit": "Lad stå tom for at beholde nuværende", - "password_hint_create": "Sikker adgangskode til første opsætning.", - "password_hint_edit": "Indtast kun hvis du vil ændre den.", - "global_roles_hint": "Tildel systemrettigheder.", - "description": "Beskrivelse (valgfrit)", - "description_placeholder": "Notater om brugeren...", - "description_hint": "Interne noter (maks 256 tegn).", - "select_account": "Vælg konto", - "assign_role": "Tildel rolle", - "ip_whitelist": "IP Whitelist", - "ip_whitelist_hint": "Begræns login til disse IP'er (én pr. linje).", - "rate_quota": "Rate kvota", - "burst_interval": "Burst interval (sek)" - }, - "buttons": { - "add_account": "Tilføj konto", - "update": "Opdater bruger", - "create": "Opret bruger" - }, - "states": { - "full_access": "Fuld adgangs-tilstand", - "full_access_desc": "Administratorer har adgang til alle konti som standard.", - "no_accounts": "Ingen specifikke konti tildelt.", - "security_disabled": "Sikkerhedspolitikker er deaktiveret." - }, - "api_tokens": "API-tokens", - "placeholder": { - "filter": "Søg efter brugere..." - }, - "delete": { - "title": "Slet bruger", - "confirm_msg": "Du sletter brugeren {{name}} (ID: {{id}}) permanent.", - "irreversible": "Denne handling kan ikke fortrydes.", - "input_label": "Indtast bruger-ID for at bekræfte:", - "placeholder": "Indtast \"{{id}}\"", - "alert_title": "Advarsel: Permanent handling.", - "alert_desc": "Brugeren og alle tilhørende data vil blive slettet.", - "button_confirm": "Slet bruger", - "button_deleting": "Sletter...", - "toast": { - "success_title": "Bruger slettet", - "success_desc": "Brugeren \"{{name}}\" blev fjernet.", - "failed_title": "Sletning mislykkedes", - "failed_fallback": "Kunne ikke slette brugeren." - } - } - } - }, - "roles": { - "title": { - "create": "Opret ny rolle", - "edit": "Rediger rolle: {{name}}" - }, - "description_hint": "Definer adgangsomfang og rettigheder.", - "form": { - "name_label": "Rollenavn", - "type_label": "Rolletype", - "desc_label": "Beskrivelse", - "matrix_label": "Rettighedsmatrix ({{type}})", - "builtin_badge": "Indbygget rolle", - "builtin_desc": "Denne rolle er foruddefineret og skrivebeskyttet." - }, - "types": { - "Global": "Global", - "Account": "Konto" - }, - "categories": { - "identity": "Identitet & Administration", - "global_data": "Global dataadgang", - "account_resource": "Kontoresource adgang" - }, - "actions": { - "cancel": "Annuller", - "submit_create": "Opret rolle", - "submit_update": "Opdater rolle", - "success_create": "Rolle oprettet", - "success_update": "Rolle opdateret", - "failed": "Handlingen mislykkedes", - "close": "Luk", - "retry": "Prøv igen", - "add": "Tilføj rolle" - }, - "validation": { - "name_required": "Rollenavn er påkrævet", - "perm_required": "Vælg mindst én rettighed" - }, - "columns": { - "id": "ID", - "name": "Navn", - "role_type": "Type", - "permissions": "Rettigheder", - "created_at": "Oprettet", - "updated_at": "Opdateret" - }, - "placeholder": { - "filter": "Søg efter roller..." - }, - "delete": { - "dialog_title": "Slet rolle", - "warning_text": "Du sletter rollen {{name}} (ID: {{id}}) permanent.", - "irreversible": "Denne handling kan ikke fortrydes.", - "confirm_label": "Indtast rolle-ID for at bekræfte:", - "placeholder": "Indtast \"{{id}}\"", - "alert_title": "Advarsel: Permanent handling.", - "alert_desc": "Sletning af denne rolle vil fjerne den fra alle tildelte brugere.", - "confirm_btn": "Slet rolle", - "deleting": "Sletter...", - "success_title": "Rolle slettet", - "success_desc": "Rollen \"{{name}}\" blev fjernet.", - "error_title": "Sletning mislykkedes", - "error_fallback": "Kunne ikke slette rollen." - }, - "details": { - "title": "Rettigheder: {{name}}", - "unknown": "Ukendt rolle", - "role_badge": "{{type}} rolle", - "desc_global": "Global administration og systemadgang.", - "desc_account": "Adgang og datahandlinger for individuelle konti.", - "close_btn": "Luk", - "view_permissions": "Se detaljer" - }, - "empty": { - "title": "Ingen roller fundet", - "desc": "Du har ikke oprettet nogen brugerdefinerede roller endnu." - } - }, - "profile": { - "avatar_alt": "Avatar", - "menu": { - "profile": "Profil", - "settings": "Indstillinger", - "sign_out": "Log ud" - } - }, - "sign_out": { - "title": "Log ud", - "desc": "Er du sikker på, at du vil logge ud? Du skal logge ind igen for at få adgang til din konto.", - "confirm": "Log ud" - }, - "restore_message": { - "title": "Gendan enkelt besked", - "bulkTitle": "Gendan flere beskeder", - "bulkWarning": "Bemærk: Beskeder vil blive gendannet til deres oprindelige mapper.", - "accountsInvolved": "Involverede konti", - "summary": "Gendannelsesdetaljer", - "messages": "beskeder", - "desc": "Denne handling vil gen-uploade valgte beskeder fra Bichon og gendanne dem til deres tilsvarende postkasser på IMAP-serveren.", - "confirm": "Udfør gendannelse", - "restore_to_imap": "Gendan besked", - "success": "Gendannelse gennemført", - "successDesc": "De valgte beskeder er blevet gendannet til IMAP-serveren.", - "failed": "Gendannelse mislykkedes", - "failedTitle": "Fejl ved gendannelse" - }, - "time": { - "label": "Tid", - "since": "Siden", - "before": "Før", - "recent_range": "Seneste interval (siden...)", - "historical": "Historisk interval (før...)", - "absolute_range": "Absolut datointerval", - "last_day": "Seneste 1 dag", - "last_days": "Seneste {{count}} dage", - "last_months": "Seneste {{count}} måneder", - "over_years_ago": "For {{count}} {{unit}} siden", - "year": "år", - "years": "år", - "recent_prefix": "Seneste:", - "days_ago_to_now": "dage siden til nu", - "apply": "Anvend", - "start_date": "Startdato", - "end_date": "Slutdato", - "clear_filters": "Ryd tidsfiltre", - "format": "yyyy-MM-dd" - }, - "tag": { - "label": "Tags", - "search_placeholder": "Søg tags...", - "clear_all": "Ryd alle tags", - "no_tags_found": "Ingen tags fundet" - }, - "search_accounts": { - "label": "Mailkonti", - "search_placeholder": "Søg mailkonti...", - "clear_accounts": "Ryd valgte konti", - "no_accounts_found": "Ingen konti fundet" - }, - "search_mailbox": { - "label": "Postkasser", - "search_placeholder": "Søg postkasser", - "clear_mailboxes": "Ryd valgte mapper", - "select_account_first": "Vælg venligst en mailkonto først", - "no_mailbox_found": "Ingen mappe fundet" - }, - "search_contacts": { - "label": "Kontakter", - "label_with_count": "Kontakter ({{count}})", - "any": "Alle", - "search_placeholder": "Søg i {{field}}...", - "reset_all": "Nulstil alle kontakter", - "no_contact_found": "Ingen kontakter fundet", - "loading": "Indlæser...", - "showing_limit": "Viser kun de første 100 resultater • I alt {{total}}" - }, - "search_more": { - "trigger_label": "Avanceret", - "title": "Avancerede filtre", - "reset": "Nulstil", - "has_attachment": "Har vedhæftning", - "attachment_name_label": "Navn på vedhæftning", - "attachment_name_placeholder": "F.eks.: invoice.pdf", - "message_size_label": "Mailstørrelse", - "message_id_label": "Original Message-ID", - "message_id_description": "Søg via Message-ID i mailheaderen", - "apply": "Anvend filtre", - "size_presets": { - "any": "Alle størrelser", - "tiny": "Meget lille (< 15 KB)", - "small": "Lille (< 2 MB)", - "medium": "Mellem (2 – 10 MB)", - "large": "Stor (10 – 20 MB)", - "huge": "Meget stor (> 20 MB)" - }, - "any": "Alle", - "search_placeholder": "Søg {{field}}...", - "extension": "Filendelse", - "category": "Vedhæftningskategori", - "content_types": "Specifik type" - }, - "search_view": { - "button_label": "Visning", - "menu_title": "Indstillinger for kolonner" - }, - "search_reset": { - "label": "Nulstil", - "tooltip": "Ryd alle filtre" - }, - "search_input": { - "placeholder": "Søg i e-mails... (Regex understøttes)", - "button": "Søg", - "recent_title": "Seneste søgninger", - "clear_history": "Ryd historik", - "no_history": "Ingen søgehistorik", - "all": "Alle", - "all_fields_desc": "Matcher emne, indhold, afsender og modtagere", - "subject": "Emne", - "body": "Indhold" + "name_required": "Rollenavn er påkrævet", + "perm_required": "Vælg mindst én rettighed" } + }, + "search": { + "account": "Konto", + "addEmailAccount": "Tilføj e-mailkonto", + "addTags": { + "cancel": "Annuller", + "createHint": "Opret ny etiket: {{tag}}", + "invalidTitle": "Ugyldig etiket", + "none": "Ingen etiketter tilføjet", + "save": "Gem", + "saving": "Gemmer...", + "searchPlaceholder": "Søg eller opret etiket...", + "selectedCount": "{{count}} etiketter valgt", + "title": "Rediger Etiketter", + "tryAgain": "Prøv venligst igen senere", + "updateFailedTitle": "Opdatering mislykkedes", + "updatedDesc": "Etiketterne er blevet opdateret", + "updatedTitle": "Etiketter opdateret" + }, + "adjustSearch": "Prøv at justere dine søgekriterier eller ryd filtre.", + "advanced": "Avanceret", + "advancedFilters": "Avancerede filtre", + "any": "Alle", + "attachmentName": "Vedhæftningsfilnavn", + "attachmentsSize": "Vedhæftninger & Størrelse", + "bcc": "Blindkopi (BCC)", + "before": "Før:", + "bulkActions": { + "ariaLabel": "{{count}} meddelelser valgt. Værktøjslinje", + "clear": "Ryd valg", + "delete": "Slet", + "deleteDesc": "Slet valgte meddelelser", + "manageTags": "Administrer tags", + "selected": "{{count}} valgt" + }, + "cc": "Kopi (CC)", + "clear": "Ryd", + "date": "Dato", + "dateRange": "Datointerval", + "delete": { + "confirmButton": "Slet", + "confirmDetail": "Denne handling kan ikke fortrydes.", + "confirmPrefix": "Er du sikker på, at du vil slette", + "countLabel": "{{count}} meddelelse(r)?", + "errorTitle": "Sletning mislykkedes", + "successDesc": "Meddelelserne er blevet slettet.", + "successTitle": "Slettet", + "title": "Slet meddelelser", + "warningDesc": "Slettede meddelelser kan ikke gendannes.", + "warningTitle": "Advarsel" + }, + "editTag": "Rediger etiket", + "endDate": "Slutdato", + "from": "Fra", + "fullTextMultiAccount": "Fuldtekst · Flere konti · Avancerede filtre", + "hasAttachment": "Har vedhæftning", + "huge": "Kæmpestor (≥20 MB)", + "keyword": "Søgeord", + "large": "Stor (10 - 20 MB)", + "mailbox": "Mailboks", + "maxSize": "Maks. størrelse", + "maximumBytes": "Maksimum", + "medium": "Mellem (2 - 10 MB)", + "messageId": "Meddelelses-ID", + "minSize": "Min. størrelse", + "minimumBytes": "Minimum", + "no": "Nej", + "noActiveEmailAccount": "Ingen aktiv e-mailkonto.", + "noEmailsFound": "Ingen e-mails fundet", + "noMailboxSelectAccount": "Ingen mailboks. Vælg venligst en konto først.", + "originalMessageIdHeader": "Original Message-ID header for e-mailen", + "pleaseSelectAtLeastOne": "Vælg venligst mindst ét søgekriterie", + "preview": "Forhåndsvisning", + "recipient": "Modtager", + "searchArchivedEmails": "Søg i arkiverede e-mails", + "searchButton": "Søg", + "searchInSubjectBody": "Søg i emne, indhold, vedhæftninger...", + "searching": "Søger, vent venligst...", + "searchingButton": "Søger...", + "selectAccount": "Vælg konto", + "selectDate": "Vælg en dato", + "selectMailbox": "Vælg mailboks", + "sender": "Afender", + "senderRecipients": "Afsendere / Modtagere", + "since": "Siden:", + "size": "Størrelse", + "sizeDescription": "Størrelsen henviser til den samlede e-mailstørrelse, inklusive vedhæftede filer.", + "small": "Lille (<2 MB)", + "sort": "Sortér", + "source": "Kilde", + "startDate": "Startdato", + "startSearching": "Begynd med at indtaste et søgeord, afsender eller brug avancerede filtre.", + "subject": "Emne", + "tagFilter": "Etiketfilter", + "thread": { + "empty": "Ingen meddelelser i denne tråd", + "error": "Kunne ikke indlæse tråd", + "invalidDate": "Ugyldig dato", + "loadMore": "Indlæs mere", + "loadingMore": "Indlæser...", + "noSubject": "(Intet emne)", + "title": "Tråd · {{count}} meddelelser" + }, + "tiny": "Meget lille (<15 KB)", + "title": "Søg", + "to": "Til", + "updateTags": { + "actionAdd": "Tilføj", + "actionOverwrite": "Overskriv", + "actionRemove": "Fjern", + "cancel": "Annuller", + "createHint": "Tryk på Enter for at oprette nyt tag: \"{{tag}}\"", + "invalidTitle": "Ugyldigt tag", + "none": "Ingen tags valgt", + "overwriteWarning": "Advarsel: Dette vil overskrive alle eksisterende tags på de valgte elementer.", + "savingAdd": "Tilføjer...", + "savingOverwrite": "Overskriver...", + "savingRemove": "Fjerner...", + "searchPlaceholder": "Søg eller opret nyt tag...", + "selectedCount": "{{count}} tag(s) vil blive anvendt", + "submitAdd": "Tilføj tags", + "submitOverwrite": "Overskriv tags", + "submitRemove": "Fjern tags", + "title": "Opdater tags", + "tryAgain": "Prøv venligst igen senere.", + "updateFailedTitle": "Opdatering fejlede", + "updatedDesc": "Tags er blevet opdateret korrekt.", + "updatedTitle": "Tags opdateret" + }, + "yes": "Ja" + }, + "search_accounts": { + "clear_accounts": "Ryd valgte konti", + "label": "Mailkonti", + "no_accounts_found": "Ingen konti fundet", + "search_placeholder": "Søg mailkonti..." + }, + "search_contacts": { + "any": "Alle", + "label": "Kontakter", + "label_with_count": "Kontakter ({{count}})", + "loading": "Indlæser...", + "no_contact_found": "Ingen kontakter fundet", + "reset_all": "Nulstil alle kontakter", + "search_placeholder": "Søg i {{field}}...", + "showing_limit": "Viser kun de første 100 resultater • I alt {{total}}" + }, + "search_input": { + "all": "Alle", + "all_fields_desc": "Matcher emne, indhold, afsender og modtagere", + "body": "Indhold", + "button": "Søg", + "clear_history": "Ryd historik", + "no_history": "Ingen søgehistorik", + "placeholder": "Søg efter e-mails (brug \" \" til frasesøgning)", + "recent_title": "Seneste søgninger", + "subject": "Emne" + }, + "search_mailbox": { + "clear_mailboxes": "Ryd valgte mapper", + "label": "Postkasser", + "no_mailbox_found": "Ingen mappe fundet", + "search_placeholder": "Søg postkasser", + "select_account_first": "Vælg venligst en mailkonto først" + }, + "search_more": { + "any": "Alle", + "apply": "Anvend filtre", + "attachment_name_label": "Navn på vedhæftning", + "attachment_name_placeholder": "F.eks.: invoice.pdf", + "category": "Vedhæftningskategori", + "content_type": "Filtype", + "extension": "Filendelse", + "has_attachment": "Har vedhæftning", + "is_message": "Vedhæftet fil i e-mail-format", + "is_message_desc": "Denne vedhæftede fil er en mailfil, f.eks. en .eml-fil.", + "message_id_description": "Søg via Message-ID i mailheaderen", + "message_id_label": "Original Message-ID", + "message_size_label": "Mailstørrelse", + "reset": "Nulstil", + "search_placeholder": "Søg {{field}}...", + "size_presets": { + "any": "Alle størrelser", + "huge": "Meget stor (> 20 MB)", + "large": "Stor (10 – 20 MB)", + "medium": "Mellem (2 – 10 MB)", + "small": "Lille (< 2 MB)", + "tiny": "Meget lille (< 15 KB)" + }, + "title": "Avancerede filtre", + "trigger_label": "Avanceret" + }, + "search_reset": { + "label": "Nulstil", + "tooltip": "Ryd alle filtre" + }, + "search_view": { + "button_label": "Visning", + "menu_title": "Indstillinger for kolonner" + }, + "settings": { + "accounts": "Konti", + "acl": "ACL", + "actions": "Handlinger", + "add": "Tilføj", + "addNewProxyHere": "Tilføj ny proxy her. ", + "adding": "Tilføjer...", + "appearance": { + "button": { + "update": "Opdater indstillinger" + }, + "command": { + "no_results": "Intet sprog fundet.", + "search": "Søg efter sprog..." + }, + "description": { + "language": "Vælg det sprog, der skal bruges i webbrugerfladen.", + "theme": "Vælg mellem lys eller mørk tilstand for brugerfladen." + }, + "field": { + "language": "Grænsefladesprog", + "theme": "Grænsefladetema" + }, + "placeholder": { + "select_language": "Vælg sprog" + }, + "theme": { + "dark": "Mørk", + "light": "Lys" + }, + "title": "Udseende", + "validation": { + "language": { + "required": "Vælg venligst et sprog." + }, + "theme": { + "required": "Vælg venligst et tema." + } + } + }, + "authUrl": "Godkendelses-URL", + "changePasswordForFutureLogins": "Skift adgangskode til fremtidige logins.", + "confirmReset": "Bekræft Nulstilling", + "createdAt": "Oprettet", + "delete": "Slet", + "description": "Beskrivelse", + "edit": "Rediger", + "enabled": "Aktiveret", + "enterNewRootPassword": "Indtast ny Root-adgangskode", + "enterProxyIdToConfirmDeletion": "Indtast Proxy-ID for at bekræfte sletning.", + "failedToCopyText": "Kunne ikke kopiere tekst", + "filterAccessToken": "Filtrer Adgangstoken...", + "filterAccount": "Filtrer Konto...", + "filterOauth2": "Filtrer OAuth2...", + "filterProxy": "Filtrer Proxy...", + "general": "Generelt", + "generateNewToken": "Generer nyt token, det gamle udløber øjeblikkeligt.", + "host": "Vært", + "id": "Id", + "invalidPassword": "Ugyldig adgangskode", + "lastAccess": "Sidste adgang", + "manageRootTokenAndPassword": "Administrer sikkert root-token og adgangskode.", + "name": "Navn", + "noProxies": "Ingen proxyer", + "noProxiesDesc": "Du har ikke tilføjet nogen proxy-konfigurationer endnu. Tilføj en for at begynde at bruge proxy-funktionalitet.", + "password": "Adgangskode", + "pleaseUseAnIpAddressForBetterReliability": "Brug venligst en IP-adresse (f.eks. 127.0.0.1) i stedet for et værtsnavn eller domæne for bedre pålidelighed.", + "port": "Port", + "profile": { + "account": { + "id": "Konto-ID: {{id}}" + }, + "avatarAlt": "Avatar", + "button": { + "permissions": "Tilladelser", + "update_profile": "Opdater profil", + "view_global_permissions": "Se globale tilladelser" + }, + "field": { + "email": "E-mail", + "password": "Adgangskode", + "username": "Brugernavn" + }, + "loadError": "Kunne ikke indlæse brugeroplysninger.", + "maxSize": "Op til {{size}}", + "placeholder": { + "password_keep": "Lad feltet være tomt for at beholde nuværende adgangskode" + }, + "removeAvatar": "Fjern avatar", + "section": { + "accounts": "{{count}} tilknyttede konti", + "roles": "Roller" + }, + "toast": { + "update_failed": "Kunne ikke opdatere profilen", + "updated": "Profilen blev opdateret" + }, + "uploadError": "Fejl ved filupload", + "uploadTitle": "Upload avatar", + "validation": { + "email": { + "invalid": "Indtast en gyldig e-mailadresse", + "required": "E-mail er påkrævet" + }, + "password": { + "max": "Adgangskoden må højst være 256 tegn", + "min": "Adgangskoden skal være mindst 8 tegn" + }, + "username": { + "max": "Brugernavnet må højst være 32 tegn", + "min": "Brugernavnet skal være mindst 5 tegn", + "required": "Brugernavn er påkrævet" + } + } + }, + "proxy": "Proxy", + "proxyUpdateOrAddFailed": "{{action}} mislykkedes, prøv venligst igen senere", + "reset": "Nulstil", + "resetRootPassword": "Nulstil Root-adgangskode", + "resetRootToken": "Nulstil Root-token", + "root": "Root", + "rootAccessManagement": "Root-adgangsstyring", + "rootDesc": "Administrer root-adgangsoplysninger, herunder token og adgangskode.", + "rootPasswordMustBeAtLeast6Characters": "Root-adgangskoden skal være mindst 6 tegn lang.", + "rootTitle": "Root", + "selectAll": "Vælg alle", + "sidebar": { + "apiTokens": "API-tokens", + "configurations": "Systemkonfigurationer", + "profile": "Profil", + "proxy": "Netværksproxy" + }, + "theRootPasswordHasBeenReset": "Root-adgangskoden er blevet nulstillet", + "theRootTokenHasBeenReset": "Root-tokenet er blevet nulstillet", + "theme": "Tema", + "title": "Indstillinger", + "token": "Token", + "tokenUrl": "Token-URL", + "type": "Type", + "updateTheProxyHere": "Opdater proxien her. ", + "updatedAt": "Opdateret", + "url": "Url", + "useNewPasswordForNextLogin": "Brug den nye adgangskode til næste login.", + "useProxy": "Brug Proxy", + "username": "Brugernavn", + "youAreAboutToResetTheRootPassword": "Du er ved at nulstille root-adgangskoden. Sørg for at opbevare den sikkert.", + "youAreAboutToResetTheRootToken": "Du er ved at nulstille root-tokenet. Denne handling kan ikke fortrydes.", + "yourLoginInformationHasBeenUpdated": "Dine loginoplysninger er blevet opdateret. Du behøver ikke at logge ind igen.", + "yourProxyHasBeenSuccessfully": "Din proxy er blevet {{action}}." + }, + "sign_out": { + "confirm": "Log ud", + "desc": "Er du sikker på, at du vil logge ud? Du skal logge ind igen for at få adgang til din konto.", + "title": "Log ud" + }, + "systemConfig": { + "pageDescription": "Disse parametre initialiseres via CLI-flag eller miljøvariabler. De er skrivebeskyttede.", + "pageTitle": "Systemkonfigurationer", + "sections": { + "cors": { + "desc": "Adgangsregler for cross-origin", + "title": "CORS" + }, + "logging": { + "desc": "Log-output adfærd", + "title": "Logning" + }, + "network": { + "desc": "HTTP og offentlig adgang", + "title": "Netværk" + }, + "performance": { + "desc": "Samtidighed & komprimering", + "title": "Ydeevne" + }, + "security": { + "desc": "Godkendelse & kryptering", + "title": "Sikkerhed" + }, + "smtp": { + "desc": "Indstillinger for modtagelse af indgående post til arkivering i realtid", + "title": "SMTP-server" + }, + "storage": { + "desc": "Database-stier og grænser", + "title": "Lagring & Cache" + } + }, + "status": { + "auto": "Auto", + "configured": "Konfigureret", + "disabled": "Deaktiveret", + "enabled": "Aktiveret", + "missing": "Mangler", + "notSet": "Ikke angivet" + } + }, + "table": { + "asc": "Stigende", + "delete": "Slet", + "desc": "Faldende", + "edit": "Rediger", + "hide": "Skjul", + "loading": "Indlæser...", + "noResults": "Ingen resultater fundet", + "of": "af", + "page": "Side", + "pagination": { + "first": "Gå til første side", + "fixed_page_size": "{{size}} rækker pr. side.", + "last": "Gå til sidste side", + "next": "Næste side", + "page_info": "Side {{page}} af {{total}}", + "previous": "Forrige side", + "rows_per_page": "Rækker pr. side", + "selected": "{{selected}} af {{total}} række(r) valgt." + }, + "results": "resultater", + "rowsPerPage": "Rækker pr. side", + "showing": "Viser", + "to": "til" + }, + "tag": { + "clear_all": "Ryd alle tags", + "label": "Tags", + "no_tags_found": "Ingen tags fundet", + "search_placeholder": "Søg tags..." + }, + "time": { + "absolute_range": "Absolut datointerval", + "apply": "Anvend", + "before": "Før", + "clear_filters": "Ryd tidsfiltre", + "days_ago_to_now": "dage siden til nu", + "end_date": "Slutdato", + "format": "yyyy-MM-dd", + "historical": "Historisk interval (før...)", + "label": "Tid", + "last_day": "Seneste 1 dag", + "last_days": "Seneste {{count}} dage", + "last_months": "Seneste {{count}} måneder", + "over_years_ago": "For {{count}} {{unit}} siden", + "recent_prefix": "Seneste:", + "recent_range": "Seneste interval (siden...)", + "since": "Siden", + "start_date": "Startdato", + "year": "år", + "years": "år" + }, + "users": { + "actions": { + "api_tokens": "API-tokens", + "buttons": { + "add_account": "Tilføj konto", + "create": "Opret bruger", + "update": "Opdater bruger" + }, + "delete": { + "alert_desc": "Brugeren og alle tilhørende data vil blive slettet.", + "alert_title": "Advarsel: Permanent handling.", + "button_confirm": "Slet bruger", + "button_deleting": "Sletter...", + "confirm_msg": "Du sletter brugeren {{name}} (ID: {{id}}) permanent.", + "input_label": "Indtast bruger-ID for at bekræfte:", + "irreversible": "Denne handling kan ikke fortrydes.", + "placeholder": "Indtast \"{{id}}\"", + "title": "Slet bruger", + "toast": { + "failed_fallback": "Kunne ikke slette brugeren.", + "failed_title": "Sletning mislykkedes", + "success_desc": "Brugeren \"{{name}}\" blev fjernet.", + "success_title": "Bruger slettet" + } + }, + "dialog": { + "create_title": "Opret ny bruger", + "edit_title": "Rediger bruger: {{name}}", + "subtitle": "Konfigurer identitet, adgangsniveauer og sikkerhed." + }, + "fields": { + "assign_role": "Tildel rolle", + "burst_interval": "Burst interval (sek)", + "description": "Beskrivelse (valgfrit)", + "description_hint": "Interne noter (maks 256 tegn).", + "description_placeholder": "Notater om brugeren...", + "email": "E-mailadresse", + "email_hint": "Primær kontakt og notifikationer.", + "global_roles_hint": "Tildel systemrettigheder.", + "ip_whitelist": "IP Whitelist", + "ip_whitelist_hint": "Begræns login til disse IP'er (én pr. linje).", + "password": "Adgangskode", + "password_hint_create": "Sikker adgangskode til første opsætning.", + "password_hint_edit": "Indtast kun hvis du vil ændre den.", + "password_placeholder_create": "Mindst 8 tegn", + "password_placeholder_edit": "Lad stå tom for at beholde nuværende", + "rate_quota": "Rate kvota", + "select_account": "Vælg konto", + "username": "Brugernavn", + "username_hint": "Unikt ID til login." + }, + "placeholder": { + "filter": "Søg efter brugere..." + }, + "schema": { + "account_required": "Vælg venligst en konto", + "description_max": "Beskrivelse maks 256 tegn", + "email_invalid": "Indtast en gyldig e-mail", + "email_required": "E-mail er påkrævet", + "global_role_required": "Tildel mindst én global rolle", + "ip_invalid": "Ugyldig IP-adresse", + "password_max": "Højst 256 tegn", + "password_min": "Mindst 8 tegn", + "password_required": "Adgangskode er påkrævet", + "role_required": "Vælg venligst en rolle", + "username_max": "Højst 32 tegn", + "username_min": "Mindst 3 tegn", + "username_required": "Brugernavn er påkrævet" + }, + "sections": { + "basic": "Basis identitet", + "global": "Globale rettigheder", + "mail_access": "E-mail adgangskontrol", + "mail_access_subtitle": "E-mailkonti som denne bruger må administrere.", + "policy": "Politikker" + }, + "states": { + "full_access": "Fuld adgangs-tilstand", + "full_access_desc": "Administratorer har adgang til alle konti som standard.", + "no_accounts": "Ingen specifikke konti tildelt.", + "security_disabled": "Sikkerhedspolitikker er deaktiveret." + }, + "tabs": { + "general": "Generelt", + "permissions": "Kontorettigheder", + "security": "Sikkerhed & ACL" + }, + "toast": { + "created": "Bruger oprettet", + "updated": "Bruger opdateret" + } + }, + "api_tokens": { + "button": { + "generate": "Generer nyt token" + }, + "delete": { + "confirm_button": "Slet token", + "confirm_label": "Indtast {{word}} nedenfor for at bekræfte:", + "confirm_placeholder": "Indtast \"{{word}}\" for at bekræfte", + "deleting": "Sletter...", + "desc": "Du er ved at slette dette API-token permanent", + "irreversible": "Denne handling kan ikke fortrydes. Applikationer, der bruger dette token, vil øjeblikkeligt miste adgang.", + "prefix": "Token præfiks", + "title": "Slet API-token", + "warning_desc": "Scripts eller tjenester, der bruger dette token, vil fejle. Sørg for at have opdateret dine systemer.", + "warning_title": "Advarsel" + }, + "empty": { + "description": "Der er endnu ikke genereret nogen API-tokens i systemet.", + "title": "Ingen API-tokens fundet" + }, + "table": { + "api_key": "API-nøgle", + "created": "Oprettet", + "expired": "Udløbet", + "expires_at": "Udløber", + "last_used": "Sidst brugt", + "name": "Navn", + "never": "Aldrig", + "owner": "Ejer", + "permanent": "Permanent", + "type": "Type", + "unnamed": "Unavngivet token", + "web_ui": "Web UI" + }, + "toast": { + "delete_failed": "Kunne ikke slette token, prøv venligst igen.", + "delete_failed_title": "Sletning mislykkedes", + "deleted_desc": "Tokenet \"{{name}}\" blev slettet korrekt.", + "deleted_title": "API-token slettet" + }, + "toolbar": { + "search_placeholder": "Søg efter navn, ejer eller token..." + }, + "unnamed": "Unavngivet token" + }, + "buttons": { + "add": "Tilføj bruger", + "add_new": "Ny bruger" + }, + "columns": { + "actions": "Handlinger", + "avatar": "Avatar", + "created_at": "Oprettet", + "email": "E-mail", + "id": "ID", + "roles": "Roller & rettigheder", + "updated_at": "Opdateret", + "username": "Brugernavn" + }, + "empty": { + "description": "Klik på knappen nedenfor for at tilføje din første bruger.", + "title": "Ingen brugere fundet" + }, + "nav": { + "api_tokens": "API-tokens", + "roles": "Roller", + "users": "Brugere" + }, + "tokens": { + "dialog": { + "create_title": "Opret adgangstoken", + "description": "Klik på gem når du er færdig.", + "edit_title": "Rediger adgangstoken" + }, + "error": { + "fallback": "Handlingen mislykkedes, prøv igen senere." + }, + "expire_options": { + "1_day": "1 dag", + "30_days": "30 dage", + "7_days": "7 dage", + "never": "Udløber aldrig" + }, + "fields": { + "expire_hint": "Tokenet udløber automatisk efter den valgte tid.", + "expire_label": "Udløb", + "expire_placeholder": "Vælg udløb", + "name_hint": "Valgfrit · Maks 32 tegn", + "name_label": "Navn", + "name_placeholder": "Giv tokenet et kort navn" + }, + "schema": { + "expire_int": "Skal være et heltal", + "expire_number": "Skal være et tal", + "expire_positive": "Skal være større end 0", + "name_max": "Maks 32 tegn" + }, + "toast": { + "create_failed_title": "Oprettelse mislykkedes", + "create_success_desc": "Adgangstoken blev oprettet.", + "create_success_title": "Token oprettet", + "update_failed_title": "Opdatering mislykkedes", + "update_success_desc": "Adgangstoken blev opdateret.", + "update_success_title": "Token opdateret" + } + }, + "tokens_action": { + "buttons": { + "add": "Tilføj token" + }, + "delete_dialog": { + "description": "Denne handling kan ikke fortrydes.", + "title": "Slet adgangstoken?" + }, + "dialog": { + "description": "Administrer API-tokens for denne bruger.", + "title": "API-tokens" + }, + "empty": { + "description": "Denne bruger har ingen API-tokens i øjeblikket.", + "title": "Ingen API-tokens" + }, + "list": { + "button_delete": "Slet token", + "expires_on_brief": "Udløber {{date}}", + "label_created": "Oprettet", + "label_expires_at": "Udløbsdato", + "label_last_used": "Sidst brugt", + "label_token": "Token", + "never": "Aldrig", + "never_expires": "Udløber aldrig", + "status_active": "Aktiv", + "status_expired": "Udløbet", + "unnamed_token": "Unavngivet token" + } + } + }, + "validation": { + "emailRequired": "E-mail er påkrævet", + "folderLimitMustBeAtLeast100": "Mappegrænse skal være mindst 100", + "folderLimitMustBeNumber": "Mappegrænse skal være et tal", + "imapHostCannotBeEmpty": "IMAP-vært kan ikke være tom", + "imapHostRequired": "IMAP-vært er påkrævet", + "imapPortMustBeLessThan65536": "IMAP-port skal være mindre end 65536", + "imapPortMustBePositive": "IMAP-port skal være et positivt heltal", + "incrementalSyncMustBeAtLeast10": "Inkrementelt synkroniseringsinterval skal være mindst 10 minutter", + "incrementalSyncMustBeNumber": "Inkrementelt synkroniseringsinterval skal være et tal", + "invalidEmail": "Ugyldig e-mailadresse", + "invalidUrl": "Ugyldig URL", + "passwordMinLength": "Adgangskoden skal være mindst {{min}} tegn lang", + "passwordRequired": "Adgangskode er påkrævet, når godkendelsesmetoden er Adgangskode", + "pleaseEnterPassword": "Indtast venligst din adgangskode", + "pleaseEnterUsernameOrEmail": "Indtast dit brugernavn eller din e-mailadresse", + "required": "Dette felt er påkrævet", + "singleRequestBatchSizeMustBeNumber": "Batch‑størrelse skal være et tal", + "singleRequestBatchSizeTooLarge": "Batch‑størrelse skal være højst 200", + "singleRequestBatchSizeTooSmall": "Batch‑størrelse skal være mindst 10" + } } \ No newline at end of file diff --git a/web/src/locales/de.json b/web/src/locales/de.json index a86c150..c4e5631 100644 --- a/web/src/locales/de.json +++ b/web/src/locales/de.json @@ -1,1614 +1,1630 @@ { - "common": { - "submit": "Absenden", + "accessTokens": { + "aListOfIpAddressesAllowed": "Eine Liste von erlaubten IP-Adressen für den Zugriff auf die Ressource. Geben Sie eine IP pro Zeile ein. (Optional)", + "accountId": "Konto-ID", + "accounts": "Konten", + "aclRulesForAccessTokens": "ACL-Regeln für Zugriffstoken umfassen die Überprüfung der IP-Whitelist und die Anwendung der Ratenbegrenzung.", + "actions": { + "delete": "Löschen", + "edit": "Bearbeiten", + "openMenu": "Menü öffnen" + }, + "addNew": "Neu hinzufügen", + "atLeastOneAccountIsRequired": "Mindestens ein Konto ist erforderlich.", + "create": "Erstellen", + "createNewAccessTokenHere": "Erstellen Sie hier ein neues Zugriffstoken.", + "created": "Erstellt", + "createdAt": "Erstellt am", + "creating": "Wird erstellt...", + "creationFailed": "Erstellung fehlgeschlagen", + "delete": "Löschen", + "describeThePurposeOfTheAccessToken": "Beschreiben Sie den Zweck des Zugriffstokens", + "description": "Verwalten Sie hier Zugriffstoken, deren ACL-Regeln, IP-Whitelist und Ratenbegrenzungseinstellungen.", + "descriptionMustNotExceed255Characters": "Die Beschreibung darf 255 Zeichen nicht überschreiten.", + "edit": "Bearbeiten", + "editToken": "Token bearbeiten", + "enterIntervalInSeconds": "Intervall in Sekunden eingeben, z.B. 60", + "enterOneIpAddressPerLine": "Geben Sie eine IP-Adresse pro Zeile ein, z.B.:\n192.168.1.1\n192.168.1.2", + "enterQuota": "Quote eingeben, z.B. 100", + "expiresAt": "Läuft ab am", + "filterByEmailAddressOrAccountId": "Nach E-Mail-Adresse oder Konto-ID filtern...", + "interval": "Intervall", + "intervalMustBeAPositiveInteger": "Das Intervall muss eine positive ganze Zahl sein.", + "invalidIpAddressesFound": "Ungültige IP-Adressen gefunden. Bitte geben Sie gültige IPv4- oder IPv6-Adressen ein.", + "name": "Name", + "noTokens": "Keine Zugriffstoken", + "noTokensDesc": "Sie haben noch keine Zugriffstoken erstellt. Erstellen Sie eines, um API-Funktionen zu nutzen.", + "notUsedYet": "Noch nicht verwendet", + "quota": "Quote", + "quotaMustBeAPositiveInteger": "Die Quote muss eine positive ganze Zahl sein.", + "save": "Speichern", + "saveChanges": "Änderungen speichern", + "saving": "Wird gespeichert...", + "selectAccounts": "Konten auswählen", + "selectMultipleAccountsForTheAccessToken": "Wählen Sie mehrere Konten für den Geltungsbereich des Zugriffstokens aus.", + "theListOfAccountsThatCanBeQueried": "Die Liste der Konten, die mit dem Zugriffstoken abgefragt werden können.", + "theMaximumNumberOfRequestsAllowed": "Die maximale Anzahl von Anfragen, die innerhalb des Intervalls erlaubt sind. (Optional)", + "theTimeWindowForTheRateLimit": "Das Zeitfenster (in Sekunden) für die Ratenbegrenzung. (Optional)", + "title": "Zugriffstoken", + "token": "Token", + "updateFailed": "Aktualisierung fehlgeschlagen", + "updateOrCreationFailed": "{{action}} fehlgeschlagen, bitte versuchen Sie es später erneut", + "updateTheAccessTokenHere": "Aktualisieren Sie das Zugriffstoken hier.", + "updated": "Aktualisiert", + "updating": "Wird aktualisiert...", + "yourAccessTokenHasBeenSuccessfully": "Ihr Zugriffstoken wurde erfolgreich {{action}}." + }, + "accounts": { + "accessControl": "Zugriffskontrolle", + "accessTokenCopiedToClipboard": "Zugriffstoken in die Zwischenablage kopiert", + "access_control": { + "buttons": { "cancel": "Abbrechen", - "save": "Speichern", - "save_changes": "Änderungen speichern", - "delete": "Löschen", - "edit": "Bearbeiten", - "search": "Suche", - "add": "Hinzufügen", - "remove": "Entfernen", - "create": "Erstellen", - "update": "Aktualisieren", - "confirm": "Bestätigen", + "save": "Zuweisung speichern" + }, + "description": "Rollen und autorisierte Benutzer für {{email}} zuweisen", + "role_label": "Zugriffsrolle", + "role_loading": "Rollen werden geladen...", + "role_placeholder": "Rolle auswählen", + "title": "Kontozugriffszuweisung", + "toast": { + "failed_title": "Zuweisung fehlgeschlagen", + "success_desc": "Berechtigungen wurden erfolgreich für {{email}} zugewiesen", + "success_title": "Zuweisung erfolgreich" + }, + "user_empty": "Keine Benutzer gefunden", + "user_label": "Autorisierte Benutzer auswählen", + "user_search_placeholder": "Suche nach Benutzername oder E-Mail...", + "user_selected_count": "Ausgewählt: {{count}} Benutzer", + "validation": { + "role_required": "Bitte wählen Sie eine zuzuweisende Rolle aus", + "user_required": "Bitte wählen Sie mindestens einen Benutzer aus" + } + }, + "accountCreated": "Konto erstellt", + "accountCreatedDesc": "Ihr Konto wurde erfolgreich erstellt.", + "accountCreationFailed": "Kontoerstellung fehlgeschlagen", + "accountDetails": "Kontodetails", + "accountHasBeenSuccessfully": "Konto wurde erfolgreich {{action}}", + "accountSyncFoldersUpdateFailed": "Aktualisierung der Synchronisierungsordner des Kontos fehlgeschlagen", + "accountSyncFoldersUpdated": "Synchronisierungsordner des Kontos aktualisiert", + "accountUpdateFailed": "Kontoaktualisierung fehlgeschlagen", + "accountUpdated": "Konto aktualisiert", + "accountUpdatedDesc": "Ihr Konto wurde erfolgreich aktualisiert.", + "actions": "Aktionen", + "addAccount": "Konto hinzufügen", + "addConfiguration": "Konfiguration hinzufügen", + "addImap": "IMAP hinzufügen", + "addNewEmailAccountHere": "Fügen Sie hier ein neues E-Mail-Konto hinzu. ", + "addNoSync": "NoSync hinzufügen", + "allMailFolderSelected": "Warnung: 'Alle E-Mails'-Ordner ausgewählt", + "allMailFolderSelectedDesc": "Die Auswahl von Ordnern mit dem Attribut 'Alle E-Mails' führt wahrscheinlich zur Duplizierung von Nachrichten, die bereits aus Ordnern wie Posteingang und Gesendet synchronisiert wurden. Dies könnte erheblich mehr Speicherplatz verbrauchen.", + "allMailSkipped": "Standardordner ausgewählt. 'Alle E-Mails' wurde übersprungen, um Duplikate zu vermeiden.", + "areYouSureYouWantTo": "Möchten Sie dieses Konto wirklich {{action}}?", + "auth": "Authentifizierung", + "authType": "Authentifizierungstyp", + "autoConfiguring": "Automatische Konfiguration läuft...", + "beforeRelative": "Nur alte E-Mails herunterladen", + "beforeRelativeValue": "E-Mails von vor {{value}} {{unit}} herunterladen", + "capabilities": "Funktionen", + "chooseAuthMethod": "Wählen Sie die Authentifizierungsmethode für IMAP.", + "chooseEncryptionMethod": "Wählen Sie die Verschlüsselungsmethode für IMAP.", + "chooseMailboxesToDownload": "Wählen Sie Postfächer zum Herunterladen für {{email}}. Neue Postfächer werden im nächsten Zyklus heruntergeladen.", + "clickHere": "klicken Sie hier", + "clickSaveWhenDone": "Klicken Sie auf Speichern, wenn Sie fertig sind.", + "continue": "Weiter", + "createdAt": "Erstellt am", + "creationFailed": "Erstellung fehlgeschlagen, bitte versuchen Sie es später erneut", + "dateSelection": "Datumsauswahl", + "dateSince": "Datum seit", + "days": "Tage", + "delete": "Löschen", + "description": "Verwalten und konfigurieren Sie Ihre E-Mail-Konten.", + "detail": "Detail", + "detailsOfTheOAuth2TokensForTheAccount": "Details der OAuth2-Token für das Konto.", + "determinesWhetherThisAccountIsActiveNoSync": "Legt fest, ob dieses Konto aktiv ist. Wenn es deaktiviert ist, können keine Daten importiert werden.", + "disable": "Deaktivieren", + "disableAccount": "Konto deaktivieren", + "disabled": "Deaktiviert", + "downloadAll": "Alle E-Mails herunterladen", + "downloadBatchSize": "Download-Batch-Größe", + "downloadBatchSizeDescription": "Anzahl der pro IMAP-Anfrage abgerufenen Nachrichten", + "downloadInterval": "Download-Intervall (Minuten)", + "downloadIntervalPlaceholder": "Minuten eingeben", + "downloadScope": "Download-Strategie", + "downloadScopeDescription": "Wählen Sie aus, welche E-Mails indiziert und heruntergeladen werden sollen.", + "duration": "Dauer", + "edit": "Bearbeiten", + "email": "E-Mail", + "emailAccountRegistration": "E-Mail-Konto-Registrierung", + "emailAccountRegistrationDesc": "Bitte geben Sie Ihre E-Mail-Adresse ein. In den nächsten Schritten konfigurieren Sie die IMAP-Details. Wir verwenden diese Adresse, um die IMAP-Servereinstellungen automatisch zu ermitteln.", + "emailAddress": "E-Mail-Adresse", + "emailCannotBeModified": "Die E-Mail-Adresse des Kontos kann während der Bearbeitung nicht geändert werden.", + "emailPlaceholder": "z.B. max.mustermann@beispiel.de", + "enable": "Aktivieren", + "enableAccount": "Konto aktivieren", + "enabled": "Aktiviert", + "enabledDescription": "Legt fest, ob dieses Konto aktiv ist. Wenn es deaktiviert ist, werden zugehörige Downloads nicht ausgeführt.", + "encryption": "Verschlüsselung", + "enterPassword": "Geben Sie Ihr Passwort ein", + "enterValue": "Wert eingeben", + "everyMinutes": "alle {{minutes}} Minuten", + "field": "Feld", + "fixed": "Fest", + "folderLimit": "Ordnerlimit", + "folderLimitDescription": "Begrenzen Sie die Anzahl der pro Ordner zu synchronisierenden E-Mails (mindestens 100). Lassen Sie das Feld leer für keine Begrenzung.", + "folderLimitPlaceholder": "z.B. 1000", + "folderSync": { + "autoSelectDescendants": "Unterelemente automatisch auswählen", + "autoSelectParents": "Elternelemente automatisch auswählen", + "batches": "Batches", + "collapseAll": "Alle reduzieren", + "expandAll": "Alle erweitern", + "loadingMailboxFolders": "Postfachordner werden geladen…", + "noData": "Keine Daten", + "noFolders": "Keine Ordner zum Synchronisieren" + }, + "foldersConfiguredForSync": "{{count}} Ordner zur Synchronisierung konfiguriert", + "foldersSelected": "{{count}} Ordner ausgewählt", + "goBack": "Zurück", + "host": "Host", + "id": "ID", + "imap": "IMAP", + "imapAuthMethod": "IMAP-Authentifizierungsmethode", + "imapEncryption": "IMAP-Verschlüsselung", + "imapHost": "IMAP-Host", + "imapHostPlaceholder": "z.B. imap.beispiel.com", + "imapPassword": "IMAP-Passwort", + "imapPort": "IMAP-Port", + "imapPortPlaceholder": "z.B. 993", + "imapProxy": "SOCKS5-Proxy für IMAP-Verbindungen verwenden.", + "incSync": "Inkrementelle Synchr.", + "lastSync": "Letzte Synchronisierung", + "leaveEmptyToKeepExisting": "Leer lassen, um das bestehende Passwort beizubehalten, oder einen neuen Wert eingeben, um es zu aktualisieren.", + "leaveEmptyToKeepPassword": "Leer lassen, um das aktuelle Passwort beizubehalten", + "login_name": "Anmeldename", + "minutes": "Minuten", + "months": "Monate", + "moreAccountTypes": "Mehr Kontotypen", + "mustBeAtLeast1": "Muss mindestens 1 sein", + "name": "Name", + "nameDescription": "IMAP-Benutzername. Standardmäßig Ihre E-Mail, sonst hier anpassen.", + "namePlaceholder": "z.B. Max Mustermann", + "noAccountConfigurations": "Keine Kontokonfigurationen", + "noAccountConfigurationsDesc": "Sie haben noch keine Kontokonfigurationen hinzugefügt. Fügen Sie eine hinzu, um mit der Nutzung der Kontofunktionen zu beginnen.", + "noOAuth2Tokens": "Keine OAuth2-Token", + "none": "Keine", + "notAvailable": "nicht verfügbar", + "oauth2Tokens": "OAuth2-Token", + "openMenu": "Menü öffnen", + "optional": "Optional", + "owner": "Ersteller", + "password": "Passwort", + "port": "Port", + "recent": "aktuell", + "refreshToken": "Aktualisierungstoken", + "refreshTokenCopiedToClipboard": "Aktualisierungstoken in die Zwischenablage kopiert", + "relative": "Relativ", + "runningState": { + "account": { + "id": "Konto-ID" + }, + "common": { "close": "Schließen", - "yes": "Ja", - "no": "Nein", - "ok": "OK", - "loading": "Wird geladen...", - "empty": "Leer", - "noData": "Keine Daten", - "table": { - "noResults": "Keine Ergebnisse." - }, - "failed": "Fehlgeschlagen", - "notFound": "Nicht gefunden", - "back": "Zurück", - "goBack": "Zurückgehen", - "backToHome": "Zurück zur Startseite", - "tryAgain": "Erneut versuchen", - "more": "Mehr", - "actions": "Aktionen", - "filter": "Filter", - "reset": "Zurücksetzen", - "clear": "Leeren", - "error": "Fehler", - "apply": "Anwenden", - "select": "Auswählen", - "selectAll": "Alle auswählen", - "deselectAll": "Alle abwählen", - "all": "Alle", - "none": "Keine", - "showLess": "Weniger anzeigen", - "showMore": "Mehr anzeigen...", - "project_description": "Bichon ist ein Open-Source-Projekt.", - "view_on_github_button": "Auf GitHub anzeigen", - "op_failed": "Vorgang fehlgeschlagen", - "na": "N/V", - "retry": "Wiederholen", - "deleting": "Wird gelöscht..." - }, - "navigation": { - "home": "Startseite", - "settings": "Einstellungen", - "accounts": "Konten", - "dashboard": "Dashboard", - "mailbox": "Postfach", - "oauth2": "OAuth2", - "accessTokens": "Zugriffstoken", - "apiDocs": "API-Dokumentation", - "general": "Allgemein", - "auth": "Authentifizierung", - "other": "Sonstiges", - "users": "Systembenutzer" - }, - "auth": { - "welcome": "Willkommen bei Bichon", - "username": "Benutzername", - "password": "Passwort", - "login": "Anmelden", - "loginFailed": "Anmeldung fehlgeschlagen", - "invalidPassword": "Ungültiges Passwort. Bitte versuchen Sie es erneut.", - "somethingWentWrong": "Etwas ist schiefgelaufen", - "sessionExpired": "Sitzung abgelaufen!", - "sessionExpiredDesc": "Ihre Sitzung ist aufgrund von Inaktivität abgelaufen. Bitte melden Sie sich an, um fortzufahren.", - "logout": "Abmelden", - "areYouSureYouWantToLogOut": "Sind Sie sicher, dass Sie sich abmelden möchten?", - "youWillNeedToLogInAgain": "Sie müssen sich erneut anmelden, um auf Ihr Konto zuzugreifen." - }, - "errors": { - "pageNotFound": "Hoppla! Seite nicht gefunden!", - "pageNotFoundDesc": "Die gesuchte Seite existiert anscheinend nicht oder wurde entfernt.", - "somethingWentWrong": "Hoppla! Etwas ist schiefgelaufen :')", - "somethingWentWrongDesc": "Entschuldigen Sie die Unannehmlichkeiten. Bitte versuchen Sie es später erneut.", - "internalServerError": "Interner Serverfehler!", - "contentNotModified": "Inhalt nicht geändert!", - "networkError": "Netzwerkfehler", - "networkErrorDesc": "Verbindung zum Server nicht möglich. Bitte überprüfen Sie Ihre Internetverbindung und versuchen Sie es erneut.", - "forbidden": "Verboten", - "forbiddenTitle": "Zugriff verboten", - "forbiddenDesc": "Sie haben keine Berechtigung, auf diese Ressource zuzugreifen.", - "unauthorized": "Nicht autorisiert", - "unauthorizedTitle": "Nicht autorisierter Zugriff", - "unauthorizedDesc": "Bitte melden Sie sich mit gültigen Anmeldeinformationen an, um auf diese Ressource zuzugreifen.", - "maintenance": "Wartung", - "maintenanceTitle": "Die Seite wird gewartet!", - "maintenanceDesc": "Die Seite ist vorübergehend nicht erreichbar. Wir sind bald wieder online.", - "learnMore": "Mehr erfahren" - }, - "dashboard": { - "title": "Dashboard", - "mailAccounts": "E-Mail-Konten", - "connected": "Verbunden", - "totalEmails": "Gesamt-E-Mails", - "syncedLocally": "Lokal synchronisiert", - "totalEmailSize": "Gesamtgröße der E-Mails", - "logicalVolume": "Originalgröße", - "localDataFiles": "Lokale Datendateien", - "actualDiskUsage": "Tatsächliche Festplattennutzung", - "efficiency": "Speichereffizienz", - "saved": "Eingespart", - "dataStorage": "Datenspeicher", - "indexSize": "Indexgröße", - "metadataSize": "Metadatengröße", - "tantivyDatabase": "Basiert auf der Tantivy-Suchmaschine", - "dayTrend": "30-Tage-Trend", - "attachments": "Anhänge", - "topLists": "Top-Listen", - "newEmails": "Neue E-Mails", - "messageDistribution": "Nachrichtenverteilung", - "attachmentRatio": "Anhangsverhältnis", - "attachmentRatioDesc": "{{percent}}% der E-Mails haben Anhänge", - "noEmailsSynced": "Noch keine E-Mails synchronisiert", - "withAttachments": "Mit Anhängen", - "noAttachments": "Keine Anhänge", - "top10Senders": "Top 10 Absender", - "byMessageCount": "Nach Nachrichtenanzahl", - "sender": "Absender", - "count": "Anzahl", - "top10LargestEmails": "Top 10 größte E-Mails", - "byMessageSize": "Nach Nachrichtengröße", - "subject": "Betreff", - "size": "Größe", - "noSubject": "(Kein Betreff)", - "top10Accounts": "Top 10 Konten", - "emails": "E-Mails", - "account": "Konto", - "noRecentActivity": "Keine kürzliche Aktivität", - "noSendersData": "Keine Absenderdaten", - "noLargeEmails": "Keine großen E-Mails", - "noAccountData": "Keine Kontodaten", - "systemVersion": "Systemversion" - }, - "accounts": { - "beforeRelativeValue": "E-Mails von vor {{value}} {{unit}} herunterladen", - "sinceRelativeValue": "E-Mails der letzten Zeit herunterladen", - "downloadBatchSize": "Download-Batch-Größe", - "downloadBatchSizeDescription": "Anzahl der pro IMAP-Anfrage abgerufenen Nachrichten", - "downloadScopeDescription": "Wählen Sie aus, welche E-Mails indiziert und heruntergeladen werden sollen.", - "downloadScope": "Download-Strategie", - "selectMode": "Filtermodus auswählen", - "downloadAll": "Alle E-Mails herunterladen", - "sinceFixed": "Seit einem bestimmten Datum", - "sinceRelative": "Nur aktuelle E-Mails herunterladen", - "beforeRelative": "Nur alte E-Mails herunterladen", - "duration": "Dauer", - "unit": "Einheit", - "accessControl": "Zugriffskontrolle", - "owner": "Ersteller", - "access_control": { - "title": "Kontozugriffszuweisung", - "description": "Rollen und autorisierte Benutzer für {{email}} zuweisen", - "role_label": "Zugriffsrolle", - "role_placeholder": "Rolle auswählen", - "role_loading": "Rollen werden geladen...", - "user_label": "Autorisierte Benutzer auswählen", - "user_search_placeholder": "Suche nach Benutzername oder E-Mail...", - "user_empty": "Keine Benutzer gefunden", - "user_selected_count": "Ausgewählt: {{count}} Benutzer", - "buttons": { - "cancel": "Abbrechen", - "save": "Zuweisung speichern" - }, - "validation": { - "user_required": "Bitte wählen Sie mindestens einen Benutzer aus", - "role_required": "Bitte wählen Sie eine zuzuweisende Rolle aus" - }, - "toast": { - "success_title": "Zuweisung erfolgreich", - "success_desc": "Berechtigungen wurden erfolgreich für {{email}} zugewiesen", - "failed_title": "Zuweisung fehlgeschlagen" - } - }, - "title": "E-Mail-Konten", - "description": "Verwalten und konfigurieren Sie Ihre E-Mail-Konten.", - "addImap": "IMAP hinzufügen", - "addNoSync": "NoSync hinzufügen", - "moreAccountTypes": "Mehr Kontotypen", - "noAccountConfigurations": "Keine Kontokonfigurationen", - "noAccountConfigurationsDesc": "Sie haben noch keine Kontokonfigurationen hinzugefügt. Fügen Sie eine hinzu, um mit der Nutzung der Kontofunktionen zu beginnen.", - "addConfiguration": "Konfiguration hinzufügen", - "useNoProxy": "Kein Proxy", - "login_name": "Anmeldename", - "name": "Name", - "email": "E-Mail", + "folders": "Postfächer" + }, + "empty": { + "no_active_download": "Kein aktiver Download", + "no_errors_current": "Keine Fehler in der aktuellen Sitzung", + "no_errors_session": "Keine Fehler in dieser Sitzung", + "no_global_errors": "Keine globalen Fehler", + "no_history": "Kein Verlauf vorhanden" + }, + "folders": "Postfächer", + "latest": "NEU", + "loading": { + "fetching_account_state": "Kontostatus wird geladen..." + }, + "message": "Nachricht", + "session": { + "started_at": "Startzeit", "status": "Status", - "type": "Typ", - "lastSync": "Letzte Synchronisierung", - "actions": "Aktionen", - "edit": "Bearbeiten", - "delete": "Löschen", - "detail": "Detail", - "selectMailboxes": "Postfächer wählen", - "oauth2Tokens": "OAuth2-Token", - "id": "ID", - "enabled": "Aktiviert", - "auth": "Authentifizierung", - "incSync": "Inkrementelle Synchr.", - "state": "Zustand", - "createdAt": "Erstellt am", - "updatedAt": "Aktualisiert am", - "openMenu": "Menü öffnen", - "emailAccountRegistration": "E-Mail-Konto-Registrierung", - "emailAccountRegistrationDesc": "Bitte geben Sie Ihre E-Mail-Adresse ein. In den nächsten Schritten konfigurieren Sie die IMAP-Details. Wir verwenden diese Adresse, um die IMAP-Servereinstellungen automatisch zu ermitteln.", - "emailAddress": "E-Mail-Adresse", - "emailPlaceholder": "z.B. max.mustermann@beispiel.de", - "namePlaceholder": "z.B. Max Mustermann", - "optional": "Optional", - "nameDescription": "IMAP-Benutzername. Standardmäßig Ihre E-Mail, sonst hier anpassen.", - "emailCannotBeModified": "Die E-Mail-Adresse des Kontos kann während der Bearbeitung nicht geändert werden.", - "addAccount": "Konto hinzufügen", - "updateAccount": "Konto aktualisieren", - "accountUpdated": "Konto aktualisiert", - "accountCreated": "Konto erstellt", - "accountUpdatedDesc": "Ihr Konto wurde erfolgreich aktualisiert.", - "accountCreatedDesc": "Ihr Konto wurde erfolgreich erstellt.", - "accountUpdateFailed": "Kontoaktualisierung fehlgeschlagen", - "accountCreationFailed": "Kontoerstellung fehlgeschlagen", - "updateFailed": "Aktualisierung fehlgeschlagen, bitte versuchen Sie es später erneut", - "creationFailed": "Erstellung fehlgeschlagen, bitte versuchen Sie es später erneut", - "allMailFolderSelected": "Warnung: 'Alle E-Mails'-Ordner ausgewählt", - "accountSyncFoldersUpdated": "Synchronisierungsordner des Kontos aktualisiert", - "accountSyncFoldersUpdateFailed": "Aktualisierung der Synchronisierungsordner des Kontos fehlgeschlagen", - "serverConfiguration": "Serverkonfiguration (IMAP)", - "selectedMailboxes": "Ausgewählte Postfächer", - "allMailFolderSelectedDesc": "Die Auswahl von Ordnern mit dem Attribut 'Alle E-Mails' führt wahrscheinlich zur Duplizierung von Nachrichten, die bereits aus Ordnern wie Posteingang und Gesendet synchronisiert wurden. Dies könnte erheblich mehr Speicherplatz verbrauchen.", - "allMailSkipped": "Standardordner ausgewählt. 'Alle E-Mails' wurde übersprungen, um Duplikate zu vermeiden.", - "selectAtLeastOneFolder": "Wählen Sie mindestens einen Ordner aus", - "chooseMailboxesToDownload": "Wählen Sie Postfächer zum Herunterladen für {{email}}. Neue Postfächer werden im nächsten Zyklus heruntergeladen.", - "accountDetails": "Kontodetails", - "capabilities": "Funktionen", - "folderLimit": "Ordnerlimit", - "everyMinutes": "alle {{minutes}} Minuten", - "foldersConfiguredForSync": "{{count}} Ordner zur Synchronisierung konfiguriert", - "foldersSelected": "{{count}} Ordner ausgewählt", - "imapHost": "IMAP-Host", - "imapHostPlaceholder": "z.B. imap.beispiel.com", - "imapPort": "IMAP-Port", - "imapPortPlaceholder": "z.B. 993", - "imapEncryption": "IMAP-Verschlüsselung", - "selectEncryptionMethod": "Verschlüsselungsmethode auswählen", - "chooseEncryptionMethod": "Wählen Sie die Verschlüsselungsmethode für IMAP.", - "imapAuthMethod": "IMAP-Authentifizierungsmethode", - "selectAuthMethod": "Authentifizierungsmethode auswählen", - "chooseAuthMethod": "Wählen Sie die Authentifizierungsmethode für IMAP.", - "imapPassword": "IMAP-Passwort", - "leaveEmptyToKeepPassword": "Leer lassen, um das aktuelle Passwort beizubehalten", - "enterPassword": "Geben Sie Ihr Passwort ein", - "leaveEmptyToKeepExisting": "Leer lassen, um das bestehende Passwort beizubehalten, oder einen neuen Wert eingeben, um es zu aktualisieren.", - "useProxy": "Proxy verwenden", - "selectProxy": "Proxy auswählen", - "downloadInterval": "Download-Intervall (Minuten)", - "downloadIntervalPlaceholder": "Minuten eingeben", - "enabledDescription": "Legt fest, ob dieses Konto aktiv ist. Wenn es deaktiviert ist, werden zugehörige Downloads nicht ausgeführt.", - "dateSince": "Datum seit", - "none": "Keine", - "fixed": "Fest", - "relative": "Relativ", - "selectDate": "Datum auswählen", - "selectUnit": "Einheit auswählen", - "days": "Tage", - "months": "Monate", - "years": "Jahre", - "enterValue": "Wert eingeben", - "mustBeAtLeast1": "Muss mindestens 1 sein", - "dateSelection": "Datumsauswahl", - "since": "seit", - "recent": "aktuell", - "notAvailable": "nicht verfügbar", - "host": "Host", - "port": "Port", - "encryption": "Verschlüsselung", - "authType": "Authentifizierungstyp", - "password": "Passwort", - "useProxyField": "Proxy verwenden", - "clickSaveWhenDone": "Klicken Sie auf Speichern, wenn Sie fertig sind.", - "step": "Schritt {{index}}", - "goBack": "Zurück", - "autoConfiguring": "Automatische Konfiguration läuft...", - "continue": "Weiter", - "saveChanges": "Änderungen speichern", - "submit": "Absenden", - "field": "Feld", - "value": "Wert", - "refreshToken": "Aktualisierungstoken", - "accessTokenCopiedToClipboard": "Zugriffstoken in die Zwischenablage kopiert", - "refreshTokenCopiedToClipboard": "Aktualisierungstoken in die Zwischenablage kopiert", - "noOAuth2Tokens": "Keine OAuth2-Token", - "theAccountHasNotCompletedTheAuthorizationProcess": "Das Konto hat den Autorisierungsprozess noch nicht abgeschlossen. Bitte ", - "clickHere": "klicken Sie hier", - "toAuthorizeTheAccount": ", um das Konto zu autorisieren.", - "detailsOfTheOAuth2TokensForTheAccount": "Details der OAuth2-Token für das Konto.", - "updateTheEmailAccountHere": "Aktualisieren Sie das E-Mail-Konto hier. ", - "addNewEmailAccountHere": "Fügen Sie hier ein neues E-Mail-Konto hinzu. ", - "thisAccountIsUsedForIdentificationPurposesOnly": "Dieses Konto dient nur zur Identifizierung und erfordert keine Synchronisierung mit dem Mailserver. Es hilft beim Import von E-Mail-Daten.", - "determinesWhetherThisAccountIsActiveNoSync": "Legt fest, ob dieses Konto aktiv ist. Wenn es deaktiviert ist, können keine Daten importiert werden.", - "folderSync": { - "noData": "Keine Daten", - "noFolders": "Keine Ordner zum Synchronisieren", - "batches": "Batches", - "autoSelectDescendants": "Unterelemente automatisch auswählen", - "autoSelectParents": "Elternelemente automatisch auswählen", - "expandAll": "Alle erweitern", - "collapseAll": "Alle reduzieren", - "loadingMailboxFolders": "Postfachordner werden geladen…" - }, - "viewDetails": "Details anzeigen", - "runningState": { - "message": "Nachricht", - "account": { - "id": "Konto-ID" - }, - "tabs": { - "active_session": "Aktive Sitzung", - "history": "Verlauf", - "global_errors": "Globale Fehler", - "folders": "Postfächer", - "errors": "Fehler" - }, - "loading": { - "fetching_account_state": "Kontostatus wird geladen..." - }, - "empty": { - "no_active_download": "Kein aktiver Download", - "no_errors_current": "Keine Fehler in der aktuellen Sitzung", - "no_errors_session": "Keine Fehler in dieser Sitzung", - "no_global_errors": "Keine globalen Fehler", - "no_history": "Kein Verlauf vorhanden" - }, - "session": { - "status": "Status", - "trigger": "Auslöser", - "started_at": "Startzeit" - }, - "common": { - "folders": "Postfächer", - "close": "Schließen" - }, - "latest": "NEU", - "folders": "Postfächer" - }, - "steps": { - "complete": "Abgeschlossen", - "emailAddress": "E-Mail-Adresse", - "imap": "IMAP", - "syncPreferences": "Synchronisierungseinstellungen", - "summary": "Zusammenfassung" - }, - "imapProxy": "SOCKS5-Proxy für IMAP-Verbindungen verwenden.", - "syncStartDateDescription": "Legen Sie das Startdatum für die Synchronisierung fest, entweder fest oder relativ zur aktuellen Zeit. E-Mails, die älter als dieses Datum sind, werden ausgeschlossen, {{fixedPart}}.", - "syncAfterDate": "Daten nach dem festgelegten Datum synchronisieren", - "syncRecentData": "Synchronisierungsdatum in die Zukunft verschieben, nur aktuelle Daten synchronisieren", - "folderLimitDescription": "Begrenzen Sie die Anzahl der pro Ordner zu synchronisierenden E-Mails (mindestens 100). Lassen Sie das Feld leer für keine Begrenzung.", - "folderLimitPlaceholder": "z.B. 1000", - "imap": "IMAP", - "minutes": "Minuten", - "accountHasBeenSuccessfully": "Konto wurde erfolgreich {{action}}", - "enableAccount": "Konto aktivieren", - "disableAccount": "Konto deaktivieren", - "areYouSureYouWantTo": "Möchten Sie dieses Konto wirklich {{action}}?", - "enable": "Aktivieren", - "disable": "Deaktivieren", - "thisWillPreventTheAccountFromBeingUsed": "Dieses Konto synchronisiert keine Daten mehr vom IMAP-Server, aber vorhandene Daten bleiben weiterhin zugänglich.", - "disabled": "Deaktiviert", - "useDangerous": "Jedem TLS‑Zertifikat vertrauen", - "useDangerousDescription": "Aktivieren Sie diese Option nur, wenn Sie sich mit einem IMAP‑Server verbinden, der ein öffentliches CA‑Zertifikat oder ein selbstsigniertes Zertifikat verwendet, das Ihr System möglicherweise nicht erkennt. Diese Einstellung umgeht die Standard‑Zertifikatsprüfung und kann Sie für Man‑in‑the‑Middle‑Angriffe anfällig machen – aktivieren Sie nur, wenn Sie die Risiken verstehen." + "trigger": "Auslöser" + }, + "tabs": { + "active_session": "Aktive Sitzung", + "errors": "Fehler", + "folders": "Postfächer", + "global_errors": "Globale Fehler", + "history": "Verlauf" + } }, - "mailbox": { - "deleteMailboxDialog": { - "title": "Postfachordner löschen", - "desc": "Sind Sie sicher, dass Sie diesen Postfachordner löschen möchten? Diese Aktion kann nicht rückgängig gemacht werden.", - "warningTitle": "Warnung", - "warningDesc": "Das Löschen dieses Ordners entfernt auch dauerhaft alle darin enthaltenen archivierten E-Mails und Unterordner.", - "confirm": "Dauerhaft löschen", - "successTitle": "Erfolgreich gelöscht", - "successDesc": "Der Postfachordner und sein Inhalt wurden erfolgreich entfernt.", - "errorTitle": "Löschen fehlgeschlagen" - }, - "title": "Postfach", - "folders": "Ordner", - "messages": "Nachrichten", - "noMessages": "Keine Nachrichten", - "selectFolder": "Wählen Sie einen Ordner aus, um Nachrichten anzuzeigen", - "deleteDialog": { - "title": "E-Mail löschen", - "desc": "Sind Sie sicher, dass Sie {{countText}} löschen möchten? Diese Aktion wird die ausgewählte(n) E-Mail(s) dauerhaft aus der lokalen Datenbank entfernen. Die E-Mail(s) gehen für immer verloren und können nicht wiederhergestellt werden.", - "descCountSingle": "diese E-Mail", - "descCountMultiple": "diese {{count}} E-Mails", - "warningTitle": "Warnung!", - "warningDesc": "Gehen Sie mit Vorsicht vor.", - "confirm": "Löschen", - "successTitle": "Nachrichten erfolgreich gelöscht", - "successDesc": "Die Nachrichten wurden gelöscht.", - "errorTitle": "Löschen von Nachrichten fehlgeschlagen" - }, - "thread": { - "title": "Konversations-Thread ({{count}} {{messageLabel}})", - "message": "Nachricht", - "messages": "Nachrichten", - "noSubject": "(Kein Betreff)", - "invalidDate": "Ungültiges Datum", - "empty": "Keine Nachrichten in diesem Thread.", - "loadError": "Fehler beim Laden des Threads", - "loadingMore": "Wird geladen...", - "loadMore": "Mehr laden" - }, - "bulkActions": { - "ariaLabel": "Massenaktionen für {{count}} ausgewählte {{emailLabel}}", - "email": "E-Mail", - "emails": "E-Mails", - "selected": "ausgewählt", - "clearSelection": "Auswahl löschen", - "clearSelectionWithKey": "Auswahl löschen ({{key}})", - "delete": "Löschen", - "deleteTooltip": "Ausgewählte E-Mails löschen" - } + "saveChanges": "Änderungen speichern", + "selectAtLeastOneFolder": "Wählen Sie mindestens einen Ordner aus", + "selectAuthMethod": "Authentifizierungsmethode auswählen", + "selectDate": "Datum auswählen", + "selectEncryptionMethod": "Verschlüsselungsmethode auswählen", + "selectMailboxes": "Postfächer wählen", + "selectMode": "Filtermodus auswählen", + "selectProxy": "Proxy auswählen", + "selectUnit": "Einheit auswählen", + "selectedMailboxes": "Ausgewählte Postfächer", + "serverConfiguration": "Serverkonfiguration (IMAP)", + "since": "seit", + "sinceFixed": "Seit einem bestimmten Datum", + "sinceRelative": "Nur aktuelle E-Mails herunterladen", + "sinceRelativeValue": "E-Mails der letzten Zeit herunterladen", + "state": "Zustand", + "status": "Status", + "step": "Schritt {{index}}", + "steps": { + "complete": "Abgeschlossen", + "emailAddress": "E-Mail-Adresse", + "imap": "IMAP", + "summary": "Zusammenfassung", + "syncPreferences": "Synchronisierungseinstellungen" }, - "search": { - "size": "Größe", - "any": "Beliebig", - "tiny": "Sehr klein (<15 KB)", - "small": "Klein (<2 MB)", - "medium": "Mittel (2 - 10 MB)", - "large": "Groß (10 - 20 MB)", - "huge": "Riesig (≥20 MB)", - "sort": "Sortieren", - "sizeDescription": "Die Größe bezieht sich auf die gesamte E-Mail inklusive Anhängen.", - "title": "Suchen", - "searching": "Wird gesucht, bitte warten Sie...", - "noEmailsFound": "Keine E-Mails gefunden", - "startSearching": "Beginnen Sie mit der Suche nach Stichworten, Absendern oder verwenden Sie erweiterte Filter.", - "adjustSearch": "Versuchen Sie, Ihre Suchkriterien anzupassen oder Filter zu löschen.", - "tagFilter": "Tag-Filter", - "from": "Von", - "to": "An", - "subject": "Betreff", - "date": "Datum", - "editTag": "Tag bearbeiten", - "keyword": "Stichwort", - "sender": "Absender", - "recipient": "Empfänger", - "hasAttachment": "Hat Anhang", - "yes": "Ja", - "no": "Nein", - "dateRange": "Datumsbereich", - "startDate": "Startdatum", - "endDate": "Enddatum", - "advancedFilters": "Erweiterte Filter", - "searchArchivedEmails": "Archivierte E-Mails durchsuchen", - "fullTextMultiAccount": "Volltext · Mehrere Konten · Erweiterte Filter", - "account": "Konto", - "mailbox": "Postfach", - "selectAccount": "Konto auswählen", - "selectMailbox": "Postfach auswählen", - "noActiveEmailAccount": "Kein aktives E-Mail-Konto.", - "addEmailAccount": "E-Mail-Konto hinzufügen", - "noMailboxSelectAccount": "Kein Postfach. Bitte wählen Sie zuerst ein Konto aus.", - "searchInSubjectBody": "In Betreff, Text, Anhängen suchen...", - "searchingButton": "Wird gesucht...", - "searchButton": "Suchen", - "advanced": "Erweitert", - "clear": "Löschen", - "since": "Seit:", - "before": "Vor:", - "selectDate": "Datum auswählen", - "pleaseSelectAtLeastOne": "Bitte wählen Sie mindestens ein Suchkriterium aus", - "cc": "CC", - "bcc": "BCC", - "attachmentName": "Anhangsname", - "messageId": "Nachrichten-ID", - "minSize": "Min. Größe", - "maxSize": "Max. Größe", - "senderRecipients": "Absender / Empfänger", - "attachmentsSize": "Anhänge & Größe", - "minimumBytes": "Minimum (Bytes)", - "maximumBytes": "Maximum (Bytes)", - "originalMessageIdHeader": "Message-ID-Header der Original-E-Mail", - "addTags": { - "title": "Tags bearbeiten", - "none": "Noch keine Tags hinzugefügt", - "searchPlaceholder": "Tags suchen oder erstellen...", - "createHint": "Neues Tag erstellen: {{tag}}", - "invalidTitle": "Ungültiges Tag", - "updatedTitle": "Tags aktualisiert", - "updatedDesc": "Tags wurden erfolgreich aktualisiert", - "updateFailedTitle": "Aktualisierung fehlgeschlagen", - "tryAgain": "Bitte versuchen Sie es später erneut", - "selectedCount": "{{count}} Tag(s) ausgewählt", - "cancel": "Abbrechen", - "save": "Speichern", - "saving": "Wird gespeichert..." - }, - "updateTags": { - "overwriteWarning": "Warnung: Dies überschreibt alle vorhandenen Tags der ausgewählten Elemente.", - "title": "Tags aktualisieren", - "none": "Keine Tags ausgewählt", - "searchPlaceholder": "Tag suchen oder erstellen...", - "createHint": "Eingabetaste drücken, um neuen Tag zu erstellen: \"{{tag}}\"", - "selectedCount": "{{count}} Tag(s) werden angewendet", - "cancel": "Abbrechen", - "invalidTitle": "Ungültiger Tag", - "updatedTitle": "Tags aktualisiert", - "updatedDesc": "Tags wurden erfolgreich aktualisiert.", - "updateFailedTitle": "Aktualisierung fehlgeschlagen", - "tryAgain": "Bitte versuchen Sie es später erneut.", - "actionAdd": "Hinzufügen", - "actionRemove": "Entfernen", - "actionOverwrite": "Überschreiben", - "submitAdd": "Tags hinzufügen", - "submitRemove": "Tags entfernen", - "submitOverwrite": "Tags überschreiben", - "savingAdd": "Wird hinzugefügt...", - "savingRemove": "Wird entfernt...", - "savingOverwrite": "Wird überschrieben..." - }, - "thread": { - "title": "Konversations-Thread · {{count}} Nachrichten", - "error": "Fehler beim Laden des Threads", - "empty": "Keine Nachrichten in diesem Thread", - "invalidDate": "Ungültiges Datum", - "noSubject": "(Kein Betreff)", - "loadingMore": "Wird geladen...", - "loadMore": "Mehr laden" - }, - "bulkActions": { - "ariaLabel": "{{count}} Nachrichten ausgewählt. Aktionsleiste", - "delete": "Löschen", - "deleteDesc": "Ausgewählte Nachrichten löschen", - "selected": "{{count}} ausgewählt", - "clear": "Auswahl aufheben", - "manageTags": "Tags verwalten" - }, - "delete": { - "title": "Nachrichten löschen", - "confirmPrefix": "Möchten Sie wirklich", - "countLabel": "{{count}} Nachricht(en) löschen?", - "confirmDetail": "Dies kann nicht rückgängig gemacht werden.", - "confirmButton": "Löschen", - "warningTitle": "Warnung", - "warningDesc": "Gelöschte Nachrichten werden dauerhaft entfernt.", - "successTitle": "Gelöscht", - "successDesc": "Erfolgreich gelöscht.", - "errorTitle": "Fehler beim Löschen" - } + "submit": "Absenden", + "syncAfterDate": "Daten nach dem festgelegten Datum synchronisieren", + "syncRecentData": "Synchronisierungsdatum in die Zukunft verschieben, nur aktuelle Daten synchronisieren", + "syncStartDateDescription": "Legen Sie das Startdatum für die Synchronisierung fest, entweder fest oder relativ zur aktuellen Zeit. E-Mails, die älter als dieses Datum sind, werden ausgeschlossen, {{fixedPart}}.", + "theAccountHasNotCompletedTheAuthorizationProcess": "Das Konto hat den Autorisierungsprozess noch nicht abgeschlossen. Bitte ", + "thisAccountIsUsedForIdentificationPurposesOnly": "Dieses Konto dient nur zur Identifizierung und erfordert keine Synchronisierung mit dem Mailserver. Es hilft beim Import von E-Mail-Daten.", + "thisWillPreventTheAccountFromBeingUsed": "Dieses Konto synchronisiert keine Daten mehr vom IMAP-Server, aber vorhandene Daten bleiben weiterhin zugänglich.", + "title": "E-Mail-Konten", + "toAuthorizeTheAccount": ", um das Konto zu autorisieren.", + "type": "Typ", + "unit": "Einheit", + "updateAccount": "Konto aktualisieren", + "updateFailed": "Aktualisierung fehlgeschlagen, bitte versuchen Sie es später erneut", + "updateTheEmailAccountHere": "Aktualisieren Sie das E-Mail-Konto hier. ", + "updatedAt": "Aktualisiert am", + "useDangerous": "Jedem TLS‑Zertifikat vertrauen", + "useDangerousDescription": "Aktivieren Sie diese Option nur, wenn Sie sich mit einem IMAP‑Server verbinden, der ein öffentliches CA‑Zertifikat oder ein selbstsigniertes Zertifikat verwendet, das Ihr System möglicherweise nicht erkennt. Diese Einstellung umgeht die Standard‑Zertifikatsprüfung und kann Sie für Man‑in‑the‑Middle‑Angriffe anfällig machen – aktivieren Sie nur, wenn Sie die Risiken verstehen.", + "useNoProxy": "Kein Proxy", + "useProxy": "Proxy verwenden", + "useProxyField": "Proxy verwenden", + "value": "Wert", + "viewDetails": "Details anzeigen", + "years": "Jahre" + }, + "apiDocs": { + "choosePreferredType": "Wählen Sie den bevorzugten Typ der API-Dokumentation", + "downloadSpecYAML": "Spezifikation YAML herunterladen", + "openAPIExplorer": "OpenAPI Explorer", + "reDoc": "ReDoc", + "scalar": "Scalar", + "swaggerUI": "Swagger UI" + }, + "apiTokens": { + "deleteDialog": { + "cancel": "Abbrechen", + "confirm": "Löschen", + "deleting": "Löschen...", + "description": "Diese Aktion kann nicht rückgängig gemacht werden. Jede Anwendung, die diesen Token verwendet, verliert sofort den Zugriff.", + "title": "Zugriffstoken löschen?" }, - "mail": { - "emailViewer": "E-Mail-Anzeige", - "noMessageSelected": "Keine Nachricht ausgewählt", - "account": "Konto", - "from": "Von", - "to": "An", - "subject": "Betreff", - "date": "Datum", - "tags": "Tags", - "noTagsYet": "Noch keine Tags", - "id": "ID", - "cc": "CC", - "bcc": "BCC", - "attachments": "Anhänge", - "download": "Herunterladen", - "delete": "Löschen", - "viewThread": "Thread anzeigen", - "downloadStarted": "Download gestartet", - "downloadComplete": "Download abgeschlossen", - "downloadFailed": "Download fehlgeschlagen", - "failedToDownloadFile": "Fehler beim Herunterladen der Datei", - "failedToLoadEmail": "Fehler beim Laden der E-Mail.", - "isBeingDownloaded": "{{id}} wird heruntergeladen", - "downloaded": "{{id}} heruntergeladen", - "showLess": "weniger anzeigen", - "showMore": "mehr anzeigen...", - "onlyNonInlineAttachments": "Es werden nur Nicht-Inline-Anhänge hier angezeigt.", - "noAttachments": "Keine Anhänge" + "dialog": { + "createTitle": "Zugriffstoken erstellen", + "description": "Klicken Sie auf Speichern, wenn Sie fertig sind.", + "editTitle": "Zugriffstoken bearbeiten", + "save": "Speichern", + "saveChanges": "Änderungen speichern" }, - "oauth2": { - "title": "OAuth2", - "addConfiguration": "Konfiguration hinzufügen", - "id": "ID", - "provider": "Anbieter", - "clientId": "Client-ID", - "clientSecret": "Client-Geheimnis", - "redirectUri": "Weiterleitungs-URI", - "scopes": "Bereiche (Scopes)", - "status": "Status", - "enabled": "Aktiviert", - "disabled": "Deaktiviert", - "edit": "Bearbeiten", - "delete": "Löschen", - "enable": "Aktivieren", - "disable": "Deaktivieren", - "noConfigurations": "Keine OAuth2-Konfigurationen", - "noConfigurationsDesc": "Sie haben noch keine OAuth2-Konfigurationen hinzugefügt. Fügen Sie eine hinzu, um mit der Nutzung der OAuth2-Funktionen zu beginnen.", - "description": "Verwalten Sie automatisch die Beschaffung, Speicherung und Aktualisierung von Zugriffstoken, um ein nahtloses und jederzeit einsatzbereites Authentifizierungserlebnis zu gewährleisten.", - "addNew": "Neu hinzufügen", - "updateHere": "Hier aktualisieren.", - "createNewHere": "Hier ein neues erstellen.", - "clickSaveWhenDone": "Klicken Sie auf Speichern, wenn Sie fertig sind.", - "quickPresets": "Schnelle Voreinstellungen:", - "gmail": "Gmail", - "outlook": "Outlook", - "whenDisabled": "Bei Deaktivierung: - Neue Autorisierungsflüsse werden sofort abgelehnt - Bestehende Zugriffs- und Aktualisierungstoken werden innerhalb einer Minute widerrufen - Benutzer müssen bei erneuter Aktivierung neu autorisieren", - "clientIdLabel": "Client-ID:", - "enterYourClientId": "Geben Sie Ihre Client-ID ein", - "theUniqueIdentifierForYourApplication": "Der eindeutige Bezeichner für Ihre Anwendung, bereitgestellt vom OAuth-Anbieter.", - "clientSecretLabel": "Client-Geheimnis:", - "leaveEmptyToKeepExistingSecret": "Leer lassen, um das bestehende Geheimnis beizubehalten", - "enterYourClientSecret": "Geben Sie Ihr Client-Geheimnis ein", - "leaveEmptyToKeepTheExistingSecret": "Leer lassen, um das bestehende Geheimnis beizubehalten, oder einen neuen Wert eingeben, um es zu aktualisieren.", - "aSecretKeyProvidedByTheOAuthProvider": "Ein vom OAuth-Anbieter bereitgestellter geheimer Schlüssel zur Authentifizierung Ihrer Anwendung.", - "authUrlLabel": "Autorisierungs-URL:", - "enterTheAuthorizationUrl": "Geben Sie die Autorisierungs-URL ein", - "theUrlWhereUsersWillBeRedirected": "Die URL, zu der Benutzer weitergeleitet werden, um Ihre Anwendung zu autorisieren.", - "tokenUrlLabel": "Token-URL:", - "enterTheTokenUrl": "Geben Sie die Token-URL ein", - "theUrlUsedToExchange": "Die URL, die verwendet wird, um den Autorisierungscode gegen ein Zugriffstoken auszutauschen.", - "redirectUrlLabel": "Weiterleitungs-URI:", - "enterYourRedirectUrl": "Geben Sie Ihren Weiterleitungs-URI ein", - "theRedirectUrlAfterAuthorization": "Der Weiterleitungs-URI nach der Autorisierung. Er muss mit dem beim OAuth-Anbieter registrierten übereinstimmen. Verwenden Sie das Format http://[host]:[port]/oauth2/callback (oder https://), wobei [host] und [port] mit Ihrer RustMailer-Bereitstellung übereinstimmen. Der Pfad /oauth2/callback ist fest.", - "scope": "Bereich (Scope):", - "enterTheScopeHere": "Geben Sie den Bereich hier ein.", - "addScope": "Bereich hinzufügen", - "key": "Schlüssel:", - "enterTheKeyHere": "Geben Sie den Schlüssel hier ein.", - "value": "Wert:", - "enterTheValueHere": "Geben Sie den Wert hier ein.", - "addExtraParams": "Zusätzliche Parameter hinzufügen", - "useProxyOptional": "Proxy verwenden (Optional):", - "selectAProxy": "Einen Proxy auswählen", - "noProxyAvailable": "Kein Proxy verfügbar", - "useSocks5ProxyForOAuthRequests": "Verwenden Sie einen SOCKS5-Proxy für OAuth-Anfragen, wenn der direkte Zugriff blockiert ist.", - "descriptionLabel": "Beschreibung:", - "describeThePurposeOfTheOauth2Application": "Beschreiben Sie den Zweck der OAuth2-Anwendung", - "optional": "Optional", - "saving": "Wird gespeichert...", - "creating": "Wird erstellt...", - "saveChanges": "Änderungen speichern", - "save": "Speichern", - "updated": "Aktualisiert", - "created": "Erstellt", - "yourOAuth2ApplicationHasBeenSuccessfully": "Ihre OAuth2-Anwendung wurde erfolgreich {{action}}.", - "updateFailed": "Aktualisierung fehlgeschlagen", - "creationFailed": "Erstellung fehlgeschlagen", - "updateOrCreationFailed": "{{action}} fehlgeschlagen, bitte versuchen Sie es später erneut", - "clientSecretIsRequired": "Client-Geheimnis ist erforderlich", - "clientSecretCannotBeEmpty": "Client-Geheimnis darf nicht leer sein", - "keyIsRequired": "Schlüssel ist erforderlich", - "keyCannotBeEmpty": "Schlüssel darf nicht leer sein", - "valueIsRequired": "Wert ist erforderlich", - "valueCannotBeEmpty": "Wert darf nicht leer sein", - "descriptionMustNotExceed255Characters": "Die Beschreibung darf 255 Zeichen nicht überschreiten.", - "clientIdIsRequired": "Client-ID ist erforderlich", - "clientIdCannotBeEmpty": "Client-ID darf nicht leer sein", - "authorizationUrlIsRequired": "Autorisierungs-URL ist erforderlich", - "authorizationUrlCannotBeEmpty": "Autorisierungs-URL darf nicht leer sein", - "invalidAuthorizationUrlFormat": "Ungültiges Format der Autorisierungs-URL", - "tokenUrlIsRequired": "Token-URL ist erforderlich", - "tokenUrlCannotBeEmpty": "Token-URL darf nicht leer sein", - "invalidTokenUrlFormat": "Ungültiges Format der Token-URL", - "redirectUriIsRequired": "Weiterleitungs-URI ist erforderlich", - "redirectUriCannotBeEmpty": "Weiterleitungs-URI darf nicht leer sein", - "invalidRedirectUriFormat": "Ungültiges Format des Weiterleitungs-URI", - "authorizeEmailAccount": "E-Mail-Konto autorisieren", - "authorizeAnEmailAccountToStartTheOAuth2AuthorizationProcess": "Autorisieren Sie ein E-Mail-Konto, um den OAuth2-Autorisierungsprozess zu starten.", - "loadingAccounts": "Konten werden geladen...", - "selectAnAccount": "Wählen Sie ein Konto aus", - "noEmailAccountsRegistered": "Keine E-Mail-Konten registriert. Bitte erstellen Sie eines.", - "pleaseCreateOne": "Bitte erstellen Sie eines.", - "createAccount": "Konto erstellen", - "authorize": "Autorisieren", - "getAuthorizeUrlFailed": "Abrufen der Autorisierungs-URL fehlgeschlagen", - "getAuthorizeUrlFailedDesc": "Fehler beim Abrufen der Autorisierungs-URL, bitte versuchen Sie es später erneut", - "oauth2ClientUpdated": "OAuth2-Client aktualisiert", - "oauth2ClientHasBeenSuccessfully": "Ihr OAuth2-Client wurde erfolgreich {{action}}.", - "statusUpdateFailed": "Statusaktualisierung fehlgeschlagen, bitte versuchen Sie es später erneut", - "disableOAuth2Client": "OAuth2-Client deaktivieren", - "enableOAuth2Client": "OAuth2-Client aktivieren", - "areYouSureYouWantTo": "Sind Sie sicher, dass Sie diesen OAuth2-Client {{action}} möchten?", - "thisWillPreventTheOAuth2ClientFromBeingUsed": "Dies verhindert die Nutzung des OAuth2-Clients.", - "deleteToken": "Token löschen", - "areYouSureYouWantToDelete": "Sind Sie sicher, dass Sie löschen möchten", - "thisActionWillPermanentlyRemoveTheOauth2Record": "Diese Aktion wird den OAuth2-Eintrag dauerhaft aus dem System entfernen. Dies kann nicht rückgängig gemacht werden.", - "enterIdToConfirmDeletion": "Geben Sie die ID zur Bestätigung der Löschung ein.", - "warning": "Warnung!", - "pleaseBeCareful": "Bitte seien Sie vorsichtig, diese Aktion kann nicht rückgängig gemacht werden.", - "deleteSuccess": "Löschung erfolgreich", - "yourOAuth2ApplicationHasBeenSuccessfullyDeleted": "Ihre OAuth2-Anwendung wurde erfolgreich gelöscht.", - "oauth2DeleteFailed": "OAuth2-Löschung fehlgeschlagen", - "deleteFailed": "Löschung fehlgeschlagen, bitte versuchen Sie es später erneut", - "actions": { - "openMenu": "Menü öffnen", - "edit": "Bearbeiten", - "authorize": "Autorisieren", - "delete": "Löschen" - }, - "authFailed": "OAuth2-Authentifizierung fehlgeschlagen", - "error": "Fehler", - "unknownError": "Es ist ein unbekannter Fehler aufgetreten.", - "tryAgain": "Erneut versuchen", - "goHome": "Zur Startseite", - "authSuccess": "OAuth2-Authentifizierung erfolgreich", - "success": "Erfolg", - "successMessage": "Ihr E-Mail-Konto wurde erfolgreich über OAuth2 authentifiziert. Das Zugriffstoken wurde vom System gespeichert und wird bei Bedarf automatisch aktualisiert.", - "goToAccounts": "Zu Konten gehen", - "authAtatus": "OAuth2-Authentifizierungsstatus", - "information": "Information", - "noStatus": "Diese Seite zeigt das Ergebnis Ihrer OAuth2-Authentifizierung. Derzeit ist kein spezifischer Status verfügbar. Bitte versuchen Sie es bei Bedarf erneut.", - "backToLogin": "Zurück zur Anmeldung" + "form": { + "1day": "1 Tag", + "30days": "30 Tage", + "7days": "7 Tage", + "errorInt": "Muss eine ganze Zahl sein", + "errorMax": "Max. 32 Zeichen", + "errorNumber": "Muss eine Zahl sein", + "errorPositive": "Muss größer als 0 sein", + "expirationDescription": "Token laufen nach der gewählten Zeit automatisch ab.", + "expirationLabel": "Ablauf", + "expirationPlaceholder": "Ablauf wählen", + "nameDescription": "Optional · Max. 32 Zeichen", + "nameLabel": "Name", + "namePlaceholder": "Geben Sie diesem Token einen kurzen Namen", + "never": "Nie" }, - "accessTokens": { - "title": "Zugriffstoken", - "name": "Name", - "accounts": "Konten", - "token": "Token", - "createdAt": "Erstellt am", - "expiresAt": "Läuft ab am", - "edit": "Bearbeiten", - "delete": "Löschen", - "create": "Erstellen", - "noTokens": "Keine Zugriffstoken", - "noTokensDesc": "Sie haben noch keine Zugriffstoken erstellt. Erstellen Sie eines, um API-Funktionen zu nutzen.", - "description": "Verwalten Sie hier Zugriffstoken, deren ACL-Regeln, IP-Whitelist und Ratenbegrenzungseinstellungen.", - "editToken": "Token bearbeiten", - "addNew": "Neu hinzufügen", - "updateTheAccessTokenHere": "Aktualisieren Sie das Zugriffstoken hier.", - "createNewAccessTokenHere": "Erstellen Sie hier ein neues Zugriffstoken.", - "selectAccounts": "Konten auswählen", - "selectMultipleAccountsForTheAccessToken": "Wählen Sie mehrere Konten für den Geltungsbereich des Zugriffstokens aus.", - "enterOneIpAddressPerLine": "Geben Sie eine IP-Adresse pro Zeile ein, z.B.:\n192.168.1.1\n192.168.1.2", - "aListOfIpAddressesAllowed": "Eine Liste von erlaubten IP-Adressen für den Zugriff auf die Ressource. Geben Sie eine IP pro Zeile ein. (Optional)", - "enterQuota": "Quote eingeben, z.B. 100", - "theMaximumNumberOfRequestsAllowed": "Die maximale Anzahl von Anfragen, die innerhalb des Intervalls erlaubt sind. (Optional)", - "enterIntervalInSeconds": "Intervall in Sekunden eingeben, z.B. 60", - "theTimeWindowForTheRateLimit": "Das Zeitfenster (in Sekunden) für die Ratenbegrenzung. (Optional)", - "describeThePurposeOfTheAccessToken": "Beschreiben Sie den Zweck des Zugriffstokens", - "updating": "Wird aktualisiert...", - "saving": "Wird gespeichert...", - "creating": "Wird erstellt...", - "saveChanges": "Änderungen speichern", - "save": "Speichern", - "updated": "Aktualisiert", - "created": "Erstellt", - "yourAccessTokenHasBeenSuccessfully": "Ihr Zugriffstoken wurde erfolgreich {{action}}.", - "updateFailed": "Aktualisierung fehlgeschlagen", - "creationFailed": "Erstellung fehlgeschlagen", - "updateOrCreationFailed": "{{action}} fehlgeschlagen, bitte versuchen Sie es später erneut", - "quotaMustBeAPositiveInteger": "Die Quote muss eine positive ganze Zahl sein.", - "intervalMustBeAPositiveInteger": "Das Intervall muss eine positive ganze Zahl sein.", - "invalidIpAddressesFound": "Ungültige IP-Adressen gefunden. Bitte geben Sie gültige IPv4- oder IPv6-Adressen ein.", - "atLeastOneAccountIsRequired": "Mindestens ein Konto ist erforderlich.", - "descriptionMustNotExceed255Characters": "Die Beschreibung darf 255 Zeichen nicht überschreiten.", - "notUsedYet": "Noch nicht verwendet", - "theListOfAccountsThatCanBeQueried": "Die Liste der Konten, die mit dem Zugriffstoken abgefragt werden können.", - "accountId": "Konto-ID", - "filterByEmailAddressOrAccountId": "Nach E-Mail-Adresse oder Konto-ID filtern...", - "aclRulesForAccessTokens": "ACL-Regeln für Zugriffstoken umfassen die Überprüfung der IP-Whitelist und die Anwendung der Ratenbegrenzung.", - "actions": { - "openMenu": "Menü öffnen", - "edit": "Bearbeiten", - "delete": "Löschen" - }, - "quota": "Quote", - "interval": "Intervall" + "list": { + "createdLabel": "Erstellt am", + "deleteBtn": "Token löschen", + "expiresOnLabel": "Läuft ab am", + "expiresOnShort": "Läuft ab am {{date}}", + "lastUsedLabel": "Zuletzt verwendet", + "neverExpires": "Läuft nie ab", + "neverLabel": "Nie", + "neverUsed": "Nie", + "statusActive": "Aktiv", + "statusExpired": "Abgelaufen", + "tokenLabel": "Token", + "unnamedToken": "Unbenannter Token" }, - "settings": { - "appearance": { - "title": "Erscheinungsbild", - "field": { - "language": "Sprache der Benutzeroberfläche", - "theme": "Design" - }, - "description": { - "language": "Wählen Sie die Sprache für die Web-Oberfläche.", - "theme": "Wählen Sie zwischen hellem oder dunklem Modus." - }, - "placeholder": { - "select_language": "Sprache wählen" - }, - "command": { - "search": "Sprache suchen...", - "no_results": "Keine Sprache gefunden." - }, - "theme": { - "light": "Hell", - "dark": "Dunkel" - }, - "button": { - "update": "Einstellungen aktualisieren" - }, - "validation": { - "language": { - "required": "Bitte wählen Sie eine Sprache aus." - }, - "theme": { - "required": "Bitte wählen Sie ein Thema aus." - } - } - }, - "title": "Einstellungen", - "general": "Allgemein", - "proxy": "Proxy", - "name": "Name", - "host": "Host", - "port": "Port", - "username": "Benutzername", - "password": "Passwort", - "type": "Typ", - "actions": "Aktionen", - "edit": "Bearbeiten", - "delete": "Löschen", - "add": "Hinzufügen", - "noProxies": "Keine Proxys", - "noProxiesDesc": "Sie haben noch keine Proxy-Konfigurationen hinzugefügt. Fügen Sie eine hinzu, um Proxy-Funktionen zu nutzen.", - "root": "Root", - "rootTitle": "Root-Benutzer", - "rootDesc": "Verwalten Sie die Anmeldeinformationen des Root-Benutzers, einschließlich Token und Passwort.", - "rootAccessManagement": "Root-Benutzer-Zugriffsverwaltung", - "manageRootTokenAndPassword": "Verwalten Sie das Root-Token und das Passwort sicher.", - "resetRootToken": "Root-Token zurücksetzen", - "generateNewToken": "Einen neuen Token generieren, der alte läuft sofort ab.", - "reset": "Zurücksetzen", - "resetRootPassword": "Root-Passwort zurücksetzen", - "changePasswordForFutureLogins": "Passwort für zukünftige Anmeldungen ändern.", - "youAreAboutToResetTheRootToken": "Sie sind dabei, das Root-Token zurückzusetzen. Diese Aktion kann nicht rückgängig gemacht werden.", - "confirmReset": "Zurücksetzung bestätigen", - "youAreAboutToResetTheRootPassword": "Sie sind dabei, das Root-Passwort zurückzusetzen. Stellen Sie sicher, dass Sie es sicher speichern.", - "enterNewRootPassword": "Geben Sie das neue Root-Passwort ein", - "theRootTokenHasBeenReset": "Das Root-Token wurde zurückgesetzt", - "yourLoginInformationHasBeenUpdated": "Ihre Anmeldeinformationen wurden aktualisiert. Sie müssen sich nicht erneut anmelden.", - "invalidPassword": "Ungültiges Passwort", - "rootPasswordMustBeAtLeast6Characters": "Das Root-Passwort muss mindestens 6 Zeichen lang sein.", - "theRootPasswordHasBeenReset": "Das Root-Passwort wurde zurückgesetzt", - "useNewPasswordForNextLogin": "Verwenden Sie das neue Passwort für die nächste Anmeldung.", - "failedToCopyText": "Text konnte nicht kopiert werden", - "filterProxy": "Proxys filtern...", - "filterOauth2": "OAuth2 filtern...", - "filterAccount": "Konten filtern...", - "filterAccessToken": "Zugriffstoken filtern...", - "selectAll": "Alle auswählen", - "theme": "Thema", - "id": "Id", - "url": "Url", - "createdAt": "Erstellt am", - "updatedAt": "Aktualisiert am", - "enabled": "Aktiviert", - "useProxy": "Proxy verwenden", - "authUrl": "Autorisierungs-URL", - "tokenUrl": "Token-URL", - "description": "Beschreibung", - "token": "Token", - "accounts": "Konten", - "acl": "ACL", - "lastAccess": "Letzter Zugriff", - "enterProxyIdToConfirmDeletion": "Geben Sie die Proxy-ID zur Bestätigung der Löschung ein.", - "updateTheProxyHere": "Aktualisieren Sie den Proxy hier. ", - "addNewProxyHere": "Fügen Sie hier einen neuen Proxy hinzu. ", - "pleaseUseAnIpAddressForBetterReliability": "Bitte verwenden Sie eine IP-Adresse (z.B. 127.0.0.1) anstelle eines Hostnamens oder einer Domain für bessere Zuverlässigkeit.", - "adding": "Wird hinzugefügt...", - "yourProxyHasBeenSuccessfully": "Ihr Proxy wurde erfolgreich {{action}}.", - "proxyUpdateOrAddFailed": "Proxy {{action}} fehlgeschlagen, bitte versuchen Sie es später erneut", - "sidebar": { - "profile": "Profil", - "apiTokens": "API-Token", - "proxy": "Netzwerk-Proxy", - "configurations": "Systemkonfigurationen" - }, - "profile": { - "loadError": "Benutzerinformationen konnten nicht geladen werden.", - "uploadTitle": "Avatar hochladen", - "maxSize": "Bis zu {{size}}", - "avatarAlt": "Avatar", - "removeAvatar": "Avatar entfernen", - "uploadError": "Fehler beim Hochladen der Datei", - "field": { - "username": "Benutzername", - "email": "E-Mail", - "password": "Passwort" - }, - "placeholder": { - "password_keep": "Leer lassen, um das aktuelle Passwort beizubehalten" - }, - "button": { - "update_profile": "Profil aktualisieren", - "permissions": "Berechtigungen", - "view_global_permissions": "Globale Berechtigungen anzeigen" - }, - "section": { - "roles": "Rollen", - "accounts": "{{count}} verknüpfte Konten" - }, - "account": { - "id": "Konto-ID: {{id}}" - }, - "toast": { - "updated": "Profil erfolgreich aktualisiert", - "update_failed": "Profil konnte nicht aktualisiert werden" - }, - "validation": { - "username": { - "required": "Benutzername ist erforderlich", - "min": "Der Benutzername muss mindestens 5 Zeichen lang sein", - "max": "Der Benutzername darf höchstens 32 Zeichen lang sein" - }, - "email": { - "required": "E-Mail-Adresse ist erforderlich", - "invalid": "Bitte geben Sie eine gültige E-Mail-Adresse ein" - }, - "password": { - "min": "Das Passwort muss mindestens 8 Zeichen lang sein", - "max": "Das Passwort darf höchstens 256 Zeichen lang sein" - } - } - } + "notifications": { + "close": "Schließen", + "copied": "In die Zwischenablage kopiert", + "createFailed": "Erstellung fehlgeschlagen", + "createSuccess": "Zugriffstoken erstellt", + "createSuccessDesc": "Der Zugriffstoken wurde erfolgreich erstellt.", + "deleteFailed": "Zugriffstoken konnte nicht gelöscht werden", + "deleteSuccess": "Zugriffstoken erfolgreich gelöscht", + "genericError": "Vorgang fehlgeschlagen. Bitte versuchen Sie es erneut.", + "tryAgain": "Erneut versuchen", + "updateFailed": "Aktualisierung fehlgeschlagen", + "updateSuccess": "Zugriffstoken aktualisiert", + "updateSuccessDesc": "Der Zugriffstoken wurde erfolgreich aktualisiert." }, - "apiDocs": { - "choosePreferredType": "Wählen Sie den bevorzugten Typ der API-Dokumentation", - "swaggerUI": "Swagger UI", - "reDoc": "ReDoc", - "openAPIExplorer": "OpenAPI Explorer", - "scalar": "Scalar", - "downloadSpecYAML": "Spezifikation YAML herunterladen" + "page": { + "addBtn": "Token hinzufügen", + "emptyDescription": "Sie haben noch keine API-Token erstellt. Klicken Sie unten, um einen zu erstellen.", + "emptyTitle": "Keine API-Token", + "loadError": "API-Token konnten nicht geladen werden." + } + }, + "attachment": { + "all_fields_desc": "Gleicht Anhangsname, Betreff und Absender ab", + "date": "Datum", + "name": "Dateiname", + "search_input_placeholder": "Anhänge durchsuchen (verwenden Sie \" \" für die Phrasensuche)", + "sender": "Absender", + "sender_with_count": "Absender ({{count}})", + "size": "Dateigröße", + "source": "Quelle", + "subject": "Betreff" + }, + "auth": { + "areYouSureYouWantToLogOut": "Sind Sie sicher, dass Sie sich abmelden möchten?", + "invalidPassword": "Ungültiges Passwort. Bitte versuchen Sie es erneut.", + "login": "Anmelden", + "loginFailed": "Anmeldung fehlgeschlagen", + "logout": "Abmelden", + "password": "Passwort", + "sessionExpired": "Sitzung abgelaufen!", + "sessionExpiredDesc": "Ihre Sitzung ist aufgrund von Inaktivität abgelaufen. Bitte melden Sie sich an, um fortzufahren.", + "somethingWentWrong": "Etwas ist schiefgelaufen", + "username": "Benutzername", + "welcome": "Willkommen bei Bichon", + "youWillNeedToLogInAgain": "Sie müssen sich erneut anmelden, um auf Ihr Konto zuzugreifen." + }, + "command": { + "dark": "Dunkel", + "light": "Hell", + "noResultsFound": "Keine Ergebnisse gefunden.", + "theme": "Thema", + "typeCommandOrSearch": "Befehl eingeben oder suchen..." + }, + "common": { + "actions": "Aktionen", + "add": "Hinzufügen", + "all": "Alle", + "apply": "Anwenden", + "back": "Zurück", + "backToHome": "Zurück zur Startseite", + "cancel": "Abbrechen", + "clear": "Leeren", + "close": "Schließen", + "confirm": "Bestätigen", + "create": "Erstellen", + "delete": "Löschen", + "deleting": "Wird gelöscht...", + "deselectAll": "Alle abwählen", + "edit": "Bearbeiten", + "empty": "Leer", + "error": "Fehler", + "failed": "Fehlgeschlagen", + "filter": "Filter", + "goBack": "Zurückgehen", + "loading": "Wird geladen...", + "more": "Mehr", + "na": "N/V", + "no": "Nein", + "noData": "Keine Daten", + "none": "Keine", + "notFound": "Nicht gefunden", + "ok": "OK", + "op_failed": "Vorgang fehlgeschlagen", + "project_description": "Bichon ist ein Open-Source-Projekt.", + "remove": "Entfernen", + "reset": "Zurücksetzen", + "retry": "Wiederholen", + "save": "Speichern", + "save_changes": "Änderungen speichern", + "search": "Suche", + "select": "Auswählen", + "selectAll": "Alle auswählen", + "showLess": "Weniger anzeigen", + "showMore": "Mehr anzeigen...", + "submit": "Absenden", + "table": { + "noResults": "Keine Ergebnisse." }, - "dialogs": { - "confirmDelete": "Löschung bestätigen", - "confirmDeleteDesc": "Sind Sie sicher, dass Sie dieses Element löschen möchten? Diese Aktion kann nicht rückgängig gemacht werden.", - "deleteSuccess": "Erfolgreich gelöscht", - "deleteFailed": "Löschung fehlgeschlagen", - "saveSuccess": "Erfolgreich gespeichert", - "saveFailed": "Speichern fehlgeschlagen", - "createSuccess": "Erfolgreich erstellt", - "createFailed": "Erstellung fehlgeschlagen", - "updateSuccess": "Erfolgreich aktualisiert", - "updateFailed": "Aktualisierung fehlgeschlagen", - "continue": "Weiter", - "deleting": "Wird gelöscht...", - "accountDeleted": "Konto gelöscht", - "accountDeletedDesc": "Ihr Konto wurde erfolgreich gelöscht.", - "accountDeleteFailed": "Löschen des Kontos fehlgeschlagen", - "deleteAccountPermanently": "Konto dauerhaft löschen", - "youAreDeleting": "Sie löschen {{email}}. Dadurch wird Folgendes dauerhaft entfernt:", - "accountCredentials": "Kontozugangsdaten und Konfiguration", - "localCachedMetadata": "Lokal zwischengespeicherte Metadaten und Synchronisierungsstatus", - "imapSyncData": "IMAP-Synchronisierungsdaten", - "oauthTokens": "OAuth-Token und API-Zugangsdaten", - "typeEmailToConfirm": "Geben Sie die E-Mail-Adresse des Kontos zur Bestätigung ein:", - "typeToConfirm": "Geben Sie \"{{email}}\" zur Bestätigung ein", - "cannotBeUndone": "Diese Aktion kann nicht rückgängig gemacht werden!", - "allResourcesErased": "Alle zugehörigen Ressourcen werden dauerhaft gelöscht.", - "permanentlyDeleteAccount": "Konto dauerhaft löschen" + "tryAgain": "Erneut versuchen", + "update": "Aktualisieren", + "view_on_github_button": "Auf GitHub anzeigen", + "yes": "Ja" + }, + "dashboard": { + "account": "Konto", + "actualDiskUsage": "Tatsächliche Festplattennutzung", + "attachmentRatio": "Anhangsverhältnis", + "attachmentRatioDesc": "{{percent}}% der E-Mails haben Anhänge", + "attachments": "Anhänge", + "byMessageCount": "Nach Nachrichtenanzahl", + "byMessageSize": "Nach Nachrichtengröße", + "connected": "Verbunden", + "count": "Anzahl", + "dataStorage": "Datenspeicher", + "dayTrend": "30-Tage-Trend", + "efficiency": "Speichereffizienz", + "emails": "E-Mails", + "indexSize": "Indexgröße", + "localDataFiles": "Lokale Datendateien", + "logicalVolume": "Originalgröße", + "mailAccounts": "E-Mail-Konten", + "messageDistribution": "Nachrichtenverteilung", + "metadataSize": "Metadatengröße", + "newEmails": "Neue E-Mails", + "noAccountData": "Keine Kontodaten", + "noAttachments": "Keine Anhänge", + "noEmailsSynced": "Noch keine E-Mails synchronisiert", + "noLargeEmails": "Keine großen E-Mails", + "noRecentActivity": "Keine kürzliche Aktivität", + "noSendersData": "Keine Absenderdaten", + "noSubject": "(Kein Betreff)", + "saved": "Eingespart", + "sender": "Absender", + "size": "Größe", + "subject": "Betreff", + "syncedLocally": "Lokal synchronisiert", + "systemVersion": "Systemversion", + "tantivyDatabase": "Basiert auf der Tantivy-Suchmaschine", + "title": "Dashboard", + "top10Accounts": "Top 10 Konten", + "top10LargestEmails": "Top 10 größte E-Mails", + "top10Senders": "Top 10 Absender", + "topLists": "Top-Listen", + "totalEmailSize": "Gesamtgröße der E-Mails", + "totalEmails": "Gesamt-E-Mails", + "withAttachments": "Mit Anhängen" + }, + "dialogs": { + "accountCredentials": "Kontozugangsdaten und Konfiguration", + "accountDeleteFailed": "Löschen des Kontos fehlgeschlagen", + "accountDeleted": "Konto gelöscht", + "accountDeletedDesc": "Ihr Konto wurde erfolgreich gelöscht.", + "allResourcesErased": "Alle zugehörigen Ressourcen werden dauerhaft gelöscht.", + "cannotBeUndone": "Diese Aktion kann nicht rückgängig gemacht werden!", + "confirmDelete": "Löschung bestätigen", + "confirmDeleteDesc": "Sind Sie sicher, dass Sie dieses Element löschen möchten? Diese Aktion kann nicht rückgängig gemacht werden.", + "continue": "Weiter", + "createFailed": "Erstellung fehlgeschlagen", + "createSuccess": "Erfolgreich erstellt", + "deleteAccountPermanently": "Konto dauerhaft löschen", + "deleteFailed": "Löschung fehlgeschlagen", + "deleteSuccess": "Erfolgreich gelöscht", + "deleting": "Wird gelöscht...", + "imapSyncData": "IMAP-Synchronisierungsdaten", + "localCachedMetadata": "Lokal zwischengespeicherte Metadaten und Synchronisierungsstatus", + "oauthTokens": "OAuth-Token und API-Zugangsdaten", + "permanentlyDeleteAccount": "Konto dauerhaft löschen", + "saveFailed": "Speichern fehlgeschlagen", + "saveSuccess": "Erfolgreich gespeichert", + "typeEmailToConfirm": "Geben Sie die E-Mail-Adresse des Kontos zur Bestätigung ein:", + "typeToConfirm": "Geben Sie \"{{email}}\" zur Bestätigung ein", + "updateFailed": "Aktualisierung fehlgeschlagen", + "updateSuccess": "Erfolgreich aktualisiert", + "youAreDeleting": "Sie löschen {{email}}. Dadurch wird Folgendes dauerhaft entfernt:" + }, + "errors": { + "contentNotModified": "Inhalt nicht geändert!", + "forbidden": "Verboten", + "forbiddenDesc": "Sie haben keine Berechtigung, auf diese Ressource zuzugreifen.", + "forbiddenTitle": "Zugriff verboten", + "internalServerError": "Interner Serverfehler!", + "learnMore": "Mehr erfahren", + "maintenance": "Wartung", + "maintenanceDesc": "Die Seite ist vorübergehend nicht erreichbar. Wir sind bald wieder online.", + "maintenanceTitle": "Die Seite wird gewartet!", + "networkError": "Netzwerkfehler", + "networkErrorDesc": "Verbindung zum Server nicht möglich. Bitte überprüfen Sie Ihre Internetverbindung und versuchen Sie es erneut.", + "pageNotFound": "Hoppla! Seite nicht gefunden!", + "pageNotFoundDesc": "Die gesuchte Seite existiert anscheinend nicht oder wurde entfernt.", + "somethingWentWrong": "Hoppla! Etwas ist schiefgelaufen :')", + "somethingWentWrongDesc": "Entschuldigen Sie die Unannehmlichkeiten. Bitte versuchen Sie es später erneut.", + "unauthorized": "Nicht autorisiert", + "unauthorizedDesc": "Bitte melden Sie sich mit gültigen Anmeldeinformationen an, um auf diese Ressource zuzugreifen.", + "unauthorizedTitle": "Nicht autorisierter Zugriff" + }, + "mail": { + "account": "Konto", + "attachments": "Anhänge", + "bcc": "BCC", + "cc": "CC", + "date": "Datum", + "delete": "Löschen", + "download": "Herunterladen", + "downloadComplete": "Download abgeschlossen", + "downloadFailed": "Download fehlgeschlagen", + "downloadStarted": "Download gestartet", + "downloaded": "{{id}} heruntergeladen", + "emailViewer": "E-Mail-Anzeige", + "failedToDownloadFile": "Fehler beim Herunterladen der Datei", + "failedToLoadEmail": "Fehler beim Laden der E-Mail.", + "from": "Von", + "id": "ID", + "isBeingDownloaded": "{{id}} wird heruntergeladen", + "noAttachments": "Keine Anhänge", + "noMessageSelected": "Keine Nachricht ausgewählt", + "noTagsYet": "Noch keine Tags", + "onlyNonInlineAttachments": "Es werden nur Nicht-Inline-Anhänge hier angezeigt.", + "showLess": "weniger anzeigen", + "showMore": "mehr anzeigen...", + "subject": "Betreff", + "tags": "Tags", + "to": "An", + "viewThread": "Thread anzeigen" + }, + "mailbox": { + "bulkActions": { + "ariaLabel": "Massenaktionen für {{count}} ausgewählte {{emailLabel}}", + "clearSelection": "Auswahl löschen", + "clearSelectionWithKey": "Auswahl löschen ({{key}})", + "delete": "Löschen", + "deleteTooltip": "Ausgewählte E-Mails löschen", + "email": "E-Mail", + "emails": "E-Mails", + "selected": "ausgewählt" }, - "command": { - "typeCommandOrSearch": "Befehl eingeben oder suchen...", - "noResultsFound": "Keine Ergebnisse gefunden.", - "theme": "Thema", - "light": "Hell", - "dark": "Dunkel" + "deleteDialog": { + "confirm": "Löschen", + "desc": "Sind Sie sicher, dass Sie {{countText}} löschen möchten? Diese Aktion wird die ausgewählte(n) E-Mail(s) dauerhaft aus der lokalen Datenbank entfernen. Die E-Mail(s) gehen für immer verloren und können nicht wiederhergestellt werden.", + "descCountMultiple": "diese {{count}} E-Mails", + "descCountSingle": "diese E-Mail", + "errorTitle": "Löschen von Nachrichten fehlgeschlagen", + "successDesc": "Die Nachrichten wurden gelöscht.", + "successTitle": "Nachrichten erfolgreich gelöscht", + "title": "E-Mail löschen", + "warningDesc": "Gehen Sie mit Vorsicht vor.", + "warningTitle": "Warnung!" + }, + "deleteMailboxDialog": { + "confirm": "Dauerhaft löschen", + "desc": "Sind Sie sicher, dass Sie diesen Postfachordner löschen möchten? Diese Aktion kann nicht rückgängig gemacht werden.", + "errorTitle": "Löschen fehlgeschlagen", + "successDesc": "Der Postfachordner und sein Inhalt wurden erfolgreich entfernt.", + "successTitle": "Erfolgreich gelöscht", + "title": "Postfachordner löschen", + "warningDesc": "Das Löschen dieses Ordners entfernt auch dauerhaft alle darin enthaltenen archivierten E-Mails und Unterordner.", + "warningTitle": "Warnung" + }, + "folders": "Ordner", + "messages": "Nachrichten", + "noMessages": "Keine Nachrichten", + "selectFolder": "Wählen Sie einen Ordner aus, um Nachrichten anzuzeigen", + "thread": { + "empty": "Keine Nachrichten in diesem Thread.", + "invalidDate": "Ungültiges Datum", + "loadError": "Fehler beim Laden des Threads", + "loadMore": "Mehr laden", + "loadingMore": "Wird geladen...", + "message": "Nachricht", + "messages": "Nachrichten", + "noSubject": "(Kein Betreff)", + "title": "Konversations-Thread ({{count}} {{messageLabel}})" + }, + "title": "Postfach" + }, + "navigation": { + "accessTokens": "Zugriffstoken", + "accounts": "Konten", + "apiDocs": "API-Dokumentation", + "attachment": "Anhänge", + "auth": "Authentifizierung", + "dashboard": "Dashboard", + "general": "Allgemein", + "home": "Startseite", + "mailbox": "Postfach", + "oauth2": "OAuth2", + "other": "Sonstiges", + "settings": "Einstellungen", + "users": "Systembenutzer" + }, + "oauth2": { + "aSecretKeyProvidedByTheOAuthProvider": "Ein vom OAuth-Anbieter bereitgestellter geheimer Schlüssel zur Authentifizierung Ihrer Anwendung.", + "actions": { + "authorize": "Autorisieren", + "delete": "Löschen", + "edit": "Bearbeiten", + "openMenu": "Menü öffnen" + }, + "addConfiguration": "Konfiguration hinzufügen", + "addExtraParams": "Zusätzliche Parameter hinzufügen", + "addNew": "Neu hinzufügen", + "addScope": "Bereich hinzufügen", + "areYouSureYouWantTo": "Sind Sie sicher, dass Sie diesen OAuth2-Client {{action}} möchten?", + "areYouSureYouWantToDelete": "Sind Sie sicher, dass Sie löschen möchten", + "authAtatus": "OAuth2-Authentifizierungsstatus", + "authFailed": "OAuth2-Authentifizierung fehlgeschlagen", + "authSuccess": "OAuth2-Authentifizierung erfolgreich", + "authUrlLabel": "Autorisierungs-URL:", + "authorizationUrlCannotBeEmpty": "Autorisierungs-URL darf nicht leer sein", + "authorizationUrlIsRequired": "Autorisierungs-URL ist erforderlich", + "authorize": "Autorisieren", + "authorizeAnEmailAccountToStartTheOAuth2AuthorizationProcess": "Autorisieren Sie ein E-Mail-Konto, um den OAuth2-Autorisierungsprozess zu starten.", + "authorizeEmailAccount": "E-Mail-Konto autorisieren", + "backToLogin": "Zurück zur Anmeldung", + "clickSaveWhenDone": "Klicken Sie auf Speichern, wenn Sie fertig sind.", + "clientId": "Client-ID", + "clientIdCannotBeEmpty": "Client-ID darf nicht leer sein", + "clientIdIsRequired": "Client-ID ist erforderlich", + "clientIdLabel": "Client-ID:", + "clientSecret": "Client-Geheimnis", + "clientSecretCannotBeEmpty": "Client-Geheimnis darf nicht leer sein", + "clientSecretIsRequired": "Client-Geheimnis ist erforderlich", + "clientSecretLabel": "Client-Geheimnis:", + "createAccount": "Konto erstellen", + "createNewHere": "Hier ein neues erstellen.", + "created": "Erstellt", + "creating": "Wird erstellt...", + "creationFailed": "Erstellung fehlgeschlagen", + "delete": "Löschen", + "deleteFailed": "Löschung fehlgeschlagen, bitte versuchen Sie es später erneut", + "deleteSuccess": "Löschung erfolgreich", + "deleteToken": "Token löschen", + "describeThePurposeOfTheOauth2Application": "Beschreiben Sie den Zweck der OAuth2-Anwendung", + "description": "Verwalten Sie automatisch die Beschaffung, Speicherung und Aktualisierung von Zugriffstoken, um ein nahtloses und jederzeit einsatzbereites Authentifizierungserlebnis zu gewährleisten.", + "descriptionLabel": "Beschreibung:", + "descriptionMustNotExceed255Characters": "Die Beschreibung darf 255 Zeichen nicht überschreiten.", + "disable": "Deaktivieren", + "disableOAuth2Client": "OAuth2-Client deaktivieren", + "disabled": "Deaktiviert", + "edit": "Bearbeiten", + "enable": "Aktivieren", + "enableOAuth2Client": "OAuth2-Client aktivieren", + "enabled": "Aktiviert", + "enterIdToConfirmDeletion": "Geben Sie die ID zur Bestätigung der Löschung ein.", + "enterTheAuthorizationUrl": "Geben Sie die Autorisierungs-URL ein", + "enterTheKeyHere": "Geben Sie den Schlüssel hier ein.", + "enterTheScopeHere": "Geben Sie den Bereich hier ein.", + "enterTheTokenUrl": "Geben Sie die Token-URL ein", + "enterTheValueHere": "Geben Sie den Wert hier ein.", + "enterYourClientId": "Geben Sie Ihre Client-ID ein", + "enterYourClientSecret": "Geben Sie Ihr Client-Geheimnis ein", + "enterYourRedirectUrl": "Geben Sie Ihren Weiterleitungs-URI ein", + "error": "Fehler", + "getAuthorizeUrlFailed": "Abrufen der Autorisierungs-URL fehlgeschlagen", + "getAuthorizeUrlFailedDesc": "Fehler beim Abrufen der Autorisierungs-URL, bitte versuchen Sie es später erneut", + "gmail": "Gmail", + "goHome": "Zur Startseite", + "goToAccounts": "Zu Konten gehen", + "id": "ID", + "information": "Information", + "invalidAuthorizationUrlFormat": "Ungültiges Format der Autorisierungs-URL", + "invalidRedirectUriFormat": "Ungültiges Format des Weiterleitungs-URI", + "invalidTokenUrlFormat": "Ungültiges Format der Token-URL", + "key": "Schlüssel:", + "keyCannotBeEmpty": "Schlüssel darf nicht leer sein", + "keyIsRequired": "Schlüssel ist erforderlich", + "leaveEmptyToKeepExistingSecret": "Leer lassen, um das bestehende Geheimnis beizubehalten", + "leaveEmptyToKeepTheExistingSecret": "Leer lassen, um das bestehende Geheimnis beizubehalten, oder einen neuen Wert eingeben, um es zu aktualisieren.", + "loadingAccounts": "Konten werden geladen...", + "noConfigurations": "Keine OAuth2-Konfigurationen", + "noConfigurationsDesc": "Sie haben noch keine OAuth2-Konfigurationen hinzugefügt. Fügen Sie eine hinzu, um mit der Nutzung der OAuth2-Funktionen zu beginnen.", + "noEmailAccountsRegistered": "Keine E-Mail-Konten registriert. Bitte erstellen Sie eines.", + "noProxyAvailable": "Kein Proxy verfügbar", + "noStatus": "Diese Seite zeigt das Ergebnis Ihrer OAuth2-Authentifizierung. Derzeit ist kein spezifischer Status verfügbar. Bitte versuchen Sie es bei Bedarf erneut.", + "oauth2ClientHasBeenSuccessfully": "Ihr OAuth2-Client wurde erfolgreich {{action}}.", + "oauth2ClientUpdated": "OAuth2-Client aktualisiert", + "oauth2DeleteFailed": "OAuth2-Löschung fehlgeschlagen", + "optional": "Optional", + "outlook": "Outlook", + "pleaseBeCareful": "Bitte seien Sie vorsichtig, diese Aktion kann nicht rückgängig gemacht werden.", + "pleaseCreateOne": "Bitte erstellen Sie eines.", + "provider": "Anbieter", + "quickPresets": "Schnelle Voreinstellungen:", + "redirectUri": "Weiterleitungs-URI", + "redirectUriCannotBeEmpty": "Weiterleitungs-URI darf nicht leer sein", + "redirectUriIsRequired": "Weiterleitungs-URI ist erforderlich", + "redirectUrlLabel": "Weiterleitungs-URI:", + "save": "Speichern", + "saveChanges": "Änderungen speichern", + "saving": "Wird gespeichert...", + "scope": "Bereich (Scope):", + "scopes": "Bereiche (Scopes)", + "selectAProxy": "Einen Proxy auswählen", + "selectAnAccount": "Wählen Sie ein Konto aus", + "status": "Status", + "statusUpdateFailed": "Statusaktualisierung fehlgeschlagen, bitte versuchen Sie es später erneut", + "success": "Erfolg", + "successMessage": "Ihr E-Mail-Konto wurde erfolgreich über OAuth2 authentifiziert. Das Zugriffstoken wurde vom System gespeichert und wird bei Bedarf automatisch aktualisiert.", + "theRedirectUrlAfterAuthorization": "Der Weiterleitungs-URI nach der Autorisierung. Er muss mit dem beim OAuth-Anbieter registrierten übereinstimmen. Verwenden Sie das Format http://[host]:[port]/oauth2/callback (oder https://), wobei [host] und [port] mit Ihrer RustMailer-Bereitstellung übereinstimmen. Der Pfad /oauth2/callback ist fest.", + "theUniqueIdentifierForYourApplication": "Der eindeutige Bezeichner für Ihre Anwendung, bereitgestellt vom OAuth-Anbieter.", + "theUrlUsedToExchange": "Die URL, die verwendet wird, um den Autorisierungscode gegen ein Zugriffstoken auszutauschen.", + "theUrlWhereUsersWillBeRedirected": "Die URL, zu der Benutzer weitergeleitet werden, um Ihre Anwendung zu autorisieren.", + "thisActionWillPermanentlyRemoveTheOauth2Record": "Diese Aktion wird den OAuth2-Eintrag dauerhaft aus dem System entfernen. Dies kann nicht rückgängig gemacht werden.", + "thisWillPreventTheOAuth2ClientFromBeingUsed": "Dies verhindert die Nutzung des OAuth2-Clients.", + "title": "OAuth2", + "tokenUrlCannotBeEmpty": "Token-URL darf nicht leer sein", + "tokenUrlIsRequired": "Token-URL ist erforderlich", + "tokenUrlLabel": "Token-URL:", + "tryAgain": "Erneut versuchen", + "unknownError": "Es ist ein unbekannter Fehler aufgetreten.", + "updateFailed": "Aktualisierung fehlgeschlagen", + "updateHere": "Hier aktualisieren.", + "updateOrCreationFailed": "{{action}} fehlgeschlagen, bitte versuchen Sie es später erneut", + "updated": "Aktualisiert", + "useProxyOptional": "Proxy verwenden (Optional):", + "useSocks5ProxyForOAuthRequests": "Verwenden Sie einen SOCKS5-Proxy für OAuth-Anfragen, wenn der direkte Zugriff blockiert ist.", + "value": "Wert:", + "valueCannotBeEmpty": "Wert darf nicht leer sein", + "valueIsRequired": "Wert ist erforderlich", + "warning": "Warnung!", + "whenDisabled": "Bei Deaktivierung: - Neue Autorisierungsflüsse werden sofort abgelehnt - Bestehende Zugriffs- und Aktualisierungstoken werden innerhalb einer Minute widerrufen - Benutzer müssen bei erneuter Aktivierung neu autorisieren", + "yourOAuth2ApplicationHasBeenSuccessfully": "Ihre OAuth2-Anwendung wurde erfolgreich {{action}}.", + "yourOAuth2ApplicationHasBeenSuccessfullyDeleted": "Ihre OAuth2-Anwendung wurde erfolgreich gelöscht." + }, + "permission": { + "account": { + "create": "E-Mail-Konten erstellen", + "manage": "Zugewiesene Konten verwalten", + "manage_all": "Alle Kontokonfigurationen verwalten", + "read_details": "Kontodetails anzeigen" + }, + "category": { + "account": "Kontoberechtigungen", + "global_data": "Globale Daten (Admin)", + "system_identity": "System und Identität" + }, + "data": { + "delete": "Zugewiesene E-Mails löschen", + "delete_all": "E-Mails aller Konten löschen", + "export_batch": "Zugewiesene Daten stapelweise exportieren", + "export_batch_all": "Alle Daten stapelweise exportieren", + "import_batch": "E-Mail-Daten stapelweise importieren", + "manage": "Zugewiesene E-Mail-Metadaten verwalten", + "manage_all": "Alle E-Mail-Metadaten verwalten", + "raw_download": "Zugewiesene Roh-E-Mails herunterladen", + "raw_download_all": "Alle Roh-E-Mails herunterladen", + "read": "Zugewiesene E-Mail-Daten lesen", + "read_all": "Alle E-Mail-Daten lesen", + "smtp_ingest": "E-Mails über das SMTP-Protokoll aufnehmen" + }, + "dialog": { + "account_description": "Auf das ausgewählte Konto beschränkte Berechtigungen.", + "account_title": "Kontoberechtigungen", + "global_description": "Systemweite Berechtigungen für diesen Benutzer.", + "global_title": "Globale Berechtigungen" + }, + "scope": { + "account": "Konto #{{id}}", + "global": "Global" + }, + "system": { + "access": "Grundlegender Systemzugriff", + "root": "Vollständige Systemkontrolle" + }, + "token": { + "manage": "Zugriffstoken verwalten" + }, + "user": { + "manage": "Alle Benutzer verwalten", + "view": "Grundlegende Benutzernamen anzeigen" + } + }, + "profile": { + "avatar_alt": "Avatar", + "menu": { + "profile": "Profil", + "settings": "Einstellungen", + "sign_out": "Abmelden" + } + }, + "proxyDelete": { + "close": "Schließen", + "confirmText": "Sind Sie sicher, dass Sie löschen möchten", + "deleteBtn": "Löschen", + "failedDesc": "Löschung fehlgeschlagen, bitte versuchen Sie es später erneut", + "failedTitle": "Proxy-Löschung fehlgeschlagen", + "permanent": "Diese Aktion wird den Proxy dauerhaft aus dem System entfernen. Dies kann nicht rückgängig gemacht werden.", + "proxyIdLabel": "Proxy-ID:", + "proxyIdPlaceholder": "Geben Sie die Proxy-ID zur Bestätigung der Löschung ein.", + "successDesc": "Proxy wurde erfolgreich gelöscht.", + "successTitle": "Löschung erfolgreich", + "title": "Proxy löschen", + "tryAgain": "Erneut versuchen", + "warningDesc": "Bitte seien Sie vorsichtig, diese Aktion kann nicht rückgängig gemacht werden.", + "warningTitle": "Warnung!" + }, + "restore_message": { + "accountsInvolved": "Beteiligte Konten", + "bulkTitle": "Mehrere Nachrichten wiederherstellen", + "bulkWarning": "Hinweis: Nachrichten werden in ihren ursprünglichen Ordnern wiederhergestellt.", + "confirm": "Wiederherstellung ausführen", + "desc": "Diese Aktion lädt die ausgewählten Nachrichten von Bichon erneut hoch und stellt sie in den entsprechenden Postfächern auf dem IMAP-Server wieder her.", + "failed": "Wiederherstellung fehlgeschlagen", + "failedTitle": "Fehler bei der Wiederherstellung", + "messages": "Nachrichten", + "restore_to_imap": "Nachricht wiederherstellen", + "success": "Wiederherstellung erfolgreich", + "successDesc": "Die ausgewählten Nachrichten wurden erfolgreich auf dem IMAP-Server wiederhergestellt.", + "summary": "Details zur Wiederherstellung", + "title": "Einzelne Nachricht wiederherstellen" + }, + "roles": { + "actions": { + "add": "Rolle hinzufügen", + "cancel": "Abbrechen", + "close": "Schließen", + "failed": "Vorgang fehlgeschlagen", + "retry": "Wiederholen", + "submit_create": "Rolle erstellen", + "submit_update": "Rolle aktualisieren", + "success_create": "Rolle erfolgreich erstellt", + "success_update": "Rolle erfolgreich aktualisiert" + }, + "categories": { + "account_resource": "Kontoressourcen-Zugriff", + "global_data": "Globaler Datenzugriff", + "identity": "Identität & Verwaltung" + }, + "columns": { + "created_at": "Erstellt am", + "id": "ID", + "name": "Name", + "permissions": "Berechtigungen", + "role_type": "Typ", + "updated_at": "Aktualisiert am" + }, + "delete": { + "alert_desc": "Das Löschen dieser Rolle entfernt sie von allen zugewiesenen Benutzern.", + "alert_title": "Warnung: Dauerhafte Aktion.", + "confirm_btn": "Rolle löschen", + "confirm_label": "Geben Sie zur Bestätigung die Rollen-ID ein:", + "deleting": "Löschen...", + "dialog_title": "Benutzerrolle löschen", + "error_fallback": "Rolle konnte nicht gelöscht werden.", + "error_title": "Löschen fehlgeschlagen", + "irreversible": "Diese Aktion kann nicht rückgängig gemacht werden.", + "placeholder": "Geben Sie „{{id}}“ ein", + "success_desc": "Rolle „{{name}}“ wurde erfolgreich entfernt.", + "success_title": "Rolle gelöscht", + "warning_text": "Sie löschen die Rolle {{name}} (ID: {{id}}) dauerhaft." + }, + "description_hint": "Definieren Sie den Zugriffsumfang und Berechtigungen.", + "details": { + "close_btn": "Schließen", + "desc_account": "Zugriff und Datenoperationen für Einzelkonten.", + "desc_global": "Globale Verwaltung und Systemzugriff.", + "role_badge": "{{type}}-Rolle", + "title": "Berechtigungen: {{name}}", + "unknown": "Unbekannte Rolle", + "view_permissions": "Details anzeigen" + }, + "empty": { + "desc": "Sie haben noch keine benutzerdefinierten Rollen erstellt.", + "title": "Keine Rollen gefunden" + }, + "form": { + "builtin_badge": "Integrierte Rolle", + "builtin_desc": "Diese Rolle ist vordefiniert und schreibgeschützt.", + "desc_label": "Beschreibung", + "matrix_label": "Berechtigungsmatrix ({{type}})", + "name_label": "Rollenname", + "type_label": "Rollentyp" + }, + "placeholder": { + "filter": "Rollen suchen..." + }, + "title": { + "create": "Neue Rolle erstellen", + "edit": "Rolle bearbeiten: {{name}}" + }, + "types": { + "Account": "Konto", + "Global": "Global" }, "validation": { - "required": "Dieses Feld ist erforderlich", - "invalidEmail": "Ungültige E-Mail-Adresse", - "invalidUrl": "Ungültige URL", - "passwordMinLength": "Das Passwort muss mindestens {{min}} Zeichen lang sein", - "pleaseEnterPassword": "Bitte geben Sie Ihr Passwort ein", - "passwordRequired": "Passwort ist erforderlich, wenn die Authentifizierungsmethode Passwort ist", - "emailRequired": "E-Mail ist erforderlich", - "imapHostRequired": "IMAP-Host ist erforderlich", - "imapHostCannotBeEmpty": "IMAP-Host darf nicht leer sein", - "imapPortMustBePositive": "Der IMAP-Port muss eine positive ganze Zahl sein", - "imapPortMustBeLessThan65536": "Der IMAP-Port muss kleiner als 65536 sein", - "folderLimitMustBeNumber": "Das Ordnerlimit muss eine Zahl sein", - "folderLimitMustBeAtLeast100": "Das Ordnerlimit muss mindestens 100 betragen", - "incrementalSyncMustBeNumber": "Das inkrementelle Synchronisierungsintervall muss eine Zahl sein", - "incrementalSyncMustBeAtLeast10": "Das inkrementelle Synchronisierungsintervall muss mindestens 10 Minuten betragen", - "pleaseEnterUsernameOrEmail": "Bitte geben Sie Ihren Benutzernamen oder Ihre E-Mail-Adresse ein", - "singleRequestBatchSizeMustBeNumber": "Die Stapelgröße muss eine Zahl sein", - "singleRequestBatchSizeTooSmall": "Die Stapelgröße muss mindestens 10 sein", - "singleRequestBatchSizeTooLarge": "Die Stapelgröße darf höchstens 200 sein" - }, - "table": { - "noResults": "Keine Ergebnisse gefunden", - "loading": "Wird geladen...", - "page": "Seite", - "of": "von", - "rowsPerPage": "Zeilen pro Seite", - "showing": "Anzeige", - "to": "bis", - "results": "Ergebnisse", - "asc": "Aufst.", - "desc": "Abst.", - "hide": "Ausblenden", - "edit": "Bearbeiten", - "delete": "Löschen", - "pagination": { - "selected": "{{selected}} von {{total}} Zeilen ausgewählt.", - "fixed_page_size": "{{size}} Zeilen pro Seite.", - "rows_per_page": "Zeilen pro Seite", - "page_info": "Seite {{page}} von {{total}}", - "first": "Erste Seite", - "previous": "Vorherige Seite", - "next": "Nächste Seite", - "last": "Letzte Seite" - } - }, - "proxyDelete": { - "title": "Proxy löschen", - "successTitle": "Löschung erfolgreich", - "successDesc": "Proxy wurde erfolgreich gelöscht.", - "close": "Schließen", - "failedTitle": "Proxy-Löschung fehlgeschlagen", - "failedDesc": "Löschung fehlgeschlagen, bitte versuchen Sie es später erneut", - "tryAgain": "Erneut versuchen", - "confirmText": "Sind Sie sicher, dass Sie löschen möchten", - "permanent": "Diese Aktion wird den Proxy dauerhaft aus dem System entfernen. Dies kann nicht rückgängig gemacht werden.", - "proxyIdLabel": "Proxy-ID:", - "proxyIdPlaceholder": "Geben Sie die Proxy-ID zur Bestätigung der Löschung ein.", - "warningTitle": "Warnung!", - "warningDesc": "Bitte seien Sie vorsichtig, diese Aktion kann nicht rückgängig gemacht werden.", - "deleteBtn": "Löschen" - }, - "systemConfig": { - "pageTitle": "Systemkonfigurationen", - "pageDescription": "Diese Parameter werden über CLI-Flags oder Umgebungsvariablen initialisiert. Sie sind schreibgeschützt, um die Umgebungskonsistenz zu gewährleisten.", - "status": { - "enabled": "Aktiviert", - "disabled": "Deaktiviert", - "configured": "Konfiguriert", - "missing": "Fehlt", - "auto": "Auto", - "notSet": "Nicht gesetzt" - }, - "sections": { - "network": { - "title": "Netzwerk", - "desc": "HTTP und öffentlicher Zugriff" - }, - "cors": { - "title": "CORS", - "desc": "Cross-Origin-Zugriffsregeln" - }, - "logging": { - "title": "Protokollierung", - "desc": "Verhalten der Log-Ausgabe" - }, - "storage": { - "title": "Speicher & Cache", - "desc": "Datenbankpfade und Limits" - }, - "security": { - "title": "Sicherheit", - "desc": "Authentifizierung & Verschlüsselung" - }, - "performance": { - "title": "Leistung", - "desc": "Nebenläufigkeit & Kompression" - }, - "smtp": { - "title": "SMTP-Server", - "desc": "Einstellungen für den Empfang eingehender E-Mails zur Echtzeit-Archivierung" - } - } - }, - "apiTokens": { - "page": { - "loadError": "API-Token konnten nicht geladen werden.", - "emptyTitle": "Keine API-Token", - "emptyDescription": "Sie haben noch keine API-Token erstellt. Klicken Sie unten, um einen zu erstellen.", - "addBtn": "Token hinzufügen" - }, - "list": { - "unnamedToken": "Unbenannter Token", - "statusActive": "Aktiv", - "statusExpired": "Abgelaufen", - "neverExpires": "Läuft nie ab", - "expiresOnShort": "Läuft ab am {{date}}", - "tokenLabel": "Token", - "createdLabel": "Erstellt am", - "lastUsedLabel": "Zuletzt verwendet", - "expiresOnLabel": "Läuft ab am", - "neverUsed": "Nie", - "neverLabel": "Nie", - "deleteBtn": "Token löschen" - }, - "dialog": { - "createTitle": "Zugriffstoken erstellen", - "editTitle": "Zugriffstoken bearbeiten", - "description": "Klicken Sie auf Speichern, wenn Sie fertig sind.", - "save": "Speichern", - "saveChanges": "Änderungen speichern" - }, - "deleteDialog": { - "title": "Zugriffstoken löschen?", - "description": "Diese Aktion kann nicht rückgängig gemacht werden. Jede Anwendung, die diesen Token verwendet, verliert sofort den Zugriff.", - "cancel": "Abbrechen", - "confirm": "Löschen", - "deleting": "Löschen..." - }, - "form": { - "nameLabel": "Name", - "namePlaceholder": "Geben Sie diesem Token einen kurzen Namen", - "nameDescription": "Optional · Max. 32 Zeichen", - "expirationLabel": "Ablauf", - "expirationPlaceholder": "Ablauf wählen", - "expirationDescription": "Token laufen nach der gewählten Zeit automatisch ab.", - "never": "Nie", - "1day": "1 Tag", - "7days": "7 Tage", - "30days": "30 Tage", - "errorMax": "Max. 32 Zeichen", - "errorNumber": "Muss eine Zahl sein", - "errorInt": "Muss eine ganze Zahl sein", - "errorPositive": "Muss größer als 0 sein" - }, - "notifications": { - "createSuccess": "Zugriffstoken erstellt", - "createSuccessDesc": "Der Zugriffstoken wurde erfolgreich erstellt.", - "updateSuccess": "Zugriffstoken aktualisiert", - "updateSuccessDesc": "Der Zugriffstoken wurde erfolgreich aktualisiert.", - "createFailed": "Erstellung fehlgeschlagen", - "updateFailed": "Aktualisierung fehlgeschlagen", - "deleteSuccess": "Zugriffstoken erfolgreich gelöscht", - "deleteFailed": "Zugriffstoken konnte nicht gelöscht werden", - "copied": "In die Zwischenablage kopiert", - "genericError": "Vorgang fehlgeschlagen. Bitte versuchen Sie es erneut.", - "close": "Schließen", - "tryAgain": "Erneut versuchen" - } - }, - "permission": { - "scope": { - "global": "Global", - "account": "Konto #{{id}}" - }, - "dialog": { - "global_title": "Globale Berechtigungen", - "account_title": "Kontoberechtigungen", - "global_description": "Systemweite Berechtigungen für diesen Benutzer.", - "account_description": "Auf das ausgewählte Konto beschränkte Berechtigungen." - }, - "category": { - "system_identity": "System und Identität", - "global_data": "Globale Daten (Admin)", - "account": "Kontoberechtigungen" - }, - "system": { - "access": "Grundlegender Systemzugriff", - "root": "Vollständige Systemkontrolle" - }, - "user": { - "manage": "Alle Benutzer verwalten", - "view": "Grundlegende Benutzernamen anzeigen" - }, - "token": { - "manage": "Zugriffstoken verwalten" - }, - "account": { - "create": "E-Mail-Konten erstellen", - "manage": "Zugewiesene Konten verwalten", - "manage_all": "Alle Kontokonfigurationen verwalten", - "read_details": "Kontodetails anzeigen" - }, - "data": { - "read": "Zugewiesene E-Mail-Daten lesen", - "read_all": "Alle E-Mail-Daten lesen", - "manage": "Zugewiesene E-Mail-Metadaten verwalten", - "manage_all": "Alle E-Mail-Metadaten verwalten", - "raw_download": "Zugewiesene Roh-E-Mails herunterladen", - "raw_download_all": "Alle Roh-E-Mails herunterladen", - "delete": "Zugewiesene E-Mails löschen", - "delete_all": "E-Mails aller Konten löschen", - "export_batch": "Zugewiesene Daten stapelweise exportieren", - "export_batch_all": "Alle Daten stapelweise exportieren", - "import_batch": "E-Mail-Daten stapelweise importieren", - "smtp_ingest": "E-Mails über das SMTP-Protokoll aufnehmen" - } - }, - "users": { - "columns": { - "id": "ID", - "avatar": "Avatar", - "username": "Benutzername", - "email": "E-Mail-Adresse", - "roles": "Rollen & Berechtigungen", - "created_at": "Erstellt am", - "updated_at": "Aktualisiert am", - "actions": "Aktionen" - }, - "buttons": { - "add": "Benutzer hinzufügen", - "add_new": "Neuen Benutzer anlegen" - }, - "empty": { - "title": "Keine Benutzer gefunden", - "description": "Klicken Sie auf die Schaltfläche unten, um Ihren ersten Benutzer hinzuzufügen." - }, - "nav": { - "users": "Benutzer", - "roles": "Rollen", - "api_tokens": "API-Token" - }, - "api_tokens": { - "empty": { - "title": "Keine API-Token gefunden", - "description": "Im System wurden noch keine API-Token generiert." - }, - "button": { - "generate": "Neuen Token erzeugen" - }, - "toolbar": { - "search_placeholder": "Suche nach Name, Besitzer oder Token..." - }, - "table": { - "name": "Name", - "type": "Typ", - "last_used": "Zuletzt verwendet", - "expires_at": "Läuft ab am", - "owner": "Besitzer", - "created": "Erstellt", - "api_key": "API-Schlüssel", - "web_ui": "Web-UI", - "never": "Nie", - "permanent": "Unbefristet", - "expired": "Abgelaufen", - "unnamed": "Unbenannter Token" - }, - "unnamed": "Unbenannter Token", - "delete": { - "title": "API-Token löschen", - "desc": "Sie sind im Begriff, diesen API-Token dauerhaft zu löschen", - "prefix": "Token-Präfix", - "irreversible": "Diese Aktion kann nicht rückgängig gemacht werden. Alle Anwendungen, die diesen Token verwenden, verlieren sofort den Zugriff.", - "confirm_label": "Geben Sie zur Bestätigung {{word}} ein:", - "confirm_placeholder": "Geben Sie „{{word}}“ ein", - "warning_title": "Warnung", - "warning_desc": "Skripte oder Dienste, die diesen Token nutzen, werden fehlschlagen. Stellen Sie sicher, dass Ihre Systeme aktualisiert wurden.", - "confirm_button": "Token löschen", - "deleting": "Löschen..." - }, - "toast": { - "deleted_title": "API-Token gelöscht", - "deleted_desc": "Der Token „{{name}}“ wurde erfolgreich entfernt.", - "delete_failed_title": "Löschen fehlgeschlagen", - "delete_failed": "Token konnte nicht gelöscht werden, bitte erneut versuchen." - } - }, - "tokens": { - "schema": { - "name_max": "Max. 32 Zeichen", - "expire_number": "Muss eine Zahl sein", - "expire_int": "Muss eine ganze Zahl sein", - "expire_positive": "Muss größer als 0 sein" - }, - "toast": { - "update_success_title": "Zugriffstoken aktualisiert", - "update_success_desc": "Der Zugriffstoken wurde erfolgreich aktualisiert.", - "create_success_title": "Zugriffstoken erstellt", - "create_success_desc": "Der Zugriffstoken wurde erfolgreich erstellt.", - "update_failed_title": "Aktualisierung fehlgeschlagen", - "create_failed_title": "Erstellung fehlgeschlagen" - }, - "error": { - "fallback": "Vorgang fehlgeschlagen, bitte versuchen Sie es später erneut." - }, - "dialog": { - "edit_title": "Zugriffstoken bearbeiten", - "create_title": "Zugriffstoken erstellen", - "description": "Klicken Sie auf Speichern, wenn Sie fertig sind." - }, - "fields": { - "name_label": "Name", - "name_placeholder": "Geben Sie dem Token einen kurzen Namen", - "name_hint": "Optional · Max. 32 Zeichen", - "expire_label": "Ablauf", - "expire_placeholder": "Ablauf wählen", - "expire_hint": "Der Token läuft nach der gewählten Zeit automatisch ab." - }, - "expire_options": { - "never": "Läuft nie ab", - "1_day": "1 Tag", - "7_days": "7 Tage", - "30_days": "30 Tage" - } - }, - "tokens_action": { - "dialog": { - "title": "API-Token", - "description": "Verwalten Sie die API-Token für diesen Benutzer." - }, - "empty": { - "title": "Keine API-Token", - "description": "Dieser Benutzer hat derzeit keine API-Token." - }, - "buttons": { - "add": "Token hinzufügen" - }, - "list": { - "unnamed_token": "Unbenannter Token", - "status_expired": "Abgelaufen", - "status_active": "Aktiv", - "expires_on_brief": "Läuft ab am {{date}}", - "never_expires": "Läuft nie ab", - "label_token": "Token", - "label_created": "Erstellt am", - "label_last_used": "Zuletzt verwendet", - "label_expires_at": "Ablaufdatum", - "never": "Nie", - "button_delete": "Token löschen" - }, - "delete_dialog": { - "title": "Zugriffstoken löschen?", - "description": "Diese Aktion kann nicht rückgängig gemacht werden." - } - }, - "actions": { - "schema": { - "account_required": "Bitte wählen Sie ein Konto", - "role_required": "Bitte wählen Sie eine Rolle", - "username_required": "Benutzername ist erforderlich", - "username_min": "Benutzername muss mindestens 3 Zeichen lang sein", - "username_max": "Benutzername darf maximal 32 Zeichen lang sein", - "email_required": "E-Mail-Adresse ist erforderlich", - "email_invalid": "Bitte geben Sie eine gültige E-Mail-Adresse ein", - "global_role_required": "Weisen Sie mindestens eine globale Rolle zu", - "description_max": "Beschreibung darf maximal 256 Zeichen lang sein", - "ip_invalid": "Ungültige IP-Adresse erkannt", - "password_required": "Passwort ist erforderlich", - "password_min": "Passwort muss mindestens 8 Zeichen lang sein", - "password_max": "Passwort darf maximal 256 Zeichen lang sein" - }, - "toast": { - "updated": "Benutzer aktualisiert", - "created": "Benutzer erstellt" - }, - "dialog": { - "edit_title": "Benutzer bearbeiten: {{name}}", - "create_title": "Neuen Benutzer erstellen", - "subtitle": "Konfigurieren Sie Identität, Zugriffsebenen und Sicherheitsrichtlinien." - }, - "tabs": { - "general": "Allgemein", - "permissions": "Kontoberechtigungen", - "security": "Sicherheit & ACL" - }, - "sections": { - "basic": "Basis-Identität", - "global": "Globale Berechtigungen", - "mail_access": "E-Mail-Zugriffskontrolle", - "mail_access_subtitle": "Legen Sie fest, welche E-Mail-Konten verwaltet werden dürfen.", - "policy": "Richtlinien" - }, - "fields": { - "username": "Benutzername", - "username_hint": "Eindeutige Kennung für den System-Login.", - "email": "E-Mail-Adresse", - "email_hint": "Primäre Kontakt- und Benachrichtigungsadresse.", - "password": "Passwort", - "password_placeholder_create": "Mindestens 8 Zeichen", - "password_placeholder_edit": "Leer lassen, um aktuelles Passwort zu behalten", - "password_hint_create": "Sicheres Passwort für die Ersteinrichtung.", - "password_hint_edit": "Geben Sie nur ein neues Passwort ein, wenn Sie es ändern möchten.", - "global_roles_hint": "Weisen Sie Systemberechtigungen zu.", - "description": "Beschreibung (optional)", - "description_placeholder": "Notizen zu diesem Benutzer...", - "description_hint": "Interne Notizen (max. 256 Zeichen).", - "select_account": "Konto wählen", - "assign_role": "Rolle zuweisen", - "ip_whitelist": "IP-Whitelist", - "ip_whitelist_hint": "Login auf diese IPs beschränken (eine pro Zeile).", - "rate_quota": "Ratenkontingent", - "burst_interval": "Burst-Intervall (Sek.)" - }, - "buttons": { - "add_account": "Konto hinzufügen", - "update": "Benutzer aktualisieren", - "create": "Benutzer erstellen" - }, - "states": { - "full_access": "Vollzugriffs-Modus", - "full_access_desc": "Administratoren haben inhärenten Zugriff auf alle Konten.", - "no_accounts": "Keine spezifischen Konten zugewiesen.", - "security_disabled": "Sicherheitsrichtlinien sind derzeit deaktiviert." - }, - "api_tokens": "API-Token", - "placeholder": { - "filter": "Benutzer suchen..." - }, - "delete": { - "title": "Benutzer löschen", - "confirm_msg": "Sie löschen den Benutzer {{name}} (ID: {{id}}) dauerhaft.", - "irreversible": "Diese Aktion kann nicht rückgängig gemacht werden.", - "input_label": "Geben Sie zur Bestätigung die Benutzer-ID ein:", - "placeholder": "Geben Sie „{{id}}“ ein", - "alert_title": "Warnung: Dauerhafte Aktion.", - "alert_desc": "Benutzer und alle zugehörigen Daten werden sofort gelöscht.", - "button_confirm": "Benutzer löschen", - "button_deleting": "Löschen...", - "toast": { - "success_title": "Benutzer gelöscht", - "success_desc": "Benutzer „{{name}}“ wurde erfolgreich entfernt.", - "failed_title": "Löschen fehlgeschlagen", - "failed_fallback": "Benutzer konnte nicht gelöscht werden." - } - } - } - }, - "roles": { - "title": { - "create": "Neue Rolle erstellen", - "edit": "Rolle bearbeiten: {{name}}" - }, - "description_hint": "Definieren Sie den Zugriffsumfang und Berechtigungen.", - "form": { - "name_label": "Rollenname", - "type_label": "Rollentyp", - "desc_label": "Beschreibung", - "matrix_label": "Berechtigungsmatrix ({{type}})", - "builtin_badge": "Integrierte Rolle", - "builtin_desc": "Diese Rolle ist vordefiniert und schreibgeschützt." - }, - "types": { - "Global": "Global", - "Account": "Konto" - }, - "categories": { - "identity": "Identität & Verwaltung", - "global_data": "Globaler Datenzugriff", - "account_resource": "Kontoressourcen-Zugriff" - }, - "actions": { - "cancel": "Abbrechen", - "submit_create": "Rolle erstellen", - "submit_update": "Rolle aktualisieren", - "success_create": "Rolle erfolgreich erstellt", - "success_update": "Rolle erfolgreich aktualisiert", - "failed": "Vorgang fehlgeschlagen", - "close": "Schließen", - "retry": "Wiederholen", - "add": "Rolle hinzufügen" - }, - "validation": { - "name_required": "Rollenname ist erforderlich", - "perm_required": "Wählen Sie mindestens eine Berechtigung" - }, - "columns": { - "id": "ID", - "name": "Name", - "role_type": "Typ", - "permissions": "Berechtigungen", - "created_at": "Erstellt am", - "updated_at": "Aktualisiert am" - }, - "placeholder": { - "filter": "Rollen suchen..." - }, - "delete": { - "dialog_title": "Benutzerrolle löschen", - "warning_text": "Sie löschen die Rolle {{name}} (ID: {{id}}) dauerhaft.", - "irreversible": "Diese Aktion kann nicht rückgängig gemacht werden.", - "confirm_label": "Geben Sie zur Bestätigung die Rollen-ID ein:", - "placeholder": "Geben Sie „{{id}}“ ein", - "alert_title": "Warnung: Dauerhafte Aktion.", - "alert_desc": "Das Löschen dieser Rolle entfernt sie von allen zugewiesenen Benutzern.", - "confirm_btn": "Rolle löschen", - "deleting": "Löschen...", - "success_title": "Rolle gelöscht", - "success_desc": "Rolle „{{name}}“ wurde erfolgreich entfernt.", - "error_title": "Löschen fehlgeschlagen", - "error_fallback": "Rolle konnte nicht gelöscht werden." - }, - "details": { - "title": "Berechtigungen: {{name}}", - "unknown": "Unbekannte Rolle", - "role_badge": "{{type}}-Rolle", - "desc_global": "Globale Verwaltung und Systemzugriff.", - "desc_account": "Zugriff und Datenoperationen für Einzelkonten.", - "close_btn": "Schließen", - "view_permissions": "Details anzeigen" - }, - "empty": { - "title": "Keine Rollen gefunden", - "desc": "Sie haben noch keine benutzerdefinierten Rollen erstellt." - } - }, - "profile": { - "avatar_alt": "Avatar", - "menu": { - "profile": "Profil", - "settings": "Einstellungen", - "sign_out": "Abmelden" - } - }, - "sign_out": { - "title": "Abmelden", - "desc": "Möchten Sie sich wirklich abmelden? Sie müssen sich erneut anmelden, um auf Ihr Konto zuzugreifen.", - "confirm": "Abmelden" - }, - "restore_message": { - "title": "Einzelne Nachricht wiederherstellen", - "bulkTitle": "Mehrere Nachrichten wiederherstellen", - "bulkWarning": "Hinweis: Nachrichten werden in ihren ursprünglichen Ordnern wiederhergestellt.", - "accountsInvolved": "Beteiligte Konten", - "summary": "Details zur Wiederherstellung", - "messages": "Nachrichten", - "desc": "Diese Aktion lädt die ausgewählten Nachrichten von Bichon erneut hoch und stellt sie in den entsprechenden Postfächern auf dem IMAP-Server wieder her.", - "confirm": "Wiederherstellung ausführen", - "restore_to_imap": "Nachricht wiederherstellen", - "success": "Wiederherstellung erfolgreich", - "successDesc": "Die ausgewählten Nachrichten wurden erfolgreich auf dem IMAP-Server wiederhergestellt.", - "failed": "Wiederherstellung fehlgeschlagen", - "failedTitle": "Fehler bei der Wiederherstellung" - }, - "time": { - "label": "Zeit", - "since": "Seit", - "before": "Vor", - "recent_range": "Letzter Zeitraum (seit …)", - "historical": "Historischer Zeitraum (vor …)", - "absolute_range": "Absoluter Datumsbereich", - "last_day": "Letzter 1 Tag", - "last_days": "Letzte {{count}} Tage", - "last_months": "Letzte {{count}} Monate", - "over_years_ago": "Vor {{count}} {{unit}}", - "year": "Jahr", - "years": "Jahre", - "recent_prefix": "Kürzlich:", - "days_ago_to_now": "Tage bis heute", - "apply": "Anwenden", - "start_date": "Startdatum", - "end_date": "Enddatum", - "clear_filters": "Zeitfilter löschen", - "format": "yyyy-MM-dd" - }, - "tag": { - "label": "Tags", - "search_placeholder": "Tags suchen...", - "clear_all": "Alle Tags löschen", - "no_tags_found": "Keine Tags gefunden" - }, - "search_accounts": { - "label": "E-Mail-Konten", - "search_placeholder": "E-Mail-Konten suchen...", - "clear_accounts": "Ausgewählte Konten löschen", - "no_accounts_found": "Keine Konten gefunden" - }, - "search_mailbox": { - "label": "Postfächer", - "search_placeholder": "Postfächer durchsuchen", - "clear_mailboxes": "Ausgewählte Ordner löschen", - "select_account_first": "Bitte zuerst ein E-Mail-Konto auswählen", - "no_mailbox_found": "Kein Ordner gefunden" - }, - "search_contacts": { - "label": "Kontakte", - "label_with_count": "Kontakte ({{count}})", - "any": "Alle", - "search_placeholder": "{{field}} suchen...", - "reset_all": "Alle Kontakte zurücksetzen", - "no_contact_found": "Keine Kontakte gefunden", - "loading": "Wird geladen...", - "showing_limit": "Nur die ersten 100 Ergebnisse angezeigt • Gesamt {{total}}" - }, - "search_more": { - "trigger_label": "Erweitert", - "title": "Erweiterte Filter", - "reset": "Zurücksetzen", - "has_attachment": "Mit Anhang", - "attachment_name_label": "Anhangname", - "attachment_name_placeholder": "z. B. invoice.pdf", - "message_size_label": "Nachrichtengröße", - "message_id_label": "Originale Message-ID", - "message_id_description": "Suche über die Message-ID im E-Mail-Header", - "apply": "Filter anwenden", - "size_presets": { - "any": "Beliebige Größe", - "tiny": "Sehr klein (< 15 KB)", - "small": "Klein (< 2 MB)", - "medium": "Mittel (2 – 10 MB)", - "large": "Groß (10 – 20 MB)", - "huge": "Sehr groß (> 20 MB)" - }, - "any": "Beliebig", - "search_placeholder": "{{field}} suchen...", - "extension": "Dateiendung", - "category": "Anhangskategorie", - "content_types": "Spezifischer Typ" - }, - "search_view": { - "button_label": "Ansicht", - "menu_title": "Spalteneinstellungen" - }, - "search_reset": { - "label": "Zurücksetzen", - "tooltip": "Alle Filter entfernen" - }, - "search_input": { - "placeholder": "E-Mails suchen... (Regex unterstützt)", - "button": "Suchen", - "recent_title": "Letzte Suchanfragen", - "clear_history": "Verlauf löschen", - "no_history": "Kein Suchverlauf", - "all": "Alle Felder", - "all_fields_desc": "Matcht Betreff, Text, Absender und Empfänger", - "subject": "Betreff", - "body": "Inhalt" + "name_required": "Rollenname ist erforderlich", + "perm_required": "Wählen Sie mindestens eine Berechtigung" } + }, + "search": { + "account": "Konto", + "addEmailAccount": "E-Mail-Konto hinzufügen", + "addTags": { + "cancel": "Abbrechen", + "createHint": "Neues Tag erstellen: {{tag}}", + "invalidTitle": "Ungültiges Tag", + "none": "Noch keine Tags hinzugefügt", + "save": "Speichern", + "saving": "Wird gespeichert...", + "searchPlaceholder": "Tags suchen oder erstellen...", + "selectedCount": "{{count}} Tag(s) ausgewählt", + "title": "Tags bearbeiten", + "tryAgain": "Bitte versuchen Sie es später erneut", + "updateFailedTitle": "Aktualisierung fehlgeschlagen", + "updatedDesc": "Tags wurden erfolgreich aktualisiert", + "updatedTitle": "Tags aktualisiert" + }, + "adjustSearch": "Versuchen Sie, Ihre Suchkriterien anzupassen oder Filter zu löschen.", + "advanced": "Erweitert", + "advancedFilters": "Erweiterte Filter", + "any": "Beliebig", + "attachmentName": "Anhangsname", + "attachmentsSize": "Anhänge & Größe", + "bcc": "BCC", + "before": "Vor:", + "bulkActions": { + "ariaLabel": "{{count}} Nachrichten ausgewählt. Aktionsleiste", + "clear": "Auswahl aufheben", + "delete": "Löschen", + "deleteDesc": "Ausgewählte Nachrichten löschen", + "manageTags": "Tags verwalten", + "selected": "{{count}} ausgewählt" + }, + "cc": "CC", + "clear": "Löschen", + "date": "Datum", + "dateRange": "Datumsbereich", + "delete": { + "confirmButton": "Löschen", + "confirmDetail": "Dies kann nicht rückgängig gemacht werden.", + "confirmPrefix": "Möchten Sie wirklich", + "countLabel": "{{count}} Nachricht(en) löschen?", + "errorTitle": "Fehler beim Löschen", + "successDesc": "Erfolgreich gelöscht.", + "successTitle": "Gelöscht", + "title": "Nachrichten löschen", + "warningDesc": "Gelöschte Nachrichten werden dauerhaft entfernt.", + "warningTitle": "Warnung" + }, + "editTag": "Tag bearbeiten", + "endDate": "Enddatum", + "from": "Von", + "fullTextMultiAccount": "Volltext · Mehrere Konten · Erweiterte Filter", + "hasAttachment": "Hat Anhang", + "huge": "Riesig (≥20 MB)", + "keyword": "Stichwort", + "large": "Groß (10 - 20 MB)", + "mailbox": "Postfach", + "maxSize": "Max. Größe", + "maximumBytes": "Maximum (Bytes)", + "medium": "Mittel (2 - 10 MB)", + "messageId": "Nachrichten-ID", + "minSize": "Min. Größe", + "minimumBytes": "Minimum (Bytes)", + "no": "Nein", + "noActiveEmailAccount": "Kein aktives E-Mail-Konto.", + "noEmailsFound": "Keine E-Mails gefunden", + "noMailboxSelectAccount": "Kein Postfach. Bitte wählen Sie zuerst ein Konto aus.", + "originalMessageIdHeader": "Message-ID-Header der Original-E-Mail", + "pleaseSelectAtLeastOne": "Bitte wählen Sie mindestens ein Suchkriterium aus", + "preview": "Vorschau", + "recipient": "Empfänger", + "searchArchivedEmails": "Archivierte E-Mails durchsuchen", + "searchButton": "Suchen", + "searchInSubjectBody": "In Betreff, Text, Anhängen suchen...", + "searching": "Wird gesucht, bitte warten Sie...", + "searchingButton": "Wird gesucht...", + "selectAccount": "Konto auswählen", + "selectDate": "Datum auswählen", + "selectMailbox": "Postfach auswählen", + "sender": "Absender", + "senderRecipients": "Absender / Empfänger", + "since": "Seit:", + "size": "Größe", + "sizeDescription": "Die Größe bezieht sich auf die gesamte E-Mail inklusive Anhängen.", + "small": "Klein (<2 MB)", + "sort": "Sortieren", + "source": "Quelle", + "startDate": "Startdatum", + "startSearching": "Beginnen Sie mit der Suche nach Stichworten, Absendern oder verwenden Sie erweiterte Filter.", + "subject": "Betreff", + "tagFilter": "Tag-Filter", + "thread": { + "empty": "Keine Nachrichten in diesem Thread", + "error": "Fehler beim Laden des Threads", + "invalidDate": "Ungültiges Datum", + "loadMore": "Mehr laden", + "loadingMore": "Wird geladen...", + "noSubject": "(Kein Betreff)", + "title": "Konversations-Thread · {{count}} Nachrichten" + }, + "tiny": "Sehr klein (<15 KB)", + "title": "Suchen", + "to": "An", + "updateTags": { + "actionAdd": "Hinzufügen", + "actionOverwrite": "Überschreiben", + "actionRemove": "Entfernen", + "cancel": "Abbrechen", + "createHint": "Eingabetaste drücken, um neuen Tag zu erstellen: \"{{tag}}\"", + "invalidTitle": "Ungültiger Tag", + "none": "Keine Tags ausgewählt", + "overwriteWarning": "Warnung: Dies überschreibt alle vorhandenen Tags der ausgewählten Elemente.", + "savingAdd": "Wird hinzugefügt...", + "savingOverwrite": "Wird überschrieben...", + "savingRemove": "Wird entfernt...", + "searchPlaceholder": "Tag suchen oder erstellen...", + "selectedCount": "{{count}} Tag(s) werden angewendet", + "submitAdd": "Tags hinzufügen", + "submitOverwrite": "Tags überschreiben", + "submitRemove": "Tags entfernen", + "title": "Tags aktualisieren", + "tryAgain": "Bitte versuchen Sie es später erneut.", + "updateFailedTitle": "Aktualisierung fehlgeschlagen", + "updatedDesc": "Tags wurden erfolgreich aktualisiert.", + "updatedTitle": "Tags aktualisiert" + }, + "yes": "Ja" + }, + "search_accounts": { + "clear_accounts": "Ausgewählte Konten löschen", + "label": "E-Mail-Konten", + "no_accounts_found": "Keine Konten gefunden", + "search_placeholder": "E-Mail-Konten suchen..." + }, + "search_contacts": { + "any": "Alle", + "label": "Kontakte", + "label_with_count": "Kontakte ({{count}})", + "loading": "Wird geladen...", + "no_contact_found": "Keine Kontakte gefunden", + "reset_all": "Alle Kontakte zurücksetzen", + "search_placeholder": "{{field}} suchen...", + "showing_limit": "Nur die ersten 100 Ergebnisse angezeigt • Gesamt {{total}}" + }, + "search_input": { + "all": "Alle Felder", + "all_fields_desc": "Matcht Betreff, Text, Absender und Empfänger", + "body": "Inhalt", + "button": "Suchen", + "clear_history": "Verlauf löschen", + "no_history": "Kein Suchverlauf", + "placeholder": "E-Mails durchsuchen (verwenden Sie \" \" für die Phrasensuche)", + "recent_title": "Letzte Suchanfragen", + "subject": "Betreff" + }, + "search_mailbox": { + "clear_mailboxes": "Ausgewählte Ordner löschen", + "label": "Postfächer", + "no_mailbox_found": "Kein Ordner gefunden", + "search_placeholder": "Postfächer durchsuchen", + "select_account_first": "Bitte zuerst ein E-Mail-Konto auswählen" + }, + "search_more": { + "any": "Beliebig", + "apply": "Filter anwenden", + "attachment_name_label": "Anhangname", + "attachment_name_placeholder": "z. B. invoice.pdf", + "category": "Anhangskategorie", + "content_type": "Dateityp", + "extension": "Dateiendung", + "has_attachment": "Mit Anhang", + "is_message": "E-Mail-Format-Anhang", + "is_message_desc": "Dieser Anhang ist eine E-Mail-Datei, z. B. eine .eml-Datei.", + "message_id_description": "Suche über die Message-ID im E-Mail-Header", + "message_id_label": "Originale Message-ID", + "message_size_label": "Nachrichtengröße", + "reset": "Zurücksetzen", + "search_placeholder": "{{field}} suchen...", + "size_presets": { + "any": "Beliebige Größe", + "huge": "Sehr groß (> 20 MB)", + "large": "Groß (10 – 20 MB)", + "medium": "Mittel (2 – 10 MB)", + "small": "Klein (< 2 MB)", + "tiny": "Sehr klein (< 15 KB)" + }, + "title": "Erweiterte Filter", + "trigger_label": "Erweitert" + }, + "search_reset": { + "label": "Zurücksetzen", + "tooltip": "Alle Filter entfernen" + }, + "search_view": { + "button_label": "Ansicht", + "menu_title": "Spalteneinstellungen" + }, + "settings": { + "accounts": "Konten", + "acl": "ACL", + "actions": "Aktionen", + "add": "Hinzufügen", + "addNewProxyHere": "Fügen Sie hier einen neuen Proxy hinzu. ", + "adding": "Wird hinzugefügt...", + "appearance": { + "button": { + "update": "Einstellungen aktualisieren" + }, + "command": { + "no_results": "Keine Sprache gefunden.", + "search": "Sprache suchen..." + }, + "description": { + "language": "Wählen Sie die Sprache für die Web-Oberfläche.", + "theme": "Wählen Sie zwischen hellem oder dunklem Modus." + }, + "field": { + "language": "Sprache der Benutzeroberfläche", + "theme": "Design" + }, + "placeholder": { + "select_language": "Sprache wählen" + }, + "theme": { + "dark": "Dunkel", + "light": "Hell" + }, + "title": "Erscheinungsbild", + "validation": { + "language": { + "required": "Bitte wählen Sie eine Sprache aus." + }, + "theme": { + "required": "Bitte wählen Sie ein Thema aus." + } + } + }, + "authUrl": "Autorisierungs-URL", + "changePasswordForFutureLogins": "Passwort für zukünftige Anmeldungen ändern.", + "confirmReset": "Zurücksetzung bestätigen", + "createdAt": "Erstellt am", + "delete": "Löschen", + "description": "Beschreibung", + "edit": "Bearbeiten", + "enabled": "Aktiviert", + "enterNewRootPassword": "Geben Sie das neue Root-Passwort ein", + "enterProxyIdToConfirmDeletion": "Geben Sie die Proxy-ID zur Bestätigung der Löschung ein.", + "failedToCopyText": "Text konnte nicht kopiert werden", + "filterAccessToken": "Zugriffstoken filtern...", + "filterAccount": "Konten filtern...", + "filterOauth2": "OAuth2 filtern...", + "filterProxy": "Proxys filtern...", + "general": "Allgemein", + "generateNewToken": "Einen neuen Token generieren, der alte läuft sofort ab.", + "host": "Host", + "id": "Id", + "invalidPassword": "Ungültiges Passwort", + "lastAccess": "Letzter Zugriff", + "manageRootTokenAndPassword": "Verwalten Sie das Root-Token und das Passwort sicher.", + "name": "Name", + "noProxies": "Keine Proxys", + "noProxiesDesc": "Sie haben noch keine Proxy-Konfigurationen hinzugefügt. Fügen Sie eine hinzu, um Proxy-Funktionen zu nutzen.", + "password": "Passwort", + "pleaseUseAnIpAddressForBetterReliability": "Bitte verwenden Sie eine IP-Adresse (z.B. 127.0.0.1) anstelle eines Hostnamens oder einer Domain für bessere Zuverlässigkeit.", + "port": "Port", + "profile": { + "account": { + "id": "Konto-ID: {{id}}" + }, + "avatarAlt": "Avatar", + "button": { + "permissions": "Berechtigungen", + "update_profile": "Profil aktualisieren", + "view_global_permissions": "Globale Berechtigungen anzeigen" + }, + "field": { + "email": "E-Mail", + "password": "Passwort", + "username": "Benutzername" + }, + "loadError": "Benutzerinformationen konnten nicht geladen werden.", + "maxSize": "Bis zu {{size}}", + "placeholder": { + "password_keep": "Leer lassen, um das aktuelle Passwort beizubehalten" + }, + "removeAvatar": "Avatar entfernen", + "section": { + "accounts": "{{count}} verknüpfte Konten", + "roles": "Rollen" + }, + "toast": { + "update_failed": "Profil konnte nicht aktualisiert werden", + "updated": "Profil erfolgreich aktualisiert" + }, + "uploadError": "Fehler beim Hochladen der Datei", + "uploadTitle": "Avatar hochladen", + "validation": { + "email": { + "invalid": "Bitte geben Sie eine gültige E-Mail-Adresse ein", + "required": "E-Mail-Adresse ist erforderlich" + }, + "password": { + "max": "Das Passwort darf höchstens 256 Zeichen lang sein", + "min": "Das Passwort muss mindestens 8 Zeichen lang sein" + }, + "username": { + "max": "Der Benutzername darf höchstens 32 Zeichen lang sein", + "min": "Der Benutzername muss mindestens 5 Zeichen lang sein", + "required": "Benutzername ist erforderlich" + } + } + }, + "proxy": "Proxy", + "proxyUpdateOrAddFailed": "Proxy {{action}} fehlgeschlagen, bitte versuchen Sie es später erneut", + "reset": "Zurücksetzen", + "resetRootPassword": "Root-Passwort zurücksetzen", + "resetRootToken": "Root-Token zurücksetzen", + "root": "Root", + "rootAccessManagement": "Root-Benutzer-Zugriffsverwaltung", + "rootDesc": "Verwalten Sie die Anmeldeinformationen des Root-Benutzers, einschließlich Token und Passwort.", + "rootPasswordMustBeAtLeast6Characters": "Das Root-Passwort muss mindestens 6 Zeichen lang sein.", + "rootTitle": "Root-Benutzer", + "selectAll": "Alle auswählen", + "sidebar": { + "apiTokens": "API-Token", + "configurations": "Systemkonfigurationen", + "profile": "Profil", + "proxy": "Netzwerk-Proxy" + }, + "theRootPasswordHasBeenReset": "Das Root-Passwort wurde zurückgesetzt", + "theRootTokenHasBeenReset": "Das Root-Token wurde zurückgesetzt", + "theme": "Thema", + "title": "Einstellungen", + "token": "Token", + "tokenUrl": "Token-URL", + "type": "Typ", + "updateTheProxyHere": "Aktualisieren Sie den Proxy hier. ", + "updatedAt": "Aktualisiert am", + "url": "Url", + "useNewPasswordForNextLogin": "Verwenden Sie das neue Passwort für die nächste Anmeldung.", + "useProxy": "Proxy verwenden", + "username": "Benutzername", + "youAreAboutToResetTheRootPassword": "Sie sind dabei, das Root-Passwort zurückzusetzen. Stellen Sie sicher, dass Sie es sicher speichern.", + "youAreAboutToResetTheRootToken": "Sie sind dabei, das Root-Token zurückzusetzen. Diese Aktion kann nicht rückgängig gemacht werden.", + "yourLoginInformationHasBeenUpdated": "Ihre Anmeldeinformationen wurden aktualisiert. Sie müssen sich nicht erneut anmelden.", + "yourProxyHasBeenSuccessfully": "Ihr Proxy wurde erfolgreich {{action}}." + }, + "sign_out": { + "confirm": "Abmelden", + "desc": "Möchten Sie sich wirklich abmelden? Sie müssen sich erneut anmelden, um auf Ihr Konto zuzugreifen.", + "title": "Abmelden" + }, + "systemConfig": { + "pageDescription": "Diese Parameter werden über CLI-Flags oder Umgebungsvariablen initialisiert. Sie sind schreibgeschützt, um die Umgebungskonsistenz zu gewährleisten.", + "pageTitle": "Systemkonfigurationen", + "sections": { + "cors": { + "desc": "Cross-Origin-Zugriffsregeln", + "title": "CORS" + }, + "logging": { + "desc": "Verhalten der Log-Ausgabe", + "title": "Protokollierung" + }, + "network": { + "desc": "HTTP und öffentlicher Zugriff", + "title": "Netzwerk" + }, + "performance": { + "desc": "Nebenläufigkeit & Kompression", + "title": "Leistung" + }, + "security": { + "desc": "Authentifizierung & Verschlüsselung", + "title": "Sicherheit" + }, + "smtp": { + "desc": "Einstellungen für den Empfang eingehender E-Mails zur Echtzeit-Archivierung", + "title": "SMTP-Server" + }, + "storage": { + "desc": "Datenbankpfade und Limits", + "title": "Speicher & Cache" + } + }, + "status": { + "auto": "Auto", + "configured": "Konfiguriert", + "disabled": "Deaktiviert", + "enabled": "Aktiviert", + "missing": "Fehlt", + "notSet": "Nicht gesetzt" + } + }, + "table": { + "asc": "Aufst.", + "delete": "Löschen", + "desc": "Abst.", + "edit": "Bearbeiten", + "hide": "Ausblenden", + "loading": "Wird geladen...", + "noResults": "Keine Ergebnisse gefunden", + "of": "von", + "page": "Seite", + "pagination": { + "first": "Erste Seite", + "fixed_page_size": "{{size}} Zeilen pro Seite.", + "last": "Letzte Seite", + "next": "Nächste Seite", + "page_info": "Seite {{page}} von {{total}}", + "previous": "Vorherige Seite", + "rows_per_page": "Zeilen pro Seite", + "selected": "{{selected}} von {{total}} Zeilen ausgewählt." + }, + "results": "Ergebnisse", + "rowsPerPage": "Zeilen pro Seite", + "showing": "Anzeige", + "to": "bis" + }, + "tag": { + "clear_all": "Alle Tags löschen", + "label": "Tags", + "no_tags_found": "Keine Tags gefunden", + "search_placeholder": "Tags suchen..." + }, + "time": { + "absolute_range": "Absoluter Datumsbereich", + "apply": "Anwenden", + "before": "Vor", + "clear_filters": "Zeitfilter löschen", + "days_ago_to_now": "Tage bis heute", + "end_date": "Enddatum", + "format": "yyyy-MM-dd", + "historical": "Historischer Zeitraum (vor …)", + "label": "Zeit", + "last_day": "Letzter 1 Tag", + "last_days": "Letzte {{count}} Tage", + "last_months": "Letzte {{count}} Monate", + "over_years_ago": "Vor {{count}} {{unit}}", + "recent_prefix": "Kürzlich:", + "recent_range": "Letzter Zeitraum (seit …)", + "since": "Seit", + "start_date": "Startdatum", + "year": "Jahr", + "years": "Jahre" + }, + "users": { + "actions": { + "api_tokens": "API-Token", + "buttons": { + "add_account": "Konto hinzufügen", + "create": "Benutzer erstellen", + "update": "Benutzer aktualisieren" + }, + "delete": { + "alert_desc": "Benutzer und alle zugehörigen Daten werden sofort gelöscht.", + "alert_title": "Warnung: Dauerhafte Aktion.", + "button_confirm": "Benutzer löschen", + "button_deleting": "Löschen...", + "confirm_msg": "Sie löschen den Benutzer {{name}} (ID: {{id}}) dauerhaft.", + "input_label": "Geben Sie zur Bestätigung die Benutzer-ID ein:", + "irreversible": "Diese Aktion kann nicht rückgängig gemacht werden.", + "placeholder": "Geben Sie „{{id}}“ ein", + "title": "Benutzer löschen", + "toast": { + "failed_fallback": "Benutzer konnte nicht gelöscht werden.", + "failed_title": "Löschen fehlgeschlagen", + "success_desc": "Benutzer „{{name}}“ wurde erfolgreich entfernt.", + "success_title": "Benutzer gelöscht" + } + }, + "dialog": { + "create_title": "Neuen Benutzer erstellen", + "edit_title": "Benutzer bearbeiten: {{name}}", + "subtitle": "Konfigurieren Sie Identität, Zugriffsebenen und Sicherheitsrichtlinien." + }, + "fields": { + "assign_role": "Rolle zuweisen", + "burst_interval": "Burst-Intervall (Sek.)", + "description": "Beschreibung (optional)", + "description_hint": "Interne Notizen (max. 256 Zeichen).", + "description_placeholder": "Notizen zu diesem Benutzer...", + "email": "E-Mail-Adresse", + "email_hint": "Primäre Kontakt- und Benachrichtigungsadresse.", + "global_roles_hint": "Weisen Sie Systemberechtigungen zu.", + "ip_whitelist": "IP-Whitelist", + "ip_whitelist_hint": "Login auf diese IPs beschränken (eine pro Zeile).", + "password": "Passwort", + "password_hint_create": "Sicheres Passwort für die Ersteinrichtung.", + "password_hint_edit": "Geben Sie nur ein neues Passwort ein, wenn Sie es ändern möchten.", + "password_placeholder_create": "Mindestens 8 Zeichen", + "password_placeholder_edit": "Leer lassen, um aktuelles Passwort zu behalten", + "rate_quota": "Ratenkontingent", + "select_account": "Konto wählen", + "username": "Benutzername", + "username_hint": "Eindeutige Kennung für den System-Login." + }, + "placeholder": { + "filter": "Benutzer suchen..." + }, + "schema": { + "account_required": "Bitte wählen Sie ein Konto", + "description_max": "Beschreibung darf maximal 256 Zeichen lang sein", + "email_invalid": "Bitte geben Sie eine gültige E-Mail-Adresse ein", + "email_required": "E-Mail-Adresse ist erforderlich", + "global_role_required": "Weisen Sie mindestens eine globale Rolle zu", + "ip_invalid": "Ungültige IP-Adresse erkannt", + "password_max": "Passwort darf maximal 256 Zeichen lang sein", + "password_min": "Passwort muss mindestens 8 Zeichen lang sein", + "password_required": "Passwort ist erforderlich", + "role_required": "Bitte wählen Sie eine Rolle", + "username_max": "Benutzername darf maximal 32 Zeichen lang sein", + "username_min": "Benutzername muss mindestens 3 Zeichen lang sein", + "username_required": "Benutzername ist erforderlich" + }, + "sections": { + "basic": "Basis-Identität", + "global": "Globale Berechtigungen", + "mail_access": "E-Mail-Zugriffskontrolle", + "mail_access_subtitle": "Legen Sie fest, welche E-Mail-Konten verwaltet werden dürfen.", + "policy": "Richtlinien" + }, + "states": { + "full_access": "Vollzugriffs-Modus", + "full_access_desc": "Administratoren haben inhärenten Zugriff auf alle Konten.", + "no_accounts": "Keine spezifischen Konten zugewiesen.", + "security_disabled": "Sicherheitsrichtlinien sind derzeit deaktiviert." + }, + "tabs": { + "general": "Allgemein", + "permissions": "Kontoberechtigungen", + "security": "Sicherheit & ACL" + }, + "toast": { + "created": "Benutzer erstellt", + "updated": "Benutzer aktualisiert" + } + }, + "api_tokens": { + "button": { + "generate": "Neuen Token erzeugen" + }, + "delete": { + "confirm_button": "Token löschen", + "confirm_label": "Geben Sie zur Bestätigung {{word}} ein:", + "confirm_placeholder": "Geben Sie „{{word}}“ ein", + "deleting": "Löschen...", + "desc": "Sie sind im Begriff, diesen API-Token dauerhaft zu löschen", + "irreversible": "Diese Aktion kann nicht rückgängig gemacht werden. Alle Anwendungen, die diesen Token verwenden, verlieren sofort den Zugriff.", + "prefix": "Token-Präfix", + "title": "API-Token löschen", + "warning_desc": "Skripte oder Dienste, die diesen Token nutzen, werden fehlschlagen. Stellen Sie sicher, dass Ihre Systeme aktualisiert wurden.", + "warning_title": "Warnung" + }, + "empty": { + "description": "Im System wurden noch keine API-Token generiert.", + "title": "Keine API-Token gefunden" + }, + "table": { + "api_key": "API-Schlüssel", + "created": "Erstellt", + "expired": "Abgelaufen", + "expires_at": "Läuft ab am", + "last_used": "Zuletzt verwendet", + "name": "Name", + "never": "Nie", + "owner": "Besitzer", + "permanent": "Unbefristet", + "type": "Typ", + "unnamed": "Unbenannter Token", + "web_ui": "Web-UI" + }, + "toast": { + "delete_failed": "Token konnte nicht gelöscht werden, bitte erneut versuchen.", + "delete_failed_title": "Löschen fehlgeschlagen", + "deleted_desc": "Der Token „{{name}}“ wurde erfolgreich entfernt.", + "deleted_title": "API-Token gelöscht" + }, + "toolbar": { + "search_placeholder": "Suche nach Name, Besitzer oder Token..." + }, + "unnamed": "Unbenannter Token" + }, + "buttons": { + "add": "Benutzer hinzufügen", + "add_new": "Neuen Benutzer anlegen" + }, + "columns": { + "actions": "Aktionen", + "avatar": "Avatar", + "created_at": "Erstellt am", + "email": "E-Mail-Adresse", + "id": "ID", + "roles": "Rollen & Berechtigungen", + "updated_at": "Aktualisiert am", + "username": "Benutzername" + }, + "empty": { + "description": "Klicken Sie auf die Schaltfläche unten, um Ihren ersten Benutzer hinzuzufügen.", + "title": "Keine Benutzer gefunden" + }, + "nav": { + "api_tokens": "API-Token", + "roles": "Rollen", + "users": "Benutzer" + }, + "tokens": { + "dialog": { + "create_title": "Zugriffstoken erstellen", + "description": "Klicken Sie auf Speichern, wenn Sie fertig sind.", + "edit_title": "Zugriffstoken bearbeiten" + }, + "error": { + "fallback": "Vorgang fehlgeschlagen, bitte versuchen Sie es später erneut." + }, + "expire_options": { + "1_day": "1 Tag", + "30_days": "30 Tage", + "7_days": "7 Tage", + "never": "Läuft nie ab" + }, + "fields": { + "expire_hint": "Der Token läuft nach der gewählten Zeit automatisch ab.", + "expire_label": "Ablauf", + "expire_placeholder": "Ablauf wählen", + "name_hint": "Optional · Max. 32 Zeichen", + "name_label": "Name", + "name_placeholder": "Geben Sie dem Token einen kurzen Namen" + }, + "schema": { + "expire_int": "Muss eine ganze Zahl sein", + "expire_number": "Muss eine Zahl sein", + "expire_positive": "Muss größer als 0 sein", + "name_max": "Max. 32 Zeichen" + }, + "toast": { + "create_failed_title": "Erstellung fehlgeschlagen", + "create_success_desc": "Der Zugriffstoken wurde erfolgreich erstellt.", + "create_success_title": "Zugriffstoken erstellt", + "update_failed_title": "Aktualisierung fehlgeschlagen", + "update_success_desc": "Der Zugriffstoken wurde erfolgreich aktualisiert.", + "update_success_title": "Zugriffstoken aktualisiert" + } + }, + "tokens_action": { + "buttons": { + "add": "Token hinzufügen" + }, + "delete_dialog": { + "description": "Diese Aktion kann nicht rückgängig gemacht werden.", + "title": "Zugriffstoken löschen?" + }, + "dialog": { + "description": "Verwalten Sie die API-Token für diesen Benutzer.", + "title": "API-Token" + }, + "empty": { + "description": "Dieser Benutzer hat derzeit keine API-Token.", + "title": "Keine API-Token" + }, + "list": { + "button_delete": "Token löschen", + "expires_on_brief": "Läuft ab am {{date}}", + "label_created": "Erstellt am", + "label_expires_at": "Ablaufdatum", + "label_last_used": "Zuletzt verwendet", + "label_token": "Token", + "never": "Nie", + "never_expires": "Läuft nie ab", + "status_active": "Aktiv", + "status_expired": "Abgelaufen", + "unnamed_token": "Unbenannter Token" + } + } + }, + "validation": { + "emailRequired": "E-Mail ist erforderlich", + "folderLimitMustBeAtLeast100": "Das Ordnerlimit muss mindestens 100 betragen", + "folderLimitMustBeNumber": "Das Ordnerlimit muss eine Zahl sein", + "imapHostCannotBeEmpty": "IMAP-Host darf nicht leer sein", + "imapHostRequired": "IMAP-Host ist erforderlich", + "imapPortMustBeLessThan65536": "Der IMAP-Port muss kleiner als 65536 sein", + "imapPortMustBePositive": "Der IMAP-Port muss eine positive ganze Zahl sein", + "incrementalSyncMustBeAtLeast10": "Das inkrementelle Synchronisierungsintervall muss mindestens 10 Minuten betragen", + "incrementalSyncMustBeNumber": "Das inkrementelle Synchronisierungsintervall muss eine Zahl sein", + "invalidEmail": "Ungültige E-Mail-Adresse", + "invalidUrl": "Ungültige URL", + "passwordMinLength": "Das Passwort muss mindestens {{min}} Zeichen lang sein", + "passwordRequired": "Passwort ist erforderlich, wenn die Authentifizierungsmethode Passwort ist", + "pleaseEnterPassword": "Bitte geben Sie Ihr Passwort ein", + "pleaseEnterUsernameOrEmail": "Bitte geben Sie Ihren Benutzernamen oder Ihre E-Mail-Adresse ein", + "required": "Dieses Feld ist erforderlich", + "singleRequestBatchSizeMustBeNumber": "Die Stapelgröße muss eine Zahl sein", + "singleRequestBatchSizeTooLarge": "Die Stapelgröße darf höchstens 200 sein", + "singleRequestBatchSizeTooSmall": "Die Stapelgröße muss mindestens 10 sein" + } } \ No newline at end of file diff --git a/web/src/locales/en.json b/web/src/locales/en.json index 551ffbd..941f17f 100644 --- a/web/src/locales/en.json +++ b/web/src/locales/en.json @@ -1,334 +1,217 @@ { - "common": { - "submit": "Submit", - "cancel": "Cancel", - "save": "Save", - "save_changes": "Save Changes", - "delete": "Delete", - "edit": "Edit", - "search": "Search", - "add": "Add", - "remove": "Remove", - "create": "Create", - "update": "Update", - "confirm": "Confirm", - "close": "Close", - "yes": "Yes", - "no": "No", - "ok": "OK", - "loading": "Loading...", - "empty": "Empty", - "noData": "No Data", - "table": { - "noResults": "No results." - }, - "failed": "Failed", - "notFound": "Not Found", - "back": "Back", - "goBack": "Go Back", - "backToHome": "Back to Home", - "tryAgain": "Try Again", - "more": "More", - "actions": "Actions", - "filter": "Filter", - "reset": "Reset", - "clear": "Clear", - "error": "Error", - "apply": "Apply", - "select": "Select", - "selectAll": "Select All", - "deselectAll": "Deselect All", - "all": "All", - "none": "None", - "showLess": "Show Less", - "showMore": "Show More...", - "project_description": "Bichon is an open-source project.", - "view_on_github_button": "View on GitHub", - "op_failed": "Operation failed", - "na": "N/A", - "retry": "Retry", - "deleting": "Deleting..." - }, - "navigation": { - "home": "Home", - "settings": "Settings", + "accessTokens": { + "aListOfIpAddressesAllowed": "A list of IP addresses allowed to access the resource. Enter one IP address per line. (Optional)", + "accountId": "Account ID", "accounts": "Accounts", - "dashboard": "Dashboard", - "mailbox": "Mailbox", - "oauth2": "OAuth2", - "accessTokens": "Access Tokens", - "apiDocs": "API Documentation", - "general": "General", - "auth": "Auth", - "other": "Other", - "users": "System Users" - }, - "auth": { - "welcome": "Welcome to Bichon", - "username": "Username", - "password": "Password", - "login": "Login", - "loginFailed": "Login Failed", - "invalidPassword": "Invalid password. Please try again.", - "somethingWentWrong": "Something went wrong", - "sessionExpired": "Session expired!", - "sessionExpiredDesc": "Your session has ended due to inactivity. Please log in again to continue.", - "logout": "Log out", - "areYouSureYouWantToLogOut": "Are you sure you want to log out?", - "youWillNeedToLogInAgain": "You will need to log in again to access your account." - }, - "errors": { - "pageNotFound": "Oops! Page Not Found!", - "pageNotFoundDesc": "It seems like the page you're looking for does not exist or might have been removed.", - "somethingWentWrong": "Oops! Something went wrong :')", - "somethingWentWrongDesc": "We apologize for the inconvenience. Please try again later.", - "internalServerError": "Internal Server Error!", - "contentNotModified": "Content not modified!", - "networkError": "Network Error", - "networkErrorDesc": "Unable to connect to the server. Please check your internet connection and try again.", - "forbidden": "Forbidden", - "forbiddenTitle": "Access Forbidden", - "forbiddenDesc": "You don't have necessary permission to view this resource.", - "unauthorized": "Unauthorized", - "unauthorizedTitle": "Unauthorized Access", - "unauthorizedDesc": "Please log in with the appropriate credentials to access this resource.", - "maintenance": "Maintenance", - "maintenanceTitle": "Website is under maintenance!", - "maintenanceDesc": "The site is not available at the moment. We'll be back online shortly.", - "learnMore": "Learn more" - }, - "dashboard": { - "title": "Dashboard", - "mailAccounts": "Mail Accounts", - "connected": "Connected", - "totalEmails": "Total Emails", - "syncedLocally": "Synced locally", - "totalEmailSize": "Total Email Size", - "logicalVolume": "Original Size", - "localDataFiles": "Local Data Files", - "actualDiskUsage": "Actual disk usage", - "efficiency": "Efficiency", - "saved": "Saved", - "dataStorage": "Storage", - "indexSize": "Index", - "metadataSize": "Metadata Size", - "tantivyDatabase": "Based on Tantivy Search Engine", - "dayTrend": "30-Day Trend", - "attachments": "Attachments", - "topLists": "Top Lists", - "newEmails": "New Emails", - "messageDistribution": "Message distribution", - "attachmentRatio": "Attachment Ratio", - "attachmentRatioDesc": "{{percent}}% of emails have attachments", - "noEmailsSynced": "No emails synced yet", - "withAttachments": "With Attachments", - "noAttachments": "No Attachments", - "top10Senders": "Top 10 Senders", - "byMessageCount": "By message count", - "sender": "Sender", - "count": "Count", - "top10LargestEmails": "Top 10 Largest Emails", - "byMessageSize": "By message size", - "subject": "Subject", - "size": "Size", - "noSubject": "(No Subject)", - "top10Accounts": "Top 10 Accounts", - "emails": "Emails", - "account": "Account", - "noRecentActivity": "No recent activity", - "noSendersData": "No senders data", - "noLargeEmails": "No large emails", - "noAccountData": "No account data", - "systemVersion": "System Version" + "aclRulesForAccessTokens": "ACL rules for access tokens include IP whitelist verification and rate limit enforcement.", + "actions": { + "delete": "Delete", + "edit": "Edit", + "openMenu": "Open menu" + }, + "addNew": "Add New", + "atLeastOneAccountIsRequired": "At least one account is required.", + "create": "Create", + "createNewAccessTokenHere": "Create new access token here.", + "created": "Created", + "createdAt": "Created At", + "creating": "Creating...", + "creationFailed": "Creation Failed", + "delete": "Delete", + "describeThePurposeOfTheAccessToken": "Describe the purpose of the access token", + "description": "Manage your access tokens, their access controls, IP whitelists, and rate-limiting settings here.", + "descriptionMustNotExceed255Characters": "Description must not exceed 255 characters.", + "edit": "Edit", + "editToken": "Edit Token", + "enterIntervalInSeconds": "Enter interval in seconds, e.g., 60", + "enterOneIpAddressPerLine": "Enter one IP address per line, e.g.:\n192.168.1.1\n192.168.1.2", + "enterQuota": "Enter quota, e.g., 100", + "expiresAt": "Expires At", + "filterByEmailAddressOrAccountId": "Filter by email address or account ID...", + "interval": "Interval", + "intervalMustBeAPositiveInteger": "Interval must be a positive integer.", + "invalidIpAddressesFound": "Invalid IP addresses found. Please enter valid IPv4 or IPv6 addresses.", + "name": "Name", + "noTokens": "No Access Tokens", + "noTokensDesc": "You haven't created any access tokens yet. Create one to start using API features.", + "notUsedYet": "Not used yet", + "quota": "Quota", + "quotaMustBeAPositiveInteger": "Quota must be a positive integer.", + "save": "Save", + "saveChanges": "Save changes", + "saving": "Saving...", + "selectAccounts": "Select accounts", + "selectMultipleAccountsForTheAccessToken": "Select multiple accounts for the access token's authorization scope.", + "theListOfAccountsThatCanBeQueried": "The list of accounts that can be queried using an access token.", + "theMaximumNumberOfRequestsAllowed": "The maximum number of requests allowed within the interval. (Optional)", + "theTimeWindowForTheRateLimit": "The time window (in seconds) for the rate limit. (Optional)", + "title": "Access Tokens", + "token": "Token", + "updateFailed": "Update Failed", + "updateOrCreationFailed": "{{action}} failed, please try again later", + "updateTheAccessTokenHere": "Update the access token here.", + "updated": "Updated", + "updating": "Updating...", + "yourAccessTokenHasBeenSuccessfully": "Your access token has been successfully {{action}}." }, "accounts": { - "beforeRelativeValue": "Download emails before {{value}} {{unit}} ago", - "sinceRelativeValue": "Download emails from the last", - "downloadBatchSize": "Download batch size", - "downloadBatchSizeDescription": "Number of messages fetched per IMAP request", - "downloadScopeDescription": "Choose which emails should be indexed and downloaded.", - "downloadScope": "Download Strategy", - "selectMode": "Select filter mode", - "downloadAll": "Download All Emails", - "sinceFixed": "Since Specific Date", - "sinceRelative": "Download Recent Emails Only", - "beforeRelative": "Download Old Emails Only", - "duration": "Duration", - "unit": "Unit", "accessControl": "Access Control", - "owner": "Creator", + "accessTokenCopiedToClipboard": "Access token copied to clipboard", "access_control": { - "title": "Account Access Assignment", - "description": "Assign roles and authorized users to {{email}}", - "role_label": "Access Role", - "role_placeholder": "Select a role", - "role_loading": "Loading roles...", - "user_label": "Select Authorized Users", - "user_search_placeholder": "Search by username or email...", - "user_empty": "No users found", - "user_selected_count": "Selected: {{count}} user(s)", "buttons": { "cancel": "Cancel", "save": "Save Assignment" }, - "validation": { - "user_required": "Please select at least one user", - "role_required": "Please select a role to assign" - }, + "description": "Assign roles and authorized users to {{email}}", + "role_label": "Access Role", + "role_loading": "Loading roles...", + "role_placeholder": "Select a role", + "title": "Account Access Assignment", "toast": { - "success_title": "Assignment Successful", + "failed_title": "Assignment Failed", "success_desc": "Permissions have been successfully assigned to {{email}}", - "failed_title": "Assignment Failed" + "success_title": "Assignment Successful" + }, + "user_empty": "No users found", + "user_label": "Select Authorized Users", + "user_search_placeholder": "Search by username or email...", + "user_selected_count": "Selected: {{count}} user(s)", + "validation": { + "role_required": "Please select a role to assign", + "user_required": "Please select at least one user" } }, - "title": "Email Accounts", - "description": "Manage and configure your email accounts.", - "addImap": "Add IMAP", - "addNoSync": "Add NoSync", - "moreAccountTypes": "More account types", - "noAccountConfigurations": "No Account Configurations", - "noAccountConfigurationsDesc": "You haven't added any Account configurations yet. Add one to start using Account features.", - "addConfiguration": "Add Configuration", - "useNoProxy": "No Proxy", - "login_name": "Login Name", - "name": "Name", - "email": "Email", - "status": "Status", - "type": "Type", - "lastSync": "Last Sync", + "accountCreated": "Account Created", + "accountCreatedDesc": "Your account has been successfully created.", + "accountCreationFailed": "Account Creation Failed", + "accountDetails": "Account Details", + "accountHasBeenSuccessfully": "Account has been successfully {{action}}", + "accountSyncFoldersUpdateFailed": "Account Sync Folders Update Failed", + "accountSyncFoldersUpdated": "Account Sync Folders Updated", + "accountUpdateFailed": "Account Update Failed", + "accountUpdated": "Account Updated", + "accountUpdatedDesc": "Your account has been successfully updated.", "actions": "Actions", - "edit": "Edit", - "delete": "Delete", - "detail": "Detail", - "selectMailboxes": "Choose Mailboxes", - "oauth2Tokens": "OAuth2 Tokens", - "id": "ID", - "enabled": "Enabled", + "addAccount": "Add Account", + "addConfiguration": "Add Configuration", + "addImap": "Add IMAP", + "addNewEmailAccountHere": "Add new email account here. ", + "addNoSync": "Add NoSync", + "allMailFolderSelected": "Heads Up: \"All Mail\" Folder Selected", + "allMailFolderSelectedDesc": "Selecting folders with the \"All Mail\" attribute will likely lead to duplicating messages already synced from folders like Inbox and Sent. This may consume significantly more storage space.", + "allMailSkipped": "Selected standard folders. 'All Mail' was skipped to avoid duplicates.", + "areYouSureYouWantTo": "Are you sure you want to {{action}} this account?", "auth": "Auth", - "incSync": "Inc Sync", - "state": "State", + "authType": "auth_type", + "autoConfiguring": "Auto-configuring...", + "beforeRelative": "Download Old Emails Only", + "beforeRelativeValue": "Download emails before {{value}} {{unit}} ago", + "capabilities": "Capabilities", + "chooseAuthMethod": "Choose the authentication method for IMAP.", + "chooseEncryptionMethod": "Choose the encryption method for IMAP.", + "chooseMailboxesToDownload": "Choose mailboxes to download for {{email}}. Newly added mailboxes will be downloaded in the next cycle.", + "clickHere": "click here", + "clickSaveWhenDone": "Click save when you're done.", + "continue": "Continue", "createdAt": "Created At", - "updatedAt": "Updated At", - "openMenu": "Open menu", + "creationFailed": "Creation failed, please try again later", + "dateSelection": "Date Selection", + "dateSince": "Date Since", + "days": "Days", + "delete": "Delete", + "description": "Manage and configure your email accounts.", + "detail": "Detail", + "detailsOfTheOAuth2TokensForTheAccount": "Details of the OAuth2 tokens for the account.", + "determinesWhetherThisAccountIsActiveNoSync": "Determines whether this account is active. If disabled, the account will not be able to import data.", + "disable": "Disable", + "disableAccount": "Disable account", + "disabled": "Disabled", + "downloadAll": "Download All Emails", + "downloadBatchSize": "Download batch size", + "downloadBatchSizeDescription": "Number of messages fetched per IMAP request", + "downloadInterval": "Download Interval (minutes)", + "downloadIntervalPlaceholder": "Enter minutes", + "downloadScope": "Download Strategy", + "downloadScopeDescription": "Choose which emails should be indexed and downloaded.", + "duration": "Duration", + "edit": "Edit", + "email": "Email", "emailAccountRegistration": "Email Account Registration", "emailAccountRegistrationDesc": "Please enter your email address. In the following steps, you will configure IMAP details. We will use this address to automatically discover IMAP server settings.", "emailAddress": "Email Address", - "emailPlaceholder": "e.g john.doe@example.com", - "namePlaceholder": "e.g john.doe", - "optional": "Optional", - "nameDescription": "IMAP username. Defaults to your email; custom name supported.", "emailCannotBeModified": "The email account address cannot be modified when editing.", - "addAccount": "Add Account", - "updateAccount": "Update Account", - "accountUpdated": "Account Updated", - "accountCreated": "Account Created", - "accountUpdatedDesc": "Your account has been successfully updated.", - "accountCreatedDesc": "Your account has been successfully created.", - "accountUpdateFailed": "Account Update Failed", - "accountCreationFailed": "Account Creation Failed", - "updateFailed": "Update failed, please try again later", - "creationFailed": "Creation failed, please try again later", - "allMailFolderSelected": "Heads Up: \"All Mail\" Folder Selected", - "accountSyncFoldersUpdated": "Account Sync Folders Updated", - "accountSyncFoldersUpdateFailed": "Account Sync Folders Update Failed", - "serverConfiguration": "Server Configuration (IMAP)", - "selectedMailboxes": "Selected Mailboxes", - "allMailFolderSelectedDesc": "Selecting folders with the \"All Mail\" attribute will likely lead to duplicating messages already synced from folders like Inbox and Sent. This may consume significantly more storage space.", - "allMailSkipped": "Selected standard folders. 'All Mail' was skipped to avoid duplicates.", - "selectAtLeastOneFolder": "Please select at least one folder", - "chooseMailboxesToDownload": "Choose mailboxes to download for {{email}}. Newly added mailboxes will be downloaded in the next cycle.", - "accountDetails": "Account Details", - "capabilities": "Capabilities", - "folderLimit": "Folder Limit", - "everyMinutes": "every {{minutes}} minutes", - "foldersConfiguredForSync": "{{count}} folder(s) configured for sync", - "foldersSelected": "{{count}} folder(s) selected", - "imapHost": "IMAP Host", - "imapHostPlaceholder": "e.g imap.example.com", - "imapPort": "IMAP Port", - "imapPortPlaceholder": "e.g 993", - "imapEncryption": "IMAP Encryption", - "selectEncryptionMethod": "Select an encryption method", - "chooseEncryptionMethod": "Choose the encryption method for IMAP.", - "imapAuthMethod": "IMAP Auth Method", - "selectAuthMethod": "Select an authentication method", - "chooseAuthMethod": "Choose the authentication method for IMAP.", - "imapPassword": "IMAP Password", - "leaveEmptyToKeepPassword": "Leave empty to keep current password", - "enterPassword": "Enter your password", - "leaveEmptyToKeepExisting": "Leave empty to keep the existing password, or enter a new password to update it.", - "useProxy": "Use Proxy", - "selectProxy": "Select a proxy", - "downloadInterval": "Download Interval (minutes)", - "downloadIntervalPlaceholder": "Enter minutes", + "emailPlaceholder": "e.g john.doe@example.com", + "enable": "Enable", + "enableAccount": "Enable account", + "enabled": "Enabled", "enabledDescription": "Determines whether this account is active. If disabled, related downloads will not run.", - "dateSince": "Date Since", - "none": "None", - "fixed": "Fixed", - "relative": "Relative", - "selectDate": "Select a date", - "selectUnit": "Select a unit", - "days": "Days", - "months": "Months", - "years": "Years", - "enterValue": "Please enter a value", - "mustBeAtLeast1": "Must be at least 1", - "dateSelection": "Date Selection", - "since": "since", - "recent": "recent", - "notAvailable": "n/a", - "host": "host", - "port": "port", "encryption": "encryption", - "authType": "auth_type", - "password": "password", - "useProxyField": "use proxy", - "clickSaveWhenDone": "Click save when you're done.", - "step": "Step {{index}}", - "goBack": "Go Back", - "autoConfiguring": "Auto-configuring...", - "continue": "Continue", - "saveChanges": "Save changes", - "submit": "Submit", + "enterPassword": "Enter your password", + "enterValue": "Please enter a value", + "everyMinutes": "every {{minutes}} minutes", "field": "Field", - "value": "Value", - "refreshToken": "Refresh Token", - "accessTokenCopiedToClipboard": "Access token copied to clipboard", - "refreshTokenCopiedToClipboard": "Refresh token copied to clipboard", - "noOAuth2Tokens": "No OAuth2 Tokens", - "theAccountHasNotCompletedTheAuthorizationProcess": "The account has not completed the authorization process. Please ", - "clickHere": "click here", - "toAuthorizeTheAccount": " to authorize the account.", - "detailsOfTheOAuth2TokensForTheAccount": "Details of the OAuth2 tokens for the account.", - "updateTheEmailAccountHere": "Update the email account here. ", - "addNewEmailAccountHere": "Add new email account here. ", - "thisAccountIsUsedForIdentificationPurposesOnly": "This account is used for identification purposes only and does not require syncing with an email server. It helps with importing email data.", - "determinesWhetherThisAccountIsActiveNoSync": "Determines whether this account is active. If disabled, the account will not be able to import data.", + "fixed": "Fixed", + "folderLimit": "Folder Limit", + "folderLimitDescription": "Limit the number of emails to sync per folder (minimum 100). Leave empty for no limit.", + "folderLimitPlaceholder": "e.g. 1000", "folderSync": { - "noData": "No Data", - "noFolders": "No folders to sync", - "batches": "batches", "autoSelectDescendants": "Auto select descendants", "autoSelectParents": "Auto select parents", - "expandAll": "Expand all", + "batches": "batches", "collapseAll": "Collapse all", - "loadingMailboxFolders": "Loading mailbox folders…" + "expandAll": "Expand all", + "loadingMailboxFolders": "Loading mailbox folders…", + "noData": "No Data", + "noFolders": "No folders to sync" }, - "viewDetails": "view details", + "foldersConfiguredForSync": "{{count}} folder(s) configured for sync", + "foldersSelected": "{{count}} folder(s) selected", + "goBack": "Go Back", + "host": "host", + "id": "ID", + "imap": "IMAP", + "imapAuthMethod": "IMAP Auth Method", + "imapEncryption": "IMAP Encryption", + "imapHost": "IMAP Host", + "imapHostPlaceholder": "e.g imap.example.com", + "imapPassword": "IMAP Password", + "imapPort": "IMAP Port", + "imapPortPlaceholder": "e.g 993", + "imapProxy": "Use a SOCKS5 proxy for IMAP connections.", + "incSync": "Inc Sync", + "lastSync": "Last Sync", + "leaveEmptyToKeepExisting": "Leave empty to keep the existing password, or enter a new password to update it.", + "leaveEmptyToKeepPassword": "Leave empty to keep current password", + "login_name": "Login Name", + "minutes": "minutes", + "months": "Months", + "moreAccountTypes": "More account types", + "mustBeAtLeast1": "Must be at least 1", + "name": "Name", + "nameDescription": "IMAP username. Defaults to your email; custom name supported.", + "namePlaceholder": "e.g john.doe", + "noAccountConfigurations": "No Account Configurations", + "noAccountConfigurationsDesc": "You haven't added any Account configurations yet. Add one to start using Account features.", + "noOAuth2Tokens": "No OAuth2 Tokens", + "none": "None", + "notAvailable": "n/a", + "oauth2Tokens": "OAuth2 Tokens", + "openMenu": "Open menu", + "optional": "Optional", + "owner": "Creator", + "password": "password", + "port": "port", + "recent": "recent", + "refreshToken": "Refresh Token", + "refreshTokenCopiedToClipboard": "Refresh token copied to clipboard", + "relative": "Relative", "runningState": { - "message": "Message", "account": { "id": "Account ID" }, - "tabs": { - "active_session": "Active Session", - "history": "History", - "global_errors": "Global Errors", - "folders": "Mailboxes", - "errors": "Errors" - }, - "loading": { - "fetching_account_state": "Fetching account state..." + "common": { + "close": "Close", + "folders": "mailboxes" }, "empty": { "no_active_download": "No download in progress", @@ -337,1156 +220,596 @@ "no_global_errors": "No global errors", "no_history": "No historical records found" }, - "session": { - "status": "Status", - "trigger": "Trigger", - "started_at": "Started At" - }, - "common": { - "folders": "mailboxes", - "close": "Close" - }, + "folders": "mailboxes", "latest": "LATEST", - "folders": "mailboxes" + "loading": { + "fetching_account_state": "Fetching account state..." + }, + "message": "Message", + "session": { + "started_at": "Started At", + "status": "Status", + "trigger": "Trigger" + }, + "tabs": { + "active_session": "Active Session", + "errors": "Errors", + "folders": "Mailboxes", + "global_errors": "Global Errors", + "history": "History" + } }, + "saveChanges": "Save changes", + "selectAtLeastOneFolder": "Please select at least one folder", + "selectAuthMethod": "Select an authentication method", + "selectDate": "Select a date", + "selectEncryptionMethod": "Select an encryption method", + "selectMailboxes": "Choose Mailboxes", + "selectMode": "Select filter mode", + "selectProxy": "Select a proxy", + "selectUnit": "Select a unit", + "selectedMailboxes": "Selected Mailboxes", + "serverConfiguration": "Server Configuration (IMAP)", + "since": "since", + "sinceFixed": "Since Specific Date", + "sinceRelative": "Download Recent Emails Only", + "sinceRelativeValue": "Download emails from the last", + "state": "State", + "status": "Status", + "step": "Step {{index}}", "steps": { "complete": "Complete", "emailAddress": "Email Address", "imap": "IMAP", - "syncPreferences": "Sync Preferences", - "summary": "Summary" + "summary": "Summary", + "syncPreferences": "Sync Preferences" }, - "imapProxy": "Use a SOCKS5 proxy for IMAP connections.", - "syncStartDateDescription": "Defines the sync start date — either specific or relative to now. Preceding emails are excluded, {{fixedPart}}.", + "submit": "Submit", "syncAfterDate": "syncs data after a set date", "syncRecentData": "shifts the sync date over time, syncing only recent data", - "folderLimitDescription": "Limit the number of emails to sync per folder (minimum 100). Leave empty for no limit.", - "folderLimitPlaceholder": "e.g. 1000", - "imap": "IMAP", - "minutes": "minutes", - "accountHasBeenSuccessfully": "Account has been successfully {{action}}", - "enableAccount": "Enable account", - "disableAccount": "Disable account", - "areYouSureYouWantTo": "Are you sure you want to {{action}} this account?", - "enable": "Enable", - "disable": "Disable", + "syncStartDateDescription": "Defines the sync start date — either specific or relative to now. Preceding emails are excluded, {{fixedPart}}.", + "theAccountHasNotCompletedTheAuthorizationProcess": "The account has not completed the authorization process. Please ", + "thisAccountIsUsedForIdentificationPurposesOnly": "This account is used for identification purposes only and does not require syncing with an email server. It helps with importing email data.", "thisWillPreventTheAccountFromBeingUsed": "This account will no longer sync data from the IMAP server, but existing data will still be accessible.", - "disabled": "Disabled", + "title": "Email Accounts", + "toAuthorizeTheAccount": " to authorize the account.", + "type": "Type", + "unit": "Unit", + "updateAccount": "Update Account", + "updateFailed": "Update failed, please try again later", + "updateTheEmailAccountHere": "Update the email account here. ", + "updatedAt": "Updated At", "useDangerous": "Trust Any TLS Certificate", - "useDangerousDescription": "Enable this option only if you are connecting to an IMAP server with a public or self-signed certificate that may not be recognized by your system. Using this setting bypasses standard certificate validation, which can expose you to man-in-the-middle attacks. Only enable if you understand the risks." + "useDangerousDescription": "Enable this option only if you are connecting to an IMAP server with a public or self-signed certificate that may not be recognized by your system. Using this setting bypasses standard certificate validation, which can expose you to man-in-the-middle attacks. Only enable if you understand the risks.", + "useNoProxy": "No Proxy", + "useProxy": "Use Proxy", + "useProxyField": "use proxy", + "value": "Value", + "viewDetails": "view details", + "years": "Years" + }, + "apiDocs": { + "choosePreferredType": "Choose your preferred API documentation type", + "downloadSpecYAML": "Download Spec YAML", + "openAPIExplorer": "OpenAPI Explorer", + "reDoc": "ReDoc", + "scalar": "Scalar", + "swaggerUI": "Swagger UI" + }, + "apiTokens": { + "deleteDialog": { + "cancel": "Cancel", + "confirm": "Delete", + "deleting": "Deleting...", + "description": "This action cannot be undone. Any application using this token will immediately lose access.", + "title": "Delete access token?" + }, + "dialog": { + "createTitle": "Create Access Token", + "description": "Click save when you are done.", + "editTitle": "Edit Access Token", + "save": "Save", + "saveChanges": "Save Changes" + }, + "form": { + "1day": "1 day", + "30days": "30 days", + "7days": "7 days", + "errorInt": "Must be an integer", + "errorMax": "Max 32 characters", + "errorNumber": "Must be a number", + "errorPositive": "Must be greater than 0", + "expirationDescription": "Tokens will automatically expire after the selected time.", + "expirationLabel": "Expiration", + "expirationPlaceholder": "Select expiration", + "nameDescription": "Optional · Max 32 characters", + "nameLabel": "Name", + "namePlaceholder": "Give this access token a short name", + "never": "Never" + }, + "list": { + "createdLabel": "Created", + "deleteBtn": "Delete token", + "expiresOnLabel": "Expires on", + "expiresOnShort": "Expires on {{date}}", + "lastUsedLabel": "Last used", + "neverExpires": "Never expires", + "neverLabel": "Never", + "neverUsed": "Never", + "statusActive": "Active", + "statusExpired": "Expired", + "tokenLabel": "Token", + "unnamedToken": "Unnamed Token" + }, + "notifications": { + "close": "Close", + "copied": "Copied to clipboard", + "createFailed": "Creation Failed", + "createSuccess": "Access Token Created", + "createSuccessDesc": "The access token has been created successfully.", + "deleteFailed": "Failed to delete access token", + "deleteSuccess": "Access token deleted successfully", + "genericError": "Operation failed. Please try again.", + "tryAgain": "Try again", + "updateFailed": "Update Failed", + "updateSuccess": "Access Token Updated", + "updateSuccessDesc": "The access token has been updated successfully." + }, + "page": { + "addBtn": "Add Token", + "emptyDescription": "You haven’t created any API tokens yet. Click below to create one.", + "emptyTitle": "No API tokens", + "loadError": "Failed to load API tokens." + } + }, + "attachment": { + "all_fields_desc": "Matches attachment name, subject, and sender", + "date": "Date", + "name": "Filename", + "search_input_placeholder": "Search attachments (use \" \" for phrase search)", + "sender": "Sender", + "sender_with_count": "Sender ({{count}})", + "size": "File size", + "source": "Source", + "subject": "Subject" + }, + "auth": { + "areYouSureYouWantToLogOut": "Are you sure you want to log out?", + "invalidPassword": "Invalid password. Please try again.", + "login": "Login", + "loginFailed": "Login Failed", + "logout": "Log out", + "password": "Password", + "sessionExpired": "Session expired!", + "sessionExpiredDesc": "Your session has ended due to inactivity. Please log in again to continue.", + "somethingWentWrong": "Something went wrong", + "username": "Username", + "welcome": "Welcome to Bichon", + "youWillNeedToLogInAgain": "You will need to log in again to access your account." + }, + "command": { + "dark": "Dark", + "light": "Light", + "noResultsFound": "No results found.", + "theme": "Theme", + "typeCommandOrSearch": "Type a command or search..." + }, + "common": { + "actions": "Actions", + "add": "Add", + "all": "All", + "apply": "Apply", + "back": "Back", + "backToHome": "Back to Home", + "cancel": "Cancel", + "clear": "Clear", + "close": "Close", + "confirm": "Confirm", + "create": "Create", + "delete": "Delete", + "deleting": "Deleting...", + "deselectAll": "Deselect All", + "edit": "Edit", + "empty": "Empty", + "error": "Error", + "failed": "Failed", + "filter": "Filter", + "goBack": "Go Back", + "loading": "Loading...", + "more": "More", + "na": "N/A", + "no": "No", + "noData": "No Data", + "none": "None", + "notFound": "Not Found", + "ok": "OK", + "op_failed": "Operation failed", + "project_description": "Bichon is an open-source project.", + "remove": "Remove", + "reset": "Reset", + "retry": "Retry", + "save": "Save", + "save_changes": "Save Changes", + "search": "Search", + "select": "Select", + "selectAll": "Select All", + "showLess": "Show Less", + "showMore": "Show More...", + "submit": "Submit", + "table": { + "noResults": "No results." + }, + "tryAgain": "Try Again", + "update": "Update", + "view_on_github_button": "View on GitHub", + "yes": "Yes" + }, + "dashboard": { + "account": "Account", + "actualDiskUsage": "Actual disk usage", + "attachmentRatio": "Attachment Ratio", + "attachmentRatioDesc": "{{percent}}% of emails have attachments", + "attachments": "Attachments", + "byMessageCount": "By message count", + "byMessageSize": "By message size", + "connected": "Connected", + "count": "Count", + "dataStorage": "Storage", + "dayTrend": "30-Day Trend", + "efficiency": "Efficiency", + "emails": "Emails", + "indexSize": "Index", + "localDataFiles": "Local Data Files", + "logicalVolume": "Original Size", + "mailAccounts": "Mail Accounts", + "messageDistribution": "Message distribution", + "metadataSize": "Metadata Size", + "newEmails": "New Emails", + "noAccountData": "No account data", + "noAttachments": "No Attachments", + "noEmailsSynced": "No emails synced yet", + "noLargeEmails": "No large emails", + "noRecentActivity": "No recent activity", + "noSendersData": "No senders data", + "noSubject": "(No Subject)", + "saved": "Saved", + "sender": "Sender", + "size": "Size", + "subject": "Subject", + "syncedLocally": "Synced locally", + "systemVersion": "System Version", + "tantivyDatabase": "Based on Tantivy Search Engine", + "title": "Dashboard", + "top10Accounts": "Top 10 Accounts", + "top10LargestEmails": "Top 10 Largest Emails", + "top10Senders": "Top 10 Senders", + "topLists": "Top Lists", + "totalEmailSize": "Total Email Size", + "totalEmails": "Total Emails", + "withAttachments": "With Attachments" + }, + "dialogs": { + "accountCredentials": "Account credentials and settings", + "accountDeleteFailed": "Account delete Failed", + "accountDeleted": "Account Deleted", + "accountDeletedDesc": "Your account has been successfully deleted.", + "allResourcesErased": "All related resources will be permanently erased.", + "cannotBeUndone": "This action cannot be undone!", + "confirmDelete": "Confirm Delete", + "confirmDeleteDesc": "Are you sure you want to delete this item? This action cannot be undone.", + "continue": "Continue", + "createFailed": "Failed to create", + "createSuccess": "Created successfully", + "deleteAccountPermanently": "Delete Account Permanently", + "deleteFailed": "Failed to delete", + "deleteSuccess": "Deleted successfully", + "deleting": "Deleting...", + "imapSyncData": "IMAP synchronization data", + "localCachedMetadata": "Local cached metadata and sync status", + "oauthTokens": "OAuth tokens and API credentials", + "permanentlyDeleteAccount": "Permanently Delete Account", + "saveFailed": "Failed to save", + "saveSuccess": "Saved successfully", + "typeEmailToConfirm": "Type the account email to confirm:", + "typeToConfirm": "Type \"{{email}}\" to confirm", + "updateFailed": "Failed to update", + "updateSuccess": "Updated successfully", + "youAreDeleting": "You are deleting {{email}}. This will permanently remove:" + }, + "errors": { + "contentNotModified": "Content not modified!", + "forbidden": "Forbidden", + "forbiddenDesc": "You don't have necessary permission to view this resource.", + "forbiddenTitle": "Access Forbidden", + "internalServerError": "Internal Server Error!", + "learnMore": "Learn more", + "maintenance": "Maintenance", + "maintenanceDesc": "The site is not available at the moment. We'll be back online shortly.", + "maintenanceTitle": "Website is under maintenance!", + "networkError": "Network Error", + "networkErrorDesc": "Unable to connect to the server. Please check your internet connection and try again.", + "pageNotFound": "Oops! Page Not Found!", + "pageNotFoundDesc": "It seems like the page you're looking for does not exist or might have been removed.", + "somethingWentWrong": "Oops! Something went wrong :')", + "somethingWentWrongDesc": "We apologize for the inconvenience. Please try again later.", + "unauthorized": "Unauthorized", + "unauthorizedDesc": "Please log in with the appropriate credentials to access this resource.", + "unauthorizedTitle": "Unauthorized Access" + }, + "mail": { + "account": "Account", + "attachments": "Attachments", + "bcc": "BCC", + "cc": "CC", + "date": "Date", + "delete": "Delete", + "download": "Download", + "downloadComplete": "Download complete", + "downloadFailed": "Download failed", + "downloadStarted": "Download started", + "downloaded": "{{id}} downloaded", + "emailViewer": "Email Viewer", + "failedToDownloadFile": "Failed to download file", + "failedToLoadEmail": "Failed to load email message.", + "from": "From", + "id": "ID", + "isBeingDownloaded": "{{id}} is being downloaded", + "noAttachments": "No attachments", + "noMessageSelected": "No message selected", + "noTagsYet": "No tags yet", + "onlyNonInlineAttachments": "Only non-inline attachments are shown here.", + "showLess": "show less", + "showMore": "show more...", + "subject": "Subject", + "tags": "Tags", + "to": "To", + "viewThread": "View Thread" }, "mailbox": { + "bulkActions": { + "ariaLabel": "Bulk actions for {{count}} selected {{emailLabel}}", + "clearSelection": "Clear selection", + "clearSelectionWithKey": "Clear selection ({{key}})", + "delete": "Delete", + "deleteTooltip": "Delete selected emails", + "email": "email", + "emails": "emails", + "selected": "selected" + }, + "deleteDialog": { + "confirm": "Delete", + "desc": "Are you sure you want to delete {{countText}}? This action will delete the selected email(s) from local database. The email(s) will be permanently deleted and cannot be recovered.", + "descCountMultiple": "these {{count}} emails", + "descCountSingle": "this email", + "errorTitle": "Failed to delete messages", + "successDesc": "The messages have been deleted.", + "successTitle": "Messages deleted successfully", + "title": "Delete Email", + "warningDesc": "Please be cautious before proceeding.", + "warningTitle": "Warning!" + }, "deleteMailboxDialog": { + "confirm": "Delete Permanently", + "desc": "Are you sure you want to delete this mailbox folder? This action cannot be undone.", + "errorTitle": "Delete failed", + "successDesc": "The mailbox folder and its contents have been successfully removed.", + "successTitle": "Deleted successfully", "title": "Delete Mailbox Folder", - "desc": "Are you sure you want to delete this mailbox folder? This action cannot be undone.", - "warningTitle": "Warning", "warningDesc": "Deleting this folder will also permanently remove all archived emails and subfolders contained within it.", - "confirm": "Delete Permanently", - "successTitle": "Deleted successfully", - "successDesc": "The mailbox folder and its contents have been successfully removed.", - "errorTitle": "Delete failed" + "warningTitle": "Warning" }, - "title": "Mailbox", "folders": "Folders", "messages": "Messages", "noMessages": "No messages", "selectFolder": "Select a folder to view messages", - "deleteDialog": { - "title": "Delete Email", - "desc": "Are you sure you want to delete {{countText}}? This action will delete the selected email(s) from local database. The email(s) will be permanently deleted and cannot be recovered.", - "descCountSingle": "this email", - "descCountMultiple": "these {{count}} emails", - "warningTitle": "Warning!", - "warningDesc": "Please be cautious before proceeding.", - "confirm": "Delete", - "successTitle": "Messages deleted successfully", - "successDesc": "The messages have been deleted.", - "errorTitle": "Failed to delete messages" - }, "thread": { - "title": "Thread ({{count}} {{messageLabel}})", + "empty": "No messages in this thread.", + "invalidDate": "Invalid Date", + "loadError": "Failed to load thread", + "loadMore": "Load more", + "loadingMore": "Loading more...", "message": "message", "messages": "messages", "noSubject": "(No subject)", - "invalidDate": "Invalid Date", - "empty": "No messages in this thread.", - "loadError": "Failed to load thread", - "loadingMore": "Loading more...", - "loadMore": "Load more" + "title": "Thread ({{count}} {{messageLabel}})" }, - "bulkActions": { - "ariaLabel": "Bulk actions for {{count}} selected {{emailLabel}}", - "email": "email", - "emails": "emails", - "selected": "selected", - "clearSelection": "Clear selection", - "clearSelectionWithKey": "Clear selection ({{key}})", - "delete": "Delete", - "deleteTooltip": "Delete selected emails" - } + "title": "Mailbox" }, - "search": { - "size": "Size", - "any": "Any", - "tiny": "Tiny (<15 KB)", - "small": "Small (<2 MB)", - "medium": "Medium (2 - 10 MB)", - "large": "Large (10 - 20 MB)", - "huge": "Huge (≥20 MB)", - "sort": "Sort", - "sizeDescription": "The size refers to the total email size, including attachments.", - "title": "Search", - "searching": "Searching, please wait…", - "noEmailsFound": "No emails found", - "startSearching": "Start by entering a keyword, sender, or using advanced filters.", - "adjustSearch": "Try adjusting your search criteria or clearing filters.", - "tagFilter": "Tag Filter", - "from": "From", - "to": "To", - "subject": "Subject", - "date": "Date", - "editTag": "Edit Tag", - "keyword": "Keyword", - "sender": "Sender", - "recipient": "Recipient", - "hasAttachment": "Has Attachment", - "yes": "Yes", - "no": "No", - "dateRange": "Date Range", - "startDate": "Start Date", - "endDate": "End Date", - "advancedFilters": "Advanced Filters", - "searchArchivedEmails": "Search Archived Emails", - "fullTextMultiAccount": "Full-text · Multi-account · Advanced filters", - "account": "Account", + "navigation": { + "accessTokens": "Access Tokens", + "accounts": "Accounts", + "apiDocs": "API Documentation", + "attachment": "Attachments", + "auth": "Auth", + "dashboard": "Dashboard", + "general": "General", + "home": "Home", "mailbox": "Mailbox", - "selectAccount": "Select account", - "selectMailbox": "Select mailbox", - "noActiveEmailAccount": "No active email account.", - "addEmailAccount": "Add Email Account", - "noMailboxSelectAccount": "No mailbox. Please select an account first.", - "searchInSubjectBody": "Search in subject, body, attachments...", - "searchingButton": "Searching...", - "searchButton": "Search", - "advanced": "Advanced", - "clear": "Clear", - "since": "Since:", - "before": "Before:", - "selectDate": "Select a date", - "pleaseSelectAtLeastOne": "Please select at least one search condition", - "cc": "CC", - "bcc": "BCC", - "attachmentName": "Attachment Name", - "messageId": "Message ID", - "minSize": "Min Size", - "maxSize": "Max Size", - "senderRecipients": "Sender / Recipients", - "attachmentsSize": "Attachments & Size", - "minimumBytes": "Minimum", - "maximumBytes": "Maximum", - "originalMessageIdHeader": "Original email Message-ID header", - "addTags": { - "title": "Edit Tags", - "none": "No tags added", - "searchPlaceholder": "Search or create tag...", - "createHint": "Create new tag: {{tag}}", - "invalidTitle": "Invalid Tag", - "updatedTitle": "Tags Updated", - "updatedDesc": "Tags have been successfully updated", - "updateFailedTitle": "Update Failed", - "tryAgain": "Please try again later", - "selectedCount": "{{count}} tags selected", - "cancel": "Cancel", - "save": "Save", - "saving": "Saving..." - }, - "updateTags": { - "overwriteWarning": "Warning: This will overwrite all existing tags on the selected items.", - "title": "Update Tags", - "none": "No tags selected", - "searchPlaceholder": "Search or create new tag...", - "createHint": "Press Enter to create new tag: \"{{tag}}\"", - "selectedCount": "{{count}} tag(s) to be applied", - "cancel": "Cancel", - "invalidTitle": "Invalid Tag", - "updatedTitle": "Tags Updated", - "updatedDesc": "Tags have been successfully updated.", - "updateFailedTitle": "Update Failed", - "tryAgain": "Please try again later.", - "actionAdd": "Add", - "actionRemove": "Remove", - "actionOverwrite": "Overwrite", - "submitAdd": "Add Tags", - "submitRemove": "Remove Tags", - "submitOverwrite": "Overwrite Tags", - "savingAdd": "Adding...", - "savingRemove": "Removing...", - "savingOverwrite": "Overwriting..." - }, - "thread": { - "title": "Thread · {{count}} messages", - "error": "Failed to load thread", - "empty": "No messages in this thread", - "invalidDate": "Invalid date", - "noSubject": "(No subject)", - "loadingMore": "Loading...", - "loadMore": "Load more" - }, - "bulkActions": { - "ariaLabel": "{{count}} messages selected. Bulk actions toolbar", - "delete": "Delete", - "deleteDesc": "Delete selected messages", - "selected": "{{count}} selected", - "clear": "Clear selection", - "manageTags": "Manage Tags" - }, - "delete": { - "title": "Delete messages", - "confirmPrefix": "Are you sure you want to delete", - "countLabel": "{{count}} message", - "confirmDetail": "This action cannot be undone.", - "confirmButton": "Delete", - "warningTitle": "Warning", - "warningDesc": "Deleted messages will be permanently removed and cannot be recovered.", - "successTitle": "Messages deleted", - "successDesc": "The selected messages have been deleted successfully.", - "errorTitle": "Delete failed" - } - }, - "mail": { - "emailViewer": "Email Viewer", - "noMessageSelected": "No message selected", - "account": "Account", - "from": "From", - "to": "To", - "subject": "Subject", - "date": "Date", - "tags": "Tags", - "noTagsYet": "No tags yet", - "id": "ID", - "cc": "CC", - "bcc": "BCC", - "attachments": "Attachments", - "download": "Download", - "delete": "Delete", - "viewThread": "View Thread", - "downloadStarted": "Download started", - "downloadComplete": "Download complete", - "downloadFailed": "Download failed", - "failedToDownloadFile": "Failed to download file", - "failedToLoadEmail": "Failed to load email message.", - "isBeingDownloaded": "{{id}} is being downloaded", - "downloaded": "{{id}} downloaded", - "showLess": "show less", - "showMore": "show more...", - "onlyNonInlineAttachments": "Only non-inline attachments are shown here.", - "noAttachments": "No attachments" + "oauth2": "OAuth2", + "other": "Other", + "settings": "Settings", + "users": "System Users" }, "oauth2": { - "title": "OAuth2", + "aSecretKeyProvidedByTheOAuthProvider": "A secret key provided by the OAuth provider to authenticate your application.", + "actions": { + "authorize": "Authorize", + "delete": "Delete", + "edit": "Edit", + "openMenu": "Open menu" + }, "addConfiguration": "Add Configuration", - "id": "ID", - "provider": "Provider", + "addExtraParams": "Add Extra Params", + "addNew": "Add New", + "addScope": "Add Scope", + "areYouSureYouWantTo": "Are you sure you want to {{action}} this OAuth2 client?", + "areYouSureYouWantToDelete": "Are you sure you want to delete", + "authAtatus": "OAuth2 Authentication Status", + "authFailed": "OAuth2 Authentication Failed", + "authSuccess": "OAuth2 Authentication Successful", + "authUrlLabel": "Auth Url:", + "authorizationUrlCannotBeEmpty": "Authorization URL cannot be empty", + "authorizationUrlIsRequired": "Authorization URL is required", + "authorize": "Authorize", + "authorizeAnEmailAccountToStartTheOAuth2AuthorizationProcess": "Authorize an email account to start the OAuth2 authorization process.", + "authorizeEmailAccount": "Authorize Email Account", + "backToLogin": "Back to Login", + "clickSaveWhenDone": "Click save when you're done.", "clientId": "Client ID", + "clientIdCannotBeEmpty": "Client ID cannot be empty", + "clientIdIsRequired": "Client ID is required", + "clientIdLabel": "Client Id:", "clientSecret": "Client Secret", - "redirectUri": "Redirect URI", - "scopes": "Scopes", - "status": "Status", - "enabled": "Enabled", + "clientSecretCannotBeEmpty": "Client Secret cannot be empty", + "clientSecretIsRequired": "Client Secret is required", + "clientSecretLabel": "Client Secret:", + "createAccount": "Create Account", + "createNewHere": "Create new here.", + "created": "Created", + "creating": "Creating...", + "creationFailed": "Creation Failed", + "delete": "Delete", + "deleteFailed": "Delete failed, please try again later", + "deleteSuccess": "Delete Success", + "deleteToken": "Delete Token", + "describeThePurposeOfTheOauth2Application": "Describe the purpose of the oauth2 application", + "description": "Automatically handling access token retrieval, storage, and refreshing, ensuring a seamless and always-ready authentication experience.", + "descriptionLabel": "Description:", + "descriptionMustNotExceed255Characters": "Description must not exceed 255 characters.", + "disable": "Disable", + "disableOAuth2Client": "Disable OAuth2 Client", "disabled": "Disabled", "edit": "Edit", - "delete": "Delete", "enable": "Enable", - "disable": "Disable", - "noConfigurations": "No OAuth2 Configurations", - "noConfigurationsDesc": "You haven't added any OAuth2 configurations yet. Add one to start using OAuth2 features.", - "description": "Automatically handling access token retrieval, storage, and refreshing, ensuring a seamless and always-ready authentication experience.", - "addNew": "Add New", - "updateHere": "Update here.", - "createNewHere": "Create new here.", - "clickSaveWhenDone": "Click save when you're done.", - "quickPresets": "Quick presets:", - "gmail": "Gmail", - "outlook": "Outlook", - "whenDisabled": "When disabled: - New authorization flows will be rejected immediately - Existing access tokens and refresh tokens will be revoked within 1 minute - Users must re-authorize when re-enabled", - "clientIdLabel": "Client Id:", - "enterYourClientId": "Enter your client ID", - "theUniqueIdentifierForYourApplication": "The unique identifier for your application, provided by the OAuth provider.", - "clientSecretLabel": "Client Secret:", - "leaveEmptyToKeepExistingSecret": "Leave empty to keep existing secret", - "enterYourClientSecret": "Enter your client secret", - "leaveEmptyToKeepTheExistingSecret": "Leave empty to keep the existing secret. Only enter a new value if you want to change it.", - "aSecretKeyProvidedByTheOAuthProvider": "A secret key provided by the OAuth provider to authenticate your application.", - "authUrlLabel": "Auth Url:", + "enableOAuth2Client": "Enable OAuth2 Client", + "enabled": "Enabled", + "enterIdToConfirmDeletion": "Enter id to confirm deletion.", "enterTheAuthorizationUrl": "Enter the authorization URL", - "theUrlWhereUsersWillBeRedirected": "The URL where users will be redirected to authorize your application.", - "tokenUrlLabel": "Token Url:", - "enterTheTokenUrl": "Enter the token URL", - "theUrlUsedToExchange": "The URL used to exchange the authorization code for an access token.", - "redirectUrlLabel": "Redirect Url:", - "enterYourRedirectUrl": "Enter your redirect URL", - "theRedirectUrlAfterAuthorization": "The redirect URL after authorization. It must match the one registered with the OAuth provider. Use the format http://[host]:[port]/oauth2/callback (or https://), where [host] and [port] match your RustMailer deployment. The path /oauth2/callback is fixed.", - "scope": "Scope:", - "enterTheScopeHere": "Enter the scope here.", - "addScope": "Add Scope", - "key": "Key:", "enterTheKeyHere": "Enter the key here.", - "value": "Value:", + "enterTheScopeHere": "Enter the scope here.", + "enterTheTokenUrl": "Enter the token URL", "enterTheValueHere": "Enter the value here.", - "addExtraParams": "Add Extra Params", - "useProxyOptional": "Use Proxy (optional):", - "selectAProxy": "Select a proxy", - "noProxyAvailable": "No proxy available", - "useSocks5ProxyForOAuthRequests": "Use SOCKS5 proxy for OAuth requests when direct access is blocked.", - "descriptionLabel": "Description:", - "describeThePurposeOfTheOauth2Application": "Describe the purpose of the oauth2 application", - "optional": "Optional", - "saving": "Saving...", - "creating": "Creating...", - "saveChanges": "Save changes", - "save": "Save", - "updated": "Updated", - "created": "Created", - "yourOAuth2ApplicationHasBeenSuccessfully": "Your OAuth2 application has been successfully {{action}}.", - "updateFailed": "Update Failed", - "creationFailed": "Creation Failed", - "updateOrCreationFailed": "{{action}} failed, please try again later", - "clientSecretIsRequired": "Client Secret is required", - "clientSecretCannotBeEmpty": "Client Secret cannot be empty", - "keyIsRequired": "Key is required", - "keyCannotBeEmpty": "Key cannot be empty", - "valueIsRequired": "Value is required", - "valueCannotBeEmpty": "Value cannot be empty", - "descriptionMustNotExceed255Characters": "Description must not exceed 255 characters.", - "clientIdIsRequired": "Client ID is required", - "clientIdCannotBeEmpty": "Client ID cannot be empty", - "authorizationUrlIsRequired": "Authorization URL is required", - "authorizationUrlCannotBeEmpty": "Authorization URL cannot be empty", - "invalidAuthorizationUrlFormat": "Invalid Authorization URL format", - "tokenUrlIsRequired": "Token URL is required", - "tokenUrlCannotBeEmpty": "Token URL cannot be empty", - "invalidTokenUrlFormat": "Invalid Token URL format", - "redirectUriIsRequired": "Redirect URI is required", - "redirectUriCannotBeEmpty": "Redirect URI cannot be empty", - "invalidRedirectUriFormat": "Invalid Redirect URI format", - "authorizeEmailAccount": "Authorize Email Account", - "authorizeAnEmailAccountToStartTheOAuth2AuthorizationProcess": "Authorize an email account to start the OAuth2 authorization process.", - "loadingAccounts": "Loading Accounts...", - "selectAnAccount": "Select an account", - "noEmailAccountsRegistered": "No email accounts registered. Please create one.", - "pleaseCreateOne": "Please create one.", - "createAccount": "Create Account", - "authorize": "Authorize", + "enterYourClientId": "Enter your client ID", + "enterYourClientSecret": "Enter your client secret", + "enterYourRedirectUrl": "Enter your redirect URL", + "error": "Error", "getAuthorizeUrlFailed": "Get Authorize Url Failed", "getAuthorizeUrlFailedDesc": "get authorize url failed, please try again later", - "oauth2ClientUpdated": "OAuth2 client Updated", - "oauth2ClientHasBeenSuccessfully": "OAuth2 client has been successfully {{action}}.", - "statusUpdateFailed": "Status update failed, please try again later", - "disableOAuth2Client": "Disable OAuth2 Client", - "enableOAuth2Client": "Enable OAuth2 Client", - "areYouSureYouWantTo": "Are you sure you want to {{action}} this OAuth2 client?", - "thisWillPreventTheOAuth2ClientFromBeingUsed": "This will prevent the OAuth2 client from being used.", - "deleteToken": "Delete Token", - "areYouSureYouWantToDelete": "Are you sure you want to delete", - "thisActionWillPermanentlyRemoveTheOauth2Record": "This action will permanently remove the oauth2 record from the system. This cannot be undone.", - "enterIdToConfirmDeletion": "Enter id to confirm deletion.", - "warning": "Warning!", - "pleaseBeCareful": "Please be carefull, this operation can not be rolled back.", - "deleteSuccess": "Delete Success", - "yourOAuth2ApplicationHasBeenSuccessfullyDeleted": "Your OAuth2 application has been successfully deleted.", - "oauth2DeleteFailed": "OAuth2 delete Failed", - "deleteFailed": "Delete failed, please try again later", - "actions": { - "openMenu": "Open menu", - "edit": "Edit", - "authorize": "Authorize", - "delete": "Delete" - }, - "authFailed": "OAuth2 Authentication Failed", - "error": "Error", - "unknownError": "An unknown error occurred.", - "tryAgain": "Try Again", + "gmail": "Gmail", "goHome": "Go Home", - "authSuccess": "OAuth2 Authentication Successful", + "goToAccounts": "Go to Accounts", + "id": "ID", + "information": "Information", + "invalidAuthorizationUrlFormat": "Invalid Authorization URL format", + "invalidRedirectUriFormat": "Invalid Redirect URI format", + "invalidTokenUrlFormat": "Invalid Token URL format", + "key": "Key:", + "keyCannotBeEmpty": "Key cannot be empty", + "keyIsRequired": "Key is required", + "leaveEmptyToKeepExistingSecret": "Leave empty to keep existing secret", + "leaveEmptyToKeepTheExistingSecret": "Leave empty to keep the existing secret. Only enter a new value if you want to change it.", + "loadingAccounts": "Loading Accounts...", + "noConfigurations": "No OAuth2 Configurations", + "noConfigurationsDesc": "You haven't added any OAuth2 configurations yet. Add one to start using OAuth2 features.", + "noEmailAccountsRegistered": "No email accounts registered. Please create one.", + "noProxyAvailable": "No proxy available", + "noStatus": "This page displays the result of your OAuth2 authentication. Currently, no specific status is available. Please try again if needed.", + "oauth2ClientHasBeenSuccessfully": "OAuth2 client has been successfully {{action}}.", + "oauth2ClientUpdated": "OAuth2 client Updated", + "oauth2DeleteFailed": "OAuth2 delete Failed", + "optional": "Optional", + "outlook": "Outlook", + "pleaseBeCareful": "Please be carefull, this operation can not be rolled back.", + "pleaseCreateOne": "Please create one.", + "provider": "Provider", + "quickPresets": "Quick presets:", + "redirectUri": "Redirect URI", + "redirectUriCannotBeEmpty": "Redirect URI cannot be empty", + "redirectUriIsRequired": "Redirect URI is required", + "redirectUrlLabel": "Redirect Url:", + "save": "Save", + "saveChanges": "Save changes", + "saving": "Saving...", + "scope": "Scope:", + "scopes": "Scopes", + "selectAProxy": "Select a proxy", + "selectAnAccount": "Select an account", + "status": "Status", + "statusUpdateFailed": "Status update failed, please try again later", "success": "Success", "successMessage": "Your email account has been successfully authenticated via OAuth2. The Access Token has been saved by the system and will be automatically updated as needed.", - "goToAccounts": "Go to Accounts", - "authAtatus": "OAuth2 Authentication Status", - "information": "Information", - "noStatus": "This page displays the result of your OAuth2 authentication. Currently, no specific status is available. Please try again if needed.", - "backToLogin": "Back to Login" - }, - "accessTokens": { - "title": "Access Tokens", - "name": "Name", - "accounts": "Accounts", - "token": "Token", - "createdAt": "Created At", - "expiresAt": "Expires At", - "edit": "Edit", - "delete": "Delete", - "create": "Create", - "noTokens": "No Access Tokens", - "noTokensDesc": "You haven't created any access tokens yet. Create one to start using API features.", - "description": "Manage your access tokens, their access controls, IP whitelists, and rate-limiting settings here.", - "editToken": "Edit Token", - "addNew": "Add New", - "updateTheAccessTokenHere": "Update the access token here.", - "createNewAccessTokenHere": "Create new access token here.", - "selectAccounts": "Select accounts", - "selectMultipleAccountsForTheAccessToken": "Select multiple accounts for the access token's authorization scope.", - "enterOneIpAddressPerLine": "Enter one IP address per line, e.g.:\n192.168.1.1\n192.168.1.2", - "aListOfIpAddressesAllowed": "A list of IP addresses allowed to access the resource. Enter one IP address per line. (Optional)", - "enterQuota": "Enter quota, e.g., 100", - "theMaximumNumberOfRequestsAllowed": "The maximum number of requests allowed within the interval. (Optional)", - "enterIntervalInSeconds": "Enter interval in seconds, e.g., 60", - "theTimeWindowForTheRateLimit": "The time window (in seconds) for the rate limit. (Optional)", - "describeThePurposeOfTheAccessToken": "Describe the purpose of the access token", - "updating": "Updating...", - "saving": "Saving...", - "creating": "Creating...", - "saveChanges": "Save changes", - "save": "Save", - "updated": "Updated", - "created": "Created", - "yourAccessTokenHasBeenSuccessfully": "Your access token has been successfully {{action}}.", + "theRedirectUrlAfterAuthorization": "The redirect URL after authorization. It must match the one registered with the OAuth provider. Use the format http://[host]:[port]/oauth2/callback (or https://), where [host] and [port] match your RustMailer deployment. The path /oauth2/callback is fixed.", + "theUniqueIdentifierForYourApplication": "The unique identifier for your application, provided by the OAuth provider.", + "theUrlUsedToExchange": "The URL used to exchange the authorization code for an access token.", + "theUrlWhereUsersWillBeRedirected": "The URL where users will be redirected to authorize your application.", + "thisActionWillPermanentlyRemoveTheOauth2Record": "This action will permanently remove the oauth2 record from the system. This cannot be undone.", + "thisWillPreventTheOAuth2ClientFromBeingUsed": "This will prevent the OAuth2 client from being used.", + "title": "OAuth2", + "tokenUrlCannotBeEmpty": "Token URL cannot be empty", + "tokenUrlIsRequired": "Token URL is required", + "tokenUrlLabel": "Token Url:", + "tryAgain": "Try Again", + "unknownError": "An unknown error occurred.", "updateFailed": "Update Failed", - "creationFailed": "Creation Failed", + "updateHere": "Update here.", "updateOrCreationFailed": "{{action}} failed, please try again later", - "quotaMustBeAPositiveInteger": "Quota must be a positive integer.", - "intervalMustBeAPositiveInteger": "Interval must be a positive integer.", - "invalidIpAddressesFound": "Invalid IP addresses found. Please enter valid IPv4 or IPv6 addresses.", - "atLeastOneAccountIsRequired": "At least one account is required.", - "descriptionMustNotExceed255Characters": "Description must not exceed 255 characters.", - "notUsedYet": "Not used yet", - "theListOfAccountsThatCanBeQueried": "The list of accounts that can be queried using an access token.", - "accountId": "Account ID", - "filterByEmailAddressOrAccountId": "Filter by email address or account ID...", - "aclRulesForAccessTokens": "ACL rules for access tokens include IP whitelist verification and rate limit enforcement.", - "actions": { - "openMenu": "Open menu", - "edit": "Edit", - "delete": "Delete" - }, - "quota": "Quota", - "interval": "Interval" - }, - "settings": { - "appearance": { - "title": "Appearance", - "field": { - "language": "Language", - "theme": "Interface Theme" - }, - "description": { - "language": "Select the language used in the Web UI.", - "theme": "Choose between light or dark mode for the interface." - }, - "placeholder": { - "select_language": "Select language" - }, - "command": { - "search": "Search language...", - "no_results": "No language found." - }, - "theme": { - "light": "Light", - "dark": "Dark" - }, - "button": { - "update": "Update preferences" - }, - "validation": { - "language": { - "required": "Please select a language." - }, - "theme": { - "required": "Please select a theme." - } - } - }, - "title": "Settings", - "general": "General", - "proxy": "Proxy", - "name": "Name", - "host": "Host", - "port": "Port", - "username": "Username", - "password": "Password", - "type": "Type", - "actions": "Actions", - "edit": "Edit", - "delete": "Delete", - "add": "Add", - "noProxies": "No Proxies", - "noProxiesDesc": "You haven't added any proxy configurations yet. Add one to start using proxy features.", - "root": "Root", - "rootTitle": "Root", - "rootDesc": "Manage root access credentials including token and password.", - "rootAccessManagement": "Root Access Management", - "manageRootTokenAndPassword": "Manage root token and password securely.", - "resetRootToken": "Reset Root Token", - "generateNewToken": "Generate new token, old one expires immediately.", - "reset": "Reset", - "resetRootPassword": "Reset Root Password", - "changePasswordForFutureLogins": "Change password for future logins.", - "youAreAboutToResetTheRootToken": "You are about to reset the root token. This action cannot be undone.", - "confirmReset": "Confirm Reset", - "youAreAboutToResetTheRootPassword": "You are about to reset the root password. Make sure to store it securely.", - "enterNewRootPassword": "Enter new root password", - "theRootTokenHasBeenReset": "The root token has been reset", - "yourLoginInformationHasBeenUpdated": "Your login information has been updated. No need to log in again.", - "invalidPassword": "Invalid password", - "rootPasswordMustBeAtLeast6Characters": "The root password must be at least 6 characters long.", - "theRootPasswordHasBeenReset": "The root password has been reset", - "useNewPasswordForNextLogin": "Use the new password for your next login.", - "failedToCopyText": "Failed to copy text", - "filterProxy": "Filter Proxy...", - "filterOauth2": "Filter oauth2...", - "filterAccount": "Filter account...", - "filterAccessToken": "Filter access token...", - "selectAll": "Select all", - "theme": "Theme", - "id": "Id", - "url": "Url", - "createdAt": "Created At", - "updatedAt": "Updated At", - "enabled": "Enabled", - "useProxy": "Use Proxy", - "authUrl": "Auth Url", - "tokenUrl": "Token Url", - "description": "Description", - "token": "Token", - "accounts": "Accounts", - "acl": "Acl", - "lastAccess": "Last Access", - "enterProxyIdToConfirmDeletion": "Enter Proxy Id to confirm deletion.", - "updateTheProxyHere": "Update the Proxy here. ", - "addNewProxyHere": "Add new Proxy here. ", - "pleaseUseAnIpAddressForBetterReliability": "Please use an IP address (e.g., 127.0.0.1) rather than a hostname or domain for better reliability.", - "adding": "Adding...", - "yourProxyHasBeenSuccessfully": "Your Proxy has been successfully {{action}}.", - "proxyUpdateOrAddFailed": "{{action}} failed, please try again later", - "sidebar": { - "profile": "Profile", - "apiTokens": "API Tokens", - "proxy": "Network Proxy", - "configurations": "System Configurations" - }, - "profile": { - "loadError": "Failed to load user information.", - "uploadTitle": "Upload avatar", - "maxSize": "Up to {{size}}", - "avatarAlt": "Avatar", - "removeAvatar": "Remove avatar", - "uploadError": "File upload error(s)", - "field": { - "username": "Username", - "email": "Email", - "password": "Password" - }, - "placeholder": { - "password_keep": "Leave blank to keep current password" - }, - "button": { - "update_profile": "Update profile", - "permissions": "Permissions", - "view_global_permissions": "View global permissions" - }, - "section": { - "roles": "Roles", - "accounts": "{{count}} linked accounts" - }, - "account": { - "id": "Account ID: {{id}}" - }, - "toast": { - "updated": "Profile updated successfully", - "update_failed": "Failed to update profile" - }, - "validation": { - "username": { - "required": "Username is required", - "min": "Username must be at least 5 characters", - "max": "Username must be at most 32 characters" - }, - "email": { - "required": "Email is required", - "invalid": "Please enter a valid email address" - }, - "password": { - "min": "Password must be at least 8 characters", - "max": "Password must be at most 256 characters" - } - } - } - }, - "apiDocs": { - "choosePreferredType": "Choose your preferred API documentation type", - "swaggerUI": "Swagger UI", - "reDoc": "ReDoc", - "openAPIExplorer": "OpenAPI Explorer", - "scalar": "Scalar", - "downloadSpecYAML": "Download Spec YAML" - }, - "dialogs": { - "confirmDelete": "Confirm Delete", - "confirmDeleteDesc": "Are you sure you want to delete this item? This action cannot be undone.", - "deleteSuccess": "Deleted successfully", - "deleteFailed": "Failed to delete", - "saveSuccess": "Saved successfully", - "saveFailed": "Failed to save", - "createSuccess": "Created successfully", - "createFailed": "Failed to create", - "updateSuccess": "Updated successfully", - "updateFailed": "Failed to update", - "continue": "Continue", - "deleting": "Deleting...", - "accountDeleted": "Account Deleted", - "accountDeletedDesc": "Your account has been successfully deleted.", - "accountDeleteFailed": "Account delete Failed", - "deleteAccountPermanently": "Delete Account Permanently", - "youAreDeleting": "You are deleting {{email}}. This will permanently remove:", - "accountCredentials": "Account credentials and settings", - "localCachedMetadata": "Local cached metadata and sync status", - "imapSyncData": "IMAP synchronization data", - "oauthTokens": "OAuth tokens and API credentials", - "typeEmailToConfirm": "Type the account email to confirm:", - "typeToConfirm": "Type \"{{email}}\" to confirm", - "cannotBeUndone": "This action cannot be undone!", - "allResourcesErased": "All related resources will be permanently erased.", - "permanentlyDeleteAccount": "Permanently Delete Account" - }, - "command": { - "typeCommandOrSearch": "Type a command or search...", - "noResultsFound": "No results found.", - "theme": "Theme", - "light": "Light", - "dark": "Dark" - }, - "validation": { - "required": "This field is required", - "invalidEmail": "Invalid email address", - "invalidUrl": "Invalid URL", - "passwordMinLength": "Password must be at least {{min}} characters long", - "pleaseEnterPassword": "Please enter your password", - "passwordRequired": "Password is required when auth method is Password", - "emailRequired": "Email is required", - "imapHostRequired": "IMAP host is required", - "imapHostCannotBeEmpty": "IMAP host cannot be empty", - "imapPortMustBePositive": "IMAP port must be a positive integer", - "imapPortMustBeLessThan65536": "IMAP port must be less than 65536", - "folderLimitMustBeNumber": "Folder limit must be a number", - "folderLimitMustBeAtLeast100": "Folder limit must be at least 100", - "incrementalSyncMustBeNumber": "Incremental sync interval must be a number", - "incrementalSyncMustBeAtLeast10": "Incremental sync interval must be at least 10 minutes", - "pleaseEnterUsernameOrEmail": "Please enter your username or email", - "singleRequestBatchSizeMustBeNumber": "Batch size must be a number", - "singleRequestBatchSizeTooSmall": "Batch size must be at least 10", - "singleRequestBatchSizeTooLarge": "Batch size must be at most 200" - }, - "table": { - "noResults": "No results found", - "loading": "Loading...", - "page": "Page", - "of": "of", - "rowsPerPage": "Rows per page", - "showing": "Showing", - "to": "to", - "results": "results", - "asc": "Asc", - "desc": "Desc", - "hide": "Hide", - "edit": "Edit", - "delete": "Delete", - "pagination": { - "selected": "Selected {{selected}} / {{total}} row(s).", - "fixed_page_size": "{{size}} rows per page.", - "rows_per_page": "Rows per page", - "page_info": "Page {{page}} of {{total}}", - "first": "Go to first page", - "previous": "Previous page", - "next": "Next page", - "last": "Go to last page" - } - }, - "proxyDelete": { - "title": "Delete Proxy", - "successTitle": "Delete Success", - "successDesc": "Proxy has been successfully deleted.", - "close": "Close", - "failedTitle": "Proxy delete Failed", - "failedDesc": "Delete failed, please try again later", - "tryAgain": "Try again", - "confirmText": "Are you sure you want to delete", - "permanent": "This action will permanently remove the Proxy from the system. This cannot be undone.", - "proxyIdLabel": "Proxy Id:", - "proxyIdPlaceholder": "Enter Proxy Id to confirm deletion.", - "warningTitle": "Warning!", - "warningDesc": "Please be careful, this operation cannot be rolled back.", - "deleteBtn": "Delete" - }, - "systemConfig": { - "pageTitle": "System-level Configurations", - "pageDescription": "These parameters are initialized via CLI flags or Environment Variables. They are currently read-only to ensure environment consistency.", - "status": { - "enabled": "Enabled", - "disabled": "Disabled", - "configured": "Configured", - "missing": "Missing", - "auto": "Auto", - "notSet": "Not set" - }, - "sections": { - "network": { - "title": "Network", - "desc": "HTTP and public access" - }, - "cors": { - "title": "CORS", - "desc": "Cross-origin access rules" - }, - "logging": { - "title": "Logging", - "desc": "Log output behavior" - }, - "storage": { - "title": "Storage & Cache", - "desc": "Database paths and limits" - }, - "security": { - "title": "Security", - "desc": "Authentication & encryption" - }, - "performance": { - "title": "Performance", - "desc": "Concurrency & compression" - }, - "smtp": { - "title": "SMTP Server", - "desc": "Incoming mail reception settings for real-time archiving" - } - } - }, - "apiTokens": { - "page": { - "loadError": "Failed to load API tokens.", - "emptyTitle": "No API tokens", - "emptyDescription": "You haven’t created any API tokens yet. Click below to create one.", - "addBtn": "Add Token" - }, - "list": { - "unnamedToken": "Unnamed Token", - "statusActive": "Active", - "statusExpired": "Expired", - "neverExpires": "Never expires", - "expiresOnShort": "Expires on {{date}}", - "tokenLabel": "Token", - "createdLabel": "Created", - "lastUsedLabel": "Last used", - "expiresOnLabel": "Expires on", - "neverUsed": "Never", - "neverLabel": "Never", - "deleteBtn": "Delete token" - }, - "dialog": { - "createTitle": "Create Access Token", - "editTitle": "Edit Access Token", - "description": "Click save when you are done.", - "save": "Save", - "saveChanges": "Save Changes" - }, - "deleteDialog": { - "title": "Delete access token?", - "description": "This action cannot be undone. Any application using this token will immediately lose access.", - "cancel": "Cancel", - "confirm": "Delete", - "deleting": "Deleting..." - }, - "form": { - "nameLabel": "Name", - "namePlaceholder": "Give this access token a short name", - "nameDescription": "Optional · Max 32 characters", - "expirationLabel": "Expiration", - "expirationPlaceholder": "Select expiration", - "expirationDescription": "Tokens will automatically expire after the selected time.", - "never": "Never", - "1day": "1 day", - "7days": "7 days", - "30days": "30 days", - "errorMax": "Max 32 characters", - "errorNumber": "Must be a number", - "errorInt": "Must be an integer", - "errorPositive": "Must be greater than 0" - }, - "notifications": { - "createSuccess": "Access Token Created", - "createSuccessDesc": "The access token has been created successfully.", - "updateSuccess": "Access Token Updated", - "updateSuccessDesc": "The access token has been updated successfully.", - "createFailed": "Creation Failed", - "updateFailed": "Update Failed", - "deleteSuccess": "Access token deleted successfully", - "deleteFailed": "Failed to delete access token", - "copied": "Copied to clipboard", - "genericError": "Operation failed. Please try again.", - "close": "Close", - "tryAgain": "Try again" - } + "updated": "Updated", + "useProxyOptional": "Use Proxy (optional):", + "useSocks5ProxyForOAuthRequests": "Use SOCKS5 proxy for OAuth requests when direct access is blocked.", + "value": "Value:", + "valueCannotBeEmpty": "Value cannot be empty", + "valueIsRequired": "Value is required", + "warning": "Warning!", + "whenDisabled": "When disabled: - New authorization flows will be rejected immediately - Existing access tokens and refresh tokens will be revoked within 1 minute - Users must re-authorize when re-enabled", + "yourOAuth2ApplicationHasBeenSuccessfully": "Your OAuth2 application has been successfully {{action}}.", + "yourOAuth2ApplicationHasBeenSuccessfullyDeleted": "Your OAuth2 application has been successfully deleted." }, "permission": { - "scope": { - "global": "Global", - "account": "Account #{{id}}" - }, - "dialog": { - "global_title": "Global Permissions", - "account_title": "Account Permissions", - "global_description": "System-wide permissions granted to this user.", - "account_description": "Permissions scoped to the selected account." - }, - "category": { - "system_identity": "System & Identity", - "global_data": "Global Data (Admin)", - "account": "Account Permissions" - }, - "system": { - "access": "Basic System Access", - "root": "Root System Control" - }, - "user": { - "manage": "Manage All Users", - "view": "List Basic Usernames" - }, - "token": { - "manage": "Manage Access Tokens" - }, "account": { "create": "Create Email Accounts", "manage": "Manage Assigned Accounts", "manage_all": "Manage All Account Configs", "read_details": "Read Assigned Account Details" }, + "category": { + "account": "Account Permissions", + "global_data": "Global Data (Admin)", + "system_identity": "System & Identity" + }, "data": { - "read": "Read Assigned Email Data", - "read_all": "Read All Email Data", - "manage": "Manage Assigned Email Metadata", - "manage_all": "Manage All Email Metadata", - "raw_download": "Download Assigned Raw Emails", - "raw_download_all": "Download All Raw Emails", "delete": "Delete Assigned Emails", "delete_all": "Delete Emails from All Accounts", "export_batch": "Batch Export Assigned Data", "export_batch_all": "Batch Export All Data", "import_batch": "Batch Import Email Data", + "manage": "Manage Assigned Email Metadata", + "manage_all": "Manage All Email Metadata", + "raw_download": "Download Assigned Raw Emails", + "raw_download_all": "Download All Raw Emails", + "read": "Read Assigned Email Data", + "read_all": "Read All Email Data", "smtp_ingest": "Ingest Emails via SMTP Protocol" - } - }, - "users": { - "columns": { - "id": "ID", - "avatar": "Avatar", - "username": "Username", - "email": "Email Address", - "roles": "Roles", - "created_at": "Created At", - "updated_at": "Updated At", - "actions": "Actions" }, - "buttons": { - "add": "Add User", - "add_new": "Add New User" + "dialog": { + "account_description": "Permissions scoped to the selected account.", + "account_title": "Account Permissions", + "global_description": "System-wide permissions granted to this user.", + "global_title": "Global Permissions" }, - "empty": { - "title": "No users found", - "description": "Click the button below to start adding your first user." + "scope": { + "account": "Account #{{id}}", + "global": "Global" }, - "nav": { - "users": "Users", - "roles": "Roles", - "api_tokens": "API Tokens" + "system": { + "access": "Basic System Access", + "root": "Root System Control" }, - "api_tokens": { - "empty": { - "title": "No API tokens found", - "description": "No API tokens have been generated in the system yet" - }, - "button": { - "generate": "Generate New Token" - }, - "toolbar": { - "search_placeholder": "Search by name, owner or token..." - }, - "table": { - "name": "Name", - "type": "Type", - "last_used": "Last Used", - "expires_at": "Expires At", - "owner": "Owner", - "created": "Created", - "api_key": "API Key", - "web_ui": "Web UI", - "never": "Never", - "permanent": "Permanent", - "expired": "Expired", - "unnamed": "Unnamed Token" - }, - "unnamed": "Unnamed Token", - "delete": { - "title": "Delete API Token", - "desc": "You are about to permanently delete this API token", - "prefix": "Token Prefix", - "irreversible": "This action cannot be undone. Any applications using this token will immediately lose access.", - "confirm_label": "To confirm, please type {{word}} below:", - "confirm_placeholder": "Type \"{{word}}\" to confirm", - "warning_title": "Warning", - "warning_desc": "Any scripts, services, or integrations using this token will fail. Please ensure you have updated your systems before proceeding.", - "confirm_button": "Delete Token", - "deleting": "Deleting..." - }, - "toast": { - "deleted_title": "API Token Deleted", - "deleted_desc": "The token \"{{name}}\" has been successfully removed.", - "delete_failed_title": "Delete Failed", - "delete_failed": "Failed to delete the token, please try again." - } + "token": { + "manage": "Manage Access Tokens" }, - "tokens": { - "schema": { - "name_max": "Max 32 characters", - "expire_number": "Must be a number", - "expire_int": "Must be an integer", - "expire_positive": "Must be greater than 0" - }, - "toast": { - "update_success_title": "Access Token Updated", - "update_success_desc": "Access token has been successfully updated.", - "create_success_title": "Access Token Created", - "create_success_desc": "Access token has been successfully created.", - "update_failed_title": "Update Failed", - "create_failed_title": "Creation Failed" - }, - "error": { - "fallback": "Operation failed, please try again later." - }, - "dialog": { - "edit_title": "Edit Access Token", - "create_title": "Create Access Token", - "description": "Click save when you're done." - }, - "fields": { - "name_label": "Name", - "name_placeholder": "Give this access token a short name", - "name_hint": "Optional · Max 32 characters", - "expire_label": "Expiration", - "expire_placeholder": "Select expiration", - "expire_hint": "The token will automatically expire after the selected time." - }, - "expire_options": { - "never": "Never expires", - "1_day": "1 Day", - "7_days": "7 Days", - "30_days": "30 Days" - } - }, - "tokens_action": { - "dialog": { - "title": "API Tokens", - "description": "Manage API tokens for this user." - }, - "empty": { - "title": "No API Tokens", - "description": "This user currently has no API tokens." - }, - "buttons": { - "add": "Add Token" - }, - "list": { - "unnamed_token": "Unnamed Token", - "status_expired": "Expired", - "status_active": "Active", - "expires_on_brief": "Expires on {{date}}", - "never_expires": "Never expires", - "label_token": "Token", - "label_created": "Created At", - "label_last_used": "Last Used", - "label_expires_at": "Expires At", - "never": "Never", - "button_delete": "Delete Token" - }, - "delete_dialog": { - "title": "Delete Access Token?", - "description": "This action cannot be undone." - } - }, - "actions": { - "schema": { - "account_required": "Please select an account", - "role_required": "Please select a role", - "username_required": "Username is required", - "username_min": "Username must be at least 3 characters", - "username_max": "Username cannot exceed 32 characters", - "email_required": "Email address is required", - "email_invalid": "Please enter a valid email address", - "global_role_required": "Assign at least one global role to this user", - "description_max": "Description cannot exceed 256 characters", - "ip_invalid": "Invalid IP address detected", - "password_required": "Password is required", - "password_min": "Password must be at least 8 characters", - "password_max": "Password cannot exceed 256 characters" - }, - "toast": { - "updated": "User updated", - "created": "User created" - }, - "dialog": { - "edit_title": "Edit User: {{name}}", - "create_title": "Create New User", - "subtitle": "Configure identity, access levels, and security policies." - }, - "tabs": { - "general": "General", - "permissions": "Account Permissions", - "security": "Security & ACL" - }, - "sections": { - "basic": "Basic Identity", - "global": "Global Permissions", - "mail_access": "Mail Access Control", - "mail_access_subtitle": "Define which mail accounts this user can manage.", - "policy": "Policy Toggles" - }, - "fields": { - "username": "Username", - "username_hint": "Unique identifier for system login.", - "email": "Email Address", - "email_hint": "Primary contact and notification address.", - "password": "Password", - "password_placeholder_create": "At least 8 characters", - "password_placeholder_edit": "Leave blank to keep current password", - "password_hint_create": "Secure password for initial user setup.", - "password_hint_edit": "Only enter a new password if you wish to change it.", - "global_roles_hint": "Assign high-level system permissions.", - "description": "Description (Optional)", - "description_placeholder": "Add some notes about this user...", - "description_hint": "Internal notes (max 256 characters).", - "select_account": "Select Account", - "assign_role": "Assign Role", - "ip_whitelist": "IP Whitelist", - "ip_whitelist_hint": "Restrict login to these IPs (one per line).", - "rate_quota": "Rate Quota", - "burst_interval": "Burst Interval (sec)" - }, - "buttons": { - "add_account": "Add Account", - "update": "Update User", - "create": "Create User" - }, - "states": { - "full_access": "Full Access Mode", - "full_access_desc": "System administrators have inherent access to all accounts.", - "no_accounts": "No specific accounts assigned.", - "security_disabled": "Security policies are currently disabled." - }, - "api_tokens": "API Tokens", - "placeholder": { - "filter": "Search users..." - }, - "delete": { - "title": "Delete User", - "confirm_msg": "You are about to permanently delete user {{name}} (ID: {{id}}).", - "irreversible": "This action cannot be undone.", - "input_label": "To confirm, please type the User ID below:", - "placeholder": "Type \"{{id}}\" to confirm", - "alert_title": "Warning: Permanent action.", - "alert_desc": "Once deleted, the user and all associated data will be wiped.", - "button_confirm": "Delete User", - "button_deleting": "Deleting...", - "toast": { - "success_title": "User Deleted", - "success_desc": "User \"{{name}}\" has been successfully removed.", - "failed_title": "Delete Failed", - "failed_fallback": "Failed to delete user." - } - } - } - }, - "roles": { - "title": { - "create": "Create New Role", - "edit": "Edit Role: {{name}}" - }, - "description_hint": "Define access scope and functional permissions.", - "form": { - "name_label": "Role Name", - "type_label": "Role Type", - "desc_label": "Description", - "matrix_label": "{{type}} Permission Matrix", - "builtin_badge": "Built-in Role", - "builtin_desc": "This role is predefined and read-only." - }, - "types": { - "Global": "Global", - "Account": "Account" - }, - "categories": { - "identity": "Identity & Management", - "global_data": "Global Data Access", - "account_resource": "Account Resource Access" - }, - "actions": { - "cancel": "Cancel", - "submit_create": "Create Role", - "submit_update": "Update Role", - "success_create": "Role created successfully", - "success_update": "Role updated successfully", - "failed": "Operation failed", - "close": "Close", - "retry": "Retry", - "add": "Add Role" - }, - "validation": { - "name_required": "Role name is required", - "perm_required": "Select at least one permission" - }, - "columns": { - "id": "ID", - "name": "Name", - "role_type": "Role Type", - "permissions": "Permissions", - "created_at": "Created At", - "updated_at": "Updated At" - }, - "placeholder": { - "filter": "Search roles..." - }, - "delete": { - "dialog_title": "Delete User Role", - "warning_text": "You are about to permanently delete role {{name}} (ID: {{id}}).", - "irreversible": "This action cannot be undone.", - "confirm_label": "Please type the role ID to confirm:", - "placeholder": "Type \"{{id}}\" to confirm", - "alert_title": "Warning: Permanent action.", - "alert_desc": "Deleting this role will remove it from all assigned users.", - "confirm_btn": "Delete Role", - "deleting": "Deleting...", - "success_title": "Role Deleted", - "success_desc": "Role \"{{name}}\" has been successfully removed.", - "error_title": "Delete Failed", - "error_fallback": "Could not delete the role." - }, - "details": { - "title": "Role Permissions: {{name}}", - "unknown": "Unknown Role", - "role_badge": "{{type}} Role", - "desc_global": "Global management and system-level access.", - "desc_account": "Access and data operations for single accounts.", - "close_btn": "Close Details", - "view_permissions": "Permission Details" - }, - "empty": { - "title": "No Roles Found", - "desc": "You haven't created any custom roles yet." + "user": { + "manage": "Manage All Users", + "view": "List Basic Usernames" } }, "profile": { @@ -1497,118 +820,811 @@ "sign_out": "Sign out" } }, - "sign_out": { - "title": "Sign out", - "desc": "Are you sure you want to sign out? You will need to sign in again to access your account.", - "confirm": "Sign out" + "proxyDelete": { + "close": "Close", + "confirmText": "Are you sure you want to delete", + "deleteBtn": "Delete", + "failedDesc": "Delete failed, please try again later", + "failedTitle": "Proxy delete Failed", + "permanent": "This action will permanently remove the Proxy from the system. This cannot be undone.", + "proxyIdLabel": "Proxy Id:", + "proxyIdPlaceholder": "Enter Proxy Id to confirm deletion.", + "successDesc": "Proxy has been successfully deleted.", + "successTitle": "Delete Success", + "title": "Delete Proxy", + "tryAgain": "Try again", + "warningDesc": "Please be careful, this operation cannot be rolled back.", + "warningTitle": "Warning!" }, "restore_message": { - "title": "Restore Single Message", + "accountsInvolved": "Accounts involved", "bulkTitle": "Bulk Restore Messages", "bulkWarning": "Note: Messages will be restored to their original storage folders.", - "accountsInvolved": "Accounts involved", - "summary": "Restoration Details", - "messages": "messages", - "desc": "This action will re-upload selected messages from Bichon and restore them to their corresponding mailboxes on the IMAP server.", "confirm": "Restore Now", + "desc": "This action will re-upload selected messages from Bichon and restore them to their corresponding mailboxes on the IMAP server.", + "failed": "Restore Failed", + "failedTitle": "Failed to Restore", + "messages": "messages", "restore_to_imap": "Restore Message", "success": "Messages Restored", "successDesc": "The selected messages have been successfully restored to the IMAP server.", - "failed": "Restore Failed", - "failedTitle": "Failed to Restore" + "summary": "Restoration Details", + "title": "Restore Single Message" }, - "time": { - "label": "Time", - "since": "Since", - "before": "Before", - "recent_range": "Recent range (since...)", - "historical": "Historical range (before...)", - "absolute_range": "Absolute date range", - "last_day": "Last 1 day", - "last_days": "Last {{count}} days", - "last_months": "Last {{count}} months", - "over_years_ago": "{{count}} {{unit}} ago", - "year": "year", - "years": "years", - "recent_prefix": "Recent:", - "days_ago_to_now": "days ago to now", - "apply": "Apply", - "start_date": "Start date", - "end_date": "End date", - "clear_filters": "Clear time filters", - "format": "yyyy-MM-dd" + "roles": { + "actions": { + "add": "Add Role", + "cancel": "Cancel", + "close": "Close", + "failed": "Operation failed", + "retry": "Retry", + "submit_create": "Create Role", + "submit_update": "Update Role", + "success_create": "Role created successfully", + "success_update": "Role updated successfully" + }, + "categories": { + "account_resource": "Account Resource Access", + "global_data": "Global Data Access", + "identity": "Identity & Management" + }, + "columns": { + "created_at": "Created At", + "id": "ID", + "name": "Name", + "permissions": "Permissions", + "role_type": "Role Type", + "updated_at": "Updated At" + }, + "delete": { + "alert_desc": "Deleting this role will remove it from all assigned users.", + "alert_title": "Warning: Permanent action.", + "confirm_btn": "Delete Role", + "confirm_label": "Please type the role ID to confirm:", + "deleting": "Deleting...", + "dialog_title": "Delete User Role", + "error_fallback": "Could not delete the role.", + "error_title": "Delete Failed", + "irreversible": "This action cannot be undone.", + "placeholder": "Type \"{{id}}\" to confirm", + "success_desc": "Role \"{{name}}\" has been successfully removed.", + "success_title": "Role Deleted", + "warning_text": "You are about to permanently delete role {{name}} (ID: {{id}})." + }, + "description_hint": "Define access scope and functional permissions.", + "details": { + "close_btn": "Close Details", + "desc_account": "Access and data operations for single accounts.", + "desc_global": "Global management and system-level access.", + "role_badge": "{{type}} Role", + "title": "Role Permissions: {{name}}", + "unknown": "Unknown Role", + "view_permissions": "Permission Details" + }, + "empty": { + "desc": "You haven't created any custom roles yet.", + "title": "No Roles Found" + }, + "form": { + "builtin_badge": "Built-in Role", + "builtin_desc": "This role is predefined and read-only.", + "desc_label": "Description", + "matrix_label": "{{type}} Permission Matrix", + "name_label": "Role Name", + "type_label": "Role Type" + }, + "placeholder": { + "filter": "Search roles..." + }, + "title": { + "create": "Create New Role", + "edit": "Edit Role: {{name}}" + }, + "types": { + "Account": "Account", + "Global": "Global" + }, + "validation": { + "name_required": "Role name is required", + "perm_required": "Select at least one permission" + } }, - "tag": { - "label": "Tags", - "search_placeholder": "Search tags...", - "clear_all": "Clear all tags", - "no_tags_found": "No tags found" + "search": { + "account": "Account", + "addEmailAccount": "Add Email Account", + "addTags": { + "cancel": "Cancel", + "createHint": "Create new tag: {{tag}}", + "invalidTitle": "Invalid Tag", + "none": "No tags added", + "save": "Save", + "saving": "Saving...", + "searchPlaceholder": "Search or create tag...", + "selectedCount": "{{count}} tags selected", + "title": "Edit Tags", + "tryAgain": "Please try again later", + "updateFailedTitle": "Update Failed", + "updatedDesc": "Tags have been successfully updated", + "updatedTitle": "Tags Updated" + }, + "adjustSearch": "Try adjusting your search criteria or clearing filters.", + "advanced": "Advanced", + "advancedFilters": "Advanced Filters", + "any": "Any", + "attachmentName": "Attachment Name", + "attachmentsSize": "Attachments & Size", + "bcc": "BCC", + "before": "Before:", + "bulkActions": { + "ariaLabel": "{{count}} messages selected. Bulk actions toolbar", + "clear": "Clear selection", + "delete": "Delete", + "deleteDesc": "Delete selected messages", + "manageTags": "Manage Tags", + "selected": "{{count}} selected" + }, + "cc": "CC", + "clear": "Clear", + "date": "Date", + "dateRange": "Date Range", + "delete": { + "confirmButton": "Delete", + "confirmDetail": "This action cannot be undone.", + "confirmPrefix": "Are you sure you want to delete", + "countLabel": "{{count}} message", + "errorTitle": "Delete failed", + "successDesc": "The selected messages have been deleted successfully.", + "successTitle": "Messages deleted", + "title": "Delete messages", + "warningDesc": "Deleted messages will be permanently removed and cannot be recovered.", + "warningTitle": "Warning" + }, + "editTag": "Edit Tag", + "endDate": "End Date", + "from": "From", + "fullTextMultiAccount": "Full-text · Multi-account · Advanced filters", + "hasAttachment": "Has Attachment", + "huge": "Huge (≥20 MB)", + "keyword": "Keyword", + "large": "Large (10 - 20 MB)", + "mailbox": "Mailbox", + "maxSize": "Max Size", + "maximumBytes": "Maximum", + "medium": "Medium (2 - 10 MB)", + "messageId": "Message ID", + "minSize": "Min Size", + "minimumBytes": "Minimum", + "no": "No", + "noActiveEmailAccount": "No active email account.", + "noEmailsFound": "No emails found", + "noMailboxSelectAccount": "No mailbox. Please select an account first.", + "originalMessageIdHeader": "Original email Message-ID header", + "pleaseSelectAtLeastOne": "Please select at least one search condition", + "preview": "Preview", + "recipient": "Recipient", + "searchArchivedEmails": "Search Archived Emails", + "searchButton": "Search", + "searchInSubjectBody": "Search in subject, body, attachments...", + "searching": "Searching, please wait…", + "searchingButton": "Searching...", + "selectAccount": "Select account", + "selectDate": "Select a date", + "selectMailbox": "Select mailbox", + "sender": "Sender", + "senderRecipients": "Sender / Recipients", + "since": "Since:", + "size": "Size", + "sizeDescription": "The size refers to the total email size, including attachments.", + "small": "Small (<2 MB)", + "sort": "Sort", + "source": "Source", + "startDate": "Start Date", + "startSearching": "Start by entering a keyword, sender, or using advanced filters.", + "subject": "Subject", + "tagFilter": "Tag Filter", + "thread": { + "empty": "No messages in this thread", + "error": "Failed to load thread", + "invalidDate": "Invalid date", + "loadMore": "Load more", + "loadingMore": "Loading...", + "noSubject": "(No subject)", + "title": "Thread · {{count}} messages" + }, + "tiny": "Tiny (<15 KB)", + "title": "Search", + "to": "To", + "updateTags": { + "actionAdd": "Add", + "actionOverwrite": "Overwrite", + "actionRemove": "Remove", + "cancel": "Cancel", + "createHint": "Press Enter to create new tag: \"{{tag}}\"", + "invalidTitle": "Invalid Tag", + "none": "No tags selected", + "overwriteWarning": "Warning: This will overwrite all existing tags on the selected items.", + "savingAdd": "Adding...", + "savingOverwrite": "Overwriting...", + "savingRemove": "Removing...", + "searchPlaceholder": "Search or create new tag...", + "selectedCount": "{{count}} tag(s) to be applied", + "submitAdd": "Add Tags", + "submitOverwrite": "Overwrite Tags", + "submitRemove": "Remove Tags", + "title": "Update Tags", + "tryAgain": "Please try again later.", + "updateFailedTitle": "Update Failed", + "updatedDesc": "Tags have been successfully updated.", + "updatedTitle": "Tags Updated" + }, + "yes": "Yes" }, "search_accounts": { - "label": "Mail accounts", - "search_placeholder": "Search mail accounts...", "clear_accounts": "Clear selected accounts", - "no_accounts_found": "No accounts found" - }, - "search_mailbox": { - "label": "Mailboxes", - "search_placeholder": "Search mailboxes", - "clear_mailboxes": "Clear selected mailboxes", - "select_account_first": "Please select an account first", - "no_mailbox_found": "No mailbox found" + "label": "Mail accounts", + "no_accounts_found": "No accounts found", + "search_placeholder": "Search mail accounts..." }, "search_contacts": { + "any": "Any", "label": "Contacts", "label_with_count": "Contacts ({{count}})", - "any": "Any", - "search_placeholder": "Search {{field}}...", - "reset_all": "Reset all contacts", - "no_contact_found": "No contacts found", "loading": "Loading...", + "no_contact_found": "No contacts found", + "reset_all": "Reset all contacts", + "search_placeholder": "Search {{field}}...", "showing_limit": "Showing first 100 results • Total {{total}}" }, + "search_input": { + "all": "All Fields", + "all_fields_desc": "Matches subject, body, sender, and recipients", + "body": "Body", + "button": "Search", + "clear_history": "Clear history", + "no_history": "No search history", + "placeholder": "Search emails (use \" \" for phrase search)", + "recent_title": "Recent searches", + "subject": "Subject" + }, + "search_mailbox": { + "clear_mailboxes": "Clear selected mailboxes", + "label": "Mailboxes", + "no_mailbox_found": "No mailbox found", + "search_placeholder": "Search mailboxes", + "select_account_first": "Please select an account first" + }, "search_more": { - "trigger_label": "Advanced", - "title": "Advanced filters", - "reset": "Reset", - "has_attachment": "Has attachment", + "any": "Any", + "apply": "Apply filters", "attachment_name_label": "Attachment name", "attachment_name_placeholder": "e.g. invoice.pdf", - "message_size_label": "Message size", - "message_id_label": "Original Message-ID", + "category": "Category", + "content_type": "File Type", + "extension": "Extension", + "has_attachment": "Has attachment", + "is_message": "Email format attachment", + "is_message_desc": "This attachment is a mail file, for example, an .eml file.", "message_id_description": "Search by Message-ID header", - "apply": "Apply filters", + "message_id_label": "Original Message-ID", + "message_size_label": "Message size", + "reset": "Reset", + "search_placeholder": "Search {{field}}...", "size_presets": { "any": "Any size", - "tiny": "Tiny (< 15 KB)", - "small": "Small (< 2 MB)", - "medium": "Medium (2 – 10 MB)", + "huge": "Huge (> 20 MB)", "large": "Large (10 – 20 MB)", - "huge": "Huge (> 20 MB)" + "medium": "Medium (2 – 10 MB)", + "small": "Small (< 2 MB)", + "tiny": "Tiny (< 15 KB)" }, - "any": "Any", - "search_placeholder": "Search {{field}}...", - "extension": "Extension", - "category": "Category", - "content_types": "Specific Type" - }, - "search_view": { - "button_label": "View", - "menu_title": "Column settings" + "title": "Advanced filters", + "trigger_label": "Advanced" }, "search_reset": { "label": "Reset", "tooltip": "Clear all filters" }, - "search_input": { - "placeholder": "Search emails... (Regex supported)", - "button": "Search", - "recent_title": "Recent searches", - "clear_history": "Clear history", - "no_history": "No search history", - "all": "All Fields", - "all_fields_desc": "Matches subject, body, sender, and recipients", - "subject": "Subject", - "body": "Body" + "search_view": { + "button_label": "View", + "menu_title": "Column settings" + }, + "settings": { + "accounts": "Accounts", + "acl": "Acl", + "actions": "Actions", + "add": "Add", + "addNewProxyHere": "Add new Proxy here. ", + "adding": "Adding...", + "appearance": { + "button": { + "update": "Update preferences" + }, + "command": { + "no_results": "No language found.", + "search": "Search language..." + }, + "description": { + "language": "Select the language used in the Web UI.", + "theme": "Choose between light or dark mode for the interface." + }, + "field": { + "language": "Language", + "theme": "Interface Theme" + }, + "placeholder": { + "select_language": "Select language" + }, + "theme": { + "dark": "Dark", + "light": "Light" + }, + "title": "Appearance", + "validation": { + "language": { + "required": "Please select a language." + }, + "theme": { + "required": "Please select a theme." + } + } + }, + "authUrl": "Auth Url", + "changePasswordForFutureLogins": "Change password for future logins.", + "confirmReset": "Confirm Reset", + "createdAt": "Created At", + "delete": "Delete", + "description": "Description", + "edit": "Edit", + "enabled": "Enabled", + "enterNewRootPassword": "Enter new root password", + "enterProxyIdToConfirmDeletion": "Enter Proxy Id to confirm deletion.", + "failedToCopyText": "Failed to copy text", + "filterAccessToken": "Filter access token...", + "filterAccount": "Filter account...", + "filterOauth2": "Filter oauth2...", + "filterProxy": "Filter Proxy...", + "general": "General", + "generateNewToken": "Generate new token, old one expires immediately.", + "host": "Host", + "id": "Id", + "invalidPassword": "Invalid password", + "lastAccess": "Last Access", + "manageRootTokenAndPassword": "Manage root token and password securely.", + "name": "Name", + "noProxies": "No Proxies", + "noProxiesDesc": "You haven't added any proxy configurations yet. Add one to start using proxy features.", + "password": "Password", + "pleaseUseAnIpAddressForBetterReliability": "Please use an IP address (e.g., 127.0.0.1) rather than a hostname or domain for better reliability.", + "port": "Port", + "profile": { + "account": { + "id": "Account ID: {{id}}" + }, + "avatarAlt": "Avatar", + "button": { + "permissions": "Permissions", + "update_profile": "Update profile", + "view_global_permissions": "View global permissions" + }, + "field": { + "email": "Email", + "password": "Password", + "username": "Username" + }, + "loadError": "Failed to load user information.", + "maxSize": "Up to {{size}}", + "placeholder": { + "password_keep": "Leave blank to keep current password" + }, + "removeAvatar": "Remove avatar", + "section": { + "accounts": "{{count}} linked accounts", + "roles": "Roles" + }, + "toast": { + "update_failed": "Failed to update profile", + "updated": "Profile updated successfully" + }, + "uploadError": "File upload error(s)", + "uploadTitle": "Upload avatar", + "validation": { + "email": { + "invalid": "Please enter a valid email address", + "required": "Email is required" + }, + "password": { + "max": "Password must be at most 256 characters", + "min": "Password must be at least 8 characters" + }, + "username": { + "max": "Username must be at most 32 characters", + "min": "Username must be at least 5 characters", + "required": "Username is required" + } + } + }, + "proxy": "Proxy", + "proxyUpdateOrAddFailed": "{{action}} failed, please try again later", + "reset": "Reset", + "resetRootPassword": "Reset Root Password", + "resetRootToken": "Reset Root Token", + "root": "Root", + "rootAccessManagement": "Root Access Management", + "rootDesc": "Manage root access credentials including token and password.", + "rootPasswordMustBeAtLeast6Characters": "The root password must be at least 6 characters long.", + "rootTitle": "Root", + "selectAll": "Select all", + "sidebar": { + "apiTokens": "API Tokens", + "configurations": "System Configurations", + "profile": "Profile", + "proxy": "Network Proxy" + }, + "theRootPasswordHasBeenReset": "The root password has been reset", + "theRootTokenHasBeenReset": "The root token has been reset", + "theme": "Theme", + "title": "Settings", + "token": "Token", + "tokenUrl": "Token Url", + "type": "Type", + "updateTheProxyHere": "Update the Proxy here. ", + "updatedAt": "Updated At", + "url": "Url", + "useNewPasswordForNextLogin": "Use the new password for your next login.", + "useProxy": "Use Proxy", + "username": "Username", + "youAreAboutToResetTheRootPassword": "You are about to reset the root password. Make sure to store it securely.", + "youAreAboutToResetTheRootToken": "You are about to reset the root token. This action cannot be undone.", + "yourLoginInformationHasBeenUpdated": "Your login information has been updated. No need to log in again.", + "yourProxyHasBeenSuccessfully": "Your Proxy has been successfully {{action}}." + }, + "sign_out": { + "confirm": "Sign out", + "desc": "Are you sure you want to sign out? You will need to sign in again to access your account.", + "title": "Sign out" + }, + "systemConfig": { + "pageDescription": "These parameters are initialized via CLI flags or Environment Variables. They are currently read-only to ensure environment consistency.", + "pageTitle": "System-level Configurations", + "sections": { + "cors": { + "desc": "Cross-origin access rules", + "title": "CORS" + }, + "logging": { + "desc": "Log output behavior", + "title": "Logging" + }, + "network": { + "desc": "HTTP and public access", + "title": "Network" + }, + "performance": { + "desc": "Concurrency & compression", + "title": "Performance" + }, + "security": { + "desc": "Authentication & encryption", + "title": "Security" + }, + "smtp": { + "desc": "Incoming mail reception settings for real-time archiving", + "title": "SMTP Server" + }, + "storage": { + "desc": "Database paths and limits", + "title": "Storage & Cache" + } + }, + "status": { + "auto": "Auto", + "configured": "Configured", + "disabled": "Disabled", + "enabled": "Enabled", + "missing": "Missing", + "notSet": "Not set" + } + }, + "table": { + "asc": "Asc", + "delete": "Delete", + "desc": "Desc", + "edit": "Edit", + "hide": "Hide", + "loading": "Loading...", + "noResults": "No results found", + "of": "of", + "page": "Page", + "pagination": { + "first": "Go to first page", + "fixed_page_size": "{{size}} rows per page.", + "last": "Go to last page", + "next": "Next page", + "page_info": "Page {{page}} of {{total}}", + "previous": "Previous page", + "rows_per_page": "Rows per page", + "selected": "Selected {{selected}} / {{total}} row(s)." + }, + "results": "results", + "rowsPerPage": "Rows per page", + "showing": "Showing", + "to": "to" + }, + "tag": { + "clear_all": "Clear all tags", + "label": "Tags", + "no_tags_found": "No tags found", + "search_placeholder": "Search tags..." + }, + "time": { + "absolute_range": "Absolute date range", + "apply": "Apply", + "before": "Before", + "clear_filters": "Clear time filters", + "days_ago_to_now": "days ago to now", + "end_date": "End date", + "format": "yyyy-MM-dd", + "historical": "Historical range (before...)", + "label": "Time", + "last_day": "Last 1 day", + "last_days": "Last {{count}} days", + "last_months": "Last {{count}} months", + "over_years_ago": "{{count}} {{unit}} ago", + "recent_prefix": "Recent:", + "recent_range": "Recent range (since...)", + "since": "Since", + "start_date": "Start date", + "year": "year", + "years": "years" + }, + "users": { + "actions": { + "api_tokens": "API Tokens", + "buttons": { + "add_account": "Add Account", + "create": "Create User", + "update": "Update User" + }, + "delete": { + "alert_desc": "Once deleted, the user and all associated data will be wiped.", + "alert_title": "Warning: Permanent action.", + "button_confirm": "Delete User", + "button_deleting": "Deleting...", + "confirm_msg": "You are about to permanently delete user {{name}} (ID: {{id}}).", + "input_label": "To confirm, please type the User ID below:", + "irreversible": "This action cannot be undone.", + "placeholder": "Type \"{{id}}\" to confirm", + "title": "Delete User", + "toast": { + "failed_fallback": "Failed to delete user.", + "failed_title": "Delete Failed", + "success_desc": "User \"{{name}}\" has been successfully removed.", + "success_title": "User Deleted" + } + }, + "dialog": { + "create_title": "Create New User", + "edit_title": "Edit User: {{name}}", + "subtitle": "Configure identity, access levels, and security policies." + }, + "fields": { + "assign_role": "Assign Role", + "burst_interval": "Burst Interval (sec)", + "description": "Description (Optional)", + "description_hint": "Internal notes (max 256 characters).", + "description_placeholder": "Add some notes about this user...", + "email": "Email Address", + "email_hint": "Primary contact and notification address.", + "global_roles_hint": "Assign high-level system permissions.", + "ip_whitelist": "IP Whitelist", + "ip_whitelist_hint": "Restrict login to these IPs (one per line).", + "password": "Password", + "password_hint_create": "Secure password for initial user setup.", + "password_hint_edit": "Only enter a new password if you wish to change it.", + "password_placeholder_create": "At least 8 characters", + "password_placeholder_edit": "Leave blank to keep current password", + "rate_quota": "Rate Quota", + "select_account": "Select Account", + "username": "Username", + "username_hint": "Unique identifier for system login." + }, + "placeholder": { + "filter": "Search users..." + }, + "schema": { + "account_required": "Please select an account", + "description_max": "Description cannot exceed 256 characters", + "email_invalid": "Please enter a valid email address", + "email_required": "Email address is required", + "global_role_required": "Assign at least one global role to this user", + "ip_invalid": "Invalid IP address detected", + "password_max": "Password cannot exceed 256 characters", + "password_min": "Password must be at least 8 characters", + "password_required": "Password is required", + "role_required": "Please select a role", + "username_max": "Username cannot exceed 32 characters", + "username_min": "Username must be at least 3 characters", + "username_required": "Username is required" + }, + "sections": { + "basic": "Basic Identity", + "global": "Global Permissions", + "mail_access": "Mail Access Control", + "mail_access_subtitle": "Define which mail accounts this user can manage.", + "policy": "Policy Toggles" + }, + "states": { + "full_access": "Full Access Mode", + "full_access_desc": "System administrators have inherent access to all accounts.", + "no_accounts": "No specific accounts assigned.", + "security_disabled": "Security policies are currently disabled." + }, + "tabs": { + "general": "General", + "permissions": "Account Permissions", + "security": "Security & ACL" + }, + "toast": { + "created": "User created", + "updated": "User updated" + } + }, + "api_tokens": { + "button": { + "generate": "Generate New Token" + }, + "delete": { + "confirm_button": "Delete Token", + "confirm_label": "To confirm, please type {{word}} below:", + "confirm_placeholder": "Type \"{{word}}\" to confirm", + "deleting": "Deleting...", + "desc": "You are about to permanently delete this API token", + "irreversible": "This action cannot be undone. Any applications using this token will immediately lose access.", + "prefix": "Token Prefix", + "title": "Delete API Token", + "warning_desc": "Any scripts, services, or integrations using this token will fail. Please ensure you have updated your systems before proceeding.", + "warning_title": "Warning" + }, + "empty": { + "description": "No API tokens have been generated in the system yet", + "title": "No API tokens found" + }, + "table": { + "api_key": "API Key", + "created": "Created", + "expired": "Expired", + "expires_at": "Expires At", + "last_used": "Last Used", + "name": "Name", + "never": "Never", + "owner": "Owner", + "permanent": "Permanent", + "type": "Type", + "unnamed": "Unnamed Token", + "web_ui": "Web UI" + }, + "toast": { + "delete_failed": "Failed to delete the token, please try again.", + "delete_failed_title": "Delete Failed", + "deleted_desc": "The token \"{{name}}\" has been successfully removed.", + "deleted_title": "API Token Deleted" + }, + "toolbar": { + "search_placeholder": "Search by name, owner or token..." + }, + "unnamed": "Unnamed Token" + }, + "buttons": { + "add": "Add User", + "add_new": "Add New User" + }, + "columns": { + "actions": "Actions", + "avatar": "Avatar", + "created_at": "Created At", + "email": "Email Address", + "id": "ID", + "roles": "Roles", + "updated_at": "Updated At", + "username": "Username" + }, + "empty": { + "description": "Click the button below to start adding your first user.", + "title": "No users found" + }, + "nav": { + "api_tokens": "API Tokens", + "roles": "Roles", + "users": "Users" + }, + "tokens": { + "dialog": { + "create_title": "Create Access Token", + "description": "Click save when you're done.", + "edit_title": "Edit Access Token" + }, + "error": { + "fallback": "Operation failed, please try again later." + }, + "expire_options": { + "1_day": "1 Day", + "30_days": "30 Days", + "7_days": "7 Days", + "never": "Never expires" + }, + "fields": { + "expire_hint": "The token will automatically expire after the selected time.", + "expire_label": "Expiration", + "expire_placeholder": "Select expiration", + "name_hint": "Optional · Max 32 characters", + "name_label": "Name", + "name_placeholder": "Give this access token a short name" + }, + "schema": { + "expire_int": "Must be an integer", + "expire_number": "Must be a number", + "expire_positive": "Must be greater than 0", + "name_max": "Max 32 characters" + }, + "toast": { + "create_failed_title": "Creation Failed", + "create_success_desc": "Access token has been successfully created.", + "create_success_title": "Access Token Created", + "update_failed_title": "Update Failed", + "update_success_desc": "Access token has been successfully updated.", + "update_success_title": "Access Token Updated" + } + }, + "tokens_action": { + "buttons": { + "add": "Add Token" + }, + "delete_dialog": { + "description": "This action cannot be undone.", + "title": "Delete Access Token?" + }, + "dialog": { + "description": "Manage API tokens for this user.", + "title": "API Tokens" + }, + "empty": { + "description": "This user currently has no API tokens.", + "title": "No API Tokens" + }, + "list": { + "button_delete": "Delete Token", + "expires_on_brief": "Expires on {{date}}", + "label_created": "Created At", + "label_expires_at": "Expires At", + "label_last_used": "Last Used", + "label_token": "Token", + "never": "Never", + "never_expires": "Never expires", + "status_active": "Active", + "status_expired": "Expired", + "unnamed_token": "Unnamed Token" + } + } + }, + "validation": { + "emailRequired": "Email is required", + "folderLimitMustBeAtLeast100": "Folder limit must be at least 100", + "folderLimitMustBeNumber": "Folder limit must be a number", + "imapHostCannotBeEmpty": "IMAP host cannot be empty", + "imapHostRequired": "IMAP host is required", + "imapPortMustBeLessThan65536": "IMAP port must be less than 65536", + "imapPortMustBePositive": "IMAP port must be a positive integer", + "incrementalSyncMustBeAtLeast10": "Incremental sync interval must be at least 10 minutes", + "incrementalSyncMustBeNumber": "Incremental sync interval must be a number", + "invalidEmail": "Invalid email address", + "invalidUrl": "Invalid URL", + "passwordMinLength": "Password must be at least {{min}} characters long", + "passwordRequired": "Password is required when auth method is Password", + "pleaseEnterPassword": "Please enter your password", + "pleaseEnterUsernameOrEmail": "Please enter your username or email", + "required": "This field is required", + "singleRequestBatchSizeMustBeNumber": "Batch size must be a number", + "singleRequestBatchSizeTooLarge": "Batch size must be at most 200", + "singleRequestBatchSizeTooSmall": "Batch size must be at least 10" } } \ No newline at end of file diff --git a/web/src/locales/es.json b/web/src/locales/es.json index 195695b..579e7e6 100644 --- a/web/src/locales/es.json +++ b/web/src/locales/es.json @@ -1,1614 +1,1630 @@ { - "common": { - "submit": "Enviar", + "accessTokens": { + "aListOfIpAddressesAllowed": "Una lista de direcciones IP permitidas para acceder al recurso. Introduce una IP por línea. (Opcional)", + "accountId": "ID de cuenta", + "accounts": "Cuentas", + "aclRulesForAccessTokens": "Las reglas ACL para los tokens de acceso incluyen la comprobación de la lista blanca de IP y la aplicación del límite de velocidad.", + "actions": { + "delete": "Eliminar", + "edit": "Editar", + "openMenu": "Abrir menú" + }, + "addNew": "Añadir nuevo", + "atLeastOneAccountIsRequired": "Se requiere al menos una cuenta.", + "create": "Crear", + "createNewAccessTokenHere": "Crea un nuevo token de acceso aquí.", + "created": "Creado", + "createdAt": "Creado el", + "creating": "Creando...", + "creationFailed": "Error al crear", + "delete": "Eliminar", + "describeThePurposeOfTheAccessToken": "Describe el propósito del token de acceso", + "description": "Gestiona aquí los tokens de acceso, sus reglas ACL, listas blancas de IP y ajustes de límite de velocidad.", + "descriptionMustNotExceed255Characters": "La descripción no debe exceder los 255 caracteres.", + "edit": "Editar", + "editToken": "Editar token", + "enterIntervalInSeconds": "Introduce el intervalo en segundos, ej. 60", + "enterOneIpAddressPerLine": "Introduce una dirección IP por línea, ej.:\n192.168.1.1\n192.168.1.2", + "enterQuota": "Introduce la cuota, ej. 100", + "expiresAt": "Caduca el", + "filterByEmailAddressOrAccountId": "Filtrar por dirección de correo electrónico o ID de cuenta...", + "interval": "Intervalo", + "intervalMustBeAPositiveInteger": "El intervalo debe ser un número entero positivo.", + "invalidIpAddressesFound": "Se encontraron direcciones IP inválidas. Por favor, introduce direcciones IPv4 o IPv6 válidas.", + "name": "Nombre", + "noTokens": "Sin tokens de acceso", + "noTokensDesc": "Aún no has creado tokens de acceso. Crea uno para usar las funcionalidades de la API.", + "notUsedYet": "Aún no usado", + "quota": "Cuota", + "quotaMustBeAPositiveInteger": "La cuota debe ser un número entero positivo.", + "save": "Guardar", + "saveChanges": "Guardar cambios", + "saving": "Guardando...", + "selectAccounts": "Seleccionar cuentas", + "selectMultipleAccountsForTheAccessToken": "Selecciona varias cuentas para el ámbito del token de acceso.", + "theListOfAccountsThatCanBeQueried": "La lista de cuentas que se pueden consultar con el token de acceso.", + "theMaximumNumberOfRequestsAllowed": "El número máximo de solicitudes permitidas dentro del intervalo. (Opcional)", + "theTimeWindowForTheRateLimit": "La ventana de tiempo (en segundos) para el límite de velocidad. (Opcional)", + "title": "Tokens de acceso", + "token": "Token", + "updateFailed": "Error al actualizar", + "updateOrCreationFailed": "Error al {{action}}, por favor, inténtalo de nuevo más tarde", + "updateTheAccessTokenHere": "Actualiza el token de acceso aquí.", + "updated": "Actualizado", + "updating": "Actualizando...", + "yourAccessTokenHasBeenSuccessfully": "Tu token de acceso ha sido {{action}} con éxito." + }, + "accounts": { + "accessControl": "Control de acceso", + "accessTokenCopiedToClipboard": "Token de acceso copiado al portapapeles", + "access_control": { + "buttons": { "cancel": "Cancelar", - "save": "Guardar", - "save_changes": "Guardar cambios", - "delete": "Eliminar", - "edit": "Editar", - "search": "Buscar", - "add": "Añadir", - "remove": "Eliminar", - "create": "Crear", - "update": "Actualizar", - "confirm": "Confirmar", + "save": "Guardar Asignación" + }, + "description": "Asignar roles y usuarios autorizados a {{email}}", + "role_label": "Rol de Acceso", + "role_loading": "Cargando roles...", + "role_placeholder": "Seleccionar un rol", + "title": "Asignación de Acceso a la Cuenta", + "toast": { + "failed_title": "Error en la Asignación", + "success_desc": "Los permisos se han asignado correctamente a {{email}}", + "success_title": "Asignación Exitosa" + }, + "user_empty": "No se encontraron usuarios", + "user_label": "Seleccionar Usuarios Autorizados", + "user_search_placeholder": "Buscar por nombre de usuario o correo...", + "user_selected_count": "Seleccionados: {{count}} usuario(s)", + "validation": { + "role_required": "Por favor, seleccione un rol para asignar", + "user_required": "Por favor, seleccione al menos un usuario" + } + }, + "accountCreated": "Cuenta creada", + "accountCreatedDesc": "Tu cuenta ha sido creada con éxito.", + "accountCreationFailed": "Error al crear la cuenta", + "accountDetails": "Detalles de la cuenta", + "accountHasBeenSuccessfully": "La cuenta se ha {{action}} correctamente", + "accountSyncFoldersUpdateFailed": "Error al actualizar las carpetas de sincronización de cuenta", + "accountSyncFoldersUpdated": "Carpetas de sincronización de cuenta actualizadas", + "accountUpdateFailed": "Error al actualizar la cuenta", + "accountUpdated": "Cuenta actualizada", + "accountUpdatedDesc": "Tu cuenta ha sido actualizada con éxito.", + "actions": "Acciones", + "addAccount": "Añadir cuenta", + "addConfiguration": "Añadir configuración", + "addImap": "Añadir IMAP", + "addNewEmailAccountHere": "Añade una nueva cuenta de correo electrónico aquí. ", + "addNoSync": "Añadir NoSync", + "allMailFolderSelected": "Advertencia: Carpeta 'Todo el correo' seleccionada", + "allMailFolderSelectedDesc": "Seleccionar carpetas con el atributo 'Todo el correo' probablemente resultará en la duplicación de mensajes ya sincronizados de carpetas como Bandeja de entrada y Enviados. Esto podría consumir significativamente más espacio de almacenamiento.", + "allMailSkipped": "Carpetas predeterminadas seleccionadas. 'Todo el correo' omitido para evitar duplicados.", + "areYouSureYouWantTo": "¿Está seguro de que desea {{action}} esta cuenta?", + "auth": "Autenticación", + "authType": "tipo de autenticación", + "autoConfiguring": "Autoconfigurando...", + "beforeRelative": "Descargar solo correos antiguos", + "beforeRelativeValue": "Descargar correos de hace {{value}} {{unit}}", + "capabilities": "Capacidades", + "chooseAuthMethod": "Elige el método de autenticación a utilizar para IMAP.", + "chooseEncryptionMethod": "Elige el método de cifrado a utilizar para IMAP.", + "chooseMailboxesToDownload": "Elige los buzones a descargar para {{email}}. Los nuevos buzones se descargarán en el próximo ciclo.", + "clickHere": "haz clic aquí", + "clickSaveWhenDone": "Haz clic en Guardar cuando hayas terminado.", + "continue": "Continuar", + "createdAt": "Creado el", + "creationFailed": "Error al crear, por favor, inténtalo de nuevo más tarde", + "dateSelection": "Selección de fecha", + "dateSince": "Fecha desde", + "days": "Días", + "delete": "Eliminar", + "description": "Gestiona y configura tus cuentas de correo electrónico.", + "detail": "Detalle", + "detailsOfTheOAuth2TokensForTheAccount": "Detalles de los tokens OAuth2 para la cuenta.", + "determinesWhetherThisAccountIsActiveNoSync": "Determina si esta cuenta está activa. Si está desactivada, no podrá importar datos.", + "disable": "Desactivar", + "disableAccount": "Desactivar cuenta", + "disabled": "Deshabilitado", + "downloadAll": "Descargar todos los correos", + "downloadBatchSize": "Tamaño del lote de descarga", + "downloadBatchSizeDescription": "Número de mensajes obtenidos por solicitud IMAP", + "downloadInterval": "Intervalo de descarga (minutos)", + "downloadIntervalPlaceholder": "Ingresa los minutos", + "downloadScope": "Estrategia de descarga", + "downloadScopeDescription": "Elija qué correos electrónicos deben indexarse y descargarse.", + "duration": "Duración", + "edit": "Editar", + "email": "Correo electrónico", + "emailAccountRegistration": "Registro de cuenta de correo", + "emailAccountRegistrationDesc": "Introduzca su dirección de correo electrónico. En los siguientes pasos configurará los detalles de IMAP. Usaremos esta dirección para detectar automáticamente la configuración del servidor IMAP.", + "emailAddress": "Dirección de correo electrónico", + "emailCannotBeModified": "La dirección de correo electrónico de la cuenta no se puede modificar durante la edición.", + "emailPlaceholder": "ej. juan.perez@ejemplo.com", + "enable": "Activar", + "enableAccount": "Activar cuenta", + "enabled": "Habilitado", + "enabledDescription": "Determina si esta cuenta está activa. Si se desactiva, las descargas relacionadas no se ejecutarán.", + "encryption": "cifrado", + "enterPassword": "Introduce tu contraseña", + "enterValue": "Introduce valor", + "everyMinutes": "cada {{minutes}} minutos", + "field": "Campo", + "fixed": "Fija", + "folderLimit": "Límite de carpetas", + "folderLimitDescription": "Limita el número de correos a sincronizar por carpeta (mínimo 100). Deja vacío para no tener límite.", + "folderLimitPlaceholder": "ej. 1000", + "folderSync": { + "autoSelectDescendants": "Seleccionar automáticamente los descendientes", + "autoSelectParents": "Seleccionar automáticamente los padres", + "batches": "lotes", + "collapseAll": "Contraer todo", + "expandAll": "Expandir todo", + "loadingMailboxFolders": "Cargando carpetas del buzón…", + "noData": "Sin datos", + "noFolders": "No hay carpetas para sincronizar" + }, + "foldersConfiguredForSync": "{{count}} carpeta(s) configurada(s) para sincronización", + "foldersSelected": "{{count}} carpeta(s) seleccionada(s)", + "goBack": "Volver atrás", + "host": "host", + "id": "ID", + "imap": "IMAP", + "imapAuthMethod": "Método de autenticación IMAP", + "imapEncryption": "Cifrado IMAP", + "imapHost": "Host IMAP", + "imapHostPlaceholder": "ej. imap.ejemplo.com", + "imapPassword": "Contraseña IMAP", + "imapPort": "Puerto IMAP", + "imapPortPlaceholder": "ej. 993", + "imapProxy": "Usar proxy SOCKS5 para conexiones IMAP.", + "incSync": "Sinc. Increm.", + "lastSync": "Última sincronización", + "leaveEmptyToKeepExisting": "Deja vacío para mantener la contraseña existente, o introduce un nuevo valor para actualizarla.", + "leaveEmptyToKeepPassword": "Deja vacío para mantener la contraseña actual", + "login_name": "Nombre de usuario", + "minutes": "minutos", + "months": "Meses", + "moreAccountTypes": "Más tipos de cuenta", + "mustBeAtLeast1": "Debe ser al menos 1", + "name": "Nombre", + "nameDescription": "Usuario IMAP. Por defecto su email; cámbielo si es necesario.", + "namePlaceholder": "ej. Juan Pérez", + "noAccountConfigurations": "Sin configuraciones de cuenta", + "noAccountConfigurationsDesc": "Aún no has añadido ninguna configuración de cuenta. Añade una para empezar a usar las funcionalidades de la cuenta.", + "noOAuth2Tokens": "Sin tokens OAuth2", + "none": "Ninguno", + "notAvailable": "no disponible", + "oauth2Tokens": "Tokens OAuth2", + "openMenu": "Abrir menú", + "optional": "Opcional", + "owner": "Creador", + "password": "contraseña", + "port": "puerto", + "recent": "reciente", + "refreshToken": "Token de actualización", + "refreshTokenCopiedToClipboard": "Token de actualización copiado al portapapeles", + "relative": "Relativa", + "runningState": { + "account": { + "id": "ID de cuenta" + }, + "common": { "close": "Cerrar", - "yes": "Sí", - "no": "No", - "ok": "Aceptar", - "loading": "Cargando...", - "empty": "Vacío", - "noData": "Sin datos", - "table": { - "noResults": "Sin resultados." - }, - "failed": "Fallido", - "notFound": "No encontrado", - "back": "Volver", - "goBack": "Regresar", - "backToHome": "Volver al inicio", - "tryAgain": "Reintentar", - "more": "Más", - "actions": "Acciones", - "filter": "Filtrar", - "reset": "Restablecer", - "clear": "Limpiar", - "error": "Error", - "apply": "Aplicar", - "select": "Seleccionar", - "selectAll": "Seleccionar todo", - "deselectAll": "Deseleccionar todo", - "all": "Todo", - "none": "Ninguno", - "showLess": "Mostrar menos", - "showMore": "Mostrar más...", - "project_description": "Bichon es un proyecto de código abierto.", - "view_on_github_button": "Ver en GitHub", - "op_failed": "Operación fallida", - "na": "N/A", - "retry": "Reintentar", - "deleting": "Eliminando..." - }, - "navigation": { - "home": "Inicio", - "settings": "Configuración", - "accounts": "Cuentas", - "dashboard": "Panel de control", - "mailbox": "Buzón", - "oauth2": "OAuth2", - "accessTokens": "Tokens de acceso", - "apiDocs": "Documentación API", - "general": "General", - "auth": "Autenticación", - "other": "Otro", - "users": "Usuarios del sistema" - }, - "auth": { - "welcome": "Bienvenido a Bichon", - "username": "Nombre de usuario", - "password": "Contraseña", - "login": "Iniciar sesión", - "loginFailed": "Error al iniciar sesión", - "invalidPassword": "Contraseña inválida. Inténtalo de nuevo.", - "somethingWentWrong": "Algo salió mal", - "sessionExpired": "¡Sesión caducada!", - "sessionExpiredDesc": "Tu sesión ha caducado debido a la inactividad. Inicia sesión para continuar.", - "logout": "Cerrar sesión", - "areYouSureYouWantToLogOut": "¿Estás seguro de que quieres cerrar sesión?", - "youWillNeedToLogInAgain": "Necesitarás iniciar sesión de nuevo para acceder a tu cuenta." - }, - "errors": { - "pageNotFound": "¡Ups! ¡Página no encontrada!", - "pageNotFoundDesc": "Parece que la página que estás buscando no existe o ha sido eliminada.", - "somethingWentWrong": "¡Ups! Algo salió mal :')", - "somethingWentWrongDesc": "Lamentamos las molestias. Por favor, inténtalo de nuevo más tarde.", - "internalServerError": "¡Error interno del servidor!", - "contentNotModified": "¡Contenido no modificado!", - "networkError": "Error de red", - "networkErrorDesc": "No se puede conectar con el servidor. Por favor, comprueba tu conexión a internet y vuelve a intentarlo.", - "forbidden": "Prohibido", - "forbiddenTitle": "Acceso prohibido", - "forbiddenDesc": "No tienes permiso para ver este recurso.", - "unauthorized": "No autorizado", - "unauthorizedTitle": "Acceso no autorizado", - "unauthorizedDesc": "Inicia sesión con credenciales válidas para acceder a este recurso.", - "maintenance": "Mantenimiento", - "maintenanceTitle": "¡El sitio está en mantenimiento!", - "maintenanceDesc": "El sitio está temporalmente fuera de servicio. Volveremos a estar en línea pronto.", - "learnMore": "Saber más" - }, - "dashboard": { - "title": "Panel de control", - "mailAccounts": "Cuentas de correo", - "connected": "Conectado", - "totalEmails": "Total de correos", - "syncedLocally": "Sincronizado localmente", - "totalEmailSize": "Tamaño total de correos", - "logicalVolume": "Tamaño original", - "localDataFiles": "Archivos de datos locales", - "actualDiskUsage": "Uso real de disco", - "efficiency": "Eficiencia", - "saved": "Ahorrado", - "dataStorage": "Almacenamiento", - "indexSize": "Tamaño índice", - "metadataSize": "Tamaño de metadatos", - "tantivyDatabase": "Basado en el motor de búsqueda Tantivy", - "dayTrend": "Tendencia de 30 días", - "attachments": "Archivos adjuntos", - "topLists": "Listas principales", - "newEmails": "Nuevos correos", - "messageDistribution": "Distribución de mensajes", - "attachmentRatio": "Ratio de adjuntos", - "attachmentRatioDesc": "El {{percent}}% de los correos tienen adjuntos", - "noEmailsSynced": "Aún no hay correos sincronizados", - "withAttachments": "Con adjuntos", - "noAttachments": "Sin adjuntos", - "top10Senders": "Los 10 principales remitentes", - "byMessageCount": "Por conteo de mensajes", - "sender": "Remitente", - "count": "Conteo", - "top10LargestEmails": "Los 10 correos más grandes", - "byMessageSize": "Por tamaño de mensaje", - "subject": "Asunto", - "size": "Tamaño", - "noSubject": "(Sin asunto)", - "top10Accounts": "Las 10 principales cuentas", - "emails": "Correos", - "account": "Cuenta", - "noRecentActivity": "Sin actividad reciente", - "noSendersData": "Sin datos de remitentes", - "noLargeEmails": "Sin correos grandes", - "noAccountData": "Sin datos de cuenta", - "systemVersion": "Versión del sistema" - }, - "accounts": { - "beforeRelativeValue": "Descargar correos de hace {{value}} {{unit}}", - "sinceRelativeValue": "Descargar correos de los últimos", - "downloadBatchSize": "Tamaño del lote de descarga", - "downloadBatchSizeDescription": "Número de mensajes obtenidos por solicitud IMAP", - "downloadScopeDescription": "Elija qué correos electrónicos deben indexarse y descargarse.", - "downloadScope": "Estrategia de descarga", - "selectMode": "Seleccionar modo de filtro", - "downloadAll": "Descargar todos los correos", - "sinceFixed": "Desde una fecha específica", - "sinceRelative": "Descargar solo correos recientes", - "beforeRelative": "Descargar solo correos antiguos", - "duration": "Duración", - "unit": "Unidad", - "accessControl": "Control de acceso", - "owner": "Creador", - "access_control": { - "title": "Asignación de Acceso a la Cuenta", - "description": "Asignar roles y usuarios autorizados a {{email}}", - "role_label": "Rol de Acceso", - "role_placeholder": "Seleccionar un rol", - "role_loading": "Cargando roles...", - "user_label": "Seleccionar Usuarios Autorizados", - "user_search_placeholder": "Buscar por nombre de usuario o correo...", - "user_empty": "No se encontraron usuarios", - "user_selected_count": "Seleccionados: {{count}} usuario(s)", - "buttons": { - "cancel": "Cancelar", - "save": "Guardar Asignación" - }, - "validation": { - "user_required": "Por favor, seleccione al menos un usuario", - "role_required": "Por favor, seleccione un rol para asignar" - }, - "toast": { - "success_title": "Asignación Exitosa", - "success_desc": "Los permisos se han asignado correctamente a {{email}}", - "failed_title": "Error en la Asignación" - } - }, - "title": "Cuentas de correo", - "description": "Gestiona y configura tus cuentas de correo electrónico.", - "addImap": "Añadir IMAP", - "addNoSync": "Añadir NoSync", - "moreAccountTypes": "Más tipos de cuenta", - "noAccountConfigurations": "Sin configuraciones de cuenta", - "noAccountConfigurationsDesc": "Aún no has añadido ninguna configuración de cuenta. Añade una para empezar a usar las funcionalidades de la cuenta.", - "addConfiguration": "Añadir configuración", - "useNoProxy": "Sin proxy", - "login_name": "Nombre de usuario", - "name": "Nombre", - "email": "Correo electrónico", + "folders": "buzones" + }, + "empty": { + "no_active_download": "No hay descargas en curso", + "no_errors_current": "Sin errores en la sesión actual", + "no_errors_session": "Sin errores en esta sesión", + "no_global_errors": "Sin errores globales", + "no_history": "Sin historial" + }, + "folders": "buzones", + "latest": "RECIENTE", + "loading": { + "fetching_account_state": "Obteniendo estado de la cuenta..." + }, + "message": "Mensaje", + "session": { + "started_at": "Hora de inicio", "status": "Estado", - "type": "Tipo", - "lastSync": "Última sincronización", - "actions": "Acciones", - "edit": "Editar", - "delete": "Eliminar", - "detail": "Detalle", - "selectMailboxes": "Elegir buzones", - "oauth2Tokens": "Tokens OAuth2", - "id": "ID", - "enabled": "Habilitado", - "auth": "Autenticación", - "incSync": "Sinc. Increm.", - "state": "Estado", - "createdAt": "Creado el", - "updatedAt": "Actualizado el", - "openMenu": "Abrir menú", - "emailAccountRegistration": "Registro de cuenta de correo", - "emailAccountRegistrationDesc": "Introduzca su dirección de correo electrónico. En los siguientes pasos configurará los detalles de IMAP. Usaremos esta dirección para detectar automáticamente la configuración del servidor IMAP.", - "emailAddress": "Dirección de correo electrónico", - "emailPlaceholder": "ej. juan.perez@ejemplo.com", - "namePlaceholder": "ej. Juan Pérez", - "optional": "Opcional", - "nameDescription": "Usuario IMAP. Por defecto su email; cámbielo si es necesario.", - "emailCannotBeModified": "La dirección de correo electrónico de la cuenta no se puede modificar durante la edición.", - "addAccount": "Añadir cuenta", - "updateAccount": "Actualizar cuenta", - "accountUpdated": "Cuenta actualizada", - "accountCreated": "Cuenta creada", - "accountUpdatedDesc": "Tu cuenta ha sido actualizada con éxito.", - "accountCreatedDesc": "Tu cuenta ha sido creada con éxito.", - "accountUpdateFailed": "Error al actualizar la cuenta", - "accountCreationFailed": "Error al crear la cuenta", - "updateFailed": "Error al actualizar, por favor, inténtalo de nuevo más tarde", - "creationFailed": "Error al crear, por favor, inténtalo de nuevo más tarde", - "allMailFolderSelected": "Advertencia: Carpeta 'Todo el correo' seleccionada", - "accountSyncFoldersUpdated": "Carpetas de sincronización de cuenta actualizadas", - "accountSyncFoldersUpdateFailed": "Error al actualizar las carpetas de sincronización de cuenta", - "serverConfiguration": "Configuración del servidor (IMAP)", - "selectedMailboxes": "Buzones seleccionados", - "allMailFolderSelectedDesc": "Seleccionar carpetas con el atributo 'Todo el correo' probablemente resultará en la duplicación de mensajes ya sincronizados de carpetas como Bandeja de entrada y Enviados. Esto podría consumir significativamente más espacio de almacenamiento.", - "allMailSkipped": "Carpetas predeterminadas seleccionadas. 'Todo el correo' omitido para evitar duplicados.", - "selectAtLeastOneFolder": "Selecciona al menos una carpeta", - "chooseMailboxesToDownload": "Elige los buzones a descargar para {{email}}. Los nuevos buzones se descargarán en el próximo ciclo.", - "accountDetails": "Detalles de la cuenta", - "capabilities": "Capacidades", - "folderLimit": "Límite de carpetas", - "everyMinutes": "cada {{minutes}} minutos", - "foldersConfiguredForSync": "{{count}} carpeta(s) configurada(s) para sincronización", - "foldersSelected": "{{count}} carpeta(s) seleccionada(s)", - "imapHost": "Host IMAP", - "imapHostPlaceholder": "ej. imap.ejemplo.com", - "imapPort": "Puerto IMAP", - "imapPortPlaceholder": "ej. 993", - "imapEncryption": "Cifrado IMAP", - "selectEncryptionMethod": "Selecciona el método de cifrado", - "chooseEncryptionMethod": "Elige el método de cifrado a utilizar para IMAP.", - "imapAuthMethod": "Método de autenticación IMAP", - "selectAuthMethod": "Selecciona el método de autenticación", - "chooseAuthMethod": "Elige el método de autenticación a utilizar para IMAP.", - "imapPassword": "Contraseña IMAP", - "leaveEmptyToKeepPassword": "Deja vacío para mantener la contraseña actual", - "enterPassword": "Introduce tu contraseña", - "leaveEmptyToKeepExisting": "Deja vacío para mantener la contraseña existente, o introduce un nuevo valor para actualizarla.", - "useProxy": "Usar Proxy", - "selectProxy": "Seleccionar Proxy", - "downloadInterval": "Intervalo de descarga (minutos)", - "downloadIntervalPlaceholder": "Ingresa los minutos", - "enabledDescription": "Determina si esta cuenta está activa. Si se desactiva, las descargas relacionadas no se ejecutarán.", - "dateSince": "Fecha desde", - "none": "Ninguno", - "fixed": "Fija", - "relative": "Relativa", - "selectDate": "Seleccionar fecha", - "selectUnit": "Seleccionar unidad", - "days": "Días", - "months": "Meses", - "years": "Años", - "enterValue": "Introduce valor", - "mustBeAtLeast1": "Debe ser al menos 1", - "dateSelection": "Selección de fecha", - "since": "desde", - "recent": "reciente", - "notAvailable": "no disponible", - "host": "host", - "port": "puerto", - "encryption": "cifrado", - "authType": "tipo de autenticación", - "password": "contraseña", - "useProxyField": "usar proxy", - "clickSaveWhenDone": "Haz clic en Guardar cuando hayas terminado.", - "step": "Paso {{index}}", - "goBack": "Volver atrás", - "autoConfiguring": "Autoconfigurando...", - "continue": "Continuar", - "saveChanges": "Guardar cambios", - "submit": "Enviar", - "field": "Campo", - "value": "Valor", - "refreshToken": "Token de actualización", - "accessTokenCopiedToClipboard": "Token de acceso copiado al portapapeles", - "refreshTokenCopiedToClipboard": "Token de actualización copiado al portapapeles", - "noOAuth2Tokens": "Sin tokens OAuth2", - "theAccountHasNotCompletedTheAuthorizationProcess": "La cuenta no ha completado el proceso de autorización. Por favor, ", - "clickHere": "haz clic aquí", - "toAuthorizeTheAccount": " para autorizar la cuenta.", - "detailsOfTheOAuth2TokensForTheAccount": "Detalles de los tokens OAuth2 para la cuenta.", - "updateTheEmailAccountHere": "Actualiza la cuenta de correo electrónico aquí. ", - "addNewEmailAccountHere": "Añade una nueva cuenta de correo electrónico aquí. ", - "thisAccountIsUsedForIdentificationPurposesOnly": "Esta cuenta se utiliza solo para fines de identificación y no requiere sincronización con el servidor de correo. Ayuda a importar datos de correo electrónico.", - "determinesWhetherThisAccountIsActiveNoSync": "Determina si esta cuenta está activa. Si está desactivada, no podrá importar datos.", - "folderSync": { - "noData": "Sin datos", - "noFolders": "No hay carpetas para sincronizar", - "batches": "lotes", - "autoSelectDescendants": "Seleccionar automáticamente los descendientes", - "autoSelectParents": "Seleccionar automáticamente los padres", - "expandAll": "Expandir todo", - "collapseAll": "Contraer todo", - "loadingMailboxFolders": "Cargando carpetas del buzón…" - }, - "viewDetails": "ver detalles", - "runningState": { - "message": "Mensaje", - "account": { - "id": "ID de cuenta" - }, - "tabs": { - "active_session": "Sesión activa", - "history": "Historial", - "global_errors": "Errores globales", - "folders": "Buzones", - "errors": "Errores" - }, - "loading": { - "fetching_account_state": "Obteniendo estado de la cuenta..." - }, - "empty": { - "no_active_download": "No hay descargas en curso", - "no_errors_current": "Sin errores en la sesión actual", - "no_errors_session": "Sin errores en esta sesión", - "no_global_errors": "Sin errores globales", - "no_history": "Sin historial" - }, - "session": { - "status": "Estado", - "trigger": "Disparador", - "started_at": "Hora de inicio" - }, - "common": { - "folders": "buzones", - "close": "Cerrar" - }, - "latest": "RECIENTE", - "folders": "buzones" - }, - "steps": { - "complete": "Completado", - "emailAddress": "Dirección de correo electrónico", - "imap": "IMAP", - "syncPreferences": "Preferencias de sincronización", - "summary": "Resumen" - }, - "imapProxy": "Usar proxy SOCKS5 para conexiones IMAP.", - "syncStartDateDescription": "Establece la fecha de inicio de la sincronización, fija o relativa a la hora actual. Se excluirán los correos anteriores a esta fecha, {{fixedPart}}.", - "syncAfterDate": "sincronizar datos después de la fecha establecida", - "syncRecentData": "mover la fecha de sincronización hacia adelante en el tiempo, sincronizando solo datos recientes", - "folderLimitDescription": "Limita el número de correos a sincronizar por carpeta (mínimo 100). Deja vacío para no tener límite.", - "folderLimitPlaceholder": "ej. 1000", - "imap": "IMAP", - "minutes": "minutos", - "accountHasBeenSuccessfully": "La cuenta se ha {{action}} correctamente", - "enableAccount": "Activar cuenta", - "disableAccount": "Desactivar cuenta", - "areYouSureYouWantTo": "¿Está seguro de que desea {{action}} esta cuenta?", - "enable": "Activar", - "disable": "Desactivar", - "thisWillPreventTheAccountFromBeingUsed": "Esta cuenta ya no sincronizará datos desde el servidor IMAP, pero los datos existentes seguirán siendo accesibles.", - "disabled": "Deshabilitado", - "useDangerous": "Confiar en cualquier certificado TLS", - "useDangerousDescription": "Activa esta opción solo si te estás conectando a un servidor IMAP que utiliza un certificado público o auto‑firmado, el cual puede no ser reconocido por tu sistema. Esta opción omite la validación estándar del certificado y puede exponerte a ataques de tipo “man‑in‑the‑middle” — actívala solo si entiendes los riesgos." + "trigger": "Disparador" + }, + "tabs": { + "active_session": "Sesión activa", + "errors": "Errores", + "folders": "Buzones", + "global_errors": "Errores globales", + "history": "Historial" + } }, - "mailbox": { - "deleteMailboxDialog": { - "title": "Eliminar carpeta de correo", - "desc": "¿Está seguro de que desea eliminar esta carpeta de correo? Esta acción no se puede deshacer.", - "warningTitle": "Advertencia", - "warningDesc": "Eliminar esta carpeta también eliminará permanentemente todos los correos electrónicos archivados y las subcarpetas que contenga.", - "confirm": "Eliminar permanentemente", - "successTitle": "Eliminado con éxito", - "successDesc": "La carpeta de correo y su contenido han sido eliminados correctamente.", - "errorTitle": "Error al eliminar" - }, - "title": "Buzón", - "folders": "Carpetas", - "messages": "Mensajes", - "noMessages": "No hay mensajes", - "selectFolder": "Selecciona una carpeta para ver los mensajes", - "deleteDialog": { - "title": "Eliminar correo electrónico", - "desc": "¿Estás seguro de que quieres eliminar {{countText}}? Esta acción eliminará permanentemente el/los correo(s) seleccionado(s) de la base de datos local. El/los correo(s) se perderán para siempre y no se podrán recuperar.", - "descCountSingle": "este correo electrónico", - "descCountMultiple": "estos {{count}} correos electrónicos", - "warningTitle": "¡Advertencia!", - "warningDesc": "Procede con precaución.", - "confirm": "Eliminar", - "successTitle": "Mensajes eliminados con éxito", - "successDesc": "Los mensajes han sido eliminados.", - "errorTitle": "Error al eliminar mensajes" - }, - "thread": { - "title": "Hilo de conversación ({{count}} {{messageLabel}})", - "message": "mensaje", - "messages": "mensajes", - "noSubject": "(Sin asunto)", - "invalidDate": "Fecha inválida", - "empty": "No hay mensajes en este hilo.", - "loadError": "Error al cargar el hilo", - "loadingMore": "Cargando...", - "loadMore": "Cargar más" - }, - "bulkActions": { - "ariaLabel": "Acciones masivas para {{count}} {{emailLabel}} seleccionado(s)", - "email": "correo electrónico", - "emails": "correos electrónicos", - "selected": "seleccionado", - "clearSelection": "Borrar selección", - "clearSelectionWithKey": "Borrar selección ({{key}})", - "delete": "Eliminar", - "deleteTooltip": "Eliminar correos seleccionados" - } + "saveChanges": "Guardar cambios", + "selectAtLeastOneFolder": "Selecciona al menos una carpeta", + "selectAuthMethod": "Selecciona el método de autenticación", + "selectDate": "Seleccionar fecha", + "selectEncryptionMethod": "Selecciona el método de cifrado", + "selectMailboxes": "Elegir buzones", + "selectMode": "Seleccionar modo de filtro", + "selectProxy": "Seleccionar Proxy", + "selectUnit": "Seleccionar unidad", + "selectedMailboxes": "Buzones seleccionados", + "serverConfiguration": "Configuración del servidor (IMAP)", + "since": "desde", + "sinceFixed": "Desde una fecha específica", + "sinceRelative": "Descargar solo correos recientes", + "sinceRelativeValue": "Descargar correos de los últimos", + "state": "Estado", + "status": "Estado", + "step": "Paso {{index}}", + "steps": { + "complete": "Completado", + "emailAddress": "Dirección de correo electrónico", + "imap": "IMAP", + "summary": "Resumen", + "syncPreferences": "Preferencias de sincronización" }, - "search": { - "size": "Tamaño", - "any": "Cualquiera", - "tiny": "Muy pequeño (<15 KB)", - "small": "Pequeño (<2 MB)", - "medium": "Mediano (2 - 10 MB)", - "large": "Grande (10 - 20 MB)", - "huge": "Muy grande (≥20 MB)", - "sort": "Ordenar", - "sizeDescription": "El tamaño se refiere al tamaño total del correo electrónico, incluidos los archivos adjuntos.", - "title": "Buscar", - "searching": "Buscando, por favor espera...", - "noEmailsFound": "No se encontraron correos electrónicos", - "startSearching": "Empieza a buscar por palabra clave, remitente o usa filtros avanzados.", - "adjustSearch": "Intenta ajustar tus criterios de búsqueda o borra los filtros.", - "tagFilter": "Filtro de etiquetas", - "from": "De", - "to": "Para", - "subject": "Asunto", - "date": "Fecha", - "editTag": "Editar etiqueta", - "keyword": "Palabra clave", - "sender": "Remitente", - "recipient": "Destinatario", - "hasAttachment": "Tiene adjunto", - "yes": "Sí", - "no": "No", - "dateRange": "Rango de fechas", - "startDate": "Fecha de inicio", - "endDate": "Fecha de finalización", - "advancedFilters": "Filtros avanzados", - "searchArchivedEmails": "Buscar en correos archivados", - "fullTextMultiAccount": "Texto completo · Multi-cuenta · Filtros avanzados", - "account": "Cuenta", - "mailbox": "Buzón", - "selectAccount": "Seleccionar cuenta", - "selectMailbox": "Seleccionar buzón", - "noActiveEmailAccount": "No hay cuenta de correo electrónico activa.", - "addEmailAccount": "Añadir cuenta de correo electrónico", - "noMailboxSelectAccount": "No hay buzón. Por favor, selecciona una cuenta primero.", - "searchInSubjectBody": "Buscar en asunto, cuerpo, adjuntos...", - "searchingButton": "Buscando...", - "searchButton": "Buscar", - "advanced": "Avanzado", - "clear": "Borrar", - "since": "Desde:", - "before": "Antes de:", - "selectDate": "Seleccionar fecha", - "pleaseSelectAtLeastOne": "Por favor, selecciona al menos un criterio de búsqueda", - "cc": "CC", - "bcc": "CCO", - "attachmentName": "Nombre del adjunto", - "messageId": "ID del mensaje", - "minSize": "Tamaño mín.", - "maxSize": "Tamaño máx.", - "senderRecipients": "Remitente / Destinatarios", - "attachmentsSize": "Adjuntos y tamaño", - "minimumBytes": "Mínimo (bytes)", - "maximumBytes": "Máximo (bytes)", - "originalMessageIdHeader": "Encabezado Message-ID del correo original", - "addTags": { - "title": "Editar etiquetas", - "none": "Aún no hay etiquetas añadidas", - "searchPlaceholder": "Buscar o crear etiquetas...", - "createHint": "Crear nueva etiqueta: {{tag}}", - "invalidTitle": "Etiqueta inválida", - "updatedTitle": "Etiquetas actualizadas", - "updatedDesc": "Las etiquetas han sido actualizadas con éxito", - "updateFailedTitle": "Error al actualizar", - "tryAgain": "Inténtalo de nuevo más tarde", - "selectedCount": "{{count}} etiqueta(s) seleccionada(s)", - "cancel": "Cancelar", - "save": "Guardar", - "saving": "Guardando..." - }, - "updateTags": { - "overwriteWarning": "Advertencia: esto sobrescribirá todas las etiquetas existentes en los elementos seleccionados.", - "title": "Actualizar etiquetas", - "none": "No hay etiquetas seleccionadas", - "searchPlaceholder": "Buscar o crear nueva etiqueta...", - "createHint": "Presione Enter para crear una nueva etiqueta: \"{{tag}}\"", - "selectedCount": "{{count}} etiqueta(s) a aplicar", - "cancel": "Cancelar", - "invalidTitle": "Etiqueta inválida", - "updatedTitle": "Etiquetas actualizadas", - "updatedDesc": "Las etiquetas se han actualizado con éxito.", - "updateFailedTitle": "Error al actualizar", - "tryAgain": "Por favor, inténtelo de nuevo más tarde.", - "actionAdd": "Añadir", - "actionRemove": "Eliminar", - "actionOverwrite": "Sobrescribir", - "submitAdd": "Añadir etiquetas", - "submitRemove": "Eliminar etiquetas", - "submitOverwrite": "Sobrescribir etiquetas", - "savingAdd": "Añadiendo...", - "savingRemove": "Eliminando...", - "savingOverwrite": "Sobrescribiendo..." - }, - "thread": { - "title": "Hilo de conversación · {{count}} mensajes", - "error": "Error al cargar el hilo", - "empty": "No hay mensajes en este hilo", - "invalidDate": "Fecha inválida", - "noSubject": "(Sin asunto)", - "loadingMore": "Cargando...", - "loadMore": "Cargar más" - }, - "bulkActions": { - "ariaLabel": "{{count}} mensajes seleccionados. Barra de herramientas", - "delete": "Eliminar", - "deleteDesc": "Eliminar seleccionados", - "selected": "{{count}} seleccionado(s)", - "clear": "Limpiar selección", - "manageTags": "Administrar etiquetas" - }, - "delete": { - "title": "Eliminar mensajes", - "confirmPrefix": "¿Eliminar", - "countLabel": "{{count}} mensaje(s)?", - "confirmDetail": "Esta acción no se puede deshacer.", - "confirmButton": "Eliminar", - "warningTitle": "Advertencia", - "warningDesc": "Los mensajes se eliminarán permanentemente.", - "successTitle": "Eliminados", - "successDesc": "Eliminado con éxito.", - "errorTitle": "Error al eliminar" - } + "submit": "Enviar", + "syncAfterDate": "sincronizar datos después de la fecha establecida", + "syncRecentData": "mover la fecha de sincronización hacia adelante en el tiempo, sincronizando solo datos recientes", + "syncStartDateDescription": "Establece la fecha de inicio de la sincronización, fija o relativa a la hora actual. Se excluirán los correos anteriores a esta fecha, {{fixedPart}}.", + "theAccountHasNotCompletedTheAuthorizationProcess": "La cuenta no ha completado el proceso de autorización. Por favor, ", + "thisAccountIsUsedForIdentificationPurposesOnly": "Esta cuenta se utiliza solo para fines de identificación y no requiere sincronización con el servidor de correo. Ayuda a importar datos de correo electrónico.", + "thisWillPreventTheAccountFromBeingUsed": "Esta cuenta ya no sincronizará datos desde el servidor IMAP, pero los datos existentes seguirán siendo accesibles.", + "title": "Cuentas de correo", + "toAuthorizeTheAccount": " para autorizar la cuenta.", + "type": "Tipo", + "unit": "Unidad", + "updateAccount": "Actualizar cuenta", + "updateFailed": "Error al actualizar, por favor, inténtalo de nuevo más tarde", + "updateTheEmailAccountHere": "Actualiza la cuenta de correo electrónico aquí. ", + "updatedAt": "Actualizado el", + "useDangerous": "Confiar en cualquier certificado TLS", + "useDangerousDescription": "Activa esta opción solo si te estás conectando a un servidor IMAP que utiliza un certificado público o auto‑firmado, el cual puede no ser reconocido por tu sistema. Esta opción omite la validación estándar del certificado y puede exponerte a ataques de tipo “man‑in‑the‑middle” — actívala solo si entiendes los riesgos.", + "useNoProxy": "Sin proxy", + "useProxy": "Usar Proxy", + "useProxyField": "usar proxy", + "value": "Valor", + "viewDetails": "ver detalles", + "years": "Años" + }, + "apiDocs": { + "choosePreferredType": "Elige el tipo de documentación API preferido", + "downloadSpecYAML": "Descargar especificación YAML", + "openAPIExplorer": "Explorador OpenAPI", + "reDoc": "ReDoc", + "scalar": "Scalar", + "swaggerUI": "Swagger UI" + }, + "apiTokens": { + "deleteDialog": { + "cancel": "Cancelar", + "confirm": "Eliminar", + "deleting": "Eliminando...", + "description": "Esta acción no se puede deshacer. Cualquier aplicación que use este token perderá el acceso inmediatamente.", + "title": "¿Eliminar token de acceso?" }, - "mail": { - "emailViewer": "Visor de correo electrónico", - "noMessageSelected": "Ningún mensaje seleccionado", - "account": "Cuenta", - "from": "De", - "to": "Para", - "subject": "Asunto", - "date": "Fecha", - "tags": "Etiquetas", - "noTagsYet": "Aún no hay etiquetas", - "id": "ID", - "cc": "CC", - "bcc": "CCO", - "attachments": "Adjuntos", - "download": "Descargar", - "delete": "Eliminar", - "viewThread": "Ver hilo", - "downloadStarted": "Descarga iniciada", - "downloadComplete": "Descarga completada", - "downloadFailed": "Error de descarga", - "failedToDownloadFile": "Error al descargar el archivo", - "failedToLoadEmail": "Error al cargar el correo electrónico.", - "isBeingDownloaded": "{{id}} se está descargando", - "downloaded": "{{id}} descargado", - "showLess": "mostrar menos", - "showMore": "mostrar más...", - "onlyNonInlineAttachments": "Solo se muestran aquí los adjuntos que no están en línea.", - "noAttachments": "Sin adjuntos" + "dialog": { + "createTitle": "Crear token de acceso", + "description": "Haz clic en guardar cuando hayas terminado.", + "editTitle": "Editar token de acceso", + "save": "Guardar", + "saveChanges": "Guardar cambios" }, - "oauth2": { - "title": "OAuth2", - "addConfiguration": "Añadir configuración", - "id": "ID", - "provider": "Proveedor", - "clientId": "ID de cliente", - "clientSecret": "Secreto de cliente", - "redirectUri": "URI de redirección", - "scopes": "Ámbitos", - "status": "Estado", - "enabled": "Habilitado", - "disabled": "Deshabilitado", - "edit": "Editar", - "delete": "Eliminar", - "enable": "Habilitar", - "disable": "Deshabilitar", - "noConfigurations": "Sin configuraciones OAuth2", - "noConfigurationsDesc": "Aún no has añadido configuraciones OAuth2. Añade una para empezar a usar las funcionalidades OAuth2.", - "description": "Gestiona automáticamente la adquisición, almacenamiento y actualización de tokens de acceso, asegurando una experiencia de autenticación fluida y siempre lista.", - "addNew": "Añadir nuevo", - "updateHere": "Actualizar aquí.", - "createNewHere": "Crear uno nuevo aquí.", - "clickSaveWhenDone": "Haz clic en Guardar cuando hayas terminado.", - "quickPresets": "Preajustes rápidos:", - "gmail": "Gmail", - "outlook": "Outlook", - "whenDisabled": "Cuando está deshabilitado: - Los nuevos flujos de autorización serán rechazados inmediatamente - Los tokens de acceso y actualización existentes serán revocados en un minuto - Los usuarios deberán volver a autorizar cuando se vuelva a habilitar", - "clientIdLabel": "ID de cliente:", - "enterYourClientId": "Introduce tu ID de cliente", - "theUniqueIdentifierForYourApplication": "El identificador único para tu aplicación, proporcionado por el proveedor OAuth.", - "clientSecretLabel": "Secreto de cliente:", - "leaveEmptyToKeepExistingSecret": "Deja vacío para mantener el secreto existente", - "enterYourClientSecret": "Introduce tu secreto de cliente", - "leaveEmptyToKeepTheExistingSecret": "Deja vacío para mantener el secreto existente, introduce un nuevo valor solo para actualizarlo.", - "aSecretKeyProvidedByTheOAuthProvider": "Una clave secreta proporcionada por el proveedor OAuth para autenticar tu aplicación.", - "authUrlLabel": "URL de autorización:", - "enterTheAuthorizationUrl": "Introduce la URL de autorización", - "theUrlWhereUsersWillBeRedirected": "La URL a la que se redirigirá a los usuarios para autorizar tu aplicación.", - "tokenUrlLabel": "URL de token:", - "enterTheTokenUrl": "Introduce la URL de token", - "theUrlUsedToExchange": "La URL utilizada para intercambiar el código de autorización por un token de acceso.", - "redirectUrlLabel": "URI de redirección:", - "enterYourRedirectUrl": "Introduce tu URI de redirección", - "theRedirectUrlAfterAuthorization": "El URI de redirección después de la autorización. Debe coincidir con el registrado en el proveedor OAuth. Utiliza el formato http://[host]:[port]/oauth2/callback (o https://), donde [host] y [port] coinciden con tu despliegue de RustMailer. La ruta /oauth2/callback es fija.", - "scope": "Ámbito:", - "enterTheScopeHere": "Introduce el ámbito aquí.", - "addScope": "Añadir ámbito", - "key": "Clave:", - "enterTheKeyHere": "Introduce la clave aquí.", - "value": "Valor:", - "enterTheValueHere": "Introduce el valor aquí.", - "addExtraParams": "Añadir parámetros extra", - "useProxyOptional": "Usar Proxy (Opcional):", - "selectAProxy": "Seleccionar un proxy", - "noProxyAvailable": "No hay proxy disponible", - "useSocks5ProxyForOAuthRequests": "Usar proxy SOCKS5 para las solicitudes OAuth cuando el acceso directo está bloqueado.", - "descriptionLabel": "Descripción:", - "describeThePurposeOfTheOauth2Application": "Describe el propósito de la aplicación OAuth2", - "optional": "Opcional", - "saving": "Guardando...", - "creating": "Creando...", - "saveChanges": "Guardar cambios", - "save": "Guardar", - "updated": "Actualizado", - "created": "Creado", - "yourOAuth2ApplicationHasBeenSuccessfully": "Tu aplicación OAuth2 ha sido {{action}} con éxito.", - "updateFailed": "Error al actualizar", - "creationFailed": "Error al crear", - "updateOrCreationFailed": "Error al {{action}}, por favor, inténtalo de nuevo más tarde", - "clientSecretIsRequired": "El Secreto de cliente es obligatorio", - "clientSecretCannotBeEmpty": "El Secreto de cliente no puede estar vacío", - "keyIsRequired": "La Clave es obligatoria", - "keyCannotBeEmpty": "La Clave no puede estar vacía", - "valueIsRequired": "El Valor es obligatorio", - "valueCannotBeEmpty": "El Valor no puede estar vacío", - "descriptionMustNotExceed255Characters": "La descripción no debe exceder los 255 caracteres.", - "clientIdIsRequired": "El ID de cliente es obligatorio", - "clientIdCannotBeEmpty": "El ID de cliente no puede estar vacío", - "authorizationUrlIsRequired": "La URL de autorización es obligatoria", - "authorizationUrlCannotBeEmpty": "La URL de autorización no puede estar vacía", - "invalidAuthorizationUrlFormat": "Formato de URL de autorización inválido", - "tokenUrlIsRequired": "La URL de token es obligatoria", - "tokenUrlCannotBeEmpty": "La URL de token no puede estar vacía", - "invalidTokenUrlFormat": "Formato de URL de token inválido", - "redirectUriIsRequired": "El URI de redirección es obligatorio", - "redirectUriCannotBeEmpty": "El URI de redirección no puede estar vacío", - "invalidRedirectUriFormat": "Formato de URI de redirección inválido", - "authorizeEmailAccount": "Autorizar cuenta de correo electrónico", - "authorizeAnEmailAccountToStartTheOAuth2AuthorizationProcess": "Autoriza una cuenta de correo electrónico para iniciar el proceso de autorización OAuth2.", - "loadingAccounts": "Cargando cuentas...", - "selectAnAccount": "Selecciona una cuenta", - "noEmailAccountsRegistered": "No hay cuentas de correo electrónico registradas. Por favor, crea una.", - "pleaseCreateOne": "Por favor, crea una.", - "createAccount": "Crear cuenta", - "authorize": "Autorizar", - "getAuthorizeUrlFailed": "Error al obtener la URL de autorización", - "getAuthorizeUrlFailedDesc": "Error al obtener la URL de autorización, por favor, inténtalo de nuevo más tarde", - "oauth2ClientUpdated": "Cliente OAuth2 actualizado", - "oauth2ClientHasBeenSuccessfully": "Tu cliente OAuth2 ha sido {{action}} con éxito.", - "statusUpdateFailed": "Error al actualizar el estado, por favor, inténtalo de nuevo más tarde", - "disableOAuth2Client": "Deshabilitar cliente OAuth2", - "enableOAuth2Client": "Habilitar cliente OAuth2", - "areYouSureYouWantTo": "¿Estás seguro de que quieres {{action}} este cliente OAuth2?", - "thisWillPreventTheOAuth2ClientFromBeingUsed": "Esto evitará que se utilice el cliente OAuth2.", - "deleteToken": "Eliminar token", - "areYouSureYouWantToDelete": "¿Estás seguro de que quieres eliminar", - "thisActionWillPermanentlyRemoveTheOauth2Record": "Esta acción eliminará permanentemente el registro OAuth2 del sistema. Esto no se puede deshacer.", - "enterIdToConfirmDeletion": "Introduce el ID para confirmar la eliminación.", - "warning": "¡Advertencia!", - "pleaseBeCareful": "Por favor, ten cuidado, esta acción no se puede deshacer.", - "deleteSuccess": "Eliminación exitosa", - "yourOAuth2ApplicationHasBeenSuccessfullyDeleted": "Tu aplicación OAuth2 ha sido eliminada con éxito.", - "oauth2DeleteFailed": "Error al eliminar OAuth2", - "deleteFailed": "Error al eliminar, por favor, inténtalo de nuevo más tarde", - "actions": { - "openMenu": "Abrir menú", - "edit": "Editar", - "authorize": "Autorizar", - "delete": "Eliminar" - }, - "authFailed": "Autenticación OAuth2 fallida", - "error": "Error", - "unknownError": "Ha ocurrido un error desconocido.", - "tryAgain": "Intentar de nuevo", - "goHome": "Ir a inicio", - "authSuccess": "Autenticación OAuth2 exitosa", - "success": "Éxito", - "successMessage": "Tu cuenta de correo electrónico ha sido autenticada con éxito a través de OAuth2. El token de acceso ha sido almacenado por el sistema y se actualizará automáticamente cuando sea necesario.", - "goToAccounts": "Ir a Cuentas", - "authAtatus": "Estado de la autenticación OAuth2", - "information": "Información", - "noStatus": "Esta página muestra el resultado de tu autenticación OAuth2. Actualmente no hay un estado específico disponible. Por favor, vuelve a intentarlo si es necesario.", - "backToLogin": "Volver a Iniciar sesión" + "form": { + "1day": "1 día", + "30days": "30 días", + "7days": "7 días", + "errorInt": "Debe ser un número entero", + "errorMax": "Máx. 32 caracteres", + "errorNumber": "Debe ser un número", + "errorPositive": "Debe ser mayor que 0", + "expirationDescription": "Los tokens expirarán automáticamente después del tiempo seleccionado.", + "expirationLabel": "Expiración", + "expirationPlaceholder": "Seleccionar expiración", + "nameDescription": "Opcional · Máx. 32 caracteres", + "nameLabel": "Nombre", + "namePlaceholder": "Dale a este token un nombre corto", + "never": "Nunca" }, - "accessTokens": { - "title": "Tokens de acceso", - "name": "Nombre", - "accounts": "Cuentas", - "token": "Token", - "createdAt": "Creado el", - "expiresAt": "Caduca el", - "edit": "Editar", - "delete": "Eliminar", - "create": "Crear", - "noTokens": "Sin tokens de acceso", - "noTokensDesc": "Aún no has creado tokens de acceso. Crea uno para usar las funcionalidades de la API.", - "description": "Gestiona aquí los tokens de acceso, sus reglas ACL, listas blancas de IP y ajustes de límite de velocidad.", - "editToken": "Editar token", - "addNew": "Añadir nuevo", - "updateTheAccessTokenHere": "Actualiza el token de acceso aquí.", - "createNewAccessTokenHere": "Crea un nuevo token de acceso aquí.", - "selectAccounts": "Seleccionar cuentas", - "selectMultipleAccountsForTheAccessToken": "Selecciona varias cuentas para el ámbito del token de acceso.", - "enterOneIpAddressPerLine": "Introduce una dirección IP por línea, ej.:\n192.168.1.1\n192.168.1.2", - "aListOfIpAddressesAllowed": "Una lista de direcciones IP permitidas para acceder al recurso. Introduce una IP por línea. (Opcional)", - "enterQuota": "Introduce la cuota, ej. 100", - "theMaximumNumberOfRequestsAllowed": "El número máximo de solicitudes permitidas dentro del intervalo. (Opcional)", - "enterIntervalInSeconds": "Introduce el intervalo en segundos, ej. 60", - "theTimeWindowForTheRateLimit": "La ventana de tiempo (en segundos) para el límite de velocidad. (Opcional)", - "describeThePurposeOfTheAccessToken": "Describe el propósito del token de acceso", - "updating": "Actualizando...", - "saving": "Guardando...", - "creating": "Creando...", - "saveChanges": "Guardar cambios", - "save": "Guardar", - "updated": "Actualizado", - "created": "Creado", - "yourAccessTokenHasBeenSuccessfully": "Tu token de acceso ha sido {{action}} con éxito.", - "updateFailed": "Error al actualizar", - "creationFailed": "Error al crear", - "updateOrCreationFailed": "Error al {{action}}, por favor, inténtalo de nuevo más tarde", - "quotaMustBeAPositiveInteger": "La cuota debe ser un número entero positivo.", - "intervalMustBeAPositiveInteger": "El intervalo debe ser un número entero positivo.", - "invalidIpAddressesFound": "Se encontraron direcciones IP inválidas. Por favor, introduce direcciones IPv4 o IPv6 válidas.", - "atLeastOneAccountIsRequired": "Se requiere al menos una cuenta.", - "descriptionMustNotExceed255Characters": "La descripción no debe exceder los 255 caracteres.", - "notUsedYet": "Aún no usado", - "theListOfAccountsThatCanBeQueried": "La lista de cuentas que se pueden consultar con el token de acceso.", - "accountId": "ID de cuenta", - "filterByEmailAddressOrAccountId": "Filtrar por dirección de correo electrónico o ID de cuenta...", - "aclRulesForAccessTokens": "Las reglas ACL para los tokens de acceso incluyen la comprobación de la lista blanca de IP y la aplicación del límite de velocidad.", - "actions": { - "openMenu": "Abrir menú", - "edit": "Editar", - "delete": "Eliminar" - }, - "quota": "Cuota", - "interval": "Intervalo" + "list": { + "createdLabel": "Creado el", + "deleteBtn": "Eliminar token", + "expiresOnLabel": "Expira el", + "expiresOnShort": "Expira el {{date}}", + "lastUsedLabel": "Último uso", + "neverExpires": "Nunca expira", + "neverLabel": "Nunca", + "neverUsed": "Nunca", + "statusActive": "Activo", + "statusExpired": "Expirado", + "tokenLabel": "Token", + "unnamedToken": "Token sin nombre" }, - "settings": { - "appearance": { - "title": "Apariencia", - "field": { - "language": "Idioma de la interfaz", - "theme": "Tema de la interfaz" - }, - "description": { - "language": "Seleccione el idioma de la interfaz web.", - "theme": "Elija entre el modo claro u oscuro." - }, - "placeholder": { - "select_language": "Seleccionar idioma" - }, - "command": { - "search": "Buscar idioma...", - "no_results": "No se encontró el idioma." - }, - "theme": { - "light": "Claro", - "dark": "Oscuro" - }, - "button": { - "update": "Actualizar preferencias" - }, - "validation": { - "language": { - "required": "Por favor, seleccione un idioma." - }, - "theme": { - "required": "Por favor, seleccione un tema." - } - } - }, - "title": "Configuración", - "general": "General", - "proxy": "Proxy", - "name": "Nombre", - "host": "Host", - "port": "Puerto", - "username": "Nombre de usuario", - "password": "Contraseña", - "type": "Tipo", - "actions": "Acciones", - "edit": "Editar", - "delete": "Eliminar", - "add": "Añadir", - "noProxies": "Sin proxies", - "noProxiesDesc": "Aún no has añadido configuraciones de proxy. Añade una para usar las funcionalidades de proxy.", - "root": "Raíz", - "rootTitle": "Usuario raíz", - "rootDesc": "Gestiona las credenciales de inicio de sesión del usuario raíz, incluido el token y la contraseña.", - "rootAccessManagement": "Gestión de acceso de usuario raíz", - "manageRootTokenAndPassword": "Gestiona de forma segura el token y la contraseña del usuario raíz.", - "resetRootToken": "Restablecer token raíz", - "generateNewToken": "Generar un nuevo token, el antiguo caducará inmediatamente.", - "reset": "Restablecer", - "resetRootPassword": "Restablecer contraseña raíz", - "changePasswordForFutureLogins": "Cambiar la contraseña para futuros inicios de sesión.", - "youAreAboutToResetTheRootToken": "Estás a punto de restablecer el token raíz. Esta acción no se puede deshacer.", - "confirmReset": "Confirmar restablecimiento", - "youAreAboutToResetTheRootPassword": "Estás a punto de restablecer la contraseña raíz. Asegúrate de guardarla de forma segura.", - "enterNewRootPassword": "Introduce la nueva contraseña raíz", - "theRootTokenHasBeenReset": "El token raíz ha sido restablecido", - "yourLoginInformationHasBeenUpdated": "Tu información de inicio de sesión ha sido actualizada. No necesitarás volver a iniciar sesión.", - "invalidPassword": "Contraseña inválida", - "rootPasswordMustBeAtLeast6Characters": "La contraseña raíz debe tener al menos 6 caracteres.", - "theRootPasswordHasBeenReset": "La contraseña raíz ha sido restablecida", - "useNewPasswordForNextLogin": "Usa la nueva contraseña para el próximo inicio de sesión.", - "failedToCopyText": "Error al copiar el texto", - "filterProxy": "Filtrar proxies...", - "filterOauth2": "Filtrar OAuth2...", - "filterAccount": "Filtrar cuentas...", - "filterAccessToken": "Filtrar tokens de acceso...", - "selectAll": "Seleccionar todo", - "theme": "Tema", - "id": "Id", - "url": "Url", - "createdAt": "Creado el", - "updatedAt": "Actualizado el", - "enabled": "Habilitado", - "useProxy": "Usar proxy", - "authUrl": "URL de autorización", - "tokenUrl": "URL de token", - "description": "Descripción", - "token": "Token", - "accounts": "Cuentas", - "acl": "ACL", - "lastAccess": "Último acceso", - "enterProxyIdToConfirmDeletion": "Introduce el ID del proxy para confirmar la eliminación.", - "updateTheProxyHere": "Actualiza el proxy aquí. ", - "addNewProxyHere": "Añade un nuevo proxy aquí. ", - "pleaseUseAnIpAddressForBetterReliability": "Utiliza una dirección IP (ej. 127.0.0.1) en lugar de un nombre de host o dominio para una mejor fiabilidad.", - "adding": "Añadiendo...", - "yourProxyHasBeenSuccessfully": "Tu proxy ha sido {{action}} con éxito.", - "proxyUpdateOrAddFailed": "Error al {{action}} el proxy, por favor, inténtalo de nuevo más tarde", - "sidebar": { - "profile": "Perfil", - "apiTokens": "Tokens API", - "proxy": "Proxy de red", - "configurations": "Configuraciones del sistema" - }, - "profile": { - "loadError": "No se pudo cargar la información del usuario.", - "uploadTitle": "Subir avatar", - "maxSize": "Hasta {{size}}", - "avatarAlt": "Avatar", - "removeAvatar": "Eliminar avatar", - "uploadError": "Error(es) al subir el archivo", - "field": { - "username": "Nombre de usuario", - "email": "Correo electrónico", - "password": "Contraseña" - }, - "placeholder": { - "password_keep": "Déjelo en blanco para mantener la contraseña actual" - }, - "button": { - "update_profile": "Actualizar perfil", - "permissions": "Permisos", - "view_global_permissions": "Ver permisos globales" - }, - "section": { - "roles": "Roles", - "accounts": "{{count}} cuentas vinculadas" - }, - "account": { - "id": "ID de cuenta: {{id}}" - }, - "toast": { - "updated": "Perfil actualizado correctamente", - "update_failed": "No se pudo actualizar el perfil" - }, - "validation": { - "username": { - "required": "El nombre de usuario es obligatorio", - "min": "El nombre de usuario debe tener al menos 5 caracteres", - "max": "El nombre de usuario debe tener como máximo 32 caracteres" - }, - "email": { - "required": "El correo electrónico es obligatorio", - "invalid": "Por favor, introduce una dirección de correo electrónico válida" - }, - "password": { - "min": "La contraseña debe tener al menos 8 caracteres", - "max": "La contraseña debe tener como máximo 256 caracteres" - } - } - } + "notifications": { + "close": "Cerrar", + "copied": "Copiado al portapapeles", + "createFailed": "Error al crear", + "createSuccess": "Token de acceso creado", + "createSuccessDesc": "El token de acceso se ha creado correctamente.", + "deleteFailed": "Error al eliminar el token", + "deleteSuccess": "Token de acceso eliminado correctamente", + "genericError": "Operación fallida. Por favor, inténtalo de nuevo.", + "tryAgain": "Reintentar", + "updateFailed": "Error al actualizar", + "updateSuccess": "Token de acceso actualizado", + "updateSuccessDesc": "El token de acceso se ha actualizado correctamente." }, - "apiDocs": { - "choosePreferredType": "Elige el tipo de documentación API preferido", - "swaggerUI": "Swagger UI", - "reDoc": "ReDoc", - "openAPIExplorer": "Explorador OpenAPI", - "scalar": "Scalar", - "downloadSpecYAML": "Descargar especificación YAML" + "page": { + "addBtn": "Añadir token", + "emptyDescription": "Aún no has creado ningún token API. Haz clic abajo para crear uno.", + "emptyTitle": "Sin tokens API", + "loadError": "Error al cargar los tokens API." + } + }, + "attachment": { + "all_fields_desc": "Coincide con el nombre del adjunto, asunto y remitente", + "date": "Fecha", + "name": "Nombre de archivo", + "search_input_placeholder": "Buscar adjuntos (use \" \" para búsqueda de frases)", + "sender": "Remitente", + "sender_with_count": "Remitente ({{count}})", + "size": "Tamaño del archivo", + "source": "Fuente", + "subject": "Asunto" + }, + "auth": { + "areYouSureYouWantToLogOut": "¿Estás seguro de que quieres cerrar sesión?", + "invalidPassword": "Contraseña inválida. Inténtalo de nuevo.", + "login": "Iniciar sesión", + "loginFailed": "Error al iniciar sesión", + "logout": "Cerrar sesión", + "password": "Contraseña", + "sessionExpired": "¡Sesión caducada!", + "sessionExpiredDesc": "Tu sesión ha caducado debido a la inactividad. Inicia sesión para continuar.", + "somethingWentWrong": "Algo salió mal", + "username": "Nombre de usuario", + "welcome": "Bienvenido a Bichon", + "youWillNeedToLogInAgain": "Necesitarás iniciar sesión de nuevo para acceder a tu cuenta." + }, + "command": { + "dark": "Oscuro", + "light": "Claro", + "noResultsFound": "No se encontraron resultados.", + "theme": "Tema", + "typeCommandOrSearch": "Escribe un comando o busca..." + }, + "common": { + "actions": "Acciones", + "add": "Añadir", + "all": "Todo", + "apply": "Aplicar", + "back": "Volver", + "backToHome": "Volver al inicio", + "cancel": "Cancelar", + "clear": "Limpiar", + "close": "Cerrar", + "confirm": "Confirmar", + "create": "Crear", + "delete": "Eliminar", + "deleting": "Eliminando...", + "deselectAll": "Deseleccionar todo", + "edit": "Editar", + "empty": "Vacío", + "error": "Error", + "failed": "Fallido", + "filter": "Filtrar", + "goBack": "Regresar", + "loading": "Cargando...", + "more": "Más", + "na": "N/A", + "no": "No", + "noData": "Sin datos", + "none": "Ninguno", + "notFound": "No encontrado", + "ok": "Aceptar", + "op_failed": "Operación fallida", + "project_description": "Bichon es un proyecto de código abierto.", + "remove": "Eliminar", + "reset": "Restablecer", + "retry": "Reintentar", + "save": "Guardar", + "save_changes": "Guardar cambios", + "search": "Buscar", + "select": "Seleccionar", + "selectAll": "Seleccionar todo", + "showLess": "Mostrar menos", + "showMore": "Mostrar más...", + "submit": "Enviar", + "table": { + "noResults": "Sin resultados." }, - "dialogs": { - "confirmDelete": "Confirmar eliminación", - "confirmDeleteDesc": "¿Estás seguro de que quieres eliminar este elemento? Esta acción no se puede deshacer.", - "deleteSuccess": "Eliminado con éxito", - "deleteFailed": "Error al eliminar", - "saveSuccess": "Guardado con éxito", - "saveFailed": "Error al guardar", - "createSuccess": "Creado con éxito", - "createFailed": "Error al crear", - "updateSuccess": "Actualizado con éxito", - "updateFailed": "Error al actualizar", - "continue": "Continuar", - "deleting": "Eliminando...", - "accountDeleted": "Cuenta eliminada", - "accountDeletedDesc": "Tu cuenta ha sido eliminada con éxito.", - "accountDeleteFailed": "Error al eliminar la cuenta", - "deleteAccountPermanently": "Eliminar cuenta permanentemente", - "youAreDeleting": "Estás eliminando {{email}}. Esto eliminará permanentemente:", - "accountCredentials": "Credenciales y configuración de la cuenta", - "localCachedMetadata": "Metadatos almacenados en caché localmente y estado de sincronización", - "imapSyncData": "Datos de sincronización IMAP", - "oauthTokens": "Tokens OAuth y credenciales API", - "typeEmailToConfirm": "Escribe la dirección de correo electrónico de la cuenta para confirmar:", - "typeToConfirm": "Escribe \"{{email}}\" para confirmar", - "cannotBeUndone": "¡Esta acción no se puede deshacer!", - "allResourcesErased": "Todos los recursos asociados se borrarán permanentemente.", - "permanentlyDeleteAccount": "Eliminar cuenta permanentemente" + "tryAgain": "Reintentar", + "update": "Actualizar", + "view_on_github_button": "Ver en GitHub", + "yes": "Sí" + }, + "dashboard": { + "account": "Cuenta", + "actualDiskUsage": "Uso real de disco", + "attachmentRatio": "Ratio de adjuntos", + "attachmentRatioDesc": "El {{percent}}% de los correos tienen adjuntos", + "attachments": "Archivos adjuntos", + "byMessageCount": "Por conteo de mensajes", + "byMessageSize": "Por tamaño de mensaje", + "connected": "Conectado", + "count": "Conteo", + "dataStorage": "Almacenamiento", + "dayTrend": "Tendencia de 30 días", + "efficiency": "Eficiencia", + "emails": "Correos", + "indexSize": "Tamaño índice", + "localDataFiles": "Archivos de datos locales", + "logicalVolume": "Tamaño original", + "mailAccounts": "Cuentas de correo", + "messageDistribution": "Distribución de mensajes", + "metadataSize": "Tamaño de metadatos", + "newEmails": "Nuevos correos", + "noAccountData": "Sin datos de cuenta", + "noAttachments": "Sin adjuntos", + "noEmailsSynced": "Aún no hay correos sincronizados", + "noLargeEmails": "Sin correos grandes", + "noRecentActivity": "Sin actividad reciente", + "noSendersData": "Sin datos de remitentes", + "noSubject": "(Sin asunto)", + "saved": "Ahorrado", + "sender": "Remitente", + "size": "Tamaño", + "subject": "Asunto", + "syncedLocally": "Sincronizado localmente", + "systemVersion": "Versión del sistema", + "tantivyDatabase": "Basado en el motor de búsqueda Tantivy", + "title": "Panel de control", + "top10Accounts": "Las 10 principales cuentas", + "top10LargestEmails": "Los 10 correos más grandes", + "top10Senders": "Los 10 principales remitentes", + "topLists": "Listas principales", + "totalEmailSize": "Tamaño total de correos", + "totalEmails": "Total de correos", + "withAttachments": "Con adjuntos" + }, + "dialogs": { + "accountCredentials": "Credenciales y configuración de la cuenta", + "accountDeleteFailed": "Error al eliminar la cuenta", + "accountDeleted": "Cuenta eliminada", + "accountDeletedDesc": "Tu cuenta ha sido eliminada con éxito.", + "allResourcesErased": "Todos los recursos asociados se borrarán permanentemente.", + "cannotBeUndone": "¡Esta acción no se puede deshacer!", + "confirmDelete": "Confirmar eliminación", + "confirmDeleteDesc": "¿Estás seguro de que quieres eliminar este elemento? Esta acción no se puede deshacer.", + "continue": "Continuar", + "createFailed": "Error al crear", + "createSuccess": "Creado con éxito", + "deleteAccountPermanently": "Eliminar cuenta permanentemente", + "deleteFailed": "Error al eliminar", + "deleteSuccess": "Eliminado con éxito", + "deleting": "Eliminando...", + "imapSyncData": "Datos de sincronización IMAP", + "localCachedMetadata": "Metadatos almacenados en caché localmente y estado de sincronización", + "oauthTokens": "Tokens OAuth y credenciales API", + "permanentlyDeleteAccount": "Eliminar cuenta permanentemente", + "saveFailed": "Error al guardar", + "saveSuccess": "Guardado con éxito", + "typeEmailToConfirm": "Escribe la dirección de correo electrónico de la cuenta para confirmar:", + "typeToConfirm": "Escribe \"{{email}}\" para confirmar", + "updateFailed": "Error al actualizar", + "updateSuccess": "Actualizado con éxito", + "youAreDeleting": "Estás eliminando {{email}}. Esto eliminará permanentemente:" + }, + "errors": { + "contentNotModified": "¡Contenido no modificado!", + "forbidden": "Prohibido", + "forbiddenDesc": "No tienes permiso para ver este recurso.", + "forbiddenTitle": "Acceso prohibido", + "internalServerError": "¡Error interno del servidor!", + "learnMore": "Saber más", + "maintenance": "Mantenimiento", + "maintenanceDesc": "El sitio está temporalmente fuera de servicio. Volveremos a estar en línea pronto.", + "maintenanceTitle": "¡El sitio está en mantenimiento!", + "networkError": "Error de red", + "networkErrorDesc": "No se puede conectar con el servidor. Por favor, comprueba tu conexión a internet y vuelve a intentarlo.", + "pageNotFound": "¡Ups! ¡Página no encontrada!", + "pageNotFoundDesc": "Parece que la página que estás buscando no existe o ha sido eliminada.", + "somethingWentWrong": "¡Ups! Algo salió mal :')", + "somethingWentWrongDesc": "Lamentamos las molestias. Por favor, inténtalo de nuevo más tarde.", + "unauthorized": "No autorizado", + "unauthorizedDesc": "Inicia sesión con credenciales válidas para acceder a este recurso.", + "unauthorizedTitle": "Acceso no autorizado" + }, + "mail": { + "account": "Cuenta", + "attachments": "Adjuntos", + "bcc": "CCO", + "cc": "CC", + "date": "Fecha", + "delete": "Eliminar", + "download": "Descargar", + "downloadComplete": "Descarga completada", + "downloadFailed": "Error de descarga", + "downloadStarted": "Descarga iniciada", + "downloaded": "{{id}} descargado", + "emailViewer": "Visor de correo electrónico", + "failedToDownloadFile": "Error al descargar el archivo", + "failedToLoadEmail": "Error al cargar el correo electrónico.", + "from": "De", + "id": "ID", + "isBeingDownloaded": "{{id}} se está descargando", + "noAttachments": "Sin adjuntos", + "noMessageSelected": "Ningún mensaje seleccionado", + "noTagsYet": "Aún no hay etiquetas", + "onlyNonInlineAttachments": "Solo se muestran aquí los adjuntos que no están en línea.", + "showLess": "mostrar menos", + "showMore": "mostrar más...", + "subject": "Asunto", + "tags": "Etiquetas", + "to": "Para", + "viewThread": "Ver hilo" + }, + "mailbox": { + "bulkActions": { + "ariaLabel": "Acciones masivas para {{count}} {{emailLabel}} seleccionado(s)", + "clearSelection": "Borrar selección", + "clearSelectionWithKey": "Borrar selección ({{key}})", + "delete": "Eliminar", + "deleteTooltip": "Eliminar correos seleccionados", + "email": "correo electrónico", + "emails": "correos electrónicos", + "selected": "seleccionado" }, - "command": { - "typeCommandOrSearch": "Escribe un comando o busca...", - "noResultsFound": "No se encontraron resultados.", - "theme": "Tema", - "light": "Claro", - "dark": "Oscuro" + "deleteDialog": { + "confirm": "Eliminar", + "desc": "¿Estás seguro de que quieres eliminar {{countText}}? Esta acción eliminará permanentemente el/los correo(s) seleccionado(s) de la base de datos local. El/los correo(s) se perderán para siempre y no se podrán recuperar.", + "descCountMultiple": "estos {{count}} correos electrónicos", + "descCountSingle": "este correo electrónico", + "errorTitle": "Error al eliminar mensajes", + "successDesc": "Los mensajes han sido eliminados.", + "successTitle": "Mensajes eliminados con éxito", + "title": "Eliminar correo electrónico", + "warningDesc": "Procede con precaución.", + "warningTitle": "¡Advertencia!" + }, + "deleteMailboxDialog": { + "confirm": "Eliminar permanentemente", + "desc": "¿Está seguro de que desea eliminar esta carpeta de correo? Esta acción no se puede deshacer.", + "errorTitle": "Error al eliminar", + "successDesc": "La carpeta de correo y su contenido han sido eliminados correctamente.", + "successTitle": "Eliminado con éxito", + "title": "Eliminar carpeta de correo", + "warningDesc": "Eliminar esta carpeta también eliminará permanentemente todos los correos electrónicos archivados y las subcarpetas que contenga.", + "warningTitle": "Advertencia" + }, + "folders": "Carpetas", + "messages": "Mensajes", + "noMessages": "No hay mensajes", + "selectFolder": "Selecciona una carpeta para ver los mensajes", + "thread": { + "empty": "No hay mensajes en este hilo.", + "invalidDate": "Fecha inválida", + "loadError": "Error al cargar el hilo", + "loadMore": "Cargar más", + "loadingMore": "Cargando...", + "message": "mensaje", + "messages": "mensajes", + "noSubject": "(Sin asunto)", + "title": "Hilo de conversación ({{count}} {{messageLabel}})" + }, + "title": "Buzón" + }, + "navigation": { + "accessTokens": "Tokens de acceso", + "accounts": "Cuentas", + "apiDocs": "Documentación API", + "attachment": "Archivos adjuntos", + "auth": "Autenticación", + "dashboard": "Panel de control", + "general": "General", + "home": "Inicio", + "mailbox": "Buzón", + "oauth2": "OAuth2", + "other": "Otro", + "settings": "Configuración", + "users": "Usuarios del sistema" + }, + "oauth2": { + "aSecretKeyProvidedByTheOAuthProvider": "Una clave secreta proporcionada por el proveedor OAuth para autenticar tu aplicación.", + "actions": { + "authorize": "Autorizar", + "delete": "Eliminar", + "edit": "Editar", + "openMenu": "Abrir menú" + }, + "addConfiguration": "Añadir configuración", + "addExtraParams": "Añadir parámetros extra", + "addNew": "Añadir nuevo", + "addScope": "Añadir ámbito", + "areYouSureYouWantTo": "¿Estás seguro de que quieres {{action}} este cliente OAuth2?", + "areYouSureYouWantToDelete": "¿Estás seguro de que quieres eliminar", + "authAtatus": "Estado de la autenticación OAuth2", + "authFailed": "Autenticación OAuth2 fallida", + "authSuccess": "Autenticación OAuth2 exitosa", + "authUrlLabel": "URL de autorización:", + "authorizationUrlCannotBeEmpty": "La URL de autorización no puede estar vacía", + "authorizationUrlIsRequired": "La URL de autorización es obligatoria", + "authorize": "Autorizar", + "authorizeAnEmailAccountToStartTheOAuth2AuthorizationProcess": "Autoriza una cuenta de correo electrónico para iniciar el proceso de autorización OAuth2.", + "authorizeEmailAccount": "Autorizar cuenta de correo electrónico", + "backToLogin": "Volver a Iniciar sesión", + "clickSaveWhenDone": "Haz clic en Guardar cuando hayas terminado.", + "clientId": "ID de cliente", + "clientIdCannotBeEmpty": "El ID de cliente no puede estar vacío", + "clientIdIsRequired": "El ID de cliente es obligatorio", + "clientIdLabel": "ID de cliente:", + "clientSecret": "Secreto de cliente", + "clientSecretCannotBeEmpty": "El Secreto de cliente no puede estar vacío", + "clientSecretIsRequired": "El Secreto de cliente es obligatorio", + "clientSecretLabel": "Secreto de cliente:", + "createAccount": "Crear cuenta", + "createNewHere": "Crear uno nuevo aquí.", + "created": "Creado", + "creating": "Creando...", + "creationFailed": "Error al crear", + "delete": "Eliminar", + "deleteFailed": "Error al eliminar, por favor, inténtalo de nuevo más tarde", + "deleteSuccess": "Eliminación exitosa", + "deleteToken": "Eliminar token", + "describeThePurposeOfTheOauth2Application": "Describe el propósito de la aplicación OAuth2", + "description": "Gestiona automáticamente la adquisición, almacenamiento y actualización de tokens de acceso, asegurando una experiencia de autenticación fluida y siempre lista.", + "descriptionLabel": "Descripción:", + "descriptionMustNotExceed255Characters": "La descripción no debe exceder los 255 caracteres.", + "disable": "Deshabilitar", + "disableOAuth2Client": "Deshabilitar cliente OAuth2", + "disabled": "Deshabilitado", + "edit": "Editar", + "enable": "Habilitar", + "enableOAuth2Client": "Habilitar cliente OAuth2", + "enabled": "Habilitado", + "enterIdToConfirmDeletion": "Introduce el ID para confirmar la eliminación.", + "enterTheAuthorizationUrl": "Introduce la URL de autorización", + "enterTheKeyHere": "Introduce la clave aquí.", + "enterTheScopeHere": "Introduce el ámbito aquí.", + "enterTheTokenUrl": "Introduce la URL de token", + "enterTheValueHere": "Introduce el valor aquí.", + "enterYourClientId": "Introduce tu ID de cliente", + "enterYourClientSecret": "Introduce tu secreto de cliente", + "enterYourRedirectUrl": "Introduce tu URI de redirección", + "error": "Error", + "getAuthorizeUrlFailed": "Error al obtener la URL de autorización", + "getAuthorizeUrlFailedDesc": "Error al obtener la URL de autorización, por favor, inténtalo de nuevo más tarde", + "gmail": "Gmail", + "goHome": "Ir a inicio", + "goToAccounts": "Ir a Cuentas", + "id": "ID", + "information": "Información", + "invalidAuthorizationUrlFormat": "Formato de URL de autorización inválido", + "invalidRedirectUriFormat": "Formato de URI de redirección inválido", + "invalidTokenUrlFormat": "Formato de URL de token inválido", + "key": "Clave:", + "keyCannotBeEmpty": "La Clave no puede estar vacía", + "keyIsRequired": "La Clave es obligatoria", + "leaveEmptyToKeepExistingSecret": "Deja vacío para mantener el secreto existente", + "leaveEmptyToKeepTheExistingSecret": "Deja vacío para mantener el secreto existente, introduce un nuevo valor solo para actualizarlo.", + "loadingAccounts": "Cargando cuentas...", + "noConfigurations": "Sin configuraciones OAuth2", + "noConfigurationsDesc": "Aún no has añadido configuraciones OAuth2. Añade una para empezar a usar las funcionalidades OAuth2.", + "noEmailAccountsRegistered": "No hay cuentas de correo electrónico registradas. Por favor, crea una.", + "noProxyAvailable": "No hay proxy disponible", + "noStatus": "Esta página muestra el resultado de tu autenticación OAuth2. Actualmente no hay un estado específico disponible. Por favor, vuelve a intentarlo si es necesario.", + "oauth2ClientHasBeenSuccessfully": "Tu cliente OAuth2 ha sido {{action}} con éxito.", + "oauth2ClientUpdated": "Cliente OAuth2 actualizado", + "oauth2DeleteFailed": "Error al eliminar OAuth2", + "optional": "Opcional", + "outlook": "Outlook", + "pleaseBeCareful": "Por favor, ten cuidado, esta acción no se puede deshacer.", + "pleaseCreateOne": "Por favor, crea una.", + "provider": "Proveedor", + "quickPresets": "Preajustes rápidos:", + "redirectUri": "URI de redirección", + "redirectUriCannotBeEmpty": "El URI de redirección no puede estar vacío", + "redirectUriIsRequired": "El URI de redirección es obligatorio", + "redirectUrlLabel": "URI de redirección:", + "save": "Guardar", + "saveChanges": "Guardar cambios", + "saving": "Guardando...", + "scope": "Ámbito:", + "scopes": "Ámbitos", + "selectAProxy": "Seleccionar un proxy", + "selectAnAccount": "Selecciona una cuenta", + "status": "Estado", + "statusUpdateFailed": "Error al actualizar el estado, por favor, inténtalo de nuevo más tarde", + "success": "Éxito", + "successMessage": "Tu cuenta de correo electrónico ha sido autenticada con éxito a través de OAuth2. El token de acceso ha sido almacenado por el sistema y se actualizará automáticamente cuando sea necesario.", + "theRedirectUrlAfterAuthorization": "El URI de redirección después de la autorización. Debe coincidir con el registrado en el proveedor OAuth. Utiliza el formato http://[host]:[port]/oauth2/callback (o https://), donde [host] y [port] coinciden con tu despliegue de RustMailer. La ruta /oauth2/callback es fija.", + "theUniqueIdentifierForYourApplication": "El identificador único para tu aplicación, proporcionado por el proveedor OAuth.", + "theUrlUsedToExchange": "La URL utilizada para intercambiar el código de autorización por un token de acceso.", + "theUrlWhereUsersWillBeRedirected": "La URL a la que se redirigirá a los usuarios para autorizar tu aplicación.", + "thisActionWillPermanentlyRemoveTheOauth2Record": "Esta acción eliminará permanentemente el registro OAuth2 del sistema. Esto no se puede deshacer.", + "thisWillPreventTheOAuth2ClientFromBeingUsed": "Esto evitará que se utilice el cliente OAuth2.", + "title": "OAuth2", + "tokenUrlCannotBeEmpty": "La URL de token no puede estar vacía", + "tokenUrlIsRequired": "La URL de token es obligatoria", + "tokenUrlLabel": "URL de token:", + "tryAgain": "Intentar de nuevo", + "unknownError": "Ha ocurrido un error desconocido.", + "updateFailed": "Error al actualizar", + "updateHere": "Actualizar aquí.", + "updateOrCreationFailed": "Error al {{action}}, por favor, inténtalo de nuevo más tarde", + "updated": "Actualizado", + "useProxyOptional": "Usar Proxy (Opcional):", + "useSocks5ProxyForOAuthRequests": "Usar proxy SOCKS5 para las solicitudes OAuth cuando el acceso directo está bloqueado.", + "value": "Valor:", + "valueCannotBeEmpty": "El Valor no puede estar vacío", + "valueIsRequired": "El Valor es obligatorio", + "warning": "¡Advertencia!", + "whenDisabled": "Cuando está deshabilitado: - Los nuevos flujos de autorización serán rechazados inmediatamente - Los tokens de acceso y actualización existentes serán revocados en un minuto - Los usuarios deberán volver a autorizar cuando se vuelva a habilitar", + "yourOAuth2ApplicationHasBeenSuccessfully": "Tu aplicación OAuth2 ha sido {{action}} con éxito.", + "yourOAuth2ApplicationHasBeenSuccessfullyDeleted": "Tu aplicación OAuth2 ha sido eliminada con éxito." + }, + "permission": { + "account": { + "create": "Crear cuentas de correo", + "manage": "Gestionar cuentas asignadas", + "manage_all": "Gestionar todas las configuraciones de cuentas", + "read_details": "Leer detalles de la cuenta" + }, + "category": { + "account": "Permisos de cuenta", + "global_data": "Datos globales (Admin)", + "system_identity": "Sistema e identidad" + }, + "data": { + "delete": "Eliminar correos asignados", + "delete_all": "Eliminar correos de todas las cuentas", + "export_batch": "Exportar datos asignados por lotes", + "export_batch_all": "Exportar todos los datos por lotes", + "import_batch": "Importar datos de correo por lotes", + "manage": "Gestionar metadatos de correo asignados", + "manage_all": "Gestionar todos los metadatos de correo", + "raw_download": "Descargar correos sin procesar asignados", + "raw_download_all": "Descargar todos los correos sin procesar", + "read": "Leer datos de correo asignados", + "read_all": "Leer todos los datos de correo", + "smtp_ingest": "Ingerir correos electrónicos a través del protocolo SMTP" + }, + "dialog": { + "account_description": "Permisos limitados a la cuenta seleccionada.", + "account_title": "Permisos de cuenta", + "global_description": "Permisos de todo el sistema otorgados a este usuario.", + "global_title": "Permisos globales" + }, + "scope": { + "account": "Cuenta #{{id}}", + "global": "Global" + }, + "system": { + "access": "Acceso básico al sistema", + "root": "Control total del sistema" + }, + "token": { + "manage": "Gestionar tokens de acceso" + }, + "user": { + "manage": "Gestionar todos los usuarios", + "view": "Ver nombres de usuario básicos" + } + }, + "profile": { + "avatar_alt": "Avatar", + "menu": { + "profile": "Perfil", + "settings": "Configuración", + "sign_out": "Cerrar sesión" + } + }, + "proxyDelete": { + "close": "Cerrar", + "confirmText": "¿Estás seguro de que quieres eliminar", + "deleteBtn": "Eliminar", + "failedDesc": "Error al eliminar, por favor, inténtalo de nuevo más tarde", + "failedTitle": "Error al eliminar el proxy", + "permanent": "Esta acción eliminará permanentemente el Proxy del sistema. Esto no se puede deshacer.", + "proxyIdLabel": "ID del Proxy:", + "proxyIdPlaceholder": "Introduce el ID del Proxy para confirmar la eliminación.", + "successDesc": "El proxy ha sido eliminado con éxito.", + "successTitle": "Eliminación exitosa", + "title": "Eliminar Proxy", + "tryAgain": "Intentar de nuevo", + "warningDesc": "Por favor, ten cuidado, esta acción no se puede deshacer.", + "warningTitle": "¡Advertencia!" + }, + "restore_message": { + "accountsInvolved": "Cuentas involucradas", + "bulkTitle": "Restaurar múltiples mensajes", + "bulkWarning": "Nota: Los mensajes se restaurarán en sus carpetas originales.", + "confirm": "Ejecutar restauración", + "desc": "Esta acción volverá a cargar los mensajes seleccionados desde Bichon y los restaurará en sus buzones correspondientes en el servidor IMAP.", + "failed": "Error al restaurar", + "failedTitle": "Fallo en la restauración", + "messages": "mensajes", + "restore_to_imap": "Restaurar mensaje", + "success": "Restauración exitosa", + "successDesc": "Los mensajes seleccionados se han restaurado correctamente en el servidor IMAP.", + "summary": "Detalles de restauración", + "title": "Restaurar mensaje individual" + }, + "roles": { + "actions": { + "add": "Añadir rol", + "cancel": "Cancelar", + "close": "Cerrar", + "failed": "La operación falló", + "retry": "Reintentar", + "submit_create": "Crear rol", + "submit_update": "Actualizar rol", + "success_create": "Rol creado con éxito", + "success_update": "Rol actualizado con éxito" + }, + "categories": { + "account_resource": "Acceso a recursos de cuenta", + "global_data": "Acceso a datos globales", + "identity": "Identidad y Gestión" + }, + "columns": { + "created_at": "Creado el", + "id": "ID", + "name": "Nombre", + "permissions": "Permisos", + "role_type": "Tipo", + "updated_at": "Actualizado el" + }, + "delete": { + "alert_desc": "Eliminar este rol lo quitará de todos los usuarios a los que esté asignado.", + "alert_title": "Atención: Acción permanente.", + "confirm_btn": "Eliminar rol", + "confirm_label": "Escriba el ID del rol para confirmar:", + "deleting": "Eliminando...", + "dialog_title": "Eliminar rol", + "error_fallback": "No se pudo eliminar el rol.", + "error_title": "Error al eliminar", + "irreversible": "Esta acción no se puede deshacer.", + "placeholder": "Escriba \"{{id}}\"", + "success_desc": "El rol \"{{name}}\" ha sido removido.", + "success_title": "Rol eliminado", + "warning_text": "Está eliminando el rol {{name}} (ID: {{id}}) de forma permanente." + }, + "description_hint": "Defina el alcance de acceso y los permisos.", + "details": { + "close_btn": "Cerrar", + "desc_account": "Acceso y acciones de datos para cuentas individuales.", + "desc_global": "Gestión global y acceso al sistema.", + "role_badge": "Rol {{type}}", + "title": "Permisos: {{name}}", + "unknown": "Rol desconocido", + "view_permissions": "Ver detalles" + }, + "empty": { + "desc": "Aún no ha creado ningún rol personalizado.", + "title": "No se encontraron roles" + }, + "form": { + "builtin_badge": "Rol del sistema", + "builtin_desc": "Este rol está predefinido y es de solo lectura.", + "desc_label": "Descripción", + "matrix_label": "Matriz de permisos ({{type}})", + "name_label": "Nombre del rol", + "type_label": "Tipo de rol" + }, + "placeholder": { + "filter": "Buscar roles..." + }, + "title": { + "create": "Crear nuevo rol", + "edit": "Editar rol: {{name}}" + }, + "types": { + "Account": "Cuenta", + "Global": "Global" }, "validation": { - "required": "Este campo es obligatorio", - "invalidEmail": "Dirección de correo electrónico inválida", - "invalidUrl": "URL inválida", - "passwordMinLength": "La contraseña debe tener al menos {{min}} caracteres", - "pleaseEnterPassword": "Por favor, introduce tu contraseña", - "passwordRequired": "La contraseña es obligatoria cuando el método de autenticación es Contraseña", - "emailRequired": "El correo electrónico es obligatorio", - "imapHostRequired": "El host IMAP es obligatorio", - "imapHostCannotBeEmpty": "El host IMAP no puede estar vacío", - "imapPortMustBePositive": "El puerto IMAP debe ser un número entero positivo", - "imapPortMustBeLessThan65536": "El puerto IMAP debe ser menor que 65536", - "folderLimitMustBeNumber": "El límite de carpetas debe ser un número", - "folderLimitMustBeAtLeast100": "El límite de carpetas debe ser de al menos 100", - "incrementalSyncMustBeNumber": "El intervalo de sincronización incremental debe ser un número", - "incrementalSyncMustBeAtLeast10": "El intervalo de sincronización incremental debe ser de al menos 10 minutos", - "pleaseEnterUsernameOrEmail": "Por favor, introduzca su nombre de usuario o correo electrónico", - "singleRequestBatchSizeMustBeNumber": "El tamaño del lote debe ser un número", - "singleRequestBatchSizeTooSmall": "El tamaño del lote debe ser al menos 10", - "singleRequestBatchSizeTooLarge": "El tamaño del lote debe ser como máximo 200" - }, - "table": { - "noResults": "No se encontraron resultados", - "loading": "Cargando...", - "page": "Página", - "of": "de", - "rowsPerPage": "Filas por página", - "showing": "Mostrando", - "to": "a", - "results": "resultados", - "asc": "Asc", - "desc": "Desc", - "hide": "Ocultar", - "edit": "Editar", - "delete": "Eliminar", - "pagination": { - "selected": "{{selected}} / {{total}} fila(s) seleccionada(s).", - "fixed_page_size": "{{size}} filas por página.", - "rows_per_page": "Filas por página", - "page_info": "Página {{page}} de {{total}}", - "first": "Primera página", - "previous": "Página anterior", - "next": "Página siguiente", - "last": "Última página" - } - }, - "proxyDelete": { - "title": "Eliminar Proxy", - "successTitle": "Eliminación exitosa", - "successDesc": "El proxy ha sido eliminado con éxito.", - "close": "Cerrar", - "failedTitle": "Error al eliminar el proxy", - "failedDesc": "Error al eliminar, por favor, inténtalo de nuevo más tarde", - "tryAgain": "Intentar de nuevo", - "confirmText": "¿Estás seguro de que quieres eliminar", - "permanent": "Esta acción eliminará permanentemente el Proxy del sistema. Esto no se puede deshacer.", - "proxyIdLabel": "ID del Proxy:", - "proxyIdPlaceholder": "Introduce el ID del Proxy para confirmar la eliminación.", - "warningTitle": "¡Advertencia!", - "warningDesc": "Por favor, ten cuidado, esta acción no se puede deshacer.", - "deleteBtn": "Eliminar" - }, - "systemConfig": { - "pageTitle": "Configuraciones a nivel de sistema", - "pageDescription": "Estos parámetros se inicializan mediante indicadores CLI o variables de entorno. Actualmente son de solo lectura.", - "status": { - "enabled": "Habilitado", - "disabled": "Deshabilitado", - "configured": "Configurado", - "missing": "Faltante", - "auto": "Auto", - "notSet": "No establecido" - }, - "sections": { - "network": { - "title": "Red", - "desc": "HTTP y acceso público" - }, - "cors": { - "title": "CORS", - "desc": "Reglas de acceso de origen cruzado" - }, - "logging": { - "title": "Registro", - "desc": "Comportamiento de salida de logs" - }, - "storage": { - "title": "Almacenamiento y Caché", - "desc": "Rutas de base de datos y límites" - }, - "security": { - "title": "Seguridad", - "desc": "Autenticación y cifrado" - }, - "performance": { - "title": "Rendimiento", - "desc": "Concurrencia y compresión" - }, - "smtp": { - "title": "Servidor SMTP", - "desc": "Ajustes de recepción de correo entrante para el archivado en tiempo real" - } - } - }, - "apiTokens": { - "page": { - "loadError": "Error al cargar los tokens API.", - "emptyTitle": "Sin tokens API", - "emptyDescription": "Aún no has creado ningún token API. Haz clic abajo para crear uno.", - "addBtn": "Añadir token" - }, - "list": { - "unnamedToken": "Token sin nombre", - "statusActive": "Activo", - "statusExpired": "Expirado", - "neverExpires": "Nunca expira", - "expiresOnShort": "Expira el {{date}}", - "tokenLabel": "Token", - "createdLabel": "Creado el", - "lastUsedLabel": "Último uso", - "expiresOnLabel": "Expira el", - "neverUsed": "Nunca", - "neverLabel": "Nunca", - "deleteBtn": "Eliminar token" - }, - "dialog": { - "createTitle": "Crear token de acceso", - "editTitle": "Editar token de acceso", - "description": "Haz clic en guardar cuando hayas terminado.", - "save": "Guardar", - "saveChanges": "Guardar cambios" - }, - "deleteDialog": { - "title": "¿Eliminar token de acceso?", - "description": "Esta acción no se puede deshacer. Cualquier aplicación que use este token perderá el acceso inmediatamente.", - "cancel": "Cancelar", - "confirm": "Eliminar", - "deleting": "Eliminando..." - }, - "form": { - "nameLabel": "Nombre", - "namePlaceholder": "Dale a este token un nombre corto", - "nameDescription": "Opcional · Máx. 32 caracteres", - "expirationLabel": "Expiración", - "expirationPlaceholder": "Seleccionar expiración", - "expirationDescription": "Los tokens expirarán automáticamente después del tiempo seleccionado.", - "never": "Nunca", - "1day": "1 día", - "7days": "7 días", - "30days": "30 días", - "errorMax": "Máx. 32 caracteres", - "errorNumber": "Debe ser un número", - "errorInt": "Debe ser un número entero", - "errorPositive": "Debe ser mayor que 0" - }, - "notifications": { - "createSuccess": "Token de acceso creado", - "createSuccessDesc": "El token de acceso se ha creado correctamente.", - "updateSuccess": "Token de acceso actualizado", - "updateSuccessDesc": "El token de acceso se ha actualizado correctamente.", - "createFailed": "Error al crear", - "updateFailed": "Error al actualizar", - "deleteSuccess": "Token de acceso eliminado correctamente", - "deleteFailed": "Error al eliminar el token", - "copied": "Copiado al portapapeles", - "genericError": "Operación fallida. Por favor, inténtalo de nuevo.", - "close": "Cerrar", - "tryAgain": "Reintentar" - } - }, - "permission": { - "scope": { - "global": "Global", - "account": "Cuenta #{{id}}" - }, - "dialog": { - "global_title": "Permisos globales", - "account_title": "Permisos de cuenta", - "global_description": "Permisos de todo el sistema otorgados a este usuario.", - "account_description": "Permisos limitados a la cuenta seleccionada." - }, - "category": { - "system_identity": "Sistema e identidad", - "global_data": "Datos globales (Admin)", - "account": "Permisos de cuenta" - }, - "system": { - "access": "Acceso básico al sistema", - "root": "Control total del sistema" - }, - "user": { - "manage": "Gestionar todos los usuarios", - "view": "Ver nombres de usuario básicos" - }, - "token": { - "manage": "Gestionar tokens de acceso" - }, - "account": { - "create": "Crear cuentas de correo", - "manage": "Gestionar cuentas asignadas", - "manage_all": "Gestionar todas las configuraciones de cuentas", - "read_details": "Leer detalles de la cuenta" - }, - "data": { - "read": "Leer datos de correo asignados", - "read_all": "Leer todos los datos de correo", - "manage": "Gestionar metadatos de correo asignados", - "manage_all": "Gestionar todos los metadatos de correo", - "raw_download": "Descargar correos sin procesar asignados", - "raw_download_all": "Descargar todos los correos sin procesar", - "delete": "Eliminar correos asignados", - "delete_all": "Eliminar correos de todas las cuentas", - "export_batch": "Exportar datos asignados por lotes", - "export_batch_all": "Exportar todos los datos por lotes", - "import_batch": "Importar datos de correo por lotes", - "smtp_ingest": "Ingerir correos electrónicos a través del protocolo SMTP" - } - }, - "users": { - "columns": { - "id": "ID", - "avatar": "Avatar", - "username": "Nombre de usuario", - "email": "Correo electrónico", - "roles": "Roles y permisos", - "created_at": "Creado el", - "updated_at": "Actualizado el", - "actions": "Acciones" - }, - "buttons": { - "add": "Añadir usuario", - "add_new": "Nuevo usuario" - }, - "empty": { - "title": "No se encontraron usuarios", - "description": "Haga clic en el botón de abajo para añadir su primer usuario." - }, - "nav": { - "users": "Usuarios", - "roles": "Roles", - "api_tokens": "Tokens de API" - }, - "api_tokens": { - "empty": { - "title": "No se encontraron tokens de API", - "description": "Aún no se han generado tokens de API en el sistema." - }, - "button": { - "generate": "Generar nuevo token" - }, - "toolbar": { - "search_placeholder": "Buscar por nombre, propietario o token..." - }, - "table": { - "name": "Nombre", - "type": "Tipo", - "last_used": "Último uso", - "expires_at": "Expira el", - "owner": "Propietario", - "created": "Creado", - "api_key": "Clave API", - "web_ui": "Interfaz Web", - "never": "Nunca", - "permanent": "Permanente", - "expired": "Expirado", - "unnamed": "Token sin nombre" - }, - "unnamed": "Token sin nombre", - "delete": { - "title": "Eliminar token de API", - "desc": "Está a punto de eliminar este token de API de forma permanente", - "prefix": "Prefijo del token", - "irreversible": "Esta acción no se puede deshacer. Cualquier aplicación que utilice este token perderá el acceso de inmediato.", - "confirm_label": "Para confirmar, escriba {{word}} a continuación:", - "confirm_placeholder": "Escriba \"{{word}}\" para confirmar", - "warning_title": "Advertencia", - "warning_desc": "Cualquier script o servicio que utilice este token fallará. Asegúrese de haber actualizado sus sistemas.", - "confirm_button": "Eliminar token", - "deleting": "Eliminando..." - }, - "toast": { - "deleted_title": "Token de API eliminado", - "deleted_desc": "El token \"{{name}}\" ha sido eliminado con éxito.", - "delete_failed_title": "Error al eliminar", - "delete_failed": "No se pudo eliminar el token, inténtelo de nuevo." - } - }, - "tokens": { - "schema": { - "name_max": "Máximo 32 caracteres", - "expire_number": "Debe ser un número", - "expire_int": "Debe ser un número entero", - "expire_positive": "Debe ser mayor que 0" - }, - "toast": { - "update_success_title": "Token actualizado", - "update_success_desc": "Token de acceso actualizado con éxito.", - "create_success_title": "Token creado", - "create_success_desc": "Token de acceso creado con éxito.", - "update_failed_title": "Error al actualizar", - "create_failed_title": "Error al crear" - }, - "error": { - "fallback": "La operación falló, inténtelo de nuevo más tarde." - }, - "dialog": { - "edit_title": "Editar token de acceso", - "create_title": "Crear token de acceso", - "description": "Haga clic en guardar al terminar." - }, - "fields": { - "name_label": "Nombre", - "name_placeholder": "Asigne un nombre corto al token", - "name_hint": "Opcional · Máx 32 caracteres", - "expire_label": "Expiración", - "expire_placeholder": "Elija la expiración", - "expire_hint": "El token expirará automáticamente después del tiempo seleccionado." - }, - "expire_options": { - "never": "Nunca expira", - "1_day": "1 día", - "7_days": "7 días", - "30_days": "30 días" - } - }, - "tokens_action": { - "dialog": { - "title": "Tokens de API", - "description": "Administrar tokens de API para este usuario." - }, - "empty": { - "title": "Sin tokens de API", - "description": "Este usuario no tiene tokens de API en este momento." - }, - "buttons": { - "add": "Añadir token" - }, - "list": { - "unnamed_token": "Token sin nombre", - "status_expired": "Expirado", - "status_active": "Activo", - "expires_on_brief": "Expira el {{date}}", - "never_expires": "Nunca expira", - "label_token": "Token", - "label_created": "Creado el", - "label_last_used": "Último uso", - "label_expires_at": "Fecha de expiración", - "never": "Nunca", - "button_delete": "Eliminar token" - }, - "delete_dialog": { - "title": "¿Eliminar token de acceso?", - "description": "Esta acción es irreversible." - } - }, - "actions": { - "schema": { - "account_required": "Seleccione una cuenta", - "role_required": "Seleccione un rol", - "username_required": "El nombre de usuario es obligatorio", - "username_min": "Mínimo 3 caracteres", - "username_max": "Máximo 32 caracteres", - "email_required": "El correo es obligatorio", - "email_invalid": "Ingrese un correo válido", - "global_role_required": "Asigne al menos un rol global", - "description_max": "Descripción máx 256 caracteres", - "ip_invalid": "Dirección IP inválida", - "password_required": "La contraseña es obligatoria", - "password_min": "Mínimo 8 caracteres", - "password_max": "Máximo 256 caracteres" - }, - "toast": { - "updated": "Usuario actualizado", - "created": "Usuario creado" - }, - "dialog": { - "edit_title": "Editar usuario: {{name}}", - "create_title": "Crear nuevo usuario", - "subtitle": "Configure identidad, niveles de acceso y políticas de seguridad." - }, - "tabs": { - "general": "General", - "permissions": "Permisos de cuenta", - "security": "Seguridad y ACL" - }, - "sections": { - "basic": "Identidad básica", - "global": "Permisos globales", - "mail_access": "Control de acceso de correo", - "mail_access_subtitle": "Cuentas de correo que este usuario puede administrar.", - "policy": "Políticas" - }, - "fields": { - "username": "Nombre de usuario", - "username_hint": "Identificador único para el inicio de sesión.", - "email": "Correo electrónico", - "email_hint": "Contacto principal y notificaciones.", - "password": "Contraseña", - "password_placeholder_create": "Mínimo 8 caracteres", - "password_placeholder_edit": "Dejar vacío para mantener la actual", - "password_hint_create": "Contraseña segura para la configuración inicial.", - "password_hint_edit": "Ingrese una nueva solo si desea cambiarla.", - "global_roles_hint": "Asigne permisos de sistema.", - "description": "Descripción (opcional)", - "description_placeholder": "Notas sobre este usuario...", - "description_hint": "Notas internas (máx 256 caracteres).", - "select_account": "Elegir cuenta", - "assign_role": "Asignar rol", - "ip_whitelist": "Lista blanca de IP", - "ip_whitelist_hint": "Restringir inicio de sesión a estas IP (una por línea).", - "rate_quota": "Cuota de tasa", - "burst_interval": "Intervalo de ráfaga (seg)" - }, - "buttons": { - "add_account": "Añadir cuenta", - "update": "Actualizar usuario", - "create": "Crear usuario" - }, - "states": { - "full_access": "Modo de acceso completo", - "full_access_desc": "Los administradores tienen acceso a todas las cuentas por defecto.", - "no_accounts": "No se han asignado cuentas específicas.", - "security_disabled": "Las políticas de seguridad están desactivadas." - }, - "api_tokens": "Tokens de API", - "placeholder": { - "filter": "Buscar usuarios..." - }, - "delete": { - "title": "Eliminar usuario", - "confirm_msg": "Está eliminando al usuario {{name}} (ID: {{id}}) de forma permanente.", - "irreversible": "Esta acción es irreversible.", - "input_label": "Escriba el ID de usuario para confirmar:", - "placeholder": "Escriba \"{{id}}\"", - "alert_title": "Atención: Acción permanente.", - "alert_desc": "El usuario y todos los datos relacionados serán borrados.", - "button_confirm": "Eliminar usuario", - "button_deleting": "Eliminando...", - "toast": { - "success_title": "Usuario eliminado", - "success_desc": "El usuario \"{{name}}\" ha sido removido.", - "failed_title": "Error al eliminar", - "failed_fallback": "No se pudo eliminar al usuario." - } - } - } - }, - "roles": { - "title": { - "create": "Crear nuevo rol", - "edit": "Editar rol: {{name}}" - }, - "description_hint": "Defina el alcance de acceso y los permisos.", - "form": { - "name_label": "Nombre del rol", - "type_label": "Tipo de rol", - "desc_label": "Descripción", - "matrix_label": "Matriz de permisos ({{type}})", - "builtin_badge": "Rol del sistema", - "builtin_desc": "Este rol está predefinido y es de solo lectura." - }, - "types": { - "Global": "Global", - "Account": "Cuenta" - }, - "categories": { - "identity": "Identidad y Gestión", - "global_data": "Acceso a datos globales", - "account_resource": "Acceso a recursos de cuenta" - }, - "actions": { - "cancel": "Cancelar", - "submit_create": "Crear rol", - "submit_update": "Actualizar rol", - "success_create": "Rol creado con éxito", - "success_update": "Rol actualizado con éxito", - "failed": "La operación falló", - "close": "Cerrar", - "retry": "Reintentar", - "add": "Añadir rol" - }, - "validation": { - "name_required": "El nombre del rol es obligatorio", - "perm_required": "Seleccione al menos un permiso" - }, - "columns": { - "id": "ID", - "name": "Nombre", - "role_type": "Tipo", - "permissions": "Permisos", - "created_at": "Creado el", - "updated_at": "Actualizado el" - }, - "placeholder": { - "filter": "Buscar roles..." - }, - "delete": { - "dialog_title": "Eliminar rol", - "warning_text": "Está eliminando el rol {{name}} (ID: {{id}}) de forma permanente.", - "irreversible": "Esta acción no se puede deshacer.", - "confirm_label": "Escriba el ID del rol para confirmar:", - "placeholder": "Escriba \"{{id}}\"", - "alert_title": "Atención: Acción permanente.", - "alert_desc": "Eliminar este rol lo quitará de todos los usuarios a los que esté asignado.", - "confirm_btn": "Eliminar rol", - "deleting": "Eliminando...", - "success_title": "Rol eliminado", - "success_desc": "El rol \"{{name}}\" ha sido removido.", - "error_title": "Error al eliminar", - "error_fallback": "No se pudo eliminar el rol." - }, - "details": { - "title": "Permisos: {{name}}", - "unknown": "Rol desconocido", - "role_badge": "Rol {{type}}", - "desc_global": "Gestión global y acceso al sistema.", - "desc_account": "Acceso y acciones de datos para cuentas individuales.", - "close_btn": "Cerrar", - "view_permissions": "Ver detalles" - }, - "empty": { - "title": "No se encontraron roles", - "desc": "Aún no ha creado ningún rol personalizado." - } - }, - "profile": { - "avatar_alt": "Avatar", - "menu": { - "profile": "Perfil", - "settings": "Configuración", - "sign_out": "Cerrar sesión" - } - }, - "sign_out": { - "title": "Cerrar sesión", - "desc": "¿Está seguro de que desea cerrar sesión? Necesitará iniciar sesión nuevamente para acceder a su cuenta.", - "confirm": "Cerrar sesión" - }, - "restore_message": { - "title": "Restaurar mensaje individual", - "bulkTitle": "Restaurar múltiples mensajes", - "bulkWarning": "Nota: Los mensajes se restaurarán en sus carpetas originales.", - "accountsInvolved": "Cuentas involucradas", - "summary": "Detalles de restauración", - "messages": "mensajes", - "desc": "Esta acción volverá a cargar los mensajes seleccionados desde Bichon y los restaurará en sus buzones correspondientes en el servidor IMAP.", - "confirm": "Ejecutar restauración", - "restore_to_imap": "Restaurar mensaje", - "success": "Restauración exitosa", - "successDesc": "Los mensajes seleccionados se han restaurado correctamente en el servidor IMAP.", - "failed": "Error al restaurar", - "failedTitle": "Fallo en la restauración" - }, - "time": { - "label": "Tiempo", - "since": "Desde", - "before": "Antes de", - "recent_range": "Rango reciente (desde...)", - "historical": "Rango histórico (antes de...)", - "absolute_range": "Rango de fechas absoluto", - "last_day": "Último 1 día", - "last_days": "Últimos {{count}} días", - "last_months": "Últimos {{count}} meses", - "over_years_ago": "Hace {{count}} {{unit}}", - "year": "año", - "years": "años", - "recent_prefix": "Reciente:", - "days_ago_to_now": "días atrás hasta ahora", - "apply": "Aplicar", - "start_date": "Fecha de inicio", - "end_date": "Fecha de fin", - "clear_filters": "Borrar filtros de tiempo", - "format": "yyyy-MM-dd" - }, - "tag": { - "label": "Etiquetas", - "search_placeholder": "Buscar etiquetas...", - "clear_all": "Borrar todas las etiquetas", - "no_tags_found": "No se encontraron etiquetas" - }, - "search_accounts": { - "label": "Cuentas de correo", - "search_placeholder": "Buscar cuentas de correo...", - "clear_accounts": "Borrar cuentas seleccionadas", - "no_accounts_found": "No se encontraron cuentas" - }, - "search_mailbox": { - "label": "Buzones", - "search_placeholder": "Buscar buzones", - "clear_mailboxes": "Borrar carpetas seleccionadas", - "select_account_first": "Seleccione primero una cuenta de correo", - "no_mailbox_found": "No se encontró ningún buzón" - }, - "search_contacts": { - "label": "Contactos", - "label_with_count": "Contactos ({{count}})", - "any": "Cualquiera", - "search_placeholder": "Buscar {{field}}...", - "reset_all": "Restablecer todos los contactos", - "no_contact_found": "No se encontraron contactos", - "loading": "Cargando...", - "showing_limit": "Mostrando solo los primeros 100 resultados • Total {{total}}" - }, - "search_more": { - "trigger_label": "Avanzado", - "title": "Filtros avanzados", - "reset": "Restablecer", - "has_attachment": "Con archivo adjunto", - "attachment_name_label": "Nombre del archivo adjunto", - "attachment_name_placeholder": "Ej.: invoice.pdf", - "message_size_label": "Tamaño del mensaje", - "message_id_label": "Message-ID original", - "message_id_description": "Buscar usando el encabezado Message-ID del correo", - "apply": "Aplicar filtros", - "size_presets": { - "any": "Cualquier tamaño", - "tiny": "Muy pequeño (< 15 KB)", - "small": "Pequeño (< 2 MB)", - "medium": "Mediano (2 – 10 MB)", - "large": "Grande (10 – 20 MB)", - "huge": "Muy grande (> 20 MB)" - }, - "any": "Cualquiera", - "search_placeholder": "Buscar {{field}}...", - "extension": "Extensión de archivo", - "category": "Categoría de adjunto", - "content_types": "Tipo específico" - }, - "search_view": { - "button_label": "Vista", - "menu_title": "Configuración de columnas" - }, - "search_reset": { - "label": "Restablecer", - "tooltip": "Eliminar todos los filtros" - }, - "search_input": { - "placeholder": "Buscar correos... (Soporta Regex)", - "button": "Buscar", - "recent_title": "Búsquedas recientes", - "clear_history": "Borrar historial", - "no_history": "Sin historial de búsqueda", - "all": "Todo", - "all_fields_desc": "Coincide con asunto, cuerpo, remitente y destinatarios", - "subject": "Asunto", - "body": "Cuerpo del mensaje" + "name_required": "El nombre del rol es obligatorio", + "perm_required": "Seleccione al menos un permiso" } + }, + "search": { + "account": "Cuenta", + "addEmailAccount": "Añadir cuenta de correo electrónico", + "addTags": { + "cancel": "Cancelar", + "createHint": "Crear nueva etiqueta: {{tag}}", + "invalidTitle": "Etiqueta inválida", + "none": "Aún no hay etiquetas añadidas", + "save": "Guardar", + "saving": "Guardando...", + "searchPlaceholder": "Buscar o crear etiquetas...", + "selectedCount": "{{count}} etiqueta(s) seleccionada(s)", + "title": "Editar etiquetas", + "tryAgain": "Inténtalo de nuevo más tarde", + "updateFailedTitle": "Error al actualizar", + "updatedDesc": "Las etiquetas han sido actualizadas con éxito", + "updatedTitle": "Etiquetas actualizadas" + }, + "adjustSearch": "Intenta ajustar tus criterios de búsqueda o borra los filtros.", + "advanced": "Avanzado", + "advancedFilters": "Filtros avanzados", + "any": "Cualquiera", + "attachmentName": "Nombre del adjunto", + "attachmentsSize": "Adjuntos y tamaño", + "bcc": "CCO", + "before": "Antes de:", + "bulkActions": { + "ariaLabel": "{{count}} mensajes seleccionados. Barra de herramientas", + "clear": "Limpiar selección", + "delete": "Eliminar", + "deleteDesc": "Eliminar seleccionados", + "manageTags": "Administrar etiquetas", + "selected": "{{count}} seleccionado(s)" + }, + "cc": "CC", + "clear": "Borrar", + "date": "Fecha", + "dateRange": "Rango de fechas", + "delete": { + "confirmButton": "Eliminar", + "confirmDetail": "Esta acción no se puede deshacer.", + "confirmPrefix": "¿Eliminar", + "countLabel": "{{count}} mensaje(s)?", + "errorTitle": "Error al eliminar", + "successDesc": "Eliminado con éxito.", + "successTitle": "Eliminados", + "title": "Eliminar mensajes", + "warningDesc": "Los mensajes se eliminarán permanentemente.", + "warningTitle": "Advertencia" + }, + "editTag": "Editar etiqueta", + "endDate": "Fecha de finalización", + "from": "De", + "fullTextMultiAccount": "Texto completo · Multi-cuenta · Filtros avanzados", + "hasAttachment": "Tiene adjunto", + "huge": "Muy grande (≥20 MB)", + "keyword": "Palabra clave", + "large": "Grande (10 - 20 MB)", + "mailbox": "Buzón", + "maxSize": "Tamaño máx.", + "maximumBytes": "Máximo (bytes)", + "medium": "Mediano (2 - 10 MB)", + "messageId": "ID del mensaje", + "minSize": "Tamaño mín.", + "minimumBytes": "Mínimo (bytes)", + "no": "No", + "noActiveEmailAccount": "No hay cuenta de correo electrónico activa.", + "noEmailsFound": "No se encontraron correos electrónicos", + "noMailboxSelectAccount": "No hay buzón. Por favor, selecciona una cuenta primero.", + "originalMessageIdHeader": "Encabezado Message-ID del correo original", + "pleaseSelectAtLeastOne": "Por favor, selecciona al menos un criterio de búsqueda", + "preview": "Vista previa", + "recipient": "Destinatario", + "searchArchivedEmails": "Buscar en correos archivados", + "searchButton": "Buscar", + "searchInSubjectBody": "Buscar en asunto, cuerpo, adjuntos...", + "searching": "Buscando, por favor espera...", + "searchingButton": "Buscando...", + "selectAccount": "Seleccionar cuenta", + "selectDate": "Seleccionar fecha", + "selectMailbox": "Seleccionar buzón", + "sender": "Remitente", + "senderRecipients": "Remitente / Destinatarios", + "since": "Desde:", + "size": "Tamaño", + "sizeDescription": "El tamaño se refiere al tamaño total del correo electrónico, incluidos los archivos adjuntos.", + "small": "Pequeño (<2 MB)", + "sort": "Ordenar", + "source": "Fuente", + "startDate": "Fecha de inicio", + "startSearching": "Empieza a buscar por palabra clave, remitente o usa filtros avanzados.", + "subject": "Asunto", + "tagFilter": "Filtro de etiquetas", + "thread": { + "empty": "No hay mensajes en este hilo", + "error": "Error al cargar el hilo", + "invalidDate": "Fecha inválida", + "loadMore": "Cargar más", + "loadingMore": "Cargando...", + "noSubject": "(Sin asunto)", + "title": "Hilo de conversación · {{count}} mensajes" + }, + "tiny": "Muy pequeño (<15 KB)", + "title": "Buscar", + "to": "Para", + "updateTags": { + "actionAdd": "Añadir", + "actionOverwrite": "Sobrescribir", + "actionRemove": "Eliminar", + "cancel": "Cancelar", + "createHint": "Presione Enter para crear una nueva etiqueta: \"{{tag}}\"", + "invalidTitle": "Etiqueta inválida", + "none": "No hay etiquetas seleccionadas", + "overwriteWarning": "Advertencia: esto sobrescribirá todas las etiquetas existentes en los elementos seleccionados.", + "savingAdd": "Añadiendo...", + "savingOverwrite": "Sobrescribiendo...", + "savingRemove": "Eliminando...", + "searchPlaceholder": "Buscar o crear nueva etiqueta...", + "selectedCount": "{{count}} etiqueta(s) a aplicar", + "submitAdd": "Añadir etiquetas", + "submitOverwrite": "Sobrescribir etiquetas", + "submitRemove": "Eliminar etiquetas", + "title": "Actualizar etiquetas", + "tryAgain": "Por favor, inténtelo de nuevo más tarde.", + "updateFailedTitle": "Error al actualizar", + "updatedDesc": "Las etiquetas se han actualizado con éxito.", + "updatedTitle": "Etiquetas actualizadas" + }, + "yes": "Sí" + }, + "search_accounts": { + "clear_accounts": "Borrar cuentas seleccionadas", + "label": "Cuentas de correo", + "no_accounts_found": "No se encontraron cuentas", + "search_placeholder": "Buscar cuentas de correo..." + }, + "search_contacts": { + "any": "Cualquiera", + "label": "Contactos", + "label_with_count": "Contactos ({{count}})", + "loading": "Cargando...", + "no_contact_found": "No se encontraron contactos", + "reset_all": "Restablecer todos los contactos", + "search_placeholder": "Buscar {{field}}...", + "showing_limit": "Mostrando solo los primeros 100 resultados • Total {{total}}" + }, + "search_input": { + "all": "Todo", + "all_fields_desc": "Coincide con asunto, cuerpo, remitente y destinatarios", + "body": "Cuerpo del mensaje", + "button": "Buscar", + "clear_history": "Borrar historial", + "no_history": "Sin historial de búsqueda", + "placeholder": "Buscar correos (use \" \" para búsqueda de frases)", + "recent_title": "Búsquedas recientes", + "subject": "Asunto" + }, + "search_mailbox": { + "clear_mailboxes": "Borrar carpetas seleccionadas", + "label": "Buzones", + "no_mailbox_found": "No se encontró ningún buzón", + "search_placeholder": "Buscar buzones", + "select_account_first": "Seleccione primero una cuenta de correo" + }, + "search_more": { + "any": "Cualquiera", + "apply": "Aplicar filtros", + "attachment_name_label": "Nombre del archivo adjunto", + "attachment_name_placeholder": "Ej.: invoice.pdf", + "category": "Categoría de adjunto", + "content_type": "Tipo de archivo", + "extension": "Extensión de archivo", + "has_attachment": "Con archivo adjunto", + "is_message": "Adjunto formato e-mail", + "is_message_desc": "Este adjunto es un archivo de correo, por ejemplo, un archivo .eml.", + "message_id_description": "Buscar usando el encabezado Message-ID del correo", + "message_id_label": "Message-ID original", + "message_size_label": "Tamaño del mensaje", + "reset": "Restablecer", + "search_placeholder": "Buscar {{field}}...", + "size_presets": { + "any": "Cualquier tamaño", + "huge": "Muy grande (> 20 MB)", + "large": "Grande (10 – 20 MB)", + "medium": "Mediano (2 – 10 MB)", + "small": "Pequeño (< 2 MB)", + "tiny": "Muy pequeño (< 15 KB)" + }, + "title": "Filtros avanzados", + "trigger_label": "Avanzado" + }, + "search_reset": { + "label": "Restablecer", + "tooltip": "Eliminar todos los filtros" + }, + "search_view": { + "button_label": "Vista", + "menu_title": "Configuración de columnas" + }, + "settings": { + "accounts": "Cuentas", + "acl": "ACL", + "actions": "Acciones", + "add": "Añadir", + "addNewProxyHere": "Añade un nuevo proxy aquí. ", + "adding": "Añadiendo...", + "appearance": { + "button": { + "update": "Actualizar preferencias" + }, + "command": { + "no_results": "No se encontró el idioma.", + "search": "Buscar idioma..." + }, + "description": { + "language": "Seleccione el idioma de la interfaz web.", + "theme": "Elija entre el modo claro u oscuro." + }, + "field": { + "language": "Idioma de la interfaz", + "theme": "Tema de la interfaz" + }, + "placeholder": { + "select_language": "Seleccionar idioma" + }, + "theme": { + "dark": "Oscuro", + "light": "Claro" + }, + "title": "Apariencia", + "validation": { + "language": { + "required": "Por favor, seleccione un idioma." + }, + "theme": { + "required": "Por favor, seleccione un tema." + } + } + }, + "authUrl": "URL de autorización", + "changePasswordForFutureLogins": "Cambiar la contraseña para futuros inicios de sesión.", + "confirmReset": "Confirmar restablecimiento", + "createdAt": "Creado el", + "delete": "Eliminar", + "description": "Descripción", + "edit": "Editar", + "enabled": "Habilitado", + "enterNewRootPassword": "Introduce la nueva contraseña raíz", + "enterProxyIdToConfirmDeletion": "Introduce el ID del proxy para confirmar la eliminación.", + "failedToCopyText": "Error al copiar el texto", + "filterAccessToken": "Filtrar tokens de acceso...", + "filterAccount": "Filtrar cuentas...", + "filterOauth2": "Filtrar OAuth2...", + "filterProxy": "Filtrar proxies...", + "general": "General", + "generateNewToken": "Generar un nuevo token, el antiguo caducará inmediatamente.", + "host": "Host", + "id": "Id", + "invalidPassword": "Contraseña inválida", + "lastAccess": "Último acceso", + "manageRootTokenAndPassword": "Gestiona de forma segura el token y la contraseña del usuario raíz.", + "name": "Nombre", + "noProxies": "Sin proxies", + "noProxiesDesc": "Aún no has añadido configuraciones de proxy. Añade una para usar las funcionalidades de proxy.", + "password": "Contraseña", + "pleaseUseAnIpAddressForBetterReliability": "Utiliza una dirección IP (ej. 127.0.0.1) en lugar de un nombre de host o dominio para una mejor fiabilidad.", + "port": "Puerto", + "profile": { + "account": { + "id": "ID de cuenta: {{id}}" + }, + "avatarAlt": "Avatar", + "button": { + "permissions": "Permisos", + "update_profile": "Actualizar perfil", + "view_global_permissions": "Ver permisos globales" + }, + "field": { + "email": "Correo electrónico", + "password": "Contraseña", + "username": "Nombre de usuario" + }, + "loadError": "No se pudo cargar la información del usuario.", + "maxSize": "Hasta {{size}}", + "placeholder": { + "password_keep": "Déjelo en blanco para mantener la contraseña actual" + }, + "removeAvatar": "Eliminar avatar", + "section": { + "accounts": "{{count}} cuentas vinculadas", + "roles": "Roles" + }, + "toast": { + "update_failed": "No se pudo actualizar el perfil", + "updated": "Perfil actualizado correctamente" + }, + "uploadError": "Error(es) al subir el archivo", + "uploadTitle": "Subir avatar", + "validation": { + "email": { + "invalid": "Por favor, introduce una dirección de correo electrónico válida", + "required": "El correo electrónico es obligatorio" + }, + "password": { + "max": "La contraseña debe tener como máximo 256 caracteres", + "min": "La contraseña debe tener al menos 8 caracteres" + }, + "username": { + "max": "El nombre de usuario debe tener como máximo 32 caracteres", + "min": "El nombre de usuario debe tener al menos 5 caracteres", + "required": "El nombre de usuario es obligatorio" + } + } + }, + "proxy": "Proxy", + "proxyUpdateOrAddFailed": "Error al {{action}} el proxy, por favor, inténtalo de nuevo más tarde", + "reset": "Restablecer", + "resetRootPassword": "Restablecer contraseña raíz", + "resetRootToken": "Restablecer token raíz", + "root": "Raíz", + "rootAccessManagement": "Gestión de acceso de usuario raíz", + "rootDesc": "Gestiona las credenciales de inicio de sesión del usuario raíz, incluido el token y la contraseña.", + "rootPasswordMustBeAtLeast6Characters": "La contraseña raíz debe tener al menos 6 caracteres.", + "rootTitle": "Usuario raíz", + "selectAll": "Seleccionar todo", + "sidebar": { + "apiTokens": "Tokens API", + "configurations": "Configuraciones del sistema", + "profile": "Perfil", + "proxy": "Proxy de red" + }, + "theRootPasswordHasBeenReset": "La contraseña raíz ha sido restablecida", + "theRootTokenHasBeenReset": "El token raíz ha sido restablecido", + "theme": "Tema", + "title": "Configuración", + "token": "Token", + "tokenUrl": "URL de token", + "type": "Tipo", + "updateTheProxyHere": "Actualiza el proxy aquí. ", + "updatedAt": "Actualizado el", + "url": "Url", + "useNewPasswordForNextLogin": "Usa la nueva contraseña para el próximo inicio de sesión.", + "useProxy": "Usar proxy", + "username": "Nombre de usuario", + "youAreAboutToResetTheRootPassword": "Estás a punto de restablecer la contraseña raíz. Asegúrate de guardarla de forma segura.", + "youAreAboutToResetTheRootToken": "Estás a punto de restablecer el token raíz. Esta acción no se puede deshacer.", + "yourLoginInformationHasBeenUpdated": "Tu información de inicio de sesión ha sido actualizada. No necesitarás volver a iniciar sesión.", + "yourProxyHasBeenSuccessfully": "Tu proxy ha sido {{action}} con éxito." + }, + "sign_out": { + "confirm": "Cerrar sesión", + "desc": "¿Está seguro de que desea cerrar sesión? Necesitará iniciar sesión nuevamente para acceder a su cuenta.", + "title": "Cerrar sesión" + }, + "systemConfig": { + "pageDescription": "Estos parámetros se inicializan mediante indicadores CLI o variables de entorno. Actualmente son de solo lectura.", + "pageTitle": "Configuraciones a nivel de sistema", + "sections": { + "cors": { + "desc": "Reglas de acceso de origen cruzado", + "title": "CORS" + }, + "logging": { + "desc": "Comportamiento de salida de logs", + "title": "Registro" + }, + "network": { + "desc": "HTTP y acceso público", + "title": "Red" + }, + "performance": { + "desc": "Concurrencia y compresión", + "title": "Rendimiento" + }, + "security": { + "desc": "Autenticación y cifrado", + "title": "Seguridad" + }, + "smtp": { + "desc": "Ajustes de recepción de correo entrante para el archivado en tiempo real", + "title": "Servidor SMTP" + }, + "storage": { + "desc": "Rutas de base de datos y límites", + "title": "Almacenamiento y Caché" + } + }, + "status": { + "auto": "Auto", + "configured": "Configurado", + "disabled": "Deshabilitado", + "enabled": "Habilitado", + "missing": "Faltante", + "notSet": "No establecido" + } + }, + "table": { + "asc": "Asc", + "delete": "Eliminar", + "desc": "Desc", + "edit": "Editar", + "hide": "Ocultar", + "loading": "Cargando...", + "noResults": "No se encontraron resultados", + "of": "de", + "page": "Página", + "pagination": { + "first": "Primera página", + "fixed_page_size": "{{size}} filas por página.", + "last": "Última página", + "next": "Página siguiente", + "page_info": "Página {{page}} de {{total}}", + "previous": "Página anterior", + "rows_per_page": "Filas por página", + "selected": "{{selected}} / {{total}} fila(s) seleccionada(s)." + }, + "results": "resultados", + "rowsPerPage": "Filas por página", + "showing": "Mostrando", + "to": "a" + }, + "tag": { + "clear_all": "Borrar todas las etiquetas", + "label": "Etiquetas", + "no_tags_found": "No se encontraron etiquetas", + "search_placeholder": "Buscar etiquetas..." + }, + "time": { + "absolute_range": "Rango de fechas absoluto", + "apply": "Aplicar", + "before": "Antes de", + "clear_filters": "Borrar filtros de tiempo", + "days_ago_to_now": "días atrás hasta ahora", + "end_date": "Fecha de fin", + "format": "yyyy-MM-dd", + "historical": "Rango histórico (antes de...)", + "label": "Tiempo", + "last_day": "Último 1 día", + "last_days": "Últimos {{count}} días", + "last_months": "Últimos {{count}} meses", + "over_years_ago": "Hace {{count}} {{unit}}", + "recent_prefix": "Reciente:", + "recent_range": "Rango reciente (desde...)", + "since": "Desde", + "start_date": "Fecha de inicio", + "year": "año", + "years": "años" + }, + "users": { + "actions": { + "api_tokens": "Tokens de API", + "buttons": { + "add_account": "Añadir cuenta", + "create": "Crear usuario", + "update": "Actualizar usuario" + }, + "delete": { + "alert_desc": "El usuario y todos los datos relacionados serán borrados.", + "alert_title": "Atención: Acción permanente.", + "button_confirm": "Eliminar usuario", + "button_deleting": "Eliminando...", + "confirm_msg": "Está eliminando al usuario {{name}} (ID: {{id}}) de forma permanente.", + "input_label": "Escriba el ID de usuario para confirmar:", + "irreversible": "Esta acción es irreversible.", + "placeholder": "Escriba \"{{id}}\"", + "title": "Eliminar usuario", + "toast": { + "failed_fallback": "No se pudo eliminar al usuario.", + "failed_title": "Error al eliminar", + "success_desc": "El usuario \"{{name}}\" ha sido removido.", + "success_title": "Usuario eliminado" + } + }, + "dialog": { + "create_title": "Crear nuevo usuario", + "edit_title": "Editar usuario: {{name}}", + "subtitle": "Configure identidad, niveles de acceso y políticas de seguridad." + }, + "fields": { + "assign_role": "Asignar rol", + "burst_interval": "Intervalo de ráfaga (seg)", + "description": "Descripción (opcional)", + "description_hint": "Notas internas (máx 256 caracteres).", + "description_placeholder": "Notas sobre este usuario...", + "email": "Correo electrónico", + "email_hint": "Contacto principal y notificaciones.", + "global_roles_hint": "Asigne permisos de sistema.", + "ip_whitelist": "Lista blanca de IP", + "ip_whitelist_hint": "Restringir inicio de sesión a estas IP (una por línea).", + "password": "Contraseña", + "password_hint_create": "Contraseña segura para la configuración inicial.", + "password_hint_edit": "Ingrese una nueva solo si desea cambiarla.", + "password_placeholder_create": "Mínimo 8 caracteres", + "password_placeholder_edit": "Dejar vacío para mantener la actual", + "rate_quota": "Cuota de tasa", + "select_account": "Elegir cuenta", + "username": "Nombre de usuario", + "username_hint": "Identificador único para el inicio de sesión." + }, + "placeholder": { + "filter": "Buscar usuarios..." + }, + "schema": { + "account_required": "Seleccione una cuenta", + "description_max": "Descripción máx 256 caracteres", + "email_invalid": "Ingrese un correo válido", + "email_required": "El correo es obligatorio", + "global_role_required": "Asigne al menos un rol global", + "ip_invalid": "Dirección IP inválida", + "password_max": "Máximo 256 caracteres", + "password_min": "Mínimo 8 caracteres", + "password_required": "La contraseña es obligatoria", + "role_required": "Seleccione un rol", + "username_max": "Máximo 32 caracteres", + "username_min": "Mínimo 3 caracteres", + "username_required": "El nombre de usuario es obligatorio" + }, + "sections": { + "basic": "Identidad básica", + "global": "Permisos globales", + "mail_access": "Control de acceso de correo", + "mail_access_subtitle": "Cuentas de correo que este usuario puede administrar.", + "policy": "Políticas" + }, + "states": { + "full_access": "Modo de acceso completo", + "full_access_desc": "Los administradores tienen acceso a todas las cuentas por defecto.", + "no_accounts": "No se han asignado cuentas específicas.", + "security_disabled": "Las políticas de seguridad están desactivadas." + }, + "tabs": { + "general": "General", + "permissions": "Permisos de cuenta", + "security": "Seguridad y ACL" + }, + "toast": { + "created": "Usuario creado", + "updated": "Usuario actualizado" + } + }, + "api_tokens": { + "button": { + "generate": "Generar nuevo token" + }, + "delete": { + "confirm_button": "Eliminar token", + "confirm_label": "Para confirmar, escriba {{word}} a continuación:", + "confirm_placeholder": "Escriba \"{{word}}\" para confirmar", + "deleting": "Eliminando...", + "desc": "Está a punto de eliminar este token de API de forma permanente", + "irreversible": "Esta acción no se puede deshacer. Cualquier aplicación que utilice este token perderá el acceso de inmediato.", + "prefix": "Prefijo del token", + "title": "Eliminar token de API", + "warning_desc": "Cualquier script o servicio que utilice este token fallará. Asegúrese de haber actualizado sus sistemas.", + "warning_title": "Advertencia" + }, + "empty": { + "description": "Aún no se han generado tokens de API en el sistema.", + "title": "No se encontraron tokens de API" + }, + "table": { + "api_key": "Clave API", + "created": "Creado", + "expired": "Expirado", + "expires_at": "Expira el", + "last_used": "Último uso", + "name": "Nombre", + "never": "Nunca", + "owner": "Propietario", + "permanent": "Permanente", + "type": "Tipo", + "unnamed": "Token sin nombre", + "web_ui": "Interfaz Web" + }, + "toast": { + "delete_failed": "No se pudo eliminar el token, inténtelo de nuevo.", + "delete_failed_title": "Error al eliminar", + "deleted_desc": "El token \"{{name}}\" ha sido eliminado con éxito.", + "deleted_title": "Token de API eliminado" + }, + "toolbar": { + "search_placeholder": "Buscar por nombre, propietario o token..." + }, + "unnamed": "Token sin nombre" + }, + "buttons": { + "add": "Añadir usuario", + "add_new": "Nuevo usuario" + }, + "columns": { + "actions": "Acciones", + "avatar": "Avatar", + "created_at": "Creado el", + "email": "Correo electrónico", + "id": "ID", + "roles": "Roles y permisos", + "updated_at": "Actualizado el", + "username": "Nombre de usuario" + }, + "empty": { + "description": "Haga clic en el botón de abajo para añadir su primer usuario.", + "title": "No se encontraron usuarios" + }, + "nav": { + "api_tokens": "Tokens de API", + "roles": "Roles", + "users": "Usuarios" + }, + "tokens": { + "dialog": { + "create_title": "Crear token de acceso", + "description": "Haga clic en guardar al terminar.", + "edit_title": "Editar token de acceso" + }, + "error": { + "fallback": "La operación falló, inténtelo de nuevo más tarde." + }, + "expire_options": { + "1_day": "1 día", + "30_days": "30 días", + "7_days": "7 días", + "never": "Nunca expira" + }, + "fields": { + "expire_hint": "El token expirará automáticamente después del tiempo seleccionado.", + "expire_label": "Expiración", + "expire_placeholder": "Elija la expiración", + "name_hint": "Opcional · Máx 32 caracteres", + "name_label": "Nombre", + "name_placeholder": "Asigne un nombre corto al token" + }, + "schema": { + "expire_int": "Debe ser un número entero", + "expire_number": "Debe ser un número", + "expire_positive": "Debe ser mayor que 0", + "name_max": "Máximo 32 caracteres" + }, + "toast": { + "create_failed_title": "Error al crear", + "create_success_desc": "Token de acceso creado con éxito.", + "create_success_title": "Token creado", + "update_failed_title": "Error al actualizar", + "update_success_desc": "Token de acceso actualizado con éxito.", + "update_success_title": "Token actualizado" + } + }, + "tokens_action": { + "buttons": { + "add": "Añadir token" + }, + "delete_dialog": { + "description": "Esta acción es irreversible.", + "title": "¿Eliminar token de acceso?" + }, + "dialog": { + "description": "Administrar tokens de API para este usuario.", + "title": "Tokens de API" + }, + "empty": { + "description": "Este usuario no tiene tokens de API en este momento.", + "title": "Sin tokens de API" + }, + "list": { + "button_delete": "Eliminar token", + "expires_on_brief": "Expira el {{date}}", + "label_created": "Creado el", + "label_expires_at": "Fecha de expiración", + "label_last_used": "Último uso", + "label_token": "Token", + "never": "Nunca", + "never_expires": "Nunca expira", + "status_active": "Activo", + "status_expired": "Expirado", + "unnamed_token": "Token sin nombre" + } + } + }, + "validation": { + "emailRequired": "El correo electrónico es obligatorio", + "folderLimitMustBeAtLeast100": "El límite de carpetas debe ser de al menos 100", + "folderLimitMustBeNumber": "El límite de carpetas debe ser un número", + "imapHostCannotBeEmpty": "El host IMAP no puede estar vacío", + "imapHostRequired": "El host IMAP es obligatorio", + "imapPortMustBeLessThan65536": "El puerto IMAP debe ser menor que 65536", + "imapPortMustBePositive": "El puerto IMAP debe ser un número entero positivo", + "incrementalSyncMustBeAtLeast10": "El intervalo de sincronización incremental debe ser de al menos 10 minutos", + "incrementalSyncMustBeNumber": "El intervalo de sincronización incremental debe ser un número", + "invalidEmail": "Dirección de correo electrónico inválida", + "invalidUrl": "URL inválida", + "passwordMinLength": "La contraseña debe tener al menos {{min}} caracteres", + "passwordRequired": "La contraseña es obligatoria cuando el método de autenticación es Contraseña", + "pleaseEnterPassword": "Por favor, introduce tu contraseña", + "pleaseEnterUsernameOrEmail": "Por favor, introduzca su nombre de usuario o correo electrónico", + "required": "Este campo es obligatorio", + "singleRequestBatchSizeMustBeNumber": "El tamaño del lote debe ser un número", + "singleRequestBatchSizeTooLarge": "El tamaño del lote debe ser como máximo 200", + "singleRequestBatchSizeTooSmall": "El tamaño del lote debe ser al menos 10" + } } \ No newline at end of file diff --git a/web/src/locales/fi.json b/web/src/locales/fi.json index d39f951..76a95ea 100644 --- a/web/src/locales/fi.json +++ b/web/src/locales/fi.json @@ -1,1614 +1,1630 @@ { - "common": { - "submit": "Lähetä", + "accessTokens": { + "aListOfIpAddressesAllowed": "Luettelo IP-osoitteista, joilla on lupa käyttää resurssia. Syötä yksi IP-osoite riviä kohden. (Valinnainen)", + "accountId": "Tilin ID", + "accounts": "Tilit", + "aclRulesForAccessTokens": "ACL-säännöt kulkutunnuksille sisältävät IP-sallittujen luettelon tarkistuksen ja nopeusrajoituksen soveltamisen.", + "actions": { + "delete": "Poista", + "edit": "Muokkaa", + "openMenu": "Avaa valikko" + }, + "addNew": "Lisää uusi", + "atLeastOneAccountIsRequired": "Vähintään yksi tili on pakollinen.", + "create": "Luo", + "createNewAccessTokenHere": "Luo uusi kulkutunnus täällä.", + "created": "Luotu", + "createdAt": "Luotu", + "creating": "Luodaan...", + "creationFailed": "Luominen epäonnistui", + "delete": "Poista", + "describeThePurposeOfTheAccessToken": "Kuvaile kulkutunnuksen käyttötarkoitus", + "description": "Hallinnoi kulkuavaimia, niiden ACL-sääntöjä, IP-sallittujen luetteloita ja nopeusrajoitusasetuksia täällä.", + "descriptionMustNotExceed255Characters": "Kuvaus ei saa ylittää 255 merkkiä.", + "edit": "Muokkaa", + "editToken": "Muokkaa tunnusta", + "enterIntervalInSeconds": "Syötä väli sekunneissa, esim. 60", + "enterOneIpAddressPerLine": "Syötä yksi IP-osoite riviä kohden, esim.:\n192.168.1.1\n192.168.1.2", + "enterQuota": "Syötä kiintiö, esim. 100", + "expiresAt": "Vanhenee", + "filterByEmailAddressOrAccountId": "Suodata sähköpostiosoitteen tai tilin ID:n mukaan...", + "interval": "Väli", + "intervalMustBeAPositiveInteger": "Välin on oltava positiivinen kokonaisluku.", + "invalidIpAddressesFound": "Virheellisiä IP-osoitteita löydetty. Syötä kelvollisia IPv4- tai IPv6-osoitteita.", + "name": "Nimi", + "noTokens": "Ei kulkuavaimia", + "noTokensDesc": "Et ole vielä luonut kulkuavaimia. Luo yksi käyttääksesi API-toimintoja.", + "notUsedYet": "Ei käytetty vielä", + "quota": "Kiintiö", + "quotaMustBeAPositiveInteger": "Kiintiön on oltava positiivinen kokonaisluku.", + "save": "Tallenna", + "saveChanges": "Tallenna muutokset", + "saving": "Tallennetaan...", + "selectAccounts": "Valitse tilit", + "selectMultipleAccountsForTheAccessToken": "Valitse useita tilejä kulkutunnuksen valtuutusalueelle.", + "theListOfAccountsThatCanBeQueried": "Luettelo tileistä, joita voidaan kysellä kulkutunnuksella.", + "theMaximumNumberOfRequestsAllowed": "Suurin sallittu pyyntöjen määrä välin sisällä. (Valinnainen)", + "theTimeWindowForTheRateLimit": "Aikaikkuna (sekunneissa) nopeusrajoitukselle. (Valinnainen)", + "title": "Kulkuavaimet", + "token": "Tunnus", + "updateFailed": "Päivitys epäonnistui", + "updateOrCreationFailed": "{{action}} epäonnistui, yritä myöhemmin uudelleen", + "updateTheAccessTokenHere": "Päivitä kulkutunnus täällä.", + "updated": "Päivitetty", + "updating": "Päivitetään...", + "yourAccessTokenHasBeenSuccessfully": "Kulkutunnuksesi on {{action}} onnistuneesti." + }, + "accounts": { + "accessControl": "Pääsynhallinta", + "accessTokenCopiedToClipboard": "Kulkuavain kopioitu leikepöydälle", + "access_control": { + "buttons": { "cancel": "Peruuta", - "save": "Tallenna", - "save_changes": "Tallenna muutokset", - "delete": "Poista", - "edit": "Muokkaa", - "search": "Hae", - "add": "Lisää", - "remove": "Poista", - "create": "Luo", - "update": "Päivitä", - "confirm": "Vahvista", + "save": "Tallenna määritys" + }, + "description": "Määritä roolit ja valtuutetut käyttäjät kohteelle {{email}}", + "role_label": "Pääsyrooli", + "role_loading": "Ladataan rooleja...", + "role_placeholder": "Valitse rooli", + "title": "Tilin pääsynhallinta", + "toast": { + "failed_title": "Määritys epäonnistui", + "success_desc": "Oikeudet on määritetty onnistuneesti kohteelle {{email}}", + "success_title": "Määritys onnistui" + }, + "user_empty": "Käyttäjiä ei löytynyt", + "user_label": "Valitse valtuutetut käyttäjät", + "user_search_placeholder": "Hae käyttäjänimellä tai sähköpostilla...", + "user_selected_count": "Valittu: {{count}} käyttäjä(ä)", + "validation": { + "role_required": "Valitse määritettävä rooli", + "user_required": "Valitse vähintään yksi käyttäjä" + } + }, + "accountCreated": "Tili luotu", + "accountCreatedDesc": "Tilisi on luotu onnistuneesti.", + "accountCreationFailed": "Tilin luominen epäonnistui", + "accountDetails": "Tilin tiedot", + "accountHasBeenSuccessfully": "Tili on onnistuneesti {{action}}", + "accountSyncFoldersUpdateFailed": "Tilin synkronointikansioiden päivitys epäonnistui", + "accountSyncFoldersUpdated": "Tilin synkronointikansiot päivitetty", + "accountUpdateFailed": "Tilin päivitys epäonnistui", + "accountUpdated": "Tili päivitetty", + "accountUpdatedDesc": "Tilisi on päivitetty onnistuneesti.", + "actions": "Toiminnot", + "addAccount": "Lisää tili", + "addConfiguration": "Lisää määritys", + "addImap": "Lisää IMAP", + "addNewEmailAccountHere": "Lisää uusi sähköpostitili täällä. ", + "addNoSync": "Lisää NoSync", + "allMailFolderSelected": "Varoitus: 'Kaikki sähköpostit' -kansio valittu", + "allMailFolderSelectedDesc": "Kansioiden valitseminen, joilla on 'Kaikki sähköpostit' -attribuutti, johtaa todennäköisesti jo synkronoitujen viestien kahdentumiseen kansioista, kuten Saapuneet ja Lähetetyt. Tämä voi kuluttaa huomattavasti enemmän tallennustilaa.", + "allMailSkipped": "Oletuskansiot valittu. 'Kaikki sähköpostit' ohitettiin päällekkäisyyksien välttämiseksi.", + "areYouSureYouWantTo": "Haluatko varmasti {{action}} tämän tilin?", + "auth": "Todennus", + "authType": "todennustyyppi", + "autoConfiguring": "Automaattinen määritys...", + "beforeRelative": "Lataa vain vanhat sähköpostit", + "beforeRelativeValue": "Lataa sähköpostit {{value}} {{unit}} sitten", + "capabilities": "Ominaisuudet", + "chooseAuthMethod": "Valitse IMAP:lle käytettävä todennusmenetelmä.", + "chooseEncryptionMethod": "Valitse IMAP:lle käytettävä salausmenetelmä.", + "chooseMailboxesToDownload": "Valitse ladattavat postilaatikot käyttäjälle {{email}}. Uudet postilaatikot ladataan seuraavassa kierrossa.", + "clickHere": "napsauta tästä", + "clickSaveWhenDone": "Napsauta Tallenna, kun olet valmis.", + "continue": "Jatka", + "createdAt": "Luotu", + "creationFailed": "Luominen epäonnistui, yritä myöhemmin uudelleen", + "dateSelection": "Päivämäärän valinta", + "dateSince": "Päivämäärä alkaen", + "days": "Päivää", + "delete": "Poista", + "description": "Hallinnoi ja määritä sähköpostitilejäsi.", + "detail": "Tiedot", + "detailsOfTheOAuth2TokensForTheAccount": "Tilin OAuth2-tunnusten tiedot.", + "determinesWhetherThisAccountIsActiveNoSync": "Määrittää, onko tämä tili aktiivinen. Jos se on poistettu käytöstä, tietoja ei voi tuoda.", + "disable": "Poista käytöstä", + "disableAccount": "Poista tili käytöstä", + "disabled": "Poistettu käytöstä", + "downloadAll": "Lataa kaikki sähköpostit", + "downloadBatchSize": "Latauserän koko", + "downloadBatchSizeDescription": "IMAP-pyyntöä kohden noudettujen viestien määrä", + "downloadInterval": "Latausväli (minuuttia)", + "downloadIntervalPlaceholder": "Syötä minuutit", + "downloadScope": "Latausstrategia", + "downloadScopeDescription": "Valitse, mitkä sähköpostit indeksoidaan ja ladataan.", + "duration": "Kesto", + "edit": "Muokkaa", + "email": "Sähköposti", + "emailAccountRegistration": "Sähköpostitilin rekisteröinti", + "emailAccountRegistrationDesc": "Anna sähköpostiosoitteesi. Seuraavissa vaiheissa määrität IMAP-asetukset. Käytämme tätä osoitetta IMAP-palvelimen asetusten automaattiseen hakuun.", + "emailAddress": "Sähköpostiosoite", + "emailCannotBeModified": "Tilin sähköpostiosoitetta ei voi muokata muokkauksen aikana.", + "emailPlaceholder": "esim. matti.meikäläinen@esimerkki.fi", + "enable": "Ota käyttöön", + "enableAccount": "Ota tili käyttöön", + "enabled": "Käytössä", + "enabledDescription": "Määrittää, onko tämä tili aktiivinen. Jos se on poistettu käytöstä, tähän liittyviä latauksia ei suoriteta.", + "encryption": "salaus", + "enterPassword": "Syötä salasanasi", + "enterValue": "Syötä arvo", + "everyMinutes": "joka {{minutes}} minuutti", + "field": "Kenttä", + "fixed": "Kiinteä", + "folderLimit": "Kansioraja", + "folderLimitDescription": "Rajoittaa synkronoitavien sähköpostien määrän kansiota kohden (vähintään 100). Jätä tyhjäksi ilman rajoitusta.", + "folderLimitPlaceholder": "esim. 1000", + "folderSync": { + "autoSelectDescendants": "Valitse alisolmut automaattisesti", + "autoSelectParents": "Valitse yläsolmut automaattisesti", + "batches": "erät", + "collapseAll": "Kutista kaikki", + "expandAll": "Laajenna kaikki", + "loadingMailboxFolders": "Ladataan postilaatikon kansioita…", + "noData": "Ei tietoja", + "noFolders": "Ei synkronoitavia kansioita" + }, + "foldersConfiguredForSync": "{{count}} kansio(ta) määritetty synkronointiin", + "foldersSelected": "{{count}} kansio(ta) valittu", + "goBack": "Palaa takaisin", + "host": "isäntä", + "id": "ID", + "imap": "IMAP", + "imapAuthMethod": "IMAP-todennusmenetelmä", + "imapEncryption": "IMAP-salaus", + "imapHost": "IMAP-isäntä", + "imapHostPlaceholder": "esim. imap.esimerkki.fi", + "imapPassword": "IMAP-salasana", + "imapPort": "IMAP-portti", + "imapPortPlaceholder": "esim. 993", + "imapProxy": "Käytä SOCKS5-välityspalvelinta IMAP-yhteyksiin.", + "incSync": "Lisäsynkronointi", + "lastSync": "Viimeisin synkronointi", + "leaveEmptyToKeepExisting": "Jätä tyhjäksi säilyttääksesi olemassa olevan salasanan, tai syötä uusi päivittääksesi sen.", + "leaveEmptyToKeepPassword": "Jätä tyhjäksi säilyttääksesi nykyisen salasanan", + "login_name": "Kirjautumisnimi", + "minutes": "minuuttia", + "months": "Kuukautta", + "moreAccountTypes": "Lisää tilityyppejä", + "mustBeAtLeast1": "Täytyy olla vähintään 1", + "name": "Nimi", + "nameDescription": "IMAP-käyttäjätunnus. Oletuksena sähköposti, tai aseta oma tunnus.", + "namePlaceholder": "esim. matti.meikäläinen", + "noAccountConfigurations": "Ei tilimäärityksiä", + "noAccountConfigurationsDesc": "Et ole vielä lisännyt tilimäärityksiä. Lisää yksi aloittaaksesi tilitoimintojen käytön.", + "noOAuth2Tokens": "Ei OAuth2-tunnuksia", + "none": "Ei mitään", + "notAvailable": "ei saatavilla", + "oauth2Tokens": "OAuth2-tunnukset", + "openMenu": "Avaa valikko", + "optional": "Valinnainen", + "owner": "Luoja", + "password": "salasana", + "port": "portti", + "recent": "viimeaikainen", + "refreshToken": "Virheettömyystunnus", + "refreshTokenCopiedToClipboard": "Virheettömyystunnus kopioitu leikepöydälle", + "relative": "Suhteellinen", + "runningState": { + "account": { + "id": "Tilin ID" + }, + "common": { "close": "Sulje", - "yes": "Kyllä", - "no": "Ei", - "ok": "OK", - "loading": "Ladataan...", - "empty": "Tyhjä", - "noData": "Ei tietoja", - "table": { - "noResults": "Ei tuloksia." - }, - "failed": "Epäonnistui", - "notFound": "Ei löytynyt", - "back": "Takaisin", - "goBack": "Mene takaisin", - "backToHome": "Takaisin alkuun", - "tryAgain": "Yritä uudelleen", - "more": "Lisää", - "actions": "Toiminnot", - "filter": "Suodata", - "reset": "Nollaa", - "clear": "Tyhjennä", - "error": "Virhe", - "apply": "Käytä", - "select": "Valitse", - "selectAll": "Valitse kaikki", - "deselectAll": "Poista valinnat", - "all": "Kaikki", - "none": "Ei mitään", - "showLess": "Näytä vähemmän", - "showMore": "Näytä lisää...", - "project_description": "Bichon on avoimen lähdekoodin projekti.", - "view_on_github_button": "Näytä GitHubissa", - "op_failed": "Toiminto epäonnistui", - "na": "N/A", - "retry": "Yritä uudelleen", - "deleting": "Poistetaan..." - }, - "navigation": { - "home": "Koti", - "settings": "Asetukset", - "accounts": "Tilit", - "dashboard": "Kojelauta", - "mailbox": "Sähköposti", - "oauth2": "OAuth2", - "accessTokens": "Kulkuavaimet", - "apiDocs": "API-dokumentaatio", - "general": "Yleinen", - "auth": "Todennus", - "other": "Muu", - "users": "Järjestelmän käyttäjät" - }, - "auth": { - "welcome": "Tervetuloa Bichoniin", - "username": "Käyttäjänimi", - "password": "Salasana", - "login": "Kirjaudu sisään", - "loginFailed": "Kirjautuminen epäonnistui", - "invalidPassword": "Virheellinen salasana. Yritä uudelleen.", - "somethingWentWrong": "Jotain meni vikaan", - "sessionExpired": "Istunto vanhentunut!", - "sessionExpiredDesc": "Istuntosi on päättynyt toimettomuuden vuoksi. Kirjaudu sisään jatkaaksesi.", - "logout": "Kirjaudu ulos", - "areYouSureYouWantToLogOut": "Oletko varma, että haluat kirjautua ulos?", - "youWillNeedToLogInAgain": "Sinun on kirjauduttava sisään uudelleen päästäksesi tilillesi." - }, - "errors": { - "pageNotFound": "Oho! Sivua ei löydy!", - "pageNotFoundDesc": "Näyttää siltä, että etsimääsi sivua ei ole olemassa tai se on poistettu.", - "somethingWentWrong": "Oho! Jotain meni vikaan :')", - "somethingWentWrongDesc": "Pahoittelemme häiriötä. Yritä myöhemmin uudelleen.", - "internalServerError": "Sisäinen palvelinvirhe!", - "contentNotModified": "Sisältöä ei muutettu!", - "networkError": "Verkkovirhe", - "networkErrorDesc": "Palvelimeen ei saada yhteyttä. Tarkista internetyhteytesi ja yritä uudelleen.", - "forbidden": "Kielletty", - "forbiddenTitle": "Pääsy kielletty", - "forbiddenDesc": "Sinulla ei ole lupaa tarkastella tätä resurssia.", - "unauthorized": "Ei valtuutettu", - "unauthorizedTitle": "Luvaton pääsy", - "unauthorizedDesc": "Kirjaudu sisään oikeilla tunnuksilla päästäksesi tähän resurssiin.", - "maintenance": "Huolto", - "maintenanceTitle": "Sivusto on huollossa!", - "maintenanceDesc": "Sivusto on hetkellisesti pois käytöstä. Palaamme pian takaisin verkkoon.", - "learnMore": "Lue lisää" - }, - "dashboard": { - "title": "Kojelauta", - "mailAccounts": "Sähköpostitilit", - "connected": "Yhdistetty", - "totalEmails": "Sähköpostien kokonaismäärä", - "syncedLocally": "Synkronoitu paikallisesti", - "totalEmailSize": "Sähköpostien kokonaiskoko", - "logicalVolume": "Alkuperäinen koko", - "localDataFiles": "Paikalliset datatiedostot", - "actualDiskUsage": "Todellinen levynkäyttö", - "efficiency": "Tallennustehokkuus", - "saved": "Säästetty", - "dataStorage": "Tallennustila", - "indexSize": "Indeksikoko", - "metadataSize": "Metatietojen koko", - "tantivyDatabase": "Perustuu Tantivy-hakukoneeseen", - "dayTrend": "30 päivän trendi", - "attachments": "Liitteet", - "topLists": "Parhaat listat", - "newEmails": "Uudet sähköpostit", - "messageDistribution": "Viestien jakautuminen", - "attachmentRatio": "Liiteosuus", - "attachmentRatioDesc": "{{percent}}% sähköposteista sisältää liitteitä", - "noEmailsSynced": "Ei synkronoituja sähköposteja vielä", - "withAttachments": "Liitteillä", - "noAttachments": "Ilman liitteitä", - "top10Senders": "10 parasta lähettäjää", - "byMessageCount": "Viestimäärän mukaan", - "sender": "Lähettäjä", - "count": "Lukumäärä", - "top10LargestEmails": "10 suurinta sähköpostia", - "byMessageSize": "Viestikoon mukaan", - "subject": "Aihe", - "size": "Koko", - "noSubject": "(Ei aihetta)", - "top10Accounts": "10 parasta tiliä", - "emails": "Sähköpostit", - "account": "Tili", - "noRecentActivity": "Ei viimeaikaisia tapahtumia", - "noSendersData": "Ei lähettäjätietoja", - "noLargeEmails": "Ei suuria sähköposteja", - "noAccountData": "Ei tilitietoja", - "systemVersion": "Järjestelmäversio" - }, - "accounts": { - "beforeRelativeValue": "Lataa sähköpostit {{value}} {{unit}} sitten", - "sinceRelativeValue": "Lataa sähköpostit viimeisimmiltä", - "downloadBatchSize": "Latauserän koko", - "downloadBatchSizeDescription": "IMAP-pyyntöä kohden noudettujen viestien määrä", - "downloadScopeDescription": "Valitse, mitkä sähköpostit indeksoidaan ja ladataan.", - "downloadScope": "Latausstrategia", - "selectMode": "Valitse suodatustila", - "downloadAll": "Lataa kaikki sähköpostit", - "sinceFixed": "Tietystä päivämäärästä lähtien", - "sinceRelative": "Lataa vain viimeisimmät sähköpostit", - "beforeRelative": "Lataa vain vanhat sähköpostit", - "duration": "Kesto", - "unit": "Yksikkö", - "accessControl": "Pääsynhallinta", - "owner": "Luoja", - "access_control": { - "title": "Tilin pääsynhallinta", - "description": "Määritä roolit ja valtuutetut käyttäjät kohteelle {{email}}", - "role_label": "Pääsyrooli", - "role_placeholder": "Valitse rooli", - "role_loading": "Ladataan rooleja...", - "user_label": "Valitse valtuutetut käyttäjät", - "user_search_placeholder": "Hae käyttäjänimellä tai sähköpostilla...", - "user_empty": "Käyttäjiä ei löytynyt", - "user_selected_count": "Valittu: {{count}} käyttäjä(ä)", - "buttons": { - "cancel": "Peruuta", - "save": "Tallenna määritys" - }, - "validation": { - "user_required": "Valitse vähintään yksi käyttäjä", - "role_required": "Valitse määritettävä rooli" - }, - "toast": { - "success_title": "Määritys onnistui", - "success_desc": "Oikeudet on määritetty onnistuneesti kohteelle {{email}}", - "failed_title": "Määritys epäonnistui" - } - }, - "title": "Sähköpostitilit", - "description": "Hallinnoi ja määritä sähköpostitilejäsi.", - "addImap": "Lisää IMAP", - "addNoSync": "Lisää NoSync", - "moreAccountTypes": "Lisää tilityyppejä", - "noAccountConfigurations": "Ei tilimäärityksiä", - "noAccountConfigurationsDesc": "Et ole vielä lisännyt tilimäärityksiä. Lisää yksi aloittaaksesi tilitoimintojen käytön.", - "addConfiguration": "Lisää määritys", - "useNoProxy": "Ei välityspalvelinta", - "login_name": "Kirjautumisnimi", - "name": "Nimi", - "email": "Sähköposti", + "folders": "postilaatikot" + }, + "empty": { + "no_active_download": "Ei aktiivista latausta", + "no_errors_current": "Ei virheitä nykyisessä istunnossa", + "no_errors_session": "Ei virheitä tässä istunnossa", + "no_global_errors": "Ei yleisiä virheitä", + "no_history": "Ei historiaa" + }, + "folders": "postilaatikot", + "latest": "UUSIN", + "loading": { + "fetching_account_state": "Haetaan tilan tietoja..." + }, + "message": "Viesti", + "session": { + "started_at": "Aloitusaika", "status": "Tila", - "type": "Tyyppi", - "lastSync": "Viimeisin synkronointi", - "actions": "Toiminnot", - "edit": "Muokkaa", - "delete": "Poista", - "detail": "Tiedot", - "selectMailboxes": "Valitse postilaatikot", - "oauth2Tokens": "OAuth2-tunnukset", - "id": "ID", - "enabled": "Käytössä", - "auth": "Todennus", - "incSync": "Lisäsynkronointi", - "state": "Tila", - "createdAt": "Luotu", - "updatedAt": "Päivitetty", - "openMenu": "Avaa valikko", - "emailAccountRegistration": "Sähköpostitilin rekisteröinti", - "emailAccountRegistrationDesc": "Anna sähköpostiosoitteesi. Seuraavissa vaiheissa määrität IMAP-asetukset. Käytämme tätä osoitetta IMAP-palvelimen asetusten automaattiseen hakuun.", - "emailAddress": "Sähköpostiosoite", - "emailPlaceholder": "esim. matti.meikäläinen@esimerkki.fi", - "namePlaceholder": "esim. matti.meikäläinen", - "optional": "Valinnainen", - "nameDescription": "IMAP-käyttäjätunnus. Oletuksena sähköposti, tai aseta oma tunnus.", - "emailCannotBeModified": "Tilin sähköpostiosoitetta ei voi muokata muokkauksen aikana.", - "addAccount": "Lisää tili", - "updateAccount": "Päivitä tili", - "accountUpdated": "Tili päivitetty", - "accountCreated": "Tili luotu", - "accountUpdatedDesc": "Tilisi on päivitetty onnistuneesti.", - "accountCreatedDesc": "Tilisi on luotu onnistuneesti.", - "accountUpdateFailed": "Tilin päivitys epäonnistui", - "accountCreationFailed": "Tilin luominen epäonnistui", - "updateFailed": "Päivitys epäonnistui, yritä myöhemmin uudelleen", - "creationFailed": "Luominen epäonnistui, yritä myöhemmin uudelleen", - "allMailFolderSelected": "Varoitus: 'Kaikki sähköpostit' -kansio valittu", - "accountSyncFoldersUpdated": "Tilin synkronointikansiot päivitetty", - "accountSyncFoldersUpdateFailed": "Tilin synkronointikansioiden päivitys epäonnistui", - "serverConfiguration": "Palvelinmääritys (IMAP)", - "selectedMailboxes": "Valitut postilaatikot", - "allMailFolderSelectedDesc": "Kansioiden valitseminen, joilla on 'Kaikki sähköpostit' -attribuutti, johtaa todennäköisesti jo synkronoitujen viestien kahdentumiseen kansioista, kuten Saapuneet ja Lähetetyt. Tämä voi kuluttaa huomattavasti enemmän tallennustilaa.", - "allMailSkipped": "Oletuskansiot valittu. 'Kaikki sähköpostit' ohitettiin päällekkäisyyksien välttämiseksi.", - "selectAtLeastOneFolder": "Valitse vähintään yksi kansio", - "chooseMailboxesToDownload": "Valitse ladattavat postilaatikot käyttäjälle {{email}}. Uudet postilaatikot ladataan seuraavassa kierrossa.", - "accountDetails": "Tilin tiedot", - "capabilities": "Ominaisuudet", - "folderLimit": "Kansioraja", - "everyMinutes": "joka {{minutes}} minuutti", - "foldersConfiguredForSync": "{{count}} kansio(ta) määritetty synkronointiin", - "foldersSelected": "{{count}} kansio(ta) valittu", - "imapHost": "IMAP-isäntä", - "imapHostPlaceholder": "esim. imap.esimerkki.fi", - "imapPort": "IMAP-portti", - "imapPortPlaceholder": "esim. 993", - "imapEncryption": "IMAP-salaus", - "selectEncryptionMethod": "Valitse salausmenetelmä", - "chooseEncryptionMethod": "Valitse IMAP:lle käytettävä salausmenetelmä.", - "imapAuthMethod": "IMAP-todennusmenetelmä", - "selectAuthMethod": "Valitse todennusmenetelmä", - "chooseAuthMethod": "Valitse IMAP:lle käytettävä todennusmenetelmä.", - "imapPassword": "IMAP-salasana", - "leaveEmptyToKeepPassword": "Jätä tyhjäksi säilyttääksesi nykyisen salasanan", - "enterPassword": "Syötä salasanasi", - "leaveEmptyToKeepExisting": "Jätä tyhjäksi säilyttääksesi olemassa olevan salasanan, tai syötä uusi päivittääksesi sen.", - "useProxy": "Käytä välityspalvelinta", - "selectProxy": "Valitse välityspalvelin", - "downloadInterval": "Latausväli (minuuttia)", - "downloadIntervalPlaceholder": "Syötä minuutit", - "enabledDescription": "Määrittää, onko tämä tili aktiivinen. Jos se on poistettu käytöstä, tähän liittyviä latauksia ei suoriteta.", - "dateSince": "Päivämäärä alkaen", - "none": "Ei mitään", - "fixed": "Kiinteä", - "relative": "Suhteellinen", - "selectDate": "Valitse päivämäärä", - "selectUnit": "Valitse yksikkö", - "days": "Päivää", - "months": "Kuukautta", - "years": "Vuotta", - "enterValue": "Syötä arvo", - "mustBeAtLeast1": "Täytyy olla vähintään 1", - "dateSelection": "Päivämäärän valinta", - "since": "alkaen", - "recent": "viimeaikainen", - "notAvailable": "ei saatavilla", - "host": "isäntä", - "port": "portti", - "encryption": "salaus", - "authType": "todennustyyppi", - "password": "salasana", - "useProxyField": "käytä välityspalvelinta", - "clickSaveWhenDone": "Napsauta Tallenna, kun olet valmis.", - "step": "Vaihe {{index}}", - "goBack": "Palaa takaisin", - "autoConfiguring": "Automaattinen määritys...", - "continue": "Jatka", - "saveChanges": "Tallenna muutokset", - "submit": "Lähetä", - "field": "Kenttä", - "value": "Arvo", - "refreshToken": "Virheettömyystunnus", - "accessTokenCopiedToClipboard": "Kulkuavain kopioitu leikepöydälle", - "refreshTokenCopiedToClipboard": "Virheettömyystunnus kopioitu leikepöydälle", - "noOAuth2Tokens": "Ei OAuth2-tunnuksia", - "theAccountHasNotCompletedTheAuthorizationProcess": "Tili ei ole suorittanut valtuutusprosessia loppuun. Ole hyvä ja ", - "clickHere": "napsauta tästä", - "toAuthorizeTheAccount": " valtuuttaaksesi tilin.", - "detailsOfTheOAuth2TokensForTheAccount": "Tilin OAuth2-tunnusten tiedot.", - "updateTheEmailAccountHere": "Päivitä sähköpostitili täällä. ", - "addNewEmailAccountHere": "Lisää uusi sähköpostitili täällä. ", - "thisAccountIsUsedForIdentificationPurposesOnly": "Tätä tiliä käytetään vain tunnistamistarkoituksiin, eikä se vaadi synkronointia sähköpostipalvelimen kanssa. Auttaa sähköpostidatan tuomisessa.", - "determinesWhetherThisAccountIsActiveNoSync": "Määrittää, onko tämä tili aktiivinen. Jos se on poistettu käytöstä, tietoja ei voi tuoda.", - "folderSync": { - "noData": "Ei tietoja", - "noFolders": "Ei synkronoitavia kansioita", - "batches": "erät", - "autoSelectDescendants": "Valitse alisolmut automaattisesti", - "autoSelectParents": "Valitse yläsolmut automaattisesti", - "expandAll": "Laajenna kaikki", - "collapseAll": "Kutista kaikki", - "loadingMailboxFolders": "Ladataan postilaatikon kansioita…" - }, - "viewDetails": "katso tiedot", - "runningState": { - "message": "Viesti", - "account": { - "id": "Tilin ID" - }, - "tabs": { - "active_session": "Aktiivinen istunto", - "history": "Historia", - "global_errors": "Yleiset virheet", - "folders": "Postilaatikot", - "errors": "Virheet" - }, - "loading": { - "fetching_account_state": "Haetaan tilan tietoja..." - }, - "empty": { - "no_active_download": "Ei aktiivista latausta", - "no_errors_current": "Ei virheitä nykyisessä istunnossa", - "no_errors_session": "Ei virheitä tässä istunnossa", - "no_global_errors": "Ei yleisiä virheitä", - "no_history": "Ei historiaa" - }, - "session": { - "status": "Tila", - "trigger": "Laukaisija", - "started_at": "Aloitusaika" - }, - "common": { - "folders": "postilaatikot", - "close": "Sulje" - }, - "latest": "UUSIN", - "folders": "postilaatikot" - }, - "steps": { - "complete": "Valmis", - "emailAddress": "Sähköpostiosoite", - "imap": "IMAP", - "syncPreferences": "Synkronointiasetukset", - "summary": "Yhteenveto" - }, - "imapProxy": "Käytä SOCKS5-välityspalvelinta IMAP-yhteyksiin.", - "syncStartDateDescription": "Määrittää synkronoinnin aloituspäivämäärän – kiinteän tai suhteellisen nykyiseen aikaan. Tätä päivämäärää edeltävät sähköpostit jätetään pois, {{fixedPart}}.", - "syncAfterDate": "synkronoi tiedot asetetun päivämäärän jälkeen", - "syncRecentData": "siirrä synkronointipäivämäärää ajassa, synkronoiden vain viimeaikaiset tiedot", - "folderLimitDescription": "Rajoittaa synkronoitavien sähköpostien määrän kansiota kohden (vähintään 100). Jätä tyhjäksi ilman rajoitusta.", - "folderLimitPlaceholder": "esim. 1000", - "imap": "IMAP", - "minutes": "minuuttia", - "accountHasBeenSuccessfully": "Tili on onnistuneesti {{action}}", - "enableAccount": "Ota tili käyttöön", - "disableAccount": "Poista tili käytöstä", - "areYouSureYouWantTo": "Haluatko varmasti {{action}} tämän tilin?", - "enable": "Ota käyttöön", - "disable": "Poista käytöstä", - "thisWillPreventTheAccountFromBeingUsed": "Tili ei enää synkronoi tietoja IMAP-palvelimelta, mutta olemassa olevat tiedot ovat edelleen käytettävissä.", - "disabled": "Poistettu käytöstä", - "useDangerous": "Luota mihin tahansa TLS-sertifikaattiin", - "useDangerousDescription": "Ota tämä vaihtoehto käyttöön vain, jos IMAP-palvelin käyttää julkista CA:ta tai itse allekirjoitettua sertifikaattia, jonka järjestelmä ei tunnista. Tämä ohittaa normaalin sertifikaattitarkistuksen, ja voi altistaa Man-in-the-Middle -hyökkäyksille. Käytä vain, jos ymmärrät riskin." + "trigger": "Laukaisija" + }, + "tabs": { + "active_session": "Aktiivinen istunto", + "errors": "Virheet", + "folders": "Postilaatikot", + "global_errors": "Yleiset virheet", + "history": "Historia" + } }, - "mailbox": { - "deleteMailboxDialog": { - "title": "Poista postilaatikon kansio", - "desc": "Oletko varma, että haluat poistaa tämän postilaatikon kansion? Tätä toimintoa ei voi peruuttaa.", - "warningTitle": "Varoitus", - "warningDesc": "Tämän kansion poistaminen poistaa pysyvästi myös kaikki sen sisältämät arkistoidut sähköpostit ja alikansiot.", - "confirm": "Poista pysyvästi", - "successTitle": "Poisto onnistui", - "successDesc": "Postilaatikon kansio ja sen sisältö on poistettu onnistuneesti.", - "errorTitle": "Poisto epäonnistui" - }, - "title": "Sähköposti", - "folders": "Kansiot", - "messages": "Viestit", - "noMessages": "Ei viestejä", - "selectFolder": "Valitse kansio nähdäksesi viestit", - "deleteDialog": { - "title": "Poista sähköposti", - "desc": "Oletko varma, että haluat poistaa {{countText}}? Tämä toimenpide poistaa valitun sähköpostin/sähköpostit pysyvästi paikallisesta tietokannasta. Sähköposti/sähköpostit menetetään ikuisesti, eikä niitä voi palauttaa.", - "descCountSingle": "tämän sähköpostin", - "descCountMultiple": "nämä {{count}} sähköpostia", - "warningTitle": "Varoitus!", - "warningDesc": "Jatka varoen.", - "confirm": "Poista", - "successTitle": "Viestit poistettu onnistuneesti", - "successDesc": "Viestit on poistettu.", - "errorTitle": "Viestien poistaminen epäonnistui" - }, - "thread": { - "title": "Keskusteluketju ({{count}} {{messageLabel}})", - "message": "viesti", - "messages": "viestiä", - "noSubject": "(Ei aihetta)", - "invalidDate": "Virheellinen päivämäärä", - "empty": "Ei viestejä tässä keskusteluketjussa.", - "loadError": "Keskusteluketjun lataus epäonnistui", - "loadingMore": "Ladataan...", - "loadMore": "Lataa lisää" - }, - "bulkActions": { - "ariaLabel": "Massatoiminnot {{count}} valitulle {{emailLabel}}", - "email": "sähköpostille", - "emails": "sähköposteille", - "selected": "valittu", - "clearSelection": "Tyhjennä valinta", - "clearSelectionWithKey": "Tyhjennä valinta ({{key}})", - "delete": "Poista", - "deleteTooltip": "Poista valitut sähköpostit" - } + "saveChanges": "Tallenna muutokset", + "selectAtLeastOneFolder": "Valitse vähintään yksi kansio", + "selectAuthMethod": "Valitse todennusmenetelmä", + "selectDate": "Valitse päivämäärä", + "selectEncryptionMethod": "Valitse salausmenetelmä", + "selectMailboxes": "Valitse postilaatikot", + "selectMode": "Valitse suodatustila", + "selectProxy": "Valitse välityspalvelin", + "selectUnit": "Valitse yksikkö", + "selectedMailboxes": "Valitut postilaatikot", + "serverConfiguration": "Palvelinmääritys (IMAP)", + "since": "alkaen", + "sinceFixed": "Tietystä päivämäärästä lähtien", + "sinceRelative": "Lataa vain viimeisimmät sähköpostit", + "sinceRelativeValue": "Lataa sähköpostit viimeisimmiltä", + "state": "Tila", + "status": "Tila", + "step": "Vaihe {{index}}", + "steps": { + "complete": "Valmis", + "emailAddress": "Sähköpostiosoite", + "imap": "IMAP", + "summary": "Yhteenveto", + "syncPreferences": "Synkronointiasetukset" }, - "search": { - "size": "Koko", - "any": "Kaikki", - "tiny": "Erittäin pieni (<15 KB)", - "small": "Pieni (<2 MB)", - "medium": "Keskikokoinen (2 - 10 MB)", - "large": "Suuri (10 - 20 MB)", - "huge": "Valtava (≥20 MB)", - "sort": "Lajittele", - "sizeDescription": "Koko tarkoittaa sähköpostin kokonaiskokoa, liitteet mukaan lukien.", - "title": "Hae", - "searching": "Haetaan, odota hetki...", - "noEmailsFound": "Ei sähköposteja löydy", - "startSearching": "Aloita hakeminen avainsanalla, lähettäjällä tai käytä tarkennettuja suodattimia.", - "adjustSearch": "Yritä muuttaa hakukriteerejäsi tai tyhjennä suodattimet.", - "tagFilter": "Tunnistesuodatin", - "from": "Lähettäjä", - "to": "Vastaanottaja", - "subject": "Aihe", - "date": "Päivämäärä", - "editTag": "Muokkaa tunnistetta", - "keyword": "Avainsana", - "sender": "Lähettäjä", - "recipient": "Vastaanottaja", - "hasAttachment": "Sisältää liitteen", - "yes": "Kyllä", - "no": "Ei", - "dateRange": "Päivämääräväli", - "startDate": "Alkupäivämäärä", - "endDate": "Loppupäivämäärä", - "advancedFilters": "Tarkennetut suodattimet", - "searchArchivedEmails": "Hae arkistoiduista sähköposteista", - "fullTextMultiAccount": "Koko teksti · Usean tilin · Tarkennetut suodattimet", - "account": "Tili", - "mailbox": "Sähköposti", - "selectAccount": "Valitse tili", - "selectMailbox": "Valitse sähköposti", - "noActiveEmailAccount": "Ei aktiivista sähköpostitiliä.", - "addEmailAccount": "Lisää sähköpostitili", - "noMailboxSelectAccount": "Ei sähköpostia. Valitse ensin tili.", - "searchInSubjectBody": "Hae otsikosta, sisällöstä, liitteistä...", - "searchingButton": "Haetaan...", - "searchButton": "Hae", - "advanced": "Tarkennettu", - "clear": "Tyhjennä", - "since": "Alkaen:", - "before": "Ennen:", - "selectDate": "Valitse päivämäärä", - "pleaseSelectAtLeastOne": "Valitse vähintään yksi hakukriteeri", - "cc": "Kopio", - "bcc": "Piilokopio", - "attachmentName": "Liitteen nimi", - "messageId": "Viestin ID", - "minSize": "Minimikoko", - "maxSize": "Maksimikoko", - "senderRecipients": "Lähettäjä / Vastaanottajat", - "attachmentsSize": "Liitteet ja koko", - "minimumBytes": "Minimi (tavua)", - "maximumBytes": "Maksimi (tavua)", - "originalMessageIdHeader": "Alkuperäisen sähköpostin Message-ID -otsikko", - "addTags": { - "title": "Muokkaa tunnisteita", - "none": "Ei tunnisteita lisätty vielä", - "searchPlaceholder": "Hae tai luo tunnisteita...", - "createHint": "Luo uusi tunnus: {{tag}}", - "invalidTitle": "Virheellinen tunnus", - "updatedTitle": "Tunnisteet päivitetty", - "updatedDesc": "Tunnisteet on päivitetty onnistuneesti", - "updateFailedTitle": "Päivitys epäonnistui", - "tryAgain": "Yritä myöhemmin uudelleen", - "selectedCount": "{{count}} tunnus(ta) valittu", - "cancel": "Peruuta", - "save": "Tallenna", - "saving": "Tallennetaan..." - }, - "updateTags": { - "overwriteWarning": "Varoitus: Tämä korvaa kaikki valittujen kohteiden olemassa olevat tunnisteet.", - "title": "Päivitä tunnisteet", - "none": "Ei valittuja tunnisteita", - "searchPlaceholder": "Hae tai luo uusi tunniste...", - "createHint": "Paina Enter luodaksesi uuden tunnisteen: \"{{tag}}\"", - "selectedCount": "{{count}} tunniste(tta) otetaan käyttöön", - "cancel": "Peruuta", - "invalidTitle": "Virheellinen tunniste", - "updatedTitle": "Tunnisteet päivitetty", - "updatedDesc": "Tunnisteet on päivitetty onnistuneesti.", - "updateFailedTitle": "Päivitys epäonnistui", - "tryAgain": "Yritä myöhemmin uudelleen.", - "actionAdd": "Lisää", - "actionRemove": "Poista", - "actionOverwrite": "Korvaa", - "submitAdd": "Lisää tunnisteet", - "submitRemove": "Poista tunnisteet", - "submitOverwrite": "Korvaa tunnisteet", - "savingAdd": "Lisätään...", - "savingRemove": "Poistetaan...", - "savingOverwrite": "Korvataan..." - }, - "thread": { - "title": "Keskusteluketju · {{count}} viestiä", - "error": "Keskusteluketjun lataus epäonnistui", - "empty": "Ei viestejä tässä keskusteluketjussa", - "invalidDate": "Virheellinen päivämäärä", - "noSubject": "(Ei aihetta)", - "loadingMore": "Ladataan...", - "loadMore": "Lataa lisää" - }, - "bulkActions": { - "ariaLabel": "{{count}} viestiä valittu. Toimintopalkki", - "delete": "Poista", - "deleteDesc": "Poista valitut viestit", - "selected": "{{count}} valittu", - "clear": "Tyhjennä valinnat", - "manageTags": "Hallitse tunnisteita" - }, - "delete": { - "title": "Poista viestit", - "confirmPrefix": "Haluatko varmasti poistaa", - "countLabel": "{{count}} viestiä?", - "confirmDetail": "Tätä toimintoa ei voi peruuttaa.", - "confirmButton": "Poista", - "warningTitle": "Varoitus", - "warningDesc": "Viestit poistetaan pysyvästi.", - "successTitle": "Poistettu", - "successDesc": "Viestien poisto onnistui.", - "errorTitle": "Poisto epäonnistui" - } + "submit": "Lähetä", + "syncAfterDate": "synkronoi tiedot asetetun päivämäärän jälkeen", + "syncRecentData": "siirrä synkronointipäivämäärää ajassa, synkronoiden vain viimeaikaiset tiedot", + "syncStartDateDescription": "Määrittää synkronoinnin aloituspäivämäärän – kiinteän tai suhteellisen nykyiseen aikaan. Tätä päivämäärää edeltävät sähköpostit jätetään pois, {{fixedPart}}.", + "theAccountHasNotCompletedTheAuthorizationProcess": "Tili ei ole suorittanut valtuutusprosessia loppuun. Ole hyvä ja ", + "thisAccountIsUsedForIdentificationPurposesOnly": "Tätä tiliä käytetään vain tunnistamistarkoituksiin, eikä se vaadi synkronointia sähköpostipalvelimen kanssa. Auttaa sähköpostidatan tuomisessa.", + "thisWillPreventTheAccountFromBeingUsed": "Tili ei enää synkronoi tietoja IMAP-palvelimelta, mutta olemassa olevat tiedot ovat edelleen käytettävissä.", + "title": "Sähköpostitilit", + "toAuthorizeTheAccount": " valtuuttaaksesi tilin.", + "type": "Tyyppi", + "unit": "Yksikkö", + "updateAccount": "Päivitä tili", + "updateFailed": "Päivitys epäonnistui, yritä myöhemmin uudelleen", + "updateTheEmailAccountHere": "Päivitä sähköpostitili täällä. ", + "updatedAt": "Päivitetty", + "useDangerous": "Luota mihin tahansa TLS-sertifikaattiin", + "useDangerousDescription": "Ota tämä vaihtoehto käyttöön vain, jos IMAP-palvelin käyttää julkista CA:ta tai itse allekirjoitettua sertifikaattia, jonka järjestelmä ei tunnista. Tämä ohittaa normaalin sertifikaattitarkistuksen, ja voi altistaa Man-in-the-Middle -hyökkäyksille. Käytä vain, jos ymmärrät riskin.", + "useNoProxy": "Ei välityspalvelinta", + "useProxy": "Käytä välityspalvelinta", + "useProxyField": "käytä välityspalvelinta", + "value": "Arvo", + "viewDetails": "katso tiedot", + "years": "Vuotta" + }, + "apiDocs": { + "choosePreferredType": "Valitse haluamasi API-dokumentaation tyyppi", + "downloadSpecYAML": "Lataa YAML-määritys", + "openAPIExplorer": "OpenAPI Explorer", + "reDoc": "ReDoc", + "scalar": "Scalar", + "swaggerUI": "Swagger UI" + }, + "apiTokens": { + "deleteDialog": { + "cancel": "Peruuta", + "confirm": "Poista", + "deleting": "Poistetaan...", + "description": "Tätä toimintoa ei voi peruuttaa. Kaikki sovellukset, jotka käyttävät tätä tunnusta, menettävät pääsyn välittömästi.", + "title": "Poistetaanko pääsytunnus?" }, - "mail": { - "emailViewer": "Sähköpostin katseluohjelma", - "noMessageSelected": "Ei valittua viestiä", - "account": "Tili", - "from": "Lähettäjä", - "to": "Vastaanottaja", - "subject": "Aihe", - "date": "Päivämäärä", - "tags": "Tunnisteet", - "noTagsYet": "Ei tunnisteita vielä", - "id": "ID", - "cc": "Kopio", - "bcc": "Piilokopio", - "attachments": "Liitteet", - "download": "Lataa", - "delete": "Poista", - "viewThread": "Näytä keskusteluketju", - "downloadStarted": "Lataus aloitettu", - "downloadComplete": "Lataus valmis", - "downloadFailed": "Lataus epäonnistui", - "failedToDownloadFile": "Tiedoston lataus epäonnistui", - "failedToLoadEmail": "Sähköpostiviestin lataus epäonnistui.", - "isBeingDownloaded": "{{id}} latautuu", - "downloaded": "{{id}} ladattu", - "showLess": "näytä vähemmän", - "showMore": "näytä lisää...", - "onlyNonInlineAttachments": "Vain muut kuin sisäiset liitteet näytetään tässä.", - "noAttachments": "Ei liitteitä" + "dialog": { + "createTitle": "Luo pääsytunnus", + "description": "Napsauta tallenna, kun olet valmis.", + "editTitle": "Muokkaa pääsytunnusta", + "save": "Tallenna", + "saveChanges": "Tallenna muutokset" }, - "oauth2": { - "title": "OAuth2", - "addConfiguration": "Lisää määritys", - "id": "ID", - "provider": "Palveluntarjoaja", - "clientId": "Asiakastunnus (Client ID)", - "clientSecret": "Asiakassalaisuus (Client Secret)", - "redirectUri": "Uudelleenohjaus-URI", - "scopes": "Valtuusalueet", - "status": "Tila", - "enabled": "Käytössä", - "disabled": "Poistettu käytöstä", - "edit": "Muokkaa", - "delete": "Poista", - "enable": "Ota käyttöön", - "disable": "Poista käytöstä", - "noConfigurations": "Ei OAuth2-määrityksiä", - "noConfigurationsDesc": "Et ole vielä lisännyt OAuth2-määrityksiä. Lisää yksi aloittaaksesi OAuth2-toimintojen käytön.", - "description": "Hallinnoi automaattisesti kulkutunnusten hakemista, tallentamista ja päivittämistä, varmistaen saumattoman ja aina valmiin todennuskokemuksen.", - "addNew": "Lisää uusi", - "updateHere": "Päivitä täällä.", - "createNewHere": "Luo uusi täällä.", - "clickSaveWhenDone": "Napsauta Tallenna, kun olet valmis.", - "quickPresets": "Pikavalinnat:", - "gmail": "Gmail", - "outlook": "Outlook", - "whenDisabled": "Kun poistettu käytöstä: - Uudet valtuutusvirrat hylätään välittömästi - Olemassa olevat kulku- ja virheettömyystunnukset peruutetaan minuutin sisällä - Käyttäjien on valtuutettava uudelleen, kun se otetaan uudelleen käyttöön", - "clientIdLabel": "Asiakastunnus (Client ID):", - "enterYourClientId": "Syötä asiakastunnuksesi", - "theUniqueIdentifierForYourApplication": "Sovelluksesi yksilöllinen tunnus, jonka OAuth-palveluntarjoaja tarjoaa.", - "clientSecretLabel": "Asiakassalaisuus (Client Secret):", - "leaveEmptyToKeepExistingSecret": "Jätä tyhjäksi säilyttääksesi olemassa olevan salaisuuden", - "enterYourClientSecret": "Syötä asiakassalaisuutesi", - "leaveEmptyToKeepTheExistingSecret": "Jätä tyhjäksi säilyttääksesi olemassa olevan salaisuuden, syötä uusi arvo vain päivittääksesi sen.", - "aSecretKeyProvidedByTheOAuthProvider": "OAuth-palveluntarjoajan tarjoama salainen avain sovelluksesi todentamiseksi.", - "authUrlLabel": "Valtuutus-URL:", - "enterTheAuthorizationUrl": "Syötä valtuutus-URL", - "theUrlWhereUsersWillBeRedirected": "URL-osoite, johon käyttäjät ohjataan valtuuttamaan sovelluksesi.", - "tokenUrlLabel": "Tunnus-URL:", - "enterTheTokenUrl": "Syötä tunnus-URL", - "theUrlUsedToExchange": "URL, jota käytetään valtuutuskoodin vaihtamiseen kulkutunnukseksi.", - "redirectUrlLabel": "Uudelleenohjaus-URI:", - "enterYourRedirectUrl": "Syötä uudelleenohjaus-URI", - "theRedirectUrlAfterAuthorization": "Uudelleenohjaus-URI valtuutuksen jälkeen. Täytyy vastata OAuth-palveluntarjoajalle rekisteröityä. Käytä muotoa http://[host]:[port]/oauth2/callback (tai https://), missä [host] ja [port] vastaavat RustMailer-käyttöönottoasi. Polku /oauth2/callback on kiinteä.", - "scope": "Valtuusalue:", - "enterTheScopeHere": "Syötä valtuusalue tähän.", - "addScope": "Lisää valtuusalue", - "key": "Avain:", - "enterTheKeyHere": "Syötä avain tähän.", - "value": "Arvo:", - "enterTheValueHere": "Syötä arvo tähän.", - "addExtraParams": "Lisää ylimääräisiä parametreja", - "useProxyOptional": "Käytä välityspalvelinta (valinnainen):", - "selectAProxy": "Valitse välityspalvelin", - "noProxyAvailable": "Ei välityspalvelinta saatavilla", - "useSocks5ProxyForOAuthRequests": "Käytä SOCKS5-välityspalvelinta OAuth-pyyntöihin, kun suora pääsy on estetty.", - "descriptionLabel": "Kuvaus:", - "describeThePurposeOfTheOauth2Application": "Kuvaile OAuth2-sovelluksen käyttötarkoitus", - "optional": "Valinnainen", - "saving": "Tallennetaan...", - "creating": "Luodaan...", - "saveChanges": "Tallenna muutokset", - "save": "Tallenna", - "updated": "Päivitetty", - "created": "Luotu", - "yourOAuth2ApplicationHasBeenSuccessfully": "OAuth2-sovelluksesi on {{action}} onnistuneesti.", - "updateFailed": "Päivitys epäonnistui", - "creationFailed": "Luominen epäonnistui", - "updateOrCreationFailed": "{{action}} epäonnistui, yritä myöhemmin uudelleen", - "clientSecretIsRequired": "Asiakassalaisuus on pakollinen", - "clientSecretCannotBeEmpty": "Asiakassalaisuus ei voi olla tyhjä", - "keyIsRequired": "Avain on pakollinen", - "keyCannotBeEmpty": "Avain ei voi olla tyhjä", - "valueIsRequired": "Arvo on pakollinen", - "valueCannotBeEmpty": "Arvo ei voi olla tyhjä", - "descriptionMustNotExceed255Characters": "Kuvaus ei saa ylittää 255 merkkiä.", - "clientIdIsRequired": "Asiakastunnus on pakollinen", - "clientIdCannotBeEmpty": "Asiakastunnus ei voi olla tyhjä", - "authorizationUrlIsRequired": "Valtuutus-URL on pakollinen", - "authorizationUrlCannotBeEmpty": "Valtuutus-URL ei voi olla tyhjä", - "invalidAuthorizationUrlFormat": "Virheellinen valtuutus-URL-muoto", - "tokenUrlIsRequired": "Tunnus-URL on pakollinen", - "tokenUrlCannotBeEmpty": "Tunnus-URL ei voi olla tyhjä", - "invalidTokenUrlFormat": "Virheellinen tunnus-URL-muoto", - "redirectUriIsRequired": "Uudelleenohjaus-URI on pakollinen", - "redirectUriCannotBeEmpty": "Uudelleenohjaus-URI ei voi olla tyhjä", - "invalidRedirectUriFormat": "Virheellinen uudelleenohjaus-URI-muoto", - "authorizeEmailAccount": "Valtuuta sähköpostitili", - "authorizeAnEmailAccountToStartTheOAuth2AuthorizationProcess": "Valtuuta sähköpostitili aloittaaksesi OAuth2-valtuutusprosessin.", - "loadingAccounts": "Ladataan tilejä...", - "selectAnAccount": "Valitse tili", - "noEmailAccountsRegistered": "Ei rekisteröityjä sähköpostitilejä. Ole hyvä ja luo sellainen.", - "pleaseCreateOne": "Ole hyvä ja luo sellainen.", - "createAccount": "Luo tili", - "authorize": "Valtuuta", - "getAuthorizeUrlFailed": "Valtuutus-URL:n haku epäonnistui", - "getAuthorizeUrlFailedDesc": "Valtuutus-URL:n haku epäonnistui, yritä myöhemmin uudelleen", - "oauth2ClientUpdated": "OAuth2-asiakasohjelma päivitetty", - "oauth2ClientHasBeenSuccessfully": "OAuth2-asiakasohjelma on {{action}} onnistuneesti.", - "statusUpdateFailed": "Tilan päivitys epäonnistui, yritä myöhemmin uudelleen", - "disableOAuth2Client": "Poista OAuth2-asiakasohjelma käytöstä", - "enableOAuth2Client": "Ota OAuth2-asiakasohjelma käyttöön", - "areYouSureYouWantTo": "Oletko varma, että haluat {{action}} tämän OAuth2-asiakasohjelman?", - "thisWillPreventTheOAuth2ClientFromBeingUsed": "Tämä estää OAuth2-asiakasohjelman käytön.", - "deleteToken": "Poista tunnus", - "areYouSureYouWantToDelete": "Oletko varma, että haluat poistaa", - "thisActionWillPermanentlyRemoveTheOauth2Record": "Tämä toimenpide poistaa OAuth2-tietueen pysyvästi järjestelmästä. Tätä ei voi kumota.", - "enterIdToConfirmDeletion": "Syötä ID vahvistaaksesi poiston.", - "warning": "Varoitus!", - "pleaseBeCareful": "Ole varovainen, tätä toimenpidettä ei voi kumota.", - "deleteSuccess": "Poisto onnistui", - "yourOAuth2ApplicationHasBeenSuccessfullyDeleted": "OAuth2-sovelluksesi on poistettu onnistuneesti.", - "oauth2DeleteFailed": "OAuth2-poisto epäonnistui", - "deleteFailed": "Poisto epäonnistui, yritä myöhemmin uudelleen", - "actions": { - "openMenu": "Avaa valikko", - "edit": "Muokkaa", - "authorize": "Valtuuta", - "delete": "Poista" - }, - "authFailed": "OAuth2-todennus epäonnistui", - "error": "Virhe", - "unknownError": "Tuntematon virhe tapahtui.", - "tryAgain": "Yritä uudelleen", - "goHome": "Siirry kotiin", - "authSuccess": "OAuth2-todennus onnistui", - "success": "Onnistui", - "successMessage": "Sähköpostitilisi on todennettu onnistuneesti OAuth2:n kautta. Järjestelmä on tallentanut kulkutunnuksen ja päivittää sen automaattisesti tarvittaessa.", - "goToAccounts": "Siirry tileihin", - "authAtatus": "OAuth2-todennuksen tila", - "information": "Tiedot", - "noStatus": "Tämä sivu näyttää OAuth2-todennuksesi tuloksen. Tällä hetkellä ei ole saatavilla erityistä tilaa. Yritä uudelleen tarvittaessa.", - "backToLogin": "Takaisin sisäänkirjautumiseen" + "form": { + "1day": "1 päivä", + "30days": "30 päivää", + "7days": "7 päivää", + "errorInt": "On oltava kokonaisluku", + "errorMax": "Enintään 32 merkkiä", + "errorNumber": "On oltava numero", + "errorPositive": "On oltava suurempi kuin 0", + "expirationDescription": "Tunnukset vanhenevat automaattisesti valitun ajan kuluttua.", + "expirationLabel": "Vanhentuminen", + "expirationPlaceholder": "Valitse vanhentumisaika", + "nameDescription": "Valinnainen · Enintään 32 merkkiä", + "nameLabel": "Nimi", + "namePlaceholder": "Anna tunnukselle lyhyt nimi", + "never": "Ei koskaan" }, - "accessTokens": { - "title": "Kulkuavaimet", - "name": "Nimi", - "accounts": "Tilit", - "token": "Tunnus", - "createdAt": "Luotu", - "expiresAt": "Vanhenee", - "edit": "Muokkaa", - "delete": "Poista", - "create": "Luo", - "noTokens": "Ei kulkuavaimia", - "noTokensDesc": "Et ole vielä luonut kulkuavaimia. Luo yksi käyttääksesi API-toimintoja.", - "description": "Hallinnoi kulkuavaimia, niiden ACL-sääntöjä, IP-sallittujen luetteloita ja nopeusrajoitusasetuksia täällä.", - "editToken": "Muokkaa tunnusta", - "addNew": "Lisää uusi", - "updateTheAccessTokenHere": "Päivitä kulkutunnus täällä.", - "createNewAccessTokenHere": "Luo uusi kulkutunnus täällä.", - "selectAccounts": "Valitse tilit", - "selectMultipleAccountsForTheAccessToken": "Valitse useita tilejä kulkutunnuksen valtuutusalueelle.", - "enterOneIpAddressPerLine": "Syötä yksi IP-osoite riviä kohden, esim.:\n192.168.1.1\n192.168.1.2", - "aListOfIpAddressesAllowed": "Luettelo IP-osoitteista, joilla on lupa käyttää resurssia. Syötä yksi IP-osoite riviä kohden. (Valinnainen)", - "enterQuota": "Syötä kiintiö, esim. 100", - "theMaximumNumberOfRequestsAllowed": "Suurin sallittu pyyntöjen määrä välin sisällä. (Valinnainen)", - "enterIntervalInSeconds": "Syötä väli sekunneissa, esim. 60", - "theTimeWindowForTheRateLimit": "Aikaikkuna (sekunneissa) nopeusrajoitukselle. (Valinnainen)", - "describeThePurposeOfTheAccessToken": "Kuvaile kulkutunnuksen käyttötarkoitus", - "updating": "Päivitetään...", - "saving": "Tallennetaan...", - "creating": "Luodaan...", - "saveChanges": "Tallenna muutokset", - "save": "Tallenna", - "updated": "Päivitetty", - "created": "Luotu", - "yourAccessTokenHasBeenSuccessfully": "Kulkutunnuksesi on {{action}} onnistuneesti.", - "updateFailed": "Päivitys epäonnistui", - "creationFailed": "Luominen epäonnistui", - "updateOrCreationFailed": "{{action}} epäonnistui, yritä myöhemmin uudelleen", - "quotaMustBeAPositiveInteger": "Kiintiön on oltava positiivinen kokonaisluku.", - "intervalMustBeAPositiveInteger": "Välin on oltava positiivinen kokonaisluku.", - "invalidIpAddressesFound": "Virheellisiä IP-osoitteita löydetty. Syötä kelvollisia IPv4- tai IPv6-osoitteita.", - "atLeastOneAccountIsRequired": "Vähintään yksi tili on pakollinen.", - "descriptionMustNotExceed255Characters": "Kuvaus ei saa ylittää 255 merkkiä.", - "notUsedYet": "Ei käytetty vielä", - "theListOfAccountsThatCanBeQueried": "Luettelo tileistä, joita voidaan kysellä kulkutunnuksella.", - "accountId": "Tilin ID", - "filterByEmailAddressOrAccountId": "Suodata sähköpostiosoitteen tai tilin ID:n mukaan...", - "aclRulesForAccessTokens": "ACL-säännöt kulkutunnuksille sisältävät IP-sallittujen luettelon tarkistuksen ja nopeusrajoituksen soveltamisen.", - "actions": { - "openMenu": "Avaa valikko", - "edit": "Muokkaa", - "delete": "Poista" - }, - "quota": "Kiintiö", - "interval": "Väli" + "list": { + "createdLabel": "Luotu", + "deleteBtn": "Poista tunnus", + "expiresOnLabel": "Vanhenee", + "expiresOnShort": "Vanhenee {{date}}", + "lastUsedLabel": "Viimeksi käytetty", + "neverExpires": "Ei vanhene koskaan", + "neverLabel": "Ei koskaan", + "neverUsed": "Ei koskaan", + "statusActive": "Aktiivinen", + "statusExpired": "Vanhentunut", + "tokenLabel": "Tunnus", + "unnamedToken": "Nimetön tunnus" }, - "settings": { - "appearance": { - "title": "Ulkoasu", - "field": { - "language": "Käyttöliittymän kieli", - "theme": "Käyttöliittymän teema" - }, - "description": { - "language": "Valitse Web-käyttöliittymässä käytettävä kieli.", - "theme": "Valitse käyttöliittymän vaalea tai tumma tila." - }, - "placeholder": { - "select_language": "Valitse kieli" - }, - "command": { - "search": "Hae kieltä...", - "no_results": "Kieltä ei löytynyt." - }, - "theme": { - "light": "Vaalea", - "dark": "Tumma" - }, - "button": { - "update": "Päivitä asetukset" - }, - "validation": { - "language": { - "required": "Valitse kieli." - }, - "theme": { - "required": "Valitse teema." - } - } - }, - "title": "Asetukset", - "general": "Yleinen", - "proxy": "Välityspalvelin", - "name": "Nimi", - "host": "Isäntä", - "port": "Portti", - "username": "Käyttäjänimi", - "password": "Salasana", - "type": "Tyyppi", - "actions": "Toiminnot", - "edit": "Muokkaa", - "delete": "Poista", - "add": "Lisää", - "noProxies": "Ei välityspalvelimia", - "noProxiesDesc": "Et ole vielä lisännyt välityspalvelinmäärityksiä. Lisää yksi käyttääksesi välityspalvelin-toimintoja.", - "root": "Pääkäyttäjä", - "rootTitle": "Pääkäyttäjä", - "rootDesc": "Hallinnoi pääkäyttäjän kirjautumistietoja, mukaan lukien tunnus ja salasana.", - "rootAccessManagement": "Pääkäyttäjän pääsynhallinta", - "manageRootTokenAndPassword": "Hallinnoi pääkäyttäjän tunnusta ja salasanaa turvallisesti.", - "resetRootToken": "Nollaa pääkäyttäjän tunnus", - "generateNewToken": "Luo uusi tunnus, vanha vanhenee välittömästi.", - "reset": "Nollaa", - "resetRootPassword": "Nollaa pääkäyttäjän salasana", - "changePasswordForFutureLogins": "Vaihda salasana tulevia kirjautumisia varten.", - "youAreAboutToResetTheRootToken": "Olet aikeissa nollata pääkäyttäjän tunnuksen. Tätä toimenpidettä ei voi kumota.", - "confirmReset": "Vahvista nollaus", - "youAreAboutToResetTheRootPassword": "Olet aikeissa nollata pääkäyttäjän salasanan. Varmista, että tallennat sen turvallisesti.", - "enterNewRootPassword": "Syötä uusi pääkäyttäjän salasana", - "theRootTokenHasBeenReset": "Pääkäyttäjän tunnus on nollattu", - "yourLoginInformationHasBeenUpdated": "Kirjautumistietosi on päivitetty. Sinun ei tarvitse kirjautua sisään uudelleen.", - "invalidPassword": "Virheellinen salasana", - "rootPasswordMustBeAtLeast6Characters": "Pääkäyttäjän salasanan on oltava vähintään 6 merkkiä pitkä.", - "theRootPasswordHasBeenReset": "Pääkäyttäjän salasana on nollattu", - "useNewPasswordForNextLogin": "Käytä uutta salasanaa seuraavalla kirjautumiskerralla.", - "failedToCopyText": "Tekstin kopiointi epäonnistui", - "filterProxy": "Suodata välityspalvelimet...", - "filterOauth2": "Suodata OAuth2...", - "filterAccount": "Suodata tilit...", - "filterAccessToken": "Suodata kulkuavaimet...", - "selectAll": "Valitse kaikki", - "theme": "Teema", - "id": "Id", - "url": "Url", - "createdAt": "Luotu", - "updatedAt": "Päivitetty", - "enabled": "Käytössä", - "useProxy": "Käytä välityspalvelinta", - "authUrl": "Valtuutus-URL", - "tokenUrl": "Tunnus-URL", - "description": "Kuvaus", - "token": "Tunnus", - "accounts": "Tilit", - "acl": "Acl", - "lastAccess": "Viimeisin pääsy", - "enterProxyIdToConfirmDeletion": "Syötä välityspalvelimen ID vahvistaaksesi poiston.", - "updateTheProxyHere": "Päivitä välityspalvelin täällä. ", - "addNewProxyHere": "Lisää uusi välityspalvelin täällä. ", - "pleaseUseAnIpAddressForBetterReliability": "Käytä IP-osoitetta (esim. 127.0.0.1) isäntänimen tai verkkotunnuksen sijaan paremman luotettavuuden saavuttamiseksi.", - "adding": "Lisätään...", - "yourProxyHasBeenSuccessfully": "Välityspalvelimesi on {{action}} onnistuneesti.", - "proxyUpdateOrAddFailed": "{{action}} epäonnistui, yritä myöhemmin uudelleen", - "sidebar": { - "profile": "Profiili", - "apiTokens": "API-tunnukset", - "proxy": "Verkkovälityspalvelin", - "configurations": "Järjestelmäasetukset" - }, - "profile": { - "loadError": "Käyttäjätietojen lataaminen epäonnistui.", - "uploadTitle": "Lataa avatar", - "maxSize": "Enintään {{size}}", - "avatarAlt": "Avatar", - "removeAvatar": "Poista avatar", - "uploadError": "Tiedoston latausvirhe", - "field": { - "username": "Käyttäjänimi", - "email": "Sähköposti", - "password": "Salasana" - }, - "placeholder": { - "password_keep": "Jätä tyhjäksi säilyttääksesi nykyisen salasanan" - }, - "button": { - "update_profile": "Päivitä profiili", - "permissions": "Oikeudet", - "view_global_permissions": "Näytä globaalit oikeudet" - }, - "section": { - "roles": "Roolit", - "accounts": "{{count}} liitettyä tiliä" - }, - "account": { - "id": "Tilin tunnus: {{id}}" - }, - "toast": { - "updated": "Profiili päivitetty", - "update_failed": "Profiilin päivitys epäonnistui" - }, - "validation": { - "username": { - "required": "Käyttäjänimi vaaditaan", - "min": "Käyttäjänimen on oltava vähintään 5 merkkiä", - "max": "Käyttäjänimi voi olla enintään 32 merkkiä" - }, - "email": { - "required": "Sähköposti vaaditaan", - "invalid": "Anna kelvollinen sähköpostiosoite" - }, - "password": { - "min": "Salasanan on oltava vähintään 8 merkkiä", - "max": "Salasana voi olla enintään 256 merkkiä" - } - } - } + "notifications": { + "close": "Sulje", + "copied": "Kopioitu leikepöydälle", + "createFailed": "Luominen epäonnistui", + "createSuccess": "Pääsytunnus luotu", + "createSuccessDesc": "Pääsytunnus on luotu onnistuneesti.", + "deleteFailed": "Poistaminen epäonnistui", + "deleteSuccess": "Tunnus poistettu", + "genericError": "Toiminto epäonnistui. Yritä uudelleen.", + "tryAgain": "Yritä uudelleen", + "updateFailed": "Päivitys epäonnistui", + "updateSuccess": "Pääsytunnus päivitetty", + "updateSuccessDesc": "Pääsytunnus on päivitetty onnistuneesti." }, - "apiDocs": { - "choosePreferredType": "Valitse haluamasi API-dokumentaation tyyppi", - "swaggerUI": "Swagger UI", - "reDoc": "ReDoc", - "openAPIExplorer": "OpenAPI Explorer", - "scalar": "Scalar", - "downloadSpecYAML": "Lataa YAML-määritys" + "page": { + "addBtn": "Lisää tunnus", + "emptyDescription": "Et ole vielä luonut API-tunnuksia. Luo uusi napsauttamalla alta.", + "emptyTitle": "Ei API-tunnuksia", + "loadError": "API-tunnusten lataaminen epäonnistui." + } + }, + "attachment": { + "all_fields_desc": "Täsmää liitteen nimeen, aiheeseen ja lähettäjään", + "date": "Päivämäärä", + "name": "Tiedostonimi", + "search_input_placeholder": "Hae liitteitä (käytä \" \" lausehakuun)", + "sender": "Lähettäjä", + "sender_with_count": "Lähettäjä ({{count}})", + "size": "Tiedostokoko", + "source": "Lähde", + "subject": "Aihe" + }, + "auth": { + "areYouSureYouWantToLogOut": "Oletko varma, että haluat kirjautua ulos?", + "invalidPassword": "Virheellinen salasana. Yritä uudelleen.", + "login": "Kirjaudu sisään", + "loginFailed": "Kirjautuminen epäonnistui", + "logout": "Kirjaudu ulos", + "password": "Salasana", + "sessionExpired": "Istunto vanhentunut!", + "sessionExpiredDesc": "Istuntosi on päättynyt toimettomuuden vuoksi. Kirjaudu sisään jatkaaksesi.", + "somethingWentWrong": "Jotain meni vikaan", + "username": "Käyttäjänimi", + "welcome": "Tervetuloa Bichoniin", + "youWillNeedToLogInAgain": "Sinun on kirjauduttava sisään uudelleen päästäksesi tilillesi." + }, + "command": { + "dark": "Tumma", + "light": "Vaalea", + "noResultsFound": "Ei tuloksia löydy.", + "theme": "Teema", + "typeCommandOrSearch": "Syötä komento tai hae..." + }, + "common": { + "actions": "Toiminnot", + "add": "Lisää", + "all": "Kaikki", + "apply": "Käytä", + "back": "Takaisin", + "backToHome": "Takaisin alkuun", + "cancel": "Peruuta", + "clear": "Tyhjennä", + "close": "Sulje", + "confirm": "Vahvista", + "create": "Luo", + "delete": "Poista", + "deleting": "Poistetaan...", + "deselectAll": "Poista valinnat", + "edit": "Muokkaa", + "empty": "Tyhjä", + "error": "Virhe", + "failed": "Epäonnistui", + "filter": "Suodata", + "goBack": "Mene takaisin", + "loading": "Ladataan...", + "more": "Lisää", + "na": "N/A", + "no": "Ei", + "noData": "Ei tietoja", + "none": "Ei mitään", + "notFound": "Ei löytynyt", + "ok": "OK", + "op_failed": "Toiminto epäonnistui", + "project_description": "Bichon on avoimen lähdekoodin projekti.", + "remove": "Poista", + "reset": "Nollaa", + "retry": "Yritä uudelleen", + "save": "Tallenna", + "save_changes": "Tallenna muutokset", + "search": "Hae", + "select": "Valitse", + "selectAll": "Valitse kaikki", + "showLess": "Näytä vähemmän", + "showMore": "Näytä lisää...", + "submit": "Lähetä", + "table": { + "noResults": "Ei tuloksia." }, - "dialogs": { - "confirmDelete": "Vahvista poisto", - "confirmDeleteDesc": "Oletko varma, että haluat poistaa tämän kohteen? Tätä toimenpidettä ei voi kumota.", - "deleteSuccess": "Poistettu onnistuneesti", - "deleteFailed": "Poisto epäonnistui", - "saveSuccess": "Tallennettu onnistuneesti", - "saveFailed": "Tallennus epäonnistui", - "createSuccess": "Luotu onnistuneesti", - "createFailed": "Luominen epäonnistui", - "updateSuccess": "Päivitetty onnistuneesti", - "updateFailed": "Päivitys epäonnistui", - "continue": "Jatka", - "deleting": "Poistetaan...", - "accountDeleted": "Tili poistettu", - "accountDeletedDesc": "Tilisi on poistettu onnistuneesti.", - "accountDeleteFailed": "Tilin poistaminen epäonnistui", - "deleteAccountPermanently": "Poista tili pysyvästi", - "youAreDeleting": "Olet poistamassa {{email}}. Tämä poistaa pysyvästi:", - "accountCredentials": "Tilin tunnistetiedot ja asetukset", - "localCachedMetadata": "Paikallisesti välimuistiin tallennetut metatiedot ja synkronointitila", - "imapSyncData": "IMAP-synkronointidata", - "oauthTokens": "OAuth-tunnukset ja API-tunnistetiedot", - "typeEmailToConfirm": "Kirjoita tilin sähköpostiosoite vahvistaaksesi:", - "typeToConfirm": "Kirjoita \"{{email}}\" vahvistaaksesi", - "cannotBeUndone": "Tätä toimenpidettä ei voi kumota!", - "allResourcesErased": "Kaikki liittyvät resurssit poistetaan pysyvästi.", - "permanentlyDeleteAccount": "Poista tili pysyvästi" + "tryAgain": "Yritä uudelleen", + "update": "Päivitä", + "view_on_github_button": "Näytä GitHubissa", + "yes": "Kyllä" + }, + "dashboard": { + "account": "Tili", + "actualDiskUsage": "Todellinen levynkäyttö", + "attachmentRatio": "Liiteosuus", + "attachmentRatioDesc": "{{percent}}% sähköposteista sisältää liitteitä", + "attachments": "Liitteet", + "byMessageCount": "Viestimäärän mukaan", + "byMessageSize": "Viestikoon mukaan", + "connected": "Yhdistetty", + "count": "Lukumäärä", + "dataStorage": "Tallennustila", + "dayTrend": "30 päivän trendi", + "efficiency": "Tallennustehokkuus", + "emails": "Sähköpostit", + "indexSize": "Indeksikoko", + "localDataFiles": "Paikalliset datatiedostot", + "logicalVolume": "Alkuperäinen koko", + "mailAccounts": "Sähköpostitilit", + "messageDistribution": "Viestien jakautuminen", + "metadataSize": "Metatietojen koko", + "newEmails": "Uudet sähköpostit", + "noAccountData": "Ei tilitietoja", + "noAttachments": "Ilman liitteitä", + "noEmailsSynced": "Ei synkronoituja sähköposteja vielä", + "noLargeEmails": "Ei suuria sähköposteja", + "noRecentActivity": "Ei viimeaikaisia tapahtumia", + "noSendersData": "Ei lähettäjätietoja", + "noSubject": "(Ei aihetta)", + "saved": "Säästetty", + "sender": "Lähettäjä", + "size": "Koko", + "subject": "Aihe", + "syncedLocally": "Synkronoitu paikallisesti", + "systemVersion": "Järjestelmäversio", + "tantivyDatabase": "Perustuu Tantivy-hakukoneeseen", + "title": "Kojelauta", + "top10Accounts": "10 parasta tiliä", + "top10LargestEmails": "10 suurinta sähköpostia", + "top10Senders": "10 parasta lähettäjää", + "topLists": "Parhaat listat", + "totalEmailSize": "Sähköpostien kokonaiskoko", + "totalEmails": "Sähköpostien kokonaismäärä", + "withAttachments": "Liitteillä" + }, + "dialogs": { + "accountCredentials": "Tilin tunnistetiedot ja asetukset", + "accountDeleteFailed": "Tilin poistaminen epäonnistui", + "accountDeleted": "Tili poistettu", + "accountDeletedDesc": "Tilisi on poistettu onnistuneesti.", + "allResourcesErased": "Kaikki liittyvät resurssit poistetaan pysyvästi.", + "cannotBeUndone": "Tätä toimenpidettä ei voi kumota!", + "confirmDelete": "Vahvista poisto", + "confirmDeleteDesc": "Oletko varma, että haluat poistaa tämän kohteen? Tätä toimenpidettä ei voi kumota.", + "continue": "Jatka", + "createFailed": "Luominen epäonnistui", + "createSuccess": "Luotu onnistuneesti", + "deleteAccountPermanently": "Poista tili pysyvästi", + "deleteFailed": "Poisto epäonnistui", + "deleteSuccess": "Poistettu onnistuneesti", + "deleting": "Poistetaan...", + "imapSyncData": "IMAP-synkronointidata", + "localCachedMetadata": "Paikallisesti välimuistiin tallennetut metatiedot ja synkronointitila", + "oauthTokens": "OAuth-tunnukset ja API-tunnistetiedot", + "permanentlyDeleteAccount": "Poista tili pysyvästi", + "saveFailed": "Tallennus epäonnistui", + "saveSuccess": "Tallennettu onnistuneesti", + "typeEmailToConfirm": "Kirjoita tilin sähköpostiosoite vahvistaaksesi:", + "typeToConfirm": "Kirjoita \"{{email}}\" vahvistaaksesi", + "updateFailed": "Päivitys epäonnistui", + "updateSuccess": "Päivitetty onnistuneesti", + "youAreDeleting": "Olet poistamassa {{email}}. Tämä poistaa pysyvästi:" + }, + "errors": { + "contentNotModified": "Sisältöä ei muutettu!", + "forbidden": "Kielletty", + "forbiddenDesc": "Sinulla ei ole lupaa tarkastella tätä resurssia.", + "forbiddenTitle": "Pääsy kielletty", + "internalServerError": "Sisäinen palvelinvirhe!", + "learnMore": "Lue lisää", + "maintenance": "Huolto", + "maintenanceDesc": "Sivusto on hetkellisesti pois käytöstä. Palaamme pian takaisin verkkoon.", + "maintenanceTitle": "Sivusto on huollossa!", + "networkError": "Verkkovirhe", + "networkErrorDesc": "Palvelimeen ei saada yhteyttä. Tarkista internetyhteytesi ja yritä uudelleen.", + "pageNotFound": "Oho! Sivua ei löydy!", + "pageNotFoundDesc": "Näyttää siltä, että etsimääsi sivua ei ole olemassa tai se on poistettu.", + "somethingWentWrong": "Oho! Jotain meni vikaan :')", + "somethingWentWrongDesc": "Pahoittelemme häiriötä. Yritä myöhemmin uudelleen.", + "unauthorized": "Ei valtuutettu", + "unauthorizedDesc": "Kirjaudu sisään oikeilla tunnuksilla päästäksesi tähän resurssiin.", + "unauthorizedTitle": "Luvaton pääsy" + }, + "mail": { + "account": "Tili", + "attachments": "Liitteet", + "bcc": "Piilokopio", + "cc": "Kopio", + "date": "Päivämäärä", + "delete": "Poista", + "download": "Lataa", + "downloadComplete": "Lataus valmis", + "downloadFailed": "Lataus epäonnistui", + "downloadStarted": "Lataus aloitettu", + "downloaded": "{{id}} ladattu", + "emailViewer": "Sähköpostin katseluohjelma", + "failedToDownloadFile": "Tiedoston lataus epäonnistui", + "failedToLoadEmail": "Sähköpostiviestin lataus epäonnistui.", + "from": "Lähettäjä", + "id": "ID", + "isBeingDownloaded": "{{id}} latautuu", + "noAttachments": "Ei liitteitä", + "noMessageSelected": "Ei valittua viestiä", + "noTagsYet": "Ei tunnisteita vielä", + "onlyNonInlineAttachments": "Vain muut kuin sisäiset liitteet näytetään tässä.", + "showLess": "näytä vähemmän", + "showMore": "näytä lisää...", + "subject": "Aihe", + "tags": "Tunnisteet", + "to": "Vastaanottaja", + "viewThread": "Näytä keskusteluketju" + }, + "mailbox": { + "bulkActions": { + "ariaLabel": "Massatoiminnot {{count}} valitulle {{emailLabel}}", + "clearSelection": "Tyhjennä valinta", + "clearSelectionWithKey": "Tyhjennä valinta ({{key}})", + "delete": "Poista", + "deleteTooltip": "Poista valitut sähköpostit", + "email": "sähköpostille", + "emails": "sähköposteille", + "selected": "valittu" }, - "command": { - "typeCommandOrSearch": "Syötä komento tai hae...", - "noResultsFound": "Ei tuloksia löydy.", - "theme": "Teema", - "light": "Vaalea", - "dark": "Tumma" + "deleteDialog": { + "confirm": "Poista", + "desc": "Oletko varma, että haluat poistaa {{countText}}? Tämä toimenpide poistaa valitun sähköpostin/sähköpostit pysyvästi paikallisesta tietokannasta. Sähköposti/sähköpostit menetetään ikuisesti, eikä niitä voi palauttaa.", + "descCountMultiple": "nämä {{count}} sähköpostia", + "descCountSingle": "tämän sähköpostin", + "errorTitle": "Viestien poistaminen epäonnistui", + "successDesc": "Viestit on poistettu.", + "successTitle": "Viestit poistettu onnistuneesti", + "title": "Poista sähköposti", + "warningDesc": "Jatka varoen.", + "warningTitle": "Varoitus!" + }, + "deleteMailboxDialog": { + "confirm": "Poista pysyvästi", + "desc": "Oletko varma, että haluat poistaa tämän postilaatikon kansion? Tätä toimintoa ei voi peruuttaa.", + "errorTitle": "Poisto epäonnistui", + "successDesc": "Postilaatikon kansio ja sen sisältö on poistettu onnistuneesti.", + "successTitle": "Poisto onnistui", + "title": "Poista postilaatikon kansio", + "warningDesc": "Tämän kansion poistaminen poistaa pysyvästi myös kaikki sen sisältämät arkistoidut sähköpostit ja alikansiot.", + "warningTitle": "Varoitus" + }, + "folders": "Kansiot", + "messages": "Viestit", + "noMessages": "Ei viestejä", + "selectFolder": "Valitse kansio nähdäksesi viestit", + "thread": { + "empty": "Ei viestejä tässä keskusteluketjussa.", + "invalidDate": "Virheellinen päivämäärä", + "loadError": "Keskusteluketjun lataus epäonnistui", + "loadMore": "Lataa lisää", + "loadingMore": "Ladataan...", + "message": "viesti", + "messages": "viestiä", + "noSubject": "(Ei aihetta)", + "title": "Keskusteluketju ({{count}} {{messageLabel}})" + }, + "title": "Sähköposti" + }, + "navigation": { + "accessTokens": "Kulkuavaimet", + "accounts": "Tilit", + "apiDocs": "API-dokumentaatio", + "attachment": "Liitteet", + "auth": "Todennus", + "dashboard": "Kojelauta", + "general": "Yleinen", + "home": "Koti", + "mailbox": "Sähköposti", + "oauth2": "OAuth2", + "other": "Muu", + "settings": "Asetukset", + "users": "Järjestelmän käyttäjät" + }, + "oauth2": { + "aSecretKeyProvidedByTheOAuthProvider": "OAuth-palveluntarjoajan tarjoama salainen avain sovelluksesi todentamiseksi.", + "actions": { + "authorize": "Valtuuta", + "delete": "Poista", + "edit": "Muokkaa", + "openMenu": "Avaa valikko" + }, + "addConfiguration": "Lisää määritys", + "addExtraParams": "Lisää ylimääräisiä parametreja", + "addNew": "Lisää uusi", + "addScope": "Lisää valtuusalue", + "areYouSureYouWantTo": "Oletko varma, että haluat {{action}} tämän OAuth2-asiakasohjelman?", + "areYouSureYouWantToDelete": "Oletko varma, että haluat poistaa", + "authAtatus": "OAuth2-todennuksen tila", + "authFailed": "OAuth2-todennus epäonnistui", + "authSuccess": "OAuth2-todennus onnistui", + "authUrlLabel": "Valtuutus-URL:", + "authorizationUrlCannotBeEmpty": "Valtuutus-URL ei voi olla tyhjä", + "authorizationUrlIsRequired": "Valtuutus-URL on pakollinen", + "authorize": "Valtuuta", + "authorizeAnEmailAccountToStartTheOAuth2AuthorizationProcess": "Valtuuta sähköpostitili aloittaaksesi OAuth2-valtuutusprosessin.", + "authorizeEmailAccount": "Valtuuta sähköpostitili", + "backToLogin": "Takaisin sisäänkirjautumiseen", + "clickSaveWhenDone": "Napsauta Tallenna, kun olet valmis.", + "clientId": "Asiakastunnus (Client ID)", + "clientIdCannotBeEmpty": "Asiakastunnus ei voi olla tyhjä", + "clientIdIsRequired": "Asiakastunnus on pakollinen", + "clientIdLabel": "Asiakastunnus (Client ID):", + "clientSecret": "Asiakassalaisuus (Client Secret)", + "clientSecretCannotBeEmpty": "Asiakassalaisuus ei voi olla tyhjä", + "clientSecretIsRequired": "Asiakassalaisuus on pakollinen", + "clientSecretLabel": "Asiakassalaisuus (Client Secret):", + "createAccount": "Luo tili", + "createNewHere": "Luo uusi täällä.", + "created": "Luotu", + "creating": "Luodaan...", + "creationFailed": "Luominen epäonnistui", + "delete": "Poista", + "deleteFailed": "Poisto epäonnistui, yritä myöhemmin uudelleen", + "deleteSuccess": "Poisto onnistui", + "deleteToken": "Poista tunnus", + "describeThePurposeOfTheOauth2Application": "Kuvaile OAuth2-sovelluksen käyttötarkoitus", + "description": "Hallinnoi automaattisesti kulkutunnusten hakemista, tallentamista ja päivittämistä, varmistaen saumattoman ja aina valmiin todennuskokemuksen.", + "descriptionLabel": "Kuvaus:", + "descriptionMustNotExceed255Characters": "Kuvaus ei saa ylittää 255 merkkiä.", + "disable": "Poista käytöstä", + "disableOAuth2Client": "Poista OAuth2-asiakasohjelma käytöstä", + "disabled": "Poistettu käytöstä", + "edit": "Muokkaa", + "enable": "Ota käyttöön", + "enableOAuth2Client": "Ota OAuth2-asiakasohjelma käyttöön", + "enabled": "Käytössä", + "enterIdToConfirmDeletion": "Syötä ID vahvistaaksesi poiston.", + "enterTheAuthorizationUrl": "Syötä valtuutus-URL", + "enterTheKeyHere": "Syötä avain tähän.", + "enterTheScopeHere": "Syötä valtuusalue tähän.", + "enterTheTokenUrl": "Syötä tunnus-URL", + "enterTheValueHere": "Syötä arvo tähän.", + "enterYourClientId": "Syötä asiakastunnuksesi", + "enterYourClientSecret": "Syötä asiakassalaisuutesi", + "enterYourRedirectUrl": "Syötä uudelleenohjaus-URI", + "error": "Virhe", + "getAuthorizeUrlFailed": "Valtuutus-URL:n haku epäonnistui", + "getAuthorizeUrlFailedDesc": "Valtuutus-URL:n haku epäonnistui, yritä myöhemmin uudelleen", + "gmail": "Gmail", + "goHome": "Siirry kotiin", + "goToAccounts": "Siirry tileihin", + "id": "ID", + "information": "Tiedot", + "invalidAuthorizationUrlFormat": "Virheellinen valtuutus-URL-muoto", + "invalidRedirectUriFormat": "Virheellinen uudelleenohjaus-URI-muoto", + "invalidTokenUrlFormat": "Virheellinen tunnus-URL-muoto", + "key": "Avain:", + "keyCannotBeEmpty": "Avain ei voi olla tyhjä", + "keyIsRequired": "Avain on pakollinen", + "leaveEmptyToKeepExistingSecret": "Jätä tyhjäksi säilyttääksesi olemassa olevan salaisuuden", + "leaveEmptyToKeepTheExistingSecret": "Jätä tyhjäksi säilyttääksesi olemassa olevan salaisuuden, syötä uusi arvo vain päivittääksesi sen.", + "loadingAccounts": "Ladataan tilejä...", + "noConfigurations": "Ei OAuth2-määrityksiä", + "noConfigurationsDesc": "Et ole vielä lisännyt OAuth2-määrityksiä. Lisää yksi aloittaaksesi OAuth2-toimintojen käytön.", + "noEmailAccountsRegistered": "Ei rekisteröityjä sähköpostitilejä. Ole hyvä ja luo sellainen.", + "noProxyAvailable": "Ei välityspalvelinta saatavilla", + "noStatus": "Tämä sivu näyttää OAuth2-todennuksesi tuloksen. Tällä hetkellä ei ole saatavilla erityistä tilaa. Yritä uudelleen tarvittaessa.", + "oauth2ClientHasBeenSuccessfully": "OAuth2-asiakasohjelma on {{action}} onnistuneesti.", + "oauth2ClientUpdated": "OAuth2-asiakasohjelma päivitetty", + "oauth2DeleteFailed": "OAuth2-poisto epäonnistui", + "optional": "Valinnainen", + "outlook": "Outlook", + "pleaseBeCareful": "Ole varovainen, tätä toimenpidettä ei voi kumota.", + "pleaseCreateOne": "Ole hyvä ja luo sellainen.", + "provider": "Palveluntarjoaja", + "quickPresets": "Pikavalinnat:", + "redirectUri": "Uudelleenohjaus-URI", + "redirectUriCannotBeEmpty": "Uudelleenohjaus-URI ei voi olla tyhjä", + "redirectUriIsRequired": "Uudelleenohjaus-URI on pakollinen", + "redirectUrlLabel": "Uudelleenohjaus-URI:", + "save": "Tallenna", + "saveChanges": "Tallenna muutokset", + "saving": "Tallennetaan...", + "scope": "Valtuusalue:", + "scopes": "Valtuusalueet", + "selectAProxy": "Valitse välityspalvelin", + "selectAnAccount": "Valitse tili", + "status": "Tila", + "statusUpdateFailed": "Tilan päivitys epäonnistui, yritä myöhemmin uudelleen", + "success": "Onnistui", + "successMessage": "Sähköpostitilisi on todennettu onnistuneesti OAuth2:n kautta. Järjestelmä on tallentanut kulkutunnuksen ja päivittää sen automaattisesti tarvittaessa.", + "theRedirectUrlAfterAuthorization": "Uudelleenohjaus-URI valtuutuksen jälkeen. Täytyy vastata OAuth-palveluntarjoajalle rekisteröityä. Käytä muotoa http://[host]:[port]/oauth2/callback (tai https://), missä [host] ja [port] vastaavat RustMailer-käyttöönottoasi. Polku /oauth2/callback on kiinteä.", + "theUniqueIdentifierForYourApplication": "Sovelluksesi yksilöllinen tunnus, jonka OAuth-palveluntarjoaja tarjoaa.", + "theUrlUsedToExchange": "URL, jota käytetään valtuutuskoodin vaihtamiseen kulkutunnukseksi.", + "theUrlWhereUsersWillBeRedirected": "URL-osoite, johon käyttäjät ohjataan valtuuttamaan sovelluksesi.", + "thisActionWillPermanentlyRemoveTheOauth2Record": "Tämä toimenpide poistaa OAuth2-tietueen pysyvästi järjestelmästä. Tätä ei voi kumota.", + "thisWillPreventTheOAuth2ClientFromBeingUsed": "Tämä estää OAuth2-asiakasohjelman käytön.", + "title": "OAuth2", + "tokenUrlCannotBeEmpty": "Tunnus-URL ei voi olla tyhjä", + "tokenUrlIsRequired": "Tunnus-URL on pakollinen", + "tokenUrlLabel": "Tunnus-URL:", + "tryAgain": "Yritä uudelleen", + "unknownError": "Tuntematon virhe tapahtui.", + "updateFailed": "Päivitys epäonnistui", + "updateHere": "Päivitä täällä.", + "updateOrCreationFailed": "{{action}} epäonnistui, yritä myöhemmin uudelleen", + "updated": "Päivitetty", + "useProxyOptional": "Käytä välityspalvelinta (valinnainen):", + "useSocks5ProxyForOAuthRequests": "Käytä SOCKS5-välityspalvelinta OAuth-pyyntöihin, kun suora pääsy on estetty.", + "value": "Arvo:", + "valueCannotBeEmpty": "Arvo ei voi olla tyhjä", + "valueIsRequired": "Arvo on pakollinen", + "warning": "Varoitus!", + "whenDisabled": "Kun poistettu käytöstä: - Uudet valtuutusvirrat hylätään välittömästi - Olemassa olevat kulku- ja virheettömyystunnukset peruutetaan minuutin sisällä - Käyttäjien on valtuutettava uudelleen, kun se otetaan uudelleen käyttöön", + "yourOAuth2ApplicationHasBeenSuccessfully": "OAuth2-sovelluksesi on {{action}} onnistuneesti.", + "yourOAuth2ApplicationHasBeenSuccessfullyDeleted": "OAuth2-sovelluksesi on poistettu onnistuneesti." + }, + "permission": { + "account": { + "create": "Sähköpostitilien luominen", + "manage": "Määritettyjen tilien hallinta", + "manage_all": "Kaikkien tiliasetusten hallinta", + "read_details": "Tilin tietojen tarkastelu" + }, + "category": { + "account": "Tilin käyttöoikeudet", + "global_data": "Globaalit tiedot (Ylläpitäjä)", + "system_identity": "Järjestelmä ja identiteetti" + }, + "data": { + "delete": "Määritettyjen sähköpostien poistaminen", + "delete_all": "Kaikkien tilien sähköpostien poistaminen", + "export_batch": "Tietojen erävienti", + "export_batch_all": "Kaikkien tietojen erävienti", + "import_batch": "Sähköpostitietojen erätuonti", + "manage": "Määritetyn sähköpostimetadatan hallinta", + "manage_all": "Kaiken sähköpostimetadatan hallinta", + "raw_download": "Määritettyjen raakaviestien lataaminen", + "raw_download_all": "Kaikkien raakaviestien lataaminen", + "read": "Määritettyjen sähköpostitietojen lukeminen", + "read_all": "Kaikkien sähköpostitietojen lukeminen", + "smtp_ingest": "Vastaanota sähköposteja SMTP-protokollan kautta" + }, + "dialog": { + "account_description": "Valittuun tiliin rajatut käyttöoikeudet.", + "account_title": "Tilikohtaiset käyttöoikeudet", + "global_description": "Tälle käyttäjälle myönnetyt järjestelmänlaajuiset käyttöoikeudet.", + "global_title": "Globaalit käyttöoikeudet" + }, + "scope": { + "account": "Tili #{{id}}", + "global": "Globaali" + }, + "system": { + "access": "Perusjärjestelmän käyttö", + "root": "Täysi järjestelmän hallinta" + }, + "token": { + "manage": "Käyttöoikeustunnusten hallinta" + }, + "user": { + "manage": "Kaikkien käyttäjien hallinta", + "view": "Käyttäjien perustietojen tarkastelu" + } + }, + "profile": { + "avatar_alt": "Profiilikuva", + "menu": { + "profile": "Profiili", + "settings": "Asetukset", + "sign_out": "Kirjaudu ulos" + } + }, + "proxyDelete": { + "close": "Sulje", + "confirmText": "Oletko varma, että haluat poistaa", + "deleteBtn": "Poista", + "failedDesc": "Poisto epäonnistui, yritä myöhemmin uudelleen", + "failedTitle": "Välityspalvelimen poisto epäonnistui", + "permanent": "Tämä toimenpide poistaa välityspalvelimen pysyvästi järjestelmästä. Tätä ei voi kumota.", + "proxyIdLabel": "Välityspalvelimen ID:", + "proxyIdPlaceholder": "Syötä välityspalvelimen ID vahvistaaksesi poiston.", + "successDesc": "Välityspalvelin on poistettu onnistuneesti.", + "successTitle": "Poisto onnistui", + "title": "Poista välityspalvelin", + "tryAgain": "Yritä uudelleen", + "warningDesc": "Ole varovainen, tätä toimenpidettä ei voi kumota.", + "warningTitle": "Varoitus!" + }, + "restore_message": { + "accountsInvolved": "Osalliset tilit", + "bulkTitle": "Palauta useita viestejä", + "bulkWarning": "Huomio: Viestit palautetaan niiden alkuperäisiin kansioihin.", + "confirm": "Suorita palautus", + "desc": "Tämä toiminto lataa valitut viestit uudelleen Bichonista ja palauttaa ne vastaaviin postilaatikoihin IMAP-palvelimella.", + "failed": "Palautus epäonnistui", + "failedTitle": "Palautusvirhe", + "messages": "viestiä", + "restore_to_imap": "Palauta viesti", + "success": "Palautus onnistui", + "successDesc": "Valitut viestit on palautettu onnistuneesti IMAP-palvelimelle.", + "summary": "Palautuksen tiedot", + "title": "Palauta yksittäinen viesti" + }, + "roles": { + "actions": { + "add": "Lisää rooli", + "cancel": "Peruuta", + "close": "Sulje", + "failed": "Toiminto epäonnistui", + "retry": "Yritä uudelleen", + "submit_create": "Luo rooli", + "submit_update": "Päivitä rooli", + "success_create": "Rooli luotiin onnistuneesti", + "success_update": "Rooli päivitettiin onnistuneesti" + }, + "categories": { + "account_resource": "Tilin resurssien hallinta", + "global_data": "Globaali pääsy tietoon", + "identity": "Identiteetti & Hallinta" + }, + "columns": { + "created_at": "Luotu", + "id": "ID", + "name": "Nimi", + "permissions": "Oikeudet", + "role_type": "Tyyppi", + "updated_at": "Päivitetty" + }, + "delete": { + "alert_desc": "Tämän roolin poistaminen poistaa sen kaikilta käyttäjiltä, joille se on määritetty.", + "alert_title": "Varoitus: Pysyvä toiminto.", + "confirm_btn": "Poista rooli", + "confirm_label": "Kirjoita roolin ID vahvistaaksesi:", + "deleting": "Poistetaan...", + "dialog_title": "Poista rooli", + "error_fallback": "Roolia ei voitu poistaa.", + "error_title": "Poisto epäonnistui", + "irreversible": "Tätä toimintoa ei voi peruuttaa.", + "placeholder": "Kirjoita \"{{id}}\"", + "success_desc": "Rooli \"{{name}}\" poistettiin.", + "success_title": "Rooli poistettu", + "warning_text": "Olet poistamassa roolin {{name}} (ID: {{id}}) pysyvästi." + }, + "description_hint": "Määritä käyttöalue ja oikeudet.", + "details": { + "close_btn": "Sulje", + "desc_account": "Pääsy ja toiminnot yksittäisten tilien tietoihin.", + "desc_global": "Globaali hallinta ja järjestelmän pääsyoikeudet.", + "role_badge": "{{type}}-rooli", + "title": "Oikeudet: {{name}}", + "unknown": "Tuntematon rooli", + "view_permissions": "Katso yksityiskohdat" + }, + "empty": { + "desc": "Et ole vielä luonut mukautettuja rooleja.", + "title": "Rooleja ei löytynyt" + }, + "form": { + "builtin_badge": "Järjestelmärooli", + "builtin_desc": "Tämä rooli on ennalta määritetty ja vain luku -muodossa.", + "desc_label": "Kuvaus", + "matrix_label": "Oikeusmatriisi ({{type}})", + "name_label": "Roolin nimi", + "type_label": "Roolin tyyppi" + }, + "placeholder": { + "filter": "Hae rooleja..." + }, + "title": { + "create": "Luo uusi rooli", + "edit": "Muokkaa roolia: {{name}}" + }, + "types": { + "Account": "Tili", + "Global": "Globaali" }, "validation": { - "required": "Tämä kenttä on pakollinen", - "invalidEmail": "Virheellinen sähköpostiosoite", - "invalidUrl": "Virheellinen URL-osoite", - "passwordMinLength": "Salasanan on oltava vähintään {{min}} merkkiä pitkä", - "pleaseEnterPassword": "Syötä salasanasi", - "passwordRequired": "Salasana on pakollinen, kun todennusmenetelmä on Salasana", - "emailRequired": "Sähköposti on pakollinen", - "imapHostRequired": "IMAP-isäntä on pakollinen", - "imapHostCannotBeEmpty": "IMAP-isäntä ei voi olla tyhjä", - "imapPortMustBePositive": "IMAP-portin on oltava positiivinen kokonaisluku", - "imapPortMustBeLessThan65536": "IMAP-portin on oltava pienempi kuin 65536", - "folderLimitMustBeNumber": "Kansiorajan on oltava numero", - "folderLimitMustBeAtLeast100": "Kansiorajan on oltava vähintään 100", - "incrementalSyncMustBeNumber": "Lisäävän synkronoinnin välin on oltava numero", - "incrementalSyncMustBeAtLeast10": "Lisäävän synkronoinnin välin on oltava vähintään 10 minuuttia", - "pleaseEnterUsernameOrEmail": "Ole hyvä ja anna käyttäjänimesi tai sähköpostiosoitteesi", - "singleRequestBatchSizeMustBeNumber": "Eräkoko tulee olla numero", - "singleRequestBatchSizeTooSmall": "Eräkoko tulee olla vähintään 10", - "singleRequestBatchSizeTooLarge": "Eräkoko tulee olla enintään 200" - }, - "table": { - "noResults": "Ei tuloksia löydy", - "loading": "Ladataan...", - "page": "Sivu", - "of": "kohteesta", - "rowsPerPage": "Rivejä sivulla", - "showing": "Näytetään", - "to": "asti", - "results": "tuloksia", - "asc": "Nouseva", - "desc": "Laskeva", - "hide": "Piilota", - "edit": "Muokkaa", - "delete": "Poista", - "pagination": { - "selected": "{{selected}} / {{total}} riviä valittu.", - "fixed_page_size": "{{size}} riviä sivulla.", - "rows_per_page": "Rivejä per sivu", - "page_info": "Sivu {{page}} / {{total}}", - "first": "Ensimmäinen sivu", - "previous": "Edellinen sivu", - "next": "Seuraava sivu", - "last": "Viimeinen sivu" - } - }, - "proxyDelete": { - "title": "Poista välityspalvelin", - "successTitle": "Poisto onnistui", - "successDesc": "Välityspalvelin on poistettu onnistuneesti.", - "close": "Sulje", - "failedTitle": "Välityspalvelimen poisto epäonnistui", - "failedDesc": "Poisto epäonnistui, yritä myöhemmin uudelleen", - "tryAgain": "Yritä uudelleen", - "confirmText": "Oletko varma, että haluat poistaa", - "permanent": "Tämä toimenpide poistaa välityspalvelimen pysyvästi järjestelmästä. Tätä ei voi kumota.", - "proxyIdLabel": "Välityspalvelimen ID:", - "proxyIdPlaceholder": "Syötä välityspalvelimen ID vahvistaaksesi poiston.", - "warningTitle": "Varoitus!", - "warningDesc": "Ole varovainen, tätä toimenpidettä ei voi kumota.", - "deleteBtn": "Poista" - }, - "systemConfig": { - "pageTitle": "Järjestelmätason konfiguraatiot", - "pageDescription": "Nämä parametrit alustetaan CLI-lippujen tai ympäristömuuttujien kautta. Ne ovat vain luku -tilassa.", - "status": { - "enabled": "Käytössä", - "disabled": "Ei käytössä", - "configured": "Konfiguroitu", - "missing": "Puuttuu", - "auto": "Automaattinen", - "notSet": "Ei asetettu" - }, - "sections": { - "network": { - "title": "Verkko", - "desc": "HTTP ja julkinen pääsy" - }, - "cors": { - "title": "CORS", - "desc": "Cross-origin-käyttösäännöt" - }, - "logging": { - "title": "Lokitukset", - "desc": "Lokien tulostuskäyttäytyminen" - }, - "storage": { - "title": "Tallennus ja välimuisti", - "desc": "Tietokantapolut ja rajoitukset" - }, - "security": { - "title": "Turvallisuus", - "desc": "Todennus ja salaus" - }, - "performance": { - "title": "Suorituskyky", - "desc": "Samanaikaisuus ja pakkaus" - }, - "smtp": { - "title": "SMTP-palvelin", - "desc": "Saapuvan postin vastaanottoasetukset reaaliaikaista arkistointia varten" - } - } - }, - "apiTokens": { - "page": { - "loadError": "API-tunnusten lataaminen epäonnistui.", - "emptyTitle": "Ei API-tunnuksia", - "emptyDescription": "Et ole vielä luonut API-tunnuksia. Luo uusi napsauttamalla alta.", - "addBtn": "Lisää tunnus" - }, - "list": { - "unnamedToken": "Nimetön tunnus", - "statusActive": "Aktiivinen", - "statusExpired": "Vanhentunut", - "neverExpires": "Ei vanhene koskaan", - "expiresOnShort": "Vanhenee {{date}}", - "tokenLabel": "Tunnus", - "createdLabel": "Luotu", - "lastUsedLabel": "Viimeksi käytetty", - "expiresOnLabel": "Vanhenee", - "neverUsed": "Ei koskaan", - "neverLabel": "Ei koskaan", - "deleteBtn": "Poista tunnus" - }, - "dialog": { - "createTitle": "Luo pääsytunnus", - "editTitle": "Muokkaa pääsytunnusta", - "description": "Napsauta tallenna, kun olet valmis.", - "save": "Tallenna", - "saveChanges": "Tallenna muutokset" - }, - "deleteDialog": { - "title": "Poistetaanko pääsytunnus?", - "description": "Tätä toimintoa ei voi peruuttaa. Kaikki sovellukset, jotka käyttävät tätä tunnusta, menettävät pääsyn välittömästi.", - "cancel": "Peruuta", - "confirm": "Poista", - "deleting": "Poistetaan..." - }, - "form": { - "nameLabel": "Nimi", - "namePlaceholder": "Anna tunnukselle lyhyt nimi", - "nameDescription": "Valinnainen · Enintään 32 merkkiä", - "expirationLabel": "Vanhentuminen", - "expirationPlaceholder": "Valitse vanhentumisaika", - "expirationDescription": "Tunnukset vanhenevat automaattisesti valitun ajan kuluttua.", - "never": "Ei koskaan", - "1day": "1 päivä", - "7days": "7 päivää", - "30days": "30 päivää", - "errorMax": "Enintään 32 merkkiä", - "errorNumber": "On oltava numero", - "errorInt": "On oltava kokonaisluku", - "errorPositive": "On oltava suurempi kuin 0" - }, - "notifications": { - "createSuccess": "Pääsytunnus luotu", - "createSuccessDesc": "Pääsytunnus on luotu onnistuneesti.", - "updateSuccess": "Pääsytunnus päivitetty", - "updateSuccessDesc": "Pääsytunnus on päivitetty onnistuneesti.", - "createFailed": "Luominen epäonnistui", - "updateFailed": "Päivitys epäonnistui", - "deleteSuccess": "Tunnus poistettu", - "deleteFailed": "Poistaminen epäonnistui", - "copied": "Kopioitu leikepöydälle", - "genericError": "Toiminto epäonnistui. Yritä uudelleen.", - "close": "Sulje", - "tryAgain": "Yritä uudelleen" - } - }, - "permission": { - "scope": { - "global": "Globaali", - "account": "Tili #{{id}}" - }, - "dialog": { - "global_title": "Globaalit käyttöoikeudet", - "account_title": "Tilikohtaiset käyttöoikeudet", - "global_description": "Tälle käyttäjälle myönnetyt järjestelmänlaajuiset käyttöoikeudet.", - "account_description": "Valittuun tiliin rajatut käyttöoikeudet." - }, - "category": { - "system_identity": "Järjestelmä ja identiteetti", - "global_data": "Globaalit tiedot (Ylläpitäjä)", - "account": "Tilin käyttöoikeudet" - }, - "system": { - "access": "Perusjärjestelmän käyttö", - "root": "Täysi järjestelmän hallinta" - }, - "user": { - "manage": "Kaikkien käyttäjien hallinta", - "view": "Käyttäjien perustietojen tarkastelu" - }, - "token": { - "manage": "Käyttöoikeustunnusten hallinta" - }, - "account": { - "create": "Sähköpostitilien luominen", - "manage": "Määritettyjen tilien hallinta", - "manage_all": "Kaikkien tiliasetusten hallinta", - "read_details": "Tilin tietojen tarkastelu" - }, - "data": { - "read": "Määritettyjen sähköpostitietojen lukeminen", - "read_all": "Kaikkien sähköpostitietojen lukeminen", - "manage": "Määritetyn sähköpostimetadatan hallinta", - "manage_all": "Kaiken sähköpostimetadatan hallinta", - "raw_download": "Määritettyjen raakaviestien lataaminen", - "raw_download_all": "Kaikkien raakaviestien lataaminen", - "delete": "Määritettyjen sähköpostien poistaminen", - "delete_all": "Kaikkien tilien sähköpostien poistaminen", - "export_batch": "Tietojen erävienti", - "export_batch_all": "Kaikkien tietojen erävienti", - "import_batch": "Sähköpostitietojen erätuonti", - "smtp_ingest": "Vastaanota sähköposteja SMTP-protokollan kautta" - } - }, - "users": { - "columns": { - "id": "ID", - "avatar": "Avatar", - "username": "Käyttäjänimi", - "email": "Sähköposti", - "roles": "Roolit & käyttöoikeudet", - "created_at": "Luotu", - "updated_at": "Päivitetty", - "actions": "Toiminnot" - }, - "buttons": { - "add": "Lisää käyttäjä", - "add_new": "Uusi käyttäjä" - }, - "empty": { - "title": "Käyttäjiä ei löytynyt", - "description": "Lisää ensimmäinen käyttäjä napsauttamalla alla olevaa painiketta." - }, - "nav": { - "users": "Käyttäjät", - "roles": "Roolit", - "api_tokens": "API-avaimet" - }, - "api_tokens": { - "empty": { - "title": "API-avaimia ei löytynyt", - "description": "Järjestelmässä ei ole vielä luotu yhtään API-tunnusta." - }, - "button": { - "generate": "Luo uusi avain" - }, - "toolbar": { - "search_placeholder": "Hae nimellä, omistajalla tai avaimella..." - }, - "table": { - "name": "Nimi", - "type": "Tyyppi", - "last_used": "Viimeksi käytetty", - "expires_at": "Vanhenee", - "owner": "Omistaja", - "created": "Luotu", - "api_key": "API-avain", - "web_ui": "Web UI", - "never": "Ei koskaan", - "permanent": "Pysyvä", - "expired": "Vanhentunut", - "unnamed": "Nimetön avain" - }, - "unnamed": "Nimetön avain", - "delete": { - "title": "Poista API-avain", - "desc": "Olet poistamassa tämän API-avaimen pysyvästi", - "prefix": "Avaimen etuliite", - "irreversible": "Tätä toimintoa ei voi peruuttaa. Kaikki tätä avainta käyttävät sovellukset menettävät pääsyn välittömästi.", - "confirm_label": "Vahvista kirjoittamalla {{word}} alle:", - "confirm_placeholder": "Kirjoita \"{{word}}\" vahvistaaksesi", - "warning_title": "Varoitus", - "warning_desc": "Kaikki tätä avainta käyttävät skriptit tai palvelut lakkaavat toimimasta. Varmista, että olet päivittänyt järjestelmäsi.", - "confirm_button": "Poista avain", - "deleting": "Poistetaan..." - }, - "toast": { - "deleted_title": "API-avain poistettu", - "deleted_desc": "Avain \"{{name}}\" poistettiin onnistuneesti.", - "delete_failed_title": "Poisto epäonnistui", - "delete_failed": "Avainta ei voitu poistaa, yritä uudelleen." - } - }, - "tokens": { - "schema": { - "name_max": "Enintään 32 merkkiä", - "expire_number": "On oltava luku", - "expire_int": "On oltava kokonaisluku", - "expire_positive": "On oltava suurempi kuin 0" - }, - "toast": { - "update_success_title": "Avain päivitetty", - "update_success_desc": "Pääsyavain päivitettiin onnistuneesti.", - "create_success_title": "Avain luotu", - "create_success_desc": "Pääsyavain luotiin onnistuneesti.", - "update_failed_title": "Päivitys epäonnistui", - "create_failed_title": "Luonti epäonnistui" - }, - "error": { - "fallback": "Toiminto epäonnistui, yritä myöhemmin uudelleen." - }, - "dialog": { - "edit_title": "Muokkaa pääsyavainta", - "create_title": "Luo pääsyavain", - "description": "Napsauta Tallenna, kun olet valmis." - }, - "fields": { - "name_label": "Nimi", - "name_placeholder": "Anna avaimelle lyhyt nimi", - "name_hint": "Valinnainen · Enintään 32 merkkiä", - "expire_label": "Vanhentuminen", - "expire_placeholder": "Valitse aika", - "expire_hint": "Avain vanhenee automaattisesti valitun ajan kuluttua." - }, - "expire_options": { - "never": "Ei koskaan", - "1_day": "1 päivä", - "7_days": "7 päivää", - "30_days": "30 päivää" - } - }, - "tokens_action": { - "dialog": { - "title": "API-avaimet", - "description": "Hallitse tämän käyttäjän API-avaimia." - }, - "empty": { - "title": "Ei API-avaimia", - "description": "Tällä käyttäjällä ei ole tällä hetkellä API-avaimia." - }, - "buttons": { - "add": "Lisää avain" - }, - "list": { - "unnamed_token": "Nimetön avain", - "status_expired": "Vanhentunut", - "status_active": "Aktiivinen", - "expires_on_brief": "Vanhenee {{date}}", - "never_expires": "Ei koskaan", - "label_token": "Avain", - "label_created": "Luotu", - "label_last_used": "Käytetty", - "label_expires_at": "Vanhenee", - "never": "Ei koskaan", - "button_delete": "Poista avain" - }, - "delete_dialog": { - "title": "Poistetaanko pääsyavain?", - "description": "Tätä toimintoa ei voi peruuttaa." - } - }, - "actions": { - "schema": { - "account_required": "Valitse tili", - "role_required": "Valitse rooli", - "username_required": "Käyttäjänimi on pakollinen", - "username_min": "Vähintään 3 merkkiä", - "username_max": "Enintään 32 merkkiä", - "email_required": "Sähköposti on pakollinen", - "email_invalid": "Anna kelvollinen sähköpostiosoite", - "global_role_required": "Määritä vähintään yksi globaali rooli", - "description_max": "Kuvaus enintään 256 merkkiä", - "ip_invalid": "Virheellinen IP-osoite", - "password_required": "Salasana on pakollinen", - "password_min": "Vähintään 8 merkkiä", - "password_max": "Enintään 256 merkkiä" - }, - "toast": { - "updated": "Käyttäjä päivitetty", - "created": "Käyttäjä luotu" - }, - "dialog": { - "edit_title": "Muokkaa käyttäjää: {{name}}", - "create_title": "Luo uusi käyttäjä", - "subtitle": "Määritä identiteetti, pääsytasot ja tietoturvakäytännöt." - }, - "tabs": { - "general": "Yleiset", - "permissions": "Tilin oikeudet", - "security": "Turvallisuus & ACL" - }, - "sections": { - "basic": "Perustiedot", - "global": "Globaalit oikeudet", - "mail_access": "Sähköpostin hallinta", - "mail_access_subtitle": "Sähköpostitilit, joita tämä käyttäjä voi hallita.", - "policy": "Käytännöt" - }, - "fields": { - "username": "Käyttäjänimi", - "username_hint": "Yksilöllinen tunnus kirjautumiseen.", - "email": "Sähköpostiosoite", - "email_hint": "Ensisijainen yhteys- ja ilmoitusosoite.", - "password": "Salasana", - "password_placeholder_create": "Vähintään 8 merkkiä", - "password_placeholder_edit": "Jätä tyhjäksi säilyttääksesi nykyisen", - "password_hint_create": "Turvallinen salasana uudelle käyttäjälle.", - "password_hint_edit": "Kirjoita uusi vain, jos haluat vaihtaa sen.", - "global_roles_hint": "Määritä järjestelmäoikeudet.", - "description": "Kuvaus (valinnainen)", - "description_placeholder": "Huomautuksia käyttäjästä...", - "description_hint": "Sisäiset huomautukset (enintään 256 merkkiä).", - "select_account": "Valitse tili", - "assign_role": "Määritä rooli", - "ip_whitelist": "IP-sallintalista", - "ip_whitelist_hint": "Rajoita kirjautuminen näihin IP-osoitteisiin (yksi per rivi).", - "rate_quota": "Nopeusrajoitus", - "burst_interval": "Ryöppyväli (sek)" - }, - "buttons": { - "add_account": "Lisää tili", - "update": "Päivitä käyttäjä", - "create": "Luo käyttäjä" - }, - "states": { - "full_access": "Täydet oikeudet -tila", - "full_access_desc": "Ylläpitäjillä on oletusarvoisesti pääsy kaikkiin tileihin.", - "no_accounts": "Ei määritettyjä tilejä.", - "security_disabled": "Turvakäytännöt on poistettu käytöstä." - }, - "api_tokens": "API-avaimet", - "placeholder": { - "filter": "Hae käyttäjiä..." - }, - "delete": { - "title": "Poista käyttäjä", - "confirm_msg": "Olet poistamassa käyttäjän {{name}} (ID: {{id}}) pysyvästi.", - "irreversible": "Tätä toimintoa ei voi peruuttaa.", - "input_label": "Kirjoita käyttäjän ID vahvistaaksesi:", - "placeholder": "Kirjoita \"{{id}}\"", - "alert_title": "Varoitus: Pysyvä toiminto.", - "alert_desc": "Käyttäjä ja kaikki siihen liittyvät tiedot poistetaan.", - "button_confirm": "Poista käyttäjä", - "button_deleting": "Poistetaan...", - "toast": { - "success_title": "Käyttäjä poistettu", - "success_desc": "Käyttäjä \"{{name}}\" poistettiin onnistuneesti.", - "failed_title": "Poisto epäonnistui", - "failed_fallback": "Käyttäjää ei voitu poistaa." - } - } - } - }, - "roles": { - "title": { - "create": "Luo uusi rooli", - "edit": "Muokkaa roolia: {{name}}" - }, - "description_hint": "Määritä käyttöalue ja oikeudet.", - "form": { - "name_label": "Roolin nimi", - "type_label": "Roolin tyyppi", - "desc_label": "Kuvaus", - "matrix_label": "Oikeusmatriisi ({{type}})", - "builtin_badge": "Järjestelmärooli", - "builtin_desc": "Tämä rooli on ennalta määritetty ja vain luku -muodossa." - }, - "types": { - "Global": "Globaali", - "Account": "Tili" - }, - "categories": { - "identity": "Identiteetti & Hallinta", - "global_data": "Globaali pääsy tietoon", - "account_resource": "Tilin resurssien hallinta" - }, - "actions": { - "cancel": "Peruuta", - "submit_create": "Luo rooli", - "submit_update": "Päivitä rooli", - "success_create": "Rooli luotiin onnistuneesti", - "success_update": "Rooli päivitettiin onnistuneesti", - "failed": "Toiminto epäonnistui", - "close": "Sulje", - "retry": "Yritä uudelleen", - "add": "Lisää rooli" - }, - "validation": { - "name_required": "Roolin nimi on pakollinen", - "perm_required": "Valitse vähintään yksi oikeus" - }, - "columns": { - "id": "ID", - "name": "Nimi", - "role_type": "Tyyppi", - "permissions": "Oikeudet", - "created_at": "Luotu", - "updated_at": "Päivitetty" - }, - "placeholder": { - "filter": "Hae rooleja..." - }, - "delete": { - "dialog_title": "Poista rooli", - "warning_text": "Olet poistamassa roolin {{name}} (ID: {{id}}) pysyvästi.", - "irreversible": "Tätä toimintoa ei voi peruuttaa.", - "confirm_label": "Kirjoita roolin ID vahvistaaksesi:", - "placeholder": "Kirjoita \"{{id}}\"", - "alert_title": "Varoitus: Pysyvä toiminto.", - "alert_desc": "Tämän roolin poistaminen poistaa sen kaikilta käyttäjiltä, joille se on määritetty.", - "confirm_btn": "Poista rooli", - "deleting": "Poistetaan...", - "success_title": "Rooli poistettu", - "success_desc": "Rooli \"{{name}}\" poistettiin.", - "error_title": "Poisto epäonnistui", - "error_fallback": "Roolia ei voitu poistaa." - }, - "details": { - "title": "Oikeudet: {{name}}", - "unknown": "Tuntematon rooli", - "role_badge": "{{type}}-rooli", - "desc_global": "Globaali hallinta ja järjestelmän pääsyoikeudet.", - "desc_account": "Pääsy ja toiminnot yksittäisten tilien tietoihin.", - "close_btn": "Sulje", - "view_permissions": "Katso yksityiskohdat" - }, - "empty": { - "title": "Rooleja ei löytynyt", - "desc": "Et ole vielä luonut mukautettuja rooleja." - } - }, - "profile": { - "avatar_alt": "Profiilikuva", - "menu": { - "profile": "Profiili", - "settings": "Asetukset", - "sign_out": "Kirjaudu ulos" - } - }, - "sign_out": { - "title": "Kirjaudu ulos", - "desc": "Haluatko varmasti kirjautua ulos? Sinun täytyy kirjautua uudelleen päästäksesi tilillesi.", - "confirm": "Kirjaudu ulos" - }, - "restore_message": { - "title": "Palauta yksittäinen viesti", - "bulkTitle": "Palauta useita viestejä", - "bulkWarning": "Huomio: Viestit palautetaan niiden alkuperäisiin kansioihin.", - "accountsInvolved": "Osalliset tilit", - "summary": "Palautuksen tiedot", - "messages": "viestiä", - "desc": "Tämä toiminto lataa valitut viestit uudelleen Bichonista ja palauttaa ne vastaaviin postilaatikoihin IMAP-palvelimella.", - "confirm": "Suorita palautus", - "restore_to_imap": "Palauta viesti", - "success": "Palautus onnistui", - "successDesc": "Valitut viestit on palautettu onnistuneesti IMAP-palvelimelle.", - "failed": "Palautus epäonnistui", - "failedTitle": "Palautusvirhe" - }, - "time": { - "label": "Aika", - "since": "Alkaen", - "before": "Ennen", - "recent_range": "Viimeisin aikaväli (alkaen...)", - "historical": "Historiallinen aikaväli (ennen...)", - "absolute_range": "Kiinteä päivämääräväli", - "last_day": "Viimeiset 1 päivä", - "last_days": "Viimeiset {{count}} päivää", - "last_months": "Viimeiset {{count}} kuukautta", - "over_years_ago": "{{count}} {{unit}} sitten", - "year": "vuosi", - "years": "vuotta", - "recent_prefix": "Viimeisin:", - "days_ago_to_now": "päivää sitten – nyt", - "apply": "Käytä", - "start_date": "Aloituspäivä", - "end_date": "Päättymispäivä", - "clear_filters": "Tyhjennä aikasuodattimet", - "format": "yyyy-MM-dd" - }, - "tag": { - "label": "Tunnisteet", - "search_placeholder": "Hae tunnisteita...", - "clear_all": "Tyhjennä kaikki tunnisteet", - "no_tags_found": "Tunnisteita ei löytynyt" - }, - "search_accounts": { - "label": "Sähköpostitilit", - "search_placeholder": "Hae sähköpostitilejä...", - "clear_accounts": "Poista valitut tilit", - "no_accounts_found": "Tilejä ei löytynyt" - }, - "search_mailbox": { - "label": "Postilaatikot", - "search_placeholder": "Hae postilaatikoita", - "clear_mailboxes": "Poista valitut kansiot", - "select_account_first": "Valitse ensin sähköpostitili", - "no_mailbox_found": "Kansiota ei löytynyt" - }, - "search_contacts": { - "label": "Yhteystiedot", - "label_with_count": "Yhteystiedot ({{count}})", - "any": "Kaikki", - "search_placeholder": "Hae {{field}}...", - "reset_all": "Palauta kaikki yhteystiedot", - "no_contact_found": "Yhteystietoja ei löytynyt", - "loading": "Ladataan...", - "showing_limit": "Näytetään vain ensimmäiset 100 tulosta • Yhteensä {{total}}" - }, - "search_more": { - "trigger_label": "Lisäasetukset", - "title": "Lisäsuodattimet", - "reset": "Palauta", - "has_attachment": "Sisältää liitteen", - "attachment_name_label": "Liitteen nimi", - "attachment_name_placeholder": "Esim.: invoice.pdf", - "message_size_label": "Viestin koko", - "message_id_label": "Alkuperäinen Message-ID", - "message_id_description": "Hae sähköpostin Message-ID-otsikon perusteella", - "apply": "Käytä suodattimia", - "size_presets": { - "any": "Mikä tahansa koko", - "tiny": "Erittäin pieni (< 15 KB)", - "small": "Pieni (< 2 MB)", - "medium": "Keskikokoinen (2 – 10 MB)", - "large": "Suuri (10 – 20 MB)", - "huge": "Erittäin suuri (> 20 MB)" - }, - "any": "Mikä tahansa", - "search_placeholder": "Etsi {{field}}...", - "extension": "Tiedostopääte", - "category": "Liitekategoria", - "content_types": "Tarkka tyyppi" - }, - "search_view": { - "button_label": "Näkymä", - "menu_title": "Sarakeasetukset" - }, - "search_reset": { - "label": "Palauta", - "tooltip": "Poista kaikki suodattimet" - }, - "search_input": { - "placeholder": "Hae sähköposteja... (Regex tuettu)", - "button": "Hae", - "recent_title": "Viimeisimmät haut", - "clear_history": "Tyhjennä historia", - "no_history": "Ei hakuhistoriaa", - "all": "Kaikki", - "all_fields_desc": "Hakee aiheesta, tekstistä, lähettäjästä ja vastaanottajista", - "subject": "Aihe", - "body": "Viestiosa" + "name_required": "Roolin nimi on pakollinen", + "perm_required": "Valitse vähintään yksi oikeus" } + }, + "search": { + "account": "Tili", + "addEmailAccount": "Lisää sähköpostitili", + "addTags": { + "cancel": "Peruuta", + "createHint": "Luo uusi tunnus: {{tag}}", + "invalidTitle": "Virheellinen tunnus", + "none": "Ei tunnisteita lisätty vielä", + "save": "Tallenna", + "saving": "Tallennetaan...", + "searchPlaceholder": "Hae tai luo tunnisteita...", + "selectedCount": "{{count}} tunnus(ta) valittu", + "title": "Muokkaa tunnisteita", + "tryAgain": "Yritä myöhemmin uudelleen", + "updateFailedTitle": "Päivitys epäonnistui", + "updatedDesc": "Tunnisteet on päivitetty onnistuneesti", + "updatedTitle": "Tunnisteet päivitetty" + }, + "adjustSearch": "Yritä muuttaa hakukriteerejäsi tai tyhjennä suodattimet.", + "advanced": "Tarkennettu", + "advancedFilters": "Tarkennetut suodattimet", + "any": "Kaikki", + "attachmentName": "Liitteen nimi", + "attachmentsSize": "Liitteet ja koko", + "bcc": "Piilokopio", + "before": "Ennen:", + "bulkActions": { + "ariaLabel": "{{count}} viestiä valittu. Toimintopalkki", + "clear": "Tyhjennä valinnat", + "delete": "Poista", + "deleteDesc": "Poista valitut viestit", + "manageTags": "Hallitse tunnisteita", + "selected": "{{count}} valittu" + }, + "cc": "Kopio", + "clear": "Tyhjennä", + "date": "Päivämäärä", + "dateRange": "Päivämääräväli", + "delete": { + "confirmButton": "Poista", + "confirmDetail": "Tätä toimintoa ei voi peruuttaa.", + "confirmPrefix": "Haluatko varmasti poistaa", + "countLabel": "{{count}} viestiä?", + "errorTitle": "Poisto epäonnistui", + "successDesc": "Viestien poisto onnistui.", + "successTitle": "Poistettu", + "title": "Poista viestit", + "warningDesc": "Viestit poistetaan pysyvästi.", + "warningTitle": "Varoitus" + }, + "editTag": "Muokkaa tunnistetta", + "endDate": "Loppupäivämäärä", + "from": "Lähettäjä", + "fullTextMultiAccount": "Koko teksti · Usean tilin · Tarkennetut suodattimet", + "hasAttachment": "Sisältää liitteen", + "huge": "Valtava (≥20 MB)", + "keyword": "Avainsana", + "large": "Suuri (10 - 20 MB)", + "mailbox": "Sähköposti", + "maxSize": "Maksimikoko", + "maximumBytes": "Maksimi (tavua)", + "medium": "Keskikokoinen (2 - 10 MB)", + "messageId": "Viestin ID", + "minSize": "Minimikoko", + "minimumBytes": "Minimi (tavua)", + "no": "Ei", + "noActiveEmailAccount": "Ei aktiivista sähköpostitiliä.", + "noEmailsFound": "Ei sähköposteja löydy", + "noMailboxSelectAccount": "Ei sähköpostia. Valitse ensin tili.", + "originalMessageIdHeader": "Alkuperäisen sähköpostin Message-ID -otsikko", + "pleaseSelectAtLeastOne": "Valitse vähintään yksi hakukriteeri", + "preview": "Esikatselu", + "recipient": "Vastaanottaja", + "searchArchivedEmails": "Hae arkistoiduista sähköposteista", + "searchButton": "Hae", + "searchInSubjectBody": "Hae otsikosta, sisällöstä, liitteistä...", + "searching": "Haetaan, odota hetki...", + "searchingButton": "Haetaan...", + "selectAccount": "Valitse tili", + "selectDate": "Valitse päivämäärä", + "selectMailbox": "Valitse sähköposti", + "sender": "Lähettäjä", + "senderRecipients": "Lähettäjä / Vastaanottajat", + "since": "Alkaen:", + "size": "Koko", + "sizeDescription": "Koko tarkoittaa sähköpostin kokonaiskokoa, liitteet mukaan lukien.", + "small": "Pieni (<2 MB)", + "sort": "Lajittele", + "source": "Lähde", + "startDate": "Alkupäivämäärä", + "startSearching": "Aloita hakeminen avainsanalla, lähettäjällä tai käytä tarkennettuja suodattimia.", + "subject": "Aihe", + "tagFilter": "Tunnistesuodatin", + "thread": { + "empty": "Ei viestejä tässä keskusteluketjussa", + "error": "Keskusteluketjun lataus epäonnistui", + "invalidDate": "Virheellinen päivämäärä", + "loadMore": "Lataa lisää", + "loadingMore": "Ladataan...", + "noSubject": "(Ei aihetta)", + "title": "Keskusteluketju · {{count}} viestiä" + }, + "tiny": "Erittäin pieni (<15 KB)", + "title": "Hae", + "to": "Vastaanottaja", + "updateTags": { + "actionAdd": "Lisää", + "actionOverwrite": "Korvaa", + "actionRemove": "Poista", + "cancel": "Peruuta", + "createHint": "Paina Enter luodaksesi uuden tunnisteen: \"{{tag}}\"", + "invalidTitle": "Virheellinen tunniste", + "none": "Ei valittuja tunnisteita", + "overwriteWarning": "Varoitus: Tämä korvaa kaikki valittujen kohteiden olemassa olevat tunnisteet.", + "savingAdd": "Lisätään...", + "savingOverwrite": "Korvataan...", + "savingRemove": "Poistetaan...", + "searchPlaceholder": "Hae tai luo uusi tunniste...", + "selectedCount": "{{count}} tunniste(tta) otetaan käyttöön", + "submitAdd": "Lisää tunnisteet", + "submitOverwrite": "Korvaa tunnisteet", + "submitRemove": "Poista tunnisteet", + "title": "Päivitä tunnisteet", + "tryAgain": "Yritä myöhemmin uudelleen.", + "updateFailedTitle": "Päivitys epäonnistui", + "updatedDesc": "Tunnisteet on päivitetty onnistuneesti.", + "updatedTitle": "Tunnisteet päivitetty" + }, + "yes": "Kyllä" + }, + "search_accounts": { + "clear_accounts": "Poista valitut tilit", + "label": "Sähköpostitilit", + "no_accounts_found": "Tilejä ei löytynyt", + "search_placeholder": "Hae sähköpostitilejä..." + }, + "search_contacts": { + "any": "Kaikki", + "label": "Yhteystiedot", + "label_with_count": "Yhteystiedot ({{count}})", + "loading": "Ladataan...", + "no_contact_found": "Yhteystietoja ei löytynyt", + "reset_all": "Palauta kaikki yhteystiedot", + "search_placeholder": "Hae {{field}}...", + "showing_limit": "Näytetään vain ensimmäiset 100 tulosta • Yhteensä {{total}}" + }, + "search_input": { + "all": "Kaikki", + "all_fields_desc": "Hakee aiheesta, tekstistä, lähettäjästä ja vastaanottajista", + "body": "Viestiosa", + "button": "Hae", + "clear_history": "Tyhjennä historia", + "no_history": "Ei hakuhistoriaa", + "placeholder": "Hae sähköposteja (käytä \" \" lausehakuun)", + "recent_title": "Viimeisimmät haut", + "subject": "Aihe" + }, + "search_mailbox": { + "clear_mailboxes": "Poista valitut kansiot", + "label": "Postilaatikot", + "no_mailbox_found": "Kansiota ei löytynyt", + "search_placeholder": "Hae postilaatikoita", + "select_account_first": "Valitse ensin sähköpostitili" + }, + "search_more": { + "any": "Mikä tahansa", + "apply": "Käytä suodattimia", + "attachment_name_label": "Liitteen nimi", + "attachment_name_placeholder": "Esim.: invoice.pdf", + "category": "Liitekategoria", + "content_type": "Tiedostotyyppi", + "extension": "Tiedostopääte", + "has_attachment": "Sisältää liitteen", + "is_message": "Sähköpostimuotoinen liite", + "is_message_desc": "Tämä liite on sähköpostitiedosto, esimerkiksi .eml-tiedosto.", + "message_id_description": "Hae sähköpostin Message-ID-otsikon perusteella", + "message_id_label": "Alkuperäinen Message-ID", + "message_size_label": "Viestin koko", + "reset": "Palauta", + "search_placeholder": "Etsi {{field}}...", + "size_presets": { + "any": "Mikä tahansa koko", + "huge": "Erittäin suuri (> 20 MB)", + "large": "Suuri (10 – 20 MB)", + "medium": "Keskikokoinen (2 – 10 MB)", + "small": "Pieni (< 2 MB)", + "tiny": "Erittäin pieni (< 15 KB)" + }, + "title": "Lisäsuodattimet", + "trigger_label": "Lisäasetukset" + }, + "search_reset": { + "label": "Palauta", + "tooltip": "Poista kaikki suodattimet" + }, + "search_view": { + "button_label": "Näkymä", + "menu_title": "Sarakeasetukset" + }, + "settings": { + "accounts": "Tilit", + "acl": "Acl", + "actions": "Toiminnot", + "add": "Lisää", + "addNewProxyHere": "Lisää uusi välityspalvelin täällä. ", + "adding": "Lisätään...", + "appearance": { + "button": { + "update": "Päivitä asetukset" + }, + "command": { + "no_results": "Kieltä ei löytynyt.", + "search": "Hae kieltä..." + }, + "description": { + "language": "Valitse Web-käyttöliittymässä käytettävä kieli.", + "theme": "Valitse käyttöliittymän vaalea tai tumma tila." + }, + "field": { + "language": "Käyttöliittymän kieli", + "theme": "Käyttöliittymän teema" + }, + "placeholder": { + "select_language": "Valitse kieli" + }, + "theme": { + "dark": "Tumma", + "light": "Vaalea" + }, + "title": "Ulkoasu", + "validation": { + "language": { + "required": "Valitse kieli." + }, + "theme": { + "required": "Valitse teema." + } + } + }, + "authUrl": "Valtuutus-URL", + "changePasswordForFutureLogins": "Vaihda salasana tulevia kirjautumisia varten.", + "confirmReset": "Vahvista nollaus", + "createdAt": "Luotu", + "delete": "Poista", + "description": "Kuvaus", + "edit": "Muokkaa", + "enabled": "Käytössä", + "enterNewRootPassword": "Syötä uusi pääkäyttäjän salasana", + "enterProxyIdToConfirmDeletion": "Syötä välityspalvelimen ID vahvistaaksesi poiston.", + "failedToCopyText": "Tekstin kopiointi epäonnistui", + "filterAccessToken": "Suodata kulkuavaimet...", + "filterAccount": "Suodata tilit...", + "filterOauth2": "Suodata OAuth2...", + "filterProxy": "Suodata välityspalvelimet...", + "general": "Yleinen", + "generateNewToken": "Luo uusi tunnus, vanha vanhenee välittömästi.", + "host": "Isäntä", + "id": "Id", + "invalidPassword": "Virheellinen salasana", + "lastAccess": "Viimeisin pääsy", + "manageRootTokenAndPassword": "Hallinnoi pääkäyttäjän tunnusta ja salasanaa turvallisesti.", + "name": "Nimi", + "noProxies": "Ei välityspalvelimia", + "noProxiesDesc": "Et ole vielä lisännyt välityspalvelinmäärityksiä. Lisää yksi käyttääksesi välityspalvelin-toimintoja.", + "password": "Salasana", + "pleaseUseAnIpAddressForBetterReliability": "Käytä IP-osoitetta (esim. 127.0.0.1) isäntänimen tai verkkotunnuksen sijaan paremman luotettavuuden saavuttamiseksi.", + "port": "Portti", + "profile": { + "account": { + "id": "Tilin tunnus: {{id}}" + }, + "avatarAlt": "Avatar", + "button": { + "permissions": "Oikeudet", + "update_profile": "Päivitä profiili", + "view_global_permissions": "Näytä globaalit oikeudet" + }, + "field": { + "email": "Sähköposti", + "password": "Salasana", + "username": "Käyttäjänimi" + }, + "loadError": "Käyttäjätietojen lataaminen epäonnistui.", + "maxSize": "Enintään {{size}}", + "placeholder": { + "password_keep": "Jätä tyhjäksi säilyttääksesi nykyisen salasanan" + }, + "removeAvatar": "Poista avatar", + "section": { + "accounts": "{{count}} liitettyä tiliä", + "roles": "Roolit" + }, + "toast": { + "update_failed": "Profiilin päivitys epäonnistui", + "updated": "Profiili päivitetty" + }, + "uploadError": "Tiedoston latausvirhe", + "uploadTitle": "Lataa avatar", + "validation": { + "email": { + "invalid": "Anna kelvollinen sähköpostiosoite", + "required": "Sähköposti vaaditaan" + }, + "password": { + "max": "Salasana voi olla enintään 256 merkkiä", + "min": "Salasanan on oltava vähintään 8 merkkiä" + }, + "username": { + "max": "Käyttäjänimi voi olla enintään 32 merkkiä", + "min": "Käyttäjänimen on oltava vähintään 5 merkkiä", + "required": "Käyttäjänimi vaaditaan" + } + } + }, + "proxy": "Välityspalvelin", + "proxyUpdateOrAddFailed": "{{action}} epäonnistui, yritä myöhemmin uudelleen", + "reset": "Nollaa", + "resetRootPassword": "Nollaa pääkäyttäjän salasana", + "resetRootToken": "Nollaa pääkäyttäjän tunnus", + "root": "Pääkäyttäjä", + "rootAccessManagement": "Pääkäyttäjän pääsynhallinta", + "rootDesc": "Hallinnoi pääkäyttäjän kirjautumistietoja, mukaan lukien tunnus ja salasana.", + "rootPasswordMustBeAtLeast6Characters": "Pääkäyttäjän salasanan on oltava vähintään 6 merkkiä pitkä.", + "rootTitle": "Pääkäyttäjä", + "selectAll": "Valitse kaikki", + "sidebar": { + "apiTokens": "API-tunnukset", + "configurations": "Järjestelmäasetukset", + "profile": "Profiili", + "proxy": "Verkkovälityspalvelin" + }, + "theRootPasswordHasBeenReset": "Pääkäyttäjän salasana on nollattu", + "theRootTokenHasBeenReset": "Pääkäyttäjän tunnus on nollattu", + "theme": "Teema", + "title": "Asetukset", + "token": "Tunnus", + "tokenUrl": "Tunnus-URL", + "type": "Tyyppi", + "updateTheProxyHere": "Päivitä välityspalvelin täällä. ", + "updatedAt": "Päivitetty", + "url": "Url", + "useNewPasswordForNextLogin": "Käytä uutta salasanaa seuraavalla kirjautumiskerralla.", + "useProxy": "Käytä välityspalvelinta", + "username": "Käyttäjänimi", + "youAreAboutToResetTheRootPassword": "Olet aikeissa nollata pääkäyttäjän salasanan. Varmista, että tallennat sen turvallisesti.", + "youAreAboutToResetTheRootToken": "Olet aikeissa nollata pääkäyttäjän tunnuksen. Tätä toimenpidettä ei voi kumota.", + "yourLoginInformationHasBeenUpdated": "Kirjautumistietosi on päivitetty. Sinun ei tarvitse kirjautua sisään uudelleen.", + "yourProxyHasBeenSuccessfully": "Välityspalvelimesi on {{action}} onnistuneesti." + }, + "sign_out": { + "confirm": "Kirjaudu ulos", + "desc": "Haluatko varmasti kirjautua ulos? Sinun täytyy kirjautua uudelleen päästäksesi tilillesi.", + "title": "Kirjaudu ulos" + }, + "systemConfig": { + "pageDescription": "Nämä parametrit alustetaan CLI-lippujen tai ympäristömuuttujien kautta. Ne ovat vain luku -tilassa.", + "pageTitle": "Järjestelmätason konfiguraatiot", + "sections": { + "cors": { + "desc": "Cross-origin-käyttösäännöt", + "title": "CORS" + }, + "logging": { + "desc": "Lokien tulostuskäyttäytyminen", + "title": "Lokitukset" + }, + "network": { + "desc": "HTTP ja julkinen pääsy", + "title": "Verkko" + }, + "performance": { + "desc": "Samanaikaisuus ja pakkaus", + "title": "Suorituskyky" + }, + "security": { + "desc": "Todennus ja salaus", + "title": "Turvallisuus" + }, + "smtp": { + "desc": "Saapuvan postin vastaanottoasetukset reaaliaikaista arkistointia varten", + "title": "SMTP-palvelin" + }, + "storage": { + "desc": "Tietokantapolut ja rajoitukset", + "title": "Tallennus ja välimuisti" + } + }, + "status": { + "auto": "Automaattinen", + "configured": "Konfiguroitu", + "disabled": "Ei käytössä", + "enabled": "Käytössä", + "missing": "Puuttuu", + "notSet": "Ei asetettu" + } + }, + "table": { + "asc": "Nouseva", + "delete": "Poista", + "desc": "Laskeva", + "edit": "Muokkaa", + "hide": "Piilota", + "loading": "Ladataan...", + "noResults": "Ei tuloksia löydy", + "of": "kohteesta", + "page": "Sivu", + "pagination": { + "first": "Ensimmäinen sivu", + "fixed_page_size": "{{size}} riviä sivulla.", + "last": "Viimeinen sivu", + "next": "Seuraava sivu", + "page_info": "Sivu {{page}} / {{total}}", + "previous": "Edellinen sivu", + "rows_per_page": "Rivejä per sivu", + "selected": "{{selected}} / {{total}} riviä valittu." + }, + "results": "tuloksia", + "rowsPerPage": "Rivejä sivulla", + "showing": "Näytetään", + "to": "asti" + }, + "tag": { + "clear_all": "Tyhjennä kaikki tunnisteet", + "label": "Tunnisteet", + "no_tags_found": "Tunnisteita ei löytynyt", + "search_placeholder": "Hae tunnisteita..." + }, + "time": { + "absolute_range": "Kiinteä päivämääräväli", + "apply": "Käytä", + "before": "Ennen", + "clear_filters": "Tyhjennä aikasuodattimet", + "days_ago_to_now": "päivää sitten – nyt", + "end_date": "Päättymispäivä", + "format": "yyyy-MM-dd", + "historical": "Historiallinen aikaväli (ennen...)", + "label": "Aika", + "last_day": "Viimeiset 1 päivä", + "last_days": "Viimeiset {{count}} päivää", + "last_months": "Viimeiset {{count}} kuukautta", + "over_years_ago": "{{count}} {{unit}} sitten", + "recent_prefix": "Viimeisin:", + "recent_range": "Viimeisin aikaväli (alkaen...)", + "since": "Alkaen", + "start_date": "Aloituspäivä", + "year": "vuosi", + "years": "vuotta" + }, + "users": { + "actions": { + "api_tokens": "API-avaimet", + "buttons": { + "add_account": "Lisää tili", + "create": "Luo käyttäjä", + "update": "Päivitä käyttäjä" + }, + "delete": { + "alert_desc": "Käyttäjä ja kaikki siihen liittyvät tiedot poistetaan.", + "alert_title": "Varoitus: Pysyvä toiminto.", + "button_confirm": "Poista käyttäjä", + "button_deleting": "Poistetaan...", + "confirm_msg": "Olet poistamassa käyttäjän {{name}} (ID: {{id}}) pysyvästi.", + "input_label": "Kirjoita käyttäjän ID vahvistaaksesi:", + "irreversible": "Tätä toimintoa ei voi peruuttaa.", + "placeholder": "Kirjoita \"{{id}}\"", + "title": "Poista käyttäjä", + "toast": { + "failed_fallback": "Käyttäjää ei voitu poistaa.", + "failed_title": "Poisto epäonnistui", + "success_desc": "Käyttäjä \"{{name}}\" poistettiin onnistuneesti.", + "success_title": "Käyttäjä poistettu" + } + }, + "dialog": { + "create_title": "Luo uusi käyttäjä", + "edit_title": "Muokkaa käyttäjää: {{name}}", + "subtitle": "Määritä identiteetti, pääsytasot ja tietoturvakäytännöt." + }, + "fields": { + "assign_role": "Määritä rooli", + "burst_interval": "Ryöppyväli (sek)", + "description": "Kuvaus (valinnainen)", + "description_hint": "Sisäiset huomautukset (enintään 256 merkkiä).", + "description_placeholder": "Huomautuksia käyttäjästä...", + "email": "Sähköpostiosoite", + "email_hint": "Ensisijainen yhteys- ja ilmoitusosoite.", + "global_roles_hint": "Määritä järjestelmäoikeudet.", + "ip_whitelist": "IP-sallintalista", + "ip_whitelist_hint": "Rajoita kirjautuminen näihin IP-osoitteisiin (yksi per rivi).", + "password": "Salasana", + "password_hint_create": "Turvallinen salasana uudelle käyttäjälle.", + "password_hint_edit": "Kirjoita uusi vain, jos haluat vaihtaa sen.", + "password_placeholder_create": "Vähintään 8 merkkiä", + "password_placeholder_edit": "Jätä tyhjäksi säilyttääksesi nykyisen", + "rate_quota": "Nopeusrajoitus", + "select_account": "Valitse tili", + "username": "Käyttäjänimi", + "username_hint": "Yksilöllinen tunnus kirjautumiseen." + }, + "placeholder": { + "filter": "Hae käyttäjiä..." + }, + "schema": { + "account_required": "Valitse tili", + "description_max": "Kuvaus enintään 256 merkkiä", + "email_invalid": "Anna kelvollinen sähköpostiosoite", + "email_required": "Sähköposti on pakollinen", + "global_role_required": "Määritä vähintään yksi globaali rooli", + "ip_invalid": "Virheellinen IP-osoite", + "password_max": "Enintään 256 merkkiä", + "password_min": "Vähintään 8 merkkiä", + "password_required": "Salasana on pakollinen", + "role_required": "Valitse rooli", + "username_max": "Enintään 32 merkkiä", + "username_min": "Vähintään 3 merkkiä", + "username_required": "Käyttäjänimi on pakollinen" + }, + "sections": { + "basic": "Perustiedot", + "global": "Globaalit oikeudet", + "mail_access": "Sähköpostin hallinta", + "mail_access_subtitle": "Sähköpostitilit, joita tämä käyttäjä voi hallita.", + "policy": "Käytännöt" + }, + "states": { + "full_access": "Täydet oikeudet -tila", + "full_access_desc": "Ylläpitäjillä on oletusarvoisesti pääsy kaikkiin tileihin.", + "no_accounts": "Ei määritettyjä tilejä.", + "security_disabled": "Turvakäytännöt on poistettu käytöstä." + }, + "tabs": { + "general": "Yleiset", + "permissions": "Tilin oikeudet", + "security": "Turvallisuus & ACL" + }, + "toast": { + "created": "Käyttäjä luotu", + "updated": "Käyttäjä päivitetty" + } + }, + "api_tokens": { + "button": { + "generate": "Luo uusi avain" + }, + "delete": { + "confirm_button": "Poista avain", + "confirm_label": "Vahvista kirjoittamalla {{word}} alle:", + "confirm_placeholder": "Kirjoita \"{{word}}\" vahvistaaksesi", + "deleting": "Poistetaan...", + "desc": "Olet poistamassa tämän API-avaimen pysyvästi", + "irreversible": "Tätä toimintoa ei voi peruuttaa. Kaikki tätä avainta käyttävät sovellukset menettävät pääsyn välittömästi.", + "prefix": "Avaimen etuliite", + "title": "Poista API-avain", + "warning_desc": "Kaikki tätä avainta käyttävät skriptit tai palvelut lakkaavat toimimasta. Varmista, että olet päivittänyt järjestelmäsi.", + "warning_title": "Varoitus" + }, + "empty": { + "description": "Järjestelmässä ei ole vielä luotu yhtään API-tunnusta.", + "title": "API-avaimia ei löytynyt" + }, + "table": { + "api_key": "API-avain", + "created": "Luotu", + "expired": "Vanhentunut", + "expires_at": "Vanhenee", + "last_used": "Viimeksi käytetty", + "name": "Nimi", + "never": "Ei koskaan", + "owner": "Omistaja", + "permanent": "Pysyvä", + "type": "Tyyppi", + "unnamed": "Nimetön avain", + "web_ui": "Web UI" + }, + "toast": { + "delete_failed": "Avainta ei voitu poistaa, yritä uudelleen.", + "delete_failed_title": "Poisto epäonnistui", + "deleted_desc": "Avain \"{{name}}\" poistettiin onnistuneesti.", + "deleted_title": "API-avain poistettu" + }, + "toolbar": { + "search_placeholder": "Hae nimellä, omistajalla tai avaimella..." + }, + "unnamed": "Nimetön avain" + }, + "buttons": { + "add": "Lisää käyttäjä", + "add_new": "Uusi käyttäjä" + }, + "columns": { + "actions": "Toiminnot", + "avatar": "Avatar", + "created_at": "Luotu", + "email": "Sähköposti", + "id": "ID", + "roles": "Roolit & käyttöoikeudet", + "updated_at": "Päivitetty", + "username": "Käyttäjänimi" + }, + "empty": { + "description": "Lisää ensimmäinen käyttäjä napsauttamalla alla olevaa painiketta.", + "title": "Käyttäjiä ei löytynyt" + }, + "nav": { + "api_tokens": "API-avaimet", + "roles": "Roolit", + "users": "Käyttäjät" + }, + "tokens": { + "dialog": { + "create_title": "Luo pääsyavain", + "description": "Napsauta Tallenna, kun olet valmis.", + "edit_title": "Muokkaa pääsyavainta" + }, + "error": { + "fallback": "Toiminto epäonnistui, yritä myöhemmin uudelleen." + }, + "expire_options": { + "1_day": "1 päivä", + "30_days": "30 päivää", + "7_days": "7 päivää", + "never": "Ei koskaan" + }, + "fields": { + "expire_hint": "Avain vanhenee automaattisesti valitun ajan kuluttua.", + "expire_label": "Vanhentuminen", + "expire_placeholder": "Valitse aika", + "name_hint": "Valinnainen · Enintään 32 merkkiä", + "name_label": "Nimi", + "name_placeholder": "Anna avaimelle lyhyt nimi" + }, + "schema": { + "expire_int": "On oltava kokonaisluku", + "expire_number": "On oltava luku", + "expire_positive": "On oltava suurempi kuin 0", + "name_max": "Enintään 32 merkkiä" + }, + "toast": { + "create_failed_title": "Luonti epäonnistui", + "create_success_desc": "Pääsyavain luotiin onnistuneesti.", + "create_success_title": "Avain luotu", + "update_failed_title": "Päivitys epäonnistui", + "update_success_desc": "Pääsyavain päivitettiin onnistuneesti.", + "update_success_title": "Avain päivitetty" + } + }, + "tokens_action": { + "buttons": { + "add": "Lisää avain" + }, + "delete_dialog": { + "description": "Tätä toimintoa ei voi peruuttaa.", + "title": "Poistetaanko pääsyavain?" + }, + "dialog": { + "description": "Hallitse tämän käyttäjän API-avaimia.", + "title": "API-avaimet" + }, + "empty": { + "description": "Tällä käyttäjällä ei ole tällä hetkellä API-avaimia.", + "title": "Ei API-avaimia" + }, + "list": { + "button_delete": "Poista avain", + "expires_on_brief": "Vanhenee {{date}}", + "label_created": "Luotu", + "label_expires_at": "Vanhenee", + "label_last_used": "Käytetty", + "label_token": "Avain", + "never": "Ei koskaan", + "never_expires": "Ei koskaan", + "status_active": "Aktiivinen", + "status_expired": "Vanhentunut", + "unnamed_token": "Nimetön avain" + } + } + }, + "validation": { + "emailRequired": "Sähköposti on pakollinen", + "folderLimitMustBeAtLeast100": "Kansiorajan on oltava vähintään 100", + "folderLimitMustBeNumber": "Kansiorajan on oltava numero", + "imapHostCannotBeEmpty": "IMAP-isäntä ei voi olla tyhjä", + "imapHostRequired": "IMAP-isäntä on pakollinen", + "imapPortMustBeLessThan65536": "IMAP-portin on oltava pienempi kuin 65536", + "imapPortMustBePositive": "IMAP-portin on oltava positiivinen kokonaisluku", + "incrementalSyncMustBeAtLeast10": "Lisäävän synkronoinnin välin on oltava vähintään 10 minuuttia", + "incrementalSyncMustBeNumber": "Lisäävän synkronoinnin välin on oltava numero", + "invalidEmail": "Virheellinen sähköpostiosoite", + "invalidUrl": "Virheellinen URL-osoite", + "passwordMinLength": "Salasanan on oltava vähintään {{min}} merkkiä pitkä", + "passwordRequired": "Salasana on pakollinen, kun todennusmenetelmä on Salasana", + "pleaseEnterPassword": "Syötä salasanasi", + "pleaseEnterUsernameOrEmail": "Ole hyvä ja anna käyttäjänimesi tai sähköpostiosoitteesi", + "required": "Tämä kenttä on pakollinen", + "singleRequestBatchSizeMustBeNumber": "Eräkoko tulee olla numero", + "singleRequestBatchSizeTooLarge": "Eräkoko tulee olla enintään 200", + "singleRequestBatchSizeTooSmall": "Eräkoko tulee olla vähintään 10" + } } \ No newline at end of file diff --git a/web/src/locales/fr.json b/web/src/locales/fr.json index 8b7ff9f..351bd36 100644 --- a/web/src/locales/fr.json +++ b/web/src/locales/fr.json @@ -1,1614 +1,1630 @@ { - "common": { - "submit": "Soumettre", + "accessTokens": { + "aListOfIpAddressesAllowed": "Une liste d'adresses IP autorisées à accéder à la ressource. Entrez une adresse IP par ligne. (Facultatif)", + "accountId": "ID Compte", + "accounts": "Comptes", + "aclRulesForAccessTokens": "Les règles ACL pour les jetons d'accès incluent la vérification de la liste blanche IP et l'application de la limite de débit.", + "actions": { + "delete": "Supprimer", + "edit": "Modifier", + "openMenu": "Ouvrir le menu" + }, + "addNew": "Ajouter Nouveau", + "atLeastOneAccountIsRequired": "Au moins un compte est requis.", + "create": "Créer", + "createNewAccessTokenHere": "Créez un nouveau jeton d'accès ici.", + "created": "Créé", + "createdAt": "Créé le", + "creating": "Création en cours...", + "creationFailed": "Échec de la Création", + "delete": "Supprimer", + "describeThePurposeOfTheAccessToken": "Décrivez le but du jeton d'accès", + "description": "Gérez vos jetons d'accès, leurs règles ACL, les listes blanches IP et les paramètres de limitation de débit ici.", + "descriptionMustNotExceed255Characters": "La description ne doit pas dépasser 255 caractères.", + "edit": "Modifier", + "editToken": "Modifier le Jeton", + "enterIntervalInSeconds": "Entrez l'intervalle en secondes, ex. 60", + "enterOneIpAddressPerLine": "Entrez une adresse IP par ligne, ex. :\n192.168.1.1\n192.168.1.2", + "enterQuota": "Entrez le quota, ex. 100", + "expiresAt": "Expire le", + "filterByEmailAddressOrAccountId": "Filtrer par adresse e-mail ou ID de compte...", + "interval": "Intervalle", + "intervalMustBeAPositiveInteger": "L'intervalle doit être un entier positif.", + "invalidIpAddressesFound": "Adresses IP non valides trouvées. Veuillez entrer des adresses IPv4 ou IPv6 valides.", + "name": "Nom", + "noTokens": "Aucun Jeton d'Accès", + "noTokensDesc": "Vous n'avez pas encore créé de jeton d'accès. Veuillez en créer un pour utiliser les fonctionnalités API.", + "notUsedYet": "Pas encore utilisé", + "quota": "Quota", + "quotaMustBeAPositiveInteger": "Le quota doit être un entier positif.", + "save": "Enregistrer", + "saveChanges": "Enregistrer les Modifications", + "saving": "Enregistrement en cours...", + "selectAccounts": "Sélectionner des comptes", + "selectMultipleAccountsForTheAccessToken": "Sélectionnez plusieurs comptes pour l'autorisation du jeton d'accès.", + "theListOfAccountsThatCanBeQueried": "La liste des comptes qui peuvent être interrogés à l'aide du jeton d'accès.", + "theMaximumNumberOfRequestsAllowed": "Le nombre maximum de requêtes autorisées dans l'intervalle. (Facultatif)", + "theTimeWindowForTheRateLimit": "La fenêtre de temps (en secondes) pour la limitation de débit. (Facultatif)", + "title": "Jetons d'Accès", + "token": "Jeton", + "updateFailed": "Échec de la Mise à Jour", + "updateOrCreationFailed": "La {{action}} a échoué, veuillez réessayer plus tard", + "updateTheAccessTokenHere": "Mettez à jour le jeton d'accès ici.", + "updated": "Mis à jour", + "updating": "Mise à jour en cours...", + "yourAccessTokenHasBeenSuccessfully": "Votre jeton d'accès a été {{action}} avec succès." + }, + "accounts": { + "accessControl": "Contrôle d'accès", + "accessTokenCopiedToClipboard": "Jeton d'accès copié dans le presse-papiers", + "access_control": { + "buttons": { "cancel": "Annuler", - "save": "Enregistrer", - "save_changes": "Enregistrer les modifications", - "delete": "Supprimer", - "edit": "Modifier", - "search": "Rechercher", - "add": "Ajouter", - "remove": "Retirer", - "create": "Créer", - "update": "Mettre à jour", - "confirm": "Confirmer", + "save": "Enregistrer l'attribution" + }, + "description": "Attribuer des rôles et des utilisateurs autorisés à {{email}}", + "role_label": "Rôle d'accès", + "role_loading": "Chargement des rôles...", + "role_placeholder": "Sélectionner un rôle", + "title": "Attribution d'accès au compte", + "toast": { + "failed_title": "Échec de l'attribution", + "success_desc": "Les autorisations ont été attribuées avec succès à {{email}}", + "success_title": "Attribution réussie" + }, + "user_empty": "Aucun utilisateur trouvé", + "user_label": "Sélectionner les utilisateurs autorisés", + "user_search_placeholder": "Rechercher par nom d'utilisateur ou e-mail...", + "user_selected_count": "Sélectionné : {{count}} utilisateur(s)", + "validation": { + "role_required": "Veuillez sélectionner un rôle à attribuer", + "user_required": "Veuillez sélectionner au moins un utilisateur" + } + }, + "accountCreated": "Compte Créé", + "accountCreatedDesc": "Votre compte a été créé avec succès.", + "accountCreationFailed": "Échec de la Création du Compte", + "accountDetails": "Détails du Compte", + "accountHasBeenSuccessfully": "Le compte a été {{action}} avec succès", + "accountSyncFoldersUpdateFailed": "Échec de la Mise à Jour des Dossiers de Synchronisation de Compte", + "accountSyncFoldersUpdated": "Dossiers de Synchronisation de Compte Mis à Jour", + "accountUpdateFailed": "Échec de la Mise à Jour du Compte", + "accountUpdated": "Compte Mis à Jour", + "accountUpdatedDesc": "Votre compte a été mis à jour avec succès.", + "actions": "Actions", + "addAccount": "Ajouter un Compte", + "addConfiguration": "Ajouter Configuration", + "addImap": "Ajouter IMAP", + "addNewEmailAccountHere": "Ajoutez un nouveau compte e-mail ici. ", + "addNoSync": "Ajouter NoSync", + "allMailFolderSelected": "Attention : Dossier 'Tous les messages' sélectionné", + "allMailFolderSelectedDesc": "La sélection de dossiers avec l'attribut 'Tous les messages' entraînera probablement la duplication des messages déjà synchronisés à partir de dossiers tels que Boîte de réception et Éléments envoyés. Cela peut consommer beaucoup plus d'espace de stockage.", + "allMailSkipped": "Dossiers par défaut sélectionnés. 'Tous les messages' a été ignoré pour éviter les doublons.", + "areYouSureYouWantTo": "Êtes-vous sûr de vouloir {{action}} ce compte ?", + "auth": "Auth.", + "authType": "type_auth", + "autoConfiguring": "Configuration automatique...", + "beforeRelative": "Télécharger uniquement les anciens e-mails", + "beforeRelativeValue": "Télécharger les e-mails d'il y a {{value}} {{unit}}", + "capabilities": "Capacités", + "chooseAuthMethod": "Choisissez la méthode d'authentification à utiliser pour IMAP.", + "chooseEncryptionMethod": "Choisissez la méthode de chiffrement à utiliser pour IMAP.", + "chooseMailboxesToDownload": "Choisissez les boîtes mail à télécharger pour {{email}}. Les nouvelles boîtes seront téléchargées au prochain cycle.", + "clickHere": "cliquer ici", + "clickSaveWhenDone": "Cliquez sur Enregistrer lorsque vous avez terminé.", + "continue": "Continuer", + "createdAt": "Créé le", + "creationFailed": "La création a échoué, veuillez réessayer plus tard", + "dateSelection": "Sélection de Date", + "dateSince": "Date Depuis", + "days": "Jours", + "delete": "Supprimer", + "description": "Gérez et configurez vos comptes de messagerie.", + "detail": "Détail", + "detailsOfTheOAuth2TokensForTheAccount": "Détails des jetons OAuth2 pour le compte.", + "determinesWhetherThisAccountIsActiveNoSync": "Détermine si ce compte est actif. S’il est désactivé, il ne pourra pas importer de données.", + "disable": "Désactiver", + "disableAccount": "Désactiver le compte", + "disabled": "Désactivé", + "downloadAll": "Télécharger tous les e-mails", + "downloadBatchSize": "Taille du lot de téléchargement", + "downloadBatchSizeDescription": "Nombre de messages récupérés par requête IMAP", + "downloadInterval": "Intervalle de téléchargement (minutes)", + "downloadIntervalPlaceholder": "Entrer les minutes", + "downloadScope": "Stratégie de téléchargement", + "downloadScopeDescription": "Choisissez les e-mails à indexer et à télécharger.", + "duration": "Durée", + "edit": "Modifier", + "email": "E-mail", + "emailAccountRegistration": "Enregistrement de Compte E-mail", + "emailAccountRegistrationDesc": "Veuillez saisir votre adresse e-mail. Dans les étapes suivantes, vous configurerez les paramètres IMAP. Nous utiliserons cette adresse pour détecter automatiquement les paramètres du serveur IMAP.", + "emailAddress": "Adresse E-mail", + "emailCannotBeModified": "L'adresse e-mail du compte ne peut pas être modifiée lors de l'édition.", + "emailPlaceholder": "ex. jean.dupont@exemple.com", + "enable": "Activer", + "enableAccount": "Activer le compte", + "enabled": "Activé", + "enabledDescription": "Détermine si ce compte est actif. S'il est désactivé, les téléchargements associés ne seront pas lancés.", + "encryption": "chiffrement", + "enterPassword": "Entrez votre mot de passe", + "enterValue": "Entrez une valeur", + "everyMinutes": "toutes les {{minutes}} minutes", + "field": "Champ", + "fixed": "Fixe", + "folderLimit": "Limite de Dossiers", + "folderLimitDescription": "Limite le nombre d'e-mails à synchroniser par dossier (minimum 100). Laissez vide pour aucune limite.", + "folderLimitPlaceholder": "ex. 1000", + "folderSync": { + "autoSelectDescendants": "Sélectionner automatiquement les descendants", + "autoSelectParents": "Sélectionner automatiquement les parents", + "batches": "lots", + "collapseAll": "Tout réduire", + "expandAll": "Tout développer", + "loadingMailboxFolders": "Chargement des dossiers de la boîte…", + "noData": "Aucune Donnée", + "noFolders": "Aucun dossier à synchroniser" + }, + "foldersConfiguredForSync": "{{count}} dossier(s) configuré(s) pour la synchronisation", + "foldersSelected": "{{count}} dossier(s) sélectionné(s)", + "goBack": "Retourner", + "host": "hôte", + "id": "ID", + "imap": "IMAP", + "imapAuthMethod": "Méthode d'Authentification IMAP", + "imapEncryption": "Chiffrement IMAP", + "imapHost": "Hôte IMAP", + "imapHostPlaceholder": "ex. imap.exemple.com", + "imapPassword": "Mot de passe IMAP", + "imapPort": "Port IMAP", + "imapPortPlaceholder": "ex. 993", + "imapProxy": "Utiliser un proxy SOCKS5 pour les connexions IMAP.", + "incSync": "Sync. Inc.", + "lastSync": "Dernière Synchronisation", + "leaveEmptyToKeepExisting": "Laissez vide pour conserver le mot de passe existant, ou entrez-en un nouveau pour le mettre à jour.", + "leaveEmptyToKeepPassword": "Laisser vide pour conserver le mot de passe actuel", + "login_name": "Nom de connexion", + "minutes": "minutes", + "months": "Mois", + "moreAccountTypes": "Plus de types de compte", + "mustBeAtLeast1": "Doit être au moins 1", + "name": "Nom", + "nameDescription": "Nom d'utilisateur IMAP. E-mail par défaut ou nom personnalisé.", + "namePlaceholder": "ex. jean.dupont", + "noAccountConfigurations": "Aucune Configuration de Compte", + "noAccountConfigurationsDesc": "Vous n'avez pas encore ajouté de Configuration de Compte. Veuillez en ajouter une pour commencer à utiliser les fonctionnalités du Compte.", + "noOAuth2Tokens": "Aucun Jeton OAuth2", + "none": "Aucune", + "notAvailable": "n.d.", + "oauth2Tokens": "Jetons OAuth2", + "openMenu": "Ouvrir le menu", + "optional": "Facultatif", + "owner": "Créateur", + "password": "mot_de_passe", + "port": "port", + "recent": "récent", + "refreshToken": "Jeton de Rafraîchissement", + "refreshTokenCopiedToClipboard": "Jeton de rafraîchissement copié dans le presse-papiers", + "relative": "Relative", + "runningState": { + "account": { + "id": "ID du compte" + }, + "common": { "close": "Fermer", - "yes": "Oui", - "no": "Non", - "ok": "OK", - "loading": "Chargement...", - "empty": "Vide", - "noData": "Aucune donnée", - "table": { - "noResults": "Aucun résultat." - }, - "failed": "Échec", - "notFound": "Introuvable", - "back": "Retour", - "goBack": "Retourner", - "backToHome": "Retour à l'accueil", - "tryAgain": "Réessayer", - "more": "Plus", - "actions": "Actions", - "filter": "Filtrer", - "reset": "Réinitialiser", - "clear": "Effacer", - "error": "Erreur", - "apply": "Appliquer", - "select": "Sélectionner", - "selectAll": "Tout sélectionner", - "deselectAll": "Tout désélectionner", - "all": "Tout", - "none": "Aucun", - "showLess": "Afficher moins", - "showMore": "Afficher plus...", - "project_description": "Bichon est un projet open-source.", - "view_on_github_button": "Voir sur GitHub", - "op_failed": "L'opération a échoué", - "na": "N/A", - "retry": "Réessayer", - "deleting": "Suppression..." - }, - "navigation": { - "home": "Accueil", - "settings": "Paramètres", - "accounts": "Comptes", - "dashboard": "Tableau de bord", - "mailbox": "Boîte aux lettres", - "oauth2": "OAuth2", - "accessTokens": "Jetons d'accès", - "apiDocs": "Documentation API", - "general": "Général", - "auth": "Authentification", - "other": "Autre", - "users": "Utilisateurs du système" - }, - "auth": { - "welcome": "Bienvenue sur Bichon", - "username": "Nom d'utilisateur", - "password": "Mot de passe", - "login": "Se connecter", - "loginFailed": "Échec de la Connexion", - "invalidPassword": "Mot de passe non valide. Veuillez réessayer.", - "somethingWentWrong": "Quelque chose s'est mal passé", - "sessionExpired": "Session expirée !", - "sessionExpiredDesc": "Votre session a été fermée en raison de l'inactivité. Veuillez vous reconnecter pour continuer.", - "logout": "Se déconnecter", - "areYouSureYouWantToLogOut": "Êtes-vous sûr de vouloir vous déconnecter ?", - "youWillNeedToLogInAgain": "Vous devrez vous reconnecter pour accéder à votre compte." - }, - "errors": { - "pageNotFound": "Oups ! Page non trouvée !", - "pageNotFoundDesc": "Il semble que la page que vous recherchez n'existe pas ou a été supprimée.", - "somethingWentWrong": "Oups ! Quelque chose s'est mal passé :')", - "somethingWentWrongDesc": "Nous nous excusons pour le désagrément. Veuillez réessayer plus tard.", - "internalServerError": "Erreur Interne du Serveur !", - "contentNotModified": "Contenu non modifié !", - "networkError": "Erreur Réseau", - "networkErrorDesc": "Impossible de se connecter au serveur. Veuillez vérifier votre connexion Internet et réessayer.", - "forbidden": "Interdit", - "forbiddenTitle": "Accès Interdit", - "forbiddenDesc": "Vous n'avez pas l'autorisation de visualiser cette ressource.", - "unauthorized": "Non autorisé", - "unauthorizedTitle": "Accès Non Autorisé", - "unauthorizedDesc": "Veuillez vous connecter avec les informations d'identification appropriées pour accéder à cette ressource.", - "maintenance": "Maintenance", - "maintenanceTitle": "Le site est en maintenance !", - "maintenanceDesc": "Le site est temporairement indisponible. Nous serons bientôt de retour en ligne.", - "learnMore": "En savoir plus" - }, - "dashboard": { - "title": "Tableau de bord", - "mailAccounts": "Comptes de messagerie", - "connected": "Connecté", - "totalEmails": "Total des e-mails", - "syncedLocally": "Synchronisés localement", - "totalEmailSize": "Taille totale des e-mails", - "logicalVolume": "Taille originale", - "localDataFiles": "Fichiers de données locaux", - "actualDiskUsage": "Utilisation réelle du disque", - "efficiency": "Efficacité", - "saved": "Économisé", - "dataStorage": "Stockage", - "indexSize": "Taille d'index", - "metadataSize": "Taille des métadonnées", - "tantivyDatabase": "Basé sur le moteur de recherche Tantivy", - "dayTrend": "Tendance sur 30 jours", - "attachments": "Pièces jointes", - "topLists": "Top Listes", - "newEmails": "Nouveaux e-mails", - "messageDistribution": "Distribution des messages", - "attachmentRatio": "Ratio de pièces jointes", - "attachmentRatioDesc": "{{percent}}% des e-mails ont des pièces jointes", - "noEmailsSynced": "Aucun e-mail synchronisé pour l'instant", - "withAttachments": "Avec Pièces Jointes", - "noAttachments": "Sans Pièces Jointes", - "top10Senders": "Top 10 des Expéditeurs", - "byMessageCount": "Par nombre de messages", - "sender": "Expéditeur", - "count": "Compte", - "top10LargestEmails": "Top 10 des E-mails les Plus Volumineux", - "byMessageSize": "Par taille de message", - "subject": "Objet", - "size": "Taille", - "noSubject": "(Aucun Objet)", - "top10Accounts": "Top 10 des Comptes", - "emails": "E-mails", - "account": "Compte", - "noRecentActivity": "Aucune activité récente", - "noSendersData": "Aucune donnée d'expéditeurs", - "noLargeEmails": "Aucun gros e-mail", - "noAccountData": "Aucune donnée de compte", - "systemVersion": "Version du système" - }, - "accounts": { - "beforeRelativeValue": "Télécharger les e-mails d'il y a {{value}} {{unit}}", - "sinceRelativeValue": "Télécharger les e-mails des derniers", - "downloadBatchSize": "Taille du lot de téléchargement", - "downloadBatchSizeDescription": "Nombre de messages récupérés par requête IMAP", - "downloadScopeDescription": "Choisissez les e-mails à indexer et à télécharger.", - "downloadScope": "Stratégie de téléchargement", - "selectMode": "Sélectionner le mode de filtrage", - "downloadAll": "Télécharger tous les e-mails", - "sinceFixed": "Depuis une date spécifique", - "sinceRelative": "Télécharger uniquement les e-mails récents", - "beforeRelative": "Télécharger uniquement les anciens e-mails", - "duration": "Durée", - "unit": "Unité", - "accessControl": "Contrôle d'accès", - "owner": "Créateur", - "access_control": { - "title": "Attribution d'accès au compte", - "description": "Attribuer des rôles et des utilisateurs autorisés à {{email}}", - "role_label": "Rôle d'accès", - "role_placeholder": "Sélectionner un rôle", - "role_loading": "Chargement des rôles...", - "user_label": "Sélectionner les utilisateurs autorisés", - "user_search_placeholder": "Rechercher par nom d'utilisateur ou e-mail...", - "user_empty": "Aucun utilisateur trouvé", - "user_selected_count": "Sélectionné : {{count}} utilisateur(s)", - "buttons": { - "cancel": "Annuler", - "save": "Enregistrer l'attribution" - }, - "validation": { - "user_required": "Veuillez sélectionner au moins un utilisateur", - "role_required": "Veuillez sélectionner un rôle à attribuer" - }, - "toast": { - "success_title": "Attribution réussie", - "success_desc": "Les autorisations ont été attribuées avec succès à {{email}}", - "failed_title": "Échec de l'attribution" - } - }, - "title": "Comptes de Messagerie", - "description": "Gérez et configurez vos comptes de messagerie.", - "addImap": "Ajouter IMAP", - "addNoSync": "Ajouter NoSync", - "moreAccountTypes": "Plus de types de compte", - "noAccountConfigurations": "Aucune Configuration de Compte", - "noAccountConfigurationsDesc": "Vous n'avez pas encore ajouté de Configuration de Compte. Veuillez en ajouter une pour commencer à utiliser les fonctionnalités du Compte.", - "addConfiguration": "Ajouter Configuration", - "useNoProxy": "Sans proxy", - "login_name": "Nom de connexion", - "name": "Nom", - "email": "E-mail", + "folders": "boîtes mail" + }, + "empty": { + "no_active_download": "Aucun téléchargement en cours", + "no_errors_current": "Aucune erreur dans la session actuelle", + "no_errors_session": "Aucune erreur dans cette session", + "no_global_errors": "Aucune erreur globale", + "no_history": "Aucun historique disponible" + }, + "folders": "boîtes mail", + "latest": "RÉCENT", + "loading": { + "fetching_account_state": "Chargement de l'état du compte..." + }, + "message": "Message", + "session": { + "started_at": "Heure de début", "status": "Statut", - "type": "Type", - "lastSync": "Dernière Synchronisation", - "actions": "Actions", - "edit": "Modifier", - "delete": "Supprimer", - "detail": "Détail", - "selectMailboxes": "Choisir les boîtes mail", - "oauth2Tokens": "Jetons OAuth2", - "id": "ID", - "enabled": "Activé", - "auth": "Auth.", - "incSync": "Sync. Inc.", - "state": "État", - "createdAt": "Créé le", - "updatedAt": "Mis à jour le", - "openMenu": "Ouvrir le menu", - "emailAccountRegistration": "Enregistrement de Compte E-mail", - "emailAccountRegistrationDesc": "Veuillez saisir votre adresse e-mail. Dans les étapes suivantes, vous configurerez les paramètres IMAP. Nous utiliserons cette adresse pour détecter automatiquement les paramètres du serveur IMAP.", - "emailAddress": "Adresse E-mail", - "emailPlaceholder": "ex. jean.dupont@exemple.com", - "namePlaceholder": "ex. jean.dupont", - "optional": "Facultatif", - "nameDescription": "Nom d'utilisateur IMAP. E-mail par défaut ou nom personnalisé.", - "emailCannotBeModified": "L'adresse e-mail du compte ne peut pas être modifiée lors de l'édition.", - "addAccount": "Ajouter un Compte", - "updateAccount": "Mettre à jour le Compte", - "accountUpdated": "Compte Mis à Jour", - "accountCreated": "Compte Créé", - "accountUpdatedDesc": "Votre compte a été mis à jour avec succès.", - "accountCreatedDesc": "Votre compte a été créé avec succès.", - "accountUpdateFailed": "Échec de la Mise à Jour du Compte", - "accountCreationFailed": "Échec de la Création du Compte", - "updateFailed": "La mise à jour a échoué, veuillez réessayer plus tard", - "creationFailed": "La création a échoué, veuillez réessayer plus tard", - "allMailFolderSelected": "Attention : Dossier 'Tous les messages' sélectionné", - "accountSyncFoldersUpdated": "Dossiers de Synchronisation de Compte Mis à Jour", - "accountSyncFoldersUpdateFailed": "Échec de la Mise à Jour des Dossiers de Synchronisation de Compte", - "serverConfiguration": "Configuration du Serveur (IMAP)", - "selectedMailboxes": "Boîtes mail sélectionnées", - "allMailFolderSelectedDesc": "La sélection de dossiers avec l'attribut 'Tous les messages' entraînera probablement la duplication des messages déjà synchronisés à partir de dossiers tels que Boîte de réception et Éléments envoyés. Cela peut consommer beaucoup plus d'espace de stockage.", - "allMailSkipped": "Dossiers par défaut sélectionnés. 'Tous les messages' a été ignoré pour éviter les doublons.", - "selectAtLeastOneFolder": "Veuillez sélectionner au moins un dossier", - "chooseMailboxesToDownload": "Choisissez les boîtes mail à télécharger pour {{email}}. Les nouvelles boîtes seront téléchargées au prochain cycle.", - "accountDetails": "Détails du Compte", - "capabilities": "Capacités", - "folderLimit": "Limite de Dossiers", - "everyMinutes": "toutes les {{minutes}} minutes", - "foldersConfiguredForSync": "{{count}} dossier(s) configuré(s) pour la synchronisation", - "foldersSelected": "{{count}} dossier(s) sélectionné(s)", - "imapHost": "Hôte IMAP", - "imapHostPlaceholder": "ex. imap.exemple.com", - "imapPort": "Port IMAP", - "imapPortPlaceholder": "ex. 993", - "imapEncryption": "Chiffrement IMAP", - "selectEncryptionMethod": "Sélectionner une méthode de chiffrement", - "chooseEncryptionMethod": "Choisissez la méthode de chiffrement à utiliser pour IMAP.", - "imapAuthMethod": "Méthode d'Authentification IMAP", - "selectAuthMethod": "Sélectionner une méthode d'authentification", - "chooseAuthMethod": "Choisissez la méthode d'authentification à utiliser pour IMAP.", - "imapPassword": "Mot de passe IMAP", - "leaveEmptyToKeepPassword": "Laisser vide pour conserver le mot de passe actuel", - "enterPassword": "Entrez votre mot de passe", - "leaveEmptyToKeepExisting": "Laissez vide pour conserver le mot de passe existant, ou entrez-en un nouveau pour le mettre à jour.", - "useProxy": "Utiliser un Proxy", - "selectProxy": "Sélectionner un proxy", - "downloadInterval": "Intervalle de téléchargement (minutes)", - "downloadIntervalPlaceholder": "Entrer les minutes", - "enabledDescription": "Détermine si ce compte est actif. S'il est désactivé, les téléchargements associés ne seront pas lancés.", - "dateSince": "Date Depuis", - "none": "Aucune", - "fixed": "Fixe", - "relative": "Relative", - "selectDate": "Sélectionner une date", - "selectUnit": "Sélectionner une unité", - "days": "Jours", - "months": "Mois", - "years": "Années", - "enterValue": "Entrez une valeur", - "mustBeAtLeast1": "Doit être au moins 1", - "dateSelection": "Sélection de Date", - "since": "depuis", - "recent": "récent", - "notAvailable": "n.d.", - "host": "hôte", - "port": "port", - "encryption": "chiffrement", - "authType": "type_auth", - "password": "mot_de_passe", - "useProxyField": "utiliser un proxy", - "clickSaveWhenDone": "Cliquez sur Enregistrer lorsque vous avez terminé.", - "step": "Étape {{index}}", - "goBack": "Retourner", - "autoConfiguring": "Configuration automatique...", - "continue": "Continuer", - "saveChanges": "Enregistrer les Modifications", - "submit": "Soumettre", - "field": "Champ", - "value": "Valeur", - "refreshToken": "Jeton de Rafraîchissement", - "accessTokenCopiedToClipboard": "Jeton d'accès copié dans le presse-papiers", - "refreshTokenCopiedToClipboard": "Jeton de rafraîchissement copié dans le presse-papiers", - "noOAuth2Tokens": "Aucun Jeton OAuth2", - "theAccountHasNotCompletedTheAuthorizationProcess": "Le compte n'a pas terminé le processus d'autorisation. Veuillez ", - "clickHere": "cliquer ici", - "toAuthorizeTheAccount": " pour autoriser le compte.", - "detailsOfTheOAuth2TokensForTheAccount": "Détails des jetons OAuth2 pour le compte.", - "updateTheEmailAccountHere": "Mettez à jour le compte e-mail ici. ", - "addNewEmailAccountHere": "Ajoutez un nouveau compte e-mail ici. ", - "thisAccountIsUsedForIdentificationPurposesOnly": "Ce compte est utilisé uniquement à des fins d'identification et ne nécessite pas de synchronisation avec un serveur de messagerie. Il est utile pour l'importation de données d'e-mails.", - "determinesWhetherThisAccountIsActiveNoSync": "Détermine si ce compte est actif. S’il est désactivé, il ne pourra pas importer de données.", - "folderSync": { - "noData": "Aucune Donnée", - "noFolders": "Aucun dossier à synchroniser", - "batches": "lots", - "autoSelectDescendants": "Sélectionner automatiquement les descendants", - "autoSelectParents": "Sélectionner automatiquement les parents", - "expandAll": "Tout développer", - "collapseAll": "Tout réduire", - "loadingMailboxFolders": "Chargement des dossiers de la boîte…" - }, - "viewDetails": "voir les détails", - "runningState": { - "message": "Message", - "account": { - "id": "ID du compte" - }, - "tabs": { - "active_session": "Session active", - "history": "Historique", - "global_errors": "Erreurs globales", - "folders": "Boîtes mail", - "errors": "Erreurs" - }, - "loading": { - "fetching_account_state": "Chargement de l'état du compte..." - }, - "empty": { - "no_active_download": "Aucun téléchargement en cours", - "no_errors_current": "Aucune erreur dans la session actuelle", - "no_errors_session": "Aucune erreur dans cette session", - "no_global_errors": "Aucune erreur globale", - "no_history": "Aucun historique disponible" - }, - "session": { - "status": "Statut", - "trigger": "Déclencheur", - "started_at": "Heure de début" - }, - "common": { - "folders": "boîtes mail", - "close": "Fermer" - }, - "latest": "RÉCENT", - "folders": "boîtes mail" - }, - "steps": { - "complete": "Terminé", - "emailAddress": "Adresse E-mail", - "imap": "IMAP", - "syncPreferences": "Préférences de Synchronisation", - "summary": "Résumé" - }, - "imapProxy": "Utiliser un proxy SOCKS5 pour les connexions IMAP.", - "syncStartDateDescription": "Définit la date de début de la synchronisation - fixe ou relative à l'heure actuelle. Les e-mails antérieurs à cette date seront exclus, {{fixedPart}}.", - "syncAfterDate": "synchroniser les données après une date définie", - "syncRecentData": "faire glisser la date de synchronisation dans le temps, en ne synchronisant que les données récentes", - "folderLimitDescription": "Limite le nombre d'e-mails à synchroniser par dossier (minimum 100). Laissez vide pour aucune limite.", - "folderLimitPlaceholder": "ex. 1000", - "imap": "IMAP", - "minutes": "minutes", - "accountHasBeenSuccessfully": "Le compte a été {{action}} avec succès", - "enableAccount": "Activer le compte", - "disableAccount": "Désactiver le compte", - "areYouSureYouWantTo": "Êtes-vous sûr de vouloir {{action}} ce compte ?", - "enable": "Activer", - "disable": "Désactiver", - "thisWillPreventTheAccountFromBeingUsed": "Ce compte ne synchronisera plus les données depuis le serveur IMAP, mais les données existantes resteront accessibles.", - "disabled": "Désactivé", - "useDangerous": "Faire confiance à n’importe quel certificat TLS", - "useDangerousDescription": "Activez cette option seulement si vous vous connectez à un serveur IMAP utilisant un certificat public ou auto‑signé que votre système pourrait ne pas reconnaître. Cette option contourne la vérification standard des certificats, ce qui peut vous exposer à des attaques de type homme‑du‑milieu — n’activez que si vous comprenez les risques." + "trigger": "Déclencheur" + }, + "tabs": { + "active_session": "Session active", + "errors": "Erreurs", + "folders": "Boîtes mail", + "global_errors": "Erreurs globales", + "history": "Historique" + } }, - "mailbox": { - "deleteMailboxDialog": { - "title": "Supprimer le dossier de messagerie", - "desc": "Êtes-vous sûr de vouloir supprimer ce dossier de messagerie ? Cette action est irréversible.", - "warningTitle": "Avertissement", - "warningDesc": "La suppression de ce dossier supprimera également de façon permanente tous les e-mails archivés et sous-dossiers qu'il contient.", - "confirm": "Supprimer définitivement", - "successTitle": "Suppression réussie", - "successDesc": "Le dossier de messagerie et son contenu ont été supprimés avec succès.", - "errorTitle": "Échec de la suppression" - }, - "title": "Boîte aux lettres", - "folders": "Dossiers", - "messages": "Messages", - "noMessages": "Aucun message", - "selectFolder": "Sélectionnez un dossier pour voir les messages", - "deleteDialog": { - "title": "Supprimer l'E-mail", - "desc": "Êtes-vous sûr de vouloir supprimer {{countText}} ? Cette action supprimera définitivement le(s) e-mail(s) sélectionné(s) de la base de données locale. L'e-mail/les e-mails seront perdus à jamais et ne pourront pas être récupérés.", - "descCountSingle": "cet e-mail", - "descCountMultiple": "ces {{count}} e-mails", - "warningTitle": "Attention !", - "warningDesc": "Veuillez procéder avec prudence.", - "confirm": "Supprimer", - "successTitle": "Messages supprimés avec succès", - "successDesc": "Les messages ont été supprimés.", - "errorTitle": "Échec de la suppression des messages" - }, - "thread": { - "title": "Fil de discussion ({{count}} {{messageLabel}})", - "message": "message", - "messages": "messages", - "noSubject": "(Aucun objet)", - "invalidDate": "Date invalide", - "empty": "Aucun message dans ce fil de discussion.", - "loadError": "Échec du chargement du fil de discussion", - "loadingMore": "Chargement en cours...", - "loadMore": "Charger plus" - }, - "bulkActions": { - "ariaLabel": "Actions de masse pour {{count}} {{emailLabel}} sélectionné(s)", - "email": "e-mail", - "emails": "e-mails", - "selected": "sélectionné(s)", - "clearSelection": "Effacer la sélection", - "clearSelectionWithKey": "Effacer la sélection ({{key}})", - "delete": "Supprimer", - "deleteTooltip": "Supprimer les e-mails sélectionnés" - } + "saveChanges": "Enregistrer les Modifications", + "selectAtLeastOneFolder": "Veuillez sélectionner au moins un dossier", + "selectAuthMethod": "Sélectionner une méthode d'authentification", + "selectDate": "Sélectionner une date", + "selectEncryptionMethod": "Sélectionner une méthode de chiffrement", + "selectMailboxes": "Choisir les boîtes mail", + "selectMode": "Sélectionner le mode de filtrage", + "selectProxy": "Sélectionner un proxy", + "selectUnit": "Sélectionner une unité", + "selectedMailboxes": "Boîtes mail sélectionnées", + "serverConfiguration": "Configuration du Serveur (IMAP)", + "since": "depuis", + "sinceFixed": "Depuis une date spécifique", + "sinceRelative": "Télécharger uniquement les e-mails récents", + "sinceRelativeValue": "Télécharger les e-mails des derniers", + "state": "État", + "status": "Statut", + "step": "Étape {{index}}", + "steps": { + "complete": "Terminé", + "emailAddress": "Adresse E-mail", + "imap": "IMAP", + "summary": "Résumé", + "syncPreferences": "Préférences de Synchronisation" }, - "search": { - "size": "Taille", - "any": "Toutes", - "tiny": "Très petite (<15 KB)", - "small": "Petite (<2 MB)", - "medium": "Moyenne (2 - 10 MB)", - "large": "Grande (10 - 20 MB)", - "huge": "Énorme (≥20 Mo)", - "sort": "Trier", - "sizeDescription": "La taille correspond à la taille totale de l’e-mail, pièces jointes incluses.", - "title": "Recherche", - "searching": "Recherche en cours, veuillez patienter...", - "noEmailsFound": "Aucun e-mail trouvé", - "startSearching": "Commencez à rechercher en utilisant un mot-clé, un expéditeur ou des filtres avancés.", - "adjustSearch": "Essayez d'ajuster vos critères de recherche ou d'effacer les filtres.", - "tagFilter": "Filtre par Étiquette", - "from": "De", - "to": "À", - "subject": "Objet", - "date": "Date", - "editTag": "Modifier l'Étiquette", - "keyword": "Mot-clé", - "sender": "Expéditeur", - "recipient": "Destinataire", - "hasAttachment": "Contient une Pièce Jointe", - "yes": "Oui", - "no": "Non", - "dateRange": "Plage de Dates", - "startDate": "Date de Début", - "endDate": "Date de Fin", - "advancedFilters": "Filtres Avancés", - "searchArchivedEmails": "Rechercher dans les E-mails Archivés", - "fullTextMultiAccount": "Texte intégral · Multi-comptes · Filtres avancés", - "account": "Compte", - "mailbox": "Boîte aux lettres", - "selectAccount": "Sélectionner un compte", - "selectMailbox": "Sélectionner une boîte aux lettres", - "noActiveEmailAccount": "Aucun compte e-mail actif.", - "addEmailAccount": "Ajouter un Compte E-mail", - "noMailboxSelectAccount": "Aucune boîte aux lettres. Veuillez sélectionner un compte d'abord.", - "searchInSubjectBody": "Rechercher dans l'objet, le corps, les pièces jointes...", - "searchingButton": "Recherche en cours...", - "searchButton": "Rechercher", - "advanced": "Avancé", - "clear": "Effacer", - "since": "Depuis :", - "before": "Avant :", - "selectDate": "Sélectionner une date", - "pleaseSelectAtLeastOne": "Veuillez sélectionner au moins un critère de recherche", - "cc": "Cc", - "bcc": "Cci", - "attachmentName": "Nom de la Pièce Jointe", - "messageId": "ID du Message", - "minSize": "Taille Min", - "maxSize": "Taille Max", - "senderRecipients": "Expéditeur / Destinataires", - "attachmentsSize": "Pièces Jointes et Taille", - "minimumBytes": "Minimum (octets)", - "maximumBytes": "Maximum (octets)", - "originalMessageIdHeader": "En-tête Message-ID de l'e-mail original", - "addTags": { - "title": "Modifier les Étiquettes", - "none": "Aucune étiquette ajoutée pour l'instant", - "searchPlaceholder": "Rechercher ou créer des étiquettes...", - "createHint": "Créer une nouvelle étiquette : {{tag}}", - "invalidTitle": "Étiquette Non Valide", - "updatedTitle": "Étiquettes Mises à Jour", - "updatedDesc": "Les étiquettes ont été mises à jour avec succès", - "updateFailedTitle": "Échec de la Mise à Jour", - "tryAgain": "Veuillez réessayer plus tard", - "selectedCount": "{{count}} étiquette(s) sélectionnée(s)", - "cancel": "Annuler", - "save": "Enregistrer", - "saving": "Enregistrement en cours..." - }, - "updateTags": { - "overwriteWarning": "Avertissement : cela écrasera tous les tags existants sur les éléments sélectionnés.", - "title": "Modifier les tags", - "none": "Aucun tag sélectionné", - "searchPlaceholder": "Rechercher ou créer un tag...", - "createHint": "Appuyez sur Entrée pour créer le tag : \"{{tag}}\"", - "selectedCount": "{{count}} tag(s) à appliquer", - "cancel": "Annuler", - "invalidTitle": "Tag invalide", - "updatedTitle": "Tags mis à jour", - "updatedDesc": "Les tags ont été mis à jour avec succès.", - "updateFailedTitle": "Échec de la mise à jour", - "tryAgain": "Veuillez réessayer plus tard.", - "actionAdd": "Ajouter", - "actionRemove": "Retirer", - "actionOverwrite": "Écraser", - "submitAdd": "Ajouter les tags", - "submitRemove": "Retirer les tags", - "submitOverwrite": "Écraser les tags", - "savingAdd": "Ajout...", - "savingRemove": "Retrait...", - "savingOverwrite": "Écrasement..." - }, - "thread": { - "title": "Fil de discussion · {{count}} messages", - "error": "Échec du chargement du fil de discussion", - "empty": "Aucun message dans ce fil de discussion", - "invalidDate": "Date invalide", - "noSubject": "(Aucun objet)", - "loadingMore": "Chargement en cours...", - "loadMore": "Charger plus" - }, - "bulkActions": { - "ariaLabel": "{{count}} messages sélectionnés. Barre d'actions groupées", - "delete": "Supprimer", - "deleteDesc": "Supprimer les messages sélectionnés", - "selected": "{{count}} sélectionné(s)", - "clear": "Effacer la sélection", - "manageTags": "Gérer les tags" - }, - "delete": { - "title": "Supprimer les messages", - "confirmPrefix": "Êtes-vous sûr de vouloir supprimer", - "countLabel": "{{count}} message(s)", - "confirmDetail": "Cette action est irréversible.", - "confirmButton": "Supprimer", - "warningTitle": "Avertissement", - "warningDesc": "Les messages supprimés seront définitivement retirés.", - "successTitle": "Messages supprimés", - "successDesc": "Les messages ont été supprimés avec succès.", - "errorTitle": "Échec de la suppression" - } + "submit": "Soumettre", + "syncAfterDate": "synchroniser les données après une date définie", + "syncRecentData": "faire glisser la date de synchronisation dans le temps, en ne synchronisant que les données récentes", + "syncStartDateDescription": "Définit la date de début de la synchronisation - fixe ou relative à l'heure actuelle. Les e-mails antérieurs à cette date seront exclus, {{fixedPart}}.", + "theAccountHasNotCompletedTheAuthorizationProcess": "Le compte n'a pas terminé le processus d'autorisation. Veuillez ", + "thisAccountIsUsedForIdentificationPurposesOnly": "Ce compte est utilisé uniquement à des fins d'identification et ne nécessite pas de synchronisation avec un serveur de messagerie. Il est utile pour l'importation de données d'e-mails.", + "thisWillPreventTheAccountFromBeingUsed": "Ce compte ne synchronisera plus les données depuis le serveur IMAP, mais les données existantes resteront accessibles.", + "title": "Comptes de Messagerie", + "toAuthorizeTheAccount": " pour autoriser le compte.", + "type": "Type", + "unit": "Unité", + "updateAccount": "Mettre à jour le Compte", + "updateFailed": "La mise à jour a échoué, veuillez réessayer plus tard", + "updateTheEmailAccountHere": "Mettez à jour le compte e-mail ici. ", + "updatedAt": "Mis à jour le", + "useDangerous": "Faire confiance à n’importe quel certificat TLS", + "useDangerousDescription": "Activez cette option seulement si vous vous connectez à un serveur IMAP utilisant un certificat public ou auto‑signé que votre système pourrait ne pas reconnaître. Cette option contourne la vérification standard des certificats, ce qui peut vous exposer à des attaques de type homme‑du‑milieu — n’activez que si vous comprenez les risques.", + "useNoProxy": "Sans proxy", + "useProxy": "Utiliser un Proxy", + "useProxyField": "utiliser un proxy", + "value": "Valeur", + "viewDetails": "voir les détails", + "years": "Années" + }, + "apiDocs": { + "choosePreferredType": "Choisissez votre type de documentation API préféré", + "downloadSpecYAML": "Télécharger la Spécification YAML", + "openAPIExplorer": "Explorateur OpenAPI", + "reDoc": "ReDoc", + "scalar": "Scalar", + "swaggerUI": "Swagger UI" + }, + "apiTokens": { + "deleteDialog": { + "cancel": "Annuler", + "confirm": "Supprimer", + "deleting": "Suppression...", + "description": "Cette action est irréversible. Toute application utilisant ce jeton perdra immédiatement son accès.", + "title": "Supprimer le jeton d'accès ?" }, - "mail": { - "emailViewer": "Afficheur d'E-mail", - "noMessageSelected": "Aucun message sélectionné", - "account": "Compte", - "from": "De", - "to": "À", - "subject": "Objet", - "date": "Date", - "tags": "Étiquettes", - "noTagsYet": "Aucune étiquette pour l'instant", - "id": "ID", - "cc": "Cc", - "bcc": "Cci", - "attachments": "Pièces jointes", - "download": "Télécharger", - "delete": "Supprimer", - "viewThread": "Voir le Fil de Discussion", - "downloadStarted": "Téléchargement démarré", - "downloadComplete": "Téléchargement terminé", - "downloadFailed": "Échec du téléchargement", - "failedToDownloadFile": "Échec du téléchargement du fichier", - "failedToLoadEmail": "Échec du chargement du message e-mail.", - "isBeingDownloaded": "{{id}} en cours de téléchargement", - "downloaded": "{{id}} téléchargé", - "showLess": "afficher moins", - "showMore": "afficher plus...", - "onlyNonInlineAttachments": "Seules les pièces jointes non intégrées sont affichées ici.", - "noAttachments": "Aucune pièce jointe" + "dialog": { + "createTitle": "Créer un jeton d'accès", + "description": "Cliquez sur enregistrer lorsque vous avez terminé.", + "editTitle": "Modifier le jeton d'accès", + "save": "Enregistrer", + "saveChanges": "Enregistrer les modifications" }, - "oauth2": { - "title": "OAuth2", - "addConfiguration": "Ajouter Configuration", - "id": "ID", - "provider": "Fournisseur", - "clientId": "ID Client", - "clientSecret": "Secret Client", - "redirectUri": "URI de Redirection", - "scopes": "Portées", - "status": "Statut", - "enabled": "Activé", - "disabled": "Désactivé", - "edit": "Modifier", - "delete": "Supprimer", - "enable": "Activer", - "disable": "Désactiver", - "noConfigurations": "Aucune Configuration OAuth2", - "noConfigurationsDesc": "Vous n'avez pas encore ajouté de configuration OAuth2. Veuillez en ajouter une pour commencer à utiliser les fonctionnalités OAuth2.", - "description": "Gère automatiquement la récupération, le stockage et le rafraîchissement des jetons d'accès, garantissant une expérience d'authentification transparente et toujours disponible.", - "addNew": "Ajouter Nouveau", - "updateHere": "Mettez à jour ici.", - "createNewHere": "Créez-en un nouveau ici.", - "clickSaveWhenDone": "Cliquez sur Enregistrer lorsque vous avez terminé.", - "quickPresets": "Préréglages rapides :", - "gmail": "Gmail", - "outlook": "Outlook", - "whenDisabled": "Si désactivé : - Les nouveaux flux d'autorisation seront immédiatement refusés - Les jetons d'accès et de rafraîchissement existants seront révoqués dans la minute - Les utilisateurs devront réautoriser lors de la réactivation", - "clientIdLabel": "ID Client :", - "enterYourClientId": "Entrez votre ID client", - "theUniqueIdentifierForYourApplication": "L'identifiant unique de votre application, fourni par le fournisseur OAuth.", - "clientSecretLabel": "Secret Client :", - "leaveEmptyToKeepExistingSecret": "Laisser vide pour conserver le secret existant", - "enterYourClientSecret": "Entrez votre secret client", - "leaveEmptyToKeepTheExistingSecret": "Laissez vide pour conserver le secret existant, entrez une nouvelle valeur seulement pour mettre à jour.", - "aSecretKeyProvidedByTheOAuthProvider": "Une clé secrète fournie par le fournisseur OAuth pour authentifier votre application.", - "authUrlLabel": "URL d'Autorisation :", - "enterTheAuthorizationUrl": "Entrez l'URL d'autorisation", - "theUrlWhereUsersWillBeRedirected": "L'URL vers laquelle les utilisateurs seront redirigés pour autoriser votre application.", - "tokenUrlLabel": "URL du Jeton :", - "enterTheTokenUrl": "Entrez l'URL du jeton", - "theUrlUsedToExchange": "L'URL utilisée pour échanger le code d'autorisation contre un jeton d'accès.", - "redirectUrlLabel": "URI de Redirection :", - "enterYourRedirectUrl": "Entrez votre URI de redirection", - "theRedirectUrlAfterAuthorization": "L'URI de redirection après autorisation. Doit correspondre à celui enregistré auprès du fournisseur OAuth. Utilise le format http://[host]:[port]/oauth2/callback (ou https://), où [host] et [port] doivent correspondre à votre déploiement RustMailer. Le chemin /oauth2/callback est fixe.", - "scope": "Portée :", - "enterTheScopeHere": "Entrez la portée ici.", - "addScope": "Ajouter une Portée", - "key": "Clé :", - "enterTheKeyHere": "Entrez la clé ici.", - "value": "Valeur :", - "enterTheValueHere": "Entrez la valeur ici.", - "addExtraParams": "Ajouter des Paramètres Supplémentaires", - "useProxyOptional": "Utiliser un Proxy (facultatif) :", - "selectAProxy": "Sélectionner un proxy", - "noProxyAvailable": "Aucun proxy disponible", - "useSocks5ProxyForOAuthRequests": "Utilise le proxy SOCKS5 pour les requêtes OAuth lorsque l'accès direct est bloqué.", - "descriptionLabel": "Description :", - "describeThePurposeOfTheOauth2Application": "Décrivez le but de l'application OAuth2", - "optional": "Facultatif", - "saving": "Enregistrement en cours...", - "creating": "Création en cours...", - "saveChanges": "Enregistrer les Modifications", - "save": "Enregistrer", - "updated": "Mis à jour", - "created": "Créé", - "yourOAuth2ApplicationHasBeenSuccessfully": "Votre application OAuth2 a été {{action}} avec succès.", - "updateFailed": "Échec de la Mise à Jour", - "creationFailed": "Échec de la Création", - "updateOrCreationFailed": "La {{action}} a échoué, veuillez réessayer plus tard", - "clientSecretIsRequired": "Le Secret Client est obligatoire", - "clientSecretCannotBeEmpty": "Le Secret Client ne peut pas être vide", - "keyIsRequired": "La Clé est obligatoire", - "keyCannotBeEmpty": "La Clé ne peut pas être vide", - "valueIsRequired": "La Valeur est obligatoire", - "valueCannotBeEmpty": "La Valeur ne peut pas être vide", - "descriptionMustNotExceed255Characters": "La description ne doit pas dépasser 255 caractères.", - "clientIdIsRequired": "L'ID Client est obligatoire", - "clientIdCannotBeEmpty": "L'ID Client ne peut pas être vide", - "authorizationUrlIsRequired": "L'URL d'Autorisation est obligatoire", - "authorizationUrlCannotBeEmpty": "L'URL d'Autorisation ne peut pas être vide", - "invalidAuthorizationUrlFormat": "Format d'URL d'autorisation invalide", - "tokenUrlIsRequired": "L'URL du Jeton est obligatoire", - "tokenUrlCannotBeEmpty": "L'URL du Jeton ne peut pas être vide", - "invalidTokenUrlFormat": "Format d'URL de jeton invalide", - "redirectUriIsRequired": "L'URI de Redirection est obligatoire", - "redirectUriCannotBeEmpty": "L'URI de Redirection ne peut pas être vide", - "invalidRedirectUriFormat": "Format d'URI de redirection invalide", - "authorizeEmailAccount": "Autoriser le Compte E-mail", - "authorizeAnEmailAccountToStartTheOAuth2AuthorizationProcess": "Autorisez un compte e-mail pour démarrer le processus d'autorisation OAuth2.", - "loadingAccounts": "Chargement des comptes...", - "selectAnAccount": "Sélectionner un compte", - "noEmailAccountsRegistered": "Aucun compte e-mail enregistré. Veuillez en créer un.", - "pleaseCreateOne": "Veuillez en créer un.", - "createAccount": "Créer un Compte", - "authorize": "Autoriser", - "getAuthorizeUrlFailed": "Échec de la Récupération de l'URL d'Autorisation", - "getAuthorizeUrlFailedDesc": "Échec de la récupération de l'URL d'autorisation, veuillez réessayer plus tard", - "oauth2ClientUpdated": "Client OAuth2 Mis à Jour", - "oauth2ClientHasBeenSuccessfully": "Le client OAuth2 a été {{action}} avec succès.", - "statusUpdateFailed": "Échec de la mise à jour du statut, veuillez réessayer plus tard", - "disableOAuth2Client": "Désactiver le Client OAuth2", - "enableOAuth2Client": "Activer le Client OAuth2", - "areYouSureYouWantTo": "Êtes-vous sûr de vouloir {{action}} ce client OAuth2 ?", - "thisWillPreventTheOAuth2ClientFromBeingUsed": "Cela empêchera l'utilisation du client OAuth2.", - "deleteToken": "Supprimer le Jeton", - "areYouSureYouWantToDelete": "Êtes-vous sûr de vouloir supprimer", - "thisActionWillPermanentlyRemoveTheOauth2Record": "Cette action supprimera définitivement l'enregistrement OAuth2 du système. Cela ne peut pas être annulé.", - "enterIdToConfirmDeletion": "Entrez l'ID pour confirmer la suppression.", - "warning": "Attention !", - "pleaseBeCareful": "Soyez prudent, cette opération ne peut pas être annulée.", - "deleteSuccess": "Suppression Réussie", - "yourOAuth2ApplicationHasBeenSuccessfullyDeleted": "Votre application OAuth2 a été supprimée avec succès.", - "oauth2DeleteFailed": "Échec de la Suppression OAuth2", - "deleteFailed": "La suppression a échoué, veuillez réessayer plus tard", - "actions": { - "openMenu": "Ouvrir le menu", - "edit": "Modifier", - "authorize": "Autoriser", - "delete": "Supprimer" - }, - "authFailed": "Échec de l'Authentification OAuth2", - "error": "Erreur", - "unknownError": "Une erreur inconnue s'est produite.", - "tryAgain": "Réessayer", - "goHome": "Aller à l'Accueil", - "authSuccess": "Authentification OAuth2 Réussie", - "success": "Succès", - "successMessage": "Votre compte e-mail a été authentifié avec succès via OAuth2. Le jeton d'accès a été enregistré par le système et sera rafraîchi automatiquement si nécessaire.", - "goToAccounts": "Aller aux Comptes", - "authAtatus": "Statut de l'Authentification OAuth2", - "information": "Information", - "noStatus": "Cette page affiche le résultat de votre authentification OAuth2. Aucun statut spécifique n'est disponible actuellement. Veuillez réessayer si nécessaire.", - "backToLogin": "Retour à la Connexion" + "form": { + "1day": "1 jour", + "30days": "30 jours", + "7days": "7 jours", + "errorInt": "Doit être un entier", + "errorMax": "Max 32 caractères", + "errorNumber": "Doit être un nombre", + "errorPositive": "Doit être supérieur à 0", + "expirationDescription": "Les jetons expireront automatiquement après le délai sélectionné.", + "expirationLabel": "Expiration", + "expirationPlaceholder": "Sélectionner l'expiration", + "nameDescription": "Optionnel · Max 32 caractères", + "nameLabel": "Nom", + "namePlaceholder": "Donnez un nom court à ce jeton", + "never": "Jamais" }, - "accessTokens": { - "title": "Jetons d'Accès", - "name": "Nom", - "accounts": "Comptes", - "token": "Jeton", - "createdAt": "Créé le", - "expiresAt": "Expire le", - "edit": "Modifier", - "delete": "Supprimer", - "create": "Créer", - "noTokens": "Aucun Jeton d'Accès", - "noTokensDesc": "Vous n'avez pas encore créé de jeton d'accès. Veuillez en créer un pour utiliser les fonctionnalités API.", - "description": "Gérez vos jetons d'accès, leurs règles ACL, les listes blanches IP et les paramètres de limitation de débit ici.", - "editToken": "Modifier le Jeton", - "addNew": "Ajouter Nouveau", - "updateTheAccessTokenHere": "Mettez à jour le jeton d'accès ici.", - "createNewAccessTokenHere": "Créez un nouveau jeton d'accès ici.", - "selectAccounts": "Sélectionner des comptes", - "selectMultipleAccountsForTheAccessToken": "Sélectionnez plusieurs comptes pour l'autorisation du jeton d'accès.", - "enterOneIpAddressPerLine": "Entrez une adresse IP par ligne, ex. :\n192.168.1.1\n192.168.1.2", - "aListOfIpAddressesAllowed": "Une liste d'adresses IP autorisées à accéder à la ressource. Entrez une adresse IP par ligne. (Facultatif)", - "enterQuota": "Entrez le quota, ex. 100", - "theMaximumNumberOfRequestsAllowed": "Le nombre maximum de requêtes autorisées dans l'intervalle. (Facultatif)", - "enterIntervalInSeconds": "Entrez l'intervalle en secondes, ex. 60", - "theTimeWindowForTheRateLimit": "La fenêtre de temps (en secondes) pour la limitation de débit. (Facultatif)", - "describeThePurposeOfTheAccessToken": "Décrivez le but du jeton d'accès", - "updating": "Mise à jour en cours...", - "saving": "Enregistrement en cours...", - "creating": "Création en cours...", - "saveChanges": "Enregistrer les Modifications", - "save": "Enregistrer", - "updated": "Mis à jour", - "created": "Créé", - "yourAccessTokenHasBeenSuccessfully": "Votre jeton d'accès a été {{action}} avec succès.", - "updateFailed": "Échec de la Mise à Jour", - "creationFailed": "Échec de la Création", - "updateOrCreationFailed": "La {{action}} a échoué, veuillez réessayer plus tard", - "quotaMustBeAPositiveInteger": "Le quota doit être un entier positif.", - "intervalMustBeAPositiveInteger": "L'intervalle doit être un entier positif.", - "invalidIpAddressesFound": "Adresses IP non valides trouvées. Veuillez entrer des adresses IPv4 ou IPv6 valides.", - "atLeastOneAccountIsRequired": "Au moins un compte est requis.", - "descriptionMustNotExceed255Characters": "La description ne doit pas dépasser 255 caractères.", - "notUsedYet": "Pas encore utilisé", - "theListOfAccountsThatCanBeQueried": "La liste des comptes qui peuvent être interrogés à l'aide du jeton d'accès.", - "accountId": "ID Compte", - "filterByEmailAddressOrAccountId": "Filtrer par adresse e-mail ou ID de compte...", - "aclRulesForAccessTokens": "Les règles ACL pour les jetons d'accès incluent la vérification de la liste blanche IP et l'application de la limite de débit.", - "actions": { - "openMenu": "Ouvrir le menu", - "edit": "Modifier", - "delete": "Supprimer" - }, - "quota": "Quota", - "interval": "Intervalle" + "list": { + "createdLabel": "Créé le", + "deleteBtn": "Supprimer le jeton", + "expiresOnLabel": "Expire le", + "expiresOnShort": "Expire le {{date}}", + "lastUsedLabel": "Dernière utilisation", + "neverExpires": "N'expire jamais", + "neverLabel": "Jamais", + "neverUsed": "Jamais", + "statusActive": "Actif", + "statusExpired": "Expiré", + "tokenLabel": "Jeton", + "unnamedToken": "Jeton sans nom" }, - "settings": { - "appearance": { - "title": "Apparence", - "field": { - "language": "Langue de l'interface", - "theme": "Thème de l'interface" - }, - "description": { - "language": "Choisissez la langue de l'interface web.", - "theme": "Choisissez entre le mode clair ou sombre." - }, - "placeholder": { - "select_language": "Choisir une langue" - }, - "command": { - "search": "Rechercher une langue...", - "no_results": "Aucune langue trouvée." - }, - "theme": { - "light": "Clair", - "dark": "Sombre" - }, - "button": { - "update": "Mettre à jour les préférences" - }, - "validation": { - "language": { - "required": "Veuillez sélectionner une langue." - }, - "theme": { - "required": "Veuillez sélectionner un thème." - } - } - }, - "title": "Paramètres", - "general": "Général", - "proxy": "Proxy", - "name": "Nom", - "host": "Hôte", - "port": "Port", - "username": "Nom d'utilisateur", - "password": "Mot de passe", - "type": "Type", - "actions": "Actions", - "edit": "Modifier", - "delete": "Supprimer", - "add": "Ajouter", - "noProxies": "Aucun Proxy", - "noProxiesDesc": "Vous n'avez pas encore ajouté de configuration de proxy. Veuillez en ajouter une pour utiliser les fonctionnalités de proxy.", - "root": "Root", - "rootTitle": "Root", - "rootDesc": "Gérez les informations d'identification d'accès root, y compris le jeton et le mot de passe.", - "rootAccessManagement": "Gestion de l'Accès Root", - "manageRootTokenAndPassword": "Gérez en toute sécurité le jeton et le mot de passe root.", - "resetRootToken": "Réinitialiser le Jeton Root", - "generateNewToken": "Génère un nouveau jeton, l'ancien expirera immédiatement.", - "reset": "Réinitialiser", - "resetRootPassword": "Réinitialiser le Mot de Passe Root", - "changePasswordForFutureLogins": "Change le mot de passe pour les futures connexions.", - "youAreAboutToResetTheRootToken": "Vous êtes sur le point de réinitialiser le jeton root. Cette action ne peut pas être annulée.", - "confirmReset": "Confirmer la Réinitialisation", - "youAreAboutToResetTheRootPassword": "Vous êtes sur le point de réinitialiser le mot de passe root. Assurez-vous de le conserver en lieu sûr.", - "enterNewRootPassword": "Entrez le nouveau mot de passe root", - "theRootTokenHasBeenReset": "Le jeton root a été réinitialisé", - "yourLoginInformationHasBeenUpdated": "Vos informations de connexion ont été mises à jour. Il n'est pas nécessaire de vous reconnecter.", - "invalidPassword": "Mot de passe non valide", - "rootPasswordMustBeAtLeast6Characters": "Le mot de passe root doit contenir au moins 6 caractères.", - "theRootPasswordHasBeenReset": "Le mot de passe root a été réinitialisé", - "useNewPasswordForNextLogin": "Utilisez le nouveau mot de passe pour la prochaine connexion.", - "failedToCopyText": "Échec de la copie du texte", - "filterProxy": "Filtrer les Proxys...", - "filterOauth2": "Filtrer OAuth2...", - "filterAccount": "Filtrer les Comptes...", - "filterAccessToken": "Filtrer les Jetons d'Accès...", - "selectAll": "Tout sélectionner", - "theme": "Thème", - "id": "Id", - "url": "Url", - "createdAt": "Créé le", - "updatedAt": "Mis à jour le", - "enabled": "Activé", - "useProxy": "Utiliser un Proxy", - "authUrl": "URL d'Autorisation", - "tokenUrl": "URL du Jeton", - "description": "Description", - "token": "Jeton", - "accounts": "Comptes", - "acl": "Acl", - "lastAccess": "Dernier Accès", - "enterProxyIdToConfirmDeletion": "Entrez l'ID Proxy pour confirmer la suppression.", - "updateTheProxyHere": "Mettez à jour le Proxy ici. ", - "addNewProxyHere": "Ajoutez un nouveau Proxy ici. ", - "pleaseUseAnIpAddressForBetterReliability": "Veuillez utiliser une adresse IP (ex. 127.0.0.1) au lieu d'un nom d'hôte ou de domaine pour une meilleure fiabilité.", - "adding": "Ajout en cours...", - "yourProxyHasBeenSuccessfully": "Votre Proxy a été {{action}} avec succès.", - "proxyUpdateOrAddFailed": "La {{action}} a échoué, veuillez réessayer plus tard", - "sidebar": { - "profile": "Profil", - "apiTokens": "Jetons API", - "proxy": "Proxy réseau", - "configurations": "Configurations système" - }, - "profile": { - "loadError": "Impossible de charger les informations de l’utilisateur.", - "uploadTitle": "Téléverser un avatar", - "maxSize": "Jusqu’à {{size}}", - "avatarAlt": "Avatar", - "removeAvatar": "Supprimer l’avatar", - "uploadError": "Erreur(s) lors du téléversement du fichier", - "field": { - "username": "Nom d’utilisateur", - "email": "E-mail", - "password": "Mot de passe" - }, - "placeholder": { - "password_keep": "Laissez vide pour conserver le mot de passe actuel" - }, - "button": { - "update_profile": "Mettre à jour le profil", - "permissions": "Autorisations", - "view_global_permissions": "Voir les autorisations globales" - }, - "section": { - "roles": "Rôles", - "accounts": "{{count}} comptes liés" - }, - "account": { - "id": "ID du compte : {{id}}" - }, - "toast": { - "updated": "Profil mis à jour avec succès", - "update_failed": "Échec de la mise à jour du profil" - }, - "validation": { - "username": { - "required": "Le nom d’utilisateur est requis", - "min": "Le nom d’utilisateur doit contenir au moins 5 caractères", - "max": "Le nom d’utilisateur doit contenir au maximum 32 caractères" - }, - "email": { - "required": "L’adresse e-mail est requise", - "invalid": "Veuillez saisir une adresse e-mail valide" - }, - "password": { - "min": "Le mot de passe doit contenir au moins 8 caractères", - "max": "Le mot de passe doit contenir au maximum 256 caractères" - } - } - } + "notifications": { + "close": "Fermer", + "copied": "Copié dans le presse-papiers", + "createFailed": "Échec de la création", + "createSuccess": "Jeton d'accès créé", + "createSuccessDesc": "Le jeton d'accès a été créé avec succès.", + "deleteFailed": "Échec de la suppression du jeton", + "deleteSuccess": "Jeton d'accès supprimé avec succès", + "genericError": "L'opération a échoué. Veuillez réessayer.", + "tryAgain": "Réessayer", + "updateFailed": "Échec de la mise à jour", + "updateSuccess": "Jeton d'accès mis à jour", + "updateSuccessDesc": "Le jeton d'accès a été mis à jour avec succès." }, - "apiDocs": { - "choosePreferredType": "Choisissez votre type de documentation API préféré", - "swaggerUI": "Swagger UI", - "reDoc": "ReDoc", - "openAPIExplorer": "Explorateur OpenAPI", - "scalar": "Scalar", - "downloadSpecYAML": "Télécharger la Spécification YAML" + "page": { + "addBtn": "Ajouter un jeton", + "emptyDescription": "Vous n'avez pas encore créé de jetons API. Cliquez ci-dessous pour en créer un.", + "emptyTitle": "Aucun jeton API", + "loadError": "Échec du chargement des jetons API." + } + }, + "attachment": { + "all_fields_desc": "Correspond au nom de la pièce jointe, à l'objet et à l'expéditeur", + "date": "Date", + "name": "Nom du fichier", + "search_input_placeholder": "Rechercher des pièces jointes (utilisez \" \" pour la recherche par expression)", + "sender": "Expéditeur", + "sender_with_count": "Expéditeur ({{count}})", + "size": "Taille du fichier", + "source": "Source", + "subject": "Objet" + }, + "auth": { + "areYouSureYouWantToLogOut": "Êtes-vous sûr de vouloir vous déconnecter ?", + "invalidPassword": "Mot de passe non valide. Veuillez réessayer.", + "login": "Se connecter", + "loginFailed": "Échec de la Connexion", + "logout": "Se déconnecter", + "password": "Mot de passe", + "sessionExpired": "Session expirée !", + "sessionExpiredDesc": "Votre session a été fermée en raison de l'inactivité. Veuillez vous reconnecter pour continuer.", + "somethingWentWrong": "Quelque chose s'est mal passé", + "username": "Nom d'utilisateur", + "welcome": "Bienvenue sur Bichon", + "youWillNeedToLogInAgain": "Vous devrez vous reconnecter pour accéder à votre compte." + }, + "command": { + "dark": "Sombre", + "light": "Clair", + "noResultsFound": "Aucun résultat trouvé.", + "theme": "Thème", + "typeCommandOrSearch": "Tapez une commande ou recherchez..." + }, + "common": { + "actions": "Actions", + "add": "Ajouter", + "all": "Tout", + "apply": "Appliquer", + "back": "Retour", + "backToHome": "Retour à l'accueil", + "cancel": "Annuler", + "clear": "Effacer", + "close": "Fermer", + "confirm": "Confirmer", + "create": "Créer", + "delete": "Supprimer", + "deleting": "Suppression...", + "deselectAll": "Tout désélectionner", + "edit": "Modifier", + "empty": "Vide", + "error": "Erreur", + "failed": "Échec", + "filter": "Filtrer", + "goBack": "Retourner", + "loading": "Chargement...", + "more": "Plus", + "na": "N/A", + "no": "Non", + "noData": "Aucune donnée", + "none": "Aucun", + "notFound": "Introuvable", + "ok": "OK", + "op_failed": "L'opération a échoué", + "project_description": "Bichon est un projet open-source.", + "remove": "Retirer", + "reset": "Réinitialiser", + "retry": "Réessayer", + "save": "Enregistrer", + "save_changes": "Enregistrer les modifications", + "search": "Rechercher", + "select": "Sélectionner", + "selectAll": "Tout sélectionner", + "showLess": "Afficher moins", + "showMore": "Afficher plus...", + "submit": "Soumettre", + "table": { + "noResults": "Aucun résultat." }, - "dialogs": { - "confirmDelete": "Confirmer la Suppression", - "confirmDeleteDesc": "Êtes-vous sûr de vouloir supprimer cet élément ? Cette action ne peut pas être annulée.", - "deleteSuccess": "Supprimé avec succès", - "deleteFailed": "Échec de la suppression", - "saveSuccess": "Enregistré avec succès", - "saveFailed": "Échec de l'enregistrement", - "createSuccess": "Créé avec succès", - "createFailed": "Échec de la création", - "updateSuccess": "Mis à jour avec succès", - "updateFailed": "Échec de la mise à jour", - "continue": "Continuer", - "deleting": "Suppression en cours...", - "accountDeleted": "Compte Supprimé", - "accountDeletedDesc": "Votre compte a été supprimé avec succès.", - "accountDeleteFailed": "Échec de la suppression du compte", - "deleteAccountPermanently": "Supprimer le Compte Définitivement", - "youAreDeleting": "Vous êtes en train de supprimer {{email}}. Cela supprimera définitivement :", - "accountCredentials": "Les informations d'identification et les paramètres du compte", - "localCachedMetadata": "Les métadonnées et l'état de synchronisation mis en cache localement", - "imapSyncData": "Les données de synchronisation IMAP", - "oauthTokens": "Les jetons OAuth et les informations d'identification API", - "typeEmailToConfirm": "Tapez l'adresse e-mail du compte pour confirmer :", - "typeToConfirm": "Tapez \"{{email}}\" pour confirmer", - "cannotBeUndone": "Cette action ne peut pas être annulée !", - "allResourcesErased": "Toutes les ressources associées seront effacées définitivement.", - "permanentlyDeleteAccount": "Supprimer Définitivement le Compte" + "tryAgain": "Réessayer", + "update": "Mettre à jour", + "view_on_github_button": "Voir sur GitHub", + "yes": "Oui" + }, + "dashboard": { + "account": "Compte", + "actualDiskUsage": "Utilisation réelle du disque", + "attachmentRatio": "Ratio de pièces jointes", + "attachmentRatioDesc": "{{percent}}% des e-mails ont des pièces jointes", + "attachments": "Pièces jointes", + "byMessageCount": "Par nombre de messages", + "byMessageSize": "Par taille de message", + "connected": "Connecté", + "count": "Compte", + "dataStorage": "Stockage", + "dayTrend": "Tendance sur 30 jours", + "efficiency": "Efficacité", + "emails": "E-mails", + "indexSize": "Taille d'index", + "localDataFiles": "Fichiers de données locaux", + "logicalVolume": "Taille originale", + "mailAccounts": "Comptes de messagerie", + "messageDistribution": "Distribution des messages", + "metadataSize": "Taille des métadonnées", + "newEmails": "Nouveaux e-mails", + "noAccountData": "Aucune donnée de compte", + "noAttachments": "Sans Pièces Jointes", + "noEmailsSynced": "Aucun e-mail synchronisé pour l'instant", + "noLargeEmails": "Aucun gros e-mail", + "noRecentActivity": "Aucune activité récente", + "noSendersData": "Aucune donnée d'expéditeurs", + "noSubject": "(Aucun Objet)", + "saved": "Économisé", + "sender": "Expéditeur", + "size": "Taille", + "subject": "Objet", + "syncedLocally": "Synchronisés localement", + "systemVersion": "Version du système", + "tantivyDatabase": "Basé sur le moteur de recherche Tantivy", + "title": "Tableau de bord", + "top10Accounts": "Top 10 des Comptes", + "top10LargestEmails": "Top 10 des E-mails les Plus Volumineux", + "top10Senders": "Top 10 des Expéditeurs", + "topLists": "Top Listes", + "totalEmailSize": "Taille totale des e-mails", + "totalEmails": "Total des e-mails", + "withAttachments": "Avec Pièces Jointes" + }, + "dialogs": { + "accountCredentials": "Les informations d'identification et les paramètres du compte", + "accountDeleteFailed": "Échec de la suppression du compte", + "accountDeleted": "Compte Supprimé", + "accountDeletedDesc": "Votre compte a été supprimé avec succès.", + "allResourcesErased": "Toutes les ressources associées seront effacées définitivement.", + "cannotBeUndone": "Cette action ne peut pas être annulée !", + "confirmDelete": "Confirmer la Suppression", + "confirmDeleteDesc": "Êtes-vous sûr de vouloir supprimer cet élément ? Cette action ne peut pas être annulée.", + "continue": "Continuer", + "createFailed": "Échec de la création", + "createSuccess": "Créé avec succès", + "deleteAccountPermanently": "Supprimer le Compte Définitivement", + "deleteFailed": "Échec de la suppression", + "deleteSuccess": "Supprimé avec succès", + "deleting": "Suppression en cours...", + "imapSyncData": "Les données de synchronisation IMAP", + "localCachedMetadata": "Les métadonnées et l'état de synchronisation mis en cache localement", + "oauthTokens": "Les jetons OAuth et les informations d'identification API", + "permanentlyDeleteAccount": "Supprimer Définitivement le Compte", + "saveFailed": "Échec de l'enregistrement", + "saveSuccess": "Enregistré avec succès", + "typeEmailToConfirm": "Tapez l'adresse e-mail du compte pour confirmer :", + "typeToConfirm": "Tapez \"{{email}}\" pour confirmer", + "updateFailed": "Échec de la mise à jour", + "updateSuccess": "Mis à jour avec succès", + "youAreDeleting": "Vous êtes en train de supprimer {{email}}. Cela supprimera définitivement :" + }, + "errors": { + "contentNotModified": "Contenu non modifié !", + "forbidden": "Interdit", + "forbiddenDesc": "Vous n'avez pas l'autorisation de visualiser cette ressource.", + "forbiddenTitle": "Accès Interdit", + "internalServerError": "Erreur Interne du Serveur !", + "learnMore": "En savoir plus", + "maintenance": "Maintenance", + "maintenanceDesc": "Le site est temporairement indisponible. Nous serons bientôt de retour en ligne.", + "maintenanceTitle": "Le site est en maintenance !", + "networkError": "Erreur Réseau", + "networkErrorDesc": "Impossible de se connecter au serveur. Veuillez vérifier votre connexion Internet et réessayer.", + "pageNotFound": "Oups ! Page non trouvée !", + "pageNotFoundDesc": "Il semble que la page que vous recherchez n'existe pas ou a été supprimée.", + "somethingWentWrong": "Oups ! Quelque chose s'est mal passé :')", + "somethingWentWrongDesc": "Nous nous excusons pour le désagrément. Veuillez réessayer plus tard.", + "unauthorized": "Non autorisé", + "unauthorizedDesc": "Veuillez vous connecter avec les informations d'identification appropriées pour accéder à cette ressource.", + "unauthorizedTitle": "Accès Non Autorisé" + }, + "mail": { + "account": "Compte", + "attachments": "Pièces jointes", + "bcc": "Cci", + "cc": "Cc", + "date": "Date", + "delete": "Supprimer", + "download": "Télécharger", + "downloadComplete": "Téléchargement terminé", + "downloadFailed": "Échec du téléchargement", + "downloadStarted": "Téléchargement démarré", + "downloaded": "{{id}} téléchargé", + "emailViewer": "Afficheur d'E-mail", + "failedToDownloadFile": "Échec du téléchargement du fichier", + "failedToLoadEmail": "Échec du chargement du message e-mail.", + "from": "De", + "id": "ID", + "isBeingDownloaded": "{{id}} en cours de téléchargement", + "noAttachments": "Aucune pièce jointe", + "noMessageSelected": "Aucun message sélectionné", + "noTagsYet": "Aucune étiquette pour l'instant", + "onlyNonInlineAttachments": "Seules les pièces jointes non intégrées sont affichées ici.", + "showLess": "afficher moins", + "showMore": "afficher plus...", + "subject": "Objet", + "tags": "Étiquettes", + "to": "À", + "viewThread": "Voir le Fil de Discussion" + }, + "mailbox": { + "bulkActions": { + "ariaLabel": "Actions de masse pour {{count}} {{emailLabel}} sélectionné(s)", + "clearSelection": "Effacer la sélection", + "clearSelectionWithKey": "Effacer la sélection ({{key}})", + "delete": "Supprimer", + "deleteTooltip": "Supprimer les e-mails sélectionnés", + "email": "e-mail", + "emails": "e-mails", + "selected": "sélectionné(s)" }, - "command": { - "typeCommandOrSearch": "Tapez une commande ou recherchez...", - "noResultsFound": "Aucun résultat trouvé.", - "theme": "Thème", - "light": "Clair", - "dark": "Sombre" + "deleteDialog": { + "confirm": "Supprimer", + "desc": "Êtes-vous sûr de vouloir supprimer {{countText}} ? Cette action supprimera définitivement le(s) e-mail(s) sélectionné(s) de la base de données locale. L'e-mail/les e-mails seront perdus à jamais et ne pourront pas être récupérés.", + "descCountMultiple": "ces {{count}} e-mails", + "descCountSingle": "cet e-mail", + "errorTitle": "Échec de la suppression des messages", + "successDesc": "Les messages ont été supprimés.", + "successTitle": "Messages supprimés avec succès", + "title": "Supprimer l'E-mail", + "warningDesc": "Veuillez procéder avec prudence.", + "warningTitle": "Attention !" + }, + "deleteMailboxDialog": { + "confirm": "Supprimer définitivement", + "desc": "Êtes-vous sûr de vouloir supprimer ce dossier de messagerie ? Cette action est irréversible.", + "errorTitle": "Échec de la suppression", + "successDesc": "Le dossier de messagerie et son contenu ont été supprimés avec succès.", + "successTitle": "Suppression réussie", + "title": "Supprimer le dossier de messagerie", + "warningDesc": "La suppression de ce dossier supprimera également de façon permanente tous les e-mails archivés et sous-dossiers qu'il contient.", + "warningTitle": "Avertissement" + }, + "folders": "Dossiers", + "messages": "Messages", + "noMessages": "Aucun message", + "selectFolder": "Sélectionnez un dossier pour voir les messages", + "thread": { + "empty": "Aucun message dans ce fil de discussion.", + "invalidDate": "Date invalide", + "loadError": "Échec du chargement du fil de discussion", + "loadMore": "Charger plus", + "loadingMore": "Chargement en cours...", + "message": "message", + "messages": "messages", + "noSubject": "(Aucun objet)", + "title": "Fil de discussion ({{count}} {{messageLabel}})" + }, + "title": "Boîte aux lettres" + }, + "navigation": { + "accessTokens": "Jetons d'accès", + "accounts": "Comptes", + "apiDocs": "Documentation API", + "attachment": "Pièces jointes", + "auth": "Authentification", + "dashboard": "Tableau de bord", + "general": "Général", + "home": "Accueil", + "mailbox": "Boîte aux lettres", + "oauth2": "OAuth2", + "other": "Autre", + "settings": "Paramètres", + "users": "Utilisateurs du système" + }, + "oauth2": { + "aSecretKeyProvidedByTheOAuthProvider": "Une clé secrète fournie par le fournisseur OAuth pour authentifier votre application.", + "actions": { + "authorize": "Autoriser", + "delete": "Supprimer", + "edit": "Modifier", + "openMenu": "Ouvrir le menu" + }, + "addConfiguration": "Ajouter Configuration", + "addExtraParams": "Ajouter des Paramètres Supplémentaires", + "addNew": "Ajouter Nouveau", + "addScope": "Ajouter une Portée", + "areYouSureYouWantTo": "Êtes-vous sûr de vouloir {{action}} ce client OAuth2 ?", + "areYouSureYouWantToDelete": "Êtes-vous sûr de vouloir supprimer", + "authAtatus": "Statut de l'Authentification OAuth2", + "authFailed": "Échec de l'Authentification OAuth2", + "authSuccess": "Authentification OAuth2 Réussie", + "authUrlLabel": "URL d'Autorisation :", + "authorizationUrlCannotBeEmpty": "L'URL d'Autorisation ne peut pas être vide", + "authorizationUrlIsRequired": "L'URL d'Autorisation est obligatoire", + "authorize": "Autoriser", + "authorizeAnEmailAccountToStartTheOAuth2AuthorizationProcess": "Autorisez un compte e-mail pour démarrer le processus d'autorisation OAuth2.", + "authorizeEmailAccount": "Autoriser le Compte E-mail", + "backToLogin": "Retour à la Connexion", + "clickSaveWhenDone": "Cliquez sur Enregistrer lorsque vous avez terminé.", + "clientId": "ID Client", + "clientIdCannotBeEmpty": "L'ID Client ne peut pas être vide", + "clientIdIsRequired": "L'ID Client est obligatoire", + "clientIdLabel": "ID Client :", + "clientSecret": "Secret Client", + "clientSecretCannotBeEmpty": "Le Secret Client ne peut pas être vide", + "clientSecretIsRequired": "Le Secret Client est obligatoire", + "clientSecretLabel": "Secret Client :", + "createAccount": "Créer un Compte", + "createNewHere": "Créez-en un nouveau ici.", + "created": "Créé", + "creating": "Création en cours...", + "creationFailed": "Échec de la Création", + "delete": "Supprimer", + "deleteFailed": "La suppression a échoué, veuillez réessayer plus tard", + "deleteSuccess": "Suppression Réussie", + "deleteToken": "Supprimer le Jeton", + "describeThePurposeOfTheOauth2Application": "Décrivez le but de l'application OAuth2", + "description": "Gère automatiquement la récupération, le stockage et le rafraîchissement des jetons d'accès, garantissant une expérience d'authentification transparente et toujours disponible.", + "descriptionLabel": "Description :", + "descriptionMustNotExceed255Characters": "La description ne doit pas dépasser 255 caractères.", + "disable": "Désactiver", + "disableOAuth2Client": "Désactiver le Client OAuth2", + "disabled": "Désactivé", + "edit": "Modifier", + "enable": "Activer", + "enableOAuth2Client": "Activer le Client OAuth2", + "enabled": "Activé", + "enterIdToConfirmDeletion": "Entrez l'ID pour confirmer la suppression.", + "enterTheAuthorizationUrl": "Entrez l'URL d'autorisation", + "enterTheKeyHere": "Entrez la clé ici.", + "enterTheScopeHere": "Entrez la portée ici.", + "enterTheTokenUrl": "Entrez l'URL du jeton", + "enterTheValueHere": "Entrez la valeur ici.", + "enterYourClientId": "Entrez votre ID client", + "enterYourClientSecret": "Entrez votre secret client", + "enterYourRedirectUrl": "Entrez votre URI de redirection", + "error": "Erreur", + "getAuthorizeUrlFailed": "Échec de la Récupération de l'URL d'Autorisation", + "getAuthorizeUrlFailedDesc": "Échec de la récupération de l'URL d'autorisation, veuillez réessayer plus tard", + "gmail": "Gmail", + "goHome": "Aller à l'Accueil", + "goToAccounts": "Aller aux Comptes", + "id": "ID", + "information": "Information", + "invalidAuthorizationUrlFormat": "Format d'URL d'autorisation invalide", + "invalidRedirectUriFormat": "Format d'URI de redirection invalide", + "invalidTokenUrlFormat": "Format d'URL de jeton invalide", + "key": "Clé :", + "keyCannotBeEmpty": "La Clé ne peut pas être vide", + "keyIsRequired": "La Clé est obligatoire", + "leaveEmptyToKeepExistingSecret": "Laisser vide pour conserver le secret existant", + "leaveEmptyToKeepTheExistingSecret": "Laissez vide pour conserver le secret existant, entrez une nouvelle valeur seulement pour mettre à jour.", + "loadingAccounts": "Chargement des comptes...", + "noConfigurations": "Aucune Configuration OAuth2", + "noConfigurationsDesc": "Vous n'avez pas encore ajouté de configuration OAuth2. Veuillez en ajouter une pour commencer à utiliser les fonctionnalités OAuth2.", + "noEmailAccountsRegistered": "Aucun compte e-mail enregistré. Veuillez en créer un.", + "noProxyAvailable": "Aucun proxy disponible", + "noStatus": "Cette page affiche le résultat de votre authentification OAuth2. Aucun statut spécifique n'est disponible actuellement. Veuillez réessayer si nécessaire.", + "oauth2ClientHasBeenSuccessfully": "Le client OAuth2 a été {{action}} avec succès.", + "oauth2ClientUpdated": "Client OAuth2 Mis à Jour", + "oauth2DeleteFailed": "Échec de la Suppression OAuth2", + "optional": "Facultatif", + "outlook": "Outlook", + "pleaseBeCareful": "Soyez prudent, cette opération ne peut pas être annulée.", + "pleaseCreateOne": "Veuillez en créer un.", + "provider": "Fournisseur", + "quickPresets": "Préréglages rapides :", + "redirectUri": "URI de Redirection", + "redirectUriCannotBeEmpty": "L'URI de Redirection ne peut pas être vide", + "redirectUriIsRequired": "L'URI de Redirection est obligatoire", + "redirectUrlLabel": "URI de Redirection :", + "save": "Enregistrer", + "saveChanges": "Enregistrer les Modifications", + "saving": "Enregistrement en cours...", + "scope": "Portée :", + "scopes": "Portées", + "selectAProxy": "Sélectionner un proxy", + "selectAnAccount": "Sélectionner un compte", + "status": "Statut", + "statusUpdateFailed": "Échec de la mise à jour du statut, veuillez réessayer plus tard", + "success": "Succès", + "successMessage": "Votre compte e-mail a été authentifié avec succès via OAuth2. Le jeton d'accès a été enregistré par le système et sera rafraîchi automatiquement si nécessaire.", + "theRedirectUrlAfterAuthorization": "L'URI de redirection après autorisation. Doit correspondre à celui enregistré auprès du fournisseur OAuth. Utilise le format http://[host]:[port]/oauth2/callback (ou https://), où [host] et [port] doivent correspondre à votre déploiement RustMailer. Le chemin /oauth2/callback est fixe.", + "theUniqueIdentifierForYourApplication": "L'identifiant unique de votre application, fourni par le fournisseur OAuth.", + "theUrlUsedToExchange": "L'URL utilisée pour échanger le code d'autorisation contre un jeton d'accès.", + "theUrlWhereUsersWillBeRedirected": "L'URL vers laquelle les utilisateurs seront redirigés pour autoriser votre application.", + "thisActionWillPermanentlyRemoveTheOauth2Record": "Cette action supprimera définitivement l'enregistrement OAuth2 du système. Cela ne peut pas être annulé.", + "thisWillPreventTheOAuth2ClientFromBeingUsed": "Cela empêchera l'utilisation du client OAuth2.", + "title": "OAuth2", + "tokenUrlCannotBeEmpty": "L'URL du Jeton ne peut pas être vide", + "tokenUrlIsRequired": "L'URL du Jeton est obligatoire", + "tokenUrlLabel": "URL du Jeton :", + "tryAgain": "Réessayer", + "unknownError": "Une erreur inconnue s'est produite.", + "updateFailed": "Échec de la Mise à Jour", + "updateHere": "Mettez à jour ici.", + "updateOrCreationFailed": "La {{action}} a échoué, veuillez réessayer plus tard", + "updated": "Mis à jour", + "useProxyOptional": "Utiliser un Proxy (facultatif) :", + "useSocks5ProxyForOAuthRequests": "Utilise le proxy SOCKS5 pour les requêtes OAuth lorsque l'accès direct est bloqué.", + "value": "Valeur :", + "valueCannotBeEmpty": "La Valeur ne peut pas être vide", + "valueIsRequired": "La Valeur est obligatoire", + "warning": "Attention !", + "whenDisabled": "Si désactivé : - Les nouveaux flux d'autorisation seront immédiatement refusés - Les jetons d'accès et de rafraîchissement existants seront révoqués dans la minute - Les utilisateurs devront réautoriser lors de la réactivation", + "yourOAuth2ApplicationHasBeenSuccessfully": "Votre application OAuth2 a été {{action}} avec succès.", + "yourOAuth2ApplicationHasBeenSuccessfullyDeleted": "Votre application OAuth2 a été supprimée avec succès." + }, + "permission": { + "account": { + "create": "Créer des comptes e-mail", + "manage": "Gérer les comptes attribués", + "manage_all": "Gérer toutes les configurations de compte", + "read_details": "Lire les détails du compte" + }, + "category": { + "account": "Autorisations du compte", + "global_data": "Données globales (Admin)", + "system_identity": "Système et identité" + }, + "data": { + "delete": "Supprimer les e-mails attribués", + "delete_all": "Supprimer les e-mails de tous les comptes", + "export_batch": "Exporter les données attribuées par lot", + "export_batch_all": "Exporter toutes les données par lot", + "import_batch": "Importer des données e-mail par lot", + "manage": "Gérer les métadonnées e-mail attribuées", + "manage_all": "Gérer toutes les métadonnées e-mail", + "raw_download": "Télécharger les e-mails bruts attribués", + "raw_download_all": "Télécharger tous les e-mails bruts", + "read": "Lire les données e-mail attribuées", + "read_all": "Lire toutes les données e-mail", + "smtp_ingest": "Ingérer des e-mails via le protocole SMTP" + }, + "dialog": { + "account_description": "Autorisations limitées au compte sélectionné.", + "account_title": "Autorisations du compte", + "global_description": "Autorisations système accordées à cet utilisateur.", + "global_title": "Autorisations globales" + }, + "scope": { + "account": "Compte #{{id}}", + "global": "Global" + }, + "system": { + "access": "Accès système de base", + "root": "Contrôle système complet" + }, + "token": { + "manage": "Gérer les jetons d'accès" + }, + "user": { + "manage": "Gérer tous les utilisateurs", + "view": "Lister les noms d'utilisateur" + } + }, + "profile": { + "avatar_alt": "Avatar", + "menu": { + "profile": "Profil", + "settings": "Paramètres", + "sign_out": "Se déconnecter" + } + }, + "proxyDelete": { + "close": "Fermer", + "confirmText": "Êtes-vous sûr de vouloir supprimer", + "deleteBtn": "Supprimer", + "failedDesc": "La suppression a échoué, veuillez réessayer plus tard", + "failedTitle": "Échec de la suppression du Proxy", + "permanent": "Cette action supprimera définitivement le Proxy du système. Cela ne peut pas être annulé.", + "proxyIdLabel": "ID Proxy :", + "proxyIdPlaceholder": "Entrez l'ID Proxy pour confirmer la suppression.", + "successDesc": "Le Proxy a été supprimé avec succès.", + "successTitle": "Suppression Réussie", + "title": "Supprimer le Proxy", + "tryAgain": "Réessayer", + "warningDesc": "Soyez prudent, cette opération ne peut pas être annulée.", + "warningTitle": "Attention !" + }, + "restore_message": { + "accountsInvolved": "Comptes concernés", + "bulkTitle": "Restaurer plusieurs messages", + "bulkWarning": "Remarque : les messages seront restaurés dans leurs dossiers d'origine.", + "confirm": "Exécuter la restauration", + "desc": "Cette action va re-télécharger les messages sélectionnés depuis Bichon et les restaurer dans leurs boîtes aux lettres correspondantes sur le serveur IMAP.", + "failed": "Échec de la restauration", + "failedTitle": "Erreur de restauration", + "messages": "messages", + "restore_to_imap": "Restaurer le message", + "success": "Restauration réussie", + "successDesc": "Les messages sélectionnés ont été restaurés avec succès sur le serveur IMAP.", + "summary": "Détails de la restauration", + "title": "Restaurer un message" + }, + "roles": { + "actions": { + "add": "Ajouter un rôle", + "cancel": "Annuler", + "close": "Fermer", + "failed": "L'opération a échoué", + "retry": "Réessayer", + "submit_create": "Créer le rôle", + "submit_update": "Mettre à jour le rôle", + "success_create": "Rôle créé avec succès", + "success_update": "Rôle mis à jour avec succès" + }, + "categories": { + "account_resource": "Accès ressources compte", + "global_data": "Accès données globales", + "identity": "Identité & Gestion" + }, + "columns": { + "created_at": "Créé le", + "id": "ID", + "name": "Nom", + "permissions": "Permissions", + "role_type": "Type", + "updated_at": "Mis à jour le" + }, + "delete": { + "alert_desc": "La suppression de ce rôle le retirera de tous les utilisateurs assignés.", + "alert_title": "Attention : action définitive.", + "confirm_btn": "Supprimer le rôle", + "confirm_label": "Saisissez l'ID du rôle pour confirmer :", + "deleting": "Suppression...", + "dialog_title": "Supprimer le rôle", + "error_fallback": "Impossible de supprimer le rôle.", + "error_title": "Échec de la suppression", + "irreversible": "Cette action est irréversible.", + "placeholder": "Saisissez \"{{id}}\"", + "success_desc": "Le rôle \"{{name}}\" a été supprimé.", + "success_title": "Rôle supprimé", + "warning_text": "Vous supprimez définitivement le rôle {{name}} (ID : {{id}})." + }, + "description_hint": "Définissez la portée des accès et les permissions.", + "details": { + "close_btn": "Fermer", + "desc_account": "Accès et opérations sur les comptes individuels.", + "desc_global": "Gestion globale et accès système.", + "role_badge": "Rôle {{type}}", + "title": "Permissions : {{name}}", + "unknown": "Rôle inconnu", + "view_permissions": "Détails des permissions" + }, + "empty": { + "desc": "Vous n'avez pas encore créé de rôles personnalisés.", + "title": "Aucun rôle trouvé" + }, + "form": { + "builtin_badge": "Rôle intégré", + "builtin_desc": "Ce rôle est prédéfini et en lecture seule.", + "desc_label": "Description", + "matrix_label": "Matrice des permissions ({{type}})", + "name_label": "Nom du rôle", + "type_label": "Type de rôle" + }, + "placeholder": { + "filter": "Rechercher des rôles..." + }, + "title": { + "create": "Créer un rôle", + "edit": "Modifier le rôle : {{name}}" + }, + "types": { + "Account": "Compte", + "Global": "Global" }, "validation": { - "required": "Ce champ est obligatoire", - "invalidEmail": "Adresse e-mail non valide", - "invalidUrl": "URL non valide", - "passwordMinLength": "Le mot de passe doit contenir au moins {{min}} caractères", - "pleaseEnterPassword": "Veuillez entrer votre mot de passe", - "passwordRequired": "Le mot de passe est obligatoire lorsque la méthode d'authentification est Mot de passe", - "emailRequired": "L'adresse e-mail est obligatoire", - "imapHostRequired": "L'hôte IMAP est obligatoire", - "imapHostCannotBeEmpty": "L'hôte IMAP ne peut pas être vide", - "imapPortMustBePositive": "Le port IMAP doit être un entier positif", - "imapPortMustBeLessThan65536": "Le port IMAP doit être inférieur à 65536", - "folderLimitMustBeNumber": "La limite de dossiers doit être un nombre", - "folderLimitMustBeAtLeast100": "La limite de dossiers doit être d'au moins 100", - "incrementalSyncMustBeNumber": "L'intervalle de synchronisation incrémentielle doit être un nombre", - "incrementalSyncMustBeAtLeast10": "L'intervalle de synchronisation incrémentielle doit être d'au moins 10 minutes", - "pleaseEnterUsernameOrEmail": "Veuillez entrer votre nom d'utilisateur ou votre courriel", - "singleRequestBatchSizeMustBeNumber": "La taille du lot doit être un nombre", - "singleRequestBatchSizeTooSmall": "La taille du lot doit être au moins 10", - "singleRequestBatchSizeTooLarge": "La taille du lot doit être au plus 200" - }, - "table": { - "noResults": "Aucun résultat trouvé", - "loading": "Chargement...", - "page": "Page", - "of": "de", - "rowsPerPage": "Lignes par page", - "showing": "Affichage", - "to": "à", - "results": "résultats", - "asc": "Asc", - "desc": "Desc", - "hide": "Masquer", - "edit": "Modifier", - "delete": "Supprimer", - "pagination": { - "selected": "{{selected}} / {{total}} ligne(s) sélectionnée(s).", - "fixed_page_size": "{{size}} lignes par page.", - "rows_per_page": "Lignes per page", - "page_info": "Page {{page}} sur {{total}}", - "first": "Première page", - "previous": "Page précédente", - "next": "Page suivante", - "last": "Dernière page" - } - }, - "proxyDelete": { - "title": "Supprimer le Proxy", - "successTitle": "Suppression Réussie", - "successDesc": "Le Proxy a été supprimé avec succès.", - "close": "Fermer", - "failedTitle": "Échec de la suppression du Proxy", - "failedDesc": "La suppression a échoué, veuillez réessayer plus tard", - "tryAgain": "Réessayer", - "confirmText": "Êtes-vous sûr de vouloir supprimer", - "permanent": "Cette action supprimera définitivement le Proxy du système. Cela ne peut pas être annulé.", - "proxyIdLabel": "ID Proxy :", - "proxyIdPlaceholder": "Entrez l'ID Proxy pour confirmer la suppression.", - "warningTitle": "Attention !", - "warningDesc": "Soyez prudent, cette opération ne peut pas être annulée.", - "deleteBtn": "Supprimer" - }, - "systemConfig": { - "pageTitle": "Configurations au niveau système", - "pageDescription": "Ces paramètres sont initialisés via des drapeaux CLI ou des variables d'environnement. Ils sont en lecture seule pour garantir la cohérence de l'environnement.", - "status": { - "enabled": "Activé", - "disabled": "Désactivé", - "configured": "Configuré", - "missing": "Manquant", - "auto": "Auto", - "notSet": "Non défini" - }, - "sections": { - "network": { - "title": "Réseau", - "desc": "Accès HTTP et public" - }, - "cors": { - "title": "CORS", - "desc": "Règles d'accès cross-origin" - }, - "logging": { - "title": "Journalisation", - "desc": "Comportement de sortie des logs" - }, - "storage": { - "title": "Stockage et Cache", - "desc": "Chemins de base de données et limites" - }, - "security": { - "title": "Sécurité", - "desc": "Authentification et chiffrement" - }, - "performance": { - "title": "Performance", - "desc": "Concurrence et compression" - }, - "smtp": { - "title": "Serveur SMTP", - "desc": "Paramètres de réception du courrier entrant pour l'archivage en temps réel" - } - } - }, - "apiTokens": { - "page": { - "loadError": "Échec du chargement des jetons API.", - "emptyTitle": "Aucun jeton API", - "emptyDescription": "Vous n'avez pas encore créé de jetons API. Cliquez ci-dessous pour en créer un.", - "addBtn": "Ajouter un jeton" - }, - "list": { - "unnamedToken": "Jeton sans nom", - "statusActive": "Actif", - "statusExpired": "Expiré", - "neverExpires": "N'expire jamais", - "expiresOnShort": "Expire le {{date}}", - "tokenLabel": "Jeton", - "createdLabel": "Créé le", - "lastUsedLabel": "Dernière utilisation", - "expiresOnLabel": "Expire le", - "neverUsed": "Jamais", - "neverLabel": "Jamais", - "deleteBtn": "Supprimer le jeton" - }, - "dialog": { - "createTitle": "Créer un jeton d'accès", - "editTitle": "Modifier le jeton d'accès", - "description": "Cliquez sur enregistrer lorsque vous avez terminé.", - "save": "Enregistrer", - "saveChanges": "Enregistrer les modifications" - }, - "deleteDialog": { - "title": "Supprimer le jeton d'accès ?", - "description": "Cette action est irréversible. Toute application utilisant ce jeton perdra immédiatement son accès.", - "cancel": "Annuler", - "confirm": "Supprimer", - "deleting": "Suppression..." - }, - "form": { - "nameLabel": "Nom", - "namePlaceholder": "Donnez un nom court à ce jeton", - "nameDescription": "Optionnel · Max 32 caractères", - "expirationLabel": "Expiration", - "expirationPlaceholder": "Sélectionner l'expiration", - "expirationDescription": "Les jetons expireront automatiquement après le délai sélectionné.", - "never": "Jamais", - "1day": "1 jour", - "7days": "7 jours", - "30days": "30 jours", - "errorMax": "Max 32 caractères", - "errorNumber": "Doit être un nombre", - "errorInt": "Doit être un entier", - "errorPositive": "Doit être supérieur à 0" - }, - "notifications": { - "createSuccess": "Jeton d'accès créé", - "createSuccessDesc": "Le jeton d'accès a été créé avec succès.", - "updateSuccess": "Jeton d'accès mis à jour", - "updateSuccessDesc": "Le jeton d'accès a été mis à jour avec succès.", - "createFailed": "Échec de la création", - "updateFailed": "Échec de la mise à jour", - "deleteSuccess": "Jeton d'accès supprimé avec succès", - "deleteFailed": "Échec de la suppression du jeton", - "copied": "Copié dans le presse-papiers", - "genericError": "L'opération a échoué. Veuillez réessayer.", - "close": "Fermer", - "tryAgain": "Réessayer" - } - }, - "permission": { - "scope": { - "global": "Global", - "account": "Compte #{{id}}" - }, - "dialog": { - "global_title": "Autorisations globales", - "account_title": "Autorisations du compte", - "global_description": "Autorisations système accordées à cet utilisateur.", - "account_description": "Autorisations limitées au compte sélectionné." - }, - "category": { - "system_identity": "Système et identité", - "global_data": "Données globales (Admin)", - "account": "Autorisations du compte" - }, - "system": { - "access": "Accès système de base", - "root": "Contrôle système complet" - }, - "user": { - "manage": "Gérer tous les utilisateurs", - "view": "Lister les noms d'utilisateur" - }, - "token": { - "manage": "Gérer les jetons d'accès" - }, - "account": { - "create": "Créer des comptes e-mail", - "manage": "Gérer les comptes attribués", - "manage_all": "Gérer toutes les configurations de compte", - "read_details": "Lire les détails du compte" - }, - "data": { - "read": "Lire les données e-mail attribuées", - "read_all": "Lire toutes les données e-mail", - "manage": "Gérer les métadonnées e-mail attribuées", - "manage_all": "Gérer toutes les métadonnées e-mail", - "raw_download": "Télécharger les e-mails bruts attribués", - "raw_download_all": "Télécharger tous les e-mails bruts", - "delete": "Supprimer les e-mails attribués", - "delete_all": "Supprimer les e-mails de tous les comptes", - "export_batch": "Exporter les données attribuées par lot", - "export_batch_all": "Exporter toutes les données par lot", - "import_batch": "Importer des données e-mail par lot", - "smtp_ingest": "Ingérer des e-mails via le protocole SMTP" - } - }, - "users": { - "columns": { - "id": "ID", - "avatar": "Avatar", - "username": "Nom d'utilisateur", - "email": "Adresse e-mail", - "roles": "Rôles et permissions", - "created_at": "Créé le", - "updated_at": "Mis à jour le", - "actions": "Actions" - }, - "buttons": { - "add": "Ajouter un utilisateur", - "add_new": "Créer un utilisateur" - }, - "empty": { - "title": "Aucun utilisateur trouvé", - "description": "Cliquez sur le bouton ci-dessous pour ajouter votre premier utilisateur." - }, - "nav": { - "users": "Utilisateurs", - "roles": "Rôles", - "api_tokens": "Jetons API" - }, - "api_tokens": { - "empty": { - "title": "Aucun jeton API trouvé", - "description": "Aucun jeton API n'a encore été généré dans le système." - }, - "button": { - "generate": "Générer un nouveau jeton" - }, - "toolbar": { - "search_placeholder": "Rechercher par nom, propriétaire ou jeton..." - }, - "table": { - "name": "Nom", - "type": "Type", - "last_used": "Dernière utilisation", - "expires_at": "Expire le", - "owner": "Propriétaire", - "created": "Créé", - "api_key": "Clé API", - "web_ui": "Interface Web", - "never": "Jamais", - "permanent": "Permanent", - "expired": "Expiré", - "unnamed": "Jeton sans nom" - }, - "unnamed": "Jeton sans nom", - "delete": { - "title": "Supprimer le jeton API", - "desc": "Vous êtes sur le point de supprimer définitivement ce jeton API", - "prefix": "Préfixe du jeton", - "irreversible": "Cette action est irréversible. Toutes les applications utilisant ce jeton perdront immédiatement l'accès.", - "confirm_label": "Pour confirmer, saisissez {{word}} ci-dessous :", - "confirm_placeholder": "Saisissez \"{{word}}\" pour confirmer", - "warning_title": "Avertissement", - "warning_desc": "Tous les scripts ou services utilisant ce jeton échoueront. Assurez-vous d'avoir mis à jour vos systèmes.", - "confirm_button": "Supprimer le jeton", - "deleting": "Suppression..." - }, - "toast": { - "deleted_title": "Jeton API supprimé", - "deleted_desc": "Le jeton \"{{name}}\" a été supprimé avec succès.", - "delete_failed_title": "Échec de la suppression", - "delete_failed": "Impossible de supprimer le jeton, veuillez réessayer." - } - }, - "tokens": { - "schema": { - "name_max": "Max 32 caractères", - "expire_number": "Doit être un nombre", - "expire_int": "Doit être un entier", - "expire_positive": "Doit être supérieur à 0" - }, - "toast": { - "update_success_title": "Jeton mis à jour", - "update_success_desc": "Le jeton d'accès a été mis à jour avec succès.", - "create_success_title": "Jeton créé", - "create_success_desc": "Le jeton d'accès a été créé avec succès.", - "update_failed_title": "Échec de la mise à jour", - "create_failed_title": "Échec de la création" - }, - "error": { - "fallback": "L'opération a échoué, veuillez réessayer plus tard." - }, - "dialog": { - "edit_title": "Modifier le jeton", - "create_title": "Créer un jeton d'accès", - "description": "Cliquez sur enregistrer lorsque vous avez terminé." - }, - "fields": { - "name_label": "Nom", - "name_placeholder": "Donnez un nom court à ce jeton", - "name_hint": "Optionnel · Max 32 caractères", - "expire_label": "Expiration", - "expire_placeholder": "Choisir l'expiration", - "expire_hint": "Le jeton expirera automatiquement après le délai choisi." - }, - "expire_options": { - "never": "N'expire jamais", - "1_day": "1 jour", - "7_days": "7 jours", - "30_days": "30 jours" - } - }, - "tokens_action": { - "dialog": { - "title": "Jetons API", - "description": "Gérer les jetons API pour cet utilisateur." - }, - "empty": { - "title": "Aucun jeton API", - "description": "Cet utilisateur n'a aucun jeton API pour le moment." - }, - "buttons": { - "add": "Ajouter un jeton" - }, - "list": { - "unnamed_token": "Jeton sans nom", - "status_expired": "Expiré", - "status_active": "Actif", - "expires_on_brief": "Expire le {{date}}", - "never_expires": "N'expire jamais", - "label_token": "Jeton", - "label_created": "Créé le", - "label_last_used": "Dernière utilisation", - "label_expires_at": "Expire le", - "never": "Jamais", - "button_delete": "Supprimer le jeton" - }, - "delete_dialog": { - "title": "Supprimer le jeton d'accès ?", - "description": "Cette action est irréversible." - } - }, - "actions": { - "schema": { - "account_required": "Veuillez sélectionner un compte", - "role_required": "Veuillez sélectionner un rôle", - "username_required": "Le nom d'utilisateur est requis", - "username_min": "Le nom d'utilisateur doit contenir au moins 3 caractères", - "username_max": "Le nom d'utilisateur ne peut pas dépasser 32 caractères", - "email_required": "L'adresse e-mail est requise", - "email_invalid": "Veuillez saisir une adresse e-mail valide", - "global_role_required": "Attribuez au moins un rôle global", - "description_max": "La description ne peut pas dépasser 256 caractères", - "ip_invalid": "Adresse IP invalide détectée", - "password_required": "Le mot de passe est requis", - "password_min": "Le mot de passe doit contenir au moins 8 caractères", - "password_max": "Le mot de passe ne peut pas dépasser 256 caractères" - }, - "toast": { - "updated": "Utilisateur mis à jour", - "created": "Utilisateur créé" - }, - "dialog": { - "edit_title": "Modifier l'utilisateur : {{name}}", - "create_title": "Créer un utilisateur", - "subtitle": "Configurez l'identité, les accès et les politiques de sécurité." - }, - "tabs": { - "general": "Général", - "permissions": "Permissions compte", - "security": "Sécurité & ACL" - }, - "sections": { - "basic": "Identité de base", - "global": "Permissions globales", - "mail_access": "Contrôle d'accès mail", - "mail_access_subtitle": "Définissez les comptes mail gérables par cet utilisateur.", - "policy": "Politiques" - }, - "fields": { - "username": "Nom d'utilisateur", - "username_hint": "Identifiant unique pour la connexion.", - "email": "Adresse e-mail", - "email_hint": "Contact principal et notifications.", - "password": "Mot de passe", - "password_placeholder_create": "Au moins 8 caractères", - "password_placeholder_edit": "Laisser vide pour conserver l'actuel", - "password_hint_create": "Mot de passe sécurisé pour la configuration initiale.", - "password_hint_edit": "Saisissez un nouveau mot de passe uniquement si vous souhaitez le changer.", - "global_roles_hint": "Attribuez des permissions système.", - "description": "Description (optionnel)", - "description_placeholder": "Notes sur cet utilisateur...", - "description_hint": "Notes internes (max 256 caractères).", - "select_account": "Choisir un compte", - "assign_role": "Attribuer un rôle", - "ip_whitelist": "Liste blanche IP", - "ip_whitelist_hint": "Limiter la connexion à ces IP (une par ligne).", - "rate_quota": "Quota de débit", - "burst_interval": "Intervalle de rafale (sec)" - }, - "buttons": { - "add_account": "Ajouter un compte", - "update": "Mettre à jour", - "create": "Créer" - }, - "states": { - "full_access": "Mode accès complet", - "full_access_desc": "Les administrateurs ont un accès inhérent à tous les comptes.", - "no_accounts": "Aucun compte spécifique attribué.", - "security_disabled": "Les politiques de sécurité sont désactivées." - }, - "api_tokens": "Jetons API", - "placeholder": { - "filter": "Rechercher des utilisateurs..." - }, - "delete": { - "title": "Supprimer l'utilisateur", - "confirm_msg": "Vous supprimez définitivement l'utilisateur {{name}} (ID : {{id}}).", - "irreversible": "Cette action est irréversible.", - "input_label": "Saisissez l'ID de l'utilisateur pour confirmer :", - "placeholder": "Saisissez \"{{id}}\"", - "alert_title": "Attention : action définitive.", - "alert_desc": "L'utilisateur et toutes ses données seront supprimés.", - "button_confirm": "Supprimer l'utilisateur", - "button_deleting": "Suppression...", - "toast": { - "success_title": "Utilisateur supprimé", - "success_desc": "L'utilisateur \"{{name}}\" a été supprimé.", - "failed_title": "Échec de la suppression", - "failed_fallback": "Impossible de supprimer l'utilisateur." - } - } - } - }, - "roles": { - "title": { - "create": "Créer un rôle", - "edit": "Modifier le rôle : {{name}}" - }, - "description_hint": "Définissez la portée des accès et les permissions.", - "form": { - "name_label": "Nom du rôle", - "type_label": "Type de rôle", - "desc_label": "Description", - "matrix_label": "Matrice des permissions ({{type}})", - "builtin_badge": "Rôle intégré", - "builtin_desc": "Ce rôle est prédéfini et en lecture seule." - }, - "types": { - "Global": "Global", - "Account": "Compte" - }, - "categories": { - "identity": "Identité & Gestion", - "global_data": "Accès données globales", - "account_resource": "Accès ressources compte" - }, - "actions": { - "cancel": "Annuler", - "submit_create": "Créer le rôle", - "submit_update": "Mettre à jour le rôle", - "success_create": "Rôle créé avec succès", - "success_update": "Rôle mis à jour avec succès", - "failed": "L'opération a échoué", - "close": "Fermer", - "retry": "Réessayer", - "add": "Ajouter un rôle" - }, - "validation": { - "name_required": "Le nom du rôle est requis", - "perm_required": "Sélectionnez au moins une permission" - }, - "columns": { - "id": "ID", - "name": "Nom", - "role_type": "Type", - "permissions": "Permissions", - "created_at": "Créé le", - "updated_at": "Mis à jour le" - }, - "placeholder": { - "filter": "Rechercher des rôles..." - }, - "delete": { - "dialog_title": "Supprimer le rôle", - "warning_text": "Vous supprimez définitivement le rôle {{name}} (ID : {{id}}).", - "irreversible": "Cette action est irréversible.", - "confirm_label": "Saisissez l'ID du rôle pour confirmer :", - "placeholder": "Saisissez \"{{id}}\"", - "alert_title": "Attention : action définitive.", - "alert_desc": "La suppression de ce rôle le retirera de tous les utilisateurs assignés.", - "confirm_btn": "Supprimer le rôle", - "deleting": "Suppression...", - "success_title": "Rôle supprimé", - "success_desc": "Le rôle \"{{name}}\" a été supprimé.", - "error_title": "Échec de la suppression", - "error_fallback": "Impossible de supprimer le rôle." - }, - "details": { - "title": "Permissions : {{name}}", - "unknown": "Rôle inconnu", - "role_badge": "Rôle {{type}}", - "desc_global": "Gestion globale et accès système.", - "desc_account": "Accès et opérations sur les comptes individuels.", - "close_btn": "Fermer", - "view_permissions": "Détails des permissions" - }, - "empty": { - "title": "Aucun rôle trouvé", - "desc": "Vous n'avez pas encore créé de rôles personnalisés." - } - }, - "profile": { - "avatar_alt": "Avatar", - "menu": { - "profile": "Profil", - "settings": "Paramètres", - "sign_out": "Se déconnecter" - } - }, - "sign_out": { - "title": "Déconnexion", - "desc": "Êtes-vous sûr de vouloir vous déconnecter ? Vous devrez vous reconnecter pour accéder à votre compte.", - "confirm": "Déconnexion" - }, - "restore_message": { - "title": "Restaurer un message", - "bulkTitle": "Restaurer plusieurs messages", - "bulkWarning": "Remarque : les messages seront restaurés dans leurs dossiers d'origine.", - "accountsInvolved": "Comptes concernés", - "summary": "Détails de la restauration", - "messages": "messages", - "desc": "Cette action va re-télécharger les messages sélectionnés depuis Bichon et les restaurer dans leurs boîtes aux lettres correspondantes sur le serveur IMAP.", - "confirm": "Exécuter la restauration", - "restore_to_imap": "Restaurer le message", - "success": "Restauration réussie", - "successDesc": "Les messages sélectionnés ont été restaurés avec succès sur le serveur IMAP.", - "failed": "Échec de la restauration", - "failedTitle": "Erreur de restauration" - }, - "time": { - "label": "Temps", - "since": "Depuis", - "before": "Avant", - "recent_range": "Période récente (depuis...)", - "historical": "Période historique (avant...)", - "absolute_range": "Plage de dates absolue", - "last_day": "Dernier jour", - "last_days": "Derniers {{count}} jours", - "last_months": "Derniers {{count}} mois", - "over_years_ago": "Il y a {{count}} {{unit}}", - "year": "an", - "years": "ans", - "recent_prefix": "Récent :", - "days_ago_to_now": "jours jusqu’à aujourd’hui", - "apply": "Appliquer", - "start_date": "Date de début", - "end_date": "Date de fin", - "clear_filters": "Effacer les filtres de temps", - "format": "yyyy-MM-dd" - }, - "tag": { - "label": "Étiquettes", - "search_placeholder": "Rechercher des étiquettes...", - "clear_all": "Effacer toutes les étiquettes", - "no_tags_found": "Aucune étiquette trouvée" - }, - "search_accounts": { - "label": "Comptes e-mail", - "search_placeholder": "Rechercher des comptes e-mail...", - "clear_accounts": "Effacer les comptes sélectionnés", - "no_accounts_found": "Aucun compte trouvé" - }, - "search_mailbox": { - "label": "Boîtes mail", - "search_placeholder": "Rechercher des dossiers", - "clear_mailboxes": "Effacer les dossiers sélectionnés", - "select_account_first": "Veuillez d’abord sélectionner un compte e-mail", - "no_mailbox_found": "Aucun dossier trouvé" - }, - "search_contacts": { - "label": "Contacts", - "label_with_count": "Contacts ({{count}})", - "any": "Tous", - "search_placeholder": "Rechercher {{field}}...", - "reset_all": "Réinitialiser tous les contacts", - "no_contact_found": "Aucun contact trouvé", - "loading": "Chargement...", - "showing_limit": "Affichage des 100 premiers résultats uniquement • Total {{total}}" - }, - "search_more": { - "trigger_label": "Avancé", - "title": "Filtres avancés", - "reset": "Réinitialiser", - "has_attachment": "Contient une pièce jointe", - "attachment_name_label": "Nom de la pièce jointe", - "attachment_name_placeholder": "Ex. : invoice.pdf", - "message_size_label": "Taille du message", - "message_id_label": "Message-ID d’origine", - "message_id_description": "Recherche via l’en-tête Message-ID de l’e-mail", - "apply": "Appliquer les filtres", - "size_presets": { - "any": "Toutes tailles", - "tiny": "Très petite (< 15 Ko)", - "small": "Petite (< 2 Mo)", - "medium": "Moyenne (2 – 10 Mo)", - "large": "Grande (10 – 20 Mo)", - "huge": "Très grande (> 20 Mo)" - }, - "any": "Tous", - "search_placeholder": "Rechercher {{field}}...", - "extension": "Extension de fichier", - "category": "Catégorie de pièce jointe", - "content_types": "Type spécifique" - }, - "search_view": { - "button_label": "Affichage", - "menu_title": "Paramètres des colonnes" - }, - "search_reset": { - "label": "Réinitialiser", - "tooltip": "Effacer tous les filtres" - }, - "search_input": { - "placeholder": "Rechercher des e-mails... (Regex supporté)", - "button": "Rechercher", - "recent_title": "Recherches récentes", - "clear_history": "Effacer l’historique", - "no_history": "Aucun historique de recherche", - "all": "Tous les champs", - "all_fields_desc": "Recherche dans l'objet, le corps, l'expéditeur et les destinataires", - "subject": "Objet", - "body": "Corps du message" + "name_required": "Le nom du rôle est requis", + "perm_required": "Sélectionnez au moins une permission" } + }, + "search": { + "account": "Compte", + "addEmailAccount": "Ajouter un Compte E-mail", + "addTags": { + "cancel": "Annuler", + "createHint": "Créer une nouvelle étiquette : {{tag}}", + "invalidTitle": "Étiquette Non Valide", + "none": "Aucune étiquette ajoutée pour l'instant", + "save": "Enregistrer", + "saving": "Enregistrement en cours...", + "searchPlaceholder": "Rechercher ou créer des étiquettes...", + "selectedCount": "{{count}} étiquette(s) sélectionnée(s)", + "title": "Modifier les Étiquettes", + "tryAgain": "Veuillez réessayer plus tard", + "updateFailedTitle": "Échec de la Mise à Jour", + "updatedDesc": "Les étiquettes ont été mises à jour avec succès", + "updatedTitle": "Étiquettes Mises à Jour" + }, + "adjustSearch": "Essayez d'ajuster vos critères de recherche ou d'effacer les filtres.", + "advanced": "Avancé", + "advancedFilters": "Filtres Avancés", + "any": "Toutes", + "attachmentName": "Nom de la Pièce Jointe", + "attachmentsSize": "Pièces Jointes et Taille", + "bcc": "Cci", + "before": "Avant :", + "bulkActions": { + "ariaLabel": "{{count}} messages sélectionnés. Barre d'actions groupées", + "clear": "Effacer la sélection", + "delete": "Supprimer", + "deleteDesc": "Supprimer les messages sélectionnés", + "manageTags": "Gérer les tags", + "selected": "{{count}} sélectionné(s)" + }, + "cc": "Cc", + "clear": "Effacer", + "date": "Date", + "dateRange": "Plage de Dates", + "delete": { + "confirmButton": "Supprimer", + "confirmDetail": "Cette action est irréversible.", + "confirmPrefix": "Êtes-vous sûr de vouloir supprimer", + "countLabel": "{{count}} message(s)", + "errorTitle": "Échec de la suppression", + "successDesc": "Les messages ont été supprimés avec succès.", + "successTitle": "Messages supprimés", + "title": "Supprimer les messages", + "warningDesc": "Les messages supprimés seront définitivement retirés.", + "warningTitle": "Avertissement" + }, + "editTag": "Modifier l'Étiquette", + "endDate": "Date de Fin", + "from": "De", + "fullTextMultiAccount": "Texte intégral · Multi-comptes · Filtres avancés", + "hasAttachment": "Contient une Pièce Jointe", + "huge": "Énorme (≥20 Mo)", + "keyword": "Mot-clé", + "large": "Grande (10 - 20 MB)", + "mailbox": "Boîte aux lettres", + "maxSize": "Taille Max", + "maximumBytes": "Maximum (octets)", + "medium": "Moyenne (2 - 10 MB)", + "messageId": "ID du Message", + "minSize": "Taille Min", + "minimumBytes": "Minimum (octets)", + "no": "Non", + "noActiveEmailAccount": "Aucun compte e-mail actif.", + "noEmailsFound": "Aucun e-mail trouvé", + "noMailboxSelectAccount": "Aucune boîte aux lettres. Veuillez sélectionner un compte d'abord.", + "originalMessageIdHeader": "En-tête Message-ID de l'e-mail original", + "pleaseSelectAtLeastOne": "Veuillez sélectionner au moins un critère de recherche", + "preview": "Aperçu", + "recipient": "Destinataire", + "searchArchivedEmails": "Rechercher dans les E-mails Archivés", + "searchButton": "Rechercher", + "searchInSubjectBody": "Rechercher dans l'objet, le corps, les pièces jointes...", + "searching": "Recherche en cours, veuillez patienter...", + "searchingButton": "Recherche en cours...", + "selectAccount": "Sélectionner un compte", + "selectDate": "Sélectionner une date", + "selectMailbox": "Sélectionner une boîte aux lettres", + "sender": "Expéditeur", + "senderRecipients": "Expéditeur / Destinataires", + "since": "Depuis :", + "size": "Taille", + "sizeDescription": "La taille correspond à la taille totale de l’e-mail, pièces jointes incluses.", + "small": "Petite (<2 MB)", + "sort": "Trier", + "source": "Source", + "startDate": "Date de Début", + "startSearching": "Commencez à rechercher en utilisant un mot-clé, un expéditeur ou des filtres avancés.", + "subject": "Objet", + "tagFilter": "Filtre par Étiquette", + "thread": { + "empty": "Aucun message dans ce fil de discussion", + "error": "Échec du chargement du fil de discussion", + "invalidDate": "Date invalide", + "loadMore": "Charger plus", + "loadingMore": "Chargement en cours...", + "noSubject": "(Aucun objet)", + "title": "Fil de discussion · {{count}} messages" + }, + "tiny": "Très petite (<15 KB)", + "title": "Recherche", + "to": "À", + "updateTags": { + "actionAdd": "Ajouter", + "actionOverwrite": "Écraser", + "actionRemove": "Retirer", + "cancel": "Annuler", + "createHint": "Appuyez sur Entrée pour créer le tag : \"{{tag}}\"", + "invalidTitle": "Tag invalide", + "none": "Aucun tag sélectionné", + "overwriteWarning": "Avertissement : cela écrasera tous les tags existants sur les éléments sélectionnés.", + "savingAdd": "Ajout...", + "savingOverwrite": "Écrasement...", + "savingRemove": "Retrait...", + "searchPlaceholder": "Rechercher ou créer un tag...", + "selectedCount": "{{count}} tag(s) à appliquer", + "submitAdd": "Ajouter les tags", + "submitOverwrite": "Écraser les tags", + "submitRemove": "Retirer les tags", + "title": "Modifier les tags", + "tryAgain": "Veuillez réessayer plus tard.", + "updateFailedTitle": "Échec de la mise à jour", + "updatedDesc": "Les tags ont été mis à jour avec succès.", + "updatedTitle": "Tags mis à jour" + }, + "yes": "Oui" + }, + "search_accounts": { + "clear_accounts": "Effacer les comptes sélectionnés", + "label": "Comptes e-mail", + "no_accounts_found": "Aucun compte trouvé", + "search_placeholder": "Rechercher des comptes e-mail..." + }, + "search_contacts": { + "any": "Tous", + "label": "Contacts", + "label_with_count": "Contacts ({{count}})", + "loading": "Chargement...", + "no_contact_found": "Aucun contact trouvé", + "reset_all": "Réinitialiser tous les contacts", + "search_placeholder": "Rechercher {{field}}...", + "showing_limit": "Affichage des 100 premiers résultats uniquement • Total {{total}}" + }, + "search_input": { + "all": "Tous les champs", + "all_fields_desc": "Recherche dans l'objet, le corps, l'expéditeur et les destinataires", + "body": "Corps du message", + "button": "Rechercher", + "clear_history": "Effacer l’historique", + "no_history": "Aucun historique de recherche", + "placeholder": "Rechercher des e-mails (utilisez \" \" pour la recherche par expression)", + "recent_title": "Recherches récentes", + "subject": "Objet" + }, + "search_mailbox": { + "clear_mailboxes": "Effacer les dossiers sélectionnés", + "label": "Boîtes mail", + "no_mailbox_found": "Aucun dossier trouvé", + "search_placeholder": "Rechercher des dossiers", + "select_account_first": "Veuillez d’abord sélectionner un compte e-mail" + }, + "search_more": { + "any": "Tous", + "apply": "Appliquer les filtres", + "attachment_name_label": "Nom de la pièce jointe", + "attachment_name_placeholder": "Ex. : invoice.pdf", + "category": "Catégorie de pièce jointe", + "content_type": "Type de fichier", + "extension": "Extension de fichier", + "has_attachment": "Contient une pièce jointe", + "is_message": "Pièce jointe format e-mail", + "is_message_desc": "Cette pièce jointe est un fichier mail, par exemple un fichier .eml.", + "message_id_description": "Recherche via l’en-tête Message-ID de l’e-mail", + "message_id_label": "Message-ID d’origine", + "message_size_label": "Taille du message", + "reset": "Réinitialiser", + "search_placeholder": "Rechercher {{field}}...", + "size_presets": { + "any": "Toutes tailles", + "huge": "Très grande (> 20 Mo)", + "large": "Grande (10 – 20 Mo)", + "medium": "Moyenne (2 – 10 Mo)", + "small": "Petite (< 2 Mo)", + "tiny": "Très petite (< 15 Ko)" + }, + "title": "Filtres avancés", + "trigger_label": "Avancé" + }, + "search_reset": { + "label": "Réinitialiser", + "tooltip": "Effacer tous les filtres" + }, + "search_view": { + "button_label": "Affichage", + "menu_title": "Paramètres des colonnes" + }, + "settings": { + "accounts": "Comptes", + "acl": "Acl", + "actions": "Actions", + "add": "Ajouter", + "addNewProxyHere": "Ajoutez un nouveau Proxy ici. ", + "adding": "Ajout en cours...", + "appearance": { + "button": { + "update": "Mettre à jour les préférences" + }, + "command": { + "no_results": "Aucune langue trouvée.", + "search": "Rechercher une langue..." + }, + "description": { + "language": "Choisissez la langue de l'interface web.", + "theme": "Choisissez entre le mode clair ou sombre." + }, + "field": { + "language": "Langue de l'interface", + "theme": "Thème de l'interface" + }, + "placeholder": { + "select_language": "Choisir une langue" + }, + "theme": { + "dark": "Sombre", + "light": "Clair" + }, + "title": "Apparence", + "validation": { + "language": { + "required": "Veuillez sélectionner une langue." + }, + "theme": { + "required": "Veuillez sélectionner un thème." + } + } + }, + "authUrl": "URL d'Autorisation", + "changePasswordForFutureLogins": "Change le mot de passe pour les futures connexions.", + "confirmReset": "Confirmer la Réinitialisation", + "createdAt": "Créé le", + "delete": "Supprimer", + "description": "Description", + "edit": "Modifier", + "enabled": "Activé", + "enterNewRootPassword": "Entrez le nouveau mot de passe root", + "enterProxyIdToConfirmDeletion": "Entrez l'ID Proxy pour confirmer la suppression.", + "failedToCopyText": "Échec de la copie du texte", + "filterAccessToken": "Filtrer les Jetons d'Accès...", + "filterAccount": "Filtrer les Comptes...", + "filterOauth2": "Filtrer OAuth2...", + "filterProxy": "Filtrer les Proxys...", + "general": "Général", + "generateNewToken": "Génère un nouveau jeton, l'ancien expirera immédiatement.", + "host": "Hôte", + "id": "Id", + "invalidPassword": "Mot de passe non valide", + "lastAccess": "Dernier Accès", + "manageRootTokenAndPassword": "Gérez en toute sécurité le jeton et le mot de passe root.", + "name": "Nom", + "noProxies": "Aucun Proxy", + "noProxiesDesc": "Vous n'avez pas encore ajouté de configuration de proxy. Veuillez en ajouter une pour utiliser les fonctionnalités de proxy.", + "password": "Mot de passe", + "pleaseUseAnIpAddressForBetterReliability": "Veuillez utiliser une adresse IP (ex. 127.0.0.1) au lieu d'un nom d'hôte ou de domaine pour une meilleure fiabilité.", + "port": "Port", + "profile": { + "account": { + "id": "ID du compte : {{id}}" + }, + "avatarAlt": "Avatar", + "button": { + "permissions": "Autorisations", + "update_profile": "Mettre à jour le profil", + "view_global_permissions": "Voir les autorisations globales" + }, + "field": { + "email": "E-mail", + "password": "Mot de passe", + "username": "Nom d’utilisateur" + }, + "loadError": "Impossible de charger les informations de l’utilisateur.", + "maxSize": "Jusqu’à {{size}}", + "placeholder": { + "password_keep": "Laissez vide pour conserver le mot de passe actuel" + }, + "removeAvatar": "Supprimer l’avatar", + "section": { + "accounts": "{{count}} comptes liés", + "roles": "Rôles" + }, + "toast": { + "update_failed": "Échec de la mise à jour du profil", + "updated": "Profil mis à jour avec succès" + }, + "uploadError": "Erreur(s) lors du téléversement du fichier", + "uploadTitle": "Téléverser un avatar", + "validation": { + "email": { + "invalid": "Veuillez saisir une adresse e-mail valide", + "required": "L’adresse e-mail est requise" + }, + "password": { + "max": "Le mot de passe doit contenir au maximum 256 caractères", + "min": "Le mot de passe doit contenir au moins 8 caractères" + }, + "username": { + "max": "Le nom d’utilisateur doit contenir au maximum 32 caractères", + "min": "Le nom d’utilisateur doit contenir au moins 5 caractères", + "required": "Le nom d’utilisateur est requis" + } + } + }, + "proxy": "Proxy", + "proxyUpdateOrAddFailed": "La {{action}} a échoué, veuillez réessayer plus tard", + "reset": "Réinitialiser", + "resetRootPassword": "Réinitialiser le Mot de Passe Root", + "resetRootToken": "Réinitialiser le Jeton Root", + "root": "Root", + "rootAccessManagement": "Gestion de l'Accès Root", + "rootDesc": "Gérez les informations d'identification d'accès root, y compris le jeton et le mot de passe.", + "rootPasswordMustBeAtLeast6Characters": "Le mot de passe root doit contenir au moins 6 caractères.", + "rootTitle": "Root", + "selectAll": "Tout sélectionner", + "sidebar": { + "apiTokens": "Jetons API", + "configurations": "Configurations système", + "profile": "Profil", + "proxy": "Proxy réseau" + }, + "theRootPasswordHasBeenReset": "Le mot de passe root a été réinitialisé", + "theRootTokenHasBeenReset": "Le jeton root a été réinitialisé", + "theme": "Thème", + "title": "Paramètres", + "token": "Jeton", + "tokenUrl": "URL du Jeton", + "type": "Type", + "updateTheProxyHere": "Mettez à jour le Proxy ici. ", + "updatedAt": "Mis à jour le", + "url": "Url", + "useNewPasswordForNextLogin": "Utilisez le nouveau mot de passe pour la prochaine connexion.", + "useProxy": "Utiliser un Proxy", + "username": "Nom d'utilisateur", + "youAreAboutToResetTheRootPassword": "Vous êtes sur le point de réinitialiser le mot de passe root. Assurez-vous de le conserver en lieu sûr.", + "youAreAboutToResetTheRootToken": "Vous êtes sur le point de réinitialiser le jeton root. Cette action ne peut pas être annulée.", + "yourLoginInformationHasBeenUpdated": "Vos informations de connexion ont été mises à jour. Il n'est pas nécessaire de vous reconnecter.", + "yourProxyHasBeenSuccessfully": "Votre Proxy a été {{action}} avec succès." + }, + "sign_out": { + "confirm": "Déconnexion", + "desc": "Êtes-vous sûr de vouloir vous déconnecter ? Vous devrez vous reconnecter pour accéder à votre compte.", + "title": "Déconnexion" + }, + "systemConfig": { + "pageDescription": "Ces paramètres sont initialisés via des drapeaux CLI ou des variables d'environnement. Ils sont en lecture seule pour garantir la cohérence de l'environnement.", + "pageTitle": "Configurations au niveau système", + "sections": { + "cors": { + "desc": "Règles d'accès cross-origin", + "title": "CORS" + }, + "logging": { + "desc": "Comportement de sortie des logs", + "title": "Journalisation" + }, + "network": { + "desc": "Accès HTTP et public", + "title": "Réseau" + }, + "performance": { + "desc": "Concurrence et compression", + "title": "Performance" + }, + "security": { + "desc": "Authentification et chiffrement", + "title": "Sécurité" + }, + "smtp": { + "desc": "Paramètres de réception du courrier entrant pour l'archivage en temps réel", + "title": "Serveur SMTP" + }, + "storage": { + "desc": "Chemins de base de données et limites", + "title": "Stockage et Cache" + } + }, + "status": { + "auto": "Auto", + "configured": "Configuré", + "disabled": "Désactivé", + "enabled": "Activé", + "missing": "Manquant", + "notSet": "Non défini" + } + }, + "table": { + "asc": "Asc", + "delete": "Supprimer", + "desc": "Desc", + "edit": "Modifier", + "hide": "Masquer", + "loading": "Chargement...", + "noResults": "Aucun résultat trouvé", + "of": "de", + "page": "Page", + "pagination": { + "first": "Première page", + "fixed_page_size": "{{size}} lignes par page.", + "last": "Dernière page", + "next": "Page suivante", + "page_info": "Page {{page}} sur {{total}}", + "previous": "Page précédente", + "rows_per_page": "Lignes per page", + "selected": "{{selected}} / {{total}} ligne(s) sélectionnée(s)." + }, + "results": "résultats", + "rowsPerPage": "Lignes par page", + "showing": "Affichage", + "to": "à" + }, + "tag": { + "clear_all": "Effacer toutes les étiquettes", + "label": "Étiquettes", + "no_tags_found": "Aucune étiquette trouvée", + "search_placeholder": "Rechercher des étiquettes..." + }, + "time": { + "absolute_range": "Plage de dates absolue", + "apply": "Appliquer", + "before": "Avant", + "clear_filters": "Effacer les filtres de temps", + "days_ago_to_now": "jours jusqu’à aujourd’hui", + "end_date": "Date de fin", + "format": "yyyy-MM-dd", + "historical": "Période historique (avant...)", + "label": "Temps", + "last_day": "Dernier jour", + "last_days": "Derniers {{count}} jours", + "last_months": "Derniers {{count}} mois", + "over_years_ago": "Il y a {{count}} {{unit}}", + "recent_prefix": "Récent :", + "recent_range": "Période récente (depuis...)", + "since": "Depuis", + "start_date": "Date de début", + "year": "an", + "years": "ans" + }, + "users": { + "actions": { + "api_tokens": "Jetons API", + "buttons": { + "add_account": "Ajouter un compte", + "create": "Créer", + "update": "Mettre à jour" + }, + "delete": { + "alert_desc": "L'utilisateur et toutes ses données seront supprimés.", + "alert_title": "Attention : action définitive.", + "button_confirm": "Supprimer l'utilisateur", + "button_deleting": "Suppression...", + "confirm_msg": "Vous supprimez définitivement l'utilisateur {{name}} (ID : {{id}}).", + "input_label": "Saisissez l'ID de l'utilisateur pour confirmer :", + "irreversible": "Cette action est irréversible.", + "placeholder": "Saisissez \"{{id}}\"", + "title": "Supprimer l'utilisateur", + "toast": { + "failed_fallback": "Impossible de supprimer l'utilisateur.", + "failed_title": "Échec de la suppression", + "success_desc": "L'utilisateur \"{{name}}\" a été supprimé.", + "success_title": "Utilisateur supprimé" + } + }, + "dialog": { + "create_title": "Créer un utilisateur", + "edit_title": "Modifier l'utilisateur : {{name}}", + "subtitle": "Configurez l'identité, les accès et les politiques de sécurité." + }, + "fields": { + "assign_role": "Attribuer un rôle", + "burst_interval": "Intervalle de rafale (sec)", + "description": "Description (optionnel)", + "description_hint": "Notes internes (max 256 caractères).", + "description_placeholder": "Notes sur cet utilisateur...", + "email": "Adresse e-mail", + "email_hint": "Contact principal et notifications.", + "global_roles_hint": "Attribuez des permissions système.", + "ip_whitelist": "Liste blanche IP", + "ip_whitelist_hint": "Limiter la connexion à ces IP (une par ligne).", + "password": "Mot de passe", + "password_hint_create": "Mot de passe sécurisé pour la configuration initiale.", + "password_hint_edit": "Saisissez un nouveau mot de passe uniquement si vous souhaitez le changer.", + "password_placeholder_create": "Au moins 8 caractères", + "password_placeholder_edit": "Laisser vide pour conserver l'actuel", + "rate_quota": "Quota de débit", + "select_account": "Choisir un compte", + "username": "Nom d'utilisateur", + "username_hint": "Identifiant unique pour la connexion." + }, + "placeholder": { + "filter": "Rechercher des utilisateurs..." + }, + "schema": { + "account_required": "Veuillez sélectionner un compte", + "description_max": "La description ne peut pas dépasser 256 caractères", + "email_invalid": "Veuillez saisir une adresse e-mail valide", + "email_required": "L'adresse e-mail est requise", + "global_role_required": "Attribuez au moins un rôle global", + "ip_invalid": "Adresse IP invalide détectée", + "password_max": "Le mot de passe ne peut pas dépasser 256 caractères", + "password_min": "Le mot de passe doit contenir au moins 8 caractères", + "password_required": "Le mot de passe est requis", + "role_required": "Veuillez sélectionner un rôle", + "username_max": "Le nom d'utilisateur ne peut pas dépasser 32 caractères", + "username_min": "Le nom d'utilisateur doit contenir au moins 3 caractères", + "username_required": "Le nom d'utilisateur est requis" + }, + "sections": { + "basic": "Identité de base", + "global": "Permissions globales", + "mail_access": "Contrôle d'accès mail", + "mail_access_subtitle": "Définissez les comptes mail gérables par cet utilisateur.", + "policy": "Politiques" + }, + "states": { + "full_access": "Mode accès complet", + "full_access_desc": "Les administrateurs ont un accès inhérent à tous les comptes.", + "no_accounts": "Aucun compte spécifique attribué.", + "security_disabled": "Les politiques de sécurité sont désactivées." + }, + "tabs": { + "general": "Général", + "permissions": "Permissions compte", + "security": "Sécurité & ACL" + }, + "toast": { + "created": "Utilisateur créé", + "updated": "Utilisateur mis à jour" + } + }, + "api_tokens": { + "button": { + "generate": "Générer un nouveau jeton" + }, + "delete": { + "confirm_button": "Supprimer le jeton", + "confirm_label": "Pour confirmer, saisissez {{word}} ci-dessous :", + "confirm_placeholder": "Saisissez \"{{word}}\" pour confirmer", + "deleting": "Suppression...", + "desc": "Vous êtes sur le point de supprimer définitivement ce jeton API", + "irreversible": "Cette action est irréversible. Toutes les applications utilisant ce jeton perdront immédiatement l'accès.", + "prefix": "Préfixe du jeton", + "title": "Supprimer le jeton API", + "warning_desc": "Tous les scripts ou services utilisant ce jeton échoueront. Assurez-vous d'avoir mis à jour vos systèmes.", + "warning_title": "Avertissement" + }, + "empty": { + "description": "Aucun jeton API n'a encore été généré dans le système.", + "title": "Aucun jeton API trouvé" + }, + "table": { + "api_key": "Clé API", + "created": "Créé", + "expired": "Expiré", + "expires_at": "Expire le", + "last_used": "Dernière utilisation", + "name": "Nom", + "never": "Jamais", + "owner": "Propriétaire", + "permanent": "Permanent", + "type": "Type", + "unnamed": "Jeton sans nom", + "web_ui": "Interface Web" + }, + "toast": { + "delete_failed": "Impossible de supprimer le jeton, veuillez réessayer.", + "delete_failed_title": "Échec de la suppression", + "deleted_desc": "Le jeton \"{{name}}\" a été supprimé avec succès.", + "deleted_title": "Jeton API supprimé" + }, + "toolbar": { + "search_placeholder": "Rechercher par nom, propriétaire ou jeton..." + }, + "unnamed": "Jeton sans nom" + }, + "buttons": { + "add": "Ajouter un utilisateur", + "add_new": "Créer un utilisateur" + }, + "columns": { + "actions": "Actions", + "avatar": "Avatar", + "created_at": "Créé le", + "email": "Adresse e-mail", + "id": "ID", + "roles": "Rôles et permissions", + "updated_at": "Mis à jour le", + "username": "Nom d'utilisateur" + }, + "empty": { + "description": "Cliquez sur le bouton ci-dessous pour ajouter votre premier utilisateur.", + "title": "Aucun utilisateur trouvé" + }, + "nav": { + "api_tokens": "Jetons API", + "roles": "Rôles", + "users": "Utilisateurs" + }, + "tokens": { + "dialog": { + "create_title": "Créer un jeton d'accès", + "description": "Cliquez sur enregistrer lorsque vous avez terminé.", + "edit_title": "Modifier le jeton" + }, + "error": { + "fallback": "L'opération a échoué, veuillez réessayer plus tard." + }, + "expire_options": { + "1_day": "1 jour", + "30_days": "30 jours", + "7_days": "7 jours", + "never": "N'expire jamais" + }, + "fields": { + "expire_hint": "Le jeton expirera automatiquement après le délai choisi.", + "expire_label": "Expiration", + "expire_placeholder": "Choisir l'expiration", + "name_hint": "Optionnel · Max 32 caractères", + "name_label": "Nom", + "name_placeholder": "Donnez un nom court à ce jeton" + }, + "schema": { + "expire_int": "Doit être un entier", + "expire_number": "Doit être un nombre", + "expire_positive": "Doit être supérieur à 0", + "name_max": "Max 32 caractères" + }, + "toast": { + "create_failed_title": "Échec de la création", + "create_success_desc": "Le jeton d'accès a été créé avec succès.", + "create_success_title": "Jeton créé", + "update_failed_title": "Échec de la mise à jour", + "update_success_desc": "Le jeton d'accès a été mis à jour avec succès.", + "update_success_title": "Jeton mis à jour" + } + }, + "tokens_action": { + "buttons": { + "add": "Ajouter un jeton" + }, + "delete_dialog": { + "description": "Cette action est irréversible.", + "title": "Supprimer le jeton d'accès ?" + }, + "dialog": { + "description": "Gérer les jetons API pour cet utilisateur.", + "title": "Jetons API" + }, + "empty": { + "description": "Cet utilisateur n'a aucun jeton API pour le moment.", + "title": "Aucun jeton API" + }, + "list": { + "button_delete": "Supprimer le jeton", + "expires_on_brief": "Expire le {{date}}", + "label_created": "Créé le", + "label_expires_at": "Expire le", + "label_last_used": "Dernière utilisation", + "label_token": "Jeton", + "never": "Jamais", + "never_expires": "N'expire jamais", + "status_active": "Actif", + "status_expired": "Expiré", + "unnamed_token": "Jeton sans nom" + } + } + }, + "validation": { + "emailRequired": "L'adresse e-mail est obligatoire", + "folderLimitMustBeAtLeast100": "La limite de dossiers doit être d'au moins 100", + "folderLimitMustBeNumber": "La limite de dossiers doit être un nombre", + "imapHostCannotBeEmpty": "L'hôte IMAP ne peut pas être vide", + "imapHostRequired": "L'hôte IMAP est obligatoire", + "imapPortMustBeLessThan65536": "Le port IMAP doit être inférieur à 65536", + "imapPortMustBePositive": "Le port IMAP doit être un entier positif", + "incrementalSyncMustBeAtLeast10": "L'intervalle de synchronisation incrémentielle doit être d'au moins 10 minutes", + "incrementalSyncMustBeNumber": "L'intervalle de synchronisation incrémentielle doit être un nombre", + "invalidEmail": "Adresse e-mail non valide", + "invalidUrl": "URL non valide", + "passwordMinLength": "Le mot de passe doit contenir au moins {{min}} caractères", + "passwordRequired": "Le mot de passe est obligatoire lorsque la méthode d'authentification est Mot de passe", + "pleaseEnterPassword": "Veuillez entrer votre mot de passe", + "pleaseEnterUsernameOrEmail": "Veuillez entrer votre nom d'utilisateur ou votre courriel", + "required": "Ce champ est obligatoire", + "singleRequestBatchSizeMustBeNumber": "La taille du lot doit être un nombre", + "singleRequestBatchSizeTooLarge": "La taille du lot doit être au plus 200", + "singleRequestBatchSizeTooSmall": "La taille du lot doit être au moins 10" + } } \ No newline at end of file diff --git a/web/src/locales/it.json b/web/src/locales/it.json index 230ea50..04f0495 100644 --- a/web/src/locales/it.json +++ b/web/src/locales/it.json @@ -1,1614 +1,1630 @@ { - "common": { - "submit": "Invia", + "accessTokens": { + "aListOfIpAddressesAllowed": "Un elenco di indirizzi IP autorizzati ad accedere alla risorsa. Inserisci un indirizzo IP per riga. (Opzionale)", + "accountId": "ID Account", + "accounts": "Account", + "aclRulesForAccessTokens": "Le regole ACL per i token di accesso includono la verifica della whitelist IP e l'applicazione del limite di velocità.", + "actions": { + "delete": "Elimina", + "edit": "Modifica", + "openMenu": "Apri Menu" + }, + "addNew": "Aggiungi Nuovo", + "atLeastOneAccountIsRequired": "È richiesto almeno un account.", + "create": "Crea", + "createNewAccessTokenHere": "Crea un nuovo token di accesso qui.", + "created": "Creato", + "createdAt": "Creato Il", + "creating": "Creazione in corso...", + "creationFailed": "Creazione Fallita", + "delete": "Elimina", + "describeThePurposeOfTheAccessToken": "Descrivi lo scopo del token di accesso", + "description": "Gestisci qui i tuoi token di accesso, le loro regole di controllo degli accessi, le whitelist IP e le impostazioni di limitazione della velocità.", + "descriptionMustNotExceed255Characters": "La descrizione non può superare i 255 caratteri.", + "edit": "Modifica", + "editToken": "Modifica Token", + "enterIntervalInSeconds": "Inserisci intervallo in secondi, es. 60", + "enterOneIpAddressPerLine": "Inserisci un indirizzo IP per riga, es.:\n192.168.1.1\n192.168.1.2", + "enterQuota": "Inserisci quota, es. 100", + "expiresAt": "Scade Il", + "filterByEmailAddressOrAccountId": "Filtra per indirizzo email o ID account...", + "interval": "Intervallo", + "intervalMustBeAPositiveInteger": "L'intervallo deve essere un numero intero positivo.", + "invalidIpAddressesFound": "Trovati indirizzi IP non validi. Inserisci indirizzi IPv4 o IPv6 validi.", + "name": "Nome", + "noTokens": "Nessun Token di Accesso", + "noTokensDesc": "Non hai ancora creato token di accesso. Creane uno per utilizzare le funzionalità API.", + "notUsedYet": "Non ancora utilizzato", + "quota": "Quota", + "quotaMustBeAPositiveInteger": "La quota deve essere un numero intero positivo.", + "save": "Salva", + "saveChanges": "Salva Modifiche", + "saving": "Salvataggio in corso...", + "selectAccounts": "Seleziona account", + "selectMultipleAccountsForTheAccessToken": "Seleziona più account per l'ambito di autorizzazione del token di accesso.", + "theListOfAccountsThatCanBeQueried": "L'elenco degli account che possono essere interrogati utilizzando un token di accesso.", + "theMaximumNumberOfRequestsAllowed": "Il numero massimo di richieste consentite entro l'intervallo. (Opzionale)", + "theTimeWindowForTheRateLimit": "La finestra temporale (in secondi) per la limitazione della velocità. (Opzionale)", + "title": "Token di Accesso", + "token": "Token", + "updateFailed": "Aggiornamento Fallito", + "updateOrCreationFailed": "{{action}} fallita, riprova più tardi", + "updateTheAccessTokenHere": "Aggiorna il token di accesso qui.", + "updated": "Aggiornato", + "updating": "Aggiornamento in corso...", + "yourAccessTokenHasBeenSuccessfully": "Il tuo token di accesso è stato {{action}} con successo." + }, + "accounts": { + "accessControl": "Controllo accessi", + "accessTokenCopiedToClipboard": "Token di accesso copiato negli appunti", + "access_control": { + "buttons": { "cancel": "Annulla", - "save": "Salva", - "save_changes": "Salva modifiche", - "delete": "Elimina", - "edit": "Modifica", - "search": "Cerca", - "add": "Aggiungi", - "remove": "Rimuovi", - "create": "Crea", - "update": "Aggiorna", - "confirm": "Conferma", + "save": "Salva Assegnazione" + }, + "description": "Assegna ruoli e utenti autorizzati a {{email}}", + "role_label": "Ruolo di Accesso", + "role_loading": "Caricamento ruoli...", + "role_placeholder": "Seleziona un ruolo", + "title": "Assegnazione Accesso Account", + "toast": { + "failed_title": "Assegnazione Fallita", + "success_desc": "I permessi sono stati assegnati con successo a {{email}}", + "success_title": "Assegnazione Riuscita" + }, + "user_empty": "Nessun utente trovato", + "user_label": "Seleziona Utenti Autorizzati", + "user_search_placeholder": "Cerca per nome utente o email...", + "user_selected_count": "Selezionati: {{count}} utente/i", + "validation": { + "role_required": "Seleziona un ruolo da assegnare", + "user_required": "Seleziona almeno un utente" + } + }, + "accountCreated": "Account Creato", + "accountCreatedDesc": "Il tuo account è stato creato con successo.", + "accountCreationFailed": "Creazione Account Fallita", + "accountDetails": "Dettagli Account", + "accountHasBeenSuccessfully": "L'account è stato {{action}} con successo", + "accountSyncFoldersUpdateFailed": "Aggiornamento Cartelle di Sincronizzazione Account Fallito", + "accountSyncFoldersUpdated": "Cartelle di Sincronizzazione Account Aggiornate", + "accountUpdateFailed": "Aggiornamento Account Fallito", + "accountUpdated": "Account Aggiornato", + "accountUpdatedDesc": "Il tuo account è stato aggiornato con successo.", + "actions": "Azioni", + "addAccount": "Aggiungi Account", + "addConfiguration": "Aggiungi Configurazione", + "addImap": "Aggiungi IMAP", + "addNewEmailAccountHere": "Aggiungi un nuovo account email qui. ", + "addNoSync": "Aggiungi NoSync", + "allMailFolderSelected": "Attenzione: Cartella 'Tutta la Posta' Selezionata", + "allMailFolderSelectedDesc": "La selezione di cartelle con l'attributo 'Tutta la Posta' probabilmente causerà la duplicazione dei messaggi già sincronizzati da cartelle come Posta in arrivo e Posta inviata. Questo può consumare significativamente più spazio di archiviazione.", + "allMailSkipped": "Cartelle predefinite selezionate. 'Tutta la Posta' è stata saltata per evitare duplicati.", + "areYouSureYouWantTo": "Sei sicuro di voler {{action}} questo account?", + "auth": "Autenticazione", + "authType": "tipo_autenticazione", + "autoConfiguring": "Configurazione automatica...", + "beforeRelative": "Scarica solo le vecchie email", + "beforeRelativeValue": "Scarica email da {{value}} {{unit}} fa", + "capabilities": "Capacità", + "chooseAuthMethod": "Scegli il metodo di autenticazione per IMAP.", + "chooseEncryptionMethod": "Scegli il metodo di crittografia per IMAP.", + "chooseMailboxesToDownload": "Scegli le caselle da scaricare per {{email}}. Le nuove caselle verranno scaricate nel prossimo ciclo.", + "clickHere": "clicca qui", + "clickSaveWhenDone": "Clicca su Salva quando hai finito.", + "continue": "Continua", + "createdAt": "Creato Il", + "creationFailed": "Creazione fallita, riprova più tardi", + "dateSelection": "Selezione Data", + "dateSince": "Data Da", + "days": "Giorni", + "delete": "Elimina", + "description": "Gestisci e configura i tuoi account email.", + "detail": "Dettaglio", + "detailsOfTheOAuth2TokensForTheAccount": "Dettagli dei token OAuth2 per l'account.", + "determinesWhetherThisAccountIsActiveNoSync": "Determina se questo account è attivo. Se disattivato, non sarà possibile importare dati.", + "disable": "Disattiva", + "disableAccount": "Disattiva account", + "disabled": "Disabilitato", + "downloadAll": "Scarica tutte le email", + "downloadBatchSize": "Dimensione del lotto di download", + "downloadBatchSizeDescription": "Numero di messaggi recuperati per richiesta IMAP", + "downloadInterval": "Intervallo di download (minuti)", + "downloadIntervalPlaceholder": "Inserisci i minuti", + "downloadScope": "Strategia di download", + "downloadScopeDescription": "Scegli quali email indicizzare e scaricare.", + "duration": "Durata", + "edit": "Modifica", + "email": "Email", + "emailAccountRegistration": "Registrazione Account Email", + "emailAccountRegistrationDesc": "Inserisci il tuo indirizzo email. Nei passaggi successivi configurerai i dettagli IMAP. Useremo questo indirizzo per rilevare automaticamente le impostazioni del server IMAP.", + "emailAddress": "Indirizzo Email", + "emailCannotBeModified": "L'indirizzo email dell'account non può essere modificato durante la modifica.", + "emailPlaceholder": "es. john.doe@esempio.com", + "enable": "Attiva", + "enableAccount": "Attiva account", + "enabled": "Abilitato", + "enabledDescription": "Determina se questo account è attivo. Se disabilitato, i download correlati non verranno eseguiti.", + "encryption": "crittografia", + "enterPassword": "Inserisci la tua password", + "enterValue": "Inserisci un valore", + "everyMinutes": "ogni {{minutes}} minuti", + "field": "Campo", + "fixed": "Fissa", + "folderLimit": "Limite Cartelle", + "folderLimitDescription": "Limita il numero di email da sincronizzare per cartella (minimo 100). Lascia vuoto per nessun limite.", + "folderLimitPlaceholder": "es. 1000", + "folderSync": { + "autoSelectDescendants": "Seleziona automaticamente i discendenti", + "autoSelectParents": "Seleziona automaticamente i genitori", + "batches": "lotti", + "collapseAll": "Comprimi tutto", + "expandAll": "Espandi tutto", + "loadingMailboxFolders": "Caricamento delle cartelle della casella…", + "noData": "Nessun Dato", + "noFolders": "Nessuna cartella da sincronizzare" + }, + "foldersConfiguredForSync": "{{count}} cartella/e configurata/e per la sincronizzazione", + "foldersSelected": "{{count}} cartella/e selezionata/e", + "goBack": "Torna Indietro", + "host": "host", + "id": "ID", + "imap": "IMAP", + "imapAuthMethod": "Metodo di Autenticazione IMAP", + "imapEncryption": "Crittografia IMAP", + "imapHost": "Host IMAP", + "imapHostPlaceholder": "es. imap.esempio.com", + "imapPassword": "Password IMAP", + "imapPort": "Porta IMAP", + "imapPortPlaceholder": "es. 993", + "imapProxy": "Usa un proxy SOCKS5 per le connessioni IMAP.", + "incSync": "Sync Inc.", + "lastSync": "Ultima Sincronizzazione", + "leaveEmptyToKeepExisting": "Lascia vuoto per mantenere la password esistente, o inseriscine una nuova per aggiornarla.", + "leaveEmptyToKeepPassword": "Lascia vuoto per mantenere la password attuale", + "login_name": "Nome di accesso", + "minutes": "minuti", + "months": "Mesi", + "moreAccountTypes": "Altri tipi di account", + "mustBeAtLeast1": "Deve essere almeno 1", + "name": "Nome", + "nameDescription": "Nome utente IMAP. Predefinito l'email, oppure personalizzalo.", + "namePlaceholder": "es. john.doe", + "noAccountConfigurations": "Nessuna Configurazione Account", + "noAccountConfigurationsDesc": "Non hai ancora aggiunto alcuna Configurazione Account. Aggiungine una per iniziare a usare le funzionalità Account.", + "noOAuth2Tokens": "Nessun Token OAuth2", + "none": "Nessuna", + "notAvailable": "n.d.", + "oauth2Tokens": "Token OAuth2", + "openMenu": "Apri Menu", + "optional": "Opzionale", + "owner": "Creatore", + "password": "password", + "port": "porta", + "recent": "recente", + "refreshToken": "Token di Refresh", + "refreshTokenCopiedToClipboard": "Token di refresh copiato negli appunti", + "relative": "Relativa", + "runningState": { + "account": { + "id": "ID account" + }, + "common": { "close": "Chiudi", - "yes": "Sì", - "no": "No", - "ok": "OK", - "loading": "Caricamento...", - "empty": "Vuoto", - "noData": "Nessun dato", - "table": { - "noResults": "Nessun risultato." - }, - "failed": "Fallito", - "notFound": "Non trovato", - "back": "Indietro", - "goBack": "Torna indietro", - "backToHome": "Torna alla Home", - "tryAgain": "Riprova", - "more": "Altro", - "actions": "Azioni", - "filter": "Filtra", - "reset": "Reimposta", - "clear": "Cancella", - "error": "Errore", - "apply": "Applica", - "select": "Seleziona", - "selectAll": "Seleziona tutto", - "deselectAll": "Deseleziona tutto", - "all": "Tutti", - "none": "Nessuno", - "showLess": "Mostra meno", - "showMore": "Mostra altro...", - "project_description": "Bichon è un progetto open-source.", - "view_on_github_button": "Visualizza su GitHub", - "op_failed": "Operazione fallita", - "na": "N/D", - "retry": "Riprova", - "deleting": "Eliminazione..." - }, - "navigation": { - "home": "Home", - "settings": "Impostazioni", - "accounts": "Account", - "dashboard": "Dashboard", - "mailbox": "Posta in arrivo", - "oauth2": "OAuth2", - "accessTokens": "Token di accesso", - "apiDocs": "Documentazione API", - "general": "Generale", - "auth": "Autenticazione", - "other": "Altro", - "users": "Utenti di sistema" - }, - "auth": { - "welcome": "Benvenuto in Bichon", - "username": "Nome utente", - "password": "Password", - "login": "Accedi", - "loginFailed": "Accesso Fallito", - "invalidPassword": "Password non valida. Riprova.", - "somethingWentWrong": "Qualcosa è andato storto", - "sessionExpired": "Sessione scaduta!", - "sessionExpiredDesc": "La tua sessione è terminata per inattività. Esegui nuovamente l'accesso per continuare.", - "logout": "Esci", - "areYouSureYouWantToLogOut": "Sei sicuro di voler uscire?", - "youWillNeedToLogInAgain": "Dovrai accedere nuovamente per accedere al tuo account." - }, - "errors": { - "pageNotFound": "Ops! Pagina non trovata!", - "pageNotFoundDesc": "Sembra che la pagina che stai cercando non esista o sia stata rimossa.", - "somethingWentWrong": "Ops! Qualcosa è andato storto :')", - "somethingWentWrongDesc": "Ci scusiamo per l'inconveniente. Riprova più tardi.", - "internalServerError": "Errore Interno del Server!", - "contentNotModified": "Contenuto non modificato!", - "networkError": "Errore di rete", - "networkErrorDesc": "Impossibile connettersi al server. Verifica la tua connessione a Internet e riprova.", - "forbidden": "Proibito", - "forbiddenTitle": "Accesso Proibito", - "forbiddenDesc": "Non disponi dell'autorizzazione necessaria per visualizzare questa risorsa.", - "unauthorized": "Non autorizzato", - "unauthorizedTitle": "Accesso non Autorizzato", - "unauthorizedDesc": "Accedi con le credenziali corrette per accedere a questa risorsa.", - "maintenance": "Manutenzione", - "maintenanceTitle": "Sito in manutenzione!", - "maintenanceDesc": "Il sito è momentaneamente non disponibile. Torneremo presto online.", - "learnMore": "Scopri di più" - }, - "dashboard": { - "title": "Dashboard", - "mailAccounts": "Account email", - "connected": "Connesso", - "totalEmails": "Email totali", - "syncedLocally": "Sincronizzate localmente", - "totalEmailSize": "Dimensione totale email", - "logicalVolume": "Dimensioni originali", - "localDataFiles": "File di dati locali", - "actualDiskUsage": "Uso effettivo del disco", - "efficiency": "Efficienza", - "saved": "Risparmiato", - "dataStorage": "Archiviazione", - "indexSize": "Dimens. indice", - "metadataSize": "Dimensione metadati", - "tantivyDatabase": "Basato sul motore di ricerca Tantivy", - "dayTrend": "Tendenza a 30 giorni", - "attachments": "Allegati", - "topLists": "Liste Top", - "newEmails": "Nuove email", - "messageDistribution": "Distribuzione messaggi", - "attachmentRatio": "Rapporto allegati", - "attachmentRatioDesc": "Il {{percent}}% delle email ha allegati", - "noEmailsSynced": "Ancora nessuna email sincronizzata", - "withAttachments": "Con Allegati", - "noAttachments": "Senza Allegati", - "top10Senders": "I 10 Mittenti Principali", - "byMessageCount": "Per conteggio messaggi", - "sender": "Mittente", - "count": "Conteggio", - "top10LargestEmails": "Le 10 Email più Grandi", - "byMessageSize": "Per dimensione messaggio", - "subject": "Oggetto", - "size": "Dimensione", - "noSubject": "(Nessun Oggetto)", - "top10Accounts": "I 10 Account Principali", - "emails": "Email", - "account": "Account", - "noRecentActivity": "Nessuna attività recente", - "noSendersData": "Nessun dato sui mittenti", - "noLargeEmails": "Nessuna email di grandi dimensioni", - "noAccountData": "Nessun dato sull'account", - "systemVersion": "Versione del sistema" - }, - "accounts": { - "beforeRelativeValue": "Scarica email da {{value}} {{unit}} fa", - "sinceRelativeValue": "Scarica email degli ultimi", - "downloadBatchSize": "Dimensione del lotto di download", - "downloadBatchSizeDescription": "Numero di messaggi recuperati per richiesta IMAP", - "downloadScopeDescription": "Scegli quali email indicizzare e scaricare.", - "downloadScope": "Strategia di download", - "selectMode": "Seleziona modalità filtro", - "downloadAll": "Scarica tutte le email", - "sinceFixed": "Da una data specifica", - "sinceRelative": "Scarica solo le email recenti", - "beforeRelative": "Scarica solo le vecchie email", - "duration": "Durata", - "unit": "Unità", - "accessControl": "Controllo accessi", - "owner": "Creatore", - "access_control": { - "title": "Assegnazione Accesso Account", - "description": "Assegna ruoli e utenti autorizzati a {{email}}", - "role_label": "Ruolo di Accesso", - "role_placeholder": "Seleziona un ruolo", - "role_loading": "Caricamento ruoli...", - "user_label": "Seleziona Utenti Autorizzati", - "user_search_placeholder": "Cerca per nome utente o email...", - "user_empty": "Nessun utente trovato", - "user_selected_count": "Selezionati: {{count}} utente/i", - "buttons": { - "cancel": "Annulla", - "save": "Salva Assegnazione" - }, - "validation": { - "user_required": "Seleziona almeno un utente", - "role_required": "Seleziona un ruolo da assegnare" - }, - "toast": { - "success_title": "Assegnazione Riuscita", - "success_desc": "I permessi sono stati assegnati con successo a {{email}}", - "failed_title": "Assegnazione Fallita" - } - }, - "title": "Account Email", - "description": "Gestisci e configura i tuoi account email.", - "addImap": "Aggiungi IMAP", - "addNoSync": "Aggiungi NoSync", - "moreAccountTypes": "Altri tipi di account", - "noAccountConfigurations": "Nessuna Configurazione Account", - "noAccountConfigurationsDesc": "Non hai ancora aggiunto alcuna Configurazione Account. Aggiungine una per iniziare a usare le funzionalità Account.", - "addConfiguration": "Aggiungi Configurazione", - "useNoProxy": "Nessun proxy", - "login_name": "Nome di accesso", - "name": "Nome", - "email": "Email", + "folders": "caselle di posta" + }, + "empty": { + "no_active_download": "Nessun download in corso", + "no_errors_current": "Nessun errore nella sessione corrente", + "no_errors_session": "Nessun errore in questa sessione", + "no_global_errors": "Nessun errore globale", + "no_history": "Nessuna cronologia disponibile" + }, + "folders": "caselle di posta", + "latest": "RECENTE", + "loading": { + "fetching_account_state": "Caricamento stato account..." + }, + "message": "Messaggio", + "session": { + "started_at": "Ora di inizio", "status": "Stato", - "type": "Tipo", - "lastSync": "Ultima Sincronizzazione", - "actions": "Azioni", - "edit": "Modifica", - "delete": "Elimina", - "detail": "Dettaglio", - "selectMailboxes": "Scegli caselle", - "oauth2Tokens": "Token OAuth2", - "id": "ID", - "enabled": "Abilitato", - "auth": "Autenticazione", - "incSync": "Sync Inc.", - "state": "Stato", - "createdAt": "Creato Il", - "updatedAt": "Aggiornato Il", - "openMenu": "Apri Menu", - "emailAccountRegistration": "Registrazione Account Email", - "emailAccountRegistrationDesc": "Inserisci il tuo indirizzo email. Nei passaggi successivi configurerai i dettagli IMAP. Useremo questo indirizzo per rilevare automaticamente le impostazioni del server IMAP.", - "emailAddress": "Indirizzo Email", - "emailPlaceholder": "es. john.doe@esempio.com", - "namePlaceholder": "es. john.doe", - "optional": "Opzionale", - "nameDescription": "Nome utente IMAP. Predefinito l'email, oppure personalizzalo.", - "emailCannotBeModified": "L'indirizzo email dell'account non può essere modificato durante la modifica.", - "addAccount": "Aggiungi Account", - "updateAccount": "Aggiorna Account", - "accountUpdated": "Account Aggiornato", - "accountCreated": "Account Creato", - "accountUpdatedDesc": "Il tuo account è stato aggiornato con successo.", - "accountCreatedDesc": "Il tuo account è stato creato con successo.", - "accountUpdateFailed": "Aggiornamento Account Fallito", - "accountCreationFailed": "Creazione Account Fallita", - "updateFailed": "Aggiornamento fallito, riprova più tardi", - "creationFailed": "Creazione fallita, riprova più tardi", - "allMailFolderSelected": "Attenzione: Cartella 'Tutta la Posta' Selezionata", - "accountSyncFoldersUpdated": "Cartelle di Sincronizzazione Account Aggiornate", - "accountSyncFoldersUpdateFailed": "Aggiornamento Cartelle di Sincronizzazione Account Fallito", - "serverConfiguration": "Configurazione Server (IMAP)", - "selectedMailboxes": "Caselle selezionate", - "allMailFolderSelectedDesc": "La selezione di cartelle con l'attributo 'Tutta la Posta' probabilmente causerà la duplicazione dei messaggi già sincronizzati da cartelle come Posta in arrivo e Posta inviata. Questo può consumare significativamente più spazio di archiviazione.", - "allMailSkipped": "Cartelle predefinite selezionate. 'Tutta la Posta' è stata saltata per evitare duplicati.", - "selectAtLeastOneFolder": "Seleziona almeno una cartella", - "chooseMailboxesToDownload": "Scegli le caselle da scaricare per {{email}}. Le nuove caselle verranno scaricate nel prossimo ciclo.", - "accountDetails": "Dettagli Account", - "capabilities": "Capacità", - "folderLimit": "Limite Cartelle", - "everyMinutes": "ogni {{minutes}} minuti", - "foldersConfiguredForSync": "{{count}} cartella/e configurata/e per la sincronizzazione", - "foldersSelected": "{{count}} cartella/e selezionata/e", - "imapHost": "Host IMAP", - "imapHostPlaceholder": "es. imap.esempio.com", - "imapPort": "Porta IMAP", - "imapPortPlaceholder": "es. 993", - "imapEncryption": "Crittografia IMAP", - "selectEncryptionMethod": "Seleziona un metodo di crittografia", - "chooseEncryptionMethod": "Scegli il metodo di crittografia per IMAP.", - "imapAuthMethod": "Metodo di Autenticazione IMAP", - "selectAuthMethod": "Seleziona un metodo di autenticazione", - "chooseAuthMethod": "Scegli il metodo di autenticazione per IMAP.", - "imapPassword": "Password IMAP", - "leaveEmptyToKeepPassword": "Lascia vuoto per mantenere la password attuale", - "enterPassword": "Inserisci la tua password", - "leaveEmptyToKeepExisting": "Lascia vuoto per mantenere la password esistente, o inseriscine una nuova per aggiornarla.", - "useProxy": "Usa Proxy", - "selectProxy": "Seleziona un proxy", - "downloadInterval": "Intervallo di download (minuti)", - "downloadIntervalPlaceholder": "Inserisci i minuti", - "enabledDescription": "Determina se questo account è attivo. Se disabilitato, i download correlati non verranno eseguiti.", - "dateSince": "Data Da", - "none": "Nessuna", - "fixed": "Fissa", - "relative": "Relativa", - "selectDate": "Seleziona una data", - "selectUnit": "Seleziona un'unità", - "days": "Giorni", - "months": "Mesi", - "years": "Anni", - "enterValue": "Inserisci un valore", - "mustBeAtLeast1": "Deve essere almeno 1", - "dateSelection": "Selezione Data", - "since": "da", - "recent": "recente", - "notAvailable": "n.d.", - "host": "host", - "port": "porta", - "encryption": "crittografia", - "authType": "tipo_autenticazione", - "password": "password", - "useProxyField": "usa proxy", - "clickSaveWhenDone": "Clicca su Salva quando hai finito.", - "step": "Passo {{index}}", - "goBack": "Torna Indietro", - "autoConfiguring": "Configurazione automatica...", - "continue": "Continua", - "saveChanges": "Salva Modifiche", - "submit": "Invia", - "field": "Campo", - "value": "Valore", - "refreshToken": "Token di Refresh", - "accessTokenCopiedToClipboard": "Token di accesso copiato negli appunti", - "refreshTokenCopiedToClipboard": "Token di refresh copiato negli appunti", - "noOAuth2Tokens": "Nessun Token OAuth2", - "theAccountHasNotCompletedTheAuthorizationProcess": "L'account non ha completato il processo di autorizzazione. Per favore ", - "clickHere": "clicca qui", - "toAuthorizeTheAccount": " per autorizzare l'account.", - "detailsOfTheOAuth2TokensForTheAccount": "Dettagli dei token OAuth2 per l'account.", - "updateTheEmailAccountHere": "Aggiorna l'account email qui. ", - "addNewEmailAccountHere": "Aggiungi un nuovo account email qui. ", - "thisAccountIsUsedForIdentificationPurposesOnly": "Questo account viene utilizzato solo a scopo di identificazione e non richiede la sincronizzazione con un server email. Aiuta nell'importazione dei dati email.", - "determinesWhetherThisAccountIsActiveNoSync": "Determina se questo account è attivo. Se disattivato, non sarà possibile importare dati.", - "folderSync": { - "noData": "Nessun Dato", - "noFolders": "Nessuna cartella da sincronizzare", - "batches": "lotti", - "autoSelectDescendants": "Seleziona automaticamente i discendenti", - "autoSelectParents": "Seleziona automaticamente i genitori", - "expandAll": "Espandi tutto", - "collapseAll": "Comprimi tutto", - "loadingMailboxFolders": "Caricamento delle cartelle della casella…" - }, - "viewDetails": "visualizza dettagli", - "runningState": { - "message": "Messaggio", - "account": { - "id": "ID account" - }, - "tabs": { - "active_session": "Sessione attiva", - "history": "Cronologia", - "global_errors": "Errori globali", - "folders": "Caselle di posta", - "errors": "Errori" - }, - "loading": { - "fetching_account_state": "Caricamento stato account..." - }, - "empty": { - "no_active_download": "Nessun download in corso", - "no_errors_current": "Nessun errore nella sessione corrente", - "no_errors_session": "Nessun errore in questa sessione", - "no_global_errors": "Nessun errore globale", - "no_history": "Nessuna cronologia disponibile" - }, - "session": { - "status": "Stato", - "trigger": "Trigger", - "started_at": "Ora di inizio" - }, - "common": { - "folders": "caselle di posta", - "close": "Chiudi" - }, - "latest": "RECENTE", - "folders": "caselle di posta" - }, - "steps": { - "complete": "Completato", - "emailAddress": "Indirizzo Email", - "imap": "IMAP", - "syncPreferences": "Preferenze di Sincronizzazione", - "summary": "Riepilogo" - }, - "imapProxy": "Usa un proxy SOCKS5 per le connessioni IMAP.", - "syncStartDateDescription": "Definisce la data di inizio della sincronizzazione – fissa o relativa a ora. Le email precedenti a questa data saranno escluse, {{fixedPart}}.", - "syncAfterDate": "sincronizza i dati successivi a una data impostata", - "syncRecentData": "sposta la data di sincronizzazione nel tempo, sincronizzando solo i dati recenti", - "folderLimitDescription": "Limita il numero di email da sincronizzare per cartella (minimo 100). Lascia vuoto per nessun limite.", - "folderLimitPlaceholder": "es. 1000", - "imap": "IMAP", - "minutes": "minuti", - "accountHasBeenSuccessfully": "L'account è stato {{action}} con successo", - "enableAccount": "Attiva account", - "disableAccount": "Disattiva account", - "areYouSureYouWantTo": "Sei sicuro di voler {{action}} questo account?", - "enable": "Attiva", - "disable": "Disattiva", - "thisWillPreventTheAccountFromBeingUsed": "Questo account non sincronizzerà più i dati dal server IMAP, ma i dati esistenti resteranno accessibili.", - "disabled": "Disabilitato", - "useDangerous": "Accetta qualsiasi certificato TLS", - "useDangerousDescription": "Abilita questa opzione solo se ti connetti a un server IMAP che utilizza un certificato pubblico o auto‑firmato che il tuo sistema potrebbe non riconoscere. Questa impostazione salta la verifica standard del certificato e può esporre la connessione ad attacchi “man‑in‑the‑middle” — attivala solo se comprendi i rischi." + "trigger": "Trigger" + }, + "tabs": { + "active_session": "Sessione attiva", + "errors": "Errori", + "folders": "Caselle di posta", + "global_errors": "Errori globali", + "history": "Cronologia" + } }, - "mailbox": { - "deleteMailboxDialog": { - "title": "Elimina cartella casella postale", - "desc": "Sei sicuro di voler eliminare questa cartella? L'azione non può essere annullata.", - "warningTitle": "Avvertimento", - "warningDesc": "L'eliminazione di questa cartella rimuoverà permanentemente anche tutte le e-mail archiviate e le sottocartelle in essa contenute.", - "confirm": "Elimina permanentemente", - "successTitle": "Eliminazione completata", - "successDesc": "La cartella e il suo contenuto sono stati rimossi con successo.", - "errorTitle": "Eliminazione fallita" - }, - "title": "Posta in arrivo", - "folders": "Cartelle", - "messages": "Messaggi", - "noMessages": "Nessun messaggio", - "selectFolder": "Seleziona una cartella per visualizzare i messaggi", - "deleteDialog": { - "title": "Elimina Email", - "desc": "Sei sicuro di voler eliminare {{countText}}? Questa azione rimuoverà permanentemente l'email/le email selezionate dal database locale. L'email/le email saranno perse per sempre e non potranno essere recuperate.", - "descCountSingle": "questa email", - "descCountMultiple": "queste {{count}} email", - "warningTitle": "Attenzione!", - "warningDesc": "Procedi con cautela.", - "confirm": "Elimina", - "successTitle": "Messaggi eliminati con successo", - "successDesc": "I messaggi sono stati eliminati.", - "errorTitle": "Eliminazione messaggi fallita" - }, - "thread": { - "title": "Thread ({{count}} {{messageLabel}})", - "message": "messaggio", - "messages": "messaggi", - "noSubject": "(Nessun oggetto)", - "invalidDate": "Data non valida", - "empty": "Nessun messaggio in questo thread.", - "loadError": "Caricamento thread fallito", - "loadingMore": "Caricamento in corso...", - "loadMore": "Carica altro" - }, - "bulkActions": { - "ariaLabel": "Azioni di massa per {{count}} {{emailLabel}} selezionate", - "email": "email", - "emails": "email", - "selected": "selezionate", - "clearSelection": "Cancella selezione", - "clearSelectionWithKey": "Cancella selezione ({{key}})", - "delete": "Elimina", - "deleteTooltip": "Elimina email selezionate" - } + "saveChanges": "Salva Modifiche", + "selectAtLeastOneFolder": "Seleziona almeno una cartella", + "selectAuthMethod": "Seleziona un metodo di autenticazione", + "selectDate": "Seleziona una data", + "selectEncryptionMethod": "Seleziona un metodo di crittografia", + "selectMailboxes": "Scegli caselle", + "selectMode": "Seleziona modalità filtro", + "selectProxy": "Seleziona un proxy", + "selectUnit": "Seleziona un'unità", + "selectedMailboxes": "Caselle selezionate", + "serverConfiguration": "Configurazione Server (IMAP)", + "since": "da", + "sinceFixed": "Da una data specifica", + "sinceRelative": "Scarica solo le email recenti", + "sinceRelativeValue": "Scarica email degli ultimi", + "state": "Stato", + "status": "Stato", + "step": "Passo {{index}}", + "steps": { + "complete": "Completato", + "emailAddress": "Indirizzo Email", + "imap": "IMAP", + "summary": "Riepilogo", + "syncPreferences": "Preferenze di Sincronizzazione" }, - "search": { - "size": "Dimensione", - "any": "Qualsiasi", - "tiny": "Molto piccolo (<15 KB)", - "small": "Piccolo (<2 MB)", - "medium": "Medio (2 - 10 MB)", - "large": "Grande (10 - 20 MB)", - "huge": "Enorme (≥20 MB)", - "sort": "Ordina", - "sizeDescription": "La dimensione indica la dimensione totale dell’email, inclusi gli allegati.", - "title": "Cerca", - "searching": "Ricerca in corso, attendere prego...", - "noEmailsFound": "Nessuna email trovata", - "startSearching": "Inizia a inserire una parola chiave, un mittente o usa filtri avanzati.", - "adjustSearch": "Prova ad aggiustare i criteri di ricerca o a cancellare i filtri.", - "tagFilter": "Filtro Tag", - "from": "Da", - "to": "A", - "subject": "Oggetto", - "date": "Data", - "editTag": "Modifica Tag", - "keyword": "Parola chiave", - "sender": "Mittente", - "recipient": "Destinatario", - "hasAttachment": "Ha Allegato", - "yes": "Sì", - "no": "No", - "dateRange": "Intervallo di Date", - "startDate": "Data di Inizio", - "endDate": "Data di Fine", - "advancedFilters": "Filtri Avanzati", - "searchArchivedEmails": "Cerca Email Archiviate", - "fullTextMultiAccount": "Testo completo · Multi-account · Filtri avanzati", - "account": "Account", - "mailbox": "Posta in arrivo", - "selectAccount": "Seleziona account", - "selectMailbox": "Seleziona posta in arrivo", - "noActiveEmailAccount": "Nessun account email attivo.", - "addEmailAccount": "Aggiungi Account Email", - "noMailboxSelectAccount": "Nessuna posta in arrivo. Seleziona prima un account.", - "searchInSubjectBody": "Cerca in oggetto, corpo, allegati...", - "searchingButton": "Ricerca in corso...", - "searchButton": "Cerca", - "advanced": "Avanzato", - "clear": "Cancella", - "since": "Da:", - "before": "Prima:", - "selectDate": "Seleziona una data", - "pleaseSelectAtLeastOne": "Seleziona almeno un criterio di ricerca", - "cc": "CC", - "bcc": "BCC", - "attachmentName": "Nome Allegato", - "messageId": "ID Messaggio", - "minSize": "Dimensione Min", - "maxSize": "Dimensione Max", - "senderRecipients": "Mittente / Destinatari", - "attachmentsSize": "Allegati e Dimensione", - "minimumBytes": "Minimo (Byte)", - "maximumBytes": "Massimo (Byte)", - "originalMessageIdHeader": "Header Message-ID dell'email originale", - "addTags": { - "title": "Modifica Tag", - "none": "Nessun tag aggiunto ancora", - "searchPlaceholder": "Cerca o crea tag...", - "createHint": "Crea nuovo tag: {{tag}}", - "invalidTitle": "Tag Non Valido", - "updatedTitle": "Tag Aggiornati", - "updatedDesc": "I tag sono stati aggiornati con successo", - "updateFailedTitle": "Aggiornamento Fallito", - "tryAgain": "Riprova più tardi", - "selectedCount": "{{count}} tag selezionati", - "cancel": "Annulla", - "save": "Salva", - "saving": "Salvataggio in corso..." - }, - "updateTags": { - "overwriteWarning": "Avviso: questo sovrascriverà tutti i tag esistenti sugli elementi selezionati.", - "title": "Aggiorna tag", - "none": "Nessun tag selezionato", - "searchPlaceholder": "Cerca o crea un nuovo tag...", - "createHint": "Premi Invio per creare un nuovo tag: \"{{tag}}\"", - "selectedCount": "{{count}} tag da applicare", - "cancel": "Annulla", - "invalidTitle": "Tag non valido", - "updatedTitle": "Tag aggiornati", - "updatedDesc": "I tag sono stati aggiornati con successo.", - "updateFailedTitle": "Aggiornamento fallito", - "tryAgain": "Riprova più tardi.", - "actionAdd": "Aggiungi", - "actionRemove": "Rimuovi", - "actionOverwrite": "Sovrascrivi", - "submitAdd": "Aggiungi tag", - "submitRemove": "Rimuovi tag", - "submitOverwrite": "Sovrascrivi tag", - "savingAdd": "Aggiunta...", - "savingRemove": "Rimozione...", - "savingOverwrite": "Sovrascrittura..." - }, - "thread": { - "title": "Thread · {{count}} messaggi", - "error": "Caricamento thread fallito", - "empty": "Nessun messaggio in questo thread", - "invalidDate": "Data non valida", - "noSubject": "(Nessun oggetto)", - "loadingMore": "Caricamento in corso...", - "loadMore": "Carica altro" - }, - "bulkActions": { - "ariaLabel": "{{count}} messaggi selezionati. Barra delle azioni", - "delete": "Elimina", - "deleteDesc": "Elimina messaggi selezionati", - "selected": "{{count}} selezionati", - "clear": "Annulla selezione", - "manageTags": "Gestisci tag" - }, - "delete": { - "title": "Elimina messaggi", - "confirmPrefix": "Sei sicuro di voler eliminare", - "countLabel": "{{count}} messaggi?", - "confirmDetail": "L'azione non può essere annullata.", - "confirmButton": "Elimina", - "warningTitle": "Attenzione", - "warningDesc": "I messaggi saranno rimossi permanentemente.", - "successTitle": "Eliminati", - "successDesc": "I messaggi sono stati eliminati correttamente.", - "errorTitle": "Erroka durante l'eliminazione" - } + "submit": "Invia", + "syncAfterDate": "sincronizza i dati successivi a una data impostata", + "syncRecentData": "sposta la data di sincronizzazione nel tempo, sincronizzando solo i dati recenti", + "syncStartDateDescription": "Definisce la data di inizio della sincronizzazione – fissa o relativa a ora. Le email precedenti a questa data saranno escluse, {{fixedPart}}.", + "theAccountHasNotCompletedTheAuthorizationProcess": "L'account non ha completato il processo di autorizzazione. Per favore ", + "thisAccountIsUsedForIdentificationPurposesOnly": "Questo account viene utilizzato solo a scopo di identificazione e non richiede la sincronizzazione con un server email. Aiuta nell'importazione dei dati email.", + "thisWillPreventTheAccountFromBeingUsed": "Questo account non sincronizzerà più i dati dal server IMAP, ma i dati esistenti resteranno accessibili.", + "title": "Account Email", + "toAuthorizeTheAccount": " per autorizzare l'account.", + "type": "Tipo", + "unit": "Unità", + "updateAccount": "Aggiorna Account", + "updateFailed": "Aggiornamento fallito, riprova più tardi", + "updateTheEmailAccountHere": "Aggiorna l'account email qui. ", + "updatedAt": "Aggiornato Il", + "useDangerous": "Accetta qualsiasi certificato TLS", + "useDangerousDescription": "Abilita questa opzione solo se ti connetti a un server IMAP che utilizza un certificato pubblico o auto‑firmato che il tuo sistema potrebbe non riconoscere. Questa impostazione salta la verifica standard del certificato e può esporre la connessione ad attacchi “man‑in‑the‑middle” — attivala solo se comprendi i rischi.", + "useNoProxy": "Nessun proxy", + "useProxy": "Usa Proxy", + "useProxyField": "usa proxy", + "value": "Valore", + "viewDetails": "visualizza dettagli", + "years": "Anni" + }, + "apiDocs": { + "choosePreferredType": "Scegli il tuo tipo di documentazione API preferito", + "downloadSpecYAML": "Scarica Specifica YAML", + "openAPIExplorer": "OpenAPI Explorer", + "reDoc": "ReDoc", + "scalar": "Scalar", + "swaggerUI": "Swagger UI" + }, + "apiTokens": { + "deleteDialog": { + "cancel": "Annulla", + "confirm": "Elimina", + "deleting": "Eliminazione...", + "description": "Questa azione non può essere annullata. Qualsiasi applicazione che utilizzi questo token perderà immediatamente l'accesso.", + "title": "Eliminare il token di accesso?" }, - "mail": { - "emailViewer": "Visualizzatore Email", - "noMessageSelected": "Nessun messaggio selezionato", - "account": "Account", - "from": "Da", - "to": "A", - "subject": "Oggetto", - "date": "Data", - "tags": "Tag", - "noTagsYet": "Ancora nessun tag", - "id": "ID", - "cc": "CC", - "bcc": "BCC", - "attachments": "Allegati", - "download": "Scarica", - "delete": "Elimina", - "viewThread": "Visualizza Thread", - "downloadStarted": "Download avviato", - "downloadComplete": "Download completato", - "downloadFailed": "Download fallito", - "failedToDownloadFile": "Download del file fallito", - "failedToLoadEmail": "Caricamento messaggio email fallito.", - "isBeingDownloaded": "{{id}} in corso di download", - "downloaded": "{{id}} scaricato", - "showLess": "mostra meno", - "showMore": "mostra altro...", - "onlyNonInlineAttachments": "Solo gli allegati non in linea sono mostrati qui.", - "noAttachments": "Nessun allegato" + "dialog": { + "createTitle": "Crea token di accesso", + "description": "Clicca su salva quando hai finito.", + "editTitle": "Modifica token di accesso", + "save": "Salva", + "saveChanges": "Salva modifiche" }, - "oauth2": { - "title": "OAuth2", - "addConfiguration": "Aggiungi Configurazione", - "id": "ID", - "provider": "Provider", - "clientId": "ID Cliente", - "clientSecret": "Segreto del Cliente", - "redirectUri": "URI di Reindirizzamento", - "scopes": "Scope", - "status": "Stato", - "enabled": "Abilitato", - "disabled": "Disabilitato", - "edit": "Modifica", - "delete": "Elimina", - "enable": "Abilita", - "disable": "Disabilita", - "noConfigurations": "Nessuna Configurazione OAuth2", - "noConfigurationsDesc": "Non hai ancora aggiunto alcuna configurazione OAuth2. Aggiungine una per iniziare a usare le funzionalità OAuth2.", - "description": "Gestisce automaticamente il recupero, l'archiviazione e l'aggiornamento dei token di accesso, garantendo un'esperienza di autenticazione fluida e sempre pronta.", - "addNew": "Aggiungi Nuovo", - "updateHere": "Aggiorna qui.", - "createNewHere": "Creane uno nuovo qui.", - "clickSaveWhenDone": "Clicca su Salva quando hai finito.", - "quickPresets": "Preset veloci:", - "gmail": "Gmail", - "outlook": "Outlook", - "whenDisabled": "Se disabilitato: - I nuovi flussi di autorizzazione saranno immediatamente rifiutati - I token di accesso e di refresh esistenti saranno revocati entro 1 minuto - Gli utenti dovranno riautorizzare quando viene riabilitato", - "clientIdLabel": "ID Cliente:", - "enterYourClientId": "Inserisci il tuo ID cliente", - "theUniqueIdentifierForYourApplication": "L'identificatore unico per la tua applicazione, fornito dal provider OAuth.", - "clientSecretLabel": "Segreto del Cliente:", - "leaveEmptyToKeepExistingSecret": "Lascia vuoto per mantenere il segreto esistente", - "enterYourClientSecret": "Inserisci il tuo segreto del cliente", - "leaveEmptyToKeepTheExistingSecret": "Lascia vuoto per mantenere il segreto esistente, inserisci un nuovo valore solo per modificarlo.", - "aSecretKeyProvidedByTheOAuthProvider": "Una chiave segreta fornita dal provider OAuth per autenticare la tua applicazione.", - "authUrlLabel": "URL di Autorizzazione:", - "enterTheAuthorizationUrl": "Inserisci l'URL di autorizzazione", - "theUrlWhereUsersWillBeRedirected": "L'URL a cui gli utenti verranno reindirizzati per autorizzare la tua applicazione.", - "tokenUrlLabel": "URL del Token:", - "enterTheTokenUrl": "Inserisci l'URL del token", - "theUrlUsedToExchange": "L'URL utilizzato per scambiare il codice di autorizzazione con un token di accesso.", - "redirectUrlLabel": "URI di Reindirizzamento:", - "enterYourRedirectUrl": "Inserisci il tuo URI di reindirizzamento", - "theRedirectUrlAfterAuthorization": "L'URI di reindirizzamento dopo l'autorizzazione. Deve corrispondere all'URL registrato presso il provider OAuth. Usa il formato http://[host]:[porta]/oauth2/callback (o https://), dove [host] e [porta] corrispondono alla tua implementazione RustMailer. Il percorso /oauth2/callback è fisso.", - "scope": "Scope:", - "enterTheScopeHere": "Inserisci lo scope qui.", - "addScope": "Aggiungi Scope", - "key": "Chiave:", - "enterTheKeyHere": "Inserisci la chiave qui.", - "value": "Valore:", - "enterTheValueHere": "Inserisci il valore qui.", - "addExtraParams": "Aggiungi Parametri Extra", - "useProxyOptional": "Usa Proxy (opzionale):", - "selectAProxy": "Seleziona un proxy", - "noProxyAvailable": "Nessun proxy disponibile", - "useSocks5ProxyForOAuthRequests": "Usa il proxy SOCKS5 per le richieste OAuth quando l'accesso diretto è bloccato.", - "descriptionLabel": "Descrizione:", - "describeThePurposeOfTheOauth2Application": "Descrivi lo scopo dell'applicazione OAuth2", - "optional": "Opzionale", - "saving": "Salvataggio in corso...", - "creating": "Creazione in corso...", - "saveChanges": "Salva Modifiche", - "save": "Salva", - "updated": "Aggiornato", - "created": "Creato", - "yourOAuth2ApplicationHasBeenSuccessfully": "La tua applicazione OAuth2 è stata {{action}} con successo.", - "updateFailed": "Aggiornamento Fallito", - "creationFailed": "Creazione Fallita", - "updateOrCreationFailed": "{{action}} fallita, riprova più tardi", - "clientSecretIsRequired": "Il Segreto del Cliente è obbligatorio", - "clientSecretCannotBeEmpty": "Il Segreto del Cliente non può essere vuoto", - "keyIsRequired": "La Chiave è obbligatoria", - "keyCannotBeEmpty": "La Chiave non può essere vuota", - "valueIsRequired": "Il Valore è obbligatorio", - "valueCannotBeEmpty": "Il Valore non può essere vuoto", - "descriptionMustNotExceed255Characters": "La descrizione non può superare i 255 caratteri.", - "clientIdIsRequired": "L'ID Cliente è obbligatorio", - "clientIdCannotBeEmpty": "L'ID Cliente non può essere vuoto", - "authorizationUrlIsRequired": "L'URL di Autorizzazione è obbligatorio", - "authorizationUrlCannotBeEmpty": "L'URL di Autorizzazione non può essere vuoto", - "invalidAuthorizationUrlFormat": "Formato URL di Autorizzazione non valido", - "tokenUrlIsRequired": "L'URL del Token è obbligatorio", - "tokenUrlCannotBeEmpty": "L'URL del Token non può essere vuoto", - "invalidTokenUrlFormat": "Formato URL del Token non valido", - "redirectUriIsRequired": "L'URI di Reindirizzamento è obbligatorio", - "redirectUriCannotBeEmpty": "L'URI di Reindirizzamento non può essere vuoto", - "invalidRedirectUriFormat": "Formato URI di Reindirizzamento non valido", - "authorizeEmailAccount": "Autorizza Account Email", - "authorizeAnEmailAccountToStartTheOAuth2AuthorizationProcess": "Autorizza un account email per iniziare il processo di autorizzazione OAuth2.", - "loadingAccounts": "Caricamento account...", - "selectAnAccount": "Seleziona un account", - "noEmailAccountsRegistered": "Nessun account email registrato. Per favore, creane uno.", - "pleaseCreateOne": "Per favore, creane uno.", - "createAccount": "Crea Account", - "authorize": "Autorizza", - "getAuthorizeUrlFailed": "Recupero URL di Autorizzazione Fallito", - "getAuthorizeUrlFailedDesc": "Recupero URL di autorizzazione fallito, riprova più tardi", - "oauth2ClientUpdated": "Client OAuth2 Aggiornato", - "oauth2ClientHasBeenSuccessfully": "Il client OAuth2 è stato {{action}} con successo.", - "statusUpdateFailed": "Aggiornamento stato fallito, riprova più tardi", - "disableOAuth2Client": "Disabilita Client OAuth2", - "enableOAuth2Client": "Abilita Client OAuth2", - "areYouSureYouWantTo": "Sei sicuro di voler {{action}} questo client OAuth2?", - "thisWillPreventTheOAuth2ClientFromBeingUsed": "Questo impedirà l'utilizzo del client OAuth2.", - "deleteToken": "Elimina Token", - "areYouSureYouWantToDelete": "Sei sicuro di voler eliminare", - "thisActionWillPermanentlyRemoveTheOauth2Record": "Questa azione rimuoverà permanentemente il record OAuth2 dal sistema. Questo non può essere annullato.", - "enterIdToConfirmDeletion": "Inserisci l'ID per confermare l'eliminazione.", - "warning": "Attenzione!", - "pleaseBeCareful": "Fai attenzione, questa operazione non può essere annullata.", - "deleteSuccess": "Eliminazione Riuscita", - "yourOAuth2ApplicationHasBeenSuccessfullyDeleted": "La tua applicazione OAuth2 è stata eliminata con successo.", - "oauth2DeleteFailed": "Eliminazione OAuth2 Fallita", - "deleteFailed": "Eliminazione fallita, riprova più tardi", - "actions": { - "openMenu": "Apri Menu", - "edit": "Modifica", - "authorize": "Autorizza", - "delete": "Elimina" - }, - "authFailed": "Autenticazione OAuth2 Fallita", - "error": "Errore", - "unknownError": "Si è verificato un errore sconosciuto.", - "tryAgain": "Riprova", - "goHome": "Vai alla Home", - "authSuccess": "Autenticazione OAuth2 Riuscita", - "success": "Successo", - "successMessage": "Il tuo account email è stato autenticato con successo tramite OAuth2. Il Token di Accesso è stato salvato dal sistema e verrà aggiornato automaticamente quando necessario.", - "goToAccounts": "Vai ad Account", - "authAtatus": "Stato di Autenticazione OAuth2", - "information": "Informazioni", - "noStatus": "Questa pagina mostra il risultato della tua autenticazione OAuth2. Attualmente non è disponibile alcuno stato specifico. Riprova se necessario.", - "backToLogin": "Torna al Login" + "form": { + "1day": "1 giorno", + "30days": "30 giorni", + "7days": "7 giorni", + "errorInt": "Deve essere un intero", + "errorMax": "Massimo 32 caratteri", + "errorNumber": "Deve essere un numero", + "errorPositive": "Deve essere maggiore di 0", + "expirationDescription": "I token scadranno automaticamente dopo il tempo selezionato.", + "expirationLabel": "Scadenza", + "expirationPlaceholder": "Seleziona scadenza", + "nameDescription": "Opzionale · Max 32 caratteri", + "nameLabel": "Nome", + "namePlaceholder": "Dai un nome breve a questo token", + "never": "Mai" }, - "accessTokens": { - "title": "Token di Accesso", - "name": "Nome", - "accounts": "Account", - "token": "Token", - "createdAt": "Creato Il", - "expiresAt": "Scade Il", - "edit": "Modifica", - "delete": "Elimina", - "create": "Crea", - "noTokens": "Nessun Token di Accesso", - "noTokensDesc": "Non hai ancora creato token di accesso. Creane uno per utilizzare le funzionalità API.", - "description": "Gestisci qui i tuoi token di accesso, le loro regole di controllo degli accessi, le whitelist IP e le impostazioni di limitazione della velocità.", - "editToken": "Modifica Token", - "addNew": "Aggiungi Nuovo", - "updateTheAccessTokenHere": "Aggiorna il token di accesso qui.", - "createNewAccessTokenHere": "Crea un nuovo token di accesso qui.", - "selectAccounts": "Seleziona account", - "selectMultipleAccountsForTheAccessToken": "Seleziona più account per l'ambito di autorizzazione del token di accesso.", - "enterOneIpAddressPerLine": "Inserisci un indirizzo IP per riga, es.:\n192.168.1.1\n192.168.1.2", - "aListOfIpAddressesAllowed": "Un elenco di indirizzi IP autorizzati ad accedere alla risorsa. Inserisci un indirizzo IP per riga. (Opzionale)", - "enterQuota": "Inserisci quota, es. 100", - "theMaximumNumberOfRequestsAllowed": "Il numero massimo di richieste consentite entro l'intervallo. (Opzionale)", - "enterIntervalInSeconds": "Inserisci intervallo in secondi, es. 60", - "theTimeWindowForTheRateLimit": "La finestra temporale (in secondi) per la limitazione della velocità. (Opzionale)", - "describeThePurposeOfTheAccessToken": "Descrivi lo scopo del token di accesso", - "updating": "Aggiornamento in corso...", - "saving": "Salvataggio in corso...", - "creating": "Creazione in corso...", - "saveChanges": "Salva Modifiche", - "save": "Salva", - "updated": "Aggiornato", - "created": "Creato", - "yourAccessTokenHasBeenSuccessfully": "Il tuo token di accesso è stato {{action}} con successo.", - "updateFailed": "Aggiornamento Fallito", - "creationFailed": "Creazione Fallita", - "updateOrCreationFailed": "{{action}} fallita, riprova più tardi", - "quotaMustBeAPositiveInteger": "La quota deve essere un numero intero positivo.", - "intervalMustBeAPositiveInteger": "L'intervallo deve essere un numero intero positivo.", - "invalidIpAddressesFound": "Trovati indirizzi IP non validi. Inserisci indirizzi IPv4 o IPv6 validi.", - "atLeastOneAccountIsRequired": "È richiesto almeno un account.", - "descriptionMustNotExceed255Characters": "La descrizione non può superare i 255 caratteri.", - "notUsedYet": "Non ancora utilizzato", - "theListOfAccountsThatCanBeQueried": "L'elenco degli account che possono essere interrogati utilizzando un token di accesso.", - "accountId": "ID Account", - "filterByEmailAddressOrAccountId": "Filtra per indirizzo email o ID account...", - "aclRulesForAccessTokens": "Le regole ACL per i token di accesso includono la verifica della whitelist IP e l'applicazione del limite di velocità.", - "actions": { - "openMenu": "Apri Menu", - "edit": "Modifica", - "delete": "Elimina" - }, - "quota": "Quota", - "interval": "Intervallo" + "list": { + "createdLabel": "Creato il", + "deleteBtn": "Elimina token", + "expiresOnLabel": "Scade il", + "expiresOnShort": "Scade il {{date}}", + "lastUsedLabel": "Ultimo utilizzo", + "neverExpires": "Mai", + "neverLabel": "Mai", + "neverUsed": "Mai", + "statusActive": "Attivo", + "statusExpired": "Scaduto", + "tokenLabel": "Token", + "unnamedToken": "Token senza nome" }, - "settings": { - "appearance": { - "title": "Aspetto", - "field": { - "language": "Lingua dell'interfaccia", - "theme": "Tema dell'interfaccia" - }, - "description": { - "language": "Seleziona la lingua per l'interfaccia web.", - "theme": "Scegli tra la modalità chiara o scura." - }, - "placeholder": { - "select_language": "Seleziona lingua" - }, - "command": { - "search": "Cerca lingua...", - "no_results": "Nessuna lingua trovata." - }, - "theme": { - "light": "Chiaro", - "dark": "Scuro" - }, - "button": { - "update": "Aggiorna preferenze" - }, - "validation": { - "language": { - "required": "Seleziona una lingua." - }, - "theme": { - "required": "Seleziona un tema." - } - } - }, - "title": "Impostazioni", - "general": "Generale", - "proxy": "Proxy", - "name": "Nome", - "host": "Host", - "port": "Porta", - "username": "Nome utente", - "password": "Password", - "type": "Tipo", - "actions": "Azioni", - "edit": "Modifica", - "delete": "Elimina", - "add": "Aggiungi", - "noProxies": "Nessun Proxy", - "noProxiesDesc": "Non hai ancora aggiunto alcuna configurazione proxy. Aggiungine una per utilizzare le funzionalità proxy.", - "root": "Root", - "rootTitle": "Root", - "rootDesc": "Gestisci le credenziali di accesso root, inclusi token e password.", - "rootAccessManagement": "Gestione Accesso Root", - "manageRootTokenAndPassword": "Gestisci in modo sicuro il token e la password root.", - "resetRootToken": "Ripristina Token Root", - "generateNewToken": "Genera un nuovo token, quello vecchio scadrà immediatamente.", - "reset": "Ripristina", - "resetRootPassword": "Ripristina Password Root", - "changePasswordForFutureLogins": "Cambia la password per gli accessi futuri.", - "youAreAboutToResetTheRootToken": "Stai per ripristinare il token root. Questa azione non può essere annullata.", - "confirmReset": "Conferma Ripristino", - "youAreAboutToResetTheRootPassword": "Stai per ripristinare la password root. Assicurati di salvarla in modo sicuro.", - "enterNewRootPassword": "Inserisci la nuova password root", - "theRootTokenHasBeenReset": "Il token root è stato ripristinato", - "yourLoginInformationHasBeenUpdated": "Le tue informazioni di accesso sono state aggiornate. Non è necessario eseguire nuovamente l'accesso.", - "invalidPassword": "Password non valida", - "rootPasswordMustBeAtLeast6Characters": "La password root deve essere lunga almeno 6 caratteri.", - "theRootPasswordHasBeenReset": "La password root è stata ripristinata", - "useNewPasswordForNextLogin": "Usa la nuova password per il prossimo accesso.", - "failedToCopyText": "Copia del testo fallita", - "filterProxy": "Filtra Proxy...", - "filterOauth2": "Filtra OAuth2...", - "filterAccount": "Filtra Account...", - "filterAccessToken": "Filtra Token di Accesso...", - "selectAll": "Seleziona Tutto", - "theme": "Tema", - "id": "Id", - "url": "Url", - "createdAt": "Creato Il", - "updatedAt": "Aggiornato Il", - "enabled": "Abilitato", - "useProxy": "Usa Proxy", - "authUrl": "URL di Autorizzazione", - "tokenUrl": "URL del Token", - "description": "Descrizione", - "token": "Token", - "accounts": "Account", - "acl": "Acl", - "lastAccess": "Ultimo Accesso", - "enterProxyIdToConfirmDeletion": "Inserisci l'ID Proxy per confermare l'eliminazione.", - "updateTheProxyHere": "Aggiorna il Proxy qui. ", - "addNewProxyHere": "Aggiungi un nuovo Proxy qui. ", - "pleaseUseAnIpAddressForBetterReliability": "Utilizza un indirizzo IP (es. 127.0.0.1) anziché un hostname o dominio per una migliore affidabilità.", - "adding": "Aggiunta in corso...", - "yourProxyHasBeenSuccessfully": "Il tuo Proxy è stato {{action}} con successo.", - "proxyUpdateOrAddFailed": "{{action}} fallita, riprova più tardi", - "sidebar": { - "profile": "Profilo", - "apiTokens": "Token API", - "proxy": "Proxy di rete", - "configurations": "Configurazioni di sistema" - }, - "profile": { - "loadError": "Impossibile caricare le informazioni dell’utente.", - "uploadTitle": "Carica avatar", - "maxSize": "Fino a {{size}}", - "avatarAlt": "Avatar", - "removeAvatar": "Rimuovi avatar", - "uploadError": "Errore(i) durante il caricamento del file", - "field": { - "username": "Nome utente", - "email": "Email", - "password": "Password" - }, - "placeholder": { - "password_keep": "Lascia vuoto per mantenere la password attuale" - }, - "button": { - "update_profile": "Aggiorna profilo", - "permissions": "Permessi", - "view_global_permissions": "Visualizza permessi globali" - }, - "section": { - "roles": "Ruoli", - "accounts": "{{count}} account collegati" - }, - "account": { - "id": "ID account: {{id}}" - }, - "toast": { - "updated": "Profilo aggiornato correttamente", - "update_failed": "Aggiornamento del profilo non riuscito" - }, - "validation": { - "username": { - "required": "Il nome utente è obbligatorio", - "min": "Il nome utente deve contenere almeno 5 caratteri", - "max": "Il nome utente deve contenere al massimo 32 caratteri" - }, - "email": { - "required": "L’email è obbligatoria", - "invalid": "Inserisci un indirizzo email valido" - }, - "password": { - "min": "La password deve contenere almeno 8 caratteri", - "max": "La password deve contenere al massimo 256 caratteri" - } - } - } + "notifications": { + "close": "Chiudi", + "copied": "Copiato negli appunti", + "createFailed": "Creazione fallita", + "createSuccess": "Token creato", + "createSuccessDesc": "Il token è stato creato con successo.", + "deleteFailed": "Errore eliminazione", + "deleteSuccess": "Token eliminato", + "genericError": "Operazione fallita. Riprova.", + "tryAgain": "Riprova", + "updateFailed": "Aggiornamento fallito", + "updateSuccess": "Token aggiornato", + "updateSuccessDesc": "Il token è stato aggiornato con successo." }, - "apiDocs": { - "choosePreferredType": "Scegli il tuo tipo di documentazione API preferito", - "swaggerUI": "Swagger UI", - "reDoc": "ReDoc", - "openAPIExplorer": "OpenAPI Explorer", - "scalar": "Scalar", - "downloadSpecYAML": "Scarica Specifica YAML" + "page": { + "addBtn": "Aggiungi token", + "emptyDescription": "Non hai ancora creato alcun token API. Clicca sotto per crearne uno.", + "emptyTitle": "Nessun token API", + "loadError": "Errore nel caricamento dei token API." + } + }, + "attachment": { + "all_fields_desc": "Corrisponde al nome dell'allegato, all'oggetto e al mittente", + "date": "Data", + "name": "Nome file", + "search_input_placeholder": "Cerca allegati (usa \" \" per la ricerca di frasi)", + "sender": "Mittente", + "sender_with_count": "Mittente ({{count}})", + "size": "Dimensione file", + "source": "Origine", + "subject": "Oggetto" + }, + "auth": { + "areYouSureYouWantToLogOut": "Sei sicuro di voler uscire?", + "invalidPassword": "Password non valida. Riprova.", + "login": "Accedi", + "loginFailed": "Accesso Fallito", + "logout": "Esci", + "password": "Password", + "sessionExpired": "Sessione scaduta!", + "sessionExpiredDesc": "La tua sessione è terminata per inattività. Esegui nuovamente l'accesso per continuare.", + "somethingWentWrong": "Qualcosa è andato storto", + "username": "Nome utente", + "welcome": "Benvenuto in Bichon", + "youWillNeedToLogInAgain": "Dovrai accedere nuovamente per accedere al tuo account." + }, + "command": { + "dark": "Scuro", + "light": "Chiaro", + "noResultsFound": "Nessun risultato trovato.", + "theme": "Tema", + "typeCommandOrSearch": "Digita un comando o cerca..." + }, + "common": { + "actions": "Azioni", + "add": "Aggiungi", + "all": "Tutti", + "apply": "Applica", + "back": "Indietro", + "backToHome": "Torna alla Home", + "cancel": "Annulla", + "clear": "Cancella", + "close": "Chiudi", + "confirm": "Conferma", + "create": "Crea", + "delete": "Elimina", + "deleting": "Eliminazione...", + "deselectAll": "Deseleziona tutto", + "edit": "Modifica", + "empty": "Vuoto", + "error": "Errore", + "failed": "Fallito", + "filter": "Filtra", + "goBack": "Torna indietro", + "loading": "Caricamento...", + "more": "Altro", + "na": "N/D", + "no": "No", + "noData": "Nessun dato", + "none": "Nessuno", + "notFound": "Non trovato", + "ok": "OK", + "op_failed": "Operazione fallita", + "project_description": "Bichon è un progetto open-source.", + "remove": "Rimuovi", + "reset": "Reimposta", + "retry": "Riprova", + "save": "Salva", + "save_changes": "Salva modifiche", + "search": "Cerca", + "select": "Seleziona", + "selectAll": "Seleziona tutto", + "showLess": "Mostra meno", + "showMore": "Mostra altro...", + "submit": "Invia", + "table": { + "noResults": "Nessun risultato." }, - "dialogs": { - "confirmDelete": "Conferma Eliminazione", - "confirmDeleteDesc": "Sei sicuro di voler eliminare questo elemento? Questa azione non può essere annullata.", - "deleteSuccess": "Eliminato con successo", - "deleteFailed": "Eliminazione fallita", - "saveSuccess": "Salvato con successo", - "saveFailed": "Salvataggio fallito", - "createSuccess": "Creato con successo", - "createFailed": "Creazione fallita", - "updateSuccess": "Aggiornato con successo", - "updateFailed": "Aggiornamento fallito", - "continue": "Continua", - "deleting": "Eliminazione in corso...", - "accountDeleted": "Account Eliminato", - "accountDeletedDesc": "Il tuo account è stato eliminato con successo.", - "accountDeleteFailed": "Eliminazione account fallita", - "deleteAccountPermanently": "Elimina Account Permanentemente", - "youAreDeleting": "Stai eliminando {{email}}. Questo rimuoverà permanentemente:", - "accountCredentials": "Credenziali e impostazioni dell'account", - "localCachedMetadata": "Metadati e stato di sincronizzazione memorizzati nella cache locale", - "imapSyncData": "Dati di sincronizzazione IMAP", - "oauthTokens": "Token OAuth e credenziali API", - "typeEmailToConfirm": "Digita l'indirizzo email dell'account per confermare:", - "typeToConfirm": "Digita \"{{email}}\" per confermare", - "cannotBeUndone": "Questa azione non può essere annullata!", - "allResourcesErased": "Tutte le risorse correlate verranno cancellate permanentemente.", - "permanentlyDeleteAccount": "Elimina Account Permanentemente" + "tryAgain": "Riprova", + "update": "Aggiorna", + "view_on_github_button": "Visualizza su GitHub", + "yes": "Sì" + }, + "dashboard": { + "account": "Account", + "actualDiskUsage": "Uso effettivo del disco", + "attachmentRatio": "Rapporto allegati", + "attachmentRatioDesc": "Il {{percent}}% delle email ha allegati", + "attachments": "Allegati", + "byMessageCount": "Per conteggio messaggi", + "byMessageSize": "Per dimensione messaggio", + "connected": "Connesso", + "count": "Conteggio", + "dataStorage": "Archiviazione", + "dayTrend": "Tendenza a 30 giorni", + "efficiency": "Efficienza", + "emails": "Email", + "indexSize": "Dimens. indice", + "localDataFiles": "File di dati locali", + "logicalVolume": "Dimensioni originali", + "mailAccounts": "Account email", + "messageDistribution": "Distribuzione messaggi", + "metadataSize": "Dimensione metadati", + "newEmails": "Nuove email", + "noAccountData": "Nessun dato sull'account", + "noAttachments": "Senza Allegati", + "noEmailsSynced": "Ancora nessuna email sincronizzata", + "noLargeEmails": "Nessuna email di grandi dimensioni", + "noRecentActivity": "Nessuna attività recente", + "noSendersData": "Nessun dato sui mittenti", + "noSubject": "(Nessun Oggetto)", + "saved": "Risparmiato", + "sender": "Mittente", + "size": "Dimensione", + "subject": "Oggetto", + "syncedLocally": "Sincronizzate localmente", + "systemVersion": "Versione del sistema", + "tantivyDatabase": "Basato sul motore di ricerca Tantivy", + "title": "Dashboard", + "top10Accounts": "I 10 Account Principali", + "top10LargestEmails": "Le 10 Email più Grandi", + "top10Senders": "I 10 Mittenti Principali", + "topLists": "Liste Top", + "totalEmailSize": "Dimensione totale email", + "totalEmails": "Email totali", + "withAttachments": "Con Allegati" + }, + "dialogs": { + "accountCredentials": "Credenziali e impostazioni dell'account", + "accountDeleteFailed": "Eliminazione account fallita", + "accountDeleted": "Account Eliminato", + "accountDeletedDesc": "Il tuo account è stato eliminato con successo.", + "allResourcesErased": "Tutte le risorse correlate verranno cancellate permanentemente.", + "cannotBeUndone": "Questa azione non può essere annullata!", + "confirmDelete": "Conferma Eliminazione", + "confirmDeleteDesc": "Sei sicuro di voler eliminare questo elemento? Questa azione non può essere annullata.", + "continue": "Continua", + "createFailed": "Creazione fallita", + "createSuccess": "Creato con successo", + "deleteAccountPermanently": "Elimina Account Permanentemente", + "deleteFailed": "Eliminazione fallita", + "deleteSuccess": "Eliminato con successo", + "deleting": "Eliminazione in corso...", + "imapSyncData": "Dati di sincronizzazione IMAP", + "localCachedMetadata": "Metadati e stato di sincronizzazione memorizzati nella cache locale", + "oauthTokens": "Token OAuth e credenziali API", + "permanentlyDeleteAccount": "Elimina Account Permanentemente", + "saveFailed": "Salvataggio fallito", + "saveSuccess": "Salvato con successo", + "typeEmailToConfirm": "Digita l'indirizzo email dell'account per confermare:", + "typeToConfirm": "Digita \"{{email}}\" per confermare", + "updateFailed": "Aggiornamento fallito", + "updateSuccess": "Aggiornato con successo", + "youAreDeleting": "Stai eliminando {{email}}. Questo rimuoverà permanentemente:" + }, + "errors": { + "contentNotModified": "Contenuto non modificato!", + "forbidden": "Proibito", + "forbiddenDesc": "Non disponi dell'autorizzazione necessaria per visualizzare questa risorsa.", + "forbiddenTitle": "Accesso Proibito", + "internalServerError": "Errore Interno del Server!", + "learnMore": "Scopri di più", + "maintenance": "Manutenzione", + "maintenanceDesc": "Il sito è momentaneamente non disponibile. Torneremo presto online.", + "maintenanceTitle": "Sito in manutenzione!", + "networkError": "Errore di rete", + "networkErrorDesc": "Impossibile connettersi al server. Verifica la tua connessione a Internet e riprova.", + "pageNotFound": "Ops! Pagina non trovata!", + "pageNotFoundDesc": "Sembra che la pagina che stai cercando non esista o sia stata rimossa.", + "somethingWentWrong": "Ops! Qualcosa è andato storto :')", + "somethingWentWrongDesc": "Ci scusiamo per l'inconveniente. Riprova più tardi.", + "unauthorized": "Non autorizzato", + "unauthorizedDesc": "Accedi con le credenziali corrette per accedere a questa risorsa.", + "unauthorizedTitle": "Accesso non Autorizzato" + }, + "mail": { + "account": "Account", + "attachments": "Allegati", + "bcc": "BCC", + "cc": "CC", + "date": "Data", + "delete": "Elimina", + "download": "Scarica", + "downloadComplete": "Download completato", + "downloadFailed": "Download fallito", + "downloadStarted": "Download avviato", + "downloaded": "{{id}} scaricato", + "emailViewer": "Visualizzatore Email", + "failedToDownloadFile": "Download del file fallito", + "failedToLoadEmail": "Caricamento messaggio email fallito.", + "from": "Da", + "id": "ID", + "isBeingDownloaded": "{{id}} in corso di download", + "noAttachments": "Nessun allegato", + "noMessageSelected": "Nessun messaggio selezionato", + "noTagsYet": "Ancora nessun tag", + "onlyNonInlineAttachments": "Solo gli allegati non in linea sono mostrati qui.", + "showLess": "mostra meno", + "showMore": "mostra altro...", + "subject": "Oggetto", + "tags": "Tag", + "to": "A", + "viewThread": "Visualizza Thread" + }, + "mailbox": { + "bulkActions": { + "ariaLabel": "Azioni di massa per {{count}} {{emailLabel}} selezionate", + "clearSelection": "Cancella selezione", + "clearSelectionWithKey": "Cancella selezione ({{key}})", + "delete": "Elimina", + "deleteTooltip": "Elimina email selezionate", + "email": "email", + "emails": "email", + "selected": "selezionate" }, - "command": { - "typeCommandOrSearch": "Digita un comando o cerca...", - "noResultsFound": "Nessun risultato trovato.", - "theme": "Tema", - "light": "Chiaro", - "dark": "Scuro" + "deleteDialog": { + "confirm": "Elimina", + "desc": "Sei sicuro di voler eliminare {{countText}}? Questa azione rimuoverà permanentemente l'email/le email selezionate dal database locale. L'email/le email saranno perse per sempre e non potranno essere recuperate.", + "descCountMultiple": "queste {{count}} email", + "descCountSingle": "questa email", + "errorTitle": "Eliminazione messaggi fallita", + "successDesc": "I messaggi sono stati eliminati.", + "successTitle": "Messaggi eliminati con successo", + "title": "Elimina Email", + "warningDesc": "Procedi con cautela.", + "warningTitle": "Attenzione!" + }, + "deleteMailboxDialog": { + "confirm": "Elimina permanentemente", + "desc": "Sei sicuro di voler eliminare questa cartella? L'azione non può essere annullata.", + "errorTitle": "Eliminazione fallita", + "successDesc": "La cartella e il suo contenuto sono stati rimossi con successo.", + "successTitle": "Eliminazione completata", + "title": "Elimina cartella casella postale", + "warningDesc": "L'eliminazione di questa cartella rimuoverà permanentemente anche tutte le e-mail archiviate e le sottocartelle in essa contenute.", + "warningTitle": "Avvertimento" + }, + "folders": "Cartelle", + "messages": "Messaggi", + "noMessages": "Nessun messaggio", + "selectFolder": "Seleziona una cartella per visualizzare i messaggi", + "thread": { + "empty": "Nessun messaggio in questo thread.", + "invalidDate": "Data non valida", + "loadError": "Caricamento thread fallito", + "loadMore": "Carica altro", + "loadingMore": "Caricamento in corso...", + "message": "messaggio", + "messages": "messaggi", + "noSubject": "(Nessun oggetto)", + "title": "Thread ({{count}} {{messageLabel}})" + }, + "title": "Posta in arrivo" + }, + "navigation": { + "accessTokens": "Token di accesso", + "accounts": "Account", + "apiDocs": "Documentazione API", + "attachment": "Allegati", + "auth": "Autenticazione", + "dashboard": "Dashboard", + "general": "Generale", + "home": "Home", + "mailbox": "Posta in arrivo", + "oauth2": "OAuth2", + "other": "Altro", + "settings": "Impostazioni", + "users": "Utenti di sistema" + }, + "oauth2": { + "aSecretKeyProvidedByTheOAuthProvider": "Una chiave segreta fornita dal provider OAuth per autenticare la tua applicazione.", + "actions": { + "authorize": "Autorizza", + "delete": "Elimina", + "edit": "Modifica", + "openMenu": "Apri Menu" + }, + "addConfiguration": "Aggiungi Configurazione", + "addExtraParams": "Aggiungi Parametri Extra", + "addNew": "Aggiungi Nuovo", + "addScope": "Aggiungi Scope", + "areYouSureYouWantTo": "Sei sicuro di voler {{action}} questo client OAuth2?", + "areYouSureYouWantToDelete": "Sei sicuro di voler eliminare", + "authAtatus": "Stato di Autenticazione OAuth2", + "authFailed": "Autenticazione OAuth2 Fallita", + "authSuccess": "Autenticazione OAuth2 Riuscita", + "authUrlLabel": "URL di Autorizzazione:", + "authorizationUrlCannotBeEmpty": "L'URL di Autorizzazione non può essere vuoto", + "authorizationUrlIsRequired": "L'URL di Autorizzazione è obbligatorio", + "authorize": "Autorizza", + "authorizeAnEmailAccountToStartTheOAuth2AuthorizationProcess": "Autorizza un account email per iniziare il processo di autorizzazione OAuth2.", + "authorizeEmailAccount": "Autorizza Account Email", + "backToLogin": "Torna al Login", + "clickSaveWhenDone": "Clicca su Salva quando hai finito.", + "clientId": "ID Cliente", + "clientIdCannotBeEmpty": "L'ID Cliente non può essere vuoto", + "clientIdIsRequired": "L'ID Cliente è obbligatorio", + "clientIdLabel": "ID Cliente:", + "clientSecret": "Segreto del Cliente", + "clientSecretCannotBeEmpty": "Il Segreto del Cliente non può essere vuoto", + "clientSecretIsRequired": "Il Segreto del Cliente è obbligatorio", + "clientSecretLabel": "Segreto del Cliente:", + "createAccount": "Crea Account", + "createNewHere": "Creane uno nuovo qui.", + "created": "Creato", + "creating": "Creazione in corso...", + "creationFailed": "Creazione Fallita", + "delete": "Elimina", + "deleteFailed": "Eliminazione fallita, riprova più tardi", + "deleteSuccess": "Eliminazione Riuscita", + "deleteToken": "Elimina Token", + "describeThePurposeOfTheOauth2Application": "Descrivi lo scopo dell'applicazione OAuth2", + "description": "Gestisce automaticamente il recupero, l'archiviazione e l'aggiornamento dei token di accesso, garantendo un'esperienza di autenticazione fluida e sempre pronta.", + "descriptionLabel": "Descrizione:", + "descriptionMustNotExceed255Characters": "La descrizione non può superare i 255 caratteri.", + "disable": "Disabilita", + "disableOAuth2Client": "Disabilita Client OAuth2", + "disabled": "Disabilitato", + "edit": "Modifica", + "enable": "Abilita", + "enableOAuth2Client": "Abilita Client OAuth2", + "enabled": "Abilitato", + "enterIdToConfirmDeletion": "Inserisci l'ID per confermare l'eliminazione.", + "enterTheAuthorizationUrl": "Inserisci l'URL di autorizzazione", + "enterTheKeyHere": "Inserisci la chiave qui.", + "enterTheScopeHere": "Inserisci lo scope qui.", + "enterTheTokenUrl": "Inserisci l'URL del token", + "enterTheValueHere": "Inserisci il valore qui.", + "enterYourClientId": "Inserisci il tuo ID cliente", + "enterYourClientSecret": "Inserisci il tuo segreto del cliente", + "enterYourRedirectUrl": "Inserisci il tuo URI di reindirizzamento", + "error": "Errore", + "getAuthorizeUrlFailed": "Recupero URL di Autorizzazione Fallito", + "getAuthorizeUrlFailedDesc": "Recupero URL di autorizzazione fallito, riprova più tardi", + "gmail": "Gmail", + "goHome": "Vai alla Home", + "goToAccounts": "Vai ad Account", + "id": "ID", + "information": "Informazioni", + "invalidAuthorizationUrlFormat": "Formato URL di Autorizzazione non valido", + "invalidRedirectUriFormat": "Formato URI di Reindirizzamento non valido", + "invalidTokenUrlFormat": "Formato URL del Token non valido", + "key": "Chiave:", + "keyCannotBeEmpty": "La Chiave non può essere vuota", + "keyIsRequired": "La Chiave è obbligatoria", + "leaveEmptyToKeepExistingSecret": "Lascia vuoto per mantenere il segreto esistente", + "leaveEmptyToKeepTheExistingSecret": "Lascia vuoto per mantenere il segreto esistente, inserisci un nuovo valore solo per modificarlo.", + "loadingAccounts": "Caricamento account...", + "noConfigurations": "Nessuna Configurazione OAuth2", + "noConfigurationsDesc": "Non hai ancora aggiunto alcuna configurazione OAuth2. Aggiungine una per iniziare a usare le funzionalità OAuth2.", + "noEmailAccountsRegistered": "Nessun account email registrato. Per favore, creane uno.", + "noProxyAvailable": "Nessun proxy disponibile", + "noStatus": "Questa pagina mostra il risultato della tua autenticazione OAuth2. Attualmente non è disponibile alcuno stato specifico. Riprova se necessario.", + "oauth2ClientHasBeenSuccessfully": "Il client OAuth2 è stato {{action}} con successo.", + "oauth2ClientUpdated": "Client OAuth2 Aggiornato", + "oauth2DeleteFailed": "Eliminazione OAuth2 Fallita", + "optional": "Opzionale", + "outlook": "Outlook", + "pleaseBeCareful": "Fai attenzione, questa operazione non può essere annullata.", + "pleaseCreateOne": "Per favore, creane uno.", + "provider": "Provider", + "quickPresets": "Preset veloci:", + "redirectUri": "URI di Reindirizzamento", + "redirectUriCannotBeEmpty": "L'URI di Reindirizzamento non può essere vuoto", + "redirectUriIsRequired": "L'URI di Reindirizzamento è obbligatorio", + "redirectUrlLabel": "URI di Reindirizzamento:", + "save": "Salva", + "saveChanges": "Salva Modifiche", + "saving": "Salvataggio in corso...", + "scope": "Scope:", + "scopes": "Scope", + "selectAProxy": "Seleziona un proxy", + "selectAnAccount": "Seleziona un account", + "status": "Stato", + "statusUpdateFailed": "Aggiornamento stato fallito, riprova più tardi", + "success": "Successo", + "successMessage": "Il tuo account email è stato autenticato con successo tramite OAuth2. Il Token di Accesso è stato salvato dal sistema e verrà aggiornato automaticamente quando necessario.", + "theRedirectUrlAfterAuthorization": "L'URI di reindirizzamento dopo l'autorizzazione. Deve corrispondere all'URL registrato presso il provider OAuth. Usa il formato http://[host]:[porta]/oauth2/callback (o https://), dove [host] e [porta] corrispondono alla tua implementazione RustMailer. Il percorso /oauth2/callback è fisso.", + "theUniqueIdentifierForYourApplication": "L'identificatore unico per la tua applicazione, fornito dal provider OAuth.", + "theUrlUsedToExchange": "L'URL utilizzato per scambiare il codice di autorizzazione con un token di accesso.", + "theUrlWhereUsersWillBeRedirected": "L'URL a cui gli utenti verranno reindirizzati per autorizzare la tua applicazione.", + "thisActionWillPermanentlyRemoveTheOauth2Record": "Questa azione rimuoverà permanentemente il record OAuth2 dal sistema. Questo non può essere annullato.", + "thisWillPreventTheOAuth2ClientFromBeingUsed": "Questo impedirà l'utilizzo del client OAuth2.", + "title": "OAuth2", + "tokenUrlCannotBeEmpty": "L'URL del Token non può essere vuoto", + "tokenUrlIsRequired": "L'URL del Token è obbligatorio", + "tokenUrlLabel": "URL del Token:", + "tryAgain": "Riprova", + "unknownError": "Si è verificato un errore sconosciuto.", + "updateFailed": "Aggiornamento Fallito", + "updateHere": "Aggiorna qui.", + "updateOrCreationFailed": "{{action}} fallita, riprova più tardi", + "updated": "Aggiornato", + "useProxyOptional": "Usa Proxy (opzionale):", + "useSocks5ProxyForOAuthRequests": "Usa il proxy SOCKS5 per le richieste OAuth quando l'accesso diretto è bloccato.", + "value": "Valore:", + "valueCannotBeEmpty": "Il Valore non può essere vuoto", + "valueIsRequired": "Il Valore è obbligatorio", + "warning": "Attenzione!", + "whenDisabled": "Se disabilitato: - I nuovi flussi di autorizzazione saranno immediatamente rifiutati - I token di accesso e di refresh esistenti saranno revocati entro 1 minuto - Gli utenti dovranno riautorizzare quando viene riabilitato", + "yourOAuth2ApplicationHasBeenSuccessfully": "La tua applicazione OAuth2 è stata {{action}} con successo.", + "yourOAuth2ApplicationHasBeenSuccessfullyDeleted": "La tua applicazione OAuth2 è stata eliminata con successo." + }, + "permission": { + "account": { + "create": "Creare account email", + "manage": "Gestire gli account assegnati", + "manage_all": "Gestire tutte le configurazioni degli account", + "read_details": "Visualizzare i dettagli dell'account" + }, + "category": { + "account": "Autorizzazioni account", + "global_data": "Dati globali (Admin)", + "system_identity": "Sistema e identità" + }, + "data": { + "delete": "Eliminare le email assegnate", + "delete_all": "Eliminare le email di tutti gli account", + "export_batch": "Esportare i dati assegnati in batch", + "export_batch_all": "Esportare tutti i dati in batch", + "import_batch": "Importare dati email in batch", + "manage": "Gestire i metadati email assegnati", + "manage_all": "Gestire tutti i metadati email", + "raw_download": "Scaricare email grezze assegnate", + "raw_download_all": "Scaricare tutte le email grezze", + "read": "Leggere i dati email assegnati", + "read_all": "Leggere tutti i dati email", + "smtp_ingest": "Acquisire e-mail tramite protocollo SMTP" + }, + "dialog": { + "account_description": "Autorizzazioni limitate all'account selezionato.", + "account_title": "Autorizzazioni account", + "global_description": "Autorizzazioni di sistema assegnate a questo utente.", + "global_title": "Autorizzazioni globali" + }, + "scope": { + "account": "Account #{{id}}", + "global": "Globale" + }, + "system": { + "access": "Accesso di base al sistema", + "root": "Controllo completo del sistema" + }, + "token": { + "manage": "Gestire i token di accesso" + }, + "user": { + "manage": "Gestire tutti gli utenti", + "view": "Visualizzare i nomi utente di base" + } + }, + "profile": { + "avatar_alt": "Avatar", + "menu": { + "profile": "Profilo", + "settings": "Impostazioni", + "sign_out": "Disconnetti" + } + }, + "proxyDelete": { + "close": "Chiudi", + "confirmText": "Sei sicuro di voler eliminare", + "deleteBtn": "Elimina", + "failedDesc": "Eliminazione fallita, riprova più tardi", + "failedTitle": "Eliminazione Proxy Fallita", + "permanent": "Questa azione rimuoverà permanentemente il Proxy dal sistema. Questo non può essere annullato.", + "proxyIdLabel": "ID Proxy:", + "proxyIdPlaceholder": "Inserisci l'ID Proxy per confermare l'eliminazione.", + "successDesc": "Il Proxy è stato eliminato con successo.", + "successTitle": "Eliminazione Riuscita", + "title": "Elimina Proxy", + "tryAgain": "Riprova", + "warningDesc": "Fai attenzione, questa operazione non può essere annullata.", + "warningTitle": "Attenzione!" + }, + "restore_message": { + "accountsInvolved": "Account coinvolti", + "bulkTitle": "Ripristino multiplo messaggi", + "bulkWarning": "Nota: i messaggi verranno ripristinati nelle loro cartelle originali.", + "confirm": "Esegui ripristino", + "desc": "Questa azione caricherà nuovamente i messaggi selezionati da Bichon e li ripristinerà nelle rispettive caselle di posta sul server IMAP.", + "failed": "Ripristino fallito", + "failedTitle": "Errore di ripristino", + "messages": "messaggi", + "restore_to_imap": "Ripristina messaggio", + "success": "Ripristino completato", + "successDesc": "I messaggi selezionati sono stati ripristinati con successo sul server IMAP.", + "summary": "Dettagli ripristino", + "title": "Ripristina singolo messaggio" + }, + "roles": { + "actions": { + "add": "Aggiungi ruolo", + "cancel": "Annulla", + "close": "Chiudi", + "failed": "Operazione fallita", + "retry": "Riprova", + "submit_create": "Crea ruolo", + "submit_update": "Aggiorna ruolo", + "success_create": "Ruolo creato con successo", + "success_update": "Ruolo aggiornato con successo" + }, + "categories": { + "account_resource": "Accesso risorse account", + "global_data": "Accesso dati globali", + "identity": "Identità & Gestione" + }, + "columns": { + "created_at": "Creato il", + "id": "ID", + "name": "Nome", + "permissions": "Permessi", + "role_type": "Tipo", + "updated_at": "Aggiornato il" + }, + "delete": { + "alert_desc": "L'eliminazione di questo ruolo lo rimuoverà da tutti gli utenti a cui è assegnato.", + "alert_title": "Attenzione: azione permanente.", + "confirm_btn": "Elimina ruolo", + "confirm_label": "Digita l'ID del ruolo per confermare:", + "deleting": "Eliminazione...", + "dialog_title": "Elimina ruolo", + "error_fallback": "Impossibile eliminare il ruolo.", + "error_title": "Eliminazione fallita", + "irreversible": "Questa azione non può essere annullata.", + "placeholder": "Digita \"{{id}}\"", + "success_desc": "Il ruolo \"{{name}}\" è stato rimosso.", + "success_title": "Ruolo eliminato", + "warning_text": "Stai eliminando il ruolo {{name}} (ID: {{id}}) definitivamente." + }, + "description_hint": "Definisci l'ambito di accesso e i permessi.", + "details": { + "close_btn": "Chiudi", + "desc_account": "Accesso e operazioni sui dati per i singoli account.", + "desc_global": "Gestione globale e accesso al sistema.", + "role_badge": "Ruolo {{type}}", + "title": "Permessi: {{name}}", + "unknown": "Ruolo sconosciuto", + "view_permissions": "Dettagli permessi" + }, + "empty": { + "desc": "Non hai ancora creato alcun ruolo personalizzato.", + "title": "Nessun ruolo trovato" + }, + "form": { + "builtin_badge": "Ruolo di sistema", + "builtin_desc": "Questo ruolo è predefinito e di sola lettura.", + "desc_label": "Descrizione", + "matrix_label": "Matrice permessi ({{type}})", + "name_label": "Nome ruolo", + "type_label": "Tipo ruolo" + }, + "placeholder": { + "filter": "Cerca ruoli..." + }, + "title": { + "create": "Crea nuovo ruolo", + "edit": "Modifica ruolo: {{name}}" + }, + "types": { + "Account": "Account", + "Global": "Globale" }, "validation": { - "required": "Questo campo è obbligatorio", - "invalidEmail": "Indirizzo email non valido", - "invalidUrl": "URL non valido", - "passwordMinLength": "La password deve contenere almeno {{min}} caratteri", - "pleaseEnterPassword": "Inserisci la tua password", - "passwordRequired": "La password è obbligatoria quando il metodo di autenticazione è Password", - "emailRequired": "L'email è obbligatoria", - "imapHostRequired": "L'host IMAP è obbligatorio", - "imapHostCannotBeEmpty": "L'host IMAP non può essere vuoto", - "imapPortMustBePositive": "La porta IMAP deve essere un numero intero positivo", - "imapPortMustBeLessThan65536": "La porta IMAP deve essere inferiore a 65536", - "folderLimitMustBeNumber": "Il limite di cartelle deve essere un numero", - "folderLimitMustBeAtLeast100": "Il limite di cartelle deve essere almeno 100", - "incrementalSyncMustBeNumber": "L'intervallo di sincronizzazione incrementale deve essere un numero", - "incrementalSyncMustBeAtLeast10": "L'intervallo di sincronizzazione incrementale deve essere di almeno 10 minuti", - "pleaseEnterUsernameOrEmail": "Inserisci il tuo nome utente o email", - "singleRequestBatchSizeMustBeNumber": "La dimensione del batch deve essere un numero", - "singleRequestBatchSizeTooSmall": "La dimensione del batch deve essere almeno 10", - "singleRequestBatchSizeTooLarge": "La dimensione del batch deve essere al massimo 200" - }, - "table": { - "noResults": "Nessun risultato trovato", - "loading": "Caricamento...", - "page": "Pagina", - "of": "di", - "rowsPerPage": "Righe per pagina", - "showing": "Visualizzazione", - "to": "a", - "results": "risultati", - "asc": "Cresc.", - "desc": "Decresc.", - "hide": "Nascondi", - "edit": "Modifica", - "delete": "Elimina", - "pagination": { - "selected": "{{selected}} di {{total}} righe selezionate.", - "fixed_page_size": "{{size}} righe per pagina.", - "rows_per_page": "Righe per pagina", - "page_info": "Pagina {{page}} di {{total}}", - "first": "Prima pagina", - "previous": "Pagina precedente", - "next": "Pagina successiva", - "last": "Ultima pagina" - } - }, - "proxyDelete": { - "title": "Elimina Proxy", - "successTitle": "Eliminazione Riuscita", - "successDesc": "Il Proxy è stato eliminato con successo.", - "close": "Chiudi", - "failedTitle": "Eliminazione Proxy Fallita", - "failedDesc": "Eliminazione fallita, riprova più tardi", - "tryAgain": "Riprova", - "confirmText": "Sei sicuro di voler eliminare", - "permanent": "Questa azione rimuoverà permanentemente il Proxy dal sistema. Questo non può essere annullato.", - "proxyIdLabel": "ID Proxy:", - "proxyIdPlaceholder": "Inserisci l'ID Proxy per confermare l'eliminazione.", - "warningTitle": "Attenzione!", - "warningDesc": "Fai attenzione, questa operazione non può essere annullata.", - "deleteBtn": "Elimina" - }, - "systemConfig": { - "pageTitle": "Configurazioni a livello di sistema", - "pageDescription": "Questi parametri sono inizializzati tramite flag CLI o variabili d'ambiente. Sono di sola lettura per garantire la coerenza.", - "status": { - "enabled": "Abilitato", - "disabled": "Disabilitato", - "configured": "Configurato", - "missing": "Mancante", - "auto": "Auto", - "notSet": "Non impostato" - }, - "sections": { - "network": { - "title": "Rete", - "desc": "Accesso HTTP e pubblico" - }, - "cors": { - "title": "CORS", - "desc": "Regole di accesso cross-origin" - }, - "logging": { - "title": "Logging", - "desc": "Comportamento dell'output dei log" - }, - "storage": { - "title": "Storage e Cache", - "desc": "Percorsi database e limiti" - }, - "security": { - "title": "Sicurezza", - "desc": "Autenticazione e crittografia" - }, - "performance": { - "title": "Prestazioni", - "desc": "Concorrenza e compressione" - }, - "smtp": { - "title": "Server SMTP", - "desc": "Impostazioni di ricezione della posta in entrata per l'archiviazione in tempo reale" - } - } - }, - "apiTokens": { - "page": { - "loadError": "Errore nel caricamento dei token API.", - "emptyTitle": "Nessun token API", - "emptyDescription": "Non hai ancora creato alcun token API. Clicca sotto per crearne uno.", - "addBtn": "Aggiungi token" - }, - "list": { - "unnamedToken": "Token senza nome", - "statusActive": "Attivo", - "statusExpired": "Scaduto", - "neverExpires": "Mai", - "expiresOnShort": "Scade il {{date}}", - "tokenLabel": "Token", - "createdLabel": "Creato il", - "lastUsedLabel": "Ultimo utilizzo", - "expiresOnLabel": "Scade il", - "neverUsed": "Mai", - "neverLabel": "Mai", - "deleteBtn": "Elimina token" - }, - "dialog": { - "createTitle": "Crea token di accesso", - "editTitle": "Modifica token di accesso", - "description": "Clicca su salva quando hai finito.", - "save": "Salva", - "saveChanges": "Salva modifiche" - }, - "deleteDialog": { - "title": "Eliminare il token di accesso?", - "description": "Questa azione non può essere annullata. Qualsiasi applicazione che utilizzi questo token perderà immediatamente l'accesso.", - "cancel": "Annulla", - "confirm": "Elimina", - "deleting": "Eliminazione..." - }, - "form": { - "nameLabel": "Nome", - "namePlaceholder": "Dai un nome breve a questo token", - "nameDescription": "Opzionale · Max 32 caratteri", - "expirationLabel": "Scadenza", - "expirationPlaceholder": "Seleziona scadenza", - "expirationDescription": "I token scadranno automaticamente dopo il tempo selezionato.", - "never": "Mai", - "1day": "1 giorno", - "7days": "7 giorni", - "30days": "30 giorni", - "errorMax": "Massimo 32 caratteri", - "errorNumber": "Deve essere un numero", - "errorInt": "Deve essere un intero", - "errorPositive": "Deve essere maggiore di 0" - }, - "notifications": { - "createSuccess": "Token creato", - "createSuccessDesc": "Il token è stato creato con successo.", - "updateSuccess": "Token aggiornato", - "updateSuccessDesc": "Il token è stato aggiornato con successo.", - "createFailed": "Creazione fallita", - "updateFailed": "Aggiornamento fallito", - "deleteSuccess": "Token eliminato", - "deleteFailed": "Errore eliminazione", - "copied": "Copiato negli appunti", - "genericError": "Operazione fallita. Riprova.", - "close": "Chiudi", - "tryAgain": "Riprova" - } - }, - "permission": { - "scope": { - "global": "Globale", - "account": "Account #{{id}}" - }, - "dialog": { - "global_title": "Autorizzazioni globali", - "account_title": "Autorizzazioni account", - "global_description": "Autorizzazioni di sistema assegnate a questo utente.", - "account_description": "Autorizzazioni limitate all'account selezionato." - }, - "category": { - "system_identity": "Sistema e identità", - "global_data": "Dati globali (Admin)", - "account": "Autorizzazioni account" - }, - "system": { - "access": "Accesso di base al sistema", - "root": "Controllo completo del sistema" - }, - "user": { - "manage": "Gestire tutti gli utenti", - "view": "Visualizzare i nomi utente di base" - }, - "token": { - "manage": "Gestire i token di accesso" - }, - "account": { - "create": "Creare account email", - "manage": "Gestire gli account assegnati", - "manage_all": "Gestire tutte le configurazioni degli account", - "read_details": "Visualizzare i dettagli dell'account" - }, - "data": { - "read": "Leggere i dati email assegnati", - "read_all": "Leggere tutti i dati email", - "manage": "Gestire i metadati email assegnati", - "manage_all": "Gestire tutti i metadati email", - "raw_download": "Scaricare email grezze assegnate", - "raw_download_all": "Scaricare tutte le email grezze", - "delete": "Eliminare le email assegnate", - "delete_all": "Eliminare le email di tutti gli account", - "export_batch": "Esportare i dati assegnati in batch", - "export_batch_all": "Esportare tutti i dati in batch", - "import_batch": "Importare dati email in batch", - "smtp_ingest": "Acquisire e-mail tramite protocollo SMTP" - } - }, - "users": { - "columns": { - "id": "ID", - "avatar": "Avatar", - "username": "Nome utente", - "email": "Indirizzo email", - "roles": "Ruoli e permessi", - "created_at": "Creato il", - "updated_at": "Aggiornato il", - "actions": "Azioni" - }, - "buttons": { - "add": "Aggiungi utente", - "add_new": "Nuovo utente" - }, - "empty": { - "title": "Nessun utente trovato", - "description": "Clicca sul pulsante qui sotto per aggiungere il tuo primo utente." - }, - "nav": { - "users": "Utenti", - "roles": "Ruoli", - "api_tokens": "Token API" - }, - "api_tokens": { - "empty": { - "title": "Nessun token API trovato", - "description": "Non è stato ancora generato alcun token API nel sistema." - }, - "button": { - "generate": "Genera nuovo token" - }, - "toolbar": { - "search_placeholder": "Cerca per nome, proprietario o token..." - }, - "table": { - "name": "Nome", - "type": "Tipo", - "last_used": "Ultimo utilizzo", - "expires_at": "Scade il", - "owner": "Proprietario", - "created": "Creato", - "api_key": "Chiave API", - "web_ui": "Interfaccia Web", - "never": "Mai", - "permanent": "Permanente", - "expired": "Scaduto", - "unnamed": "Token senza nome" - }, - "unnamed": "Token senza nome", - "delete": { - "title": "Elimina token API", - "desc": "Stai per eliminare definitivamente questo token API", - "prefix": "Prefisso token", - "irreversible": "Questa azione non può essere annullata. Tutte le applicazioni che utilizzano questo token perderanno immediatamente l'accesso.", - "confirm_label": "Per confermare, digita {{word}} qui sotto:", - "confirm_placeholder": "Digita \"{{word}}\" per confermare", - "warning_title": "Avvertenza", - "warning_desc": "Qualsiasi script o servizio che utilizza questo token fallirà. Assicurati di aver aggiornato i tuoi sistemi.", - "confirm_button": "Elimina token", - "deleting": "Eliminazione..." - }, - "toast": { - "deleted_title": "Token API eliminato", - "deleted_desc": "Il token \"{{name}}\" è stato rimosso con successo.", - "delete_failed_title": "Eliminazione fallita", - "delete_failed": "Impossibile eliminare il token, riprova." - } - }, - "tokens": { - "schema": { - "name_max": "Max 32 caratteri", - "expire_number": "Deve essere un numero", - "expire_int": "Deve essere un numero intero", - "expire_positive": "Deve essere maggiore di 0" - }, - "toast": { - "update_success_title": "Token aggiornato", - "update_success_desc": "Token di accesso aggiornato con successo.", - "create_success_title": "Token creato", - "create_success_desc": "Token di accesso creato con successo.", - "update_failed_title": "Aggiornamento fallito", - "create_failed_title": "Creazione fallita" - }, - "error": { - "fallback": "L'operazione è fallita, riprova più tardi." - }, - "dialog": { - "edit_title": "Modifica token di accesso", - "create_title": "Crea token di accesso", - "description": "Clicca su salva al termine." - }, - "fields": { - "name_label": "Nome", - "name_placeholder": "Dai un nome breve al token", - "name_hint": "Opzionale · Max 32 caratteri", - "expire_label": "Scadenza", - "expire_placeholder": "Scegli scadenza", - "expire_hint": "Il token scadrà automaticamente dopo il tempo selezionato." - }, - "expire_options": { - "never": "Non scade mai", - "1_day": "1 giorno", - "7_days": "7 giorni", - "30_days": "30 giorni" - } - }, - "tokens_action": { - "dialog": { - "title": "Token API", - "description": "Gestisci i token API per questo utente." - }, - "empty": { - "title": "Nessun token API", - "description": "Questo utente non ha token API al momento." - }, - "buttons": { - "add": "Aggiungi token" - }, - "list": { - "unnamed_token": "Token senza nome", - "status_expired": "Scaduto", - "status_active": "Attivo", - "expires_on_brief": "Scade il {{date}}", - "never_expires": "Non scade mai", - "label_token": "Token", - "label_created": "Creato il", - "label_last_used": "Ultimo uso", - "label_expires_at": "Scadenza", - "never": "Mai", - "button_delete": "Elimina token" - }, - "delete_dialog": { - "title": "Eliminare il token di accesso?", - "description": "Questa azione è irreversibile." - } - }, - "actions": { - "schema": { - "account_required": "Seleziona un account", - "role_required": "Seleziona un ruolo", - "username_required": "Il nome utente è obbligatorio", - "username_min": "Minimo 3 caratteri", - "username_max": "Massimo 32 caratteri", - "email_required": "L'email è obbligatoria", - "email_invalid": "Inserisci un'email valida", - "global_role_required": "Assegna almeno un ruolo globale", - "description_max": "Descrizione max 256 caratteri", - "ip_invalid": "Indirizzo IP non valido", - "password_required": "La password è obbligatoria", - "password_min": "Minimo 8 caratteri", - "password_max": "Massimo 256 caratteri" - }, - "toast": { - "updated": "Utente aggiornato", - "created": "Utente creato" - }, - "dialog": { - "edit_title": "Modifica utente: {{name}}", - "create_title": "Crea nuovo utente", - "subtitle": "Configura identità, livelli di accesso e criteri di sicurezza." - }, - "tabs": { - "general": "Generale", - "permissions": "Permessi account", - "security": "Sicurezza & ACL" - }, - "sections": { - "basic": "Identità di base", - "global": "Permessi globali", - "mail_access": "Controllo accesso mail", - "mail_access_subtitle": "Account email che questo utente può gestire.", - "policy": "Politiche" - }, - "fields": { - "username": "Nome utente", - "username_hint": "Identificativo unico per il login.", - "email": "Email", - "email_hint": "Contatto principale e notifiche.", - "password": "Password", - "password_placeholder_create": "Almeno 8 caratteri", - "password_placeholder_edit": "Lascia vuoto per mantenere attuale", - "password_hint_create": "Password sicura per l'impostazione iniziale.", - "password_hint_edit": "Inserisci una nuova password solo se vuoi cambiarla.", - "global_roles_hint": "Assegna permessi di sistema.", - "description": "Descrizione (opzionale)", - "description_placeholder": "Note su questo utente...", - "description_hint": "Note interne (max 256 caratteri).", - "select_account": "Scegli account", - "assign_role": "Assegna ruolo", - "ip_whitelist": "Whitelist IP", - "ip_whitelist_hint": "Limita il login a questi IP (uno per riga).", - "rate_quota": "Quota di frequenza", - "burst_interval": "Intervallo burst (sec)" - }, - "buttons": { - "add_account": "Aggiungi account", - "update": "Aggiorna utente", - "create": "Crea utente" - }, - "states": { - "full_access": "Modalità accesso completo", - "full_access_desc": "Gli amministratori hanno accesso a tutti gli account per impostazione predefinita.", - "no_accounts": "Nessun account specifico assegnato.", - "security_disabled": "I criteri di sicurezza sono disabilitati." - }, - "api_tokens": "Token API", - "placeholder": { - "filter": "Cerca utenti..." - }, - "delete": { - "title": "Elimina utente", - "confirm_msg": "Stai eliminando l'utente {{name}} (ID: {{id}}) definitivamente.", - "irreversible": "Questa azione è irreversibile.", - "input_label": "Digita l'ID utente per confermare:", - "placeholder": "Digita \"{{id}}\"", - "alert_title": "Attenzione: azione permanente.", - "alert_desc": "L'utente e tutti i dati correlati verranno cancellati.", - "button_confirm": "Elimina utente", - "button_deleting": "Eliminazione...", - "toast": { - "success_title": "Utente eliminato", - "success_desc": "L'utente \"{{name}}\" è stato rimosso.", - "failed_title": "Eliminazione fallita", - "failed_fallback": "Impossibile eliminare l'utente." - } - } - } - }, - "roles": { - "title": { - "create": "Crea nuovo ruolo", - "edit": "Modifica ruolo: {{name}}" - }, - "description_hint": "Definisci l'ambito di accesso e i permessi.", - "form": { - "name_label": "Nome ruolo", - "type_label": "Tipo ruolo", - "desc_label": "Descrizione", - "matrix_label": "Matrice permessi ({{type}})", - "builtin_badge": "Ruolo di sistema", - "builtin_desc": "Questo ruolo è predefinito e di sola lettura." - }, - "types": { - "Global": "Globale", - "Account": "Account" - }, - "categories": { - "identity": "Identità & Gestione", - "global_data": "Accesso dati globali", - "account_resource": "Accesso risorse account" - }, - "actions": { - "cancel": "Annulla", - "submit_create": "Crea ruolo", - "submit_update": "Aggiorna ruolo", - "success_create": "Ruolo creato con successo", - "success_update": "Ruolo aggiornato con successo", - "failed": "Operazione fallita", - "close": "Chiudi", - "retry": "Riprova", - "add": "Aggiungi ruolo" - }, - "validation": { - "name_required": "Il nome del ruolo è obbligatorio", - "perm_required": "Seleziona almeno un permesso" - }, - "columns": { - "id": "ID", - "name": "Nome", - "role_type": "Tipo", - "permissions": "Permessi", - "created_at": "Creato il", - "updated_at": "Aggiornato il" - }, - "placeholder": { - "filter": "Cerca ruoli..." - }, - "delete": { - "dialog_title": "Elimina ruolo", - "warning_text": "Stai eliminando il ruolo {{name}} (ID: {{id}}) definitivamente.", - "irreversible": "Questa azione non può essere annullata.", - "confirm_label": "Digita l'ID del ruolo per confermare:", - "placeholder": "Digita \"{{id}}\"", - "alert_title": "Attenzione: azione permanente.", - "alert_desc": "L'eliminazione di questo ruolo lo rimuoverà da tutti gli utenti a cui è assegnato.", - "confirm_btn": "Elimina ruolo", - "deleting": "Eliminazione...", - "success_title": "Ruolo eliminato", - "success_desc": "Il ruolo \"{{name}}\" è stato rimosso.", - "error_title": "Eliminazione fallita", - "error_fallback": "Impossibile eliminare il ruolo." - }, - "details": { - "title": "Permessi: {{name}}", - "unknown": "Ruolo sconosciuto", - "role_badge": "Ruolo {{type}}", - "desc_global": "Gestione globale e accesso al sistema.", - "desc_account": "Accesso e operazioni sui dati per i singoli account.", - "close_btn": "Chiudi", - "view_permissions": "Dettagli permessi" - }, - "empty": { - "title": "Nessun ruolo trovato", - "desc": "Non hai ancora creato alcun ruolo personalizzato." - } - }, - "profile": { - "avatar_alt": "Avatar", - "menu": { - "profile": "Profilo", - "settings": "Impostazioni", - "sign_out": "Disconnetti" - } - }, - "sign_out": { - "title": "Disconnetti", - "desc": "Sei sicuro di voler disconnetterti? Dovrai accedere di nuovo per usare il tuo account.", - "confirm": "Disconnetti" - }, - "restore_message": { - "title": "Ripristina singolo messaggio", - "bulkTitle": "Ripristino multiplo messaggi", - "bulkWarning": "Nota: i messaggi verranno ripristinati nelle loro cartelle originali.", - "accountsInvolved": "Account coinvolti", - "summary": "Dettagli ripristino", - "messages": "messaggi", - "desc": "Questa azione caricherà nuovamente i messaggi selezionati da Bichon e li ripristinerà nelle rispettive caselle di posta sul server IMAP.", - "confirm": "Esegui ripristino", - "restore_to_imap": "Ripristina messaggio", - "success": "Ripristino completato", - "successDesc": "I messaggi selezionati sono stati ripristinati con successo sul server IMAP.", - "failed": "Ripristino fallito", - "failedTitle": "Errore di ripristino" - }, - "time": { - "label": "Tempo", - "since": "Da", - "before": "Prima di", - "recent_range": "Intervallo recente (da...)", - "historical": "Intervallo storico (prima di...)", - "absolute_range": "Intervallo di date assoluto", - "last_day": "Ultimo 1 giorno", - "last_days": "Ultimi {{count}} giorni", - "last_months": "Ultimi {{count}} mesi", - "over_years_ago": "{{count}} {{unit}} fa", - "year": "anno", - "years": "anni", - "recent_prefix": "Recenti:", - "days_ago_to_now": "giorni fa fino ad oggi", - "apply": "Applica", - "start_date": "Data di inizio", - "end_date": "Data di fine", - "clear_filters": "Cancella filtri temporali", - "format": "yyyy-MM-dd" - }, - "tag": { - "label": "Tag", - "search_placeholder": "Cerca tag...", - "clear_all": "Cancella tutti i tag", - "no_tags_found": "Nessun tag trovato" - }, - "search_accounts": { - "label": "Account email", - "search_placeholder": "Cerca account email...", - "clear_accounts": "Cancella account selezionati", - "no_accounts_found": "Nessun account trovato" - }, - "search_mailbox": { - "label": "Caselle di posta", - "search_placeholder": "Cerca cartelle", - "clear_mailboxes": "Cancella cartelle selezionate", - "select_account_first": "Seleziona prima un account email", - "no_mailbox_found": "Nessuna cartella trovata" - }, - "search_contacts": { - "label": "Contatti", - "label_with_count": "Contatti ({{count}})", - "any": "Qualsiasi", - "search_placeholder": "Cerca {{field}}...", - "reset_all": "Reimposta tutti i contatti", - "no_contact_found": "Nessun contatto trovato", - "loading": "Caricamento...", - "showing_limit": "Mostrati solo i primi 100 risultati • Totale {{total}}" - }, - "search_more": { - "trigger_label": "Avanzato", - "title": "Filtri avanzati", - "reset": "Reimposta", - "has_attachment": "Con allegato", - "attachment_name_label": "Nome allegato", - "attachment_name_placeholder": "Es.: invoice.pdf", - "message_size_label": "Dimensione email", - "message_id_label": "Message-ID originale", - "message_id_description": "Ricerca tramite Message-ID nell’intestazione email", - "apply": "Applica filtri", - "size_presets": { - "any": "Qualsiasi dimensione", - "tiny": "Molto piccola (< 15 KB)", - "small": "Piccola (< 2 MB)", - "medium": "Media (2 – 10 MB)", - "large": "Grande (10 – 20 MB)", - "huge": "Molto grande (> 20 MB)" - }, - "any": "Qualsiasi", - "search_placeholder": "Cerca {{field}}...", - "extension": "Estensione file", - "category": "Categoria allegato", - "content_types": "Tipo specifico" - }, - "search_view": { - "button_label": "Vista", - "menu_title": "Impostazioni colonne" - }, - "search_reset": { - "label": "Reimposta", - "tooltip": "Cancella tutti i filtri" - }, - "search_input": { - "placeholder": "Cerca e-mail... (Regex supportato)", - "button": "Cerca", - "recent_title": "Ricerche recenti", - "clear_history": "Cancella cronologia", - "no_history": "Nessuna cronologia di ricerca", - "all": "Tutti i campi", - "all_fields_desc": "Cerca in oggetto, testo, mittente e destinatari", - "subject": "Oggetto", - "body": "Corpo del messaggio" + "name_required": "Il nome del ruolo è obbligatorio", + "perm_required": "Seleziona almeno un permesso" } + }, + "search": { + "account": "Account", + "addEmailAccount": "Aggiungi Account Email", + "addTags": { + "cancel": "Annulla", + "createHint": "Crea nuovo tag: {{tag}}", + "invalidTitle": "Tag Non Valido", + "none": "Nessun tag aggiunto ancora", + "save": "Salva", + "saving": "Salvataggio in corso...", + "searchPlaceholder": "Cerca o crea tag...", + "selectedCount": "{{count}} tag selezionati", + "title": "Modifica Tag", + "tryAgain": "Riprova più tardi", + "updateFailedTitle": "Aggiornamento Fallito", + "updatedDesc": "I tag sono stati aggiornati con successo", + "updatedTitle": "Tag Aggiornati" + }, + "adjustSearch": "Prova ad aggiustare i criteri di ricerca o a cancellare i filtri.", + "advanced": "Avanzato", + "advancedFilters": "Filtri Avanzati", + "any": "Qualsiasi", + "attachmentName": "Nome Allegato", + "attachmentsSize": "Allegati e Dimensione", + "bcc": "BCC", + "before": "Prima:", + "bulkActions": { + "ariaLabel": "{{count}} messaggi selezionati. Barra delle azioni", + "clear": "Annulla selezione", + "delete": "Elimina", + "deleteDesc": "Elimina messaggi selezionati", + "manageTags": "Gestisci tag", + "selected": "{{count}} selezionati" + }, + "cc": "CC", + "clear": "Cancella", + "date": "Data", + "dateRange": "Intervallo di Date", + "delete": { + "confirmButton": "Elimina", + "confirmDetail": "L'azione non può essere annullata.", + "confirmPrefix": "Sei sicuro di voler eliminare", + "countLabel": "{{count}} messaggi?", + "errorTitle": "Erroka durante l'eliminazione", + "successDesc": "I messaggi sono stati eliminati correttamente.", + "successTitle": "Eliminati", + "title": "Elimina messaggi", + "warningDesc": "I messaggi saranno rimossi permanentemente.", + "warningTitle": "Attenzione" + }, + "editTag": "Modifica Tag", + "endDate": "Data di Fine", + "from": "Da", + "fullTextMultiAccount": "Testo completo · Multi-account · Filtri avanzati", + "hasAttachment": "Ha Allegato", + "huge": "Enorme (≥20 MB)", + "keyword": "Parola chiave", + "large": "Grande (10 - 20 MB)", + "mailbox": "Posta in arrivo", + "maxSize": "Dimensione Max", + "maximumBytes": "Massimo (Byte)", + "medium": "Medio (2 - 10 MB)", + "messageId": "ID Messaggio", + "minSize": "Dimensione Min", + "minimumBytes": "Minimo (Byte)", + "no": "No", + "noActiveEmailAccount": "Nessun account email attivo.", + "noEmailsFound": "Nessuna email trovata", + "noMailboxSelectAccount": "Nessuna posta in arrivo. Seleziona prima un account.", + "originalMessageIdHeader": "Header Message-ID dell'email originale", + "pleaseSelectAtLeastOne": "Seleziona almeno un criterio di ricerca", + "preview": "Anteprima", + "recipient": "Destinatario", + "searchArchivedEmails": "Cerca Email Archiviate", + "searchButton": "Cerca", + "searchInSubjectBody": "Cerca in oggetto, corpo, allegati...", + "searching": "Ricerca in corso, attendere prego...", + "searchingButton": "Ricerca in corso...", + "selectAccount": "Seleziona account", + "selectDate": "Seleziona una data", + "selectMailbox": "Seleziona posta in arrivo", + "sender": "Mittente", + "senderRecipients": "Mittente / Destinatari", + "since": "Da:", + "size": "Dimensione", + "sizeDescription": "La dimensione indica la dimensione totale dell’email, inclusi gli allegati.", + "small": "Piccolo (<2 MB)", + "sort": "Ordina", + "source": "Origine", + "startDate": "Data di Inizio", + "startSearching": "Inizia a inserire una parola chiave, un mittente o usa filtri avanzati.", + "subject": "Oggetto", + "tagFilter": "Filtro Tag", + "thread": { + "empty": "Nessun messaggio in questo thread", + "error": "Caricamento thread fallito", + "invalidDate": "Data non valida", + "loadMore": "Carica altro", + "loadingMore": "Caricamento in corso...", + "noSubject": "(Nessun oggetto)", + "title": "Thread · {{count}} messaggi" + }, + "tiny": "Molto piccolo (<15 KB)", + "title": "Cerca", + "to": "A", + "updateTags": { + "actionAdd": "Aggiungi", + "actionOverwrite": "Sovrascrivi", + "actionRemove": "Rimuovi", + "cancel": "Annulla", + "createHint": "Premi Invio per creare un nuovo tag: \"{{tag}}\"", + "invalidTitle": "Tag non valido", + "none": "Nessun tag selezionato", + "overwriteWarning": "Avviso: questo sovrascriverà tutti i tag esistenti sugli elementi selezionati.", + "savingAdd": "Aggiunta...", + "savingOverwrite": "Sovrascrittura...", + "savingRemove": "Rimozione...", + "searchPlaceholder": "Cerca o crea un nuovo tag...", + "selectedCount": "{{count}} tag da applicare", + "submitAdd": "Aggiungi tag", + "submitOverwrite": "Sovrascrivi tag", + "submitRemove": "Rimuovi tag", + "title": "Aggiorna tag", + "tryAgain": "Riprova più tardi.", + "updateFailedTitle": "Aggiornamento fallito", + "updatedDesc": "I tag sono stati aggiornati con successo.", + "updatedTitle": "Tag aggiornati" + }, + "yes": "Sì" + }, + "search_accounts": { + "clear_accounts": "Cancella account selezionati", + "label": "Account email", + "no_accounts_found": "Nessun account trovato", + "search_placeholder": "Cerca account email..." + }, + "search_contacts": { + "any": "Qualsiasi", + "label": "Contatti", + "label_with_count": "Contatti ({{count}})", + "loading": "Caricamento...", + "no_contact_found": "Nessun contatto trovato", + "reset_all": "Reimposta tutti i contatti", + "search_placeholder": "Cerca {{field}}...", + "showing_limit": "Mostrati solo i primi 100 risultati • Totale {{total}}" + }, + "search_input": { + "all": "Tutti i campi", + "all_fields_desc": "Cerca in oggetto, testo, mittente e destinatari", + "body": "Corpo del messaggio", + "button": "Cerca", + "clear_history": "Cancella cronologia", + "no_history": "Nessuna cronologia di ricerca", + "placeholder": "Cerca email (usa \" \" per la ricerca di frasi)", + "recent_title": "Ricerche recenti", + "subject": "Oggetto" + }, + "search_mailbox": { + "clear_mailboxes": "Cancella cartelle selezionate", + "label": "Caselle di posta", + "no_mailbox_found": "Nessuna cartella trovata", + "search_placeholder": "Cerca cartelle", + "select_account_first": "Seleziona prima un account email" + }, + "search_more": { + "any": "Qualsiasi", + "apply": "Applica filtri", + "attachment_name_label": "Nome allegato", + "attachment_name_placeholder": "Es.: invoice.pdf", + "category": "Categoria allegato", + "content_type": "Tipo di file", + "extension": "Estensione file", + "has_attachment": "Con allegato", + "is_message": "Allegato formato email", + "is_message_desc": "Questo allegato è un file di posta, ad esempio un file .eml.", + "message_id_description": "Ricerca tramite Message-ID nell’intestazione email", + "message_id_label": "Message-ID originale", + "message_size_label": "Dimensione email", + "reset": "Reimposta", + "search_placeholder": "Cerca {{field}}...", + "size_presets": { + "any": "Qualsiasi dimensione", + "huge": "Molto grande (> 20 MB)", + "large": "Grande (10 – 20 MB)", + "medium": "Media (2 – 10 MB)", + "small": "Piccola (< 2 MB)", + "tiny": "Molto piccola (< 15 KB)" + }, + "title": "Filtri avanzati", + "trigger_label": "Avanzato" + }, + "search_reset": { + "label": "Reimposta", + "tooltip": "Cancella tutti i filtri" + }, + "search_view": { + "button_label": "Vista", + "menu_title": "Impostazioni colonne" + }, + "settings": { + "accounts": "Account", + "acl": "Acl", + "actions": "Azioni", + "add": "Aggiungi", + "addNewProxyHere": "Aggiungi un nuovo Proxy qui. ", + "adding": "Aggiunta in corso...", + "appearance": { + "button": { + "update": "Aggiorna preferenze" + }, + "command": { + "no_results": "Nessuna lingua trovata.", + "search": "Cerca lingua..." + }, + "description": { + "language": "Seleziona la lingua per l'interfaccia web.", + "theme": "Scegli tra la modalità chiara o scura." + }, + "field": { + "language": "Lingua dell'interfaccia", + "theme": "Tema dell'interfaccia" + }, + "placeholder": { + "select_language": "Seleziona lingua" + }, + "theme": { + "dark": "Scuro", + "light": "Chiaro" + }, + "title": "Aspetto", + "validation": { + "language": { + "required": "Seleziona una lingua." + }, + "theme": { + "required": "Seleziona un tema." + } + } + }, + "authUrl": "URL di Autorizzazione", + "changePasswordForFutureLogins": "Cambia la password per gli accessi futuri.", + "confirmReset": "Conferma Ripristino", + "createdAt": "Creato Il", + "delete": "Elimina", + "description": "Descrizione", + "edit": "Modifica", + "enabled": "Abilitato", + "enterNewRootPassword": "Inserisci la nuova password root", + "enterProxyIdToConfirmDeletion": "Inserisci l'ID Proxy per confermare l'eliminazione.", + "failedToCopyText": "Copia del testo fallita", + "filterAccessToken": "Filtra Token di Accesso...", + "filterAccount": "Filtra Account...", + "filterOauth2": "Filtra OAuth2...", + "filterProxy": "Filtra Proxy...", + "general": "Generale", + "generateNewToken": "Genera un nuovo token, quello vecchio scadrà immediatamente.", + "host": "Host", + "id": "Id", + "invalidPassword": "Password non valida", + "lastAccess": "Ultimo Accesso", + "manageRootTokenAndPassword": "Gestisci in modo sicuro il token e la password root.", + "name": "Nome", + "noProxies": "Nessun Proxy", + "noProxiesDesc": "Non hai ancora aggiunto alcuna configurazione proxy. Aggiungine una per utilizzare le funzionalità proxy.", + "password": "Password", + "pleaseUseAnIpAddressForBetterReliability": "Utilizza un indirizzo IP (es. 127.0.0.1) anziché un hostname o dominio per una migliore affidabilità.", + "port": "Porta", + "profile": { + "account": { + "id": "ID account: {{id}}" + }, + "avatarAlt": "Avatar", + "button": { + "permissions": "Permessi", + "update_profile": "Aggiorna profilo", + "view_global_permissions": "Visualizza permessi globali" + }, + "field": { + "email": "Email", + "password": "Password", + "username": "Nome utente" + }, + "loadError": "Impossibile caricare le informazioni dell’utente.", + "maxSize": "Fino a {{size}}", + "placeholder": { + "password_keep": "Lascia vuoto per mantenere la password attuale" + }, + "removeAvatar": "Rimuovi avatar", + "section": { + "accounts": "{{count}} account collegati", + "roles": "Ruoli" + }, + "toast": { + "update_failed": "Aggiornamento del profilo non riuscito", + "updated": "Profilo aggiornato correttamente" + }, + "uploadError": "Errore(i) durante il caricamento del file", + "uploadTitle": "Carica avatar", + "validation": { + "email": { + "invalid": "Inserisci un indirizzo email valido", + "required": "L’email è obbligatoria" + }, + "password": { + "max": "La password deve contenere al massimo 256 caratteri", + "min": "La password deve contenere almeno 8 caratteri" + }, + "username": { + "max": "Il nome utente deve contenere al massimo 32 caratteri", + "min": "Il nome utente deve contenere almeno 5 caratteri", + "required": "Il nome utente è obbligatorio" + } + } + }, + "proxy": "Proxy", + "proxyUpdateOrAddFailed": "{{action}} fallita, riprova più tardi", + "reset": "Ripristina", + "resetRootPassword": "Ripristina Password Root", + "resetRootToken": "Ripristina Token Root", + "root": "Root", + "rootAccessManagement": "Gestione Accesso Root", + "rootDesc": "Gestisci le credenziali di accesso root, inclusi token e password.", + "rootPasswordMustBeAtLeast6Characters": "La password root deve essere lunga almeno 6 caratteri.", + "rootTitle": "Root", + "selectAll": "Seleziona Tutto", + "sidebar": { + "apiTokens": "Token API", + "configurations": "Configurazioni di sistema", + "profile": "Profilo", + "proxy": "Proxy di rete" + }, + "theRootPasswordHasBeenReset": "La password root è stata ripristinata", + "theRootTokenHasBeenReset": "Il token root è stato ripristinato", + "theme": "Tema", + "title": "Impostazioni", + "token": "Token", + "tokenUrl": "URL del Token", + "type": "Tipo", + "updateTheProxyHere": "Aggiorna il Proxy qui. ", + "updatedAt": "Aggiornato Il", + "url": "Url", + "useNewPasswordForNextLogin": "Usa la nuova password per il prossimo accesso.", + "useProxy": "Usa Proxy", + "username": "Nome utente", + "youAreAboutToResetTheRootPassword": "Stai per ripristinare la password root. Assicurati di salvarla in modo sicuro.", + "youAreAboutToResetTheRootToken": "Stai per ripristinare il token root. Questa azione non può essere annullata.", + "yourLoginInformationHasBeenUpdated": "Le tue informazioni di accesso sono state aggiornate. Non è necessario eseguire nuovamente l'accesso.", + "yourProxyHasBeenSuccessfully": "Il tuo Proxy è stato {{action}} con successo." + }, + "sign_out": { + "confirm": "Disconnetti", + "desc": "Sei sicuro di voler disconnetterti? Dovrai accedere di nuovo per usare il tuo account.", + "title": "Disconnetti" + }, + "systemConfig": { + "pageDescription": "Questi parametri sono inizializzati tramite flag CLI o variabili d'ambiente. Sono di sola lettura per garantire la coerenza.", + "pageTitle": "Configurazioni a livello di sistema", + "sections": { + "cors": { + "desc": "Regole di accesso cross-origin", + "title": "CORS" + }, + "logging": { + "desc": "Comportamento dell'output dei log", + "title": "Logging" + }, + "network": { + "desc": "Accesso HTTP e pubblico", + "title": "Rete" + }, + "performance": { + "desc": "Concorrenza e compressione", + "title": "Prestazioni" + }, + "security": { + "desc": "Autenticazione e crittografia", + "title": "Sicurezza" + }, + "smtp": { + "desc": "Impostazioni di ricezione della posta in entrata per l'archiviazione in tempo reale", + "title": "Server SMTP" + }, + "storage": { + "desc": "Percorsi database e limiti", + "title": "Storage e Cache" + } + }, + "status": { + "auto": "Auto", + "configured": "Configurato", + "disabled": "Disabilitato", + "enabled": "Abilitato", + "missing": "Mancante", + "notSet": "Non impostato" + } + }, + "table": { + "asc": "Cresc.", + "delete": "Elimina", + "desc": "Decresc.", + "edit": "Modifica", + "hide": "Nascondi", + "loading": "Caricamento...", + "noResults": "Nessun risultato trovato", + "of": "di", + "page": "Pagina", + "pagination": { + "first": "Prima pagina", + "fixed_page_size": "{{size}} righe per pagina.", + "last": "Ultima pagina", + "next": "Pagina successiva", + "page_info": "Pagina {{page}} di {{total}}", + "previous": "Pagina precedente", + "rows_per_page": "Righe per pagina", + "selected": "{{selected}} di {{total}} righe selezionate." + }, + "results": "risultati", + "rowsPerPage": "Righe per pagina", + "showing": "Visualizzazione", + "to": "a" + }, + "tag": { + "clear_all": "Cancella tutti i tag", + "label": "Tag", + "no_tags_found": "Nessun tag trovato", + "search_placeholder": "Cerca tag..." + }, + "time": { + "absolute_range": "Intervallo di date assoluto", + "apply": "Applica", + "before": "Prima di", + "clear_filters": "Cancella filtri temporali", + "days_ago_to_now": "giorni fa fino ad oggi", + "end_date": "Data di fine", + "format": "yyyy-MM-dd", + "historical": "Intervallo storico (prima di...)", + "label": "Tempo", + "last_day": "Ultimo 1 giorno", + "last_days": "Ultimi {{count}} giorni", + "last_months": "Ultimi {{count}} mesi", + "over_years_ago": "{{count}} {{unit}} fa", + "recent_prefix": "Recenti:", + "recent_range": "Intervallo recente (da...)", + "since": "Da", + "start_date": "Data di inizio", + "year": "anno", + "years": "anni" + }, + "users": { + "actions": { + "api_tokens": "Token API", + "buttons": { + "add_account": "Aggiungi account", + "create": "Crea utente", + "update": "Aggiorna utente" + }, + "delete": { + "alert_desc": "L'utente e tutti i dati correlati verranno cancellati.", + "alert_title": "Attenzione: azione permanente.", + "button_confirm": "Elimina utente", + "button_deleting": "Eliminazione...", + "confirm_msg": "Stai eliminando l'utente {{name}} (ID: {{id}}) definitivamente.", + "input_label": "Digita l'ID utente per confermare:", + "irreversible": "Questa azione è irreversibile.", + "placeholder": "Digita \"{{id}}\"", + "title": "Elimina utente", + "toast": { + "failed_fallback": "Impossibile eliminare l'utente.", + "failed_title": "Eliminazione fallita", + "success_desc": "L'utente \"{{name}}\" è stato rimosso.", + "success_title": "Utente eliminato" + } + }, + "dialog": { + "create_title": "Crea nuovo utente", + "edit_title": "Modifica utente: {{name}}", + "subtitle": "Configura identità, livelli di accesso e criteri di sicurezza." + }, + "fields": { + "assign_role": "Assegna ruolo", + "burst_interval": "Intervallo burst (sec)", + "description": "Descrizione (opzionale)", + "description_hint": "Note interne (max 256 caratteri).", + "description_placeholder": "Note su questo utente...", + "email": "Email", + "email_hint": "Contatto principale e notifiche.", + "global_roles_hint": "Assegna permessi di sistema.", + "ip_whitelist": "Whitelist IP", + "ip_whitelist_hint": "Limita il login a questi IP (uno per riga).", + "password": "Password", + "password_hint_create": "Password sicura per l'impostazione iniziale.", + "password_hint_edit": "Inserisci una nuova password solo se vuoi cambiarla.", + "password_placeholder_create": "Almeno 8 caratteri", + "password_placeholder_edit": "Lascia vuoto per mantenere attuale", + "rate_quota": "Quota di frequenza", + "select_account": "Scegli account", + "username": "Nome utente", + "username_hint": "Identificativo unico per il login." + }, + "placeholder": { + "filter": "Cerca utenti..." + }, + "schema": { + "account_required": "Seleziona un account", + "description_max": "Descrizione max 256 caratteri", + "email_invalid": "Inserisci un'email valida", + "email_required": "L'email è obbligatoria", + "global_role_required": "Assegna almeno un ruolo globale", + "ip_invalid": "Indirizzo IP non valido", + "password_max": "Massimo 256 caratteri", + "password_min": "Minimo 8 caratteri", + "password_required": "La password è obbligatoria", + "role_required": "Seleziona un ruolo", + "username_max": "Massimo 32 caratteri", + "username_min": "Minimo 3 caratteri", + "username_required": "Il nome utente è obbligatorio" + }, + "sections": { + "basic": "Identità di base", + "global": "Permessi globali", + "mail_access": "Controllo accesso mail", + "mail_access_subtitle": "Account email che questo utente può gestire.", + "policy": "Politiche" + }, + "states": { + "full_access": "Modalità accesso completo", + "full_access_desc": "Gli amministratori hanno accesso a tutti gli account per impostazione predefinita.", + "no_accounts": "Nessun account specifico assegnato.", + "security_disabled": "I criteri di sicurezza sono disabilitati." + }, + "tabs": { + "general": "Generale", + "permissions": "Permessi account", + "security": "Sicurezza & ACL" + }, + "toast": { + "created": "Utente creato", + "updated": "Utente aggiornato" + } + }, + "api_tokens": { + "button": { + "generate": "Genera nuovo token" + }, + "delete": { + "confirm_button": "Elimina token", + "confirm_label": "Per confermare, digita {{word}} qui sotto:", + "confirm_placeholder": "Digita \"{{word}}\" per confermare", + "deleting": "Eliminazione...", + "desc": "Stai per eliminare definitivamente questo token API", + "irreversible": "Questa azione non può essere annullata. Tutte le applicazioni che utilizzano questo token perderanno immediatamente l'accesso.", + "prefix": "Prefisso token", + "title": "Elimina token API", + "warning_desc": "Qualsiasi script o servizio che utilizza questo token fallirà. Assicurati di aver aggiornato i tuoi sistemi.", + "warning_title": "Avvertenza" + }, + "empty": { + "description": "Non è stato ancora generato alcun token API nel sistema.", + "title": "Nessun token API trovato" + }, + "table": { + "api_key": "Chiave API", + "created": "Creato", + "expired": "Scaduto", + "expires_at": "Scade il", + "last_used": "Ultimo utilizzo", + "name": "Nome", + "never": "Mai", + "owner": "Proprietario", + "permanent": "Permanente", + "type": "Tipo", + "unnamed": "Token senza nome", + "web_ui": "Interfaccia Web" + }, + "toast": { + "delete_failed": "Impossibile eliminare il token, riprova.", + "delete_failed_title": "Eliminazione fallita", + "deleted_desc": "Il token \"{{name}}\" è stato rimosso con successo.", + "deleted_title": "Token API eliminato" + }, + "toolbar": { + "search_placeholder": "Cerca per nome, proprietario o token..." + }, + "unnamed": "Token senza nome" + }, + "buttons": { + "add": "Aggiungi utente", + "add_new": "Nuovo utente" + }, + "columns": { + "actions": "Azioni", + "avatar": "Avatar", + "created_at": "Creato il", + "email": "Indirizzo email", + "id": "ID", + "roles": "Ruoli e permessi", + "updated_at": "Aggiornato il", + "username": "Nome utente" + }, + "empty": { + "description": "Clicca sul pulsante qui sotto per aggiungere il tuo primo utente.", + "title": "Nessun utente trovato" + }, + "nav": { + "api_tokens": "Token API", + "roles": "Ruoli", + "users": "Utenti" + }, + "tokens": { + "dialog": { + "create_title": "Crea token di accesso", + "description": "Clicca su salva al termine.", + "edit_title": "Modifica token di accesso" + }, + "error": { + "fallback": "L'operazione è fallita, riprova più tardi." + }, + "expire_options": { + "1_day": "1 giorno", + "30_days": "30 giorni", + "7_days": "7 giorni", + "never": "Non scade mai" + }, + "fields": { + "expire_hint": "Il token scadrà automaticamente dopo il tempo selezionato.", + "expire_label": "Scadenza", + "expire_placeholder": "Scegli scadenza", + "name_hint": "Opzionale · Max 32 caratteri", + "name_label": "Nome", + "name_placeholder": "Dai un nome breve al token" + }, + "schema": { + "expire_int": "Deve essere un numero intero", + "expire_number": "Deve essere un numero", + "expire_positive": "Deve essere maggiore di 0", + "name_max": "Max 32 caratteri" + }, + "toast": { + "create_failed_title": "Creazione fallita", + "create_success_desc": "Token di accesso creato con successo.", + "create_success_title": "Token creato", + "update_failed_title": "Aggiornamento fallito", + "update_success_desc": "Token di accesso aggiornato con successo.", + "update_success_title": "Token aggiornato" + } + }, + "tokens_action": { + "buttons": { + "add": "Aggiungi token" + }, + "delete_dialog": { + "description": "Questa azione è irreversibile.", + "title": "Eliminare il token di accesso?" + }, + "dialog": { + "description": "Gestisci i token API per questo utente.", + "title": "Token API" + }, + "empty": { + "description": "Questo utente non ha token API al momento.", + "title": "Nessun token API" + }, + "list": { + "button_delete": "Elimina token", + "expires_on_brief": "Scade il {{date}}", + "label_created": "Creato il", + "label_expires_at": "Scadenza", + "label_last_used": "Ultimo uso", + "label_token": "Token", + "never": "Mai", + "never_expires": "Non scade mai", + "status_active": "Attivo", + "status_expired": "Scaduto", + "unnamed_token": "Token senza nome" + } + } + }, + "validation": { + "emailRequired": "L'email è obbligatoria", + "folderLimitMustBeAtLeast100": "Il limite di cartelle deve essere almeno 100", + "folderLimitMustBeNumber": "Il limite di cartelle deve essere un numero", + "imapHostCannotBeEmpty": "L'host IMAP non può essere vuoto", + "imapHostRequired": "L'host IMAP è obbligatorio", + "imapPortMustBeLessThan65536": "La porta IMAP deve essere inferiore a 65536", + "imapPortMustBePositive": "La porta IMAP deve essere un numero intero positivo", + "incrementalSyncMustBeAtLeast10": "L'intervallo di sincronizzazione incrementale deve essere di almeno 10 minuti", + "incrementalSyncMustBeNumber": "L'intervallo di sincronizzazione incrementale deve essere un numero", + "invalidEmail": "Indirizzo email non valido", + "invalidUrl": "URL non valido", + "passwordMinLength": "La password deve contenere almeno {{min}} caratteri", + "passwordRequired": "La password è obbligatoria quando il metodo di autenticazione è Password", + "pleaseEnterPassword": "Inserisci la tua password", + "pleaseEnterUsernameOrEmail": "Inserisci il tuo nome utente o email", + "required": "Questo campo è obbligatorio", + "singleRequestBatchSizeMustBeNumber": "La dimensione del batch deve essere un numero", + "singleRequestBatchSizeTooLarge": "La dimensione del batch deve essere al massimo 200", + "singleRequestBatchSizeTooSmall": "La dimensione del batch deve essere almeno 10" + } } \ No newline at end of file diff --git a/web/src/locales/jp.json b/web/src/locales/jp.json index ba4eb23..b8ad565 100644 --- a/web/src/locales/jp.json +++ b/web/src/locales/jp.json @@ -1,1614 +1,1630 @@ { - "common": { - "submit": "送信", + "accessTokens": { + "aListOfIpAddressesAllowed": "リソースへのアクセスが許可されるIPアドレスのリスト。1行に1つのIPアドレスを入力してください。(オプション)", + "accountId": "アカウントID", + "accounts": "アカウント", + "aclRulesForAccessTokens": "アクセストークンのACLルールには、IPホワイトリスト検証とレート制限の適用が含まれます。", + "actions": { + "delete": "削除", + "edit": "編集", + "openMenu": "メニューを開く" + }, + "addNew": "新規追加", + "atLeastOneAccountIsRequired": "少なくとも1つのアカウントが必要です。", + "create": "作成", + "createNewAccessTokenHere": "こちらで新しいアクセストークンを作成してください。", + "created": "作成されました", + "createdAt": "作成日時", + "creating": "作成中...", + "creationFailed": "作成に失敗しました", + "delete": "削除", + "describeThePurposeOfTheAccessToken": "アクセストークンの目的を説明", + "description": "アクセストークン、アクセス制御、IPホワイトリスト、レート制限設定をここで管理します。", + "descriptionMustNotExceed255Characters": "説明は255文字を超えてはいけません。", + "edit": "編集", + "editToken": "トークンを編集", + "enterIntervalInSeconds": "間隔を秒単位で入力。例: 60", + "enterOneIpAddressPerLine": "1行に1つのIPアドレスを入力してください。例:\n192.168.1.1\n192.168.1.2", + "enterQuota": "クォータを入力。例: 100", + "expiresAt": "有効期限", + "filterByEmailAddressOrAccountId": "メールアドレスまたはアカウントIDでフィルター...", + "interval": "間隔", + "intervalMustBeAPositiveInteger": "間隔は正の整数である必要があります。", + "invalidIpAddressesFound": "無効なIPアドレスが見つかりました。有効なIPv4またはIPv6アドレスを入力してください。", + "name": "名前", + "noTokens": "アクセストークンなし", + "noTokensDesc": "まだアクセストークンを作成していません。API機能を利用するには作成してください。", + "notUsedYet": "まだ使用されていません", + "quota": "クォータ", + "quotaMustBeAPositiveInteger": "クォータは正の整数である必要があります。", + "save": "保存", + "saveChanges": "変更を保存", + "saving": "保存中...", + "selectAccounts": "アカウントを選択", + "selectMultipleAccountsForTheAccessToken": "アクセストークンの認証スコープとなる複数のアカウントを選択してください。", + "theListOfAccountsThatCanBeQueried": "アクセストークンを使用してクエリできるアカウントのリスト。", + "theMaximumNumberOfRequestsAllowed": "間隔内で許可される最大リクエスト数。(オプション)", + "theTimeWindowForTheRateLimit": "レート制限の時間枠(秒単位)。(オプション)", + "title": "アクセストークン", + "token": "トークン", + "updateFailed": "更新に失敗しました", + "updateOrCreationFailed": "{{action}}に失敗しました。しばらくしてからもう一度お試しください", + "updateTheAccessTokenHere": "こちらでアクセストークンを更新してください。", + "updated": "更新されました", + "updating": "更新中...", + "yourAccessTokenHasBeenSuccessfully": "アクセストークンは正常に{{action}}されました。" + }, + "accounts": { + "accessControl": "アクセス制御", + "accessTokenCopiedToClipboard": "アクセストークンをクリップボードにコピーしました", + "access_control": { + "buttons": { "cancel": "キャンセル", - "save": "保存", - "save_changes": "変更を保存", - "delete": "削除", - "edit": "編集", - "search": "検索", - "add": "追加", - "remove": "削除", - "create": "作成", - "update": "更新", - "confirm": "確認", + "save": "割り当てを保存" + }, + "description": "{{email}} にロールと権限ユーザーを割り当てます", + "role_label": "アクセスロール", + "role_loading": "ロールを読み込み中...", + "role_placeholder": "ロールを選択", + "title": "アカウントアクセス割り当て", + "toast": { + "failed_title": "割り当て失敗", + "success_desc": "{{email}} に権限が正常に割り当てられました", + "success_title": "割り当て完了" + }, + "user_empty": "ユーザーが見つかりません", + "user_label": "権限ユーザーを選択", + "user_search_placeholder": "ユーザー名またはメールで検索...", + "user_selected_count": "選択済み: {{count}} 名", + "validation": { + "role_required": "割り当てるロールを選択してください", + "user_required": "少なくとも1人のユーザーを選択してください" + } + }, + "accountCreated": "アカウントが作成されました", + "accountCreatedDesc": "アカウントが正常に作成されました。", + "accountCreationFailed": "アカウントの作成に失敗しました", + "accountDetails": "アカウント詳細", + "accountHasBeenSuccessfully": "アカウントは正常に{{action}}されました", + "accountSyncFoldersUpdateFailed": "アカウント同期フォルダーの更新に失敗しました", + "accountSyncFoldersUpdated": "アカウント同期フォルダーが更新されました", + "accountUpdateFailed": "アカウントの更新に失敗しました", + "accountUpdated": "アカウントが更新されました", + "accountUpdatedDesc": "アカウントが正常に更新されました。", + "actions": "アクション", + "addAccount": "アカウントを追加", + "addConfiguration": "設定を追加", + "addImap": "IMAPアカウントを追加", + "addNewEmailAccountHere": "こちらで新しいメールアカウントを追加してください。", + "addNoSync": "非同期アカウントを追加", + "allMailFolderSelected": "ご注意: 「すべてのメール」フォルダーが選択されています", + "allMailFolderSelectedDesc": "「すべてのメール」属性を持つフォルダーを選択すると、受信トレイや送信済みなどのフォルダーからすでに同期されているメッセージが重複する可能性があります。これにより、ストレージ容量が大幅に消費される可能性があります。", + "allMailSkipped": "標準フォルダーが選択されました。「すべてのメール」は重複を避けるためにスキップされました。", + "areYouSureYouWantTo": "本当にこのアカウントを{{action}}しますか?", + "auth": "認証", + "authType": "認証タイプ", + "autoConfiguring": "自動設定中...", + "beforeRelative": "古いメールのみダウンロード", + "beforeRelativeValue": "{{value}} {{unit}}前より古いメールをダウンロード", + "capabilities": "機能", + "chooseAuthMethod": "IMAPの認証方式を選択してください。", + "chooseEncryptionMethod": "IMAPの暗号化方式を選択してください。", + "chooseMailboxesToDownload": "{{email}} のダウンロード対象メールボックスを選択してください。新しく追加されたメールボックスは次回のサイクルでダウンロードされます。", + "clickHere": "こちらをクリック", + "clickSaveWhenDone": "完了したら「保存」をクリックしてください。", + "continue": "続行", + "createdAt": "作成日時", + "creationFailed": "作成に失敗しました。しばらくしてからもう一度お試しください。", + "dateSelection": "日付選択", + "dateSince": "同期開始日", + "days": "日", + "delete": "削除", + "description": "メールアカウントを管理・設定します。", + "detail": "詳細", + "detailsOfTheOAuth2TokensForTheAccount": "このアカウントのOAuth2トークンの詳細。", + "determinesWhetherThisAccountIsActiveNoSync": "このアカウントが有効かどうかを判定します。無効の場合、データをインポートできません。", + "disable": "無効化", + "disableAccount": "アカウントを無効化", + "disabled": "無効", + "downloadAll": "すべてのメールをダウンロード", + "downloadBatchSize": "ダウンロードバッチサイズ", + "downloadBatchSizeDescription": "IMAPリクエストごとに取得されるメッセージ数", + "downloadInterval": "ダウンロード間隔 (分)", + "downloadIntervalPlaceholder": "分を入力してください", + "downloadScope": "ダウンロード戦略", + "downloadScopeDescription": "インデックスとダウンロードの対象となるメールを選択してください。", + "duration": "期間", + "edit": "編集", + "email": "メールアドレス", + "emailAccountRegistration": "メールアカウント登録", + "emailAccountRegistrationDesc": "メールアドレスを入力してください。次のステップで IMAP の詳細を設定します。このアドレスを使用して IMAP サーバー設定を自動検出します。", + "emailAddress": "メールアドレス", + "emailCannotBeModified": "編集時にはメールアカウントアドレスは変更できません。", + "emailPlaceholder": "例: john.doe@example.com", + "enable": "有効化", + "enableAccount": "アカウントを有効化", + "enabled": "有効", + "enabledDescription": "このアカウントが有効かどうかを決定します。無効にすると、関連するダウンロードは実行されません。", + "encryption": "暗号化", + "enterPassword": "パスワードを入力してください", + "enterValue": "値を入力してください", + "everyMinutes": "{{minutes}}分ごと", + "field": "フィールド", + "fixed": "固定", + "folderLimit": "フォルダーの制限", + "folderLimitDescription": "フォルダーごとに同期するメールの数を制限します(最小100)。制限なしにする場合は空欄にしてください。", + "folderLimitPlaceholder": "例: 1000", + "folderSync": { + "autoSelectDescendants": "子項目を自動選択", + "autoSelectParents": "親項目を自動選択", + "batches": "バッチ", + "collapseAll": "すべて折りたたむ", + "expandAll": "すべて展開", + "loadingMailboxFolders": "メールボックスフォルダーを読み込み中…", + "noData": "データなし", + "noFolders": "同期するフォルダーがありません" + }, + "foldersConfiguredForSync": "同期用に設定されたフォルダー: {{count}}件", + "foldersSelected": "選択されたフォルダー: {{count}}件", + "goBack": "戻る", + "host": "ホスト", + "id": "ID", + "imap": "IMAP", + "imapAuthMethod": "IMAP認証方式", + "imapEncryption": "IMAP暗号化", + "imapHost": "IMAPホスト", + "imapHostPlaceholder": "例: imap.example.com", + "imapPassword": "IMAPパスワード", + "imapPort": "IMAPポート", + "imapPortPlaceholder": "例: 993", + "imapProxy": "IMAP接続にSOCKS5プロキシを使用します。", + "incSync": "増分同期", + "lastSync": "最終同期", + "leaveEmptyToKeepExisting": "既存のパスワードを保持する場合は空欄にしてください。更新する場合は新しいパスワードを入力してください。", + "leaveEmptyToKeepPassword": "現在のパスワードを保持する場合は空欄にしてください", + "login_name": "ログイン名", + "minutes": "分", + "months": "月", + "moreAccountTypes": "他のアカウントタイプ", + "mustBeAtLeast1": "1以上である必要があります", + "name": "名前", + "nameDescription": "IMAPユーザー名。通常はメールアドレスですが、変更も可能です。", + "namePlaceholder": "例: john.doe", + "noAccountConfigurations": "アカウント設定がありません", + "noAccountConfigurationsDesc": "まだアカウント設定を追加していません。機能を利用するには設定を追加してください。", + "noOAuth2Tokens": "OAuth2トークンなし", + "none": "なし", + "notAvailable": "N/A", + "oauth2Tokens": "OAuth2トークン", + "openMenu": "メニューを開く", + "optional": "オプション", + "owner": "作成者", + "password": "パスワード", + "port": "ポート", + "recent": "最近", + "refreshToken": "リフレッシュトークン", + "refreshTokenCopiedToClipboard": "リフレッシュトークンをクリップボードにコピーしました", + "relative": "相対", + "runningState": { + "account": { + "id": "アカウントID" + }, + "common": { "close": "閉じる", - "yes": "はい", - "no": "いいえ", - "ok": "OK", - "loading": "読み込み中...", - "empty": "空", - "noData": "データなし", - "table": { - "noResults": "結果が見つかりません。" - }, - "failed": "失敗", - "notFound": "見つかりません", - "back": "戻る", - "goBack": "戻る", - "backToHome": "ホームに戻る", - "tryAgain": "再試行", - "more": "詳細", - "actions": "操作", - "filter": "フィルター", - "reset": "リセット", - "clear": "クリア", - "error": "エラー", - "apply": "適用", - "select": "選択", - "selectAll": "すべて選択", - "deselectAll": "選択を解除", - "all": "すべて", - "none": "なし", - "showLess": "表示を減らす", - "showMore": "もっと見る...", - "project_description": "Bichonはオープンソースプロジェクトです。", - "view_on_github_button": "GitHubで表示", - "op_failed": "操作に失敗しました", - "na": "なし", - "retry": "再試行", - "deleting": "削除中..." + "folders": "メールボックス" + }, + "empty": { + "no_active_download": "現在ダウンロード中のタスクはありません", + "no_errors_current": "現在のタスクにエラーはありません", + "no_errors_session": "このタスクにエラーはありません", + "no_global_errors": "全体エラーはありません", + "no_history": "履歴がありません" + }, + "folders": "メールボックス", + "latest": "最新", + "loading": { + "fetching_account_state": "アカウント状態を取得中..." + }, + "message": "メッセージ", + "session": { + "started_at": "開始時刻", + "status": "状態", + "trigger": "トリガー" + }, + "tabs": { + "active_session": "実行中タスク", + "errors": "エラー", + "folders": "メールボックス", + "global_errors": "全体エラー", + "history": "履歴" + } }, - "navigation": { - "home": "ホーム", - "settings": "設定", - "accounts": "アカウント", - "dashboard": "ダッシュボード", - "mailbox": "メールボックス", - "oauth2": "OAuth2", - "accessTokens": "アクセストークン", - "apiDocs": "APIドキュメント", - "general": "一般", - "auth": "認証", - "other": "その他", - "users": "システムユーザー" + "saveChanges": "変更を保存", + "selectAtLeastOneFolder": "少なくとも1つのフォルダーを選択してください", + "selectAuthMethod": "認証方式を選択", + "selectDate": "日付を選択", + "selectEncryptionMethod": "暗号化方式を選択", + "selectMailboxes": "メールボックスを選択", + "selectMode": "フィルターモードを選択", + "selectProxy": "プロキシを選択", + "selectUnit": "単位を選択", + "selectedMailboxes": "選択されたメールボックス", + "serverConfiguration": "サーバー設定 (IMAP)", + "since": "以降", + "sinceFixed": "指定した日付以降", + "sinceRelative": "最近のメールのみダウンロード", + "sinceRelativeValue": "直近の期間のメールをダウンロード", + "state": "状態", + "status": "ステータス", + "step": "ステップ {{index}}", + "steps": { + "complete": "完了", + "emailAddress": "メールアドレス", + "imap": "IMAP", + "summary": "概要", + "syncPreferences": "同期設定" }, - "auth": { - "welcome": "Bichon へようこそ", - "username": "ユーザー名", - "password": "パスワード", - "login": "ログイン", - "loginFailed": "ログインに失敗しました", - "invalidPassword": "パスワードが無効です。もう一度お試しください。", - "somethingWentWrong": "問題が発生しました", - "sessionExpired": "セッションの有効期限が切れました!", - "sessionExpiredDesc": "操作がないためセッションが終了しました。継続するには再度ログインしてください。", - "logout": "ログアウト", - "areYouSureYouWantToLogOut": "ログアウトしてもよろしいですか?", - "youWillNeedToLogInAgain": "アカウントにアクセスするには、再度ログインする必要があります。" + "submit": "送信", + "syncAfterDate": "設定された日付以降のデータを同期する", + "syncRecentData": "同期日付を時間とともにずらし、最近のデータのみを同期する", + "syncStartDateDescription": "同期開始日を定義します(特定の日付または現在からの相対的な日付)。この日付より前のメールは除外されます。{{fixedPart}}。", + "theAccountHasNotCompletedTheAuthorizationProcess": "このアカウントは認証プロセスを完了していません。", + "thisAccountIsUsedForIdentificationPurposesOnly": "このアカウントは識別目的でのみ使用され、メールサーバーとの同期は必要ありません。メールデータのインポートに役立ちます。", + "thisWillPreventTheAccountFromBeingUsed": "このアカウントはIMAPサーバーからのデータ同期を行わなくなりますが、既存のデータは引き続き参照可能です。", + "title": "メールアカウント", + "toAuthorizeTheAccount": "してアカウントを認証してください。", + "type": "タイプ", + "unit": "単位", + "updateAccount": "アカウントを更新", + "updateFailed": "更新に失敗しました。しばらくしてからもう一度お試しください。", + "updateTheEmailAccountHere": "こちらでメールアカウントを更新してください。", + "updatedAt": "更新日時", + "useDangerous": "任意の TLS 証明書を信頼する", + "useDangerousDescription": "このオプションを有効にすると、公開 CA または自己署名証明書を使用している IMAP サーバーに対して、システムが証明書を認識していない場合でも接続できます。ただし、標準の証明書検証をバイパスするため、中間者攻撃 (MITM) のリスクがあり — リスクを理解した上でのみ有効にしてください。", + "useNoProxy": "プロキシなし", + "useProxy": "プロキシを使用", + "useProxyField": "プロキシを使用", + "value": "値", + "viewDetails": "詳細を見る", + "years": "年" + }, + "apiDocs": { + "choosePreferredType": "ご希望のAPIドキュメントタイプを選択してください", + "downloadSpecYAML": "仕様YAMLをダウンロード", + "openAPIExplorer": "OpenAPI Explorer", + "reDoc": "ReDoc", + "scalar": "Scalar", + "swaggerUI": "Swagger UI" + }, + "apiTokens": { + "deleteDialog": { + "cancel": "キャンセル", + "confirm": "削除", + "deleting": "削除中...", + "description": "この操作は取り消せません。このトークンを使用しているアプリケーションは直ちにアクセスできなくなります。", + "title": "アクセストークンを削除しますか?" }, - "errors": { - "pageNotFound": "おっと!ページが見つかりません!", - "pageNotFoundDesc": "お探しのページは存在しないか、削除された可能性があります。", - "somethingWentWrong": "おっと!問題が発生しました :')", - "somethingWentWrongDesc": "ご不便をおかけして申し訳ございません。しばらくしてからもう一度お試しください。", - "internalServerError": "内部サーバーエラー!", - "contentNotModified": "コンテンツは変更されていません!", - "networkError": "ネットワークエラー", - "networkErrorDesc": "サーバーに接続できません。インターネット接続を確認し、再試行してください。", - "forbidden": "禁止されています", - "forbiddenTitle": "アクセス禁止", - "forbiddenDesc": "このリソースを閲覧するために必要な権限がありません。", - "unauthorized": "未承認", - "unauthorizedTitle": "不正アクセス", - "unauthorizedDesc": "このリソースにアクセスするには、適切な資格情報でログインしてください。", - "maintenance": "メンテナンス", - "maintenanceTitle": "ウェブサイトはメンテナンス中です!", - "maintenanceDesc": "現在サイトはご利用いただけません。まもなく再開いたします。", - "learnMore": "詳細を見る" + "dialog": { + "createTitle": "アクセストークンの作成", + "description": "完了したら保存をクリックしてください。", + "editTitle": "アクセストークンの編集", + "save": "保存", + "saveChanges": "変更を保存" }, - "dashboard": { - "title": "ダッシュボード", - "mailAccounts": "メールアカウント", - "connected": "接続済み", - "totalEmails": "合計メール数", - "syncedLocally": "ローカル同期済み", - "totalEmailSize": "メール総容量", - "logicalVolume": "元のサイズ", - "localDataFiles": "ローカルデータファイル", - "actualDiskUsage": "実際のディスク使用量", - "efficiency": "圧縮効率", - "saved": "節約済み", - "dataStorage": "データストレージ", - "indexSize": "インデックスサイズ", - "metadataSize": "メタデータサイズ", - "tantivyDatabase": "Tantivy 検索エンジンを搭載", - "dayTrend": "30日間トレンド", - "attachments": "添付ファイル", - "topLists": "トップリスト", - "newEmails": "新規メール", - "messageDistribution": "メッセージ分布", - "attachmentRatio": "添付ファイル比率", - "attachmentRatioDesc": "メールの{{percent}}%に添付ファイルがあります", - "noEmailsSynced": "まだメールが同期されていません", - "withAttachments": "添付ファイルあり", - "noAttachments": "添付ファイルなし", - "top10Senders": "送信者トップ10", - "byMessageCount": "メッセージ数順", - "sender": "送信者", - "count": "件数", - "top10LargestEmails": "容量の大きいメールトップ10", - "byMessageSize": "メッセージサイズ順", - "subject": "件名", - "size": "サイズ", - "noSubject": "(件名なし)", - "top10Accounts": "アカウントトップ10", - "emails": "メール", - "account": "アカウント", - "noRecentActivity": "最近のアクティビティなし", - "noSendersData": "送信者データなし", - "noLargeEmails": "サイズの大きいメールなし", - "noAccountData": "アカウントデータなし", - "systemVersion": "システムバージョン" + "form": { + "1day": "1日", + "30days": "30日間", + "7days": "7日間", + "errorInt": "整数である必要があります", + "errorMax": "最大32文字まで", + "errorNumber": "数値である必要があります", + "errorPositive": "0より大きい必要があります", + "expirationDescription": "トークンは選択した期間後に自動的に期限切れになります。", + "expirationLabel": "有効期限", + "expirationPlaceholder": "期限を選択", + "nameDescription": "任意 · 最大32文字", + "nameLabel": "名前", + "namePlaceholder": "トークンの短い名前を入力してください", + "never": "無期限" }, - "accounts": { - "beforeRelativeValue": "{{value}} {{unit}}前より古いメールをダウンロード", - "sinceRelativeValue": "直近の期間のメールをダウンロード", - "downloadBatchSize": "ダウンロードバッチサイズ", - "downloadBatchSizeDescription": "IMAPリクエストごとに取得されるメッセージ数", - "downloadScopeDescription": "インデックスとダウンロードの対象となるメールを選択してください。", - "downloadScope": "ダウンロード戦略", - "selectMode": "フィルターモードを選択", - "downloadAll": "すべてのメールをダウンロード", - "sinceFixed": "指定した日付以降", - "sinceRelative": "最近のメールのみダウンロード", - "beforeRelative": "古いメールのみダウンロード", - "duration": "期間", - "unit": "単位", - "accessControl": "アクセス制御", - "owner": "作成者", - "access_control": { - "title": "アカウントアクセス割り当て", - "description": "{{email}} にロールと権限ユーザーを割り当てます", - "role_label": "アクセスロール", - "role_placeholder": "ロールを選択", - "role_loading": "ロールを読み込み中...", - "user_label": "権限ユーザーを選択", - "user_search_placeholder": "ユーザー名またはメールで検索...", - "user_empty": "ユーザーが見つかりません", - "user_selected_count": "選択済み: {{count}} 名", - "buttons": { - "cancel": "キャンセル", - "save": "割り当てを保存" - }, - "validation": { - "user_required": "少なくとも1人のユーザーを選択してください", - "role_required": "割り当てるロールを選択してください" - }, - "toast": { - "success_title": "割り当て完了", - "success_desc": "{{email}} に権限が正常に割り当てられました", - "failed_title": "割り当て失敗" - } - }, - "title": "メールアカウント", - "description": "メールアカウントを管理・設定します。", - "addImap": "IMAPアカウントを追加", - "addNoSync": "非同期アカウントを追加", - "moreAccountTypes": "他のアカウントタイプ", - "noAccountConfigurations": "アカウント設定がありません", - "noAccountConfigurationsDesc": "まだアカウント設定を追加していません。機能を利用するには設定を追加してください。", - "addConfiguration": "設定を追加", - "useNoProxy": "プロキシなし", - "login_name": "ログイン名", - "name": "名前", - "email": "メールアドレス", - "status": "ステータス", - "type": "タイプ", - "lastSync": "最終同期", - "actions": "アクション", - "edit": "編集", - "delete": "削除", - "detail": "詳細", - "selectMailboxes": "メールボックスを選択", - "oauth2Tokens": "OAuth2トークン", - "id": "ID", - "enabled": "有効", - "auth": "認証", - "incSync": "増分同期", - "state": "状態", - "createdAt": "作成日時", - "updatedAt": "更新日時", - "openMenu": "メニューを開く", - "emailAccountRegistration": "メールアカウント登録", - "emailAccountRegistrationDesc": "メールアドレスを入力してください。次のステップで IMAP の詳細を設定します。このアドレスを使用して IMAP サーバー設定を自動検出します。", - "emailAddress": "メールアドレス", - "emailPlaceholder": "例: john.doe@example.com", - "namePlaceholder": "例: john.doe", - "optional": "オプション", - "nameDescription": "IMAPユーザー名。通常はメールアドレスですが、変更も可能です。", - "emailCannotBeModified": "編集時にはメールアカウントアドレスは変更できません。", - "addAccount": "アカウントを追加", - "updateAccount": "アカウントを更新", - "accountUpdated": "アカウントが更新されました", - "accountCreated": "アカウントが作成されました", - "accountUpdatedDesc": "アカウントが正常に更新されました。", - "accountCreatedDesc": "アカウントが正常に作成されました。", - "accountUpdateFailed": "アカウントの更新に失敗しました", - "accountCreationFailed": "アカウントの作成に失敗しました", - "updateFailed": "更新に失敗しました。しばらくしてからもう一度お試しください。", - "creationFailed": "作成に失敗しました。しばらくしてからもう一度お試しください。", - "allMailFolderSelected": "ご注意: 「すべてのメール」フォルダーが選択されています", - "accountSyncFoldersUpdated": "アカウント同期フォルダーが更新されました", - "accountSyncFoldersUpdateFailed": "アカウント同期フォルダーの更新に失敗しました", - "serverConfiguration": "サーバー設定 (IMAP)", - "selectedMailboxes": "選択されたメールボックス", - "allMailFolderSelectedDesc": "「すべてのメール」属性を持つフォルダーを選択すると、受信トレイや送信済みなどのフォルダーからすでに同期されているメッセージが重複する可能性があります。これにより、ストレージ容量が大幅に消費される可能性があります。", - "allMailSkipped": "標準フォルダーが選択されました。「すべてのメール」は重複を避けるためにスキップされました。", - "selectAtLeastOneFolder": "少なくとも1つのフォルダーを選択してください", - "chooseMailboxesToDownload": "{{email}} のダウンロード対象メールボックスを選択してください。新しく追加されたメールボックスは次回のサイクルでダウンロードされます。", - "accountDetails": "アカウント詳細", - "capabilities": "機能", - "folderLimit": "フォルダーの制限", - "everyMinutes": "{{minutes}}分ごと", - "foldersConfiguredForSync": "同期用に設定されたフォルダー: {{count}}件", - "foldersSelected": "選択されたフォルダー: {{count}}件", - "imapHost": "IMAPホスト", - "imapHostPlaceholder": "例: imap.example.com", - "imapPort": "IMAPポート", - "imapPortPlaceholder": "例: 993", - "imapEncryption": "IMAP暗号化", - "selectEncryptionMethod": "暗号化方式を選択", - "chooseEncryptionMethod": "IMAPの暗号化方式を選択してください。", - "imapAuthMethod": "IMAP認証方式", - "selectAuthMethod": "認証方式を選択", - "chooseAuthMethod": "IMAPの認証方式を選択してください。", - "imapPassword": "IMAPパスワード", - "leaveEmptyToKeepPassword": "現在のパスワードを保持する場合は空欄にしてください", - "enterPassword": "パスワードを入力してください", - "leaveEmptyToKeepExisting": "既存のパスワードを保持する場合は空欄にしてください。更新する場合は新しいパスワードを入力してください。", - "useProxy": "プロキシを使用", - "selectProxy": "プロキシを選択", - "downloadInterval": "ダウンロード間隔 (分)", - "downloadIntervalPlaceholder": "分を入力してください", - "enabledDescription": "このアカウントが有効かどうかを決定します。無効にすると、関連するダウンロードは実行されません。", - "dateSince": "同期開始日", - "none": "なし", - "fixed": "固定", - "relative": "相対", - "selectDate": "日付を選択", - "selectUnit": "単位を選択", - "days": "日", - "months": "月", - "years": "年", - "enterValue": "値を入力してください", - "mustBeAtLeast1": "1以上である必要があります", - "dateSelection": "日付選択", - "since": "以降", - "recent": "最近", - "notAvailable": "N/A", - "host": "ホスト", - "port": "ポート", - "encryption": "暗号化", - "authType": "認証タイプ", - "password": "パスワード", - "useProxyField": "プロキシを使用", - "clickSaveWhenDone": "完了したら「保存」をクリックしてください。", - "step": "ステップ {{index}}", - "goBack": "戻る", - "autoConfiguring": "自動設定中...", - "continue": "続行", - "saveChanges": "変更を保存", - "submit": "送信", - "field": "フィールド", - "value": "値", - "refreshToken": "リフレッシュトークン", - "accessTokenCopiedToClipboard": "アクセストークンをクリップボードにコピーしました", - "refreshTokenCopiedToClipboard": "リフレッシュトークンをクリップボードにコピーしました", - "noOAuth2Tokens": "OAuth2トークンなし", - "theAccountHasNotCompletedTheAuthorizationProcess": "このアカウントは認証プロセスを完了していません。", - "clickHere": "こちらをクリック", - "toAuthorizeTheAccount": "してアカウントを認証してください。", - "detailsOfTheOAuth2TokensForTheAccount": "このアカウントのOAuth2トークンの詳細。", - "updateTheEmailAccountHere": "こちらでメールアカウントを更新してください。", - "addNewEmailAccountHere": "こちらで新しいメールアカウントを追加してください。", - "thisAccountIsUsedForIdentificationPurposesOnly": "このアカウントは識別目的でのみ使用され、メールサーバーとの同期は必要ありません。メールデータのインポートに役立ちます。", - "determinesWhetherThisAccountIsActiveNoSync": "このアカウントが有効かどうかを判定します。無効の場合、データをインポートできません。", - "folderSync": { - "noData": "データなし", - "noFolders": "同期するフォルダーがありません", - "batches": "バッチ", - "autoSelectDescendants": "子項目を自動選択", - "autoSelectParents": "親項目を自動選択", - "expandAll": "すべて展開", - "collapseAll": "すべて折りたたむ", - "loadingMailboxFolders": "メールボックスフォルダーを読み込み中…" - }, - "viewDetails": "詳細を見る", - "runningState": { - "message": "メッセージ", - "account": { - "id": "アカウントID" - }, - "tabs": { - "active_session": "実行中タスク", - "history": "履歴", - "global_errors": "全体エラー", - "folders": "メールボックス", - "errors": "エラー" - }, - "loading": { - "fetching_account_state": "アカウント状態を取得中..." - }, - "empty": { - "no_active_download": "現在ダウンロード中のタスクはありません", - "no_errors_current": "現在のタスクにエラーはありません", - "no_errors_session": "このタスクにエラーはありません", - "no_global_errors": "全体エラーはありません", - "no_history": "履歴がありません" - }, - "session": { - "status": "状態", - "trigger": "トリガー", - "started_at": "開始時刻" - }, - "common": { - "folders": "メールボックス", - "close": "閉じる" - }, - "latest": "最新", - "folders": "メールボックス" - }, - "steps": { - "complete": "完了", - "emailAddress": "メールアドレス", - "imap": "IMAP", - "syncPreferences": "同期設定", - "summary": "概要" - }, - "imapProxy": "IMAP接続にSOCKS5プロキシを使用します。", - "syncStartDateDescription": "同期開始日を定義します(特定の日付または現在からの相対的な日付)。この日付より前のメールは除外されます。{{fixedPart}}。", - "syncAfterDate": "設定された日付以降のデータを同期する", - "syncRecentData": "同期日付を時間とともにずらし、最近のデータのみを同期する", - "folderLimitDescription": "フォルダーごとに同期するメールの数を制限します(最小100)。制限なしにする場合は空欄にしてください。", - "folderLimitPlaceholder": "例: 1000", - "imap": "IMAP", - "minutes": "分", - "accountHasBeenSuccessfully": "アカウントは正常に{{action}}されました", - "enableAccount": "アカウントを有効化", - "disableAccount": "アカウントを無効化", - "areYouSureYouWantTo": "本当にこのアカウントを{{action}}しますか?", - "enable": "有効化", - "disable": "無効化", - "thisWillPreventTheAccountFromBeingUsed": "このアカウントはIMAPサーバーからのデータ同期を行わなくなりますが、既存のデータは引き続き参照可能です。", - "disabled": "無効", - "useDangerous": "任意の TLS 証明書を信頼する", - "useDangerousDescription": "このオプションを有効にすると、公開 CA または自己署名証明書を使用している IMAP サーバーに対して、システムが証明書を認識していない場合でも接続できます。ただし、標準の証明書検証をバイパスするため、中間者攻撃 (MITM) のリスクがあり — リスクを理解した上でのみ有効にしてください。" + "list": { + "createdLabel": "作成日", + "deleteBtn": "トークンを削除", + "expiresOnLabel": "有効期限", + "expiresOnShort": "有効期限: {{date}}", + "lastUsedLabel": "最終使用日", + "neverExpires": "無期限", + "neverLabel": "なし", + "neverUsed": "未使用", + "statusActive": "有効", + "statusExpired": "期限切れ", + "tokenLabel": "トークン", + "unnamedToken": "無名のトークン" }, - "mailbox": { - "deleteMailboxDialog": { - "title": "メールボックスフォルダの削除", - "desc": "このメールボックスフォルダを削除してもよろしいですか?この操作は取り消せません。", - "warningTitle": "警告", - "warningDesc": "このフォルダを削除すると、その中に含まれるすべてのアーカイブメールとサブフォルダも永久に削除されます。", - "confirm": "永久に削除", - "successTitle": "削除完了", - "successDesc": "メールボックスフォルダとその内容が正常に削除されました。", - "errorTitle": "削除失敗" - }, - "title": "メールボックス", - "folders": "フォルダー", - "messages": "メッセージ", - "noMessages": "メッセージなし", - "selectFolder": "フォルダーを選択してメッセージを閲覧", - "deleteDialog": { - "title": "メールを削除", - "desc": "{{countText}}を削除してもよろしいですか?この操作により、選択したメールはローカルデータベースから削除されます。メールは完全に削除され、復元することはできません。", - "descCountSingle": "このメール", - "descCountMultiple": "これら{{count}}件のメール", - "warningTitle": "警告!", - "warningDesc": "続行する前にご注意ください。", - "confirm": "削除", - "successTitle": "メッセージが正常に削除されました", - "successDesc": "メッセージが削除されました。", - "errorTitle": "メッセージの削除に失敗しました" - }, - "thread": { - "title": "スレッド ({{count}}件の{{messageLabel}})", - "message": "メッセージ", - "messages": "メッセージ", - "noSubject": "(件名なし)", - "invalidDate": "無効な日付", - "empty": "このスレッドにメッセージはありません。", - "loadError": "スレッドの読み込みに失敗しました", - "loadingMore": "さらに読み込み中...", - "loadMore": "さらに読み込む" - }, - "bulkActions": { - "ariaLabel": "選択された{{count}}件の{{emailLabel}}に対する一括アクション", - "email": "メール", - "emails": "メール", - "selected": "選択済み", - "clearSelection": "選択を解除", - "clearSelectionWithKey": "選択を解除 ({{key}})", - "delete": "削除", - "deleteTooltip": "選択したメールを削除" - } + "notifications": { + "close": "閉じる", + "copied": "クリップボードにコピーしました", + "createFailed": "作成失敗", + "createSuccess": "アクセストークンを作成しました", + "createSuccessDesc": "アクセストークンが正常に作成されました。", + "deleteFailed": "削除に失敗しました", + "deleteSuccess": "トークンを削除しました", + "genericError": "操作に失敗しました。もう一度お試しください。", + "tryAgain": "再試行", + "updateFailed": "更新失敗", + "updateSuccess": "アクセストークンを更新しました", + "updateSuccessDesc": "アクセストークンが正常に更新されました。" }, - "search": { - "size": "サイズ", - "any": "指定なし", - "tiny": "極小(15 KB 未満)", - "small": "小(2 MB 未満)", - "medium": "中(2 - 10 MB)", - "large": "大(10 - 20 MB)", - "huge": "巨大 (≥20 MB)", - "sort": "並べ替え", - "sizeDescription": "サイズは添付ファイルを含むメール全体の容量を指します。", - "title": "検索", - "searching": "検索中です。お待ちください…", - "noEmailsFound": "メールが見つかりませんでした", - "startSearching": "キーワード、送信者、または高度なフィルターを使用して検索を開始してください。", - "adjustSearch": "検索条件を調整するか、フィルターをクリアしてみてください。", - "tagFilter": "タグフィルター", - "from": "送信元", - "to": "宛先", - "subject": "件名", - "date": "日付", - "editTag": "タグを編集", - "keyword": "キーワード", - "sender": "送信者", - "recipient": "受信者", - "hasAttachment": "添付ファイルあり", - "yes": "はい", - "no": "いいえ", - "dateRange": "日付範囲", - "startDate": "開始日", - "endDate": "終了日", - "advancedFilters": "高度なフィルター", - "searchArchivedEmails": "アーカイブされたメールを検索", - "fullTextMultiAccount": "全文検索・複数アカウント・高度なフィルター", - "account": "アカウント", - "mailbox": "メールボックス", - "selectAccount": "アカウントを選択", - "selectMailbox": "メールボックスを選択", - "noActiveEmailAccount": "有効なメールアカウントがありません。", - "addEmailAccount": "メールアカウントを追加", - "noMailboxSelectAccount": "メールボックスがありません。まずアカウントを選択してください。", - "searchInSubjectBody": "件名、本文、添付ファイル内を検索...", - "searchingButton": "検索中...", - "searchButton": "検索", - "advanced": "高度な設定", - "clear": "クリア", - "since": "以降:", - "before": "以前:", - "selectDate": "日付を選択", - "pleaseSelectAtLeastOne": "少なくとも1つの検索条件を選択してください", - "cc": "CC(写し)", - "bcc": "BCC(ブラインド写し)", - "attachmentName": "添付ファイル名", - "messageId": "メッセージID", - "minSize": "最小サイズ", - "maxSize": "最大サイズ", - "senderRecipients": "送信者 / 受信者", - "attachmentsSize": "添付ファイルとサイズ", - "minimumBytes": "最小", - "maximumBytes": "最大", - "originalMessageIdHeader": "元のメールのMessage-IDヘッダー", - "addTags": { - "title": "タグを編集", - "none": "タグが追加されていません", - "searchPlaceholder": "タグを検索または作成...", - "createHint": "新しいタグを作成: {{tag}}", - "invalidTitle": "無効なタグ", - "updatedTitle": "タグが更新されました", - "updatedDesc": "タグが正常に更新されました", - "updateFailedTitle": "更新に失敗しました", - "tryAgain": "しばらくしてからもう一度お試しください", - "selectedCount": "選択されたタグ: {{count}}件", - "cancel": "キャンセル", - "save": "保存", - "saving": "保存中..." - }, - "updateTags": { - "overwriteWarning": "警告:この操作により、選択した項目の既存のタグがすべて上書きされます。", - "title": "タグを更新", - "none": "タグが選択されていません", - "searchPlaceholder": "タグを検索または作成...", - "createHint": "Enterキーを押して新しいタグを作成:\"{{tag}}\"", - "selectedCount": "{{count}} 個のタグを適用します", - "cancel": "キャンセル", - "invalidTitle": "無効なタグ", - "updatedTitle": "タグを更新しました", - "updatedDesc": "タグが正常に更新されました。", - "updateFailedTitle": "更新に失敗しました", - "tryAgain": "後でもう一度お試しください。", - "actionAdd": "追加", - "actionRemove": "削除", - "actionOverwrite": "上書き", - "submitAdd": "タグを追加", - "submitRemove": "タグを削除", - "submitOverwrite": "タグを上書き", - "savingAdd": "追加中...", - "savingRemove": "削除中...", - "savingOverwrite": "上書き中..." - }, - "thread": { - "title": "スレッド · {{count}}件のメッセージ", - "error": "スレッドの読み込みに失敗しました", - "empty": "このスレッドにメッセージはありません", - "invalidDate": "無効な日付", - "noSubject": "(件名なし)", - "loadingMore": "読み込み中...", - "loadMore": "さらに読み込む" - }, - "bulkActions": { - "ariaLabel": "{{count}} 件のメッセージを選択中。一括操作ツールバー", - "delete": "削除", - "deleteDesc": "選択したメッセージを削除", - "selected": "{{count}} 件選択済み", - "clear": "選択を解除", - "manageTags": "タグを管理" - }, - "delete": { - "title": "メッセージを削除", - "confirmPrefix": "本当に", - "countLabel": "{{count}} 件のメッセージを削除しますか?", - "confirmDetail": "この操作は取り消しできません。", - "confirmButton": "削除", - "warningTitle": "警告", - "warningDesc": "削除されたメッセージは完全に削除され、復元することはできません。", - "successTitle": "削除完了", - "successDesc": "選択したメッセージは正常に削除されました。", - "errorTitle": "削除に失敗しました" - } + "page": { + "addBtn": "トークンを追加", + "emptyDescription": "APIトークンはまだ作成されていません。作成するには以下をクリックしてください。", + "emptyTitle": "APIトークンがありません", + "loadError": "APIトークンの読み込みに失敗しました。" + } + }, + "attachment": { + "all_fields_desc": "添付ファイル名、件名、送信者を照合", + "date": "日付", + "name": "ファイル名", + "search_input_placeholder": "添付ファイルを検索 (フレーズ検索は \" \" を使用)", + "sender": "送信者", + "sender_with_count": "送信者 ({{count}})", + "size": "ファイルサイズ", + "source": "ソース", + "subject": "件名" + }, + "auth": { + "areYouSureYouWantToLogOut": "ログアウトしてもよろしいですか?", + "invalidPassword": "パスワードが無効です。もう一度お試しください。", + "login": "ログイン", + "loginFailed": "ログインに失敗しました", + "logout": "ログアウト", + "password": "パスワード", + "sessionExpired": "セッションの有効期限が切れました!", + "sessionExpiredDesc": "操作がないためセッションが終了しました。継続するには再度ログインしてください。", + "somethingWentWrong": "問題が発生しました", + "username": "ユーザー名", + "welcome": "Bichon へようこそ", + "youWillNeedToLogInAgain": "アカウントにアクセスするには、再度ログインする必要があります。" + }, + "command": { + "dark": "ダーク", + "light": "ライト", + "noResultsFound": "結果が見つかりませんでした。", + "theme": "テーマ", + "typeCommandOrSearch": "コマンドを入力するか検索..." + }, + "common": { + "actions": "操作", + "add": "追加", + "all": "すべて", + "apply": "適用", + "back": "戻る", + "backToHome": "ホームに戻る", + "cancel": "キャンセル", + "clear": "クリア", + "close": "閉じる", + "confirm": "確認", + "create": "作成", + "delete": "削除", + "deleting": "削除中...", + "deselectAll": "選択を解除", + "edit": "編集", + "empty": "空", + "error": "エラー", + "failed": "失敗", + "filter": "フィルター", + "goBack": "戻る", + "loading": "読み込み中...", + "more": "詳細", + "na": "なし", + "no": "いいえ", + "noData": "データなし", + "none": "なし", + "notFound": "見つかりません", + "ok": "OK", + "op_failed": "操作に失敗しました", + "project_description": "Bichonはオープンソースプロジェクトです。", + "remove": "削除", + "reset": "リセット", + "retry": "再試行", + "save": "保存", + "save_changes": "変更を保存", + "search": "検索", + "select": "選択", + "selectAll": "すべて選択", + "showLess": "表示を減らす", + "showMore": "もっと見る...", + "submit": "送信", + "table": { + "noResults": "結果が見つかりません。" }, - "mail": { - "emailViewer": "メールビューア", - "noMessageSelected": "メッセージが選択されていません", - "account": "アカウント", - "from": "送信元", - "to": "宛先", - "subject": "件名", - "date": "日付", - "tags": "タグ", - "noTagsYet": "まだタグがありません", - "id": "ID", - "cc": "CC", - "bcc": "BCC", - "attachments": "添付ファイル", - "download": "ダウンロード", - "delete": "削除", - "viewThread": "スレッドを表示", - "downloadStarted": "ダウンロードを開始しました", - "downloadComplete": "ダウンロードが完了しました", - "downloadFailed": "ダウンロードに失敗しました", - "failedToDownloadFile": "ファイルのダウンロードに失敗しました", - "failedToLoadEmail": "メールメッセージの読み込みに失敗しました。", - "isBeingDownloaded": "{{id}}をダウンロード中です", - "downloaded": "{{id}}がダウンロードされました", - "showLess": "少なく表示", - "showMore": "さらに表示...", - "onlyNonInlineAttachments": "インラインではない添付ファイルのみここに表示されます。", - "noAttachments": "添付ファイルなし" + "tryAgain": "再試行", + "update": "更新", + "view_on_github_button": "GitHubで表示", + "yes": "はい" + }, + "dashboard": { + "account": "アカウント", + "actualDiskUsage": "実際のディスク使用量", + "attachmentRatio": "添付ファイル比率", + "attachmentRatioDesc": "メールの{{percent}}%に添付ファイルがあります", + "attachments": "添付ファイル", + "byMessageCount": "メッセージ数順", + "byMessageSize": "メッセージサイズ順", + "connected": "接続済み", + "count": "件数", + "dataStorage": "データストレージ", + "dayTrend": "30日間トレンド", + "efficiency": "圧縮効率", + "emails": "メール", + "indexSize": "インデックスサイズ", + "localDataFiles": "ローカルデータファイル", + "logicalVolume": "元のサイズ", + "mailAccounts": "メールアカウント", + "messageDistribution": "メッセージ分布", + "metadataSize": "メタデータサイズ", + "newEmails": "新規メール", + "noAccountData": "アカウントデータなし", + "noAttachments": "添付ファイルなし", + "noEmailsSynced": "まだメールが同期されていません", + "noLargeEmails": "サイズの大きいメールなし", + "noRecentActivity": "最近のアクティビティなし", + "noSendersData": "送信者データなし", + "noSubject": "(件名なし)", + "saved": "節約済み", + "sender": "送信者", + "size": "サイズ", + "subject": "件名", + "syncedLocally": "ローカル同期済み", + "systemVersion": "システムバージョン", + "tantivyDatabase": "Tantivy 検索エンジンを搭載", + "title": "ダッシュボード", + "top10Accounts": "アカウントトップ10", + "top10LargestEmails": "容量の大きいメールトップ10", + "top10Senders": "送信者トップ10", + "topLists": "トップリスト", + "totalEmailSize": "メール総容量", + "totalEmails": "合計メール数", + "withAttachments": "添付ファイルあり" + }, + "dialogs": { + "accountCredentials": "アカウントの資格情報と設定", + "accountDeleteFailed": "アカウントの削除に失敗しました", + "accountDeleted": "アカウントが削除されました", + "accountDeletedDesc": "アカウントが正常に削除されました。", + "allResourcesErased": "関連するすべてのリソースは完全に消去されます。", + "cannotBeUndone": "この操作は元に戻せません!", + "confirmDelete": "削除の確認", + "confirmDeleteDesc": "このアイテムを削除してもよろしいですか?この操作は元に戻せません。", + "continue": "続行", + "createFailed": "作成に失敗しました", + "createSuccess": "正常に作成されました", + "deleteAccountPermanently": "アカウントを完全に削除", + "deleteFailed": "削除に失敗しました", + "deleteSuccess": "正常に削除されました", + "deleting": "削除中...", + "imapSyncData": "IMAP同期データ", + "localCachedMetadata": "ローカルキャッシュされたメタデータと同期ステータス", + "oauthTokens": "OAuthトークンとAPI資格情報", + "permanentlyDeleteAccount": "アカウントを完全に削除", + "saveFailed": "保存に失敗しました", + "saveSuccess": "正常に保存されました", + "typeEmailToConfirm": "確認のため、アカウントのメールアドレスを入力してください:", + "typeToConfirm": "確認のため「{{email}}」と入力してください", + "updateFailed": "更新に失敗しました", + "updateSuccess": "正常に更新されました", + "youAreDeleting": "{{email}}を削除しています。これにより、以下が完全に削除されます:" + }, + "errors": { + "contentNotModified": "コンテンツは変更されていません!", + "forbidden": "禁止されています", + "forbiddenDesc": "このリソースを閲覧するために必要な権限がありません。", + "forbiddenTitle": "アクセス禁止", + "internalServerError": "内部サーバーエラー!", + "learnMore": "詳細を見る", + "maintenance": "メンテナンス", + "maintenanceDesc": "現在サイトはご利用いただけません。まもなく再開いたします。", + "maintenanceTitle": "ウェブサイトはメンテナンス中です!", + "networkError": "ネットワークエラー", + "networkErrorDesc": "サーバーに接続できません。インターネット接続を確認し、再試行してください。", + "pageNotFound": "おっと!ページが見つかりません!", + "pageNotFoundDesc": "お探しのページは存在しないか、削除された可能性があります。", + "somethingWentWrong": "おっと!問題が発生しました :')", + "somethingWentWrongDesc": "ご不便をおかけして申し訳ございません。しばらくしてからもう一度お試しください。", + "unauthorized": "未承認", + "unauthorizedDesc": "このリソースにアクセスするには、適切な資格情報でログインしてください。", + "unauthorizedTitle": "不正アクセス" + }, + "mail": { + "account": "アカウント", + "attachments": "添付ファイル", + "bcc": "BCC", + "cc": "CC", + "date": "日付", + "delete": "削除", + "download": "ダウンロード", + "downloadComplete": "ダウンロードが完了しました", + "downloadFailed": "ダウンロードに失敗しました", + "downloadStarted": "ダウンロードを開始しました", + "downloaded": "{{id}}がダウンロードされました", + "emailViewer": "メールビューア", + "failedToDownloadFile": "ファイルのダウンロードに失敗しました", + "failedToLoadEmail": "メールメッセージの読み込みに失敗しました。", + "from": "送信元", + "id": "ID", + "isBeingDownloaded": "{{id}}をダウンロード中です", + "noAttachments": "添付ファイルなし", + "noMessageSelected": "メッセージが選択されていません", + "noTagsYet": "まだタグがありません", + "onlyNonInlineAttachments": "インラインではない添付ファイルのみここに表示されます。", + "showLess": "少なく表示", + "showMore": "さらに表示...", + "subject": "件名", + "tags": "タグ", + "to": "宛先", + "viewThread": "スレッドを表示" + }, + "mailbox": { + "bulkActions": { + "ariaLabel": "選択された{{count}}件の{{emailLabel}}に対する一括アクション", + "clearSelection": "選択を解除", + "clearSelectionWithKey": "選択を解除 ({{key}})", + "delete": "削除", + "deleteTooltip": "選択したメールを削除", + "email": "メール", + "emails": "メール", + "selected": "選択済み" }, - "oauth2": { - "title": "OAuth2", - "addConfiguration": "設定を追加", - "id": "ID", - "provider": "プロバイダー", - "clientId": "クライアントID", - "clientSecret": "クライアントシークレット", - "redirectUri": "リダイレクトURI", - "scopes": "スコープ", - "status": "ステータス", - "enabled": "有効", - "disabled": "無効", - "edit": "編集", - "delete": "削除", - "enable": "有効にする", - "disable": "無効にする", - "noConfigurations": "OAuth2設定がありません", - "noConfigurationsDesc": "まだOAuth2設定を追加していません。機能を利用するには設定を追加してください。", - "description": "アクセストークンの取得、保存、更新を自動的に処理し、シームレスでいつでも利用可能な認証体験を保証します。", - "addNew": "新規追加", - "updateHere": "こちらで更新してください。", - "createNewHere": "こちらで新規作成してください。", - "clickSaveWhenDone": "完了したら「保存」をクリックしてください。", - "quickPresets": "クイックプリセット:", - "gmail": "Gmail", - "outlook": "Outlook", - "whenDisabled": "無効化された場合: - 新しい認証フローは直ちに拒否されます - 既存のアクセストークンとリフレッシュトークンは1分以内に取り消されます - 再度有効化された際、ユーザーは再認証する必要があります", - "clientIdLabel": "クライアントID:", - "enterYourClientId": "クライアントIDを入力", - "theUniqueIdentifierForYourApplication": "OAuthプロバイダーから提供される、アプリケーションの一意の識別子。", - "clientSecretLabel": "クライアントシークレット:", - "leaveEmptyToKeepExistingSecret": "既存のシークレットを保持する場合は空欄にしてください", - "enterYourClientSecret": "クライアントシークレットを入力", - "leaveEmptyToKeepTheExistingSecret": "既存のシークレットを保持する場合は空欄にしてください。変更する場合のみ新しい値を入力してください。", - "aSecretKeyProvidedByTheOAuthProvider": "OAuthプロバイダーから提供される、アプリケーションを認証するためのシークレットキー。", - "authUrlLabel": "認証URL:", - "enterTheAuthorizationUrl": "認証URLを入力", - "theUrlWhereUsersWillBeRedirected": "ユーザーが認証のためにリダイレクトされるURL。", - "tokenUrlLabel": "トークンURL:", - "enterTheTokenUrl": "トークンURLを入力", - "theUrlUsedToExchange": "認証コードをアクセストークンと交換するために使用されるURL。", - "redirectUrlLabel": "リダイレクトURL:", - "enterYourRedirectUrl": "リダイレクトURLを入力", - "theRedirectUrlAfterAuthorization": "認証後のリダイレクトURL。OAuthプロバイダーに登録されているものと一致している必要があります。http://[ホスト]:[ポート]/oauth2/callback (または https://) の形式を使用し、[ホスト]と[ポート]はRustMailerのデプロイメントと一致させてください。パス `/oauth2/callback` は固定です。", - "scope": "スコープ:", - "enterTheScopeHere": "ここにスコープを入力。", - "addScope": "スコープを追加", - "key": "キー:", - "enterTheKeyHere": "ここにキーを入力。", - "value": "値:", - "enterTheValueHere": "ここに値を入力。", - "addExtraParams": "追加パラメーターを追加", - "useProxyOptional": "プロキシを使用 (オプション):", - "selectAProxy": "プロキシを選択", - "noProxyAvailable": "利用可能なプロキシはありません", - "useSocks5ProxyForOAuthRequests": "直接アクセスがブロックされている場合、OAuthリクエストにSOCKS5プロキシを使用します。", - "descriptionLabel": "説明:", - "describeThePurposeOfTheOauth2Application": "OAuth2アプリケーションの目的を説明", - "optional": "オプション", - "saving": "保存中...", - "creating": "作成中...", - "saveChanges": "変更を保存", - "save": "保存", - "updated": "更新されました", - "created": "作成されました", - "yourOAuth2ApplicationHasBeenSuccessfully": "OAuth2アプリケーションは正常に{{action}}されました。", - "updateFailed": "更新に失敗しました", - "creationFailed": "作成に失敗しました", - "updateOrCreationFailed": "{{action}}に失敗しました。しばらくしてからもう一度お試しください", - "clientSecretIsRequired": "クライアントシークレットは必須です", - "clientSecretCannotBeEmpty": "クライアントシークレットは空にできません", - "keyIsRequired": "キーは必須です", - "keyCannotBeEmpty": "キーは空にできません", - "valueIsRequired": "値は必須です", - "valueCannotBeEmpty": "値は空にできません", - "descriptionMustNotExceed255Characters": "説明は255文字を超えてはいけません。", - "clientIdIsRequired": "クライアントIDは必須です", - "clientIdCannotBeEmpty": "クライアントIDは空にできません", - "authorizationUrlIsRequired": "認証URLは必須です", - "authorizationUrlCannotBeEmpty": "認証URLは空にできません", - "invalidAuthorizationUrlFormat": "認証URLの形式が無効です", - "tokenUrlIsRequired": "トークンURLは必須です", - "tokenUrlCannotBeEmpty": "トークンURLは空にできません", - "invalidTokenUrlFormat": "トークンURLの形式が無効です", - "redirectUriIsRequired": "リダイレクトURIは必須です", - "redirectUriCannotBeEmpty": "リダイレクトURIは空にできません", - "invalidRedirectUriFormat": "リダイレクトURIの形式が無効です", - "authorizeEmailAccount": "メールアカウントを認証", - "authorizeAnEmailAccountToStartTheOAuth2AuthorizationProcess": "OAuth2認証プロセスを開始するためにメールアカウントを認証します。", - "loadingAccounts": "アカウントを読み込み中...", - "selectAnAccount": "アカウントを選択", - "noEmailAccountsRegistered": "登録されたメールアカウントがありません。作成してください。", - "pleaseCreateOne": "作成してください。", - "createAccount": "アカウントを作成", - "authorize": "認証", - "getAuthorizeUrlFailed": "認証URLの取得に失敗しました", - "getAuthorizeUrlFailedDesc": "認証URLの取得に失敗しました。しばらくしてからもう一度お試しください", - "oauth2ClientUpdated": "OAuth2クライアントが更新されました", - "oauth2ClientHasBeenSuccessfully": "OAuth2クライアントは正常に{{action}}されました。", - "statusUpdateFailed": "ステータス更新に失敗しました。しばらくしてからもう一度お試しください", - "disableOAuth2Client": "OAuth2クライアントを無効にする", - "enableOAuth2Client": "OAuth2クライアントを有効にする", - "areYouSureYouWantTo": "このOAuth2クライアントを{{action}}してもよろしいですか?", - "thisWillPreventTheOAuth2ClientFromBeingUsed": "これにより、このOAuth2クライアントは使用できなくなります。", - "deleteToken": "トークンを削除", - "areYouSureYouWantToDelete": "削除してもよろしいですか", - "thisActionWillPermanentlyRemoveTheOauth2Record": "この操作により、システムからOAuth2レコードが完全に削除されます。元に戻すことはできません。", - "enterIdToConfirmDeletion": "削除を確認するためにIDを入力してください。", - "warning": "警告!", - "pleaseBeCareful": "ご注意ください。この操作は元に戻せません。", - "deleteSuccess": "削除成功", - "yourOAuth2ApplicationHasBeenSuccessfullyDeleted": "OAuth2アプリケーションは正常に削除されました。", - "oauth2DeleteFailed": "OAuth2の削除に失敗しました", - "deleteFailed": "削除に失敗しました。しばらくしてからもう一度お試しください", - "actions": { - "openMenu": "メニューを開く", - "edit": "編集", - "authorize": "認証", - "delete": "削除" - }, - "authFailed": "OAuth2認証に失敗しました", - "error": "エラー", - "unknownError": "不明なエラーが発生しました。", - "tryAgain": "再試行", - "goHome": "ホームへ", - "authSuccess": "OAuth2認証成功", - "success": "成功", - "successMessage": "メールアカウントはOAuth2経由で正常に認証されました。アクセストークンはシステムに保存され、必要に応じて自動的に更新されます。", - "goToAccounts": "アカウントへ移動", - "authAtatus": "OAuth2認証ステータス", - "information": "情報", - "noStatus": "このページにはOAuth2認証の結果が表示されます。現在、特定のステータスは利用できません。必要に応じて再試行してください。", - "backToLogin": "ログインに戻る" + "deleteDialog": { + "confirm": "削除", + "desc": "{{countText}}を削除してもよろしいですか?この操作により、選択したメールはローカルデータベースから削除されます。メールは完全に削除され、復元することはできません。", + "descCountMultiple": "これら{{count}}件のメール", + "descCountSingle": "このメール", + "errorTitle": "メッセージの削除に失敗しました", + "successDesc": "メッセージが削除されました。", + "successTitle": "メッセージが正常に削除されました", + "title": "メールを削除", + "warningDesc": "続行する前にご注意ください。", + "warningTitle": "警告!" }, - "accessTokens": { - "title": "アクセストークン", - "name": "名前", - "accounts": "アカウント", - "token": "トークン", - "createdAt": "作成日時", - "expiresAt": "有効期限", - "edit": "編集", - "delete": "削除", - "create": "作成", - "noTokens": "アクセストークンなし", - "noTokensDesc": "まだアクセストークンを作成していません。API機能を利用するには作成してください。", - "description": "アクセストークン、アクセス制御、IPホワイトリスト、レート制限設定をここで管理します。", - "editToken": "トークンを編集", - "addNew": "新規追加", - "updateTheAccessTokenHere": "こちらでアクセストークンを更新してください。", - "createNewAccessTokenHere": "こちらで新しいアクセストークンを作成してください。", - "selectAccounts": "アカウントを選択", - "selectMultipleAccountsForTheAccessToken": "アクセストークンの認証スコープとなる複数のアカウントを選択してください。", - "enterOneIpAddressPerLine": "1行に1つのIPアドレスを入力してください。例:\n192.168.1.1\n192.168.1.2", - "aListOfIpAddressesAllowed": "リソースへのアクセスが許可されるIPアドレスのリスト。1行に1つのIPアドレスを入力してください。(オプション)", - "enterQuota": "クォータを入力。例: 100", - "theMaximumNumberOfRequestsAllowed": "間隔内で許可される最大リクエスト数。(オプション)", - "enterIntervalInSeconds": "間隔を秒単位で入力。例: 60", - "theTimeWindowForTheRateLimit": "レート制限の時間枠(秒単位)。(オプション)", - "describeThePurposeOfTheAccessToken": "アクセストークンの目的を説明", - "updating": "更新中...", - "saving": "保存中...", - "creating": "作成中...", - "saveChanges": "変更を保存", - "save": "保存", - "updated": "更新されました", - "created": "作成されました", - "yourAccessTokenHasBeenSuccessfully": "アクセストークンは正常に{{action}}されました。", - "updateFailed": "更新に失敗しました", - "creationFailed": "作成に失敗しました", - "updateOrCreationFailed": "{{action}}に失敗しました。しばらくしてからもう一度お試しください", - "quotaMustBeAPositiveInteger": "クォータは正の整数である必要があります。", - "intervalMustBeAPositiveInteger": "間隔は正の整数である必要があります。", - "invalidIpAddressesFound": "無効なIPアドレスが見つかりました。有効なIPv4またはIPv6アドレスを入力してください。", - "atLeastOneAccountIsRequired": "少なくとも1つのアカウントが必要です。", - "descriptionMustNotExceed255Characters": "説明は255文字を超えてはいけません。", - "notUsedYet": "まだ使用されていません", - "theListOfAccountsThatCanBeQueried": "アクセストークンを使用してクエリできるアカウントのリスト。", - "accountId": "アカウントID", - "filterByEmailAddressOrAccountId": "メールアドレスまたはアカウントIDでフィルター...", - "aclRulesForAccessTokens": "アクセストークンのACLルールには、IPホワイトリスト検証とレート制限の適用が含まれます。", - "actions": { - "openMenu": "メニューを開く", - "edit": "編集", - "delete": "削除" - }, - "quota": "クォータ", - "interval": "間隔" + "deleteMailboxDialog": { + "confirm": "永久に削除", + "desc": "このメールボックスフォルダを削除してもよろしいですか?この操作は取り消せません。", + "errorTitle": "削除失敗", + "successDesc": "メールボックスフォルダとその内容が正常に削除されました。", + "successTitle": "削除完了", + "title": "メールボックスフォルダの削除", + "warningDesc": "このフォルダを削除すると、その中に含まれるすべてのアーカイブメールとサブフォルダも永久に削除されます。", + "warningTitle": "警告" }, - "settings": { - "appearance": { - "title": "外観", - "field": { - "language": "表示言語", - "theme": "インターフェーステーマ" - }, - "description": { - "language": "Web UIで使用する言語を選択します。", - "theme": "ライトモードまたはダークモードを選択します。" - }, - "placeholder": { - "select_language": "言語を選択" - }, - "command": { - "search": "言語を検索...", - "no_results": "言語が見つかりません。" - }, - "theme": { - "light": "ライト", - "dark": "ダーク" - }, - "button": { - "update": "設定を更新" - }, - "validation": { - "language": { - "required": "言語を選択してください。" - }, - "theme": { - "required": "テーマを選択してください。" - } - } - }, - "title": "設定", - "general": "一般", - "proxy": "プロキシ", - "name": "名前", - "host": "ホスト", - "port": "ポート", - "username": "ユーザー名", - "password": "パスワード", - "type": "タイプ", - "actions": "アクション", - "edit": "編集", - "delete": "削除", - "add": "追加", - "noProxies": "プロキシなし", - "noProxiesDesc": "まだプロキシ設定を追加していません。機能を利用するには追加してください。", - "root": "ルート", - "rootTitle": "ルート", - "rootDesc": "トークンとパスワードを含むルートアクセス資格情報を管理します。", - "rootAccessManagement": "ルートアクセス管理", - "manageRootTokenAndPassword": "ルートトークンとパスワードを安全に管理します。", - "resetRootToken": "ルートトークンをリセット", - "generateNewToken": "新しいトークンを生成します。古いトークンは直ちに失効します。", - "reset": "リセット", - "resetRootPassword": "ルートパスワードをリセット", - "changePasswordForFutureLogins": "今後のログインのためにパスワードを変更します。", - "youAreAboutToResetTheRootToken": "ルートトークンをリセットしようとしています。この操作は元に戻せません。", - "confirmReset": "リセットを確認", - "youAreAboutToResetTheRootPassword": "ルートパスワードをリセットしようとしています。安全に保管してください。", - "enterNewRootPassword": "新しいルートパスワードを入力", - "theRootTokenHasBeenReset": "ルートトークンがリセットされました", - "yourLoginInformationHasBeenUpdated": "ログイン情報が更新されました。再度ログインする必要はありません。", - "invalidPassword": "無効なパスワード", - "rootPasswordMustBeAtLeast6Characters": "ルートパスワードは6文字以上である必要があります。", - "theRootPasswordHasBeenReset": "ルートパスワードがリセットされました", - "useNewPasswordForNextLogin": "次回のログインには新しいパスワードを使用してください。", - "failedToCopyText": "テキストのコピーに失敗しました", - "filterProxy": "プロキシをフィルター...", - "filterOauth2": "OAuth2をフィルター...", - "filterAccount": "アカウントをフィルター...", - "filterAccessToken": "アクセストークンをフィルター...", - "selectAll": "すべて選択", - "theme": "テーマ", - "id": "ID", - "url": "URL", - "createdAt": "作成日時", - "updatedAt": "更新日時", - "enabled": "有効", - "useProxy": "プロキシを使用", - "authUrl": "認証URL", - "tokenUrl": "トークンURL", - "description": "説明", - "token": "トークン", - "accounts": "アカウント", - "acl": "ACL", - "lastAccess": "最終アクセス", - "enterProxyIdToConfirmDeletion": "削除を確認するためにプロキシIDを入力してください。", - "updateTheProxyHere": "こちらでプロキシを更新してください。", - "addNewProxyHere": "こちらで新しいプロキシを追加してください。", - "pleaseUseAnIpAddressForBetterReliability": "信頼性を高めるため、ホスト名やドメインではなくIPアドレス(例: 127.0.0.1)を使用してください。", - "adding": "追加中...", - "yourProxyHasBeenSuccessfully": "プロキシは正常に{{action}}されました。", - "proxyUpdateOrAddFailed": "{{action}}に失敗しました。しばらくしてからもう一度お試しください", - "sidebar": { - "profile": "プロフィール", - "apiTokens": "APIトークン", - "proxy": "ネットワークプロキシ", - "configurations": "システム設定" - }, - "profile": { - "loadError": "ユーザー情報の読み込みに失敗しました。", - "uploadTitle": "アバターをアップロード", - "maxSize": "最大 {{size}}", - "avatarAlt": "アバター", - "removeAvatar": "アバターを削除", - "uploadError": "ファイルのアップロードエラー", - "field": { - "username": "ユーザー名", - "email": "メールアドレス", - "password": "パスワード" - }, - "placeholder": { - "password_keep": "空欄のままにすると現在のパスワードを保持します" - }, - "button": { - "update_profile": "プロフィールを更新", - "permissions": "権限", - "view_global_permissions": "グローバル権限を表示" - }, - "section": { - "roles": "ロール", - "accounts": "連携アカウント {{count}} 件" - }, - "account": { - "id": "アカウントID:{{id}}" - }, - "toast": { - "updated": "プロフィールが正常に更新されました", - "update_failed": "プロフィールの更新に失敗しました" - }, - "validation": { - "username": { - "required": "ユーザー名は必須です", - "min": "ユーザー名は5文字以上である必要があります", - "max": "ユーザー名は32文字以内である必要があります" - }, - "email": { - "required": "メールアドレスは必須です", - "invalid": "有効なメールアドレスを入力してください" - }, - "password": { - "min": "パスワードは8文字以上である必要があります", - "max": "パスワードは256文字以内である必要があります" - } - } - } + "folders": "フォルダー", + "messages": "メッセージ", + "noMessages": "メッセージなし", + "selectFolder": "フォルダーを選択してメッセージを閲覧", + "thread": { + "empty": "このスレッドにメッセージはありません。", + "invalidDate": "無効な日付", + "loadError": "スレッドの読み込みに失敗しました", + "loadMore": "さらに読み込む", + "loadingMore": "さらに読み込み中...", + "message": "メッセージ", + "messages": "メッセージ", + "noSubject": "(件名なし)", + "title": "スレッド ({{count}}件の{{messageLabel}})" }, - "apiDocs": { - "choosePreferredType": "ご希望のAPIドキュメントタイプを選択してください", - "swaggerUI": "Swagger UI", - "reDoc": "ReDoc", - "openAPIExplorer": "OpenAPI Explorer", - "scalar": "Scalar", - "downloadSpecYAML": "仕様YAMLをダウンロード" + "title": "メールボックス" + }, + "navigation": { + "accessTokens": "アクセストークン", + "accounts": "アカウント", + "apiDocs": "APIドキュメント", + "attachment": "添付ファイル", + "auth": "認証", + "dashboard": "ダッシュボード", + "general": "一般", + "home": "ホーム", + "mailbox": "メールボックス", + "oauth2": "OAuth2", + "other": "その他", + "settings": "設定", + "users": "システムユーザー" + }, + "oauth2": { + "aSecretKeyProvidedByTheOAuthProvider": "OAuthプロバイダーから提供される、アプリケーションを認証するためのシークレットキー。", + "actions": { + "authorize": "認証", + "delete": "削除", + "edit": "編集", + "openMenu": "メニューを開く" }, - "dialogs": { - "confirmDelete": "削除の確認", - "confirmDeleteDesc": "このアイテムを削除してもよろしいですか?この操作は元に戻せません。", - "deleteSuccess": "正常に削除されました", - "deleteFailed": "削除に失敗しました", - "saveSuccess": "正常に保存されました", - "saveFailed": "保存に失敗しました", - "createSuccess": "正常に作成されました", - "createFailed": "作成に失敗しました", - "updateSuccess": "正常に更新されました", - "updateFailed": "更新に失敗しました", - "continue": "続行", - "deleting": "削除中...", - "accountDeleted": "アカウントが削除されました", - "accountDeletedDesc": "アカウントが正常に削除されました。", - "accountDeleteFailed": "アカウントの削除に失敗しました", - "deleteAccountPermanently": "アカウントを完全に削除", - "youAreDeleting": "{{email}}を削除しています。これにより、以下が完全に削除されます:", - "accountCredentials": "アカウントの資格情報と設定", - "localCachedMetadata": "ローカルキャッシュされたメタデータと同期ステータス", - "imapSyncData": "IMAP同期データ", - "oauthTokens": "OAuthトークンとAPI資格情報", - "typeEmailToConfirm": "確認のため、アカウントのメールアドレスを入力してください:", - "typeToConfirm": "確認のため「{{email}}」と入力してください", - "cannotBeUndone": "この操作は元に戻せません!", - "allResourcesErased": "関連するすべてのリソースは完全に消去されます。", - "permanentlyDeleteAccount": "アカウントを完全に削除" + "addConfiguration": "設定を追加", + "addExtraParams": "追加パラメーターを追加", + "addNew": "新規追加", + "addScope": "スコープを追加", + "areYouSureYouWantTo": "このOAuth2クライアントを{{action}}してもよろしいですか?", + "areYouSureYouWantToDelete": "削除してもよろしいですか", + "authAtatus": "OAuth2認証ステータス", + "authFailed": "OAuth2認証に失敗しました", + "authSuccess": "OAuth2認証成功", + "authUrlLabel": "認証URL:", + "authorizationUrlCannotBeEmpty": "認証URLは空にできません", + "authorizationUrlIsRequired": "認証URLは必須です", + "authorize": "認証", + "authorizeAnEmailAccountToStartTheOAuth2AuthorizationProcess": "OAuth2認証プロセスを開始するためにメールアカウントを認証します。", + "authorizeEmailAccount": "メールアカウントを認証", + "backToLogin": "ログインに戻る", + "clickSaveWhenDone": "完了したら「保存」をクリックしてください。", + "clientId": "クライアントID", + "clientIdCannotBeEmpty": "クライアントIDは空にできません", + "clientIdIsRequired": "クライアントIDは必須です", + "clientIdLabel": "クライアントID:", + "clientSecret": "クライアントシークレット", + "clientSecretCannotBeEmpty": "クライアントシークレットは空にできません", + "clientSecretIsRequired": "クライアントシークレットは必須です", + "clientSecretLabel": "クライアントシークレット:", + "createAccount": "アカウントを作成", + "createNewHere": "こちらで新規作成してください。", + "created": "作成されました", + "creating": "作成中...", + "creationFailed": "作成に失敗しました", + "delete": "削除", + "deleteFailed": "削除に失敗しました。しばらくしてからもう一度お試しください", + "deleteSuccess": "削除成功", + "deleteToken": "トークンを削除", + "describeThePurposeOfTheOauth2Application": "OAuth2アプリケーションの目的を説明", + "description": "アクセストークンの取得、保存、更新を自動的に処理し、シームレスでいつでも利用可能な認証体験を保証します。", + "descriptionLabel": "説明:", + "descriptionMustNotExceed255Characters": "説明は255文字を超えてはいけません。", + "disable": "無効にする", + "disableOAuth2Client": "OAuth2クライアントを無効にする", + "disabled": "無効", + "edit": "編集", + "enable": "有効にする", + "enableOAuth2Client": "OAuth2クライアントを有効にする", + "enabled": "有効", + "enterIdToConfirmDeletion": "削除を確認するためにIDを入力してください。", + "enterTheAuthorizationUrl": "認証URLを入力", + "enterTheKeyHere": "ここにキーを入力。", + "enterTheScopeHere": "ここにスコープを入力。", + "enterTheTokenUrl": "トークンURLを入力", + "enterTheValueHere": "ここに値を入力。", + "enterYourClientId": "クライアントIDを入力", + "enterYourClientSecret": "クライアントシークレットを入力", + "enterYourRedirectUrl": "リダイレクトURLを入力", + "error": "エラー", + "getAuthorizeUrlFailed": "認証URLの取得に失敗しました", + "getAuthorizeUrlFailedDesc": "認証URLの取得に失敗しました。しばらくしてからもう一度お試しください", + "gmail": "Gmail", + "goHome": "ホームへ", + "goToAccounts": "アカウントへ移動", + "id": "ID", + "information": "情報", + "invalidAuthorizationUrlFormat": "認証URLの形式が無効です", + "invalidRedirectUriFormat": "リダイレクトURIの形式が無効です", + "invalidTokenUrlFormat": "トークンURLの形式が無効です", + "key": "キー:", + "keyCannotBeEmpty": "キーは空にできません", + "keyIsRequired": "キーは必須です", + "leaveEmptyToKeepExistingSecret": "既存のシークレットを保持する場合は空欄にしてください", + "leaveEmptyToKeepTheExistingSecret": "既存のシークレットを保持する場合は空欄にしてください。変更する場合のみ新しい値を入力してください。", + "loadingAccounts": "アカウントを読み込み中...", + "noConfigurations": "OAuth2設定がありません", + "noConfigurationsDesc": "まだOAuth2設定を追加していません。機能を利用するには設定を追加してください。", + "noEmailAccountsRegistered": "登録されたメールアカウントがありません。作成してください。", + "noProxyAvailable": "利用可能なプロキシはありません", + "noStatus": "このページにはOAuth2認証の結果が表示されます。現在、特定のステータスは利用できません。必要に応じて再試行してください。", + "oauth2ClientHasBeenSuccessfully": "OAuth2クライアントは正常に{{action}}されました。", + "oauth2ClientUpdated": "OAuth2クライアントが更新されました", + "oauth2DeleteFailed": "OAuth2の削除に失敗しました", + "optional": "オプション", + "outlook": "Outlook", + "pleaseBeCareful": "ご注意ください。この操作は元に戻せません。", + "pleaseCreateOne": "作成してください。", + "provider": "プロバイダー", + "quickPresets": "クイックプリセット:", + "redirectUri": "リダイレクトURI", + "redirectUriCannotBeEmpty": "リダイレクトURIは空にできません", + "redirectUriIsRequired": "リダイレクトURIは必須です", + "redirectUrlLabel": "リダイレクトURL:", + "save": "保存", + "saveChanges": "変更を保存", + "saving": "保存中...", + "scope": "スコープ:", + "scopes": "スコープ", + "selectAProxy": "プロキシを選択", + "selectAnAccount": "アカウントを選択", + "status": "ステータス", + "statusUpdateFailed": "ステータス更新に失敗しました。しばらくしてからもう一度お試しください", + "success": "成功", + "successMessage": "メールアカウントはOAuth2経由で正常に認証されました。アクセストークンはシステムに保存され、必要に応じて自動的に更新されます。", + "theRedirectUrlAfterAuthorization": "認証後のリダイレクトURL。OAuthプロバイダーに登録されているものと一致している必要があります。http://[ホスト]:[ポート]/oauth2/callback (または https://) の形式を使用し、[ホスト]と[ポート]はRustMailerのデプロイメントと一致させてください。パス `/oauth2/callback` は固定です。", + "theUniqueIdentifierForYourApplication": "OAuthプロバイダーから提供される、アプリケーションの一意の識別子。", + "theUrlUsedToExchange": "認証コードをアクセストークンと交換するために使用されるURL。", + "theUrlWhereUsersWillBeRedirected": "ユーザーが認証のためにリダイレクトされるURL。", + "thisActionWillPermanentlyRemoveTheOauth2Record": "この操作により、システムからOAuth2レコードが完全に削除されます。元に戻すことはできません。", + "thisWillPreventTheOAuth2ClientFromBeingUsed": "これにより、このOAuth2クライアントは使用できなくなります。", + "title": "OAuth2", + "tokenUrlCannotBeEmpty": "トークンURLは空にできません", + "tokenUrlIsRequired": "トークンURLは必須です", + "tokenUrlLabel": "トークンURL:", + "tryAgain": "再試行", + "unknownError": "不明なエラーが発生しました。", + "updateFailed": "更新に失敗しました", + "updateHere": "こちらで更新してください。", + "updateOrCreationFailed": "{{action}}に失敗しました。しばらくしてからもう一度お試しください", + "updated": "更新されました", + "useProxyOptional": "プロキシを使用 (オプション):", + "useSocks5ProxyForOAuthRequests": "直接アクセスがブロックされている場合、OAuthリクエストにSOCKS5プロキシを使用します。", + "value": "値:", + "valueCannotBeEmpty": "値は空にできません", + "valueIsRequired": "値は必須です", + "warning": "警告!", + "whenDisabled": "無効化された場合: - 新しい認証フローは直ちに拒否されます - 既存のアクセストークンとリフレッシュトークンは1分以内に取り消されます - 再度有効化された際、ユーザーは再認証する必要があります", + "yourOAuth2ApplicationHasBeenSuccessfully": "OAuth2アプリケーションは正常に{{action}}されました。", + "yourOAuth2ApplicationHasBeenSuccessfullyDeleted": "OAuth2アプリケーションは正常に削除されました。" + }, + "permission": { + "account": { + "create": "メールアカウント作成", + "manage": "割り当てられたアカウントを管理", + "manage_all": "すべてのアカウント設定を管理", + "read_details": "アカウント詳細を閲覧" }, - "command": { - "typeCommandOrSearch": "コマンドを入力するか検索...", - "noResultsFound": "結果が見つかりませんでした。", - "theme": "テーマ", - "light": "ライト", - "dark": "ダーク" + "category": { + "account": "アカウント権限", + "global_data": "グローバルデータ(管理者)", + "system_identity": "システムと認証" + }, + "data": { + "delete": "割り当てられたメールを削除", + "delete_all": "すべてのアカウントのメールを削除", + "export_batch": "割り当てデータを一括エクスポート", + "export_batch_all": "すべてのデータを一括エクスポート", + "import_batch": "メールデータを一括インポート", + "manage": "割り当てられたメールメタデータを管理", + "manage_all": "すべてのメールメタデータを管理", + "raw_download": "割り当てられた生メールをダウンロード", + "raw_download_all": "すべての生メールをダウンロード", + "read": "割り当てられたメールデータを閲覧", + "read_all": "すべてのメールデータを閲覧", + "smtp_ingest": "SMTPプロトコル経由でメールを取り込む" + }, + "dialog": { + "account_description": "選択されたアカウントに限定された権限。", + "account_title": "アカウント権限", + "global_description": "このユーザーに付与されたシステム全体の権限。", + "global_title": "グローバル権限" + }, + "scope": { + "account": "アカウント #{{id}}", + "global": "グローバル" + }, + "system": { + "access": "基本システムアクセス", + "root": "システム完全制御" + }, + "token": { + "manage": "アクセストークン管理" + }, + "user": { + "manage": "すべてのユーザーを管理", + "view": "基本ユーザー名を閲覧" + } + }, + "profile": { + "avatar_alt": "アバター", + "menu": { + "profile": "プロフィール", + "settings": "設定", + "sign_out": "ログアウト" + } + }, + "proxyDelete": { + "close": "閉じる", + "confirmText": "削除してもよろしいですか", + "deleteBtn": "削除", + "failedDesc": "削除に失敗しました。しばらくしてからもう一度お試しください", + "failedTitle": "プロキシの削除に失敗しました", + "permanent": "この操作により、システムからプロキシが完全に削除されます。元に戻すことはできません。", + "proxyIdLabel": "プロキシID:", + "proxyIdPlaceholder": "削除を確認するためにプロキシIDを入力してください。", + "successDesc": "プロキシは正常に削除されました。", + "successTitle": "削除成功", + "title": "プロキシを削除", + "tryAgain": "再試行", + "warningDesc": "ご注意ください。この操作は元に戻せません。", + "warningTitle": "警告!" + }, + "restore_message": { + "accountsInvolved": "対象アカウント", + "bulkTitle": "複数メールの一括復元", + "bulkWarning": "注意:メールは元の保存先フォルダーに復元されます。", + "confirm": "復元を実行", + "desc": "この操作により、選択されたメールがBichonシステムから再アップロードされ、IMAPサーバー上の対応するメールボックスに復元されます。", + "failed": "復元失敗", + "failedTitle": "復元に失敗しました", + "messages": "通のメール", + "restore_to_imap": "メールを復元", + "success": "復元成功", + "successDesc": "選択されたメールはIMAPサーバーに正常に復元されました。", + "summary": "復元の詳細", + "title": "単一メールの復元" + }, + "roles": { + "actions": { + "add": "ロールを追加", + "cancel": "キャンセル", + "close": "閉じる", + "failed": "操作失敗", + "retry": "再試行", + "submit_create": "ロールを作成", + "submit_update": "ロールを更新", + "success_create": "ロールを作成しました", + "success_update": "ロールを更新しました" + }, + "categories": { + "account_resource": "アカウントリソースアクセス", + "global_data": "グローバルデータアクセス", + "identity": "ID と管理" + }, + "columns": { + "created_at": "作成日時", + "id": "ID", + "name": "名前", + "permissions": "権限", + "role_type": "ロールタイプ", + "updated_at": "更新日時" + }, + "delete": { + "alert_desc": "このロールを削除すると、割り当てられているすべてのユーザーから削除されます。", + "alert_title": "警告:永続的な操作です。", + "confirm_btn": "ロールを削除", + "confirm_label": "確認のため、ロール ID を入力してください:", + "deleting": "削除中...", + "dialog_title": "ロール削除", + "error_fallback": "ロールを削除できませんでした。", + "error_title": "削除失敗", + "irreversible": "この操作は取り消せません。", + "placeholder": "「{{id}}」と入力", + "success_desc": "ロール「{{name}}」が正常に削除されました。", + "success_title": "ロールを削除しました", + "warning_text": "ロール {{name}} (ID: {{id}}) を完全に削除しようとしています。" + }, + "description_hint": "アクセス範囲と機能権限を定義します。", + "details": { + "close_btn": "詳細を閉じる", + "desc_account": "単一アカウントのアクセスおよびデータ操作権限。", + "desc_global": "グローバル管理およびシステムレベルのアクセス権限。", + "role_badge": "{{type}} ロール", + "title": "ロール権限: {{name}}", + "unknown": "不明なロール", + "view_permissions": "権限の詳細" + }, + "empty": { + "desc": "カスタムロールがまだ作成されていません。", + "title": "ロールが見つかりません" + }, + "form": { + "builtin_badge": "組み込みロール", + "builtin_desc": "このロールはシステムによって事前定義されており、読み取り専用です。", + "desc_label": "説明", + "matrix_label": "{{type}} 権限マトリックス", + "name_label": "ロール名", + "type_label": "ロールタイプ" + }, + "placeholder": { + "filter": "ロールを検索..." + }, + "title": { + "create": "新規ロール作成", + "edit": "ロール編集: {{name}}" + }, + "types": { + "Account": "アカウント", + "Global": "グローバル" }, "validation": { - "required": "このフィールドは必須です", - "invalidEmail": "無効なメールアドレスです", - "invalidUrl": "無効なURLです", - "passwordMinLength": "パスワードは{{min}}文字以上である必要があります", - "pleaseEnterPassword": "パスワードを入力してください", - "passwordRequired": "認証方式がパスワードの場合、パスワードは必須です", - "emailRequired": "メールアドレスは必須です", - "imapHostRequired": "IMAPホストは必須です", - "imapHostCannotBeEmpty": "IMAPホストは空にできません", - "imapPortMustBePositive": "IMAPポートは正の整数である必要があります", - "imapPortMustBeLessThan65536": "IMAPポートは65536未満である必要があります", - "folderLimitMustBeNumber": "フォルダーの制限は数値である必要があります", - "folderLimitMustBeAtLeast100": "フォルダーの制限は100以上である必要があります", - "incrementalSyncMustBeNumber": "増分同期間隔は数値である必要があります", - "incrementalSyncMustBeAtLeast10": "増分同期間隔は10分以上である必要があります", - "pleaseEnterUsernameOrEmail": "ユーザー名またはメールアドレスを入力してください", - "singleRequestBatchSizeMustBeNumber": "バッチサイズは数値でなければなりません", - "singleRequestBatchSizeTooSmall": "バッチサイズは最低でも10でなければなりません", - "singleRequestBatchSizeTooLarge": "バッチサイズは最大でも200でなければなりません" - }, - "table": { - "noResults": "結果が見つかりませんでした", - "loading": "読み込み中...", - "page": "ページ", - "of": "/", - "rowsPerPage": "1ページあたりの行数", - "showing": "表示中", - "to": "〜", - "results": "件", - "asc": "昇順", - "desc": "降順", - "hide": "非表示", - "edit": "編集", - "delete": "削除", - "pagination": { - "selected": "{{selected}} / {{total}} 行を選択済み。", - "fixed_page_size": "1ページあたり {{size}} 行。", - "rows_per_page": "ページあたりの行数", - "page_info": "{{page}} / {{total}} ページ", - "first": "最初のページへ", - "previous": "前のページ", - "next": "次のページ", - "last": "最後のページへ" - } - }, - "proxyDelete": { - "title": "プロキシを削除", - "successTitle": "削除成功", - "successDesc": "プロキシは正常に削除されました。", - "close": "閉じる", - "failedTitle": "プロキシの削除に失敗しました", - "failedDesc": "削除に失敗しました。しばらくしてからもう一度お試しください", - "tryAgain": "再試行", - "confirmText": "削除してもよろしいですか", - "permanent": "この操作により、システムからプロキシが完全に削除されます。元に戻すことはできません。", - "proxyIdLabel": "プロキシID:", - "proxyIdPlaceholder": "削除を確認するためにプロキシIDを入力してください。", - "warningTitle": "警告!", - "warningDesc": "ご注意ください。この操作は元に戻せません。", - "deleteBtn": "削除" - }, - "systemConfig": { - "pageTitle": "システムレベルの設定", - "pageDescription": "これらのパラメータは、CLIフラグまたは環境変数を介して初期化されます。環境の一貫性を確保するため、現在は読み取り専用です。", - "status": { - "enabled": "有効", - "disabled": "無効", - "configured": "設定済み", - "missing": "未設定", - "auto": "自動", - "notSet": "未設定" - }, - "sections": { - "network": { - "title": "ネットワーク", - "desc": "HTTPおよびパブリックアクセス" - }, - "cors": { - "title": "CORS", - "desc": "クロスオリジンアクセスのルール" - }, - "logging": { - "title": "ロギング", - "desc": "ログ出力の動作" - }, - "storage": { - "title": "ストレージとキャッシュ", - "desc": "データベースのパスと制限" - }, - "security": { - "title": "セキュリティ", - "desc": "認証と暗号化" - }, - "performance": { - "title": "パフォーマンス", - "desc": "並行性と圧縮" - }, - "smtp": { - "title": "SMTPサーバー", - "desc": "リアルタイムアーカイブ用の受信メール設定" - } - } - }, - "apiTokens": { - "page": { - "loadError": "APIトークンの読み込みに失敗しました。", - "emptyTitle": "APIトークンがありません", - "emptyDescription": "APIトークンはまだ作成されていません。作成するには以下をクリックしてください。", - "addBtn": "トークンを追加" - }, - "list": { - "unnamedToken": "無名のトークン", - "statusActive": "有効", - "statusExpired": "期限切れ", - "neverExpires": "無期限", - "expiresOnShort": "有効期限: {{date}}", - "tokenLabel": "トークン", - "createdLabel": "作成日", - "lastUsedLabel": "最終使用日", - "expiresOnLabel": "有効期限", - "neverUsed": "未使用", - "neverLabel": "なし", - "deleteBtn": "トークンを削除" - }, - "dialog": { - "createTitle": "アクセストークンの作成", - "editTitle": "アクセストークンの編集", - "description": "完了したら保存をクリックしてください。", - "save": "保存", - "saveChanges": "変更を保存" - }, - "deleteDialog": { - "title": "アクセストークンを削除しますか?", - "description": "この操作は取り消せません。このトークンを使用しているアプリケーションは直ちにアクセスできなくなります。", - "cancel": "キャンセル", - "confirm": "削除", - "deleting": "削除中..." - }, - "form": { - "nameLabel": "名前", - "namePlaceholder": "トークンの短い名前を入力してください", - "nameDescription": "任意 · 最大32文字", - "expirationLabel": "有効期限", - "expirationPlaceholder": "期限を選択", - "expirationDescription": "トークンは選択した期間後に自動的に期限切れになります。", - "never": "無期限", - "1day": "1日", - "7days": "7日間", - "30days": "30日間", - "errorMax": "最大32文字まで", - "errorNumber": "数値である必要があります", - "errorInt": "整数である必要があります", - "errorPositive": "0より大きい必要があります" - }, - "notifications": { - "createSuccess": "アクセストークンを作成しました", - "createSuccessDesc": "アクセストークンが正常に作成されました。", - "updateSuccess": "アクセストークンを更新しました", - "updateSuccessDesc": "アクセストークンが正常に更新されました。", - "createFailed": "作成失敗", - "updateFailed": "更新失敗", - "deleteSuccess": "トークンを削除しました", - "deleteFailed": "削除に失敗しました", - "copied": "クリップボードにコピーしました", - "genericError": "操作に失敗しました。もう一度お試しください。", - "close": "閉じる", - "tryAgain": "再試行" - } - }, - "permission": { - "scope": { - "global": "グローバル", - "account": "アカウント #{{id}}" - }, - "dialog": { - "global_title": "グローバル権限", - "account_title": "アカウント権限", - "global_description": "このユーザーに付与されたシステム全体の権限。", - "account_description": "選択されたアカウントに限定された権限。" - }, - "category": { - "system_identity": "システムと認証", - "global_data": "グローバルデータ(管理者)", - "account": "アカウント権限" - }, - "system": { - "access": "基本システムアクセス", - "root": "システム完全制御" - }, - "user": { - "manage": "すべてのユーザーを管理", - "view": "基本ユーザー名を閲覧" - }, - "token": { - "manage": "アクセストークン管理" - }, - "account": { - "create": "メールアカウント作成", - "manage": "割り当てられたアカウントを管理", - "manage_all": "すべてのアカウント設定を管理", - "read_details": "アカウント詳細を閲覧" - }, - "data": { - "read": "割り当てられたメールデータを閲覧", - "read_all": "すべてのメールデータを閲覧", - "manage": "割り当てられたメールメタデータを管理", - "manage_all": "すべてのメールメタデータを管理", - "raw_download": "割り当てられた生メールをダウンロード", - "raw_download_all": "すべての生メールをダウンロード", - "delete": "割り当てられたメールを削除", - "delete_all": "すべてのアカウントのメールを削除", - "export_batch": "割り当てデータを一括エクスポート", - "export_batch_all": "すべてのデータを一括エクスポート", - "import_batch": "メールデータを一括インポート", - "smtp_ingest": "SMTPプロトコル経由でメールを取り込む" - } - }, - "users": { - "columns": { - "id": "ID", - "avatar": "アバター", - "username": "ユーザー名", - "email": "メールアドレス", - "roles": "ロールと権限", - "created_at": "作成日時", - "updated_at": "更新日時", - "actions": "操作" - }, - "buttons": { - "add": "ユーザーを追加", - "add_new": "新規ユーザー追加" - }, - "empty": { - "title": "ユーザーが見つかりません", - "description": "下のボタンをクリックして、最初のユーザーを追加してください。" - }, - "nav": { - "users": "ユーザー", - "roles": "ロール", - "api_tokens": "API トークン" - }, - "api_tokens": { - "empty": { - "title": "API トークンが見つかりません", - "description": "システム内に API トークンがまだ生成されていません。" - }, - "button": { - "generate": "新規トークン生成" - }, - "toolbar": { - "search_placeholder": "名前、所有者、またはトークンで検索..." - }, - "table": { - "name": "名前", - "type": "タイプ", - "last_used": "最終使用", - "expires_at": "有効期限", - "owner": "所有者", - "created": "作成日", - "api_key": "API キー", - "web_ui": "Web UI", - "never": "なし", - "permanent": "無期限", - "expired": "期限切れ", - "unnamed": "未命名トークン" - }, - "unnamed": "未命名トークン", - "delete": { - "title": "API トークンの削除", - "desc": "この API トークンを完全に削除しようとしています", - "prefix": "トークン接頭辞", - "irreversible": "この操作は取り消せません。このトークンを使用しているすべてのアプリケーションは、直ちにアクセスできなくなります。", - "confirm_label": "確認のため、下に {{word}} と入力してください:", - "confirm_placeholder": "確認のために「{{word}}」と入力", - "warning_title": "警告", - "warning_desc": "このトークンを使用しているスクリプト、サービス、または統合は失敗します。続行する前にシステムが更新されていることを確認してください。", - "confirm_button": "トークンを削除", - "deleting": "削除中..." - }, - "toast": { - "deleted_title": "API トークンを削除しました", - "deleted_desc": "トークン「{{name}}」が正常に削除されました。", - "delete_failed_title": "削除に失敗しました", - "delete_failed": "トークンの削除に失敗しました。もう一度お試しください。" - } - }, - "tokens": { - "schema": { - "name_max": "最大 32 文字", - "expire_number": "数字である必要があります", - "expire_int": "整数である必要があります", - "expire_positive": "0 より大きい必要があります" - }, - "toast": { - "update_success_title": "アクセストークンを更新しました", - "update_success_desc": "アクセストークンが正常に更新されました。", - "create_success_title": "アクセストークンを作成しました", - "create_success_desc": "アクセストークンが正常に作成されました。", - "update_failed_title": "更新失敗", - "create_failed_title": "作成失敗" - }, - "error": { - "fallback": "操作に失敗しました。後でもう一度お試しください。" - }, - "dialog": { - "edit_title": "アクセストークンの編集", - "create_title": "アクセストークンの作成", - "description": "完了したら保存をクリックしてください。" - }, - "fields": { - "name_label": "名前", - "name_placeholder": "このトークンに短い名前を付けてください", - "name_hint": "任意 · 最大 32 文字", - "expire_label": "有効期限", - "expire_placeholder": "期限を選択", - "expire_hint": "トークンは選択した時間の経過後に自動的に失効します。" - }, - "expire_options": { - "never": "無期限", - "1_day": "1 日", - "7_days": "7 日", - "30_days": "30 日" - } - }, - "tokens_action": { - "dialog": { - "title": "API トークン", - "description": "このユーザーの API トークンを管理します。" - }, - "empty": { - "title": "API トークンなし", - "description": "このユーザーには現在 API トークンがありません。" - }, - "buttons": { - "add": "トークンを追加" - }, - "list": { - "unnamed_token": "未命名トークン", - "status_expired": "期限切れ", - "status_active": "アクティブ", - "expires_on_brief": "{{date}} に期限切れ", - "never_expires": "無期限", - "label_token": "トークン", - "label_created": "作成日", - "label_last_used": "最終使用", - "label_expires_at": "有効期限", - "never": "なし", - "button_delete": "トークンを削除" - }, - "delete_dialog": { - "title": "アクセストークンを削除しますか?", - "description": "この操作は取り消せません。" - } - }, - "actions": { - "schema": { - "account_required": "アカウントを選択してください", - "role_required": "ロールを選択してください", - "username_required": "ユーザー名は必須です", - "username_min": "ユーザー名は 3 文字以上である必要があります", - "username_max": "ユーザー名は 32 文字以内である必要があります", - "email_required": "メールアドレスは必須です", - "email_invalid": "有効なメールアドレスを入力してください", - "global_role_required": "少なくとも 1 つのグローバルロールを割り当ててください", - "description_max": "説明は 256 文字以内である必要があります", - "ip_invalid": "無効な IP アドレスが検出されました", - "password_required": "パスワードは必須です", - "password_min": "パスワードは 8 文字以上である必要があります", - "password_max": "パスワードは 256 文字以内である必要があります" - }, - "toast": { - "updated": "ユーザーを更新しました", - "created": "ユーザーを作成しました" - }, - "dialog": { - "edit_title": "ユーザー編集: {{name}}", - "create_title": "新規ユーザー作成", - "subtitle": "ID、アクセスレベル、およびセキュリティポリシーを設定します。" - }, - "tabs": { - "general": "基本情報", - "permissions": "アカウント権限", - "security": "セキュリティと ACL" - }, - "sections": { - "basic": "基本設定", - "global": "グローバル権限", - "mail_access": "メールアクセス制御", - "mail_access_subtitle": "このユーザーが管理できるメールアカウントを定義します。", - "policy": "ポリシー切り替え" - }, - "fields": { - "username": "ユーザー名", - "username_hint": "ログインに使用する一意識別子。", - "email": "メールアドレス", - "email_hint": "主要な連絡先および通知用アドレス。", - "password": "パスワード", - "password_placeholder_create": "8 文字以上", - "password_placeholder_edit": "現在のパスワードを維持する場合は空白", - "password_hint_create": "初期設定用の安全なパスワード。", - "password_hint_edit": "パスワードを変更する場合のみ入力してください。", - "global_roles_hint": "高度なシステム権限を割り当てます。", - "description": "説明 (任意)", - "description_placeholder": "ユーザーに関するメモを追加...", - "description_hint": "内部用の説明(最大 256 文字)。", - "select_account": "アカウントを選択", - "assign_role": "ロールを割り当て", - "ip_whitelist": "IP ホワイトリスト", - "ip_whitelist_hint": "ログインを制限する IP アドレス(1 行に 1 つ)。", - "rate_quota": "レート制限", - "burst_interval": "バースト間隔 (秒)" - }, - "buttons": { - "add_account": "アカウントを追加", - "update": "ユーザーを更新", - "create": "ユーザーを作成" - }, - "states": { - "full_access": "フルアクセスモード", - "full_access_desc": "システム管理者ロールを持つユーザーは、手動の割り当てなしですべてのアカウントにアクセスできます。", - "no_accounts": "特定のアカウントは割り当てられていません。", - "security_disabled": "現在、高度なセキュリティポリシーは無効です。" - }, - "api_tokens": "API トークン", - "placeholder": { - "filter": "ユーザーを検索..." - }, - "delete": { - "title": "ユーザー削除", - "confirm_msg": "ユーザー {{name}} (ID: {{id}}) を完全に削除しようとしています。", - "irreversible": "この操作は取り消せません。", - "input_label": "確認のため、下にユーザー ID を入力してください:", - "placeholder": "確認のために「{{id}}」と入力", - "alert_title": "警告:この操作は永続的です。", - "alert_desc": "削除すると、ユーザーと関連データはすべて直ちに消去されます。", - "button_confirm": "ユーザーを削除", - "button_deleting": "削除中...", - "toast": { - "success_title": "ユーザーを削除しました", - "success_desc": "ユーザー「{{name}}」が正常に削除されました。", - "failed_title": "削除失敗", - "failed_fallback": "ユーザーの削除に失敗しました。" - } - } - } - }, - "roles": { - "title": { - "create": "新規ロール作成", - "edit": "ロール編集: {{name}}" - }, - "description_hint": "アクセス範囲と機能権限を定義します。", - "form": { - "name_label": "ロール名", - "type_label": "ロールタイプ", - "desc_label": "説明", - "matrix_label": "{{type}} 権限マトリックス", - "builtin_badge": "組み込みロール", - "builtin_desc": "このロールはシステムによって事前定義されており、読み取り専用です。" - }, - "types": { - "Global": "グローバル", - "Account": "アカウント" - }, - "categories": { - "identity": "ID と管理", - "global_data": "グローバルデータアクセス", - "account_resource": "アカウントリソースアクセス" - }, - "actions": { - "cancel": "キャンセル", - "submit_create": "ロールを作成", - "submit_update": "ロールを更新", - "success_create": "ロールを作成しました", - "success_update": "ロールを更新しました", - "failed": "操作失敗", - "close": "閉じる", - "retry": "再試行", - "add": "ロールを追加" - }, - "validation": { - "name_required": "ロール名は必須です", - "perm_required": "少なくとも 1 つの権限を選択してください" - }, - "columns": { - "id": "ID", - "name": "名前", - "role_type": "ロールタイプ", - "permissions": "権限", - "created_at": "作成日時", - "updated_at": "更新日時" - }, - "placeholder": { - "filter": "ロールを検索..." - }, - "delete": { - "dialog_title": "ロール削除", - "warning_text": "ロール {{name}} (ID: {{id}}) を完全に削除しようとしています。", - "irreversible": "この操作は取り消せません。", - "confirm_label": "確認のため、ロール ID を入力してください:", - "placeholder": "「{{id}}」と入力", - "alert_title": "警告:永続的な操作です。", - "alert_desc": "このロールを削除すると、割り当てられているすべてのユーザーから削除されます。", - "confirm_btn": "ロールを削除", - "deleting": "削除中...", - "success_title": "ロールを削除しました", - "success_desc": "ロール「{{name}}」が正常に削除されました。", - "error_title": "削除失敗", - "error_fallback": "ロールを削除できませんでした。" - }, - "details": { - "title": "ロール権限: {{name}}", - "unknown": "不明なロール", - "role_badge": "{{type}} ロール", - "desc_global": "グローバル管理およびシステムレベルのアクセス権限。", - "desc_account": "単一アカウントのアクセスおよびデータ操作権限。", - "close_btn": "詳細を閉じる", - "view_permissions": "権限の詳細" - }, - "empty": { - "title": "ロールが見つかりません", - "desc": "カスタムロールがまだ作成されていません。" - } - }, - "profile": { - "avatar_alt": "アバター", - "menu": { - "profile": "プロフィール", - "settings": "設定", - "sign_out": "ログアウト" - } - }, - "sign_out": { - "title": "サインアウト", - "desc": "本当にサインアウトしますか? アカウントにアクセスするには再度サインインが必要です。", - "confirm": "サインアウト" - }, - "restore_message": { - "title": "単一メールの復元", - "bulkTitle": "複数メールの一括復元", - "bulkWarning": "注意:メールは元の保存先フォルダーに復元されます。", - "accountsInvolved": "対象アカウント", - "summary": "復元の詳細", - "messages": "通のメール", - "desc": "この操作により、選択されたメールがBichonシステムから再アップロードされ、IMAPサーバー上の対応するメールボックスに復元されます。", - "confirm": "復元を実行", - "restore_to_imap": "メールを復元", - "success": "復元成功", - "successDesc": "選択されたメールはIMAPサーバーに正常に復元されました。", - "failed": "復元失敗", - "failedTitle": "復元に失敗しました" - }, - "time": { - "label": "時間", - "since": "以降", - "before": "以前", - "recent_range": "最近の範囲(以降)", - "historical": "過去の範囲(以前)", - "absolute_range": "絶対日付範囲", - "last_day": "過去 1 日", - "last_days": "過去 {{count}} 日", - "last_months": "過去 {{count}} か月", - "over_years_ago": "{{count}}{{unit}}前", - "year": "年", - "years": "年", - "recent_prefix": "最近:", - "days_ago_to_now": "日前〜現在", - "apply": "適用", - "start_date": "開始日", - "end_date": "終了日", - "clear_filters": "時間フィルターをクリア", - "format": "yyyy-MM-dd" - }, - "tag": { - "label": "タグ", - "search_placeholder": "タグを検索...", - "clear_all": "すべてのタグをクリア", - "no_tags_found": "タグが見つかりません" - }, - "search_accounts": { - "label": "メールアカウント", - "search_placeholder": "アカウントを検索...", - "clear_accounts": "選択したアカウントをクリア", - "no_accounts_found": "アカウントが見つかりません" - }, - "search_mailbox": { - "label": "メールボックス", - "search_placeholder": "メールボックスを検索", - "clear_mailboxes": "選択したフォルダをクリア", - "select_account_first": "先にアカウントを選択してください", - "no_mailbox_found": "フォルダが見つかりません" - }, - "search_contacts": { - "label": "連絡先", - "label_with_count": "連絡先 ({{count}})", - "any": "指定なし", - "search_placeholder": "{{field}} を検索...", - "reset_all": "連絡先をリセット", - "no_contact_found": "連絡先が見つかりません", - "loading": "読み込み中...", - "showing_limit": "最初の100件のみ表示 • 合計 {{total}} 件" - }, - "search_more": { - "trigger_label": "詳細", - "title": "詳細フィルター", - "reset": "リセット", - "has_attachment": "添付ファイルあり", - "attachment_name_label": "添付ファイル名", - "attachment_name_placeholder": "例: invoice.pdf", - "message_size_label": "メールサイズ", - "message_id_label": "Message-ID", - "message_id_description": "メールヘッダーの Message-ID で検索", - "apply": "適用", - "size_presets": { - "any": "指定なし", - "tiny": "極小 (< 15 KB)", - "small": "小 (< 2 MB)", - "medium": "中 (2 – 10 MB)", - "large": "大 (10 – 20 MB)", - "huge": "特大 (> 20 MB)" - }, - "any": "制限なし", - "search_placeholder": "{{field}}を検索...", - "extension": "拡張子", - "category": "添付ファイルカテゴリ", - "content_types": "具体的な形式" - }, - "search_view": { - "button_label": "表示", - "menu_title": "列の設定" - }, - "search_reset": { - "label": "リセット", - "tooltip": "すべての条件をクリア" - }, - "search_input": { - "placeholder": "メールを検索... (正規表現対応)", - "button": "検索", - "recent_title": "最近の検索", - "clear_history": "履歴をクリア", - "no_history": "履歴なし", - "all": "すべて", - "all_fields_desc": "件名、本文、送信者、受信者に一致します", - "subject": "件名", - "body": "本文" + "name_required": "ロール名は必須です", + "perm_required": "少なくとも 1 つの権限を選択してください" } + }, + "search": { + "account": "アカウント", + "addEmailAccount": "メールアカウントを追加", + "addTags": { + "cancel": "キャンセル", + "createHint": "新しいタグを作成: {{tag}}", + "invalidTitle": "無効なタグ", + "none": "タグが追加されていません", + "save": "保存", + "saving": "保存中...", + "searchPlaceholder": "タグを検索または作成...", + "selectedCount": "選択されたタグ: {{count}}件", + "title": "タグを編集", + "tryAgain": "しばらくしてからもう一度お試しください", + "updateFailedTitle": "更新に失敗しました", + "updatedDesc": "タグが正常に更新されました", + "updatedTitle": "タグが更新されました" + }, + "adjustSearch": "検索条件を調整するか、フィルターをクリアしてみてください。", + "advanced": "高度な設定", + "advancedFilters": "高度なフィルター", + "any": "指定なし", + "attachmentName": "添付ファイル名", + "attachmentsSize": "添付ファイルとサイズ", + "bcc": "BCC(ブラインド写し)", + "before": "以前:", + "bulkActions": { + "ariaLabel": "{{count}} 件のメッセージを選択中。一括操作ツールバー", + "clear": "選択を解除", + "delete": "削除", + "deleteDesc": "選択したメッセージを削除", + "manageTags": "タグを管理", + "selected": "{{count}} 件選択済み" + }, + "cc": "CC(写し)", + "clear": "クリア", + "date": "日付", + "dateRange": "日付範囲", + "delete": { + "confirmButton": "削除", + "confirmDetail": "この操作は取り消しできません。", + "confirmPrefix": "本当に", + "countLabel": "{{count}} 件のメッセージを削除しますか?", + "errorTitle": "削除に失敗しました", + "successDesc": "選択したメッセージは正常に削除されました。", + "successTitle": "削除完了", + "title": "メッセージを削除", + "warningDesc": "削除されたメッセージは完全に削除され、復元することはできません。", + "warningTitle": "警告" + }, + "editTag": "タグを編集", + "endDate": "終了日", + "from": "送信元", + "fullTextMultiAccount": "全文検索・複数アカウント・高度なフィルター", + "hasAttachment": "添付ファイルあり", + "huge": "巨大 (≥20 MB)", + "keyword": "キーワード", + "large": "大(10 - 20 MB)", + "mailbox": "メールボックス", + "maxSize": "最大サイズ", + "maximumBytes": "最大", + "medium": "中(2 - 10 MB)", + "messageId": "メッセージID", + "minSize": "最小サイズ", + "minimumBytes": "最小", + "no": "いいえ", + "noActiveEmailAccount": "有効なメールアカウントがありません。", + "noEmailsFound": "メールが見つかりませんでした", + "noMailboxSelectAccount": "メールボックスがありません。まずアカウントを選択してください。", + "originalMessageIdHeader": "元のメールのMessage-IDヘッダー", + "pleaseSelectAtLeastOne": "少なくとも1つの検索条件を選択してください", + "preview": "プレビュー", + "recipient": "受信者", + "searchArchivedEmails": "アーカイブされたメールを検索", + "searchButton": "検索", + "searchInSubjectBody": "件名、本文、添付ファイル内を検索...", + "searching": "検索中です。お待ちください…", + "searchingButton": "検索中...", + "selectAccount": "アカウントを選択", + "selectDate": "日付を選択", + "selectMailbox": "メールボックスを選択", + "sender": "送信者", + "senderRecipients": "送信者 / 受信者", + "since": "以降:", + "size": "サイズ", + "sizeDescription": "サイズは添付ファイルを含むメール全体の容量を指します。", + "small": "小(2 MB 未満)", + "sort": "並べ替え", + "source": "ソース", + "startDate": "開始日", + "startSearching": "キーワード、送信者、または高度なフィルターを使用して検索を開始してください。", + "subject": "件名", + "tagFilter": "タグフィルター", + "thread": { + "empty": "このスレッドにメッセージはありません", + "error": "スレッドの読み込みに失敗しました", + "invalidDate": "無効な日付", + "loadMore": "さらに読み込む", + "loadingMore": "読み込み中...", + "noSubject": "(件名なし)", + "title": "スレッド · {{count}}件のメッセージ" + }, + "tiny": "極小(15 KB 未満)", + "title": "検索", + "to": "宛先", + "updateTags": { + "actionAdd": "追加", + "actionOverwrite": "上書き", + "actionRemove": "削除", + "cancel": "キャンセル", + "createHint": "Enterキーを押して新しいタグを作成:\"{{tag}}\"", + "invalidTitle": "無効なタグ", + "none": "タグが選択されていません", + "overwriteWarning": "警告:この操作により、選択した項目の既存のタグがすべて上書きされます。", + "savingAdd": "追加中...", + "savingOverwrite": "上書き中...", + "savingRemove": "削除中...", + "searchPlaceholder": "タグを検索または作成...", + "selectedCount": "{{count}} 個のタグを適用します", + "submitAdd": "タグを追加", + "submitOverwrite": "タグを上書き", + "submitRemove": "タグを削除", + "title": "タグを更新", + "tryAgain": "後でもう一度お試しください。", + "updateFailedTitle": "更新に失敗しました", + "updatedDesc": "タグが正常に更新されました。", + "updatedTitle": "タグを更新しました" + }, + "yes": "はい" + }, + "search_accounts": { + "clear_accounts": "選択したアカウントをクリア", + "label": "メールアカウント", + "no_accounts_found": "アカウントが見つかりません", + "search_placeholder": "アカウントを検索..." + }, + "search_contacts": { + "any": "指定なし", + "label": "連絡先", + "label_with_count": "連絡先 ({{count}})", + "loading": "読み込み中...", + "no_contact_found": "連絡先が見つかりません", + "reset_all": "連絡先をリセット", + "search_placeholder": "{{field}} を検索...", + "showing_limit": "最初の100件のみ表示 • 合計 {{total}} 件" + }, + "search_input": { + "all": "すべて", + "all_fields_desc": "件名、本文、送信者、受信者に一致します", + "body": "本文", + "button": "検索", + "clear_history": "履歴をクリア", + "no_history": "履歴なし", + "placeholder": "メールを検索 (フレーズ検索は \" \" を使用)", + "recent_title": "最近の検索", + "subject": "件名" + }, + "search_mailbox": { + "clear_mailboxes": "選択したフォルダをクリア", + "label": "メールボックス", + "no_mailbox_found": "フォルダが見つかりません", + "search_placeholder": "メールボックスを検索", + "select_account_first": "先にアカウントを選択してください" + }, + "search_more": { + "any": "制限なし", + "apply": "適用", + "attachment_name_label": "添付ファイル名", + "attachment_name_placeholder": "例: invoice.pdf", + "category": "添付ファイルカテゴリ", + "content_type": "ファイルタイプ", + "extension": "拡張子", + "has_attachment": "添付ファイルあり", + "is_message": "メール形式の添付ファイル", + "is_message_desc": "この添付ファイルはメールファイルです(例:.emlファイル)。", + "message_id_description": "メールヘッダーの Message-ID で検索", + "message_id_label": "Message-ID", + "message_size_label": "メールサイズ", + "reset": "リセット", + "search_placeholder": "{{field}}を検索...", + "size_presets": { + "any": "指定なし", + "huge": "特大 (> 20 MB)", + "large": "大 (10 – 20 MB)", + "medium": "中 (2 – 10 MB)", + "small": "小 (< 2 MB)", + "tiny": "極小 (< 15 KB)" + }, + "title": "詳細フィルター", + "trigger_label": "詳細" + }, + "search_reset": { + "label": "リセット", + "tooltip": "すべての条件をクリア" + }, + "search_view": { + "button_label": "表示", + "menu_title": "列の設定" + }, + "settings": { + "accounts": "アカウント", + "acl": "ACL", + "actions": "アクション", + "add": "追加", + "addNewProxyHere": "こちらで新しいプロキシを追加してください。", + "adding": "追加中...", + "appearance": { + "button": { + "update": "設定を更新" + }, + "command": { + "no_results": "言語が見つかりません。", + "search": "言語を検索..." + }, + "description": { + "language": "Web UIで使用する言語を選択します。", + "theme": "ライトモードまたはダークモードを選択します。" + }, + "field": { + "language": "表示言語", + "theme": "インターフェーステーマ" + }, + "placeholder": { + "select_language": "言語を選択" + }, + "theme": { + "dark": "ダーク", + "light": "ライト" + }, + "title": "外観", + "validation": { + "language": { + "required": "言語を選択してください。" + }, + "theme": { + "required": "テーマを選択してください。" + } + } + }, + "authUrl": "認証URL", + "changePasswordForFutureLogins": "今後のログインのためにパスワードを変更します。", + "confirmReset": "リセットを確認", + "createdAt": "作成日時", + "delete": "削除", + "description": "説明", + "edit": "編集", + "enabled": "有効", + "enterNewRootPassword": "新しいルートパスワードを入力", + "enterProxyIdToConfirmDeletion": "削除を確認するためにプロキシIDを入力してください。", + "failedToCopyText": "テキストのコピーに失敗しました", + "filterAccessToken": "アクセストークンをフィルター...", + "filterAccount": "アカウントをフィルター...", + "filterOauth2": "OAuth2をフィルター...", + "filterProxy": "プロキシをフィルター...", + "general": "一般", + "generateNewToken": "新しいトークンを生成します。古いトークンは直ちに失効します。", + "host": "ホスト", + "id": "ID", + "invalidPassword": "無効なパスワード", + "lastAccess": "最終アクセス", + "manageRootTokenAndPassword": "ルートトークンとパスワードを安全に管理します。", + "name": "名前", + "noProxies": "プロキシなし", + "noProxiesDesc": "まだプロキシ設定を追加していません。機能を利用するには追加してください。", + "password": "パスワード", + "pleaseUseAnIpAddressForBetterReliability": "信頼性を高めるため、ホスト名やドメインではなくIPアドレス(例: 127.0.0.1)を使用してください。", + "port": "ポート", + "profile": { + "account": { + "id": "アカウントID:{{id}}" + }, + "avatarAlt": "アバター", + "button": { + "permissions": "権限", + "update_profile": "プロフィールを更新", + "view_global_permissions": "グローバル権限を表示" + }, + "field": { + "email": "メールアドレス", + "password": "パスワード", + "username": "ユーザー名" + }, + "loadError": "ユーザー情報の読み込みに失敗しました。", + "maxSize": "最大 {{size}}", + "placeholder": { + "password_keep": "空欄のままにすると現在のパスワードを保持します" + }, + "removeAvatar": "アバターを削除", + "section": { + "accounts": "連携アカウント {{count}} 件", + "roles": "ロール" + }, + "toast": { + "update_failed": "プロフィールの更新に失敗しました", + "updated": "プロフィールが正常に更新されました" + }, + "uploadError": "ファイルのアップロードエラー", + "uploadTitle": "アバターをアップロード", + "validation": { + "email": { + "invalid": "有効なメールアドレスを入力してください", + "required": "メールアドレスは必須です" + }, + "password": { + "max": "パスワードは256文字以内である必要があります", + "min": "パスワードは8文字以上である必要があります" + }, + "username": { + "max": "ユーザー名は32文字以内である必要があります", + "min": "ユーザー名は5文字以上である必要があります", + "required": "ユーザー名は必須です" + } + } + }, + "proxy": "プロキシ", + "proxyUpdateOrAddFailed": "{{action}}に失敗しました。しばらくしてからもう一度お試しください", + "reset": "リセット", + "resetRootPassword": "ルートパスワードをリセット", + "resetRootToken": "ルートトークンをリセット", + "root": "ルート", + "rootAccessManagement": "ルートアクセス管理", + "rootDesc": "トークンとパスワードを含むルートアクセス資格情報を管理します。", + "rootPasswordMustBeAtLeast6Characters": "ルートパスワードは6文字以上である必要があります。", + "rootTitle": "ルート", + "selectAll": "すべて選択", + "sidebar": { + "apiTokens": "APIトークン", + "configurations": "システム設定", + "profile": "プロフィール", + "proxy": "ネットワークプロキシ" + }, + "theRootPasswordHasBeenReset": "ルートパスワードがリセットされました", + "theRootTokenHasBeenReset": "ルートトークンがリセットされました", + "theme": "テーマ", + "title": "設定", + "token": "トークン", + "tokenUrl": "トークンURL", + "type": "タイプ", + "updateTheProxyHere": "こちらでプロキシを更新してください。", + "updatedAt": "更新日時", + "url": "URL", + "useNewPasswordForNextLogin": "次回のログインには新しいパスワードを使用してください。", + "useProxy": "プロキシを使用", + "username": "ユーザー名", + "youAreAboutToResetTheRootPassword": "ルートパスワードをリセットしようとしています。安全に保管してください。", + "youAreAboutToResetTheRootToken": "ルートトークンをリセットしようとしています。この操作は元に戻せません。", + "yourLoginInformationHasBeenUpdated": "ログイン情報が更新されました。再度ログインする必要はありません。", + "yourProxyHasBeenSuccessfully": "プロキシは正常に{{action}}されました。" + }, + "sign_out": { + "confirm": "サインアウト", + "desc": "本当にサインアウトしますか? アカウントにアクセスするには再度サインインが必要です。", + "title": "サインアウト" + }, + "systemConfig": { + "pageDescription": "これらのパラメータは、CLIフラグまたは環境変数を介して初期化されます。環境の一貫性を確保するため、現在は読み取り専用です。", + "pageTitle": "システムレベルの設定", + "sections": { + "cors": { + "desc": "クロスオリジンアクセスのルール", + "title": "CORS" + }, + "logging": { + "desc": "ログ出力の動作", + "title": "ロギング" + }, + "network": { + "desc": "HTTPおよびパブリックアクセス", + "title": "ネットワーク" + }, + "performance": { + "desc": "並行性と圧縮", + "title": "パフォーマンス" + }, + "security": { + "desc": "認証と暗号化", + "title": "セキュリティ" + }, + "smtp": { + "desc": "リアルタイムアーカイブ用の受信メール設定", + "title": "SMTPサーバー" + }, + "storage": { + "desc": "データベースのパスと制限", + "title": "ストレージとキャッシュ" + } + }, + "status": { + "auto": "自動", + "configured": "設定済み", + "disabled": "無効", + "enabled": "有効", + "missing": "未設定", + "notSet": "未設定" + } + }, + "table": { + "asc": "昇順", + "delete": "削除", + "desc": "降順", + "edit": "編集", + "hide": "非表示", + "loading": "読み込み中...", + "noResults": "結果が見つかりませんでした", + "of": "/", + "page": "ページ", + "pagination": { + "first": "最初のページへ", + "fixed_page_size": "1ページあたり {{size}} 行。", + "last": "最後のページへ", + "next": "次のページ", + "page_info": "{{page}} / {{total}} ページ", + "previous": "前のページ", + "rows_per_page": "ページあたりの行数", + "selected": "{{selected}} / {{total}} 行を選択済み。" + }, + "results": "件", + "rowsPerPage": "1ページあたりの行数", + "showing": "表示中", + "to": "〜" + }, + "tag": { + "clear_all": "すべてのタグをクリア", + "label": "タグ", + "no_tags_found": "タグが見つかりません", + "search_placeholder": "タグを検索..." + }, + "time": { + "absolute_range": "絶対日付範囲", + "apply": "適用", + "before": "以前", + "clear_filters": "時間フィルターをクリア", + "days_ago_to_now": "日前〜現在", + "end_date": "終了日", + "format": "yyyy-MM-dd", + "historical": "過去の範囲(以前)", + "label": "時間", + "last_day": "過去 1 日", + "last_days": "過去 {{count}} 日", + "last_months": "過去 {{count}} か月", + "over_years_ago": "{{count}}{{unit}}前", + "recent_prefix": "最近:", + "recent_range": "最近の範囲(以降)", + "since": "以降", + "start_date": "開始日", + "year": "年", + "years": "年" + }, + "users": { + "actions": { + "api_tokens": "API トークン", + "buttons": { + "add_account": "アカウントを追加", + "create": "ユーザーを作成", + "update": "ユーザーを更新" + }, + "delete": { + "alert_desc": "削除すると、ユーザーと関連データはすべて直ちに消去されます。", + "alert_title": "警告:この操作は永続的です。", + "button_confirm": "ユーザーを削除", + "button_deleting": "削除中...", + "confirm_msg": "ユーザー {{name}} (ID: {{id}}) を完全に削除しようとしています。", + "input_label": "確認のため、下にユーザー ID を入力してください:", + "irreversible": "この操作は取り消せません。", + "placeholder": "確認のために「{{id}}」と入力", + "title": "ユーザー削除", + "toast": { + "failed_fallback": "ユーザーの削除に失敗しました。", + "failed_title": "削除失敗", + "success_desc": "ユーザー「{{name}}」が正常に削除されました。", + "success_title": "ユーザーを削除しました" + } + }, + "dialog": { + "create_title": "新規ユーザー作成", + "edit_title": "ユーザー編集: {{name}}", + "subtitle": "ID、アクセスレベル、およびセキュリティポリシーを設定します。" + }, + "fields": { + "assign_role": "ロールを割り当て", + "burst_interval": "バースト間隔 (秒)", + "description": "説明 (任意)", + "description_hint": "内部用の説明(最大 256 文字)。", + "description_placeholder": "ユーザーに関するメモを追加...", + "email": "メールアドレス", + "email_hint": "主要な連絡先および通知用アドレス。", + "global_roles_hint": "高度なシステム権限を割り当てます。", + "ip_whitelist": "IP ホワイトリスト", + "ip_whitelist_hint": "ログインを制限する IP アドレス(1 行に 1 つ)。", + "password": "パスワード", + "password_hint_create": "初期設定用の安全なパスワード。", + "password_hint_edit": "パスワードを変更する場合のみ入力してください。", + "password_placeholder_create": "8 文字以上", + "password_placeholder_edit": "現在のパスワードを維持する場合は空白", + "rate_quota": "レート制限", + "select_account": "アカウントを選択", + "username": "ユーザー名", + "username_hint": "ログインに使用する一意識別子。" + }, + "placeholder": { + "filter": "ユーザーを検索..." + }, + "schema": { + "account_required": "アカウントを選択してください", + "description_max": "説明は 256 文字以内である必要があります", + "email_invalid": "有効なメールアドレスを入力してください", + "email_required": "メールアドレスは必須です", + "global_role_required": "少なくとも 1 つのグローバルロールを割り当ててください", + "ip_invalid": "無効な IP アドレスが検出されました", + "password_max": "パスワードは 256 文字以内である必要があります", + "password_min": "パスワードは 8 文字以上である必要があります", + "password_required": "パスワードは必須です", + "role_required": "ロールを選択してください", + "username_max": "ユーザー名は 32 文字以内である必要があります", + "username_min": "ユーザー名は 3 文字以上である必要があります", + "username_required": "ユーザー名は必須です" + }, + "sections": { + "basic": "基本設定", + "global": "グローバル権限", + "mail_access": "メールアクセス制御", + "mail_access_subtitle": "このユーザーが管理できるメールアカウントを定義します。", + "policy": "ポリシー切り替え" + }, + "states": { + "full_access": "フルアクセスモード", + "full_access_desc": "システム管理者ロールを持つユーザーは、手動の割り当てなしですべてのアカウントにアクセスできます。", + "no_accounts": "特定のアカウントは割り当てられていません。", + "security_disabled": "現在、高度なセキュリティポリシーは無効です。" + }, + "tabs": { + "general": "基本情報", + "permissions": "アカウント権限", + "security": "セキュリティと ACL" + }, + "toast": { + "created": "ユーザーを作成しました", + "updated": "ユーザーを更新しました" + } + }, + "api_tokens": { + "button": { + "generate": "新規トークン生成" + }, + "delete": { + "confirm_button": "トークンを削除", + "confirm_label": "確認のため、下に {{word}} と入力してください:", + "confirm_placeholder": "確認のために「{{word}}」と入力", + "deleting": "削除中...", + "desc": "この API トークンを完全に削除しようとしています", + "irreversible": "この操作は取り消せません。このトークンを使用しているすべてのアプリケーションは、直ちにアクセスできなくなります。", + "prefix": "トークン接頭辞", + "title": "API トークンの削除", + "warning_desc": "このトークンを使用しているスクリプト、サービス、または統合は失敗します。続行する前にシステムが更新されていることを確認してください。", + "warning_title": "警告" + }, + "empty": { + "description": "システム内に API トークンがまだ生成されていません。", + "title": "API トークンが見つかりません" + }, + "table": { + "api_key": "API キー", + "created": "作成日", + "expired": "期限切れ", + "expires_at": "有効期限", + "last_used": "最終使用", + "name": "名前", + "never": "なし", + "owner": "所有者", + "permanent": "無期限", + "type": "タイプ", + "unnamed": "未命名トークン", + "web_ui": "Web UI" + }, + "toast": { + "delete_failed": "トークンの削除に失敗しました。もう一度お試しください。", + "delete_failed_title": "削除に失敗しました", + "deleted_desc": "トークン「{{name}}」が正常に削除されました。", + "deleted_title": "API トークンを削除しました" + }, + "toolbar": { + "search_placeholder": "名前、所有者、またはトークンで検索..." + }, + "unnamed": "未命名トークン" + }, + "buttons": { + "add": "ユーザーを追加", + "add_new": "新規ユーザー追加" + }, + "columns": { + "actions": "操作", + "avatar": "アバター", + "created_at": "作成日時", + "email": "メールアドレス", + "id": "ID", + "roles": "ロールと権限", + "updated_at": "更新日時", + "username": "ユーザー名" + }, + "empty": { + "description": "下のボタンをクリックして、最初のユーザーを追加してください。", + "title": "ユーザーが見つかりません" + }, + "nav": { + "api_tokens": "API トークン", + "roles": "ロール", + "users": "ユーザー" + }, + "tokens": { + "dialog": { + "create_title": "アクセストークンの作成", + "description": "完了したら保存をクリックしてください。", + "edit_title": "アクセストークンの編集" + }, + "error": { + "fallback": "操作に失敗しました。後でもう一度お試しください。" + }, + "expire_options": { + "1_day": "1 日", + "30_days": "30 日", + "7_days": "7 日", + "never": "無期限" + }, + "fields": { + "expire_hint": "トークンは選択した時間の経過後に自動的に失効します。", + "expire_label": "有効期限", + "expire_placeholder": "期限を選択", + "name_hint": "任意 · 最大 32 文字", + "name_label": "名前", + "name_placeholder": "このトークンに短い名前を付けてください" + }, + "schema": { + "expire_int": "整数である必要があります", + "expire_number": "数字である必要があります", + "expire_positive": "0 より大きい必要があります", + "name_max": "最大 32 文字" + }, + "toast": { + "create_failed_title": "作成失敗", + "create_success_desc": "アクセストークンが正常に作成されました。", + "create_success_title": "アクセストークンを作成しました", + "update_failed_title": "更新失敗", + "update_success_desc": "アクセストークンが正常に更新されました。", + "update_success_title": "アクセストークンを更新しました" + } + }, + "tokens_action": { + "buttons": { + "add": "トークンを追加" + }, + "delete_dialog": { + "description": "この操作は取り消せません。", + "title": "アクセストークンを削除しますか?" + }, + "dialog": { + "description": "このユーザーの API トークンを管理します。", + "title": "API トークン" + }, + "empty": { + "description": "このユーザーには現在 API トークンがありません。", + "title": "API トークンなし" + }, + "list": { + "button_delete": "トークンを削除", + "expires_on_brief": "{{date}} に期限切れ", + "label_created": "作成日", + "label_expires_at": "有効期限", + "label_last_used": "最終使用", + "label_token": "トークン", + "never": "なし", + "never_expires": "無期限", + "status_active": "アクティブ", + "status_expired": "期限切れ", + "unnamed_token": "未命名トークン" + } + } + }, + "validation": { + "emailRequired": "メールアドレスは必須です", + "folderLimitMustBeAtLeast100": "フォルダーの制限は100以上である必要があります", + "folderLimitMustBeNumber": "フォルダーの制限は数値である必要があります", + "imapHostCannotBeEmpty": "IMAPホストは空にできません", + "imapHostRequired": "IMAPホストは必須です", + "imapPortMustBeLessThan65536": "IMAPポートは65536未満である必要があります", + "imapPortMustBePositive": "IMAPポートは正の整数である必要があります", + "incrementalSyncMustBeAtLeast10": "増分同期間隔は10分以上である必要があります", + "incrementalSyncMustBeNumber": "増分同期間隔は数値である必要があります", + "invalidEmail": "無効なメールアドレスです", + "invalidUrl": "無効なURLです", + "passwordMinLength": "パスワードは{{min}}文字以上である必要があります", + "passwordRequired": "認証方式がパスワードの場合、パスワードは必須です", + "pleaseEnterPassword": "パスワードを入力してください", + "pleaseEnterUsernameOrEmail": "ユーザー名またはメールアドレスを入力してください", + "required": "このフィールドは必須です", + "singleRequestBatchSizeMustBeNumber": "バッチサイズは数値でなければなりません", + "singleRequestBatchSizeTooLarge": "バッチサイズは最大でも200でなければなりません", + "singleRequestBatchSizeTooSmall": "バッチサイズは最低でも10でなければなりません" + } } \ No newline at end of file diff --git a/web/src/locales/ko.json b/web/src/locales/ko.json index d37a5be..772c8b9 100644 --- a/web/src/locales/ko.json +++ b/web/src/locales/ko.json @@ -1,1614 +1,1630 @@ { - "common": { - "submit": "제출", + "accessTokens": { + "aListOfIpAddressesAllowed": "리소스에 접근이 허용된 IP 주소 목록입니다. 한 줄에 하나의 IP 주소를 입력하십시오. (선택 사항)", + "accountId": "계정 ID", + "accounts": "계정", + "aclRulesForAccessTokens": "접근 토큰에 대한 ACL 규칙에는 IP 화이트리스트 확인 및 속도 제한 적용이 포함됩니다.", + "actions": { + "delete": "삭제", + "edit": "편집", + "openMenu": "메뉴 열기" + }, + "addNew": "새로 추가", + "atLeastOneAccountIsRequired": "하나 이상의 계정은 필수입니다.", + "create": "생성", + "createNewAccessTokenHere": "여기에서 새 접근 토큰을 생성하십시오.", + "created": "생성됨", + "createdAt": "생성일", + "creating": "생성 중...", + "creationFailed": "생성 실패", + "delete": "삭제", + "describeThePurposeOfTheAccessToken": "접근 토큰의 목적을 설명하십시오", + "description": "접근 토큰, ACL 규칙, IP 화이트리스트 및 속도 제한 설정을 여기에서 관리하십시오.", + "descriptionMustNotExceed255Characters": "설명은 255자를 초과할 수 없습니다.", + "edit": "편집", + "editToken": "토큰 편집", + "enterIntervalInSeconds": "간격을 초 단위로 입력하십시오. 예: 60", + "enterOneIpAddressPerLine": "한 줄에 하나의 IP 주소를 입력하십시오. 예:\n192.168.1.1\n192.168.1.2", + "enterQuota": "쿼터 입력. 예: 100", + "expiresAt": "만료일", + "filterByEmailAddressOrAccountId": "이메일 주소 또는 계정 ID로 필터링...", + "interval": "간격", + "intervalMustBeAPositiveInteger": "간격은 양의 정수여야 합니다.", + "invalidIpAddressesFound": "유효하지 않은 IP 주소를 찾았습니다. 유효한 IPv4 또는 IPv6 주소를 입력하십시오.", + "name": "이름", + "noTokens": "접근 토큰 없음", + "noTokensDesc": "아직 접근 토큰을 생성하지 않았습니다. 기능을 사용하려면 하나를 생성하십시오.", + "notUsedYet": "아직 사용되지 않음", + "quota": "쿼터", + "quotaMustBeAPositiveInteger": "쿼터는 양의 정수여야 합니다.", + "save": "저장", + "saveChanges": "변경 사항 저장", + "saving": "저장 중...", + "selectAccounts": "계정 선택", + "selectMultipleAccountsForTheAccessToken": "이 접근 토큰이 쿼리하도록 승인된 여러 계정을 선택하십시오.", + "theListOfAccountsThatCanBeQueried": "접근 토큰을 사용하여 쿼리할 수 있는 계정 목록입니다.", + "theMaximumNumberOfRequestsAllowed": "간격 내에서 허용되는 최대 요청 수입니다. (선택 사항)", + "theTimeWindowForTheRateLimit": "속도 제한을 위한 시간 창 (초)입니다. (선택 사항)", + "title": "접근 토큰", + "token": "토큰", + "updateFailed": "업데이트 실패", + "updateOrCreationFailed": "{{action}}에 실패했습니다. 나중에 다시 시도하십시오", + "updateTheAccessTokenHere": "여기에서 접근 토큰을 업데이트하십시오.", + "updated": "업데이트됨", + "updating": "업데이트 중...", + "yourAccessTokenHasBeenSuccessfully": "접근 토큰이 성공적으로 {{action}}되었습니다." + }, + "accounts": { + "accessControl": "액세스 제어", + "accessTokenCopiedToClipboard": "접근 토큰이 클립보드에 복사되었습니다", + "access_control": { + "buttons": { "cancel": "취소", - "save": "저장", - "save_changes": "변경사항 저장", - "delete": "삭제", - "edit": "편집", - "search": "검색", - "add": "추가", - "remove": "제거", - "create": "생성", - "update": "업데이트", - "confirm": "확인", + "save": "할당 저장" + }, + "description": "{{email}}에 역할 및 권한 사용자를 할당합니다", + "role_label": "액세스 역할", + "role_loading": "역할 로드 중...", + "role_placeholder": "역할 선택", + "title": "계정 액세스 할당", + "toast": { + "failed_title": "할당 실패", + "success_desc": "{{email}}에 권한이 성공적으로 할당되었습니다", + "success_title": "할당 성공" + }, + "user_empty": "사용자를 찾을 수 없음", + "user_label": "권한 사용자 선택", + "user_search_placeholder": "사용자 이름 또는 이메일로 검색...", + "user_selected_count": "선택됨: {{count}}명", + "validation": { + "role_required": "할당할 역할을 선택하세요", + "user_required": "최소 한 명의 사용자를 선택하세요" + } + }, + "accountCreated": "계정 생성됨", + "accountCreatedDesc": "계정이 성공적으로 생성되었습니다.", + "accountCreationFailed": "계정 생성 실패", + "accountDetails": "계정 세부 정보", + "accountHasBeenSuccessfully": "계정이 성공적으로 {{action}}되었습니다", + "accountSyncFoldersUpdateFailed": "계정 동기화 폴더 업데이트 실패", + "accountSyncFoldersUpdated": "계정 동기화 폴더 업데이트됨", + "accountUpdateFailed": "계정 업데이트 실패", + "accountUpdated": "계정 업데이트됨", + "accountUpdatedDesc": "계정이 성공적으로 업데이트되었습니다.", + "actions": "작업", + "addAccount": "계정 추가", + "addConfiguration": "구성 추가", + "addImap": "IMAP 계정 추가", + "addNewEmailAccountHere": "여기에서 새 이메일 계정을 추가하십시오.", + "addNoSync": "동기화 안 함 계정 추가", + "allMailFolderSelected": "주의: '모든 메일' 폴더가 선택되었습니다", + "allMailFolderSelectedDesc": "'모든 메일' 속성을 가진 폴더를 선택하면 받은 편지함이나 보낸 항목과 같은 폴더에서 이미 동기화된 메시지가 중복될 수 있습니다. 이로 인해 저장 공간이 상당히 많이 사용될 수 있습니다.", + "allMailSkipped": "기본 폴더가 선택되었습니다. 중복을 방지하기 위해 '모든 메일'은 건너뛰었습니다.", + "areYouSureYouWantTo": "이 계정을 정말 {{action}}하시겠습니까?", + "auth": "인증", + "authType": "인증 유형", + "autoConfiguring": "자동 구성 중...", + "beforeRelative": "이전 이메일만 다운로드", + "beforeRelativeValue": "{{value}} {{unit}} 전의 이메일 다운로드", + "capabilities": "기능", + "chooseAuthMethod": "IMAP에 사용할 인증 방법을 선택하십시오.", + "chooseEncryptionMethod": "IMAP에 사용할 암호화 방법을 선택하십시오.", + "chooseMailboxesToDownload": "{{email}}에 대해 다운로드할 메일함을 선택하세요. 새로 추가된 메일함은 다음 주기에서 다운로드됩니다.", + "clickHere": "여기를 클릭하십시오", + "clickSaveWhenDone": "완료되면 '저장'을 클릭하십시오.", + "continue": "계속", + "createdAt": "생성일", + "creationFailed": "생성에 실패했습니다. 나중에 다시 시도하십시오.", + "dateSelection": "날짜 선택", + "dateSince": "동기화 시작일", + "days": "일", + "delete": "삭제", + "description": "이메일 계정을 관리하고 구성합니다.", + "detail": "세부 정보", + "detailsOfTheOAuth2TokensForTheAccount": "이 계정의 OAuth2 토큰에 대한 세부 정보입니다.", + "determinesWhetherThisAccountIsActiveNoSync": "이 계정이 활성화되어 있는지 결정합니다. 비활성화되면 데이터를 가져올 수 없습니다.", + "disable": "비활성화", + "disableAccount": "계정 비활성화", + "disabled": "비활성화", + "downloadAll": "모든 이메일 다운로드", + "downloadBatchSize": "다운로드 일괄 처리 크기", + "downloadBatchSizeDescription": "IMAP 요청당 가져온 메시지 수", + "downloadInterval": "다운로드 주기 (분)", + "downloadIntervalPlaceholder": "분 단위 입력", + "downloadScope": "다운로드 전략", + "downloadScopeDescription": "색인화 및 다운로드할 이메일을 선택하십시오.", + "duration": "기간", + "edit": "편집", + "email": "이메일", + "emailAccountRegistration": "이메일 계정 등록", + "emailAccountRegistrationDesc": "이메일 주소를 입력하세요. 다음 단계에서 IMAP 설정을 구성합니다. 이 주소를 사용하여 IMAP 서버 설정을 자동으로 감지합니다。", + "emailAddress": "이메일 주소", + "emailCannotBeModified": "편집 시 계정 이메일 주소는 수정할 수 없습니다.", + "emailPlaceholder": "예: john.doe@example.com", + "enable": "활성화", + "enableAccount": "계정 활성화", + "enabled": "활성화됨", + "enabledDescription": "이 계정의 활성화 여부를 결정합니다. 비활성화하면 관련 다운로드가 실행되지 않습니다.", + "encryption": "암호화", + "enterPassword": "비밀번호 입력", + "enterValue": "값 입력", + "everyMinutes": "매 {{minutes}}분", + "field": "필드", + "fixed": "고정", + "folderLimit": "폴더 제한", + "folderLimitDescription": "폴더당 동기화할 이메일 수를 제한합니다(최소 100). 제한이 없으면 비워 두십시오.", + "folderLimitPlaceholder": "예: 1000", + "folderSync": { + "autoSelectDescendants": "하위 항목 자동 선택", + "autoSelectParents": "상위 항목 자동 선택", + "batches": "배치", + "collapseAll": "모두 접기", + "expandAll": "모두 펼치기", + "loadingMailboxFolders": "메일 폴더 로딩 중…", + "noData": "데이터 없음", + "noFolders": "동기화할 폴더가 없습니다" + }, + "foldersConfiguredForSync": "동기화하도록 구성된 폴더: {{count}}개", + "foldersSelected": "선택된 폴더: {{count}}개", + "goBack": "뒤로 가기", + "host": "호스트", + "id": "ID", + "imap": "IMAP", + "imapAuthMethod": "IMAP 인증 방법", + "imapEncryption": "IMAP 암호화", + "imapHost": "IMAP 호스트", + "imapHostPlaceholder": "예: imap.example.com", + "imapPassword": "IMAP 비밀번호", + "imapPort": "IMAP 포트", + "imapPortPlaceholder": "예: 993", + "imapProxy": "IMAP 연결에 SOCKS5 프록시를 사용합니다.", + "incSync": "증분 동기화", + "lastSync": "최종 동기화", + "leaveEmptyToKeepExisting": "기존 비밀번호를 유지하려면 비워 두십시오. 업데이트할 경우에만 새 비밀번호를 입력하십시오.", + "leaveEmptyToKeepPassword": "현재 비밀번호를 유지하려면 비워 두십시오", + "login_name": "로그인 이름", + "minutes": "분", + "months": "개월", + "moreAccountTypes": "더 많은 계정 유형", + "mustBeAtLeast1": "최소 1 이상이어야 합니다", + "name": "이름", + "nameDescription": "IMAP 사용자 이름. 기본값은 이메일이며, 직접 입력도 가능합니다.", + "namePlaceholder": "예: john.doe", + "noAccountConfigurations": "계정 구성 없음", + "noAccountConfigurationsDesc": "아직 계정 구성을 추가하지 않았습니다. 기능을 사용하려면 추가하십시오.", + "noOAuth2Tokens": "OAuth2 토큰 없음", + "none": "없음", + "notAvailable": "해당 없음", + "oauth2Tokens": "OAuth2 토큰", + "openMenu": "메뉴 열기", + "optional": "선택 사항", + "owner": "생성자", + "password": "비밀번호", + "port": "포트", + "recent": "최근", + "refreshToken": "새로 고침 토큰", + "refreshTokenCopiedToClipboard": "새로 고침 토큰이 클립보드에 복사되었습니다", + "relative": "상대적", + "runningState": { + "account": { + "id": "계정 ID" + }, + "common": { "close": "닫기", - "yes": "예", - "no": "아니요", - "ok": "확인", - "loading": "로드 중...", - "empty": "비어 있음", - "noData": "데이터 없음", - "table": { - "noResults": "결과가 없습니다." - }, - "failed": "실패", - "notFound": "찾을 수 없음", - "back": "뒤로", - "goBack": "뒤로 가기", - "backToHome": "홈으로 돌아가기", - "tryAgain": "다시 시도", - "more": "더 보기", - "actions": "작업", - "filter": "필터", - "reset": "초기화", - "clear": "지우기", - "error": "오류", - "apply": "적용", - "select": "선택", - "selectAll": "전체 선택", - "deselectAll": "전체 선택 해제", - "all": "전체", - "none": "없음", - "showLess": "간략히 보기", - "showMore": "더 보기...", - "project_description": "Bichon은 오픈 소스 프로젝트입니다.", - "view_on_github_button": "GitHub에서 보기", - "op_failed": "작업 실패", - "na": "해당 없음", - "retry": "재시도", - "deleting": "삭제 중..." - }, - "navigation": { - "home": "홈", - "settings": "설정", - "accounts": "계정", - "dashboard": "대시보드", - "mailbox": "받은 편지함", - "oauth2": "OAuth2", - "accessTokens": "접근 토큰", - "apiDocs": "API 문서", - "general": "일반", - "auth": "인증", - "other": "기타", - "users": "시스템 사용자" - }, - "auth": { - "welcome": "Bichon에 오신 것을 환영합니다", - "username": "사용자 이름", - "password": "비밀번호", - "login": "로그인", - "loginFailed": "로그인 실패", - "invalidPassword": "비밀번호가 유효하지 않습니다. 다시 시도해 주세요.", - "somethingWentWrong": "문제가 발생했습니다", - "sessionExpired": "세션이 만료되었습니다!", - "sessionExpiredDesc": "비활성화로 인해 세션이 종료되었습니다. 계속하려면 다시 로그인하십시오.", - "logout": "로그아웃", - "areYouSureYouWantToLogOut": "정말로 로그아웃하시겠습니까?", - "youWillNeedToLogInAgain": "계정에 접근하려면 다시 로그인해야 합니다." - }, - "errors": { - "pageNotFound": "죄송합니다! 페이지를 찾을 수 없습니다!", - "pageNotFoundDesc": "찾고 있는 페이지가 존재하지 않거나 제거되었을 수 있습니다.", - "somethingWentWrong": "죄송합니다! 문제가 발생했습니다 :')", - "somethingWentWrongDesc": "불편을 드려 죄송합니다. 나중에 다시 시도해 주십시오.", - "internalServerError": "내부 서버 오류!", - "contentNotModified": "콘텐츠가 수정되지 않았습니다!", - "networkError": "네트워크 오류", - "networkErrorDesc": "서버에 연결할 수 없습니다. 인터넷 연결을 확인하고 다시 시도하십시오.", - "forbidden": "금지됨", - "forbiddenTitle": "접근 금지", - "forbiddenDesc": "이 리소스를 볼 수 있는 권한이 없습니다.", - "unauthorized": "승인되지 않음", - "unauthorizedTitle": "승인되지 않은 접근", - "unauthorizedDesc": "이 리소스에 접근하려면 적절한 자격 증명으로 로그인하십시오.", - "maintenance": "유지 보수", - "maintenanceTitle": "사이트가 유지 보수 중입니다!", - "maintenanceDesc": "사이트를 일시적으로 사용할 수 없습니다. 곧 다시 돌아오겠습니다.", - "learnMore": "더 알아보기" - }, - "dashboard": { - "title": "대시보드", - "mailAccounts": "메일 계정", - "connected": "연결됨", - "totalEmails": "총 이메일 수", - "syncedLocally": "로컬 동기화됨", - "totalEmailSize": "총 이메일 크기", - "logicalVolume": "원래 크기", - "localDataFiles": "로컬 데이터 파일", - "actualDiskUsage": "실제 디스크 사용량", - "efficiency": "압축 효율", - "saved": "절약됨", - "dataStorage": "데이터 스토리지", - "indexSize": "인덱스 크기", - "metadataSize": "메타데이터 크기", - "tantivyDatabase": "Tantivy 검색 엔진 기반", - "dayTrend": "30일 추세", - "attachments": "첨부 파일", - "topLists": "상위 목록", - "newEmails": "새 이메일", - "messageDistribution": "메시지 배포", - "attachmentRatio": "첨부 파일 비율", - "attachmentRatioDesc": "이메일의 {{percent}}%에 첨부 파일이 있습니다", - "noEmailsSynced": "아직 동기화된 이메일이 없습니다", - "withAttachments": "첨부 파일 포함", - "noAttachments": "첨부 파일 없음", - "top10Senders": "상위 10명 발신자", - "byMessageCount": "메시지 수 기준", - "sender": "발신자", - "count": "수", - "top10LargestEmails": "상위 10개 최대 크기 이메일", - "byMessageSize": "메시지 크기 기준", - "subject": "제목", - "size": "크기", - "noSubject": "(제목 없음)", - "top10Accounts": "상위 10개 계정", - "emails": "이메일", - "account": "계정", - "noRecentActivity": "최근 활동 없음", - "noSendersData": "발신자 데이터 없음", - "noLargeEmails": "크기가 큰 이메일 없음", - "noAccountData": "계정 데이터 없음", - "systemVersion": "시스템 버전" - }, - "accounts": { - "beforeRelativeValue": "{{value}} {{unit}} 전의 이메일 다운로드", - "sinceRelativeValue": "최근 기간의 이메일 다운로드", - "downloadBatchSize": "다운로드 일괄 처리 크기", - "downloadBatchSizeDescription": "IMAP 요청당 가져온 메시지 수", - "downloadScopeDescription": "색인화 및 다운로드할 이메일을 선택하십시오.", - "downloadScope": "다운로드 전략", - "selectMode": "필터 모드 선택", - "downloadAll": "모든 이메일 다운로드", - "sinceFixed": "특정 날짜 이후", - "sinceRelative": "최근 이메일만 다운로드", - "beforeRelative": "이전 이메일만 다운로드", - "duration": "기간", - "unit": "단위", - "accessControl": "액세스 제어", - "owner": "생성자", - "access_control": { - "title": "계정 액세스 할당", - "description": "{{email}}에 역할 및 권한 사용자를 할당합니다", - "role_label": "액세스 역할", - "role_placeholder": "역할 선택", - "role_loading": "역할 로드 중...", - "user_label": "권한 사용자 선택", - "user_search_placeholder": "사용자 이름 또는 이메일로 검색...", - "user_empty": "사용자를 찾을 수 없음", - "user_selected_count": "선택됨: {{count}}명", - "buttons": { - "cancel": "취소", - "save": "할당 저장" - }, - "validation": { - "user_required": "최소 한 명의 사용자를 선택하세요", - "role_required": "할당할 역할을 선택하세요" - }, - "toast": { - "success_title": "할당 성공", - "success_desc": "{{email}}에 권한이 성공적으로 할당되었습니다", - "failed_title": "할당 실패" - } - }, - "title": "이메일 계정", - "description": "이메일 계정을 관리하고 구성합니다.", - "addImap": "IMAP 계정 추가", - "addNoSync": "동기화 안 함 계정 추가", - "moreAccountTypes": "더 많은 계정 유형", - "noAccountConfigurations": "계정 구성 없음", - "noAccountConfigurationsDesc": "아직 계정 구성을 추가하지 않았습니다. 기능을 사용하려면 추가하십시오.", - "addConfiguration": "구성 추가", - "useNoProxy": "프록시 없음", - "login_name": "로그인 이름", - "name": "이름", - "email": "이메일", + "folders": "메일함" + }, + "empty": { + "no_active_download": "진행 중인 다운로드가 없습니다", + "no_errors_current": "현재 작업에 오류가 없습니다", + "no_errors_session": "이 작업에 오류가 없습니다", + "no_global_errors": "전체 오류가 없습니다", + "no_history": "기록이 없습니다" + }, + "folders": "메일함", + "latest": "최신", + "loading": { + "fetching_account_state": "계정 상태를 불러오는 중..." + }, + "message": "메시지", + "session": { + "started_at": "시작 시간", "status": "상태", - "type": "유형", - "lastSync": "최종 동기화", - "actions": "작업", - "edit": "편집", - "delete": "삭제", - "detail": "세부 정보", - "selectMailboxes": "메일함 선택", - "oauth2Tokens": "OAuth2 토큰", - "id": "ID", - "enabled": "활성화됨", - "auth": "인증", - "incSync": "증분 동기화", - "state": "상태", - "createdAt": "생성일", - "updatedAt": "업데이트일", - "openMenu": "메뉴 열기", - "emailAccountRegistration": "이메일 계정 등록", - "emailAccountRegistrationDesc": "이메일 주소를 입력하세요. 다음 단계에서 IMAP 설정을 구성합니다. 이 주소를 사용하여 IMAP 서버 설정을 자동으로 감지합니다。", - "emailAddress": "이메일 주소", - "emailPlaceholder": "예: john.doe@example.com", - "namePlaceholder": "예: john.doe", - "optional": "선택 사항", - "nameDescription": "IMAP 사용자 이름. 기본값은 이메일이며, 직접 입력도 가능합니다.", - "emailCannotBeModified": "편집 시 계정 이메일 주소는 수정할 수 없습니다.", - "addAccount": "계정 추가", - "updateAccount": "계정 업데이트", - "accountUpdated": "계정 업데이트됨", - "accountCreated": "계정 생성됨", - "accountUpdatedDesc": "계정이 성공적으로 업데이트되었습니다.", - "accountCreatedDesc": "계정이 성공적으로 생성되었습니다.", - "accountUpdateFailed": "계정 업데이트 실패", - "accountCreationFailed": "계정 생성 실패", - "updateFailed": "업데이트에 실패했습니다. 나중에 다시 시도하십시오.", - "creationFailed": "생성에 실패했습니다. 나중에 다시 시도하십시오.", - "allMailFolderSelected": "주의: '모든 메일' 폴더가 선택되었습니다", - "accountSyncFoldersUpdated": "계정 동기화 폴더 업데이트됨", - "accountSyncFoldersUpdateFailed": "계정 동기화 폴더 업데이트 실패", - "serverConfiguration": "서버 구성 (IMAP)", - "selectedMailboxes": "선택된 메일함", - "allMailFolderSelectedDesc": "'모든 메일' 속성을 가진 폴더를 선택하면 받은 편지함이나 보낸 항목과 같은 폴더에서 이미 동기화된 메시지가 중복될 수 있습니다. 이로 인해 저장 공간이 상당히 많이 사용될 수 있습니다.", - "allMailSkipped": "기본 폴더가 선택되었습니다. 중복을 방지하기 위해 '모든 메일'은 건너뛰었습니다.", - "selectAtLeastOneFolder": "하나 이상의 폴더를 선택하십시오", - "chooseMailboxesToDownload": "{{email}}에 대해 다운로드할 메일함을 선택하세요. 새로 추가된 메일함은 다음 주기에서 다운로드됩니다.", - "accountDetails": "계정 세부 정보", - "capabilities": "기능", - "folderLimit": "폴더 제한", - "everyMinutes": "매 {{minutes}}분", - "foldersConfiguredForSync": "동기화하도록 구성된 폴더: {{count}}개", - "foldersSelected": "선택된 폴더: {{count}}개", - "imapHost": "IMAP 호스트", - "imapHostPlaceholder": "예: imap.example.com", - "imapPort": "IMAP 포트", - "imapPortPlaceholder": "예: 993", - "imapEncryption": "IMAP 암호화", - "selectEncryptionMethod": "암호화 방법 선택", - "chooseEncryptionMethod": "IMAP에 사용할 암호화 방법을 선택하십시오.", - "imapAuthMethod": "IMAP 인증 방법", - "selectAuthMethod": "인증 방법 선택", - "chooseAuthMethod": "IMAP에 사용할 인증 방법을 선택하십시오.", - "imapPassword": "IMAP 비밀번호", - "leaveEmptyToKeepPassword": "현재 비밀번호를 유지하려면 비워 두십시오", - "enterPassword": "비밀번호 입력", - "leaveEmptyToKeepExisting": "기존 비밀번호를 유지하려면 비워 두십시오. 업데이트할 경우에만 새 비밀번호를 입력하십시오.", - "useProxy": "프록시 사용", - "selectProxy": "프록시 선택", - "downloadInterval": "다운로드 주기 (분)", - "downloadIntervalPlaceholder": "분 단위 입력", - "enabledDescription": "이 계정의 활성화 여부를 결정합니다. 비활성화하면 관련 다운로드가 실행되지 않습니다.", - "dateSince": "동기화 시작일", - "none": "없음", - "fixed": "고정", - "relative": "상대적", - "selectDate": "날짜 선택", - "selectUnit": "단위 선택", - "days": "일", - "months": "개월", - "years": "년", - "enterValue": "값 입력", - "mustBeAtLeast1": "최소 1 이상이어야 합니다", - "dateSelection": "날짜 선택", - "since": "이후", - "recent": "최근", - "notAvailable": "해당 없음", - "host": "호스트", - "port": "포트", - "encryption": "암호화", - "authType": "인증 유형", - "password": "비밀번호", - "useProxyField": "프록시 사용", - "clickSaveWhenDone": "완료되면 '저장'을 클릭하십시오.", - "step": "단계 {{index}}", - "goBack": "뒤로 가기", - "autoConfiguring": "자동 구성 중...", - "continue": "계속", - "saveChanges": "변경 사항 저장", - "submit": "제출", - "field": "필드", - "value": "값", - "refreshToken": "새로 고침 토큰", - "accessTokenCopiedToClipboard": "접근 토큰이 클립보드에 복사되었습니다", - "refreshTokenCopiedToClipboard": "새로 고침 토큰이 클립보드에 복사되었습니다", - "noOAuth2Tokens": "OAuth2 토큰 없음", - "theAccountHasNotCompletedTheAuthorizationProcess": "이 계정은 인증 프로세스를 완료하지 않았습니다. 계정을 인증하려면 ", - "clickHere": "여기를 클릭하십시오", - "toAuthorizeTheAccount": ".", - "detailsOfTheOAuth2TokensForTheAccount": "이 계정의 OAuth2 토큰에 대한 세부 정보입니다.", - "updateTheEmailAccountHere": "여기에서 이메일 계정을 업데이트하십시오.", - "addNewEmailAccountHere": "여기에서 새 이메일 계정을 추가하십시오.", - "thisAccountIsUsedForIdentificationPurposesOnly": "이 계정은 식별 목적으로만 사용되며 이메일 서버와의 동기화가 필요하지 않습니다. 이메일 데이터 가져오기에 도움이 됩니다.", - "determinesWhetherThisAccountIsActiveNoSync": "이 계정이 활성화되어 있는지 결정합니다. 비활성화되면 데이터를 가져올 수 없습니다.", - "folderSync": { - "noData": "데이터 없음", - "noFolders": "동기화할 폴더가 없습니다", - "batches": "배치", - "autoSelectDescendants": "하위 항목 자동 선택", - "autoSelectParents": "상위 항목 자동 선택", - "expandAll": "모두 펼치기", - "collapseAll": "모두 접기", - "loadingMailboxFolders": "메일 폴더 로딩 중…" - }, - "viewDetails": "세부 정보 보기", - "runningState": { - "message": "메시지", - "account": { - "id": "계정 ID" - }, - "tabs": { - "active_session": "현재 작업", - "history": "기록", - "global_errors": "전체 오류", - "folders": "메일함", - "errors": "오류" - }, - "loading": { - "fetching_account_state": "계정 상태를 불러오는 중..." - }, - "empty": { - "no_active_download": "진행 중인 다운로드가 없습니다", - "no_errors_current": "현재 작업에 오류가 없습니다", - "no_errors_session": "이 작업에 오류가 없습니다", - "no_global_errors": "전체 오류가 없습니다", - "no_history": "기록이 없습니다" - }, - "session": { - "status": "상태", - "trigger": "트리거", - "started_at": "시작 시간" - }, - "common": { - "folders": "메일함", - "close": "닫기" - }, - "latest": "최신", - "folders": "메일함" - }, - "steps": { - "complete": "완료", - "emailAddress": "이메일 주소", - "imap": "IMAP", - "syncPreferences": "동기화 기본 설정", - "summary": "요약" - }, - "imapProxy": "IMAP 연결에 SOCKS5 프록시를 사용합니다.", - "syncStartDateDescription": "동기화 시작 날짜(고정 날짜 또는 현재 시점으로부터 상대적인 날짜)를 정의합니다. 이 날짜 이전의 이메일은 제외됩니다. {{fixedPart}}.", - "syncAfterDate": "설정된 날짜 이후의 데이터를 동기화합니다", - "syncRecentData": "동기화 날짜를 시간에 따라 슬라이딩하여 최근 데이터만 동기화합니다", - "folderLimitDescription": "폴더당 동기화할 이메일 수를 제한합니다(최소 100). 제한이 없으면 비워 두십시오.", - "folderLimitPlaceholder": "예: 1000", - "imap": "IMAP", - "minutes": "분", - "accountHasBeenSuccessfully": "계정이 성공적으로 {{action}}되었습니다", - "enableAccount": "계정 활성화", - "disableAccount": "계정 비활성화", - "areYouSureYouWantTo": "이 계정을 정말 {{action}}하시겠습니까?", - "enable": "활성화", - "disable": "비활성화", - "thisWillPreventTheAccountFromBeingUsed": "이 계정은 더 이상 IMAP 서버에서 데이터를 동기화하지 않지만, 기존 데이터는 계속 조회할 수 있습니다.", - "disabled": "비활성화", - "useDangerous": "모든 TLS 인증서를 신뢰", - "useDangerousDescription": "공개 CA 인증서 또는 자체 서명 인증서를 사용하는 IMAP 서버에 연결할 때, 시스템에서 인증서를 신뢰하지 않아도 이 옵션을 켜면 무시할 수 있습니다. 하지만 표준 인증서 검증을 무시하기 때문에 중간자 공격에 노출될 수 있습니다 — 위험을 이해한 경우에만 사용하세요" + "trigger": "트리거" + }, + "tabs": { + "active_session": "현재 작업", + "errors": "오류", + "folders": "메일함", + "global_errors": "전체 오류", + "history": "기록" + } }, - "mailbox": { - "deleteMailboxDialog": { - "title": "메일함 폴더 삭제", - "desc": "이 메일함 폴더를 삭제하시겠습니까? 이 작업은 취소할 수 없습니다.", - "warningTitle": "경고", - "warningDesc": "이 폴더를 삭제하면 그 안에 포함된 모든 아카이브된 이메일과 하위 폴더도 영구적으로 삭제됩니다.", - "confirm": "영구 삭제", - "successTitle": "삭제 성공", - "successDesc": "메일함 폴더와 그 내용이 성공적으로 제거되었습니다.", - "errorTitle": "삭제 실패" - }, - "title": "받은 편지함", - "folders": "폴더", - "messages": "메시지", - "noMessages": "메시지 없음", - "selectFolder": "메시지를 보려면 폴더를 선택하십시오", - "deleteDialog": { - "title": "이메일 삭제", - "desc": "{{countText}}를(을) 삭제하시겠습니까? 이 작업은 선택한 이메일을 로컬 데이터베이스에서 영구적으로 제거합니다. 이메일은 영구적으로 손실되며 복구할 수 없습니다.", - "descCountSingle": "이 이메일", - "descCountMultiple": "이 {{count}}개의 이메일", - "warningTitle": "경고!", - "warningDesc": "진행하기 전에 주의하십시오.", - "confirm": "삭제", - "successTitle": "메시지 삭제 성공", - "successDesc": "메시지가 삭제되었습니다.", - "errorTitle": "메시지 삭제 실패" - }, - "thread": { - "title": "스레드 ({{count}}개 {{messageLabel}})", - "message": "메시지", - "messages": "메시지", - "noSubject": "(제목 없음)", - "invalidDate": "유효하지 않은 날짜", - "empty": "이 스레드에 메시지가 없습니다.", - "loadError": "스레드 로드 실패", - "loadingMore": "더 로드 중...", - "loadMore": "더 로드" - }, - "bulkActions": { - "ariaLabel": "선택된 {{count}}개 {{emailLabel}}에 대한 대량 작업", - "email": "이메일", - "emails": "이메일", - "selected": "선택됨", - "clearSelection": "선택 지우기", - "clearSelectionWithKey": "선택 지우기 ({{key}})", - "delete": "삭제", - "deleteTooltip": "선택된 이메일 삭제" - } + "saveChanges": "변경 사항 저장", + "selectAtLeastOneFolder": "하나 이상의 폴더를 선택하십시오", + "selectAuthMethod": "인증 방법 선택", + "selectDate": "날짜 선택", + "selectEncryptionMethod": "암호화 방법 선택", + "selectMailboxes": "메일함 선택", + "selectMode": "필터 모드 선택", + "selectProxy": "프록시 선택", + "selectUnit": "단위 선택", + "selectedMailboxes": "선택된 메일함", + "serverConfiguration": "서버 구성 (IMAP)", + "since": "이후", + "sinceFixed": "특정 날짜 이후", + "sinceRelative": "최근 이메일만 다운로드", + "sinceRelativeValue": "최근 기간의 이메일 다운로드", + "state": "상태", + "status": "상태", + "step": "단계 {{index}}", + "steps": { + "complete": "완료", + "emailAddress": "이메일 주소", + "imap": "IMAP", + "summary": "요약", + "syncPreferences": "동기화 기본 설정" }, - "search": { - "size": "크기", - "any": "전체", - "tiny": "아주 작음 (<15 KB)", - "small": "작음 (<2 MB)", - "medium": "중간 (2 - 10 MB)", - "large": "큼 (10 - 20 MB)", - "huge": "대용량 (≥20 MB)", - "sort": "정렬", - "sizeDescription": "크기는 첨부 파일을 포함한 이메일 전체 크기를 의미합니다.", - "title": "검색", - "searching": "검색 중입니다. 잠시 기다려 주십시오...", - "noEmailsFound": "이메일을 찾을 수 없습니다", - "startSearching": "키워드, 발신자 또는 고급 필터를 사용하여 검색을 시작하십시오.", - "adjustSearch": "검색 기준을 조정하거나 필터를 지워 보십시오.", - "tagFilter": "태그 필터", - "from": "보낸 사람", - "to": "받는 사람", - "subject": "제목", - "date": "날짜", - "editTag": "태그 편집", - "keyword": "키워드", - "sender": "발신자", - "recipient": "수신자", - "hasAttachment": "첨부 파일 있음", - "yes": "예", - "no": "아니요", - "dateRange": "날짜 범위", - "startDate": "시작 날짜", - "endDate": "종료 날짜", - "advancedFilters": "고급 필터", - "searchArchivedEmails": "보관된 이메일 검색", - "fullTextMultiAccount": "전체 텍스트 · 다중 계정 · 고급 필터", - "account": "계정", - "mailbox": "받은 편지함", - "selectAccount": "계정 선택", - "selectMailbox": "받은 편지함 선택", - "noActiveEmailAccount": "활성 이메일 계정이 없습니다.", - "addEmailAccount": "이메일 계정 추가", - "noMailboxSelectAccount": "받은 편지함이 없습니다. 먼저 계정을 선택하십시오.", - "searchInSubjectBody": "제목, 본문, 첨부 파일에서 검색...", - "searchingButton": "검색 중...", - "searchButton": "검색", - "advanced": "고급", - "clear": "지우기", - "since": "이후:", - "before": "이전:", - "selectDate": "날짜 선택", - "pleaseSelectAtLeastOne": "하나 이상의 검색 기준을 선택하십시오", - "cc": "참조", - "bcc": "숨은 참조", - "attachmentName": "첨부 파일 이름", - "messageId": "메시지 ID", - "minSize": "최소 크기", - "maxSize": "최대 크기", - "senderRecipients": "발신자 / 수신자", - "attachmentsSize": "첨부 파일 및 크기", - "minimumBytes": "최소 (바이트)", - "maximumBytes": "최대 (바이트)", - "originalMessageIdHeader": "원본 이메일 Message-ID 헤더", - "addTags": { - "title": "태그 편집", - "none": "아직 추가된 태그가 없습니다", - "searchPlaceholder": "태그 검색 또는 생성...", - "createHint": "새 태그 생성: {{tag}}", - "invalidTitle": "유효하지 않은 태그", - "updatedTitle": "태그 업데이트됨", - "updatedDesc": "태그가 성공적으로 업데이트되었습니다", - "updateFailedTitle": "업데이트 실패", - "tryAgain": "나중에 다시 시도해 주십시오", - "selectedCount": "선택된 태그: {{count}}개", - "cancel": "취소", - "save": "저장", - "saving": "저장 중..." - }, - "updateTags": { - "overwriteWarning": "경고: 이 작업은 선택한 항목의 모든 기존 태그를 덮어씁니다.", - "title": "태그 업데이트", - "none": "선택된 태그 없음", - "searchPlaceholder": "태그 검색 또는 생성...", - "createHint": "Enter를 눌러 새 태그 생성: \"{{tag}}\"", - "selectedCount": "{{count}}개의 태그가 적용됩니다", - "cancel": "취소", - "invalidTitle": "유효하지 않은 태그", - "updatedTitle": "태그 업데이트됨", - "updatedDesc": "태그가 성공적으로 업데이트되었습니다.", - "updateFailedTitle": "업데이트 실패", - "tryAgain": "나중에 다시 시도해 주세요.", - "actionAdd": "추가", - "actionRemove": "제거", - "actionOverwrite": "덮어쓰기", - "submitAdd": "태그 추가", - "submitRemove": "태그 제거", - "submitOverwrite": "태그 덮어쓰기", - "savingAdd": "추가 중...", - "savingRemove": "제거 중...", - "savingOverwrite": "덮어쓰는 중..." - }, - "thread": { - "title": "스레드 · {{count}}개 메시지", - "error": "스레드 로드 실패", - "empty": "이 스레드에 메시지가 없습니다", - "invalidDate": "유효하지 않은 날짜", - "noSubject": "(제목 없음)", - "loadingMore": "로드 중...", - "loadMore": "더 로드" - }, - "bulkActions": { - "ariaLabel": "{{count}}개의 메시지가 선택되었습니다. 일괄 작업 도구 모음", - "delete": "삭제", - "deleteDesc": "선택한 메시지 삭제", - "selected": "{{count}}개 선택됨", - "clear": "선택 해제", - "manageTags": "태그 관리" - }, - "delete": { - "title": "메시지 삭제", - "confirmPrefix": "정말로", - "countLabel": "{{count}}개의 메시지를 삭제하시겠습니까?", - "confirmDetail": "이 작업은 취소할 수 없습니다.", - "confirmButton": "삭제", - "warningTitle": "경고", - "warningDesc": "삭제된 메시지는 영구적으로 제거되며 복구할 수 없습니다.", - "successTitle": "메시지 삭제 완료", - "successDesc": "선택한 메시지가 성공적으로 삭제되었습니다.", - "errorTitle": "삭제 실패" - } + "submit": "제출", + "syncAfterDate": "설정된 날짜 이후의 데이터를 동기화합니다", + "syncRecentData": "동기화 날짜를 시간에 따라 슬라이딩하여 최근 데이터만 동기화합니다", + "syncStartDateDescription": "동기화 시작 날짜(고정 날짜 또는 현재 시점으로부터 상대적인 날짜)를 정의합니다. 이 날짜 이전의 이메일은 제외됩니다. {{fixedPart}}.", + "theAccountHasNotCompletedTheAuthorizationProcess": "이 계정은 인증 프로세스를 완료하지 않았습니다. 계정을 인증하려면 ", + "thisAccountIsUsedForIdentificationPurposesOnly": "이 계정은 식별 목적으로만 사용되며 이메일 서버와의 동기화가 필요하지 않습니다. 이메일 데이터 가져오기에 도움이 됩니다.", + "thisWillPreventTheAccountFromBeingUsed": "이 계정은 더 이상 IMAP 서버에서 데이터를 동기화하지 않지만, 기존 데이터는 계속 조회할 수 있습니다.", + "title": "이메일 계정", + "toAuthorizeTheAccount": ".", + "type": "유형", + "unit": "단위", + "updateAccount": "계정 업데이트", + "updateFailed": "업데이트에 실패했습니다. 나중에 다시 시도하십시오.", + "updateTheEmailAccountHere": "여기에서 이메일 계정을 업데이트하십시오.", + "updatedAt": "업데이트일", + "useDangerous": "모든 TLS 인증서를 신뢰", + "useDangerousDescription": "공개 CA 인증서 또는 자체 서명 인증서를 사용하는 IMAP 서버에 연결할 때, 시스템에서 인증서를 신뢰하지 않아도 이 옵션을 켜면 무시할 수 있습니다. 하지만 표준 인증서 검증을 무시하기 때문에 중간자 공격에 노출될 수 있습니다 — 위험을 이해한 경우에만 사용하세요", + "useNoProxy": "프록시 없음", + "useProxy": "프록시 사용", + "useProxyField": "프록시 사용", + "value": "값", + "viewDetails": "세부 정보 보기", + "years": "년" + }, + "apiDocs": { + "choosePreferredType": "선호하는 API 문서 유형을 선택하십시오", + "downloadSpecYAML": "YAML 사양 다운로드", + "openAPIExplorer": "OpenAPI 탐색기", + "reDoc": "ReDoc", + "scalar": "Scalar", + "swaggerUI": "Swagger UI" + }, + "apiTokens": { + "deleteDialog": { + "cancel": "취소", + "confirm": "삭제", + "deleting": "삭제 중...", + "description": "이 작업은 되돌릴 수 없습니다. 이 토큰을 사용하는 모든 애플리케이션의 접근 권한이 즉시 취소됩니다.", + "title": "액세스 토큰을 삭제하시겠습니까?" }, - "mail": { - "emailViewer": "이메일 뷰어", - "noMessageSelected": "선택된 메시지 없음", - "account": "계정", - "from": "보낸 사람", - "to": "받는 사람", - "subject": "제목", - "date": "날짜", - "tags": "태그", - "noTagsYet": "아직 태그가 없습니다", - "id": "ID", - "cc": "참조", - "bcc": "숨은 참조", - "attachments": "첨부 파일", - "download": "다운로드", - "delete": "삭제", - "viewThread": "스레드 보기", - "downloadStarted": "다운로드 시작됨", - "downloadComplete": "다운로드 완료", - "downloadFailed": "다운로드 실패", - "failedToDownloadFile": "파일 다운로드 실패", - "failedToLoadEmail": "이메일 메시지 로드 실패.", - "isBeingDownloaded": "{{id}} 다운로드 중", - "downloaded": "{{id}} 다운로드됨", - "showLess": "간단히 보기", - "showMore": "더 보기...", - "onlyNonInlineAttachments": "인라인이 아닌 첨부 파일만 여기에 표시됩니다.", - "noAttachments": "첨부 파일 없음" + "dialog": { + "createTitle": "액세스 토큰 생성", + "description": "완료되면 저장을 클릭하세요.", + "editTitle": "액세스 토큰 편집", + "save": "저장", + "saveChanges": "변경 사항 저장" }, - "oauth2": { - "title": "OAuth2", - "addConfiguration": "구성 추가", - "id": "ID", - "provider": "공급자", - "clientId": "클라이언트 ID", - "clientSecret": "클라이언트 보안 비밀", - "redirectUri": "리디렉션 URI", - "scopes": "스코프", - "status": "상태", - "enabled": "활성화됨", - "disabled": "비활성화됨", - "edit": "편집", - "delete": "삭제", - "enable": "활성화", - "disable": "비활성화", - "noConfigurations": "OAuth2 구성 없음", - "noConfigurationsDesc": "아직 OAuth2 구성을 추가하지 않았습니다. 기능을 사용하려면 추가하십시오.", - "description": "접근 토큰 검색, 저장 및 새로 고침을 자동으로 처리하여 원활하고 항상 사용 가능한 인증 경험을 보장합니다.", - "addNew": "새로 추가", - "updateHere": "여기에서 업데이트하십시오.", - "createNewHere": "여기에서 새로 만드십시오.", - "clickSaveWhenDone": "완료되면 '저장'을 클릭하십시오.", - "quickPresets": "빠른 사전 설정:", - "gmail": "Gmail", - "outlook": "Outlook", - "whenDisabled": "비활성화 시: - 새 인증 흐름이 즉시 거부됩니다 - 기존 접근 및 새로 고침 토큰이 1분 이내에 취소됩니다 - 재활성화 시 사용자는 다시 인증해야 합니다", - "clientIdLabel": "클라이언트 ID:", - "enterYourClientId": "클라이언트 ID를 입력하십시오", - "theUniqueIdentifierForYourApplication": "OAuth 공급자가 제공하는 애플리케이션의 고유 식별자입니다.", - "clientSecretLabel": "클라이언트 보안 비밀:", - "leaveEmptyToKeepExistingSecret": "기존 보안 비밀을 유지하려면 비워 두십시오", - "enterYourClientSecret": "클라이언트 보안 비밀을 입력하십시오", - "leaveEmptyToKeepTheExistingSecret": "기존 보안 비밀을 유지하려면 비워 두십시오. 업데이트하는 경우에만 새 값을 입력하십시오.", - "aSecretKeyProvidedByTheOAuthProvider": "OAuth 공급자가 애플리케이션을 인증하기 위해 제공하는 비밀 키입니다.", - "authUrlLabel": "인증 URL:", - "enterTheAuthorizationUrl": "인증 URL을 입력하십시오", - "theUrlWhereUsersWillBeRedirected": "사용자가 인증을 위해 리디렉션될 URL입니다.", - "tokenUrlLabel": "토큰 URL:", - "enterTheTokenUrl": "토큰 URL을 입력하십시오", - "theUrlUsedToExchange": "인증 코드를 접근 토큰으로 교환하는 데 사용되는 URL입니다.", - "redirectUrlLabel": "리디렉션 URI:", - "enterYourRedirectUrl": "리디렉션 URI를 입력하십시오", - "theRedirectUrlAfterAuthorization": "인증 후 리디렉션될 URI입니다. OAuth 공급자에 등록된 것과 일치해야 합니다. http://[host]:[port]/oauth2/callback (또는 https://) 형식을 사용하며, 여기서 [host]와 [port]는 RustMailer 배포판과 일치해야 합니다. `/oauth2/callback` 경로는 고정되어 있습니다.", - "scope": "스코프:", - "enterTheScopeHere": "여기에 스코프를 입력하십시오.", - "addScope": "스코프 추가", - "key": "키:", - "enterTheKeyHere": "여기에 키를 입력하십시오.", - "value": "값:", - "enterTheValueHere": "여기에 값을 입력하십시오.", - "addExtraParams": "추가 매개변수 추가", - "useProxyOptional": "프록시 사용 (선택 사항):", - "selectAProxy": "프록시 선택", - "noProxyAvailable": "사용 가능한 프록시 없음", - "useSocks5ProxyForOAuthRequests": "직접 접근이 차단된 경우 OAuth 요청에 SOCKS5 프록시를 사용합니다.", - "descriptionLabel": "설명:", - "describeThePurposeOfTheOauth2Application": "OAuth2 애플리케이션의 목적을 설명하십시오", - "optional": "선택 사항", - "saving": "저장 중...", - "creating": "생성 중...", - "saveChanges": "변경 사항 저장", - "save": "저장", - "updated": "업데이트됨", - "created": "생성됨", - "yourOAuth2ApplicationHasBeenSuccessfully": "OAuth2 애플리케이션이 성공적으로 {{action}}되었습니다.", - "updateFailed": "업데이트 실패", - "creationFailed": "생성 실패", - "updateOrCreationFailed": "{{action}}에 실패했습니다. 나중에 다시 시도하십시오", - "clientSecretIsRequired": "클라이언트 보안 비밀은 필수입니다", - "clientSecretCannotBeEmpty": "클라이언트 보안 비밀은 비워 둘 수 없습니다", - "keyIsRequired": "키는 필수입니다", - "keyCannotBeEmpty": "키는 비워 둘 수 없습니다", - "valueIsRequired": "값은 필수입니다", - "valueCannotBeEmpty": "값은 비워 둘 수 없습니다", - "descriptionMustNotExceed255Characters": "설명은 255자를 초과할 수 없습니다.", - "clientIdIsRequired": "클라이언트 ID는 필수입니다", - "clientIdCannotBeEmpty": "클라이언트 ID는 비워 둘 수 없습니다", - "authorizationUrlIsRequired": "인증 URL은 필수입니다", - "authorizationUrlCannotBeEmpty": "인증 URL은 비워 둘 수 없습니다", - "invalidAuthorizationUrlFormat": "유효하지 않은 인증 URL 형식", - "tokenUrlIsRequired": "토큰 URL은 필수입니다", - "tokenUrlCannotBeEmpty": "토큰 URL은 비워 둘 수 없습니다", - "invalidTokenUrlFormat": "유효하지 않은 토큰 URL 형식", - "redirectUriIsRequired": "리디렉션 URI는 필수입니다", - "redirectUriCannotBeEmpty": "리디렉션 URI는 비워 둘 수 없습니다", - "invalidRedirectUriFormat": "유효하지 않은 리디렉션 URI 형식", - "authorizeEmailAccount": "이메일 계정 인증", - "authorizeAnEmailAccountToStartTheOAuth2AuthorizationProcess": "OAuth2 인증 프로세스를 시작하려면 이메일 계정을 인증하십시오.", - "loadingAccounts": "계정 로드 중...", - "selectAnAccount": "계정 선택", - "noEmailAccountsRegistered": "등록된 이메일 계정이 없습니다. 하나를 생성하십시오.", - "pleaseCreateOne": "하나를 생성하십시오.", - "createAccount": "계정 생성", - "authorize": "인증", - "getAuthorizeUrlFailed": "인증 URL 가져오기 실패", - "getAuthorizeUrlFailedDesc": "인증 URL 가져오기에 실패했습니다. 나중에 다시 시도하십시오", - "oauth2ClientUpdated": "OAuth2 클라이언트 업데이트됨", - "oauth2ClientHasBeenSuccessfully": "OAuth2 클라이언트가 성공적으로 {{action}}되었습니다.", - "statusUpdateFailed": "상태 업데이트에 실패했습니다. 나중에 다시 시도하십시오", - "disableOAuth2Client": "OAuth2 클라이언트 비활성화", - "enableOAuth2Client": "OAuth2 클라이언트 활성화", - "areYouSureYouWantTo": "이 OAuth2 클라이언트를 {{action}}하시겠습니까?", - "thisWillPreventTheOAuth2ClientFromBeingUsed": "이렇게 하면 OAuth2 클라이언트가 사용되는 것을 방지합니다.", - "deleteToken": "토큰 삭제", - "areYouSureYouWantToDelete": "삭제하시겠습니까", - "thisActionWillPermanentlyRemoveTheOauth2Record": "이 작업은 OAuth2 레코드를 시스템에서 영구적으로 제거합니다. 이 작업은 되돌릴 수 없습니다.", - "enterIdToConfirmDeletion": "삭제를 확인하려면 ID를 입력하십시오.", - "warning": "경고!", - "pleaseBeCareful": "주의하십시오. 이 작업은 되돌릴 수 없습니다.", - "deleteSuccess": "삭제 성공", - "yourOAuth2ApplicationHasBeenSuccessfullyDeleted": "OAuth2 애플리케이션이 성공적으로 삭제되었습니다.", - "oauth2DeleteFailed": "OAuth2 삭제 실패", - "deleteFailed": "삭제에 실패했습니다. 나중에 다시 시도하십시오", - "actions": { - "openMenu": "메뉴 열기", - "edit": "편집", - "authorize": "인증", - "delete": "삭제" - }, - "authFailed": "OAuth2 인증 실패", - "error": "오류", - "unknownError": "알 수 없는 오류가 발생했습니다.", - "tryAgain": "다시 시도", - "goHome": "홈으로 이동", - "authSuccess": "OAuth2 인증 성공", - "success": "성공", - "successMessage": "이메일 계정이 OAuth2를 통해 성공적으로 인증되었습니다. 접근 토큰이 시스템에 저장되었으며 필요에 따라 자동으로 새로 고쳐집니다.", - "goToAccounts": "계정으로 이동", - "authAtatus": "OAuth2 인증 상태", - "information": "정보", - "noStatus": "이 페이지에는 OAuth2 인증 결과가 표시됩니다. 현재 특정 상태를 사용할 수 없습니다. 필요한 경우 다시 시도하십시오.", - "backToLogin": "로그인으로 돌아가기" + "form": { + "1day": "1일", + "30days": "30일", + "7days": "7일", + "errorInt": "정수여야 합니다", + "errorMax": "최대 32자", + "errorNumber": "숫자여야 합니다", + "errorPositive": "0보다 커야 합니다", + "expirationDescription": "토큰은 선택한 시간 이후에 자동으로 만료됩니다.", + "expirationLabel": "만료", + "expirationPlaceholder": "만료 선택", + "nameDescription": "선택 사항 · 최대 32자", + "nameLabel": "이름", + "namePlaceholder": "토큰의 짧은 이름을 입력하세요", + "never": "영구" }, - "accessTokens": { - "title": "접근 토큰", - "name": "이름", - "accounts": "계정", - "token": "토큰", - "createdAt": "생성일", - "expiresAt": "만료일", - "edit": "편집", - "delete": "삭제", - "create": "생성", - "noTokens": "접근 토큰 없음", - "noTokensDesc": "아직 접근 토큰을 생성하지 않았습니다. 기능을 사용하려면 하나를 생성하십시오.", - "description": "접근 토큰, ACL 규칙, IP 화이트리스트 및 속도 제한 설정을 여기에서 관리하십시오.", - "editToken": "토큰 편집", - "addNew": "새로 추가", - "updateTheAccessTokenHere": "여기에서 접근 토큰을 업데이트하십시오.", - "createNewAccessTokenHere": "여기에서 새 접근 토큰을 생성하십시오.", - "selectAccounts": "계정 선택", - "selectMultipleAccountsForTheAccessToken": "이 접근 토큰이 쿼리하도록 승인된 여러 계정을 선택하십시오.", - "enterOneIpAddressPerLine": "한 줄에 하나의 IP 주소를 입력하십시오. 예:\n192.168.1.1\n192.168.1.2", - "aListOfIpAddressesAllowed": "리소스에 접근이 허용된 IP 주소 목록입니다. 한 줄에 하나의 IP 주소를 입력하십시오. (선택 사항)", - "enterQuota": "쿼터 입력. 예: 100", - "theMaximumNumberOfRequestsAllowed": "간격 내에서 허용되는 최대 요청 수입니다. (선택 사항)", - "enterIntervalInSeconds": "간격을 초 단위로 입력하십시오. 예: 60", - "theTimeWindowForTheRateLimit": "속도 제한을 위한 시간 창 (초)입니다. (선택 사항)", - "describeThePurposeOfTheAccessToken": "접근 토큰의 목적을 설명하십시오", - "updating": "업데이트 중...", - "saving": "저장 중...", - "creating": "생성 중...", - "saveChanges": "변경 사항 저장", - "save": "저장", - "updated": "업데이트됨", - "created": "생성됨", - "yourAccessTokenHasBeenSuccessfully": "접근 토큰이 성공적으로 {{action}}되었습니다.", - "updateFailed": "업데이트 실패", - "creationFailed": "생성 실패", - "updateOrCreationFailed": "{{action}}에 실패했습니다. 나중에 다시 시도하십시오", - "quotaMustBeAPositiveInteger": "쿼터는 양의 정수여야 합니다.", - "intervalMustBeAPositiveInteger": "간격은 양의 정수여야 합니다.", - "invalidIpAddressesFound": "유효하지 않은 IP 주소를 찾았습니다. 유효한 IPv4 또는 IPv6 주소를 입력하십시오.", - "atLeastOneAccountIsRequired": "하나 이상의 계정은 필수입니다.", - "descriptionMustNotExceed255Characters": "설명은 255자를 초과할 수 없습니다.", - "notUsedYet": "아직 사용되지 않음", - "theListOfAccountsThatCanBeQueried": "접근 토큰을 사용하여 쿼리할 수 있는 계정 목록입니다.", - "accountId": "계정 ID", - "filterByEmailAddressOrAccountId": "이메일 주소 또는 계정 ID로 필터링...", - "aclRulesForAccessTokens": "접근 토큰에 대한 ACL 규칙에는 IP 화이트리스트 확인 및 속도 제한 적용이 포함됩니다.", - "actions": { - "openMenu": "메뉴 열기", - "edit": "편집", - "delete": "삭제" - }, - "quota": "쿼터", - "interval": "간격" + "list": { + "createdLabel": "생성일", + "deleteBtn": "토큰 삭제", + "expiresOnLabel": "만료일", + "expiresOnShort": "만료일: {{date}}", + "lastUsedLabel": "마지막 사용", + "neverExpires": "만료 없음", + "neverLabel": "없음", + "neverUsed": "사용 안 함", + "statusActive": "활성", + "statusExpired": "만료됨", + "tokenLabel": "토큰", + "unnamedToken": "이름 없는 토큰" }, - "settings": { - "appearance": { - "title": "외관", - "field": { - "language": "인터페이스 언어", - "theme": "인터페이스 테마" - }, - "description": { - "language": "웹 UI에서 사용할 언어를 선택하세요.", - "theme": "라이트 모드와 다크 모드 중에서 선택하세요." - }, - "placeholder": { - "select_language": "언어 선택" - }, - "command": { - "search": "언어 검색...", - "no_results": "언어를 찾을 수 없습니다." - }, - "theme": { - "light": "라이트", - "dark": "다크" - }, - "button": { - "update": "설정 업데이트" - }, - "validation": { - "language": { - "required": "언어를 선택해주세요." - }, - "theme": { - "required": "테마를 선택해주세요." - } - } - }, - "title": "설정", - "general": "일반", - "proxy": "프록시", - "name": "이름", - "host": "호스트", - "port": "포트", - "username": "사용자 이름", - "password": "비밀번호", - "type": "유형", - "actions": "작업", - "edit": "편집", - "delete": "삭제", - "add": "추가", - "noProxies": "프록시 없음", - "noProxiesDesc": "아직 프록시 구성을 추가하지 않았습니다. 기능을 사용하려면 추가하십시오.", - "root": "루트", - "rootTitle": "루트", - "rootDesc": "토큰 및 비밀번호를 포함한 루트 접근 자격 증명을 관리합니다.", - "rootAccessManagement": "루트 접근 관리", - "manageRootTokenAndPassword": "루트 토큰과 비밀번호를 안전하게 관리합니다.", - "resetRootToken": "루트 토큰 초기화", - "generateNewToken": "새 토큰을 생성합니다. 이전 토큰은 즉시 무효화됩니다.", - "reset": "초기화", - "resetRootPassword": "루트 비밀번호 초기화", - "changePasswordForFutureLogins": "향후 로그인을 위한 비밀번호를 변경합니다.", - "youAreAboutToResetTheRootToken": "루트 토큰을 초기화하려고 합니다. 이 작업은 되돌릴 수 없습니다.", - "confirmReset": "초기화 확인", - "youAreAboutToResetTheRootPassword": "루트 비밀번호를 초기화하려고 합니다. 안전하게 보관하십시오.", - "enterNewRootPassword": "새 루트 비밀번호 입력", - "theRootTokenHasBeenReset": "루트 토큰이 초기화되었습니다", - "yourLoginInformationHasBeenUpdated": "로그인 정보가 업데이트되었습니다. 다시 로그인할 필요는 없습니다.", - "invalidPassword": "유효하지 않은 비밀번호", - "rootPasswordMustBeAtLeast6Characters": "루트 비밀번호는 6자 이상이어야 합니다.", - "theRootPasswordHasBeenReset": "루트 비밀번호가 초기화되었습니다", - "useNewPasswordForNextLogin": "다음 로그인 시 새 비밀번호를 사용하십시오.", - "failedToCopyText": "텍스트 복사 실패", - "filterProxy": "프록시 필터링...", - "filterOauth2": "OAuth2 필터링...", - "filterAccount": "계정 필터링...", - "filterAccessToken": "접근 토큰 필터링...", - "selectAll": "모두 선택", - "theme": "테마", - "id": "ID", - "url": "URL", - "createdAt": "생성일", - "updatedAt": "업데이트일", - "enabled": "활성화됨", - "useProxy": "프록시 사용", - "authUrl": "인증 URL", - "tokenUrl": "토큰 URL", - "description": "설명", - "token": "토큰", - "accounts": "계정", - "acl": "ACL", - "lastAccess": "최종 접근", - "enterProxyIdToConfirmDeletion": "삭제를 확인하려면 프록시 ID를 입력하십시오.", - "updateTheProxyHere": "여기에서 프록시를 업데이트하십시오.", - "addNewProxyHere": "여기에서 새 프록시를 추가하십시오.", - "pleaseUseAnIpAddressForBetterReliability": "더 나은 안정성을 위해 호스트 이름이나 도메인 대신 IP 주소(예: 127.0.0.1)를 사용하십시오.", - "adding": "추가 중...", - "yourProxyHasBeenSuccessfully": "프록시가 성공적으로 {{action}}되었습니다.", - "proxyUpdateOrAddFailed": "{{action}}에 실패했습니다. 나중에 다시 시도하십시오", - "sidebar": { - "profile": "프로필", - "apiTokens": "API 토큰", - "proxy": "네트워크 프록시", - "configurations": "시스템 설정" - }, - "profile": { - "loadError": "사용자 정보를 불러오는 데 실패했습니다.", - "uploadTitle": "아바타 업로드", - "maxSize": "최대 {{size}}", - "avatarAlt": "아바타", - "removeAvatar": "아바타 삭제", - "uploadError": "파일 업로드 오류", - "field": { - "username": "사용자 이름", - "email": "이메일", - "password": "비밀번호" - }, - "placeholder": { - "password_keep": "비워두면 현재 비밀번호가 유지됩니다" - }, - "button": { - "update_profile": "프로필 업데이트", - "permissions": "권한", - "view_global_permissions": "전역 권한 보기" - }, - "section": { - "roles": "역할", - "accounts": "연결된 계정 {{count}}개" - }, - "account": { - "id": "계정 ID: {{id}}" - }, - "toast": { - "updated": "프로필이 성공적으로 업데이트되었습니다", - "update_failed": "프로필 업데이트에 실패했습니다" - }, - "validation": { - "username": { - "required": "사용자 이름은 필수입니다", - "min": "사용자 이름은 최소 5자 이상이어야 합니다", - "max": "사용자 이름은 최대 32자까지 가능합니다" - }, - "email": { - "required": "이메일은 필수입니다", - "invalid": "유효한 이메일 주소를 입력하세요" - }, - "password": { - "min": "비밀번호는 최소 8자 이상이어야 합니다", - "max": "비밀번호는 최대 256자까지 가능합니다" - } - } - } + "notifications": { + "close": "닫기", + "copied": "클립보드에 복사됨", + "createFailed": "생성 실패", + "createSuccess": "액세스 토큰 생성됨", + "createSuccessDesc": "액세스 토큰이 성공적으로 생성되었습니다.", + "deleteFailed": "토큰 삭제 실패", + "deleteSuccess": "토큰 삭제됨", + "genericError": "작업 실패. 다시 시도하세요.", + "tryAgain": "다시 시도", + "updateFailed": "업데이트 실패", + "updateSuccess": "액세스 토큰 업데이트됨", + "updateSuccessDesc": "액세스 토큰이 성공적으로 업데이트되었습니다." }, - "apiDocs": { - "choosePreferredType": "선호하는 API 문서 유형을 선택하십시오", - "swaggerUI": "Swagger UI", - "reDoc": "ReDoc", - "openAPIExplorer": "OpenAPI 탐색기", - "scalar": "Scalar", - "downloadSpecYAML": "YAML 사양 다운로드" + "page": { + "addBtn": "토큰 추가", + "emptyDescription": "아직 생성된 API 토큰이 없습니다. 아래 버튼을 클릭하여 토큰을 생성하세요.", + "emptyTitle": "API 토큰 없음", + "loadError": "API 토큰을 불러오지 못했습니다." + } + }, + "attachment": { + "all_fields_desc": "첨부 파일 이름, 메일 제목 및 발신자 일치", + "date": "날짜", + "name": "파일 이름", + "search_input_placeholder": "첨부 파일 검색 (구문 검색은 \" \" 사용)", + "sender": "보낸 사람", + "sender_with_count": "보낸 사람 ({{count}})", + "size": "파일 크기", + "source": "출처", + "subject": "제목" + }, + "auth": { + "areYouSureYouWantToLogOut": "정말로 로그아웃하시겠습니까?", + "invalidPassword": "비밀번호가 유효하지 않습니다. 다시 시도해 주세요.", + "login": "로그인", + "loginFailed": "로그인 실패", + "logout": "로그아웃", + "password": "비밀번호", + "sessionExpired": "세션이 만료되었습니다!", + "sessionExpiredDesc": "비활성화로 인해 세션이 종료되었습니다. 계속하려면 다시 로그인하십시오.", + "somethingWentWrong": "문제가 발생했습니다", + "username": "사용자 이름", + "welcome": "Bichon에 오신 것을 환영합니다", + "youWillNeedToLogInAgain": "계정에 접근하려면 다시 로그인해야 합니다." + }, + "command": { + "dark": "어둡게", + "light": "밝게", + "noResultsFound": "검색 결과가 없습니다.", + "theme": "테마", + "typeCommandOrSearch": "명령 또는 검색을 입력하십시오..." + }, + "common": { + "actions": "작업", + "add": "추가", + "all": "전체", + "apply": "적용", + "back": "뒤로", + "backToHome": "홈으로 돌아가기", + "cancel": "취소", + "clear": "지우기", + "close": "닫기", + "confirm": "확인", + "create": "생성", + "delete": "삭제", + "deleting": "삭제 중...", + "deselectAll": "전체 선택 해제", + "edit": "편집", + "empty": "비어 있음", + "error": "오류", + "failed": "실패", + "filter": "필터", + "goBack": "뒤로 가기", + "loading": "로드 중...", + "more": "더 보기", + "na": "해당 없음", + "no": "아니요", + "noData": "데이터 없음", + "none": "없음", + "notFound": "찾을 수 없음", + "ok": "확인", + "op_failed": "작업 실패", + "project_description": "Bichon은 오픈 소스 프로젝트입니다.", + "remove": "제거", + "reset": "초기화", + "retry": "재시도", + "save": "저장", + "save_changes": "변경사항 저장", + "search": "검색", + "select": "선택", + "selectAll": "전체 선택", + "showLess": "간략히 보기", + "showMore": "더 보기...", + "submit": "제출", + "table": { + "noResults": "결과가 없습니다." }, - "dialogs": { - "confirmDelete": "삭제 확인", - "confirmDeleteDesc": "이 항목을 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다.", - "deleteSuccess": "성공적으로 삭제됨", - "deleteFailed": "삭제 실패", - "saveSuccess": "성공적으로 저장됨", - "saveFailed": "저장 실패", - "createSuccess": "성공적으로 생성됨", - "createFailed": "생성 실패", - "updateSuccess": "성공적으로 업데이트됨", - "updateFailed": "업데이트 실패", - "continue": "계속", - "deleting": "삭제 중...", - "accountDeleted": "계정 삭제됨", - "accountDeletedDesc": "계정이 성공적으로 삭제되었습니다.", - "accountDeleteFailed": "계정 삭제 실패", - "deleteAccountPermanently": "계정 영구 삭제", - "youAreDeleting": "{{email}}을(를) 삭제하고 있습니다. 이로 인해 다음 항목이 영구적으로 제거됩니다:", - "accountCredentials": "계정 자격 증명 및 설정", - "localCachedMetadata": "로컬 캐시된 메타데이터 및 동기화 상태", - "imapSyncData": "IMAP 동기화 데이터", - "oauthTokens": "OAuth 토큰 및 API 자격 증명", - "typeEmailToConfirm": "확인하려면 계정 이메일 주소를 입력하십시오:", - "typeToConfirm": "확인하려면 \"{{email}}\"을(를) 입력하십시오", - "cannotBeUndone": "이 작업은 되돌릴 수 없습니다!", - "allResourcesErased": "모든 관련 리소스가 영구적으로 지워집니다.", - "permanentlyDeleteAccount": "계정 영구 삭제" + "tryAgain": "다시 시도", + "update": "업데이트", + "view_on_github_button": "GitHub에서 보기", + "yes": "예" + }, + "dashboard": { + "account": "계정", + "actualDiskUsage": "실제 디스크 사용량", + "attachmentRatio": "첨부 파일 비율", + "attachmentRatioDesc": "이메일의 {{percent}}%에 첨부 파일이 있습니다", + "attachments": "첨부 파일", + "byMessageCount": "메시지 수 기준", + "byMessageSize": "메시지 크기 기준", + "connected": "연결됨", + "count": "수", + "dataStorage": "데이터 스토리지", + "dayTrend": "30일 추세", + "efficiency": "압축 효율", + "emails": "이메일", + "indexSize": "인덱스 크기", + "localDataFiles": "로컬 데이터 파일", + "logicalVolume": "원래 크기", + "mailAccounts": "메일 계정", + "messageDistribution": "메시지 배포", + "metadataSize": "메타데이터 크기", + "newEmails": "새 이메일", + "noAccountData": "계정 데이터 없음", + "noAttachments": "첨부 파일 없음", + "noEmailsSynced": "아직 동기화된 이메일이 없습니다", + "noLargeEmails": "크기가 큰 이메일 없음", + "noRecentActivity": "최근 활동 없음", + "noSendersData": "발신자 데이터 없음", + "noSubject": "(제목 없음)", + "saved": "절약됨", + "sender": "발신자", + "size": "크기", + "subject": "제목", + "syncedLocally": "로컬 동기화됨", + "systemVersion": "시스템 버전", + "tantivyDatabase": "Tantivy 검색 엔진 기반", + "title": "대시보드", + "top10Accounts": "상위 10개 계정", + "top10LargestEmails": "상위 10개 최대 크기 이메일", + "top10Senders": "상위 10명 발신자", + "topLists": "상위 목록", + "totalEmailSize": "총 이메일 크기", + "totalEmails": "총 이메일 수", + "withAttachments": "첨부 파일 포함" + }, + "dialogs": { + "accountCredentials": "계정 자격 증명 및 설정", + "accountDeleteFailed": "계정 삭제 실패", + "accountDeleted": "계정 삭제됨", + "accountDeletedDesc": "계정이 성공적으로 삭제되었습니다.", + "allResourcesErased": "모든 관련 리소스가 영구적으로 지워집니다.", + "cannotBeUndone": "이 작업은 되돌릴 수 없습니다!", + "confirmDelete": "삭제 확인", + "confirmDeleteDesc": "이 항목을 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다.", + "continue": "계속", + "createFailed": "생성 실패", + "createSuccess": "성공적으로 생성됨", + "deleteAccountPermanently": "계정 영구 삭제", + "deleteFailed": "삭제 실패", + "deleteSuccess": "성공적으로 삭제됨", + "deleting": "삭제 중...", + "imapSyncData": "IMAP 동기화 데이터", + "localCachedMetadata": "로컬 캐시된 메타데이터 및 동기화 상태", + "oauthTokens": "OAuth 토큰 및 API 자격 증명", + "permanentlyDeleteAccount": "계정 영구 삭제", + "saveFailed": "저장 실패", + "saveSuccess": "성공적으로 저장됨", + "typeEmailToConfirm": "확인하려면 계정 이메일 주소를 입력하십시오:", + "typeToConfirm": "확인하려면 \"{{email}}\"을(를) 입력하십시오", + "updateFailed": "업데이트 실패", + "updateSuccess": "성공적으로 업데이트됨", + "youAreDeleting": "{{email}}을(를) 삭제하고 있습니다. 이로 인해 다음 항목이 영구적으로 제거됩니다:" + }, + "errors": { + "contentNotModified": "콘텐츠가 수정되지 않았습니다!", + "forbidden": "금지됨", + "forbiddenDesc": "이 리소스를 볼 수 있는 권한이 없습니다.", + "forbiddenTitle": "접근 금지", + "internalServerError": "내부 서버 오류!", + "learnMore": "더 알아보기", + "maintenance": "유지 보수", + "maintenanceDesc": "사이트를 일시적으로 사용할 수 없습니다. 곧 다시 돌아오겠습니다.", + "maintenanceTitle": "사이트가 유지 보수 중입니다!", + "networkError": "네트워크 오류", + "networkErrorDesc": "서버에 연결할 수 없습니다. 인터넷 연결을 확인하고 다시 시도하십시오.", + "pageNotFound": "죄송합니다! 페이지를 찾을 수 없습니다!", + "pageNotFoundDesc": "찾고 있는 페이지가 존재하지 않거나 제거되었을 수 있습니다.", + "somethingWentWrong": "죄송합니다! 문제가 발생했습니다 :')", + "somethingWentWrongDesc": "불편을 드려 죄송합니다. 나중에 다시 시도해 주십시오.", + "unauthorized": "승인되지 않음", + "unauthorizedDesc": "이 리소스에 접근하려면 적절한 자격 증명으로 로그인하십시오.", + "unauthorizedTitle": "승인되지 않은 접근" + }, + "mail": { + "account": "계정", + "attachments": "첨부 파일", + "bcc": "숨은 참조", + "cc": "참조", + "date": "날짜", + "delete": "삭제", + "download": "다운로드", + "downloadComplete": "다운로드 완료", + "downloadFailed": "다운로드 실패", + "downloadStarted": "다운로드 시작됨", + "downloaded": "{{id}} 다운로드됨", + "emailViewer": "이메일 뷰어", + "failedToDownloadFile": "파일 다운로드 실패", + "failedToLoadEmail": "이메일 메시지 로드 실패.", + "from": "보낸 사람", + "id": "ID", + "isBeingDownloaded": "{{id}} 다운로드 중", + "noAttachments": "첨부 파일 없음", + "noMessageSelected": "선택된 메시지 없음", + "noTagsYet": "아직 태그가 없습니다", + "onlyNonInlineAttachments": "인라인이 아닌 첨부 파일만 여기에 표시됩니다.", + "showLess": "간단히 보기", + "showMore": "더 보기...", + "subject": "제목", + "tags": "태그", + "to": "받는 사람", + "viewThread": "스레드 보기" + }, + "mailbox": { + "bulkActions": { + "ariaLabel": "선택된 {{count}}개 {{emailLabel}}에 대한 대량 작업", + "clearSelection": "선택 지우기", + "clearSelectionWithKey": "선택 지우기 ({{key}})", + "delete": "삭제", + "deleteTooltip": "선택된 이메일 삭제", + "email": "이메일", + "emails": "이메일", + "selected": "선택됨" }, - "command": { - "typeCommandOrSearch": "명령 또는 검색을 입력하십시오...", - "noResultsFound": "검색 결과가 없습니다.", - "theme": "테마", - "light": "밝게", - "dark": "어둡게" + "deleteDialog": { + "confirm": "삭제", + "desc": "{{countText}}를(을) 삭제하시겠습니까? 이 작업은 선택한 이메일을 로컬 데이터베이스에서 영구적으로 제거합니다. 이메일은 영구적으로 손실되며 복구할 수 없습니다.", + "descCountMultiple": "이 {{count}}개의 이메일", + "descCountSingle": "이 이메일", + "errorTitle": "메시지 삭제 실패", + "successDesc": "메시지가 삭제되었습니다.", + "successTitle": "메시지 삭제 성공", + "title": "이메일 삭제", + "warningDesc": "진행하기 전에 주의하십시오.", + "warningTitle": "경고!" + }, + "deleteMailboxDialog": { + "confirm": "영구 삭제", + "desc": "이 메일함 폴더를 삭제하시겠습니까? 이 작업은 취소할 수 없습니다.", + "errorTitle": "삭제 실패", + "successDesc": "메일함 폴더와 그 내용이 성공적으로 제거되었습니다.", + "successTitle": "삭제 성공", + "title": "메일함 폴더 삭제", + "warningDesc": "이 폴더를 삭제하면 그 안에 포함된 모든 아카이브된 이메일과 하위 폴더도 영구적으로 삭제됩니다.", + "warningTitle": "경고" + }, + "folders": "폴더", + "messages": "메시지", + "noMessages": "메시지 없음", + "selectFolder": "메시지를 보려면 폴더를 선택하십시오", + "thread": { + "empty": "이 스레드에 메시지가 없습니다.", + "invalidDate": "유효하지 않은 날짜", + "loadError": "스레드 로드 실패", + "loadMore": "더 로드", + "loadingMore": "더 로드 중...", + "message": "메시지", + "messages": "메시지", + "noSubject": "(제목 없음)", + "title": "스레드 ({{count}}개 {{messageLabel}})" + }, + "title": "받은 편지함" + }, + "navigation": { + "accessTokens": "접근 토큰", + "accounts": "계정", + "apiDocs": "API 문서", + "attachment": "첨부파일", + "auth": "인증", + "dashboard": "대시보드", + "general": "일반", + "home": "홈", + "mailbox": "받은 편지함", + "oauth2": "OAuth2", + "other": "기타", + "settings": "설정", + "users": "시스템 사용자" + }, + "oauth2": { + "aSecretKeyProvidedByTheOAuthProvider": "OAuth 공급자가 애플리케이션을 인증하기 위해 제공하는 비밀 키입니다.", + "actions": { + "authorize": "인증", + "delete": "삭제", + "edit": "편집", + "openMenu": "메뉴 열기" + }, + "addConfiguration": "구성 추가", + "addExtraParams": "추가 매개변수 추가", + "addNew": "새로 추가", + "addScope": "스코프 추가", + "areYouSureYouWantTo": "이 OAuth2 클라이언트를 {{action}}하시겠습니까?", + "areYouSureYouWantToDelete": "삭제하시겠습니까", + "authAtatus": "OAuth2 인증 상태", + "authFailed": "OAuth2 인증 실패", + "authSuccess": "OAuth2 인증 성공", + "authUrlLabel": "인증 URL:", + "authorizationUrlCannotBeEmpty": "인증 URL은 비워 둘 수 없습니다", + "authorizationUrlIsRequired": "인증 URL은 필수입니다", + "authorize": "인증", + "authorizeAnEmailAccountToStartTheOAuth2AuthorizationProcess": "OAuth2 인증 프로세스를 시작하려면 이메일 계정을 인증하십시오.", + "authorizeEmailAccount": "이메일 계정 인증", + "backToLogin": "로그인으로 돌아가기", + "clickSaveWhenDone": "완료되면 '저장'을 클릭하십시오.", + "clientId": "클라이언트 ID", + "clientIdCannotBeEmpty": "클라이언트 ID는 비워 둘 수 없습니다", + "clientIdIsRequired": "클라이언트 ID는 필수입니다", + "clientIdLabel": "클라이언트 ID:", + "clientSecret": "클라이언트 보안 비밀", + "clientSecretCannotBeEmpty": "클라이언트 보안 비밀은 비워 둘 수 없습니다", + "clientSecretIsRequired": "클라이언트 보안 비밀은 필수입니다", + "clientSecretLabel": "클라이언트 보안 비밀:", + "createAccount": "계정 생성", + "createNewHere": "여기에서 새로 만드십시오.", + "created": "생성됨", + "creating": "생성 중...", + "creationFailed": "생성 실패", + "delete": "삭제", + "deleteFailed": "삭제에 실패했습니다. 나중에 다시 시도하십시오", + "deleteSuccess": "삭제 성공", + "deleteToken": "토큰 삭제", + "describeThePurposeOfTheOauth2Application": "OAuth2 애플리케이션의 목적을 설명하십시오", + "description": "접근 토큰 검색, 저장 및 새로 고침을 자동으로 처리하여 원활하고 항상 사용 가능한 인증 경험을 보장합니다.", + "descriptionLabel": "설명:", + "descriptionMustNotExceed255Characters": "설명은 255자를 초과할 수 없습니다.", + "disable": "비활성화", + "disableOAuth2Client": "OAuth2 클라이언트 비활성화", + "disabled": "비활성화됨", + "edit": "편집", + "enable": "활성화", + "enableOAuth2Client": "OAuth2 클라이언트 활성화", + "enabled": "활성화됨", + "enterIdToConfirmDeletion": "삭제를 확인하려면 ID를 입력하십시오.", + "enterTheAuthorizationUrl": "인증 URL을 입력하십시오", + "enterTheKeyHere": "여기에 키를 입력하십시오.", + "enterTheScopeHere": "여기에 스코프를 입력하십시오.", + "enterTheTokenUrl": "토큰 URL을 입력하십시오", + "enterTheValueHere": "여기에 값을 입력하십시오.", + "enterYourClientId": "클라이언트 ID를 입력하십시오", + "enterYourClientSecret": "클라이언트 보안 비밀을 입력하십시오", + "enterYourRedirectUrl": "리디렉션 URI를 입력하십시오", + "error": "오류", + "getAuthorizeUrlFailed": "인증 URL 가져오기 실패", + "getAuthorizeUrlFailedDesc": "인증 URL 가져오기에 실패했습니다. 나중에 다시 시도하십시오", + "gmail": "Gmail", + "goHome": "홈으로 이동", + "goToAccounts": "계정으로 이동", + "id": "ID", + "information": "정보", + "invalidAuthorizationUrlFormat": "유효하지 않은 인증 URL 형식", + "invalidRedirectUriFormat": "유효하지 않은 리디렉션 URI 형식", + "invalidTokenUrlFormat": "유효하지 않은 토큰 URL 형식", + "key": "키:", + "keyCannotBeEmpty": "키는 비워 둘 수 없습니다", + "keyIsRequired": "키는 필수입니다", + "leaveEmptyToKeepExistingSecret": "기존 보안 비밀을 유지하려면 비워 두십시오", + "leaveEmptyToKeepTheExistingSecret": "기존 보안 비밀을 유지하려면 비워 두십시오. 업데이트하는 경우에만 새 값을 입력하십시오.", + "loadingAccounts": "계정 로드 중...", + "noConfigurations": "OAuth2 구성 없음", + "noConfigurationsDesc": "아직 OAuth2 구성을 추가하지 않았습니다. 기능을 사용하려면 추가하십시오.", + "noEmailAccountsRegistered": "등록된 이메일 계정이 없습니다. 하나를 생성하십시오.", + "noProxyAvailable": "사용 가능한 프록시 없음", + "noStatus": "이 페이지에는 OAuth2 인증 결과가 표시됩니다. 현재 특정 상태를 사용할 수 없습니다. 필요한 경우 다시 시도하십시오.", + "oauth2ClientHasBeenSuccessfully": "OAuth2 클라이언트가 성공적으로 {{action}}되었습니다.", + "oauth2ClientUpdated": "OAuth2 클라이언트 업데이트됨", + "oauth2DeleteFailed": "OAuth2 삭제 실패", + "optional": "선택 사항", + "outlook": "Outlook", + "pleaseBeCareful": "주의하십시오. 이 작업은 되돌릴 수 없습니다.", + "pleaseCreateOne": "하나를 생성하십시오.", + "provider": "공급자", + "quickPresets": "빠른 사전 설정:", + "redirectUri": "리디렉션 URI", + "redirectUriCannotBeEmpty": "리디렉션 URI는 비워 둘 수 없습니다", + "redirectUriIsRequired": "리디렉션 URI는 필수입니다", + "redirectUrlLabel": "리디렉션 URI:", + "save": "저장", + "saveChanges": "변경 사항 저장", + "saving": "저장 중...", + "scope": "스코프:", + "scopes": "스코프", + "selectAProxy": "프록시 선택", + "selectAnAccount": "계정 선택", + "status": "상태", + "statusUpdateFailed": "상태 업데이트에 실패했습니다. 나중에 다시 시도하십시오", + "success": "성공", + "successMessage": "이메일 계정이 OAuth2를 통해 성공적으로 인증되었습니다. 접근 토큰이 시스템에 저장되었으며 필요에 따라 자동으로 새로 고쳐집니다.", + "theRedirectUrlAfterAuthorization": "인증 후 리디렉션될 URI입니다. OAuth 공급자에 등록된 것과 일치해야 합니다. http://[host]:[port]/oauth2/callback (또는 https://) 형식을 사용하며, 여기서 [host]와 [port]는 RustMailer 배포판과 일치해야 합니다. `/oauth2/callback` 경로는 고정되어 있습니다.", + "theUniqueIdentifierForYourApplication": "OAuth 공급자가 제공하는 애플리케이션의 고유 식별자입니다.", + "theUrlUsedToExchange": "인증 코드를 접근 토큰으로 교환하는 데 사용되는 URL입니다.", + "theUrlWhereUsersWillBeRedirected": "사용자가 인증을 위해 리디렉션될 URL입니다.", + "thisActionWillPermanentlyRemoveTheOauth2Record": "이 작업은 OAuth2 레코드를 시스템에서 영구적으로 제거합니다. 이 작업은 되돌릴 수 없습니다.", + "thisWillPreventTheOAuth2ClientFromBeingUsed": "이렇게 하면 OAuth2 클라이언트가 사용되는 것을 방지합니다.", + "title": "OAuth2", + "tokenUrlCannotBeEmpty": "토큰 URL은 비워 둘 수 없습니다", + "tokenUrlIsRequired": "토큰 URL은 필수입니다", + "tokenUrlLabel": "토큰 URL:", + "tryAgain": "다시 시도", + "unknownError": "알 수 없는 오류가 발생했습니다.", + "updateFailed": "업데이트 실패", + "updateHere": "여기에서 업데이트하십시오.", + "updateOrCreationFailed": "{{action}}에 실패했습니다. 나중에 다시 시도하십시오", + "updated": "업데이트됨", + "useProxyOptional": "프록시 사용 (선택 사항):", + "useSocks5ProxyForOAuthRequests": "직접 접근이 차단된 경우 OAuth 요청에 SOCKS5 프록시를 사용합니다.", + "value": "값:", + "valueCannotBeEmpty": "값은 비워 둘 수 없습니다", + "valueIsRequired": "값은 필수입니다", + "warning": "경고!", + "whenDisabled": "비활성화 시: - 새 인증 흐름이 즉시 거부됩니다 - 기존 접근 및 새로 고침 토큰이 1분 이내에 취소됩니다 - 재활성화 시 사용자는 다시 인증해야 합니다", + "yourOAuth2ApplicationHasBeenSuccessfully": "OAuth2 애플리케이션이 성공적으로 {{action}}되었습니다.", + "yourOAuth2ApplicationHasBeenSuccessfullyDeleted": "OAuth2 애플리케이션이 성공적으로 삭제되었습니다." + }, + "permission": { + "account": { + "create": "이메일 계정 생성", + "manage": "할당된 계정 관리", + "manage_all": "모든 계정 설정 관리", + "read_details": "계정 상세 정보 조회" + }, + "category": { + "account": "계정 권한", + "global_data": "전역 데이터 (관리자)", + "system_identity": "시스템 및 인증" + }, + "data": { + "delete": "할당된 이메일 삭제", + "delete_all": "모든 계정의 이메일 삭제", + "export_batch": "할당 데이터 일괄 내보내기", + "export_batch_all": "모든 데이터 일괄 내보내기", + "import_batch": "이메일 데이터 일괄 가져오기", + "manage": "할당된 이메일 메타데이터 관리", + "manage_all": "모든 이메일 메타데이터 관리", + "raw_download": "할당된 원본 이메일 다운로드", + "raw_download_all": "모든 원본 이메일 다운로드", + "read": "할당된 이메일 데이터 읽기", + "read_all": "모든 이메일 데이터 읽기", + "smtp_ingest": "SMTP 프로토콜을 통해 이메일 수집" + }, + "dialog": { + "account_description": "선택한 계정에만 적용되는 권한입니다.", + "account_title": "계정 권한", + "global_description": "이 사용자에게 부여된 시스템 전체 권한입니다.", + "global_title": "전역 권한" + }, + "scope": { + "account": "계정 #{{id}}", + "global": "전역" + }, + "system": { + "access": "기본 시스템 접근", + "root": "시스템 전체 제어" + }, + "token": { + "manage": "접근 토큰 관리" + }, + "user": { + "manage": "모든 사용자 관리", + "view": "기본 사용자 이름 보기" + } + }, + "profile": { + "avatar_alt": "아바타", + "menu": { + "profile": "프로필", + "settings": "설정", + "sign_out": "로그아웃" + } + }, + "proxyDelete": { + "close": "닫기", + "confirmText": "삭제하시겠습니까", + "deleteBtn": "삭제", + "failedDesc": "삭제에 실패했습니다. 나중에 다시 시도하십시오", + "failedTitle": "프록시 삭제 실패", + "permanent": "이 작업은 프록시를 시스템에서 영구적으로 제거합니다. 이 작업은 되돌릴 수 없습니다.", + "proxyIdLabel": "프록시 ID:", + "proxyIdPlaceholder": "삭제를 확인하려면 프록시 ID를 입력하십시오.", + "successDesc": "프록시가 성공적으로 삭제되었습니다.", + "successTitle": "삭제 성공", + "title": "프록시 삭제", + "tryAgain": "다시 시도", + "warningDesc": "주의하십시오. 이 작업은 되돌릴 수 없습니다.", + "warningTitle": "경고!" + }, + "restore_message": { + "accountsInvolved": "관련 계정", + "bulkTitle": "여러 메시지 일괄 복원", + "bulkWarning": "참고: 메시지는 원래 저장된 폴더로 복원됩니다.", + "confirm": "복원 실행", + "desc": "이 작업은 선택한 메시지를 Bichon 시스템에서 다시 업로드하여 IMAP 서버의 해당 사서함으로 복원합니다.", + "failed": "복원 실패", + "failedTitle": "복원 실패", + "messages": "개의 메시지", + "restore_to_imap": "메시지 복원", + "success": "복원 성공", + "successDesc": "선택한 메시지가 IMAP 서버로 성공적으로 복원되었습니다.", + "summary": "복원 세부 정보", + "title": "개별 메시지 복원" + }, + "roles": { + "actions": { + "add": "역할 추가", + "cancel": "취소", + "close": "닫기", + "failed": "작업 실패", + "retry": "재시도", + "submit_create": "역할 생성", + "submit_update": "역할 업데이트", + "success_create": "역할이 생성되었습니다", + "success_update": "역할이 업데이트되었습니다" + }, + "categories": { + "account_resource": "계정 리소스 액세스", + "global_data": "글로벌 데이터 액세스", + "identity": "ID 및 관리" + }, + "columns": { + "created_at": "생성일", + "id": "ID", + "name": "이름", + "permissions": "권한", + "role_type": "역할 유형", + "updated_at": "수정일" + }, + "delete": { + "alert_desc": "이 역할을 삭제하면 할당된 모든 사용자에게서 제거됩니다.", + "alert_title": "경고: 영구적인 작업입니다.", + "confirm_btn": "역할 삭제", + "confirm_label": "확인하려면 역할 ID를 입력하세요:", + "deleting": "삭제 중...", + "dialog_title": "역할 삭제", + "error_fallback": "역할을 삭제할 수 없습니다.", + "error_title": "삭제 실패", + "irreversible": "이 작업은 되돌릴 수 없습니다.", + "placeholder": "\"{{id}}\" 입력", + "success_desc": "역할 \"{{name}}\"이 성공적으로 제거되었습니다.", + "success_title": "역할 삭제됨", + "warning_text": "역할 {{name}} (ID: {{id}})을 영구적으로 삭제하려고 합니다." + }, + "description_hint": "액세스 범위 및 기능 권한을 정의합니다.", + "details": { + "close_btn": "상세 보기 닫기", + "desc_account": "단일 계정에 대한 액세스 및 데이터 작업 권한.", + "desc_global": "글로벌 관리 및 시스템 수준의 액세스 권한.", + "role_badge": "{{type}} 역할", + "title": "역할 권한: {{name}}", + "unknown": "알 수 없는 역할", + "view_permissions": "권한 상세 정보" + }, + "empty": { + "desc": "사용자 정의 역할이 아직 생성되지 않았습니다.", + "title": "역할을 찾을 수 없음" + }, + "form": { + "builtin_badge": "내장 역할", + "builtin_desc": "이 역할은 시스템에 의해 사전 정의되었으며 읽기 전용입니다.", + "desc_label": "설명", + "matrix_label": "{{type}} 권한 매트릭", + "name_label": "역할 이름", + "type_label": "역할 유형" + }, + "placeholder": { + "filter": "역할 검색..." + }, + "title": { + "create": "새 역할 생성", + "edit": "역할 편집: {{name}}" + }, + "types": { + "Account": "계정", + "Global": "글로벌" }, "validation": { - "required": "이 필드는 필수입니다", - "invalidEmail": "유효하지 않은 이메일 주소", - "invalidUrl": "유효하지 않은 URL", - "passwordMinLength": "비밀번호는 {{min}}자 이상이어야 합니다", - "pleaseEnterPassword": "비밀번호를 입력하십시오", - "passwordRequired": "인증 방법이 비밀번호인 경우 비밀번호는 필수입니다", - "emailRequired": "이메일 주소는 필수입니다", - "imapHostRequired": "IMAP 호스트는 필수입니다", - "imapHostCannotBeEmpty": "IMAP 호스트는 비워 둘 수 없습니다", - "imapPortMustBePositive": "IMAP 포트는 양의 정수여야 합니다", - "imapPortMustBeLessThan65536": "IMAP 포트는 65536보다 작아야 합니다", - "folderLimitMustBeNumber": "폴더 제한은 숫자여야 합니다", - "folderLimitMustBeAtLeast100": "폴더 제한은 최소 100 이상이어야 합니다", - "incrementalSyncMustBeNumber": "증분 동기화 간격은 숫자여야 합니다", - "incrementalSyncMustBeAtLeast10": "증분 동기화 간격은 최소 10분 이상이어야 합니다", - "pleaseEnterUsernameOrEmail": "사용자 이름 또는 이메일을 입력하세요", - "singleRequestBatchSizeMustBeNumber": "배치 크기는 숫자여야 합니다", - "singleRequestBatchSizeTooSmall": "배치 크기는 최소 10이어야 합니다", - "singleRequestBatchSizeTooLarge": "배치 크기는 최대 200이어야 합니다" - }, - "table": { - "noResults": "검색 결과 없음", - "loading": "로드 중...", - "page": "페이지", - "of": "의", - "rowsPerPage": "페이지당 행 수", - "showing": "표시 중", - "to": "부터", - "results": "결과", - "asc": "오름차순", - "desc": "내림차순", - "hide": "숨기기", - "edit": "편집", - "delete": "삭제", - "pagination": { - "selected": "{{selected}} / {{total}} 행 선택됨.", - "fixed_page_size": "페이지당 {{size}} 행.", - "rows_per_page": "페이지당 행 수", - "page_info": "{{page}} / {{total}} 페이지", - "first": "첫 페이지로 이동", - "previous": "이전 페이지", - "next": "다음 페이지", - "last": "마지막 페이지로 이동" - } - }, - "proxyDelete": { - "title": "프록시 삭제", - "successTitle": "삭제 성공", - "successDesc": "프록시가 성공적으로 삭제되었습니다.", - "close": "닫기", - "failedTitle": "프록시 삭제 실패", - "failedDesc": "삭제에 실패했습니다. 나중에 다시 시도하십시오", - "tryAgain": "다시 시도", - "confirmText": "삭제하시겠습니까", - "permanent": "이 작업은 프록시를 시스템에서 영구적으로 제거합니다. 이 작업은 되돌릴 수 없습니다.", - "proxyIdLabel": "프록시 ID:", - "proxyIdPlaceholder": "삭제를 확인하려면 프록시 ID를 입력하십시오.", - "warningTitle": "경고!", - "warningDesc": "주의하십시오. 이 작업은 되돌릴 수 없습니다.", - "deleteBtn": "삭제" - }, - "systemConfig": { - "pageTitle": "시스템 레벨 구성", - "pageDescription": "이 매개변수는 CLI 플래그 또는 환경 변수를 통해 초기화됩니다. 환경의 일관성을 위해 현재 읽기 전용입니다.", - "status": { - "enabled": "활성화됨", - "disabled": "비활성화됨", - "configured": "구성됨", - "missing": "누락됨", - "auto": "자동", - "notSet": "설정되지 않음" - }, - "sections": { - "network": { - "title": "네트워크", - "desc": "HTTP 및 공용 액세스" - }, - "cors": { - "title": "CORS", - "desc": "교차 출처 액세스 규칙" - }, - "logging": { - "title": "로깅", - "desc": "로그 출력 동작" - }, - "storage": { - "title": "스토리지 및 캐시", - "desc": "데이터베이스 경로 및 제한" - }, - "security": { - "title": "보안", - "desc": "인증 및 암호화" - }, - "performance": { - "title": "성능", - "desc": "동시성 및 압축" - }, - "smtp": { - "title": "SMTP 서버", - "desc": "실시간 아카이빙을 위한 수신 메일 설정" - } - } - }, - "apiTokens": { - "page": { - "loadError": "API 토큰을 불러오지 못했습니다.", - "emptyTitle": "API 토큰 없음", - "emptyDescription": "아직 생성된 API 토큰이 없습니다. 아래 버튼을 클릭하여 토큰을 생성하세요.", - "addBtn": "토큰 추가" - }, - "list": { - "unnamedToken": "이름 없는 토큰", - "statusActive": "활성", - "statusExpired": "만료됨", - "neverExpires": "만료 없음", - "expiresOnShort": "만료일: {{date}}", - "tokenLabel": "토큰", - "createdLabel": "생성일", - "lastUsedLabel": "마지막 사용", - "expiresOnLabel": "만료일", - "neverUsed": "사용 안 함", - "neverLabel": "없음", - "deleteBtn": "토큰 삭제" - }, - "dialog": { - "createTitle": "액세스 토큰 생성", - "editTitle": "액세스 토큰 편집", - "description": "완료되면 저장을 클릭하세요.", - "save": "저장", - "saveChanges": "변경 사항 저장" - }, - "deleteDialog": { - "title": "액세스 토큰을 삭제하시겠습니까?", - "description": "이 작업은 되돌릴 수 없습니다. 이 토큰을 사용하는 모든 애플리케이션의 접근 권한이 즉시 취소됩니다.", - "cancel": "취소", - "confirm": "삭제", - "deleting": "삭제 중..." - }, - "form": { - "nameLabel": "이름", - "namePlaceholder": "토큰의 짧은 이름을 입력하세요", - "nameDescription": "선택 사항 · 최대 32자", - "expirationLabel": "만료", - "expirationPlaceholder": "만료 선택", - "expirationDescription": "토큰은 선택한 시간 이후에 자동으로 만료됩니다.", - "never": "영구", - "1day": "1일", - "7days": "7일", - "30days": "30일", - "errorMax": "최대 32자", - "errorNumber": "숫자여야 합니다", - "errorInt": "정수여야 합니다", - "errorPositive": "0보다 커야 합니다" - }, - "notifications": { - "createSuccess": "액세스 토큰 생성됨", - "createSuccessDesc": "액세스 토큰이 성공적으로 생성되었습니다.", - "updateSuccess": "액세스 토큰 업데이트됨", - "updateSuccessDesc": "액세스 토큰이 성공적으로 업데이트되었습니다.", - "createFailed": "생성 실패", - "updateFailed": "업데이트 실패", - "deleteSuccess": "토큰 삭제됨", - "deleteFailed": "토큰 삭제 실패", - "copied": "클립보드에 복사됨", - "genericError": "작업 실패. 다시 시도하세요.", - "close": "닫기", - "tryAgain": "다시 시도" - } - }, - "permission": { - "scope": { - "global": "전역", - "account": "계정 #{{id}}" - }, - "dialog": { - "global_title": "전역 권한", - "account_title": "계정 권한", - "global_description": "이 사용자에게 부여된 시스템 전체 권한입니다.", - "account_description": "선택한 계정에만 적용되는 권한입니다." - }, - "category": { - "system_identity": "시스템 및 인증", - "global_data": "전역 데이터 (관리자)", - "account": "계정 권한" - }, - "system": { - "access": "기본 시스템 접근", - "root": "시스템 전체 제어" - }, - "user": { - "manage": "모든 사용자 관리", - "view": "기본 사용자 이름 보기" - }, - "token": { - "manage": "접근 토큰 관리" - }, - "account": { - "create": "이메일 계정 생성", - "manage": "할당된 계정 관리", - "manage_all": "모든 계정 설정 관리", - "read_details": "계정 상세 정보 조회" - }, - "data": { - "read": "할당된 이메일 데이터 읽기", - "read_all": "모든 이메일 데이터 읽기", - "manage": "할당된 이메일 메타데이터 관리", - "manage_all": "모든 이메일 메타데이터 관리", - "raw_download": "할당된 원본 이메일 다운로드", - "raw_download_all": "모든 원본 이메일 다운로드", - "delete": "할당된 이메일 삭제", - "delete_all": "모든 계정의 이메일 삭제", - "export_batch": "할당 데이터 일괄 내보내기", - "export_batch_all": "모든 데이터 일괄 내보내기", - "import_batch": "이메일 데이터 일괄 가져오기", - "smtp_ingest": "SMTP 프로토콜을 통해 이메일 수집" - } - }, - "users": { - "columns": { - "id": "ID", - "avatar": "아바타", - "username": "사용자 이름", - "email": "이메일 주소", - "roles": "역할 및 권한", - "created_at": "생성일", - "updated_at": "수정일", - "actions": "작업" - }, - "buttons": { - "add": "사용자 추가", - "add_new": "새 사용자 추가" - }, - "empty": { - "title": "사용자를 찾을 수 없음", - "description": "아래 버튼을 클릭하여 첫 번째 사용자를 추가하세요." - }, - "nav": { - "users": "사용자", - "roles": "역할", - "api_tokens": "API 토큰" - }, - "api_tokens": { - "empty": { - "title": "API 토큰을 찾을 수 없음", - "description": "시스템에 생성된 API 토큰이 아직 없습니다。" - }, - "button": { - "generate": "새 토큰 생성" - }, - "toolbar": { - "search_placeholder": "이름, 소유자 또는 토큰으로 검색..." - }, - "table": { - "name": "이름", - "type": "유형", - "last_used": "마지막 사용", - "expires_at": "만료일", - "owner": "소유자", - "created": "생성일", - "api_key": "API 키", - "web_ui": "웹 UI", - "never": "없음", - "permanent": "영구", - "expired": "만료됨", - "unnamed": "이름 없는 토큰" - }, - "unnamed": "이름 없는 토큰", - "delete": { - "title": "API 토큰 삭제", - "desc": "이 API 토큰을 영구적으로 삭제하려고 합니다.", - "prefix": "토큰 접두사", - "irreversible": "이 작업은 되돌릴 수 없습니다. 이 토큰을 사용하는 모든 애플리케이션은 즉시 액세스 권한을 잃게 됩니다.", - "confirm_label": "확인하려면 아래에 {{word}}를 입력하세요:", - "confirm_placeholder": "확인을 위해 \"{{word}}\" 입력", - "warning_title": "경고", - "warning_desc": "이 토큰을 사용하는 스크립트, 서비스 또는 통합이 실패합니다. 진행하기 전에 시스템을 업데이트했는지 확인하세요.", - "confirm_button": "토큰 삭제", - "deleting": "삭제 중..." - }, - "toast": { - "deleted_title": "API 토큰 삭제됨", - "deleted_desc": "\"{{name}}\" 토큰이 성공적으로 제거되었습니다.", - "delete_failed_title": "삭제 실패", - "delete_failed": "토큰 삭제에 실패했습니다. 다시 시도해 주세요." - } - }, - "tokens": { - "schema": { - "name_max": "최대 32자", - "expire_number": "숫자여야 합니다", - "expire_int": "정수여야 합니다", - "expire_positive": "0보다 커야 합니다" - }, - "toast": { - "update_success_title": "액세스 토큰 업데이트됨", - "update_success_desc": "액세스 토큰이 성공적으로 업데이트되었습니다.", - "create_success_title": "액세스 토큰 생성됨", - "create_success_desc": "액세스 토큰이 성공적으로 생성되었습니다.", - "update_failed_title": "업데이트 실패", - "create_failed_title": "생성 실패" - }, - "error": { - "fallback": "작업에 실패했습니다. 나중에 다시 시도해 주세요." - }, - "dialog": { - "edit_title": "액세스 토큰 편집", - "create_title": "액세스 토큰 생성", - "description": "완료되면 저장을 클릭하세요." - }, - "fields": { - "name_label": "이름", - "name_placeholder": "이 토큰에 대한 짧은 이름을 지정하세요", - "name_hint": "선택 사항 · 최대 32자", - "expire_label": "만료", - "expire_placeholder": "만료일 선택", - "expire_hint": "토큰은 선택한 시간 이후에 자동으로 만료됩니다." - }, - "expire_options": { - "never": "만료되지 않음", - "1_day": "1일", - "7_days": "7일", - "30_days": "30일" - } - }, - "tokens_action": { - "dialog": { - "title": "API 토큰", - "description": "이 사용자의 API 토큰을 관리합니다." - }, - "empty": { - "title": "API 토큰 없음", - "description": "이 사용자에게는 현재 API 토큰이 없습니다." - }, - "buttons": { - "add": "토큰 추가" - }, - "list": { - "unnamed_token": "이름 없는 토큰", - "status_expired": "만료됨", - "status_active": "활성", - "expires_on_brief": "{{date}}에 만료", - "never_expires": "만료되지 않음", - "label_token": "토큰", - "label_created": "생성일", - "label_last_used": "마지막 사용", - "label_expires_at": "만료일", - "never": "없음", - "button_delete": "토큰 삭제" - }, - "delete_dialog": { - "title": "액세스 토큰을 삭제하시겠습니까?", - "description": "이 작업은 되돌릴 수 없습니다." - } - }, - "actions": { - "schema": { - "account_required": "계정을 선택하세요", - "role_required": "역할을 선택하세요", - "username_required": "사용자 이름은 필수입니다", - "username_min": "사용자 이름은 3자 이상이어야 합니다", - "username_max": "사용자 이름은 32자를 초과할 수 없습니다", - "email_required": "이메일 주소는 필수입니다", - "email_invalid": "유효한 이메일 주소를 입력하세요", - "global_role_required": "최소 하나 이상의 글로벌 역할을 할당하세요", - "description_max": "설명은 256자를 초과할 수 없습니다", - "ip_invalid": "유효하지 않은 IP 주소가 감지되었습니다", - "password_required": "비밀번호는 필수입니다", - "password_min": "비밀번호는 8자 이상이어야 합니다", - "password_max": "비밀번호는 256자를 초과할 수 없습니다" - }, - "toast": { - "updated": "사용자 업데이트됨", - "created": "사용자 생성됨" - }, - "dialog": { - "edit_title": "사용자 편집: {{name}}", - "create_title": "새 사용자 생성", - "subtitle": "ID, 액세스 수준 및 보안 정책을 구성합니다." - }, - "tabs": { - "general": "기본 정보", - "permissions": "계정 권한", - "security": "보안 및 ACL" - }, - "sections": { - "basic": "기본 설정", - "global": "글로벌 권한", - "mail_access": "메일 액세스 제어", - "mail_access_subtitle": "이 사용자가 관리할 수 있는 메일 계정을 정의합니다.", - "policy": "정책 토글" - }, - "fields": { - "username": "사용자 이름", - "username_hint": "시스템 로그인을 위한 고유 식별자.", - "email": "이메일 주소", - "email_hint": "기본 연락처 및 알림 주소.", - "password": "비밀번호", - "password_placeholder_create": "최소 8자", - "password_placeholder_edit": "현재 비밀번호를 유지하려면 비워 두세요", - "password_hint_create": "초기 사용자 설정을 위한 안전한 비밀번호.", - "password_hint_edit": "비밀번호를 변경하려는 경우에만 입력하세요.", - "global_roles_hint": "높은 수준의 시스템 권한을 할당합니다.", - "description": "설명 (선택 사항)", - "description_placeholder": "사용자에 대한 메모 추가...", - "description_hint": "내부용 참고 사항 (최대 256자).", - "select_account": "계정 선택", - "assign_role": "역할 할당", - "ip_whitelist": "IP 화이트리스트", - "ip_whitelist_hint": "로그인을 제한할 IP 주소 (한 줄에 하나).", - "rate_quota": "속도 제한", - "burst_interval": "버스트 간격 (초)" - }, - "buttons": { - "add_account": "계정 추가", - "update": "사용자 업데이트", - "create": "사용자 생성" - }, - "states": { - "full_access": "전체 액세스 모드", - "full_access_desc": "시스템 관리자 역할이 있는 사용자는 수동 할당 없이 모든 계정에 액세스할 수 있습니다.", - "no_accounts": "할당된 특정 계정이 없습니다.", - "security_disabled": "현재 고급 보안 정책이 비활성화되어 있습니다." - }, - "api_tokens": "API 토큰", - "placeholder": { - "filter": "사용자 검색..." - }, - "delete": { - "title": "사용자 삭제", - "confirm_msg": "사용자 {{name}} (ID: {{id}})을 영구적으로 삭제하려고 합니다.", - "irreversible": "이 작업은 되돌릴 수 없습니다.", - "input_label": "확인하려면 아래에 사용자 ID를 입력하세요:", - "placeholder": "확인을 위해 \"{{id}}\" 입력", - "alert_title": "경고: 영구적인 작업입니다.", - "alert_desc": "삭제하면 사용자와 모든 관련 데이터가 즉시 삭제됩니다.", - "button_confirm": "사용자 삭제", - "button_deleting": "삭제 중...", - "toast": { - "success_title": "사용자 삭제됨", - "success_desc": "사용자 \"{{name}}\"이 성공적으로 제거되었습니다.", - "failed_title": "삭제 실패", - "failed_fallback": "사용자 삭제에 실패했습니다." - } - } - } - }, - "roles": { - "title": { - "create": "새 역할 생성", - "edit": "역할 편집: {{name}}" - }, - "description_hint": "액세스 범위 및 기능 권한을 정의합니다.", - "form": { - "name_label": "역할 이름", - "type_label": "역할 유형", - "desc_label": "설명", - "matrix_label": "{{type}} 권한 매트릭", - "builtin_badge": "내장 역할", - "builtin_desc": "이 역할은 시스템에 의해 사전 정의되었으며 읽기 전용입니다." - }, - "types": { - "Global": "글로벌", - "Account": "계정" - }, - "categories": { - "identity": "ID 및 관리", - "global_data": "글로벌 데이터 액세스", - "account_resource": "계정 리소스 액세스" - }, - "actions": { - "cancel": "취소", - "submit_create": "역할 생성", - "submit_update": "역할 업데이트", - "success_create": "역할이 생성되었습니다", - "success_update": "역할이 업데이트되었습니다", - "failed": "작업 실패", - "close": "닫기", - "retry": "재시도", - "add": "역할 추가" - }, - "validation": { - "name_required": "역할 이름은 필수입니다", - "perm_required": "최소 하나 이상의 권한을 선택하세요" - }, - "columns": { - "id": "ID", - "name": "이름", - "role_type": "역할 유형", - "permissions": "권한", - "created_at": "생성일", - "updated_at": "수정일" - }, - "placeholder": { - "filter": "역할 검색..." - }, - "delete": { - "dialog_title": "역할 삭제", - "warning_text": "역할 {{name}} (ID: {{id}})을 영구적으로 삭제하려고 합니다.", - "irreversible": "이 작업은 되돌릴 수 없습니다.", - "confirm_label": "확인하려면 역할 ID를 입력하세요:", - "placeholder": "\"{{id}}\" 입력", - "alert_title": "경고: 영구적인 작업입니다.", - "alert_desc": "이 역할을 삭제하면 할당된 모든 사용자에게서 제거됩니다.", - "confirm_btn": "역할 삭제", - "deleting": "삭제 중...", - "success_title": "역할 삭제됨", - "success_desc": "역할 \"{{name}}\"이 성공적으로 제거되었습니다.", - "error_title": "삭제 실패", - "error_fallback": "역할을 삭제할 수 없습니다." - }, - "details": { - "title": "역할 권한: {{name}}", - "unknown": "알 수 없는 역할", - "role_badge": "{{type}} 역할", - "desc_global": "글로벌 관리 및 시스템 수준의 액세스 권한.", - "desc_account": "단일 계정에 대한 액세스 및 데이터 작업 권한.", - "close_btn": "상세 보기 닫기", - "view_permissions": "권한 상세 정보" - }, - "empty": { - "title": "역할을 찾을 수 없음", - "desc": "사용자 정의 역할이 아직 생성되지 않았습니다." - } - }, - "profile": { - "avatar_alt": "아바타", - "menu": { - "profile": "프로필", - "settings": "설정", - "sign_out": "로그아웃" - } - }, - "sign_out": { - "title": "로그아웃", - "desc": "로그아웃하시겠습니까? 계정에 접근하려면 다시 로그인해야 합니다.", - "confirm": "로그아웃" - }, - "restore_message": { - "title": "개별 메시지 복원", - "bulkTitle": "여러 메시지 일괄 복원", - "bulkWarning": "참고: 메시지는 원래 저장된 폴더로 복원됩니다.", - "accountsInvolved": "관련 계정", - "summary": "복원 세부 정보", - "messages": "개의 메시지", - "desc": "이 작업은 선택한 메시지를 Bichon 시스템에서 다시 업로드하여 IMAP 서버의 해당 사서함으로 복원합니다.", - "confirm": "복원 실행", - "restore_to_imap": "메시지 복원", - "success": "복원 성공", - "successDesc": "선택한 메시지가 IMAP 서버로 성공적으로 복원되었습니다.", - "failed": "복원 실패", - "failedTitle": "복원 실패" - }, - "time": { - "label": "시간", - "since": "이후", - "before": "이전", - "recent_range": "최근 범위 (이후...)", - "historical": "과거 범위 (이전...)", - "absolute_range": "절대 날짜 범위", - "last_day": "최근 1일", - "last_days": "최근 {{count}}일", - "last_months": "최근 {{count}}개월", - "over_years_ago": "{{count}}{{unit}} 전", - "year": "년", - "years": "년", - "recent_prefix": "최근:", - "days_ago_to_now": "며칠 전부터 현재까지", - "apply": "적용", - "start_date": "시작 날짜", - "end_date": "종료 날짜", - "clear_filters": "시간 필터 초기화", - "format": "yyyy-MM-dd" - }, - "tag": { - "label": "태그", - "search_placeholder": "태그 검색...", - "clear_all": "모든 태그 지우기", - "no_tags_found": "태그를 찾을 수 없습니다" - }, - "search_accounts": { - "label": "메일 계정", - "search_placeholder": "메일 계정 검색...", - "clear_accounts": "선택한 계정 지우기", - "no_accounts_found": "계정을 찾을 수 없습니다" - }, - "search_mailbox": { - "label": "메일함", - "search_placeholder": "메일함 검색", - "clear_mailboxes": "선택한 폴더 지우기", - "select_account_first": "먼저 메일 계정을 선택하세요", - "no_mailbox_found": "폴더를 찾을 수 없습니다" - }, - "search_contacts": { - "label": "연락처", - "label_with_count": "연락처 ({{count}})", - "any": "제한 없음", - "search_placeholder": "{{field}} 검색...", - "reset_all": "모든 연락처 초기화", - "no_contact_found": "연락처를 찾을 수 없습니다", - "loading": "불러오는 중...", - "showing_limit": "상위 100개 결과만 표시 • 전체 {{total}}개" - }, - "search_more": { - "trigger_label": "고급", - "title": "고급 필터", - "reset": "초기화", - "has_attachment": "첨부파일 포함", - "attachment_name_label": "첨부파일 이름", - "attachment_name_placeholder": "예: invoice.pdf", - "message_size_label": "메일 크기", - "message_id_label": "원본 Message-ID", - "message_id_description": "메일 헤더의 Message-ID로 검색", - "apply": "필터 적용", - "size_presets": { - "any": "크기 제한 없음", - "tiny": "매우 작음 (< 15 KB)", - "small": "작음 (< 2 MB)", - "medium": "보통 (2 – 10 MB)", - "large": "큼 (10 – 20 MB)", - "huge": "매우 큼 (> 20 MB)" - }, - "any": "제한 없음", - "search_placeholder": "{{field}} 검색...", - "extension": "파일 확장자", - "category": "첨부 파일 카테고리", - "content_types": "구체적인 형식" - }, - "search_view": { - "button_label": "보기", - "menu_title": "표시 열 설정" - }, - "search_reset": { - "label": "초기화", - "tooltip": "모든 필터 조건 지우기" - }, - "search_input": { - "placeholder": "이메일 검색... (정규 표현식 지원)", - "button": "검색", - "recent_title": "최근 검색", - "clear_history": "기록 지우기", - "no_history": "검색 기록 없음", - "all": "전체", - "all_fields_desc": "제목, 본문, 발신자 및 수신자를 검색합니다", - "subject": "제목", - "body": "본문" + "name_required": "역할 이름은 필수입니다", + "perm_required": "최소 하나 이상의 권한을 선택하세요" } + }, + "search": { + "account": "계정", + "addEmailAccount": "이메일 계정 추가", + "addTags": { + "cancel": "취소", + "createHint": "새 태그 생성: {{tag}}", + "invalidTitle": "유효하지 않은 태그", + "none": "아직 추가된 태그가 없습니다", + "save": "저장", + "saving": "저장 중...", + "searchPlaceholder": "태그 검색 또는 생성...", + "selectedCount": "선택된 태그: {{count}}개", + "title": "태그 편집", + "tryAgain": "나중에 다시 시도해 주십시오", + "updateFailedTitle": "업데이트 실패", + "updatedDesc": "태그가 성공적으로 업데이트되었습니다", + "updatedTitle": "태그 업데이트됨" + }, + "adjustSearch": "검색 기준을 조정하거나 필터를 지워 보십시오.", + "advanced": "고급", + "advancedFilters": "고급 필터", + "any": "전체", + "attachmentName": "첨부 파일 이름", + "attachmentsSize": "첨부 파일 및 크기", + "bcc": "숨은 참조", + "before": "이전:", + "bulkActions": { + "ariaLabel": "{{count}}개의 메시지가 선택되었습니다. 일괄 작업 도구 모음", + "clear": "선택 해제", + "delete": "삭제", + "deleteDesc": "선택한 메시지 삭제", + "manageTags": "태그 관리", + "selected": "{{count}}개 선택됨" + }, + "cc": "참조", + "clear": "지우기", + "date": "날짜", + "dateRange": "날짜 범위", + "delete": { + "confirmButton": "삭제", + "confirmDetail": "이 작업은 취소할 수 없습니다.", + "confirmPrefix": "정말로", + "countLabel": "{{count}}개의 메시지를 삭제하시겠습니까?", + "errorTitle": "삭제 실패", + "successDesc": "선택한 메시지가 성공적으로 삭제되었습니다.", + "successTitle": "메시지 삭제 완료", + "title": "메시지 삭제", + "warningDesc": "삭제된 메시지는 영구적으로 제거되며 복구할 수 없습니다.", + "warningTitle": "경고" + }, + "editTag": "태그 편집", + "endDate": "종료 날짜", + "from": "보낸 사람", + "fullTextMultiAccount": "전체 텍스트 · 다중 계정 · 고급 필터", + "hasAttachment": "첨부 파일 있음", + "huge": "대용량 (≥20 MB)", + "keyword": "키워드", + "large": "큼 (10 - 20 MB)", + "mailbox": "받은 편지함", + "maxSize": "최대 크기", + "maximumBytes": "최대 (바이트)", + "medium": "중간 (2 - 10 MB)", + "messageId": "메시지 ID", + "minSize": "최소 크기", + "minimumBytes": "최소 (바이트)", + "no": "아니요", + "noActiveEmailAccount": "활성 이메일 계정이 없습니다.", + "noEmailsFound": "이메일을 찾을 수 없습니다", + "noMailboxSelectAccount": "받은 편지함이 없습니다. 먼저 계정을 선택하십시오.", + "originalMessageIdHeader": "원본 이메일 Message-ID 헤더", + "pleaseSelectAtLeastOne": "하나 이상의 검색 기준을 선택하십시오", + "preview": "미리보기", + "recipient": "수신자", + "searchArchivedEmails": "보관된 이메일 검색", + "searchButton": "검색", + "searchInSubjectBody": "제목, 본문, 첨부 파일에서 검색...", + "searching": "검색 중입니다. 잠시 기다려 주십시오...", + "searchingButton": "검색 중...", + "selectAccount": "계정 선택", + "selectDate": "날짜 선택", + "selectMailbox": "받은 편지함 선택", + "sender": "발신자", + "senderRecipients": "발신자 / 수신자", + "since": "이후:", + "size": "크기", + "sizeDescription": "크기는 첨부 파일을 포함한 이메일 전체 크기를 의미합니다.", + "small": "작음 (<2 MB)", + "sort": "정렬", + "source": "출처", + "startDate": "시작 날짜", + "startSearching": "키워드, 발신자 또는 고급 필터를 사용하여 검색을 시작하십시오.", + "subject": "제목", + "tagFilter": "태그 필터", + "thread": { + "empty": "이 스레드에 메시지가 없습니다", + "error": "스레드 로드 실패", + "invalidDate": "유효하지 않은 날짜", + "loadMore": "더 로드", + "loadingMore": "로드 중...", + "noSubject": "(제목 없음)", + "title": "스레드 · {{count}}개 메시지" + }, + "tiny": "아주 작음 (<15 KB)", + "title": "검색", + "to": "받는 사람", + "updateTags": { + "actionAdd": "추가", + "actionOverwrite": "덮어쓰기", + "actionRemove": "제거", + "cancel": "취소", + "createHint": "Enter를 눌러 새 태그 생성: \"{{tag}}\"", + "invalidTitle": "유효하지 않은 태그", + "none": "선택된 태그 없음", + "overwriteWarning": "경고: 이 작업은 선택한 항목의 모든 기존 태그를 덮어씁니다.", + "savingAdd": "추가 중...", + "savingOverwrite": "덮어쓰는 중...", + "savingRemove": "제거 중...", + "searchPlaceholder": "태그 검색 또는 생성...", + "selectedCount": "{{count}}개의 태그가 적용됩니다", + "submitAdd": "태그 추가", + "submitOverwrite": "태그 덮어쓰기", + "submitRemove": "태그 제거", + "title": "태그 업데이트", + "tryAgain": "나중에 다시 시도해 주세요.", + "updateFailedTitle": "업데이트 실패", + "updatedDesc": "태그가 성공적으로 업데이트되었습니다.", + "updatedTitle": "태그 업데이트됨" + }, + "yes": "예" + }, + "search_accounts": { + "clear_accounts": "선택한 계정 지우기", + "label": "메일 계정", + "no_accounts_found": "계정을 찾을 수 없습니다", + "search_placeholder": "메일 계정 검색..." + }, + "search_contacts": { + "any": "제한 없음", + "label": "연락처", + "label_with_count": "연락처 ({{count}})", + "loading": "불러오는 중...", + "no_contact_found": "연락처를 찾을 수 없습니다", + "reset_all": "모든 연락처 초기화", + "search_placeholder": "{{field}} 검색...", + "showing_limit": "상위 100개 결과만 표시 • 전체 {{total}}개" + }, + "search_input": { + "all": "전체", + "all_fields_desc": "제목, 본문, 발신자 및 수신자를 검색합니다", + "body": "본문", + "button": "검색", + "clear_history": "기록 지우기", + "no_history": "검색 기록 없음", + "placeholder": "이메일 검색 (구문 검색은 \" \" 사용)", + "recent_title": "최근 검색", + "subject": "제목" + }, + "search_mailbox": { + "clear_mailboxes": "선택한 폴더 지우기", + "label": "메일함", + "no_mailbox_found": "폴더를 찾을 수 없습니다", + "search_placeholder": "메일함 검색", + "select_account_first": "먼저 메일 계정을 선택하세요" + }, + "search_more": { + "any": "제한 없음", + "apply": "필터 적용", + "attachment_name_label": "첨부파일 이름", + "attachment_name_placeholder": "예: invoice.pdf", + "category": "첨부 파일 카테고리", + "content_type": "파일 형식", + "extension": "파일 확장자", + "has_attachment": "첨부파일 포함", + "is_message": "이메일 형식 첨부 파일", + "is_message_desc": "이 첨부 파일은 메일 파일입니다(예: .eml 파일).", + "message_id_description": "메일 헤더의 Message-ID로 검색", + "message_id_label": "원본 Message-ID", + "message_size_label": "메일 크기", + "reset": "초기화", + "search_placeholder": "{{field}} 검색...", + "size_presets": { + "any": "크기 제한 없음", + "huge": "매우 큼 (> 20 MB)", + "large": "큼 (10 – 20 MB)", + "medium": "보통 (2 – 10 MB)", + "small": "작음 (< 2 MB)", + "tiny": "매우 작음 (< 15 KB)" + }, + "title": "고급 필터", + "trigger_label": "고급" + }, + "search_reset": { + "label": "초기화", + "tooltip": "모든 필터 조건 지우기" + }, + "search_view": { + "button_label": "보기", + "menu_title": "표시 열 설정" + }, + "settings": { + "accounts": "계정", + "acl": "ACL", + "actions": "작업", + "add": "추가", + "addNewProxyHere": "여기에서 새 프록시를 추가하십시오.", + "adding": "추가 중...", + "appearance": { + "button": { + "update": "설정 업데이트" + }, + "command": { + "no_results": "언어를 찾을 수 없습니다.", + "search": "언어 검색..." + }, + "description": { + "language": "웹 UI에서 사용할 언어를 선택하세요.", + "theme": "라이트 모드와 다크 모드 중에서 선택하세요." + }, + "field": { + "language": "인터페이스 언어", + "theme": "인터페이스 테마" + }, + "placeholder": { + "select_language": "언어 선택" + }, + "theme": { + "dark": "다크", + "light": "라이트" + }, + "title": "외관", + "validation": { + "language": { + "required": "언어를 선택해주세요." + }, + "theme": { + "required": "테마를 선택해주세요." + } + } + }, + "authUrl": "인증 URL", + "changePasswordForFutureLogins": "향후 로그인을 위한 비밀번호를 변경합니다.", + "confirmReset": "초기화 확인", + "createdAt": "생성일", + "delete": "삭제", + "description": "설명", + "edit": "편집", + "enabled": "활성화됨", + "enterNewRootPassword": "새 루트 비밀번호 입력", + "enterProxyIdToConfirmDeletion": "삭제를 확인하려면 프록시 ID를 입력하십시오.", + "failedToCopyText": "텍스트 복사 실패", + "filterAccessToken": "접근 토큰 필터링...", + "filterAccount": "계정 필터링...", + "filterOauth2": "OAuth2 필터링...", + "filterProxy": "프록시 필터링...", + "general": "일반", + "generateNewToken": "새 토큰을 생성합니다. 이전 토큰은 즉시 무효화됩니다.", + "host": "호스트", + "id": "ID", + "invalidPassword": "유효하지 않은 비밀번호", + "lastAccess": "최종 접근", + "manageRootTokenAndPassword": "루트 토큰과 비밀번호를 안전하게 관리합니다.", + "name": "이름", + "noProxies": "프록시 없음", + "noProxiesDesc": "아직 프록시 구성을 추가하지 않았습니다. 기능을 사용하려면 추가하십시오.", + "password": "비밀번호", + "pleaseUseAnIpAddressForBetterReliability": "더 나은 안정성을 위해 호스트 이름이나 도메인 대신 IP 주소(예: 127.0.0.1)를 사용하십시오.", + "port": "포트", + "profile": { + "account": { + "id": "계정 ID: {{id}}" + }, + "avatarAlt": "아바타", + "button": { + "permissions": "권한", + "update_profile": "프로필 업데이트", + "view_global_permissions": "전역 권한 보기" + }, + "field": { + "email": "이메일", + "password": "비밀번호", + "username": "사용자 이름" + }, + "loadError": "사용자 정보를 불러오는 데 실패했습니다.", + "maxSize": "최대 {{size}}", + "placeholder": { + "password_keep": "비워두면 현재 비밀번호가 유지됩니다" + }, + "removeAvatar": "아바타 삭제", + "section": { + "accounts": "연결된 계정 {{count}}개", + "roles": "역할" + }, + "toast": { + "update_failed": "프로필 업데이트에 실패했습니다", + "updated": "프로필이 성공적으로 업데이트되었습니다" + }, + "uploadError": "파일 업로드 오류", + "uploadTitle": "아바타 업로드", + "validation": { + "email": { + "invalid": "유효한 이메일 주소를 입력하세요", + "required": "이메일은 필수입니다" + }, + "password": { + "max": "비밀번호는 최대 256자까지 가능합니다", + "min": "비밀번호는 최소 8자 이상이어야 합니다" + }, + "username": { + "max": "사용자 이름은 최대 32자까지 가능합니다", + "min": "사용자 이름은 최소 5자 이상이어야 합니다", + "required": "사용자 이름은 필수입니다" + } + } + }, + "proxy": "프록시", + "proxyUpdateOrAddFailed": "{{action}}에 실패했습니다. 나중에 다시 시도하십시오", + "reset": "초기화", + "resetRootPassword": "루트 비밀번호 초기화", + "resetRootToken": "루트 토큰 초기화", + "root": "루트", + "rootAccessManagement": "루트 접근 관리", + "rootDesc": "토큰 및 비밀번호를 포함한 루트 접근 자격 증명을 관리합니다.", + "rootPasswordMustBeAtLeast6Characters": "루트 비밀번호는 6자 이상이어야 합니다.", + "rootTitle": "루트", + "selectAll": "모두 선택", + "sidebar": { + "apiTokens": "API 토큰", + "configurations": "시스템 설정", + "profile": "프로필", + "proxy": "네트워크 프록시" + }, + "theRootPasswordHasBeenReset": "루트 비밀번호가 초기화되었습니다", + "theRootTokenHasBeenReset": "루트 토큰이 초기화되었습니다", + "theme": "테마", + "title": "설정", + "token": "토큰", + "tokenUrl": "토큰 URL", + "type": "유형", + "updateTheProxyHere": "여기에서 프록시를 업데이트하십시오.", + "updatedAt": "업데이트일", + "url": "URL", + "useNewPasswordForNextLogin": "다음 로그인 시 새 비밀번호를 사용하십시오.", + "useProxy": "프록시 사용", + "username": "사용자 이름", + "youAreAboutToResetTheRootPassword": "루트 비밀번호를 초기화하려고 합니다. 안전하게 보관하십시오.", + "youAreAboutToResetTheRootToken": "루트 토큰을 초기화하려고 합니다. 이 작업은 되돌릴 수 없습니다.", + "yourLoginInformationHasBeenUpdated": "로그인 정보가 업데이트되었습니다. 다시 로그인할 필요는 없습니다.", + "yourProxyHasBeenSuccessfully": "프록시가 성공적으로 {{action}}되었습니다." + }, + "sign_out": { + "confirm": "로그아웃", + "desc": "로그아웃하시겠습니까? 계정에 접근하려면 다시 로그인해야 합니다.", + "title": "로그아웃" + }, + "systemConfig": { + "pageDescription": "이 매개변수는 CLI 플래그 또는 환경 변수를 통해 초기화됩니다. 환경의 일관성을 위해 현재 읽기 전용입니다.", + "pageTitle": "시스템 레벨 구성", + "sections": { + "cors": { + "desc": "교차 출처 액세스 규칙", + "title": "CORS" + }, + "logging": { + "desc": "로그 출력 동작", + "title": "로깅" + }, + "network": { + "desc": "HTTP 및 공용 액세스", + "title": "네트워크" + }, + "performance": { + "desc": "동시성 및 압축", + "title": "성능" + }, + "security": { + "desc": "인증 및 암호화", + "title": "보안" + }, + "smtp": { + "desc": "실시간 아카이빙을 위한 수신 메일 설정", + "title": "SMTP 서버" + }, + "storage": { + "desc": "데이터베이스 경로 및 제한", + "title": "스토리지 및 캐시" + } + }, + "status": { + "auto": "자동", + "configured": "구성됨", + "disabled": "비활성화됨", + "enabled": "활성화됨", + "missing": "누락됨", + "notSet": "설정되지 않음" + } + }, + "table": { + "asc": "오름차순", + "delete": "삭제", + "desc": "내림차순", + "edit": "편집", + "hide": "숨기기", + "loading": "로드 중...", + "noResults": "검색 결과 없음", + "of": "의", + "page": "페이지", + "pagination": { + "first": "첫 페이지로 이동", + "fixed_page_size": "페이지당 {{size}} 행.", + "last": "마지막 페이지로 이동", + "next": "다음 페이지", + "page_info": "{{page}} / {{total}} 페이지", + "previous": "이전 페이지", + "rows_per_page": "페이지당 행 수", + "selected": "{{selected}} / {{total}} 행 선택됨." + }, + "results": "결과", + "rowsPerPage": "페이지당 행 수", + "showing": "표시 중", + "to": "부터" + }, + "tag": { + "clear_all": "모든 태그 지우기", + "label": "태그", + "no_tags_found": "태그를 찾을 수 없습니다", + "search_placeholder": "태그 검색..." + }, + "time": { + "absolute_range": "절대 날짜 범위", + "apply": "적용", + "before": "이전", + "clear_filters": "시간 필터 초기화", + "days_ago_to_now": "며칠 전부터 현재까지", + "end_date": "종료 날짜", + "format": "yyyy-MM-dd", + "historical": "과거 범위 (이전...)", + "label": "시간", + "last_day": "최근 1일", + "last_days": "최근 {{count}}일", + "last_months": "최근 {{count}}개월", + "over_years_ago": "{{count}}{{unit}} 전", + "recent_prefix": "최근:", + "recent_range": "최근 범위 (이후...)", + "since": "이후", + "start_date": "시작 날짜", + "year": "년", + "years": "년" + }, + "users": { + "actions": { + "api_tokens": "API 토큰", + "buttons": { + "add_account": "계정 추가", + "create": "사용자 생성", + "update": "사용자 업데이트" + }, + "delete": { + "alert_desc": "삭제하면 사용자와 모든 관련 데이터가 즉시 삭제됩니다.", + "alert_title": "경고: 영구적인 작업입니다.", + "button_confirm": "사용자 삭제", + "button_deleting": "삭제 중...", + "confirm_msg": "사용자 {{name}} (ID: {{id}})을 영구적으로 삭제하려고 합니다.", + "input_label": "확인하려면 아래에 사용자 ID를 입력하세요:", + "irreversible": "이 작업은 되돌릴 수 없습니다.", + "placeholder": "확인을 위해 \"{{id}}\" 입력", + "title": "사용자 삭제", + "toast": { + "failed_fallback": "사용자 삭제에 실패했습니다.", + "failed_title": "삭제 실패", + "success_desc": "사용자 \"{{name}}\"이 성공적으로 제거되었습니다.", + "success_title": "사용자 삭제됨" + } + }, + "dialog": { + "create_title": "새 사용자 생성", + "edit_title": "사용자 편집: {{name}}", + "subtitle": "ID, 액세스 수준 및 보안 정책을 구성합니다." + }, + "fields": { + "assign_role": "역할 할당", + "burst_interval": "버스트 간격 (초)", + "description": "설명 (선택 사항)", + "description_hint": "내부용 참고 사항 (최대 256자).", + "description_placeholder": "사용자에 대한 메모 추가...", + "email": "이메일 주소", + "email_hint": "기본 연락처 및 알림 주소.", + "global_roles_hint": "높은 수준의 시스템 권한을 할당합니다.", + "ip_whitelist": "IP 화이트리스트", + "ip_whitelist_hint": "로그인을 제한할 IP 주소 (한 줄에 하나).", + "password": "비밀번호", + "password_hint_create": "초기 사용자 설정을 위한 안전한 비밀번호.", + "password_hint_edit": "비밀번호를 변경하려는 경우에만 입력하세요.", + "password_placeholder_create": "최소 8자", + "password_placeholder_edit": "현재 비밀번호를 유지하려면 비워 두세요", + "rate_quota": "속도 제한", + "select_account": "계정 선택", + "username": "사용자 이름", + "username_hint": "시스템 로그인을 위한 고유 식별자." + }, + "placeholder": { + "filter": "사용자 검색..." + }, + "schema": { + "account_required": "계정을 선택하세요", + "description_max": "설명은 256자를 초과할 수 없습니다", + "email_invalid": "유효한 이메일 주소를 입력하세요", + "email_required": "이메일 주소는 필수입니다", + "global_role_required": "최소 하나 이상의 글로벌 역할을 할당하세요", + "ip_invalid": "유효하지 않은 IP 주소가 감지되었습니다", + "password_max": "비밀번호는 256자를 초과할 수 없습니다", + "password_min": "비밀번호는 8자 이상이어야 합니다", + "password_required": "비밀번호는 필수입니다", + "role_required": "역할을 선택하세요", + "username_max": "사용자 이름은 32자를 초과할 수 없습니다", + "username_min": "사용자 이름은 3자 이상이어야 합니다", + "username_required": "사용자 이름은 필수입니다" + }, + "sections": { + "basic": "기본 설정", + "global": "글로벌 권한", + "mail_access": "메일 액세스 제어", + "mail_access_subtitle": "이 사용자가 관리할 수 있는 메일 계정을 정의합니다.", + "policy": "정책 토글" + }, + "states": { + "full_access": "전체 액세스 모드", + "full_access_desc": "시스템 관리자 역할이 있는 사용자는 수동 할당 없이 모든 계정에 액세스할 수 있습니다.", + "no_accounts": "할당된 특정 계정이 없습니다.", + "security_disabled": "현재 고급 보안 정책이 비활성화되어 있습니다." + }, + "tabs": { + "general": "기본 정보", + "permissions": "계정 권한", + "security": "보안 및 ACL" + }, + "toast": { + "created": "사용자 생성됨", + "updated": "사용자 업데이트됨" + } + }, + "api_tokens": { + "button": { + "generate": "새 토큰 생성" + }, + "delete": { + "confirm_button": "토큰 삭제", + "confirm_label": "확인하려면 아래에 {{word}}를 입력하세요:", + "confirm_placeholder": "확인을 위해 \"{{word}}\" 입력", + "deleting": "삭제 중...", + "desc": "이 API 토큰을 영구적으로 삭제하려고 합니다.", + "irreversible": "이 작업은 되돌릴 수 없습니다. 이 토큰을 사용하는 모든 애플리케이션은 즉시 액세스 권한을 잃게 됩니다.", + "prefix": "토큰 접두사", + "title": "API 토큰 삭제", + "warning_desc": "이 토큰을 사용하는 스크립트, 서비스 또는 통합이 실패합니다. 진행하기 전에 시스템을 업데이트했는지 확인하세요.", + "warning_title": "경고" + }, + "empty": { + "description": "시스템에 생성된 API 토큰이 아직 없습니다。", + "title": "API 토큰을 찾을 수 없음" + }, + "table": { + "api_key": "API 키", + "created": "생성일", + "expired": "만료됨", + "expires_at": "만료일", + "last_used": "마지막 사용", + "name": "이름", + "never": "없음", + "owner": "소유자", + "permanent": "영구", + "type": "유형", + "unnamed": "이름 없는 토큰", + "web_ui": "웹 UI" + }, + "toast": { + "delete_failed": "토큰 삭제에 실패했습니다. 다시 시도해 주세요.", + "delete_failed_title": "삭제 실패", + "deleted_desc": "\"{{name}}\" 토큰이 성공적으로 제거되었습니다.", + "deleted_title": "API 토큰 삭제됨" + }, + "toolbar": { + "search_placeholder": "이름, 소유자 또는 토큰으로 검색..." + }, + "unnamed": "이름 없는 토큰" + }, + "buttons": { + "add": "사용자 추가", + "add_new": "새 사용자 추가" + }, + "columns": { + "actions": "작업", + "avatar": "아바타", + "created_at": "생성일", + "email": "이메일 주소", + "id": "ID", + "roles": "역할 및 권한", + "updated_at": "수정일", + "username": "사용자 이름" + }, + "empty": { + "description": "아래 버튼을 클릭하여 첫 번째 사용자를 추가하세요.", + "title": "사용자를 찾을 수 없음" + }, + "nav": { + "api_tokens": "API 토큰", + "roles": "역할", + "users": "사용자" + }, + "tokens": { + "dialog": { + "create_title": "액세스 토큰 생성", + "description": "완료되면 저장을 클릭하세요.", + "edit_title": "액세스 토큰 편집" + }, + "error": { + "fallback": "작업에 실패했습니다. 나중에 다시 시도해 주세요." + }, + "expire_options": { + "1_day": "1일", + "30_days": "30일", + "7_days": "7일", + "never": "만료되지 않음" + }, + "fields": { + "expire_hint": "토큰은 선택한 시간 이후에 자동으로 만료됩니다.", + "expire_label": "만료", + "expire_placeholder": "만료일 선택", + "name_hint": "선택 사항 · 최대 32자", + "name_label": "이름", + "name_placeholder": "이 토큰에 대한 짧은 이름을 지정하세요" + }, + "schema": { + "expire_int": "정수여야 합니다", + "expire_number": "숫자여야 합니다", + "expire_positive": "0보다 커야 합니다", + "name_max": "최대 32자" + }, + "toast": { + "create_failed_title": "생성 실패", + "create_success_desc": "액세스 토큰이 성공적으로 생성되었습니다.", + "create_success_title": "액세스 토큰 생성됨", + "update_failed_title": "업데이트 실패", + "update_success_desc": "액세스 토큰이 성공적으로 업데이트되었습니다.", + "update_success_title": "액세스 토큰 업데이트됨" + } + }, + "tokens_action": { + "buttons": { + "add": "토큰 추가" + }, + "delete_dialog": { + "description": "이 작업은 되돌릴 수 없습니다.", + "title": "액세스 토큰을 삭제하시겠습니까?" + }, + "dialog": { + "description": "이 사용자의 API 토큰을 관리합니다.", + "title": "API 토큰" + }, + "empty": { + "description": "이 사용자에게는 현재 API 토큰이 없습니다.", + "title": "API 토큰 없음" + }, + "list": { + "button_delete": "토큰 삭제", + "expires_on_brief": "{{date}}에 만료", + "label_created": "생성일", + "label_expires_at": "만료일", + "label_last_used": "마지막 사용", + "label_token": "토큰", + "never": "없음", + "never_expires": "만료되지 않음", + "status_active": "활성", + "status_expired": "만료됨", + "unnamed_token": "이름 없는 토큰" + } + } + }, + "validation": { + "emailRequired": "이메일 주소는 필수입니다", + "folderLimitMustBeAtLeast100": "폴더 제한은 최소 100 이상이어야 합니다", + "folderLimitMustBeNumber": "폴더 제한은 숫자여야 합니다", + "imapHostCannotBeEmpty": "IMAP 호스트는 비워 둘 수 없습니다", + "imapHostRequired": "IMAP 호스트는 필수입니다", + "imapPortMustBeLessThan65536": "IMAP 포트는 65536보다 작아야 합니다", + "imapPortMustBePositive": "IMAP 포트는 양의 정수여야 합니다", + "incrementalSyncMustBeAtLeast10": "증분 동기화 간격은 최소 10분 이상이어야 합니다", + "incrementalSyncMustBeNumber": "증분 동기화 간격은 숫자여야 합니다", + "invalidEmail": "유효하지 않은 이메일 주소", + "invalidUrl": "유효하지 않은 URL", + "passwordMinLength": "비밀번호는 {{min}}자 이상이어야 합니다", + "passwordRequired": "인증 방법이 비밀번호인 경우 비밀번호는 필수입니다", + "pleaseEnterPassword": "비밀번호를 입력하십시오", + "pleaseEnterUsernameOrEmail": "사용자 이름 또는 이메일을 입력하세요", + "required": "이 필드는 필수입니다", + "singleRequestBatchSizeMustBeNumber": "배치 크기는 숫자여야 합니다", + "singleRequestBatchSizeTooLarge": "배치 크기는 최대 200이어야 합니다", + "singleRequestBatchSizeTooSmall": "배치 크기는 최소 10이어야 합니다" + } } \ No newline at end of file diff --git a/web/src/locales/nl.json b/web/src/locales/nl.json index 2129629..04856bc 100644 --- a/web/src/locales/nl.json +++ b/web/src/locales/nl.json @@ -1,1614 +1,1630 @@ { - "common": { - "submit": "Verzenden", + "accessTokens": { + "aListOfIpAddressesAllowed": "Een lijst van IP-adressen die toegang hebben tot de bron. Voer één IP-adres per regel in. (Optioneel)", + "accountId": "Account ID", + "accounts": "Accounts", + "aclRulesForAccessTokens": "ACL-regels voor toegangstokens omvatten IP-whitelist verificatie en rate limit handhaving.", + "actions": { + "delete": "Verwijderen", + "edit": "Bewerken", + "openMenu": "Menu openen" + }, + "addNew": "Nieuwe Toevoegen", + "atLeastOneAccountIsRequired": "Ten minste één account is vereist.", + "create": "Aanmaken", + "createNewAccessTokenHere": "Maak hier een nieuw toegangstoken aan.", + "created": "Aangemaakt", + "createdAt": "Aangemaakt Op", + "creating": "Bezig met aanmaken...", + "creationFailed": "Aanmaken Mislukt", + "delete": "Verwijderen", + "describeThePurposeOfTheAccessToken": "Beschrijf het doel van het toegangstoken", + "description": "Beheer hier uw toegangstokens, hun toegangscontroles, IP-whitelists en rate-limiting instellingen.", + "descriptionMustNotExceed255Characters": "Beschrijving mag niet langer zijn dan 255 tekens.", + "edit": "Bewerken", + "editToken": "Token Bewerken", + "enterIntervalInSeconds": "Voer interval in seconden in, bv. 60", + "enterOneIpAddressPerLine": "Voer één IP-adres per regel in, bv.:\n192.168.1.1\n192.168.1.2", + "enterQuota": "Voer quotum in, bv. 100", + "expiresAt": "Verloopt Op", + "filterByEmailAddressOrAccountId": "Filter op e-mailadres of account ID...", + "interval": "Interval", + "intervalMustBeAPositiveInteger": "Interval moet een positief geheel getal zijn.", + "invalidIpAddressesFound": "Ongeldige IP-adressen gevonden. Voer geldige IPv4- of IPv6-adressen in.", + "name": "Naam", + "noTokens": "Geen Toegangstokens", + "noTokensDesc": "U heeft nog geen toegangstokens aangemaakt. Maak er een aan om de API-functies te gebruiken.", + "notUsedYet": "Nog niet gebruikt", + "quota": "Quotum", + "quotaMustBeAPositiveInteger": "Quotum moet een positief geheel getal zijn.", + "save": "Opslaan", + "saveChanges": "Wijzigingen opslaan", + "saving": "Bezig met opslaan...", + "selectAccounts": "Selecteer accounts", + "selectMultipleAccountsForTheAccessToken": "Selecteer meerdere accounts voor de autorisatiebereik van het toegangstoken.", + "theListOfAccountsThatCanBeQueried": "De lijst met accounts die kunnen worden bevraagd met behulp van een toegangstoken.", + "theMaximumNumberOfRequestsAllowed": "Het maximale aantal verzoeken dat binnen het interval is toegestaan. (Optioneel)", + "theTimeWindowForTheRateLimit": "Het tijdsvenster (in seconden) voor de rate limit. (Optioneel)", + "title": "Toegangstokens", + "token": "Token", + "updateFailed": "Bijwerken Mislukt", + "updateOrCreationFailed": "{{action}} mislukt, probeer het later opnieuw", + "updateTheAccessTokenHere": "Werk het toegangstoken hier bij.", + "updated": "Bijgewerkt", + "updating": "Bezig met bijwerken...", + "yourAccessTokenHasBeenSuccessfully": "Uw toegangstoken is succesvol {{action}}." + }, + "accounts": { + "accessControl": "Toegangsbeheer", + "accessTokenCopiedToClipboard": "Toegangstoken naar klembord gekopieerd", + "access_control": { + "buttons": { "cancel": "Annuleren", - "save": "Opslaan", - "save_changes": "Wijzigingen opslaan", - "delete": "Verwijderen", - "edit": "Bewerken", - "search": "Zoeken", - "add": "Toevoegen", - "remove": "Verwijderen", - "create": "Aanmaken", - "update": "Bijwerken", - "confirm": "Bevestigen", + "save": "Toewijzing opslaan" + }, + "description": "Rollen en geautoriseerde gebruikers toewijzen aan {{email}}", + "role_label": "Toegangsrol", + "role_loading": "Rollen laden...", + "role_placeholder": "Selecteer een rol", + "title": "Toewijzing accounttoegang", + "toast": { + "failed_title": "Toewijzing mislukt", + "success_desc": "Machtigingen zijn succesvol toegewezen aan {{email}}", + "success_title": "Toewijzing geslaagd" + }, + "user_empty": "Geen gebruikers gevonden", + "user_label": "Geautoriseerde gebruikers selecteren", + "user_search_placeholder": "Zoek op gebruikersnaam of e-mail...", + "user_selected_count": "Geselecteerd: {{count}} gebruiker(s)", + "validation": { + "role_required": "Selecteer een rol om toe te wijzen", + "user_required": "Selecteer ten minste één gebruiker" + } + }, + "accountCreated": "Account Aangemaakt", + "accountCreatedDesc": "Uw account is succesvol aangemaakt.", + "accountCreationFailed": "Account Aanmaken Mislukt", + "accountDetails": "Accountdetails", + "accountHasBeenSuccessfully": "Account is succesvol {{action}}", + "accountSyncFoldersUpdateFailed": "Account Sync Mappen Bijwerken Mislukt", + "accountSyncFoldersUpdated": "Account Sync Mappen Bijgewerkt", + "accountUpdateFailed": "Account Bijwerken Mislukt", + "accountUpdated": "Account Bijgewerkt", + "accountUpdatedDesc": "Uw account is succesvol bijgewerkt.", + "actions": "Acties", + "addAccount": "Account Toevoegen", + "addConfiguration": "Configuratie Toevoegen", + "addImap": "IMAP Toevoegen", + "addNewEmailAccountHere": "Voeg hier een nieuw e-mailaccount toe. ", + "addNoSync": "NoSync Toevoegen", + "allMailFolderSelected": "Let Op: 'Alle Mail' Map Geselecteerd", + "allMailFolderSelectedDesc": "Het selecteren van mappen met het 'Alle Mail'-kenmerk zal waarschijnlijk leiden tot dubbele berichten die al zijn gesynchroniseerd vanuit mappen zoals Postvak In en Verzonden. Dit kan aanzienlijk meer opslagruimte in beslag nemen.", + "allMailSkipped": "Standaardmappen geselecteerd. 'Alle Mail' is overgeslagen om duplicaten te voorkomen.", + "areYouSureYouWantTo": "Weet je zeker dat je dit account wilt {{action}}?", + "auth": "Authenticatie", + "authType": "authenticatie_type", + "autoConfiguring": "Automatisch configureren...", + "beforeRelative": "Download alleen oude e-mails", + "beforeRelativeValue": "Download e-mails van {{value}} {{unit}} geleden", + "capabilities": "Mogelijkheden", + "chooseAuthMethod": "Kies de authenticatiemethode voor IMAP.", + "chooseEncryptionMethod": "Kies de versleutelingsmethode voor IMAP.", + "chooseMailboxesToDownload": "Kies mailboxen om te downloaden voor {{email}}. Nieuw toegevoegde mailboxen worden in de volgende cyclus gedownload.", + "clickHere": "klik hier", + "clickSaveWhenDone": "Klik op opslaan als u klaar bent.", + "continue": "Doorgaan", + "createdAt": "Aangemaakt Op", + "creationFailed": "Aanmaken mislukt, probeer het later opnieuw", + "dateSelection": "Datumselectie", + "dateSince": "Datum Sinds", + "days": "Dagen", + "delete": "Verwijderen", + "description": "Beheer en configureer uw e-mailaccounts.", + "detail": "Detail", + "detailsOfTheOAuth2TokensForTheAccount": "Details van de OAuth2-tokens voor het account.", + "determinesWhetherThisAccountIsActiveNoSync": "Bepaalt of dit account actief is. Als het is uitgeschakeld, kan er geen data worden geïmporteerd.", + "disable": "Uitschakelen", + "disableAccount": "Account uitschakelen", + "disabled": "Uitgeschakeld", + "downloadAll": "Download alle e-mails", + "downloadBatchSize": "Download batchgrootte", + "downloadBatchSizeDescription": "Aantal berichten opgehaald per IMAP-verzoek", + "downloadInterval": "Download-interval (minuten)", + "downloadIntervalPlaceholder": "Voer minuten in", + "downloadScope": "Downloadstrategie", + "downloadScopeDescription": "Kies welke e-mails moeten worden geïndexeerd en gedownload.", + "duration": "Duur", + "edit": "Bewerken", + "email": "E-mail", + "emailAccountRegistration": "E-mailaccount Registratie", + "emailAccountRegistrationDesc": "Voer uw e-mailadres in. In de volgende stappen configureert u de IMAP-gegevens. We gebruiken dit adres om automatisch de IMAP-serverinstellingen te detecteren.", + "emailAddress": "E-mailadres", + "emailCannotBeModified": "Het e-mailadres van het account kan niet worden gewijzigd tijdens het bewerken.", + "emailPlaceholder": "bv. john.doe@voorbeeld.com", + "enable": "Inschakelen", + "enableAccount": "Account inschakelen", + "enabled": "Ingeschakeld", + "enabledDescription": "Bepaalt of dit account actief is. Indien uitgeschakeld, zullen gerelateerde downloads niet worden uitgevoerd.", + "encryption": "versleuteling", + "enterPassword": "Voer uw wachtwoord in", + "enterValue": "Voer een waarde in", + "everyMinutes": "elke {{minutes}} minuten", + "field": "Veld", + "fixed": "Vast", + "folderLimit": "Mappenlimiet", + "folderLimitDescription": "Beperk het aantal te synchroniseren e-mails per map (minimaal 100). Laat leeg voor geen limiet.", + "folderLimitPlaceholder": "bv. 1000", + "folderSync": { + "autoSelectDescendants": "Automatisch onderliggende items selecteren", + "autoSelectParents": "Automatisch bovenliggende items selecteren", + "batches": "batches", + "collapseAll": "Alles inklappen", + "expandAll": "Alles uitklappen", + "loadingMailboxFolders": "Postvakken laden…", + "noData": "Geen Gegevens", + "noFolders": "Geen mappen om te synchroniseren" + }, + "foldersConfiguredForSync": "{{count}} map(pen) geconfigureerd voor sync", + "foldersSelected": "{{count}} map(pen) geselecteerd", + "goBack": "Terug Gaan", + "host": "host", + "id": "ID", + "imap": "IMAP", + "imapAuthMethod": "IMAP Autorisatiemethode", + "imapEncryption": "IMAP Versleuteling", + "imapHost": "IMAP Host", + "imapHostPlaceholder": "bv. imap.voorbeeld.com", + "imapPassword": "IMAP Wachtwoord", + "imapPort": "IMAP Poort", + "imapPortPlaceholder": "bv. 993", + "imapProxy": "Gebruik een SOCKS5-proxy voor IMAP-verbindingen.", + "incSync": "Inc Sync", + "lastSync": "Laatste Sync", + "leaveEmptyToKeepExisting": "Laat leeg om het bestaande wachtwoord te behouden, of voer een nieuw wachtwoord in om het bij te werken.", + "leaveEmptyToKeepPassword": "Laat leeg om huidig wachtwoord te behouden", + "login_name": "Inlognaam", + "minutes": "minuten", + "months": "Maanden", + "moreAccountTypes": "Meer accounttypes", + "mustBeAtLeast1": "Moet ten minste 1 zijn", + "name": "Naam", + "nameDescription": "IMAP-gebruikersnaam. Standaard je e-mail, of kies een andere.", + "namePlaceholder": "bv. john.doe", + "noAccountConfigurations": "Geen Accountconfiguraties", + "noAccountConfigurationsDesc": "U heeft nog geen Accountconfiguraties toegevoegd. Voeg er een toe om de Accountfuncties te gebruiken.", + "noOAuth2Tokens": "Geen OAuth2 Tokens", + "none": "Geen", + "notAvailable": "n.v.t.", + "oauth2Tokens": "OAuth2 Tokens", + "openMenu": "Menu openen", + "optional": "Optioneel", + "owner": "Maker", + "password": "wachtwoord", + "port": "poort", + "recent": "recent", + "refreshToken": "Vernieuwingstoken (Refresh Token)", + "refreshTokenCopiedToClipboard": "Vernieuwingstoken naar klembord gekopieerd", + "relative": "Relatief", + "runningState": { + "account": { + "id": "Account-ID" + }, + "common": { "close": "Sluiten", - "yes": "Ja", - "no": "Nee", - "ok": "OK", - "loading": "Laden...", - "empty": "Leeg", - "noData": "Geen gegevens", - "table": { - "noResults": "Geen resultaten." - }, - "failed": "Mislukt", - "notFound": "Niet gevonden", - "back": "Terug", - "goBack": "Ga terug", - "backToHome": "Terug naar Home", - "tryAgain": "Opnieuw proberen", - "more": "Meer", - "actions": "Acties", - "filter": "Filteren", - "reset": "Resetten", - "clear": "Wissen", - "error": "Fout", - "apply": "Toepassen", - "select": "Selecteren", - "selectAll": "Alles selecteren", - "deselectAll": "Alles deselecteren", - "all": "Alle", - "none": "Geen", - "showLess": "Minder weergeven", - "showMore": "Meer weergeven...", - "project_description": "Bichon is een open-source project.", - "view_on_github_button": "Bekijken op GitHub", - "op_failed": "Bewerking mislukt", - "na": "N.v.t.", - "retry": "Opnieuw", - "deleting": "Verwijderen..." - }, - "navigation": { - "home": "Startpagina", - "settings": "Instellingen", - "accounts": "Accounts", - "dashboard": "Dashboard", - "mailbox": "Postvak In", - "oauth2": "OAuth2", - "accessTokens": "Toegangstokens", - "apiDocs": "API Documentatie", - "general": "Algemeen", - "auth": "Authenticatie", - "other": "Overig", - "users": "Systeemgebruikers" - }, - "auth": { - "welcome": "Welkom bij Bichon", - "username": "Gebruikersnaam", - "password": "Wachtwoord", - "login": "Inloggen", - "loginFailed": "Inloggen Mislukt", - "invalidPassword": "Ongeldig wachtwoord. Probeer het opnieuw.", - "somethingWentWrong": "Er is iets fout gegaan", - "sessionExpired": "Sessie verlopen!", - "sessionExpiredDesc": "Uw sessie is beëindigd vanwege inactiviteit. Log opnieuw in om door te gaan.", - "logout": "Uitloggen", - "areYouSureYouWantToLogOut": "Weet u zeker dat u wilt uitloggen?", - "youWillNeedToLogInAgain": "U moet opnieuw inloggen om toegang te krijgen tot uw account." - }, - "errors": { - "pageNotFound": "Oeps! Pagina niet gevonden!", - "pageNotFoundDesc": "Het lijkt erop dat de pagina die u zoekt niet bestaat of is verwijderd.", - "somethingWentWrong": "Oeps! Er is iets fout gegaan :')", - "somethingWentWrongDesc": "Onze excuses voor het ongemak. Probeer het later opnieuw.", - "internalServerError": "Interne Serverfout!", - "contentNotModified": "Inhoud niet gewijzigd!", - "networkError": "Netwerkfout", - "networkErrorDesc": "Kan geen verbinding maken met de server. Controleer uw internetverbinding en probeer het opnieuw.", - "forbidden": "Verboden", - "forbiddenTitle": "Toegang Verboden", - "forbiddenDesc": "U heeft niet de benodigde toestemming om deze bron te bekijken.", - "unauthorized": "Ongeautoriseerd", - "unauthorizedTitle": "Ongeautoriseerde Toegang", - "unauthorizedDesc": "Log in met de juiste inloggegevens om deze bron te benaderen.", - "maintenance": "Onderhoud", - "maintenanceTitle": "Website is in onderhoud!", - "maintenanceDesc": "De site is momenteel niet beschikbaar. We zijn snel weer online.", - "learnMore": "Lees meer" - }, - "dashboard": { - "title": "Dashboard", - "mailAccounts": "Mailaccounts", - "connected": "Verbonden", - "totalEmails": "Totaal aantal e-mails", - "syncedLocally": "Lokaal gesynchroniseerd", - "totalEmailSize": "Totale e-mailgrootte", - "logicalVolume": "Oorspronkelijke grootte", - "localDataFiles": "Lokale Gegevensbestanden", - "actualDiskUsage": "Feitelijk schijfgebruik", - "efficiency": "Opslagefficiëntie", - "saved": "Bespaard", - "dataStorage": "Gegevensopslag", - "indexSize": "Indexgrootte", - "metadataSize": "Metadata grootte", - "tantivyDatabase": "Gebaseerd op de zoekmachine Tantivy", - "dayTrend": "30-Dagen Trend", - "attachments": "Bijlagen", - "topLists": "Toplijsten", - "newEmails": "Nieuwe e-mails", - "messageDistribution": "Berichtdistributie", - "attachmentRatio": "Bijlageverhouding", - "attachmentRatioDesc": "{{percent}}% van de e-mails heeft bijlagen", - "noEmailsSynced": "Nog geen e-mails gesynchroniseerd", - "withAttachments": "Met Bijlagen", - "noAttachments": "Geen Bijlagen", - "top10Senders": "Top 10 Afzenders", - "byMessageCount": "Op berichtenaantal", - "sender": "Afzender", - "count": "Aantal", - "top10LargestEmails": "Top 10 Grootste e-mails", - "byMessageSize": "Op berichtgrootte", - "subject": "Onderwerp", - "size": "Grootte", - "noSubject": "(Geen Onderwerp)", - "top10Accounts": "Top 10 Accounts", - "emails": "E-mails", - "account": "Account", - "noRecentActivity": "Geen recente activiteit", - "noSendersData": "Geen afzendersgegevens", - "noLargeEmails": "Geen grote e-mails", - "noAccountData": "Geen accountgegevens", - "systemVersion": "Systeemversie" - }, - "accounts": { - "beforeRelativeValue": "Download e-mails van {{value}} {{unit}} geleden", - "sinceRelativeValue": "Download e-mails van de laatste", - "downloadBatchSize": "Download batchgrootte", - "downloadBatchSizeDescription": "Aantal berichten opgehaald per IMAP-verzoek", - "downloadScopeDescription": "Kies welke e-mails moeten worden geïndexeerd en gedownload.", - "downloadScope": "Downloadstrategie", - "selectMode": "Selecteer filtermodus", - "downloadAll": "Download alle e-mails", - "sinceFixed": "Sinds een specifieke datum", - "sinceRelative": "Download alleen recente e-mails", - "beforeRelative": "Download alleen oude e-mails", - "duration": "Duur", - "unit": "Eenheid", - "accessControl": "Toegangsbeheer", - "owner": "Maker", - "access_control": { - "title": "Toewijzing accounttoegang", - "description": "Rollen en geautoriseerde gebruikers toewijzen aan {{email}}", - "role_label": "Toegangsrol", - "role_placeholder": "Selecteer een rol", - "role_loading": "Rollen laden...", - "user_label": "Geautoriseerde gebruikers selecteren", - "user_search_placeholder": "Zoek op gebruikersnaam of e-mail...", - "user_empty": "Geen gebruikers gevonden", - "user_selected_count": "Geselecteerd: {{count}} gebruiker(s)", - "buttons": { - "cancel": "Annuleren", - "save": "Toewijzing opslaan" - }, - "validation": { - "user_required": "Selecteer ten minste één gebruiker", - "role_required": "Selecteer een rol om toe te wijzen" - }, - "toast": { - "success_title": "Toewijzing geslaagd", - "success_desc": "Machtigingen zijn succesvol toegewezen aan {{email}}", - "failed_title": "Toewijzing mislukt" - } - }, - "title": "E-mailaccounts", - "description": "Beheer en configureer uw e-mailaccounts.", - "addImap": "IMAP Toevoegen", - "addNoSync": "NoSync Toevoegen", - "moreAccountTypes": "Meer accounttypes", - "noAccountConfigurations": "Geen Accountconfiguraties", - "noAccountConfigurationsDesc": "U heeft nog geen Accountconfiguraties toegevoegd. Voeg er een toe om de Accountfuncties te gebruiken.", - "addConfiguration": "Configuratie Toevoegen", - "useNoProxy": "Geen proxy", - "login_name": "Inlognaam", - "name": "Naam", - "email": "E-mail", + "folders": "mailboxen" + }, + "empty": { + "no_active_download": "Geen actieve download", + "no_errors_current": "Geen fouten in huidige sessie", + "no_errors_session": "Geen fouten in deze sessie", + "no_global_errors": "Geen globale fouten", + "no_history": "Geen geschiedenis beschikbaar" + }, + "folders": "mailboxen", + "latest": "RECENT", + "loading": { + "fetching_account_state": "Accountstatus ophalen..." + }, + "message": "Bericht", + "session": { + "started_at": "Starttijd", "status": "Status", - "type": "Type", - "lastSync": "Laatste Sync", - "actions": "Acties", - "edit": "Bewerken", - "delete": "Verwijderen", - "detail": "Detail", - "selectMailboxes": "Mailboxen kiezen", - "oauth2Tokens": "OAuth2 Tokens", - "id": "ID", - "enabled": "Ingeschakeld", - "auth": "Authenticatie", - "incSync": "Inc Sync", - "state": "Status", - "createdAt": "Aangemaakt Op", - "updatedAt": "Bijgewerkt Op", - "openMenu": "Menu openen", - "emailAccountRegistration": "E-mailaccount Registratie", - "emailAccountRegistrationDesc": "Voer uw e-mailadres in. In de volgende stappen configureert u de IMAP-gegevens. We gebruiken dit adres om automatisch de IMAP-serverinstellingen te detecteren.", - "emailAddress": "E-mailadres", - "emailPlaceholder": "bv. john.doe@voorbeeld.com", - "namePlaceholder": "bv. john.doe", - "optional": "Optioneel", - "nameDescription": "IMAP-gebruikersnaam. Standaard je e-mail, of kies een andere.", - "emailCannotBeModified": "Het e-mailadres van het account kan niet worden gewijzigd tijdens het bewerken.", - "addAccount": "Account Toevoegen", - "updateAccount": "Account Bijwerken", - "accountUpdated": "Account Bijgewerkt", - "accountCreated": "Account Aangemaakt", - "accountUpdatedDesc": "Uw account is succesvol bijgewerkt.", - "accountCreatedDesc": "Uw account is succesvol aangemaakt.", - "accountUpdateFailed": "Account Bijwerken Mislukt", - "accountCreationFailed": "Account Aanmaken Mislukt", - "updateFailed": "Bijwerken mislukt, probeer het later opnieuw", - "creationFailed": "Aanmaken mislukt, probeer het later opnieuw", - "allMailFolderSelected": "Let Op: 'Alle Mail' Map Geselecteerd", - "accountSyncFoldersUpdated": "Account Sync Mappen Bijgewerkt", - "accountSyncFoldersUpdateFailed": "Account Sync Mappen Bijwerken Mislukt", - "serverConfiguration": "Serverconfiguratie (IMAP)", - "selectedMailboxes": "Geselecteerde mailboxen", - "allMailFolderSelectedDesc": "Het selecteren van mappen met het 'Alle Mail'-kenmerk zal waarschijnlijk leiden tot dubbele berichten die al zijn gesynchroniseerd vanuit mappen zoals Postvak In en Verzonden. Dit kan aanzienlijk meer opslagruimte in beslag nemen.", - "allMailSkipped": "Standaardmappen geselecteerd. 'Alle Mail' is overgeslagen om duplicaten te voorkomen.", - "selectAtLeastOneFolder": "Selecteer alstublieft ten minste één map", - "chooseMailboxesToDownload": "Kies mailboxen om te downloaden voor {{email}}. Nieuw toegevoegde mailboxen worden in de volgende cyclus gedownload.", - "accountDetails": "Accountdetails", - "capabilities": "Mogelijkheden", - "folderLimit": "Mappenlimiet", - "everyMinutes": "elke {{minutes}} minuten", - "foldersConfiguredForSync": "{{count}} map(pen) geconfigureerd voor sync", - "foldersSelected": "{{count}} map(pen) geselecteerd", - "imapHost": "IMAP Host", - "imapHostPlaceholder": "bv. imap.voorbeeld.com", - "imapPort": "IMAP Poort", - "imapPortPlaceholder": "bv. 993", - "imapEncryption": "IMAP Versleuteling", - "selectEncryptionMethod": "Selecteer een versleutelingsmethode", - "chooseEncryptionMethod": "Kies de versleutelingsmethode voor IMAP.", - "imapAuthMethod": "IMAP Autorisatiemethode", - "selectAuthMethod": "Selecteer een authenticatiemethode", - "chooseAuthMethod": "Kies de authenticatiemethode voor IMAP.", - "imapPassword": "IMAP Wachtwoord", - "leaveEmptyToKeepPassword": "Laat leeg om huidig wachtwoord te behouden", - "enterPassword": "Voer uw wachtwoord in", - "leaveEmptyToKeepExisting": "Laat leeg om het bestaande wachtwoord te behouden, of voer een nieuw wachtwoord in om het bij te werken.", - "useProxy": "Gebruik Proxy", - "selectProxy": "Selecteer een proxy", - "downloadInterval": "Download-interval (minuten)", - "downloadIntervalPlaceholder": "Voer minuten in", - "enabledDescription": "Bepaalt of dit account actief is. Indien uitgeschakeld, zullen gerelateerde downloads niet worden uitgevoerd.", - "dateSince": "Datum Sinds", - "none": "Geen", - "fixed": "Vast", - "relative": "Relatief", - "selectDate": "Selecteer een datum", - "selectUnit": "Selecteer een eenheid", - "days": "Dagen", - "months": "Maanden", - "years": "Jaren", - "enterValue": "Voer een waarde in", - "mustBeAtLeast1": "Moet ten minste 1 zijn", - "dateSelection": "Datumselectie", - "since": "sinds", - "recent": "recent", - "notAvailable": "n.v.t.", - "host": "host", - "port": "poort", - "encryption": "versleuteling", - "authType": "authenticatie_type", - "password": "wachtwoord", - "useProxyField": "gebruik proxy", - "clickSaveWhenDone": "Klik op opslaan als u klaar bent.", - "step": "Stap {{index}}", - "goBack": "Terug Gaan", - "autoConfiguring": "Automatisch configureren...", - "continue": "Doorgaan", - "saveChanges": "Wijzigingen opslaan", - "submit": "Verzenden", - "field": "Veld", - "value": "Waarde", - "refreshToken": "Vernieuwingstoken (Refresh Token)", - "accessTokenCopiedToClipboard": "Toegangstoken naar klembord gekopieerd", - "refreshTokenCopiedToClipboard": "Vernieuwingstoken naar klembord gekopieerd", - "noOAuth2Tokens": "Geen OAuth2 Tokens", - "theAccountHasNotCompletedTheAuthorizationProcess": "Het account heeft het autorisatieproces nog niet voltooid. Gelieve ", - "clickHere": "klik hier", - "toAuthorizeTheAccount": " om het account te autoriseren.", - "detailsOfTheOAuth2TokensForTheAccount": "Details van de OAuth2-tokens voor het account.", - "updateTheEmailAccountHere": "Werk het e-mailaccount hier bij. ", - "addNewEmailAccountHere": "Voeg hier een nieuw e-mailaccount toe. ", - "thisAccountIsUsedForIdentificationPurposesOnly": "Dit account wordt alleen gebruikt voor identificatiedoeleinden en vereist geen synchronisatie met een e-mailserver. Het helpt bij het importeren van e-mailgegevens.", - "determinesWhetherThisAccountIsActiveNoSync": "Bepaalt of dit account actief is. Als het is uitgeschakeld, kan er geen data worden geïmporteerd.", - "folderSync": { - "noData": "Geen Gegevens", - "noFolders": "Geen mappen om te synchroniseren", - "batches": "batches", - "autoSelectDescendants": "Automatisch onderliggende items selecteren", - "autoSelectParents": "Automatisch bovenliggende items selecteren", - "expandAll": "Alles uitklappen", - "collapseAll": "Alles inklappen", - "loadingMailboxFolders": "Postvakken laden…" - }, - "viewDetails": "details bekijken", - "runningState": { - "message": "Bericht", - "account": { - "id": "Account-ID" - }, - "tabs": { - "active_session": "Actieve sessie", - "history": "Geschiedenis", - "global_errors": "Globale fouten", - "folders": "Mailboxen", - "errors": "Fouten" - }, - "loading": { - "fetching_account_state": "Accountstatus ophalen..." - }, - "empty": { - "no_active_download": "Geen actieve download", - "no_errors_current": "Geen fouten in huidige sessie", - "no_errors_session": "Geen fouten in deze sessie", - "no_global_errors": "Geen globale fouten", - "no_history": "Geen geschiedenis beschikbaar" - }, - "session": { - "status": "Status", - "trigger": "Trigger", - "started_at": "Starttijd" - }, - "common": { - "folders": "mailboxen", - "close": "Sluiten" - }, - "latest": "RECENT", - "folders": "mailboxen" - }, - "steps": { - "complete": "Voltooid", - "emailAddress": "E-mailadres", - "imap": "IMAP", - "syncPreferences": "Sync Voorkeuren", - "summary": "Samenvatting" - }, - "imapProxy": "Gebruik een SOCKS5-proxy voor IMAP-verbindingen.", - "syncStartDateDescription": "Definieert de startdatum van de synchronisatie – ofwel vast, ofwel relatief ten opzichte van nu. E-mails van vóór deze datum worden uitgesloten, {{fixedPart}}.", - "syncAfterDate": "synchroniseert gegevens na een ingestelde datum", - "syncRecentData": "verschuift de sync-datum in de tijd, synchroniseert alleen recente gegevens", - "folderLimitDescription": "Beperk het aantal te synchroniseren e-mails per map (minimaal 100). Laat leeg voor geen limiet.", - "folderLimitPlaceholder": "bv. 1000", - "imap": "IMAP", - "minutes": "minuten", - "accountHasBeenSuccessfully": "Account is succesvol {{action}}", - "enableAccount": "Account inschakelen", - "disableAccount": "Account uitschakelen", - "areYouSureYouWantTo": "Weet je zeker dat je dit account wilt {{action}}?", - "enable": "Inschakelen", - "disable": "Uitschakelen", - "thisWillPreventTheAccountFromBeingUsed": "Dit account zal geen gegevens meer synchroniseren van de IMAP-server, maar bestaande gegevens blijven toegankelijk.", - "disabled": "Uitgeschakeld", - "useDangerous": "Vertrouw elk TLS‑certificaat", - "useDangerousDescription": "Schakel deze optie alleen in als je verbinding maakt met een IMAP‑server die een openbaar CA‑ of een self‑signed certificaat gebruikt dat door je systeem mogelijk niet wordt vertrouwd. Deze instelling omzeilt standaard certificaatverificatie en kan je blootstellen aan man‑in‑the‑middle‑aanvallen — activeer alleen als je de risico’s begrijpt." + "trigger": "Trigger" + }, + "tabs": { + "active_session": "Actieve sessie", + "errors": "Fouten", + "folders": "Mailboxen", + "global_errors": "Globale fouten", + "history": "Geschiedenis" + } }, - "mailbox": { - "deleteMailboxDialog": { - "title": "Postvakmap verwijderen", - "desc": "Weet u zeker dat u deze postvakmap wilt verwijderen? Deze actie kan niet ongedaan worden gemaakt.", - "warningTitle": "Waarschuwing", - "warningDesc": "Het verwijderen van deze map zal ook permanent alle gearchiveerde e-mails und submappen erin verwijderen.", - "confirm": "Permanent verwijderen", - "successTitle": "Succesvol verwijderd", - "successDesc": "De postvakmap en de inhoud ervan zijn succesvol verwijderd.", - "errorTitle": "Verwijderen mislukt" - }, - "title": "Postvak In", - "folders": "Mappen", - "messages": "Berichten", - "noMessages": "Geen berichten", - "selectFolder": "Selecteer een map om berichten te bekijken", - "deleteDialog": { - "title": "E-mail Verwijderen", - "desc": "Weet u zeker dat u {{countText}} wilt verwijderen? Deze actie verwijdert de geselecteerde e-mail(s) uit de lokale database. De e-mail(s) worden permanent verwijderd en kunnen niet worden hersteld.", - "descCountSingle": "deze e-mail", - "descCountMultiple": "deze {{count}} e-mails", - "warningTitle": "Waarschuwing!", - "warningDesc": "Wees voorzichtig voordat u verder gaat.", - "confirm": "Verwijderen", - "successTitle": "Berichten succesvol verwijderd", - "successDesc": "De berichten zijn verwijderd.", - "errorTitle": "Verwijderen van berichten mislukt" - }, - "thread": { - "title": "Draad ({{count}} {{messageLabel}})", - "message": "bericht", - "messages": "berichten", - "noSubject": "(Geen onderwerp)", - "invalidDate": "Ongeldige Datum", - "empty": "Geen berichten in deze draad.", - "loadError": "Laden van draad mislukt", - "loadingMore": "Meer laden...", - "loadMore": "Meer laden" - }, - "bulkActions": { - "ariaLabel": "Bulkacties voor {{count}} geselecteerde {{emailLabel}}", - "email": "e-mail", - "emails": "e-mails", - "selected": "geselecteerd", - "clearSelection": "Selectie wissen", - "clearSelectionWithKey": "Selectie wissen ({{key}})", - "delete": "Verwijderen", - "deleteTooltip": "Geselecteerde e-mails verwijderen" - } + "saveChanges": "Wijzigingen opslaan", + "selectAtLeastOneFolder": "Selecteer alstublieft ten minste één map", + "selectAuthMethod": "Selecteer een authenticatiemethode", + "selectDate": "Selecteer een datum", + "selectEncryptionMethod": "Selecteer een versleutelingsmethode", + "selectMailboxes": "Mailboxen kiezen", + "selectMode": "Selecteer filtermodus", + "selectProxy": "Selecteer een proxy", + "selectUnit": "Selecteer een eenheid", + "selectedMailboxes": "Geselecteerde mailboxen", + "serverConfiguration": "Serverconfiguratie (IMAP)", + "since": "sinds", + "sinceFixed": "Sinds een specifieke datum", + "sinceRelative": "Download alleen recente e-mails", + "sinceRelativeValue": "Download e-mails van de laatste", + "state": "Status", + "status": "Status", + "step": "Stap {{index}}", + "steps": { + "complete": "Voltooid", + "emailAddress": "E-mailadres", + "imap": "IMAP", + "summary": "Samenvatting", + "syncPreferences": "Sync Voorkeuren" }, - "search": { - "size": "Grootte", - "any": "Alle", - "tiny": "Zeer klein (<15 KB)", - "small": "Klein (<2 MB)", - "medium": "Middelgroot (2 - 10 MB)", - "large": "Groot (10 - 20 MB)", - "huge": "Zeer groot (≥20 MB)", - "sort": "Sorteren", - "sizeDescription": "De grootte verwijst naar de totale e-mailgrootte, inclusief bijlagen.", - "title": "Zoeken", - "searching": "Bezig met zoeken, even geduld alstublieft…", - "noEmailsFound": "Geen e-mails gevonden", - "startSearching": "Begin met het invoeren van een trefwoord, afzender of gebruik geavanceerde filters.", - "adjustSearch": "Probeer uw zoekcriteria aan te passen of de filters te wissen.", - "tagFilter": "Tag Filter", - "from": "Van", - "to": "Aan", - "subject": "Onderwerp", - "date": "Datum", - "editTag": "Tag Bewerken", - "keyword": "Trefwoord", - "sender": "Afzender", - "recipient": "Ontvanger", - "hasAttachment": "Heeft Bijlage", - "yes": "Ja", - "no": "Nee", - "dateRange": "Datumbereik", - "startDate": "Startdatum", - "endDate": "Einddatum", - "advancedFilters": "Geavanceerde Filters", - "searchArchivedEmails": "Gearchiveerde E-mails Zoeken", - "fullTextMultiAccount": "Volledige tekst · Multi-account · Geavanceerde filters", - "account": "Account", - "mailbox": "Postvak In", - "selectAccount": "Selecteer account", - "selectMailbox": "Selecteer mailbox", - "noActiveEmailAccount": "Geen actief e-mailaccount.", - "addEmailAccount": "E-mailaccount Toevoegen", - "noMailboxSelectAccount": "Geen mailbox. Selecteer eerst een account.", - "searchInSubjectBody": "Zoek in onderwerp, tekst, bijlagen...", - "searchingButton": "Bezig met zoeken...", - "searchButton": "Zoeken", - "advanced": "Geavanceerd", - "clear": "Wissen", - "since": "Sinds:", - "before": "Voor:", - "selectDate": "Selecteer een datum", - "pleaseSelectAtLeastOne": "Selecteer ten minste één zoekcriterium", - "cc": "CC", - "bcc": "BCC", - "attachmentName": "Naam Bijlage", - "messageId": "Bericht ID", - "minSize": "Min Grootte", - "maxSize": "Max Grootte", - "senderRecipients": "Afzender / Ontvangers", - "attachmentsSize": "Bijlagen & Grootte", - "minimumBytes": "Minimum (Bytes)", - "maximumBytes": "Maximum (Bytes)", - "originalMessageIdHeader": "Oorspronkelijke e-mail Message-ID header", - "addTags": { - "title": "Tags Bewerken", - "none": "Nog geen tags toegevoegd", - "searchPlaceholder": "Zoek of maak tag...", - "createHint": "Nieuwe tag aanmaken: {{tag}}", - "invalidTitle": "Ongeldige Tag", - "updatedTitle": "Tags Bijgewerkt", - "updatedDesc": "Tags zijn succesvol bijgewerkt", - "updateFailedTitle": "Bijwerken Mislukt", - "tryAgain": "Probeer het later opnieuw", - "selectedCount": "{{count}} tags geselecteerd", - "cancel": "Annuleren", - "save": "Opslaan", - "saving": "Bezig met opslaan..." - }, - "updateTags": { - "overwriteWarning": "Waarschuwing: dit overschrijft alle bestaande tags op de geselecteerde items.", - "title": "Tags bijwerken", - "none": "Geen tags geselecteerd", - "searchPlaceholder": "Zoek of maak nieuwe tag...", - "createHint": "Druk op Enter om nieuwe tag te maken: \"{{tag}}\"", - "selectedCount": "{{count}} tag(s) worden toegepast", - "cancel": "Annuleren", - "invalidTitle": "Ongeldige tag", - "updatedTitle": "Tags bijgewerkt", - "updatedDesc": "Tags zijn succesvol bijgewerkt.", - "updateFailedTitle": "Bijwerken mislukt", - "tryAgain": "Probeer het later opnieuw.", - "actionAdd": "Toevoegen", - "actionRemove": "Verwijderen", - "actionOverwrite": "Overschrijven", - "submitAdd": "Tags toevoegen", - "submitRemove": "Tags verwijderen", - "submitOverwrite": "Tags overschrijven", - "savingAdd": "Toevoegen...", - "savingRemove": "Verwijderen...", - "savingOverwrite": "Overschrijven..." - }, - "thread": { - "title": "Draad · {{count}} berichten", - "error": "Laden van draad mislukt", - "empty": "Geen berichten in deze draad", - "invalidDate": "Ongeldige datum", - "noSubject": "(Geen onderwerp)", - "loadingMore": "Laden...", - "loadMore": "Meer laden" - }, - "bulkActions": { - "ariaLabel": "{{count}} berichten geselecteerd. Actiebalk", - "delete": "Verwijderen", - "deleteDesc": "Geselecteerde berichten verwijderen", - "selected": "{{count}} geselecteerd", - "clear": "Selectie wissen", - "manageTags": "Tags beheren" - }, - "delete": { - "title": "Berichten verwijderen", - "confirmPrefix": "Weet u zeker dat u", - "countLabel": "{{count}} bericht(en) wilt verwijderen?", - "confirmDetail": "Dit kan niet ongedaan worden gemaakt.", - "confirmButton": "Verwijderen", - "warningTitle": "Waarschuwing", - "warningDesc": "Berichten worden definitief verwijderd.", - "successTitle": "Verwijderd", - "successDesc": "Berichten succesvol verwijderd.", - "errorTitle": "Verwijderen mislukt" - } + "submit": "Verzenden", + "syncAfterDate": "synchroniseert gegevens na een ingestelde datum", + "syncRecentData": "verschuift de sync-datum in de tijd, synchroniseert alleen recente gegevens", + "syncStartDateDescription": "Definieert de startdatum van de synchronisatie – ofwel vast, ofwel relatief ten opzichte van nu. E-mails van vóór deze datum worden uitgesloten, {{fixedPart}}.", + "theAccountHasNotCompletedTheAuthorizationProcess": "Het account heeft het autorisatieproces nog niet voltooid. Gelieve ", + "thisAccountIsUsedForIdentificationPurposesOnly": "Dit account wordt alleen gebruikt voor identificatiedoeleinden en vereist geen synchronisatie met een e-mailserver. Het helpt bij het importeren van e-mailgegevens.", + "thisWillPreventTheAccountFromBeingUsed": "Dit account zal geen gegevens meer synchroniseren van de IMAP-server, maar bestaande gegevens blijven toegankelijk.", + "title": "E-mailaccounts", + "toAuthorizeTheAccount": " om het account te autoriseren.", + "type": "Type", + "unit": "Eenheid", + "updateAccount": "Account Bijwerken", + "updateFailed": "Bijwerken mislukt, probeer het later opnieuw", + "updateTheEmailAccountHere": "Werk het e-mailaccount hier bij. ", + "updatedAt": "Bijgewerkt Op", + "useDangerous": "Vertrouw elk TLS‑certificaat", + "useDangerousDescription": "Schakel deze optie alleen in als je verbinding maakt met een IMAP‑server die een openbaar CA‑ of een self‑signed certificaat gebruikt dat door je systeem mogelijk niet wordt vertrouwd. Deze instelling omzeilt standaard certificaatverificatie en kan je blootstellen aan man‑in‑the‑middle‑aanvallen — activeer alleen als je de risico’s begrijpt.", + "useNoProxy": "Geen proxy", + "useProxy": "Gebruik Proxy", + "useProxyField": "gebruik proxy", + "value": "Waarde", + "viewDetails": "details bekijken", + "years": "Jaren" + }, + "apiDocs": { + "choosePreferredType": "Kies uw voorkeurstype API-documentatie", + "downloadSpecYAML": "Download Spec YAML", + "openAPIExplorer": "OpenAPI Explorer", + "reDoc": "ReDoc", + "scalar": "Scalar", + "swaggerUI": "Swagger UI" + }, + "apiTokens": { + "deleteDialog": { + "cancel": "Annuleren", + "confirm": "Verwijderen", + "deleting": "Verwijderen...", + "description": "Deze actie kan niet ongedaan worden gemaakt. Elke applicatie die dit token gebruikt, verliest onmiddellijk de toegang.", + "title": "Toegangstoken verwijderen?" }, - "mail": { - "emailViewer": "E-mailviewer", - "noMessageSelected": "Geen bericht geselecteerd", - "account": "Account", - "from": "Van", - "to": "Aan", - "subject": "Onderwerp", - "date": "Datum", - "tags": "Tags", - "noTagsYet": "Nog geen tags", - "id": "ID", - "cc": "CC", - "bcc": "BCC", - "attachments": "Bijlagen", - "download": "Downloaden", - "delete": "Verwijderen", - "viewThread": "Draad Bekijken", - "downloadStarted": "Download gestart", - "downloadComplete": "Download voltooid", - "downloadFailed": "Download mislukt", - "failedToDownloadFile": "Downloaden van bestand mislukt", - "failedToLoadEmail": "Laden van e-mailbericht mislukt.", - "isBeingDownloaded": "{{id}} wordt gedownload", - "downloaded": "{{id}} gedownload", - "showLess": "toon minder", - "showMore": "toon meer...", - "onlyNonInlineAttachments": "Alleen niet-inline bijlagen worden hier getoond.", - "noAttachments": "Geen bijlagen" + "dialog": { + "createTitle": "Toegangstoken aanmaken", + "description": "Klik op opslaan als u klaar bent.", + "editTitle": "Toegangstoken bewerken", + "save": "Opslaan", + "saveChanges": "Wijzigingen opslaan" }, - "oauth2": { - "title": "OAuth2", - "addConfiguration": "Configuratie Toevoegen", - "id": "ID", - "provider": "Aanbieder", - "clientId": "Client ID", - "clientSecret": "Client Secret", - "redirectUri": "Redirect URI", - "scopes": "Scopes", - "status": "Status", - "enabled": "Ingeschakeld", - "disabled": "Uitgeschakeld", - "edit": "Bewerken", - "delete": "Verwijderen", - "enable": "Inschakelen", - "disable": "Uitschakelen", - "noConfigurations": "Geen OAuth2 Configuraties", - "noConfigurationsDesc": "U heeft nog geen OAuth2-configuraties toegevoegd. Voeg er een toe om de OAuth2-functies te gebruiken.", - "description": "Automatisch afhandelen van het ophalen, opslaan en vernieuwen van toegangstokens, wat zorgt voor een naadloze en altijd-ready authenticatie-ervaring.", - "addNew": "Nieuwe Toevoegen", - "updateHere": "Hier bijwerken.", - "createNewHere": "Hier een nieuwe aanmaken.", - "clickSaveWhenDone": "Klik op opslaan als u klaar bent.", - "quickPresets": "Snelle voorinstellingen:", - "gmail": "Gmail", - "outlook": "Outlook", - "whenDisabled": "Indien uitgeschakeld: - Nieuwe autorisatiestromen worden onmiddellijk geweigerd - Bestaande toegangs- en vernieuwingstokens worden binnen 1 minuut ingetrokken - Gebruikers moeten opnieuw autoriseren wanneer het opnieuw wordt ingeschakeld", - "clientIdLabel": "Client Id:", - "enterYourClientId": "Voer uw client ID in", - "theUniqueIdentifierForYourApplication": "De unieke identificatie voor uw applicatie, verstrekt door de OAuth-aanbieder.", - "clientSecretLabel": "Client Secret:", - "leaveEmptyToKeepExistingSecret": "Laat leeg om bestaand geheim te behouden", - "enterYourClientSecret": "Voer uw client secret in", - "leaveEmptyToKeepTheExistingSecret": "Laat leeg om het bestaande geheim te behouden. Voer alleen een nieuwe waarde in als u deze wilt wijzigen.", - "aSecretKeyProvidedByTheOAuthProvider": "Een geheime sleutel verstrekt door de OAuth-aanbieder om uw applicatie te authenticeren.", - "authUrlLabel": "Auth Url:", - "enterTheAuthorizationUrl": "Voer de autorisatie-URL in", - "theUrlWhereUsersWillBeRedirected": "De URL waar gebruikers naartoe worden geleid om uw applicatie te autoriseren.", - "tokenUrlLabel": "Token Url:", - "enterTheTokenUrl": "Voer de token-URL in", - "theUrlUsedToExchange": "De URL die wordt gebruikt om de autorisatiecode in te ruilen voor een toegangstoken.", - "redirectUrlLabel": "Redirect Url:", - "enterYourRedirectUrl": "Voer uw redirect-URL in", - "theRedirectUrlAfterAuthorization": "De redirect-URL na autorisatie. Deze moet overeenkomen met de URL die is geregistreerd bij de OAuth-aanbieder. Gebruik het formaat http://[host]:[poort]/oauth2/callback (of https://), waarbij [host] en [poort] overeenkomen met uw RustMailer-implementatie. Het pad /oauth2/callback is vast.", - "scope": "Scope:", - "enterTheScopeHere": "Voer de scope hier in.", - "addScope": "Scope Toevoegen", - "key": "Sleutel:", - "enterTheKeyHere": "Voer de sleutel hier in.", - "value": "Waarde:", - "enterTheValueHere": "Voer de waarde hier in.", - "addExtraParams": "Extra Parameters Toevoegen", - "useProxyOptional": "Gebruik Proxy (optioneel):", - "selectAProxy": "Selecteer een proxy", - "noProxyAvailable": "Geen proxy beschikbaar", - "useSocks5ProxyForOAuthRequests": "Gebruik SOCKS5-proxy voor OAuth-verzoeken wanneer directe toegang is geblokkeerd.", - "descriptionLabel": "Beschrijving:", - "describeThePurposeOfTheOauth2Application": "Beschrijf het doel van de OAuth2-applicatie", - "optional": "Optioneel", - "saving": "Bezig met opslaan...", - "creating": "Bezig met aanmaken...", - "saveChanges": "Wijzigingen opslaan", - "save": "Opslaan", - "updated": "Bijgewerkt", - "created": "Aangemaakt", - "yourOAuth2ApplicationHasBeenSuccessfully": "Uw OAuth2-applicatie is succesvol {{action}}.", - "updateFailed": "Bijwerken Mislukt", - "creationFailed": "Aanmaken Mislukt", - "updateOrCreationFailed": "{{action}} mislukt, probeer het later opnieuw", - "clientSecretIsRequired": "Client Secret is vereist", - "clientSecretCannotBeEmpty": "Client Secret mag niet leeg zijn", - "keyIsRequired": "Sleutel is vereist", - "keyCannotBeEmpty": "Sleutel mag niet leeg zijn", - "valueIsRequired": "Waarde is vereist", - "valueCannotBeEmpty": "Waarde mag niet leeg zijn", - "descriptionMustNotExceed255Characters": "Beschrijving mag niet langer zijn dan 255 tekens.", - "clientIdIsRequired": "Client ID is vereist", - "clientIdCannotBeEmpty": "Client ID mag niet leeg zijn", - "authorizationUrlIsRequired": "Autorisatie-URL is vereist", - "authorizationUrlCannotBeEmpty": "Autorisatie-URL mag niet leeg zijn", - "invalidAuthorizationUrlFormat": "Ongeldig Autoristatie-URL formaat", - "tokenUrlIsRequired": "Token URL is vereist", - "tokenUrlCannotBeEmpty": "Token URL mag niet leeg zijn", - "invalidTokenUrlFormat": "Ongeldig Token URL formaat", - "redirectUriIsRequired": "Redirect URI is vereist", - "redirectUriCannotBeEmpty": "Redirect URI mag niet leeg zijn", - "invalidRedirectUriFormat": "Ongeldig Redirect URI formaat", - "authorizeEmailAccount": "E-mailaccount Autoriseren", - "authorizeAnEmailAccountToStartTheOAuth2AuthorizationProcess": "Autoriseer een e-mailaccount om het OAuth2-autorisatieproces te starten.", - "loadingAccounts": "Accounts laden...", - "selectAnAccount": "Selecteer een account", - "noEmailAccountsRegistered": "Geen e-mailaccounts geregistreerd. Gelieve er een aan te maken.", - "pleaseCreateOne": "Gelieve er een aan te maken.", - "createAccount": "Account Aanmaken", - "authorize": "Autoriseren", - "getAuthorizeUrlFailed": "Ophalen Autorisatie-URL Mislukt", - "getAuthorizeUrlFailedDesc": "Ophalen autorisatie-URL mislukt, probeer het later opnieuw", - "oauth2ClientUpdated": "OAuth2 client Bijgewerkt", - "oauth2ClientHasBeenSuccessfully": "OAuth2 client is succesvol {{action}}.", - "statusUpdateFailed": "Status bijwerken mislukt, probeer het later opnieuw", - "disableOAuth2Client": "OAuth2 Client Uitschakelen", - "enableOAuth2Client": "OAuth2 Client Inschakelen", - "areYouSureYouWantTo": "Weet u zeker dat u deze OAuth2 client wilt {{action}}?", - "thisWillPreventTheOAuth2ClientFromBeingUsed": "Dit voorkomt dat de OAuth2 client wordt gebruikt.", - "deleteToken": "Token Verwijderen", - "areYouSureYouWantToDelete": "Weet u zeker dat u wilt verwijderen", - "thisActionWillPermanentlyRemoveTheOauth2Record": "Deze actie zal de OAuth2-record permanent uit het systeem verwijderen. Dit kan niet ongedaan worden gemaakt.", - "enterIdToConfirmDeletion": "Voer ID in om verwijdering te bevestigen.", - "warning": "Waarschuwing!", - "pleaseBeCareful": "Wees voorzichtig, deze bewerking kan niet ongedaan worden gemaakt.", - "deleteSuccess": "Verwijderen Succesvol", - "yourOAuth2ApplicationHasBeenSuccessfullyDeleted": "Uw OAuth2-applicatie is succesvol verwijderd.", - "oauth2DeleteFailed": "OAuth2 Verwijderen Mislukt", - "deleteFailed": "Verwijderen mislukt, probeer het later opnieuw", - "actions": { - "openMenu": "Menu openen", - "edit": "Bewerken", - "authorize": "Autoriseren", - "delete": "Verwijderen" - }, - "authFailed": "OAuth2 Authenticatie Mislukt", - "error": "Fout", - "unknownError": "Er is een onbekende fout opgetreden.", - "tryAgain": "Probeer Opnieuw", - "goHome": "Naar Startpagina", - "authSuccess": "OAuth2 Authenticatie Succesvol", - "success": "Succes", - "successMessage": "Uw e-mailaccount is succesvol geauthenticeerd via OAuth2. De Toegangstoken is opgeslagen door het systeem en wordt automatisch bijgewerkt indien nodig.", - "goToAccounts": "Naar Accounts", - "authAtatus": "OAuth2 Authenticatiestatus", - "information": "Informatie", - "noStatus": "Deze pagina toont het resultaat van uw OAuth2-authenticatie. Momenteel is er geen specifieke status beschikbaar. Probeer het indien nodig opnieuw.", - "backToLogin": "Terug naar Inloggen" + "form": { + "1day": "1 dag", + "30days": "30 dagen", + "7days": "7 dagen", + "errorInt": "Moet een geheel getal zijn", + "errorMax": "Max 32 tekens", + "errorNumber": "Moet een getal zijn", + "errorPositive": "Moet groter zijn dan 0", + "expirationDescription": "Tokens verlopen automatisch na de geselecteerde tijd.", + "expirationLabel": "Vervaldatum", + "expirationPlaceholder": "Selecteer vervaldatum", + "nameDescription": "Optioneel · Max 32 tekens", + "nameLabel": "Naam", + "namePlaceholder": "Geef dit token een korte naam", + "never": "Nooit" }, - "accessTokens": { - "title": "Toegangstokens", - "name": "Naam", - "accounts": "Accounts", - "token": "Token", - "createdAt": "Aangemaakt Op", - "expiresAt": "Verloopt Op", - "edit": "Bewerken", - "delete": "Verwijderen", - "create": "Aanmaken", - "noTokens": "Geen Toegangstokens", - "noTokensDesc": "U heeft nog geen toegangstokens aangemaakt. Maak er een aan om de API-functies te gebruiken.", - "description": "Beheer hier uw toegangstokens, hun toegangscontroles, IP-whitelists en rate-limiting instellingen.", - "editToken": "Token Bewerken", - "addNew": "Nieuwe Toevoegen", - "updateTheAccessTokenHere": "Werk het toegangstoken hier bij.", - "createNewAccessTokenHere": "Maak hier een nieuw toegangstoken aan.", - "selectAccounts": "Selecteer accounts", - "selectMultipleAccountsForTheAccessToken": "Selecteer meerdere accounts voor de autorisatiebereik van het toegangstoken.", - "enterOneIpAddressPerLine": "Voer één IP-adres per regel in, bv.:\n192.168.1.1\n192.168.1.2", - "aListOfIpAddressesAllowed": "Een lijst van IP-adressen die toegang hebben tot de bron. Voer één IP-adres per regel in. (Optioneel)", - "enterQuota": "Voer quotum in, bv. 100", - "theMaximumNumberOfRequestsAllowed": "Het maximale aantal verzoeken dat binnen het interval is toegestaan. (Optioneel)", - "enterIntervalInSeconds": "Voer interval in seconden in, bv. 60", - "theTimeWindowForTheRateLimit": "Het tijdsvenster (in seconden) voor de rate limit. (Optioneel)", - "describeThePurposeOfTheAccessToken": "Beschrijf het doel van het toegangstoken", - "updating": "Bezig met bijwerken...", - "saving": "Bezig met opslaan...", - "creating": "Bezig met aanmaken...", - "saveChanges": "Wijzigingen opslaan", - "save": "Opslaan", - "updated": "Bijgewerkt", - "created": "Aangemaakt", - "yourAccessTokenHasBeenSuccessfully": "Uw toegangstoken is succesvol {{action}}.", - "updateFailed": "Bijwerken Mislukt", - "creationFailed": "Aanmaken Mislukt", - "updateOrCreationFailed": "{{action}} mislukt, probeer het later opnieuw", - "quotaMustBeAPositiveInteger": "Quotum moet een positief geheel getal zijn.", - "intervalMustBeAPositiveInteger": "Interval moet een positief geheel getal zijn.", - "invalidIpAddressesFound": "Ongeldige IP-adressen gevonden. Voer geldige IPv4- of IPv6-adressen in.", - "atLeastOneAccountIsRequired": "Ten minste één account is vereist.", - "descriptionMustNotExceed255Characters": "Beschrijving mag niet langer zijn dan 255 tekens.", - "notUsedYet": "Nog niet gebruikt", - "theListOfAccountsThatCanBeQueried": "De lijst met accounts die kunnen worden bevraagd met behulp van een toegangstoken.", - "accountId": "Account ID", - "filterByEmailAddressOrAccountId": "Filter op e-mailadres of account ID...", - "aclRulesForAccessTokens": "ACL-regels voor toegangstokens omvatten IP-whitelist verificatie en rate limit handhaving.", - "actions": { - "openMenu": "Menu openen", - "edit": "Bewerken", - "delete": "Verwijderen" - }, - "quota": "Quotum", - "interval": "Interval" + "list": { + "createdLabel": "Aangemaakt", + "deleteBtn": "Token verwijderen", + "expiresOnLabel": "Verloopt op", + "expiresOnShort": "Verloopt op {{date}}", + "lastUsedLabel": "Laatst gebruikt", + "neverExpires": "Verloopt nooit", + "neverLabel": "Nooit", + "neverUsed": "Nooit", + "statusActive": "Actief", + "statusExpired": "Verlopen", + "tokenLabel": "Token", + "unnamedToken": "Naamloos token" }, - "settings": { - "appearance": { - "title": "Uiterlijk", - "field": { - "language": "Interfacetaal", - "theme": "Interfacethema" - }, - "description": { - "language": "Selecteer de taal voor de webinterface.", - "theme": "Kies tussen de lichte of donkere modus voor de interface." - }, - "placeholder": { - "select_language": "Selecteer taal" - }, - "command": { - "search": "Taal zoeken...", - "no_results": "Geen taal gevonden." - }, - "theme": { - "light": "Licht", - "dark": "Donker" - }, - "button": { - "update": "Voorkeuren bijwerken" - }, - "validation": { - "language": { - "required": "Selecteer een taal." - }, - "theme": { - "required": "Selecteer een thema." - } - } - }, - "title": "Instellingen", - "general": "Algemeen", - "proxy": "Proxy", - "name": "Naam", - "host": "Host", - "port": "Poort", - "username": "Gebruikersnaam", - "password": "Wachtwoord", - "type": "Type", - "actions": "Acties", - "edit": "Bewerken", - "delete": "Verwijderen", - "add": "Toevoegen", - "noProxies": "Geen Proxy's", - "noProxiesDesc": "U heeft nog geen proxy-configuraties toegevoegd. Voeg er een toe om proxy-functies te gebruiken.", - "root": "Root", - "rootTitle": "Root", - "rootDesc": "Beheer root-toegangsgegevens, inclusief token en wachtwoord.", - "rootAccessManagement": "Root Toegangsbeheer", - "manageRootTokenAndPassword": "Beheer root-token en wachtwoord veilig.", - "resetRootToken": "Root Token Resetten", - "generateNewToken": "Genereer nieuw token, het oude verloopt onmiddellijk.", - "reset": "Resetten", - "resetRootPassword": "Root Wachtwoord Resetten", - "changePasswordForFutureLogins": "Wijzig wachtwoord voor toekomstige logins.", - "youAreAboutToResetTheRootToken": "U staat op het punt het root-token te resetten. Deze actie kan niet ongedaan worden gemaakt.", - "confirmReset": "Reset Bevestigen", - "youAreAboutToResetTheRootPassword": "U staat op het punt het root-wachtwoord te resetten. Zorg ervoor dat u het veilig opslaat.", - "enterNewRootPassword": "Voer nieuw root-wachtwoord in", - "theRootTokenHasBeenReset": "Het root-token is gereset", - "yourLoginInformationHasBeenUpdated": "Uw inloginformatie is bijgewerkt. U hoeft niet opnieuw in te loggen.", - "invalidPassword": "Ongeldig wachtwoord", - "rootPasswordMustBeAtLeast6Characters": "Het root-wachtwoord moet ten minste 6 tekens lang zijn.", - "theRootPasswordHasBeenReset": "Het root-wachtwoord is gereset", - "useNewPasswordForNextLogin": "Gebruik het nieuwe wachtwoord voor uw volgende login.", - "failedToCopyText": "Kopiëren van tekst mislukt", - "filterProxy": "Filter Proxy...", - "filterOauth2": "Filter OAuth2...", - "filterAccount": "Filter account...", - "filterAccessToken": "Filter toegangstoken...", - "selectAll": "Alles selecteren", - "theme": "Thema", - "id": "Id", - "url": "Url", - "createdAt": "Aangemaakt Op", - "updatedAt": "Bijgewerkt Op", - "enabled": "Ingeschakeld", - "useProxy": "Gebruik Proxy", - "authUrl": "Auth Url", - "tokenUrl": "Token Url", - "description": "Beschrijving", - "token": "Token", - "accounts": "Accounts", - "acl": "Acl", - "lastAccess": "Laatste Toegang", - "enterProxyIdToConfirmDeletion": "Voer Proxy Id in om verwijdering te bevestigen.", - "updateTheProxyHere": "Werk de Proxy hier bij. ", - "addNewProxyHere": "Voeg hier een nieuwe Proxy toe. ", - "pleaseUseAnIpAddressForBetterReliability": "Gebruik alstublieft een IP-adres (bv. 127.0.0.1) in plaats van een hostname of domein voor betere betrouwbaarheid.", - "adding": "Bezig met toevoegen...", - "yourProxyHasBeenSuccessfully": "Uw Proxy is succesvol {{action}}.", - "proxyUpdateOrAddFailed": "{{action}} mislukt, probeer het later opnieuw", - "sidebar": { - "profile": "Profiel", - "apiTokens": "API-tokens", - "proxy": "Netwerkproxy", - "configurations": "Systeemconfiguraties" - }, - "profile": { - "loadError": "Kan gebruikersinformatie niet laden.", - "uploadTitle": "Avatar uploaden", - "maxSize": "Maximaal {{size}}", - "avatarAlt": "Avatar", - "removeAvatar": "Avatar verwijderen", - "uploadError": "Fout bij uploaden van bestand", - "field": { - "username": "Gebruikersnaam", - "email": "E-mail", - "password": "Wachtwoord" - }, - "placeholder": { - "password_keep": "Laat leeg om het huidige wachtwoord te behouden" - }, - "button": { - "update_profile": "Profiel bijwerken", - "permissions": "Rechten", - "view_global_permissions": "Globale rechten bekijken" - }, - "section": { - "roles": "Rollen", - "accounts": "{{count}} gekoppelde accounts" - }, - "account": { - "id": "Account-ID: {{id}}" - }, - "toast": { - "updated": "Profiel succesvol bijgewerkt", - "update_failed": "Bijwerken van profiel mislukt" - }, - "validation": { - "username": { - "required": "Gebruikersnaam is verplicht", - "min": "Gebruikersnaam moet minimaal 5 tekens bevatten", - "max": "Gebruikersnaam mag maximaal 32 tekens bevatten" - }, - "email": { - "required": "E-mail is verplicht", - "invalid": "Voer een geldig e-mailadres in" - }, - "password": { - "min": "Wachtwoord moet minimaal 8 tekens bevatten", - "max": "Wachtwoord mag maximaal 256 tekens bevatten" - } - } - } + "notifications": { + "close": "Sluiten", + "copied": "Gekopieerd naar klembord", + "createFailed": "Aanmaken mislukt", + "createSuccess": "Toegangstoken aangemaakt", + "createSuccessDesc": "Het toegangstoken is succesvol aangemaakt.", + "deleteFailed": "Verwijderen mislukt", + "deleteSuccess": "Token verwijderd", + "genericError": "Bewerking mislukt. Probeer het opnieuw.", + "tryAgain": "Opnieuw proberen", + "updateFailed": "Bijwerken mislukt", + "updateSuccess": "Toegangstoken bijgewerkt", + "updateSuccessDesc": "Het toegangstoken is succesvol bijgewerkt." }, - "apiDocs": { - "choosePreferredType": "Kies uw voorkeurstype API-documentatie", - "swaggerUI": "Swagger UI", - "reDoc": "ReDoc", - "openAPIExplorer": "OpenAPI Explorer", - "scalar": "Scalar", - "downloadSpecYAML": "Download Spec YAML" + "page": { + "addBtn": "Token toevoegen", + "emptyDescription": "U hebt nog geen API-tokens aangemaakt. Klik hieronder om er een aan te maken.", + "emptyTitle": "Geen API-tokens", + "loadError": "Laden van API-tokens mislukt." + } + }, + "attachment": { + "all_fields_desc": "Komt overeen met bijlagennaam, onderwerp en afzender", + "date": "Datum", + "name": "Bestandsnaam", + "search_input_placeholder": "Zoek bijlagen (gebruik \" \" voor woordgroepen)", + "sender": "Afzender", + "sender_with_count": "Afzender ({{count}})", + "size": "Bestandsgrootte", + "source": "Bron", + "subject": "Onderwerp" + }, + "auth": { + "areYouSureYouWantToLogOut": "Weet u zeker dat u wilt uitloggen?", + "invalidPassword": "Ongeldig wachtwoord. Probeer het opnieuw.", + "login": "Inloggen", + "loginFailed": "Inloggen Mislukt", + "logout": "Uitloggen", + "password": "Wachtwoord", + "sessionExpired": "Sessie verlopen!", + "sessionExpiredDesc": "Uw sessie is beëindigd vanwege inactiviteit. Log opnieuw in om door te gaan.", + "somethingWentWrong": "Er is iets fout gegaan", + "username": "Gebruikersnaam", + "welcome": "Welkom bij Bichon", + "youWillNeedToLogInAgain": "U moet opnieuw inloggen om toegang te krijgen tot uw account." + }, + "command": { + "dark": "Donker", + "light": "Licht", + "noResultsFound": "Geen resultaten gevonden.", + "theme": "Thema", + "typeCommandOrSearch": "Typ een commando of zoek..." + }, + "common": { + "actions": "Acties", + "add": "Toevoegen", + "all": "Alle", + "apply": "Toepassen", + "back": "Terug", + "backToHome": "Terug naar Home", + "cancel": "Annuleren", + "clear": "Wissen", + "close": "Sluiten", + "confirm": "Bevestigen", + "create": "Aanmaken", + "delete": "Verwijderen", + "deleting": "Verwijderen...", + "deselectAll": "Alles deselecteren", + "edit": "Bewerken", + "empty": "Leeg", + "error": "Fout", + "failed": "Mislukt", + "filter": "Filteren", + "goBack": "Ga terug", + "loading": "Laden...", + "more": "Meer", + "na": "N.v.t.", + "no": "Nee", + "noData": "Geen gegevens", + "none": "Geen", + "notFound": "Niet gevonden", + "ok": "OK", + "op_failed": "Bewerking mislukt", + "project_description": "Bichon is een open-source project.", + "remove": "Verwijderen", + "reset": "Resetten", + "retry": "Opnieuw", + "save": "Opslaan", + "save_changes": "Wijzigingen opslaan", + "search": "Zoeken", + "select": "Selecteren", + "selectAll": "Alles selecteren", + "showLess": "Minder weergeven", + "showMore": "Meer weergeven...", + "submit": "Verzenden", + "table": { + "noResults": "Geen resultaten." }, - "dialogs": { - "confirmDelete": "Verwijdering Bevestigen", - "confirmDeleteDesc": "Weet u zeker dat u dit item wilt verwijderen? Deze actie kan niet ongedaan worden gemaakt.", - "deleteSuccess": "Succesvol verwijderd", - "deleteFailed": "Verwijderen mislukt", - "saveSuccess": "Succesvol opgeslagen", - "saveFailed": "Opslaan mislukt", - "createSuccess": "Succesvol aangemaakt", - "createFailed": "Aanmaken mislukt", - "updateSuccess": "Succesvol bijgewerkt", - "updateFailed": "Bijwerken mislukt", - "continue": "Doorgaan", - "deleting": "Bezig met verwijderen...", - "accountDeleted": "Account Verwijderd", - "accountDeletedDesc": "Uw account is succesvol verwijderd.", - "accountDeleteFailed": "Account verwijderen Mislukt", - "deleteAccountPermanently": "Account Permanent Verwijderen", - "youAreDeleting": "U bent bezig met het verwijderen van {{email}}. Dit zal permanent verwijderen:", - "accountCredentials": "Accountgegevens en instellingen", - "localCachedMetadata": "Lokaal opgeslagen metadata en sync status", - "imapSyncData": "IMAP-synchronisatiegegevens", - "oauthTokens": "OAuth-tokens en API-gegevens", - "typeEmailToConfirm": "Typ het account e-mailadres om te bevestigen:", - "typeToConfirm": "Typ \"{{email}}\" om te bevestigen", - "cannotBeUndone": "Deze actie kan niet ongedaan worden gemaakt!", - "allResourcesErased": "Alle gerelateerde bronnen worden permanent gewist.", - "permanentlyDeleteAccount": "Account Permanent Verwijderen" + "tryAgain": "Opnieuw proberen", + "update": "Bijwerken", + "view_on_github_button": "Bekijken op GitHub", + "yes": "Ja" + }, + "dashboard": { + "account": "Account", + "actualDiskUsage": "Feitelijk schijfgebruik", + "attachmentRatio": "Bijlageverhouding", + "attachmentRatioDesc": "{{percent}}% van de e-mails heeft bijlagen", + "attachments": "Bijlagen", + "byMessageCount": "Op berichtenaantal", + "byMessageSize": "Op berichtgrootte", + "connected": "Verbonden", + "count": "Aantal", + "dataStorage": "Gegevensopslag", + "dayTrend": "30-Dagen Trend", + "efficiency": "Opslagefficiëntie", + "emails": "E-mails", + "indexSize": "Indexgrootte", + "localDataFiles": "Lokale Gegevensbestanden", + "logicalVolume": "Oorspronkelijke grootte", + "mailAccounts": "Mailaccounts", + "messageDistribution": "Berichtdistributie", + "metadataSize": "Metadata grootte", + "newEmails": "Nieuwe e-mails", + "noAccountData": "Geen accountgegevens", + "noAttachments": "Geen Bijlagen", + "noEmailsSynced": "Nog geen e-mails gesynchroniseerd", + "noLargeEmails": "Geen grote e-mails", + "noRecentActivity": "Geen recente activiteit", + "noSendersData": "Geen afzendersgegevens", + "noSubject": "(Geen Onderwerp)", + "saved": "Bespaard", + "sender": "Afzender", + "size": "Grootte", + "subject": "Onderwerp", + "syncedLocally": "Lokaal gesynchroniseerd", + "systemVersion": "Systeemversie", + "tantivyDatabase": "Gebaseerd op de zoekmachine Tantivy", + "title": "Dashboard", + "top10Accounts": "Top 10 Accounts", + "top10LargestEmails": "Top 10 Grootste e-mails", + "top10Senders": "Top 10 Afzenders", + "topLists": "Toplijsten", + "totalEmailSize": "Totale e-mailgrootte", + "totalEmails": "Totaal aantal e-mails", + "withAttachments": "Met Bijlagen" + }, + "dialogs": { + "accountCredentials": "Accountgegevens en instellingen", + "accountDeleteFailed": "Account verwijderen Mislukt", + "accountDeleted": "Account Verwijderd", + "accountDeletedDesc": "Uw account is succesvol verwijderd.", + "allResourcesErased": "Alle gerelateerde bronnen worden permanent gewist.", + "cannotBeUndone": "Deze actie kan niet ongedaan worden gemaakt!", + "confirmDelete": "Verwijdering Bevestigen", + "confirmDeleteDesc": "Weet u zeker dat u dit item wilt verwijderen? Deze actie kan niet ongedaan worden gemaakt.", + "continue": "Doorgaan", + "createFailed": "Aanmaken mislukt", + "createSuccess": "Succesvol aangemaakt", + "deleteAccountPermanently": "Account Permanent Verwijderen", + "deleteFailed": "Verwijderen mislukt", + "deleteSuccess": "Succesvol verwijderd", + "deleting": "Bezig met verwijderen...", + "imapSyncData": "IMAP-synchronisatiegegevens", + "localCachedMetadata": "Lokaal opgeslagen metadata en sync status", + "oauthTokens": "OAuth-tokens en API-gegevens", + "permanentlyDeleteAccount": "Account Permanent Verwijderen", + "saveFailed": "Opslaan mislukt", + "saveSuccess": "Succesvol opgeslagen", + "typeEmailToConfirm": "Typ het account e-mailadres om te bevestigen:", + "typeToConfirm": "Typ \"{{email}}\" om te bevestigen", + "updateFailed": "Bijwerken mislukt", + "updateSuccess": "Succesvol bijgewerkt", + "youAreDeleting": "U bent bezig met het verwijderen van {{email}}. Dit zal permanent verwijderen:" + }, + "errors": { + "contentNotModified": "Inhoud niet gewijzigd!", + "forbidden": "Verboden", + "forbiddenDesc": "U heeft niet de benodigde toestemming om deze bron te bekijken.", + "forbiddenTitle": "Toegang Verboden", + "internalServerError": "Interne Serverfout!", + "learnMore": "Lees meer", + "maintenance": "Onderhoud", + "maintenanceDesc": "De site is momenteel niet beschikbaar. We zijn snel weer online.", + "maintenanceTitle": "Website is in onderhoud!", + "networkError": "Netwerkfout", + "networkErrorDesc": "Kan geen verbinding maken met de server. Controleer uw internetverbinding en probeer het opnieuw.", + "pageNotFound": "Oeps! Pagina niet gevonden!", + "pageNotFoundDesc": "Het lijkt erop dat de pagina die u zoekt niet bestaat of is verwijderd.", + "somethingWentWrong": "Oeps! Er is iets fout gegaan :')", + "somethingWentWrongDesc": "Onze excuses voor het ongemak. Probeer het later opnieuw.", + "unauthorized": "Ongeautoriseerd", + "unauthorizedDesc": "Log in met de juiste inloggegevens om deze bron te benaderen.", + "unauthorizedTitle": "Ongeautoriseerde Toegang" + }, + "mail": { + "account": "Account", + "attachments": "Bijlagen", + "bcc": "BCC", + "cc": "CC", + "date": "Datum", + "delete": "Verwijderen", + "download": "Downloaden", + "downloadComplete": "Download voltooid", + "downloadFailed": "Download mislukt", + "downloadStarted": "Download gestart", + "downloaded": "{{id}} gedownload", + "emailViewer": "E-mailviewer", + "failedToDownloadFile": "Downloaden van bestand mislukt", + "failedToLoadEmail": "Laden van e-mailbericht mislukt.", + "from": "Van", + "id": "ID", + "isBeingDownloaded": "{{id}} wordt gedownload", + "noAttachments": "Geen bijlagen", + "noMessageSelected": "Geen bericht geselecteerd", + "noTagsYet": "Nog geen tags", + "onlyNonInlineAttachments": "Alleen niet-inline bijlagen worden hier getoond.", + "showLess": "toon minder", + "showMore": "toon meer...", + "subject": "Onderwerp", + "tags": "Tags", + "to": "Aan", + "viewThread": "Draad Bekijken" + }, + "mailbox": { + "bulkActions": { + "ariaLabel": "Bulkacties voor {{count}} geselecteerde {{emailLabel}}", + "clearSelection": "Selectie wissen", + "clearSelectionWithKey": "Selectie wissen ({{key}})", + "delete": "Verwijderen", + "deleteTooltip": "Geselecteerde e-mails verwijderen", + "email": "e-mail", + "emails": "e-mails", + "selected": "geselecteerd" }, - "command": { - "typeCommandOrSearch": "Typ een commando of zoek...", - "noResultsFound": "Geen resultaten gevonden.", - "theme": "Thema", - "light": "Licht", - "dark": "Donker" + "deleteDialog": { + "confirm": "Verwijderen", + "desc": "Weet u zeker dat u {{countText}} wilt verwijderen? Deze actie verwijdert de geselecteerde e-mail(s) uit de lokale database. De e-mail(s) worden permanent verwijderd en kunnen niet worden hersteld.", + "descCountMultiple": "deze {{count}} e-mails", + "descCountSingle": "deze e-mail", + "errorTitle": "Verwijderen van berichten mislukt", + "successDesc": "De berichten zijn verwijderd.", + "successTitle": "Berichten succesvol verwijderd", + "title": "E-mail Verwijderen", + "warningDesc": "Wees voorzichtig voordat u verder gaat.", + "warningTitle": "Waarschuwing!" + }, + "deleteMailboxDialog": { + "confirm": "Permanent verwijderen", + "desc": "Weet u zeker dat u deze postvakmap wilt verwijderen? Deze actie kan niet ongedaan worden gemaakt.", + "errorTitle": "Verwijderen mislukt", + "successDesc": "De postvakmap en de inhoud ervan zijn succesvol verwijderd.", + "successTitle": "Succesvol verwijderd", + "title": "Postvakmap verwijderen", + "warningDesc": "Het verwijderen van deze map zal ook permanent alle gearchiveerde e-mails und submappen erin verwijderen.", + "warningTitle": "Waarschuwing" + }, + "folders": "Mappen", + "messages": "Berichten", + "noMessages": "Geen berichten", + "selectFolder": "Selecteer een map om berichten te bekijken", + "thread": { + "empty": "Geen berichten in deze draad.", + "invalidDate": "Ongeldige Datum", + "loadError": "Laden van draad mislukt", + "loadMore": "Meer laden", + "loadingMore": "Meer laden...", + "message": "bericht", + "messages": "berichten", + "noSubject": "(Geen onderwerp)", + "title": "Draad ({{count}} {{messageLabel}})" + }, + "title": "Postvak In" + }, + "navigation": { + "accessTokens": "Toegangstokens", + "accounts": "Accounts", + "apiDocs": "API Documentatie", + "attachment": "Bijlagen", + "auth": "Authenticatie", + "dashboard": "Dashboard", + "general": "Algemeen", + "home": "Startpagina", + "mailbox": "Postvak In", + "oauth2": "OAuth2", + "other": "Overig", + "settings": "Instellingen", + "users": "Systeemgebruikers" + }, + "oauth2": { + "aSecretKeyProvidedByTheOAuthProvider": "Een geheime sleutel verstrekt door de OAuth-aanbieder om uw applicatie te authenticeren.", + "actions": { + "authorize": "Autoriseren", + "delete": "Verwijderen", + "edit": "Bewerken", + "openMenu": "Menu openen" + }, + "addConfiguration": "Configuratie Toevoegen", + "addExtraParams": "Extra Parameters Toevoegen", + "addNew": "Nieuwe Toevoegen", + "addScope": "Scope Toevoegen", + "areYouSureYouWantTo": "Weet u zeker dat u deze OAuth2 client wilt {{action}}?", + "areYouSureYouWantToDelete": "Weet u zeker dat u wilt verwijderen", + "authAtatus": "OAuth2 Authenticatiestatus", + "authFailed": "OAuth2 Authenticatie Mislukt", + "authSuccess": "OAuth2 Authenticatie Succesvol", + "authUrlLabel": "Auth Url:", + "authorizationUrlCannotBeEmpty": "Autorisatie-URL mag niet leeg zijn", + "authorizationUrlIsRequired": "Autorisatie-URL is vereist", + "authorize": "Autoriseren", + "authorizeAnEmailAccountToStartTheOAuth2AuthorizationProcess": "Autoriseer een e-mailaccount om het OAuth2-autorisatieproces te starten.", + "authorizeEmailAccount": "E-mailaccount Autoriseren", + "backToLogin": "Terug naar Inloggen", + "clickSaveWhenDone": "Klik op opslaan als u klaar bent.", + "clientId": "Client ID", + "clientIdCannotBeEmpty": "Client ID mag niet leeg zijn", + "clientIdIsRequired": "Client ID is vereist", + "clientIdLabel": "Client Id:", + "clientSecret": "Client Secret", + "clientSecretCannotBeEmpty": "Client Secret mag niet leeg zijn", + "clientSecretIsRequired": "Client Secret is vereist", + "clientSecretLabel": "Client Secret:", + "createAccount": "Account Aanmaken", + "createNewHere": "Hier een nieuwe aanmaken.", + "created": "Aangemaakt", + "creating": "Bezig met aanmaken...", + "creationFailed": "Aanmaken Mislukt", + "delete": "Verwijderen", + "deleteFailed": "Verwijderen mislukt, probeer het later opnieuw", + "deleteSuccess": "Verwijderen Succesvol", + "deleteToken": "Token Verwijderen", + "describeThePurposeOfTheOauth2Application": "Beschrijf het doel van de OAuth2-applicatie", + "description": "Automatisch afhandelen van het ophalen, opslaan en vernieuwen van toegangstokens, wat zorgt voor een naadloze en altijd-ready authenticatie-ervaring.", + "descriptionLabel": "Beschrijving:", + "descriptionMustNotExceed255Characters": "Beschrijving mag niet langer zijn dan 255 tekens.", + "disable": "Uitschakelen", + "disableOAuth2Client": "OAuth2 Client Uitschakelen", + "disabled": "Uitgeschakeld", + "edit": "Bewerken", + "enable": "Inschakelen", + "enableOAuth2Client": "OAuth2 Client Inschakelen", + "enabled": "Ingeschakeld", + "enterIdToConfirmDeletion": "Voer ID in om verwijdering te bevestigen.", + "enterTheAuthorizationUrl": "Voer de autorisatie-URL in", + "enterTheKeyHere": "Voer de sleutel hier in.", + "enterTheScopeHere": "Voer de scope hier in.", + "enterTheTokenUrl": "Voer de token-URL in", + "enterTheValueHere": "Voer de waarde hier in.", + "enterYourClientId": "Voer uw client ID in", + "enterYourClientSecret": "Voer uw client secret in", + "enterYourRedirectUrl": "Voer uw redirect-URL in", + "error": "Fout", + "getAuthorizeUrlFailed": "Ophalen Autorisatie-URL Mislukt", + "getAuthorizeUrlFailedDesc": "Ophalen autorisatie-URL mislukt, probeer het later opnieuw", + "gmail": "Gmail", + "goHome": "Naar Startpagina", + "goToAccounts": "Naar Accounts", + "id": "ID", + "information": "Informatie", + "invalidAuthorizationUrlFormat": "Ongeldig Autoristatie-URL formaat", + "invalidRedirectUriFormat": "Ongeldig Redirect URI formaat", + "invalidTokenUrlFormat": "Ongeldig Token URL formaat", + "key": "Sleutel:", + "keyCannotBeEmpty": "Sleutel mag niet leeg zijn", + "keyIsRequired": "Sleutel is vereist", + "leaveEmptyToKeepExistingSecret": "Laat leeg om bestaand geheim te behouden", + "leaveEmptyToKeepTheExistingSecret": "Laat leeg om het bestaande geheim te behouden. Voer alleen een nieuwe waarde in als u deze wilt wijzigen.", + "loadingAccounts": "Accounts laden...", + "noConfigurations": "Geen OAuth2 Configuraties", + "noConfigurationsDesc": "U heeft nog geen OAuth2-configuraties toegevoegd. Voeg er een toe om de OAuth2-functies te gebruiken.", + "noEmailAccountsRegistered": "Geen e-mailaccounts geregistreerd. Gelieve er een aan te maken.", + "noProxyAvailable": "Geen proxy beschikbaar", + "noStatus": "Deze pagina toont het resultaat van uw OAuth2-authenticatie. Momenteel is er geen specifieke status beschikbaar. Probeer het indien nodig opnieuw.", + "oauth2ClientHasBeenSuccessfully": "OAuth2 client is succesvol {{action}}.", + "oauth2ClientUpdated": "OAuth2 client Bijgewerkt", + "oauth2DeleteFailed": "OAuth2 Verwijderen Mislukt", + "optional": "Optioneel", + "outlook": "Outlook", + "pleaseBeCareful": "Wees voorzichtig, deze bewerking kan niet ongedaan worden gemaakt.", + "pleaseCreateOne": "Gelieve er een aan te maken.", + "provider": "Aanbieder", + "quickPresets": "Snelle voorinstellingen:", + "redirectUri": "Redirect URI", + "redirectUriCannotBeEmpty": "Redirect URI mag niet leeg zijn", + "redirectUriIsRequired": "Redirect URI is vereist", + "redirectUrlLabel": "Redirect Url:", + "save": "Opslaan", + "saveChanges": "Wijzigingen opslaan", + "saving": "Bezig met opslaan...", + "scope": "Scope:", + "scopes": "Scopes", + "selectAProxy": "Selecteer een proxy", + "selectAnAccount": "Selecteer een account", + "status": "Status", + "statusUpdateFailed": "Status bijwerken mislukt, probeer het later opnieuw", + "success": "Succes", + "successMessage": "Uw e-mailaccount is succesvol geauthenticeerd via OAuth2. De Toegangstoken is opgeslagen door het systeem en wordt automatisch bijgewerkt indien nodig.", + "theRedirectUrlAfterAuthorization": "De redirect-URL na autorisatie. Deze moet overeenkomen met de URL die is geregistreerd bij de OAuth-aanbieder. Gebruik het formaat http://[host]:[poort]/oauth2/callback (of https://), waarbij [host] en [poort] overeenkomen met uw RustMailer-implementatie. Het pad /oauth2/callback is vast.", + "theUniqueIdentifierForYourApplication": "De unieke identificatie voor uw applicatie, verstrekt door de OAuth-aanbieder.", + "theUrlUsedToExchange": "De URL die wordt gebruikt om de autorisatiecode in te ruilen voor een toegangstoken.", + "theUrlWhereUsersWillBeRedirected": "De URL waar gebruikers naartoe worden geleid om uw applicatie te autoriseren.", + "thisActionWillPermanentlyRemoveTheOauth2Record": "Deze actie zal de OAuth2-record permanent uit het systeem verwijderen. Dit kan niet ongedaan worden gemaakt.", + "thisWillPreventTheOAuth2ClientFromBeingUsed": "Dit voorkomt dat de OAuth2 client wordt gebruikt.", + "title": "OAuth2", + "tokenUrlCannotBeEmpty": "Token URL mag niet leeg zijn", + "tokenUrlIsRequired": "Token URL is vereist", + "tokenUrlLabel": "Token Url:", + "tryAgain": "Probeer Opnieuw", + "unknownError": "Er is een onbekende fout opgetreden.", + "updateFailed": "Bijwerken Mislukt", + "updateHere": "Hier bijwerken.", + "updateOrCreationFailed": "{{action}} mislukt, probeer het later opnieuw", + "updated": "Bijgewerkt", + "useProxyOptional": "Gebruik Proxy (optioneel):", + "useSocks5ProxyForOAuthRequests": "Gebruik SOCKS5-proxy voor OAuth-verzoeken wanneer directe toegang is geblokkeerd.", + "value": "Waarde:", + "valueCannotBeEmpty": "Waarde mag niet leeg zijn", + "valueIsRequired": "Waarde is vereist", + "warning": "Waarschuwing!", + "whenDisabled": "Indien uitgeschakeld: - Nieuwe autorisatiestromen worden onmiddellijk geweigerd - Bestaande toegangs- en vernieuwingstokens worden binnen 1 minuut ingetrokken - Gebruikers moeten opnieuw autoriseren wanneer het opnieuw wordt ingeschakeld", + "yourOAuth2ApplicationHasBeenSuccessfully": "Uw OAuth2-applicatie is succesvol {{action}}.", + "yourOAuth2ApplicationHasBeenSuccessfullyDeleted": "Uw OAuth2-applicatie is succesvol verwijderd." + }, + "permission": { + "account": { + "create": "E-mailaccounts aanmaken", + "manage": "Toegewezen accounts beheren", + "manage_all": "Alle accountconfiguraties beheren", + "read_details": "Accountdetails bekijken" + }, + "category": { + "account": "Accountmachtigingen", + "global_data": "Globale gegevens (Beheerder)", + "system_identity": "Systeem en identiteit" + }, + "data": { + "delete": "Toegewezen e-mails verwijderen", + "delete_all": "E-mails van alle accounts verwijderen", + "export_batch": "Toegewezen gegevens batchgewijs exporteren", + "export_batch_all": "Alle gegevens batchgewijs exporteren", + "import_batch": "E-mailgegevens batchgewijs importeren", + "manage": "Toegewezen e-mailmetadata beheren", + "manage_all": "Alle e-mailmetadata beheren", + "raw_download": "Toegewezen onbewerkte e-mails downloaden", + "raw_download_all": "Alle onbewerkte e-mails downloaden", + "read": "Toegewezen e-mailgegevens lezen", + "read_all": "Alle e-mailgegevens lezen", + "smtp_ingest": "E-mails opnemen via het SMTP-protocol" + }, + "dialog": { + "account_description": "Machtigingen die beperkt zijn tot het geselecteerde account.", + "account_title": "Accountmachtigingen", + "global_description": "Systeemwijde machtigingen die aan deze gebruiker zijn toegekend.", + "global_title": "Globale machtigingen" + }, + "scope": { + "account": "Account #{{id}}", + "global": "Globaal" + }, + "system": { + "access": "Basistoegang tot het systeem", + "root": "Volledige systeemcontrole" + }, + "token": { + "manage": "Toegangstokens beheren" + }, + "user": { + "manage": "Alle gebruikers beheren", + "view": "Basisgebruikersnamen weergeven" + } + }, + "profile": { + "avatar_alt": "Avatar", + "menu": { + "profile": "Profiel", + "settings": "Instellingen", + "sign_out": "Uitloggen" + } + }, + "proxyDelete": { + "close": "Sluiten", + "confirmText": "Weet u zeker dat u wilt verwijderen", + "deleteBtn": "Verwijderen", + "failedDesc": "Verwijderen mislukt, probeer het later opnieuw", + "failedTitle": "Proxy verwijderen Mislukt", + "permanent": "Deze actie zal de Proxy permanent uit het systeem verwijderen. Dit kan niet ongedaan worden gemaakt.", + "proxyIdLabel": "Proxy Id:", + "proxyIdPlaceholder": "Voer Proxy Id in om verwijdering te bevestigen.", + "successDesc": "Proxy is succesvol verwijderd.", + "successTitle": "Verwijderen Succesvol", + "title": "Proxy Verwijderen", + "tryAgain": "Probeer opnieuw", + "warningDesc": "Wees voorzichtig, deze bewerking kan niet ongedaan worden gemaakt.", + "warningTitle": "Waarschuwing!" + }, + "restore_message": { + "accountsInvolved": "Betrokken accounts", + "bulkTitle": "Meerdere berichten herstellen", + "bulkWarning": "Let op: berichten worden hersteld in hun oorspronkelijke mappen.", + "confirm": "Herstel uitvoeren", + "desc": "Deze actie zal de geselecteerde berichten opnieuw uploaden vanuit Bichon en ze herstellen in de bijbehorende mailboxen op de IMAP-server.", + "failed": "Herstel mislukt", + "failedTitle": "Herstelfout", + "messages": "berichten", + "restore_to_imap": "Bericht herstellen", + "success": "Herstel geslaagd", + "successDesc": "De geselecteerde berichten zijn succesvol hersteld op de IMAP-server.", + "summary": "Hersteldetails", + "title": "Enkel bericht herstellen" + }, + "roles": { + "actions": { + "add": "Rol toevoegen", + "cancel": "Annuleren", + "close": "Sluiten", + "failed": "Bewerking mislukt", + "retry": "Opnieuw", + "submit_create": "Rol maken", + "submit_update": "Rol bijwerken", + "success_create": "Rol succesvol aangemaakt", + "success_update": "Rol succesvol bijgewerkt" + }, + "categories": { + "account_resource": "Accountresource toegang", + "global_data": "Globale datatoegang", + "identity": "Identiteit & Beheer" + }, + "columns": { + "created_at": "Gemaakt op", + "id": "ID", + "name": "Naam", + "permissions": "Permissies", + "role_type": "Type", + "updated_at": "Bijgewerkt op" + }, + "delete": { + "alert_desc": "Het verwijderen van deze rol verwijdert deze bij alle toegewezen gebruikers.", + "alert_title": "Waarschuwing: Definitieve actie.", + "confirm_btn": "Rol verwijderen", + "confirm_label": "Typ de rol-ID ter bevestiging:", + "deleting": "Verwijderen...", + "dialog_title": "Rol verwijderen", + "error_fallback": "Kon de rol niet verwijderen.", + "error_title": "Verwijderen mislukt", + "irreversible": "Deze actie kan niet ongedaan worden gemaakt.", + "placeholder": "Typ \"{{id}}\"", + "success_desc": "De rol \"{{name}}\" is verwijderd.", + "success_title": "Rol verwijderd", + "warning_text": "U staat op het punt de rol {{name}} (ID: {{id}}) definitief te verwijderen." + }, + "description_hint": "Definieer toegang en permissies.", + "details": { + "close_btn": "Sluiten", + "desc_account": "Toegang en data-acties voor individuele accounts.", + "desc_global": "Globaal beheer en systeemtoegang.", + "role_badge": "{{type}} rol", + "title": "Permissies: {{name}}", + "unknown": "Onbekende rol", + "view_permissions": "Details bekijken" + }, + "empty": { + "desc": "U heeft nog geen aangepaste rollen gemaakt.", + "title": "Geen rollen gevonden" + }, + "form": { + "builtin_badge": "Ingebouwde rol", + "builtin_desc": "Deze rol is vooraf gedefinieerd en alleen-lezen.", + "desc_label": "Beschrijving", + "matrix_label": "Permissiematrix ({{type}})", + "name_label": "Rolnaam", + "type_label": "Roltype" + }, + "placeholder": { + "filter": "Zoek rollen..." + }, + "title": { + "create": "Nieuwe rol maken", + "edit": "Rol bewerken: {{name}}" + }, + "types": { + "Account": "Account", + "Global": "Globaal" }, "validation": { - "required": "Dit veld is verplicht", - "invalidEmail": "Ongeldig e-mailadres", - "invalidUrl": "Ongeldige URL", - "passwordMinLength": "Wachtwoord moet ten minste {{min}} tekens lang zijn", - "pleaseEnterPassword": "Voer uw wachtwoord in", - "passwordRequired": "Wachtwoord is vereist wanneer de authenticatiemethode Wachtwoord is", - "emailRequired": "E-mail is vereist", - "imapHostRequired": "IMAP host is vereist", - "imapHostCannotBeEmpty": "IMAP host mag niet leeg zijn", - "imapPortMustBePositive": "IMAP poort moet een positief geheel getal zijn", - "imapPortMustBeLessThan65536": "IMAP poort moet kleiner zijn dan 65536", - "folderLimitMustBeNumber": "Mappenlimiet moet een nummer zijn", - "folderLimitMustBeAtLeast100": "Mappenlimiet moet ten minste 100 zijn", - "incrementalSyncMustBeNumber": "Incrementaal sync interval moet een nummer zijn", - "incrementalSyncMustBeAtLeast10": "Incrementaal sync interval moet ten minste 10 minuten zijn", - "pleaseEnterUsernameOrEmail": "Voer alstublieft uw gebruikersnaam of e-mailadres in", - "singleRequestBatchSizeMustBeNumber": "Batch‑grootte moet een nummer zijn", - "singleRequestBatchSizeTooSmall": "Batch‑grootte moet ten minste 10 zijn", - "singleRequestBatchSizeTooLarge": "Batch‑grootte moet hoogstens 200 zijn" - }, - "table": { - "noResults": "Geen resultaten gevonden", - "loading": "Laden...", - "page": "Pagina", - "of": "van", - "rowsPerPage": "Rijen per pagina", - "showing": "Toont", - "to": "tot", - "results": "resultaten", - "asc": "Oplopend", - "desc": "Aflopend", - "hide": "Verbergen", - "edit": "Bewerken", - "delete": "Verwijderen", - "pagination": { - "selected": "{{selected}} van {{total}} rij(en) geselecteerd.", - "fixed_page_size": "{{size}} rijen per pagina.", - "rows_per_page": "Rijen per pagina", - "page_info": "Pagina {{page}} van {{total}}", - "first": "Eerste pagina", - "previous": "Vorige pagina", - "next": "Volgende pagina", - "last": "Laatste pagina" - } - }, - "proxyDelete": { - "title": "Proxy Verwijderen", - "successTitle": "Verwijderen Succesvol", - "successDesc": "Proxy is succesvol verwijderd.", - "close": "Sluiten", - "failedTitle": "Proxy verwijderen Mislukt", - "failedDesc": "Verwijderen mislukt, probeer het later opnieuw", - "tryAgain": "Probeer opnieuw", - "confirmText": "Weet u zeker dat u wilt verwijderen", - "permanent": "Deze actie zal de Proxy permanent uit het systeem verwijderen. Dit kan niet ongedaan worden gemaakt.", - "proxyIdLabel": "Proxy Id:", - "proxyIdPlaceholder": "Voer Proxy Id in om verwijdering te bevestigen.", - "warningTitle": "Waarschuwing!", - "warningDesc": "Wees voorzichtig, deze bewerking kan niet ongedaan worden gemaakt.", - "deleteBtn": "Verwijderen" - }, - "systemConfig": { - "pageTitle": "Systeemconfiguraties", - "pageDescription": "Deze parameters worden geïnitialiseerd via CLI-flags of omgevingsvariabelen. Ze zijn alleen-lezen.", - "status": { - "enabled": "Ingeschakeld", - "disabled": "Uitgeschakeld", - "configured": "Geconfigureerd", - "missing": "Ontbreekt", - "auto": "Auto", - "notSet": "Niet ingesteld" - }, - "sections": { - "network": { - "title": "Netwerk", - "desc": "HTTP en publieke toegang" - }, - "cors": { - "title": "CORS", - "desc": "Cross-origin toegangsregels" - }, - "logging": { - "title": "Logging", - "desc": "Gedrag van log-output" - }, - "storage": { - "title": "Opslag & Cache", - "desc": "Databasepaden en limieten" - }, - "security": { - "title": "Beveiliging", - "desc": "Authenticatie & encryptie" - }, - "performance": { - "title": "Prestaties", - "desc": "Gelijktijdigheid & compressie" - }, - "smtp": { - "title": "SMTP-server", - "desc": "Instellingen voor inkomende e-mailontvangst voor realtime archivering" - } - } - }, - "apiTokens": { - "page": { - "loadError": "Laden van API-tokens mislukt.", - "emptyTitle": "Geen API-tokens", - "emptyDescription": "U hebt nog geen API-tokens aangemaakt. Klik hieronder om er een aan te maken.", - "addBtn": "Token toevoegen" - }, - "list": { - "unnamedToken": "Naamloos token", - "statusActive": "Actief", - "statusExpired": "Verlopen", - "neverExpires": "Verloopt nooit", - "expiresOnShort": "Verloopt op {{date}}", - "tokenLabel": "Token", - "createdLabel": "Aangemaakt", - "lastUsedLabel": "Laatst gebruikt", - "expiresOnLabel": "Verloopt op", - "neverUsed": "Nooit", - "neverLabel": "Nooit", - "deleteBtn": "Token verwijderen" - }, - "dialog": { - "createTitle": "Toegangstoken aanmaken", - "editTitle": "Toegangstoken bewerken", - "description": "Klik op opslaan als u klaar bent.", - "save": "Opslaan", - "saveChanges": "Wijzigingen opslaan" - }, - "deleteDialog": { - "title": "Toegangstoken verwijderen?", - "description": "Deze actie kan niet ongedaan worden gemaakt. Elke applicatie die dit token gebruikt, verliest onmiddellijk de toegang.", - "cancel": "Annuleren", - "confirm": "Verwijderen", - "deleting": "Verwijderen..." - }, - "form": { - "nameLabel": "Naam", - "namePlaceholder": "Geef dit token een korte naam", - "nameDescription": "Optioneel · Max 32 tekens", - "expirationLabel": "Vervaldatum", - "expirationPlaceholder": "Selecteer vervaldatum", - "expirationDescription": "Tokens verlopen automatisch na de geselecteerde tijd.", - "never": "Nooit", - "1day": "1 dag", - "7days": "7 dagen", - "30days": "30 dagen", - "errorMax": "Max 32 tekens", - "errorNumber": "Moet een getal zijn", - "errorInt": "Moet een geheel getal zijn", - "errorPositive": "Moet groter zijn dan 0" - }, - "notifications": { - "createSuccess": "Toegangstoken aangemaakt", - "createSuccessDesc": "Het toegangstoken is succesvol aangemaakt.", - "updateSuccess": "Toegangstoken bijgewerkt", - "updateSuccessDesc": "Het toegangstoken is succesvol bijgewerkt.", - "createFailed": "Aanmaken mislukt", - "updateFailed": "Bijwerken mislukt", - "deleteSuccess": "Token verwijderd", - "deleteFailed": "Verwijderen mislukt", - "copied": "Gekopieerd naar klembord", - "genericError": "Bewerking mislukt. Probeer het opnieuw.", - "close": "Sluiten", - "tryAgain": "Opnieuw proberen" - } - }, - "permission": { - "scope": { - "global": "Globaal", - "account": "Account #{{id}}" - }, - "dialog": { - "global_title": "Globale machtigingen", - "account_title": "Accountmachtigingen", - "global_description": "Systeemwijde machtigingen die aan deze gebruiker zijn toegekend.", - "account_description": "Machtigingen die beperkt zijn tot het geselecteerde account." - }, - "category": { - "system_identity": "Systeem en identiteit", - "global_data": "Globale gegevens (Beheerder)", - "account": "Accountmachtigingen" - }, - "system": { - "access": "Basistoegang tot het systeem", - "root": "Volledige systeemcontrole" - }, - "user": { - "manage": "Alle gebruikers beheren", - "view": "Basisgebruikersnamen weergeven" - }, - "token": { - "manage": "Toegangstokens beheren" - }, - "account": { - "create": "E-mailaccounts aanmaken", - "manage": "Toegewezen accounts beheren", - "manage_all": "Alle accountconfiguraties beheren", - "read_details": "Accountdetails bekijken" - }, - "data": { - "read": "Toegewezen e-mailgegevens lezen", - "read_all": "Alle e-mailgegevens lezen", - "manage": "Toegewezen e-mailmetadata beheren", - "manage_all": "Alle e-mailmetadata beheren", - "raw_download": "Toegewezen onbewerkte e-mails downloaden", - "raw_download_all": "Alle onbewerkte e-mails downloaden", - "delete": "Toegewezen e-mails verwijderen", - "delete_all": "E-mails van alle accounts verwijderen", - "export_batch": "Toegewezen gegevens batchgewijs exporteren", - "export_batch_all": "Alle gegevens batchgewijs exporteren", - "import_batch": "E-mailgegevens batchgewijs importeren", - "smtp_ingest": "E-mails opnemen via het SMTP-protocol" - } - }, - "users": { - "columns": { - "id": "ID", - "avatar": "Avatar", - "username": "Gebruikersnaam", - "email": "E-mailadres", - "roles": "Rollen & permissies", - "created_at": "Gemaakt op", - "updated_at": "Bijgewerkt op", - "actions": "Acties" - }, - "buttons": { - "add": "Gebruiker toevoegen", - "add_new": "Nieuwe gebruiker" - }, - "empty": { - "title": "Geen gebruikers gevonden", - "description": "Klik op de knop hieronder om uw eerste gebruiker toe te voegen." - }, - "nav": { - "users": "Gebruikers", - "roles": "Rollen", - "api_tokens": "API-tokens" - }, - "api_tokens": { - "empty": { - "title": "Geen API-tokens gevonden", - "description": "Er zijn nog geen API-tokens gegenereerd in het systeem." - }, - "button": { - "generate": "Nieuwe token genereren" - }, - "toolbar": { - "search_placeholder": "Zoeken op naam, eigenaar of token..." - }, - "table": { - "name": "Naam", - "type": "Type", - "last_used": "Laatst gebruikt", - "expires_at": "Verloopt op", - "owner": "Eigenaar", - "created": "Aangemaakt", - "api_key": "API-sleutel", - "web_ui": "Web UI", - "never": "Nooit", - "permanent": "Permanent", - "expired": "Verlopen", - "unnamed": "Naamloze token" - }, - "unnamed": "Naamloze token", - "delete": { - "title": "API-token verwijderen", - "desc": "U staat op het punt deze API-token definitief te verwijderen", - "prefix": "Token-prefix", - "irreversible": "Deze actie kan niet ongedaan worden gemaakt. Applicaties die deze token gebruiken, verliezen direct toegang.", - "confirm_label": "Typ {{word}} hieronder om te bevestigen:", - "confirm_placeholder": "Typ \"{{word}}\" ter bevestiging", - "warning_title": "Waarschuwing", - "warning_desc": "Scripts of diensten die deze token gebruiken zullen falen. Controleer of uw systemen zijn bijgewerkt.", - "confirm_button": "Token verwijderen", - "deleting": "Verwijderen..." - }, - "toast": { - "deleted_title": "API-token verwijderd", - "deleted_desc": "De token \"{{name}}\" is succesvol verwijderd.", - "delete_failed_title": "Verwijderen mislukt", - "delete_failed": "Kon de token niet verwijderen, probeer het opnieuw." - } - }, - "tokens": { - "schema": { - "name_max": "Max 32 tekens", - "expire_number": "Moet een getal zijn", - "expire_int": "Moet een geheel getal zijn", - "expire_positive": "Moet groter zijn dan 0" - }, - "toast": { - "update_success_title": "Token bijgewerkt", - "update_success_desc": "Toegangstoken succesvol bijgewerkt.", - "create_success_title": "Token aangemaakt", - "create_success_desc": "Toegangstoken succesvol aangemaakt.", - "update_failed_title": "Update mislukt", - "create_failed_title": "Aanmaken mislukt" - }, - "error": { - "fallback": "Bewerking mislukt, probeer het later opnieuw." - }, - "dialog": { - "edit_title": "Toegangstoken bewerken", - "create_title": "Toegangstoken aanmaken", - "description": "Klik op opslaan als u klaar bent." - }, - "fields": { - "name_label": "Naam", - "name_placeholder": "Geef de token een korte naam", - "name_hint": "Optioneel · Max 32 tekens", - "expire_label": "Vervalsetermijn", - "expire_placeholder": "Kies termijn", - "expire_hint": "De token verloopt automatisch na de gekozen tijd." - }, - "expire_options": { - "never": "Verloopt nooit", - "1_day": "1 dag", - "7_days": "7 dagen", - "30_days": "30 dagen" - } - }, - "tokens_action": { - "dialog": { - "title": "API-tokens", - "description": "Beheer API-tokens voor deze gebruiker." - }, - "empty": { - "title": "Geen API-tokens", - "description": "Deze gebruiker heeft momenteel geen API-tokens." - }, - "buttons": { - "add": "Token toevoegen" - }, - "list": { - "unnamed_token": "Naamloze token", - "status_expired": "Verlopen", - "status_active": "Actief", - "expires_on_brief": "Verloopt op {{date}}", - "never_expires": "Verloopt nooit", - "label_token": "Token", - "label_created": "Aangemaakt op", - "label_last_used": "Laatst gebruikt", - "label_expires_at": "Verloopt op", - "never": "Nooit", - "button_delete": "Token verwijderen" - }, - "delete_dialog": { - "title": "Toegangstoken verwijderen?", - "description": "Deze actie kan niet ongedaan worden gemaakt." - } - }, - "actions": { - "schema": { - "account_required": "Selecteer een account", - "role_required": "Selecteer een rol", - "username_required": "Gebruikersnaam is verplicht", - "username_min": "Minimaal 3 tekens", - "username_max": "Maximaal 32 tekens", - "email_required": "E-mail is verplicht", - "email_invalid": "Voer een geldig e-mailadres in", - "global_role_required": "Wijs minimaal één globale rol toe", - "description_max": "Beschrijving max 256 tekens", - "ip_invalid": "Ongeldig IP-adres gedetecteerd", - "password_required": "Wachtwoord is verplicht", - "password_min": "Minimaal 8 tekens", - "password_max": "Maximaal 256 tekens" - }, - "toast": { - "updated": "Gebruiker bijgewerkt", - "created": "Gebruiker aangemaakt" - }, - "dialog": { - "edit_title": "Gebruiker bewerken: {{name}}", - "create_title": "Nieuwe gebruiker aanmaken", - "subtitle": "Configureer identiteit, toegangsniveaus en beleid." - }, - "tabs": { - "general": "Algemeen", - "permissions": "Accountpermissies", - "security": "Beveiliging & ACL" - }, - "sections": { - "basic": "Basisidentiteit", - "global": "Globale permissies", - "mail_access": "E-mailtoegangsbeheer", - "mail_access_subtitle": "E-mailaccounts die deze gebruiker mag beheren.", - "policy": "Beleid" - }, - "fields": { - "username": "Gebruikersnaam", - "username_hint": "Unieke ID voor login.", - "email": "E-mailadres", - "email_hint": "Primair contact en meldingen.", - "password": "Wachtwoord", - "password_placeholder_create": "Minimaal 8 tekens", - "password_placeholder_edit": "Leeg laten om huidige te behouden", - "password_hint_create": "Veilig wachtwoord voor eerste installatie.", - "password_hint_edit": "Alleen invullen bij wijziging.", - "global_roles_hint": "Wijs systeempermissies toe.", - "description": "Beschrijving (optioneel)", - "description_placeholder": "Notities over deze gebruiker...", - "description_hint": "Interne notities (max 256 tekens).", - "select_account": "Account kiezen", - "assign_role": "Rol toewijzen", - "ip_whitelist": "IP Whitelist", - "ip_whitelist_hint": "Login beperken tot deze IP's (één per regel).", - "rate_quota": "Rate Quota", - "burst_interval": "Burst Interval (sec)" - }, - "buttons": { - "add_account": "Account toevoegen", - "update": "Gebruiker bijwerken", - "create": "Gebruiker aanmaken" - }, - "states": { - "full_access": "Volledige toegangsmodus", - "full_access_desc": "Administrators hebben automatisch toegang tot alle accounts.", - "no_accounts": "Geen specifieke accounts toegewezen.", - "security_disabled": "Beveiligingsbeleid is uitgeschakeld." - }, - "api_tokens": "API-tokens", - "placeholder": { - "filter": "Zoek gebruikers..." - }, - "delete": { - "title": "Gebruiker verwijderen", - "confirm_msg": "U staat op het punt gebruiker {{name}} (ID: {{id}}) definitief te verwijderen.", - "irreversible": "Deze actie is onherroepelijk.", - "input_label": "Typ de gebruikers-ID ter bevestiging:", - "placeholder": "Typ \"{{id}}\"", - "alert_title": "Waarschuwing: Definitieve actie.", - "alert_desc": "De gebruiker en alle bijbehorende data worden gewist.", - "button_confirm": "Gebruiker verwijderen", - "button_deleting": "Verwijderen...", - "toast": { - "success_title": "Gebruiker verwijderd", - "success_desc": "De gebruiker \"{{name}}\" is verwijderd.", - "failed_title": "Verwijderen mislukt", - "failed_fallback": "Kon de gebruiker niet verwijderen." - } - } - } - }, - "roles": { - "title": { - "create": "Nieuwe rol maken", - "edit": "Rol bewerken: {{name}}" - }, - "description_hint": "Definieer toegang en permissies.", - "form": { - "name_label": "Rolnaam", - "type_label": "Roltype", - "desc_label": "Beschrijving", - "matrix_label": "Permissiematrix ({{type}})", - "builtin_badge": "Ingebouwde rol", - "builtin_desc": "Deze rol is vooraf gedefinieerd en alleen-lezen." - }, - "types": { - "Global": "Globaal", - "Account": "Account" - }, - "categories": { - "identity": "Identiteit & Beheer", - "global_data": "Globale datatoegang", - "account_resource": "Accountresource toegang" - }, - "actions": { - "cancel": "Annuleren", - "submit_create": "Rol maken", - "submit_update": "Rol bijwerken", - "success_create": "Rol succesvol aangemaakt", - "success_update": "Rol succesvol bijgewerkt", - "failed": "Bewerking mislukt", - "close": "Sluiten", - "retry": "Opnieuw", - "add": "Rol toevoegen" - }, - "validation": { - "name_required": "Rolnaam is verplicht", - "perm_required": "Selecteer minimaal één permissie" - }, - "columns": { - "id": "ID", - "name": "Naam", - "role_type": "Type", - "permissions": "Permissies", - "created_at": "Gemaakt op", - "updated_at": "Bijgewerkt op" - }, - "placeholder": { - "filter": "Zoek rollen..." - }, - "delete": { - "dialog_title": "Rol verwijderen", - "warning_text": "U staat op het punt de rol {{name}} (ID: {{id}}) definitief te verwijderen.", - "irreversible": "Deze actie kan niet ongedaan worden gemaakt.", - "confirm_label": "Typ de rol-ID ter bevestiging:", - "placeholder": "Typ \"{{id}}\"", - "alert_title": "Waarschuwing: Definitieve actie.", - "alert_desc": "Het verwijderen van deze rol verwijdert deze bij alle toegewezen gebruikers.", - "confirm_btn": "Rol verwijderen", - "deleting": "Verwijderen...", - "success_title": "Rol verwijderd", - "success_desc": "De rol \"{{name}}\" is verwijderd.", - "error_title": "Verwijderen mislukt", - "error_fallback": "Kon de rol niet verwijderen." - }, - "details": { - "title": "Permissies: {{name}}", - "unknown": "Onbekende rol", - "role_badge": "{{type}} rol", - "desc_global": "Globaal beheer en systeemtoegang.", - "desc_account": "Toegang en data-acties voor individuele accounts.", - "close_btn": "Sluiten", - "view_permissions": "Details bekijken" - }, - "empty": { - "title": "Geen rollen gevonden", - "desc": "U heeft nog geen aangepaste rollen gemaakt." - } - }, - "profile": { - "avatar_alt": "Avatar", - "menu": { - "profile": "Profiel", - "settings": "Instellingen", - "sign_out": "Uitloggen" - } - }, - "sign_out": { - "title": "Uitloggen", - "desc": "Weet je zeker dat je wilt uitloggen? Je moet opnieuw inloggen om toegang te krijgen tot je account.", - "confirm": "Uitloggen" - }, - "restore_message": { - "title": "Enkel bericht herstellen", - "bulkTitle": "Meerdere berichten herstellen", - "bulkWarning": "Let op: berichten worden hersteld in hun oorspronkelijke mappen.", - "accountsInvolved": "Betrokken accounts", - "summary": "Hersteldetails", - "messages": "berichten", - "desc": "Deze actie zal de geselecteerde berichten opnieuw uploaden vanuit Bichon en ze herstellen in de bijbehorende mailboxen op de IMAP-server.", - "confirm": "Herstel uitvoeren", - "restore_to_imap": "Bericht herstellen", - "success": "Herstel geslaagd", - "successDesc": "De geselecteerde berichten zijn succesvol hersteld op de IMAP-server.", - "failed": "Herstel mislukt", - "failedTitle": "Herstelfout" - }, - "time": { - "label": "Tijd", - "since": "Sinds", - "before": "Voor", - "recent_range": "Recente periode (sinds...)", - "historical": "Historische periode (voor...)", - "absolute_range": "Absolute datumbereik", - "last_day": "Laatste 1 dag", - "last_days": "Laatste {{count}} dagen", - "last_months": "Laatste {{count}} maanden", - "over_years_ago": "{{count}} {{unit}} geleden", - "year": "jaar", - "years": "jaar", - "recent_prefix": "Recent:", - "days_ago_to_now": "dagen geleden tot nu", - "apply": "Toepassen", - "start_date": "Startdatum", - "end_date": "Einddatum", - "clear_filters": "Tijdfilters wissen", - "format": "yyyy-MM-dd" - }, - "tag": { - "label": "Tags", - "search_placeholder": "Tags zoeken...", - "clear_all": "Alle tags wissen", - "no_tags_found": "Geen tags gevonden" - }, - "search_accounts": { - "label": "E-mailaccounts", - "search_placeholder": "E-mailaccounts zoeken...", - "clear_accounts": "Geselecteerde accounts wissen", - "no_accounts_found": "Geen accounts gevonden" - }, - "search_mailbox": { - "label": "Mailboxen", - "search_placeholder": "Mailboxen zoeken", - "clear_mailboxes": "Geselecteerde mappen wissen", - "select_account_first": "Selecteer eerst een e-mailaccount", - "no_mailbox_found": "Geen mailbox gevonden" - }, - "search_contacts": { - "label": "Contacten", - "label_with_count": "Contacten ({{count}})", - "any": "Alle", - "search_placeholder": "{{field}} zoeken...", - "reset_all": "Alle contacten resetten", - "no_contact_found": "Geen contacten gevonden", - "loading": "Bezig met laden...", - "showing_limit": "Alleen de eerste 100 resultaten • Totaal {{total}}" - }, - "search_more": { - "trigger_label": "Geavanceerd", - "title": "Geavanceerde filters", - "reset": "Resetten", - "has_attachment": "Bevat bijlage", - "attachment_name_label": "Bijlagenaam", - "attachment_name_placeholder": "Bijv.: invoice.pdf", - "message_size_label": "Berichtgrootte", - "message_id_label": "Originele Message-ID", - "message_id_description": "Zoeken via de Message-ID in de e-mailheader", - "apply": "Filters toepassen", - "size_presets": { - "any": "Elke grootte", - "tiny": "Zeer klein (< 15 KB)", - "small": "Klein (< 2 MB)", - "medium": "Gemiddeld (2 – 10 MB)", - "large": "Groot (10 – 20 MB)", - "huge": "Zeer groot (> 20 MB)" - }, - "any": "Alle", - "search_placeholder": "Zoek {{field}}...", - "extension": "Bestandsextensie", - "category": "Bijlagecategorie", - "content_types": "Specifiek type" - }, - "search_view": { - "button_label": "Weergave", - "menu_title": "Kolominstellingen" - }, - "search_reset": { - "label": "Resetten", - "tooltip": "Alle filters wissen" - }, - "search_input": { - "placeholder": "E-mails zoeken... (Regex ondersteund)", - "button": "Zoeken", - "recent_title": "Recente zoekopdrachten", - "clear_history": "Geschiedenis wissen", - "no_history": "Geen zoekgeschiedenis", - "all": "Alle velden", - "all_fields_desc": "Zoekt in onderwerp, tekst, afzender en ontvangers", - "subject": "Onderwerp", - "body": "Inhoud" + "name_required": "Rolnaam is verplicht", + "perm_required": "Selecteer minimaal één permissie" } + }, + "search": { + "account": "Account", + "addEmailAccount": "E-mailaccount Toevoegen", + "addTags": { + "cancel": "Annuleren", + "createHint": "Nieuwe tag aanmaken: {{tag}}", + "invalidTitle": "Ongeldige Tag", + "none": "Nog geen tags toegevoegd", + "save": "Opslaan", + "saving": "Bezig met opslaan...", + "searchPlaceholder": "Zoek of maak tag...", + "selectedCount": "{{count}} tags geselecteerd", + "title": "Tags Bewerken", + "tryAgain": "Probeer het later opnieuw", + "updateFailedTitle": "Bijwerken Mislukt", + "updatedDesc": "Tags zijn succesvol bijgewerkt", + "updatedTitle": "Tags Bijgewerkt" + }, + "adjustSearch": "Probeer uw zoekcriteria aan te passen of de filters te wissen.", + "advanced": "Geavanceerd", + "advancedFilters": "Geavanceerde Filters", + "any": "Alle", + "attachmentName": "Naam Bijlage", + "attachmentsSize": "Bijlagen & Grootte", + "bcc": "BCC", + "before": "Voor:", + "bulkActions": { + "ariaLabel": "{{count}} berichten geselecteerd. Actiebalk", + "clear": "Selectie wissen", + "delete": "Verwijderen", + "deleteDesc": "Geselecteerde berichten verwijderen", + "manageTags": "Tags beheren", + "selected": "{{count}} geselecteerd" + }, + "cc": "CC", + "clear": "Wissen", + "date": "Datum", + "dateRange": "Datumbereik", + "delete": { + "confirmButton": "Verwijderen", + "confirmDetail": "Dit kan niet ongedaan worden gemaakt.", + "confirmPrefix": "Weet u zeker dat u", + "countLabel": "{{count}} bericht(en) wilt verwijderen?", + "errorTitle": "Verwijderen mislukt", + "successDesc": "Berichten succesvol verwijderd.", + "successTitle": "Verwijderd", + "title": "Berichten verwijderen", + "warningDesc": "Berichten worden definitief verwijderd.", + "warningTitle": "Waarschuwing" + }, + "editTag": "Tag Bewerken", + "endDate": "Einddatum", + "from": "Van", + "fullTextMultiAccount": "Volledige tekst · Multi-account · Geavanceerde filters", + "hasAttachment": "Heeft Bijlage", + "huge": "Zeer groot (≥20 MB)", + "keyword": "Trefwoord", + "large": "Groot (10 - 20 MB)", + "mailbox": "Postvak In", + "maxSize": "Max Grootte", + "maximumBytes": "Maximum (Bytes)", + "medium": "Middelgroot (2 - 10 MB)", + "messageId": "Bericht ID", + "minSize": "Min Grootte", + "minimumBytes": "Minimum (Bytes)", + "no": "Nee", + "noActiveEmailAccount": "Geen actief e-mailaccount.", + "noEmailsFound": "Geen e-mails gevonden", + "noMailboxSelectAccount": "Geen mailbox. Selecteer eerst een account.", + "originalMessageIdHeader": "Oorspronkelijke e-mail Message-ID header", + "pleaseSelectAtLeastOne": "Selecteer ten minste één zoekcriterium", + "preview": "Voorbeeld", + "recipient": "Ontvanger", + "searchArchivedEmails": "Gearchiveerde E-mails Zoeken", + "searchButton": "Zoeken", + "searchInSubjectBody": "Zoek in onderwerp, tekst, bijlagen...", + "searching": "Bezig met zoeken, even geduld alstublieft…", + "searchingButton": "Bezig met zoeken...", + "selectAccount": "Selecteer account", + "selectDate": "Selecteer een datum", + "selectMailbox": "Selecteer mailbox", + "sender": "Afzender", + "senderRecipients": "Afzender / Ontvangers", + "since": "Sinds:", + "size": "Grootte", + "sizeDescription": "De grootte verwijst naar de totale e-mailgrootte, inclusief bijlagen.", + "small": "Klein (<2 MB)", + "sort": "Sorteren", + "source": "Bron", + "startDate": "Startdatum", + "startSearching": "Begin met het invoeren van een trefwoord, afzender of gebruik geavanceerde filters.", + "subject": "Onderwerp", + "tagFilter": "Tag Filter", + "thread": { + "empty": "Geen berichten in deze draad", + "error": "Laden van draad mislukt", + "invalidDate": "Ongeldige datum", + "loadMore": "Meer laden", + "loadingMore": "Laden...", + "noSubject": "(Geen onderwerp)", + "title": "Draad · {{count}} berichten" + }, + "tiny": "Zeer klein (<15 KB)", + "title": "Zoeken", + "to": "Aan", + "updateTags": { + "actionAdd": "Toevoegen", + "actionOverwrite": "Overschrijven", + "actionRemove": "Verwijderen", + "cancel": "Annuleren", + "createHint": "Druk op Enter om nieuwe tag te maken: \"{{tag}}\"", + "invalidTitle": "Ongeldige tag", + "none": "Geen tags geselecteerd", + "overwriteWarning": "Waarschuwing: dit overschrijft alle bestaande tags op de geselecteerde items.", + "savingAdd": "Toevoegen...", + "savingOverwrite": "Overschrijven...", + "savingRemove": "Verwijderen...", + "searchPlaceholder": "Zoek of maak nieuwe tag...", + "selectedCount": "{{count}} tag(s) worden toegepast", + "submitAdd": "Tags toevoegen", + "submitOverwrite": "Tags overschrijven", + "submitRemove": "Tags verwijderen", + "title": "Tags bijwerken", + "tryAgain": "Probeer het later opnieuw.", + "updateFailedTitle": "Bijwerken mislukt", + "updatedDesc": "Tags zijn succesvol bijgewerkt.", + "updatedTitle": "Tags bijgewerkt" + }, + "yes": "Ja" + }, + "search_accounts": { + "clear_accounts": "Geselecteerde accounts wissen", + "label": "E-mailaccounts", + "no_accounts_found": "Geen accounts gevonden", + "search_placeholder": "E-mailaccounts zoeken..." + }, + "search_contacts": { + "any": "Alle", + "label": "Contacten", + "label_with_count": "Contacten ({{count}})", + "loading": "Bezig met laden...", + "no_contact_found": "Geen contacten gevonden", + "reset_all": "Alle contacten resetten", + "search_placeholder": "{{field}} zoeken...", + "showing_limit": "Alleen de eerste 100 resultaten • Totaal {{total}}" + }, + "search_input": { + "all": "Alle velden", + "all_fields_desc": "Zoekt in onderwerp, tekst, afzender en ontvangers", + "body": "Inhoud", + "button": "Zoeken", + "clear_history": "Geschiedenis wissen", + "no_history": "Geen zoekgeschiedenis", + "placeholder": "Zoek e-mails (gebruik \" \" voor woordgroepen)", + "recent_title": "Recente zoekopdrachten", + "subject": "Onderwerp" + }, + "search_mailbox": { + "clear_mailboxes": "Geselecteerde mappen wissen", + "label": "Mailboxen", + "no_mailbox_found": "Geen mailbox gevonden", + "search_placeholder": "Mailboxen zoeken", + "select_account_first": "Selecteer eerst een e-mailaccount" + }, + "search_more": { + "any": "Alle", + "apply": "Filters toepassen", + "attachment_name_label": "Bijlagenaam", + "attachment_name_placeholder": "Bijv.: invoice.pdf", + "category": "Bijlagecategorie", + "content_type": "Bestandstype", + "extension": "Bestandsextensie", + "has_attachment": "Bevat bijlage", + "is_message": "Bijlage in e-mail-formaat", + "is_message_desc": "Deze bijlage is een e-mailbestand, bijvoorbeeld een .eml-bestand.", + "message_id_description": "Zoeken via de Message-ID in de e-mailheader", + "message_id_label": "Originele Message-ID", + "message_size_label": "Berichtgrootte", + "reset": "Resetten", + "search_placeholder": "Zoek {{field}}...", + "size_presets": { + "any": "Elke grootte", + "huge": "Zeer groot (> 20 MB)", + "large": "Groot (10 – 20 MB)", + "medium": "Gemiddeld (2 – 10 MB)", + "small": "Klein (< 2 MB)", + "tiny": "Zeer klein (< 15 KB)" + }, + "title": "Geavanceerde filters", + "trigger_label": "Geavanceerd" + }, + "search_reset": { + "label": "Resetten", + "tooltip": "Alle filters wissen" + }, + "search_view": { + "button_label": "Weergave", + "menu_title": "Kolominstellingen" + }, + "settings": { + "accounts": "Accounts", + "acl": "Acl", + "actions": "Acties", + "add": "Toevoegen", + "addNewProxyHere": "Voeg hier een nieuwe Proxy toe. ", + "adding": "Bezig met toevoegen...", + "appearance": { + "button": { + "update": "Voorkeuren bijwerken" + }, + "command": { + "no_results": "Geen taal gevonden.", + "search": "Taal zoeken..." + }, + "description": { + "language": "Selecteer de taal voor de webinterface.", + "theme": "Kies tussen de lichte of donkere modus voor de interface." + }, + "field": { + "language": "Interfacetaal", + "theme": "Interfacethema" + }, + "placeholder": { + "select_language": "Selecteer taal" + }, + "theme": { + "dark": "Donker", + "light": "Licht" + }, + "title": "Uiterlijk", + "validation": { + "language": { + "required": "Selecteer een taal." + }, + "theme": { + "required": "Selecteer een thema." + } + } + }, + "authUrl": "Auth Url", + "changePasswordForFutureLogins": "Wijzig wachtwoord voor toekomstige logins.", + "confirmReset": "Reset Bevestigen", + "createdAt": "Aangemaakt Op", + "delete": "Verwijderen", + "description": "Beschrijving", + "edit": "Bewerken", + "enabled": "Ingeschakeld", + "enterNewRootPassword": "Voer nieuw root-wachtwoord in", + "enterProxyIdToConfirmDeletion": "Voer Proxy Id in om verwijdering te bevestigen.", + "failedToCopyText": "Kopiëren van tekst mislukt", + "filterAccessToken": "Filter toegangstoken...", + "filterAccount": "Filter account...", + "filterOauth2": "Filter OAuth2...", + "filterProxy": "Filter Proxy...", + "general": "Algemeen", + "generateNewToken": "Genereer nieuw token, het oude verloopt onmiddellijk.", + "host": "Host", + "id": "Id", + "invalidPassword": "Ongeldig wachtwoord", + "lastAccess": "Laatste Toegang", + "manageRootTokenAndPassword": "Beheer root-token en wachtwoord veilig.", + "name": "Naam", + "noProxies": "Geen Proxy's", + "noProxiesDesc": "U heeft nog geen proxy-configuraties toegevoegd. Voeg er een toe om proxy-functies te gebruiken.", + "password": "Wachtwoord", + "pleaseUseAnIpAddressForBetterReliability": "Gebruik alstublieft een IP-adres (bv. 127.0.0.1) in plaats van een hostname of domein voor betere betrouwbaarheid.", + "port": "Poort", + "profile": { + "account": { + "id": "Account-ID: {{id}}" + }, + "avatarAlt": "Avatar", + "button": { + "permissions": "Rechten", + "update_profile": "Profiel bijwerken", + "view_global_permissions": "Globale rechten bekijken" + }, + "field": { + "email": "E-mail", + "password": "Wachtwoord", + "username": "Gebruikersnaam" + }, + "loadError": "Kan gebruikersinformatie niet laden.", + "maxSize": "Maximaal {{size}}", + "placeholder": { + "password_keep": "Laat leeg om het huidige wachtwoord te behouden" + }, + "removeAvatar": "Avatar verwijderen", + "section": { + "accounts": "{{count}} gekoppelde accounts", + "roles": "Rollen" + }, + "toast": { + "update_failed": "Bijwerken van profiel mislukt", + "updated": "Profiel succesvol bijgewerkt" + }, + "uploadError": "Fout bij uploaden van bestand", + "uploadTitle": "Avatar uploaden", + "validation": { + "email": { + "invalid": "Voer een geldig e-mailadres in", + "required": "E-mail is verplicht" + }, + "password": { + "max": "Wachtwoord mag maximaal 256 tekens bevatten", + "min": "Wachtwoord moet minimaal 8 tekens bevatten" + }, + "username": { + "max": "Gebruikersnaam mag maximaal 32 tekens bevatten", + "min": "Gebruikersnaam moet minimaal 5 tekens bevatten", + "required": "Gebruikersnaam is verplicht" + } + } + }, + "proxy": "Proxy", + "proxyUpdateOrAddFailed": "{{action}} mislukt, probeer het later opnieuw", + "reset": "Resetten", + "resetRootPassword": "Root Wachtwoord Resetten", + "resetRootToken": "Root Token Resetten", + "root": "Root", + "rootAccessManagement": "Root Toegangsbeheer", + "rootDesc": "Beheer root-toegangsgegevens, inclusief token en wachtwoord.", + "rootPasswordMustBeAtLeast6Characters": "Het root-wachtwoord moet ten minste 6 tekens lang zijn.", + "rootTitle": "Root", + "selectAll": "Alles selecteren", + "sidebar": { + "apiTokens": "API-tokens", + "configurations": "Systeemconfiguraties", + "profile": "Profiel", + "proxy": "Netwerkproxy" + }, + "theRootPasswordHasBeenReset": "Het root-wachtwoord is gereset", + "theRootTokenHasBeenReset": "Het root-token is gereset", + "theme": "Thema", + "title": "Instellingen", + "token": "Token", + "tokenUrl": "Token Url", + "type": "Type", + "updateTheProxyHere": "Werk de Proxy hier bij. ", + "updatedAt": "Bijgewerkt Op", + "url": "Url", + "useNewPasswordForNextLogin": "Gebruik het nieuwe wachtwoord voor uw volgende login.", + "useProxy": "Gebruik Proxy", + "username": "Gebruikersnaam", + "youAreAboutToResetTheRootPassword": "U staat op het punt het root-wachtwoord te resetten. Zorg ervoor dat u het veilig opslaat.", + "youAreAboutToResetTheRootToken": "U staat op het punt het root-token te resetten. Deze actie kan niet ongedaan worden gemaakt.", + "yourLoginInformationHasBeenUpdated": "Uw inloginformatie is bijgewerkt. U hoeft niet opnieuw in te loggen.", + "yourProxyHasBeenSuccessfully": "Uw Proxy is succesvol {{action}}." + }, + "sign_out": { + "confirm": "Uitloggen", + "desc": "Weet je zeker dat je wilt uitloggen? Je moet opnieuw inloggen om toegang te krijgen tot je account.", + "title": "Uitloggen" + }, + "systemConfig": { + "pageDescription": "Deze parameters worden geïnitialiseerd via CLI-flags of omgevingsvariabelen. Ze zijn alleen-lezen.", + "pageTitle": "Systeemconfiguraties", + "sections": { + "cors": { + "desc": "Cross-origin toegangsregels", + "title": "CORS" + }, + "logging": { + "desc": "Gedrag van log-output", + "title": "Logging" + }, + "network": { + "desc": "HTTP en publieke toegang", + "title": "Netwerk" + }, + "performance": { + "desc": "Gelijktijdigheid & compressie", + "title": "Prestaties" + }, + "security": { + "desc": "Authenticatie & encryptie", + "title": "Beveiliging" + }, + "smtp": { + "desc": "Instellingen voor inkomende e-mailontvangst voor realtime archivering", + "title": "SMTP-server" + }, + "storage": { + "desc": "Databasepaden en limieten", + "title": "Opslag & Cache" + } + }, + "status": { + "auto": "Auto", + "configured": "Geconfigureerd", + "disabled": "Uitgeschakeld", + "enabled": "Ingeschakeld", + "missing": "Ontbreekt", + "notSet": "Niet ingesteld" + } + }, + "table": { + "asc": "Oplopend", + "delete": "Verwijderen", + "desc": "Aflopend", + "edit": "Bewerken", + "hide": "Verbergen", + "loading": "Laden...", + "noResults": "Geen resultaten gevonden", + "of": "van", + "page": "Pagina", + "pagination": { + "first": "Eerste pagina", + "fixed_page_size": "{{size}} rijen per pagina.", + "last": "Laatste pagina", + "next": "Volgende pagina", + "page_info": "Pagina {{page}} van {{total}}", + "previous": "Vorige pagina", + "rows_per_page": "Rijen per pagina", + "selected": "{{selected}} van {{total}} rij(en) geselecteerd." + }, + "results": "resultaten", + "rowsPerPage": "Rijen per pagina", + "showing": "Toont", + "to": "tot" + }, + "tag": { + "clear_all": "Alle tags wissen", + "label": "Tags", + "no_tags_found": "Geen tags gevonden", + "search_placeholder": "Tags zoeken..." + }, + "time": { + "absolute_range": "Absolute datumbereik", + "apply": "Toepassen", + "before": "Voor", + "clear_filters": "Tijdfilters wissen", + "days_ago_to_now": "dagen geleden tot nu", + "end_date": "Einddatum", + "format": "yyyy-MM-dd", + "historical": "Historische periode (voor...)", + "label": "Tijd", + "last_day": "Laatste 1 dag", + "last_days": "Laatste {{count}} dagen", + "last_months": "Laatste {{count}} maanden", + "over_years_ago": "{{count}} {{unit}} geleden", + "recent_prefix": "Recent:", + "recent_range": "Recente periode (sinds...)", + "since": "Sinds", + "start_date": "Startdatum", + "year": "jaar", + "years": "jaar" + }, + "users": { + "actions": { + "api_tokens": "API-tokens", + "buttons": { + "add_account": "Account toevoegen", + "create": "Gebruiker aanmaken", + "update": "Gebruiker bijwerken" + }, + "delete": { + "alert_desc": "De gebruiker en alle bijbehorende data worden gewist.", + "alert_title": "Waarschuwing: Definitieve actie.", + "button_confirm": "Gebruiker verwijderen", + "button_deleting": "Verwijderen...", + "confirm_msg": "U staat op het punt gebruiker {{name}} (ID: {{id}}) definitief te verwijderen.", + "input_label": "Typ de gebruikers-ID ter bevestiging:", + "irreversible": "Deze actie is onherroepelijk.", + "placeholder": "Typ \"{{id}}\"", + "title": "Gebruiker verwijderen", + "toast": { + "failed_fallback": "Kon de gebruiker niet verwijderen.", + "failed_title": "Verwijderen mislukt", + "success_desc": "De gebruiker \"{{name}}\" is verwijderd.", + "success_title": "Gebruiker verwijderd" + } + }, + "dialog": { + "create_title": "Nieuwe gebruiker aanmaken", + "edit_title": "Gebruiker bewerken: {{name}}", + "subtitle": "Configureer identiteit, toegangsniveaus en beleid." + }, + "fields": { + "assign_role": "Rol toewijzen", + "burst_interval": "Burst Interval (sec)", + "description": "Beschrijving (optioneel)", + "description_hint": "Interne notities (max 256 tekens).", + "description_placeholder": "Notities over deze gebruiker...", + "email": "E-mailadres", + "email_hint": "Primair contact en meldingen.", + "global_roles_hint": "Wijs systeempermissies toe.", + "ip_whitelist": "IP Whitelist", + "ip_whitelist_hint": "Login beperken tot deze IP's (één per regel).", + "password": "Wachtwoord", + "password_hint_create": "Veilig wachtwoord voor eerste installatie.", + "password_hint_edit": "Alleen invullen bij wijziging.", + "password_placeholder_create": "Minimaal 8 tekens", + "password_placeholder_edit": "Leeg laten om huidige te behouden", + "rate_quota": "Rate Quota", + "select_account": "Account kiezen", + "username": "Gebruikersnaam", + "username_hint": "Unieke ID voor login." + }, + "placeholder": { + "filter": "Zoek gebruikers..." + }, + "schema": { + "account_required": "Selecteer een account", + "description_max": "Beschrijving max 256 tekens", + "email_invalid": "Voer een geldig e-mailadres in", + "email_required": "E-mail is verplicht", + "global_role_required": "Wijs minimaal één globale rol toe", + "ip_invalid": "Ongeldig IP-adres gedetecteerd", + "password_max": "Maximaal 256 tekens", + "password_min": "Minimaal 8 tekens", + "password_required": "Wachtwoord is verplicht", + "role_required": "Selecteer een rol", + "username_max": "Maximaal 32 tekens", + "username_min": "Minimaal 3 tekens", + "username_required": "Gebruikersnaam is verplicht" + }, + "sections": { + "basic": "Basisidentiteit", + "global": "Globale permissies", + "mail_access": "E-mailtoegangsbeheer", + "mail_access_subtitle": "E-mailaccounts die deze gebruiker mag beheren.", + "policy": "Beleid" + }, + "states": { + "full_access": "Volledige toegangsmodus", + "full_access_desc": "Administrators hebben automatisch toegang tot alle accounts.", + "no_accounts": "Geen specifieke accounts toegewezen.", + "security_disabled": "Beveiligingsbeleid is uitgeschakeld." + }, + "tabs": { + "general": "Algemeen", + "permissions": "Accountpermissies", + "security": "Beveiliging & ACL" + }, + "toast": { + "created": "Gebruiker aangemaakt", + "updated": "Gebruiker bijgewerkt" + } + }, + "api_tokens": { + "button": { + "generate": "Nieuwe token genereren" + }, + "delete": { + "confirm_button": "Token verwijderen", + "confirm_label": "Typ {{word}} hieronder om te bevestigen:", + "confirm_placeholder": "Typ \"{{word}}\" ter bevestiging", + "deleting": "Verwijderen...", + "desc": "U staat op het punt deze API-token definitief te verwijderen", + "irreversible": "Deze actie kan niet ongedaan worden gemaakt. Applicaties die deze token gebruiken, verliezen direct toegang.", + "prefix": "Token-prefix", + "title": "API-token verwijderen", + "warning_desc": "Scripts of diensten die deze token gebruiken zullen falen. Controleer of uw systemen zijn bijgewerkt.", + "warning_title": "Waarschuwing" + }, + "empty": { + "description": "Er zijn nog geen API-tokens gegenereerd in het systeem.", + "title": "Geen API-tokens gevonden" + }, + "table": { + "api_key": "API-sleutel", + "created": "Aangemaakt", + "expired": "Verlopen", + "expires_at": "Verloopt op", + "last_used": "Laatst gebruikt", + "name": "Naam", + "never": "Nooit", + "owner": "Eigenaar", + "permanent": "Permanent", + "type": "Type", + "unnamed": "Naamloze token", + "web_ui": "Web UI" + }, + "toast": { + "delete_failed": "Kon de token niet verwijderen, probeer het opnieuw.", + "delete_failed_title": "Verwijderen mislukt", + "deleted_desc": "De token \"{{name}}\" is succesvol verwijderd.", + "deleted_title": "API-token verwijderd" + }, + "toolbar": { + "search_placeholder": "Zoeken op naam, eigenaar of token..." + }, + "unnamed": "Naamloze token" + }, + "buttons": { + "add": "Gebruiker toevoegen", + "add_new": "Nieuwe gebruiker" + }, + "columns": { + "actions": "Acties", + "avatar": "Avatar", + "created_at": "Gemaakt op", + "email": "E-mailadres", + "id": "ID", + "roles": "Rollen & permissies", + "updated_at": "Bijgewerkt op", + "username": "Gebruikersnaam" + }, + "empty": { + "description": "Klik op de knop hieronder om uw eerste gebruiker toe te voegen.", + "title": "Geen gebruikers gevonden" + }, + "nav": { + "api_tokens": "API-tokens", + "roles": "Rollen", + "users": "Gebruikers" + }, + "tokens": { + "dialog": { + "create_title": "Toegangstoken aanmaken", + "description": "Klik op opslaan als u klaar bent.", + "edit_title": "Toegangstoken bewerken" + }, + "error": { + "fallback": "Bewerking mislukt, probeer het later opnieuw." + }, + "expire_options": { + "1_day": "1 dag", + "30_days": "30 dagen", + "7_days": "7 dagen", + "never": "Verloopt nooit" + }, + "fields": { + "expire_hint": "De token verloopt automatisch na de gekozen tijd.", + "expire_label": "Vervalsetermijn", + "expire_placeholder": "Kies termijn", + "name_hint": "Optioneel · Max 32 tekens", + "name_label": "Naam", + "name_placeholder": "Geef de token een korte naam" + }, + "schema": { + "expire_int": "Moet een geheel getal zijn", + "expire_number": "Moet een getal zijn", + "expire_positive": "Moet groter zijn dan 0", + "name_max": "Max 32 tekens" + }, + "toast": { + "create_failed_title": "Aanmaken mislukt", + "create_success_desc": "Toegangstoken succesvol aangemaakt.", + "create_success_title": "Token aangemaakt", + "update_failed_title": "Update mislukt", + "update_success_desc": "Toegangstoken succesvol bijgewerkt.", + "update_success_title": "Token bijgewerkt" + } + }, + "tokens_action": { + "buttons": { + "add": "Token toevoegen" + }, + "delete_dialog": { + "description": "Deze actie kan niet ongedaan worden gemaakt.", + "title": "Toegangstoken verwijderen?" + }, + "dialog": { + "description": "Beheer API-tokens voor deze gebruiker.", + "title": "API-tokens" + }, + "empty": { + "description": "Deze gebruiker heeft momenteel geen API-tokens.", + "title": "Geen API-tokens" + }, + "list": { + "button_delete": "Token verwijderen", + "expires_on_brief": "Verloopt op {{date}}", + "label_created": "Aangemaakt op", + "label_expires_at": "Verloopt op", + "label_last_used": "Laatst gebruikt", + "label_token": "Token", + "never": "Nooit", + "never_expires": "Verloopt nooit", + "status_active": "Actief", + "status_expired": "Verlopen", + "unnamed_token": "Naamloze token" + } + } + }, + "validation": { + "emailRequired": "E-mail is vereist", + "folderLimitMustBeAtLeast100": "Mappenlimiet moet ten minste 100 zijn", + "folderLimitMustBeNumber": "Mappenlimiet moet een nummer zijn", + "imapHostCannotBeEmpty": "IMAP host mag niet leeg zijn", + "imapHostRequired": "IMAP host is vereist", + "imapPortMustBeLessThan65536": "IMAP poort moet kleiner zijn dan 65536", + "imapPortMustBePositive": "IMAP poort moet een positief geheel getal zijn", + "incrementalSyncMustBeAtLeast10": "Incrementaal sync interval moet ten minste 10 minuten zijn", + "incrementalSyncMustBeNumber": "Incrementaal sync interval moet een nummer zijn", + "invalidEmail": "Ongeldig e-mailadres", + "invalidUrl": "Ongeldige URL", + "passwordMinLength": "Wachtwoord moet ten minste {{min}} tekens lang zijn", + "passwordRequired": "Wachtwoord is vereist wanneer de authenticatiemethode Wachtwoord is", + "pleaseEnterPassword": "Voer uw wachtwoord in", + "pleaseEnterUsernameOrEmail": "Voer alstublieft uw gebruikersnaam of e-mailadres in", + "required": "Dit veld is verplicht", + "singleRequestBatchSizeMustBeNumber": "Batch‑grootte moet een nummer zijn", + "singleRequestBatchSizeTooLarge": "Batch‑grootte moet hoogstens 200 zijn", + "singleRequestBatchSizeTooSmall": "Batch‑grootte moet ten minste 10 zijn" + } } \ No newline at end of file diff --git a/web/src/locales/no.json b/web/src/locales/no.json index 06b8c49..e59ce8e 100644 --- a/web/src/locales/no.json +++ b/web/src/locales/no.json @@ -1,1614 +1,1630 @@ { - "common": { - "submit": "Send inn", + "accessTokens": { + "aListOfIpAddressesAllowed": "En liste over IP-adresser som har tillatelse til å få tilgang til ressursen. Skriv inn én IP-adresse per linje. (Valgfritt)", + "accountId": "Konto-ID", + "accounts": "Kontoer", + "aclRulesForAccessTokens": "ACL-regler for tilgangstokener inkluderer IP-hviteliste-verifisering og håndheving av hastighetsbegrensninger.", + "actions": { + "delete": "Slett", + "edit": "Rediger", + "openMenu": "Åpne meny" + }, + "addNew": "Legg til ny", + "atLeastOneAccountIsRequired": "Minst én konto er påkrevd.", + "create": "Opprett", + "createNewAccessTokenHere": "Opprett nytt tilgangstoken her.", + "created": "Opprettet", + "createdAt": "Opprettet", + "creating": "Oppretter...", + "creationFailed": "Opprettelse mislyktes", + "delete": "Slett", + "describeThePurposeOfTheAccessToken": "Beskriv formålet med tilgangstokenet", + "description": "Administrer dine tilgangstokener, deres tilgangskontroller, IP-hvitelister og hastighetsbegrensninger her.", + "descriptionMustNotExceed255Characters": "Beskrivelse må ikke overstige 255 tegn.", + "edit": "Rediger", + "editToken": "Rediger token", + "enterIntervalInSeconds": "Skriv inn intervall i sekunder, f.eks. 60", + "enterOneIpAddressPerLine": "Skriv inn én IP-adresse per linje, f.eks.:\n192.168.1.1\n192.168.1.2", + "enterQuota": "Skriv inn kvote, f.eks. 100", + "expiresAt": "Utløper", + "filterByEmailAddressOrAccountId": "Filtrer på e-postadresse eller konto-ID...", + "interval": "Intervall", + "intervalMustBeAPositiveInteger": "Intervall må være et positivt heltall.", + "invalidIpAddressesFound": "Ugyldige IP-adresser funnet. Vennligst skriv inn gyldige IPv4- eller IPv6-adresser.", + "name": "Navn", + "noTokens": "Ingen tilgangstokener", + "noTokensDesc": "Du har ikke opprettet noen tilgangstokener ennå. Opprett et for å begynne å bruke API-funksjoner.", + "notUsedYet": "Ikke brukt ennå", + "quota": "Kvote", + "quotaMustBeAPositiveInteger": "Kvote må være et positivt heltall.", + "save": "Lagre", + "saveChanges": "Lagre endringer", + "saving": "Lagrer...", + "selectAccounts": "Velg kontoer", + "selectMultipleAccountsForTheAccessToken": "Velg flere kontoer for tilgangstokenets autorisasjonsomfang.", + "theListOfAccountsThatCanBeQueried": "Listen over kontoer som kan forespørres ved hjelp av et tilgangstoken.", + "theMaximumNumberOfRequestsAllowed": "Maksimalt antall forespørsler tillatt innenfor intervallet. (Valgfritt)", + "theTimeWindowForTheRateLimit": "Tidsvinduet (i sekunder) for hastighetsbegrensningen. (Valgfritt)", + "title": "Tilgangstokener", + "token": "Token", + "updateFailed": "Oppdatering mislyktes", + "updateOrCreationFailed": "{{action}} mislyktes, vennligst prøv igjen senere", + "updateTheAccessTokenHere": "Oppdater tilgangstokenet her.", + "updated": "Oppdatert", + "updating": "Oppdaterer...", + "yourAccessTokenHasBeenSuccessfully": "Ditt tilgangstoken har blitt {{action}}." + }, + "accounts": { + "accessControl": "Tilgangskontroll", + "accessTokenCopiedToClipboard": "Tilgangstoken kopiert til utklippstavlen", + "access_control": { + "buttons": { "cancel": "Avbryt", - "save": "Lagre", - "save_changes": "Lagre endringer", - "delete": "Slett", - "edit": "Rediger", - "search": "Søk", - "add": "Legg til", - "remove": "Fjern", - "create": "Opprett", - "update": "Oppdater", - "confirm": "Bekreft", + "save": "Lagre tildeling" + }, + "description": "Tildel roller og autoriserte brukere til {{email}}", + "role_label": "Tilgangsrolle", + "role_loading": "Laster roller...", + "role_placeholder": "Velg en rolle", + "title": "Tildeling av kontotilgang", + "toast": { + "failed_title": "Tildeling mislyktes", + "success_desc": "Rettigheter er tildelt {{email}}", + "success_title": "Tildeling vellykket" + }, + "user_empty": "Ingen brukere funnet", + "user_label": "Velg autoriserte brukere", + "user_search_placeholder": "Søk etter brukernavn eller e-post...", + "user_selected_count": "Valgt: {{count}} bruker(e)", + "validation": { + "role_required": "Vennligst velg en rolle å tildele", + "user_required": "Vennligst velg minst én bruker" + } + }, + "accountCreated": "Konto opprettet", + "accountCreatedDesc": "Kontoen din har blitt opprettet.", + "accountCreationFailed": "Kontoopprettelse mislyktes", + "accountDetails": "Kontodetaljer", + "accountHasBeenSuccessfully": "Kontoen har blitt {{action}}", + "accountSyncFoldersUpdateFailed": "Oppdatering av synkroniseringsmapper mislyktes", + "accountSyncFoldersUpdated": "Synkroniseringsmapper oppdatert", + "accountUpdateFailed": "Kontooppdatering mislyktes", + "accountUpdated": "Konto oppdatert", + "accountUpdatedDesc": "Kontoen din har blitt oppdatert.", + "actions": "Handlinger", + "addAccount": "Legg til konto", + "addConfiguration": "Legg til konfigurasjon", + "addImap": "Legg til IMAP", + "addNewEmailAccountHere": "Legg til ny e-postkonto her. ", + "addNoSync": "Legg til NoSync", + "allMailFolderSelected": "OBS: Mappen \"All e-post\" er valgt", + "allMailFolderSelectedDesc": "Å velge mapper med attributtet \"All e-post\" (All Mail) vil sannsynligvis føre til duplisering av meldinger som allerede er synkronisert fra mapper som Innboks og Sendt. Dette kan forbruke betydelig mer lagringsplass.", + "allMailSkipped": "Valgte standardmapper. 'All e-post' ble hoppet over for å unngå duplikater.", + "areYouSureYouWantTo": "Er du sikker på at du vil {{action}} denne kontoen?", + "auth": "Autentisering", + "authType": "autentiseringstype", + "autoConfiguring": "Konfigurerer automatisk...", + "beforeRelative": "Last ned kun gamle e-poster", + "beforeRelativeValue": "Last ned e-poster fra {{value}} {{unit}} siden", + "capabilities": "Funksjoner", + "chooseAuthMethod": "Velg autentiseringsmetoden for IMAP.", + "chooseEncryptionMethod": "Velg krypteringsmetoden for IMAP.", + "chooseMailboxesToDownload": "Velg postbokser som skal lastes ned for {{email}}. Nye postbokser lastes ned i neste syklus.", + "clickHere": "klikk her", + "clickSaveWhenDone": "Klikk lagre når du er ferdig.", + "continue": "Fortsett", + "createdAt": "Opprettet", + "creationFailed": "Opprettelse mislyktes, prøv igjen senere", + "dateSelection": "Datovalg", + "dateSince": "Dato siden", + "days": "Dager", + "delete": "Slett", + "description": "Administrer og konfigurer e-postkontoene dine.", + "detail": "Detaljer", + "detailsOfTheOAuth2TokensForTheAccount": "Detaljer om OAuth2-tokenene for kontoen.", + "determinesWhetherThisAccountIsActiveNoSync": "Bestemmer om denne kontoen er aktiv. Hvis den er deaktivert, kan data ikke importeres.", + "disable": "Deaktiver", + "disableAccount": "Deaktiver konto", + "disabled": "Deaktivert", + "downloadAll": "Last ned alle e-poster", + "downloadBatchSize": "Nedlastingsbatchstørrelse", + "downloadBatchSizeDescription": "Antall meldinger hentet per IMAP-forespørsel", + "downloadInterval": "Nedlastingsintervall (minutter)", + "downloadIntervalPlaceholder": "Skriv inn minutter", + "downloadScope": "Nedlastingsstrategi", + "downloadScopeDescription": "Velg hvilke e-poster som skal indekseres og lastes ned.", + "duration": "Varighet", + "edit": "Rediger", + "email": "E-post", + "emailAccountRegistration": "Registrering av e-postkonto", + "emailAccountRegistrationDesc": "Skriv inn e-postadressen din. I de neste stegene konfigurerer du IMAP-detaljer. Vi bruker denne adressen til å automatisk finne IMAP-serverinnstillinger.", + "emailAddress": "E-postadresse", + "emailCannotBeModified": "E-postadressen til kontoen kan ikke endres under redigering.", + "emailPlaceholder": "f.eks. ola.nordmann@eksempel.no", + "enable": "Aktiver", + "enableAccount": "Aktiver konto", + "enabled": "Aktivert", + "enabledDescription": "Avgjør om denne kontoen er aktiv. Hvis den er deaktivert, vil relaterte nedlastinger ikke kjøres.", + "encryption": "kryptering", + "enterPassword": "Skriv inn passordet ditt", + "enterValue": "Vennligst skriv inn en verdi", + "everyMinutes": "hvert {{minutes}} minutt", + "field": "Felt", + "fixed": "Fast", + "folderLimit": "Mappegrense", + "folderLimitDescription": "Begrens antall e-poster som skal synkroniseres per mappe (minimum 100). La stå tomt for ingen grense.", + "folderLimitPlaceholder": "f.eks. 1000", + "folderSync": { + "autoSelectDescendants": "Velg etterkommere automatisk", + "autoSelectParents": "Velg foreldre automatisk", + "batches": "partier", + "collapseAll": "Skjul alle", + "expandAll": "Utvid alle", + "loadingMailboxFolders": "Laster inn postkassemapper…", + "noData": "Ingen data", + "noFolders": "Ingen mapper å synkronisere" + }, + "foldersConfiguredForSync": "{{count}} mappe(r) konfigurert for synkronisering", + "foldersSelected": "{{count}} mappe(r) valgt", + "goBack": "Gå tilbake", + "host": "vert", + "id": "ID", + "imap": "IMAP", + "imapAuthMethod": "IMAP-autentiseringsmetode", + "imapEncryption": "IMAP-kryptering", + "imapHost": "IMAP-vert", + "imapHostPlaceholder": "f.eks. imap.eksempel.no", + "imapPassword": "IMAP-passord", + "imapPort": "IMAP-port", + "imapPortPlaceholder": "f.eks. 993", + "imapProxy": "Bruk en SOCKS5-proxy for IMAP-tilkoblinger.", + "incSync": "Ink. synk", + "lastSync": "Siste synkronisering", + "leaveEmptyToKeepExisting": "La stå tomt for å beholde det eksisterende passordet, eller skriv inn et nytt passord for å oppdatere det.", + "leaveEmptyToKeepPassword": "La stå tomt for å beholde nåværende passord", + "login_name": "Påloggingsnavn", + "minutes": "minutter", + "months": "Måneder", + "moreAccountTypes": "Flere kontotyper", + "mustBeAtLeast1": "Må være minst 1", + "name": "Navn", + "nameDescription": "IMAP-brukernavn. Bruker e-post som standard, eller velg et eget.", + "namePlaceholder": "f.eks. ola.nordmann", + "noAccountConfigurations": "Ingen kontokonfigurasjoner", + "noAccountConfigurationsDesc": "Du har ikke lagt til noen kontokonfigurasjoner ennå. Legg til en for å begynne å bruke kontofunksjoner.", + "noOAuth2Tokens": "Ingen OAuth2-tokener", + "none": "Ingen", + "notAvailable": "i/t", + "oauth2Tokens": "OAuth2-tokener", + "openMenu": "Åpne meny", + "optional": "Valgfritt", + "owner": "Opprettet av", + "password": "passord", + "port": "port", + "recent": "nylig", + "refreshToken": "Oppfriskningstoken", + "refreshTokenCopiedToClipboard": "Oppfriskningstoken kopiert til utklippstavlen", + "relative": "Relativ", + "runningState": { + "account": { + "id": "Konto-ID" + }, + "common": { "close": "Lukk", - "yes": "Ja", - "no": "Nei", - "ok": "OK", - "loading": "Laster...", - "empty": "Tom", - "noData": "Ingen data", - "table": { - "noResults": "Ingen resultater." - }, - "failed": "Mislyktes", - "notFound": "Ikke funnet", - "back": "Tilbake", - "goBack": "Gå tilbake", - "backToHome": "Tilbake til hjem", - "tryAgain": "Prøv igjen", - "more": "Mer", - "actions": "Handlinger", - "filter": "Filtrer", - "reset": "Nullstill", - "clear": "Tøm", - "error": "Feil", - "apply": "Bruk", - "select": "Velg", - "selectAll": "Velg alle", - "deselectAll": "Velg bort alle", - "all": "Alle", - "none": "Ingen", - "showLess": "Vis mindre", - "showMore": "Vis mer...", - "project_description": "Bichon er et open-source-prosjekt.", - "view_on_github_button": "Vis på GitHub", - "op_failed": "Operasjonen mislyktes", - "na": "N/A", - "retry": "Prøv igjen", - "deleting": "Sletter..." - }, - "navigation": { - "home": "Hjem", - "settings": "Innstillinger", - "accounts": "Kontoer", - "dashboard": "Oversikt", - "mailbox": "Postkasse", - "oauth2": "OAuth2", - "accessTokens": "Tilgangstokener", - "apiDocs": "API-dokumentasjon", - "general": "Generelt", - "auth": "Autentisering", - "other": "Annet", - "users": "Systembrukere" - }, - "auth": { - "welcome": "Velkommen til Bichon", - "username": "Brukernavn", - "password": "Passord", - "login": "Logg inn", - "loginFailed": "Innlogging mislyktes", - "invalidPassword": "Ugyldig passord. Vennligst prøv igjen.", - "somethingWentWrong": "Noe gikk galt", - "sessionExpired": "Sesjonen er utløpt!", - "sessionExpiredDesc": "Sesjonen din er avsluttet på grunn av inaktivitet. Vennligst logg inn på nytt for å fortsette.", - "logout": "Logg ut", - "areYouSureYouWantToLogOut": "Er du sikker på at du vil logge ut?", - "youWillNeedToLogInAgain": "Du må logge inn på nytt for å få tilgang til kontoen din." - }, - "errors": { - "pageNotFound": "Oi! Siden ble ikke funnet!", - "pageNotFoundDesc": "Det ser ut til at siden du leter etter ikke eksisterer, eller kan ha blitt fjernet.", - "somethingWentWrong": "Oi! Noe gikk galt :')", - "somethingWentWrongDesc": "Vi beklager ulempen. Vennligst prøv igjen senere.", - "internalServerError": "Intern serverfeil!", - "contentNotModified": "Innholdet er ikke endret!", - "networkError": "Nettverksfeil", - "networkErrorDesc": "Kan ikke koble til serveren. Vennligst sjekk internettforbindelsen din og prøv igjen.", - "forbidden": "Forbudt", - "forbiddenTitle": "Ingen tilgang", - "forbiddenDesc": "Du har ikke nødvendige tillatelser for å vise denne ressursen.", - "unauthorized": "Uautorisert", - "unauthorizedTitle": "Uautorisert tilgang", - "unauthorizedDesc": "Vennligst logg inn med riktig legitimasjon for å få tilgang til denne ressursen.", - "maintenance": "Vedlikehold", - "maintenanceTitle": "Nettstedet er under vedlikehold!", - "maintenanceDesc": "Nettstedet er ikke tilgjengelig for øyeblikket. Vi er snart tilbake på nettet.", - "learnMore": "Lær mer" - }, - "dashboard": { - "title": "Oversikt", - "mailAccounts": "E-postkontoer", - "connected": "Tilkoblet", - "totalEmails": "Totalt antall e-poster", - "syncedLocally": "Synkronisert lokalt", - "totalEmailSize": "Total e-poststørrelse", - "logicalVolume": "Opprinnelig størrelse", - "localDataFiles": "Lokale datafiler", - "actualDiskUsage": "Faktisk diskbruk", - "efficiency": "Lagringseffektivitet", - "saved": "Spart", - "dataStorage": "Datalagring", - "indexSize": "Indeksstørrelse", - "metadataSize": "Metadatastørrelse", - "tantivyDatabase": "Basert på søkemotoren Tantivy", - "dayTrend": "30-dagers trend", - "attachments": "Vedlegg", - "topLists": "Topplister", - "newEmails": "Nye e-poster", - "messageDistribution": "Meldingsfordeling", - "attachmentRatio": "Vedleggsforhold", - "attachmentRatioDesc": "{{percent}}% av e-postene har vedlegg", - "noEmailsSynced": "Ingen e-poster synkronisert ennå", - "withAttachments": "Med vedlegg", - "noAttachments": "Uten vedlegg", - "top10Senders": "Topp 10 avsendere", - "byMessageCount": "Etter meldingsantall", - "sender": "Avsender", - "count": "Antall", - "top10LargestEmails": "Topp 10 største e-poster", - "byMessageSize": "Etter meldingsstørrelse", - "subject": "Emne", - "size": "Størrelse", - "noSubject": "(Uten emne)", - "top10Accounts": "Topp 10 kontoer", - "emails": "E-poster", - "account": "Konto", - "noRecentActivity": "Ingen nylig aktivitet", - "noSendersData": "Ingen avsenderdata", - "noLargeEmails": "Ingen store e-poster", - "noAccountData": "Ingen kontodata", - "systemVersion": "Systemversjon" - }, - "accounts": { - "beforeRelativeValue": "Last ned e-poster fra {{value}} {{unit}} siden", - "sinceRelativeValue": "Last ned e-poster fra de siste", - "downloadBatchSize": "Nedlastingsbatchstørrelse", - "downloadBatchSizeDescription": "Antall meldinger hentet per IMAP-forespørsel", - "downloadScopeDescription": "Velg hvilke e-poster som skal indekseres og lastes ned.", - "downloadScope": "Nedlastingsstrategi", - "selectMode": "Velg filtermodus", - "downloadAll": "Last ned alle e-poster", - "sinceFixed": "Siden spesifikk dato", - "sinceRelative": "Last ned kun nylige e-poster", - "beforeRelative": "Last ned kun gamle e-poster", - "duration": "Varighet", - "unit": "Enhet", - "accessControl": "Tilgangskontroll", - "owner": "Opprettet av", - "access_control": { - "title": "Tildeling av kontotilgang", - "description": "Tildel roller og autoriserte brukere til {{email}}", - "role_label": "Tilgangsrolle", - "role_placeholder": "Velg en rolle", - "role_loading": "Laster roller...", - "user_label": "Velg autoriserte brukere", - "user_search_placeholder": "Søk etter brukernavn eller e-post...", - "user_empty": "Ingen brukere funnet", - "user_selected_count": "Valgt: {{count}} bruker(e)", - "buttons": { - "cancel": "Avbryt", - "save": "Lagre tildeling" - }, - "validation": { - "user_required": "Vennligst velg minst én bruker", - "role_required": "Vennligst velg en rolle å tildele" - }, - "toast": { - "success_title": "Tildeling vellykket", - "success_desc": "Rettigheter er tildelt {{email}}", - "failed_title": "Tildeling mislyktes" - } - }, - "title": "E-postkontoer", - "description": "Administrer og konfigurer e-postkontoene dine.", - "addImap": "Legg til IMAP", - "addNoSync": "Legg til NoSync", - "moreAccountTypes": "Flere kontotyper", - "noAccountConfigurations": "Ingen kontokonfigurasjoner", - "noAccountConfigurationsDesc": "Du har ikke lagt til noen kontokonfigurasjoner ennå. Legg til en for å begynne å bruke kontofunksjoner.", - "addConfiguration": "Legg til konfigurasjon", - "useNoProxy": "Ingen proxy", - "login_name": "Påloggingsnavn", - "name": "Navn", - "email": "E-post", + "folders": "postbokser" + }, + "empty": { + "no_active_download": "Ingen aktiv nedlasting", + "no_errors_current": "Ingen feil i gjeldende økt", + "no_errors_session": "Ingen feil i denne økten", + "no_global_errors": "Ingen globale feil", + "no_history": "Ingen historikk" + }, + "folders": "postbokser", + "latest": "NYEST", + "loading": { + "fetching_account_state": "Henter kontostatus..." + }, + "message": "Melding", + "session": { + "started_at": "Starttid", "status": "Status", - "type": "Type", - "lastSync": "Siste synkronisering", - "actions": "Handlinger", - "edit": "Rediger", - "delete": "Slett", - "detail": "Detaljer", - "selectMailboxes": "Velg postbokser", - "oauth2Tokens": "OAuth2-tokener", - "id": "ID", - "enabled": "Aktivert", - "auth": "Autentisering", - "incSync": "Ink. synk", - "state": "Tilstand", - "createdAt": "Opprettet", - "updatedAt": "Oppdatert", - "openMenu": "Åpne meny", - "emailAccountRegistration": "Registrering av e-postkonto", - "emailAccountRegistrationDesc": "Skriv inn e-postadressen din. I de neste stegene konfigurerer du IMAP-detaljer. Vi bruker denne adressen til å automatisk finne IMAP-serverinnstillinger.", - "emailAddress": "E-postadresse", - "emailPlaceholder": "f.eks. ola.nordmann@eksempel.no", - "namePlaceholder": "f.eks. ola.nordmann", - "optional": "Valgfritt", - "nameDescription": "IMAP-brukernavn. Bruker e-post som standard, eller velg et eget.", - "emailCannotBeModified": "E-postadressen til kontoen kan ikke endres under redigering.", - "addAccount": "Legg til konto", - "updateAccount": "Oppdater konto", - "accountUpdated": "Konto oppdatert", - "accountCreated": "Konto opprettet", - "accountUpdatedDesc": "Kontoen din har blitt oppdatert.", - "accountCreatedDesc": "Kontoen din har blitt opprettet.", - "accountUpdateFailed": "Kontooppdatering mislyktes", - "accountCreationFailed": "Kontoopprettelse mislyktes", - "updateFailed": "Oppdatering mislyktes, prøv igjen senere", - "creationFailed": "Opprettelse mislyktes, prøv igjen senere", - "allMailFolderSelected": "OBS: Mappen \"All e-post\" er valgt", - "accountSyncFoldersUpdated": "Synkroniseringsmapper oppdatert", - "accountSyncFoldersUpdateFailed": "Oppdatering av synkroniseringsmapper mislyktes", - "serverConfiguration": "Serverkonfigurasjon (IMAP)", - "selectedMailboxes": "Valgte postbokser", - "allMailFolderSelectedDesc": "Å velge mapper med attributtet \"All e-post\" (All Mail) vil sannsynligvis føre til duplisering av meldinger som allerede er synkronisert fra mapper som Innboks og Sendt. Dette kan forbruke betydelig mer lagringsplass.", - "allMailSkipped": "Valgte standardmapper. 'All e-post' ble hoppet over for å unngå duplikater.", - "selectAtLeastOneFolder": "Vennligst velg minst én mappe", - "chooseMailboxesToDownload": "Velg postbokser som skal lastes ned for {{email}}. Nye postbokser lastes ned i neste syklus.", - "accountDetails": "Kontodetaljer", - "capabilities": "Funksjoner", - "folderLimit": "Mappegrense", - "everyMinutes": "hvert {{minutes}} minutt", - "foldersConfiguredForSync": "{{count}} mappe(r) konfigurert for synkronisering", - "foldersSelected": "{{count}} mappe(r) valgt", - "imapHost": "IMAP-vert", - "imapHostPlaceholder": "f.eks. imap.eksempel.no", - "imapPort": "IMAP-port", - "imapPortPlaceholder": "f.eks. 993", - "imapEncryption": "IMAP-kryptering", - "selectEncryptionMethod": "Velg en krypteringsmetode", - "chooseEncryptionMethod": "Velg krypteringsmetoden for IMAP.", - "imapAuthMethod": "IMAP-autentiseringsmetode", - "selectAuthMethod": "Velg en autentiseringsmetode", - "chooseAuthMethod": "Velg autentiseringsmetoden for IMAP.", - "imapPassword": "IMAP-passord", - "leaveEmptyToKeepPassword": "La stå tomt for å beholde nåværende passord", - "enterPassword": "Skriv inn passordet ditt", - "leaveEmptyToKeepExisting": "La stå tomt for å beholde det eksisterende passordet, eller skriv inn et nytt passord for å oppdatere det.", - "useProxy": "Bruk Proxy", - "selectProxy": "Velg en proxy", - "downloadInterval": "Nedlastingsintervall (minutter)", - "downloadIntervalPlaceholder": "Skriv inn minutter", - "enabledDescription": "Avgjør om denne kontoen er aktiv. Hvis den er deaktivert, vil relaterte nedlastinger ikke kjøres.", - "dateSince": "Dato siden", - "none": "Ingen", - "fixed": "Fast", - "relative": "Relativ", - "selectDate": "Velg en dato", - "selectUnit": "Velg en enhet", - "days": "Dager", - "months": "Måneder", - "years": "År", - "enterValue": "Vennligst skriv inn en verdi", - "mustBeAtLeast1": "Må være minst 1", - "dateSelection": "Datovalg", - "since": "siden", - "recent": "nylig", - "notAvailable": "i/t", - "host": "vert", - "port": "port", - "encryption": "kryptering", - "authType": "autentiseringstype", - "password": "passord", - "useProxyField": "bruk proxy", - "clickSaveWhenDone": "Klikk lagre når du er ferdig.", - "step": "Trinn {{index}}", - "goBack": "Gå tilbake", - "autoConfiguring": "Konfigurerer automatisk...", - "continue": "Fortsett", - "saveChanges": "Lagre endringer", - "submit": "Send inn", - "field": "Felt", - "value": "Verdi", - "refreshToken": "Oppfriskningstoken", - "accessTokenCopiedToClipboard": "Tilgangstoken kopiert til utklippstavlen", - "refreshTokenCopiedToClipboard": "Oppfriskningstoken kopiert til utklippstavlen", - "noOAuth2Tokens": "Ingen OAuth2-tokener", - "theAccountHasNotCompletedTheAuthorizationProcess": "Kontoen har ikke fullført autorisasjonsprosessen. Vennligst ", - "clickHere": "klikk her", - "toAuthorizeTheAccount": " for å autorisere kontoen.", - "detailsOfTheOAuth2TokensForTheAccount": "Detaljer om OAuth2-tokenene for kontoen.", - "updateTheEmailAccountHere": "Oppdater e-postkontoen her. ", - "addNewEmailAccountHere": "Legg til ny e-postkonto her. ", - "thisAccountIsUsedForIdentificationPurposesOnly": "Denne kontoen brukes kun for identifikasjonsformål og krever ikke synkronisering med en e-postserver. Den hjelper med import av e-postdata.", - "determinesWhetherThisAccountIsActiveNoSync": "Bestemmer om denne kontoen er aktiv. Hvis den er deaktivert, kan data ikke importeres.", - "folderSync": { - "noData": "Ingen data", - "noFolders": "Ingen mapper å synkronisere", - "batches": "partier", - "autoSelectDescendants": "Velg etterkommere automatisk", - "autoSelectParents": "Velg foreldre automatisk", - "expandAll": "Utvid alle", - "collapseAll": "Skjul alle", - "loadingMailboxFolders": "Laster inn postkassemapper…" - }, - "viewDetails": "se detaljer", - "runningState": { - "message": "Melding", - "account": { - "id": "Konto-ID" - }, - "tabs": { - "active_session": "Aktiv økt", - "history": "Historikk", - "global_errors": "Globale feil", - "folders": "Postbokser", - "errors": "Feil" - }, - "loading": { - "fetching_account_state": "Henter kontostatus..." - }, - "empty": { - "no_active_download": "Ingen aktiv nedlasting", - "no_errors_current": "Ingen feil i gjeldende økt", - "no_errors_session": "Ingen feil i denne økten", - "no_global_errors": "Ingen globale feil", - "no_history": "Ingen historikk" - }, - "session": { - "status": "Status", - "trigger": "Trigger", - "started_at": "Starttid" - }, - "common": { - "folders": "postbokser", - "close": "Lukk" - }, - "latest": "NYEST", - "folders": "postbokser" - }, - "steps": { - "complete": "Fullfør", - "emailAddress": "E-postadresse", - "imap": "IMAP", - "syncPreferences": "Synkroniseringspreferanser", - "summary": "Sammendrag" - }, - "imapProxy": "Bruk en SOCKS5-proxy for IMAP-tilkoblinger.", - "syncStartDateDescription": "Definerer startdato for synkronisering – enten spesifikk eller relativ til nå. Tidligere e-poster utelates, {{fixedPart}}.", - "syncAfterDate": "synkroniserer data etter en satt dato", - "syncRecentData": "forskyver synkroniseringsdatoen over tid, og synkroniserer kun nylige data", - "folderLimitDescription": "Begrens antall e-poster som skal synkroniseres per mappe (minimum 100). La stå tomt for ingen grense.", - "folderLimitPlaceholder": "f.eks. 1000", - "imap": "IMAP", - "minutes": "minutter", - "accountHasBeenSuccessfully": "Kontoen har blitt {{action}}", - "enableAccount": "Aktiver konto", - "disableAccount": "Deaktiver konto", - "areYouSureYouWantTo": "Er du sikker på at du vil {{action}} denne kontoen?", - "enable": "Aktiver", - "disable": "Deaktiver", - "thisWillPreventTheAccountFromBeingUsed": "Denne kontoen vil ikke lenger synkronisere data fra IMAP-serveren, men eksisterende data vil fortsatt være tilgjengelige.", - "disabled": "Deaktivert", - "useDangerous": "Stol på hvilken som helst TLS‑sertifikat", - "useDangerousDescription": "Aktiver dette alternativet kun hvis IMAP‑serveren bruker et offentlig CA‑sertifikat eller et selvsignert sertifikat som systemet ditt ikke gjenkjenner. Innstillingen hopper over vanlig sertifikatvalidering, noe som kan utsette deg for man‑in‑the‑middle‑angrep – bruk kun hvis du forstår risikoen." + "trigger": "Trigger" + }, + "tabs": { + "active_session": "Aktiv økt", + "errors": "Feil", + "folders": "Postbokser", + "global_errors": "Globale feil", + "history": "Historikk" + } }, - "mailbox": { - "deleteMailboxDialog": { - "title": "Slett postkassemappe", - "desc": "Er du sikker på at du vil slette denne postkassemappen? Denne handlingen kan ikke angres.", - "warningTitle": "Advarsel", - "warningDesc": "Sletting av denne mappen vil også fjerne alle arkiverte e-poster og undermapper i den permanent.", - "confirm": "Slett permanent", - "successTitle": "Sletting fullført", - "successDesc": "Postkassemappen og innholdet er fjernet.", - "errorTitle": "Sletting mislyktes" - }, - "title": "Postkasse", - "folders": "Mapper", - "messages": "Meldinger", - "noMessages": "Ingen meldinger", - "selectFolder": "Velg en mappe for å se meldinger", - "deleteDialog": { - "title": "Slett e-post", - "desc": "Er du sikker på at du vil slette {{countText}}? Denne handlingen vil slette valgte e-post(er) fra den lokale databasen. E-posten(e) vil bli permanent slettet og kan ikke gjenopprettes.", - "descCountSingle": "denne e-posten", - "descCountMultiple": "disse {{count}} e-postene", - "warningTitle": "Advarsel!", - "warningDesc": "Vennligst vær forsiktig før du fortsetter.", - "confirm": "Slett", - "successTitle": "Meldinger slettet", - "successDesc": "Meldingene har blitt slettet.", - "errorTitle": "Kunne ikke slette meldinger" - }, - "thread": { - "title": "Tråd ({{count}} {{messageLabel}})", - "message": "melding", - "messages": "meldinger", - "noSubject": "(Uten emne)", - "invalidDate": "Ugyldig dato", - "empty": "Ingen meldinger i denne tråden.", - "loadError": "Kunne ikke laste tråd", - "loadingMore": "Laster flere...", - "loadMore": "Last mer" - }, - "bulkActions": { - "ariaLabel": "Massehandlinger for {{count}} valgte {{emailLabel}}", - "email": "e-post", - "emails": "e-poster", - "selected": "valgt", - "clearSelection": "Fjern valg", - "clearSelectionWithKey": "Fjern valg ({{key}})", - "delete": "Slett", - "deleteTooltip": "Slett valgte e-poster" - } + "saveChanges": "Lagre endringer", + "selectAtLeastOneFolder": "Vennligst velg minst én mappe", + "selectAuthMethod": "Velg en autentiseringsmetode", + "selectDate": "Velg en dato", + "selectEncryptionMethod": "Velg en krypteringsmetode", + "selectMailboxes": "Velg postbokser", + "selectMode": "Velg filtermodus", + "selectProxy": "Velg en proxy", + "selectUnit": "Velg en enhet", + "selectedMailboxes": "Valgte postbokser", + "serverConfiguration": "Serverkonfigurasjon (IMAP)", + "since": "siden", + "sinceFixed": "Siden spesifikk dato", + "sinceRelative": "Last ned kun nylige e-poster", + "sinceRelativeValue": "Last ned e-poster fra de siste", + "state": "Tilstand", + "status": "Status", + "step": "Trinn {{index}}", + "steps": { + "complete": "Fullfør", + "emailAddress": "E-postadresse", + "imap": "IMAP", + "summary": "Sammendrag", + "syncPreferences": "Synkroniseringspreferanser" }, - "search": { - "size": "Størrelse", - "any": "Alle", - "tiny": "Svært liten (<15 KB)", - "small": "Liten (<2 MB)", - "medium": "Middels (2 - 10 MB)", - "large": "Stor (10 - 20 MB)", - "huge": "Kjempestor (≥20 MB)", - "sort": "Sorter", - "sizeDescription": "Størrelsen viser til e-postens totale størrelse, inkludert vedlegg.", - "title": "Søk", - "searching": "Søker, vennligst vent…", - "noEmailsFound": "Ingen e-poster funnet", - "startSearching": "Start ved å skrive inn et nøkkelord, avsender eller bruk avanserte filtre.", - "adjustSearch": "Prøv å justere søkekriteriene dine eller tøm filtre.", - "tagFilter": "Etikettfilter", - "from": "Fra", - "to": "Til", - "subject": "Emne", - "date": "Dato", - "editTag": "Rediger etikett", - "keyword": "Nøkkelord", - "sender": "Avsender", - "recipient": "Mottaker", - "hasAttachment": "Har vedlegg", - "yes": "Ja", - "no": "Nei", - "dateRange": "Datointervall", - "startDate": "Startdato", - "endDate": "Sluttdato", - "advancedFilters": "Avanserte filtre", - "searchArchivedEmails": "Søk i arkiverte e-poster", - "fullTextMultiAccount": "Fulltekst · Flerkonto · Avanserte filtre", - "account": "Konto", - "mailbox": "Postkasse", - "selectAccount": "Velg konto", - "selectMailbox": "Velg postkasse", - "noActiveEmailAccount": "Ingen aktiv e-postkonto.", - "addEmailAccount": "Legg til e-postkonto", - "noMailboxSelectAccount": "Ingen postkasse. Vennligst velg en konto først.", - "searchInSubjectBody": "Søk i emne, innhold, vedlegg...", - "searchingButton": "Søker...", - "searchButton": "Søk", - "advanced": "Avansert", - "clear": "Tøm", - "since": "Siden:", - "before": "Før:", - "selectDate": "Velg en dato", - "pleaseSelectAtLeastOne": "Vennligst velg minst ett søkekriterium", - "cc": "Kopi (CC)", - "bcc": "Blindkopi (BCC)", - "attachmentName": "Vedleggsnavn", - "messageId": "Meldings-ID", - "minSize": "Min. størrelse", - "maxSize": "Maks. størrelse", - "senderRecipients": "Avsender / Mottakere", - "attachmentsSize": "Vedlegg og størrelse", - "minimumBytes": "Minimum", - "maximumBytes": "Maksimum", - "originalMessageIdHeader": "Opprinnelig e-post Message-ID header", - "addTags": { - "title": "Rediger etiketter", - "none": "Ingen etiketter lagt til", - "searchPlaceholder": "Søk eller opprett etikett...", - "createHint": "Opprett ny etikett: {{tag}}", - "invalidTitle": "Ugyldig etikett", - "updatedTitle": "Etiketter oppdatert", - "updatedDesc": "Etiketter har blitt oppdatert", - "updateFailedTitle": "Oppdatering mislyktes", - "tryAgain": "Vennligst prøv igjen senere", - "selectedCount": "{{count}} etiketter valgt", - "cancel": "Avbryt", - "save": "Lagre", - "saving": "Lagrer..." - }, - "updateTags": { - "overwriteWarning": "Advarsel: Dette vil overskrive alle eksisterende tagger på de valgte elementene.", - "title": "Oppdater tagger", - "none": "Ingen tagger valgt", - "searchPlaceholder": "Søk eller opprett ny tagg...", - "createHint": "Trykk Enter for å opprette ny tagg: \"{{tag}}\"", - "selectedCount": "{{count}} tag(g/er) vil bli brukt", - "cancel": "Avbryt", - "invalidTitle": "Ugyldig tagg", - "updatedTitle": "Tagger oppdatert", - "updatedDesc": "Tagger har blitt oppdatert.", - "updateFailedTitle": "Oppdatering mislyktes", - "tryAgain": "Vennligst prøv igjen senere.", - "actionAdd": "Legg til", - "actionRemove": "Fjern", - "actionOverwrite": "Overskriv", - "submitAdd": "Legg til tagger", - "submitRemove": "Fjern tagger", - "submitOverwrite": "Overskriv tagger", - "savingAdd": "Legger til...", - "savingRemove": "Fjerner...", - "savingOverwrite": "Overskriver..." - }, - "thread": { - "title": "Tråd · {{count}} meldinger", - "error": "Kunne ikke laste tråd", - "empty": "Ingen meldinger i denne tråden", - "invalidDate": "Ugyldig dato", - "noSubject": "(Uten emne)", - "loadingMore": "Laster...", - "loadMore": "Last mer" - }, - "bulkActions": { - "ariaLabel": "{{count}} meldinger valgt. Verktøylinje", - "delete": "Slett", - "deleteDesc": "Slett valgte meldinger", - "selected": "{{count}} valgt", - "clear": "Fjern valg", - "manageTags": "Administrer tagger" - }, - "delete": { - "title": "Slett meldinger", - "confirmPrefix": "Er du sikker på at du vil slette", - "countLabel": "{{count}} melding(er)?", - "confirmDetail": "Denne handlingen kan ikke angres.", - "confirmButton": "Slett", - "warningTitle": "Advarsel", - "warningDesc": "Meldinger slettes permanent.", - "successTitle": "Slettet", - "successDesc": "Meldingene ble slettet.", - "errorTitle": "Sletting mislyktes" - } + "submit": "Send inn", + "syncAfterDate": "synkroniserer data etter en satt dato", + "syncRecentData": "forskyver synkroniseringsdatoen over tid, og synkroniserer kun nylige data", + "syncStartDateDescription": "Definerer startdato for synkronisering – enten spesifikk eller relativ til nå. Tidligere e-poster utelates, {{fixedPart}}.", + "theAccountHasNotCompletedTheAuthorizationProcess": "Kontoen har ikke fullført autorisasjonsprosessen. Vennligst ", + "thisAccountIsUsedForIdentificationPurposesOnly": "Denne kontoen brukes kun for identifikasjonsformål og krever ikke synkronisering med en e-postserver. Den hjelper med import av e-postdata.", + "thisWillPreventTheAccountFromBeingUsed": "Denne kontoen vil ikke lenger synkronisere data fra IMAP-serveren, men eksisterende data vil fortsatt være tilgjengelige.", + "title": "E-postkontoer", + "toAuthorizeTheAccount": " for å autorisere kontoen.", + "type": "Type", + "unit": "Enhet", + "updateAccount": "Oppdater konto", + "updateFailed": "Oppdatering mislyktes, prøv igjen senere", + "updateTheEmailAccountHere": "Oppdater e-postkontoen her. ", + "updatedAt": "Oppdatert", + "useDangerous": "Stol på hvilken som helst TLS‑sertifikat", + "useDangerousDescription": "Aktiver dette alternativet kun hvis IMAP‑serveren bruker et offentlig CA‑sertifikat eller et selvsignert sertifikat som systemet ditt ikke gjenkjenner. Innstillingen hopper over vanlig sertifikatvalidering, noe som kan utsette deg for man‑in‑the‑middle‑angrep – bruk kun hvis du forstår risikoen.", + "useNoProxy": "Ingen proxy", + "useProxy": "Bruk Proxy", + "useProxyField": "bruk proxy", + "value": "Verdi", + "viewDetails": "se detaljer", + "years": "År" + }, + "apiDocs": { + "choosePreferredType": "Velg foretrukket API-dokumentasjonstype", + "downloadSpecYAML": "Last ned Spec YAML", + "openAPIExplorer": "OpenAPI Explorer", + "reDoc": "ReDoc", + "scalar": "Scalar", + "swaggerUI": "Swagger UI" + }, + "apiTokens": { + "deleteDialog": { + "cancel": "Avbryt", + "confirm": "Slett", + "deleting": "Sletter...", + "description": "Denne handlingen kan ikke angres. Enhver applikasjon som bruker denne tokenen vil umiddelbart miste tilgangen.", + "title": "Slett tilgangstoken?" }, - "mail": { - "emailViewer": "E-postvisning", - "noMessageSelected": "Ingen melding valgt", - "account": "Konto", - "from": "Fra", - "to": "Til", - "subject": "Emne", - "date": "Dato", - "tags": "Etiketter", - "noTagsYet": "Ingen etiketter ennå", - "id": "ID", - "cc": "Kopi", - "bcc": "Blindkopi", - "attachments": "Vedlegg", - "download": "Last ned", - "delete": "Slett", - "viewThread": "Vis tråd", - "downloadStarted": "Nedlasting startet", - "downloadComplete": "Nedlasting fullført", - "downloadFailed": "Nedlasting mislyktes", - "failedToDownloadFile": "Kunne ikke laste ned fil", - "failedToLoadEmail": "Kunne ikke laste e-postmelding.", - "isBeingDownloaded": "{{id}} lastes ned", - "downloaded": "{{id}} lastet ned", - "showLess": "vis mindre", - "showMore": "vis mer...", - "onlyNonInlineAttachments": "Kun ikke-innebygde vedlegg vises her.", - "noAttachments": "Ingen vedlegg" + "dialog": { + "createTitle": "Opprett tilgangstoken", + "description": "Klikk på lagre når du er ferdig.", + "editTitle": "Rediger tilgangstoken", + "save": "Lagre", + "saveChanges": "Lagre endringer" }, - "oauth2": { - "title": "OAuth2", - "addConfiguration": "Legg til konfigurasjon", - "id": "ID", - "provider": "Leverandør", - "clientId": "Klient-ID", - "clientSecret": "Klienthemmelighet", - "redirectUri": "Omdirigerings-URI", - "scopes": "Omfang (Scopes)", - "status": "Status", - "enabled": "Aktivert", - "disabled": "Deaktivert", - "edit": "Rediger", - "delete": "Slett", - "enable": "Aktiver", - "disable": "Deaktiver", - "noConfigurations": "Ingen OAuth2-konfigurasjoner", - "noConfigurationsDesc": "Du har ikke lagt til noen OAuth2-konfigurasjoner ennå. Legg til en for å begynne å bruke OAuth2-funksjoner.", - "description": "Håndterer automatisk henting, lagring og oppfriskning av tilgangstokener, og sikrer en sømløs og alltid klar autentiseringsopplevelse.", - "addNew": "Legg til ny", - "updateHere": "Oppdater her.", - "createNewHere": "Opprett ny her.", - "clickSaveWhenDone": "Klikk lagre når du er ferdig.", - "quickPresets": "Hurtigvalg:", - "gmail": "Gmail", - "outlook": "Outlook", - "whenDisabled": "Når deaktivert: - Nye autorisasjonsforespørsler vil bli avvist umiddelbart - Eksisterende tilgangstokener og oppfriskningstokener vil bli tilbakekalt innen 1 minutt - Brukere må autorisere på nytt ved reaktivering", - "clientIdLabel": "Klient-ID:", - "enterYourClientId": "Skriv inn din klient-ID", - "theUniqueIdentifierForYourApplication": "Den unike identifikatoren for applikasjonen din, levert av OAuth-leverandøren.", - "clientSecretLabel": "Klienthemmelighet:", - "leaveEmptyToKeepExistingSecret": "La stå tomt for å beholde eksisterende hemmelighet", - "enterYourClientSecret": "Skriv inn din klienthemmelighet", - "leaveEmptyToKeepTheExistingSecret": "La stå tomt for å beholde den eksisterende hemmeligheten. Skriv kun inn en ny verdi hvis du vil endre den.", - "aSecretKeyProvidedByTheOAuthProvider": "En hemmelig nøkkel levert av OAuth-leverandøren for å autentisere applikasjonen din.", - "authUrlLabel": "Auth-URL:", - "enterTheAuthorizationUrl": "Skriv inn autorisasjons-URL-en", - "theUrlWhereUsersWillBeRedirected": "URL-en brukerne blir omdirigert til for å autorisere applikasjonen din.", - "tokenUrlLabel": "Token-URL:", - "enterTheTokenUrl": "Skriv inn token-URL-en", - "theUrlUsedToExchange": "URL-en som brukes til å veksle autorisasjonskoden mot et tilgangstoken.", - "redirectUrlLabel": "Omdirigerings-URL:", - "enterYourRedirectUrl": "Skriv inn din omdirigerings-URL", - "theRedirectUrlAfterAuthorization": "Omdirigerings-URL-en etter autorisasjon. Den må samsvare med den som er registrert hos OAuth-leverandøren. Bruk formatet http://[vert]:[port]/oauth2/callback (eller https://), der [vert] og [port] samsvarer med din RustMailer-utrulling. Banen /oauth2/callback er fast.", - "scope": "Omfang:", - "enterTheScopeHere": "Skriv inn omfang her.", - "addScope": "Legg til omfang", - "key": "Nøkkel:", - "enterTheKeyHere": "Skriv inn nøkkelen her.", - "value": "Verdi:", - "enterTheValueHere": "Skriv inn verdien her.", - "addExtraParams": "Legg til ekstra parametere", - "useProxyOptional": "Bruk Proxy (valgfritt):", - "selectAProxy": "Velg en proxy", - "noProxyAvailable": "Ingen proxy tilgjengelig", - "useSocks5ProxyForOAuthRequests": "Bruk SOCKS5-proxy for OAuth-forespørsler når direkte tilgang er blokkert.", - "descriptionLabel": "Beskrivelse:", - "describeThePurposeOfTheOauth2Application": "Beskriv formålet med OAuth2-applikasjonen", - "optional": "Valgfritt", - "saving": "Lagrer...", - "creating": "Oppretter...", - "saveChanges": "Lagre endringer", - "save": "Lagre", - "updated": "Oppdatert", - "created": "Opprettet", - "yourOAuth2ApplicationHasBeenSuccessfully": "Din OAuth2-applikasjon har blitt {{action}}.", - "updateFailed": "Oppdatering mislyktes", - "creationFailed": "Opprettelse mislyktes", - "updateOrCreationFailed": "{{action}} mislyktes, vennligst prøv igjen senere", - "clientSecretIsRequired": "Klienthemmelighet er påkrevd", - "clientSecretCannotBeEmpty": "Klienthemmelighet kan ikke være tom", - "keyIsRequired": "Nøkkel er påkrevd", - "keyCannotBeEmpty": "Nøkkel kan ikke være tom", - "valueIsRequired": "Verdi er påkrevd", - "valueCannotBeEmpty": "Verdi kan ikke være tom", - "descriptionMustNotExceed255Characters": "Beskrivelse må ikke overstige 255 tegn.", - "clientIdIsRequired": "Klient-ID er påkrevd", - "clientIdCannotBeEmpty": "Klient-ID kan ikke være tom", - "authorizationUrlIsRequired": "Autorisasjons-URL er påkrevd", - "authorizationUrlCannotBeEmpty": "Autorisasjons-URL kan ikke være tom", - "invalidAuthorizationUrlFormat": "Ugyldig format på Autorisasjons-URL", - "tokenUrlIsRequired": "Token-URL er påkrevd", - "tokenUrlCannotBeEmpty": "Token-URL kan ikke være tom", - "invalidTokenUrlFormat": "Ugyldig format på Token-URL", - "redirectUriIsRequired": "Omdirigerings-URI er påkrevd", - "redirectUriCannotBeEmpty": "Omdirigerings-URI kan ikke være tom", - "invalidRedirectUriFormat": "Ugyldig format på Omdirigerings-URI", - "authorizeEmailAccount": "Autoriser e-postkonto", - "authorizeAnEmailAccountToStartTheOAuth2AuthorizationProcess": "Autoriser en e-postkonto for å starte OAuth2-autorisasjonsprosessen.", - "loadingAccounts": "Laster kontoer...", - "selectAnAccount": "Velg en konto", - "noEmailAccountsRegistered": "Ingen e-postkontoer registrert. Vennligst opprett en.", - "pleaseCreateOne": "Vennligst opprett en.", - "createAccount": "Opprett konto", - "authorize": "Autoriser", - "getAuthorizeUrlFailed": "Henting av autorisasjons-URL mislyktes", - "getAuthorizeUrlFailedDesc": "kunne ikke hente autorisasjons-url, vennligst prøv igjen senere", - "oauth2ClientUpdated": "OAuth2-klient oppdatert", - "oauth2ClientHasBeenSuccessfully": "OAuth2-klient har blitt {{action}}.", - "statusUpdateFailed": "Statusoppdatering mislyktes, vennligst prøv igjen senere", - "disableOAuth2Client": "Deaktiver OAuth2-klient", - "enableOAuth2Client": "Aktiver OAuth2-klient", - "areYouSureYouWantTo": "Er du sikker på at du vil {{action}} denne OAuth2-klienten?", - "thisWillPreventTheOAuth2ClientFromBeingUsed": "Dette vil hindre at OAuth2-klienten blir brukt.", - "deleteToken": "Slett token", - "areYouSureYouWantToDelete": "Er du sikker på at du vil slette", - "thisActionWillPermanentlyRemoveTheOauth2Record": "Denne handlingen vil permanent fjerne OAuth2-oppføringen fra systemet. Dette kan ikke angres.", - "enterIdToConfirmDeletion": "Skriv inn id for å bekrefte sletting.", - "warning": "Advarsel!", - "pleaseBeCareful": "Vær forsiktig, denne operasjonen kan ikke angres.", - "deleteSuccess": "Sletting vellykket", - "yourOAuth2ApplicationHasBeenSuccessfullyDeleted": "Din OAuth2-applikasjon har blitt slettet.", - "oauth2DeleteFailed": "Sletting av OAuth2 mislyktes", - "deleteFailed": "Sletting mislyktes, vennligst prøv igjen senere", - "actions": { - "openMenu": "Åpne meny", - "edit": "Rediger", - "authorize": "Autoriser", - "delete": "Slett" - }, - "authFailed": "OAuth2-autentisering mislyktes", - "error": "Feil", - "unknownError": "En ukjent feil oppstod.", - "tryAgain": "Prøv igjen", - "goHome": "Gå hjem", - "authSuccess": "OAuth2-autentisering vellykket", - "success": "Suksess", - "successMessage": "E-postkontoen din er autentisert via OAuth2. Tilgangstokenet er lagret av systemet og vil bli automatisk oppdatert ved behov.", - "goToAccounts": "Gå til Kontoer", - "authAtatus": "OAuth2-autentiseringsstatus", - "information": "Informasjon", - "noStatus": "Denne siden viser resultatet av din OAuth2-autentisering. For øyeblikket er ingen spesifikk status tilgjengelig. Vennligst prøv igjen ved behov.", - "backToLogin": "Tilbake til innlogging" + "form": { + "1day": "1 dag", + "30days": "30 dager", + "7days": "7 dager", + "errorInt": "Må være et heltall", + "errorMax": "Maks 32 tegn", + "errorNumber": "Må være et tall", + "errorPositive": "Må være større enn 0", + "expirationDescription": "Tokener utløper automatisk etter valgt tid.", + "expirationLabel": "Utløp", + "expirationPlaceholder": "Velg utløp", + "nameDescription": "Valgfritt · Maks 32 tegn", + "nameLabel": "Navn", + "namePlaceholder": "Gi denne tokenen et kort navn", + "never": "Aldri" }, - "accessTokens": { - "title": "Tilgangstokener", - "name": "Navn", - "accounts": "Kontoer", - "token": "Token", - "createdAt": "Opprettet", - "expiresAt": "Utløper", - "edit": "Rediger", - "delete": "Slett", - "create": "Opprett", - "noTokens": "Ingen tilgangstokener", - "noTokensDesc": "Du har ikke opprettet noen tilgangstokener ennå. Opprett et for å begynne å bruke API-funksjoner.", - "description": "Administrer dine tilgangstokener, deres tilgangskontroller, IP-hvitelister og hastighetsbegrensninger her.", - "editToken": "Rediger token", - "addNew": "Legg til ny", - "updateTheAccessTokenHere": "Oppdater tilgangstokenet her.", - "createNewAccessTokenHere": "Opprett nytt tilgangstoken her.", - "selectAccounts": "Velg kontoer", - "selectMultipleAccountsForTheAccessToken": "Velg flere kontoer for tilgangstokenets autorisasjonsomfang.", - "enterOneIpAddressPerLine": "Skriv inn én IP-adresse per linje, f.eks.:\n192.168.1.1\n192.168.1.2", - "aListOfIpAddressesAllowed": "En liste over IP-adresser som har tillatelse til å få tilgang til ressursen. Skriv inn én IP-adresse per linje. (Valgfritt)", - "enterQuota": "Skriv inn kvote, f.eks. 100", - "theMaximumNumberOfRequestsAllowed": "Maksimalt antall forespørsler tillatt innenfor intervallet. (Valgfritt)", - "enterIntervalInSeconds": "Skriv inn intervall i sekunder, f.eks. 60", - "theTimeWindowForTheRateLimit": "Tidsvinduet (i sekunder) for hastighetsbegrensningen. (Valgfritt)", - "describeThePurposeOfTheAccessToken": "Beskriv formålet med tilgangstokenet", - "updating": "Oppdaterer...", - "saving": "Lagrer...", - "creating": "Oppretter...", - "saveChanges": "Lagre endringer", - "save": "Lagre", - "updated": "Oppdatert", - "created": "Opprettet", - "yourAccessTokenHasBeenSuccessfully": "Ditt tilgangstoken har blitt {{action}}.", - "updateFailed": "Oppdatering mislyktes", - "creationFailed": "Opprettelse mislyktes", - "updateOrCreationFailed": "{{action}} mislyktes, vennligst prøv igjen senere", - "quotaMustBeAPositiveInteger": "Kvote må være et positivt heltall.", - "intervalMustBeAPositiveInteger": "Intervall må være et positivt heltall.", - "invalidIpAddressesFound": "Ugyldige IP-adresser funnet. Vennligst skriv inn gyldige IPv4- eller IPv6-adresser.", - "atLeastOneAccountIsRequired": "Minst én konto er påkrevd.", - "descriptionMustNotExceed255Characters": "Beskrivelse må ikke overstige 255 tegn.", - "notUsedYet": "Ikke brukt ennå", - "theListOfAccountsThatCanBeQueried": "Listen over kontoer som kan forespørres ved hjelp av et tilgangstoken.", - "accountId": "Konto-ID", - "filterByEmailAddressOrAccountId": "Filtrer på e-postadresse eller konto-ID...", - "aclRulesForAccessTokens": "ACL-regler for tilgangstokener inkluderer IP-hviteliste-verifisering og håndheving av hastighetsbegrensninger.", - "actions": { - "openMenu": "Åpne meny", - "edit": "Rediger", - "delete": "Slett" - }, - "quota": "Kvote", - "interval": "Intervall" + "list": { + "createdLabel": "Opprettet", + "deleteBtn": "Slett token", + "expiresOnLabel": "Utløper den", + "expiresOnShort": "Utløper {{date}}", + "lastUsedLabel": "Sist brukt", + "neverExpires": "Utløper aldri", + "neverLabel": "Aldri", + "neverUsed": "Aldri", + "statusActive": "Aktiv", + "statusExpired": "Utløpt", + "tokenLabel": "Token", + "unnamedToken": "Navnløs token" }, - "settings": { - "appearance": { - "title": "Utseende", - "field": { - "language": "Grensesnittspråk", - "theme": "Grensesnittema" - }, - "description": { - "language": "Velg språket som skal brukes i webgrensesnittet.", - "theme": "Velg mellom lys eller mørk modus for grensesnittet." - }, - "placeholder": { - "select_language": "Velg språk" - }, - "command": { - "search": "Søk etter språk...", - "no_results": "Fant ingen språk." - }, - "theme": { - "light": "Lys", - "dark": "Mørk" - }, - "button": { - "update": "Oppdater innstillinger" - }, - "validation": { - "language": { - "required": "Vennligst velg et språk." - }, - "theme": { - "required": "Vennligst velg et tema." - } - } - }, - "title": "Innstillinger", - "general": "Generelt", - "proxy": "Proxy", - "name": "Navn", - "host": "Vert", - "port": "Port", - "username": "Brukernavn", - "password": "Passord", - "type": "Type", - "actions": "Handlinger", - "edit": "Rediger", - "delete": "Slett", - "add": "Legg til", - "noProxies": "Ingen proxyer", - "noProxiesDesc": "Du har ikke lagt til noen proxy-konfigurasjoner ennå. Legg til en for å begynne å bruke proxy-funksjoner.", - "root": "Root", - "rootTitle": "Root", - "rootDesc": "Administrer root-tilgangslegitimasjon inkludert token og passord.", - "rootAccessManagement": "Administrasjon av rottilgang", - "manageRootTokenAndPassword": "Administrer root-token og passord sikkert.", - "resetRootToken": "Tilbakestill root-token", - "generateNewToken": "Generer nytt token, det gamle utløper umiddelbart.", - "reset": "Tilbakestill", - "resetRootPassword": "Tilbakestill root-passord", - "changePasswordForFutureLogins": "Endre passord for fremtidige innlogginger.", - "youAreAboutToResetTheRootToken": "Du er i ferd med å tilbakestille root-tokenet. Denne handlingen kan ikke angres.", - "confirmReset": "Bekreft tilbakestilling", - "youAreAboutToResetTheRootPassword": "Du er i ferd med å tilbakestille root-passordet. Sørg for å lagre det sikkert.", - "enterNewRootPassword": "Skriv inn nytt root-passord", - "theRootTokenHasBeenReset": "Root-tokenet har blitt tilbakestilt", - "yourLoginInformationHasBeenUpdated": "Innloggingsinformasjonen din er oppdatert. Du trenger ikke å logge inn på nytt.", - "invalidPassword": "Ugyldig passord", - "rootPasswordMustBeAtLeast6Characters": "Root-passordet må være minst 6 tegn langt.", - "theRootPasswordHasBeenReset": "Root-passordet har blitt tilbakestilt", - "useNewPasswordForNextLogin": "Bruk det nye passordet ved neste innlogging.", - "failedToCopyText": "Kunne ikke kopiere tekst", - "filterProxy": "Filtrer Proxy...", - "filterOauth2": "Filtrer oauth2...", - "filterAccount": "Filtrer konto...", - "filterAccessToken": "Filtrer tilgangstoken...", - "selectAll": "Velg alle", - "theme": "Tema", - "id": "Id", - "url": "Url", - "createdAt": "Opprettet", - "updatedAt": "Oppdatert", - "enabled": "Aktivert", - "useProxy": "Bruk Proxy", - "authUrl": "Auth-URL", - "tokenUrl": "Token-URL", - "description": "Beskrivelse", - "token": "Token", - "accounts": "Kontoer", - "acl": "Acl", - "lastAccess": "Siste tilgang", - "enterProxyIdToConfirmDeletion": "Skriv inn Proxy-ID for å bekrefte sletting.", - "updateTheProxyHere": "Oppdater proxyen her. ", - "addNewProxyHere": "Legg til ny proxy her. ", - "pleaseUseAnIpAddressForBetterReliability": "Vennligst bruk en IP-adresse (f.eks. 127.0.0.1) heller enn et vertsnavn eller domene for bedre pålitelighet.", - "adding": "Legger til...", - "yourProxyHasBeenSuccessfully": "Din proxy har blitt {{action}}.", - "proxyUpdateOrAddFailed": "{{action}} mislyktes, vennligst prøv igjen senere", - "sidebar": { - "profile": "Profil", - "apiTokens": "API-tokener", - "proxy": "Nettverksproxy", - "configurations": "Systemkonfigurasjoner" - }, - "profile": { - "loadError": "Kunne ikke laste inn brukerinformasjon.", - "uploadTitle": "Last opp avatar", - "maxSize": "Opptil {{size}}", - "avatarAlt": "Avatar", - "removeAvatar": "Fjern avatar", - "uploadError": "Feil ved opplasting av fil", - "field": { - "username": "Brukernavn", - "email": "E-post", - "password": "Passord" - }, - "placeholder": { - "password_keep": "La stå tomt for å beholde nåværende passord" - }, - "button": { - "update_profile": "Oppdater profil", - "permissions": "Tillatelser", - "view_global_permissions": "Vis globale tillatelser" - }, - "section": { - "roles": "Roller", - "accounts": "{{count}} tilknyttede kontoer" - }, - "account": { - "id": "Konto-ID: {{id}}" - }, - "toast": { - "updated": "Profilen ble oppdatert", - "update_failed": "Kunne ikke oppdatere profilen" - }, - "validation": { - "username": { - "required": "Brukernavn er påkrevd", - "min": "Brukernavnet må være minst 5 tegn", - "max": "Brukernavnet kan være maks 32 tegn" - }, - "email": { - "required": "E-post er påkrevd", - "invalid": "Skriv inn en gyldig e-postadresse" - }, - "password": { - "min": "Passordet må være minst 8 tegn", - "max": "Passordet kan være maks 256 tegn" - } - } - } + "notifications": { + "close": "Lukk", + "copied": "Kopiert til utklippstavle", + "createFailed": "Oppretting feilet", + "createSuccess": "Tilgangstoken opprettet", + "createSuccessDesc": "Tilgangstokenet ble opprettet.", + "deleteFailed": "Kunne ikke slette token", + "deleteSuccess": "Token slettet", + "genericError": "Handlingen feilet. Prøv igjen.", + "tryAgain": "Prøv igjen", + "updateFailed": "Oppdatering feilet", + "updateSuccess": "Tilgangstoken oppdatert", + "updateSuccessDesc": "Tilgangstokenet ble oppdatert." }, - "apiDocs": { - "choosePreferredType": "Velg foretrukket API-dokumentasjonstype", - "swaggerUI": "Swagger UI", - "reDoc": "ReDoc", - "openAPIExplorer": "OpenAPI Explorer", - "scalar": "Scalar", - "downloadSpecYAML": "Last ned Spec YAML" + "page": { + "addBtn": "Legg til token", + "emptyDescription": "Du har ikke opprettet noen API-tokener ennå. Klikk nedenfor for å opprette en.", + "emptyTitle": "Ingen API-tokener", + "loadError": "Kunne ikke laste API-tokener." + } + }, + "attachment": { + "all_fields_desc": "Matcher vedleggsnavn, emne og avsender", + "date": "Dato", + "name": "Filnavn", + "search_input_placeholder": "Søk etter vedlegg (bruk \" \" for frasesøk)", + "sender": "Avsender", + "sender_with_count": "Avsender ({{count}})", + "size": "Filstørrelse", + "source": "Kilde", + "subject": "Emne" + }, + "auth": { + "areYouSureYouWantToLogOut": "Er du sikker på at du vil logge ut?", + "invalidPassword": "Ugyldig passord. Vennligst prøv igjen.", + "login": "Logg inn", + "loginFailed": "Innlogging mislyktes", + "logout": "Logg ut", + "password": "Passord", + "sessionExpired": "Sesjonen er utløpt!", + "sessionExpiredDesc": "Sesjonen din er avsluttet på grunn av inaktivitet. Vennligst logg inn på nytt for å fortsette.", + "somethingWentWrong": "Noe gikk galt", + "username": "Brukernavn", + "welcome": "Velkommen til Bichon", + "youWillNeedToLogInAgain": "Du må logge inn på nytt for å få tilgang til kontoen din." + }, + "command": { + "dark": "Mørk", + "light": "Lys", + "noResultsFound": "Ingen resultater funnet.", + "theme": "Tema", + "typeCommandOrSearch": "Skriv en kommando eller søk..." + }, + "common": { + "actions": "Handlinger", + "add": "Legg til", + "all": "Alle", + "apply": "Bruk", + "back": "Tilbake", + "backToHome": "Tilbake til hjem", + "cancel": "Avbryt", + "clear": "Tøm", + "close": "Lukk", + "confirm": "Bekreft", + "create": "Opprett", + "delete": "Slett", + "deleting": "Sletter...", + "deselectAll": "Velg bort alle", + "edit": "Rediger", + "empty": "Tom", + "error": "Feil", + "failed": "Mislyktes", + "filter": "Filtrer", + "goBack": "Gå tilbake", + "loading": "Laster...", + "more": "Mer", + "na": "N/A", + "no": "Nei", + "noData": "Ingen data", + "none": "Ingen", + "notFound": "Ikke funnet", + "ok": "OK", + "op_failed": "Operasjonen mislyktes", + "project_description": "Bichon er et open-source-prosjekt.", + "remove": "Fjern", + "reset": "Nullstill", + "retry": "Prøv igjen", + "save": "Lagre", + "save_changes": "Lagre endringer", + "search": "Søk", + "select": "Velg", + "selectAll": "Velg alle", + "showLess": "Vis mindre", + "showMore": "Vis mer...", + "submit": "Send inn", + "table": { + "noResults": "Ingen resultater." }, - "dialogs": { - "confirmDelete": "Bekreft sletting", - "confirmDeleteDesc": "Er du sikker på at du vil slette dette elementet? Denne handlingen kan ikke angres.", - "deleteSuccess": "Slettet", - "deleteFailed": "Sletting mislyktes", - "saveSuccess": "Lagret", - "saveFailed": "Lagring mislyktes", - "createSuccess": "Opprettet", - "createFailed": "Opprettelse mislyktes", - "updateSuccess": "Oppdatert", - "updateFailed": "Oppdatering mislyktes", - "continue": "Fortsett", - "deleting": "Sletter...", - "accountDeleted": "Konto slettet", - "accountDeletedDesc": "Kontoen din har blitt slettet.", - "accountDeleteFailed": "Sletting av konto mislyktes", - "deleteAccountPermanently": "Slett konto permanent", - "youAreDeleting": "Du sletter {{email}}. Dette vil permanent fjerne:", - "accountCredentials": "Kontolegitimasjon og innstillinger", - "localCachedMetadata": "Lokalt lagrede metadata og synkroniseringsstatus", - "imapSyncData": "IMAP-synkroniseringsdata", - "oauthTokens": "OAuth-tokener og API-legitimasjon", - "typeEmailToConfirm": "Skriv inn kontoens e-post for å bekrefte:", - "typeToConfirm": "Skriv \"{{email}}\" for å bekrefte", - "cannotBeUndone": "Denne handlingen kan ikke angres!", - "allResourcesErased": "Alle relaterte ressurser vil bli permanent slettet.", - "permanentlyDeleteAccount": "Slett konto permanent" + "tryAgain": "Prøv igjen", + "update": "Oppdater", + "view_on_github_button": "Vis på GitHub", + "yes": "Ja" + }, + "dashboard": { + "account": "Konto", + "actualDiskUsage": "Faktisk diskbruk", + "attachmentRatio": "Vedleggsforhold", + "attachmentRatioDesc": "{{percent}}% av e-postene har vedlegg", + "attachments": "Vedlegg", + "byMessageCount": "Etter meldingsantall", + "byMessageSize": "Etter meldingsstørrelse", + "connected": "Tilkoblet", + "count": "Antall", + "dataStorage": "Datalagring", + "dayTrend": "30-dagers trend", + "efficiency": "Lagringseffektivitet", + "emails": "E-poster", + "indexSize": "Indeksstørrelse", + "localDataFiles": "Lokale datafiler", + "logicalVolume": "Opprinnelig størrelse", + "mailAccounts": "E-postkontoer", + "messageDistribution": "Meldingsfordeling", + "metadataSize": "Metadatastørrelse", + "newEmails": "Nye e-poster", + "noAccountData": "Ingen kontodata", + "noAttachments": "Uten vedlegg", + "noEmailsSynced": "Ingen e-poster synkronisert ennå", + "noLargeEmails": "Ingen store e-poster", + "noRecentActivity": "Ingen nylig aktivitet", + "noSendersData": "Ingen avsenderdata", + "noSubject": "(Uten emne)", + "saved": "Spart", + "sender": "Avsender", + "size": "Størrelse", + "subject": "Emne", + "syncedLocally": "Synkronisert lokalt", + "systemVersion": "Systemversjon", + "tantivyDatabase": "Basert på søkemotoren Tantivy", + "title": "Oversikt", + "top10Accounts": "Topp 10 kontoer", + "top10LargestEmails": "Topp 10 største e-poster", + "top10Senders": "Topp 10 avsendere", + "topLists": "Topplister", + "totalEmailSize": "Total e-poststørrelse", + "totalEmails": "Totalt antall e-poster", + "withAttachments": "Med vedlegg" + }, + "dialogs": { + "accountCredentials": "Kontolegitimasjon og innstillinger", + "accountDeleteFailed": "Sletting av konto mislyktes", + "accountDeleted": "Konto slettet", + "accountDeletedDesc": "Kontoen din har blitt slettet.", + "allResourcesErased": "Alle relaterte ressurser vil bli permanent slettet.", + "cannotBeUndone": "Denne handlingen kan ikke angres!", + "confirmDelete": "Bekreft sletting", + "confirmDeleteDesc": "Er du sikker på at du vil slette dette elementet? Denne handlingen kan ikke angres.", + "continue": "Fortsett", + "createFailed": "Opprettelse mislyktes", + "createSuccess": "Opprettet", + "deleteAccountPermanently": "Slett konto permanent", + "deleteFailed": "Sletting mislyktes", + "deleteSuccess": "Slettet", + "deleting": "Sletter...", + "imapSyncData": "IMAP-synkroniseringsdata", + "localCachedMetadata": "Lokalt lagrede metadata og synkroniseringsstatus", + "oauthTokens": "OAuth-tokener og API-legitimasjon", + "permanentlyDeleteAccount": "Slett konto permanent", + "saveFailed": "Lagring mislyktes", + "saveSuccess": "Lagret", + "typeEmailToConfirm": "Skriv inn kontoens e-post for å bekrefte:", + "typeToConfirm": "Skriv \"{{email}}\" for å bekrefte", + "updateFailed": "Oppdatering mislyktes", + "updateSuccess": "Oppdatert", + "youAreDeleting": "Du sletter {{email}}. Dette vil permanent fjerne:" + }, + "errors": { + "contentNotModified": "Innholdet er ikke endret!", + "forbidden": "Forbudt", + "forbiddenDesc": "Du har ikke nødvendige tillatelser for å vise denne ressursen.", + "forbiddenTitle": "Ingen tilgang", + "internalServerError": "Intern serverfeil!", + "learnMore": "Lær mer", + "maintenance": "Vedlikehold", + "maintenanceDesc": "Nettstedet er ikke tilgjengelig for øyeblikket. Vi er snart tilbake på nettet.", + "maintenanceTitle": "Nettstedet er under vedlikehold!", + "networkError": "Nettverksfeil", + "networkErrorDesc": "Kan ikke koble til serveren. Vennligst sjekk internettforbindelsen din og prøv igjen.", + "pageNotFound": "Oi! Siden ble ikke funnet!", + "pageNotFoundDesc": "Det ser ut til at siden du leter etter ikke eksisterer, eller kan ha blitt fjernet.", + "somethingWentWrong": "Oi! Noe gikk galt :')", + "somethingWentWrongDesc": "Vi beklager ulempen. Vennligst prøv igjen senere.", + "unauthorized": "Uautorisert", + "unauthorizedDesc": "Vennligst logg inn med riktig legitimasjon for å få tilgang til denne ressursen.", + "unauthorizedTitle": "Uautorisert tilgang" + }, + "mail": { + "account": "Konto", + "attachments": "Vedlegg", + "bcc": "Blindkopi", + "cc": "Kopi", + "date": "Dato", + "delete": "Slett", + "download": "Last ned", + "downloadComplete": "Nedlasting fullført", + "downloadFailed": "Nedlasting mislyktes", + "downloadStarted": "Nedlasting startet", + "downloaded": "{{id}} lastet ned", + "emailViewer": "E-postvisning", + "failedToDownloadFile": "Kunne ikke laste ned fil", + "failedToLoadEmail": "Kunne ikke laste e-postmelding.", + "from": "Fra", + "id": "ID", + "isBeingDownloaded": "{{id}} lastes ned", + "noAttachments": "Ingen vedlegg", + "noMessageSelected": "Ingen melding valgt", + "noTagsYet": "Ingen etiketter ennå", + "onlyNonInlineAttachments": "Kun ikke-innebygde vedlegg vises her.", + "showLess": "vis mindre", + "showMore": "vis mer...", + "subject": "Emne", + "tags": "Etiketter", + "to": "Til", + "viewThread": "Vis tråd" + }, + "mailbox": { + "bulkActions": { + "ariaLabel": "Massehandlinger for {{count}} valgte {{emailLabel}}", + "clearSelection": "Fjern valg", + "clearSelectionWithKey": "Fjern valg ({{key}})", + "delete": "Slett", + "deleteTooltip": "Slett valgte e-poster", + "email": "e-post", + "emails": "e-poster", + "selected": "valgt" }, - "command": { - "typeCommandOrSearch": "Skriv en kommando eller søk...", - "noResultsFound": "Ingen resultater funnet.", - "theme": "Tema", - "light": "Lys", - "dark": "Mørk" + "deleteDialog": { + "confirm": "Slett", + "desc": "Er du sikker på at du vil slette {{countText}}? Denne handlingen vil slette valgte e-post(er) fra den lokale databasen. E-posten(e) vil bli permanent slettet og kan ikke gjenopprettes.", + "descCountMultiple": "disse {{count}} e-postene", + "descCountSingle": "denne e-posten", + "errorTitle": "Kunne ikke slette meldinger", + "successDesc": "Meldingene har blitt slettet.", + "successTitle": "Meldinger slettet", + "title": "Slett e-post", + "warningDesc": "Vennligst vær forsiktig før du fortsetter.", + "warningTitle": "Advarsel!" + }, + "deleteMailboxDialog": { + "confirm": "Slett permanent", + "desc": "Er du sikker på at du vil slette denne postkassemappen? Denne handlingen kan ikke angres.", + "errorTitle": "Sletting mislyktes", + "successDesc": "Postkassemappen og innholdet er fjernet.", + "successTitle": "Sletting fullført", + "title": "Slett postkassemappe", + "warningDesc": "Sletting av denne mappen vil også fjerne alle arkiverte e-poster og undermapper i den permanent.", + "warningTitle": "Advarsel" + }, + "folders": "Mapper", + "messages": "Meldinger", + "noMessages": "Ingen meldinger", + "selectFolder": "Velg en mappe for å se meldinger", + "thread": { + "empty": "Ingen meldinger i denne tråden.", + "invalidDate": "Ugyldig dato", + "loadError": "Kunne ikke laste tråd", + "loadMore": "Last mer", + "loadingMore": "Laster flere...", + "message": "melding", + "messages": "meldinger", + "noSubject": "(Uten emne)", + "title": "Tråd ({{count}} {{messageLabel}})" + }, + "title": "Postkasse" + }, + "navigation": { + "accessTokens": "Tilgangstokener", + "accounts": "Kontoer", + "apiDocs": "API-dokumentasjon", + "attachment": "Vedlegg", + "auth": "Autentisering", + "dashboard": "Oversikt", + "general": "Generelt", + "home": "Hjem", + "mailbox": "Postkasse", + "oauth2": "OAuth2", + "other": "Annet", + "settings": "Innstillinger", + "users": "Systembrukere" + }, + "oauth2": { + "aSecretKeyProvidedByTheOAuthProvider": "En hemmelig nøkkel levert av OAuth-leverandøren for å autentisere applikasjonen din.", + "actions": { + "authorize": "Autoriser", + "delete": "Slett", + "edit": "Rediger", + "openMenu": "Åpne meny" + }, + "addConfiguration": "Legg til konfigurasjon", + "addExtraParams": "Legg til ekstra parametere", + "addNew": "Legg til ny", + "addScope": "Legg til omfang", + "areYouSureYouWantTo": "Er du sikker på at du vil {{action}} denne OAuth2-klienten?", + "areYouSureYouWantToDelete": "Er du sikker på at du vil slette", + "authAtatus": "OAuth2-autentiseringsstatus", + "authFailed": "OAuth2-autentisering mislyktes", + "authSuccess": "OAuth2-autentisering vellykket", + "authUrlLabel": "Auth-URL:", + "authorizationUrlCannotBeEmpty": "Autorisasjons-URL kan ikke være tom", + "authorizationUrlIsRequired": "Autorisasjons-URL er påkrevd", + "authorize": "Autoriser", + "authorizeAnEmailAccountToStartTheOAuth2AuthorizationProcess": "Autoriser en e-postkonto for å starte OAuth2-autorisasjonsprosessen.", + "authorizeEmailAccount": "Autoriser e-postkonto", + "backToLogin": "Tilbake til innlogging", + "clickSaveWhenDone": "Klikk lagre når du er ferdig.", + "clientId": "Klient-ID", + "clientIdCannotBeEmpty": "Klient-ID kan ikke være tom", + "clientIdIsRequired": "Klient-ID er påkrevd", + "clientIdLabel": "Klient-ID:", + "clientSecret": "Klienthemmelighet", + "clientSecretCannotBeEmpty": "Klienthemmelighet kan ikke være tom", + "clientSecretIsRequired": "Klienthemmelighet er påkrevd", + "clientSecretLabel": "Klienthemmelighet:", + "createAccount": "Opprett konto", + "createNewHere": "Opprett ny her.", + "created": "Opprettet", + "creating": "Oppretter...", + "creationFailed": "Opprettelse mislyktes", + "delete": "Slett", + "deleteFailed": "Sletting mislyktes, vennligst prøv igjen senere", + "deleteSuccess": "Sletting vellykket", + "deleteToken": "Slett token", + "describeThePurposeOfTheOauth2Application": "Beskriv formålet med OAuth2-applikasjonen", + "description": "Håndterer automatisk henting, lagring og oppfriskning av tilgangstokener, og sikrer en sømløs og alltid klar autentiseringsopplevelse.", + "descriptionLabel": "Beskrivelse:", + "descriptionMustNotExceed255Characters": "Beskrivelse må ikke overstige 255 tegn.", + "disable": "Deaktiver", + "disableOAuth2Client": "Deaktiver OAuth2-klient", + "disabled": "Deaktivert", + "edit": "Rediger", + "enable": "Aktiver", + "enableOAuth2Client": "Aktiver OAuth2-klient", + "enabled": "Aktivert", + "enterIdToConfirmDeletion": "Skriv inn id for å bekrefte sletting.", + "enterTheAuthorizationUrl": "Skriv inn autorisasjons-URL-en", + "enterTheKeyHere": "Skriv inn nøkkelen her.", + "enterTheScopeHere": "Skriv inn omfang her.", + "enterTheTokenUrl": "Skriv inn token-URL-en", + "enterTheValueHere": "Skriv inn verdien her.", + "enterYourClientId": "Skriv inn din klient-ID", + "enterYourClientSecret": "Skriv inn din klienthemmelighet", + "enterYourRedirectUrl": "Skriv inn din omdirigerings-URL", + "error": "Feil", + "getAuthorizeUrlFailed": "Henting av autorisasjons-URL mislyktes", + "getAuthorizeUrlFailedDesc": "kunne ikke hente autorisasjons-url, vennligst prøv igjen senere", + "gmail": "Gmail", + "goHome": "Gå hjem", + "goToAccounts": "Gå til Kontoer", + "id": "ID", + "information": "Informasjon", + "invalidAuthorizationUrlFormat": "Ugyldig format på Autorisasjons-URL", + "invalidRedirectUriFormat": "Ugyldig format på Omdirigerings-URI", + "invalidTokenUrlFormat": "Ugyldig format på Token-URL", + "key": "Nøkkel:", + "keyCannotBeEmpty": "Nøkkel kan ikke være tom", + "keyIsRequired": "Nøkkel er påkrevd", + "leaveEmptyToKeepExistingSecret": "La stå tomt for å beholde eksisterende hemmelighet", + "leaveEmptyToKeepTheExistingSecret": "La stå tomt for å beholde den eksisterende hemmeligheten. Skriv kun inn en ny verdi hvis du vil endre den.", + "loadingAccounts": "Laster kontoer...", + "noConfigurations": "Ingen OAuth2-konfigurasjoner", + "noConfigurationsDesc": "Du har ikke lagt til noen OAuth2-konfigurasjoner ennå. Legg til en for å begynne å bruke OAuth2-funksjoner.", + "noEmailAccountsRegistered": "Ingen e-postkontoer registrert. Vennligst opprett en.", + "noProxyAvailable": "Ingen proxy tilgjengelig", + "noStatus": "Denne siden viser resultatet av din OAuth2-autentisering. For øyeblikket er ingen spesifikk status tilgjengelig. Vennligst prøv igjen ved behov.", + "oauth2ClientHasBeenSuccessfully": "OAuth2-klient har blitt {{action}}.", + "oauth2ClientUpdated": "OAuth2-klient oppdatert", + "oauth2DeleteFailed": "Sletting av OAuth2 mislyktes", + "optional": "Valgfritt", + "outlook": "Outlook", + "pleaseBeCareful": "Vær forsiktig, denne operasjonen kan ikke angres.", + "pleaseCreateOne": "Vennligst opprett en.", + "provider": "Leverandør", + "quickPresets": "Hurtigvalg:", + "redirectUri": "Omdirigerings-URI", + "redirectUriCannotBeEmpty": "Omdirigerings-URI kan ikke være tom", + "redirectUriIsRequired": "Omdirigerings-URI er påkrevd", + "redirectUrlLabel": "Omdirigerings-URL:", + "save": "Lagre", + "saveChanges": "Lagre endringer", + "saving": "Lagrer...", + "scope": "Omfang:", + "scopes": "Omfang (Scopes)", + "selectAProxy": "Velg en proxy", + "selectAnAccount": "Velg en konto", + "status": "Status", + "statusUpdateFailed": "Statusoppdatering mislyktes, vennligst prøv igjen senere", + "success": "Suksess", + "successMessage": "E-postkontoen din er autentisert via OAuth2. Tilgangstokenet er lagret av systemet og vil bli automatisk oppdatert ved behov.", + "theRedirectUrlAfterAuthorization": "Omdirigerings-URL-en etter autorisasjon. Den må samsvare med den som er registrert hos OAuth-leverandøren. Bruk formatet http://[vert]:[port]/oauth2/callback (eller https://), der [vert] og [port] samsvarer med din RustMailer-utrulling. Banen /oauth2/callback er fast.", + "theUniqueIdentifierForYourApplication": "Den unike identifikatoren for applikasjonen din, levert av OAuth-leverandøren.", + "theUrlUsedToExchange": "URL-en som brukes til å veksle autorisasjonskoden mot et tilgangstoken.", + "theUrlWhereUsersWillBeRedirected": "URL-en brukerne blir omdirigert til for å autorisere applikasjonen din.", + "thisActionWillPermanentlyRemoveTheOauth2Record": "Denne handlingen vil permanent fjerne OAuth2-oppføringen fra systemet. Dette kan ikke angres.", + "thisWillPreventTheOAuth2ClientFromBeingUsed": "Dette vil hindre at OAuth2-klienten blir brukt.", + "title": "OAuth2", + "tokenUrlCannotBeEmpty": "Token-URL kan ikke være tom", + "tokenUrlIsRequired": "Token-URL er påkrevd", + "tokenUrlLabel": "Token-URL:", + "tryAgain": "Prøv igjen", + "unknownError": "En ukjent feil oppstod.", + "updateFailed": "Oppdatering mislyktes", + "updateHere": "Oppdater her.", + "updateOrCreationFailed": "{{action}} mislyktes, vennligst prøv igjen senere", + "updated": "Oppdatert", + "useProxyOptional": "Bruk Proxy (valgfritt):", + "useSocks5ProxyForOAuthRequests": "Bruk SOCKS5-proxy for OAuth-forespørsler når direkte tilgang er blokkert.", + "value": "Verdi:", + "valueCannotBeEmpty": "Verdi kan ikke være tom", + "valueIsRequired": "Verdi er påkrevd", + "warning": "Advarsel!", + "whenDisabled": "Når deaktivert: - Nye autorisasjonsforespørsler vil bli avvist umiddelbart - Eksisterende tilgangstokener og oppfriskningstokener vil bli tilbakekalt innen 1 minutt - Brukere må autorisere på nytt ved reaktivering", + "yourOAuth2ApplicationHasBeenSuccessfully": "Din OAuth2-applikasjon har blitt {{action}}.", + "yourOAuth2ApplicationHasBeenSuccessfullyDeleted": "Din OAuth2-applikasjon har blitt slettet." + }, + "permission": { + "account": { + "create": "Opprette e-postkontoer", + "manage": "Administrere tildelte kontoer", + "manage_all": "Administrere alle kontoinnstillinger", + "read_details": "Vise kontodetaljer" + }, + "category": { + "account": "Kontotillatelser", + "global_data": "Globale data (Administrator)", + "system_identity": "System og identitet" + }, + "data": { + "delete": "Slette tildelte e-poster", + "delete_all": "Slette e-poster fra alle kontoer", + "export_batch": "Batch-eksportere tildelte data", + "export_batch_all": "Batch-eksportere alle data", + "import_batch": "Batch-importere e-postdata", + "manage": "Administrere tildelte e-postmetadata", + "manage_all": "Administrere all e-postmetadata", + "raw_download": "Laste ned tildelte rå e-poster", + "raw_download_all": "Laste ned alle rå e-poster", + "read": "Lese tildelte e-postdata", + "read_all": "Lese alle e-postdata", + "smtp_ingest": "Hent e-post via SMTP-protokoll" + }, + "dialog": { + "account_description": "Tillatelser som er begrenset til den valgte kontoen.", + "account_title": "Kontotillatelser", + "global_description": "Systemomfattende tillatelser gitt til denne brukeren.", + "global_title": "Globale tillatelser" + }, + "scope": { + "account": "Konto #{{id}}", + "global": "Global" + }, + "system": { + "access": "Grunnleggende systemtilgang", + "root": "Full systemkontroll" + }, + "token": { + "manage": "Administrere tilgangstokener" + }, + "user": { + "manage": "Administrere alle brukere", + "view": "Vise grunnleggende brukernavn" + } + }, + "profile": { + "avatar_alt": "Avatar", + "menu": { + "profile": "Profil", + "settings": "Innstillinger", + "sign_out": "Logg ut" + } + }, + "proxyDelete": { + "close": "Lukk", + "confirmText": "Er du sikker på at du vil slette", + "deleteBtn": "Slett", + "failedDesc": "Sletting mislyktes, vennligst prøv igjen senere", + "failedTitle": "Sletting av Proxy mislyktes", + "permanent": "Denne handlingen vil permanent fjerne Proxyen fra systemet. Dette kan ikke angres.", + "proxyIdLabel": "Proxy-ID:", + "proxyIdPlaceholder": "Skriv inn Proxy-ID for å bekrefte sletting.", + "successDesc": "Proxy har blitt slettet.", + "successTitle": "Sletting vellykket", + "title": "Slett Proxy", + "tryAgain": "Prøv igjen", + "warningDesc": "Vennligst vær forsiktig, denne operasjonen kan ikke angres.", + "warningTitle": "Advarsel!" + }, + "restore_message": { + "accountsInvolved": "Involverte kontoer", + "bulkTitle": "Gjenopprett flere meldinger", + "bulkWarning": "Merk: Meldinger vil bli gjenopprettet til sine opprinnelige mapper.", + "confirm": "Utfør gjenoppretting", + "desc": "Denne handlingen vil laste opp valgte meldinger fra Bichon på nytt og gjenopprette dem til de tilsvarende postkassene på IMAP-serveren.", + "failed": "Gjenoppretting mislykkedes", + "failedTitle": "Feil ved gjenoppretting", + "messages": "meldinger", + "restore_to_imap": "Gjenopprett melding", + "success": "Gjenoppretting vellykket", + "successDesc": "De valgte meldingene er gjenopprettet til IMAP-serveren.", + "summary": "Gjenopprettingsdetaljer", + "title": "Gjenopprett enkeltmelding" + }, + "roles": { + "actions": { + "add": "Legg til rolle", + "cancel": "Avbryt", + "close": "Lukk", + "failed": "Handlingen mislyktes", + "retry": "Prøv igjen", + "submit_create": "Opprett rolle", + "submit_update": "Oppdater rolle", + "success_create": "Rollen ble opprettet", + "success_update": "Rollen ble oppdatert" + }, + "categories": { + "account_resource": "Kontoresurs-tilgang", + "global_data": "Global datatilgang", + "identity": "Identitet og administrasjon" + }, + "columns": { + "created_at": "Opprettet", + "id": "ID", + "name": "Navn", + "permissions": "Tillatelser", + "role_type": "Type", + "updated_at": "Oppdatert" + }, + "delete": { + "alert_desc": "Sletting av denne rollen vil fjerne den fra alle tildelte brukere.", + "alert_title": "Advarsel: Permanent handling.", + "confirm_btn": "Slett rolle", + "confirm_label": "Skriv rolle-ID for å bekrefte:", + "deleting": "Sletter...", + "dialog_title": "Slett rolle", + "error_fallback": "Kunne ikke slette rollen.", + "error_title": "Sletting mislyktes", + "irreversible": "Denne handlingen kan ikke angres.", + "placeholder": "Skriv \"{{id}}\"", + "success_desc": "Rollen \"{{name}}\" ble fjernet.", + "success_title": "Rolle slettet", + "warning_text": "Du sletter rollen {{name}} (ID: {{id}}) permanent." + }, + "description_hint": "Definer tilgangsomfang og tillatelser.", + "details": { + "close_btn": "Lukk", + "desc_account": "Tilgang og datahandlinger for individuelle kontoer.", + "desc_global": "Global administrasjon og systemtilgang.", + "role_badge": "{{type}}-rolle", + "title": "Tillatelser: {{name}}", + "unknown": "Ukjent rolle", + "view_permissions": "Se detaljer" + }, + "empty": { + "desc": "Du har ikke opprettet noen egendefinerte roller ennå.", + "title": "Ingen roller funnet" + }, + "form": { + "builtin_badge": "Innebygd rolle", + "builtin_desc": "Denne rollen er forhåndsdefinert og kan ikke endres.", + "desc_label": "Beskrivelse", + "matrix_label": "Rettighetsmatrise ({{type}})", + "name_label": "Rollenavn", + "type_label": "Rolletype" + }, + "placeholder": { + "filter": "Søk etter roller..." + }, + "title": { + "create": "Opprett ny rolle", + "edit": "Rediger rolle: {{name}}" + }, + "types": { + "Account": "Konto", + "Global": "Global" }, "validation": { - "required": "Dette feltet er påkrevd", - "invalidEmail": "Ugyldig e-postadresse", - "invalidUrl": "Ugyldig URL", - "passwordMinLength": "Passordet må være minst {{min}} tegn langt", - "pleaseEnterPassword": "Vennligst skriv inn passordet ditt", - "passwordRequired": "Passord er påkrevd når autentiseringsmetoden er Passord", - "emailRequired": "E-post er påkrevd", - "imapHostRequired": "IMAP-vert er påkrevd", - "imapHostCannotBeEmpty": "IMAP-vert kan ikke være tom", - "imapPortMustBePositive": "IMAP-port må være et positivt heltall", - "imapPortMustBeLessThan65536": "IMAP-port må være mindre enn 65536", - "folderLimitMustBeNumber": "Mappegrense må være et tall", - "folderLimitMustBeAtLeast100": "Mappegrense må være minst 100", - "incrementalSyncMustBeNumber": "Intervall for inkrementell synkronisering må være et tall", - "incrementalSyncMustBeAtLeast10": "Intervall for inkrementell synkronisering må være minst 10 minutter", - "pleaseEnterUsernameOrEmail": "Skriv inn brukernavn eller e-postadresse", - "singleRequestBatchSizeMustBeNumber": "Batchstørrelse må være et tall", - "singleRequestBatchSizeTooSmall": "Batchstørrelse må være minst 10", - "singleRequestBatchSizeTooLarge": "Batchstørrelse må være maksimalt 200" - }, - "table": { - "noResults": "Ingen resultater funnet", - "loading": "Laster inn...", - "page": "Side", - "of": "av", - "rowsPerPage": "Rader per side", - "showing": "Viser", - "to": "til", - "results": "resultater", - "asc": "Stigende", - "desc": "Synkende", - "hide": "Skjul", - "edit": "Rediger", - "delete": "Slett", - "pagination": { - "selected": "{{selected}} av {{total}} rader valgt.", - "fixed_page_size": "{{size}} rader per side.", - "rows_per_page": "Rader per side", - "page_info": "Side {{page}} av {{total}}", - "first": "Gå til første side", - "previous": "Forrige side", - "next": "Neste side", - "last": "Gå til siste side" - } - }, - "proxyDelete": { - "title": "Slett Proxy", - "successTitle": "Sletting vellykket", - "successDesc": "Proxy har blitt slettet.", - "close": "Lukk", - "failedTitle": "Sletting av Proxy mislyktes", - "failedDesc": "Sletting mislyktes, vennligst prøv igjen senere", - "tryAgain": "Prøv igjen", - "confirmText": "Er du sikker på at du vil slette", - "permanent": "Denne handlingen vil permanent fjerne Proxyen fra systemet. Dette kan ikke angres.", - "proxyIdLabel": "Proxy-ID:", - "proxyIdPlaceholder": "Skriv inn Proxy-ID for å bekrefte sletting.", - "warningTitle": "Advarsel!", - "warningDesc": "Vennligst vær forsiktig, denne operasjonen kan ikke angres.", - "deleteBtn": "Slett" - }, - "systemConfig": { - "pageTitle": "Systemkonfigurasjoner", - "pageDescription": "Disse parametrene initialiseres via CLI-flagg eller miljøvariabler. De er skrivebeskyttede.", - "status": { - "enabled": "Aktivert", - "disabled": "Deaktivert", - "configured": "Konfigurert", - "missing": "Mangler", - "auto": "Auto", - "notSet": "Ikke satt" - }, - "sections": { - "network": { - "title": "Nettverk", - "desc": "HTTP og offentlig tilgang" - }, - "cors": { - "title": "CORS", - "desc": "Tilgangsregler for cross-origin" - }, - "logging": { - "title": "Logging", - "desc": "Loggutdata-oppførsel" - }, - "storage": { - "title": "Lagring og cache", - "desc": "Databasestier og grenser" - }, - "security": { - "title": "Sikkerhet", - "desc": "Autentisering og kryptering" - }, - "performance": { - "title": "Ytelse", - "desc": "Samtidighet og komprimering" - }, - "smtp": { - "title": "SMTP-server", - "desc": "Innstillinger for mottak av innkommende e-post for sanntidsarkivering" - } - } - }, - "apiTokens": { - "page": { - "loadError": "Kunne ikke laste API-tokener.", - "emptyTitle": "Ingen API-tokener", - "emptyDescription": "Du har ikke opprettet noen API-tokener ennå. Klikk nedenfor for å opprette en.", - "addBtn": "Legg til token" - }, - "list": { - "unnamedToken": "Navnløs token", - "statusActive": "Aktiv", - "statusExpired": "Utløpt", - "neverExpires": "Utløper aldri", - "expiresOnShort": "Utløper {{date}}", - "tokenLabel": "Token", - "createdLabel": "Opprettet", - "lastUsedLabel": "Sist brukt", - "expiresOnLabel": "Utløper den", - "neverUsed": "Aldri", - "neverLabel": "Aldri", - "deleteBtn": "Slett token" - }, - "dialog": { - "createTitle": "Opprett tilgangstoken", - "editTitle": "Rediger tilgangstoken", - "description": "Klikk på lagre når du er ferdig.", - "save": "Lagre", - "saveChanges": "Lagre endringer" - }, - "deleteDialog": { - "title": "Slett tilgangstoken?", - "description": "Denne handlingen kan ikke angres. Enhver applikasjon som bruker denne tokenen vil umiddelbart miste tilgangen.", - "cancel": "Avbryt", - "confirm": "Slett", - "deleting": "Sletter..." - }, - "form": { - "nameLabel": "Navn", - "namePlaceholder": "Gi denne tokenen et kort navn", - "nameDescription": "Valgfritt · Maks 32 tegn", - "expirationLabel": "Utløp", - "expirationPlaceholder": "Velg utløp", - "expirationDescription": "Tokener utløper automatisk etter valgt tid.", - "never": "Aldri", - "1day": "1 dag", - "7days": "7 dager", - "30days": "30 dager", - "errorMax": "Maks 32 tegn", - "errorNumber": "Må være et tall", - "errorInt": "Må være et heltall", - "errorPositive": "Må være større enn 0" - }, - "notifications": { - "createSuccess": "Tilgangstoken opprettet", - "createSuccessDesc": "Tilgangstokenet ble opprettet.", - "updateSuccess": "Tilgangstoken oppdatert", - "updateSuccessDesc": "Tilgangstokenet ble oppdatert.", - "createFailed": "Oppretting feilet", - "updateFailed": "Oppdatering feilet", - "deleteSuccess": "Token slettet", - "deleteFailed": "Kunne ikke slette token", - "copied": "Kopiert til utklippstavle", - "genericError": "Handlingen feilet. Prøv igjen.", - "close": "Lukk", - "tryAgain": "Prøv igjen" - } - }, - "permission": { - "scope": { - "global": "Global", - "account": "Konto #{{id}}" - }, - "dialog": { - "global_title": "Globale tillatelser", - "account_title": "Kontotillatelser", - "global_description": "Systemomfattende tillatelser gitt til denne brukeren.", - "account_description": "Tillatelser som er begrenset til den valgte kontoen." - }, - "category": { - "system_identity": "System og identitet", - "global_data": "Globale data (Administrator)", - "account": "Kontotillatelser" - }, - "system": { - "access": "Grunnleggende systemtilgang", - "root": "Full systemkontroll" - }, - "user": { - "manage": "Administrere alle brukere", - "view": "Vise grunnleggende brukernavn" - }, - "token": { - "manage": "Administrere tilgangstokener" - }, - "account": { - "create": "Opprette e-postkontoer", - "manage": "Administrere tildelte kontoer", - "manage_all": "Administrere alle kontoinnstillinger", - "read_details": "Vise kontodetaljer" - }, - "data": { - "read": "Lese tildelte e-postdata", - "read_all": "Lese alle e-postdata", - "manage": "Administrere tildelte e-postmetadata", - "manage_all": "Administrere all e-postmetadata", - "raw_download": "Laste ned tildelte rå e-poster", - "raw_download_all": "Laste ned alle rå e-poster", - "delete": "Slette tildelte e-poster", - "delete_all": "Slette e-poster fra alle kontoer", - "export_batch": "Batch-eksportere tildelte data", - "export_batch_all": "Batch-eksportere alle data", - "import_batch": "Batch-importere e-postdata", - "smtp_ingest": "Hent e-post via SMTP-protokoll" - } - }, - "users": { - "columns": { - "id": "ID", - "avatar": "Avatar", - "username": "Brukernavn", - "email": "E-postadresse", - "roles": "Roller og tillatelser", - "created_at": "Opprettet", - "updated_at": "Oppdatert", - "actions": "Handlinger" - }, - "buttons": { - "add": "Legg til bruker", - "add_new": "Ny bruker" - }, - "empty": { - "title": "Ingen brukere funnet", - "description": "Klikk på knappen nedenfor for å legge til din første bruker." - }, - "nav": { - "users": "Brukere", - "roles": "Roller", - "api_tokens": "API-tokens" - }, - "api_tokens": { - "empty": { - "title": "Ingen API-tokens funnet", - "description": "Det er ennå ikke generert noen API-tokens i systemet." - }, - "button": { - "generate": "Generer nytt token" - }, - "toolbar": { - "search_placeholder": "Søk etter navn, eier eller token..." - }, - "table": { - "name": "Navn", - "type": "Type", - "last_used": "Sist brukt", - "expires_at": "Utløper", - "owner": "Eier", - "created": "Opprettet", - "api_key": "API-nøkkel", - "web_ui": "Web-grensesnitt", - "never": "Aldri", - "permanent": "Permanent", - "expired": "Utløpt", - "unnamed": "Navnløst token" - }, - "unnamed": "Navnløst token", - "delete": { - "title": "Slett API-token", - "desc": "Du er i ferd med å slette dette API-tokenet permanent", - "prefix": "Token-prefiks", - "irreversible": "Denne handlingen kan ikke angres. Applikasjoner som bruker dette tokenet vil miste tilgangen umiddelbart.", - "confirm_label": "Skriv {{word}} nedenfor for å bekrefte:", - "confirm_placeholder": "Skriv \"{{word}}\" for å bekrefte", - "warning_title": "Advarsel", - "warning_desc": "Skript eller tjenester som bruker dette tokenet vil slutte å fungere. Sørg for at du har oppdatert systemene dine.", - "confirm_button": "Slett token", - "deleting": "Sletter..." - }, - "toast": { - "deleted_title": "API-token slettet", - "deleted_desc": "Tokenet \"{{name}}\" ble fjernet.", - "delete_failed_title": "Sletting mislyktes", - "delete_failed": "Kunne ikke slette tokenet, vennligst prøv igjen." - } - }, - "tokens": { - "schema": { - "name_max": "Maks 32 tegn", - "expire_number": "Må være et tall", - "expire_int": "Må være et heltall", - "expire_positive": "Må være større enn 0" - }, - "toast": { - "update_success_title": "Token oppdatert", - "update_success_desc": "Tilgangstoken ble oppdatert.", - "create_success_title": "Token opprettet", - "create_success_desc": "Tilgangstoken ble opprettet.", - "update_failed_title": "Oppdatering mislyktes", - "create_failed_title": "Opprettelse mislyktes" - }, - "error": { - "fallback": "Handlingen mislyktes, vennligst prøv igjen senere." - }, - "dialog": { - "edit_title": "Rediger tilgangstoken", - "create_title": "Opprett tilgangstoken", - "description": "Klikk på lagre når du er ferdig." - }, - "fields": { - "name_label": "Navn", - "name_placeholder": "Gi tokenet et kort navn", - "name_hint": "Valgfritt · Maks 32 tegn", - "expire_label": "Utløp", - "expire_placeholder": "Velg utløpstid", - "expire_hint": "Tokenet utløper automatisk etter den valgte tiden." - }, - "expire_options": { - "never": "Utløper aldri", - "1_day": "1 dag", - "7_days": "7 dager", - "30_days": "30 dager" - } - }, - "tokens_action": { - "dialog": { - "title": "API-tokens", - "description": "Administrer API-tokens for denne brukeren." - }, - "empty": { - "title": "Ingen API-tokens", - "description": "Denne brukeren har ingen API-tokens for øyeblikket." - }, - "buttons": { - "add": "Legg til token" - }, - "list": { - "unnamed_token": "Navnløst token", - "status_expired": "Utløpt", - "status_active": "Aktiv", - "expires_on_brief": "Utløper {{date}}", - "never_expires": "Utløper aldri", - "label_token": "Token", - "label_created": "Opprettet", - "label_last_used": "Sist brukt", - "label_expires_at": "Utløpsdato", - "never": "Aldri", - "button_delete": "Slett token" - }, - "delete_dialog": { - "title": "Slette tilgangstoken?", - "description": "Denne handlingen kan ikke angres." - } - }, - "actions": { - "schema": { - "account_required": "Vennligst velg en konto", - "role_required": "Vennligst velg en rolle", - "username_required": "Brukernavn er påkrevd", - "username_min": "Minst 3 tegn", - "username_max": "Maks 32 tegn", - "email_required": "E-post er påkrevd", - "email_invalid": "Oppgi en gyldig e-postadresse", - "global_role_required": "Tildel minst én global rolle", - "description_max": "Beskrivelse maks 256 tegn", - "ip_invalid": "Ugyldig IP-adresse", - "password_required": "Passord er påkrevd", - "password_min": "Minst 8 tegn", - "password_max": "Maks 256 tegn" - }, - "toast": { - "updated": "Bruker oppdatert", - "created": "Bruker opprettet" - }, - "dialog": { - "edit_title": "Rediger bruker: {{name}}", - "create_title": "Opprett ny bruker", - "subtitle": "Konfigurer identitet, tilgangsnivåer og sikkerhet." - }, - "tabs": { - "general": "Generelt", - "permissions": "Kontorettigheter", - "security": "Sikkerhet og ACL" - }, - "sections": { - "basic": "Grunnleggende identitet", - "global": "Globale rettigheter", - "mail_access": "E-post tilgangskontroll", - "mail_access_subtitle": "E-postkontoer som denne brukeren kan administrere.", - "policy": "Retningslinjer" - }, - "fields": { - "username": "Brukernavn", - "username_hint": "Unik identifikator for innlogging.", - "email": "E-postadresse", - "email_hint": "Primær kontakt og varslinger.", - "password": "Passord", - "password_placeholder_create": "Minst 8 tegn", - "password_placeholder_edit": "La stå tom for å beholde nåværende", - "password_hint_create": "Sikkert passord for første oppsett.", - "password_hint_edit": "Skriv inn nytt passord kun hvis du vil endre det.", - "global_roles_hint": "Tildel systemrettigheter.", - "description": "Beskrivelse (valgfritt)", - "description_placeholder": "Notater om brukeren...", - "description_hint": "Interne notater (maks 256 tegn).", - "select_account": "Velg konto", - "assign_role": "Tildel rolle", - "ip_whitelist": "IP-hviteliste", - "ip_whitelist_hint": "Begrens pålogging til disse IP-ene (én per linje).", - "rate_quota": "Hastighetskvote", - "burst_interval": "Burst-intervall (sek)" - }, - "buttons": { - "add_account": "Legg til konto", - "update": "Oppdater bruker", - "create": "Opprett bruker" - }, - "states": { - "full_access": "Full tilgangsmodus", - "full_access_desc": "Administratorer har tilgang til alle kontoer som standard.", - "no_accounts": "Ingen spesifikke kontoer tildelt.", - "security_disabled": "Sikkerhetsregler er deaktivert." - }, - "api_tokens": "API-tokens", - "placeholder": { - "filter": "Søk etter brukere..." - }, - "delete": { - "title": "Slett bruker", - "confirm_msg": "Du sletter brukeren {{name}} (ID: {{id}}) permanent.", - "irreversible": "Denne handlingen kan ikke angres.", - "input_label": "Skriv bruker-ID for å bekrefte:", - "placeholder": "Skriv \"{{id}}\"", - "alert_title": "Advarsel: Permanent handling.", - "alert_desc": "Brukeren og alle tilhørende data vil bli slettet.", - "button_confirm": "Slett bruker", - "button_deleting": "Sletter...", - "toast": { - "success_title": "Bruker slettet", - "success_desc": "Brukeren \"{{name}}\" ble fjernet.", - "failed_title": "Sletting mislyktes", - "failed_fallback": "Kunne ikke slette brukeren." - } - } - } - }, - "roles": { - "title": { - "create": "Opprett ny rolle", - "edit": "Rediger rolle: {{name}}" - }, - "description_hint": "Definer tilgangsomfang og tillatelser.", - "form": { - "name_label": "Rollenavn", - "type_label": "Rolletype", - "desc_label": "Beskrivelse", - "matrix_label": "Rettighetsmatrise ({{type}})", - "builtin_badge": "Innebygd rolle", - "builtin_desc": "Denne rollen er forhåndsdefinert og kan ikke endres." - }, - "types": { - "Global": "Global", - "Account": "Konto" - }, - "categories": { - "identity": "Identitet og administrasjon", - "global_data": "Global datatilgang", - "account_resource": "Kontoresurs-tilgang" - }, - "actions": { - "cancel": "Avbryt", - "submit_create": "Opprett rolle", - "submit_update": "Oppdater rolle", - "success_create": "Rollen ble opprettet", - "success_update": "Rollen ble oppdatert", - "failed": "Handlingen mislyktes", - "close": "Lukk", - "retry": "Prøv igjen", - "add": "Legg til rolle" - }, - "validation": { - "name_required": "Rollenavn er påkrevd", - "perm_required": "Velg minst én tillatelse" - }, - "columns": { - "id": "ID", - "name": "Navn", - "role_type": "Type", - "permissions": "Tillatelser", - "created_at": "Opprettet", - "updated_at": "Oppdatert" - }, - "placeholder": { - "filter": "Søk etter roller..." - }, - "delete": { - "dialog_title": "Slett rolle", - "warning_text": "Du sletter rollen {{name}} (ID: {{id}}) permanent.", - "irreversible": "Denne handlingen kan ikke angres.", - "confirm_label": "Skriv rolle-ID for å bekrefte:", - "placeholder": "Skriv \"{{id}}\"", - "alert_title": "Advarsel: Permanent handling.", - "alert_desc": "Sletting av denne rollen vil fjerne den fra alle tildelte brukere.", - "confirm_btn": "Slett rolle", - "deleting": "Sletter...", - "success_title": "Rolle slettet", - "success_desc": "Rollen \"{{name}}\" ble fjernet.", - "error_title": "Sletting mislyktes", - "error_fallback": "Kunne ikke slette rollen." - }, - "details": { - "title": "Tillatelser: {{name}}", - "unknown": "Ukjent rolle", - "role_badge": "{{type}}-rolle", - "desc_global": "Global administrasjon og systemtilgang.", - "desc_account": "Tilgang og datahandlinger for individuelle kontoer.", - "close_btn": "Lukk", - "view_permissions": "Se detaljer" - }, - "empty": { - "title": "Ingen roller funnet", - "desc": "Du har ikke opprettet noen egendefinerte roller ennå." - } - }, - "profile": { - "avatar_alt": "Avatar", - "menu": { - "profile": "Profil", - "settings": "Innstillinger", - "sign_out": "Logg ut" - } - }, - "sign_out": { - "title": "Logg ut", - "desc": "Er du sikker på at du vil logge ut? Du må logge inn igjen for å få tilgang til kontoen din.", - "confirm": "Logg ut" - }, - "restore_message": { - "title": "Gjenopprett enkeltmelding", - "bulkTitle": "Gjenopprett flere meldinger", - "bulkWarning": "Merk: Meldinger vil bli gjenopprettet til sine opprinnelige mapper.", - "accountsInvolved": "Involverte kontoer", - "summary": "Gjenopprettingsdetaljer", - "messages": "meldinger", - "desc": "Denne handlingen vil laste opp valgte meldinger fra Bichon på nytt og gjenopprette dem til de tilsvarende postkassene på IMAP-serveren.", - "confirm": "Utfør gjenoppretting", - "restore_to_imap": "Gjenopprett melding", - "success": "Gjenoppretting vellykket", - "successDesc": "De valgte meldingene er gjenopprettet til IMAP-serveren.", - "failed": "Gjenoppretting mislykkedes", - "failedTitle": "Feil ved gjenoppretting" - }, - "time": { - "label": "Tid", - "since": "Siden", - "before": "Før", - "recent_range": "Nylig periode (siden...)", - "historical": "Historisk periode (før...)", - "absolute_range": "Absolutt datointervall", - "last_day": "Siste 1 dag", - "last_days": "Siste {{count}} dager", - "last_months": "Siste {{count}} måneder", - "over_years_ago": "For {{count}} {{unit}} siden", - "year": "år", - "years": "år", - "recent_prefix": "Nylig:", - "days_ago_to_now": "dager siden til nå", - "apply": "Bruk", - "start_date": "Startdato", - "end_date": "Sluttdato", - "clear_filters": "Fjern tidsfiltre", - "format": "yyyy-MM-dd" - }, - "tag": { - "label": "Etiketter", - "search_placeholder": "Søk etter etiketter...", - "clear_all": "Fjern alle etiketter", - "no_tags_found": "Ingen etiketter funnet" - }, - "search_accounts": { - "label": "E-postkontoer", - "search_placeholder": "Søk etter e-postkontoer...", - "clear_accounts": "Fjern valgte kontoer", - "no_accounts_found": "Ingen kontoer funnet" - }, - "search_mailbox": { - "label": "Postbokser", - "search_placeholder": "Søk i postbokser", - "clear_mailboxes": "Fjern valgte mapper", - "select_account_first": "Velg først en e-postkonto", - "no_mailbox_found": "Ingen mappe funnet" - }, - "search_contacts": { - "label": "Kontakter", - "label_with_count": "Kontakter ({{count}})", - "any": "Alle", - "search_placeholder": "Søk i {{field}}...", - "reset_all": "Tilbakestill alle kontakter", - "no_contact_found": "Ingen kontakter funnet", - "loading": "Laster...", - "showing_limit": "Viser kun de første 100 resultatene • Totalt {{total}}" - }, - "search_more": { - "trigger_label": "Avansert", - "title": "Avanserte filtre", - "reset": "Tilbakestill", - "has_attachment": "Har vedlegg", - "attachment_name_label": "Vedleggsnavn", - "attachment_name_placeholder": "F.eks.: invoice.pdf", - "message_size_label": "Meldingsstørrelse", - "message_id_label": "Opprinnelig Message-ID", - "message_id_description": "Søk via Message-ID i e-postheaderen", - "apply": "Bruk filtre", - "size_presets": { - "any": "Alle størrelser", - "tiny": "Svært liten (< 15 KB)", - "small": "Liten (< 2 MB)", - "medium": "Middels (2 – 10 MB)", - "large": "Stor (10 – 20 MB)", - "huge": "Svært stor (> 20 MB)" - }, - "any": "Alle", - "search_placeholder": "Søk {{field}}...", - "extension": "Filendelse", - "category": "Vedleggskategori", - "content_types": "Spesifikk type" - }, - "search_view": { - "button_label": "Visning", - "menu_title": "Kolonneinnstillinger" - }, - "search_reset": { - "label": "Tilbakestill", - "tooltip": "Fjern alle filtre" - }, - "search_input": { - "placeholder": "Søk i e-poster... (Regex støttes)", - "button": "Søk", - "recent_title": "Nylige søk", - "clear_history": "Tøm historikk", - "no_history": "Ingen søkehistorikk", - "all": "Alle", - "all_fields_desc": "Søker i emne, tekst, avsender og mottakere", - "subject": "Emne", - "body": "Innhold" + "name_required": "Rollenavn er påkrevd", + "perm_required": "Velg minst én tillatelse" } + }, + "search": { + "account": "Konto", + "addEmailAccount": "Legg til e-postkonto", + "addTags": { + "cancel": "Avbryt", + "createHint": "Opprett ny etikett: {{tag}}", + "invalidTitle": "Ugyldig etikett", + "none": "Ingen etiketter lagt til", + "save": "Lagre", + "saving": "Lagrer...", + "searchPlaceholder": "Søk eller opprett etikett...", + "selectedCount": "{{count}} etiketter valgt", + "title": "Rediger etiketter", + "tryAgain": "Vennligst prøv igjen senere", + "updateFailedTitle": "Oppdatering mislyktes", + "updatedDesc": "Etiketter har blitt oppdatert", + "updatedTitle": "Etiketter oppdatert" + }, + "adjustSearch": "Prøv å justere søkekriteriene dine eller tøm filtre.", + "advanced": "Avansert", + "advancedFilters": "Avanserte filtre", + "any": "Alle", + "attachmentName": "Vedleggsnavn", + "attachmentsSize": "Vedlegg og størrelse", + "bcc": "Blindkopi (BCC)", + "before": "Før:", + "bulkActions": { + "ariaLabel": "{{count}} meldinger valgt. Verktøylinje", + "clear": "Fjern valg", + "delete": "Slett", + "deleteDesc": "Slett valgte meldinger", + "manageTags": "Administrer tagger", + "selected": "{{count}} valgt" + }, + "cc": "Kopi (CC)", + "clear": "Tøm", + "date": "Dato", + "dateRange": "Datointervall", + "delete": { + "confirmButton": "Slett", + "confirmDetail": "Denne handlingen kan ikke angres.", + "confirmPrefix": "Er du sikker på at du vil slette", + "countLabel": "{{count}} melding(er)?", + "errorTitle": "Sletting mislyktes", + "successDesc": "Meldingene ble slettet.", + "successTitle": "Slettet", + "title": "Slett meldinger", + "warningDesc": "Meldinger slettes permanent.", + "warningTitle": "Advarsel" + }, + "editTag": "Rediger etikett", + "endDate": "Sluttdato", + "from": "Fra", + "fullTextMultiAccount": "Fulltekst · Flerkonto · Avanserte filtre", + "hasAttachment": "Har vedlegg", + "huge": "Kjempestor (≥20 MB)", + "keyword": "Nøkkelord", + "large": "Stor (10 - 20 MB)", + "mailbox": "Postkasse", + "maxSize": "Maks. størrelse", + "maximumBytes": "Maksimum", + "medium": "Middels (2 - 10 MB)", + "messageId": "Meldings-ID", + "minSize": "Min. størrelse", + "minimumBytes": "Minimum", + "no": "Nei", + "noActiveEmailAccount": "Ingen aktiv e-postkonto.", + "noEmailsFound": "Ingen e-poster funnet", + "noMailboxSelectAccount": "Ingen postkasse. Vennligst velg en konto først.", + "originalMessageIdHeader": "Opprinnelig e-post Message-ID header", + "pleaseSelectAtLeastOne": "Vennligst velg minst ett søkekriterium", + "preview": "Forhåndsvisning", + "recipient": "Mottaker", + "searchArchivedEmails": "Søk i arkiverte e-poster", + "searchButton": "Søk", + "searchInSubjectBody": "Søk i emne, innhold, vedlegg...", + "searching": "Søker, vennligst vent…", + "searchingButton": "Søker...", + "selectAccount": "Velg konto", + "selectDate": "Velg en dato", + "selectMailbox": "Velg postkasse", + "sender": "Avsender", + "senderRecipients": "Avsender / Mottakere", + "since": "Siden:", + "size": "Størrelse", + "sizeDescription": "Størrelsen viser til e-postens totale størrelse, inkludert vedlegg.", + "small": "Liten (<2 MB)", + "sort": "Sorter", + "source": "Kilde", + "startDate": "Startdato", + "startSearching": "Start ved å skrive inn et nøkkelord, avsender eller bruk avanserte filtre.", + "subject": "Emne", + "tagFilter": "Etikettfilter", + "thread": { + "empty": "Ingen meldinger i denne tråden", + "error": "Kunne ikke laste tråd", + "invalidDate": "Ugyldig dato", + "loadMore": "Last mer", + "loadingMore": "Laster...", + "noSubject": "(Uten emne)", + "title": "Tråd · {{count}} meldinger" + }, + "tiny": "Svært liten (<15 KB)", + "title": "Søk", + "to": "Til", + "updateTags": { + "actionAdd": "Legg til", + "actionOverwrite": "Overskriv", + "actionRemove": "Fjern", + "cancel": "Avbryt", + "createHint": "Trykk Enter for å opprette ny tagg: \"{{tag}}\"", + "invalidTitle": "Ugyldig tagg", + "none": "Ingen tagger valgt", + "overwriteWarning": "Advarsel: Dette vil overskrive alle eksisterende tagger på de valgte elementene.", + "savingAdd": "Legger til...", + "savingOverwrite": "Overskriver...", + "savingRemove": "Fjerner...", + "searchPlaceholder": "Søk eller opprett ny tagg...", + "selectedCount": "{{count}} tag(g/er) vil bli brukt", + "submitAdd": "Legg til tagger", + "submitOverwrite": "Overskriv tagger", + "submitRemove": "Fjern tagger", + "title": "Oppdater tagger", + "tryAgain": "Vennligst prøv igjen senere.", + "updateFailedTitle": "Oppdatering mislyktes", + "updatedDesc": "Tagger har blitt oppdatert.", + "updatedTitle": "Tagger oppdatert" + }, + "yes": "Ja" + }, + "search_accounts": { + "clear_accounts": "Fjern valgte kontoer", + "label": "E-postkontoer", + "no_accounts_found": "Ingen kontoer funnet", + "search_placeholder": "Søk etter e-postkontoer..." + }, + "search_contacts": { + "any": "Alle", + "label": "Kontakter", + "label_with_count": "Kontakter ({{count}})", + "loading": "Laster...", + "no_contact_found": "Ingen kontakter funnet", + "reset_all": "Tilbakestill alle kontakter", + "search_placeholder": "Søk i {{field}}...", + "showing_limit": "Viser kun de første 100 resultatene • Totalt {{total}}" + }, + "search_input": { + "all": "Alle", + "all_fields_desc": "Søker i emne, tekst, avsender og mottakere", + "body": "Innhold", + "button": "Søk", + "clear_history": "Tøm historikk", + "no_history": "Ingen søkehistorikk", + "placeholder": "Søk etter e-poster (bruk \" \" for frasesøk)", + "recent_title": "Nylige søk", + "subject": "Emne" + }, + "search_mailbox": { + "clear_mailboxes": "Fjern valgte mapper", + "label": "Postbokser", + "no_mailbox_found": "Ingen mappe funnet", + "search_placeholder": "Søk i postbokser", + "select_account_first": "Velg først en e-postkonto" + }, + "search_more": { + "any": "Alle", + "apply": "Bruk filtre", + "attachment_name_label": "Vedleggsnavn", + "attachment_name_placeholder": "F.eks.: invoice.pdf", + "category": "Vedleggskategori", + "content_type": "Filtype", + "extension": "Filendelse", + "has_attachment": "Har vedlegg", + "is_message": "Vedlegg i e-postformat", + "is_message_desc": "Dette vedlegget er en e-postfil, for eksempel en .eml-fil.", + "message_id_description": "Søk via Message-ID i e-postheaderen", + "message_id_label": "Opprinnelig Message-ID", + "message_size_label": "Meldingsstørrelse", + "reset": "Tilbakestill", + "search_placeholder": "Søk {{field}}...", + "size_presets": { + "any": "Alle størrelser", + "huge": "Svært stor (> 20 MB)", + "large": "Stor (10 – 20 MB)", + "medium": "Middels (2 – 10 MB)", + "small": "Liten (< 2 MB)", + "tiny": "Svært liten (< 15 KB)" + }, + "title": "Avanserte filtre", + "trigger_label": "Avansert" + }, + "search_reset": { + "label": "Tilbakestill", + "tooltip": "Fjern alle filtre" + }, + "search_view": { + "button_label": "Visning", + "menu_title": "Kolonneinnstillinger" + }, + "settings": { + "accounts": "Kontoer", + "acl": "Acl", + "actions": "Handlinger", + "add": "Legg til", + "addNewProxyHere": "Legg til ny proxy her. ", + "adding": "Legger til...", + "appearance": { + "button": { + "update": "Oppdater innstillinger" + }, + "command": { + "no_results": "Fant ingen språk.", + "search": "Søk etter språk..." + }, + "description": { + "language": "Velg språket som skal brukes i webgrensesnittet.", + "theme": "Velg mellom lys eller mørk modus for grensesnittet." + }, + "field": { + "language": "Grensesnittspråk", + "theme": "Grensesnittema" + }, + "placeholder": { + "select_language": "Velg språk" + }, + "theme": { + "dark": "Mørk", + "light": "Lys" + }, + "title": "Utseende", + "validation": { + "language": { + "required": "Vennligst velg et språk." + }, + "theme": { + "required": "Vennligst velg et tema." + } + } + }, + "authUrl": "Auth-URL", + "changePasswordForFutureLogins": "Endre passord for fremtidige innlogginger.", + "confirmReset": "Bekreft tilbakestilling", + "createdAt": "Opprettet", + "delete": "Slett", + "description": "Beskrivelse", + "edit": "Rediger", + "enabled": "Aktivert", + "enterNewRootPassword": "Skriv inn nytt root-passord", + "enterProxyIdToConfirmDeletion": "Skriv inn Proxy-ID for å bekrefte sletting.", + "failedToCopyText": "Kunne ikke kopiere tekst", + "filterAccessToken": "Filtrer tilgangstoken...", + "filterAccount": "Filtrer konto...", + "filterOauth2": "Filtrer oauth2...", + "filterProxy": "Filtrer Proxy...", + "general": "Generelt", + "generateNewToken": "Generer nytt token, det gamle utløper umiddelbart.", + "host": "Vert", + "id": "Id", + "invalidPassword": "Ugyldig passord", + "lastAccess": "Siste tilgang", + "manageRootTokenAndPassword": "Administrer root-token og passord sikkert.", + "name": "Navn", + "noProxies": "Ingen proxyer", + "noProxiesDesc": "Du har ikke lagt til noen proxy-konfigurasjoner ennå. Legg til en for å begynne å bruke proxy-funksjoner.", + "password": "Passord", + "pleaseUseAnIpAddressForBetterReliability": "Vennligst bruk en IP-adresse (f.eks. 127.0.0.1) heller enn et vertsnavn eller domene for bedre pålitelighet.", + "port": "Port", + "profile": { + "account": { + "id": "Konto-ID: {{id}}" + }, + "avatarAlt": "Avatar", + "button": { + "permissions": "Tillatelser", + "update_profile": "Oppdater profil", + "view_global_permissions": "Vis globale tillatelser" + }, + "field": { + "email": "E-post", + "password": "Passord", + "username": "Brukernavn" + }, + "loadError": "Kunne ikke laste inn brukerinformasjon.", + "maxSize": "Opptil {{size}}", + "placeholder": { + "password_keep": "La stå tomt for å beholde nåværende passord" + }, + "removeAvatar": "Fjern avatar", + "section": { + "accounts": "{{count}} tilknyttede kontoer", + "roles": "Roller" + }, + "toast": { + "update_failed": "Kunne ikke oppdatere profilen", + "updated": "Profilen ble oppdatert" + }, + "uploadError": "Feil ved opplasting av fil", + "uploadTitle": "Last opp avatar", + "validation": { + "email": { + "invalid": "Skriv inn en gyldig e-postadresse", + "required": "E-post er påkrevd" + }, + "password": { + "max": "Passordet kan være maks 256 tegn", + "min": "Passordet må være minst 8 tegn" + }, + "username": { + "max": "Brukernavnet kan være maks 32 tegn", + "min": "Brukernavnet må være minst 5 tegn", + "required": "Brukernavn er påkrevd" + } + } + }, + "proxy": "Proxy", + "proxyUpdateOrAddFailed": "{{action}} mislyktes, vennligst prøv igjen senere", + "reset": "Tilbakestill", + "resetRootPassword": "Tilbakestill root-passord", + "resetRootToken": "Tilbakestill root-token", + "root": "Root", + "rootAccessManagement": "Administrasjon av rottilgang", + "rootDesc": "Administrer root-tilgangslegitimasjon inkludert token og passord.", + "rootPasswordMustBeAtLeast6Characters": "Root-passordet må være minst 6 tegn langt.", + "rootTitle": "Root", + "selectAll": "Velg alle", + "sidebar": { + "apiTokens": "API-tokener", + "configurations": "Systemkonfigurasjoner", + "profile": "Profil", + "proxy": "Nettverksproxy" + }, + "theRootPasswordHasBeenReset": "Root-passordet har blitt tilbakestilt", + "theRootTokenHasBeenReset": "Root-tokenet har blitt tilbakestilt", + "theme": "Tema", + "title": "Innstillinger", + "token": "Token", + "tokenUrl": "Token-URL", + "type": "Type", + "updateTheProxyHere": "Oppdater proxyen her. ", + "updatedAt": "Oppdatert", + "url": "Url", + "useNewPasswordForNextLogin": "Bruk det nye passordet ved neste innlogging.", + "useProxy": "Bruk Proxy", + "username": "Brukernavn", + "youAreAboutToResetTheRootPassword": "Du er i ferd med å tilbakestille root-passordet. Sørg for å lagre det sikkert.", + "youAreAboutToResetTheRootToken": "Du er i ferd med å tilbakestille root-tokenet. Denne handlingen kan ikke angres.", + "yourLoginInformationHasBeenUpdated": "Innloggingsinformasjonen din er oppdatert. Du trenger ikke å logge inn på nytt.", + "yourProxyHasBeenSuccessfully": "Din proxy har blitt {{action}}." + }, + "sign_out": { + "confirm": "Logg ut", + "desc": "Er du sikker på at du vil logge ut? Du må logge inn igjen for å få tilgang til kontoen din.", + "title": "Logg ut" + }, + "systemConfig": { + "pageDescription": "Disse parametrene initialiseres via CLI-flagg eller miljøvariabler. De er skrivebeskyttede.", + "pageTitle": "Systemkonfigurasjoner", + "sections": { + "cors": { + "desc": "Tilgangsregler for cross-origin", + "title": "CORS" + }, + "logging": { + "desc": "Loggutdata-oppførsel", + "title": "Logging" + }, + "network": { + "desc": "HTTP og offentlig tilgang", + "title": "Nettverk" + }, + "performance": { + "desc": "Samtidighet og komprimering", + "title": "Ytelse" + }, + "security": { + "desc": "Autentisering og kryptering", + "title": "Sikkerhet" + }, + "smtp": { + "desc": "Innstillinger for mottak av innkommende e-post for sanntidsarkivering", + "title": "SMTP-server" + }, + "storage": { + "desc": "Databasestier og grenser", + "title": "Lagring og cache" + } + }, + "status": { + "auto": "Auto", + "configured": "Konfigurert", + "disabled": "Deaktivert", + "enabled": "Aktivert", + "missing": "Mangler", + "notSet": "Ikke satt" + } + }, + "table": { + "asc": "Stigende", + "delete": "Slett", + "desc": "Synkende", + "edit": "Rediger", + "hide": "Skjul", + "loading": "Laster inn...", + "noResults": "Ingen resultater funnet", + "of": "av", + "page": "Side", + "pagination": { + "first": "Gå til første side", + "fixed_page_size": "{{size}} rader per side.", + "last": "Gå til siste side", + "next": "Neste side", + "page_info": "Side {{page}} av {{total}}", + "previous": "Forrige side", + "rows_per_page": "Rader per side", + "selected": "{{selected}} av {{total}} rader valgt." + }, + "results": "resultater", + "rowsPerPage": "Rader per side", + "showing": "Viser", + "to": "til" + }, + "tag": { + "clear_all": "Fjern alle etiketter", + "label": "Etiketter", + "no_tags_found": "Ingen etiketter funnet", + "search_placeholder": "Søk etter etiketter..." + }, + "time": { + "absolute_range": "Absolutt datointervall", + "apply": "Bruk", + "before": "Før", + "clear_filters": "Fjern tidsfiltre", + "days_ago_to_now": "dager siden til nå", + "end_date": "Sluttdato", + "format": "yyyy-MM-dd", + "historical": "Historisk periode (før...)", + "label": "Tid", + "last_day": "Siste 1 dag", + "last_days": "Siste {{count}} dager", + "last_months": "Siste {{count}} måneder", + "over_years_ago": "For {{count}} {{unit}} siden", + "recent_prefix": "Nylig:", + "recent_range": "Nylig periode (siden...)", + "since": "Siden", + "start_date": "Startdato", + "year": "år", + "years": "år" + }, + "users": { + "actions": { + "api_tokens": "API-tokens", + "buttons": { + "add_account": "Legg til konto", + "create": "Opprett bruker", + "update": "Oppdater bruker" + }, + "delete": { + "alert_desc": "Brukeren og alle tilhørende data vil bli slettet.", + "alert_title": "Advarsel: Permanent handling.", + "button_confirm": "Slett bruker", + "button_deleting": "Sletter...", + "confirm_msg": "Du sletter brukeren {{name}} (ID: {{id}}) permanent.", + "input_label": "Skriv bruker-ID for å bekrefte:", + "irreversible": "Denne handlingen kan ikke angres.", + "placeholder": "Skriv \"{{id}}\"", + "title": "Slett bruker", + "toast": { + "failed_fallback": "Kunne ikke slette brukeren.", + "failed_title": "Sletting mislyktes", + "success_desc": "Brukeren \"{{name}}\" ble fjernet.", + "success_title": "Bruker slettet" + } + }, + "dialog": { + "create_title": "Opprett ny bruker", + "edit_title": "Rediger bruker: {{name}}", + "subtitle": "Konfigurer identitet, tilgangsnivåer og sikkerhet." + }, + "fields": { + "assign_role": "Tildel rolle", + "burst_interval": "Burst-intervall (sek)", + "description": "Beskrivelse (valgfritt)", + "description_hint": "Interne notater (maks 256 tegn).", + "description_placeholder": "Notater om brukeren...", + "email": "E-postadresse", + "email_hint": "Primær kontakt og varslinger.", + "global_roles_hint": "Tildel systemrettigheter.", + "ip_whitelist": "IP-hviteliste", + "ip_whitelist_hint": "Begrens pålogging til disse IP-ene (én per linje).", + "password": "Passord", + "password_hint_create": "Sikkert passord for første oppsett.", + "password_hint_edit": "Skriv inn nytt passord kun hvis du vil endre det.", + "password_placeholder_create": "Minst 8 tegn", + "password_placeholder_edit": "La stå tom for å beholde nåværende", + "rate_quota": "Hastighetskvote", + "select_account": "Velg konto", + "username": "Brukernavn", + "username_hint": "Unik identifikator for innlogging." + }, + "placeholder": { + "filter": "Søk etter brukere..." + }, + "schema": { + "account_required": "Vennligst velg en konto", + "description_max": "Beskrivelse maks 256 tegn", + "email_invalid": "Oppgi en gyldig e-postadresse", + "email_required": "E-post er påkrevd", + "global_role_required": "Tildel minst én global rolle", + "ip_invalid": "Ugyldig IP-adresse", + "password_max": "Maks 256 tegn", + "password_min": "Minst 8 tegn", + "password_required": "Passord er påkrevd", + "role_required": "Vennligst velg en rolle", + "username_max": "Maks 32 tegn", + "username_min": "Minst 3 tegn", + "username_required": "Brukernavn er påkrevd" + }, + "sections": { + "basic": "Grunnleggende identitet", + "global": "Globale rettigheter", + "mail_access": "E-post tilgangskontroll", + "mail_access_subtitle": "E-postkontoer som denne brukeren kan administrere.", + "policy": "Retningslinjer" + }, + "states": { + "full_access": "Full tilgangsmodus", + "full_access_desc": "Administratorer har tilgang til alle kontoer som standard.", + "no_accounts": "Ingen spesifikke kontoer tildelt.", + "security_disabled": "Sikkerhetsregler er deaktivert." + }, + "tabs": { + "general": "Generelt", + "permissions": "Kontorettigheter", + "security": "Sikkerhet og ACL" + }, + "toast": { + "created": "Bruker opprettet", + "updated": "Bruker oppdatert" + } + }, + "api_tokens": { + "button": { + "generate": "Generer nytt token" + }, + "delete": { + "confirm_button": "Slett token", + "confirm_label": "Skriv {{word}} nedenfor for å bekrefte:", + "confirm_placeholder": "Skriv \"{{word}}\" for å bekrefte", + "deleting": "Sletter...", + "desc": "Du er i ferd med å slette dette API-tokenet permanent", + "irreversible": "Denne handlingen kan ikke angres. Applikasjoner som bruker dette tokenet vil miste tilgangen umiddelbart.", + "prefix": "Token-prefiks", + "title": "Slett API-token", + "warning_desc": "Skript eller tjenester som bruker dette tokenet vil slutte å fungere. Sørg for at du har oppdatert systemene dine.", + "warning_title": "Advarsel" + }, + "empty": { + "description": "Det er ennå ikke generert noen API-tokens i systemet.", + "title": "Ingen API-tokens funnet" + }, + "table": { + "api_key": "API-nøkkel", + "created": "Opprettet", + "expired": "Utløpt", + "expires_at": "Utløper", + "last_used": "Sist brukt", + "name": "Navn", + "never": "Aldri", + "owner": "Eier", + "permanent": "Permanent", + "type": "Type", + "unnamed": "Navnløst token", + "web_ui": "Web-grensesnitt" + }, + "toast": { + "delete_failed": "Kunne ikke slette tokenet, vennligst prøv igjen.", + "delete_failed_title": "Sletting mislyktes", + "deleted_desc": "Tokenet \"{{name}}\" ble fjernet.", + "deleted_title": "API-token slettet" + }, + "toolbar": { + "search_placeholder": "Søk etter navn, eier eller token..." + }, + "unnamed": "Navnløst token" + }, + "buttons": { + "add": "Legg til bruker", + "add_new": "Ny bruker" + }, + "columns": { + "actions": "Handlinger", + "avatar": "Avatar", + "created_at": "Opprettet", + "email": "E-postadresse", + "id": "ID", + "roles": "Roller og tillatelser", + "updated_at": "Oppdatert", + "username": "Brukernavn" + }, + "empty": { + "description": "Klikk på knappen nedenfor for å legge til din første bruker.", + "title": "Ingen brukere funnet" + }, + "nav": { + "api_tokens": "API-tokens", + "roles": "Roller", + "users": "Brukere" + }, + "tokens": { + "dialog": { + "create_title": "Opprett tilgangstoken", + "description": "Klikk på lagre når du er ferdig.", + "edit_title": "Rediger tilgangstoken" + }, + "error": { + "fallback": "Handlingen mislyktes, vennligst prøv igjen senere." + }, + "expire_options": { + "1_day": "1 dag", + "30_days": "30 dager", + "7_days": "7 dager", + "never": "Utløper aldri" + }, + "fields": { + "expire_hint": "Tokenet utløper automatisk etter den valgte tiden.", + "expire_label": "Utløp", + "expire_placeholder": "Velg utløpstid", + "name_hint": "Valgfritt · Maks 32 tegn", + "name_label": "Navn", + "name_placeholder": "Gi tokenet et kort navn" + }, + "schema": { + "expire_int": "Må være et heltall", + "expire_number": "Må være et tall", + "expire_positive": "Må være større enn 0", + "name_max": "Maks 32 tegn" + }, + "toast": { + "create_failed_title": "Opprettelse mislyktes", + "create_success_desc": "Tilgangstoken ble opprettet.", + "create_success_title": "Token opprettet", + "update_failed_title": "Oppdatering mislyktes", + "update_success_desc": "Tilgangstoken ble oppdatert.", + "update_success_title": "Token oppdatert" + } + }, + "tokens_action": { + "buttons": { + "add": "Legg til token" + }, + "delete_dialog": { + "description": "Denne handlingen kan ikke angres.", + "title": "Slette tilgangstoken?" + }, + "dialog": { + "description": "Administrer API-tokens for denne brukeren.", + "title": "API-tokens" + }, + "empty": { + "description": "Denne brukeren har ingen API-tokens for øyeblikket.", + "title": "Ingen API-tokens" + }, + "list": { + "button_delete": "Slett token", + "expires_on_brief": "Utløper {{date}}", + "label_created": "Opprettet", + "label_expires_at": "Utløpsdato", + "label_last_used": "Sist brukt", + "label_token": "Token", + "never": "Aldri", + "never_expires": "Utløper aldri", + "status_active": "Aktiv", + "status_expired": "Utløpt", + "unnamed_token": "Navnløst token" + } + } + }, + "validation": { + "emailRequired": "E-post er påkrevd", + "folderLimitMustBeAtLeast100": "Mappegrense må være minst 100", + "folderLimitMustBeNumber": "Mappegrense må være et tall", + "imapHostCannotBeEmpty": "IMAP-vert kan ikke være tom", + "imapHostRequired": "IMAP-vert er påkrevd", + "imapPortMustBeLessThan65536": "IMAP-port må være mindre enn 65536", + "imapPortMustBePositive": "IMAP-port må være et positivt heltall", + "incrementalSyncMustBeAtLeast10": "Intervall for inkrementell synkronisering må være minst 10 minutter", + "incrementalSyncMustBeNumber": "Intervall for inkrementell synkronisering må være et tall", + "invalidEmail": "Ugyldig e-postadresse", + "invalidUrl": "Ugyldig URL", + "passwordMinLength": "Passordet må være minst {{min}} tegn langt", + "passwordRequired": "Passord er påkrevd når autentiseringsmetoden er Passord", + "pleaseEnterPassword": "Vennligst skriv inn passordet ditt", + "pleaseEnterUsernameOrEmail": "Skriv inn brukernavn eller e-postadresse", + "required": "Dette feltet er påkrevd", + "singleRequestBatchSizeMustBeNumber": "Batchstørrelse må være et tall", + "singleRequestBatchSizeTooLarge": "Batchstørrelse må være maksimalt 200", + "singleRequestBatchSizeTooSmall": "Batchstørrelse må være minst 10" + } } \ No newline at end of file diff --git a/web/src/locales/pl.json b/web/src/locales/pl.json index f1902ed..6cb7ffb 100644 --- a/web/src/locales/pl.json +++ b/web/src/locales/pl.json @@ -1,334 +1,217 @@ { - "common": { - "submit": "Wyślij", - "cancel": "Anuluj", - "save": "Zapisz", - "save_changes": "Zapisz zmiany", - "delete": "Usuń", - "edit": "Edytuj", - "search": "Szukaj", - "add": "Dodaj", - "remove": "Usuń", - "create": "Utwórz", - "update": "Aktualizuj", - "confirm": "Potwierdź", - "close": "Zamknij", - "yes": "Tak", - "no": "Nie", - "ok": "OK", - "loading": "Ładowanie...", - "empty": "Puste", - "noData": "Brak danych", - "table": { - "noResults": "Brak wyników." - }, - "failed": "Nieudane", - "notFound": "Nie znaleziono", - "back": "Wstecz", - "goBack": "Powrót", - "backToHome": "Wróć do strony głównej", - "tryAgain": "Spróbuj ponownie", - "more": "Więcej", - "actions": "Akcje", - "filter": "Filtr", - "reset": "Resetuj", - "clear": "Wyczyść", - "error": "Błąd", - "apply": "Zastosuj", - "select": "Wybierz", - "selectAll": "Zaznacz wszystko", - "deselectAll": "Odznacz wszystko", - "all": "Wszystkie", - "none": "Brak", - "showLess": "Pokaż mniej", - "showMore": "Pokaż więcej...", - "project_description": "Bichon to projekt open-source.", - "view_on_github_button": "Zobacz na GitHub", - "op_failed": "Operacja nie powiodła się", - "na": "N/D", - "retry": "Ponów", - "deleting": "Usuwanie..." - }, - "navigation": { - "home": "Home", - "settings": "Ustawienia", + "accessTokens": { + "aListOfIpAddressesAllowed": "Lista adresów IP, które mają dostęp do zasobu. Wprowadź po jednym adresie IP w każdym wierszu. (Opcjonalnie)", + "accountId": "ID konta", "accounts": "Konta", - "dashboard": "Panel", - "mailbox": "Poczta", - "oauth2": "OAuth2", - "accessTokens": "Tokeny", - "apiDocs": "Dokumentacja API", - "general": "Ogólne", - "auth": "Auth", - "other": "Pozostałe", - "users": "Użytkownicy systemu" - }, - "auth": { - "welcome": "Witaj w Bichon", - "username": "Nazwa", - "password": "Hasło", - "login": "Login", - "loginFailed": "Błędny login", - "invalidPassword": "Nieprawidłowe hasło, spróbuj ponownie", - "somethingWentWrong": "Coś poszło nie tak", - "sessionExpired": "Sesja wygasła", - "sessionExpiredDesc": "Twoja sesja wygasła z powodu bezczynności. Zaloguj się ponownie", - "logout": "Wyloguj", - "areYouSureYouWantToLogOut": "Czy na pewno chcesz się wylogować?", - "youWillNeedToLogInAgain": "Musisz zalogować się ponownie, aby ponownie móc korzystać." - }, - "errors": { - "pageNotFound": "Ups, nie znaleziono strony", - "pageNotFoundDesc": "Wygląda na to, że strona której szukasz nie istnieje lub została usunięta", - "somethingWentWrong": "Ups, coś poszło nie tak", - "somethingWentWrongDesc": "Za jakiś czas spróbuj ponownie.", - "internalServerError": "Błąd wewnętrzny serwera!", - "contentNotModified": "Treść nie jest modyfikowana!", - "networkError": "Błąd sieci", - "networkErrorDesc": "Problem z połączeniem z serwerem. Sprawdź połączenie z internetem i spróbuj ponownie.", - "forbidden": "Brak dostępu", - "forbiddenTitle": "Wstep wzbroniony", - "forbiddenDesc": "Nie masz wystarczających uprawnień do przeglądania tych zasobów", - "unauthorized": "Brak uprawnień", - "unauthorizedTitle": "Dostęp nieautoryzowany", - "unauthorizedDesc": "Aby uzyskać dostęp do tego zasobu, zaloguj się przy użyciu odpowiednich danych uwierzytelniających", - "maintenance": "Konserwacja", - "maintenanceTitle": "Strona jest w trakcie prac serwisowych!", - "maintenanceDesc": "Chwilowo strona jest niedostępna, ale niebawem będzie ponownie dostępna.", - "learnMore": "Dowiedz się więcej" - }, - "dashboard": { - "title": "Panel", - "mailAccounts": "Konta email", - "connected": "Podłączone", - "totalEmails": "Wszystkie wiadomości", - "syncedLocally": "Synchronizowane lokalnie", - "totalEmailSize": "Wielkość wszystkich wiadomości", - "logicalVolume": "Oryginalny rozmiar", - "localDataFiles": "Lokalne pliki danych", - "actualDiskUsage": "Zajętość na dysku", - "efficiency": "Wydajność", - "saved": "Zaoszczędzone", - "dataStorage": "Magazyn danych", - "indexSize": "Rozmiar indeksu", - "metadataSize": "Rozmiar metadanych", - "tantivyDatabase": "Oparte na silniku wyszukiwania Tantivy", - "dayTrend": "Trend z 30 dni", - "attachments": "Załączniki", - "topLists": "Lista TOP", - "newEmails": "Nowe wiadomości", - "messageDistribution": "Dystrybucja wiadomości", - "attachmentRatio": "Załącznik Ratio", - "attachmentRatioDesc": "{{percent}}% wiadomości ma załączniki", - "noEmailsSynced": "Żadne wiadomości nie zostały jeszcze zsynchronizowane", - "withAttachments": "Z załącznikami", - "noAttachments": "Bez załączników", - "top10Senders": "Top 10 Nadawców", - "byMessageCount": "Według ilości wiadomości", - "sender": "Nadawca", - "count": "Ilość", - "top10LargestEmails": "Top 10 największych wiadomości", - "byMessageSize": "Według rozmiaru wiadomości", - "subject": "Temat", - "size": "Rozmiar", - "noSubject": "(brak tematu)", - "top10Accounts": "Top 10 kont", - "emails": "Wiadomości", - "account": "Konto", - "noRecentActivity": "Brak aktywności", - "noSendersData": "Brak danych od Nadawcy", - "noLargeEmails": "Brak dużych wiadomości", - "noAccountData": "Brak danych konta", - "systemVersion": "Wersja systemu" + "aclRulesForAccessTokens": "Reguły ACL dla tokenów dostępu obejmują weryfikację białej listy adresów IP i egzekwowanie limitów przepustowości", + "actions": { + "delete": "Usuń", + "edit": "Edytuj", + "openMenu": "Otwórz menu" + }, + "addNew": "Dodaj nowy", + "atLeastOneAccountIsRequired": "Minimum jedno konto jest wymagane.", + "create": "Utwórz", + "createNewAccessTokenHere": "Utwórz token dostępu tutaj.", + "created": "Utworzono", + "createdAt": "Utworzono", + "creating": "Tworzenie...", + "creationFailed": "Błąd tworzenia", + "delete": "Usuń", + "describeThePurposeOfTheAccessToken": "Opisz jaki jest cel tokena dostępu", + "description": "Tutaj możesz zarządzać swoimi tokenami dostępu, kontrolą dostępu, białymi listami adresów IP i ustawieniami ograniczeń przepustowości.", + "descriptionMustNotExceed255Characters": "Opis nie może przekroczyć 255 znaków.", + "edit": "Edytuj", + "editToken": "Edytuj Token", + "enterIntervalInSeconds": "Wprowadź interwał w sekundach np. 60", + "enterOneIpAddressPerLine": "Wpisz adres IPv4, każdy w nowej linijce, np:\n192.168.1.1\n192.168.1.2", + "enterQuota": "Wprowadź limit np. 100", + "expiresAt": "Wygasa o", + "filterByEmailAddressOrAccountId": "Filtruj według adresu email lub identyfikatora konta...", + "interval": "Interval", + "intervalMustBeAPositiveInteger": "Interval musi być dodatnią liczbą całkowitą.", + "invalidIpAddressesFound": "Błędny adres IP, wpisz poprawny adres IPv4/IPv6.", + "name": "Name", + "noTokens": "Brak tokenów dostępu", + "noTokensDesc": "Nie utworzyłeś jeszcze żadnych tokenów dostępu. Utwórz jeden, aby zacząć korzystać z funkcji API.", + "notUsedYet": "Jeszcze nie używany", + "quota": "Quota", + "quotaMustBeAPositiveInteger": "Quota musi być dodatnią liczbą całkowitą.", + "save": "Zapisz", + "saveChanges": "Zapisz zmiany", + "saving": "Zapisywanie...", + "selectAccounts": "Zaznacz konta", + "selectMultipleAccountsForTheAccessToken": "Wybierz wiele kont dla zakresu autoryzacji tokena dostępu", + "theListOfAccountsThatCanBeQueried": "Lista kont, do których można wysłać zapytanie za pomocą tokena dostępu.", + "theMaximumNumberOfRequestsAllowed": "Maksymalna liczba żądań dozwolona w danym przedziale czasowym. (Opcjonalnie)", + "theTimeWindowForTheRateLimit": "Okno czasowe (w sekundach) dla limitu szybkości. (Opcjonalnie)", + "title": "Tokeny dostępu", + "token": "Token", + "updateFailed": "Błąd aktualizacji", + "updateOrCreationFailed": "Błąd {{action}}, spróbuj ponownym", + "updateTheAccessTokenHere": "Uaktualnij token dostępu tutaj.", + "updated": "Zaktualizowano", + "updating": "Aktualizacja...", + "yourAccessTokenHasBeenSuccessfully": "Token został {{action}}." }, "accounts": { - "beforeRelativeValue": "Pobierz e-maile sprzed {{value}} {{unit}}", - "sinceRelativeValue": "Pobierz e-maile z ostatnich", - "downloadBatchSize": "Rozmiar partii pobierania", - "downloadBatchSizeDescription": "Liczba wiadomości pobieranych na żądanie IMAP", - "downloadScopeDescription": "Wybierz, które wiadomości e-mail mają być indeksowane i pobierane.", - "downloadScope": "Strategia pobierania", - "selectMode": "Wybierz tryb filtra", - "downloadAll": "Pobierz wszystkie e-maile", - "sinceFixed": "Od konkretnej daty", - "sinceRelative": "Pobierz tylko ostatnie e-maile", - "beforeRelative": "Pobierz tylko stare e-maile", - "duration": "Czas trwania", - "unit": "Jednostka", "accessControl": "Kontrola dostępu", - "owner": "Twórca", + "accessTokenCopiedToClipboard": "Token dostępu skopiowany do schowka", "access_control": { - "title": "Przypisywanie dostępu do konta", - "description": "Przypisz role i uprawnionych użytkowników dla {{email}}", - "role_label": "Rola dostępu", - "role_placeholder": "Wybierz rolę", - "role_loading": "Ładowanie ról...", - "user_label": "Wybierz uprawnionych użytkowników", - "user_search_placeholder": "Szukaj według nazwy lub e-maila...", - "user_empty": "Nie znaleziono użytkowników", - "user_selected_count": "Wybrano: {{count}} użytkownik(ów)", "buttons": { "cancel": "Anuluj", "save": "Zapisz przypisanie" }, - "validation": { - "user_required": "Proszę wybrać co najmniej jednego użytkownika", - "role_required": "Proszę wybrać rolę do przypisania" - }, + "description": "Przypisz role i uprawnionych użytkowników dla {{email}}", + "role_label": "Rola dostępu", + "role_loading": "Ładowanie ról...", + "role_placeholder": "Wybierz rolę", + "title": "Przypisywanie dostępu do konta", "toast": { - "success_title": "Przypisanie pomyślne", + "failed_title": "Przypisanie nie powiodło się", "success_desc": "Uprawnienia zostały pomyślnie przypisane do {{email}}", - "failed_title": "Przypisanie nie powiodło się" + "success_title": "Przypisanie pomyślne" + }, + "user_empty": "Nie znaleziono użytkowników", + "user_label": "Wybierz uprawnionych użytkowników", + "user_search_placeholder": "Szukaj według nazwy lub e-maila...", + "user_selected_count": "Wybrano: {{count}} użytkownik(ów)", + "validation": { + "role_required": "Proszę wybrać rolę do przypisania", + "user_required": "Proszę wybrać co najmniej jednego użytkownika" } }, - "title": "Konta Email", - "description": "Zarządzaj i konfiguruj konta email", - "addImap": "Dodaj IMAP", - "addNoSync": "Dodaj NoSync", - "moreAccountTypes": "Więcej typów kont", - "noAccountConfigurations": "Brak konfiguracji konta", - "noAccountConfigurationsDesc": "Nie skonfigurowano jeszcze żadnego konta, aby zacząć korzystać z funkcji dodaj pierwsze konto.", - "addConfiguration": "Dodaj konfigurację", - "useNoProxy": "Brak serwera proxy", - "login_name": "Login", - "name": "Nazwa", - "email": "Email", - "status": "Status", - "type": "Typ", - "lastSync": "OStatnia synchronizacja", + "accountCreated": "Konto utworzono", + "accountCreatedDesc": "Twoje konto zostało prawidłowo utworzone.", + "accountCreationFailed": "Bład podczas tworzenia konta", + "accountDetails": "Szczegóły konta", + "accountHasBeenSuccessfully": "Konto zostalo {{action}}", + "accountSyncFoldersUpdateFailed": "Nie udało się zaktualizować folderiów synchronizacji kont", + "accountSyncFoldersUpdated": "Zaktualizowano foldery synchronizacji kont", + "accountUpdateFailed": "Bład aktulizacji konta", + "accountUpdated": "Konto zaktualizowano", + "accountUpdatedDesc": "Twoje konto zostało prawidłowo zaktualizowane.", "actions": "Działania", - "edit": "Edytuj", - "delete": "Usuń", - "detail": "Szczegóły", - "selectMailboxes": "Wybierz skrzynki", - "oauth2Tokens": "Tokeny OAuth2", - "id": "ID", - "enabled": "Aktywne", + "addAccount": "Dodaj konto. ", + "addConfiguration": "Dodaj konfigurację", + "addImap": "Dodaj IMAP", + "addNewEmailAccountHere": "Dodaj nowe konto email tutaj. ", + "addNoSync": "Dodaj NoSync", + "allMailFolderSelected": "Uwaga: folder \"Wszystkie wiadomości\" izostał zaznaczony", + "allMailFolderSelectedDesc": "Wybierając foldery z atrybutem \"Wszystkie wiadomości\" prawdopodobnie spowoduje to duplikowanie się wiadomości już zsynchronizowanych z folderów takich jak Skrzynka odbiorcza i Wysłane. Może to zająć znacznie więcej miejsca", + "allMailSkipped": "Wybrane foldery standardowe. Pominięto 'Wszystkie wiadomości', aby uniknąć duplikatów.", + "areYouSureYouWantTo": "Czy na pewno chcesz {{action}} dla tego konta?", "auth": "Auth", - "incSync": "Inc Sync", - "state": "Status", + "authType": "auth_type", + "autoConfiguring": "Auto konfiguracja...", + "beforeRelative": "Pobierz tylko stare e-maile", + "beforeRelativeValue": "Pobierz e-maile sprzed {{value}} {{unit}}", + "capabilities": "Możliwości", + "chooseAuthMethod": "Wybierz metodę uwierzytelniania IMAP.", + "chooseEncryptionMethod": "Wybierz metodę szyfrowania dla IMAP.", + "chooseMailboxesToDownload": "Wybierz skrzynki do pobrania dla {{email}}. Nowe skrzynki zostaną pobrane w następnym cyklu.", + "clickHere": "kliknij tutaj", + "clickSaveWhenDone": "Kiedy skończysz kliknij 'Utwórz'.", + "continue": "Kontynuj", "createdAt": "Utworzono", - "updatedAt": "Zaktualizowano", - "openMenu": "Otwórz menu", + "creationFailed": "Bład tworzenia, spróbuj później", + "dateSelection": "Zaznaczenie daty", + "dateSince": "Od kiedy", + "days": "Dni", + "delete": "Usuń", + "description": "Zarządzaj i konfiguruj konta email", + "detail": "Szczegóły", + "detailsOfTheOAuth2TokensForTheAccount": "Szczegóły tokenów OAuth2 dla konta.", + "determinesWhetherThisAccountIsActiveNoSync": "Określa to, czy konto jest aktywne. Jeśli wyłączone, konto nie będzie mogło importować danych.", + "disable": "Wyłącz", + "disableAccount": "Wyłącz konto", + "disabled": "Wyłączone", + "downloadAll": "Pobierz wszystkie e-maile", + "downloadBatchSize": "Rozmiar partii pobierania", + "downloadBatchSizeDescription": "Liczba wiadomości pobieranych na żądanie IMAP", + "downloadInterval": "Cykl pobierania (minuty)", + "downloadIntervalPlaceholder": "Wprowadź minuty", + "downloadScope": "Strategia pobierania", + "downloadScopeDescription": "Wybierz, które wiadomości e-mail mają być indeksowane i pobierane.", + "duration": "Czas trwania", + "edit": "Edytuj", + "email": "Email", "emailAccountRegistration": "Rejestracja konta email", "emailAccountRegistrationDesc": "Wprowadź swój adres e-mail. W kolejnych krokach skonfigurujesz ustawienia IMAP. Użyjemy tego adresu do automatycznego wykrycia ustawień serwera IMAP.", "emailAddress": "Adres Email", - "emailPlaceholder": "np. jan.kowalski@example.com", - "namePlaceholder": "np. jan.kowalski", - "optional": "Opcjonalnie", - "nameDescription": "Nazwa użytkownika IMAP. Domyślnie e-mail lub własna nazwa.", "emailCannotBeModified": "Adresu konta email nie można modyfikować podczas edycji.", - "addAccount": "Dodaj konto. ", - "updateAccount": "Zaktualizuj konto", - "accountUpdated": "Konto zaktualizowano", - "accountCreated": "Konto utworzono", - "accountUpdatedDesc": "Twoje konto zostało prawidłowo zaktualizowane.", - "accountCreatedDesc": "Twoje konto zostało prawidłowo utworzone.", - "accountUpdateFailed": "Bład aktulizacji konta", - "accountCreationFailed": "Bład podczas tworzenia konta", - "updateFailed": "Bład aktulizacji, spróbuj później", - "creationFailed": "Bład tworzenia, spróbuj później", - "allMailFolderSelected": "Uwaga: folder \"Wszystkie wiadomości\" izostał zaznaczony", - "accountSyncFoldersUpdated": "Zaktualizowano foldery synchronizacji kont", - "accountSyncFoldersUpdateFailed": "Nie udało się zaktualizować folderiów synchronizacji kont", - "serverConfiguration": "Konfiguracja serwera (IMAP)", - "selectedMailboxes": "Wybrane skrzynki", - "allMailFolderSelectedDesc": "Wybierając foldery z atrybutem \"Wszystkie wiadomości\" prawdopodobnie spowoduje to duplikowanie się wiadomości już zsynchronizowanych z folderów takich jak Skrzynka odbiorcza i Wysłane. Może to zająć znacznie więcej miejsca", - "allMailSkipped": "Wybrane foldery standardowe. Pominięto 'Wszystkie wiadomości', aby uniknąć duplikatów.", - "selectAtLeastOneFolder": "Wybierz co najmniej jeden folder", - "chooseMailboxesToDownload": "Wybierz skrzynki do pobrania dla {{email}}. Nowe skrzynki zostaną pobrane w następnym cyklu.", - "accountDetails": "Szczegóły konta", - "capabilities": "Możliwości", - "folderLimit": "Limit folderu", - "everyMinutes": "co {{minutes}} minut", - "foldersConfiguredForSync": "{{count}} folder(ów) zostało skonfigurowane do synchronizacji", - "foldersSelected": "{{count}} folder(ów) zostało zaznaczonych", - "imapHost": "Host IMAP", - "imapHostPlaceholder": "np. imap.example.com", - "imapPort": "Port IMAP", - "imapPortPlaceholder": "np. 993 (szyfrowany TLS/SSL) lub 143 (bez szyfrowania)", - "imapEncryption": "Szyfrowanie IMAP", - "selectEncryptionMethod": "Wybierz metodę szyfrowania", - "chooseEncryptionMethod": "Wybierz metodę szyfrowania dla IMAP.", - "imapAuthMethod": "Metoda uwierzytelniania IMAP", - "selectAuthMethod": "Zaznacz metodę uwierzytelniania IMAP", - "chooseAuthMethod": "Wybierz metodę uwierzytelniania IMAP.", - "imapPassword": "Hasło IMAP", - "leaveEmptyToKeepPassword": "Pozostaw to pole puste, jeśli chcesz zachować dotychczasowe hasło", - "enterPassword": "Wprowadź hasło", - "leaveEmptyToKeepExisting": "Pozostaw to pole puste, jeśli chcesz zachować dotychczasowe hasło lub wpisz nowe, aby zaktualizować.", - "useProxy": "Użyj Proxy", - "selectProxy": "Wybierz proxy", - "downloadInterval": "Cykl pobierania (minuty)", - "downloadIntervalPlaceholder": "Wprowadź minuty", + "emailPlaceholder": "np. jan.kowalski@example.com", + "enable": "Włącz", + "enableAccount": "Włącz konto", + "enabled": "Aktywne", "enabledDescription": "Określa, czy to konto jest aktywne. Jeśli zostanie wyłączone, powiązane pobierania nie będą uruchamiane.", - "dateSince": "Od kiedy", - "none": "Nigdy", - "fixed": "Dokładnie", - "relative": "Wzglednie", - "selectDate": "Zaznacz datę", - "selectUnit": "Zaznacz jednostki", - "days": "Dni", - "months": "Miesiące", - "years": "Lata", - "enterValue": "Wpisz wartość", - "mustBeAtLeast1": "Nie mniej jak 1", - "dateSelection": "Zaznaczenie daty", - "since": "od", - "recent": "ostatnio", - "notAvailable": "niedostępny", - "host": "host", - "port": "port", "encryption": "szyfrowanie", - "authType": "auth_type", - "password": "hasło", - "useProxyField": "użyj proxy", - "clickSaveWhenDone": "Kiedy skończysz kliknij 'Utwórz'.", - "step": "Krok {{index}}", - "goBack": "Wróć", - "autoConfiguring": "Auto konfiguracja...", - "continue": "Kontynuj", - "saveChanges": "Zapisz zmiany", - "submit": "Wyślij", + "enterPassword": "Wprowadź hasło", + "enterValue": "Wpisz wartość", + "everyMinutes": "co {{minutes}} minut", "field": "Pole", - "value": "Wartość", - "refreshToken": "Odśwież token", - "accessTokenCopiedToClipboard": "Token dostępu skopiowany do schowka", - "refreshTokenCopiedToClipboard": "Token odśwież skopiowany do schowka", - "noOAuth2Tokens": "Brak tokenów OAuth2", - "theAccountHasNotCompletedTheAuthorizationProcess": "Konto nie przeszło procesu autoryzacji, proszę ", - "clickHere": "kliknij tutaj", - "toAuthorizeTheAccount": ", aby zautoryzować konto.", - "detailsOfTheOAuth2TokensForTheAccount": "Szczegóły tokenów OAuth2 dla konta.", - "updateTheEmailAccountHere": "Zaktualizuj konto email tutaj. ", - "addNewEmailAccountHere": "Dodaj nowe konto email tutaj. ", - "thisAccountIsUsedForIdentificationPurposesOnly": "To konto służy wyłącznie do celów identyfikacyjnych i nie wymaga synchronizacji z serwerem pocztowym. Ułatwia ono importowanie danych email.", - "determinesWhetherThisAccountIsActiveNoSync": "Określa to, czy konto jest aktywne. Jeśli wyłączone, konto nie będzie mogło importować danych.", + "fixed": "Dokładnie", + "folderLimit": "Limit folderu", + "folderLimitDescription": "Ogranicz liczbę wiadomości email, które należy synchronizować w jednym folderze (minimum 100). Pozostaw puste, aby nie było limitu.", + "folderLimitPlaceholder": "np. 1000", "folderSync": { - "noData": "Brak danych", - "noFolders": "Brak folderów do synchronizacji", - "batches": "partie", "autoSelectDescendants": "Automatyczny wybór dzieci (podrzędnych)", "autoSelectParents": "Automatyczny wybór rodziców (nadrzędnych)", - "expandAll": "Rozwiń wszystko", + "batches": "partie", "collapseAll": "Zwiń wszystko", - "loadingMailboxFolders": "Ładowanie folderów skrzynki..." + "expandAll": "Rozwiń wszystko", + "loadingMailboxFolders": "Ładowanie folderów skrzynki...", + "noData": "Brak danych", + "noFolders": "Brak folderów do synchronizacji" }, - "viewDetails": "pokaż szczegóły", + "foldersConfiguredForSync": "{{count}} folder(ów) zostało skonfigurowane do synchronizacji", + "foldersSelected": "{{count}} folder(ów) zostało zaznaczonych", + "goBack": "Wróć", + "host": "host", + "id": "ID", + "imap": "IMAP", + "imapAuthMethod": "Metoda uwierzytelniania IMAP", + "imapEncryption": "Szyfrowanie IMAP", + "imapHost": "Host IMAP", + "imapHostPlaceholder": "np. imap.example.com", + "imapPassword": "Hasło IMAP", + "imapPort": "Port IMAP", + "imapPortPlaceholder": "np. 993 (szyfrowany TLS/SSL) lub 143 (bez szyfrowania)", + "imapProxy": "Użyj proxy gniazda SOCKS5 dla połączeń IMAP.", + "incSync": "Inc Sync", + "lastSync": "OStatnia synchronizacja", + "leaveEmptyToKeepExisting": "Pozostaw to pole puste, jeśli chcesz zachować dotychczasowe hasło lub wpisz nowe, aby zaktualizować.", + "leaveEmptyToKeepPassword": "Pozostaw to pole puste, jeśli chcesz zachować dotychczasowe hasło", + "login_name": "Login", + "minutes": "minut", + "months": "Miesiące", + "moreAccountTypes": "Więcej typów kont", + "mustBeAtLeast1": "Nie mniej jak 1", + "name": "Nazwa", + "nameDescription": "Nazwa użytkownika IMAP. Domyślnie e-mail lub własna nazwa.", + "namePlaceholder": "np. jan.kowalski", + "noAccountConfigurations": "Brak konfiguracji konta", + "noAccountConfigurationsDesc": "Nie skonfigurowano jeszcze żadnego konta, aby zacząć korzystać z funkcji dodaj pierwsze konto.", + "noOAuth2Tokens": "Brak tokenów OAuth2", + "none": "Nigdy", + "notAvailable": "niedostępny", + "oauth2Tokens": "Tokeny OAuth2", + "openMenu": "Otwórz menu", + "optional": "Opcjonalnie", + "owner": "Twórca", + "password": "hasło", + "port": "port", + "recent": "ostatnio", + "refreshToken": "Odśwież token", + "refreshTokenCopiedToClipboard": "Token odśwież skopiowany do schowka", + "relative": "Wzglednie", "runningState": { - "message": "Wiadomość", "account": { "id": "ID konta" }, - "tabs": { - "active_session": "Aktywna sesja", - "history": "Historia", - "global_errors": "Błędy globalne", - "folders": "Skrzynki", - "errors": "Błędy" - }, - "loading": { - "fetching_account_state": "Pobieranie stanu konta..." + "common": { + "close": "Zamknij", + "folders": "skrzynki" }, "empty": { "no_active_download": "Brak aktywnego pobierania", @@ -337,1156 +220,596 @@ "no_global_errors": "Brak błędów globalnych", "no_history": "Brak historii" }, - "session": { - "status": "Status", - "trigger": "Wyzwalacz", - "started_at": "Czas rozpoczęcia" - }, - "common": { - "folders": "skrzynki", - "close": "Zamknij" - }, + "folders": "skrzynki", "latest": "NAJNOWSZE", - "folders": "skrzynki" + "loading": { + "fetching_account_state": "Pobieranie stanu konta..." + }, + "message": "Wiadomość", + "session": { + "started_at": "Czas rozpoczęcia", + "status": "Status", + "trigger": "Wyzwalacz" + }, + "tabs": { + "active_session": "Aktywna sesja", + "errors": "Błędy", + "folders": "Skrzynki", + "global_errors": "Błędy globalne", + "history": "Historia" + } }, + "saveChanges": "Zapisz zmiany", + "selectAtLeastOneFolder": "Wybierz co najmniej jeden folder", + "selectAuthMethod": "Zaznacz metodę uwierzytelniania IMAP", + "selectDate": "Zaznacz datę", + "selectEncryptionMethod": "Wybierz metodę szyfrowania", + "selectMailboxes": "Wybierz skrzynki", + "selectMode": "Wybierz tryb filtra", + "selectProxy": "Wybierz proxy", + "selectUnit": "Zaznacz jednostki", + "selectedMailboxes": "Wybrane skrzynki", + "serverConfiguration": "Konfiguracja serwera (IMAP)", + "since": "od", + "sinceFixed": "Od konkretnej daty", + "sinceRelative": "Pobierz tylko ostatnie e-maile", + "sinceRelativeValue": "Pobierz e-maile z ostatnich", + "state": "Status", + "status": "Status", + "step": "Krok {{index}}", "steps": { "complete": "Zakończono", "emailAddress": "Adres email", "imap": "IMAP", - "syncPreferences": "Preferencje Sync", - "summary": "Podsumowanie" + "summary": "Podsumowanie", + "syncPreferences": "Preferencje Sync" }, - "imapProxy": "Użyj proxy gniazda SOCKS5 dla połączeń IMAP.", - "syncStartDateDescription": "Definiuje datę rozpoczęcia synchronizacji: od początku tj. wszystko (nigdy), konkretna kartka z kalendarza (dokładnie) lub od teraz wstecz (względną). Poprzednie wiadomości email są wykluczone. {{fixedPart}}.", + "submit": "Wyślij", "syncAfterDate": "Opcja 'dokładnie' synchronizuje dane po ustalonej dacie", "syncRecentData": "Opcja 'względnie' przesuwa datę synchronizacji w czasie, synchronizując tylko najnowsze dane", - "folderLimitDescription": "Ogranicz liczbę wiadomości email, które należy synchronizować w jednym folderze (minimum 100). Pozostaw puste, aby nie było limitu.", - "folderLimitPlaceholder": "np. 1000", - "imap": "IMAP", - "minutes": "minut", - "accountHasBeenSuccessfully": "Konto zostalo {{action}}", - "enableAccount": "Włącz konto", - "disableAccount": "Wyłącz konto", - "areYouSureYouWantTo": "Czy na pewno chcesz {{action}} dla tego konta?", - "enable": "Włącz", - "disable": "Wyłącz", + "syncStartDateDescription": "Definiuje datę rozpoczęcia synchronizacji: od początku tj. wszystko (nigdy), konkretna kartka z kalendarza (dokładnie) lub od teraz wstecz (względną). Poprzednie wiadomości email są wykluczone. {{fixedPart}}.", + "theAccountHasNotCompletedTheAuthorizationProcess": "Konto nie przeszło procesu autoryzacji, proszę ", + "thisAccountIsUsedForIdentificationPurposesOnly": "To konto służy wyłącznie do celów identyfikacyjnych i nie wymaga synchronizacji z serwerem pocztowym. Ułatwia ono importowanie danych email.", "thisWillPreventTheAccountFromBeingUsed": "To konto nie będzie już więcej synchronizować danych z serwera IMAP, ale istniejące dane będą nadal dostępne", - "disabled": "Wyłączone", + "title": "Konta Email", + "toAuthorizeTheAccount": ", aby zautoryzować konto.", + "type": "Typ", + "unit": "Jednostka", + "updateAccount": "Zaktualizuj konto", + "updateFailed": "Bład aktulizacji, spróbuj później", + "updateTheEmailAccountHere": "Zaktualizuj konto email tutaj. ", + "updatedAt": "Zaktualizowano", "useDangerous": "Ufaj każdemu certyfikatowi TLS", - "useDangerousDescription": "Włącz tę opcję tylko wtedy, gdy łączysz się z serwerem IMAP z certyfikatem publicznym lub samopodpisanym, który może nie być rozpoznawany przez Twój system. Użycie tego ustawienia pomija standardową walidację certyfikatu, co może narażać na ataki typu man-in-the-middle. Włącz tę opcję tylko wtedy, gdy rozumiesz związane z tym ryzyko." + "useDangerousDescription": "Włącz tę opcję tylko wtedy, gdy łączysz się z serwerem IMAP z certyfikatem publicznym lub samopodpisanym, który może nie być rozpoznawany przez Twój system. Użycie tego ustawienia pomija standardową walidację certyfikatu, co może narażać na ataki typu man-in-the-middle. Włącz tę opcję tylko wtedy, gdy rozumiesz związane z tym ryzyko.", + "useNoProxy": "Brak serwera proxy", + "useProxy": "Użyj Proxy", + "useProxyField": "użyj proxy", + "value": "Wartość", + "viewDetails": "pokaż szczegóły", + "years": "Lata" + }, + "apiDocs": { + "choosePreferredType": "Wybierz preferowany typ dokumentacji API", + "downloadSpecYAML": "Plik YAML", + "openAPIExplorer": "OpenAPI", + "reDoc": "ReDoc", + "scalar": "Scalar", + "swaggerUI": "Swagger UI" + }, + "apiTokens": { + "deleteDialog": { + "cancel": "Anuluj", + "confirm": "Usuń", + "deleting": "Usuwanie...", + "description": "Tej operacji nie można cofnąć. Każda aplikacja używająca tego tokena natychmiast utraci dostęp.", + "title": "Usunąć token dostępu?" + }, + "dialog": { + "createTitle": "Utwórz token dostępu", + "description": "Kliknij zapisz, gdy skończysz.", + "editTitle": "Edytuj token dostępu", + "save": "Zapisz", + "saveChanges": "Zapisz zmiany" + }, + "form": { + "1day": "1 dzień", + "30days": "30 dni", + "7days": "7 dni", + "errorInt": "Musi być liczbą całkowitą", + "errorMax": "Maksymalnie 32 znaki", + "errorNumber": "Musi być liczbą", + "errorPositive": "Musi być większe niż 0", + "expirationDescription": "Tokeny wygasną automatycznie po wybranym czasie.", + "expirationLabel": "Wygasa", + "expirationPlaceholder": "Wybierz czas wygaśnięcia", + "nameDescription": "Opcjonalnie · Maks. 32 znaki", + "nameLabel": "Nazwa", + "namePlaceholder": "Nadaj temu tokenowi krótką nazwę", + "never": "Nigdy" + }, + "list": { + "createdLabel": "Utworzono", + "deleteBtn": "Usuń token", + "expiresOnLabel": "Wygasa w dniu", + "expiresOnShort": "Wygasa: {{date}}", + "lastUsedLabel": "Ostatnio użyto", + "neverExpires": "Nigdy nie wygasa", + "neverLabel": "Nigdy", + "neverUsed": "Nigdy", + "statusActive": "Aktywny", + "statusExpired": "Wygasł", + "tokenLabel": "Token", + "unnamedToken": "Token bez nazwy" + }, + "notifications": { + "close": "Zamknij", + "copied": "Skopiowano do schowka", + "createFailed": "Błąd tworzenia", + "createSuccess": "Token dostępu został utworzony", + "createSuccessDesc": "Token dostępu został pomyślnie utworzony.", + "deleteFailed": "Nie udało się usunąć tokena dostępu", + "deleteSuccess": "Token dostępu został pomyślnie usunięty", + "genericError": "Operacja nie powiodła się. Spróbuj ponownie.", + "tryAgain": "Spróbuj ponownie", + "updateFailed": "Błąd aktualizacji", + "updateSuccess": "Token dostępu został zaktualizowany", + "updateSuccessDesc": "Token dostępu został pomyślnie zaktualizowany." + }, + "page": { + "addBtn": "Dodaj token", + "emptyDescription": "Nie utworzono jeszcze żadnych tokenów API. Kliknij poniżej, aby utworzyć nowy.", + "emptyTitle": "Brak tokenów API", + "loadError": "Błąd podczas ładowania tokenów API." + } + }, + "attachment": { + "all_fields_desc": "Dopasuj nazwę załącznika, temat i nadawcę", + "date": "Data", + "name": "Nazwa pliku", + "search_input_placeholder": "Wyszukaj załączniki (użyj \" \" do wyszukiwania fraz)", + "sender": "Nadawca", + "sender_with_count": "Nadawca ({{count}})", + "size": "Rozmiar pliku", + "source": "Źródło", + "subject": "Temat" + }, + "auth": { + "areYouSureYouWantToLogOut": "Czy na pewno chcesz się wylogować?", + "invalidPassword": "Nieprawidłowe hasło, spróbuj ponownie", + "login": "Login", + "loginFailed": "Błędny login", + "logout": "Wyloguj", + "password": "Hasło", + "sessionExpired": "Sesja wygasła", + "sessionExpiredDesc": "Twoja sesja wygasła z powodu bezczynności. Zaloguj się ponownie", + "somethingWentWrong": "Coś poszło nie tak", + "username": "Nazwa", + "welcome": "Witaj w Bichon", + "youWillNeedToLogInAgain": "Musisz zalogować się ponownie, aby ponownie móc korzystać." + }, + "command": { + "dark": "Ciemny", + "light": "Jasny", + "noResultsFound": "Brak wyników.", + "theme": "Motyw", + "typeCommandOrSearch": "Wpisz polecenie lub wyszukaj..." + }, + "common": { + "actions": "Akcje", + "add": "Dodaj", + "all": "Wszystkie", + "apply": "Zastosuj", + "back": "Wstecz", + "backToHome": "Wróć do strony głównej", + "cancel": "Anuluj", + "clear": "Wyczyść", + "close": "Zamknij", + "confirm": "Potwierdź", + "create": "Utwórz", + "delete": "Usuń", + "deleting": "Usuwanie...", + "deselectAll": "Odznacz wszystko", + "edit": "Edytuj", + "empty": "Puste", + "error": "Błąd", + "failed": "Nieudane", + "filter": "Filtr", + "goBack": "Powrót", + "loading": "Ładowanie...", + "more": "Więcej", + "na": "N/D", + "no": "Nie", + "noData": "Brak danych", + "none": "Brak", + "notFound": "Nie znaleziono", + "ok": "OK", + "op_failed": "Operacja nie powiodła się", + "project_description": "Bichon to projekt open-source.", + "remove": "Usuń", + "reset": "Resetuj", + "retry": "Ponów", + "save": "Zapisz", + "save_changes": "Zapisz zmiany", + "search": "Szukaj", + "select": "Wybierz", + "selectAll": "Zaznacz wszystko", + "showLess": "Pokaż mniej", + "showMore": "Pokaż więcej...", + "submit": "Wyślij", + "table": { + "noResults": "Brak wyników." + }, + "tryAgain": "Spróbuj ponownie", + "update": "Aktualizuj", + "view_on_github_button": "Zobacz na GitHub", + "yes": "Tak" + }, + "dashboard": { + "account": "Konto", + "actualDiskUsage": "Zajętość na dysku", + "attachmentRatio": "Załącznik Ratio", + "attachmentRatioDesc": "{{percent}}% wiadomości ma załączniki", + "attachments": "Załączniki", + "byMessageCount": "Według ilości wiadomości", + "byMessageSize": "Według rozmiaru wiadomości", + "connected": "Podłączone", + "count": "Ilość", + "dataStorage": "Magazyn danych", + "dayTrend": "Trend z 30 dni", + "efficiency": "Wydajność", + "emails": "Wiadomości", + "indexSize": "Rozmiar indeksu", + "localDataFiles": "Lokalne pliki danych", + "logicalVolume": "Oryginalny rozmiar", + "mailAccounts": "Konta email", + "messageDistribution": "Dystrybucja wiadomości", + "metadataSize": "Rozmiar metadanych", + "newEmails": "Nowe wiadomości", + "noAccountData": "Brak danych konta", + "noAttachments": "Bez załączników", + "noEmailsSynced": "Żadne wiadomości nie zostały jeszcze zsynchronizowane", + "noLargeEmails": "Brak dużych wiadomości", + "noRecentActivity": "Brak aktywności", + "noSendersData": "Brak danych od Nadawcy", + "noSubject": "(brak tematu)", + "saved": "Zaoszczędzone", + "sender": "Nadawca", + "size": "Rozmiar", + "subject": "Temat", + "syncedLocally": "Synchronizowane lokalnie", + "systemVersion": "Wersja systemu", + "tantivyDatabase": "Oparte na silniku wyszukiwania Tantivy", + "title": "Panel", + "top10Accounts": "Top 10 kont", + "top10LargestEmails": "Top 10 największych wiadomości", + "top10Senders": "Top 10 Nadawców", + "topLists": "Lista TOP", + "totalEmailSize": "Wielkość wszystkich wiadomości", + "totalEmails": "Wszystkie wiadomości", + "withAttachments": "Z załącznikami" + }, + "dialogs": { + "accountCredentials": "Poświadczenia kont i ustawienia", + "accountDeleteFailed": "Bład podczas usuwania konta", + "accountDeleted": "Konto usunięte", + "accountDeletedDesc": "Konto zostało usunięte.", + "allResourcesErased": "Wszystkie powiązane zasoby zostaną trwale usunięte.", + "cannotBeUndone": "Tej czynności nie można cofnąć!", + "confirmDelete": "Potwierdź usunięcie", + "confirmDeleteDesc": "Czy na pewno chcesz usunąć ten element? Tej czynności nie można cofnąć.", + "continue": "Kontynuować", + "createFailed": "Błąd podczas tworzenia", + "createSuccess": "Utworzono", + "deleteAccountPermanently": "Usuń konto na stałe", + "deleteFailed": "Błąd podczas usuwania", + "deleteSuccess": "Usunięto", + "deleting": "Usuwanie...", + "imapSyncData": "Data synchronizacji IMAP", + "localCachedMetadata": "Lokalne metadane w pamięci podręcznej i status synchronizacji", + "oauthTokens": "Tokeny OAuth i poświadczenia API", + "permanentlyDeleteAccount": "Trwałe usunięcie konta", + "saveFailed": "Błąd podczas zapisu", + "saveSuccess": "Zapisano", + "typeEmailToConfirm": "Wpisz adres email konta, aby potwierdzić:", + "typeToConfirm": "Wpisz \"{{email}}\" aby potwierdzić", + "updateFailed": "Błąd podczas aktualizacji", + "updateSuccess": "Zaktualizowano", + "youAreDeleting": "Właśnie usuwasz {{email}}. iTa operacja bezpowrotnie usunie:" + }, + "errors": { + "contentNotModified": "Treść nie jest modyfikowana!", + "forbidden": "Brak dostępu", + "forbiddenDesc": "Nie masz wystarczających uprawnień do przeglądania tych zasobów", + "forbiddenTitle": "Wstep wzbroniony", + "internalServerError": "Błąd wewnętrzny serwera!", + "learnMore": "Dowiedz się więcej", + "maintenance": "Konserwacja", + "maintenanceDesc": "Chwilowo strona jest niedostępna, ale niebawem będzie ponownie dostępna.", + "maintenanceTitle": "Strona jest w trakcie prac serwisowych!", + "networkError": "Błąd sieci", + "networkErrorDesc": "Problem z połączeniem z serwerem. Sprawdź połączenie z internetem i spróbuj ponownie.", + "pageNotFound": "Ups, nie znaleziono strony", + "pageNotFoundDesc": "Wygląda na to, że strona której szukasz nie istnieje lub została usunięta", + "somethingWentWrong": "Ups, coś poszło nie tak", + "somethingWentWrongDesc": "Za jakiś czas spróbuj ponownie.", + "unauthorized": "Brak uprawnień", + "unauthorizedDesc": "Aby uzyskać dostęp do tego zasobu, zaloguj się przy użyciu odpowiednich danych uwierzytelniających", + "unauthorizedTitle": "Dostęp nieautoryzowany" + }, + "mail": { + "account": "Konto", + "attachments": "Załączniki", + "bcc": "UDW", + "cc": "DW", + "date": "Data", + "delete": "Usuń", + "download": "Pobierz", + "downloadComplete": "Pobieranie zakończone", + "downloadFailed": "Błąd przy pobieraniu", + "downloadStarted": "Pobieranie rozpoczęte", + "downloaded": "{{id}} został pobrany", + "emailViewer": "Przegląd wiadomości", + "failedToDownloadFile": "Błąd przy pobieraniu pliku", + "failedToLoadEmail": "Błąd przy ładowaniu wiadomości.", + "from": "Z", + "id": "ID", + "isBeingDownloaded": "{{id}} będzie pobierane", + "noAttachments": "Bez załączników", + "noMessageSelected": "Nie zaznaczono wiadomości", + "noTagsYet": "Nie ma tagów", + "onlyNonInlineAttachments": "Wyświetlane są tylko załączniki non-inline.", + "showLess": "pokaż mniej", + "showMore": "pokaż więcej...", + "subject": "Temat", + "tags": "Tagi", + "to": "Do", + "viewThread": "Zobacz wątki" }, "mailbox": { + "bulkActions": { + "ariaLabel": "Akcje zbiorcze dla {{count}} zaznaczonych elementów {{emailLabel}}", + "clearSelection": "Wyczyść zaznaczenie", + "clearSelectionWithKey": "Usuń zaznaczenie wg. ({{key}})", + "delete": "Usuń", + "deleteTooltip": "Usuń zaznaczone wiadomości", + "email": "email", + "emails": "emails", + "selected": "zaznaczono" + }, + "deleteDialog": { + "confirm": "Usuń", + "desc": "Czy na pewno chcesz usunąć {{countText}}? Ta czynność spowoduje usunięcie wybranych adresów email z lokalnej bazy danych. Adresy email zostaną trwale usunięte i nie będzie można ich odzyskać.", + "descCountMultiple": "jest {{count}} wiadomości", + "descCountSingle": "ta wiadomość", + "errorTitle": "Błąd podczas usuwania wiadomości", + "successDesc": "Wiadomości zostały usunięte.", + "successTitle": "Wiadomości zostały pomyślnie usunięte", + "title": "Usuń wiadomość", + "warningDesc": "Zachować ostrożność przed kontynuacją.", + "warningTitle": "Ostrzeżenie!" + }, "deleteMailboxDialog": { + "confirm": "Usuń na stałe", + "desc": "Czy na pewno chcesz usunąć ten folder skrzynki? Tej operacji nie można cofnąć.", + "errorTitle": "Błąd usuwania", + "successDesc": "Folder skrzynki i jego zawartość zostały pomyślnie usunięte.", + "successTitle": "Usunięto pomyślnie", "title": "Usuń folder skrzynki", - "desc": "Czy na pewno chcesz usunąć ten folder skrzynki? Tej operacji nie można cofnąć.", - "warningTitle": "Ostrzeżenie", "warningDesc": "Usunięcie tego folderu spowoduje również trwałe usunięcie wszystkich zarchiwizowanych wiadomości e-mail i podfolderów w nim zawartych.", - "confirm": "Usuń na stałe", - "successTitle": "Usunięto pomyślnie", - "successDesc": "Folder skrzynki i jego zawartość zostały pomyślnie usunięte.", - "errorTitle": "Błąd usuwania" + "warningTitle": "Ostrzeżenie" }, - "title": "Skrzynka pocztowa", "folders": "Foldery", "messages": "Wiadomości", "noMessages": "Brak wiadomości", "selectFolder": "Wybierz folder, aby przeglądać wiadomości", - "deleteDialog": { - "title": "Usuń wiadomość", - "desc": "Czy na pewno chcesz usunąć {{countText}}? Ta czynność spowoduje usunięcie wybranych adresów email z lokalnej bazy danych. Adresy email zostaną trwale usunięte i nie będzie można ich odzyskać.", - "descCountSingle": "ta wiadomość", - "descCountMultiple": "jest {{count}} wiadomości", - "warningTitle": "Ostrzeżenie!", - "warningDesc": "Zachować ostrożność przed kontynuacją.", - "confirm": "Usuń", - "successTitle": "Wiadomości zostały pomyślnie usunięte", - "successDesc": "Wiadomości zostały usunięte.", - "errorTitle": "Błąd podczas usuwania wiadomości" - }, "thread": { - "title": "Wątki ({{count}} w {{messageLabel}})", + "empty": "Brak wiadomości w tym wątku.", + "invalidDate": "Niewłaściwa data", + "loadError": "Błąd podczas ładowania wątków wiadomości", + "loadMore": "Pokaż więcej", + "loadingMore": "Ładuje więcej...", "message": "wiadomość", "messages": "wiadomości", "noSubject": "(brak tematu)", - "invalidDate": "Niewłaściwa data", - "empty": "Brak wiadomości w tym wątku.", - "loadError": "Błąd podczas ładowania wątków wiadomości", - "loadingMore": "Ładuje więcej...", - "loadMore": "Pokaż więcej" + "title": "Wątki ({{count}} w {{messageLabel}})" }, - "bulkActions": { - "ariaLabel": "Akcje zbiorcze dla {{count}} zaznaczonych elementów {{emailLabel}}", - "email": "email", - "emails": "emails", - "selected": "zaznaczono", - "clearSelection": "Wyczyść zaznaczenie", - "clearSelectionWithKey": "Usuń zaznaczenie wg. ({{key}})", - "delete": "Usuń", - "deleteTooltip": "Usuń zaznaczone wiadomości" - } + "title": "Skrzynka pocztowa" }, - "search": { - "size": "Rozmiar", - "any": "Dowolny", - "tiny": "Bardzo mały (<15 KB)", - "small": "Mały (<2 MB)", - "medium": "Średni (2 - 10 MB)", - "large": "Duży (10 - 20 MB)", - "huge": "Bardzo duży (≥20 MB)", - "sort": "Sortuj", - "sizeDescription": "Rozmiar odnosi się do całkowitego rozmiaru wiadomości e-mail, łącznie z załącznikami.", - "title": "Szukaj", - "searching": "Wyszukiwanie, proszę czekać...", - "noEmailsFound": "Nie znaleziono wiadomości", - "startSearching": "Zacznij od wpisania słowa kluczowego, nadawcy lub skorzystania z zaawansowanych filtrów.", - "adjustSearch": "Spróbuj zmienić kryteria wyszukiwania lub wyczyścić filtry.", - "tagFilter": "Filtrowanie wg. tagów", - "from": "Od", - "to": "Do", - "subject": "Temat", - "date": "Data", - "editTag": "Edytuj tagi", - "keyword": "Słowa kluczowe", - "sender": "Nadawca", - "recipient": "Odbiorca", - "hasAttachment": "Posiada załącznik", - "yes": "Tak", - "no": "Nie", - "dateRange": "Zakres saty", - "startDate": "Data od", - "endDate": "Data do", - "advancedFilters": "Zaawansowane filtry", - "searchArchivedEmails": "Wyszukaj w zarchiwizowanych wiadomościach", - "fullTextMultiAccount": "Full-text · Wiele-kont · Filtry zaawansowane", - "account": "Konto", - "mailbox": "Skrzynka pocztowa", - "selectAccount": "Zaznacz konto", - "selectMailbox": "Zaznacz skrzynkę pocztową", - "noActiveEmailAccount": "Brak aktywnego konta email.", - "addEmailAccount": "Dodaj konto email", - "noMailboxSelectAccount": "Brak skrzynki pocztowej. Pierw wybierz konto.", - "searchInSubjectBody": "Szukanie w tytułach, treści, załącznikach...", - "searchingButton": "Wyszukiwanie...", - "searchButton": "Szukanie", - "advanced": "Zaawansowane", - "clear": "Wyczyść", - "since": "Od:", - "before": "Przed:", - "selectDate": "Wybierz datę", - "pleaseSelectAtLeastOne": "Wybierz co najmniej jeden warunek wyszukiwania", - "cc": "DW", - "bcc": "UDW", - "attachmentName": "Nazwa załącznika", - "messageId": "ID wiadomości", - "minSize": "Rozmiar minimalny", - "maxSize": "Rozmiar maksymalny", - "senderRecipients": "Nadawca / Odbiorcy", - "attachmentsSize": "Załączniki & Rozmiar", - "minimumBytes": "Minimum", - "maximumBytes": "Maksimum", - "originalMessageIdHeader": "Oryginalny nagłówek Message-ID", - "addTags": { - "title": "Edytuj tagi", - "none": "Nie dodano tagów", - "searchPlaceholder": "Wyszukaj lub utwórz tag...", - "createHint": "Utwórz nowy tag: {{tag}}", - "invalidTitle": "Niewłaściwy tag", - "updatedTitle": "Tagi zaktualizowane", - "updatedDesc": "Tagi zostały pomyślnie zaktualizowane", - "updateFailedTitle": "Błąd przy aktualizacji", - "tryAgain": "Spróbuj ponownie poxniej", - "selectedCount": "Wybrano {{count}} tagów", - "cancel": "Anuluj", - "save": "Zapisz", - "saving": "Zapisywanie..." - }, - "updateTags": { - "overwriteWarning": "Ostrzeżenie: to nadpisze wszystkie istniejące tagi w wybranych elementach.", - "title": "Aktualizuj tagi", - "none": "Nie wybrano żadnych tagów", - "searchPlaceholder": "Szukaj lub utwórz nowy tag...", - "createHint": "Naciśnij Enter, aby utworzyć nowy tag: \"{{tag}}\"", - "selectedCount": "Zostanie zastosowanych tagów: {{count}}", - "cancel": "Anuluj", - "invalidTitle": "Nieprawidłowy tag", - "updatedTitle": "Tagi zaktualizowane", - "updatedDesc": "Tagi zostały pomyślnie zaktualizowane.", - "updateFailedTitle": "Aktualizacja nie powiodła się", - "tryAgain": "Spróbuj ponownie później.", - "actionAdd": "Dodaj", - "actionRemove": "Usuń", - "actionOverwrite": "Nadpisz", - "submitAdd": "Dodaj tagi", - "submitRemove": "Usuń tagi", - "submitOverwrite": "Nadpisz tagi", - "savingAdd": "Dodawanie...", - "savingRemove": "Usuwanie...", - "savingOverwrite": "Nadpisywanie..." - }, - "thread": { - "title": "Wątek · {{count}} wiadomości", - "error": "Nie udało się załadować wątku", - "empty": "Brak wiadomości w tym wątku", - "invalidDate": "Nieprawidłowa data", - "noSubject": "(brak tematu)", - "loadingMore": "Ładowanie...", - "loadMore": "Załaduj więcej" - }, - "bulkActions": { - "ariaLabel": "Wybrano {{count}} wiadomości. Pasek działań", - "delete": "Usuń", - "deleteDesc": "Usuń wybrane wiadomości", - "selected": "Wybrano {{count}}", - "clear": "Wyczyść zaznaczenie", - "manageTags": "Zarządzaj tagami" - }, - "delete": { - "title": "Usuń wiadomości", - "confirmPrefix": "Czy na pewno chcesz usunąć", - "countLabel": "{{count}} wiadomości?", - "confirmDetail": "Tej operacji nie można cofnąć.", - "confirmButton": "Usuń", - "warningTitle": "Ostrzeżenie", - "warningDesc": "Wiadomości zostaną trwale usunięte.", - "successTitle": "Usunięto", - "successDesc": "Wiadomości zostały pomyślnie usunięte.", - "errorTitle": "Błąd usuwania" - } - }, - "mail": { - "emailViewer": "Przegląd wiadomości", - "noMessageSelected": "Nie zaznaczono wiadomości", - "account": "Konto", - "from": "Z", - "to": "Do", - "subject": "Temat", - "date": "Data", - "tags": "Tagi", - "noTagsYet": "Nie ma tagów", - "id": "ID", - "cc": "DW", - "bcc": "UDW", - "attachments": "Załączniki", - "download": "Pobierz", - "delete": "Usuń", - "viewThread": "Zobacz wątki", - "downloadStarted": "Pobieranie rozpoczęte", - "downloadComplete": "Pobieranie zakończone", - "downloadFailed": "Błąd przy pobieraniu", - "failedToDownloadFile": "Błąd przy pobieraniu pliku", - "failedToLoadEmail": "Błąd przy ładowaniu wiadomości.", - "isBeingDownloaded": "{{id}} będzie pobierane", - "downloaded": "{{id}} został pobrany", - "showLess": "pokaż mniej", - "showMore": "pokaż więcej...", - "onlyNonInlineAttachments": "Wyświetlane są tylko załączniki non-inline.", - "noAttachments": "Bez załączników" + "navigation": { + "accessTokens": "Tokeny", + "accounts": "Konta", + "apiDocs": "Dokumentacja API", + "attachment": "Załączniki", + "auth": "Auth", + "dashboard": "Panel", + "general": "Ogólne", + "home": "Home", + "mailbox": "Poczta", + "oauth2": "OAuth2", + "other": "Pozostałe", + "settings": "Ustawienia", + "users": "Użytkownicy systemu" }, "oauth2": { - "title": "OAuth2", + "aSecretKeyProvidedByTheOAuthProvider": "Tajny klucz dostarczony przez dostawcę OAuth w celu uwierzytelnienia Twojej aplikacji.", + "actions": { + "authorize": "Autoryzuj", + "delete": "Usuń", + "edit": "Edytuj", + "openMenu": "Otwórz menu" + }, "addConfiguration": "Dodaj konfigurację", - "id": "ID", - "provider": "Provider", + "addExtraParams": "Dodaj dodatkowe parametry", + "addNew": "Dodaj nowe", + "addScope": "Dodaj zakres", + "areYouSureYouWantTo": "Czy jesteś pewnny, aby {{action}} klienta OAuth2?", + "areYouSureYouWantToDelete": "Czy na pewno chcesz usunąć?", + "authAtatus": "Status Autoryzacji OAuth2", + "authFailed": "Bład przy autoryzacji OAuth2", + "authSuccess": "Autoryzacja OAuth2 zakończona sukcesem", + "authUrlLabel": "URL autoryzacji:", + "authorizationUrlCannotBeEmpty": "URL Autoryzacji nie może być pusty", + "authorizationUrlIsRequired": "URL Autoryzacji jest wymagany", + "authorize": "Autoryzacja", + "authorizeAnEmailAccountToStartTheOAuth2AuthorizationProcess": "Autoryzuj konto email, aby rozpocząć proces autoryzacji za pomocą OAuth2.", + "authorizeEmailAccount": "Autoryzuj konto email", + "backToLogin": "Wróć do ekranu logowania", + "clickSaveWhenDone": "Jeśli będziesz gotowy naciśnij 'Utwórz'.", "clientId": "ID klienta", + "clientIdCannotBeEmpty": "'Client ID' nie może być pusty", + "clientIdIsRequired": "'Client ID' jest wymagany", + "clientIdLabel": "Id klienta:", "clientSecret": "Sekret klienta", - "redirectUri": "Przekierowanie URI", - "scopes": "Zakres", - "status": "Status", - "enabled": "Aktywne", + "clientSecretCannotBeEmpty": "'Client Secret' nie może być pust", + "clientSecretIsRequired": "'Client Secret' jest wymagany", + "clientSecretLabel": "Sekret klienta:", + "createAccount": "Utwórz konto", + "createNewHere": "Utwórz nowe tutaj.", + "created": "Utworzono", + "creating": "Tworzenie...", + "creationFailed": "Błąd tworzenia", + "delete": "Usuń", + "deleteFailed": "Problem z usunięciem, spróbuj ponownie", + "deleteSuccess": "Pomyślnie usunięto", + "deleteToken": "Usuń Token", + "describeThePurposeOfTheOauth2Application": "Opisz cel aplikacji OAuth2", + "description": "Automatycznie obsługuje pobieranie, przechowywanie i odświeżanie tokenów dostępu, zapewniając płynne i zawsze gotowe do użycia uwierzytelnianie", + "descriptionLabel": "Opis:", + "descriptionMustNotExceed255Characters": "Opis nie może przekraczać 255 znaków", + "disable": "Wyłącz", + "disableOAuth2Client": "Wyłacz klienta OAuth2", "disabled": "Nieaktywne", "edit": "Edytuj", - "delete": "Usuń", "enable": "Włącz", - "disable": "Wyłącz", - "noConfigurations": "Brak konfiguracji OAuth2", - "noConfigurationsDesc": "Nie dodano jeszcze żadnych konfiguracji OAuth2. Dodaj jedną, aby zacząć korzystać z funkcji OAuth2.", - "description": "Automatycznie obsługuje pobieranie, przechowywanie i odświeżanie tokenów dostępu, zapewniając płynne i zawsze gotowe do użycia uwierzytelnianie", - "addNew": "Dodaj nowe", - "updateHere": "Aktualizuj to.", - "createNewHere": "Utwórz nowe tutaj.", - "clickSaveWhenDone": "Jeśli będziesz gotowy naciśnij 'Utwórz'.", - "quickPresets": "Szybkie szablony ustawień:", - "gmail": "Gmail", - "outlook": "Outlook", - "whenDisabled": "Kiedy wyłączone: Nowe przepływy autoryzacji zostaną natychmiast odrzucone - Istniejące tokeny dostępu i tokeny odświeżania zostaną unieważnione w ciągu 1 minutyi. Użytkownicy muszą ponownie dokonać autoryzacji po ponownym włączeniu", - "clientIdLabel": "Id klienta:", - "enterYourClientId": "Wpisz ID klienta", - "theUniqueIdentifierForYourApplication": "Unikalny identyfikator Twojej aplikacji dostarczony przez dostawcę OAuth", - "clientSecretLabel": "Sekret klienta:", - "leaveEmptyToKeepExistingSecret": "Pozostaw puste, aby zachować dotychczasowy", - "enterYourClientSecret": "Wpisz swkret klienta", - "leaveEmptyToKeepTheExistingSecret": "Pozostaw puste, aby zachować istniejący sekret. Wprowadź nową wartość tylko wtedy, gdy chcesz ją zmienić.", - "aSecretKeyProvidedByTheOAuthProvider": "Tajny klucz dostarczony przez dostawcę OAuth w celu uwierzytelnienia Twojej aplikacji.", - "authUrlLabel": "URL autoryzacji:", + "enableOAuth2Client": "Włącz klienta OAuth2", + "enabled": "Aktywne", + "enterIdToConfirmDeletion": "Wpisz 'id', aby potwierdzić chęć usunięcia.", "enterTheAuthorizationUrl": "Wpisz URL autoryzacji", - "theUrlWhereUsersWillBeRedirected": "Adres URL, na który użytkownicy zostaną przekierowani w celu autoryzacji Twojej aplikacji", - "tokenUrlLabel": "Token URL:", - "enterTheTokenUrl": "Wpisz token URL", - "theUrlUsedToExchange": "Adres URL służący do wymiany kodu autoryzacyjnego na token dostępu", - "redirectUrlLabel": "Przekierowanie URL:", - "enterYourRedirectUrl": "Wpisz przekierowanie URL", - "theRedirectUrlAfterAuthorization": "Adres URL przekierowania po autoryzacji. Musi być zgodny z adresem zarejestrowanym u dostawcy OAuth. Użyj formatu: http://[host]:[port]/oauth2/callback (lub https://), gdzie [host] i [port] do instalacji RustMailer. Stała ścieżka /oauth2/callback", - "scope": "Zakres:", - "enterTheScopeHere": "Wpisz zakres tutaj.", - "addScope": "Dodaj zakres", - "key": "Klucz:", "enterTheKeyHere": "Wpisz klucz tutaj.", - "value": "Wartość:", + "enterTheScopeHere": "Wpisz zakres tutaj.", + "enterTheTokenUrl": "Wpisz token URL", "enterTheValueHere": "Wpisz wartość tutaj.", - "addExtraParams": "Dodaj dodatkowe parametry", - "useProxyOptional": "Użyj Proxy (opcjonalnie):", - "selectAProxy": "Wybierz proxy", - "noProxyAvailable": "Brak dostępnych proxy", - "useSocks5ProxyForOAuthRequests": "Użyj serwera proxy SOCKS5 dla żądań OAuth, gdy bezpośredni dostęp jest zablokowany.", - "descriptionLabel": "Opis:", - "describeThePurposeOfTheOauth2Application": "Opisz cel aplikacji OAuth2", - "optional": "Opcjonalnie", - "saving": "Zapisywanie...", - "creating": "Tworzenie...", - "saveChanges": "Zapisywanie zmian", - "save": "Zapisz", - "updated": "Zaktualizowano", - "created": "Utworzono", - "yourOAuth2ApplicationHasBeenSuccessfully": "Twoja aplikacja OAuth2 została {{action}}.", - "updateFailed": "Błąd aktualizacji", - "creationFailed": "Błąd tworzenia", - "updateOrCreationFailed": "Nie udałoło się {{action}}, spróbuj później", - "clientSecretIsRequired": "'Client Secret' jest wymagany", - "clientSecretCannotBeEmpty": "'Client Secret' nie może być pust", - "keyIsRequired": "Klucz jest wymagany", - "keyCannotBeEmpty": "Klucz nie może być pusty", - "valueIsRequired": "Wartość jest wymagana", - "valueCannotBeEmpty": "Wartość nie może być pusta", - "descriptionMustNotExceed255Characters": "Opis nie może przekraczać 255 znaków", - "clientIdIsRequired": "'Client ID' jest wymagany", - "clientIdCannotBeEmpty": "'Client ID' nie może być pusty", - "authorizationUrlIsRequired": "URL Autoryzacji jest wymagany", - "authorizationUrlCannotBeEmpty": "URL Autoryzacji nie może być pusty", - "invalidAuthorizationUrlFormat": "Niewłaściwy format URLa Autoryzacji", - "tokenUrlIsRequired": "'Token URL' jest wymagany", - "tokenUrlCannotBeEmpty": "'Token URL' nie może być pusty", - "invalidTokenUrlFormat": "Niewłaściwy format 'Token URL'", - "redirectUriIsRequired": "'Redirect URI' jest wymagany", - "redirectUriCannotBeEmpty": "'Redirect URI' nie może być pusty", - "invalidRedirectUriFormat": "Niewłaściwy format 'Redirect URI'", - "authorizeEmailAccount": "Autoryzuj konto email", - "authorizeAnEmailAccountToStartTheOAuth2AuthorizationProcess": "Autoryzuj konto email, aby rozpocząć proces autoryzacji za pomocą OAuth2.", - "loadingAccounts": "Ładuje konta...", - "selectAnAccount": "Wybierz konto", - "noEmailAccountsRegistered": "Brak zarejestrowanych kont email. Proszę je utworzyć.", - "pleaseCreateOne": "Utwórz pierwsze.", - "createAccount": "Utwórz konto", - "authorize": "Autoryzacja", + "enterYourClientId": "Wpisz ID klienta", + "enterYourClientSecret": "Wpisz swkret klienta", + "enterYourRedirectUrl": "Wpisz przekierowanie URL", + "error": "Błąd", "getAuthorizeUrlFailed": "Błąd Autoryzacji URL", "getAuthorizeUrlFailedDesc": "Pobieranie URL Autoryzacji zakończyło się błędem, spróbuj ponownie", - "oauth2ClientUpdated": "Aktualizacja klienta OAuth2", - "oauth2ClientHasBeenSuccessfully": "Klient OAuth2 został {{action}}.", - "statusUpdateFailed": "Status aktualizacji zakończł się błędemi spróbuj ponownie", - "disableOAuth2Client": "Wyłacz klienta OAuth2", - "enableOAuth2Client": "Włącz klienta OAuth2", - "areYouSureYouWantTo": "Czy jesteś pewnny, aby {{action}} klienta OAuth2?", - "thisWillPreventTheOAuth2ClientFromBeingUsed": "Spowoduje to, że nie będzie można używać klienta OAuth2", - "deleteToken": "Usuń Token", - "areYouSureYouWantToDelete": "Czy na pewno chcesz usunąć?", - "thisActionWillPermanentlyRemoveTheOauth2Record": "Ta czynność spowoduje trwałe usunięcie rekordu OAuth2 z systemu. Tej czynności nie można cofnąć.", - "enterIdToConfirmDeletion": "Wpisz 'id', aby potwierdzić chęć usunięcia.", - "warning": "Ostrzeżenie!", - "pleaseBeCareful": "Należy zachować ostrożność, tej operacji nie można cofnąć", - "deleteSuccess": "Pomyślnie usunięto", - "yourOAuth2ApplicationHasBeenSuccessfullyDeleted": "Twoja aplikacja OAuth2 została pomyślnie usunięta", - "oauth2DeleteFailed": "Błąd przy usuwaniu OAuth2", - "deleteFailed": "Problem z usunięciem, spróbuj ponownie", - "actions": { - "openMenu": "Otwórz menu", - "edit": "Edytuj", - "authorize": "Autoryzuj", - "delete": "Usuń" - }, - "authFailed": "Bład przy autoryzacji OAuth2", - "error": "Błąd", - "unknownError": "Wystąpił nieznany błąd.", - "tryAgain": "Spróbuj ponownie", + "gmail": "Gmail", "goHome": "Powrót to strony głównej", - "authSuccess": "Autoryzacja OAuth2 zakończona sukcesem", + "goToAccounts": "Idz do kont", + "id": "ID", + "information": "Informacje", + "invalidAuthorizationUrlFormat": "Niewłaściwy format URLa Autoryzacji", + "invalidRedirectUriFormat": "Niewłaściwy format 'Redirect URI'", + "invalidTokenUrlFormat": "Niewłaściwy format 'Token URL'", + "key": "Klucz:", + "keyCannotBeEmpty": "Klucz nie może być pusty", + "keyIsRequired": "Klucz jest wymagany", + "leaveEmptyToKeepExistingSecret": "Pozostaw puste, aby zachować dotychczasowy", + "leaveEmptyToKeepTheExistingSecret": "Pozostaw puste, aby zachować istniejący sekret. Wprowadź nową wartość tylko wtedy, gdy chcesz ją zmienić.", + "loadingAccounts": "Ładuje konta...", + "noConfigurations": "Brak konfiguracji OAuth2", + "noConfigurationsDesc": "Nie dodano jeszcze żadnych konfiguracji OAuth2. Dodaj jedną, aby zacząć korzystać z funkcji OAuth2.", + "noEmailAccountsRegistered": "Brak zarejestrowanych kont email. Proszę je utworzyć.", + "noProxyAvailable": "Brak dostępnych proxy", + "noStatus": "Ta strona wyświetla wynik uwierzytelnienia OAuth2. Obecnie nie ma konkretnego statusu. Spróbuj ponownie, jeśli to konieczne.", + "oauth2ClientHasBeenSuccessfully": "Klient OAuth2 został {{action}}.", + "oauth2ClientUpdated": "Aktualizacja klienta OAuth2", + "oauth2DeleteFailed": "Błąd przy usuwaniu OAuth2", + "optional": "Opcjonalnie", + "outlook": "Outlook", + "pleaseBeCareful": "Należy zachować ostrożność, tej operacji nie można cofnąć", + "pleaseCreateOne": "Utwórz pierwsze.", + "provider": "Provider", + "quickPresets": "Szybkie szablony ustawień:", + "redirectUri": "Przekierowanie URI", + "redirectUriCannotBeEmpty": "'Redirect URI' nie może być pusty", + "redirectUriIsRequired": "'Redirect URI' jest wymagany", + "redirectUrlLabel": "Przekierowanie URL:", + "save": "Zapisz", + "saveChanges": "Zapisywanie zmian", + "saving": "Zapisywanie...", + "scope": "Zakres:", + "scopes": "Zakres", + "selectAProxy": "Wybierz proxy", + "selectAnAccount": "Wybierz konto", + "status": "Status", + "statusUpdateFailed": "Status aktualizacji zakończł się błędemi spróbuj ponownie", "success": "Sukces", "successMessage": "Twoje konto email zostało pomyślnie uwierzytelnione za pomocą protokołu OAuth2. Token dostępu został zapisany przez system i będzie automatycznie aktualizowany w razie potrzeby.", - "goToAccounts": "Idz do kont", - "authAtatus": "Status Autoryzacji OAuth2", - "information": "Informacje", - "noStatus": "Ta strona wyświetla wynik uwierzytelnienia OAuth2. Obecnie nie ma konkretnego statusu. Spróbuj ponownie, jeśli to konieczne.", - "backToLogin": "Wróć do ekranu logowania" - }, - "accessTokens": { - "title": "Tokeny dostępu", - "name": "Name", - "accounts": "Konta", - "token": "Token", - "createdAt": "Utworzono", - "expiresAt": "Wygasa o", - "edit": "Edytuj", - "delete": "Usuń", - "create": "Utwórz", - "noTokens": "Brak tokenów dostępu", - "noTokensDesc": "Nie utworzyłeś jeszcze żadnych tokenów dostępu. Utwórz jeden, aby zacząć korzystać z funkcji API.", - "description": "Tutaj możesz zarządzać swoimi tokenami dostępu, kontrolą dostępu, białymi listami adresów IP i ustawieniami ograniczeń przepustowości.", - "editToken": "Edytuj Token", - "addNew": "Dodaj nowy", - "updateTheAccessTokenHere": "Uaktualnij token dostępu tutaj.", - "createNewAccessTokenHere": "Utwórz token dostępu tutaj.", - "selectAccounts": "Zaznacz konta", - "selectMultipleAccountsForTheAccessToken": "Wybierz wiele kont dla zakresu autoryzacji tokena dostępu", - "enterOneIpAddressPerLine": "Wpisz adres IPv4, każdy w nowej linijce, np:\n192.168.1.1\n192.168.1.2", - "aListOfIpAddressesAllowed": "Lista adresów IP, które mają dostęp do zasobu. Wprowadź po jednym adresie IP w każdym wierszu. (Opcjonalnie)", - "enterQuota": "Wprowadź limit np. 100", - "theMaximumNumberOfRequestsAllowed": "Maksymalna liczba żądań dozwolona w danym przedziale czasowym. (Opcjonalnie)", - "enterIntervalInSeconds": "Wprowadź interwał w sekundach np. 60", - "theTimeWindowForTheRateLimit": "Okno czasowe (w sekundach) dla limitu szybkości. (Opcjonalnie)", - "describeThePurposeOfTheAccessToken": "Opisz jaki jest cel tokena dostępu", - "updating": "Aktualizacja...", - "saving": "Zapisywanie...", - "creating": "Tworzenie...", - "saveChanges": "Zapisz zmiany", - "save": "Zapisz", - "updated": "Zaktualizowano", - "created": "Utworzono", - "yourAccessTokenHasBeenSuccessfully": "Token został {{action}}.", - "updateFailed": "Błąd aktualizacji", - "creationFailed": "Błąd tworzenia", - "updateOrCreationFailed": "Błąd {{action}}, spróbuj ponownym", - "quotaMustBeAPositiveInteger": "Quota musi być dodatnią liczbą całkowitą.", - "intervalMustBeAPositiveInteger": "Interval musi być dodatnią liczbą całkowitą.", - "invalidIpAddressesFound": "Błędny adres IP, wpisz poprawny adres IPv4/IPv6.", - "atLeastOneAccountIsRequired": "Minimum jedno konto jest wymagane.", - "descriptionMustNotExceed255Characters": "Opis nie może przekroczyć 255 znaków.", - "notUsedYet": "Jeszcze nie używany", - "theListOfAccountsThatCanBeQueried": "Lista kont, do których można wysłać zapytanie za pomocą tokena dostępu.", - "accountId": "ID konta", - "filterByEmailAddressOrAccountId": "Filtruj według adresu email lub identyfikatora konta...", - "aclRulesForAccessTokens": "Reguły ACL dla tokenów dostępu obejmują weryfikację białej listy adresów IP i egzekwowanie limitów przepustowości", - "actions": { - "openMenu": "Otwórz menu", - "edit": "Edytuj", - "delete": "Usuń" - }, - "quota": "Quota", - "interval": "Interval" - }, - "settings": { - "appearance": { - "title": "Wygląd", - "field": { - "language": "Język interfejsu", - "theme": "Motyw interfejsu" - }, - "description": { - "language": "Wybierz język interfejsu webowego.", - "theme": "Wybierz tryb jasny lub ciemny." - }, - "placeholder": { - "select_language": "Wybierz język" - }, - "command": { - "search": "Szukaj języka...", - "no_results": "Nie znaleziono języka." - }, - "theme": { - "light": "Jasny", - "dark": "Ciemny" - }, - "button": { - "update": "Aktualizuj preferencje" - }, - "validation": { - "language": { - "required": "Proszę wybrać język." - }, - "theme": { - "required": "Proszę wybrać motyw." - } - } - }, - "title": "Ustawienia", - "general": "Ogólne", - "proxy": "Proxy", - "name": "Nazwa", - "host": "Host", - "port": "Port", - "username": "Login", - "password": "Hasło", - "type": "Typ", - "actions": "Akcje", - "edit": "Edytuj", - "delete": "Usuń", - "add": "Dodaj", - "noProxies": "Brak Proxy", - "noProxiesDesc": "Nie dodano jeszcze żadnych konfiguracji proxy. Dodaj jedną, aby zacząć korzystać z funkcji proxy.", - "root": "Root", - "rootTitle": "Root", - "rootDesc": "Zarządzaj danymi uwierzytelniającymi dostępu root, w tym tokenem i hasłem", - "rootAccessManagement": "Zarządzanie dostępem", - "manageRootTokenAndPassword": "Zarządzaj tokenem głównym i hasłem w sposób bezpieczny", - "resetRootToken": "Resetuj Root Token", - "generateNewToken": "Wygeneruj nowy token, stary wygaśnie natychmiast.", - "reset": "Reset", - "resetRootPassword": "Resetuj hasło root", - "changePasswordForFutureLogins": "Zmień hasło dla przyszłych logowań", - "youAreAboutToResetTheRootToken": "Zamierzasz zresetować token główny. Tej czynności nie można cofnąć", - "confirmReset": "Potwierdź reset", - "youAreAboutToResetTheRootPassword": "Zamierzasz zresetować hasło roota. Przechowuj je bezpiecznie.", - "enterNewRootPassword": "Wprowadź nowe hasło dla roota", - "theRootTokenHasBeenReset": "Token główny został zresetowany", - "yourLoginInformationHasBeenUpdated": "Twoje dane logowania zostały zaktualizowane. Nie musisz się logować ponownie.", - "invalidPassword": "Błędne hasło", - "rootPasswordMustBeAtLeast6Characters": "Hasło dla roota musi mieć co najmniej 6 znaków", - "theRootPasswordHasBeenReset": "Hasło roota zostało zresetowane", - "useNewPasswordForNextLogin": "Użyj nowego hasła przy następnym logowaniu", - "failedToCopyText": "Błąd podczas kopiowania tekstu", - "filterProxy": "Filtr Proxy...", - "filterOauth2": "Filtr oauth2...", - "filterAccount": "Filtr konta...", - "filterAccessToken": "Filtr tokenów...", - "selectAll": "Zaznacz wszystko", - "theme": "Motyw", - "id": "Id", - "url": "URL", - "createdAt": "Utworzono o", - "updatedAt": "Zaktualizowano o", - "enabled": "Włączone", - "useProxy": "Użyj Proxy", - "authUrl": "Auth URL", - "tokenUrl": "Token URL", - "description": "Opis", - "token": "Token", - "accounts": "Konta", - "acl": "ACL", - "lastAccess": "Ostatni dostęp", - "enterProxyIdToConfirmDeletion": "Wpisz nazwę proxy, aby potwierdzić usunięcie.", - "updateTheProxyHere": "Uaktualnij Proxy tutaj. ", - "addNewProxyHere": "Dodaj nowe Proxy tutaj. ", - "pleaseUseAnIpAddressForBetterReliability": "Aby zapewnić większą niezawodność, użyj adresu IP (np. 127.0.0.1), a nie nazwy hosta lub domeny.", - "adding": "Dodawanie...", - "yourProxyHasBeenSuccessfully": "Proxy zostało {{action}}.", - "proxyUpdateOrAddFailed": "Błąd {{action}}, spróbuj później", - "sidebar": { - "profile": "Profil", - "apiTokens": "Tokeny API", - "proxy": "Proxy sieciowe", - "configurations": "Konfiguracja systemu" - }, - "profile": { - "loadError": "Nie udało się załadować informacji o użytkowniku.", - "uploadTitle": "Prześlij awatar", - "maxSize": "Do {{size}}", - "avatarAlt": "Awatar", - "removeAvatar": "Usuń awatar", - "uploadError": "Błąd przesyłania pliku", - "field": { - "username": "Nazwa użytkownika", - "email": "E-mail", - "password": "Hasło" - }, - "placeholder": { - "password_keep": "Pozostaw puste, aby zachować obecne hasło" - }, - "button": { - "update_profile": "Zaktualizuj profil", - "permissions": "Uprawnienia", - "view_global_permissions": "Zobacz globalne uprawnienia" - }, - "section": { - "roles": "Role", - "accounts": "Połączone konta: {{count}}" - }, - "account": { - "id": "ID konta: {{id}}" - }, - "toast": { - "updated": "Profil został zaktualizowany", - "update_failed": "Nie udało się zaktualizować profilu" - }, - "validation": { - "username": { - "required": "Nazwa użytkownika jest wymagana", - "min": "Nazwa użytkownika musi mieć co najmniej 5 znaków", - "max": "Nazwa użytkownika może mieć maksymalnie 32 znaki" - }, - "email": { - "required": "Adres e-mail jest wymagany", - "invalid": "Wprowadź poprawny adres e-mail" - }, - "password": { - "min": "Hasło musi mieć co najmniej 8 znaków", - "max": "Hasło może mieć maksymalnie 256 znaki" - } - } - } - }, - "apiDocs": { - "choosePreferredType": "Wybierz preferowany typ dokumentacji API", - "swaggerUI": "Swagger UI", - "reDoc": "ReDoc", - "openAPIExplorer": "OpenAPI", - "scalar": "Scalar", - "downloadSpecYAML": "Plik YAML" - }, - "dialogs": { - "confirmDelete": "Potwierdź usunięcie", - "confirmDeleteDesc": "Czy na pewno chcesz usunąć ten element? Tej czynności nie można cofnąć.", - "deleteSuccess": "Usunięto", - "deleteFailed": "Błąd podczas usuwania", - "saveSuccess": "Zapisano", - "saveFailed": "Błąd podczas zapisu", - "createSuccess": "Utworzono", - "createFailed": "Błąd podczas tworzenia", - "updateSuccess": "Zaktualizowano", - "updateFailed": "Błąd podczas aktualizacji", - "continue": "Kontynuować", - "deleting": "Usuwanie...", - "accountDeleted": "Konto usunięte", - "accountDeletedDesc": "Konto zostało usunięte.", - "accountDeleteFailed": "Bład podczas usuwania konta", - "deleteAccountPermanently": "Usuń konto na stałe", - "youAreDeleting": "Właśnie usuwasz {{email}}. iTa operacja bezpowrotnie usunie:", - "accountCredentials": "Poświadczenia kont i ustawienia", - "localCachedMetadata": "Lokalne metadane w pamięci podręcznej i status synchronizacji", - "imapSyncData": "Data synchronizacji IMAP", - "oauthTokens": "Tokeny OAuth i poświadczenia API", - "typeEmailToConfirm": "Wpisz adres email konta, aby potwierdzić:", - "typeToConfirm": "Wpisz \"{{email}}\" aby potwierdzić", - "cannotBeUndone": "Tej czynności nie można cofnąć!", - "allResourcesErased": "Wszystkie powiązane zasoby zostaną trwale usunięte.", - "permanentlyDeleteAccount": "Trwałe usunięcie konta" - }, - "command": { - "typeCommandOrSearch": "Wpisz polecenie lub wyszukaj...", - "noResultsFound": "Brak wyników.", - "theme": "Motyw", - "light": "Jasny", - "dark": "Ciemny" - }, - "validation": { - "required": "To pole jest wymagane", - "invalidEmail": "Niewłaściwy adres email", - "invalidUrl": "Niewłaściwy URL", - "passwordMinLength": "Hasło musi posiadać conajmniej {{min}} znaków", - "pleaseEnterPassword": "Proszę podać hasło", - "passwordRequired": "Hasło jest wymagane, gdy metodą uwierzytelniania jest hasło", - "emailRequired": "Email jest wymagany", - "imapHostRequired": "Host IMAP jest wymagany", - "imapHostCannotBeEmpty": "Host IMAP nie może być pusty", - "imapPortMustBePositive": "Port IMAP musi być liczbą całkowitą dodatnią", - "imapPortMustBeLessThan65536": "Port IMAP musi być liczbą w przedziale 0-65535", - "folderLimitMustBeNumber": "Limit folderów musi być liczbą", - "folderLimitMustBeAtLeast100": "Limit folderów musi być liczbą nie mniejszą niż 100", - "incrementalSyncMustBeNumber": "Przyrostowy interwał synchronizacji musi być liczbą", - "incrementalSyncMustBeAtLeast10": "Przyrostowy interwał synchronizacji musi wynosić co najmniej 10 minut", - "pleaseEnterUsernameOrEmail": "Proszę podać nazwę użytkownika lub adres e-mail", - "singleRequestBatchSizeMustBeNumber": "Rozmiar partii musi być liczbą", - "singleRequestBatchSizeTooSmall": "Rozmiar partii musi wynosić co najmniej 10", - "singleRequestBatchSizeTooLarge": "Rozmiar partii może wynosić maksymalnie 200" - }, - "table": { - "noResults": "Brak wyników", - "loading": "Ładowanie...", - "page": "Strona", - "of": "z", - "rowsPerPage": "Wierszy na stronę", - "showing": "Pokazuj", - "to": "do", - "results": "wyniki", - "asc": "Rosnąco", - "desc": "Malejąco", - "hide": "Ukryj", - "edit": "Edytuj", - "delete": "Usuń", - "pagination": { - "selected": "Wybrano {{selected}} z {{total}} wierszy.", - "fixed_page_size": "{{size}} wierszy na stronę.", - "rows_per_page": "Wierszy na stronę", - "page_info": "Strona {{page}} z {{total}}", - "first": "Pierwsza strona", - "previous": "Poprzednia strona", - "next": "Następna strona", - "last": "Ostatnia strona" - } - }, - "proxyDelete": { - "title": "Usuń Proxy", - "successTitle": "Usunięto", - "successDesc": "Proxy zostało usunięte.", - "close": "Zamknij", - "failedTitle": "Błąd podczas usuwania proxy", - "failedDesc": "Błąd podczas usuwania, spróbuj ponownie za jakiś czas.", + "theRedirectUrlAfterAuthorization": "Adres URL przekierowania po autoryzacji. Musi być zgodny z adresem zarejestrowanym u dostawcy OAuth. Użyj formatu: http://[host]:[port]/oauth2/callback (lub https://), gdzie [host] i [port] do instalacji RustMailer. Stała ścieżka /oauth2/callback", + "theUniqueIdentifierForYourApplication": "Unikalny identyfikator Twojej aplikacji dostarczony przez dostawcę OAuth", + "theUrlUsedToExchange": "Adres URL służący do wymiany kodu autoryzacyjnego na token dostępu", + "theUrlWhereUsersWillBeRedirected": "Adres URL, na który użytkownicy zostaną przekierowani w celu autoryzacji Twojej aplikacji", + "thisActionWillPermanentlyRemoveTheOauth2Record": "Ta czynność spowoduje trwałe usunięcie rekordu OAuth2 z systemu. Tej czynności nie można cofnąć.", + "thisWillPreventTheOAuth2ClientFromBeingUsed": "Spowoduje to, że nie będzie można używać klienta OAuth2", + "title": "OAuth2", + "tokenUrlCannotBeEmpty": "'Token URL' nie może być pusty", + "tokenUrlIsRequired": "'Token URL' jest wymagany", + "tokenUrlLabel": "Token URL:", "tryAgain": "Spróbuj ponownie", - "confirmText": "Czy na pewno chcesz usunąć?", - "permanent": "Ta czynność spowoduje trwałe usunięcie serwera proxy z systemu. Tej czynności nie można cofnąć.", - "proxyIdLabel": "Proxy Id:", - "proxyIdPlaceholder": "Wpisz Proxy Id aby potwierdzić usunięcie.", - "warningTitle": "Ostrzeżenie!", - "warningDesc": "Należy zachować ostrożność, tej operacji nie można cofnąć", - "deleteBtn": "Usuń" - }, - "systemConfig": { - "pageTitle": "Konfiguracje na poziomie systemu", - "pageDescription": "Parametry te są inicjowane za pomocą flag CLI lub zmiennych środowiskowych. Są one obecnie tylko do odczytu.", - "status": { - "enabled": "Włączone", - "disabled": "Wyłączone", - "configured": "Skonfigurowane", - "missing": "Brak", - "auto": "Auto", - "notSet": "Nie ustawiono" - }, - "sections": { - "network": { - "title": "Sieć", - "desc": "HTTP i dostęp publiczny" - }, - "cors": { - "title": "CORS", - "desc": "Zasady dostępu cross-origin" - }, - "logging": { - "title": "Logowanie", - "desc": "Zachowanie wyjściowe logów" - }, - "storage": { - "title": "Pamięć i bufor", - "desc": "Ścieżki bazy danych i limity" - }, - "security": { - "title": "Bezpieczeństwo", - "desc": "Uwierzytelnianie i szyfrowanie" - }, - "performance": { - "title": "Wydajność", - "desc": "Współbieżność i kompresja" - }, - "smtp": { - "title": "Serwer SMTP", - "desc": "Ustawienia odbierania poczty przychodzącej do archiwizacji w czasie rzeczywistym" - } - } - }, - "apiTokens": { - "page": { - "loadError": "Błąd podczas ładowania tokenów API.", - "emptyTitle": "Brak tokenów API", - "emptyDescription": "Nie utworzono jeszcze żadnych tokenów API. Kliknij poniżej, aby utworzyć nowy.", - "addBtn": "Dodaj token" - }, - "list": { - "unnamedToken": "Token bez nazwy", - "statusActive": "Aktywny", - "statusExpired": "Wygasł", - "neverExpires": "Nigdy nie wygasa", - "expiresOnShort": "Wygasa: {{date}}", - "tokenLabel": "Token", - "createdLabel": "Utworzono", - "lastUsedLabel": "Ostatnio użyto", - "expiresOnLabel": "Wygasa w dniu", - "neverUsed": "Nigdy", - "neverLabel": "Nigdy", - "deleteBtn": "Usuń token" - }, - "dialog": { - "createTitle": "Utwórz token dostępu", - "editTitle": "Edytuj token dostępu", - "description": "Kliknij zapisz, gdy skończysz.", - "save": "Zapisz", - "saveChanges": "Zapisz zmiany" - }, - "deleteDialog": { - "title": "Usunąć token dostępu?", - "description": "Tej operacji nie można cofnąć. Każda aplikacja używająca tego tokena natychmiast utraci dostęp.", - "cancel": "Anuluj", - "confirm": "Usuń", - "deleting": "Usuwanie..." - }, - "form": { - "nameLabel": "Nazwa", - "namePlaceholder": "Nadaj temu tokenowi krótką nazwę", - "nameDescription": "Opcjonalnie · Maks. 32 znaki", - "expirationLabel": "Wygasa", - "expirationPlaceholder": "Wybierz czas wygaśnięcia", - "expirationDescription": "Tokeny wygasną automatycznie po wybranym czasie.", - "never": "Nigdy", - "1day": "1 dzień", - "7days": "7 dni", - "30days": "30 dni", - "errorMax": "Maksymalnie 32 znaki", - "errorNumber": "Musi być liczbą", - "errorInt": "Musi być liczbą całkowitą", - "errorPositive": "Musi być większe niż 0" - }, - "notifications": { - "createSuccess": "Token dostępu został utworzony", - "createSuccessDesc": "Token dostępu został pomyślnie utworzony.", - "updateSuccess": "Token dostępu został zaktualizowany", - "updateSuccessDesc": "Token dostępu został pomyślnie zaktualizowany.", - "createFailed": "Błąd tworzenia", - "updateFailed": "Błąd aktualizacji", - "deleteSuccess": "Token dostępu został pomyślnie usunięty", - "deleteFailed": "Nie udało się usunąć tokena dostępu", - "copied": "Skopiowano do schowka", - "genericError": "Operacja nie powiodła się. Spróbuj ponownie.", - "close": "Zamknij", - "tryAgain": "Spróbuj ponownie" - } + "unknownError": "Wystąpił nieznany błąd.", + "updateFailed": "Błąd aktualizacji", + "updateHere": "Aktualizuj to.", + "updateOrCreationFailed": "Nie udałoło się {{action}}, spróbuj później", + "updated": "Zaktualizowano", + "useProxyOptional": "Użyj Proxy (opcjonalnie):", + "useSocks5ProxyForOAuthRequests": "Użyj serwera proxy SOCKS5 dla żądań OAuth, gdy bezpośredni dostęp jest zablokowany.", + "value": "Wartość:", + "valueCannotBeEmpty": "Wartość nie może być pusta", + "valueIsRequired": "Wartość jest wymagana", + "warning": "Ostrzeżenie!", + "whenDisabled": "Kiedy wyłączone: Nowe przepływy autoryzacji zostaną natychmiast odrzucone - Istniejące tokeny dostępu i tokeny odświeżania zostaną unieważnione w ciągu 1 minutyi. Użytkownicy muszą ponownie dokonać autoryzacji po ponownym włączeniu", + "yourOAuth2ApplicationHasBeenSuccessfully": "Twoja aplikacja OAuth2 została {{action}}.", + "yourOAuth2ApplicationHasBeenSuccessfullyDeleted": "Twoja aplikacja OAuth2 została pomyślnie usunięta" }, "permission": { - "scope": { - "global": "Globalne", - "account": "Konto #{{id}}" - }, - "dialog": { - "global_title": "Uprawnienia globalne", - "account_title": "Uprawnienia konta", - "global_description": "Uprawnienia systemowe przyznane temu użytkownikowi.", - "account_description": "Uprawnienia ograniczone do wybranego konta." - }, - "category": { - "system_identity": "System i tożsamość", - "global_data": "Dane globalne (Administrator)", - "account": "Uprawnienia konta" - }, - "system": { - "access": "Podstawowy dostęp do systemu", - "root": "Pełna kontrola systemu" - }, - "user": { - "manage": "Zarządzanie wszystkimi użytkownikami", - "view": "Wyświetlanie podstawowych nazw użytkowników" - }, - "token": { - "manage": "Zarządzanie tokenami dostępu" - }, "account": { "create": "Tworzenie kont e-mail", "manage": "Zarządzanie przypisanymi kontami", "manage_all": "Zarządzanie wszystkimi konfiguracjami kont", "read_details": "Wyświetlanie szczegółów konta" }, + "category": { + "account": "Uprawnienia konta", + "global_data": "Dane globalne (Administrator)", + "system_identity": "System i tożsamość" + }, "data": { - "read": "Odczyt przypisanych danych e-mail", - "read_all": "Odczyt wszystkich danych e-mail", - "manage": "Zarządzanie przypisanymi metadanymi e-mail", - "manage_all": "Zarządzanie wszystkimi metadanymi e-mail", - "raw_download": "Pobieranie przypisanych surowych wiadomości e-mail", - "raw_download_all": "Pobieranie wszystkich surowych wiadomości e-mail", "delete": "Usuwanie przypisanych wiadomości e-mail", "delete_all": "Usuwanie wiadomości e-mail ze wszystkich kont", "export_batch": "Eksport zbiorczy przypisanych danych", "export_batch_all": "Eksport zbiorczy wszystkich danych", "import_batch": "Import zbiorczy danych e-mail", + "manage": "Zarządzanie przypisanymi metadanymi e-mail", + "manage_all": "Zarządzanie wszystkimi metadanymi e-mail", + "raw_download": "Pobieranie przypisanych surowych wiadomości e-mail", + "raw_download_all": "Pobieranie wszystkich surowych wiadomości e-mail", + "read": "Odczyt przypisanych danych e-mail", + "read_all": "Odczyt wszystkich danych e-mail", "smtp_ingest": "Pobieranie wiadomości e-mail za pośrednictwem protokołu SMTP" - } - }, - "users": { - "columns": { - "id": "ID", - "avatar": "Awatar", - "username": "Nazwa użytkownika", - "email": "Adres e-mail", - "roles": "Role i uprawnienia", - "created_at": "Utworzono", - "updated_at": "Zaktualizowano", - "actions": "Akcje" }, - "buttons": { - "add": "Dodaj użytkownika", - "add_new": "Nowy użytkownik" + "dialog": { + "account_description": "Uprawnienia ograniczone do wybranego konta.", + "account_title": "Uprawnienia konta", + "global_description": "Uprawnienia systemowe przyznane temu użytkownikowi.", + "global_title": "Uprawnienia globalne" }, - "empty": { - "title": "Nie znaleziono użytkowników", - "description": "Kliknij przycisk poniżej, aby dodać pierwszego użytkownika." + "scope": { + "account": "Konto #{{id}}", + "global": "Globalne" }, - "nav": { - "users": "Użytkownicy", - "roles": "Role", - "api_tokens": "Tokeny API" + "system": { + "access": "Podstawowy dostęp do systemu", + "root": "Pełna kontrola systemu" }, - "api_tokens": { - "empty": { - "title": "Nie znaleziono tokenów API", - "description": "W systemie nie wygenerowano jeszcze żadnych tokenów API." - }, - "button": { - "generate": "Generuj nowy token" - }, - "toolbar": { - "search_placeholder": "Szukaj po nazwie, właścicielu lub tokenie..." - }, - "table": { - "name": "Nazwa", - "type": "Typ", - "last_used": "Ostatnio użyty", - "expires_at": "Wygasa", - "owner": "Właściciel", - "created": "Utworzono", - "api_key": "Klucz API", - "web_ui": "Interfejs Web", - "never": "Nigdy", - "permanent": "Stały", - "expired": "Wygasł", - "unnamed": "Token bez nazwy" - }, - "unnamed": "Token bez nazwy", - "delete": { - "title": "Usuń token API", - "desc": "Zamierzasz trwale usunąć ten token API", - "prefix": "Prefiks tokena", - "irreversible": "Tej operacji nie można cofnąć. Wszystkie aplikacje korzystające z tego tokena natychmiast stracą dostęp.", - "confirm_label": "Aby potwierdzić, wpisz {{word}} poniżej:", - "confirm_placeholder": "Wpisz \"{{word}}\", aby potwierdzić", - "warning_title": "Ostrzeżenie", - "warning_desc": "Skrypty lub usługi korzystające z tego tokena przestaną działać. Upewnij się, że zaktualizowałeś swoje systemy.", - "confirm_button": "Usuń token", - "deleting": "Usuwanie..." - }, - "toast": { - "deleted_title": "Token API usunięty", - "deleted_desc": "Token \"{{name}}\" został pomyślnie usunięty.", - "delete_failed_title": "Błąd usuwania", - "delete_failed": "Nie udało się usunąć tokena, spróbuj ponownie." - } + "token": { + "manage": "Zarządzanie tokenami dostępu" }, - "tokens": { - "schema": { - "name_max": "Maks. 32 znaki", - "expire_number": "Musi być liczbą", - "expire_int": "Musi być liczbą całkowitą", - "expire_positive": "Musi być większa niż 0" - }, - "toast": { - "update_success_title": "Token zaktualizowany", - "update_success_desc": "Token dostępu został pomyślnie zaktualizowany.", - "create_success_title": "Token utworzony", - "create_success_desc": "Token dostępu został pomyślnie utworzony.", - "update_failed_title": "Błąd aktualizacji", - "create_failed_title": "Błąd tworzenia" - }, - "error": { - "fallback": "Operacja nie powiodła się, spróbuj ponownie później." - }, - "dialog": { - "edit_title": "Edytuj token dostępu", - "create_title": "Utwórz token dostępu", - "description": "Kliknij zapisz po zakończeniu." - }, - "fields": { - "name_label": "Nazwa", - "name_placeholder": "Nadaj krótką nazwę tokenowi", - "name_hint": "Opcjonalnie · Maks. 32 znaki", - "expire_label": "Wygasanie", - "expire_placeholder": "Wybierz czas", - "expire_hint": "Token wygaśnie automatycznie po wybranym czasie." - }, - "expire_options": { - "never": "Nigdy nie wygasa", - "1_day": "1 dzień", - "7_days": "7 dni", - "30_days": "30 dni" - } - }, - "tokens_action": { - "dialog": { - "title": "Tokeny API", - "description": "Zarządzaj tokenami API tego użytkownika." - }, - "empty": { - "title": "Brak tokenów API", - "description": "Ten użytkownik nie posiada obecnie żadnych tokenów API." - }, - "buttons": { - "add": "Dodaj token" - }, - "list": { - "unnamed_token": "Token bez nazwy", - "status_expired": "Wygasł", - "status_active": "Aktywny", - "expires_on_brief": "Wygasa {{date}}", - "never_expires": "Nigdy nie wygasa", - "label_token": "Token", - "label_created": "Utworzono", - "label_last_used": "Użyto", - "label_expires_at": "Wygasa", - "never": "Nigdy", - "button_delete": "Usuń token" - }, - "delete_dialog": { - "title": "Usunąć token dostępu?", - "description": "Tej operacji nie można cofnąć." - } - }, - "actions": { - "schema": { - "account_required": "Wybierz konto", - "role_required": "Wybierz rolę", - "username_required": "Nazwa użytkownika jest wymagana", - "username_min": "Min. 3 znaków", - "username_max": "Maks. 32 znaki", - "email_required": "E-mail jest wymagany", - "email_invalid": "Wprowadź poprawny adres e-mail", - "global_role_required": "Przypisz co najmniej jedną rolę globalną", - "description_max": "Opis maks. 256 znaków", - "ip_invalid": "Wykryto niepoprawny adres IP", - "password_required": "Hasło jest wymagane", - "password_min": "Min. 8 znaków", - "password_max": "Maks. 256 znaki" - }, - "toast": { - "updated": "Użytkownik zaktualizowany", - "created": "Użytkownik utworzony" - }, - "dialog": { - "edit_title": "Edytuj użytkownika: {{name}}", - "create_title": "Utwórz nowego użytkownika", - "subtitle": "Konfiguruj tożsamość, poziomy dostępu i polityki." - }, - "tabs": { - "general": "Ogólne", - "permissions": "Uprawnienia konta", - "security": "Bezpieczeństwo i ACL" - }, - "sections": { - "basic": "Dane podstawowe", - "global": "Uprawnienia globalne", - "mail_access": "Dostęp do poczty", - "mail_access_subtitle": "Konta e-mail, którymi ten użytkownik może zarządzać.", - "policy": "Polityki" - }, - "fields": { - "username": "Nazwa użytkownika", - "username_hint": "Unikalny identyfikator do logowania.", - "email": "Adres e-mail", - "email_hint": "Główny kontakt i powiadomienia.", - "password": "Hasło", - "password_placeholder_create": "Min. 8 znaków", - "password_placeholder_edit": "Zostaw puste, by zachować obecne", - "password_hint_create": "Bezpieczne hasło dla nowego użytkownika.", - "password_hint_edit": "Wpisz tylko, jeśli chcesz zmienić hasło.", - "global_roles_hint": "Przypisz uprawnienia systemowe.", - "description": "Opis (opcjonalnie)", - "description_placeholder": "Notatki o użytkowniku...", - "description_hint": "Notatki wewnętrzne (maks. 256 znaków).", - "select_account": "Wybierz konto", - "assign_role": "Przypisz rolę", - "ip_whitelist": "Biała lista IP", - "ip_whitelist_hint": "Ogranicz logowanie do tych IP (jedno na linię).", - "rate_quota": "Limit częstotliwości", - "burst_interval": "Interwał serii (sek)" - }, - "buttons": { - "add_account": "Dodaj konto", - "update": "Aktualizuj użytkownika", - "create": "Utwórz użytkownika" - }, - "states": { - "full_access": "Tryb pełnego dostępu", - "full_access_desc": "Administratorzy mają wgląd we wszystkie konta.", - "no_accounts": "Brak przypisanych kont.", - "security_disabled": "Polityki bezpieczeństwa są wyłączone." - }, - "api_tokens": "Tokeny API", - "placeholder": { - "filter": "Szukaj użytkowników..." - }, - "delete": { - "title": "Usuń użytkownika", - "confirm_msg": "Trwale usuwasz użytkownika {{name}} (ID: {{id}}).", - "irreversible": "Tej operacji nie można cofnąć.", - "input_label": "Wpisz ID użytkownika, aby potwierdzić:", - "placeholder": "Wpisz \"{{id}}\"", - "alert_title": "Uwaga: Operacja trwała.", - "alert_desc": "Użytkownik i wszystkie jego dane zostaną skasowane.", - "button_confirm": "Usuń użytkownika", - "button_deleting": "Usuwanie...", - "toast": { - "success_title": "Użytkownik usunięty", - "success_desc": "Użytkownik \"{{name}}\" został usunięty.", - "failed_title": "Błąd usuwania", - "failed_fallback": "Nie udało się usunąć użytkownika." - } - } - } - }, - "roles": { - "title": { - "create": "Utwórz nową rolę", - "edit": "Edytuj rolę: {{name}}" - }, - "description_hint": "Zdefiniuj zakres dostępu i uprawnienia.", - "form": { - "name_label": "Nazwa roli", - "type_label": "Typ roli", - "desc_label": "Opis", - "matrix_label": "Macierz uprawnień ({{type}})", - "builtin_badge": "Rola wbudowana", - "builtin_desc": "Ta rola jest predefiniowana i tylko do odczytu." - }, - "types": { - "Global": "Globalna", - "Account": "Konto" - }, - "categories": { - "identity": "Tożsamość i Zarządzanie", - "global_data": "Dostęp do danych globalnych", - "account_resource": "Zasoby konta" - }, - "actions": { - "cancel": "Anuluj", - "submit_create": "Utwórz rolę", - "submit_update": "Aktualizuj rolę", - "success_create": "Rola utworzona pomyślnie", - "success_update": "Rola zaktualizowana pomyślnie", - "failed": "Operacja nie powiodła się", - "close": "Zamknij", - "retry": "Ponów", - "add": "Dodaj rolę" - }, - "validation": { - "name_required": "Nazwa roli jest wymagana", - "perm_required": "Wybierz co najmniej jedno uprawnienie" - }, - "columns": { - "id": "ID", - "name": "Nazwa", - "role_type": "Typ", - "permissions": "Uprawnienia", - "created_at": "Utworzono", - "updated_at": "Zaktualizowano" - }, - "placeholder": { - "filter": "Szukaj ról..." - }, - "delete": { - "dialog_title": "Usuń rolę", - "warning_text": "Trwale usuwasz rolę {{name}} (ID: {{id}}).", - "irreversible": "Tej operacji nie można cofnąć.", - "confirm_label": "Wpisz ID roli, aby potwierdzić:", - "placeholder": "Wpisz \"{{id}}\"", - "alert_title": "Uwaga: Operacja trwała.", - "alert_desc": "Usunięcie tej roli spowoduje odebranie jej wszystkim przypisanym użytkownikom.", - "confirm_btn": "Usuń rolę", - "deleting": "Usuwanie...", - "success_title": "Rola usunięta", - "success_desc": "Rola \"{{name}}\" została usunięta.", - "error_title": "Błąd usuwania", - "error_fallback": "Nie udało się usunąć roli." - }, - "details": { - "title": "Uprawnienia: {{name}}", - "unknown": "Nieznana rola", - "role_badge": "Rola {{type}}", - "desc_global": "Zarządzanie globalne i dostęp systemowy.", - "desc_account": "Dostęp i operacje na danych dla pojedynczych kont.", - "close_btn": "Zamknij", - "view_permissions": "Zobacz szczegóły" - }, - "empty": { - "title": "Nie znaleziono ról", - "desc": "Nie utworzyłeś jeszcze żadnych własnych ról." + "user": { + "manage": "Zarządzanie wszystkimi użytkownikami", + "view": "Wyświetlanie podstawowych nazw użytkowników" } }, "profile": { @@ -1497,118 +820,811 @@ "sign_out": "Wyloguj się" } }, - "sign_out": { - "title": "Wyloguj się", - "desc": "Czy na pewno chcesz się wylogować? Aby uzyskać dostęp do konta, będziesz musiał zalogować się ponownie.", - "confirm": "Wyloguj się" + "proxyDelete": { + "close": "Zamknij", + "confirmText": "Czy na pewno chcesz usunąć?", + "deleteBtn": "Usuń", + "failedDesc": "Błąd podczas usuwania, spróbuj ponownie za jakiś czas.", + "failedTitle": "Błąd podczas usuwania proxy", + "permanent": "Ta czynność spowoduje trwałe usunięcie serwera proxy z systemu. Tej czynności nie można cofnąć.", + "proxyIdLabel": "Proxy Id:", + "proxyIdPlaceholder": "Wpisz Proxy Id aby potwierdzić usunięcie.", + "successDesc": "Proxy zostało usunięte.", + "successTitle": "Usunięto", + "title": "Usuń Proxy", + "tryAgain": "Spróbuj ponownie", + "warningDesc": "Należy zachować ostrożność, tej operacji nie można cofnąć", + "warningTitle": "Ostrzeżenie!" }, "restore_message": { - "title": "Przywróć pojedynczą wiadomość", + "accountsInvolved": "Zaangażowane konta", "bulkTitle": "Masowe przywracanie wiadomości", "bulkWarning": "Uwaga: Wiadomości zostaną przywrócone do ich oryginalnych folderów.", - "accountsInvolved": "Zaangażowane konta", - "summary": "Szczegóły przywracania", - "messages": "wiadomości", - "desc": "Ta operacja spowoduje ponowne przesłanie wybranych wiadomości z systemu Bichon i przywrócenie ich do odpowiednich skrzynek pocztowych na serwerze IMAP.", "confirm": "Wykonaj przywracanie", + "desc": "Ta operacja spowoduje ponowne przesłanie wybranych wiadomości z systemu Bichon i przywrócenie ich do odpowiednich skrzynek pocztowych na serwerze IMAP.", + "failed": "Przywracanie nie powiodło się", + "failedTitle": "Błąd przywracania", + "messages": "wiadomości", "restore_to_imap": "Przywróć wiadomość", "success": "Przywracanie zakończone sukcesem", "successDesc": "Wybrane wiadomości zostały pomyślnie przywrócone na serwer IMAP.", - "failed": "Przywracanie nie powiodło się", - "failedTitle": "Błąd przywracania" + "summary": "Szczegóły przywracania", + "title": "Przywróć pojedynczą wiadomość" }, - "time": { - "label": "Czas", - "since": "Od", - "before": "Przed", - "recent_range": "Ostatni zakres (od...)", - "historical": "Zakres historyczny (przed...)", - "absolute_range": "Bezwzględny zakres dat", - "last_day": "Ostatni 1 dzień", - "last_days": "Ostatnie {{count}} dni", - "last_months": "Ostatnie {{count}} miesiące", - "over_years_ago": "{{count}} {{unit}} temu", - "year": "rok", - "years": "lata", - "recent_prefix": "Ostatnio:", - "days_ago_to_now": "dni temu do teraz", - "apply": "Zastosuj", - "start_date": "Data rozpoczęcia", - "end_date": "Data zakończenia", - "clear_filters": "Wyczyść filtry czasu", - "format": "yyyy-MM-dd" + "roles": { + "actions": { + "add": "Dodaj rolę", + "cancel": "Anuluj", + "close": "Zamknij", + "failed": "Operacja nie powiodła się", + "retry": "Ponów", + "submit_create": "Utwórz rolę", + "submit_update": "Aktualizuj rolę", + "success_create": "Rola utworzona pomyślnie", + "success_update": "Rola zaktualizowana pomyślnie" + }, + "categories": { + "account_resource": "Zasoby konta", + "global_data": "Dostęp do danych globalnych", + "identity": "Tożsamość i Zarządzanie" + }, + "columns": { + "created_at": "Utworzono", + "id": "ID", + "name": "Nazwa", + "permissions": "Uprawnienia", + "role_type": "Typ", + "updated_at": "Zaktualizowano" + }, + "delete": { + "alert_desc": "Usunięcie tej roli spowoduje odebranie jej wszystkim przypisanym użytkownikom.", + "alert_title": "Uwaga: Operacja trwała.", + "confirm_btn": "Usuń rolę", + "confirm_label": "Wpisz ID roli, aby potwierdzić:", + "deleting": "Usuwanie...", + "dialog_title": "Usuń rolę", + "error_fallback": "Nie udało się usunąć roli.", + "error_title": "Błąd usuwania", + "irreversible": "Tej operacji nie można cofnąć.", + "placeholder": "Wpisz \"{{id}}\"", + "success_desc": "Rola \"{{name}}\" została usunięta.", + "success_title": "Rola usunięta", + "warning_text": "Trwale usuwasz rolę {{name}} (ID: {{id}})." + }, + "description_hint": "Zdefiniuj zakres dostępu i uprawnienia.", + "details": { + "close_btn": "Zamknij", + "desc_account": "Dostęp i operacje na danych dla pojedynczych kont.", + "desc_global": "Zarządzanie globalne i dostęp systemowy.", + "role_badge": "Rola {{type}}", + "title": "Uprawnienia: {{name}}", + "unknown": "Nieznana rola", + "view_permissions": "Zobacz szczegóły" + }, + "empty": { + "desc": "Nie utworzyłeś jeszcze żadnych własnych ról.", + "title": "Nie znaleziono ról" + }, + "form": { + "builtin_badge": "Rola wbudowana", + "builtin_desc": "Ta rola jest predefiniowana i tylko do odczytu.", + "desc_label": "Opis", + "matrix_label": "Macierz uprawnień ({{type}})", + "name_label": "Nazwa roli", + "type_label": "Typ roli" + }, + "placeholder": { + "filter": "Szukaj ról..." + }, + "title": { + "create": "Utwórz nową rolę", + "edit": "Edytuj rolę: {{name}}" + }, + "types": { + "Account": "Konto", + "Global": "Globalna" + }, + "validation": { + "name_required": "Nazwa roli jest wymagana", + "perm_required": "Wybierz co najmniej jedno uprawnienie" + } }, - "tag": { - "label": "Tagi", - "search_placeholder": "Szukaj tagów...", - "clear_all": "Wyczyść wszystkie tagi", - "no_tags_found": "Nie znaleziono tagów" + "search": { + "account": "Konto", + "addEmailAccount": "Dodaj konto email", + "addTags": { + "cancel": "Anuluj", + "createHint": "Utwórz nowy tag: {{tag}}", + "invalidTitle": "Niewłaściwy tag", + "none": "Nie dodano tagów", + "save": "Zapisz", + "saving": "Zapisywanie...", + "searchPlaceholder": "Wyszukaj lub utwórz tag...", + "selectedCount": "Wybrano {{count}} tagów", + "title": "Edytuj tagi", + "tryAgain": "Spróbuj ponownie poxniej", + "updateFailedTitle": "Błąd przy aktualizacji", + "updatedDesc": "Tagi zostały pomyślnie zaktualizowane", + "updatedTitle": "Tagi zaktualizowane" + }, + "adjustSearch": "Spróbuj zmienić kryteria wyszukiwania lub wyczyścić filtry.", + "advanced": "Zaawansowane", + "advancedFilters": "Zaawansowane filtry", + "any": "Dowolny", + "attachmentName": "Nazwa załącznika", + "attachmentsSize": "Załączniki & Rozmiar", + "bcc": "UDW", + "before": "Przed:", + "bulkActions": { + "ariaLabel": "Wybrano {{count}} wiadomości. Pasek działań", + "clear": "Wyczyść zaznaczenie", + "delete": "Usuń", + "deleteDesc": "Usuń wybrane wiadomości", + "manageTags": "Zarządzaj tagami", + "selected": "Wybrano {{count}}" + }, + "cc": "DW", + "clear": "Wyczyść", + "date": "Data", + "dateRange": "Zakres saty", + "delete": { + "confirmButton": "Usuń", + "confirmDetail": "Tej operacji nie można cofnąć.", + "confirmPrefix": "Czy na pewno chcesz usunąć", + "countLabel": "{{count}} wiadomości?", + "errorTitle": "Błąd usuwania", + "successDesc": "Wiadomości zostały pomyślnie usunięte.", + "successTitle": "Usunięto", + "title": "Usuń wiadomości", + "warningDesc": "Wiadomości zostaną trwale usunięte.", + "warningTitle": "Ostrzeżenie" + }, + "editTag": "Edytuj tagi", + "endDate": "Data do", + "from": "Od", + "fullTextMultiAccount": "Full-text · Wiele-kont · Filtry zaawansowane", + "hasAttachment": "Posiada załącznik", + "huge": "Bardzo duży (≥20 MB)", + "keyword": "Słowa kluczowe", + "large": "Duży (10 - 20 MB)", + "mailbox": "Skrzynka pocztowa", + "maxSize": "Rozmiar maksymalny", + "maximumBytes": "Maksimum", + "medium": "Średni (2 - 10 MB)", + "messageId": "ID wiadomości", + "minSize": "Rozmiar minimalny", + "minimumBytes": "Minimum", + "no": "Nie", + "noActiveEmailAccount": "Brak aktywnego konta email.", + "noEmailsFound": "Nie znaleziono wiadomości", + "noMailboxSelectAccount": "Brak skrzynki pocztowej. Pierw wybierz konto.", + "originalMessageIdHeader": "Oryginalny nagłówek Message-ID", + "pleaseSelectAtLeastOne": "Wybierz co najmniej jeden warunek wyszukiwania", + "preview": "Podgląd", + "recipient": "Odbiorca", + "searchArchivedEmails": "Wyszukaj w zarchiwizowanych wiadomościach", + "searchButton": "Szukanie", + "searchInSubjectBody": "Szukanie w tytułach, treści, załącznikach...", + "searching": "Wyszukiwanie, proszę czekać...", + "searchingButton": "Wyszukiwanie...", + "selectAccount": "Zaznacz konto", + "selectDate": "Wybierz datę", + "selectMailbox": "Zaznacz skrzynkę pocztową", + "sender": "Nadawca", + "senderRecipients": "Nadawca / Odbiorcy", + "since": "Od:", + "size": "Rozmiar", + "sizeDescription": "Rozmiar odnosi się do całkowitego rozmiaru wiadomości e-mail, łącznie z załącznikami.", + "small": "Mały (<2 MB)", + "sort": "Sortuj", + "source": "Źródło", + "startDate": "Data od", + "startSearching": "Zacznij od wpisania słowa kluczowego, nadawcy lub skorzystania z zaawansowanych filtrów.", + "subject": "Temat", + "tagFilter": "Filtrowanie wg. tagów", + "thread": { + "empty": "Brak wiadomości w tym wątku", + "error": "Nie udało się załadować wątku", + "invalidDate": "Nieprawidłowa data", + "loadMore": "Załaduj więcej", + "loadingMore": "Ładowanie...", + "noSubject": "(brak tematu)", + "title": "Wątek · {{count}} wiadomości" + }, + "tiny": "Bardzo mały (<15 KB)", + "title": "Szukaj", + "to": "Do", + "updateTags": { + "actionAdd": "Dodaj", + "actionOverwrite": "Nadpisz", + "actionRemove": "Usuń", + "cancel": "Anuluj", + "createHint": "Naciśnij Enter, aby utworzyć nowy tag: \"{{tag}}\"", + "invalidTitle": "Nieprawidłowy tag", + "none": "Nie wybrano żadnych tagów", + "overwriteWarning": "Ostrzeżenie: to nadpisze wszystkie istniejące tagi w wybranych elementach.", + "savingAdd": "Dodawanie...", + "savingOverwrite": "Nadpisywanie...", + "savingRemove": "Usuwanie...", + "searchPlaceholder": "Szukaj lub utwórz nowy tag...", + "selectedCount": "Zostanie zastosowanych tagów: {{count}}", + "submitAdd": "Dodaj tagi", + "submitOverwrite": "Nadpisz tagi", + "submitRemove": "Usuń tagi", + "title": "Aktualizuj tagi", + "tryAgain": "Spróbuj ponownie później.", + "updateFailedTitle": "Aktualizacja nie powiodła się", + "updatedDesc": "Tagi zostały pomyślnie zaktualizowane.", + "updatedTitle": "Tagi zaktualizowane" + }, + "yes": "Tak" }, "search_accounts": { - "label": "Konta e-mail", - "search_placeholder": "Szukaj kont e-mail...", "clear_accounts": "Wyczyść wybrane konta", - "no_accounts_found": "Nie znaleziono kont" - }, - "search_mailbox": { - "label": "Skrzynki pocztowe", - "search_placeholder": "Szukaj skrzynek", - "clear_mailboxes": "Wyczyść wybrane foldery", - "select_account_first": "Najpierw wybierz konto e-mail", - "no_mailbox_found": "Nie znaleziono folderu" + "label": "Konta e-mail", + "no_accounts_found": "Nie znaleziono kont", + "search_placeholder": "Szukaj kont e-mail..." }, "search_contacts": { + "any": "Dowolne", "label": "Kontakty", "label_with_count": "Kontakty ({{count}})", - "any": "Dowolne", - "search_placeholder": "Szukaj {{field}}...", - "reset_all": "Zresetuj wszystkie kontakty", - "no_contact_found": "Nie znaleziono kontaktów", "loading": "Ładowanie...", + "no_contact_found": "Nie znaleziono kontaktów", + "reset_all": "Zresetuj wszystkie kontakty", + "search_placeholder": "Szukaj {{field}}...", "showing_limit": "Wyświetlane tylko pierwsze 100 wyników • Łącznie {{total}}" }, + "search_input": { + "all": "Wszystkie", + "all_fields_desc": "Dopasowuje temat, treść, nadawcę i odbiorców", + "body": "Treść", + "button": "Szukaj", + "clear_history": "Wyczyść historię", + "no_history": "Brak historii wyszukiwania", + "placeholder": "Wyszukaj e-maile (użyj \" \" do wyszukiwania fraz)", + "recent_title": "Ostatnie wyszukiwania", + "subject": "Temat" + }, + "search_mailbox": { + "clear_mailboxes": "Wyczyść wybrane foldery", + "label": "Skrzynki pocztowe", + "no_mailbox_found": "Nie znaleziono folderu", + "search_placeholder": "Szukaj skrzynek", + "select_account_first": "Najpierw wybierz konto e-mail" + }, "search_more": { - "trigger_label": "Zaawansowane", - "title": "Filtry zaawansowane", - "reset": "Resetuj", - "has_attachment": "Zawiera załącznik", + "any": "Dowolne", + "apply": "Zastosuj filtry", "attachment_name_label": "Nazwa załącznika", "attachment_name_placeholder": "Np.: invoice.pdf", - "message_size_label": "Rozmiar wiadomości", - "message_id_label": "Oryginalny Message-ID", + "category": "Kategoria załącznika", + "content_type": "Typ pliku", + "extension": "Rozszerzenie pliku", + "has_attachment": "Zawiera załącznik", + "is_message": "Załącznik w formacie e-mail", + "is_message_desc": "Ten załącznik jest plikiem poczty, np. plikiem .eml.", "message_id_description": "Wyszukiwanie według nagłówka Message-ID", - "apply": "Zastosuj filtry", + "message_id_label": "Oryginalny Message-ID", + "message_size_label": "Rozmiar wiadomości", + "reset": "Resetuj", + "search_placeholder": "Szukaj {{field}}...", "size_presets": { "any": "Dowolny rozmiar", - "tiny": "Bardzo mały (< 15 KB)", - "small": "Mały (< 2 MB)", - "medium": "Średni (2 – 10 MB)", + "huge": "Bardzo duży (> 20 MB)", "large": "Duży (10 – 20 MB)", - "huge": "Bardzo duży (> 20 MB)" + "medium": "Średni (2 – 10 MB)", + "small": "Mały (< 2 MB)", + "tiny": "Bardzo mały (< 15 KB)" }, - "any": "Dowolne", - "search_placeholder": "Szukaj {{field}}...", - "extension": "Rozszerzenie pliku", - "category": "Kategoria załącznika", - "content_types": "Konkretny typ" - }, - "search_view": { - "button_label": "Widok", - "menu_title": "Ustawienia kolumn" + "title": "Filtry zaawansowane", + "trigger_label": "Zaawansowane" }, "search_reset": { "label": "Reset", "tooltip": "Wyczyść wszystkie filtry" }, - "search_input": { - "placeholder": "Szukaj wiadomości... (Obsługuje Regex)", - "button": "Szukaj", - "recent_title": "Ostatnie wyszukiwania", - "clear_history": "Wyczyść historię", - "no_history": "Brak historii wyszukiwania", - "all": "Wszystkie", - "all_fields_desc": "Dopasowuje temat, treść, nadawcę i odbiorców", - "subject": "Temat", - "body": "Treść" + "search_view": { + "button_label": "Widok", + "menu_title": "Ustawienia kolumn" + }, + "settings": { + "accounts": "Konta", + "acl": "ACL", + "actions": "Akcje", + "add": "Dodaj", + "addNewProxyHere": "Dodaj nowe Proxy tutaj. ", + "adding": "Dodawanie...", + "appearance": { + "button": { + "update": "Aktualizuj preferencje" + }, + "command": { + "no_results": "Nie znaleziono języka.", + "search": "Szukaj języka..." + }, + "description": { + "language": "Wybierz język interfejsu webowego.", + "theme": "Wybierz tryb jasny lub ciemny." + }, + "field": { + "language": "Język interfejsu", + "theme": "Motyw interfejsu" + }, + "placeholder": { + "select_language": "Wybierz język" + }, + "theme": { + "dark": "Ciemny", + "light": "Jasny" + }, + "title": "Wygląd", + "validation": { + "language": { + "required": "Proszę wybrać język." + }, + "theme": { + "required": "Proszę wybrać motyw." + } + } + }, + "authUrl": "Auth URL", + "changePasswordForFutureLogins": "Zmień hasło dla przyszłych logowań", + "confirmReset": "Potwierdź reset", + "createdAt": "Utworzono o", + "delete": "Usuń", + "description": "Opis", + "edit": "Edytuj", + "enabled": "Włączone", + "enterNewRootPassword": "Wprowadź nowe hasło dla roota", + "enterProxyIdToConfirmDeletion": "Wpisz nazwę proxy, aby potwierdzić usunięcie.", + "failedToCopyText": "Błąd podczas kopiowania tekstu", + "filterAccessToken": "Filtr tokenów...", + "filterAccount": "Filtr konta...", + "filterOauth2": "Filtr oauth2...", + "filterProxy": "Filtr Proxy...", + "general": "Ogólne", + "generateNewToken": "Wygeneruj nowy token, stary wygaśnie natychmiast.", + "host": "Host", + "id": "Id", + "invalidPassword": "Błędne hasło", + "lastAccess": "Ostatni dostęp", + "manageRootTokenAndPassword": "Zarządzaj tokenem głównym i hasłem w sposób bezpieczny", + "name": "Nazwa", + "noProxies": "Brak Proxy", + "noProxiesDesc": "Nie dodano jeszcze żadnych konfiguracji proxy. Dodaj jedną, aby zacząć korzystać z funkcji proxy.", + "password": "Hasło", + "pleaseUseAnIpAddressForBetterReliability": "Aby zapewnić większą niezawodność, użyj adresu IP (np. 127.0.0.1), a nie nazwy hosta lub domeny.", + "port": "Port", + "profile": { + "account": { + "id": "ID konta: {{id}}" + }, + "avatarAlt": "Awatar", + "button": { + "permissions": "Uprawnienia", + "update_profile": "Zaktualizuj profil", + "view_global_permissions": "Zobacz globalne uprawnienia" + }, + "field": { + "email": "E-mail", + "password": "Hasło", + "username": "Nazwa użytkownika" + }, + "loadError": "Nie udało się załadować informacji o użytkowniku.", + "maxSize": "Do {{size}}", + "placeholder": { + "password_keep": "Pozostaw puste, aby zachować obecne hasło" + }, + "removeAvatar": "Usuń awatar", + "section": { + "accounts": "Połączone konta: {{count}}", + "roles": "Role" + }, + "toast": { + "update_failed": "Nie udało się zaktualizować profilu", + "updated": "Profil został zaktualizowany" + }, + "uploadError": "Błąd przesyłania pliku", + "uploadTitle": "Prześlij awatar", + "validation": { + "email": { + "invalid": "Wprowadź poprawny adres e-mail", + "required": "Adres e-mail jest wymagany" + }, + "password": { + "max": "Hasło może mieć maksymalnie 256 znaki", + "min": "Hasło musi mieć co najmniej 8 znaków" + }, + "username": { + "max": "Nazwa użytkownika może mieć maksymalnie 32 znaki", + "min": "Nazwa użytkownika musi mieć co najmniej 5 znaków", + "required": "Nazwa użytkownika jest wymagana" + } + } + }, + "proxy": "Proxy", + "proxyUpdateOrAddFailed": "Błąd {{action}}, spróbuj później", + "reset": "Reset", + "resetRootPassword": "Resetuj hasło root", + "resetRootToken": "Resetuj Root Token", + "root": "Root", + "rootAccessManagement": "Zarządzanie dostępem", + "rootDesc": "Zarządzaj danymi uwierzytelniającymi dostępu root, w tym tokenem i hasłem", + "rootPasswordMustBeAtLeast6Characters": "Hasło dla roota musi mieć co najmniej 6 znaków", + "rootTitle": "Root", + "selectAll": "Zaznacz wszystko", + "sidebar": { + "apiTokens": "Tokeny API", + "configurations": "Konfiguracja systemu", + "profile": "Profil", + "proxy": "Proxy sieciowe" + }, + "theRootPasswordHasBeenReset": "Hasło roota zostało zresetowane", + "theRootTokenHasBeenReset": "Token główny został zresetowany", + "theme": "Motyw", + "title": "Ustawienia", + "token": "Token", + "tokenUrl": "Token URL", + "type": "Typ", + "updateTheProxyHere": "Uaktualnij Proxy tutaj. ", + "updatedAt": "Zaktualizowano o", + "url": "URL", + "useNewPasswordForNextLogin": "Użyj nowego hasła przy następnym logowaniu", + "useProxy": "Użyj Proxy", + "username": "Login", + "youAreAboutToResetTheRootPassword": "Zamierzasz zresetować hasło roota. Przechowuj je bezpiecznie.", + "youAreAboutToResetTheRootToken": "Zamierzasz zresetować token główny. Tej czynności nie można cofnąć", + "yourLoginInformationHasBeenUpdated": "Twoje dane logowania zostały zaktualizowane. Nie musisz się logować ponownie.", + "yourProxyHasBeenSuccessfully": "Proxy zostało {{action}}." + }, + "sign_out": { + "confirm": "Wyloguj się", + "desc": "Czy na pewno chcesz się wylogować? Aby uzyskać dostęp do konta, będziesz musiał zalogować się ponownie.", + "title": "Wyloguj się" + }, + "systemConfig": { + "pageDescription": "Parametry te są inicjowane za pomocą flag CLI lub zmiennych środowiskowych. Są one obecnie tylko do odczytu.", + "pageTitle": "Konfiguracje na poziomie systemu", + "sections": { + "cors": { + "desc": "Zasady dostępu cross-origin", + "title": "CORS" + }, + "logging": { + "desc": "Zachowanie wyjściowe logów", + "title": "Logowanie" + }, + "network": { + "desc": "HTTP i dostęp publiczny", + "title": "Sieć" + }, + "performance": { + "desc": "Współbieżność i kompresja", + "title": "Wydajność" + }, + "security": { + "desc": "Uwierzytelnianie i szyfrowanie", + "title": "Bezpieczeństwo" + }, + "smtp": { + "desc": "Ustawienia odbierania poczty przychodzącej do archiwizacji w czasie rzeczywistym", + "title": "Serwer SMTP" + }, + "storage": { + "desc": "Ścieżki bazy danych i limity", + "title": "Pamięć i bufor" + } + }, + "status": { + "auto": "Auto", + "configured": "Skonfigurowane", + "disabled": "Wyłączone", + "enabled": "Włączone", + "missing": "Brak", + "notSet": "Nie ustawiono" + } + }, + "table": { + "asc": "Rosnąco", + "delete": "Usuń", + "desc": "Malejąco", + "edit": "Edytuj", + "hide": "Ukryj", + "loading": "Ładowanie...", + "noResults": "Brak wyników", + "of": "z", + "page": "Strona", + "pagination": { + "first": "Pierwsza strona", + "fixed_page_size": "{{size}} wierszy na stronę.", + "last": "Ostatnia strona", + "next": "Następna strona", + "page_info": "Strona {{page}} z {{total}}", + "previous": "Poprzednia strona", + "rows_per_page": "Wierszy na stronę", + "selected": "Wybrano {{selected}} z {{total}} wierszy." + }, + "results": "wyniki", + "rowsPerPage": "Wierszy na stronę", + "showing": "Pokazuj", + "to": "do" + }, + "tag": { + "clear_all": "Wyczyść wszystkie tagi", + "label": "Tagi", + "no_tags_found": "Nie znaleziono tagów", + "search_placeholder": "Szukaj tagów..." + }, + "time": { + "absolute_range": "Bezwzględny zakres dat", + "apply": "Zastosuj", + "before": "Przed", + "clear_filters": "Wyczyść filtry czasu", + "days_ago_to_now": "dni temu do teraz", + "end_date": "Data zakończenia", + "format": "yyyy-MM-dd", + "historical": "Zakres historyczny (przed...)", + "label": "Czas", + "last_day": "Ostatni 1 dzień", + "last_days": "Ostatnie {{count}} dni", + "last_months": "Ostatnie {{count}} miesiące", + "over_years_ago": "{{count}} {{unit}} temu", + "recent_prefix": "Ostatnio:", + "recent_range": "Ostatni zakres (od...)", + "since": "Od", + "start_date": "Data rozpoczęcia", + "year": "rok", + "years": "lata" + }, + "users": { + "actions": { + "api_tokens": "Tokeny API", + "buttons": { + "add_account": "Dodaj konto", + "create": "Utwórz użytkownika", + "update": "Aktualizuj użytkownika" + }, + "delete": { + "alert_desc": "Użytkownik i wszystkie jego dane zostaną skasowane.", + "alert_title": "Uwaga: Operacja trwała.", + "button_confirm": "Usuń użytkownika", + "button_deleting": "Usuwanie...", + "confirm_msg": "Trwale usuwasz użytkownika {{name}} (ID: {{id}}).", + "input_label": "Wpisz ID użytkownika, aby potwierdzić:", + "irreversible": "Tej operacji nie można cofnąć.", + "placeholder": "Wpisz \"{{id}}\"", + "title": "Usuń użytkownika", + "toast": { + "failed_fallback": "Nie udało się usunąć użytkownika.", + "failed_title": "Błąd usuwania", + "success_desc": "Użytkownik \"{{name}}\" został usunięty.", + "success_title": "Użytkownik usunięty" + } + }, + "dialog": { + "create_title": "Utwórz nowego użytkownika", + "edit_title": "Edytuj użytkownika: {{name}}", + "subtitle": "Konfiguruj tożsamość, poziomy dostępu i polityki." + }, + "fields": { + "assign_role": "Przypisz rolę", + "burst_interval": "Interwał serii (sek)", + "description": "Opis (opcjonalnie)", + "description_hint": "Notatki wewnętrzne (maks. 256 znaków).", + "description_placeholder": "Notatki o użytkowniku...", + "email": "Adres e-mail", + "email_hint": "Główny kontakt i powiadomienia.", + "global_roles_hint": "Przypisz uprawnienia systemowe.", + "ip_whitelist": "Biała lista IP", + "ip_whitelist_hint": "Ogranicz logowanie do tych IP (jedno na linię).", + "password": "Hasło", + "password_hint_create": "Bezpieczne hasło dla nowego użytkownika.", + "password_hint_edit": "Wpisz tylko, jeśli chcesz zmienić hasło.", + "password_placeholder_create": "Min. 8 znaków", + "password_placeholder_edit": "Zostaw puste, by zachować obecne", + "rate_quota": "Limit częstotliwości", + "select_account": "Wybierz konto", + "username": "Nazwa użytkownika", + "username_hint": "Unikalny identyfikator do logowania." + }, + "placeholder": { + "filter": "Szukaj użytkowników..." + }, + "schema": { + "account_required": "Wybierz konto", + "description_max": "Opis maks. 256 znaków", + "email_invalid": "Wprowadź poprawny adres e-mail", + "email_required": "E-mail jest wymagany", + "global_role_required": "Przypisz co najmniej jedną rolę globalną", + "ip_invalid": "Wykryto niepoprawny adres IP", + "password_max": "Maks. 256 znaki", + "password_min": "Min. 8 znaków", + "password_required": "Hasło jest wymagane", + "role_required": "Wybierz rolę", + "username_max": "Maks. 32 znaki", + "username_min": "Min. 3 znaków", + "username_required": "Nazwa użytkownika jest wymagana" + }, + "sections": { + "basic": "Dane podstawowe", + "global": "Uprawnienia globalne", + "mail_access": "Dostęp do poczty", + "mail_access_subtitle": "Konta e-mail, którymi ten użytkownik może zarządzać.", + "policy": "Polityki" + }, + "states": { + "full_access": "Tryb pełnego dostępu", + "full_access_desc": "Administratorzy mają wgląd we wszystkie konta.", + "no_accounts": "Brak przypisanych kont.", + "security_disabled": "Polityki bezpieczeństwa są wyłączone." + }, + "tabs": { + "general": "Ogólne", + "permissions": "Uprawnienia konta", + "security": "Bezpieczeństwo i ACL" + }, + "toast": { + "created": "Użytkownik utworzony", + "updated": "Użytkownik zaktualizowany" + } + }, + "api_tokens": { + "button": { + "generate": "Generuj nowy token" + }, + "delete": { + "confirm_button": "Usuń token", + "confirm_label": "Aby potwierdzić, wpisz {{word}} poniżej:", + "confirm_placeholder": "Wpisz \"{{word}}\", aby potwierdzić", + "deleting": "Usuwanie...", + "desc": "Zamierzasz trwale usunąć ten token API", + "irreversible": "Tej operacji nie można cofnąć. Wszystkie aplikacje korzystające z tego tokena natychmiast stracą dostęp.", + "prefix": "Prefiks tokena", + "title": "Usuń token API", + "warning_desc": "Skrypty lub usługi korzystające z tego tokena przestaną działać. Upewnij się, że zaktualizowałeś swoje systemy.", + "warning_title": "Ostrzeżenie" + }, + "empty": { + "description": "W systemie nie wygenerowano jeszcze żadnych tokenów API.", + "title": "Nie znaleziono tokenów API" + }, + "table": { + "api_key": "Klucz API", + "created": "Utworzono", + "expired": "Wygasł", + "expires_at": "Wygasa", + "last_used": "Ostatnio użyty", + "name": "Nazwa", + "never": "Nigdy", + "owner": "Właściciel", + "permanent": "Stały", + "type": "Typ", + "unnamed": "Token bez nazwy", + "web_ui": "Interfejs Web" + }, + "toast": { + "delete_failed": "Nie udało się usunąć tokena, spróbuj ponownie.", + "delete_failed_title": "Błąd usuwania", + "deleted_desc": "Token \"{{name}}\" został pomyślnie usunięty.", + "deleted_title": "Token API usunięty" + }, + "toolbar": { + "search_placeholder": "Szukaj po nazwie, właścicielu lub tokenie..." + }, + "unnamed": "Token bez nazwy" + }, + "buttons": { + "add": "Dodaj użytkownika", + "add_new": "Nowy użytkownik" + }, + "columns": { + "actions": "Akcje", + "avatar": "Awatar", + "created_at": "Utworzono", + "email": "Adres e-mail", + "id": "ID", + "roles": "Role i uprawnienia", + "updated_at": "Zaktualizowano", + "username": "Nazwa użytkownika" + }, + "empty": { + "description": "Kliknij przycisk poniżej, aby dodać pierwszego użytkownika.", + "title": "Nie znaleziono użytkowników" + }, + "nav": { + "api_tokens": "Tokeny API", + "roles": "Role", + "users": "Użytkownicy" + }, + "tokens": { + "dialog": { + "create_title": "Utwórz token dostępu", + "description": "Kliknij zapisz po zakończeniu.", + "edit_title": "Edytuj token dostępu" + }, + "error": { + "fallback": "Operacja nie powiodła się, spróbuj ponownie później." + }, + "expire_options": { + "1_day": "1 dzień", + "30_days": "30 dni", + "7_days": "7 dni", + "never": "Nigdy nie wygasa" + }, + "fields": { + "expire_hint": "Token wygaśnie automatycznie po wybranym czasie.", + "expire_label": "Wygasanie", + "expire_placeholder": "Wybierz czas", + "name_hint": "Opcjonalnie · Maks. 32 znaki", + "name_label": "Nazwa", + "name_placeholder": "Nadaj krótką nazwę tokenowi" + }, + "schema": { + "expire_int": "Musi być liczbą całkowitą", + "expire_number": "Musi być liczbą", + "expire_positive": "Musi być większa niż 0", + "name_max": "Maks. 32 znaki" + }, + "toast": { + "create_failed_title": "Błąd tworzenia", + "create_success_desc": "Token dostępu został pomyślnie utworzony.", + "create_success_title": "Token utworzony", + "update_failed_title": "Błąd aktualizacji", + "update_success_desc": "Token dostępu został pomyślnie zaktualizowany.", + "update_success_title": "Token zaktualizowany" + } + }, + "tokens_action": { + "buttons": { + "add": "Dodaj token" + }, + "delete_dialog": { + "description": "Tej operacji nie można cofnąć.", + "title": "Usunąć token dostępu?" + }, + "dialog": { + "description": "Zarządzaj tokenami API tego użytkownika.", + "title": "Tokeny API" + }, + "empty": { + "description": "Ten użytkownik nie posiada obecnie żadnych tokenów API.", + "title": "Brak tokenów API" + }, + "list": { + "button_delete": "Usuń token", + "expires_on_brief": "Wygasa {{date}}", + "label_created": "Utworzono", + "label_expires_at": "Wygasa", + "label_last_used": "Użyto", + "label_token": "Token", + "never": "Nigdy", + "never_expires": "Nigdy nie wygasa", + "status_active": "Aktywny", + "status_expired": "Wygasł", + "unnamed_token": "Token bez nazwy" + } + } + }, + "validation": { + "emailRequired": "Email jest wymagany", + "folderLimitMustBeAtLeast100": "Limit folderów musi być liczbą nie mniejszą niż 100", + "folderLimitMustBeNumber": "Limit folderów musi być liczbą", + "imapHostCannotBeEmpty": "Host IMAP nie może być pusty", + "imapHostRequired": "Host IMAP jest wymagany", + "imapPortMustBeLessThan65536": "Port IMAP musi być liczbą w przedziale 0-65535", + "imapPortMustBePositive": "Port IMAP musi być liczbą całkowitą dodatnią", + "incrementalSyncMustBeAtLeast10": "Przyrostowy interwał synchronizacji musi wynosić co najmniej 10 minut", + "incrementalSyncMustBeNumber": "Przyrostowy interwał synchronizacji musi być liczbą", + "invalidEmail": "Niewłaściwy adres email", + "invalidUrl": "Niewłaściwy URL", + "passwordMinLength": "Hasło musi posiadać conajmniej {{min}} znaków", + "passwordRequired": "Hasło jest wymagane, gdy metodą uwierzytelniania jest hasło", + "pleaseEnterPassword": "Proszę podać hasło", + "pleaseEnterUsernameOrEmail": "Proszę podać nazwę użytkownika lub adres e-mail", + "required": "To pole jest wymagane", + "singleRequestBatchSizeMustBeNumber": "Rozmiar partii musi być liczbą", + "singleRequestBatchSizeTooLarge": "Rozmiar partii może wynosić maksymalnie 200", + "singleRequestBatchSizeTooSmall": "Rozmiar partii musi wynosić co najmniej 10" } } \ No newline at end of file diff --git a/web/src/locales/pt.json b/web/src/locales/pt.json index fee8903..c51e74c 100644 --- a/web/src/locales/pt.json +++ b/web/src/locales/pt.json @@ -1,1614 +1,1630 @@ { - "common": { - "submit": "Enviar", + "accessTokens": { + "aListOfIpAddressesAllowed": "Uma lista de endereços IP permitidos para acessar os recursos. Um endereço IP por linha. (Opcional)", + "accountId": "ID da Conta", + "accounts": "Contas", + "aclRulesForAccessTokens": "As regras de ACL para Tokens de Acesso incluem validação de Lista Branca de IP e aplicação de Limite de Taxa.", + "actions": { + "delete": "Excluir", + "edit": "Editar", + "openMenu": "Abrir Menu" + }, + "addNew": "Adicionar Novo", + "atLeastOneAccountIsRequired": "Pelo menos uma conta é obrigatória.", + "create": "Criar", + "createNewAccessTokenHere": "Crie um novo Token de Acesso aqui.", + "created": "Criado", + "createdAt": "Criado Em", + "creating": "Criando...", + "creationFailed": "Falha na Criação", + "delete": "Excluir", + "describeThePurposeOfTheAccessToken": "Descreva o propósito do Token de Acesso", + "description": "Gerencie Tokens de Acesso, Regras de ACL, Lista Branca de IP e configurações de Limite de Taxa aqui.", + "descriptionMustNotExceed255Characters": "A descrição não pode exceder 255 caracteres.", + "edit": "Editar", + "editToken": "Editar Token", + "enterIntervalInSeconds": "Insira o Intervalo em Segundos. Ex: 60", + "enterOneIpAddressPerLine": "Insira um endereço IP por linha. Ex:\n192.168.1.1\n192.168.1.2", + "enterQuota": "Insira a Cota. Ex: 100", + "expiresAt": "Expira Em", + "filterByEmailAddressOrAccountId": "Filtrar por endereço de email ou ID da conta...", + "interval": "Intervalo", + "intervalMustBeAPositiveInteger": "O Intervalo deve ser um número inteiro positivo.", + "invalidIpAddressesFound": "Endereços IP inválidos encontrados. Por favor, insira endereços IPv4 ou IPv6 válidos.", + "name": "Nome", + "noTokens": "Nenhum Token de Acesso", + "noTokensDesc": "Você ainda não criou nenhum token de acesso. Crie um para utilizar a funcionalidade da API.", + "notUsedYet": "Ainda Não Usado", + "quota": "Cota", + "quotaMustBeAPositiveInteger": "A Cota deve ser um número inteiro positivo.", + "save": "Salvar", + "saveChanges": "Salvar Alterações", + "saving": "Salvando...", + "selectAccounts": "Selecionar Contas", + "selectMultipleAccountsForTheAccessToken": "Selecione várias contas que este Token de Acesso está autorizado a consultar.", + "theListOfAccountsThatCanBeQueried": "A lista de contas que podem ser consultadas usando o Token de Acesso.", + "theMaximumNumberOfRequestsAllowed": "O número máximo de solicitações permitidas dentro do intervalo. (Opcional)", + "theTimeWindowForTheRateLimit": "A janela de tempo (em segundos) para o limite de taxa. (Opcional)", + "title": "Tokens de Acesso", + "token": "Token", + "updateFailed": "Falha na Atualização", + "updateOrCreationFailed": "Falha ao {{action}}, por favor, tente novamente mais tarde", + "updateTheAccessTokenHere": "Atualize o Token de Acesso aqui.", + "updated": "Atualizado", + "updating": "Atualizando...", + "yourAccessTokenHasBeenSuccessfully": "Seu Token de Acesso foi {{action}} com sucesso." + }, + "accounts": { + "accessControl": "Controle de acesso", + "accessTokenCopiedToClipboard": "Token de acesso copiado para a área de transferência", + "access_control": { + "buttons": { "cancel": "Cancelar", - "save": "Salvar", - "save_changes": "Salvar alterações", - "delete": "Excluir", - "edit": "Editar", - "search": "Pesquisar", - "add": "Adicionar", - "remove": "Remover", - "create": "Criar", - "update": "Atualizar", - "confirm": "Confirmar", + "save": "Salvar Atribuição" + }, + "description": "Atribuir funções e usuários autorizados a {{email}}", + "role_label": "Função de Acesso", + "role_loading": "Carregando funções...", + "role_placeholder": "Selecionar uma função", + "title": "Atribuição de Acesso à Conta", + "toast": { + "failed_title": "Falha na Atribuição", + "success_desc": "As permissões foram atribuídas com sucesso a {{email}}", + "success_title": "Atribuição Concluída" + }, + "user_empty": "Nenhum usuário encontrado", + "user_label": "Selecionar Usuários Autorizados", + "user_search_placeholder": "Buscar por nome ou e-mail...", + "user_selected_count": "Selecionado(s): {{count}}", + "validation": { + "role_required": "Selecione uma função para atribuir", + "user_required": "Selecione pelo menos um usuário" + } + }, + "accountCreated": "Conta Criada", + "accountCreatedDesc": "A conta foi criada com sucesso.", + "accountCreationFailed": "Falha ao Criar Conta", + "accountDetails": "Detalhes da Conta", + "accountHasBeenSuccessfully": "A conta foi {{action}} com sucesso", + "accountSyncFoldersUpdateFailed": "Falha ao Atualizar Pastas de Sincronização da Conta", + "accountSyncFoldersUpdated": "Pastas de Sincronização da Conta Atualizadas", + "accountUpdateFailed": "Falha ao Atualizar Conta", + "accountUpdated": "Conta Atualizada", + "accountUpdatedDesc": "A conta foi atualizada com sucesso.", + "actions": "Ações", + "addAccount": "Adicionar Conta", + "addConfiguration": "Adicionar Configuração", + "addImap": "Adicionar Conta IMAP", + "addNewEmailAccountHere": "Adicione uma nova conta de email aqui.", + "addNoSync": "Adicionar Conta Sem Sincronização", + "allMailFolderSelected": "Atenção: A pasta 'Todos os Emails' está selecionada", + "allMailFolderSelectedDesc": "Selecionar uma pasta com o atributo 'Todos os Emails' pode duplicar mensagens já sincronizadas de pastas como Caixa de Entrada ou Itens Enviados. Isso pode consumir significativamente o seu armazenamento.", + "allMailSkipped": "Pastas padrão selecionadas. 'Todos os Emails' foi ignorado para evitar duplicação.", + "areYouSureYouWantTo": "Tem certeza de que deseja {{action}} esta conta?", + "auth": "Autenticação", + "authType": "Tipo de Autenticação", + "autoConfiguring": "Configurando Automaticamente...", + "beforeRelative": "Baixar apenas e-mails antigos", + "beforeRelativeValue": "Baixar e-mails de {{value}} {{unit}} atrás", + "capabilities": "Capacidades", + "chooseAuthMethod": "Por favor, escolha o método de autenticação para IMAP.", + "chooseEncryptionMethod": "Por favor, escolha o método de criptografia para IMAP.", + "chooseMailboxesToDownload": "Escolha as caixas de correio para baixar para {{email}}. Novas caixas serão baixadas no próximo ciclo.", + "clickHere": "Clique Aqui", + "clickSaveWhenDone": "Clique em 'Salvar' quando terminar.", + "continue": "Continuar", + "createdAt": "Criado Em", + "creationFailed": "Falha na criação, por favor, tente novamente mais tarde.", + "dateSelection": "Seleção de Data", + "dateSince": "Data de Início da Sincronização", + "days": "Dias", + "delete": "Excluir", + "description": "Gerencie e configure suas contas de email.", + "detail": "Detalhe", + "detailsOfTheOAuth2TokensForTheAccount": "Detalhes dos Tokens OAuth2 para esta conta.", + "determinesWhetherThisAccountIsActiveNoSync": "Determina se esta conta está ativa. Se estiver desativada, não será possível importar dados.", + "disable": "Desativar", + "disableAccount": "Desativar conta", + "disabled": "Desativado", + "downloadAll": "Baixar todos os e-mails", + "downloadBatchSize": "Tamanho do lote de download", + "downloadBatchSizeDescription": "Número de mensagens recuperadas por solicitação IMAP", + "downloadInterval": "Intervalo de download (minutos)", + "downloadIntervalPlaceholder": "Insira os minutos", + "downloadScope": "Estratégia de download", + "downloadScopeDescription": "Escolha quais e-mails devem ser indexados e baixados.", + "duration": "Duração", + "edit": "Editar", + "email": "Email", + "emailAccountRegistration": "Registro de Conta de Email", + "emailAccountRegistrationDesc": "Insira o seu endereço de e-mail. Nos próximos passos, irá configurar os detalhes de IMAP. Usaremos este endereço para detectar automaticamente as configurações do servidor IMAP.", + "emailAddress": "Endereço de Email", + "emailCannotBeModified": "O endereço de email da conta não pode ser modificado ao editar.", + "emailPlaceholder": "Ex: john.doe@example.com", + "enable": "Ativar", + "enableAccount": "Ativar conta", + "enabled": "Ativo", + "enabledDescription": "Determina se esta conta está ativa. Se desativada, os downloads relacionados não serão executados.", + "encryption": "Criptografia", + "enterPassword": "Insira a senha", + "enterValue": "Insira o Valor", + "everyMinutes": "A cada {{minutes}} minutos", + "field": "Campo", + "fixed": "Fixo", + "folderLimit": "Limite de Pasta", + "folderLimitDescription": "Limita o número de emails a sincronizar por pasta (mínimo 100). Deixe vazio para nenhum limite.", + "folderLimitPlaceholder": "Ex: 1000", + "folderSync": { + "autoSelectDescendants": "Selecionar automaticamente os descendentes", + "autoSelectParents": "Selecionar automaticamente os pais", + "batches": "Lotes", + "collapseAll": "Recolher tudo", + "expandAll": "Expandir tudo", + "loadingMailboxFolders": "Carregando pastas da caixa de correio…", + "noData": "Sem Dados", + "noFolders": "Nenhuma pasta para sincronizar" + }, + "foldersConfiguredForSync": "Pastas Configuradas para Sincronização: {{count}}", + "foldersSelected": "Pastas Selecionadas: {{count}}", + "goBack": "Voltar", + "host": "Host", + "id": "ID", + "imap": "IMAP", + "imapAuthMethod": "Método de Autenticação IMAP", + "imapEncryption": "Criptografia IMAP", + "imapHost": "Host IMAP", + "imapHostPlaceholder": "Ex: imap.example.com", + "imapPassword": "Senha IMAP", + "imapPort": "Porta IMAP", + "imapPortPlaceholder": "Ex: 993", + "imapProxy": "Usar proxy SOCKS5 para conexão IMAP.", + "incSync": "Sincronização Incremental", + "lastSync": "Última Sincronização", + "leaveEmptyToKeepExisting": "Deixe vazio para manter a senha existente. Insira a nova senha apenas se estiver atualizando.", + "leaveEmptyToKeepPassword": "Deixe vazio para manter a senha atual", + "login_name": "Nome de login", + "minutes": "minutos", + "months": "Meses", + "moreAccountTypes": "Mais Tipos de Conta", + "mustBeAtLeast1": "Deve ser pelo menos 1", + "name": "Nome", + "nameDescription": "Usuário IMAP. Por padrão é seu e-mail, ou defina um personalizado.", + "namePlaceholder": "Ex: john.doe", + "noAccountConfigurations": "Nenhuma Configuração de Conta", + "noAccountConfigurationsDesc": "Você ainda não adicionou nenhuma configuração de conta. Adicione uma para utilizar a funcionalidade.", + "noOAuth2Tokens": "Sem Tokens OAuth2", + "none": "Nenhum", + "notAvailable": "N/D", + "oauth2Tokens": "Tokens OAuth2", + "openMenu": "Abrir Menu", + "optional": "Opcional", + "owner": "Criador", + "password": "Senha", + "port": "Porta", + "recent": "Recente", + "refreshToken": "Token de Atualização", + "refreshTokenCopiedToClipboard": "Token de atualização copiado para a área de transferência", + "relative": "Relativo", + "runningState": { + "account": { + "id": "ID da conta" + }, + "common": { "close": "Fechar", - "yes": "Sim", - "no": "Não", - "ok": "OK", - "loading": "Carregando...", - "empty": "Vazio", - "noData": "Sem dados", - "table": { - "noResults": "Nenhum resultado." - }, - "failed": "Falhou", - "notFound": "Não encontrado", - "back": "Voltar", - "goBack": "Voltar", - "backToHome": "Voltar ao Início", - "tryAgain": "Tentar novamente", - "more": "Mais", - "actions": "Ações", - "filter": "Filtrar", - "reset": "Redefinir", - "clear": "Limpar", - "error": "Erro", - "apply": "Aplicar", - "select": "Selecionar", - "selectAll": "Selecionar tudo", - "deselectAll": "Desmarcar tudo", - "all": "Tudo", - "none": "Nenhum", - "showLess": "Mostrar menos", - "showMore": "Mostrar mais...", - "project_description": "Bichon é um projeto de código aberto.", - "view_on_github_button": "Ver no GitHub", - "op_failed": "Operação falhou", - "na": "N/A", - "retry": "Repetir", - "deleting": "Excluindo..." - }, - "navigation": { - "home": "Início", - "settings": "Configurações", - "accounts": "Contas", - "dashboard": "Painel", - "mailbox": "Caixa de Entrada", - "oauth2": "OAuth2", - "accessTokens": "Tokens de Acesso", - "apiDocs": "Documentação da API", - "general": "Geral", - "auth": "Autenticação", - "other": "Outro", - "users": "Usuários do sistema" - }, - "auth": { - "welcome": "Bem-vindo ao Bichon", - "username": "Nome de Usuário", - "password": "Senha", - "login": "Login", - "loginFailed": "Falha no Login", - "invalidPassword": "Senha inválida, por favor, tente novamente.", - "somethingWentWrong": "Algo deu errado", - "sessionExpired": "Sessão Expirada!", - "sessionExpiredDesc": "Sua sessão terminou devido à inatividade. Por favor, faça login novamente para continuar.", - "logout": "Sair", - "areYouSureYouWantToLogOut": "Tem certeza que deseja sair?", - "youWillNeedToLogInAgain": "Você precisará fazer login novamente para acessar sua conta." - }, - "errors": { - "pageNotFound": "Ops! Página não encontrada!", - "pageNotFoundDesc": "A página que você está procurando pode não existir ou foi removida.", - "somethingWentWrong": "Ops! Algo deu errado :')", - "somethingWentWrongDesc": "Lamentamos o inconveniente, por favor, tente novamente mais tarde.", - "internalServerError": "Erro interno do servidor!", - "contentNotModified": "Conteúdo não modificado!", - "networkError": "Erro de Rede", - "networkErrorDesc": "Não foi possível conectar ao servidor. Por favor, verifique sua conexão com a internet e tente novamente.", - "forbidden": "Proibido", - "forbiddenTitle": "Acesso Proibido", - "forbiddenDesc": "Você não tem as permissões necessárias para visualizar este recurso.", - "unauthorized": "Não Autorizado", - "unauthorizedTitle": "Acesso Não Autorizado", - "unauthorizedDesc": "Por favor, faça login com as credenciais apropriadas para acessar este recurso.", - "maintenance": "Manutenção", - "maintenanceTitle": "O site está em manutenção!", - "maintenanceDesc": "O site está temporariamente indisponível. Voltaremos em breve.", - "learnMore": "Saiba Mais" - }, - "dashboard": { - "title": "Painel", - "mailAccounts": "Contas de Email", - "connected": "Conectado", - "totalEmails": "Total de Emails", - "syncedLocally": "Sincronizado Localmente", - "totalEmailSize": "Tamanho Total do Email", - "logicalVolume": "Tamanho original", - "localDataFiles": "Arquivos de Dados Locais", - "actualDiskUsage": "Uso Real do Disco", - "efficiency": "Eficiência", - "saved": "Economizado", - "dataStorage": "Armazenamento", - "indexSize": "Tamanho índice", - "metadataSize": "Tamanho dos metadatos", - "tantivyDatabase": "Baseado no motor de busca Tantivy", - "dayTrend": "Tendência de 30 Dias", - "attachments": "Anexos", - "topLists": "Principais Listas", - "newEmails": "Novos Emails", - "messageDistribution": "Distribuição de Mensagens", - "attachmentRatio": "Taxa de Anexos", - "attachmentRatioDesc": "{{percent}}% dos seus emails têm anexos", - "noEmailsSynced": "Nenhum email sincronizado ainda", - "withAttachments": "Com Anexos", - "noAttachments": "Sem Anexos", - "top10Senders": "Top 10 Remetentes", - "byMessageCount": "Por Contagem de Mensagens", - "sender": "Remetente", - "count": "Contagem", - "top10LargestEmails": "Top 10 Maiores Emails", - "byMessageSize": "Por Tamanho da Mensagem", - "subject": "Assunto", - "size": "Tamanho", - "noSubject": "(Sem Assunto)", - "top10Accounts": "Top 10 Contas", - "emails": "Emails", - "account": "Conta", - "noRecentActivity": "Nenhuma Atividade Recente", - "noSendersData": "Sem Dados de Remetentes", - "noLargeEmails": "Sem Emails Grandes", - "noAccountData": "Sem Dados de Contas", - "systemVersion": "Versão do sistema" - }, - "accounts": { - "beforeRelativeValue": "Baixar e-mails de {{value}} {{unit}} atrás", - "sinceRelativeValue": "Baixar e-mails dos últimos", - "downloadBatchSize": "Tamanho do lote de download", - "downloadBatchSizeDescription": "Número de mensagens recuperadas por solicitação IMAP", - "downloadScopeDescription": "Escolha quais e-mails devem ser indexados e baixados.", - "downloadScope": "Estratégia de download", - "selectMode": "Selecionar modo de filtro", - "downloadAll": "Baixar todos os e-mails", - "sinceFixed": "Desde uma data específica", - "sinceRelative": "Baixar apenas e-mails recentes", - "beforeRelative": "Baixar apenas e-mails antigos", - "duration": "Duração", - "unit": "Unidade", - "accessControl": "Controle de acesso", - "owner": "Criador", - "access_control": { - "title": "Atribuição de Acesso à Conta", - "description": "Atribuir funções e usuários autorizados a {{email}}", - "role_label": "Função de Acesso", - "role_placeholder": "Selecionar uma função", - "role_loading": "Carregando funções...", - "user_label": "Selecionar Usuários Autorizados", - "user_search_placeholder": "Buscar por nome ou e-mail...", - "user_empty": "Nenhum usuário encontrado", - "user_selected_count": "Selecionado(s): {{count}}", - "buttons": { - "cancel": "Cancelar", - "save": "Salvar Atribuição" - }, - "validation": { - "user_required": "Selecione pelo menos um usuário", - "role_required": "Selecione uma função para atribuir" - }, - "toast": { - "success_title": "Atribuição Concluída", - "success_desc": "As permissões foram atribuídas com sucesso a {{email}}", - "failed_title": "Falha na Atribuição" - } - }, - "title": "Contas de Email", - "description": "Gerencie e configure suas contas de email.", - "addImap": "Adicionar Conta IMAP", - "addNoSync": "Adicionar Conta Sem Sincronização", - "moreAccountTypes": "Mais Tipos de Conta", - "noAccountConfigurations": "Nenhuma Configuração de Conta", - "noAccountConfigurationsDesc": "Você ainda não adicionou nenhuma configuração de conta. Adicione uma para utilizar a funcionalidade.", - "addConfiguration": "Adicionar Configuração", - "useNoProxy": "Nenhum proxy", - "login_name": "Nome de login", - "name": "Nome", - "email": "Email", + "folders": "caixas de correio" + }, + "empty": { + "no_active_download": "Nenhum download em andamento", + "no_errors_current": "Sem erros na sessão atual", + "no_errors_session": "Sem erros nesta sessão", + "no_global_errors": "Sem erros globais", + "no_history": "Sem histórico" + }, + "folders": "caixas de correio", + "latest": "RECENTE", + "loading": { + "fetching_account_state": "Obtendo estado da conta..." + }, + "message": "Mensagem", + "session": { + "started_at": "Hora de início", "status": "Status", - "type": "Tipo", - "lastSync": "Última Sincronização", - "actions": "Ações", - "edit": "Editar", - "delete": "Excluir", - "detail": "Detalhe", - "selectMailboxes": "Escolher caixas de correio", - "oauth2Tokens": "Tokens OAuth2", - "id": "ID", - "enabled": "Ativo", - "auth": "Autenticação", - "incSync": "Sincronização Incremental", - "state": "Estado", - "createdAt": "Criado Em", - "updatedAt": "Atualizado Em", - "openMenu": "Abrir Menu", - "emailAccountRegistration": "Registro de Conta de Email", - "emailAccountRegistrationDesc": "Insira o seu endereço de e-mail. Nos próximos passos, irá configurar os detalhes de IMAP. Usaremos este endereço para detectar automaticamente as configurações do servidor IMAP.", - "emailAddress": "Endereço de Email", - "emailPlaceholder": "Ex: john.doe@example.com", - "namePlaceholder": "Ex: john.doe", - "optional": "Opcional", - "nameDescription": "Usuário IMAP. Por padrão é seu e-mail, ou defina um personalizado.", - "emailCannotBeModified": "O endereço de email da conta não pode ser modificado ao editar.", - "addAccount": "Adicionar Conta", - "updateAccount": "Atualizar Conta", - "accountUpdated": "Conta Atualizada", - "accountCreated": "Conta Criada", - "accountUpdatedDesc": "A conta foi atualizada com sucesso.", - "accountCreatedDesc": "A conta foi criada com sucesso.", - "accountUpdateFailed": "Falha ao Atualizar Conta", - "accountCreationFailed": "Falha ao Criar Conta", - "updateFailed": "Falha na atualização, por favor, tente novamente mais tarde.", - "creationFailed": "Falha na criação, por favor, tente novamente mais tarde.", - "allMailFolderSelected": "Atenção: A pasta 'Todos os Emails' está selecionada", - "accountSyncFoldersUpdated": "Pastas de Sincronização da Conta Atualizadas", - "accountSyncFoldersUpdateFailed": "Falha ao Atualizar Pastas de Sincronização da Conta", - "serverConfiguration": "Configuração do Servidor (IMAP)", - "selectedMailboxes": "Caixas de correio selecionadas", - "allMailFolderSelectedDesc": "Selecionar uma pasta com o atributo 'Todos os Emails' pode duplicar mensagens já sincronizadas de pastas como Caixa de Entrada ou Itens Enviados. Isso pode consumir significativamente o seu armazenamento.", - "allMailSkipped": "Pastas padrão selecionadas. 'Todos os Emails' foi ignorado para evitar duplicação.", - "selectAtLeastOneFolder": "Por favor, selecione pelo menos uma pasta", - "chooseMailboxesToDownload": "Escolha as caixas de correio para baixar para {{email}}. Novas caixas serão baixadas no próximo ciclo.", - "accountDetails": "Detalhes da Conta", - "capabilities": "Capacidades", - "folderLimit": "Limite de Pasta", - "everyMinutes": "A cada {{minutes}} minutos", - "foldersConfiguredForSync": "Pastas Configuradas para Sincronização: {{count}}", - "foldersSelected": "Pastas Selecionadas: {{count}}", - "imapHost": "Host IMAP", - "imapHostPlaceholder": "Ex: imap.example.com", - "imapPort": "Porta IMAP", - "imapPortPlaceholder": "Ex: 993", - "imapEncryption": "Criptografia IMAP", - "selectEncryptionMethod": "Selecionar Método de Criptografia", - "chooseEncryptionMethod": "Por favor, escolha o método de criptografia para IMAP.", - "imapAuthMethod": "Método de Autenticação IMAP", - "selectAuthMethod": "Selecionar Método de Autenticação", - "chooseAuthMethod": "Por favor, escolha o método de autenticação para IMAP.", - "imapPassword": "Senha IMAP", - "leaveEmptyToKeepPassword": "Deixe vazio para manter a senha atual", - "enterPassword": "Insira a senha", - "leaveEmptyToKeepExisting": "Deixe vazio para manter a senha existente. Insira a nova senha apenas se estiver atualizando.", - "useProxy": "Usar Proxy", - "selectProxy": "Selecionar Proxy", - "downloadInterval": "Intervalo de download (minutos)", - "downloadIntervalPlaceholder": "Insira os minutos", - "enabledDescription": "Determina se esta conta está ativa. Se desativada, os downloads relacionados não serão executados.", - "dateSince": "Data de Início da Sincronização", - "none": "Nenhum", - "fixed": "Fixo", - "relative": "Relativo", - "selectDate": "Selecionar Data", - "selectUnit": "Selecionar Unidade", - "days": "Dias", - "months": "Meses", - "years": "Anos", - "enterValue": "Insira o Valor", - "mustBeAtLeast1": "Deve ser pelo menos 1", - "dateSelection": "Seleção de Data", - "since": "Desde", - "recent": "Recente", - "notAvailable": "N/D", - "host": "Host", - "port": "Porta", - "encryption": "Criptografia", - "authType": "Tipo de Autenticação", - "password": "Senha", - "useProxyField": "Usar Proxy", - "clickSaveWhenDone": "Clique em 'Salvar' quando terminar.", - "step": "Passo {{index}}", - "goBack": "Voltar", - "autoConfiguring": "Configurando Automaticamente...", - "continue": "Continuar", - "saveChanges": "Salvar Alterações", - "submit": "Enviar", - "field": "Campo", - "value": "Valor", - "refreshToken": "Token de Atualização", - "accessTokenCopiedToClipboard": "Token de acesso copiado para a área de transferência", - "refreshTokenCopiedToClipboard": "Token de atualização copiado para a área de transferência", - "noOAuth2Tokens": "Sem Tokens OAuth2", - "theAccountHasNotCompletedTheAuthorizationProcess": "Esta conta não concluiu o processo de autorização.", - "clickHere": "Clique Aqui", - "toAuthorizeTheAccount": "para autorizar a conta.", - "detailsOfTheOAuth2TokensForTheAccount": "Detalhes dos Tokens OAuth2 para esta conta.", - "updateTheEmailAccountHere": "Atualize a conta de email aqui.", - "addNewEmailAccountHere": "Adicione uma nova conta de email aqui.", - "thisAccountIsUsedForIdentificationPurposesOnly": "Esta conta é usada apenas para fins de identificação e não requer sincronização com um servidor de email. Ajuda na importação de dados de email.", - "determinesWhetherThisAccountIsActiveNoSync": "Determina se esta conta está ativa. Se estiver desativada, não será possível importar dados.", - "folderSync": { - "noData": "Sem Dados", - "noFolders": "Nenhuma pasta para sincronizar", - "batches": "Lotes", - "autoSelectDescendants": "Selecionar automaticamente os descendentes", - "autoSelectParents": "Selecionar automaticamente os pais", - "expandAll": "Expandir tudo", - "collapseAll": "Recolher tudo", - "loadingMailboxFolders": "Carregando pastas da caixa de correio…" - }, - "viewDetails": "Ver Detalhes", - "runningState": { - "message": "Mensagem", - "account": { - "id": "ID da conta" - }, - "tabs": { - "active_session": "Sessão ativa", - "history": "Histórico", - "global_errors": "Erros globais", - "folders": "Caixas de correio", - "errors": "Erros" - }, - "loading": { - "fetching_account_state": "Obtendo estado da conta..." - }, - "empty": { - "no_active_download": "Nenhum download em andamento", - "no_errors_current": "Sem erros na sessão atual", - "no_errors_session": "Sem erros nesta sessão", - "no_global_errors": "Sem erros globais", - "no_history": "Sem histórico" - }, - "session": { - "status": "Status", - "trigger": "Gatilho", - "started_at": "Hora de início" - }, - "common": { - "folders": "caixas de correio", - "close": "Fechar" - }, - "latest": "RECENTE", - "folders": "caixas de correio" - }, - "steps": { - "complete": "Concluído", - "emailAddress": "Endereço de Email", - "imap": "IMAP", - "syncPreferences": "Preferências de Sincronização", - "summary": "Resumo" - }, - "imapProxy": "Usar proxy SOCKS5 para conexão IMAP.", - "syncStartDateDescription": "Define a data de início da sincronização (data fixa ou relativa a partir de agora). Emails anteriores a esta data serão excluídos. {{fixedPart}}.", - "syncAfterDate": "Sincronizar dados após a data definida", - "syncRecentData": "Sincronizar apenas dados recentes, deslizando a data de sincronização ao longo do tempo", - "folderLimitDescription": "Limita o número de emails a sincronizar por pasta (mínimo 100). Deixe vazio para nenhum limite.", - "folderLimitPlaceholder": "Ex: 1000", - "imap": "IMAP", - "minutes": "minutos", - "accountHasBeenSuccessfully": "A conta foi {{action}} com sucesso", - "enableAccount": "Ativar conta", - "disableAccount": "Desativar conta", - "areYouSureYouWantTo": "Tem certeza de que deseja {{action}} esta conta?", - "enable": "Ativar", - "disable": "Desativar", - "thisWillPreventTheAccountFromBeingUsed": "Esta conta não sincronizará mais dados do servidor IMAP, mas os dados existentes ainda estarão acessíveis.", - "disabled": "Desativado", - "useDangerous": "Confiar em qualquer certificado TLS", - "useDangerousDescription": "Ative esta opção apenas se estiver a conectar a um servidor IMAP que use um certificado público ou autoassinado que o seu sistema possa não reconhecer. Esta opção ignora a verificação normal de certificados e pode expor a ligação a ataques man‑in‑the‑middle — ative apenas se compreender os riscos." + "trigger": "Gatilho" + }, + "tabs": { + "active_session": "Sessão ativa", + "errors": "Erros", + "folders": "Caixas de correio", + "global_errors": "Erros globais", + "history": "Histórico" + } }, - "mailbox": { - "deleteMailboxDialog": { - "title": "Excluir pasta de correio", - "desc": "Tem certeza de que deseja excluir esta pasta de correio? Esta ação não pode ser desfeita.", - "warningTitle": "Aviso", - "warningDesc": "A exclusão desta pasta também removerá permanentemente todos os e-mails arquivados e subpastas nela contidos.", - "confirm": "Excluir permanentemente", - "successTitle": "Excluído com sucesso", - "successDesc": "A pasta de correio e seu conteúdo foram removidos com sucesso.", - "errorTitle": "Falha ao excluir" - }, - "title": "Caixa de Entrada", - "folders": "Pastas", - "messages": "Mensagens", - "noMessages": "Sem mensagens", - "selectFolder": "Selecione uma pasta para visualizar as mensagens", - "deleteDialog": { - "title": "Excluir Email", - "desc": "Tem certeza que deseja excluir {{countText}}? Esta ação removerá permanentemente o(s) email(s) selecionado(s) do banco de dados local. Os emails serão permanentemente perdidos e não poderão ser recuperados.", - "descCountSingle": "este email", - "descCountMultiple": "estes {{count}} emails", - "warningTitle": "Aviso!", - "warningDesc": "Tenha cuidado antes de prosseguir.", - "confirm": "Excluir", - "successTitle": "Mensagem excluída com sucesso", - "successDesc": "A mensagem foi excluída.", - "errorTitle": "Falha ao excluir mensagem" - }, - "thread": { - "title": "Tópico ({{count}} {{messageLabel}})", - "message": "Mensagem", - "messages": "Mensagens", - "noSubject": "(Sem Assunto)", - "invalidDate": "Data Inválida", - "empty": "Não há mensagens neste tópico.", - "loadError": "Falha ao carregar o tópico", - "loadingMore": "Carregando mais...", - "loadMore": "Carregar Mais" - }, - "bulkActions": { - "ariaLabel": "Ações em massa para {{count}} {{emailLabel}} selecionados", - "email": "email", - "emails": "emails", - "selected": "Selecionados", - "clearSelection": "Limpar Seleção", - "clearSelectionWithKey": "Limpar Seleção ({{key}})", - "delete": "Excluir", - "deleteTooltip": "Excluir emails selecionados" - } + "saveChanges": "Salvar Alterações", + "selectAtLeastOneFolder": "Por favor, selecione pelo menos uma pasta", + "selectAuthMethod": "Selecionar Método de Autenticação", + "selectDate": "Selecionar Data", + "selectEncryptionMethod": "Selecionar Método de Criptografia", + "selectMailboxes": "Escolher caixas de correio", + "selectMode": "Selecionar modo de filtro", + "selectProxy": "Selecionar Proxy", + "selectUnit": "Selecionar Unidade", + "selectedMailboxes": "Caixas de correio selecionadas", + "serverConfiguration": "Configuração do Servidor (IMAP)", + "since": "Desde", + "sinceFixed": "Desde uma data específica", + "sinceRelative": "Baixar apenas e-mails recentes", + "sinceRelativeValue": "Baixar e-mails dos últimos", + "state": "Estado", + "status": "Status", + "step": "Passo {{index}}", + "steps": { + "complete": "Concluído", + "emailAddress": "Endereço de Email", + "imap": "IMAP", + "summary": "Resumo", + "syncPreferences": "Preferências de Sincronização" }, - "search": { - "size": "Tamanho", - "any": "Qualquer", - "tiny": "Muito pequeno (<15 KB)", - "small": "Pequeno (<2 MB)", - "medium": "Médio (2 - 10 MB)", - "large": "Grande (10 - 20 MB)", - "huge": "Muito grande (≥20 MB)", - "sort": "Ordenar", - "sizeDescription": "O tamanho refere-se ao tamanho total do e-mail, incluindo anexos.", - "title": "Pesquisa", - "searching": "Pesquisando, por favor, aguarde...", - "noEmailsFound": "Nenhum email encontrado", - "startSearching": "Comece a pesquisar usando palavras-chave, remetentes ou filtros avançados.", - "adjustSearch": "Tente ajustar seus critérios de pesquisa ou limpar os filtros.", - "tagFilter": "Filtro de Tag", - "from": "De", - "to": "Para", - "subject": "Assunto", - "date": "Data", - "editTag": "Editar Tag", - "keyword": "Palavra-chave", - "sender": "Remetente", - "recipient": "Destinatário", - "hasAttachment": "Tem Anexo", - "yes": "Sim", - "no": "Não", - "dateRange": "Intervalo de Datas", - "startDate": "Data de Início", - "endDate": "Data de Término", - "advancedFilters": "Filtros Avançados", - "searchArchivedEmails": "Pesquisar Emails Arquivados", - "fullTextMultiAccount": "Pesquisa de Texto Completo, Multi-Conta e Filtros Avançados", - "account": "Conta", - "mailbox": "Caixa de Entrada", - "selectAccount": "Selecionar Conta", - "selectMailbox": "Selecionar Caixa de Entrada", - "noActiveEmailAccount": "Nenhuma conta de email ativa.", - "addEmailAccount": "Adicionar Conta de Email", - "noMailboxSelectAccount": "Nenhuma caixa de entrada, selecione uma conta primeiro.", - "searchInSubjectBody": "Pesquisar no assunto, corpo e anexos...", - "searchingButton": "Pesquisando...", - "searchButton": "Pesquisar", - "advanced": "Avançado", - "clear": "Limpar", - "since": "Desde:", - "before": "Antes de:", - "selectDate": "Selecionar Data", - "pleaseSelectAtLeastOne": "Por favor, selecione pelo menos um critério de pesquisa", - "cc": "CC", - "bcc": "BCC", - "attachmentName": "Nome do Anexo", - "messageId": "ID da Mensagem", - "minSize": "Tamanho Mínimo", - "maxSize": "Tamanho Máximo", - "senderRecipients": "Remetentes / Destinatários", - "attachmentsSize": "Anexos e Tamanho", - "minimumBytes": "Mínimo (Bytes)", - "maximumBytes": "Máximo (Bytes)", - "originalMessageIdHeader": "Cabeçalho Message-ID do Email Original", - "addTags": { - "title": "Editar Tags", - "none": "Nenhuma tag adicionada ainda", - "searchPlaceholder": "Pesquisar ou criar tags...", - "createHint": "Criar nova tag: {{tag}}", - "invalidTitle": "Tag Inválida", - "updatedTitle": "Tags Atualizadas", - "updatedDesc": "As tags foram atualizadas com sucesso", - "updateFailedTitle": "Falha na Atualização", - "tryAgain": "Por favor, tente novamente mais tarde", - "selectedCount": "Tags Selecionadas: {{count}}", - "cancel": "Cancelar", - "save": "Salvar", - "saving": "Salvando..." - }, - "updateTags": { - "overwriteWarning": "Aviso: isto substituirá todas as etiquetas existentes nos itens selecionados.", - "title": "Atualizar etiquetas", - "none": "Nenhuma etiqueta selecionada", - "searchPlaceholder": "Procurar ou criar nova etiqueta...", - "createHint": "Pressione Enter para criar nova etiqueta: \"{{tag}}\"", - "selectedCount": "{{count}} etiqueta(s) a aplicar", - "cancel": "Cancelar", - "invalidTitle": "Etiqueta inválida", - "updatedTitle": "Etiquetas atualizadas", - "updatedDesc": "Etiquetas atualizadas com sucesso.", - "updateFailedTitle": "Falha na atualização", - "tryAgain": "Por favor, tente novamente mais tarde.", - "actionAdd": "Adicionar", - "actionRemove": "Remover", - "actionOverwrite": "Substituir", - "submitAdd": "Adicionar etiquetas", - "submitRemove": "Remover etiquetas", - "submitOverwrite": "Substituir etiquetas", - "savingAdd": "Adicionando...", - "savingRemove": "Removendo...", - "savingOverwrite": "Substituindo..." - }, - "thread": { - "title": "Tópico · {{count}} Mensagens", - "error": "Falha ao carregar o tópico", - "empty": "Não há mensagens neste tópico", - "invalidDate": "Data Inválida", - "noSubject": "(Sem Assunto)", - "loadingMore": "Carregando...", - "loadMore": "Carregar Mais" - }, - "bulkActions": { - "ariaLabel": "{{count}} mensagens selecionadas. Barra de ações", - "delete": "Excluir", - "deleteDesc": "Excluir mensagens selecionadas", - "selected": "{{count}} selecionadas", - "clear": "Limpar seleção", - "manageTags": "Gerenciar etiquetas" - }, - "delete": { - "title": "Excluir mensagens", - "confirmPrefix": "Tem certeza que deseja excluir", - "countLabel": "{{count}} mensagem(ns)?", - "confirmDetail": "Esta ação não pode ser desfeita.", - "confirmButton": "Excluir", - "warningTitle": "Aviso", - "warningDesc": "As mensagens serão removidas permanentemente.", - "successTitle": "Excluído", - "successDesc": "Mensagens excluídas com sucesso.", - "errorTitle": "Erro ao excluir" - } + "submit": "Enviar", + "syncAfterDate": "Sincronizar dados após a data definida", + "syncRecentData": "Sincronizar apenas dados recentes, deslizando a data de sincronização ao longo do tempo", + "syncStartDateDescription": "Define a data de início da sincronização (data fixa ou relativa a partir de agora). Emails anteriores a esta data serão excluídos. {{fixedPart}}.", + "theAccountHasNotCompletedTheAuthorizationProcess": "Esta conta não concluiu o processo de autorização.", + "thisAccountIsUsedForIdentificationPurposesOnly": "Esta conta é usada apenas para fins de identificação e não requer sincronização com um servidor de email. Ajuda na importação de dados de email.", + "thisWillPreventTheAccountFromBeingUsed": "Esta conta não sincronizará mais dados do servidor IMAP, mas os dados existentes ainda estarão acessíveis.", + "title": "Contas de Email", + "toAuthorizeTheAccount": "para autorizar a conta.", + "type": "Tipo", + "unit": "Unidade", + "updateAccount": "Atualizar Conta", + "updateFailed": "Falha na atualização, por favor, tente novamente mais tarde.", + "updateTheEmailAccountHere": "Atualize a conta de email aqui.", + "updatedAt": "Atualizado Em", + "useDangerous": "Confiar em qualquer certificado TLS", + "useDangerousDescription": "Ative esta opção apenas se estiver a conectar a um servidor IMAP que use um certificado público ou autoassinado que o seu sistema possa não reconhecer. Esta opção ignora a verificação normal de certificados e pode expor a ligação a ataques man‑in‑the‑middle — ative apenas se compreender os riscos.", + "useNoProxy": "Nenhum proxy", + "useProxy": "Usar Proxy", + "useProxyField": "Usar Proxy", + "value": "Valor", + "viewDetails": "Ver Detalhes", + "years": "Anos" + }, + "apiDocs": { + "choosePreferredType": "Escolha o seu tipo de documentação de API preferido", + "downloadSpecYAML": "Baixar Especificação YAML", + "openAPIExplorer": "OpenAPI Explorer", + "reDoc": "ReDoc", + "scalar": "Scalar", + "swaggerUI": "Swagger UI" + }, + "apiTokens": { + "deleteDialog": { + "cancel": "Cancelar", + "confirm": "Eliminar", + "deleting": "A eliminar...", + "description": "Esta ação não pode ser desfeita. Qualquer aplicação que utilize este token perderá imediatamente o acesso.", + "title": "Eliminar token de acesso?" }, - "mail": { - "emailViewer": "Visualizador de Email", - "noMessageSelected": "Nenhuma mensagem selecionada", - "account": "Conta", - "from": "De", - "to": "Para", - "subject": "Assunto", - "date": "Data", - "tags": "Tags", - "noTagsYet": "Nenhuma tag ainda", - "id": "ID", - "cc": "CC", - "bcc": "BCC", - "attachments": "Anexos", - "download": "Baixar", - "delete": "Excluir", - "viewThread": "Ver Tópico", - "downloadStarted": "Download iniciado", - "downloadComplete": "Download concluído", - "downloadFailed": "Falha no download", - "failedToDownloadFile": "Falha ao baixar arquivo", - "failedToLoadEmail": "Falha ao carregar a mensagem de email.", - "isBeingDownloaded": "Baixando {{id}}", - "downloaded": "{{id}} baixado", - "showLess": "mostrar menos", - "showMore": "mostrar mais...", - "onlyNonInlineAttachments": "Apenas anexos não incorporados são exibidos aqui.", - "noAttachments": "Sem anexos" + "dialog": { + "createTitle": "Criar token de acesso", + "description": "Clique em guardar quando terminar.", + "editTitle": "Editar token de acesso", + "save": "Guardar", + "saveChanges": "Guardar alterações" }, - "oauth2": { - "title": "OAuth2", - "addConfiguration": "Adicionar Configuração", - "id": "ID", - "provider": "Provedor", - "clientId": "ID do Cliente", - "clientSecret": "Segredo do Cliente", - "redirectUri": "URI de Redirecionamento", - "scopes": "Escopos", - "status": "Status", - "enabled": "Ativo", - "disabled": "Desativado", - "edit": "Editar", - "delete": "Excluir", - "enable": "Ativar", - "disable": "Desativar", - "noConfigurations": "Nenhuma Configuração OAuth2", - "noConfigurationsDesc": "Você ainda não adicionou nenhuma configuração OAuth2. Adicione uma para utilizar a funcionalidade.", - "description": "Lida automaticamente com a recuperação, armazenamento e renovação de tokens de acesso, garantindo uma experiência de autenticação contínua e sempre disponível.", - "addNew": "Adicionar Novo", - "updateHere": "Atualize aqui.", - "createNewHere": "Crie um novo aqui.", - "clickSaveWhenDone": "Clique em 'Salvar' quando terminar.", - "quickPresets": "Predefinições Rápidas:", - "gmail": "Gmail", - "outlook": "Outlook", - "whenDisabled": "Quando Desativado: - Novos fluxos de autorização serão imediatamente rejeitados - Tokens de acesso e de atualização existentes serão revogados em 1 minuto - Usuários precisarão reautorizar quando reativado", - "clientIdLabel": "ID do Cliente:", - "enterYourClientId": "Insira seu ID de Cliente", - "theUniqueIdentifierForYourApplication": "O identificador único para sua aplicação fornecido pelo provedor OAuth.", - "clientSecretLabel": "Segredo do Cliente:", - "leaveEmptyToKeepExistingSecret": "Deixe vazio para manter o segredo existente", - "enterYourClientSecret": "Insira seu Segredo do Cliente", - "leaveEmptyToKeepTheExistingSecret": "Deixe vazio para manter o segredo existente. Insira um novo valor apenas se estiver atualizando.", - "aSecretKeyProvidedByTheOAuthProvider": "Uma chave secreta fornecida pelo provedor OAuth para autenticar sua aplicação.", - "authUrlLabel": "URL de Autorização:", - "enterTheAuthorizationUrl": "Insira a URL de Autorização", - "theUrlWhereUsersWillBeRedirected": "O URL para onde os usuários serão redirecionados para autorização.", - "tokenUrlLabel": "URL do Token:", - "enterTheTokenUrl": "Insira a URL do Token", - "theUrlUsedToExchange": "O URL usado para trocar o código de autorização por um token de acesso.", - "redirectUrlLabel": "URI de Redirecionamento:", - "enterYourRedirectUrl": "Insira seu URI de Redirecionamento", - "theRedirectUrlAfterAuthorization": "O URI de redirecionamento após a autorização. Deve corresponder ao registrado no provedor OAuth. Use o formato http://[host]:[port]/oauth2/callback (ou https://) onde [host] e [port] devem corresponder à sua implantação do RustMailer. O caminho `/oauth2/callback` é fixo.", - "scope": "Escopo:", - "enterTheScopeHere": "Insira o escopo aqui.", - "addScope": "Adicionar Escopo", - "key": "Chave:", - "enterTheKeyHere": "Insira a chave aqui.", - "value": "Valor:", - "enterTheValueHere": "Insira o valor aqui.", - "addExtraParams": "Adicionar Parâmetros Extras", - "useProxyOptional": "Usar Proxy (Opcional):", - "selectAProxy": "Selecionar um Proxy", - "noProxyAvailable": "Nenhum Proxy disponível", - "useSocks5ProxyForOAuthRequests": "Usar proxy SOCKS5 para solicitações OAuth caso o acesso direto seja bloqueado.", - "descriptionLabel": "Descrição:", - "describeThePurposeOfTheOauth2Application": "Descreva o propósito da aplicação OAuth2", - "optional": "Opcional", - "saving": "Salvando...", - "creating": "Criando...", - "saveChanges": "Salvar Alterações", - "save": "Salvar", - "updated": "Atualizado", - "created": "Criado", - "yourOAuth2ApplicationHasBeenSuccessfully": "Sua aplicação OAuth2 foi {{action}} com sucesso.", - "updateFailed": "Falha na Atualização", - "creationFailed": "Falha na Criação", - "updateOrCreationFailed": "Falha ao {{action}}, por favor, tente novamente mais tarde", - "clientSecretIsRequired": "O Segredo do Cliente é obrigatório", - "clientSecretCannotBeEmpty": "O Segredo do Cliente não pode estar vazio", - "keyIsRequired": "A chave é obrigatória", - "keyCannotBeEmpty": "A chave não pode estar vazia", - "valueIsRequired": "O valor é obrigatório", - "valueCannotBeEmpty": "O valor não pode estar vazio", - "descriptionMustNotExceed255Characters": "A descrição não pode exceder 255 caracteres.", - "clientIdIsRequired": "O ID do Cliente é obrigatório", - "clientIdCannotBeEmpty": "O ID do Cliente não pode estar vazio", - "authorizationUrlIsRequired": "A URL de Autorização é obrigatória", - "authorizationUrlCannotBeEmpty": "A URL de Autorização não pode estar vazia", - "invalidAuthorizationUrlFormat": "Formato de URL de Autorização inválido", - "tokenUrlIsRequired": "A URL do Token é obrigatória", - "tokenUrlCannotBeEmpty": "A URL do Token não pode estar vazia", - "invalidTokenUrlFormat": "Formato de URL do Token inválido", - "redirectUriIsRequired": "O URI de Redirecionamento é obrigatório", - "redirectUriCannotBeEmpty": "O URI de Redirecionamento não pode estar vazio", - "invalidRedirectUriFormat": "Formato de URI de Redirecionamento inválido", - "authorizeEmailAccount": "Autorizar Conta de Email", - "authorizeAnEmailAccountToStartTheOAuth2AuthorizationProcess": "Autorize uma conta de email para iniciar o processo de Autorização OAuth2.", - "loadingAccounts": "Carregando contas...", - "selectAnAccount": "Selecionar uma Conta", - "noEmailAccountsRegistered": "Nenhuma conta de email registrada. Por favor, crie uma.", - "pleaseCreateOne": "Por favor, crie uma.", - "createAccount": "Criar Conta", - "authorize": "Autorizar", - "getAuthorizeUrlFailed": "Falha ao Obter URL de Autorização", - "getAuthorizeUrlFailedDesc": "Falha ao obter URL de autorização, por favor, tente novamente mais tarde", - "oauth2ClientUpdated": "Cliente OAuth2 Atualizado", - "oauth2ClientHasBeenSuccessfully": "O Cliente OAuth2 foi {{action}} com sucesso.", - "statusUpdateFailed": "Falha ao atualizar status, por favor, tente novamente mais tarde", - "disableOAuth2Client": "Desativar Cliente OAuth2", - "enableOAuth2Client": "Ativar Cliente OAuth2", - "areYouSureYouWantTo": "Tem certeza que deseja {{action}} este Cliente OAuth2?", - "thisWillPreventTheOAuth2ClientFromBeingUsed": "Isso impedirá que o Cliente OAuth2 seja usado.", - "deleteToken": "Excluir Token", - "areYouSureYouWantToDelete": "Tem certeza que deseja excluir", - "thisActionWillPermanentlyRemoveTheOauth2Record": "Esta ação removerá permanentemente o registro OAuth2 do sistema. Isso não pode ser desfeito.", - "enterIdToConfirmDeletion": "Insira o ID para confirmar a exclusão.", - "warning": "Aviso!", - "pleaseBeCareful": "Por favor, tenha cuidado, esta ação é irreversível.", - "deleteSuccess": "Exclusão Bem-Sucedida", - "yourOAuth2ApplicationHasBeenSuccessfullyDeleted": "Sua aplicação OAuth2 foi excluída com sucesso.", - "oauth2DeleteFailed": "Falha ao Excluir OAuth2", - "deleteFailed": "Falha na exclusão, por favor, tente novamente mais tarde", - "actions": { - "openMenu": "Abrir Menu", - "edit": "Editar", - "authorize": "Autorizar", - "delete": "Excluir" - }, - "authFailed": "Falha na Autenticação OAuth2", - "error": "Erro", - "unknownError": "Um erro desconhecido ocorreu.", - "tryAgain": "Tentar Novamente", - "goHome": "Ir para o Início", - "authSuccess": "Autenticação OAuth2 Bem-Sucedida", - "success": "Sucesso", - "successMessage": "A conta de email foi autenticada com sucesso via OAuth2. O token de acesso foi armazenado no sistema e será renovado automaticamente conforme necessário.", - "goToAccounts": "Ir para Contas", - "authAtatus": "Status de Autenticação OAuth2", - "information": "Informação", - "noStatus": "Esta página exibe o resultado da autenticação OAuth2. Nenhum status específico está disponível no momento. Por favor, tente novamente se necessário.", - "backToLogin": "Voltar ao Login" + "form": { + "1day": "1 dia", + "30days": "30 dias", + "7days": "7 dias", + "errorInt": "Deve ser um número inteiro", + "errorMax": "Máximo 32 caracteres", + "errorNumber": "Deve ser um número", + "errorPositive": "Deve ser maior que 0", + "expirationDescription": "Os tokens expirarão automaticamente após o tempo selecionado.", + "expirationLabel": "Expiração", + "expirationPlaceholder": "Selecionar expiração", + "nameDescription": "Opcional · Máx. 32 caracteres", + "nameLabel": "Nome", + "namePlaceholder": "Dê um nome curto a este token", + "never": "Nunca" }, - "accessTokens": { - "title": "Tokens de Acesso", - "name": "Nome", - "accounts": "Contas", - "token": "Token", - "createdAt": "Criado Em", - "expiresAt": "Expira Em", - "edit": "Editar", - "delete": "Excluir", - "create": "Criar", - "noTokens": "Nenhum Token de Acesso", - "noTokensDesc": "Você ainda não criou nenhum token de acesso. Crie um para utilizar a funcionalidade da API.", - "description": "Gerencie Tokens de Acesso, Regras de ACL, Lista Branca de IP e configurações de Limite de Taxa aqui.", - "editToken": "Editar Token", - "addNew": "Adicionar Novo", - "updateTheAccessTokenHere": "Atualize o Token de Acesso aqui.", - "createNewAccessTokenHere": "Crie um novo Token de Acesso aqui.", - "selectAccounts": "Selecionar Contas", - "selectMultipleAccountsForTheAccessToken": "Selecione várias contas que este Token de Acesso está autorizado a consultar.", - "enterOneIpAddressPerLine": "Insira um endereço IP por linha. Ex:\n192.168.1.1\n192.168.1.2", - "aListOfIpAddressesAllowed": "Uma lista de endereços IP permitidos para acessar os recursos. Um endereço IP por linha. (Opcional)", - "enterQuota": "Insira a Cota. Ex: 100", - "theMaximumNumberOfRequestsAllowed": "O número máximo de solicitações permitidas dentro do intervalo. (Opcional)", - "enterIntervalInSeconds": "Insira o Intervalo em Segundos. Ex: 60", - "theTimeWindowForTheRateLimit": "A janela de tempo (em segundos) para o limite de taxa. (Opcional)", - "describeThePurposeOfTheAccessToken": "Descreva o propósito do Token de Acesso", - "updating": "Atualizando...", - "saving": "Salvando...", - "creating": "Criando...", - "saveChanges": "Salvar Alterações", - "save": "Salvar", - "updated": "Atualizado", - "created": "Criado", - "yourAccessTokenHasBeenSuccessfully": "Seu Token de Acesso foi {{action}} com sucesso.", - "updateFailed": "Falha na Atualização", - "creationFailed": "Falha na Criação", - "updateOrCreationFailed": "Falha ao {{action}}, por favor, tente novamente mais tarde", - "quotaMustBeAPositiveInteger": "A Cota deve ser um número inteiro positivo.", - "intervalMustBeAPositiveInteger": "O Intervalo deve ser um número inteiro positivo.", - "invalidIpAddressesFound": "Endereços IP inválidos encontrados. Por favor, insira endereços IPv4 ou IPv6 válidos.", - "atLeastOneAccountIsRequired": "Pelo menos uma conta é obrigatória.", - "descriptionMustNotExceed255Characters": "A descrição não pode exceder 255 caracteres.", - "notUsedYet": "Ainda Não Usado", - "theListOfAccountsThatCanBeQueried": "A lista de contas que podem ser consultadas usando o Token de Acesso.", - "accountId": "ID da Conta", - "filterByEmailAddressOrAccountId": "Filtrar por endereço de email ou ID da conta...", - "aclRulesForAccessTokens": "As regras de ACL para Tokens de Acesso incluem validação de Lista Branca de IP e aplicação de Limite de Taxa.", - "actions": { - "openMenu": "Abrir Menu", - "edit": "Editar", - "delete": "Excluir" - }, - "quota": "Cota", - "interval": "Intervalo" + "list": { + "createdLabel": "Criado em", + "deleteBtn": "Eliminar token", + "expiresOnLabel": "Expira em", + "expiresOnShort": "Expira em {{date}}", + "lastUsedLabel": "Último uso", + "neverExpires": "Nunca expira", + "neverLabel": "Nunca", + "neverUsed": "Nunca", + "statusActive": "Ativo", + "statusExpired": "Expirado", + "tokenLabel": "Token", + "unnamedToken": "Token sem nome" }, - "settings": { - "appearance": { - "title": "Aparência", - "field": { - "language": "Idioma da interface", - "theme": "Tema da interface" - }, - "description": { - "language": "Selecione o idioma da interface web.", - "theme": "Escolha entre o modo claro ou escuro." - }, - "placeholder": { - "select_language": "Selecionar idioma" - }, - "command": { - "search": "Pesquisar idioma...", - "no_results": "Nenhum idioma encontrado." - }, - "theme": { - "light": "Claro", - "dark": "Escuro" - }, - "button": { - "update": "Atualizar preferências" - }, - "validation": { - "language": { - "required": "Por favor, selecione um idioma." - }, - "theme": { - "required": "Por favor, selecione um tema." - } - } - }, - "title": "Configurações", - "general": "Geral", - "proxy": "Proxy", - "name": "Nome", - "host": "Host", - "port": "Porta", - "username": "Nome de Usuário", - "password": "Senha", - "type": "Tipo", - "actions": "Ações", - "edit": "Editar", - "delete": "Excluir", - "add": "Adicionar", - "noProxies": "Nenhum Proxy", - "noProxiesDesc": "Você ainda não adicionou nenhuma configuração de proxy. Adicione uma para utilizar a funcionalidade.", - "root": "Root", - "rootTitle": "Root", - "rootDesc": "Gerencie as credenciais de acesso root, incluindo token e senha.", - "rootAccessManagement": "Gerenciamento de Acesso Root", - "manageRootTokenAndPassword": "Gerencie o token e a senha root com segurança.", - "resetRootToken": "Redefinir Token Root", - "generateNewToken": "Gera um novo token. O token antigo é imediatamente invalidado.", - "reset": "Redefinir", - "resetRootPassword": "Redefinir Senha Root", - "changePasswordForFutureLogins": "Altera a senha para futuros logins.", - "youAreAboutToResetTheRootToken": "Você está prestes a redefinir o Token Root. Esta ação não pode ser desfeita.", - "confirmReset": "Confirmar Redefinição", - "youAreAboutToResetTheRootPassword": "Você está prestes a redefinir a Senha Root. Por favor, guarde-a em segurança.", - "enterNewRootPassword": "Insira a Nova Senha Root", - "theRootTokenHasBeenReset": "O Token Root foi redefinido", - "yourLoginInformationHasBeenUpdated": "Suas informações de login foram atualizadas. Você não precisa fazer login novamente.", - "invalidPassword": "Senha Inválida", - "rootPasswordMustBeAtLeast6Characters": "A Senha Root deve ter pelo menos 6 caracteres.", - "theRootPasswordHasBeenReset": "A Senha Root foi redefinida", - "useNewPasswordForNextLogin": "Use a nova senha para o próximo login.", - "failedToCopyText": "Falha ao copiar texto", - "filterProxy": "Filtrar Proxy...", - "filterOauth2": "Filtrar OAuth2...", - "filterAccount": "Filtrar Conta...", - "filterAccessToken": "Filtrar Token de Acesso...", - "selectAll": "Selecionar Todos", - "theme": "Tema", - "id": "ID", - "url": "URL", - "createdAt": "Criado Em", - "updatedAt": "Atualizado Em", - "enabled": "Ativo", - "useProxy": "Usar Proxy", - "authUrl": "URL de Autorização", - "tokenUrl": "URL do Token", - "description": "Descrição", - "token": "Token", - "accounts": "Contas", - "acl": "ACL", - "lastAccess": "Último Acesso", - "enterProxyIdToConfirmDeletion": "Insira o ID do Proxy para confirmar a exclusão.", - "updateTheProxyHere": "Atualize o Proxy aqui.", - "addNewProxyHere": "Adicione um novo Proxy aqui.", - "pleaseUseAnIpAddressForBetterReliability": "Por favor, use um endereço IP (Ex: 127.0.0.1) em vez de um hostname ou domínio para melhor confiabilidade.", - "adding": "Adicionando...", - "yourProxyHasBeenSuccessfully": "Seu Proxy foi {{action}} com sucesso.", - "proxyUpdateOrAddFailed": "Falha ao {{action}}, por favor, tente novamente mais tarde", - "sidebar": { - "profile": "Perfil", - "apiTokens": "Tokens API", - "proxy": "Proxy de rede", - "configurations": "Configurações do sistema" - }, - "profile": { - "loadError": "Não foi possível carregar as informações do usuário.", - "uploadTitle": "Enviar avatar", - "maxSize": "Até {{size}}", - "avatarAlt": "Avatar", - "removeAvatar": "Remover avatar", - "uploadError": "Erro(s) ao enviar o arquivo", - "field": { - "username": "Nome de usuário", - "email": "E-mail", - "password": "Senha" - }, - "placeholder": { - "password_keep": "Deixe em branco para manter a senha atual" - }, - "button": { - "update_profile": "Atualizar perfil", - "permissions": "Permissões", - "view_global_permissions": "Ver permissões globais" - }, - "section": { - "roles": "Funções", - "accounts": "{{count}} contas vinculadas" - }, - "account": { - "id": "ID da conta: {{id}}" - }, - "toast": { - "updated": "Perfil atualizado com sucesso", - "update_failed": "Falha ao atualizar o perfil" - }, - "validation": { - "username": { - "required": "O nome de usuário é obrigatório", - "min": "O nome de usuário deve ter pelo menos 5 caracteres", - "max": "O nome de usuário deve ter no máximo 32 caracteres" - }, - "email": { - "required": "O e-mail é obrigatório", - "invalid": "Por favor, insira um endereço de e-mail válido" - }, - "password": { - "min": "A senha deve ter pelo menos 8 caracteres", - "max": "A senha deve ter no máximo 256 caracteres" - } - } - } + "notifications": { + "close": "Fechar", + "copied": "Copiado", + "createFailed": "Falha na criação", + "createSuccess": "Token criado", + "createSuccessDesc": "O token de acesso foi criado com sucesso.", + "deleteFailed": "Falha ao eliminar", + "deleteSuccess": "Token eliminado", + "genericError": "A operação falhou. Tente novamente.", + "tryAgain": "Tentar novamente", + "updateFailed": "Falha na atualização", + "updateSuccess": "Token atualizado", + "updateSuccessDesc": "O token de acesso foi atualizado com sucesso." }, - "apiDocs": { - "choosePreferredType": "Escolha o seu tipo de documentação de API preferido", - "swaggerUI": "Swagger UI", - "reDoc": "ReDoc", - "openAPIExplorer": "OpenAPI Explorer", - "scalar": "Scalar", - "downloadSpecYAML": "Baixar Especificação YAML" + "page": { + "addBtn": "Adicionar token", + "emptyDescription": "Ainda não criou nenhum token API. Clique abaixo para criar um.", + "emptyTitle": "Nenhum token API", + "loadError": "Errore ao carregar os tokens API." + } + }, + "attachment": { + "all_fields_desc": "Corresponde ao nome do anexo, assunto e remetente", + "date": "Data", + "name": "Nome do arquivo", + "search_input_placeholder": "Pesquisar anexos (use \" \" para pesquisa de frases)", + "sender": "Remetente", + "sender_with_count": "Remetente ({{count}})", + "size": "Tamanho do arquivo", + "source": "Origem", + "subject": "Assunto" + }, + "auth": { + "areYouSureYouWantToLogOut": "Tem certeza que deseja sair?", + "invalidPassword": "Senha inválida, por favor, tente novamente.", + "login": "Login", + "loginFailed": "Falha no Login", + "logout": "Sair", + "password": "Senha", + "sessionExpired": "Sessão Expirada!", + "sessionExpiredDesc": "Sua sessão terminou devido à inatividade. Por favor, faça login novamente para continuar.", + "somethingWentWrong": "Algo deu errado", + "username": "Nome de Usuário", + "welcome": "Bem-vindo ao Bichon", + "youWillNeedToLogInAgain": "Você precisará fazer login novamente para acessar sua conta." + }, + "command": { + "dark": "Escuro", + "light": "Claro", + "noResultsFound": "Nenhum resultado encontrado.", + "theme": "Tema", + "typeCommandOrSearch": "Digite o comando ou pesquisa..." + }, + "common": { + "actions": "Ações", + "add": "Adicionar", + "all": "Tudo", + "apply": "Aplicar", + "back": "Voltar", + "backToHome": "Voltar ao Início", + "cancel": "Cancelar", + "clear": "Limpar", + "close": "Fechar", + "confirm": "Confirmar", + "create": "Criar", + "delete": "Excluir", + "deleting": "Excluindo...", + "deselectAll": "Desmarcar tudo", + "edit": "Editar", + "empty": "Vazio", + "error": "Erro", + "failed": "Falhou", + "filter": "Filtrar", + "goBack": "Voltar", + "loading": "Carregando...", + "more": "Mais", + "na": "N/A", + "no": "Não", + "noData": "Sem dados", + "none": "Nenhum", + "notFound": "Não encontrado", + "ok": "OK", + "op_failed": "Operação falhou", + "project_description": "Bichon é um projeto de código aberto.", + "remove": "Remover", + "reset": "Redefinir", + "retry": "Repetir", + "save": "Salvar", + "save_changes": "Salvar alterações", + "search": "Pesquisar", + "select": "Selecionar", + "selectAll": "Selecionar tudo", + "showLess": "Mostrar menos", + "showMore": "Mostrar mais...", + "submit": "Enviar", + "table": { + "noResults": "Nenhum resultado." }, - "dialogs": { - "confirmDelete": "Confirmar Exclusão", - "confirmDeleteDesc": "Tem certeza que deseja excluir este item? Esta ação não pode ser desfeita.", - "deleteSuccess": "Excluído com sucesso", - "deleteFailed": "Falha na exclusão", - "saveSuccess": "Salvo com sucesso", - "saveFailed": "Falha ao salvar", - "createSuccess": "Criado com sucesso", - "createFailed": "Falha ao criar", - "updateSuccess": "Atualizado com sucesso", - "updateFailed": "Falha na atualização", - "continue": "Continuar", - "deleting": "Excluindo...", - "accountDeleted": "Conta Excluída", - "accountDeletedDesc": "A conta foi excluída com sucesso.", - "accountDeleteFailed": "Falha ao Excluir Conta", - "deleteAccountPermanently": "Excluir Conta Permanentemente", - "youAreDeleting": "Você está excluindo {{email}}. Isso removerá permanentemente:", - "accountCredentials": "Credenciais e configurações da conta", - "localCachedMetadata": "Metadados em cache local e status de sincronização", - "imapSyncData": "Dados de sincronização IMAP", - "oauthTokens": "Tokens OAuth e credenciais de API", - "typeEmailToConfirm": "Digite o endereço de email da conta para confirmar:", - "typeToConfirm": "Digite \"{{email}}\" para confirmar", - "cannotBeUndone": "Esta ação não pode ser desfeita!", - "allResourcesErased": "Todos os recursos relacionados serão permanentemente apagados.", - "permanentlyDeleteAccount": "Excluir Conta Permanentemente" + "tryAgain": "Tentar novamente", + "update": "Atualizar", + "view_on_github_button": "Ver no GitHub", + "yes": "Sim" + }, + "dashboard": { + "account": "Conta", + "actualDiskUsage": "Uso Real do Disco", + "attachmentRatio": "Taxa de Anexos", + "attachmentRatioDesc": "{{percent}}% dos seus emails têm anexos", + "attachments": "Anexos", + "byMessageCount": "Por Contagem de Mensagens", + "byMessageSize": "Por Tamanho da Mensagem", + "connected": "Conectado", + "count": "Contagem", + "dataStorage": "Armazenamento", + "dayTrend": "Tendência de 30 Dias", + "efficiency": "Eficiência", + "emails": "Emails", + "indexSize": "Tamanho índice", + "localDataFiles": "Arquivos de Dados Locais", + "logicalVolume": "Tamanho original", + "mailAccounts": "Contas de Email", + "messageDistribution": "Distribuição de Mensagens", + "metadataSize": "Tamanho dos metadatos", + "newEmails": "Novos Emails", + "noAccountData": "Sem Dados de Contas", + "noAttachments": "Sem Anexos", + "noEmailsSynced": "Nenhum email sincronizado ainda", + "noLargeEmails": "Sem Emails Grandes", + "noRecentActivity": "Nenhuma Atividade Recente", + "noSendersData": "Sem Dados de Remetentes", + "noSubject": "(Sem Assunto)", + "saved": "Economizado", + "sender": "Remetente", + "size": "Tamanho", + "subject": "Assunto", + "syncedLocally": "Sincronizado Localmente", + "systemVersion": "Versão do sistema", + "tantivyDatabase": "Baseado no motor de busca Tantivy", + "title": "Painel", + "top10Accounts": "Top 10 Contas", + "top10LargestEmails": "Top 10 Maiores Emails", + "top10Senders": "Top 10 Remetentes", + "topLists": "Principais Listas", + "totalEmailSize": "Tamanho Total do Email", + "totalEmails": "Total de Emails", + "withAttachments": "Com Anexos" + }, + "dialogs": { + "accountCredentials": "Credenciais e configurações da conta", + "accountDeleteFailed": "Falha ao Excluir Conta", + "accountDeleted": "Conta Excluída", + "accountDeletedDesc": "A conta foi excluída com sucesso.", + "allResourcesErased": "Todos os recursos relacionados serão permanentemente apagados.", + "cannotBeUndone": "Esta ação não pode ser desfeita!", + "confirmDelete": "Confirmar Exclusão", + "confirmDeleteDesc": "Tem certeza que deseja excluir este item? Esta ação não pode ser desfeita.", + "continue": "Continuar", + "createFailed": "Falha ao criar", + "createSuccess": "Criado com sucesso", + "deleteAccountPermanently": "Excluir Conta Permanentemente", + "deleteFailed": "Falha na exclusão", + "deleteSuccess": "Excluído com sucesso", + "deleting": "Excluindo...", + "imapSyncData": "Dados de sincronização IMAP", + "localCachedMetadata": "Metadados em cache local e status de sincronização", + "oauthTokens": "Tokens OAuth e credenciais de API", + "permanentlyDeleteAccount": "Excluir Conta Permanentemente", + "saveFailed": "Falha ao salvar", + "saveSuccess": "Salvo com sucesso", + "typeEmailToConfirm": "Digite o endereço de email da conta para confirmar:", + "typeToConfirm": "Digite \"{{email}}\" para confirmar", + "updateFailed": "Falha na atualização", + "updateSuccess": "Atualizado com sucesso", + "youAreDeleting": "Você está excluindo {{email}}. Isso removerá permanentemente:" + }, + "errors": { + "contentNotModified": "Conteúdo não modificado!", + "forbidden": "Proibido", + "forbiddenDesc": "Você não tem as permissões necessárias para visualizar este recurso.", + "forbiddenTitle": "Acesso Proibido", + "internalServerError": "Erro interno do servidor!", + "learnMore": "Saiba Mais", + "maintenance": "Manutenção", + "maintenanceDesc": "O site está temporariamente indisponível. Voltaremos em breve.", + "maintenanceTitle": "O site está em manutenção!", + "networkError": "Erro de Rede", + "networkErrorDesc": "Não foi possível conectar ao servidor. Por favor, verifique sua conexão com a internet e tente novamente.", + "pageNotFound": "Ops! Página não encontrada!", + "pageNotFoundDesc": "A página que você está procurando pode não existir ou foi removida.", + "somethingWentWrong": "Ops! Algo deu errado :')", + "somethingWentWrongDesc": "Lamentamos o inconveniente, por favor, tente novamente mais tarde.", + "unauthorized": "Não Autorizado", + "unauthorizedDesc": "Por favor, faça login com as credenciais apropriadas para acessar este recurso.", + "unauthorizedTitle": "Acesso Não Autorizado" + }, + "mail": { + "account": "Conta", + "attachments": "Anexos", + "bcc": "BCC", + "cc": "CC", + "date": "Data", + "delete": "Excluir", + "download": "Baixar", + "downloadComplete": "Download concluído", + "downloadFailed": "Falha no download", + "downloadStarted": "Download iniciado", + "downloaded": "{{id}} baixado", + "emailViewer": "Visualizador de Email", + "failedToDownloadFile": "Falha ao baixar arquivo", + "failedToLoadEmail": "Falha ao carregar a mensagem de email.", + "from": "De", + "id": "ID", + "isBeingDownloaded": "Baixando {{id}}", + "noAttachments": "Sem anexos", + "noMessageSelected": "Nenhuma mensagem selecionada", + "noTagsYet": "Nenhuma tag ainda", + "onlyNonInlineAttachments": "Apenas anexos não incorporados são exibidos aqui.", + "showLess": "mostrar menos", + "showMore": "mostrar mais...", + "subject": "Assunto", + "tags": "Tags", + "to": "Para", + "viewThread": "Ver Tópico" + }, + "mailbox": { + "bulkActions": { + "ariaLabel": "Ações em massa para {{count}} {{emailLabel}} selecionados", + "clearSelection": "Limpar Seleção", + "clearSelectionWithKey": "Limpar Seleção ({{key}})", + "delete": "Excluir", + "deleteTooltip": "Excluir emails selecionados", + "email": "email", + "emails": "emails", + "selected": "Selecionados" }, - "command": { - "typeCommandOrSearch": "Digite o comando ou pesquisa...", - "noResultsFound": "Nenhum resultado encontrado.", - "theme": "Tema", - "light": "Claro", - "dark": "Escuro" + "deleteDialog": { + "confirm": "Excluir", + "desc": "Tem certeza que deseja excluir {{countText}}? Esta ação removerá permanentemente o(s) email(s) selecionado(s) do banco de dados local. Os emails serão permanentemente perdidos e não poderão ser recuperados.", + "descCountMultiple": "estes {{count}} emails", + "descCountSingle": "este email", + "errorTitle": "Falha ao excluir mensagem", + "successDesc": "A mensagem foi excluída.", + "successTitle": "Mensagem excluída com sucesso", + "title": "Excluir Email", + "warningDesc": "Tenha cuidado antes de prosseguir.", + "warningTitle": "Aviso!" + }, + "deleteMailboxDialog": { + "confirm": "Excluir permanentemente", + "desc": "Tem certeza de que deseja excluir esta pasta de correio? Esta ação não pode ser desfeita.", + "errorTitle": "Falha ao excluir", + "successDesc": "A pasta de correio e seu conteúdo foram removidos com sucesso.", + "successTitle": "Excluído com sucesso", + "title": "Excluir pasta de correio", + "warningDesc": "A exclusão desta pasta também removerá permanentemente todos os e-mails arquivados e subpastas nela contidos.", + "warningTitle": "Aviso" + }, + "folders": "Pastas", + "messages": "Mensagens", + "noMessages": "Sem mensagens", + "selectFolder": "Selecione uma pasta para visualizar as mensagens", + "thread": { + "empty": "Não há mensagens neste tópico.", + "invalidDate": "Data Inválida", + "loadError": "Falha ao carregar o tópico", + "loadMore": "Carregar Mais", + "loadingMore": "Carregando mais...", + "message": "Mensagem", + "messages": "Mensagens", + "noSubject": "(Sem Assunto)", + "title": "Tópico ({{count}} {{messageLabel}})" + }, + "title": "Caixa de Entrada" + }, + "navigation": { + "accessTokens": "Tokens de Acesso", + "accounts": "Contas", + "apiDocs": "Documentação da API", + "attachment": "Anexos", + "auth": "Autenticação", + "dashboard": "Painel", + "general": "Geral", + "home": "Início", + "mailbox": "Caixa de Entrada", + "oauth2": "OAuth2", + "other": "Outro", + "settings": "Configurações", + "users": "Usuários do sistema" + }, + "oauth2": { + "aSecretKeyProvidedByTheOAuthProvider": "Uma chave secreta fornecida pelo provedor OAuth para autenticar sua aplicação.", + "actions": { + "authorize": "Autorizar", + "delete": "Excluir", + "edit": "Editar", + "openMenu": "Abrir Menu" + }, + "addConfiguration": "Adicionar Configuração", + "addExtraParams": "Adicionar Parâmetros Extras", + "addNew": "Adicionar Novo", + "addScope": "Adicionar Escopo", + "areYouSureYouWantTo": "Tem certeza que deseja {{action}} este Cliente OAuth2?", + "areYouSureYouWantToDelete": "Tem certeza que deseja excluir", + "authAtatus": "Status de Autenticação OAuth2", + "authFailed": "Falha na Autenticação OAuth2", + "authSuccess": "Autenticação OAuth2 Bem-Sucedida", + "authUrlLabel": "URL de Autorização:", + "authorizationUrlCannotBeEmpty": "A URL de Autorização não pode estar vazia", + "authorizationUrlIsRequired": "A URL de Autorização é obrigatória", + "authorize": "Autorizar", + "authorizeAnEmailAccountToStartTheOAuth2AuthorizationProcess": "Autorize uma conta de email para iniciar o processo de Autorização OAuth2.", + "authorizeEmailAccount": "Autorizar Conta de Email", + "backToLogin": "Voltar ao Login", + "clickSaveWhenDone": "Clique em 'Salvar' quando terminar.", + "clientId": "ID do Cliente", + "clientIdCannotBeEmpty": "O ID do Cliente não pode estar vazio", + "clientIdIsRequired": "O ID do Cliente é obrigatório", + "clientIdLabel": "ID do Cliente:", + "clientSecret": "Segredo do Cliente", + "clientSecretCannotBeEmpty": "O Segredo do Cliente não pode estar vazio", + "clientSecretIsRequired": "O Segredo do Cliente é obrigatório", + "clientSecretLabel": "Segredo do Cliente:", + "createAccount": "Criar Conta", + "createNewHere": "Crie um novo aqui.", + "created": "Criado", + "creating": "Criando...", + "creationFailed": "Falha na Criação", + "delete": "Excluir", + "deleteFailed": "Falha na exclusão, por favor, tente novamente mais tarde", + "deleteSuccess": "Exclusão Bem-Sucedida", + "deleteToken": "Excluir Token", + "describeThePurposeOfTheOauth2Application": "Descreva o propósito da aplicação OAuth2", + "description": "Lida automaticamente com a recuperação, armazenamento e renovação de tokens de acesso, garantindo uma experiência de autenticação contínua e sempre disponível.", + "descriptionLabel": "Descrição:", + "descriptionMustNotExceed255Characters": "A descrição não pode exceder 255 caracteres.", + "disable": "Desativar", + "disableOAuth2Client": "Desativar Cliente OAuth2", + "disabled": "Desativado", + "edit": "Editar", + "enable": "Ativar", + "enableOAuth2Client": "Ativar Cliente OAuth2", + "enabled": "Ativo", + "enterIdToConfirmDeletion": "Insira o ID para confirmar a exclusão.", + "enterTheAuthorizationUrl": "Insira a URL de Autorização", + "enterTheKeyHere": "Insira a chave aqui.", + "enterTheScopeHere": "Insira o escopo aqui.", + "enterTheTokenUrl": "Insira a URL do Token", + "enterTheValueHere": "Insira o valor aqui.", + "enterYourClientId": "Insira seu ID de Cliente", + "enterYourClientSecret": "Insira seu Segredo do Cliente", + "enterYourRedirectUrl": "Insira seu URI de Redirecionamento", + "error": "Erro", + "getAuthorizeUrlFailed": "Falha ao Obter URL de Autorização", + "getAuthorizeUrlFailedDesc": "Falha ao obter URL de autorização, por favor, tente novamente mais tarde", + "gmail": "Gmail", + "goHome": "Ir para o Início", + "goToAccounts": "Ir para Contas", + "id": "ID", + "information": "Informação", + "invalidAuthorizationUrlFormat": "Formato de URL de Autorização inválido", + "invalidRedirectUriFormat": "Formato de URI de Redirecionamento inválido", + "invalidTokenUrlFormat": "Formato de URL do Token inválido", + "key": "Chave:", + "keyCannotBeEmpty": "A chave não pode estar vazia", + "keyIsRequired": "A chave é obrigatória", + "leaveEmptyToKeepExistingSecret": "Deixe vazio para manter o segredo existente", + "leaveEmptyToKeepTheExistingSecret": "Deixe vazio para manter o segredo existente. Insira um novo valor apenas se estiver atualizando.", + "loadingAccounts": "Carregando contas...", + "noConfigurations": "Nenhuma Configuração OAuth2", + "noConfigurationsDesc": "Você ainda não adicionou nenhuma configuração OAuth2. Adicione uma para utilizar a funcionalidade.", + "noEmailAccountsRegistered": "Nenhuma conta de email registrada. Por favor, crie uma.", + "noProxyAvailable": "Nenhum Proxy disponível", + "noStatus": "Esta página exibe o resultado da autenticação OAuth2. Nenhum status específico está disponível no momento. Por favor, tente novamente se necessário.", + "oauth2ClientHasBeenSuccessfully": "O Cliente OAuth2 foi {{action}} com sucesso.", + "oauth2ClientUpdated": "Cliente OAuth2 Atualizado", + "oauth2DeleteFailed": "Falha ao Excluir OAuth2", + "optional": "Opcional", + "outlook": "Outlook", + "pleaseBeCareful": "Por favor, tenha cuidado, esta ação é irreversível.", + "pleaseCreateOne": "Por favor, crie uma.", + "provider": "Provedor", + "quickPresets": "Predefinições Rápidas:", + "redirectUri": "URI de Redirecionamento", + "redirectUriCannotBeEmpty": "O URI de Redirecionamento não pode estar vazio", + "redirectUriIsRequired": "O URI de Redirecionamento é obrigatório", + "redirectUrlLabel": "URI de Redirecionamento:", + "save": "Salvar", + "saveChanges": "Salvar Alterações", + "saving": "Salvando...", + "scope": "Escopo:", + "scopes": "Escopos", + "selectAProxy": "Selecionar um Proxy", + "selectAnAccount": "Selecionar uma Conta", + "status": "Status", + "statusUpdateFailed": "Falha ao atualizar status, por favor, tente novamente mais tarde", + "success": "Sucesso", + "successMessage": "A conta de email foi autenticada com sucesso via OAuth2. O token de acesso foi armazenado no sistema e será renovado automaticamente conforme necessário.", + "theRedirectUrlAfterAuthorization": "O URI de redirecionamento após a autorização. Deve corresponder ao registrado no provedor OAuth. Use o formato http://[host]:[port]/oauth2/callback (ou https://) onde [host] e [port] devem corresponder à sua implantação do RustMailer. O caminho `/oauth2/callback` é fixo.", + "theUniqueIdentifierForYourApplication": "O identificador único para sua aplicação fornecido pelo provedor OAuth.", + "theUrlUsedToExchange": "O URL usado para trocar o código de autorização por um token de acesso.", + "theUrlWhereUsersWillBeRedirected": "O URL para onde os usuários serão redirecionados para autorização.", + "thisActionWillPermanentlyRemoveTheOauth2Record": "Esta ação removerá permanentemente o registro OAuth2 do sistema. Isso não pode ser desfeito.", + "thisWillPreventTheOAuth2ClientFromBeingUsed": "Isso impedirá que o Cliente OAuth2 seja usado.", + "title": "OAuth2", + "tokenUrlCannotBeEmpty": "A URL do Token não pode estar vazia", + "tokenUrlIsRequired": "A URL do Token é obrigatória", + "tokenUrlLabel": "URL do Token:", + "tryAgain": "Tentar Novamente", + "unknownError": "Um erro desconhecido ocorreu.", + "updateFailed": "Falha na Atualização", + "updateHere": "Atualize aqui.", + "updateOrCreationFailed": "Falha ao {{action}}, por favor, tente novamente mais tarde", + "updated": "Atualizado", + "useProxyOptional": "Usar Proxy (Opcional):", + "useSocks5ProxyForOAuthRequests": "Usar proxy SOCKS5 para solicitações OAuth caso o acesso direto seja bloqueado.", + "value": "Valor:", + "valueCannotBeEmpty": "O valor não pode estar vazio", + "valueIsRequired": "O valor é obrigatório", + "warning": "Aviso!", + "whenDisabled": "Quando Desativado: - Novos fluxos de autorização serão imediatamente rejeitados - Tokens de acesso e de atualização existentes serão revogados em 1 minuto - Usuários precisarão reautorizar quando reativado", + "yourOAuth2ApplicationHasBeenSuccessfully": "Sua aplicação OAuth2 foi {{action}} com sucesso.", + "yourOAuth2ApplicationHasBeenSuccessfullyDeleted": "Sua aplicação OAuth2 foi excluída com sucesso." + }, + "permission": { + "account": { + "create": "Criar contas de e-mail", + "manage": "Gerenciar contas atribuídas", + "manage_all": "Gerenciar todas as configurações de contas", + "read_details": "Visualizar detalhes da conta" + }, + "category": { + "account": "Permissões da conta", + "global_data": "Dados globais (Admin)", + "system_identity": "Sistema e identidade" + }, + "data": { + "delete": "Excluir e-mails atribuídos", + "delete_all": "Excluir e-mails de todas as contas", + "export_batch": "Exportar dados atribuídos em lote", + "export_batch_all": "Exportar todos os dados em lote", + "import_batch": "Importar dados de e-mail em lote", + "manage": "Gerenciar metadados de e-mail atribuídos", + "manage_all": "Gerenciar todos os metadados de e-mail", + "raw_download": "Baixar e-mails brutos atribuídos", + "raw_download_all": "Baixar todos os e-mails brutos", + "read": "Ler dados de e-mail atribuídos", + "read_all": "Ler todos os dados de e-mail", + "smtp_ingest": "Ingerir e-mails via protocolo SMTP" + }, + "dialog": { + "account_description": "Permissões limitadas à conta selecionada.", + "account_title": "Permissões da conta", + "global_description": "Permissões de sistema concedidas a este usuário.", + "global_title": "Permissões globais" + }, + "scope": { + "account": "Conta #{{id}}", + "global": "Global" + }, + "system": { + "access": "Acesso básico ao sistema", + "root": "Controle total do sistema" + }, + "token": { + "manage": "Gerenciar tokens de acesso" + }, + "user": { + "manage": "Gerenciar todos os usuários", + "view": "Visualizar nomes de usuário básicos" + } + }, + "profile": { + "avatar_alt": "Avatar", + "menu": { + "profile": "Perfil", + "settings": "Configurações", + "sign_out": "Sair" + } + }, + "proxyDelete": { + "close": "Fechar", + "confirmText": "Tem certeza que deseja excluir", + "deleteBtn": "Excluir", + "failedDesc": "Falha na exclusão, por favor, tente novamente mais tarde", + "failedTitle": "Falha ao Excluir Proxy", + "permanent": "Esta ação removerá permanentemente o Proxy do sistema. Isso não pode ser desfeito.", + "proxyIdLabel": "ID do Proxy:", + "proxyIdPlaceholder": "Insira o ID do Proxy para confirmar a exclusão.", + "successDesc": "O Proxy foi excluído com sucesso.", + "successTitle": "Exclusão Bem-Sucedida", + "title": "Excluir Proxy", + "tryAgain": "Tentar Novamente", + "warningDesc": "Por favor, tenha cuidado, esta ação é irreversível.", + "warningTitle": "Aviso!" + }, + "restore_message": { + "accountsInvolved": "Contas envolvidas", + "bulkTitle": "Restaurar múltiplas mensagens", + "bulkWarning": "Nota: As mensagens serão restauradas nas suas pastas originais.", + "confirm": "Executar restauração", + "desc": "Esta ação irá recarregar as mensagens selecionadas do Bichon e restaurá-las nas pastas correspondentes no servidor IMAP.", + "failed": "Falha ao restaurar", + "failedTitle": "Falha na restauração", + "messages": "mensagens", + "restore_to_imap": "Restaurar mensagem", + "success": "Restauração bem-sucedida", + "successDesc": "As mensagens selecionadas foram restauradas com sucesso no servidor IMAP.", + "summary": "Detalhes da restauração", + "title": "Restaurar mensagem individual" + }, + "roles": { + "actions": { + "add": "Adicionar função", + "cancel": "Cancelar", + "close": "Fechar", + "failed": "A operação falhou", + "retry": "Tentar novamente", + "submit_create": "Criar função", + "submit_update": "Atualizar função", + "success_create": "Função criada com sucesso", + "success_update": "Função atualizada com sucesso" + }, + "categories": { + "account_resource": "Acesso a recursos de conta", + "global_data": "Acesso a dados globais", + "identity": "Identidade e Gestão" + }, + "columns": { + "created_at": "Criado em", + "id": "ID", + "name": "Nome", + "permissions": "Permissões", + "role_type": "Tipo", + "updated_at": "Atualizado em" + }, + "delete": { + "alert_desc": "Excluir esta função a removerá de todos os usuários atribuídos.", + "alert_title": "Aviso: ação permanente.", + "confirm_btn": "Excluir função", + "confirm_label": "Digite o ID da função para confirmar:", + "deleting": "Excluindo...", + "dialog_title": "Excluir função", + "error_fallback": "Não foi possível excluir a função.", + "error_title": "Falha ao excluir", + "irreversible": "Esta ação não pode ser desfeita.", + "placeholder": "Digite \"{{id}}\"", + "success_desc": "A função \"{{name}}\" foi removida.", + "success_title": "Função excluída", + "warning_text": "Você está excluindo a função {{name}} (ID: {{id}}) permanentemente." + }, + "description_hint": "Defina o escopo de acesso e permissões.", + "details": { + "close_btn": "Fechar", + "desc_account": "Operações de dados em contas individuais.", + "desc_global": "Gestão global e acesso ao sistema.", + "role_badge": "Função {{type}}", + "title": "Permissões: {{name}}", + "unknown": "Função desconhecida", + "view_permissions": "Ver detalhes" + }, + "empty": { + "desc": "Você ainda não criou funções personalizadas.", + "title": "Nenhuma função encontrada" + }, + "form": { + "builtin_badge": "Função integrada", + "builtin_desc": "Esta função é predefinida e somente leitura.", + "desc_label": "Descrição", + "matrix_label": "Matriz de permissões ({{type}})", + "name_label": "Nome da função", + "type_label": "Tipo de função" + }, + "placeholder": { + "filter": "Buscar funções..." + }, + "title": { + "create": "Criar nova função", + "edit": "Editar função: {{name}}" + }, + "types": { + "Account": "Conta", + "Global": "Global" }, "validation": { - "required": "Este campo é obrigatório", - "invalidEmail": "Endereço de email inválido", - "invalidUrl": "URL inválido", - "passwordMinLength": "A senha deve ter pelo menos {{min}} caracteres", - "pleaseEnterPassword": "Por favor, insira a senha", - "passwordRequired": "A senha é obrigatória se o método de autenticação for Senha", - "emailRequired": "O endereço de email é obrigatório", - "imapHostRequired": "O Host IMAP é obrigatório", - "imapHostCannotBeEmpty": "O Host IMAP não pode estar vazio", - "imapPortMustBePositive": "A Porta IMAP deve ser um número inteiro positivo", - "imapPortMustBeLessThan65536": "A Porta IMAP deve ser menor que 65536", - "folderLimitMustBeNumber": "O Limite de Pasta deve ser um número", - "folderLimitMustBeAtLeast100": "O Limite de Pasta deve ser pelo menos 100", - "incrementalSyncMustBeNumber": "O Intervalo de Sincronização Incremental deve ser um número", - "incrementalSyncMustBeAtLeast10": "O Intervalo de Sincronização Incremental deve ser de pelo menos 10 minutos", - "pleaseEnterUsernameOrEmail": "Por favor, digite seu nome de usuário ou e-mail", - "singleRequestBatchSizeMustBeNumber": "O tamanho do lote deve ser um número", - "singleRequestBatchSizeTooSmall": "O tamanho do lote deve ser pelo menos 10", - "singleRequestBatchSizeTooLarge": "O tamanho do lote deve ser no máximo 200" - }, - "table": { - "noResults": "Nenhum resultado encontrado", - "loading": "Carregando...", - "page": "Página", - "of": "de", - "rowsPerPage": "Linhas por página", - "showing": "Mostrando", - "to": "a", - "results": "resultados", - "asc": "Asc", - "desc": "Desc", - "hide": "Ocultar", - "edit": "Editar", - "delete": "Excluir", - "pagination": { - "selected": "{{selected}} de {{total}} linha(s) selecionada(s).", - "fixed_page_size": "{{size}} linhas por página.", - "rows_per_page": "Linhas por página", - "page_info": "Página {{page}} de {{total}}", - "first": "Primeira página", - "previous": "Página anterior", - "next": "Próxima página", - "last": "Última página" - } - }, - "proxyDelete": { - "title": "Excluir Proxy", - "successTitle": "Exclusão Bem-Sucedida", - "successDesc": "O Proxy foi excluído com sucesso.", - "close": "Fechar", - "failedTitle": "Falha ao Excluir Proxy", - "failedDesc": "Falha na exclusão, por favor, tente novamente mais tarde", - "tryAgain": "Tentar Novamente", - "confirmText": "Tem certeza que deseja excluir", - "permanent": "Esta ação removerá permanentemente o Proxy do sistema. Isso não pode ser desfeito.", - "proxyIdLabel": "ID do Proxy:", - "proxyIdPlaceholder": "Insira o ID do Proxy para confirmar a exclusão.", - "warningTitle": "Aviso!", - "warningDesc": "Por favor, tenha cuidado, esta ação é irreversível.", - "deleteBtn": "Excluir" - }, - "systemConfig": { - "pageTitle": "Configurações a nível de sistema", - "pageDescription": "Estes parâmetros são inicializados via flags CLI ou variáveis de ambiente. Estão em modo somente leitura.", - "status": { - "enabled": "Ativado", - "disabled": "Desativado", - "configured": "Configurado", - "missing": "Em falta", - "auto": "Auto", - "notSet": "Não definido" - }, - "sections": { - "network": { - "title": "Rede", - "desc": "HTTP e acesso público" - }, - "cors": { - "title": "CORS", - "desc": "Regras de acesso cross-origin" - }, - "logging": { - "title": "Logging", - "desc": "Comportamento de saída de logs" - }, - "storage": { - "title": "Armazenamento e Cache", - "desc": "Caminhos de base de dados e limites" - }, - "security": { - "title": "Segurança", - "desc": "Autenticação e criptografia" - }, - "performance": { - "title": "Desempenho", - "desc": "Concorrência e compressão" - }, - "smtp": { - "title": "Servidor SMTP", - "desc": "Configurações de recepção de e-mail de entrada para arquivamento em tempo real" - } - } - }, - "apiTokens": { - "page": { - "loadError": "Errore ao carregar os tokens API.", - "emptyTitle": "Nenhum token API", - "emptyDescription": "Ainda não criou nenhum token API. Clique abaixo para criar um.", - "addBtn": "Adicionar token" - }, - "list": { - "unnamedToken": "Token sem nome", - "statusActive": "Ativo", - "statusExpired": "Expirado", - "neverExpires": "Nunca expira", - "expiresOnShort": "Expira em {{date}}", - "tokenLabel": "Token", - "createdLabel": "Criado em", - "lastUsedLabel": "Último uso", - "expiresOnLabel": "Expira em", - "neverUsed": "Nunca", - "neverLabel": "Nunca", - "deleteBtn": "Eliminar token" - }, - "dialog": { - "createTitle": "Criar token de acesso", - "editTitle": "Editar token de acesso", - "description": "Clique em guardar quando terminar.", - "save": "Guardar", - "saveChanges": "Guardar alterações" - }, - "deleteDialog": { - "title": "Eliminar token de acesso?", - "description": "Esta ação não pode ser desfeita. Qualquer aplicação que utilize este token perderá imediatamente o acesso.", - "cancel": "Cancelar", - "confirm": "Eliminar", - "deleting": "A eliminar..." - }, - "form": { - "nameLabel": "Nome", - "namePlaceholder": "Dê um nome curto a este token", - "nameDescription": "Opcional · Máx. 32 caracteres", - "expirationLabel": "Expiração", - "expirationPlaceholder": "Selecionar expiração", - "expirationDescription": "Os tokens expirarão automaticamente após o tempo selecionado.", - "never": "Nunca", - "1day": "1 dia", - "7days": "7 dias", - "30days": "30 dias", - "errorMax": "Máximo 32 caracteres", - "errorNumber": "Deve ser um número", - "errorInt": "Deve ser um número inteiro", - "errorPositive": "Deve ser maior que 0" - }, - "notifications": { - "createSuccess": "Token criado", - "createSuccessDesc": "O token de acesso foi criado com sucesso.", - "updateSuccess": "Token atualizado", - "updateSuccessDesc": "O token de acesso foi atualizado com sucesso.", - "createFailed": "Falha na criação", - "updateFailed": "Falha na atualização", - "deleteSuccess": "Token eliminado", - "deleteFailed": "Falha ao eliminar", - "copied": "Copiado", - "genericError": "A operação falhou. Tente novamente.", - "close": "Fechar", - "tryAgain": "Tentar novamente" - } - }, - "permission": { - "scope": { - "global": "Global", - "account": "Conta #{{id}}" - }, - "dialog": { - "global_title": "Permissões globais", - "account_title": "Permissões da conta", - "global_description": "Permissões de sistema concedidas a este usuário.", - "account_description": "Permissões limitadas à conta selecionada." - }, - "category": { - "system_identity": "Sistema e identidade", - "global_data": "Dados globais (Admin)", - "account": "Permissões da conta" - }, - "system": { - "access": "Acesso básico ao sistema", - "root": "Controle total do sistema" - }, - "user": { - "manage": "Gerenciar todos os usuários", - "view": "Visualizar nomes de usuário básicos" - }, - "token": { - "manage": "Gerenciar tokens de acesso" - }, - "account": { - "create": "Criar contas de e-mail", - "manage": "Gerenciar contas atribuídas", - "manage_all": "Gerenciar todas as configurações de contas", - "read_details": "Visualizar detalhes da conta" - }, - "data": { - "read": "Ler dados de e-mail atribuídos", - "read_all": "Ler todos os dados de e-mail", - "manage": "Gerenciar metadados de e-mail atribuídos", - "manage_all": "Gerenciar todos os metadados de e-mail", - "raw_download": "Baixar e-mails brutos atribuídos", - "raw_download_all": "Baixar todos os e-mails brutos", - "delete": "Excluir e-mails atribuídos", - "delete_all": "Excluir e-mails de todas as contas", - "export_batch": "Exportar dados atribuídos em lote", - "export_batch_all": "Exportar todos os dados em lote", - "import_batch": "Importar dados de e-mail em lote", - "smtp_ingest": "Ingerir e-mails via protocolo SMTP" - } - }, - "users": { - "columns": { - "id": "ID", - "avatar": "Avatar", - "username": "Nome de usuário", - "email": "E-mail", - "roles": "Funções e permissões", - "created_at": "Criado em", - "updated_at": "Atualizado em", - "actions": "Ações" - }, - "buttons": { - "add": "Adicionar usuário", - "add_new": "Novo usuário" - }, - "empty": { - "title": "Nenhum usuário encontrado", - "description": "Clique no botão abaixo para adicionar seu primeiro usuário." - }, - "nav": { - "users": "Usuários", - "roles": "Funções", - "api_tokens": "Tokens de API" - }, - "api_tokens": { - "empty": { - "title": "Nenhum token de API encontrado", - "description": "Nenhum token de API foi gerado no sistema ainda." - }, - "button": { - "generate": "Gerar novo token" - }, - "toolbar": { - "search_placeholder": "Buscar por nome, proprietário ou token..." - }, - "table": { - "name": "Nome", - "type": "Tipo", - "last_used": "Último uso", - "expires_at": "Expira em", - "owner": "Proprietário", - "created": "Criado", - "api_key": "Chave API", - "web_ui": "Interface Web", - "never": "Nunca", - "permanent": "Permanente", - "expired": "Expirado", - "unnamed": "Token sem nome" - }, - "unnamed": "Token sem nome", - "delete": { - "title": "Excluir token de API", - "desc": "Você está prestes a excluir permanentemente este token de API", - "prefix": "Prefixo do token", - "irreversible": "Esta ação não pode ser desfeita. Quaisquer aplicativos que usem este token perderão o acesso imediatamente.", - "confirm_label": "Para confirmar, digite {{word}} abaixo:", - "confirm_placeholder": "Digite \"{{word}}\" para confirmar", - "warning_title": "Aviso", - "warning_desc": "Quaisquer scripts ou serviços que usem este token falharão. Certifique-se de atualizar seus sistemas.", - "confirm_button": "Excluir token", - "deleting": "Excluindo..." - }, - "toast": { - "deleted_title": "Token de API excluído", - "deleted_desc": "O token \"{{name}}\" foi removido com sucesso.", - "delete_failed_title": "Falha ao excluir", - "delete_failed": "Não foi possível excluir o token, tente novamente." - } - }, - "tokens": { - "schema": { - "name_max": "Máx. 32 caracteres", - "expire_number": "Deve ser um número", - "expire_int": "Deve ser um número inteiro", - "expire_positive": "Deve ser maior que 0" - }, - "toast": { - "update_success_title": "Token atualizado", - "update_success_desc": "O token de acesso foi atualizado com sucesso.", - "create_success_title": "Token criado", - "create_success_desc": "O token de acesso foi criado com sucesso.", - "update_failed_title": "Falha na atualização", - "create_failed_title": "Falha na criação" - }, - "error": { - "fallback": "A operação falhou, tente novamente mais tarde." - }, - "dialog": { - "edit_title": "Editar token de acesso", - "create_title": "Criar token de acesso", - "description": "Clique em salvar quando terminar." - }, - "fields": { - "name_label": "Nome", - "name_placeholder": "Dê um nome curto ao token", - "name_hint": "Opcional · Máx. 32 caracteres", - "expire_label": "Expiração", - "expire_placeholder": "Escolha a expiração", - "expire_hint": "O token expirará automaticamente após o tempo selecionado." - }, - "expire_options": { - "never": "Nunca expira", - "1_day": "1 dia", - "7_days": "7 dias", - "30_days": "30 dias" - } - }, - "tokens_action": { - "dialog": { - "title": "Tokens de API", - "description": "Gerenciar tokens de API para este usuário." - }, - "empty": { - "title": "Sem tokens de API", - "description": "Este usuário não possui tokens de API no momento." - }, - "buttons": { - "add": "Adicionar token" - }, - "list": { - "unnamed_token": "Token sem nome", - "status_expired": "Expirado", - "status_active": "Ativo", - "expires_on_brief": "Expira em {{date}}", - "never_expires": "Nunca expira", - "label_token": "Token", - "label_created": "Criado em", - "label_last_used": "Último uso", - "label_expires_at": "Expira em", - "never": "Nunca", - "button_delete": "Excluir token" - }, - "delete_dialog": { - "title": "Excluir token de acesso?", - "description": "Esta ação não pode ser desfeita." - } - }, - "actions": { - "schema": { - "account_required": "Selecione uma conta", - "role_required": "Selecione uma função", - "username_required": "Nome de usuário é obrigatório", - "username_min": "Mínimo 3 caracteres", - "username_max": "Máximo 32 caracteres", - "email_required": "E-mail é obrigatório", - "email_invalid": "Insira um e-mail válido", - "global_role_required": "Atribua pelo menos uma função global", - "description_max": "Máximo 256 caracteres na descrição", - "ip_invalid": "IP inválido detectado", - "password_required": "Senha é obrigatória", - "password_min": "Mínimo 8 caracteres", - "password_max": "Máximo 256 caracteres" - }, - "toast": { - "updated": "Usuário atualizado", - "created": "Usuário criado" - }, - "dialog": { - "edit_title": "Editar usuário: {{name}}", - "create_title": "Criar novo usuário", - "subtitle": "Configure identidade, níveis de acesso e segurança." - }, - "tabs": { - "general": "Geral", - "permissions": "Permissões de conta", - "security": "Segurança e ACL" - }, - "sections": { - "basic": "Identidade básica", - "global": "Permissões globais", - "mail_access": "Controle de acesso de e-mail", - "mail_access_subtitle": "Contas de e-mail que este usuário pode gerenciar.", - "policy": "Políticas" - }, - "fields": { - "username": "Nome de usuário", - "username_hint": "Identificador exclusivo para login.", - "email": "E-mail", - "email_hint": "Contato principal e notificações.", - "password": "Senha", - "password_placeholder_create": "Mínimo 8 caracteres", - "password_placeholder_edit": "Deixe em branco para manter a atual", - "password_hint_create": "Senha segura para configuração inicial.", - "password_hint_edit": "Insira apenas se desejar alterar.", - "global_roles_hint": "Atribua permissões de sistema.", - "description": "Descrição (opcional)", - "description_placeholder": "Notas sobre este usuário...", - "description_hint": "Notas internas (máx. 256 caracteres).", - "select_account": "Escolher conta", - "assign_role": "Atribuir função", - "ip_whitelist": "Lista branca de IP", - "ip_whitelist_hint": "Restringir login a estes IPs (um por linha).", - "rate_quota": "Cota de taxa", - "burst_interval": "Intervalo de burst (seg)" - }, - "buttons": { - "add_account": "Adicionar conta", - "update": "Atualizar usuário", - "create": "Criar usuário" - }, - "states": { - "full_access": "Modo de acesso total", - "full_access_desc": "Administradores têm acesso inerente a todas as contas.", - "no_accounts": "Nenhuma conta específica atribuída.", - "security_disabled": "Políticas de segurança desativadas." - }, - "api_tokens": "Tokens de API", - "placeholder": { - "filter": "Buscar usuários..." - }, - "delete": { - "title": "Excluir usuário", - "confirm_msg": "Você está excluindo o usuário {{name}} (ID: {{id}}) permanentemente.", - "irreversible": "Esta ação é irreversível.", - "input_label": "Digite o ID do usuário para confirmar:", - "placeholder": "Digite \"{{id}}\"", - "alert_title": "Aviso: ação permanente.", - "alert_desc": "O usuário e todos os dados relacionados serão apagados.", - "button_confirm": "Excluir usuário", - "button_deleting": "Excluindo...", - "toast": { - "success_title": "Usuário excluído", - "success_desc": "O usuário \"{{name}}\" foi removido com sucesso.", - "failed_title": "Falha ao excluir", - "failed_fallback": "Não foi possível excluir o usuário." - } - } - } - }, - "roles": { - "title": { - "create": "Criar nova função", - "edit": "Editar função: {{name}}" - }, - "description_hint": "Defina o escopo de acesso e permissões.", - "form": { - "name_label": "Nome da função", - "type_label": "Tipo de função", - "desc_label": "Descrição", - "matrix_label": "Matriz de permissões ({{type}})", - "builtin_badge": "Função integrada", - "builtin_desc": "Esta função é predefinida e somente leitura." - }, - "types": { - "Global": "Global", - "Account": "Conta" - }, - "categories": { - "identity": "Identidade e Gestão", - "global_data": "Acesso a dados globais", - "account_resource": "Acesso a recursos de conta" - }, - "actions": { - "cancel": "Cancelar", - "submit_create": "Criar função", - "submit_update": "Atualizar função", - "success_create": "Função criada com sucesso", - "success_update": "Função atualizada com sucesso", - "failed": "A operação falhou", - "close": "Fechar", - "retry": "Tentar novamente", - "add": "Adicionar função" - }, - "validation": { - "name_required": "Nome da função é obrigatório", - "perm_required": "Selecione pelo menos uma permissão" - }, - "columns": { - "id": "ID", - "name": "Nome", - "role_type": "Tipo", - "permissions": "Permissões", - "created_at": "Criado em", - "updated_at": "Atualizado em" - }, - "placeholder": { - "filter": "Buscar funções..." - }, - "delete": { - "dialog_title": "Excluir função", - "warning_text": "Você está excluindo a função {{name}} (ID: {{id}}) permanentemente.", - "irreversible": "Esta ação não pode ser desfeita.", - "confirm_label": "Digite o ID da função para confirmar:", - "placeholder": "Digite \"{{id}}\"", - "alert_title": "Aviso: ação permanente.", - "alert_desc": "Excluir esta função a removerá de todos os usuários atribuídos.", - "confirm_btn": "Excluir função", - "deleting": "Excluindo...", - "success_title": "Função excluída", - "success_desc": "A função \"{{name}}\" foi removida.", - "error_title": "Falha ao excluir", - "error_fallback": "Não foi possível excluir a função." - }, - "details": { - "title": "Permissões: {{name}}", - "unknown": "Função desconhecida", - "role_badge": "Função {{type}}", - "desc_global": "Gestão global e acesso ao sistema.", - "desc_account": "Operações de dados em contas individuais.", - "close_btn": "Fechar", - "view_permissions": "Ver detalhes" - }, - "empty": { - "title": "Nenhuma função encontrada", - "desc": "Você ainda não criou funções personalizadas." - } - }, - "profile": { - "avatar_alt": "Avatar", - "menu": { - "profile": "Perfil", - "settings": "Configurações", - "sign_out": "Sair" - } - }, - "sign_out": { - "title": "Sair", - "desc": "Tem certeza de que deseja sair? Você precisará entrar novamente para acessar sua conta.", - "confirm": "Sair" - }, - "restore_message": { - "title": "Restaurar mensagem individual", - "bulkTitle": "Restaurar múltiplas mensagens", - "bulkWarning": "Nota: As mensagens serão restauradas nas suas pastas originais.", - "accountsInvolved": "Contas envolvidas", - "summary": "Detalhes da restauração", - "messages": "mensagens", - "desc": "Esta ação irá recarregar as mensagens selecionadas do Bichon e restaurá-las nas pastas correspondentes no servidor IMAP.", - "confirm": "Executar restauração", - "restore_to_imap": "Restaurar mensagem", - "success": "Restauração bem-sucedida", - "successDesc": "As mensagens selecionadas foram restauradas com sucesso no servidor IMAP.", - "failed": "Falha ao restaurar", - "failedTitle": "Falha na restauração" - }, - "time": { - "label": "Tempo", - "since": "Desde", - "before": "Antes de", - "recent_range": "Intervalo recente (desde...)", - "historical": "Intervalo histórico (antes de...)", - "absolute_range": "Intervalo de datas absoluto", - "last_day": "Último 1 dia", - "last_days": "Últimos {{count}} dias", - "last_months": "Últimos {{count}} meses", - "over_years_ago": "Há {{count}} {{unit}}", - "year": "ano", - "years": "anos", - "recent_prefix": "Recente:", - "days_ago_to_now": "dias atrás até agora", - "apply": "Aplicar", - "start_date": "Data de início", - "end_date": "Data de fim", - "clear_filters": "Limpar filtros de tempo", - "format": "yyyy-MM-dd" - }, - "tag": { - "label": "Etiquetas", - "search_placeholder": "Pesquisar etiquetas...", - "clear_all": "Limpar todas as etiquetas", - "no_tags_found": "Nenhuma etiqueta encontrada" - }, - "search_accounts": { - "label": "Contas de e-mail", - "search_placeholder": "Pesquisar contas de e-mail...", - "clear_accounts": "Limpar contas selecionadas", - "no_accounts_found": "Nenhuma conta encontrada" - }, - "search_mailbox": { - "label": "Caixas de correio", - "search_placeholder": "Pesquisar pastas", - "clear_mailboxes": "Limpar pastas selecionadas", - "select_account_first": "Selecione primeiro uma conta de e-mail", - "no_mailbox_found": "Nenhuma pasta encontrada" - }, - "search_contacts": { - "label": "Contatos", - "label_with_count": "Contatos ({{count}})", - "any": "Qualquer", - "search_placeholder": "Pesquisar {{field}}...", - "reset_all": "Redefinir todos os contatos", - "no_contact_found": "Nenhum contato encontrado", - "loading": "Carregando...", - "showing_limit": "Mostrando apenas os primeiros 100 resultados • Total {{total}}" - }, - "search_more": { - "trigger_label": "Avançado", - "title": "Filtros avançados", - "reset": "Redefinir", - "has_attachment": "Contém anexo", - "attachment_name_label": "Nome do anexo", - "attachment_name_placeholder": "Ex.: invoice.pdf", - "message_size_label": "Tamanho da mensagem", - "message_id_label": "Message-ID original", - "message_id_description": "Pesquisar pelo Message-ID no cabeçalho do e-mail", - "apply": "Aplicar filtros", - "size_presets": { - "any": "Qualquer tamanho", - "tiny": "Muito pequeno (< 15 KB)", - "small": "Pequeno (< 2 MB)", - "medium": "Médio (2 – 10 MB)", - "large": "Grande (10 – 20 MB)", - "huge": "Muito grande (> 20 MB)" - }, - "any": "Qualquer", - "search_placeholder": "Buscar {{field}}...", - "extension": "Extensão de arquivo", - "category": "Categoria de anexo", - "content_types": "Tipo específico" - }, - "search_view": { - "button_label": "Visualização", - "menu_title": "Configurações de colunas" - }, - "search_reset": { - "label": "Redefinir", - "tooltip": "Limpar todos os filtros" - }, - "search_input": { - "placeholder": "Pesquisar e-mails... (Regex suportado)", - "button": "Pesquisar", - "recent_title": "Pesquisas recentes", - "clear_history": "Limpar histórico", - "no_history": "Nenhum histórico de pesquisa", - "all": "Todos os campos", - "all_fields_desc": "Corresponde ao assunto, corpo, remetente e destinatários", - "subject": "Assunto", - "body": "Corpo da mensagem" + "name_required": "Nome da função é obrigatório", + "perm_required": "Selecione pelo menos uma permissão" } + }, + "search": { + "account": "Conta", + "addEmailAccount": "Adicionar Conta de Email", + "addTags": { + "cancel": "Cancelar", + "createHint": "Criar nova tag: {{tag}}", + "invalidTitle": "Tag Inválida", + "none": "Nenhuma tag adicionada ainda", + "save": "Salvar", + "saving": "Salvando...", + "searchPlaceholder": "Pesquisar ou criar tags...", + "selectedCount": "Tags Selecionadas: {{count}}", + "title": "Editar Tags", + "tryAgain": "Por favor, tente novamente mais tarde", + "updateFailedTitle": "Falha na Atualização", + "updatedDesc": "As tags foram atualizadas com sucesso", + "updatedTitle": "Tags Atualizadas" + }, + "adjustSearch": "Tente ajustar seus critérios de pesquisa ou limpar os filtros.", + "advanced": "Avançado", + "advancedFilters": "Filtros Avançados", + "any": "Qualquer", + "attachmentName": "Nome do Anexo", + "attachmentsSize": "Anexos e Tamanho", + "bcc": "BCC", + "before": "Antes de:", + "bulkActions": { + "ariaLabel": "{{count}} mensagens selecionadas. Barra de ações", + "clear": "Limpar seleção", + "delete": "Excluir", + "deleteDesc": "Excluir mensagens selecionadas", + "manageTags": "Gerenciar etiquetas", + "selected": "{{count}} selecionadas" + }, + "cc": "CC", + "clear": "Limpar", + "date": "Data", + "dateRange": "Intervalo de Datas", + "delete": { + "confirmButton": "Excluir", + "confirmDetail": "Esta ação não pode ser desfeita.", + "confirmPrefix": "Tem certeza que deseja excluir", + "countLabel": "{{count}} mensagem(ns)?", + "errorTitle": "Erro ao excluir", + "successDesc": "Mensagens excluídas com sucesso.", + "successTitle": "Excluído", + "title": "Excluir mensagens", + "warningDesc": "As mensagens serão removidas permanentemente.", + "warningTitle": "Aviso" + }, + "editTag": "Editar Tag", + "endDate": "Data de Término", + "from": "De", + "fullTextMultiAccount": "Pesquisa de Texto Completo, Multi-Conta e Filtros Avançados", + "hasAttachment": "Tem Anexo", + "huge": "Muito grande (≥20 MB)", + "keyword": "Palavra-chave", + "large": "Grande (10 - 20 MB)", + "mailbox": "Caixa de Entrada", + "maxSize": "Tamanho Máximo", + "maximumBytes": "Máximo (Bytes)", + "medium": "Médio (2 - 10 MB)", + "messageId": "ID da Mensagem", + "minSize": "Tamanho Mínimo", + "minimumBytes": "Mínimo (Bytes)", + "no": "Não", + "noActiveEmailAccount": "Nenhuma conta de email ativa.", + "noEmailsFound": "Nenhum email encontrado", + "noMailboxSelectAccount": "Nenhuma caixa de entrada, selecione uma conta primeiro.", + "originalMessageIdHeader": "Cabeçalho Message-ID do Email Original", + "pleaseSelectAtLeastOne": "Por favor, selecione pelo menos um critério de pesquisa", + "preview": "Prévia", + "recipient": "Destinatário", + "searchArchivedEmails": "Pesquisar Emails Arquivados", + "searchButton": "Pesquisar", + "searchInSubjectBody": "Pesquisar no assunto, corpo e anexos...", + "searching": "Pesquisando, por favor, aguarde...", + "searchingButton": "Pesquisando...", + "selectAccount": "Selecionar Conta", + "selectDate": "Selecionar Data", + "selectMailbox": "Selecionar Caixa de Entrada", + "sender": "Remetente", + "senderRecipients": "Remetentes / Destinatários", + "since": "Desde:", + "size": "Tamanho", + "sizeDescription": "O tamanho refere-se ao tamanho total do e-mail, incluindo anexos.", + "small": "Pequeno (<2 MB)", + "sort": "Ordenar", + "source": "Origem", + "startDate": "Data de Início", + "startSearching": "Comece a pesquisar usando palavras-chave, remetentes ou filtros avançados.", + "subject": "Assunto", + "tagFilter": "Filtro de Tag", + "thread": { + "empty": "Não há mensagens neste tópico", + "error": "Falha ao carregar o tópico", + "invalidDate": "Data Inválida", + "loadMore": "Carregar Mais", + "loadingMore": "Carregando...", + "noSubject": "(Sem Assunto)", + "title": "Tópico · {{count}} Mensagens" + }, + "tiny": "Muito pequeno (<15 KB)", + "title": "Pesquisa", + "to": "Para", + "updateTags": { + "actionAdd": "Adicionar", + "actionOverwrite": "Substituir", + "actionRemove": "Remover", + "cancel": "Cancelar", + "createHint": "Pressione Enter para criar nova etiqueta: \"{{tag}}\"", + "invalidTitle": "Etiqueta inválida", + "none": "Nenhuma etiqueta selecionada", + "overwriteWarning": "Aviso: isto substituirá todas as etiquetas existentes nos itens selecionados.", + "savingAdd": "Adicionando...", + "savingOverwrite": "Substituindo...", + "savingRemove": "Removendo...", + "searchPlaceholder": "Procurar ou criar nova etiqueta...", + "selectedCount": "{{count}} etiqueta(s) a aplicar", + "submitAdd": "Adicionar etiquetas", + "submitOverwrite": "Substituir etiquetas", + "submitRemove": "Remover etiquetas", + "title": "Atualizar etiquetas", + "tryAgain": "Por favor, tente novamente mais tarde.", + "updateFailedTitle": "Falha na atualização", + "updatedDesc": "Etiquetas atualizadas com sucesso.", + "updatedTitle": "Etiquetas atualizadas" + }, + "yes": "Sim" + }, + "search_accounts": { + "clear_accounts": "Limpar contas selecionadas", + "label": "Contas de e-mail", + "no_accounts_found": "Nenhuma conta encontrada", + "search_placeholder": "Pesquisar contas de e-mail..." + }, + "search_contacts": { + "any": "Qualquer", + "label": "Contatos", + "label_with_count": "Contatos ({{count}})", + "loading": "Carregando...", + "no_contact_found": "Nenhum contato encontrado", + "reset_all": "Redefinir todos os contatos", + "search_placeholder": "Pesquisar {{field}}...", + "showing_limit": "Mostrando apenas os primeiros 100 resultados • Total {{total}}" + }, + "search_input": { + "all": "Todos os campos", + "all_fields_desc": "Corresponde ao assunto, corpo, remetente e destinatários", + "body": "Corpo da mensagem", + "button": "Pesquisar", + "clear_history": "Limpar histórico", + "no_history": "Nenhum histórico de pesquisa", + "placeholder": "Pesquisar e-mails (use \" \" para pesquisa de frases)", + "recent_title": "Pesquisas recentes", + "subject": "Assunto" + }, + "search_mailbox": { + "clear_mailboxes": "Limpar pastas selecionadas", + "label": "Caixas de correio", + "no_mailbox_found": "Nenhuma pasta encontrada", + "search_placeholder": "Pesquisar pastas", + "select_account_first": "Selecione primeiro uma conta de e-mail" + }, + "search_more": { + "any": "Qualquer", + "apply": "Aplicar filtros", + "attachment_name_label": "Nome do anexo", + "attachment_name_placeholder": "Ex.: invoice.pdf", + "category": "Categoria de anexo", + "content_type": "Tipo de arquivo", + "extension": "Extensão de arquivo", + "has_attachment": "Contém anexo", + "is_message": "Anexo em formato de e-mail", + "is_message_desc": "Este anexo é um arquivo de e-mail, por exemplo, um arquivo .eml.", + "message_id_description": "Pesquisar pelo Message-ID no cabeçalho do e-mail", + "message_id_label": "Message-ID original", + "message_size_label": "Tamanho da mensagem", + "reset": "Redefinir", + "search_placeholder": "Buscar {{field}}...", + "size_presets": { + "any": "Qualquer tamanho", + "huge": "Muito grande (> 20 MB)", + "large": "Grande (10 – 20 MB)", + "medium": "Médio (2 – 10 MB)", + "small": "Pequeno (< 2 MB)", + "tiny": "Muito pequeno (< 15 KB)" + }, + "title": "Filtros avançados", + "trigger_label": "Avançado" + }, + "search_reset": { + "label": "Redefinir", + "tooltip": "Limpar todos os filtros" + }, + "search_view": { + "button_label": "Visualização", + "menu_title": "Configurações de colunas" + }, + "settings": { + "accounts": "Contas", + "acl": "ACL", + "actions": "Ações", + "add": "Adicionar", + "addNewProxyHere": "Adicione um novo Proxy aqui.", + "adding": "Adicionando...", + "appearance": { + "button": { + "update": "Atualizar preferências" + }, + "command": { + "no_results": "Nenhum idioma encontrado.", + "search": "Pesquisar idioma..." + }, + "description": { + "language": "Selecione o idioma da interface web.", + "theme": "Escolha entre o modo claro ou escuro." + }, + "field": { + "language": "Idioma da interface", + "theme": "Tema da interface" + }, + "placeholder": { + "select_language": "Selecionar idioma" + }, + "theme": { + "dark": "Escuro", + "light": "Claro" + }, + "title": "Aparência", + "validation": { + "language": { + "required": "Por favor, selecione um idioma." + }, + "theme": { + "required": "Por favor, selecione um tema." + } + } + }, + "authUrl": "URL de Autorização", + "changePasswordForFutureLogins": "Altera a senha para futuros logins.", + "confirmReset": "Confirmar Redefinição", + "createdAt": "Criado Em", + "delete": "Excluir", + "description": "Descrição", + "edit": "Editar", + "enabled": "Ativo", + "enterNewRootPassword": "Insira a Nova Senha Root", + "enterProxyIdToConfirmDeletion": "Insira o ID do Proxy para confirmar a exclusão.", + "failedToCopyText": "Falha ao copiar texto", + "filterAccessToken": "Filtrar Token de Acesso...", + "filterAccount": "Filtrar Conta...", + "filterOauth2": "Filtrar OAuth2...", + "filterProxy": "Filtrar Proxy...", + "general": "Geral", + "generateNewToken": "Gera um novo token. O token antigo é imediatamente invalidado.", + "host": "Host", + "id": "ID", + "invalidPassword": "Senha Inválida", + "lastAccess": "Último Acesso", + "manageRootTokenAndPassword": "Gerencie o token e a senha root com segurança.", + "name": "Nome", + "noProxies": "Nenhum Proxy", + "noProxiesDesc": "Você ainda não adicionou nenhuma configuração de proxy. Adicione uma para utilizar a funcionalidade.", + "password": "Senha", + "pleaseUseAnIpAddressForBetterReliability": "Por favor, use um endereço IP (Ex: 127.0.0.1) em vez de um hostname ou domínio para melhor confiabilidade.", + "port": "Porta", + "profile": { + "account": { + "id": "ID da conta: {{id}}" + }, + "avatarAlt": "Avatar", + "button": { + "permissions": "Permissões", + "update_profile": "Atualizar perfil", + "view_global_permissions": "Ver permissões globais" + }, + "field": { + "email": "E-mail", + "password": "Senha", + "username": "Nome de usuário" + }, + "loadError": "Não foi possível carregar as informações do usuário.", + "maxSize": "Até {{size}}", + "placeholder": { + "password_keep": "Deixe em branco para manter a senha atual" + }, + "removeAvatar": "Remover avatar", + "section": { + "accounts": "{{count}} contas vinculadas", + "roles": "Funções" + }, + "toast": { + "update_failed": "Falha ao atualizar o perfil", + "updated": "Perfil atualizado com sucesso" + }, + "uploadError": "Erro(s) ao enviar o arquivo", + "uploadTitle": "Enviar avatar", + "validation": { + "email": { + "invalid": "Por favor, insira um endereço de e-mail válido", + "required": "O e-mail é obrigatório" + }, + "password": { + "max": "A senha deve ter no máximo 256 caracteres", + "min": "A senha deve ter pelo menos 8 caracteres" + }, + "username": { + "max": "O nome de usuário deve ter no máximo 32 caracteres", + "min": "O nome de usuário deve ter pelo menos 5 caracteres", + "required": "O nome de usuário é obrigatório" + } + } + }, + "proxy": "Proxy", + "proxyUpdateOrAddFailed": "Falha ao {{action}}, por favor, tente novamente mais tarde", + "reset": "Redefinir", + "resetRootPassword": "Redefinir Senha Root", + "resetRootToken": "Redefinir Token Root", + "root": "Root", + "rootAccessManagement": "Gerenciamento de Acesso Root", + "rootDesc": "Gerencie as credenciais de acesso root, incluindo token e senha.", + "rootPasswordMustBeAtLeast6Characters": "A Senha Root deve ter pelo menos 6 caracteres.", + "rootTitle": "Root", + "selectAll": "Selecionar Todos", + "sidebar": { + "apiTokens": "Tokens API", + "configurations": "Configurações do sistema", + "profile": "Perfil", + "proxy": "Proxy de rede" + }, + "theRootPasswordHasBeenReset": "A Senha Root foi redefinida", + "theRootTokenHasBeenReset": "O Token Root foi redefinido", + "theme": "Tema", + "title": "Configurações", + "token": "Token", + "tokenUrl": "URL do Token", + "type": "Tipo", + "updateTheProxyHere": "Atualize o Proxy aqui.", + "updatedAt": "Atualizado Em", + "url": "URL", + "useNewPasswordForNextLogin": "Use a nova senha para o próximo login.", + "useProxy": "Usar Proxy", + "username": "Nome de Usuário", + "youAreAboutToResetTheRootPassword": "Você está prestes a redefinir a Senha Root. Por favor, guarde-a em segurança.", + "youAreAboutToResetTheRootToken": "Você está prestes a redefinir o Token Root. Esta ação não pode ser desfeita.", + "yourLoginInformationHasBeenUpdated": "Suas informações de login foram atualizadas. Você não precisa fazer login novamente.", + "yourProxyHasBeenSuccessfully": "Seu Proxy foi {{action}} com sucesso." + }, + "sign_out": { + "confirm": "Sair", + "desc": "Tem certeza de que deseja sair? Você precisará entrar novamente para acessar sua conta.", + "title": "Sair" + }, + "systemConfig": { + "pageDescription": "Estes parâmetros são inicializados via flags CLI ou variáveis de ambiente. Estão em modo somente leitura.", + "pageTitle": "Configurações a nível de sistema", + "sections": { + "cors": { + "desc": "Regras de acesso cross-origin", + "title": "CORS" + }, + "logging": { + "desc": "Comportamento de saída de logs", + "title": "Logging" + }, + "network": { + "desc": "HTTP e acesso público", + "title": "Rede" + }, + "performance": { + "desc": "Concorrência e compressão", + "title": "Desempenho" + }, + "security": { + "desc": "Autenticação e criptografia", + "title": "Segurança" + }, + "smtp": { + "desc": "Configurações de recepção de e-mail de entrada para arquivamento em tempo real", + "title": "Servidor SMTP" + }, + "storage": { + "desc": "Caminhos de base de dados e limites", + "title": "Armazenamento e Cache" + } + }, + "status": { + "auto": "Auto", + "configured": "Configurado", + "disabled": "Desativado", + "enabled": "Ativado", + "missing": "Em falta", + "notSet": "Não definido" + } + }, + "table": { + "asc": "Asc", + "delete": "Excluir", + "desc": "Desc", + "edit": "Editar", + "hide": "Ocultar", + "loading": "Carregando...", + "noResults": "Nenhum resultado encontrado", + "of": "de", + "page": "Página", + "pagination": { + "first": "Primeira página", + "fixed_page_size": "{{size}} linhas por página.", + "last": "Última página", + "next": "Próxima página", + "page_info": "Página {{page}} de {{total}}", + "previous": "Página anterior", + "rows_per_page": "Linhas por página", + "selected": "{{selected}} de {{total}} linha(s) selecionada(s)." + }, + "results": "resultados", + "rowsPerPage": "Linhas por página", + "showing": "Mostrando", + "to": "a" + }, + "tag": { + "clear_all": "Limpar todas as etiquetas", + "label": "Etiquetas", + "no_tags_found": "Nenhuma etiqueta encontrada", + "search_placeholder": "Pesquisar etiquetas..." + }, + "time": { + "absolute_range": "Intervalo de datas absoluto", + "apply": "Aplicar", + "before": "Antes de", + "clear_filters": "Limpar filtros de tempo", + "days_ago_to_now": "dias atrás até agora", + "end_date": "Data de fim", + "format": "yyyy-MM-dd", + "historical": "Intervalo histórico (antes de...)", + "label": "Tempo", + "last_day": "Último 1 dia", + "last_days": "Últimos {{count}} dias", + "last_months": "Últimos {{count}} meses", + "over_years_ago": "Há {{count}} {{unit}}", + "recent_prefix": "Recente:", + "recent_range": "Intervalo recente (desde...)", + "since": "Desde", + "start_date": "Data de início", + "year": "ano", + "years": "anos" + }, + "users": { + "actions": { + "api_tokens": "Tokens de API", + "buttons": { + "add_account": "Adicionar conta", + "create": "Criar usuário", + "update": "Atualizar usuário" + }, + "delete": { + "alert_desc": "O usuário e todos os dados relacionados serão apagados.", + "alert_title": "Aviso: ação permanente.", + "button_confirm": "Excluir usuário", + "button_deleting": "Excluindo...", + "confirm_msg": "Você está excluindo o usuário {{name}} (ID: {{id}}) permanentemente.", + "input_label": "Digite o ID do usuário para confirmar:", + "irreversible": "Esta ação é irreversível.", + "placeholder": "Digite \"{{id}}\"", + "title": "Excluir usuário", + "toast": { + "failed_fallback": "Não foi possível excluir o usuário.", + "failed_title": "Falha ao excluir", + "success_desc": "O usuário \"{{name}}\" foi removido com sucesso.", + "success_title": "Usuário excluído" + } + }, + "dialog": { + "create_title": "Criar novo usuário", + "edit_title": "Editar usuário: {{name}}", + "subtitle": "Configure identidade, níveis de acesso e segurança." + }, + "fields": { + "assign_role": "Atribuir função", + "burst_interval": "Intervalo de burst (seg)", + "description": "Descrição (opcional)", + "description_hint": "Notas internas (máx. 256 caracteres).", + "description_placeholder": "Notas sobre este usuário...", + "email": "E-mail", + "email_hint": "Contato principal e notificações.", + "global_roles_hint": "Atribua permissões de sistema.", + "ip_whitelist": "Lista branca de IP", + "ip_whitelist_hint": "Restringir login a estes IPs (um por linha).", + "password": "Senha", + "password_hint_create": "Senha segura para configuração inicial.", + "password_hint_edit": "Insira apenas se desejar alterar.", + "password_placeholder_create": "Mínimo 8 caracteres", + "password_placeholder_edit": "Deixe em branco para manter a atual", + "rate_quota": "Cota de taxa", + "select_account": "Escolher conta", + "username": "Nome de usuário", + "username_hint": "Identificador exclusivo para login." + }, + "placeholder": { + "filter": "Buscar usuários..." + }, + "schema": { + "account_required": "Selecione uma conta", + "description_max": "Máximo 256 caracteres na descrição", + "email_invalid": "Insira um e-mail válido", + "email_required": "E-mail é obrigatório", + "global_role_required": "Atribua pelo menos uma função global", + "ip_invalid": "IP inválido detectado", + "password_max": "Máximo 256 caracteres", + "password_min": "Mínimo 8 caracteres", + "password_required": "Senha é obrigatória", + "role_required": "Selecione uma função", + "username_max": "Máximo 32 caracteres", + "username_min": "Mínimo 3 caracteres", + "username_required": "Nome de usuário é obrigatório" + }, + "sections": { + "basic": "Identidade básica", + "global": "Permissões globais", + "mail_access": "Controle de acesso de e-mail", + "mail_access_subtitle": "Contas de e-mail que este usuário pode gerenciar.", + "policy": "Políticas" + }, + "states": { + "full_access": "Modo de acesso total", + "full_access_desc": "Administradores têm acesso inerente a todas as contas.", + "no_accounts": "Nenhuma conta específica atribuída.", + "security_disabled": "Políticas de segurança desativadas." + }, + "tabs": { + "general": "Geral", + "permissions": "Permissões de conta", + "security": "Segurança e ACL" + }, + "toast": { + "created": "Usuário criado", + "updated": "Usuário atualizado" + } + }, + "api_tokens": { + "button": { + "generate": "Gerar novo token" + }, + "delete": { + "confirm_button": "Excluir token", + "confirm_label": "Para confirmar, digite {{word}} abaixo:", + "confirm_placeholder": "Digite \"{{word}}\" para confirmar", + "deleting": "Excluindo...", + "desc": "Você está prestes a excluir permanentemente este token de API", + "irreversible": "Esta ação não pode ser desfeita. Quaisquer aplicativos que usem este token perderão o acesso imediatamente.", + "prefix": "Prefixo do token", + "title": "Excluir token de API", + "warning_desc": "Quaisquer scripts ou serviços que usem este token falharão. Certifique-se de atualizar seus sistemas.", + "warning_title": "Aviso" + }, + "empty": { + "description": "Nenhum token de API foi gerado no sistema ainda.", + "title": "Nenhum token de API encontrado" + }, + "table": { + "api_key": "Chave API", + "created": "Criado", + "expired": "Expirado", + "expires_at": "Expira em", + "last_used": "Último uso", + "name": "Nome", + "never": "Nunca", + "owner": "Proprietário", + "permanent": "Permanente", + "type": "Tipo", + "unnamed": "Token sem nome", + "web_ui": "Interface Web" + }, + "toast": { + "delete_failed": "Não foi possível excluir o token, tente novamente.", + "delete_failed_title": "Falha ao excluir", + "deleted_desc": "O token \"{{name}}\" foi removido com sucesso.", + "deleted_title": "Token de API excluído" + }, + "toolbar": { + "search_placeholder": "Buscar por nome, proprietário ou token..." + }, + "unnamed": "Token sem nome" + }, + "buttons": { + "add": "Adicionar usuário", + "add_new": "Novo usuário" + }, + "columns": { + "actions": "Ações", + "avatar": "Avatar", + "created_at": "Criado em", + "email": "E-mail", + "id": "ID", + "roles": "Funções e permissões", + "updated_at": "Atualizado em", + "username": "Nome de usuário" + }, + "empty": { + "description": "Clique no botão abaixo para adicionar seu primeiro usuário.", + "title": "Nenhum usuário encontrado" + }, + "nav": { + "api_tokens": "Tokens de API", + "roles": "Funções", + "users": "Usuários" + }, + "tokens": { + "dialog": { + "create_title": "Criar token de acesso", + "description": "Clique em salvar quando terminar.", + "edit_title": "Editar token de acesso" + }, + "error": { + "fallback": "A operação falhou, tente novamente mais tarde." + }, + "expire_options": { + "1_day": "1 dia", + "30_days": "30 dias", + "7_days": "7 dias", + "never": "Nunca expira" + }, + "fields": { + "expire_hint": "O token expirará automaticamente após o tempo selecionado.", + "expire_label": "Expiração", + "expire_placeholder": "Escolha a expiração", + "name_hint": "Opcional · Máx. 32 caracteres", + "name_label": "Nome", + "name_placeholder": "Dê um nome curto ao token" + }, + "schema": { + "expire_int": "Deve ser um número inteiro", + "expire_number": "Deve ser um número", + "expire_positive": "Deve ser maior que 0", + "name_max": "Máx. 32 caracteres" + }, + "toast": { + "create_failed_title": "Falha na criação", + "create_success_desc": "O token de acesso foi criado com sucesso.", + "create_success_title": "Token criado", + "update_failed_title": "Falha na atualização", + "update_success_desc": "O token de acesso foi atualizado com sucesso.", + "update_success_title": "Token atualizado" + } + }, + "tokens_action": { + "buttons": { + "add": "Adicionar token" + }, + "delete_dialog": { + "description": "Esta ação não pode ser desfeita.", + "title": "Excluir token de acesso?" + }, + "dialog": { + "description": "Gerenciar tokens de API para este usuário.", + "title": "Tokens de API" + }, + "empty": { + "description": "Este usuário não possui tokens de API no momento.", + "title": "Sem tokens de API" + }, + "list": { + "button_delete": "Excluir token", + "expires_on_brief": "Expira em {{date}}", + "label_created": "Criado em", + "label_expires_at": "Expira em", + "label_last_used": "Último uso", + "label_token": "Token", + "never": "Nunca", + "never_expires": "Nunca expira", + "status_active": "Ativo", + "status_expired": "Expirado", + "unnamed_token": "Token sem nome" + } + } + }, + "validation": { + "emailRequired": "O endereço de email é obrigatório", + "folderLimitMustBeAtLeast100": "O Limite de Pasta deve ser pelo menos 100", + "folderLimitMustBeNumber": "O Limite de Pasta deve ser um número", + "imapHostCannotBeEmpty": "O Host IMAP não pode estar vazio", + "imapHostRequired": "O Host IMAP é obrigatório", + "imapPortMustBeLessThan65536": "A Porta IMAP deve ser menor que 65536", + "imapPortMustBePositive": "A Porta IMAP deve ser um número inteiro positivo", + "incrementalSyncMustBeAtLeast10": "O Intervalo de Sincronização Incremental deve ser de pelo menos 10 minutos", + "incrementalSyncMustBeNumber": "O Intervalo de Sincronização Incremental deve ser um número", + "invalidEmail": "Endereço de email inválido", + "invalidUrl": "URL inválido", + "passwordMinLength": "A senha deve ter pelo menos {{min}} caracteres", + "passwordRequired": "A senha é obrigatória se o método de autenticação for Senha", + "pleaseEnterPassword": "Por favor, insira a senha", + "pleaseEnterUsernameOrEmail": "Por favor, digite seu nome de usuário ou e-mail", + "required": "Este campo é obrigatório", + "singleRequestBatchSizeMustBeNumber": "O tamanho do lote deve ser um número", + "singleRequestBatchSizeTooLarge": "O tamanho do lote deve ser no máximo 200", + "singleRequestBatchSizeTooSmall": "O tamanho do lote deve ser pelo menos 10" + } } \ No newline at end of file diff --git a/web/src/locales/ru.json b/web/src/locales/ru.json index 6784ab8..b2f6625 100644 --- a/web/src/locales/ru.json +++ b/web/src/locales/ru.json @@ -1,1614 +1,1630 @@ { - "common": { - "submit": "Отправить", + "accessTokens": { + "aListOfIpAddressesAllowed": "Список IP-адресов, которым разрешен доступ к ресурсу. Вводите один IP на строку. (Опционально)", + "accountId": "ID аккаунта", + "accounts": "Аккаунты", + "aclRulesForAccessTokens": "Правила ACL для токенов доступа включают проверку белого списка IP и соблюдение ограничений скорости.", + "actions": { + "delete": "Удалить", + "edit": "Ред.", + "openMenu": "Открыть меню" + }, + "addNew": "Добавить новый", + "atLeastOneAccountIsRequired": "Требуется хотя бы один аккаунт.", + "create": "Создать", + "createNewAccessTokenHere": "Создайте новый токен доступа здесь.", + "created": "Создано", + "createdAt": "Создано", + "creating": "Создание...", + "creationFailed": "Ошибка создания", + "delete": "Удалить", + "describeThePurposeOfTheAccessToken": "Опишите назначение токена доступа", + "description": "Управляйте токенами доступа, контролем доступа, белыми списками IP и ограничениями частоты запросов.", + "descriptionMustNotExceed255Characters": "Описание не должно превышать 255 символов.", + "edit": "Ред.", + "editToken": "Ред. токен", + "enterIntervalInSeconds": "Введите интервал в секундах, например, 60", + "enterOneIpAddressPerLine": "Введите по одному IP-адресу на строку, например:\n192.168.1.1\n192.168.1.2", + "enterQuota": "Введите квоту, например, 100", + "expiresAt": "Истекает", + "filterByEmailAddressOrAccountId": "Фильтр по email или ID аккаунта...", + "interval": "Интервал", + "intervalMustBeAPositiveInteger": "Интервал должен быть положительным целым числом.", + "invalidIpAddressesFound": "Найдены неверные IP-адреса. Пожалуйста, введите корректные IPv4 или IPv6 адреса.", + "name": "Имя", + "noTokens": "Нет токенов доступа", + "noTokensDesc": "Вы еще не создали токены доступа. Создайте один, чтобы начать использовать функции API.", + "notUsedYet": "Еще не использовался", + "quota": "Квота", + "quotaMustBeAPositiveInteger": "Квота должна быть положительным целым числом.", + "save": "Сохранить", + "saveChanges": "Сохранить изменения", + "saving": "Сохранение...", + "selectAccounts": "Выберите аккаунты", + "selectMultipleAccountsForTheAccessToken": "Выберите несколько аккаунтов для области авторизации токена доступа.", + "theListOfAccountsThatCanBeQueried": "Список аккаунтов, которые можно запрашивать с помощью токена доступа.", + "theMaximumNumberOfRequestsAllowed": "Максимальное количество запросов, разрешенное в интервале. (Опционально)", + "theTimeWindowForTheRateLimit": "Временное окно (в секундах) для ограничения скорости. (Опционально)", + "title": "Токены доступа", + "token": "Токен", + "updateFailed": "Ошибка обновления", + "updateOrCreationFailed": "{{action}} не удалось, попробуйте позже", + "updateTheAccessTokenHere": "Обновите токен доступа здесь.", + "updated": "Обновлено", + "updating": "Обновление...", + "yourAccessTokenHasBeenSuccessfully": "Ваш токен доступа был успешно {{action}}." + }, + "accounts": { + "accessControl": "Контроль доступа", + "accessTokenCopiedToClipboard": "Access token скопирован в буфер обмена", + "access_control": { + "buttons": { "cancel": "Отмена", - "save": "Сохранить", - "save_changes": "Сохранить изменения", - "delete": "Удалить", - "edit": "Редактировать", - "search": "Поиск", - "add": "Добавить", - "remove": "Удалить", - "create": "Создать", - "update": "Обновить", - "confirm": "Подтвердить", + "save": "Сохранить назначение" + }, + "description": "Назначить роли и авторизованных пользователей для {{email}}", + "role_label": "Роль доступа", + "role_loading": "Загрузка ролей...", + "role_placeholder": "Выберите роль", + "title": "Назначение доступа к аккаунту", + "toast": { + "failed_title": "Ошибка назначения", + "success_desc": "Права доступа успешно назначены для {{email}}", + "success_title": "Назначение выполнено" + }, + "user_empty": "Пользователи не найдены", + "user_label": "Выберите авторизованных пользователей", + "user_search_placeholder": "Поиск по имени или email...", + "user_selected_count": "Выбрано: {{count}} польз.", + "validation": { + "role_required": "Пожалуйста, выберите роль для назначения", + "user_required": "Пожалуйста, выберите хотя бы одного пользователя" + } + }, + "accountCreated": "Аккаунт создан", + "accountCreatedDesc": "Ваш аккаунт был успешно создан.", + "accountCreationFailed": "Ошибка создания аккаунта", + "accountDetails": "Детали аккаунта", + "accountHasBeenSuccessfully": "Аккаунт успешно {{action}}", + "accountSyncFoldersUpdateFailed": "Не удалось обновить папки синхронизации", + "accountSyncFoldersUpdated": "Папки синхронизации обновлены", + "accountUpdateFailed": "Ошибка обновления аккаунта", + "accountUpdated": "Аккаунт обновлен", + "accountUpdatedDesc": "Ваш аккаунт был успешно обновлен.", + "actions": "Действия", + "addAccount": "Добавить аккаунт", + "addConfiguration": "Добавить конфигурацию", + "addImap": "Добавить IMAP", + "addNewEmailAccountHere": "Добавьте новый почтовый аккаунт здесь. ", + "addNoSync": "Добавить NoSync", + "allMailFolderSelected": "Внимание: Выбрана папка \"Вся почта\"", + "allMailFolderSelectedDesc": "Выбор папок с атрибутом \"Вся почта\" скорее всего приведет к дублированию сообщений, уже синхронизированных из папок \"Входящие\" и \"Отправленные\". Это может занять значительно больше места.", + "allMailSkipped": "Выбраны стандартные папки. Папка 'Вся почта' пропущена во избежание дубликатов.", + "areYouSureYouWantTo": "Вы уверены, что хотите {{action}} этот аккаунт?", + "auth": "Авторизация", + "authType": "тип_авторизации", + "autoConfiguring": "Автонастройка...", + "beforeRelative": "Скачать только старые письма", + "beforeRelativeValue": "Скачать письма за {{value}} {{unit}} назад", + "capabilities": "Возможности", + "chooseAuthMethod": "Выберите метод авторизации для IMAP.", + "chooseEncryptionMethod": "Выберите метод шифрования для IMAP.", + "chooseMailboxesToDownload": "Выберите почтовые ящики для загрузки для {{email}}. Новые ящики будут загружены в следующем цикле.", + "clickHere": "нажмите здесь", + "clickSaveWhenDone": "Нажмите сохранить, когда закончите.", + "continue": "Продолжить", + "createdAt": "Создано", + "creationFailed": "Ошибка создания, попробуйте позже", + "dateSelection": "Выбор даты", + "dateSince": "Дата с", + "days": "Дни", + "delete": "Удалить", + "description": "Управление и настройка ваших почтовых учетных записей.", + "detail": "Подробно", + "detailsOfTheOAuth2TokensForTheAccount": "Детали токенов OAuth2 для аккаунта.", + "determinesWhetherThisAccountIsActiveNoSync": "Определяет, активна ли учетная запись. Если она отключена, импорт данных будет невозможен.", + "disable": "Отключить", + "disableAccount": "Отключить аккаунт", + "disabled": "Отключено", + "downloadAll": "Скачать все письма", + "downloadBatchSize": "Размер пакета загрузки", + "downloadBatchSizeDescription": "Количество сообщений, получаемых за один IMAP-запрос", + "downloadInterval": "Интервал загрузки (мин.)", + "downloadIntervalPlaceholder": "Введите минуты", + "downloadScope": "Стратегия загрузки", + "downloadScopeDescription": "Выберите, какие электронные письма должны быть проиндексированы и скачаны.", + "duration": "Продолжительность", + "edit": "Ред.", + "email": "Email", + "emailAccountRegistration": "Регистрация почтового аккаунта", + "emailAccountRegistrationDesc": "Введите ваш адрес электронной почты. На следующих шагах вы настроите параметры IMAP. Мы используем этот адрес для автоматического определения настроек сервера IMAP.", + "emailAddress": "Email адрес", + "emailCannotBeModified": "Адрес электронной почты нельзя изменить при редактировании.", + "emailPlaceholder": "например, john.doe@example.com", + "enable": "Включить", + "enableAccount": "Включить аккаунт", + "enabled": "Включено", + "enabledDescription": "Определяет, активна ли эта учетная запись. Если она отключена, связанные загрузки не будут запускаться.", + "encryption": "шифрование", + "enterPassword": "Введите ваш пароль", + "enterValue": "Пожалуйста, введите значение", + "everyMinutes": "каждые {{minutes}} мин.", + "field": "Поле", + "fixed": "Фиксированная", + "folderLimit": "Лимит папки", + "folderLimitDescription": "Ограничить количество писем для синхронизации в папке (минимум 100). Оставьте пустым для снятия ограничений.", + "folderLimitPlaceholder": "например, 1000", + "folderSync": { + "autoSelectDescendants": "Автоматически выбирать дочерние элементы", + "autoSelectParents": "Автоматически выбирать родительские элементы", + "batches": "пакетов", + "collapseAll": "Свернуть все", + "expandAll": "Развернуть все", + "loadingMailboxFolders": "Загрузка папок почтового ящика…", + "noData": "Нет данных", + "noFolders": "Нет папок для синхронизации" + }, + "foldersConfiguredForSync": "{{count}} папок настроено для синхронизации", + "foldersSelected": "{{count}} папок выбрано", + "goBack": "Назад", + "host": "хост", + "id": "ID", + "imap": "IMAP", + "imapAuthMethod": "Метод авторизации IMAP", + "imapEncryption": "Шифрование IMAP", + "imapHost": "IMAP Хост", + "imapHostPlaceholder": "например, imap.example.com", + "imapPassword": "IMAP Пароль", + "imapPort": "IMAP Порт", + "imapPortPlaceholder": "например, 993", + "imapProxy": "Использовать SOCKS5 прокси для соединений IMAP.", + "incSync": "Инкр. синхр.", + "lastSync": "Посл. синхр.", + "leaveEmptyToKeepExisting": "Оставьте пустым, чтобы сохранить существующий пароль, или введите новый для обновления.", + "leaveEmptyToKeepPassword": "Оставьте пустым, чтобы сохранить текущий пароль", + "login_name": "Имя для входа", + "minutes": "минут", + "months": "Месяцы", + "moreAccountTypes": "Другие типы аккаунтов", + "mustBeAtLeast1": "Должно быть не менее 1", + "name": "Имя", + "nameDescription": "Имя пользователя IMAP. По умолчанию email или свой вариант.", + "namePlaceholder": "например, john.doe", + "noAccountConfigurations": "Нет настроек учетных записей", + "noAccountConfigurationsDesc": "Вы еще не добавили ни одной конфигурации учетной записи. Добавьте одну, чтобы начать использовать функции аккаунта.", + "noOAuth2Tokens": "Нет токенов OAuth2", + "none": "Нет", + "notAvailable": "н/д", + "oauth2Tokens": "Токены OAuth2", + "openMenu": "Открыть меню", + "optional": "Необязательно", + "owner": "Создатель", + "password": "пароль", + "port": "порт", + "recent": "недавние", + "refreshToken": "Refresh Token", + "refreshTokenCopiedToClipboard": "Refresh token скопирован в буфер обмена", + "relative": "Относительная", + "runningState": { + "account": { + "id": "ID аккаунта" + }, + "common": { "close": "Закрыть", - "yes": "Да", - "no": "Нет", - "ok": "ОК", - "loading": "Загрузка...", - "empty": "Пусто", - "noData": "Нет данных", - "table": { - "noResults": "Нет результатов." - }, - "failed": "Ошибка", - "notFound": "Не найдено", - "back": "Назад", - "goBack": "Вернуться", - "backToHome": "На главную", - "tryAgain": "Повторить", - "more": "Ещё", - "actions": "Действия", - "filter": "Фильтр", - "reset": "Сброс", - "clear": "Очистить", - "error": "Ошибка", - "apply": "Применить", - "select": "Выбрать", - "selectAll": "Выбрать все", - "deselectAll": "Снять выделение", - "all": "Все", - "none": "Ничего", - "showLess": "Показать меньше", - "showMore": "Показать больше...", - "project_description": "Bichon — это проект с открытым исходным кодом.", - "view_on_github_button": "Посмотреть на GitHub", - "op_failed": "Операция не удалась", - "na": "Н/Д", - "retry": "Повторить", - "deleting": "Удаление..." - }, - "navigation": { - "home": "Главная", - "settings": "Настройки", - "accounts": "Учетные записи", - "dashboard": "Дашборд", - "mailbox": "Почтовый ящик", - "oauth2": "OAuth2", - "accessTokens": "Токены доступа", - "apiDocs": "Документация API", - "general": "Общие", - "auth": "Авторизация", - "other": "Другое", - "users": "Пользователи системы" - }, - "auth": { - "welcome": "Добро пожаловать в Bichon", - "username": "Имя пользователя", - "password": "Пароль", - "login": "Войти", - "loginFailed": "Ошибка входа", - "invalidPassword": "Неверный пароль. Пожалуйста, попробуйте снова.", - "somethingWentWrong": "Что-то пошло не так", - "sessionExpired": "Сессия истекла!", - "sessionExpiredDesc": "Ваш сеанс завершен из-за неактивности. Пожалуйста, войдите снова, чтобы продолжить.", - "logout": "Выйти", - "areYouSureYouWantToLogOut": "Вы уверены, что хотите выйти?", - "youWillNeedToLogInAgain": "Вам нужно будет снова войти в систему, чтобы получить доступ к учетной записи." - }, - "errors": { - "pageNotFound": "Ой! Страница не найдена!", - "pageNotFoundDesc": "Похоже, страница, которую вы ищете, не существует или была удалена.", - "somethingWentWrong": "Ой! Что-то пошло не так :')", - "somethingWentWrongDesc": "Приносим извинения за неудобства. Пожалуйста, попробуйте позже.", - "internalServerError": "Внутренняя ошибка сервера!", - "contentNotModified": "Контент не изменен!", - "networkError": "Ошибка сети", - "networkErrorDesc": "Не удалось подключиться к серверу. Проверьте интернет-соединение и попробуйте снова.", - "forbidden": "Запрещено", - "forbiddenTitle": "Доступ запрещен", - "forbiddenDesc": "У вас нет необходимых прав для просмотра этого ресурса.", - "unauthorized": "Неавторизован", - "unauthorizedTitle": "Несанкционированный доступ", - "unauthorizedDesc": "Пожалуйста, войдите с соответствующими учетными данными для доступа к этому ресурсу.", - "maintenance": "Обслуживание", - "maintenanceTitle": "Сайт находится на обслуживании!", - "maintenanceDesc": "Сайт в данный момент недоступен. Мы скоро вернемся онлайн.", - "learnMore": "Подробнее" - }, - "dashboard": { - "title": "Дашборд", - "mailAccounts": "Почтовые аккаунты", - "connected": "Подключено", - "totalEmails": "Всего писем", - "syncedLocally": "Синхронизировано локально", - "totalEmailSize": "Общий размер писем", - "logicalVolume": "Оригинальный размер", - "localDataFiles": "Локальные файлы данных", - "actualDiskUsage": "Фактическое использование диска", - "efficiency": "Эффективность", - "saved": "Сэкономлено", - "dataStorage": "Хранилище", - "indexSize": "Размер индекса", - "metadataSize": "Размер метаданных", - "tantivyDatabase": "На базе поискового движка Tantivy", - "dayTrend": "Тренд за 30 дней", - "attachments": "Вложения", - "topLists": "Топ списки", - "newEmails": "Новые письма", - "messageDistribution": "Распределение сообщений", - "attachmentRatio": "Соотношение вложений", - "attachmentRatioDesc": "{{percent}}% писем содержат вложения", - "noEmailsSynced": "Письма пока не синхронизированы", - "withAttachments": "С вложениями", - "noAttachments": "Без вложений", - "top10Senders": "Топ 10 отправителей", - "byMessageCount": "По количеству сообщений", - "sender": "Отправитель", - "count": "Количество", - "top10LargestEmails": "Топ 10 самых больших писем", - "byMessageSize": "По размеру сообщения", - "subject": "Тема", - "size": "Размер", - "noSubject": "(Без темы)", - "top10Accounts": "Топ 10 аккаунтов", - "emails": "Письма", - "account": "Аккаунт", - "noRecentActivity": "Нет недавней активности", - "noSendersData": "Нет данных об отправителях", - "noLargeEmails": "Нет больших писем", - "noAccountData": "Нет данных об аккаунте", - "systemVersion": "Версия системы" - }, - "accounts": { - "beforeRelativeValue": "Скачать письма за {{value}} {{unit}} назад", - "sinceRelativeValue": "Скачать письма за последние", - "downloadBatchSize": "Размер пакета загрузки", - "downloadBatchSizeDescription": "Количество сообщений, получаемых за один IMAP-запрос", - "downloadScopeDescription": "Выберите, какие электронные письма должны быть проиндексированы и скачаны.", - "downloadScope": "Стратегия загрузки", - "selectMode": "Выберите режим фильтра", - "downloadAll": "Скачать все письма", - "sinceFixed": "С определенной даты", - "sinceRelative": "Скачать только недавние письма", - "beforeRelative": "Скачать только старые письма", - "duration": "Продолжительность", - "unit": "Единица", - "accessControl": "Контроль доступа", - "owner": "Создатель", - "access_control": { - "title": "Назначение доступа к аккаунту", - "description": "Назначить роли и авторизованных пользователей для {{email}}", - "role_label": "Роль доступа", - "role_placeholder": "Выберите роль", - "role_loading": "Загрузка ролей...", - "user_label": "Выберите авторизованных пользователей", - "user_search_placeholder": "Поиск по имени или email...", - "user_empty": "Пользователи не найдены", - "user_selected_count": "Выбрано: {{count}} польз.", - "buttons": { - "cancel": "Отмена", - "save": "Сохранить назначение" - }, - "validation": { - "user_required": "Пожалуйста, выберите хотя бы одного пользователя", - "role_required": "Пожалуйста, выберите роль для назначения" - }, - "toast": { - "success_title": "Назначение выполнено", - "success_desc": "Права доступа успешно назначены для {{email}}", - "failed_title": "Ошибка назначения" - } - }, - "title": "Почтовые учетные записи", - "description": "Управление и настройка ваших почтовых учетных записей.", - "addImap": "Добавить IMAP", - "addNoSync": "Добавить NoSync", - "moreAccountTypes": "Другие типы аккаунтов", - "noAccountConfigurations": "Нет настроек учетных записей", - "noAccountConfigurationsDesc": "Вы еще не добавили ни одной конфигурации учетной записи. Добавьте одну, чтобы начать использовать функции аккаунта.", - "addConfiguration": "Добавить конфигурацию", - "useNoProxy": "Без прокси", - "login_name": "Имя для входа", - "name": "Имя", - "email": "Email", + "folders": "почтовые ящики" + }, + "empty": { + "no_active_download": "Нет активных загрузок", + "no_errors_current": "Нет ошибок в текущей сессии", + "no_errors_session": "Нет ошибок в этой сессии", + "no_global_errors": "Нет глобальных ошибок", + "no_history": "Нет истории" + }, + "folders": "почтовые ящики", + "latest": "ПОСЛЕДНЕЕ", + "loading": { + "fetching_account_state": "Загрузка состояния аккаунта..." + }, + "message": "Сообщение", + "session": { + "started_at": "Время начала", "status": "Статус", - "type": "Тип", - "lastSync": "Посл. синхр.", - "actions": "Действия", - "edit": "Ред.", - "delete": "Удалить", - "detail": "Подробно", - "selectMailboxes": "Выбрать почтовые ящики", - "oauth2Tokens": "Токены OAuth2", - "id": "ID", - "enabled": "Включено", - "auth": "Авторизация", - "incSync": "Инкр. синхр.", - "state": "Состояние", - "createdAt": "Создано", - "updatedAt": "Обновлено", - "openMenu": "Открыть меню", - "emailAccountRegistration": "Регистрация почтового аккаунта", - "emailAccountRegistrationDesc": "Введите ваш адрес электронной почты. На следующих шагах вы настроите параметры IMAP. Мы используем этот адрес для автоматического определения настроек сервера IMAP.", - "emailAddress": "Email адрес", - "emailPlaceholder": "например, john.doe@example.com", - "namePlaceholder": "например, john.doe", - "optional": "Необязательно", - "nameDescription": "Имя пользователя IMAP. По умолчанию email или свой вариант.", - "emailCannotBeModified": "Адрес электронной почты нельзя изменить при редактировании.", - "addAccount": "Добавить аккаунт", - "updateAccount": "Обновить аккаунт", - "accountUpdated": "Аккаунт обновлен", - "accountCreated": "Аккаунт создан", - "accountUpdatedDesc": "Ваш аккаунт был успешно обновлен.", - "accountCreatedDesc": "Ваш аккаунт был успешно создан.", - "accountUpdateFailed": "Ошибка обновления аккаунта", - "accountCreationFailed": "Ошибка создания аккаунта", - "updateFailed": "Ошибка обновления, попробуйте позже", - "creationFailed": "Ошибка создания, попробуйте позже", - "allMailFolderSelected": "Внимание: Выбрана папка \"Вся почта\"", - "accountSyncFoldersUpdated": "Папки синхронизации обновлены", - "accountSyncFoldersUpdateFailed": "Не удалось обновить папки синхронизации", - "serverConfiguration": "Конфигурация сервера (IMAP)", - "selectedMailboxes": "Выбранные почтовые ящики", - "allMailFolderSelectedDesc": "Выбор папок с атрибутом \"Вся почта\" скорее всего приведет к дублированию сообщений, уже синхронизированных из папок \"Входящие\" и \"Отправленные\". Это может занять значительно больше места.", - "allMailSkipped": "Выбраны стандартные папки. Папка 'Вся почта' пропущена во избежание дубликатов.", - "selectAtLeastOneFolder": "Пожалуйста, выберите хотя бы одну папку", - "chooseMailboxesToDownload": "Выберите почтовые ящики для загрузки для {{email}}. Новые ящики будут загружены в следующем цикле.", - "accountDetails": "Детали аккаунта", - "capabilities": "Возможности", - "folderLimit": "Лимит папки", - "everyMinutes": "каждые {{minutes}} мин.", - "foldersConfiguredForSync": "{{count}} папок настроено для синхронизации", - "foldersSelected": "{{count}} папок выбрано", - "imapHost": "IMAP Хост", - "imapHostPlaceholder": "например, imap.example.com", - "imapPort": "IMAP Порт", - "imapPortPlaceholder": "например, 993", - "imapEncryption": "Шифрование IMAP", - "selectEncryptionMethod": "Выберите метод шифрования", - "chooseEncryptionMethod": "Выберите метод шифрования для IMAP.", - "imapAuthMethod": "Метод авторизации IMAP", - "selectAuthMethod": "Выберите метод авторизации", - "chooseAuthMethod": "Выберите метод авторизации для IMAP.", - "imapPassword": "IMAP Пароль", - "leaveEmptyToKeepPassword": "Оставьте пустым, чтобы сохранить текущий пароль", - "enterPassword": "Введите ваш пароль", - "leaveEmptyToKeepExisting": "Оставьте пустым, чтобы сохранить существующий пароль, или введите новый для обновления.", - "useProxy": "Использовать прокси", - "selectProxy": "Выберите прокси", - "downloadInterval": "Интервал загрузки (мин.)", - "downloadIntervalPlaceholder": "Введите минуты", - "enabledDescription": "Определяет, активна ли эта учетная запись. Если она отключена, связанные загрузки не будут запускаться.", - "dateSince": "Дата с", - "none": "Нет", - "fixed": "Фиксированная", - "relative": "Относительная", - "selectDate": "Выберите дату", - "selectUnit": "Выберите единицу", - "days": "Дни", - "months": "Месяцы", - "years": "Годы", - "enterValue": "Пожалуйста, введите значение", - "mustBeAtLeast1": "Должно быть не менее 1", - "dateSelection": "Выбор даты", - "since": "с", - "recent": "недавние", - "notAvailable": "н/д", - "host": "хост", - "port": "порт", - "encryption": "шифрование", - "authType": "тип_авторизации", - "password": "пароль", - "useProxyField": "использовать прокси", - "clickSaveWhenDone": "Нажмите сохранить, когда закончите.", - "step": "Шаг {{index}}", - "goBack": "Назад", - "autoConfiguring": "Автонастройка...", - "continue": "Продолжить", - "saveChanges": "Сохранить изменения", - "submit": "Отправить", - "field": "Поле", - "value": "Значение", - "refreshToken": "Refresh Token", - "accessTokenCopiedToClipboard": "Access token скопирован в буфер обмена", - "refreshTokenCopiedToClipboard": "Refresh token скопирован в буфер обмена", - "noOAuth2Tokens": "Нет токенов OAuth2", - "theAccountHasNotCompletedTheAuthorizationProcess": "Аккаунт не завершил процесс авторизации. Пожалуйста, ", - "clickHere": "нажмите здесь", - "toAuthorizeTheAccount": ", чтобы авторизовать аккаунт.", - "detailsOfTheOAuth2TokensForTheAccount": "Детали токенов OAuth2 для аккаунта.", - "updateTheEmailAccountHere": "Обновите почтовый аккаунт здесь. ", - "addNewEmailAccountHere": "Добавьте новый почтовый аккаунт здесь. ", - "thisAccountIsUsedForIdentificationPurposesOnly": "Этот аккаунт используется только для идентификации и не требует синхронизации с почтовым сервером. Он помогает при импорте почтовых данных.", - "determinesWhetherThisAccountIsActiveNoSync": "Определяет, активна ли учетная запись. Если она отключена, импорт данных будет невозможен.", - "folderSync": { - "noData": "Нет данных", - "noFolders": "Нет папок для синхронизации", - "batches": "пакетов", - "autoSelectDescendants": "Автоматически выбирать дочерние элементы", - "autoSelectParents": "Автоматически выбирать родительские элементы", - "expandAll": "Развернуть все", - "collapseAll": "Свернуть все", - "loadingMailboxFolders": "Загрузка папок почтового ящика…" - }, - "viewDetails": "смотреть детали", - "runningState": { - "message": "Сообщение", - "account": { - "id": "ID аккаунта" - }, - "tabs": { - "active_session": "Активная сессия", - "history": "История", - "global_errors": "Глобальные ошибки", - "folders": "Почтовые ящики", - "errors": "Ошибки" - }, - "loading": { - "fetching_account_state": "Загрузка состояния аккаунта..." - }, - "empty": { - "no_active_download": "Нет активных загрузок", - "no_errors_current": "Нет ошибок в текущей сессии", - "no_errors_session": "Нет ошибок в этой сессии", - "no_global_errors": "Нет глобальных ошибок", - "no_history": "Нет истории" - }, - "session": { - "status": "Статус", - "trigger": "Триггер", - "started_at": "Время начала" - }, - "common": { - "folders": "почтовые ящики", - "close": "Закрыть" - }, - "latest": "ПОСЛЕДНЕЕ", - "folders": "почтовые ящики" - }, - "steps": { - "complete": "Завершено", - "emailAddress": "Email адрес", - "imap": "IMAP", - "syncPreferences": "Настройки синхронизации", - "summary": "Итог" - }, - "imapProxy": "Использовать SOCKS5 прокси для соединений IMAP.", - "syncStartDateDescription": "Определяет дату начала синхронизации — фиксированную или относительную к текущему моменту. Предыдущие письма исключаются, {{fixedPart}}.", - "syncAfterDate": "синхронизирует данные после установленной даты", - "syncRecentData": "сдвигает дату синхронизации со временем, синхронизируя только свежие данные", - "folderLimitDescription": "Ограничить количество писем для синхронизации в папке (минимум 100). Оставьте пустым для снятия ограничений.", - "folderLimitPlaceholder": "например, 1000", - "imap": "IMAP", - "minutes": "минут", - "accountHasBeenSuccessfully": "Аккаунт успешно {{action}}", - "enableAccount": "Включить аккаунт", - "disableAccount": "Отключить аккаунт", - "areYouSureYouWantTo": "Вы уверены, что хотите {{action}} этот аккаунт?", - "enable": "Включить", - "disable": "Отключить", - "thisWillPreventTheAccountFromBeingUsed": "Этот аккаунт больше не будет синхронизировать данные с IMAP-сервера, но существующие данные останутся доступными.", - "disabled": "Отключено", - "useDangerous": "Доверять любому TLS‑сертификату", - "useDangerousDescription": "Включите этот параметр только если IMAP‑сервер использует публичный CA‑сертификат или самоподписанный сертификат, который система может не распознавать. Это отключает стандартную проверку сертификатов и может подвергнуть соединение атакам «человек‑посередине» — активируйте только если вы понимаете риски." + "trigger": "Триггер" + }, + "tabs": { + "active_session": "Активная сессия", + "errors": "Ошибки", + "folders": "Почтовые ящики", + "global_errors": "Глобальные ошибки", + "history": "История" + } }, - "mailbox": { - "deleteMailboxDialog": { - "title": "Удалить папку почтового ящика", - "desc": "Вы уверены, что хотите удалить эту папку? Это действие невозможно отменить.", - "warningTitle": "Предупреждение", - "warningDesc": "Удаление этой папки также навсегда удалит все заархивированные электронные письма и подпапки, содержащиеся в ней.", - "confirm": "Удалить навсегда", - "successTitle": "Успешно удалено", - "successDesc": "Папка почтового ящика и ее содержимое были успешно удалены.", - "errorTitle": "Ошибка удаления" - }, - "title": "Почтовый ящик", - "folders": "Папки", - "messages": "Сообщения", - "noMessages": "Нет сообщений", - "selectFolder": "Выберите папку для просмотра сообщений", - "deleteDialog": { - "title": "Удалить письмо", - "desc": "Вы уверены, что хотите удалить {{countText}}? Это действие удалит выбранные письма из локальной базы данных. Письма будут удалены безвозвратно.", - "descCountSingle": "это письмо", - "descCountMultiple": "эти {{count}} писем", - "warningTitle": "Внимание!", - "warningDesc": "Пожалуйста, будьте осторожны перед продолжением.", - "confirm": "Удалить", - "successTitle": "Сообщения успешно удалены", - "successDesc": "Сообщения были удалены.", - "errorTitle": "Не удалось удалить сообщения" - }, - "thread": { - "title": "Цепочка ({{count}} {{messageLabel}})", - "message": "сообщение", - "messages": "сообщений", - "noSubject": "(Без темы)", - "invalidDate": "Неверная дата", - "empty": "Нет сообщений в этой цепочке.", - "loadError": "Не удалось загрузить цепочку", - "loadingMore": "Загрузка...", - "loadMore": "Загрузить ещё" - }, - "bulkActions": { - "ariaLabel": "Массовые действия для {{count}} выбранных {{emailLabel}}", - "email": "письма", - "emails": "писем", - "selected": "выбрано", - "clearSelection": "Снять выделение", - "clearSelectionWithKey": "Снять выделение ({{key}})", - "delete": "Удалить", - "deleteTooltip": "Удалить выбранные письма" - } + "saveChanges": "Сохранить изменения", + "selectAtLeastOneFolder": "Пожалуйста, выберите хотя бы одну папку", + "selectAuthMethod": "Выберите метод авторизации", + "selectDate": "Выберите дату", + "selectEncryptionMethod": "Выберите метод шифрования", + "selectMailboxes": "Выбрать почтовые ящики", + "selectMode": "Выберите режим фильтра", + "selectProxy": "Выберите прокси", + "selectUnit": "Выберите единицу", + "selectedMailboxes": "Выбранные почтовые ящики", + "serverConfiguration": "Конфигурация сервера (IMAP)", + "since": "с", + "sinceFixed": "С определенной даты", + "sinceRelative": "Скачать только недавние письма", + "sinceRelativeValue": "Скачать письма за последние", + "state": "Состояние", + "status": "Статус", + "step": "Шаг {{index}}", + "steps": { + "complete": "Завершено", + "emailAddress": "Email адрес", + "imap": "IMAP", + "summary": "Итог", + "syncPreferences": "Настройки синхронизации" }, - "search": { - "size": "Размер", - "any": "Любой", - "tiny": "Очень маленький (<15 КБ)", - "small": "Маленький (<2 МБ)", - "medium": "Средний (2 - 10 МБ)", - "large": "Большой (10 - 20 МБ)", - "huge": "Огромный (≥20 MB)", - "sort": "Сортировка", - "sizeDescription": "Размер означает общий размер электронного письма, включая вложения.", - "title": "Поиск", - "searching": "Поиск, пожалуйста, подождите...", - "noEmailsFound": "Письма не найдены", - "startSearching": "Начните с ввода ключевого слова, отправителя или использования фильтров.", - "adjustSearch": "Попробуйте изменить критерии поиска или очистить фильтры.", - "tagFilter": "Фильтр по тегам", - "from": "От", - "to": "Кому", - "subject": "Тема", - "date": "Дата", - "editTag": "Ред. тег", - "keyword": "Ключевое слово", - "sender": "Отправитель", - "recipient": "Получатель", - "hasAttachment": "Есть вложение", - "yes": "Да", - "no": "Нет", - "dateRange": "Диапазон дат", - "startDate": "Дата начала", - "endDate": "Дата окончания", - "advancedFilters": "Расширенные фильтры", - "searchArchivedEmails": "Искать в архивированных письмах", - "fullTextMultiAccount": "Полнотекстовый · Мультиаккаунт · Расширенные фильтры", - "account": "Аккаунт", - "mailbox": "Ящик", - "selectAccount": "Выбрать аккаунт", - "selectMailbox": "Выбрать ящик", - "noActiveEmailAccount": "Нет активного почтового аккаунта.", - "addEmailAccount": "Добавить почтовый аккаунт", - "noMailboxSelectAccount": "Нет ящика. Сначала выберите аккаунт.", - "searchInSubjectBody": "Искать в теме, теле, вложениях...", - "searchingButton": "Поиск...", - "searchButton": "Найти", - "advanced": "Дополнительно", - "clear": "Очистить", - "since": "С:", - "before": "До:", - "selectDate": "Выберите дату", - "pleaseSelectAtLeastOne": "Пожалуйста, выберите хотя бы одно условие поиска", - "cc": "Копия", - "bcc": "Скрытая копия", - "attachmentName": "Имя вложения", - "messageId": "Message ID", - "minSize": "Мин. размер", - "maxSize": "Макс. размер", - "senderRecipients": "Отправитель / Получатели", - "attachmentsSize": "Вложения и Размер", - "minimumBytes": "Минимум", - "maximumBytes": "Максимум", - "originalMessageIdHeader": "Заголовок Message-ID оригинального письма", - "addTags": { - "title": "Редактировать теги", - "none": "Теги не добавлены", - "searchPlaceholder": "Найти или создать тег...", - "createHint": "Создать новый тег: {{tag}}", - "invalidTitle": "Неверный тег", - "updatedTitle": "Теги обновлены", - "updatedDesc": "Теги были успешно обновлены", - "updateFailedTitle": "Ошибка обновления", - "tryAgain": "Пожалуйста, попробуйте позже", - "selectedCount": "{{count}} тегов выбрано", - "cancel": "Отмена", - "save": "Сохранить", - "saving": "Сохранение..." - }, - "updateTags": { - "overwriteWarning": "Предупреждение: это перезапишет все существующие теги в выбранных элементах.", - "title": "Обновить теги", - "none": "Теги не выбраны", - "searchPlaceholder": "Поиск или создание тега...", - "createHint": "Нажмите Enter, чтобы создать тег: \"{{tag}}\"", - "selectedCount": "Будет применено тегов: {{count}}", - "cancel": "Отмена", - "invalidTitle": "Недопустимый тег", - "updatedTitle": "Теги обновлены", - "updatedDesc": "Теги были успешно обновлены.", - "updateFailedTitle": "Ошибка обновления", - "tryAgain": "Пожалуйста, попробуйте позже.", - "actionAdd": "Добавить", - "actionRemove": "Удалить", - "actionOverwrite": "Перезаписать", - "submitAdd": "Добавить теги", - "submitRemove": "Удалить теги", - "submitOverwrite": "Перезаписать теги", - "savingAdd": "Добавление...", - "savingRemove": "Удаление...", - "savingOverwrite": "Перезапись..." - }, - "thread": { - "title": "Цепочка · {{count}} сообщений", - "error": "Не удалось загрузить цепочку", - "empty": "Нет сообщений в этой цепочке", - "invalidDate": "Неверная дата", - "noSubject": "(Без темы)", - "loadingMore": "Загрузка...", - "loadMore": "Загрузить ещё" - }, - "bulkActions": { - "ariaLabel": "Выбрано сообщений: {{count}}. Панель действий", - "delete": "Удалить", - "deleteDesc": "Удалить выбранные", - "selected": "Выбрано: {{count}}", - "clear": "Очистить выбор", - "manageTags": "Управление тегами" - }, - "delete": { - "title": "Удалить сообщения", - "confirmPrefix": "Вы уверены, что хотите удалить", - "countLabel": "{{count}} сообщ.", - "confirmDetail": "Это действие нельзя отменить.", - "confirmButton": "Удалить", - "warningTitle": "Предупреждение", - "warningDesc": "Сообщения будут удалены безвозвратно.", - "successTitle": "Удалено", - "successDesc": "Успешно удалено.", - "errorTitle": "Ошибка удаления" - } + "submit": "Отправить", + "syncAfterDate": "синхронизирует данные после установленной даты", + "syncRecentData": "сдвигает дату синхронизации со временем, синхронизируя только свежие данные", + "syncStartDateDescription": "Определяет дату начала синхронизации — фиксированную или относительную к текущему моменту. Предыдущие письма исключаются, {{fixedPart}}.", + "theAccountHasNotCompletedTheAuthorizationProcess": "Аккаунт не завершил процесс авторизации. Пожалуйста, ", + "thisAccountIsUsedForIdentificationPurposesOnly": "Этот аккаунт используется только для идентификации и не требует синхронизации с почтовым сервером. Он помогает при импорте почтовых данных.", + "thisWillPreventTheAccountFromBeingUsed": "Этот аккаунт больше не будет синхронизировать данные с IMAP-сервера, но существующие данные останутся доступными.", + "title": "Почтовые учетные записи", + "toAuthorizeTheAccount": ", чтобы авторизовать аккаунт.", + "type": "Тип", + "unit": "Единица", + "updateAccount": "Обновить аккаунт", + "updateFailed": "Ошибка обновления, попробуйте позже", + "updateTheEmailAccountHere": "Обновите почтовый аккаунт здесь. ", + "updatedAt": "Обновлено", + "useDangerous": "Доверять любому TLS‑сертификату", + "useDangerousDescription": "Включите этот параметр только если IMAP‑сервер использует публичный CA‑сертификат или самоподписанный сертификат, который система может не распознавать. Это отключает стандартную проверку сертификатов и может подвергнуть соединение атакам «человек‑посередине» — активируйте только если вы понимаете риски.", + "useNoProxy": "Без прокси", + "useProxy": "Использовать прокси", + "useProxyField": "использовать прокси", + "value": "Значение", + "viewDetails": "смотреть детали", + "years": "Годы" + }, + "apiDocs": { + "choosePreferredType": "Выберите предпочтительный тип документации API", + "downloadSpecYAML": "Скачать Spec YAML", + "openAPIExplorer": "OpenAPI Explorer", + "reDoc": "ReDoc", + "scalar": "Scalar", + "swaggerUI": "Swagger UI" + }, + "apiTokens": { + "deleteDialog": { + "cancel": "Отмена", + "confirm": "Удалить", + "deleting": "Удаление...", + "description": "Это действие нельзя отменить. Любое приложение, использующее этот токен, мгновенно потеряет доступ.", + "title": "Удалить токен доступа?" }, - "mail": { - "emailViewer": "Просмотр письма", - "noMessageSelected": "Сообщение не выбрано", - "account": "Аккаунт", - "from": "От", - "to": "Кому", - "subject": "Тема", - "date": "Дата", - "tags": "Теги", - "noTagsYet": "Тегов пока нет", - "id": "ID", - "cc": "Копия", - "bcc": "Скрытая", - "attachments": "Вложения", - "download": "Скачать", - "delete": "Удалить", - "viewThread": "Смотреть цепочку", - "downloadStarted": "Скачивание началось", - "downloadComplete": "Скачивание завершено", - "downloadFailed": "Ошибка скачивания", - "failedToDownloadFile": "Не удалось скачать файл", - "failedToLoadEmail": "Не удалось загрузить сообщение.", - "isBeingDownloaded": "{{id}} скачивается", - "downloaded": "{{id}} скачано", - "showLess": "свернуть", - "showMore": "показать ещё...", - "onlyNonInlineAttachments": "Здесь показаны только не встроенные вложения.", - "noAttachments": "Нет вложений" + "dialog": { + "createTitle": "Создать токен доступа", + "description": "Нажмите сохранить по завершении.", + "editTitle": "Изменить токен доступа", + "save": "Сохранить", + "saveChanges": "Сохранить изменения" }, - "oauth2": { - "title": "OAuth2", - "addConfiguration": "Добавить конфигурацию", - "id": "ID", - "provider": "Провайдер", - "clientId": "Client ID", - "clientSecret": "Client Secret", - "redirectUri": "Redirect URI", - "scopes": "Scopes", - "status": "Статус", - "enabled": "Включено", - "disabled": "Отключено", - "edit": "Ред.", - "delete": "Удалить", - "enable": "Включить", - "disable": "Отключить", - "noConfigurations": "Нет конфигураций OAuth2", - "noConfigurationsDesc": "Вы еще не добавили конфигурации OAuth2. Добавьте одну, чтобы начать использовать функции OAuth2.", - "description": "Автоматическая обработка получения, хранения и обновления токенов доступа, обеспечивающая беспрепятственную и всегда готовую аутентификацию.", - "addNew": "Добавить новую", - "updateHere": "Обновить здесь.", - "createNewHere": "Создать новую здесь.", - "clickSaveWhenDone": "Нажмите сохранить, когда закончите.", - "quickPresets": "Быстрые настройки:", - "gmail": "Gmail", - "outlook": "Outlook", - "whenDisabled": "При отключении: - Новые потоки авторизации будут немедленно отклонены - Существующие access и refresh токены будут отозваны в течение 1 минуты - Пользователи должны будут пройти повторную авторизацию при повторном включении", - "clientIdLabel": "Client Id:", - "enterYourClientId": "Введите ваш client ID", - "theUniqueIdentifierForYourApplication": "Уникальный идентификатор вашего приложения, предоставленный провайдером OAuth.", - "clientSecretLabel": "Client Secret:", - "leaveEmptyToKeepExistingSecret": "Оставьте пустым, чтобы сохранить существующий секрет", - "enterYourClientSecret": "Введите ваш client secret", - "leaveEmptyToKeepTheExistingSecret": "Оставьте пустым, чтобы сохранить существующий секрет. Вводите новое значение только если хотите его изменить.", - "aSecretKeyProvidedByTheOAuthProvider": "Секретный ключ, предоставленный провайдером OAuth для аутентификации вашего приложения.", - "authUrlLabel": "Auth Url:", - "enterTheAuthorizationUrl": "Введите URL авторизации", - "theUrlWhereUsersWillBeRedirected": "URL, на который пользователи будут перенаправлены для авторизации вашего приложения.", - "tokenUrlLabel": "Token Url:", - "enterTheTokenUrl": "Введите URL токена", - "theUrlUsedToExchange": "URL, используемый для обмена кода авторизации на токен доступа.", - "redirectUrlLabel": "Redirect Url:", - "enterYourRedirectUrl": "Введите ваш URL перенаправления", - "theRedirectUrlAfterAuthorization": "URL перенаправления после авторизации. Он должен совпадать с тем, что зарегистрирован у провайдера OAuth. Используйте формат http://[host]:[port]/oauth2/callback (или https://), где [host] и [port] соответствуют вашему развертыванию RustMailer. Путь /oauth2/callback фиксирован.", - "scope": "Scope:", - "enterTheScopeHere": "Введите scope здесь.", - "addScope": "Добавить Scope", - "key": "Ключ:", - "enterTheKeyHere": "Введите ключ здесь.", - "value": "Значение:", - "enterTheValueHere": "Введите значение здесь.", - "addExtraParams": "Доп. параметры", - "useProxyOptional": "Использовать прокси (опционально):", - "selectAProxy": "Выберите прокси", - "noProxyAvailable": "Нет доступных прокси", - "useSocks5ProxyForOAuthRequests": "Использовать SOCKS5 прокси для запросов OAuth, когда прямой доступ заблокирован.", - "descriptionLabel": "Описание:", - "describeThePurposeOfTheOauth2Application": "Опишите назначение приложения oauth2", - "optional": "Опционально", - "saving": "Сохранение...", - "creating": "Создание...", - "saveChanges": "Сохранить изменения", - "save": "Сохранить", - "updated": "Обновлено", - "created": "Создано", - "yourOAuth2ApplicationHasBeenSuccessfully": "Ваше приложение OAuth2 было успешно {{action}}.", - "updateFailed": "Ошибка обновления", - "creationFailed": "Ошибка создания", - "updateOrCreationFailed": "{{action}} не удалось, попробуйте позже", - "clientSecretIsRequired": "Client Secret обязателен", - "clientSecretCannotBeEmpty": "Client Secret не может быть пустым", - "keyIsRequired": "Ключ обязателен", - "keyCannotBeEmpty": "Ключ не может быть пустым", - "valueIsRequired": "Значение обязательно", - "valueCannotBeEmpty": "Значение не может быть пустым", - "descriptionMustNotExceed255Characters": "Описание не должно превышать 255 символов.", - "clientIdIsRequired": "Client ID обязателен", - "clientIdCannotBeEmpty": "Client ID не может быть пустым", - "authorizationUrlIsRequired": "Authorization URL обязателен", - "authorizationUrlCannotBeEmpty": "Authorization URL не может быть пустым", - "invalidAuthorizationUrlFormat": "Неверный формат Authorization URL", - "tokenUrlIsRequired": "Token URL обязателен", - "tokenUrlCannotBeEmpty": "Token URL не может быть пустым", - "invalidTokenUrlFormat": "Неверный формат Token URL", - "redirectUriIsRequired": "Redirect URI обязателен", - "redirectUriCannotBeEmpty": "Redirect URI не может быть пустым", - "invalidRedirectUriFormat": "Неверный формат Redirect URI", - "authorizeEmailAccount": "Авторизовать почтовый аккаунт", - "authorizeAnEmailAccountToStartTheOAuth2AuthorizationProcess": "Авторизуйте почтовый аккаунт, чтобы начать процесс авторизации OAuth2.", - "loadingAccounts": "Загрузка аккаунтов...", - "selectAnAccount": "Выберите аккаунт", - "noEmailAccountsRegistered": "Нет зарегистрированных почтовых аккаунтов. Пожалуйста, создайте один.", - "pleaseCreateOne": "Пожалуйста, создайте один.", - "createAccount": "Создать аккаунт", - "authorize": "Авторизовать", - "getAuthorizeUrlFailed": "Ошибка получения URL авторизации", - "getAuthorizeUrlFailedDesc": "не удалось получить url авторизации, попробуйте позже", - "oauth2ClientUpdated": "Клиент OAuth2 обновлен", - "oauth2ClientHasBeenSuccessfully": "Клиент OAuth2 был успешно {{action}}.", - "statusUpdateFailed": "Ошибка обновления статуса, попробуйте позже", - "disableOAuth2Client": "Отключить клиент OAuth2", - "enableOAuth2Client": "Включить клиент OAuth2", - "areYouSureYouWantTo": "Вы уверены, что хотите {{action}} этот клиент OAuth2?", - "thisWillPreventTheOAuth2ClientFromBeingUsed": "Это предотвратит использование клиента OAuth2.", - "deleteToken": "Удалить токен", - "areYouSureYouWantToDelete": "Вы уверены, что хотите удалить", - "thisActionWillPermanentlyRemoveTheOauth2Record": "Это действие безвозвратно удалит запись oauth2 из системы. Это нельзя отменить.", - "enterIdToConfirmDeletion": "Введите id для подтверждения удаления.", - "warning": "Внимание!", - "pleaseBeCareful": "Пожалуйста, будьте осторожны, эту операцию нельзя отменить.", - "deleteSuccess": "Успешно удалено", - "yourOAuth2ApplicationHasBeenSuccessfullyDeleted": "Ваше приложение OAuth2 было успешно удалено.", - "oauth2DeleteFailed": "Ошибка удаления OAuth2", - "deleteFailed": "Ошибка удаления, попробуйте позже", - "actions": { - "openMenu": "Открыть меню", - "edit": "Ред.", - "authorize": "Авторизовать", - "delete": "Удалить" - }, - "authFailed": "Ошибка аутентификации OAuth2", - "error": "Ошибка", - "unknownError": "Произошла неизвестная ошибка.", - "tryAgain": "Попробовать снова", - "goHome": "На главную", - "authSuccess": "Аутентификация OAuth2 успешна", - "success": "Успех", - "successMessage": "Ваш почтовый аккаунт успешно аутентифицирован через OAuth2. Access Token был сохранен системой и будет автоматически обновляться по мере необходимости.", - "goToAccounts": "Перейти к аккаунтам", - "authAtatus": "Статус аутентификации OAuth2", - "information": "Информация", - "noStatus": "Эта страница отображает результат вашей аутентификации OAuth2. В настоящее время конкретный статус недоступен. Пожалуйста, попробуйте снова, если необходимо.", - "backToLogin": "Назад к входу" + "form": { + "1day": "1 день", + "30days": "30 дней", + "7days": "7 дней", + "errorInt": "Должно быть целым числом", + "errorMax": "Макс. 32 символа", + "errorNumber": "Должно быть числом", + "errorPositive": "Должно быть больше 0", + "expirationDescription": "Токены автоматически истекают через выбранное время.", + "expirationLabel": "Срок действия", + "expirationPlaceholder": "Выберите срок", + "nameDescription": "Опционально · макс. 32 символа", + "nameLabel": "Имя", + "namePlaceholder": "Дайте токену короткое имя", + "never": "Никогда" }, - "accessTokens": { - "title": "Токены доступа", - "name": "Имя", - "accounts": "Аккаунты", - "token": "Токен", - "createdAt": "Создано", - "expiresAt": "Истекает", - "edit": "Ред.", - "delete": "Удалить", - "create": "Создать", - "noTokens": "Нет токенов доступа", - "noTokensDesc": "Вы еще не создали токены доступа. Создайте один, чтобы начать использовать функции API.", - "description": "Управляйте токенами доступа, контролем доступа, белыми списками IP и ограничениями частоты запросов.", - "editToken": "Ред. токен", - "addNew": "Добавить новый", - "updateTheAccessTokenHere": "Обновите токен доступа здесь.", - "createNewAccessTokenHere": "Создайте новый токен доступа здесь.", - "selectAccounts": "Выберите аккаунты", - "selectMultipleAccountsForTheAccessToken": "Выберите несколько аккаунтов для области авторизации токена доступа.", - "enterOneIpAddressPerLine": "Введите по одному IP-адресу на строку, например:\n192.168.1.1\n192.168.1.2", - "aListOfIpAddressesAllowed": "Список IP-адресов, которым разрешен доступ к ресурсу. Вводите один IP на строку. (Опционально)", - "enterQuota": "Введите квоту, например, 100", - "theMaximumNumberOfRequestsAllowed": "Максимальное количество запросов, разрешенное в интервале. (Опционально)", - "enterIntervalInSeconds": "Введите интервал в секундах, например, 60", - "theTimeWindowForTheRateLimit": "Временное окно (в секундах) для ограничения скорости. (Опционально)", - "describeThePurposeOfTheAccessToken": "Опишите назначение токена доступа", - "updating": "Обновление...", - "saving": "Сохранение...", - "creating": "Создание...", - "saveChanges": "Сохранить изменения", - "save": "Сохранить", - "updated": "Обновлено", - "created": "Создано", - "yourAccessTokenHasBeenSuccessfully": "Ваш токен доступа был успешно {{action}}.", - "updateFailed": "Ошибка обновления", - "creationFailed": "Ошибка создания", - "updateOrCreationFailed": "{{action}} не удалось, попробуйте позже", - "quotaMustBeAPositiveInteger": "Квота должна быть положительным целым числом.", - "intervalMustBeAPositiveInteger": "Интервал должен быть положительным целым числом.", - "invalidIpAddressesFound": "Найдены неверные IP-адреса. Пожалуйста, введите корректные IPv4 или IPv6 адреса.", - "atLeastOneAccountIsRequired": "Требуется хотя бы один аккаунт.", - "descriptionMustNotExceed255Characters": "Описание не должно превышать 255 символов.", - "notUsedYet": "Еще не использовался", - "theListOfAccountsThatCanBeQueried": "Список аккаунтов, которые можно запрашивать с помощью токена доступа.", - "accountId": "ID аккаунта", - "filterByEmailAddressOrAccountId": "Фильтр по email или ID аккаунта...", - "aclRulesForAccessTokens": "Правила ACL для токенов доступа включают проверку белого списка IP и соблюдение ограничений скорости.", - "actions": { - "openMenu": "Открыть меню", - "edit": "Ред.", - "delete": "Удалить" - }, - "quota": "Квота", - "interval": "Интервал" + "list": { + "createdLabel": "Создан", + "deleteBtn": "Удалить токен", + "expiresOnLabel": "Истекает", + "expiresOnShort": "Истекает {{date}}", + "lastUsedLabel": "Использован", + "neverExpires": "Бессрочно", + "neverLabel": "Никогда", + "neverUsed": "Никогда", + "statusActive": "Активен", + "statusExpired": "Истек", + "tokenLabel": "Токен", + "unnamedToken": "Безымянный токен" }, - "settings": { - "appearance": { - "title": "Внешний вид", - "field": { - "language": "Язык интерфейса", - "theme": "Тема интерфейса" - }, - "description": { - "language": "Выберите язык веб-интерфейса.", - "theme": "Выберите светлый или темный режим." - }, - "placeholder": { - "select_language": "Выберите язык" - }, - "command": { - "search": "Поиск языка...", - "no_results": "Язык не найден." - }, - "theme": { - "light": "Светлая", - "dark": "Темная" - }, - "button": { - "update": "Обновить настройки" - }, - "validation": { - "language": { - "required": "Пожалуйста, выберите язык." - }, - "theme": { - "required": "Пожалуйста, выберите тему." - } - } - }, - "title": "Настройки", - "general": "Общие", - "proxy": "Прокси", - "name": "Имя", - "host": "Хост", - "port": "Порт", - "username": "Имя пользователя", - "password": "Пароль", - "type": "Тип", - "actions": "Действия", - "edit": "Ред.", - "delete": "Удалить", - "add": "Добавить", - "noProxies": "Нет прокси", - "noProxiesDesc": "Вы еще не добавили конфигурации прокси. Добавьте одну, чтобы начать использовать функции прокси.", - "root": "Root", - "rootTitle": "Root", - "rootDesc": "Управление учетными данными root-доступа, включая токен и пароль.", - "rootAccessManagement": "Управление Root-доступом", - "manageRootTokenAndPassword": "Безопасное управление root-токеном и паролем.", - "resetRootToken": "Сбросить Root Token", - "generateNewToken": "Сгенерировать новый токен, старый немедленно истечет.", - "reset": "Сброс", - "resetRootPassword": "Сбросить Root пароль", - "changePasswordForFutureLogins": "Изменить пароль для будущих входов.", - "youAreAboutToResetTheRootToken": "Вы собираетесь сбросить root-токен. Это действие нельзя отменить.", - "confirmReset": "Подтвердить сброс", - "youAreAboutToResetTheRootPassword": "Вы собираетесь сбросить root-пароль. Убедитесь, что сохранили его надежно.", - "enterNewRootPassword": "Введите новый root пароль", - "theRootTokenHasBeenReset": "Root-токен был сброшен", - "yourLoginInformationHasBeenUpdated": "Ваша информация для входа обновлена. Нет необходимости входить снова.", - "invalidPassword": "Неверный пароль", - "rootPasswordMustBeAtLeast6Characters": "Root-пароль должен быть длиной не менее 6 символов.", - "theRootPasswordHasBeenReset": "Root-пароль был сброшен", - "useNewPasswordForNextLogin": "Используйте новый пароль для следующего входа.", - "failedToCopyText": "Не удалось скопировать текст", - "filterProxy": "Фильтр прокси...", - "filterOauth2": "Фильтр oauth2...", - "filterAccount": "Фильтр аккаунт...", - "filterAccessToken": "Фильтр access token...", - "selectAll": "Выбрать все", - "theme": "Тема", - "id": "Id", - "url": "Url", - "createdAt": "Создано", - "updatedAt": "Обновлено", - "enabled": "Включено", - "useProxy": "Исп. прокси", - "authUrl": "Auth Url", - "tokenUrl": "Token Url", - "description": "Описание", - "token": "Токен", - "accounts": "Аккаунты", - "acl": "Acl", - "lastAccess": "Посл. доступ", - "enterProxyIdToConfirmDeletion": "Введите ID прокси для подтверждения удаления.", - "updateTheProxyHere": "Обновите прокси здесь. ", - "addNewProxyHere": "Добавьте новый прокси здесь. ", - "pleaseUseAnIpAddressForBetterReliability": "Пожалуйста, используйте IP-адрес (например, 127.0.0.1), а не имя хоста или домен для большей надежности.", - "adding": "Добавление...", - "yourProxyHasBeenSuccessfully": "Ваш прокси был успешно {{action}}.", - "proxyUpdateOrAddFailed": "{{action}} не удалось, попробуйте позже", - "sidebar": { - "profile": "Профиль", - "apiTokens": "API-токены", - "proxy": "Сетевой прокси", - "configurations": "Системные конфигурации" - }, - "profile": { - "loadError": "Не удалось загрузить информацию о пользователе.", - "uploadTitle": "Загрузить аватар", - "maxSize": "До {{size}}", - "avatarAlt": "Аватар", - "removeAvatar": "Удалить аватар", - "uploadError": "Ошибка(и) загрузки файла", - "field": { - "username": "Имя пользователя", - "email": "Электронная почта", - "password": "Пароль" - }, - "placeholder": { - "password_keep": "Оставьте пустым, чтобы сохранить текущий пароль" - }, - "button": { - "update_profile": "Обновить профиль", - "permissions": "Права доступа", - "view_global_permissions": "Просмотреть глобальные права" - }, - "section": { - "roles": "Роли", - "accounts": "{{count}} связанных аккаунтов" - }, - "account": { - "id": "ID аккаунта: {{id}}" - }, - "toast": { - "updated": "Профиль успешно обновлён", - "update_failed": "Не удалось обновить профиль" - }, - "validation": { - "username": { - "required": "Имя пользователя обязательно", - "min": "Имя пользователя должно содержать не менее 5 символов", - "max": "Имя пользователя должно содержать не более 32 символов" - }, - "email": { - "required": "Электронная почта обязательна", - "invalid": "Введите корректный адрес электронной почты" - }, - "password": { - "min": "Пароль должен содержать не менее 8 символов", - "max": "Пароль должен содержать не более 256 символов" - } - } - } + "notifications": { + "close": "Закрыть", + "copied": "Скопировано", + "createFailed": "Ошибка создания", + "createSuccess": "Токен создан", + "createSuccessDesc": "Токен доступа успешно создан.", + "deleteFailed": "Ошибка удаления", + "deleteSuccess": "Токен удален", + "genericError": "Ошибка. Попробуйте еще раз.", + "tryAgain": "Повторить", + "updateFailed": "Ошибка обновления", + "updateSuccess": "Токен обновлен", + "updateSuccessDesc": "Токен доступа успешно обновлен." }, - "apiDocs": { - "choosePreferredType": "Выберите предпочтительный тип документации API", - "swaggerUI": "Swagger UI", - "reDoc": "ReDoc", - "openAPIExplorer": "OpenAPI Explorer", - "scalar": "Scalar", - "downloadSpecYAML": "Скачать Spec YAML" + "page": { + "addBtn": "Добавить токен", + "emptyDescription": "Вы еще не создали ни одного API-токена. Нажмите ниже, чтобы создать.", + "emptyTitle": "Нет API-токенов", + "loadError": "Ошибка загрузки API-токенов." + } + }, + "attachment": { + "all_fields_desc": "Поиск по имени вложения, теме и отправителю", + "date": "Дата", + "name": "Имя файла", + "search_input_placeholder": "Поиск вложений (используйте \" \" для фразового поиска)", + "sender": "Отправитель", + "sender_with_count": "Отправитель ({{count}})", + "size": "Размер файла", + "source": "Источник", + "subject": "Тема" + }, + "auth": { + "areYouSureYouWantToLogOut": "Вы уверены, что хотите выйти?", + "invalidPassword": "Неверный пароль. Пожалуйста, попробуйте снова.", + "login": "Войти", + "loginFailed": "Ошибка входа", + "logout": "Выйти", + "password": "Пароль", + "sessionExpired": "Сессия истекла!", + "sessionExpiredDesc": "Ваш сеанс завершен из-за неактивности. Пожалуйста, войдите снова, чтобы продолжить.", + "somethingWentWrong": "Что-то пошло не так", + "username": "Имя пользователя", + "welcome": "Добро пожаловать в Bichon", + "youWillNeedToLogInAgain": "Вам нужно будет снова войти в систему, чтобы получить доступ к учетной записи." + }, + "command": { + "dark": "Темная", + "light": "Светлая", + "noResultsFound": "Результатов не найдено.", + "theme": "Тема", + "typeCommandOrSearch": "Введите команду или поиск..." + }, + "common": { + "actions": "Действия", + "add": "Добавить", + "all": "Все", + "apply": "Применить", + "back": "Назад", + "backToHome": "На главную", + "cancel": "Отмена", + "clear": "Очистить", + "close": "Закрыть", + "confirm": "Подтвердить", + "create": "Создать", + "delete": "Удалить", + "deleting": "Удаление...", + "deselectAll": "Снять выделение", + "edit": "Редактировать", + "empty": "Пусто", + "error": "Ошибка", + "failed": "Ошибка", + "filter": "Фильтр", + "goBack": "Вернуться", + "loading": "Загрузка...", + "more": "Ещё", + "na": "Н/Д", + "no": "Нет", + "noData": "Нет данных", + "none": "Ничего", + "notFound": "Не найдено", + "ok": "ОК", + "op_failed": "Операция не удалась", + "project_description": "Bichon — это проект с открытым исходным кодом.", + "remove": "Удалить", + "reset": "Сброс", + "retry": "Повторить", + "save": "Сохранить", + "save_changes": "Сохранить изменения", + "search": "Поиск", + "select": "Выбрать", + "selectAll": "Выбрать все", + "showLess": "Показать меньше", + "showMore": "Показать больше...", + "submit": "Отправить", + "table": { + "noResults": "Нет результатов." }, - "dialogs": { - "confirmDelete": "Подтвердить удаление", - "confirmDeleteDesc": "Вы уверены, что хотите удалить этот элемент? Это действие нельзя отменить.", - "deleteSuccess": "Успешно удалено", - "deleteFailed": "Не удалось удалить", - "saveSuccess": "Успешно сохранено", - "saveFailed": "Не удалось сохранить", - "createSuccess": "Успешно создано", - "createFailed": "Не удалось создать", - "updateSuccess": "Успешно обновлено", - "updateFailed": "Не удалось обновить", - "continue": "Продолжить", - "deleting": "Удаление...", - "accountDeleted": "Аккаунт удален", - "accountDeletedDesc": "Ваш аккаунт был успешно удален.", - "accountDeleteFailed": "Ошибка удаления аккаунта", - "deleteAccountPermanently": "Удалить аккаунт навсегда", - "youAreDeleting": "Вы удаляете {{email}}. Это безвозвратно удалит:", - "accountCredentials": "Учетные данные аккаунта и настройки", - "localCachedMetadata": "Локально кэшированные метаданные и статус синхронизации", - "imapSyncData": "Данные синхронизации IMAP", - "oauthTokens": "Токены OAuth и учетные данные API", - "typeEmailToConfirm": "Введите email аккаунта для подтверждения:", - "typeToConfirm": "Введите \"{{email}}\" для подтверждения", - "cannotBeUndone": "Это действие нельзя отменить!", - "allResourcesErased": "Все связанные ресурсы будут безвозвратно стерты.", - "permanentlyDeleteAccount": "Удалить аккаунт навсегда" + "tryAgain": "Повторить", + "update": "Обновить", + "view_on_github_button": "Посмотреть на GitHub", + "yes": "Да" + }, + "dashboard": { + "account": "Аккаунт", + "actualDiskUsage": "Фактическое использование диска", + "attachmentRatio": "Соотношение вложений", + "attachmentRatioDesc": "{{percent}}% писем содержат вложения", + "attachments": "Вложения", + "byMessageCount": "По количеству сообщений", + "byMessageSize": "По размеру сообщения", + "connected": "Подключено", + "count": "Количество", + "dataStorage": "Хранилище", + "dayTrend": "Тренд за 30 дней", + "efficiency": "Эффективность", + "emails": "Письма", + "indexSize": "Размер индекса", + "localDataFiles": "Локальные файлы данных", + "logicalVolume": "Оригинальный размер", + "mailAccounts": "Почтовые аккаунты", + "messageDistribution": "Распределение сообщений", + "metadataSize": "Размер метаданных", + "newEmails": "Новые письма", + "noAccountData": "Нет данных об аккаунте", + "noAttachments": "Без вложений", + "noEmailsSynced": "Письма пока не синхронизированы", + "noLargeEmails": "Нет больших писем", + "noRecentActivity": "Нет недавней активности", + "noSendersData": "Нет данных об отправителях", + "noSubject": "(Без темы)", + "saved": "Сэкономлено", + "sender": "Отправитель", + "size": "Размер", + "subject": "Тема", + "syncedLocally": "Синхронизировано локально", + "systemVersion": "Версия системы", + "tantivyDatabase": "На базе поискового движка Tantivy", + "title": "Дашборд", + "top10Accounts": "Топ 10 аккаунтов", + "top10LargestEmails": "Топ 10 самых больших писем", + "top10Senders": "Топ 10 отправителей", + "topLists": "Топ списки", + "totalEmailSize": "Общий размер писем", + "totalEmails": "Всего писем", + "withAttachments": "С вложениями" + }, + "dialogs": { + "accountCredentials": "Учетные данные аккаунта и настройки", + "accountDeleteFailed": "Ошибка удаления аккаунта", + "accountDeleted": "Аккаунт удален", + "accountDeletedDesc": "Ваш аккаунт был успешно удален.", + "allResourcesErased": "Все связанные ресурсы будут безвозвратно стерты.", + "cannotBeUndone": "Это действие нельзя отменить!", + "confirmDelete": "Подтвердить удаление", + "confirmDeleteDesc": "Вы уверены, что хотите удалить этот элемент? Это действие нельзя отменить.", + "continue": "Продолжить", + "createFailed": "Не удалось создать", + "createSuccess": "Успешно создано", + "deleteAccountPermanently": "Удалить аккаунт навсегда", + "deleteFailed": "Не удалось удалить", + "deleteSuccess": "Успешно удалено", + "deleting": "Удаление...", + "imapSyncData": "Данные синхронизации IMAP", + "localCachedMetadata": "Локально кэшированные метаданные и статус синхронизации", + "oauthTokens": "Токены OAuth и учетные данные API", + "permanentlyDeleteAccount": "Удалить аккаунт навсегда", + "saveFailed": "Не удалось сохранить", + "saveSuccess": "Успешно сохранено", + "typeEmailToConfirm": "Введите email аккаунта для подтверждения:", + "typeToConfirm": "Введите \"{{email}}\" для подтверждения", + "updateFailed": "Не удалось обновить", + "updateSuccess": "Успешно обновлено", + "youAreDeleting": "Вы удаляете {{email}}. Это безвозвратно удалит:" + }, + "errors": { + "contentNotModified": "Контент не изменен!", + "forbidden": "Запрещено", + "forbiddenDesc": "У вас нет необходимых прав для просмотра этого ресурса.", + "forbiddenTitle": "Доступ запрещен", + "internalServerError": "Внутренняя ошибка сервера!", + "learnMore": "Подробнее", + "maintenance": "Обслуживание", + "maintenanceDesc": "Сайт в данный момент недоступен. Мы скоро вернемся онлайн.", + "maintenanceTitle": "Сайт находится на обслуживании!", + "networkError": "Ошибка сети", + "networkErrorDesc": "Не удалось подключиться к серверу. Проверьте интернет-соединение и попробуйте снова.", + "pageNotFound": "Ой! Страница не найдена!", + "pageNotFoundDesc": "Похоже, страница, которую вы ищете, не существует или была удалена.", + "somethingWentWrong": "Ой! Что-то пошло не так :')", + "somethingWentWrongDesc": "Приносим извинения за неудобства. Пожалуйста, попробуйте позже.", + "unauthorized": "Неавторизован", + "unauthorizedDesc": "Пожалуйста, войдите с соответствующими учетными данными для доступа к этому ресурсу.", + "unauthorizedTitle": "Несанкционированный доступ" + }, + "mail": { + "account": "Аккаунт", + "attachments": "Вложения", + "bcc": "Скрытая", + "cc": "Копия", + "date": "Дата", + "delete": "Удалить", + "download": "Скачать", + "downloadComplete": "Скачивание завершено", + "downloadFailed": "Ошибка скачивания", + "downloadStarted": "Скачивание началось", + "downloaded": "{{id}} скачано", + "emailViewer": "Просмотр письма", + "failedToDownloadFile": "Не удалось скачать файл", + "failedToLoadEmail": "Не удалось загрузить сообщение.", + "from": "От", + "id": "ID", + "isBeingDownloaded": "{{id}} скачивается", + "noAttachments": "Нет вложений", + "noMessageSelected": "Сообщение не выбрано", + "noTagsYet": "Тегов пока нет", + "onlyNonInlineAttachments": "Здесь показаны только не встроенные вложения.", + "showLess": "свернуть", + "showMore": "показать ещё...", + "subject": "Тема", + "tags": "Теги", + "to": "Кому", + "viewThread": "Смотреть цепочку" + }, + "mailbox": { + "bulkActions": { + "ariaLabel": "Массовые действия для {{count}} выбранных {{emailLabel}}", + "clearSelection": "Снять выделение", + "clearSelectionWithKey": "Снять выделение ({{key}})", + "delete": "Удалить", + "deleteTooltip": "Удалить выбранные письма", + "email": "письма", + "emails": "писем", + "selected": "выбрано" }, - "command": { - "typeCommandOrSearch": "Введите команду или поиск...", - "noResultsFound": "Результатов не найдено.", - "theme": "Тема", - "light": "Светлая", - "dark": "Темная" + "deleteDialog": { + "confirm": "Удалить", + "desc": "Вы уверены, что хотите удалить {{countText}}? Это действие удалит выбранные письма из локальной базы данных. Письма будут удалены безвозвратно.", + "descCountMultiple": "эти {{count}} писем", + "descCountSingle": "это письмо", + "errorTitle": "Не удалось удалить сообщения", + "successDesc": "Сообщения были удалены.", + "successTitle": "Сообщения успешно удалены", + "title": "Удалить письмо", + "warningDesc": "Пожалуйста, будьте осторожны перед продолжением.", + "warningTitle": "Внимание!" + }, + "deleteMailboxDialog": { + "confirm": "Удалить навсегда", + "desc": "Вы уверены, что хотите удалить эту папку? Это действие невозможно отменить.", + "errorTitle": "Ошибка удаления", + "successDesc": "Папка почтового ящика и ее содержимое были успешно удалены.", + "successTitle": "Успешно удалено", + "title": "Удалить папку почтового ящика", + "warningDesc": "Удаление этой папки также навсегда удалит все заархивированные электронные письма и подпапки, содержащиеся в ней.", + "warningTitle": "Предупреждение" + }, + "folders": "Папки", + "messages": "Сообщения", + "noMessages": "Нет сообщений", + "selectFolder": "Выберите папку для просмотра сообщений", + "thread": { + "empty": "Нет сообщений в этой цепочке.", + "invalidDate": "Неверная дата", + "loadError": "Не удалось загрузить цепочку", + "loadMore": "Загрузить ещё", + "loadingMore": "Загрузка...", + "message": "сообщение", + "messages": "сообщений", + "noSubject": "(Без темы)", + "title": "Цепочка ({{count}} {{messageLabel}})" + }, + "title": "Почтовый ящик" + }, + "navigation": { + "accessTokens": "Токены доступа", + "accounts": "Учетные записи", + "apiDocs": "Документация API", + "attachment": "Вложения", + "auth": "Авторизация", + "dashboard": "Дашборд", + "general": "Общие", + "home": "Главная", + "mailbox": "Почтовый ящик", + "oauth2": "OAuth2", + "other": "Другое", + "settings": "Настройки", + "users": "Пользователи системы" + }, + "oauth2": { + "aSecretKeyProvidedByTheOAuthProvider": "Секретный ключ, предоставленный провайдером OAuth для аутентификации вашего приложения.", + "actions": { + "authorize": "Авторизовать", + "delete": "Удалить", + "edit": "Ред.", + "openMenu": "Открыть меню" + }, + "addConfiguration": "Добавить конфигурацию", + "addExtraParams": "Доп. параметры", + "addNew": "Добавить новую", + "addScope": "Добавить Scope", + "areYouSureYouWantTo": "Вы уверены, что хотите {{action}} этот клиент OAuth2?", + "areYouSureYouWantToDelete": "Вы уверены, что хотите удалить", + "authAtatus": "Статус аутентификации OAuth2", + "authFailed": "Ошибка аутентификации OAuth2", + "authSuccess": "Аутентификация OAuth2 успешна", + "authUrlLabel": "Auth Url:", + "authorizationUrlCannotBeEmpty": "Authorization URL не может быть пустым", + "authorizationUrlIsRequired": "Authorization URL обязателен", + "authorize": "Авторизовать", + "authorizeAnEmailAccountToStartTheOAuth2AuthorizationProcess": "Авторизуйте почтовый аккаунт, чтобы начать процесс авторизации OAuth2.", + "authorizeEmailAccount": "Авторизовать почтовый аккаунт", + "backToLogin": "Назад к входу", + "clickSaveWhenDone": "Нажмите сохранить, когда закончите.", + "clientId": "Client ID", + "clientIdCannotBeEmpty": "Client ID не может быть пустым", + "clientIdIsRequired": "Client ID обязателен", + "clientIdLabel": "Client Id:", + "clientSecret": "Client Secret", + "clientSecretCannotBeEmpty": "Client Secret не может быть пустым", + "clientSecretIsRequired": "Client Secret обязателен", + "clientSecretLabel": "Client Secret:", + "createAccount": "Создать аккаунт", + "createNewHere": "Создать новую здесь.", + "created": "Создано", + "creating": "Создание...", + "creationFailed": "Ошибка создания", + "delete": "Удалить", + "deleteFailed": "Ошибка удаления, попробуйте позже", + "deleteSuccess": "Успешно удалено", + "deleteToken": "Удалить токен", + "describeThePurposeOfTheOauth2Application": "Опишите назначение приложения oauth2", + "description": "Автоматическая обработка получения, хранения и обновления токенов доступа, обеспечивающая беспрепятственную и всегда готовую аутентификацию.", + "descriptionLabel": "Описание:", + "descriptionMustNotExceed255Characters": "Описание не должно превышать 255 символов.", + "disable": "Отключить", + "disableOAuth2Client": "Отключить клиент OAuth2", + "disabled": "Отключено", + "edit": "Ред.", + "enable": "Включить", + "enableOAuth2Client": "Включить клиент OAuth2", + "enabled": "Включено", + "enterIdToConfirmDeletion": "Введите id для подтверждения удаления.", + "enterTheAuthorizationUrl": "Введите URL авторизации", + "enterTheKeyHere": "Введите ключ здесь.", + "enterTheScopeHere": "Введите scope здесь.", + "enterTheTokenUrl": "Введите URL токена", + "enterTheValueHere": "Введите значение здесь.", + "enterYourClientId": "Введите ваш client ID", + "enterYourClientSecret": "Введите ваш client secret", + "enterYourRedirectUrl": "Введите ваш URL перенаправления", + "error": "Ошибка", + "getAuthorizeUrlFailed": "Ошибка получения URL авторизации", + "getAuthorizeUrlFailedDesc": "не удалось получить url авторизации, попробуйте позже", + "gmail": "Gmail", + "goHome": "На главную", + "goToAccounts": "Перейти к аккаунтам", + "id": "ID", + "information": "Информация", + "invalidAuthorizationUrlFormat": "Неверный формат Authorization URL", + "invalidRedirectUriFormat": "Неверный формат Redirect URI", + "invalidTokenUrlFormat": "Неверный формат Token URL", + "key": "Ключ:", + "keyCannotBeEmpty": "Ключ не может быть пустым", + "keyIsRequired": "Ключ обязателен", + "leaveEmptyToKeepExistingSecret": "Оставьте пустым, чтобы сохранить существующий секрет", + "leaveEmptyToKeepTheExistingSecret": "Оставьте пустым, чтобы сохранить существующий секрет. Вводите новое значение только если хотите его изменить.", + "loadingAccounts": "Загрузка аккаунтов...", + "noConfigurations": "Нет конфигураций OAuth2", + "noConfigurationsDesc": "Вы еще не добавили конфигурации OAuth2. Добавьте одну, чтобы начать использовать функции OAuth2.", + "noEmailAccountsRegistered": "Нет зарегистрированных почтовых аккаунтов. Пожалуйста, создайте один.", + "noProxyAvailable": "Нет доступных прокси", + "noStatus": "Эта страница отображает результат вашей аутентификации OAuth2. В настоящее время конкретный статус недоступен. Пожалуйста, попробуйте снова, если необходимо.", + "oauth2ClientHasBeenSuccessfully": "Клиент OAuth2 был успешно {{action}}.", + "oauth2ClientUpdated": "Клиент OAuth2 обновлен", + "oauth2DeleteFailed": "Ошибка удаления OAuth2", + "optional": "Опционально", + "outlook": "Outlook", + "pleaseBeCareful": "Пожалуйста, будьте осторожны, эту операцию нельзя отменить.", + "pleaseCreateOne": "Пожалуйста, создайте один.", + "provider": "Провайдер", + "quickPresets": "Быстрые настройки:", + "redirectUri": "Redirect URI", + "redirectUriCannotBeEmpty": "Redirect URI не может быть пустым", + "redirectUriIsRequired": "Redirect URI обязателен", + "redirectUrlLabel": "Redirect Url:", + "save": "Сохранить", + "saveChanges": "Сохранить изменения", + "saving": "Сохранение...", + "scope": "Scope:", + "scopes": "Scopes", + "selectAProxy": "Выберите прокси", + "selectAnAccount": "Выберите аккаунт", + "status": "Статус", + "statusUpdateFailed": "Ошибка обновления статуса, попробуйте позже", + "success": "Успех", + "successMessage": "Ваш почтовый аккаунт успешно аутентифицирован через OAuth2. Access Token был сохранен системой и будет автоматически обновляться по мере необходимости.", + "theRedirectUrlAfterAuthorization": "URL перенаправления после авторизации. Он должен совпадать с тем, что зарегистрирован у провайдера OAuth. Используйте формат http://[host]:[port]/oauth2/callback (или https://), где [host] и [port] соответствуют вашему развертыванию RustMailer. Путь /oauth2/callback фиксирован.", + "theUniqueIdentifierForYourApplication": "Уникальный идентификатор вашего приложения, предоставленный провайдером OAuth.", + "theUrlUsedToExchange": "URL, используемый для обмена кода авторизации на токен доступа.", + "theUrlWhereUsersWillBeRedirected": "URL, на который пользователи будут перенаправлены для авторизации вашего приложения.", + "thisActionWillPermanentlyRemoveTheOauth2Record": "Это действие безвозвратно удалит запись oauth2 из системы. Это нельзя отменить.", + "thisWillPreventTheOAuth2ClientFromBeingUsed": "Это предотвратит использование клиента OAuth2.", + "title": "OAuth2", + "tokenUrlCannotBeEmpty": "Token URL не может быть пустым", + "tokenUrlIsRequired": "Token URL обязателен", + "tokenUrlLabel": "Token Url:", + "tryAgain": "Попробовать снова", + "unknownError": "Произошла неизвестная ошибка.", + "updateFailed": "Ошибка обновления", + "updateHere": "Обновить здесь.", + "updateOrCreationFailed": "{{action}} не удалось, попробуйте позже", + "updated": "Обновлено", + "useProxyOptional": "Использовать прокси (опционально):", + "useSocks5ProxyForOAuthRequests": "Использовать SOCKS5 прокси для запросов OAuth, когда прямой доступ заблокирован.", + "value": "Значение:", + "valueCannotBeEmpty": "Значение не может быть пустым", + "valueIsRequired": "Значение обязательно", + "warning": "Внимание!", + "whenDisabled": "При отключении: - Новые потоки авторизации будут немедленно отклонены - Существующие access и refresh токены будут отозваны в течение 1 минуты - Пользователи должны будут пройти повторную авторизацию при повторном включении", + "yourOAuth2ApplicationHasBeenSuccessfully": "Ваше приложение OAuth2 было успешно {{action}}.", + "yourOAuth2ApplicationHasBeenSuccessfullyDeleted": "Ваше приложение OAuth2 было успешно удалено." + }, + "permission": { + "account": { + "create": "Создание почтовых аккаунтов", + "manage": "Управление назначенными аккаунтами", + "manage_all": "Управление всеми настройками аккаунтов", + "read_details": "Просмотр сведений об аккаунте" + }, + "category": { + "account": "Разрешения аккаунта", + "global_data": "Глобальные данные (Администратор)", + "system_identity": "Система и идентификация" + }, + "data": { + "delete": "Удаление назначенных писем", + "delete_all": "Удаление писем всех аккаунтов", + "export_batch": "Пакетный экспорт назначенных данных", + "export_batch_all": "Пакетный экспорт всех данных", + "import_batch": "Пакетный импорт почтовых данных", + "manage": "Управление назначенными метаданными почты", + "manage_all": "Управление всеми метаданными почты", + "raw_download": "Загрузка назначенных исходных писем", + "raw_download_all": "Загрузка всех исходных писем", + "read": "Чтение назначенных почтовых данных", + "read_all": "Чтение всех почтовых данных", + "smtp_ingest": "Прием электронной почты через протокол SMTP" + }, + "dialog": { + "account_description": "Разрешения, ограниченные выбранным аккаунтом.", + "account_title": "Разрешения аккаунта", + "global_description": "Системные разрешения, предоставленные этому пользователю.", + "global_title": "Глобальные разрешения" + }, + "scope": { + "account": "Аккаунт #{{id}}", + "global": "Глобальные" + }, + "system": { + "access": "Базовый доступ к системе", + "root": "Полный контроль системы" + }, + "token": { + "manage": "Управление токенами доступа" + }, + "user": { + "manage": "Управление всеми пользователями", + "view": "Просмотр базовых имен пользователей" + } + }, + "profile": { + "avatar_alt": "Аватар", + "menu": { + "profile": "Профиль", + "settings": "Настройки", + "sign_out": "Выйти" + } + }, + "proxyDelete": { + "close": "Закрыть", + "confirmText": "Вы уверены, что хотите удалить", + "deleteBtn": "Удалить", + "failedDesc": "Удаление не удалось, попробуйте позже", + "failedTitle": "Ошибка удаления прокси", + "permanent": "Это действие безвозвратно удалит прокси из системы. Это нельзя отменить.", + "proxyIdLabel": "Proxy Id:", + "proxyIdPlaceholder": "Введите Proxy Id для подтверждения удаления.", + "successDesc": "Прокси был успешно удален.", + "successTitle": "Успешно удалено", + "title": "Удалить прокси", + "tryAgain": "Попробовать снова", + "warningDesc": "Пожалуйста, будьте осторожны, эту операцию нельзя отменить.", + "warningTitle": "Внимание!" + }, + "restore_message": { + "accountsInvolved": "Задействованные аккаунты", + "bulkTitle": "Массовое восстановление сообщений", + "bulkWarning": "Примечание: сообщения будут восстановлены в исходные папки.", + "confirm": "Выполнить восстановление", + "desc": "Это действие повторно загрузит выбранные сообщения из Bichon и восстановит их в соответствующих почтовых ящиках на сервере IMAP.", + "failed": "Ошибка восстановления", + "failedTitle": "Восстановление не удалось", + "messages": "сообщений", + "restore_to_imap": "Восстановить сообщение", + "success": "Восстановление успешно", + "successDesc": "Выбранные сообщения были успешно восстановлены на сервере IMAP.", + "summary": "Детали восстановления", + "title": "Восстановить одно сообщение" + }, + "roles": { + "actions": { + "add": "Добавить роль", + "cancel": "Отмена", + "close": "Закрыть", + "failed": "Ошибка операции", + "retry": "Повторить", + "submit_create": "Создать роль", + "submit_update": "Обновить роль", + "success_create": "Роль создана", + "success_update": "Роль обновлена" + }, + "categories": { + "account_resource": "Ресурсы аккаунта", + "global_data": "Доступ к глобальным данным", + "identity": "Личность и управление" + }, + "columns": { + "created_at": "Создана", + "id": "ID", + "name": "Имя", + "permissions": "Права", + "role_type": "Тип", + "updated_at": "Обновлена" + }, + "delete": { + "alert_desc": "Удаление роли лишит прав всех пользователей, которым она назначена.", + "alert_title": "Предупреждение: навсегда.", + "confirm_btn": "Удалить роль", + "confirm_label": "Введите ID роли для подтверждения:", + "deleting": "Удаление...", + "dialog_title": "Удалить роль", + "error_fallback": "Не удалось удалить роль.", + "error_title": "Ошибка удаления", + "irreversible": "Это действие нельзя отменить.", + "placeholder": "Введите «{{id}}»", + "success_desc": "Роль «{{name}}» успешно удалена.", + "success_title": "Роль удалена", + "warning_text": "Вы удаляете роль {{name}} (ID: {{id}}) навсегда." + }, + "description_hint": "Определите область доступа и права.", + "details": { + "close_btn": "Закрыть", + "desc_account": "Доступ к данным отдельного аккаунта.", + "desc_global": "Глобальное управление и системный доступ.", + "role_badge": "Роль: {{type}}", + "title": "Права роли: {{name}}", + "unknown": "Неизвестная роль", + "view_permissions": "Детали прав" + }, + "empty": { + "desc": "Вы еще не создали ни одной кастомной роли.", + "title": "Роли не найдены" + }, + "form": { + "builtin_badge": "Системная роль", + "builtin_desc": "Эта роль предустановлена и доступна только для чтения.", + "desc_label": "Описание", + "matrix_label": "Матрица прав ({{type}})", + "name_label": "Имя роли", + "type_label": "Тип роли" + }, + "placeholder": { + "filter": "Поиск ролей..." + }, + "title": { + "create": "Создать роль", + "edit": "Роль: {{name}}" + }, + "types": { + "Account": "Аккаунт", + "Global": "Глобальная" }, "validation": { - "required": "Это поле обязательно", - "invalidEmail": "Неверный адрес электронной почты", - "invalidUrl": "Неверный URL", - "passwordMinLength": "Пароль должен быть не менее {{min}} символов", - "pleaseEnterPassword": "Пожалуйста, введите ваш пароль", - "passwordRequired": "Пароль обязателен, когда метод авторизации - Пароль", - "emailRequired": "Email обязателен", - "imapHostRequired": "IMAP хост обязателен", - "imapHostCannotBeEmpty": "IMAP хост не может быть пустым", - "imapPortMustBePositive": "IMAP порт должен быть положительным целым числом", - "imapPortMustBeLessThan65536": "IMAP порт должен быть меньше 65536", - "folderLimitMustBeNumber": "Лимит папки должен быть числом", - "folderLimitMustBeAtLeast100": "Лимит папки должен быть не менее 100", - "incrementalSyncMustBeNumber": "Интервал инкрементальной синхронизации должен быть числом", - "incrementalSyncMustBeAtLeast10": "Интервал инкрементальной синхронизации должен быть не менее 10 минут", - "pleaseEnterUsernameOrEmail": "Пожалуйста, введите ваше имя пользователя или адрес электронной почты", - "singleRequestBatchSizeMustBeNumber": "Размер пакета должен быть числом", - "singleRequestBatchSizeTooSmall": "Размер пакета должен быть не менее 10", - "singleRequestBatchSizeTooLarge": "Размер пакета должен быть не более 200" - }, - "table": { - "noResults": "Результатов не найдено", - "loading": "Загрузка...", - "page": "Страница", - "of": "из", - "rowsPerPage": "Строк на странице", - "showing": "Показано", - "to": "по", - "results": "результатов", - "asc": "Возр.", - "desc": "Убыв.", - "hide": "Скрыть", - "edit": "Ред.", - "delete": "Удалить", - "pagination": { - "selected": "Выбрано {{selected}} из {{total}} строк.", - "fixed_page_size": "{{size}} строк на странице.", - "rows_per_page": "Строк на странице", - "page_info": "Страница {{page}} из {{total}}", - "first": "Перейти на первую страницу", - "previous": "Предыдущая страница", - "next": "Следующая страница", - "last": "Перейти на последнюю страницу" - } - }, - "proxyDelete": { - "title": "Удалить прокси", - "successTitle": "Успешно удалено", - "successDesc": "Прокси был успешно удален.", - "close": "Закрыть", - "failedTitle": "Ошибка удаления прокси", - "failedDesc": "Удаление не удалось, попробуйте позже", - "tryAgain": "Попробовать снова", - "confirmText": "Вы уверены, что хотите удалить", - "permanent": "Это действие безвозвратно удалит прокси из системы. Это нельзя отменить.", - "proxyIdLabel": "Proxy Id:", - "proxyIdPlaceholder": "Введите Proxy Id для подтверждения удаления.", - "warningTitle": "Внимание!", - "warningDesc": "Пожалуйста, будьте осторожны, эту операцию нельзя отменить.", - "deleteBtn": "Удалить" - }, - "systemConfig": { - "pageTitle": "Конфигурации системного уровня", - "pageDescription": "Эти параметры инициализируются через флаги CLI или переменные окружения. Они доступны только для чтения.", - "status": { - "enabled": "Включено", - "disabled": "Выключено", - "configured": "Настроено", - "missing": "Отсутствует", - "auto": "Авто", - "notSet": "Не задано" - }, - "sections": { - "network": { - "title": "Сеть", - "desc": "HTTP и публичный доступ" - }, - "cors": { - "title": "CORS", - "desc": "Правила кросс-доменного доступа" - }, - "logging": { - "title": "Логирование", - "desc": "Поведение вывода логов" - }, - "storage": { - "title": "Хранилище и кэш", - "desc": "Пути к базе данных и лимиты" - }, - "security": { - "title": "Безопасность", - "desc": "Аутентификация и шифрование" - }, - "performance": { - "title": "Производительность", - "desc": "Параллелизм и сжатие" - }, - "smtp": { - "title": "SMTP-сервер", - "desc": "Настройки приема входящей почты для архивации в реальном времени" - } - } - }, - "apiTokens": { - "page": { - "loadError": "Ошибка загрузки API-токенов.", - "emptyTitle": "Нет API-токенов", - "emptyDescription": "Вы еще не создали ни одного API-токена. Нажмите ниже, чтобы создать.", - "addBtn": "Добавить токен" - }, - "list": { - "unnamedToken": "Безымянный токен", - "statusActive": "Активен", - "statusExpired": "Истек", - "neverExpires": "Бессрочно", - "expiresOnShort": "Истекает {{date}}", - "tokenLabel": "Токен", - "createdLabel": "Создан", - "lastUsedLabel": "Использован", - "expiresOnLabel": "Истекает", - "neverUsed": "Никогда", - "neverLabel": "Никогда", - "deleteBtn": "Удалить токен" - }, - "dialog": { - "createTitle": "Создать токен доступа", - "editTitle": "Изменить токен доступа", - "description": "Нажмите сохранить по завершении.", - "save": "Сохранить", - "saveChanges": "Сохранить изменения" - }, - "deleteDialog": { - "title": "Удалить токен доступа?", - "description": "Это действие нельзя отменить. Любое приложение, использующее этот токен, мгновенно потеряет доступ.", - "cancel": "Отмена", - "confirm": "Удалить", - "deleting": "Удаление..." - }, - "form": { - "nameLabel": "Имя", - "namePlaceholder": "Дайте токену короткое имя", - "nameDescription": "Опционально · макс. 32 символа", - "expirationLabel": "Срок действия", - "expirationPlaceholder": "Выберите срок", - "expirationDescription": "Токены автоматически истекают через выбранное время.", - "never": "Никогда", - "1day": "1 день", - "7 дней": "7 дней", - "30days": "30 дней", - "errorMax": "Макс. 32 символа", - "errorNumber": "Должно быть числом", - "errorInt": "Должно быть целым числом", - "errorPositive": "Должно быть больше 0" - }, - "notifications": { - "createSuccess": "Токен создан", - "createSuccessDesc": "Токен доступа успешно создан.", - "updateSuccess": "Токен обновлен", - "updateSuccessDesc": "Токен доступа успешно обновлен.", - "createFailed": "Ошибка создания", - "updateFailed": "Ошибка обновления", - "deleteSuccess": "Токен удален", - "deleteFailed": "Ошибка удаления", - "copied": "Скопировано", - "genericError": "Ошибка. Попробуйте еще раз.", - "close": "Закрыть", - "tryAgain": "Повторить" - } - }, - "permission": { - "scope": { - "global": "Глобальные", - "account": "Аккаунт #{{id}}" - }, - "dialog": { - "global_title": "Глобальные разрешения", - "account_title": "Разрешения аккаунта", - "global_description": "Системные разрешения, предоставленные этому пользователю.", - "account_description": "Разрешения, ограниченные выбранным аккаунтом." - }, - "category": { - "system_identity": "Система и идентификация", - "global_data": "Глобальные данные (Администратор)", - "account": "Разрешения аккаунта" - }, - "system": { - "access": "Базовый доступ к системе", - "root": "Полный контроль системы" - }, - "user": { - "manage": "Управление всеми пользователями", - "view": "Просмотр базовых имен пользователей" - }, - "token": { - "manage": "Управление токенами доступа" - }, - "account": { - "create": "Создание почтовых аккаунтов", - "manage": "Управление назначенными аккаунтами", - "manage_all": "Управление всеми настройками аккаунтов", - "read_details": "Просмотр сведений об аккаунте" - }, - "data": { - "read": "Чтение назначенных почтовых данных", - "read_all": "Чтение всех почтовых данных", - "manage": "Управление назначенными метаданными почты", - "manage_all": "Управление всеми метаданными почты", - "raw_download": "Загрузка назначенных исходных писем", - "raw_download_all": "Загрузка всех исходных писем", - "delete": "Удаление назначенных писем", - "delete_all": "Удаление писем всех аккаунтов", - "export_batch": "Пакетный экспорт назначенных данных", - "export_batch_all": "Пакетный экспорт всех данных", - "import_batch": "Пакетный импорт почтовых данных", - "smtp_ingest": "Прием электронной почты через протокол SMTP" - } - }, - "users": { - "columns": { - "id": "ID", - "avatar": "Аватар", - "username": "Имя пользователя", - "email": "Эл. почта", - "roles": "Роли и права", - "created_at": "Создан", - "updated_at": "Обновлен", - "actions": "Действия" - }, - "buttons": { - "add": "Добавить пользователя", - "add_new": "Новый пользователь" - }, - "empty": { - "title": "Пользователи не найдены", - "description": "Нажмите кнопку ниже, чтобы добавить первого пользователя." - }, - "nav": { - "users": "Пользователи", - "roles": "Роли", - "api_tokens": "API токены" - }, - "api_tokens": { - "empty": { - "title": "API токены не найдены", - "description": "В системе еще не создано ни одного API-токена." - }, - "button": { - "generate": "Создать новый токен" - }, - "toolbar": { - "search_placeholder": "Поиск по имени, владельцу или токену..." - }, - "table": { - "name": "Имя", - "type": "Тип", - "last_used": "Последнее использование", - "expires_at": "Истекает", - "owner": "Владелец", - "created": "Создан", - "api_key": "API ключ", - "web_ui": "Веб-интерфейс", - "never": "Никогда", - "permanent": "Бессрочно", - "expired": "Истек", - "unnamed": "Безымянный токен" - }, - "unnamed": "Безымянный токен", - "delete": { - "title": "Удалить API токен", - "desc": "Вы собираетесь навсегда удалить этот API токен", - "prefix": "Префикс токена", - "irreversible": "Это действие нельзя отменить. Любые приложения, использующие этот токен, немедленно потеряют доступ.", - "confirm_label": "Для подтверждения введите {{word}} ниже:", - "confirm_placeholder": "Введите «{{word}}» для подтверждения", - "warning_title": "Предупреждение", - "warning_desc": "Любые скрипты или сервисы, использующие этот токен, перестанут работать. Убедитесь, что вы обновили свои системы.", - "confirm_button": "Удалить токен", - "deleting": "Удаление..." - }, - "toast": { - "deleted_title": "API токен удален", - "deleted_desc": "Токен «{{name}}» был успешно удален.", - "delete_failed_title": "Ошибка удаления", - "delete_failed": "Не удалось удалить токен, попробуйте еще раз." - } - }, - "tokens": { - "schema": { - "name_max": "Макс. 32 символа", - "expire_number": "Должно быть числом", - "expire_int": "Должно быть целым числом", - "expire_positive": "Должно быть больше 0" - }, - "toast": { - "update_success_title": "Токен обновлен", - "update_success_desc": "Токен доступа успешно обновлен.", - "create_success_title": "Токен создан", - "create_success_desc": "Токен доступа успешно создан.", - "update_failed_title": "Ошибка обновления", - "create_failed_title": "Ошибка создания" - }, - "error": { - "fallback": "Операция не удалась, попробуйте позже." - }, - "dialog": { - "edit_title": "Редактировать токен", - "create_title": "Создать токен доступа", - "description": "Нажмите «Сохранить» по завершении." - }, - "fields": { - "name_label": "Имя", - "name_placeholder": "Короткое имя для токена", - "name_hint": "Опционально · макс. 32 символа", - "expire_label": "Срок действия", - "expire_placeholder": "Выберите срок", - "expire_hint": "Токен автоматически истечет через выбранное время." - }, - "expire_options": { - "never": "Бессрочно", - "1_day": "1 день", - "7_days": "7 дней", - "30_days": "30 дней" - } - }, - "tokens_action": { - "dialog": { - "title": "API токены", - "description": "Управление API токенами этого пользователя." - }, - "empty": { - "title": "Нет API токенов", - "description": "У этого пользователя пока нет API токенов." - }, - "buttons": { - "add": "Добавить токен" - }, - "list": { - "unnamed_token": "Безымянный токен", - "status_expired": "Истек", - "status_active": "Активен", - "expires_on_brief": "Истекает {{date}}", - "never_expires": "Бессрочно", - "label_token": "Токен", - "label_created": "Создан", - "label_last_used": "Использован", - "label_expires_at": "Истекает", - "never": "Никогда", - "button_delete": "Удалить токен" - }, - "delete_dialog": { - "title": "Удалить токен доступа?", - "description": "Это действие нельзя отменить." - } - }, - "actions": { - "schema": { - "account_required": "Выберите аккаунт", - "role_required": "Выберите роль", - "username_required": "Имя пользователя обязательно", - "username_min": "Минимум 3 символов", - "username_max": "Максимум 32 символа", - "email_required": "Эл. почта обязательна", - "email_invalid": "Введите корректный адрес эл. почты", - "global_role_required": "Назначьте хотя бы одну глобальную роль", - "description_max": "Описание не более 256 символов", - "ip_invalid": "Неверный IP-адрес", - "password_required": "Пароль обязателен", - "password_min": "Минимум 8 символов", - "password_max": "Максимум 256 символа" - }, - "toast": { - "updated": "Пользователь обновлен", - "created": "Пользователь создан" - }, - "dialog": { - "edit_title": "Редактирование: {{name}}", - "create_title": "Создать пользователя", - "subtitle": "Настройка личности, уровней доступа и политик безопасности." - }, - "tabs": { - "general": "Общее", - "permissions": "Права аккаунта", - "security": "Безопасность и ACL" - }, - "sections": { - "basic": "Основные данные", - "global": "Глобальные права", - "mail_access": "Управление почтой", - "mail_access_subtitle": "Выберите почтовые аккаунты для управления.", - "policy": "Политики" - }, - "fields": { - "username": "Имя пользователя", - "username_hint": "Уникальный идентификатор для входа.", - "email": "Эл. почта", - "email_hint": "Основной адрес для уведомлений.", - "password": "Пароль", - "password_placeholder_create": "Минимум 8 символов", - "password_placeholder_edit": "Оставьте пустым, чтобы не менять", - "password_hint_create": "Безопасный пароль для нового пользователя.", - "password_hint_edit": "Введите новый пароль только для смены.", - "global_roles_hint": "Назначьте системные права.", - "description": "Описание (опционально)", - "description_placeholder": "Заметки о пользователе...", - "description_hint": "Внутренние заметки (до 256 символов).", - "select_account": "Выбрать аккаунт", - "assign_role": "Назначить роль", - "ip_whitelist": "Белый список IP", - "ip_whitelist_hint": "Ограничить вход этими IP (по одному на строку).", - "rate_quota": "Квота частоты", - "burst_interval": "Интервал всплеска (сек)" - }, - "buttons": { - "add_account": "Добавить аккаунт", - "update": "Обновить", - "create": "Создать" - }, - "states": { - "full_access": "Полный доступ", - "full_access_desc": "Администраторы имеют доступ ко всем аккаунтам по умолчанию.", - "no_accounts": "Аккаунты не назначены.", - "security_disabled": "Политики безопасности отключены." - }, - "api_tokens": "API токены", - "placeholder": { - "filter": "Поиск пользователей..." - }, - "delete": { - "title": "Удалить пользователя", - "confirm_msg": "Вы удаляете пользователя {{name}} (ID: {{id}}) навсегда.", - "irreversible": "Это действие необратимо.", - "input_label": "Для подтверждения введите ID пользователя:", - "placeholder": "Введите «{{id}}»", - "alert_title": "Внимание: удаление навсегда.", - "alert_desc": "Пользователь и все его данные будут стерты.", - "button_confirm": "Удалить пользователя", - "button_deleting": "Удаление...", - "toast": { - "success_title": "Пользователь удален", - "success_desc": "Пользователь «{{name}}» успешно удален.", - "failed_title": "Ошибка удаления", - "failed_fallback": "Не удалось удалить пользователя." - } - } - } - }, - "roles": { - "title": { - "create": "Создать роль", - "edit": "Роль: {{name}}" - }, - "description_hint": "Определите область доступа и права.", - "form": { - "name_label": "Имя роли", - "type_label": "Тип роли", - "desc_label": "Описание", - "matrix_label": "Матрица прав ({{type}})", - "builtin_badge": "Системная роль", - "builtin_desc": "Эта роль предустановлена и доступна только для чтения." - }, - "types": { - "Global": "Глобальная", - "Account": "Аккаунт" - }, - "categories": { - "identity": "Личность и управление", - "global_data": "Доступ к глобальным данным", - "account_resource": "Ресурсы аккаунта" - }, - "actions": { - "cancel": "Отмена", - "submit_create": "Создать роль", - "submit_update": "Обновить роль", - "success_create": "Роль создана", - "success_update": "Роль обновлена", - "failed": "Ошибка операции", - "close": "Закрыть", - "retry": "Повторить", - "add": "Добавить роль" - }, - "validation": { - "name_required": "Имя роли обязательно", - "perm_required": "Выберите хотя бы одно право" - }, - "columns": { - "id": "ID", - "name": "Имя", - "role_type": "Тип", - "permissions": "Права", - "created_at": "Создана", - "updated_at": "Обновлена" - }, - "placeholder": { - "filter": "Поиск ролей..." - }, - "delete": { - "dialog_title": "Удалить роль", - "warning_text": "Вы удаляете роль {{name}} (ID: {{id}}) навсегда.", - "irreversible": "Это действие нельзя отменить.", - "confirm_label": "Введите ID роли для подтверждения:", - "placeholder": "Введите «{{id}}»", - "alert_title": "Предупреждение: навсегда.", - "alert_desc": "Удаление роли лишит прав всех пользователей, которым она назначена.", - "confirm_btn": "Удалить роль", - "deleting": "Удаление...", - "success_title": "Роль удалена", - "success_desc": "Роль «{{name}}» успешно удалена.", - "error_title": "Ошибка удаления", - "error_fallback": "Не удалось удалить роль." - }, - "details": { - "title": "Права роли: {{name}}", - "unknown": "Неизвестная роль", - "role_badge": "Роль: {{type}}", - "desc_global": "Глобальное управление и системный доступ.", - "desc_account": "Доступ к данным отдельного аккаунта.", - "close_btn": "Закрыть", - "view_permissions": "Детали прав" - }, - "empty": { - "title": "Роли не найдены", - "desc": "Вы еще не создали ни одной кастомной роли." - } - }, - "profile": { - "avatar_alt": "Аватар", - "menu": { - "profile": "Профиль", - "settings": "Настройки", - "sign_out": "Выйти" - } - }, - "sign_out": { - "title": "Выйти", - "desc": "Вы уверены, что хотите выйти? Вам нужно будет снова войти, чтобы получить доступ к аккаунту.", - "confirm": "Выйти" - }, - "restore_message": { - "title": "Восстановить одно сообщение", - "bulkTitle": "Массовое восстановление сообщений", - "bulkWarning": "Примечание: сообщения будут восстановлены в исходные папки.", - "accountsInvolved": "Задействованные аккаунты", - "summary": "Детали восстановления", - "messages": "сообщений", - "desc": "Это действие повторно загрузит выбранные сообщения из Bichon и восстановит их в соответствующих почтовых ящиках на сервере IMAP.", - "confirm": "Выполнить восстановление", - "restore_to_imap": "Восстановить сообщение", - "success": "Восстановление успешно", - "successDesc": "Выбранные сообщения были успешно восстановлены на сервере IMAP.", - "failed": "Ошибка восстановления", - "failedTitle": "Восстановление не удалось" - }, - "time": { - "label": "Время", - "since": "С", - "before": "До", - "recent_range": "Недавний диапазон (с...)", - "historical": "Исторический диапазон (до...)", - "absolute_range": "Абсолютный диапазон дат", - "last_day": "Последний 1 день", - "last_days": "Последние {{count}} дней", - "last_months": "Последние {{count}} месяцев", - "over_years_ago": "{{count}} {{unit}} назад", - "year": "год", - "years": "лет", - "recent_prefix": "Недавно:", - "days_ago_to_now": "дней назад — по настоящее время", - "apply": "Применить", - "start_date": "Дата начала", - "end_date": "Дата окончания", - "clear_filters": "Очистить фильтр времени", - "format": "yyyy-MM-dd" - }, - "tag": { - "label": "Теги", - "search_placeholder": "Поиск тегов...", - "clear_all": "Очистить все теги", - "no_tags_found": "Теги не найдены" - }, - "search_accounts": { - "label": "Почтовые аккаунты", - "search_placeholder": "Поиск почтовых аккаунтов...", - "clear_accounts": "Очистить выбранные аккаунты", - "no_accounts_found": "Аккаунты не найдены" - }, - "search_mailbox": { - "label": "Почтовые папки", - "search_placeholder": "Поиск папок", - "clear_mailboxes": "Очистить выбранные папки", - "select_account_first": "Сначала выберите почтовый аккаунт", - "no_mailbox_found": "Папки не найдены" - }, - "search_contacts": { - "label": "Контакты", - "label_with_count": "Контакты ({{count}})", - "any": "Любые", - "search_placeholder": "Поиск по {{field}}...", - "reset_all": "Сбросить все контакты", - "no_contact_found": "Контакты не найдены", - "loading": "Загрузка...", - "showing_limit": "Показаны первые 100 результатов • Всего {{total}}" - }, - "search_more": { - "trigger_label": "Дополнительно", - "title": "Расширенные фильтры", - "reset": "Сброс", - "has_attachment": "Есть вложение", - "attachment_name_label": "Имя вложения", - "attachment_name_placeholder": "Например: invoice.pdf", - "message_size_label": "Размер письма", - "message_id_label": "Исходный Message-ID", - "message_id_description": "Поиск по Message-ID из заголовков письма", - "apply": "Применить фильтры", - "size_presets": { - "any": "Любой размер", - "tiny": "Очень маленький (< 15 КБ)", - "small": "Маленький (< 2 МБ)", - "medium": "Средний (2–10 МБ)", - "large": "Большой (10–20 МБ)", - "huge": "Очень большой (> 20 МБ)" - }, - "any": "Любой", - "search_placeholder": "Поиск {{field}}...", - "extension": "Расширение файла", - "category": "Категория вложения", - "content_types": "Конкретный тип" - }, - "search_view": { - "button_label": "Вид", - "menu_title": "Настройки отображаемых столбцов" - }, - "search_reset": { - "label": "Сброс", - "tooltip": "Очистить все фильтры" - }, - "search_input": { - "placeholder": "Поиск почты... (Поддержка Regex)", - "button": "Поиск", - "recent_title": "Недавние поиски", - "clear_history": "Очистить историю", - "no_history": "История поиска пуста", - "all": "Все поля", - "all_fields_desc": "Поиск по теме, тексту, отправителю и получателям", - "subject": "Тема", - "body": "Текст письма" + "name_required": "Имя роли обязательно", + "perm_required": "Выберите хотя бы одно право" } + }, + "search": { + "account": "Аккаунт", + "addEmailAccount": "Добавить почтовый аккаунт", + "addTags": { + "cancel": "Отмена", + "createHint": "Создать новый тег: {{tag}}", + "invalidTitle": "Неверный тег", + "none": "Теги не добавлены", + "save": "Сохранить", + "saving": "Сохранение...", + "searchPlaceholder": "Найти или создать тег...", + "selectedCount": "{{count}} тегов выбрано", + "title": "Редактировать теги", + "tryAgain": "Пожалуйста, попробуйте позже", + "updateFailedTitle": "Ошибка обновления", + "updatedDesc": "Теги были успешно обновлены", + "updatedTitle": "Теги обновлены" + }, + "adjustSearch": "Попробуйте изменить критерии поиска или очистить фильтры.", + "advanced": "Дополнительно", + "advancedFilters": "Расширенные фильтры", + "any": "Любой", + "attachmentName": "Имя вложения", + "attachmentsSize": "Вложения и Размер", + "bcc": "Скрытая копия", + "before": "До:", + "bulkActions": { + "ariaLabel": "Выбрано сообщений: {{count}}. Панель действий", + "clear": "Очистить выбор", + "delete": "Удалить", + "deleteDesc": "Удалить выбранные", + "manageTags": "Управление тегами", + "selected": "Выбрано: {{count}}" + }, + "cc": "Копия", + "clear": "Очистить", + "date": "Дата", + "dateRange": "Диапазон дат", + "delete": { + "confirmButton": "Удалить", + "confirmDetail": "Это действие нельзя отменить.", + "confirmPrefix": "Вы уверены, что хотите удалить", + "countLabel": "{{count}} сообщ.", + "errorTitle": "Ошибка удаления", + "successDesc": "Успешно удалено.", + "successTitle": "Удалено", + "title": "Удалить сообщения", + "warningDesc": "Сообщения будут удалены безвозвратно.", + "warningTitle": "Предупреждение" + }, + "editTag": "Ред. тег", + "endDate": "Дата окончания", + "from": "От", + "fullTextMultiAccount": "Полнотекстовый · Мультиаккаунт · Расширенные фильтры", + "hasAttachment": "Есть вложение", + "huge": "Огромный (≥20 MB)", + "keyword": "Ключевое слово", + "large": "Большой (10 - 20 МБ)", + "mailbox": "Ящик", + "maxSize": "Макс. размер", + "maximumBytes": "Максимум", + "medium": "Средний (2 - 10 МБ)", + "messageId": "Message ID", + "minSize": "Мин. размер", + "minimumBytes": "Минимум", + "no": "Нет", + "noActiveEmailAccount": "Нет активного почтового аккаунта.", + "noEmailsFound": "Письма не найдены", + "noMailboxSelectAccount": "Нет ящика. Сначала выберите аккаунт.", + "originalMessageIdHeader": "Заголовок Message-ID оригинального письма", + "pleaseSelectAtLeastOne": "Пожалуйста, выберите хотя бы одно условие поиска", + "preview": "Предпросмотр", + "recipient": "Получатель", + "searchArchivedEmails": "Искать в архивированных письмах", + "searchButton": "Найти", + "searchInSubjectBody": "Искать в теме, теле, вложениях...", + "searching": "Поиск, пожалуйста, подождите...", + "searchingButton": "Поиск...", + "selectAccount": "Выбрать аккаунт", + "selectDate": "Выберите дату", + "selectMailbox": "Выбрать ящик", + "sender": "Отправитель", + "senderRecipients": "Отправитель / Получатели", + "since": "С:", + "size": "Размер", + "sizeDescription": "Размер означает общий размер электронного письма, включая вложения.", + "small": "Маленький (<2 МБ)", + "sort": "Сортировка", + "source": "Источник", + "startDate": "Дата начала", + "startSearching": "Начните с ввода ключевого слова, отправителя или использования фильтров.", + "subject": "Тема", + "tagFilter": "Фильтр по тегам", + "thread": { + "empty": "Нет сообщений в этой цепочке", + "error": "Не удалось загрузить цепочку", + "invalidDate": "Неверная дата", + "loadMore": "Загрузить ещё", + "loadingMore": "Загрузка...", + "noSubject": "(Без темы)", + "title": "Цепочка · {{count}} сообщений" + }, + "tiny": "Очень маленький (<15 КБ)", + "title": "Поиск", + "to": "Кому", + "updateTags": { + "actionAdd": "Добавить", + "actionOverwrite": "Перезаписать", + "actionRemove": "Удалить", + "cancel": "Отмена", + "createHint": "Нажмите Enter, чтобы создать тег: \"{{tag}}\"", + "invalidTitle": "Недопустимый тег", + "none": "Теги не выбраны", + "overwriteWarning": "Предупреждение: это перезапишет все существующие теги в выбранных элементах.", + "savingAdd": "Добавление...", + "savingOverwrite": "Перезапись...", + "savingRemove": "Удаление...", + "searchPlaceholder": "Поиск или создание тега...", + "selectedCount": "Будет применено тегов: {{count}}", + "submitAdd": "Добавить теги", + "submitOverwrite": "Перезаписать теги", + "submitRemove": "Удалить теги", + "title": "Обновить теги", + "tryAgain": "Пожалуйста, попробуйте позже.", + "updateFailedTitle": "Ошибка обновления", + "updatedDesc": "Теги были успешно обновлены.", + "updatedTitle": "Теги обновлены" + }, + "yes": "Да" + }, + "search_accounts": { + "clear_accounts": "Очистить выбранные аккаунты", + "label": "Почтовые аккаунты", + "no_accounts_found": "Аккаунты не найдены", + "search_placeholder": "Поиск почтовых аккаунтов..." + }, + "search_contacts": { + "any": "Любые", + "label": "Контакты", + "label_with_count": "Контакты ({{count}})", + "loading": "Загрузка...", + "no_contact_found": "Контакты не найдены", + "reset_all": "Сбросить все контакты", + "search_placeholder": "Поиск по {{field}}...", + "showing_limit": "Показаны первые 100 результатов • Всего {{total}}" + }, + "search_input": { + "all": "Все поля", + "all_fields_desc": "Поиск по теме, тексту, отправителю и получателям", + "body": "Текст письма", + "button": "Поиск", + "clear_history": "Очистить историю", + "no_history": "История поиска пуста", + "placeholder": "Поиск писем (используйте \" \" для фразового поиска)", + "recent_title": "Недавние поиски", + "subject": "Тема" + }, + "search_mailbox": { + "clear_mailboxes": "Очистить выбранные папки", + "label": "Почтовые папки", + "no_mailbox_found": "Папки не найдены", + "search_placeholder": "Поиск папок", + "select_account_first": "Сначала выберите почтовый аккаунт" + }, + "search_more": { + "any": "Любой", + "apply": "Применить фильтры", + "attachment_name_label": "Имя вложения", + "attachment_name_placeholder": "Например: invoice.pdf", + "category": "Категория вложения", + "content_type": "Тип файла", + "extension": "Расширение файла", + "has_attachment": "Есть вложение", + "is_message": "Вложение в формате письма", + "is_message_desc": "Это вложение является файлом почты, например, файлом .eml.", + "message_id_description": "Поиск по Message-ID из заголовков письма", + "message_id_label": "Исходный Message-ID", + "message_size_label": "Размер письма", + "reset": "Сброс", + "search_placeholder": "Поиск {{field}}...", + "size_presets": { + "any": "Любой размер", + "huge": "Очень большой (> 20 МБ)", + "large": "Большой (10–20 МБ)", + "medium": "Средний (2–10 МБ)", + "small": "Маленький (< 2 МБ)", + "tiny": "Очень маленький (< 15 КБ)" + }, + "title": "Расширенные фильтры", + "trigger_label": "Дополнительно" + }, + "search_reset": { + "label": "Сброс", + "tooltip": "Очистить все фильтры" + }, + "search_view": { + "button_label": "Вид", + "menu_title": "Настройки отображаемых столбцов" + }, + "settings": { + "accounts": "Аккаунты", + "acl": "Acl", + "actions": "Действия", + "add": "Добавить", + "addNewProxyHere": "Добавьте новый прокси здесь. ", + "adding": "Добавление...", + "appearance": { + "button": { + "update": "Обновить настройки" + }, + "command": { + "no_results": "Язык не найден.", + "search": "Поиск языка..." + }, + "description": { + "language": "Выберите язык веб-интерфейса.", + "theme": "Выберите светлый или темный режим." + }, + "field": { + "language": "Язык интерфейса", + "theme": "Тема интерфейса" + }, + "placeholder": { + "select_language": "Выберите язык" + }, + "theme": { + "dark": "Темная", + "light": "Светлая" + }, + "title": "Внешний вид", + "validation": { + "language": { + "required": "Пожалуйста, выберите язык." + }, + "theme": { + "required": "Пожалуйста, выберите тему." + } + } + }, + "authUrl": "Auth Url", + "changePasswordForFutureLogins": "Изменить пароль для будущих входов.", + "confirmReset": "Подтвердить сброс", + "createdAt": "Создано", + "delete": "Удалить", + "description": "Описание", + "edit": "Ред.", + "enabled": "Включено", + "enterNewRootPassword": "Введите новый root пароль", + "enterProxyIdToConfirmDeletion": "Введите ID прокси для подтверждения удаления.", + "failedToCopyText": "Не удалось скопировать текст", + "filterAccessToken": "Фильтр access token...", + "filterAccount": "Фильтр аккаунт...", + "filterOauth2": "Фильтр oauth2...", + "filterProxy": "Фильтр прокси...", + "general": "Общие", + "generateNewToken": "Сгенерировать новый токен, старый немедленно истечет.", + "host": "Хост", + "id": "Id", + "invalidPassword": "Неверный пароль", + "lastAccess": "Посл. доступ", + "manageRootTokenAndPassword": "Безопасное управление root-токеном и паролем.", + "name": "Имя", + "noProxies": "Нет прокси", + "noProxiesDesc": "Вы еще не добавили конфигурации прокси. Добавьте одну, чтобы начать использовать функции прокси.", + "password": "Пароль", + "pleaseUseAnIpAddressForBetterReliability": "Пожалуйста, используйте IP-адрес (например, 127.0.0.1), а не имя хоста или домен для большей надежности.", + "port": "Порт", + "profile": { + "account": { + "id": "ID аккаунта: {{id}}" + }, + "avatarAlt": "Аватар", + "button": { + "permissions": "Права доступа", + "update_profile": "Обновить профиль", + "view_global_permissions": "Просмотреть глобальные права" + }, + "field": { + "email": "Электронная почта", + "password": "Пароль", + "username": "Имя пользователя" + }, + "loadError": "Не удалось загрузить информацию о пользователе.", + "maxSize": "До {{size}}", + "placeholder": { + "password_keep": "Оставьте пустым, чтобы сохранить текущий пароль" + }, + "removeAvatar": "Удалить аватар", + "section": { + "accounts": "{{count}} связанных аккаунтов", + "roles": "Роли" + }, + "toast": { + "update_failed": "Не удалось обновить профиль", + "updated": "Профиль успешно обновлён" + }, + "uploadError": "Ошибка(и) загрузки файла", + "uploadTitle": "Загрузить аватар", + "validation": { + "email": { + "invalid": "Введите корректный адрес электронной почты", + "required": "Электронная почта обязательна" + }, + "password": { + "max": "Пароль должен содержать не более 256 символов", + "min": "Пароль должен содержать не менее 8 символов" + }, + "username": { + "max": "Имя пользователя должно содержать не более 32 символов", + "min": "Имя пользователя должно содержать не менее 5 символов", + "required": "Имя пользователя обязательно" + } + } + }, + "proxy": "Прокси", + "proxyUpdateOrAddFailed": "{{action}} не удалось, попробуйте позже", + "reset": "Сброс", + "resetRootPassword": "Сбросить Root пароль", + "resetRootToken": "Сбросить Root Token", + "root": "Root", + "rootAccessManagement": "Управление Root-доступом", + "rootDesc": "Управление учетными данными root-доступа, включая токен и пароль.", + "rootPasswordMustBeAtLeast6Characters": "Root-пароль должен быть длиной не менее 6 символов.", + "rootTitle": "Root", + "selectAll": "Выбрать все", + "sidebar": { + "apiTokens": "API-токены", + "configurations": "Системные конфигурации", + "profile": "Профиль", + "proxy": "Сетевой прокси" + }, + "theRootPasswordHasBeenReset": "Root-пароль был сброшен", + "theRootTokenHasBeenReset": "Root-токен был сброшен", + "theme": "Тема", + "title": "Настройки", + "token": "Токен", + "tokenUrl": "Token Url", + "type": "Тип", + "updateTheProxyHere": "Обновите прокси здесь. ", + "updatedAt": "Обновлено", + "url": "Url", + "useNewPasswordForNextLogin": "Используйте новый пароль для следующего входа.", + "useProxy": "Исп. прокси", + "username": "Имя пользователя", + "youAreAboutToResetTheRootPassword": "Вы собираетесь сбросить root-пароль. Убедитесь, что сохранили его надежно.", + "youAreAboutToResetTheRootToken": "Вы собираетесь сбросить root-токен. Это действие нельзя отменить.", + "yourLoginInformationHasBeenUpdated": "Ваша информация для входа обновлена. Нет необходимости входить снова.", + "yourProxyHasBeenSuccessfully": "Ваш прокси был успешно {{action}}." + }, + "sign_out": { + "confirm": "Выйти", + "desc": "Вы уверены, что хотите выйти? Вам нужно будет снова войти, чтобы получить доступ к аккаунту.", + "title": "Выйти" + }, + "systemConfig": { + "pageDescription": "Эти параметры инициализируются через флаги CLI или переменные окружения. Они доступны только для чтения.", + "pageTitle": "Конфигурации системного уровня", + "sections": { + "cors": { + "desc": "Правила кросс-доменного доступа", + "title": "CORS" + }, + "logging": { + "desc": "Поведение вывода логов", + "title": "Логирование" + }, + "network": { + "desc": "HTTP и публичный доступ", + "title": "Сеть" + }, + "performance": { + "desc": "Параллелизм и сжатие", + "title": "Производительность" + }, + "security": { + "desc": "Аутентификация и шифрование", + "title": "Безопасность" + }, + "smtp": { + "desc": "Настройки приема входящей почты для архивации в реальном времени", + "title": "SMTP-сервер" + }, + "storage": { + "desc": "Пути к базе данных и лимиты", + "title": "Хранилище и кэш" + } + }, + "status": { + "auto": "Авто", + "configured": "Настроено", + "disabled": "Выключено", + "enabled": "Включено", + "missing": "Отсутствует", + "notSet": "Не задано" + } + }, + "table": { + "asc": "Возр.", + "delete": "Удалить", + "desc": "Убыв.", + "edit": "Ред.", + "hide": "Скрыть", + "loading": "Загрузка...", + "noResults": "Результатов не найдено", + "of": "из", + "page": "Страница", + "pagination": { + "first": "Перейти на первую страницу", + "fixed_page_size": "{{size}} строк на странице.", + "last": "Перейти на последнюю страницу", + "next": "Следующая страница", + "page_info": "Страница {{page}} из {{total}}", + "previous": "Предыдущая страница", + "rows_per_page": "Строк на странице", + "selected": "Выбрано {{selected}} из {{total}} строк." + }, + "results": "результатов", + "rowsPerPage": "Строк на странице", + "showing": "Показано", + "to": "по" + }, + "tag": { + "clear_all": "Очистить все теги", + "label": "Теги", + "no_tags_found": "Теги не найдены", + "search_placeholder": "Поиск тегов..." + }, + "time": { + "absolute_range": "Абсолютный диапазон дат", + "apply": "Применить", + "before": "До", + "clear_filters": "Очистить фильтр времени", + "days_ago_to_now": "дней назад — по настоящее время", + "end_date": "Дата окончания", + "format": "yyyy-MM-dd", + "historical": "Исторический диапазон (до...)", + "label": "Время", + "last_day": "Последний 1 день", + "last_days": "Последние {{count}} дней", + "last_months": "Последние {{count}} месяцев", + "over_years_ago": "{{count}} {{unit}} назад", + "recent_prefix": "Недавно:", + "recent_range": "Недавний диапазон (с...)", + "since": "С", + "start_date": "Дата начала", + "year": "год", + "years": "лет" + }, + "users": { + "actions": { + "api_tokens": "API токены", + "buttons": { + "add_account": "Добавить аккаунт", + "create": "Создать", + "update": "Обновить" + }, + "delete": { + "alert_desc": "Пользователь и все его данные будут стерты.", + "alert_title": "Внимание: удаление навсегда.", + "button_confirm": "Удалить пользователя", + "button_deleting": "Удаление...", + "confirm_msg": "Вы удаляете пользователя {{name}} (ID: {{id}}) навсегда.", + "input_label": "Для подтверждения введите ID пользователя:", + "irreversible": "Это действие необратимо.", + "placeholder": "Введите «{{id}}»", + "title": "Удалить пользователя", + "toast": { + "failed_fallback": "Не удалось удалить пользователя.", + "failed_title": "Ошибка удаления", + "success_desc": "Пользователь «{{name}}» успешно удален.", + "success_title": "Пользователь удален" + } + }, + "dialog": { + "create_title": "Создать пользователя", + "edit_title": "Редактирование: {{name}}", + "subtitle": "Настройка личности, уровней доступа и политик безопасности." + }, + "fields": { + "assign_role": "Назначить роль", + "burst_interval": "Интервал всплеска (сек)", + "description": "Описание (опционально)", + "description_hint": "Внутренние заметки (до 256 символов).", + "description_placeholder": "Заметки о пользователе...", + "email": "Эл. почта", + "email_hint": "Основной адрес для уведомлений.", + "global_roles_hint": "Назначьте системные права.", + "ip_whitelist": "Белый список IP", + "ip_whitelist_hint": "Ограничить вход этими IP (по одному на строку).", + "password": "Пароль", + "password_hint_create": "Безопасный пароль для нового пользователя.", + "password_hint_edit": "Введите новый пароль только для смены.", + "password_placeholder_create": "Минимум 8 символов", + "password_placeholder_edit": "Оставьте пустым, чтобы не менять", + "rate_quota": "Квота частоты", + "select_account": "Выбрать аккаунт", + "username": "Имя пользователя", + "username_hint": "Уникальный идентификатор для входа." + }, + "placeholder": { + "filter": "Поиск пользователей..." + }, + "schema": { + "account_required": "Выберите аккаунт", + "description_max": "Описание не более 256 символов", + "email_invalid": "Введите корректный адрес эл. почты", + "email_required": "Эл. почта обязательна", + "global_role_required": "Назначьте хотя бы одну глобальную роль", + "ip_invalid": "Неверный IP-адрес", + "password_max": "Максимум 256 символа", + "password_min": "Минимум 8 символов", + "password_required": "Пароль обязателен", + "role_required": "Выберите роль", + "username_max": "Максимум 32 символа", + "username_min": "Минимум 3 символов", + "username_required": "Имя пользователя обязательно" + }, + "sections": { + "basic": "Основные данные", + "global": "Глобальные права", + "mail_access": "Управление почтой", + "mail_access_subtitle": "Выберите почтовые аккаунты для управления.", + "policy": "Политики" + }, + "states": { + "full_access": "Полный доступ", + "full_access_desc": "Администраторы имеют доступ ко всем аккаунтам по умолчанию.", + "no_accounts": "Аккаунты не назначены.", + "security_disabled": "Политики безопасности отключены." + }, + "tabs": { + "general": "Общее", + "permissions": "Права аккаунта", + "security": "Безопасность и ACL" + }, + "toast": { + "created": "Пользователь создан", + "updated": "Пользователь обновлен" + } + }, + "api_tokens": { + "button": { + "generate": "Создать новый токен" + }, + "delete": { + "confirm_button": "Удалить токен", + "confirm_label": "Для подтверждения введите {{word}} ниже:", + "confirm_placeholder": "Введите «{{word}}» для подтверждения", + "deleting": "Удаление...", + "desc": "Вы собираетесь навсегда удалить этот API токен", + "irreversible": "Это действие нельзя отменить. Любые приложения, использующие этот токен, немедленно потеряют доступ.", + "prefix": "Префикс токена", + "title": "Удалить API токен", + "warning_desc": "Любые скрипты или сервисы, использующие этот токен, перестанут работать. Убедитесь, что вы обновили свои системы.", + "warning_title": "Предупреждение" + }, + "empty": { + "description": "В системе еще не создано ни одного API-токена.", + "title": "API токены не найдены" + }, + "table": { + "api_key": "API ключ", + "created": "Создан", + "expired": "Истек", + "expires_at": "Истекает", + "last_used": "Последнее использование", + "name": "Имя", + "never": "Никогда", + "owner": "Владелец", + "permanent": "Бессрочно", + "type": "Тип", + "unnamed": "Безымянный токен", + "web_ui": "Веб-интерфейс" + }, + "toast": { + "delete_failed": "Не удалось удалить токен, попробуйте еще раз.", + "delete_failed_title": "Ошибка удаления", + "deleted_desc": "Токен «{{name}}» был успешно удален.", + "deleted_title": "API токен удален" + }, + "toolbar": { + "search_placeholder": "Поиск по имени, владельцу или токену..." + }, + "unnamed": "Безымянный токен" + }, + "buttons": { + "add": "Добавить пользователя", + "add_new": "Новый пользователь" + }, + "columns": { + "actions": "Действия", + "avatar": "Аватар", + "created_at": "Создан", + "email": "Эл. почта", + "id": "ID", + "roles": "Роли и права", + "updated_at": "Обновлен", + "username": "Имя пользователя" + }, + "empty": { + "description": "Нажмите кнопку ниже, чтобы добавить первого пользователя.", + "title": "Пользователи не найдены" + }, + "nav": { + "api_tokens": "API токены", + "roles": "Роли", + "users": "Пользователи" + }, + "tokens": { + "dialog": { + "create_title": "Создать токен доступа", + "description": "Нажмите «Сохранить» по завершении.", + "edit_title": "Редактировать токен" + }, + "error": { + "fallback": "Операция не удалась, попробуйте позже." + }, + "expire_options": { + "1_day": "1 день", + "30_days": "30 дней", + "7_days": "7 дней", + "never": "Бессрочно" + }, + "fields": { + "expire_hint": "Токен автоматически истечет через выбранное время.", + "expire_label": "Срок действия", + "expire_placeholder": "Выберите срок", + "name_hint": "Опционально · макс. 32 символа", + "name_label": "Имя", + "name_placeholder": "Короткое имя для токена" + }, + "schema": { + "expire_int": "Должно быть целым числом", + "expire_number": "Должно быть числом", + "expire_positive": "Должно быть больше 0", + "name_max": "Макс. 32 символа" + }, + "toast": { + "create_failed_title": "Ошибка создания", + "create_success_desc": "Токен доступа успешно создан.", + "create_success_title": "Токен создан", + "update_failed_title": "Ошибка обновления", + "update_success_desc": "Токен доступа успешно обновлен.", + "update_success_title": "Токен обновлен" + } + }, + "tokens_action": { + "buttons": { + "add": "Добавить токен" + }, + "delete_dialog": { + "description": "Это действие нельзя отменить.", + "title": "Удалить токен доступа?" + }, + "dialog": { + "description": "Управление API токенами этого пользователя.", + "title": "API токены" + }, + "empty": { + "description": "У этого пользователя пока нет API токенов.", + "title": "Нет API токенов" + }, + "list": { + "button_delete": "Удалить токен", + "expires_on_brief": "Истекает {{date}}", + "label_created": "Создан", + "label_expires_at": "Истекает", + "label_last_used": "Использован", + "label_token": "Токен", + "never": "Никогда", + "never_expires": "Бессрочно", + "status_active": "Активен", + "status_expired": "Истек", + "unnamed_token": "Безымянный токен" + } + } + }, + "validation": { + "emailRequired": "Email обязателен", + "folderLimitMustBeAtLeast100": "Лимит папки должен быть не менее 100", + "folderLimitMustBeNumber": "Лимит папки должен быть числом", + "imapHostCannotBeEmpty": "IMAP хост не может быть пустым", + "imapHostRequired": "IMAP хост обязателен", + "imapPortMustBeLessThan65536": "IMAP порт должен быть меньше 65536", + "imapPortMustBePositive": "IMAP порт должен быть положительным целым числом", + "incrementalSyncMustBeAtLeast10": "Интервал инкрементальной синхронизации должен быть не менее 10 минут", + "incrementalSyncMustBeNumber": "Интервал инкрементальной синхронизации должен быть числом", + "invalidEmail": "Неверный адрес электронной почты", + "invalidUrl": "Неверный URL", + "passwordMinLength": "Пароль должен быть не менее {{min}} символов", + "passwordRequired": "Пароль обязателен, когда метод авторизации - Пароль", + "pleaseEnterPassword": "Пожалуйста, введите ваш пароль", + "pleaseEnterUsernameOrEmail": "Пожалуйста, введите ваше имя пользователя или адрес электронной почты", + "required": "Это поле обязательно", + "singleRequestBatchSizeMustBeNumber": "Размер пакета должен быть числом", + "singleRequestBatchSizeTooLarge": "Размер пакета должен быть не более 200", + "singleRequestBatchSizeTooSmall": "Размер пакета должен быть не менее 10" + } } \ No newline at end of file diff --git a/web/src/locales/sv.json b/web/src/locales/sv.json index d1a94dd..1abcf28 100644 --- a/web/src/locales/sv.json +++ b/web/src/locales/sv.json @@ -1,1614 +1,1630 @@ { - "common": { - "submit": "Skicka", + "accessTokens": { + "aListOfIpAddressesAllowed": "En lista över IP-adresser som tillåts åtkomst till resursen. Ange en IP-adress per rad. (Valfritt)", + "accountId": "Konto-ID", + "accounts": "Konton", + "aclRulesForAccessTokens": "ACL-regler för åtkomsttokens inkluderar IP-vitlisteverifiering och upprätthållande av hastighetsbegränsningar.", + "actions": { + "delete": "Ta bort", + "edit": "Redigera", + "openMenu": "Öppna meny" + }, + "addNew": "Lägg till ny", + "atLeastOneAccountIsRequired": "Minst ett konto krävs.", + "create": "Skapa", + "createNewAccessTokenHere": "Skapa ny åtkomsttoken här.", + "created": "Skapad", + "createdAt": "Skapad", + "creating": "Skapar...", + "creationFailed": "Skapande misslyckades", + "delete": "Ta bort", + "describeThePurposeOfTheAccessToken": "Beskriv syftet med åtkomsttoken", + "description": "Hantera dina åtkomsttokens, deras åtkomstkontroller, IP-vitlistor och hastighetsbegränsningar här.", + "descriptionMustNotExceed255Characters": "Beskrivning får inte överskrida 255 tecken.", + "edit": "Redigera", + "editToken": "Redigera token", + "enterIntervalInSeconds": "Ange intervall i sekunder, t.ex. 60", + "enterOneIpAddressPerLine": "Ange en IP-adress per rad, t.ex.:\n192.168.1.1\n192.168.1.2", + "enterQuota": "Ange kvot, t.ex. 100", + "expiresAt": "Utgår", + "filterByEmailAddressOrAccountId": "Filtrera på e-postadress eller konto-ID...", + "interval": "Intervall", + "intervalMustBeAPositiveInteger": "Intervall måste vara ett positivt heltal.", + "invalidIpAddressesFound": "Ogiltiga IP-adresser hittades. Vänligen ange giltiga IPv4- eller IPv6-adresser.", + "name": "Namn", + "noTokens": "Inga åtkomsttokens", + "noTokensDesc": "Du har inte skapat några åtkomsttokens ännu. Skapa en för att börja använda API-funktioner.", + "notUsedYet": "Inte använd än", + "quota": "Kvot", + "quotaMustBeAPositiveInteger": "Kvot måste vara ett positivt heltal.", + "save": "Spara", + "saveChanges": "Spara ändringar", + "saving": "Sparar...", + "selectAccounts": "Välj konton", + "selectMultipleAccountsForTheAccessToken": "Välj flera konton för åtkomsttokens behörighetsomfattning.", + "theListOfAccountsThatCanBeQueried": "Listan över konton som kan efterfrågas med hjälp av en åtkomsttoken.", + "theMaximumNumberOfRequestsAllowed": "Det maximala antalet förfrågningar som tillåts inom intervallet. (Valfritt)", + "theTimeWindowForTheRateLimit": "Tidsfönstret (i sekunder) för hastighetsbegränsningen. (Valfritt)", + "title": "Åtkomsttokens", + "token": "Token", + "updateFailed": "Uppdatering misslyckades", + "updateOrCreationFailed": "{{action}} misslyckades, försök igen senare", + "updateTheAccessTokenHere": "Uppdatera åtkomsttoken här.", + "updated": "Uppdaterad", + "updating": "Uppdaterar...", + "yourAccessTokenHasBeenSuccessfully": "Din åtkomsttoken har {{action}}." + }, + "accounts": { + "accessControl": "Åtkomstkontroll", + "accessTokenCopiedToClipboard": "Åtkomsttoken kopierad till urklipp", + "access_control": { + "buttons": { "cancel": "Avbryt", - "save": "Spara", - "save_changes": "Spara ändringar", - "delete": "Ta bort", - "edit": "Redigera", - "search": "Sök", - "add": "Lägg till", - "remove": "Ta bort", - "create": "Skapa", - "update": "Uppdatera", - "confirm": "Bekräfta", + "save": "Spara tilldelning" + }, + "description": "Tilldela roller och auktoriserade användare till {{email}}", + "role_label": "Tillgångsroll", + "role_loading": "Lassar roller...", + "role_placeholder": "Välj en roll", + "title": "Tilldelning av kontotillgång", + "toast": { + "failed_title": "Tilldelning misslyckades", + "success_desc": "Behörigheter har tilldelats {{email}}", + "success_title": "Tilldelning lyckades" + }, + "user_empty": "Inga användare hittades", + "user_label": "Välj auktoriserade användare", + "user_search_placeholder": "Sök efter användarnamn eller e-post...", + "user_selected_count": "Valda: {{count}} användare", + "validation": { + "role_required": "Välj en roll att tilldela", + "user_required": "Välj minst en användare" + } + }, + "accountCreated": "Konto skapat", + "accountCreatedDesc": "Ditt konto har skapats.", + "accountCreationFailed": "Kontoskapande misslyckades", + "accountDetails": "Kontodetaljer", + "accountHasBeenSuccessfully": "Kontot har {{action}} framgångsrikt", + "accountSyncFoldersUpdateFailed": "Uppdatering av synkroniseringsmappar misslyckades", + "accountSyncFoldersUpdated": "Synkroniseringsmappar uppdaterade", + "accountUpdateFailed": "Kontouppdatering misslyckades", + "accountUpdated": "Konto uppdaterat", + "accountUpdatedDesc": "Ditt konto har uppdaterats.", + "actions": "Åtgärder", + "addAccount": "Lägg till konto", + "addConfiguration": "Lägg till konfiguration", + "addImap": "Lägg till IMAP", + "addNewEmailAccountHere": "Lägg till nytt e-postkonto här. ", + "addNoSync": "Lägg till NoSync", + "allMailFolderSelected": "Observera: Mappen \"All e-post\" vald", + "allMailFolderSelectedDesc": "Att välja mappar med attributet \"All e-post\" (All Mail) leder sannolikt till dubbletter av meddelanden som redan synkroniserats från mappar som Inkorg och Skickat. Detta kan ta upp betydligt mer lagringsutrymme.", + "allMailSkipped": "Valde standardmappar. \"All e-post\" hoppades över för att undvika dubbletter.", + "areYouSureYouWantTo": "Är du säker på att du vill {{action}} detta konto?", + "auth": "Auth", + "authType": "auth_typ", + "autoConfiguring": "Konfigurerar automatiskt...", + "beforeRelative": "Ladda ner endast gamla e-postmeddelanden", + "beforeRelativeValue": "Ladda ner e-post från {{value}} {{unit}} sedan", + "capabilities": "Funktioner", + "chooseAuthMethod": "Välj autentiseringsmetod för IMAP.", + "chooseEncryptionMethod": "Välj krypteringsmetod för IMAP.", + "chooseMailboxesToDownload": "Välj brevlådor att ladda ner för {{email}}. Nya brevlådor laddas ner i nästa cykel.", + "clickHere": "klicka här", + "clickSaveWhenDone": "Klicka på spara när du är klar.", + "continue": "Fortsätt", + "createdAt": "Skapad", + "creationFailed": "Skapande misslyckades, försök igen senare", + "dateSelection": "Datumsval", + "dateSince": "Datum från", + "days": "Dagar", + "delete": "Ta bort", + "description": "Hantera och konfigurera dina e-postkonton.", + "detail": "Detaljer", + "detailsOfTheOAuth2TokensForTheAccount": "Detaljer om OAuth2-tokens för kontot.", + "determinesWhetherThisAccountIsActiveNoSync": "Avgör om kontot är aktivt. Om det är inaktiverat kan ingen data importeras.", + "disable": "Inaktivera", + "disableAccount": "Inaktivera konto", + "disabled": "Inaktiverad", + "downloadAll": "Ladda ner alla e-postmeddelanden", + "downloadBatchSize": "Batchstorlek för nedladdning", + "downloadBatchSizeDescription": "Antal meddelanden som hämtas per IMAP-begäran", + "downloadInterval": "Nedladdningsintervall (minuter)", + "downloadIntervalPlaceholder": "Ange minuter", + "downloadScope": "Nedladdningsstrategi", + "downloadScopeDescription": "Välj vilka e-postmeddelanden som ska indexeras och laddas ner.", + "duration": "Varaktighet", + "edit": "Redigera", + "email": "E-post", + "emailAccountRegistration": "Registrering av e-postkonto", + "emailAccountRegistrationDesc": "Ange din e-postadress. I nästa steg konfigurerar du IMAP-inställningar. Vi använder denna adress för att automatiskt upptäcka IMAP-serverinställningar.", + "emailAddress": "E-postadress", + "emailCannotBeModified": "Kontots e-postadress kan inte ändras vid redigering.", + "emailPlaceholder": "t.ex. sven.svensson@exempel.se", + "enable": "Aktivera", + "enableAccount": "Aktivera konto", + "enabled": "Aktiverad", + "enabledDescription": "Avgör om det här kontot är aktivt. Om det är inaktiverat kommer relaterade nedladdningar inte att köras.", + "encryption": "kryptering", + "enterPassword": "Ange ditt lösenord", + "enterValue": "Ange ett värde", + "everyMinutes": "varje {{minutes}} minut", + "field": "Fält", + "fixed": "Fast", + "folderLimit": "Mappgräns", + "folderLimitDescription": "Begränsa antalet e-postmeddelanden att synkronisera per mapp (minst 100). Lämna tomt för ingen gräns.", + "folderLimitPlaceholder": "t.ex. 1000", + "folderSync": { + "autoSelectDescendants": "Välj underordnade automatiskt", + "autoSelectParents": "Välj överordnade automatiskt", + "batches": "satser", + "collapseAll": "Komprimera alla", + "expandAll": "Expandera alla", + "loadingMailboxFolders": "Laddar brevlådemappar…", + "noData": "Inga data", + "noFolders": "Inga mappar att synkronisera" + }, + "foldersConfiguredForSync": "{{count}} mapp(ar) konfigurerade för synk", + "foldersSelected": "{{count}} mapp(ar) valda", + "goBack": "Gå tillbaka", + "host": "värd", + "id": "ID", + "imap": "IMAP", + "imapAuthMethod": "IMAP-autentiseringsmetod", + "imapEncryption": "IMAP-kryptering", + "imapHost": "IMAP-värd", + "imapHostPlaceholder": "t.ex. imap.exempel.se", + "imapPassword": "IMAP-lösenord", + "imapPort": "IMAP-port", + "imapPortPlaceholder": "t.ex. 993", + "imapProxy": "Använd en SOCKS5-proxy för IMAP-anslutningar.", + "incSync": "Ink. synk", + "lastSync": "Senaste synk", + "leaveEmptyToKeepExisting": "Lämna tomt för att behålla det befintliga lösenordet, eller ange ett nytt för att uppdatera det.", + "leaveEmptyToKeepPassword": "Lämna tomt för att behålla nuvarande lösenord", + "login_name": "Inloggningsnamn", + "minutes": "minuter", + "months": "Månader", + "moreAccountTypes": "Fler kontotyper", + "mustBeAtLeast1": "Måste vara minst 1", + "name": "Namn", + "nameDescription": "IMAP-användarnamn. Förvalt är din e-post, eller ange ett valfritt.", + "namePlaceholder": "t.ex. sven.svensson", + "noAccountConfigurations": "Inga kontokonfigurationer", + "noAccountConfigurationsDesc": "Du har inte lagt till några kontokonfigurationer ännu. Lägg till en för att börja använda kontofunktioner.", + "noOAuth2Tokens": "Inga OAuth2-tokens", + "none": "Ingen", + "notAvailable": "ej tillg.", + "oauth2Tokens": "OAuth2-tokens", + "openMenu": "Öppna meny", + "optional": "Valfritt", + "owner": "Skapad av", + "password": "lösenord", + "port": "port", + "recent": "nyligen", + "refreshToken": "Uppdateringstoken", + "refreshTokenCopiedToClipboard": "Uppdateringstoken kopierad till urklipp", + "relative": "Relativ", + "runningState": { + "account": { + "id": "Kontots ID" + }, + "common": { "close": "Stäng", - "yes": "Ja", - "no": "Nej", - "ok": "OK", - "loading": "Laddar...", - "empty": "Tom", - "noData": "Ingen data", - "table": { - "noResults": "Inga resultat." - }, - "failed": "Misslyckades", - "notFound": "Hittades inte", - "back": "Tillbaka", - "goBack": "Gå tillbaka", - "backToHome": "Tillbaka till start", - "tryAgain": "Försök igen", - "more": "Mer", - "actions": "Åtgärder", - "filter": "Filtrera", - "reset": "Återställ", - "clear": "Rensa", - "error": "Fel", - "apply": "Använd", - "select": "Välj", - "selectAll": "Välj alla", - "deselectAll": "Avmarkera alla", - "all": "Alla", - "none": "Ingen", - "showLess": "Visa mindre", - "showMore": "Visa mer...", - "project_description": "Bichon är ett open-source-projekt.", - "view_on_github_button": "Visa på GitHub", - "op_failed": "Åtgärden misslyckades", - "na": "Saknas", - "retry": "Försök igen", - "deleting": "Tar bort..." - }, - "navigation": { - "home": "Hem", - "settings": "Inställningar", - "accounts": "Konton", - "dashboard": "Översikt", - "mailbox": "Brevlåda", - "oauth2": "OAuth2", - "accessTokens": "Åtkomsttokens", - "apiDocs": "API-dokumentation", - "general": "Allmänt", - "auth": "Autentisering", - "other": "Övrigt", - "users": "Systemanvändare" - }, - "auth": { - "welcome": "Välkommen till Bichon", - "username": "Användarnamn", - "password": "Lösenord", - "login": "Logga in", - "loginFailed": "Inloggning misslyckades", - "invalidPassword": "Ogiltigt lösenord. Var god försök igen.", - "somethingWentWrong": "Något gick fel", - "sessionExpired": "Sessionen har löpt ut!", - "sessionExpiredDesc": "Din session har avslutas på grund av inaktivitet. Vänligen logga in igen för att fortsätta.", - "logout": "Logga ut", - "areYouSureYouWantToLogOut": "Är du säker på att du vill logga ut?", - "youWillNeedToLogInAgain": "Du måste logga in igen för att komma åt ditt konto." - }, - "errors": { - "pageNotFound": "Hoppsan! Sidan hittades inte!", - "pageNotFoundDesc": "Sidan du letar efter verkar inte finnas eller kan ha tagits bort.", - "somethingWentWrong": "Hoppsan! Något gick fel :')", - "somethingWentWrongDesc": "Vi ber om ursäkt för besväret. Vänligen försök igen senare.", - "internalServerError": "Internt serverfel!", - "contentNotModified": "Innehållet har inte ändrats!", - "networkError": "Nätverksfel", - "networkErrorDesc": "Kan inte ansluta till servern. Kontrollera din internetanslutning och försök igen.", - "forbidden": "Förbjudet", - "forbiddenTitle": "Åtkomst nekad", - "forbiddenDesc": "Du har inte behörighet att visa denna resurs.", - "unauthorized": "Obehörig", - "unauthorizedTitle": "Obehörig åtkomst", - "unauthorizedDesc": "Vänligen logga in med lämpliga uppgifter för att komma åt denna resurs.", - "maintenance": "Underhåll", - "maintenanceTitle": "Webbplatsen ligger nere för underhåll!", - "maintenanceDesc": "Sidan är inte tillgänglig för tillfället. Vi är snart tillbaka online.", - "learnMore": "Läs mer" - }, - "dashboard": { - "title": "Översikt", - "mailAccounts": "E-postkonton", - "connected": "Ansluten", - "totalEmails": "Totalt antal e-postmeddelanden", - "syncedLocally": "Synkroniserat lokalt", - "totalEmailSize": "Total e-poststorlek", - "logicalVolume": "Ursprunglig storlek", - "localDataFiles": "Lokala datafiler", - "actualDiskUsage": "Faktisk diskanvändning", - "efficiency": "Lagringseffektivitet", - "saved": "Sparat", - "dataStorage": "Datalagring", - "indexSize": "Indexstorlek", - "metadataSize": "Metadatastorlek", - "tantivyDatabase": "Baserat på sökmotorn Tantivy", - "dayTrend": "30-dagarstrend", - "attachments": "Bilagor", - "topLists": "Topplistor", - "newEmails": "Nya e-postmeddelanden", - "messageDistribution": "Meddelandefördelning", - "attachmentRatio": "Bilagefrekvens", - "attachmentRatioDesc": "{{percent}}% av e-postmeddelandena har bilagor", - "noEmailsSynced": "Inga e-postmeddelanden synkroniserade ännu", - "withAttachments": "Med bilagor", - "noAttachments": "Utan bilagor", - "top10Senders": "Topp 10 avsändare", - "byMessageCount": "Efter antal meddelanden", - "sender": "Avsändare", - "count": "Antal", - "top10LargestEmails": "Topp 10 största e-postmeddelanden", - "byMessageSize": "Efter storlek", - "subject": "Ämne", - "size": "Storlek", - "noSubject": "(Inget ämne)", - "top10Accounts": "Topp 10 konton", - "emails": "E-post", - "account": "Konto", - "noRecentActivity": "Ingen nylig aktivitet", - "noSendersData": "Inga avsändardata", - "noLargeEmails": "Inga stora e-postmeddelanden", - "noAccountData": "Inga kontodata", - "systemVersion": "Systemversion" - }, - "accounts": { - "beforeRelativeValue": "Ladda ner e-post från {{value}} {{unit}} sedan", - "sinceRelativeValue": "Ladda ner e-post från de senaste", - "downloadBatchSize": "Batchstorlek för nedladdning", - "downloadBatchSizeDescription": "Antal meddelanden som hämtas per IMAP-begäran", - "downloadScopeDescription": "Välj vilka e-postmeddelanden som ska indexeras och laddas ner.", - "downloadScope": "Nedladdningsstrategi", - "selectMode": "Välj filterläge", - "downloadAll": "Ladda ner alla e-postmeddelanden", - "sinceFixed": "Sedan specifikt datum", - "sinceRelative": "Ladda ner endast senaste e-postmeddelanden", - "beforeRelative": "Ladda ner endast gamla e-postmeddelanden", - "duration": "Varaktighet", - "unit": "Enhet", - "accessControl": "Åtkomstkontroll", - "owner": "Skapad av", - "access_control": { - "title": "Tilldelning av kontotillgång", - "description": "Tilldela roller och auktoriserade användare till {{email}}", - "role_label": "Tillgångsroll", - "role_placeholder": "Välj en roll", - "role_loading": "Lassar roller...", - "user_label": "Välj auktoriserade användare", - "user_search_placeholder": "Sök efter användarnamn eller e-post...", - "user_empty": "Inga användare hittades", - "user_selected_count": "Valda: {{count}} användare", - "buttons": { - "cancel": "Avbryt", - "save": "Spara tilldelning" - }, - "validation": { - "user_required": "Välj minst en användare", - "role_required": "Välj en roll att tilldela" - }, - "toast": { - "success_title": "Tilldelning lyckades", - "success_desc": "Behörigheter har tilldelats {{email}}", - "failed_title": "Tilldelning misslyckades" - } - }, - "title": "E-postkonton", - "description": "Hantera och konfigurera dina e-postkonton.", - "addImap": "Lägg till IMAP", - "addNoSync": "Lägg till NoSync", - "moreAccountTypes": "Fler kontotyper", - "noAccountConfigurations": "Inga kontokonfigurationer", - "noAccountConfigurationsDesc": "Du har inte lagt till några kontokonfigurationer ännu. Lägg till en för att börja använda kontofunktioner.", - "addConfiguration": "Lägg till konfiguration", - "useNoProxy": "Ingen proxy", - "login_name": "Inloggningsnamn", - "name": "Namn", - "email": "E-post", + "folders": "postlådor" + }, + "empty": { + "no_active_download": "Ingen aktiv nedladdning", + "no_errors_current": "Inga fel i aktuell session", + "no_errors_session": "Inga fel i denna session", + "no_global_errors": "Inga globala fel", + "no_history": "Ingen historik" + }, + "folders": "postlådor", + "latest": "SENASTE", + "loading": { + "fetching_account_state": "Hämtar kontostatus..." + }, + "message": "Meddelande", + "session": { + "started_at": "Starttid", "status": "Status", - "type": "Typ", - "lastSync": "Senaste synk", - "actions": "Åtgärder", - "edit": "Redigera", - "delete": "Ta bort", - "detail": "Detaljer", - "selectMailboxes": "Välj brevlådor", - "oauth2Tokens": "OAuth2-tokens", - "id": "ID", - "enabled": "Aktiverad", - "auth": "Auth", - "incSync": "Ink. synk", - "state": "Tillstånd", - "createdAt": "Skapad", - "updatedAt": "Uppdaterad", - "openMenu": "Öppna meny", - "emailAccountRegistration": "Registrering av e-postkonto", - "emailAccountRegistrationDesc": "Ange din e-postadress. I nästa steg konfigurerar du IMAP-inställningar. Vi använder denna adress för att automatiskt upptäcka IMAP-serverinställningar.", - "emailAddress": "E-postadress", - "emailPlaceholder": "t.ex. sven.svensson@exempel.se", - "namePlaceholder": "t.ex. sven.svensson", - "optional": "Valfritt", - "nameDescription": "IMAP-användarnamn. Förvalt är din e-post, eller ange ett valfritt.", - "emailCannotBeModified": "Kontots e-postadress kan inte ändras vid redigering.", - "addAccount": "Lägg till konto", - "updateAccount": "Uppdatera konto", - "accountUpdated": "Konto uppdaterat", - "accountCreated": "Konto skapat", - "accountUpdatedDesc": "Ditt konto har uppdaterats.", - "accountCreatedDesc": "Ditt konto har skapats.", - "accountUpdateFailed": "Kontouppdatering misslyckades", - "accountCreationFailed": "Kontoskapande misslyckades", - "updateFailed": "Uppdatering misslyckades, försök igen senare", - "creationFailed": "Skapande misslyckades, försök igen senare", - "allMailFolderSelected": "Observera: Mappen \"All e-post\" vald", - "accountSyncFoldersUpdated": "Synkroniseringsmappar uppdaterade", - "accountSyncFoldersUpdateFailed": "Uppdatering av synkroniseringsmappar misslyckades", - "serverConfiguration": "Serverkonfiguration (IMAP)", - "selectedMailboxes": "Valda brevlådor", - "allMailFolderSelectedDesc": "Att välja mappar med attributet \"All e-post\" (All Mail) leder sannolikt till dubbletter av meddelanden som redan synkroniserats från mappar som Inkorg och Skickat. Detta kan ta upp betydligt mer lagringsutrymme.", - "allMailSkipped": "Valde standardmappar. \"All e-post\" hoppades över för att undvika dubbletter.", - "selectAtLeastOneFolder": "Vänligen välj minst en mapp", - "chooseMailboxesToDownload": "Välj brevlådor att ladda ner för {{email}}. Nya brevlådor laddas ner i nästa cykel.", - "accountDetails": "Kontodetaljer", - "capabilities": "Funktioner", - "folderLimit": "Mappgräns", - "everyMinutes": "varje {{minutes}} minut", - "foldersConfiguredForSync": "{{count}} mapp(ar) konfigurerade för synk", - "foldersSelected": "{{count}} mapp(ar) valda", - "imapHost": "IMAP-värd", - "imapHostPlaceholder": "t.ex. imap.exempel.se", - "imapPort": "IMAP-port", - "imapPortPlaceholder": "t.ex. 993", - "imapEncryption": "IMAP-kryptering", - "selectEncryptionMethod": "Välj en krypteringsmetod", - "chooseEncryptionMethod": "Välj krypteringsmetod för IMAP.", - "imapAuthMethod": "IMAP-autentiseringsmetod", - "selectAuthMethod": "Välj en autentiseringsmetod", - "chooseAuthMethod": "Välj autentiseringsmetod för IMAP.", - "imapPassword": "IMAP-lösenord", - "leaveEmptyToKeepPassword": "Lämna tomt för att behålla nuvarande lösenord", - "enterPassword": "Ange ditt lösenord", - "leaveEmptyToKeepExisting": "Lämna tomt för att behålla det befintliga lösenordet, eller ange ett nytt för att uppdatera det.", - "useProxy": "Använd Proxy", - "selectProxy": "Välj en proxy", - "downloadInterval": "Nedladdningsintervall (minuter)", - "downloadIntervalPlaceholder": "Ange minuter", - "enabledDescription": "Avgör om det här kontot är aktivt. Om det är inaktiverat kommer relaterade nedladdningar inte att köras.", - "dateSince": "Datum från", - "none": "Ingen", - "fixed": "Fast", - "relative": "Relativ", - "selectDate": "Välj ett datum", - "selectUnit": "Välj en enhet", - "days": "Dagar", - "months": "Månader", - "years": "År", - "enterValue": "Ange ett värde", - "mustBeAtLeast1": "Måste vara minst 1", - "dateSelection": "Datumsval", - "since": "sedan", - "recent": "nyligen", - "notAvailable": "ej tillg.", - "host": "värd", - "port": "port", - "encryption": "kryptering", - "authType": "auth_typ", - "password": "lösenord", - "useProxyField": "använd proxy", - "clickSaveWhenDone": "Klicka på spara när du är klar.", - "step": "Steg {{index}}", - "goBack": "Gå tillbaka", - "autoConfiguring": "Konfigurerar automatiskt...", - "continue": "Fortsätt", - "saveChanges": "Spara ändringar", - "submit": "Skicka", - "field": "Fält", - "value": "Värde", - "refreshToken": "Uppdateringstoken", - "accessTokenCopiedToClipboard": "Åtkomsttoken kopierad till urklipp", - "refreshTokenCopiedToClipboard": "Uppdateringstoken kopierad till urklipp", - "noOAuth2Tokens": "Inga OAuth2-tokens", - "theAccountHasNotCompletedTheAuthorizationProcess": "Kontot har inte slutfört auktoriseringsprocessen. Vänligen ", - "clickHere": "klicka här", - "toAuthorizeTheAccount": " för att auktorisera kontot.", - "detailsOfTheOAuth2TokensForTheAccount": "Detaljer om OAuth2-tokens för kontot.", - "updateTheEmailAccountHere": "Uppdatera e-postkontot här. ", - "addNewEmailAccountHere": "Lägg till nytt e-postkonto här. ", - "thisAccountIsUsedForIdentificationPurposesOnly": "Detta konto används endast för identifieringssyften och kräver inte synkronisering med en e-postserver. Det hjälper till med import av e-postdata.", - "determinesWhetherThisAccountIsActiveNoSync": "Avgör om kontot är aktivt. Om det är inaktiverat kan ingen data importeras.", - "folderSync": { - "noData": "Inga data", - "noFolders": "Inga mappar att synkronisera", - "batches": "satser", - "autoSelectDescendants": "Välj underordnade automatiskt", - "autoSelectParents": "Välj överordnade automatiskt", - "expandAll": "Expandera alla", - "collapseAll": "Komprimera alla", - "loadingMailboxFolders": "Laddar brevlådemappar…" - }, - "viewDetails": "visa detaljer", - "runningState": { - "message": "Meddelande", - "account": { - "id": "Kontots ID" - }, - "tabs": { - "active_session": "Aktiv session", - "history": "Historik", - "global_errors": "Globala fel", - "folders": "Postlådor", - "errors": "Fel" - }, - "loading": { - "fetching_account_state": "Hämtar kontostatus..." - }, - "empty": { - "no_active_download": "Ingen aktiv nedladdning", - "no_errors_current": "Inga fel i aktuell session", - "no_errors_session": "Inga fel i denna session", - "no_global_errors": "Inga globala fel", - "no_history": "Ingen historik" - }, - "session": { - "status": "Status", - "trigger": "Trigger", - "started_at": "Starttid" - }, - "common": { - "folders": "postlådor", - "close": "Stäng" - }, - "latest": "SENASTE", - "folders": "postlådor" - }, - "steps": { - "complete": "Slutför", - "emailAddress": "E-postadress", - "imap": "IMAP", - "syncPreferences": "Synkroniseringsinställningar", - "summary": "Sammanfattning" - }, - "imapProxy": "Använd en SOCKS5-proxy för IMAP-anslutningar.", - "syncStartDateDescription": "Definierar startdatum för synkronisering – antingen specifikt eller relativt till nu. Tidigare e-postmeddelanden exkluderas, {{fixedPart}}.", - "syncAfterDate": "synkroniserar data efter ett angivet datum", - "syncRecentData": "förskjuter synkroniseringsdatumet över tid, och synkroniserar endast nyliga data", - "folderLimitDescription": "Begränsa antalet e-postmeddelanden att synkronisera per mapp (minst 100). Lämna tomt för ingen gräns.", - "folderLimitPlaceholder": "t.ex. 1000", - "imap": "IMAP", - "minutes": "minuter", - "accountHasBeenSuccessfully": "Kontot har {{action}} framgångsrikt", - "enableAccount": "Aktivera konto", - "disableAccount": "Inaktivera konto", - "areYouSureYouWantTo": "Är du säker på att du vill {{action}} detta konto?", - "enable": "Aktivera", - "disable": "Inaktivera", - "thisWillPreventTheAccountFromBeingUsed": "Det här kontot kommer inte längre att synkronisera data från IMAP-servern, men befintlig data kommer fortfarande att vara åtkomlig.", - "disabled": "Inaktiverad", - "useDangerous": "Lita på vilken TLS‑certifikat som helst", - "useDangerousDescription": "Aktivera detta alternativ endast om IMAP‑servern använder ett offentligt eller självsignerat certifikat som inte är betrott av ditt system. Denna inställning kringgår standardverifiering av certifikat, vilket kan utsätta dig för man‑i‑mitten‑attacker — slå på endast om du förstår riskerna." + "trigger": "Trigger" + }, + "tabs": { + "active_session": "Aktiv session", + "errors": "Fel", + "folders": "Postlådor", + "global_errors": "Globala fel", + "history": "Historik" + } }, - "mailbox": { - "deleteMailboxDialog": { - "title": "Ta bort brevlådemapp", - "desc": "Är du säker på att du vill ta bort den här mappen? Denna åtgärd kan inte ångras.", - "warningTitle": "Varning", - "warningDesc": "Om du tar bort den här mappen raderas även alla arkiverade e-postmeddelanden och undermappar i den permanent.", - "confirm": "Ta bort permanent", - "successTitle": "Borttagen", - "successDesc": "Brevlådemappen och dess innehåll har raderats.", - "errorTitle": "Kunde inte ta bort" - }, - "title": "Brevlåda", - "folders": "Mappar", - "messages": "Meddelanden", - "noMessages": "Inga meddelanden", - "selectFolder": "Välj en mapp för att visa meddelanden", - "deleteDialog": { - "title": "Ta bort e-post", - "desc": "Är du säker på att du vill ta bort {{countText}}? Denna åtgärd tar bort valda e-postmeddelanden från den lokala databasen. E-postmeddelandena raderas permanent och kan inte återställas.", - "descCountSingle": "detta e-postmeddelande", - "descCountMultiple": "dessa {{count}} e-postmeddelanden", - "warningTitle": "Varning!", - "warningDesc": "Vänligen var försiktig innan du fortsätter.", - "confirm": "Ta bort", - "successTitle": "Meddelanden raderades", - "successDesc": "Meddelandena har tagits bort.", - "errorTitle": "Kunde inte ta bort meddelanden" - }, - "thread": { - "title": "Tråd ({{count}} {{messageLabel}})", - "message": "meddelande", - "messages": "meddelanden", - "noSubject": "(Inget ämne)", - "invalidDate": "Ogiltigt datum", - "empty": "Inga meddelanden i denna tråd.", - "loadError": "Kunde inte ladda tråd", - "loadingMore": "Laddar fler...", - "loadMore": "Ladda fler" - }, - "bulkActions": { - "ariaLabel": "Massåtgärder för {{count}} valda {{emailLabel}}", - "email": "e-post", - "emails": "e-postmeddelanden", - "selected": "valda", - "clearSelection": "Rensa urval", - "clearSelectionWithKey": "Rensa urval ({{key}})", - "delete": "Ta bort", - "deleteTooltip": "Ta bort valda e-postmeddelanden" - } + "saveChanges": "Spara ändringar", + "selectAtLeastOneFolder": "Vänligen välj minst en mapp", + "selectAuthMethod": "Välj en autentiseringsmetod", + "selectDate": "Välj ett datum", + "selectEncryptionMethod": "Välj en krypteringsmetod", + "selectMailboxes": "Välj brevlådor", + "selectMode": "Välj filterläge", + "selectProxy": "Välj en proxy", + "selectUnit": "Välj en enhet", + "selectedMailboxes": "Valda brevlådor", + "serverConfiguration": "Serverkonfiguration (IMAP)", + "since": "sedan", + "sinceFixed": "Sedan specifikt datum", + "sinceRelative": "Ladda ner endast senaste e-postmeddelanden", + "sinceRelativeValue": "Ladda ner e-post från de senaste", + "state": "Tillstånd", + "status": "Status", + "step": "Steg {{index}}", + "steps": { + "complete": "Slutför", + "emailAddress": "E-postadress", + "imap": "IMAP", + "summary": "Sammanfattning", + "syncPreferences": "Synkroniseringsinställningar" }, - "search": { - "size": "Storlek", - "any": "Alla", - "tiny": "Mycket liten (<15 KB)", - "small": "Liten (<2 MB)", - "medium": "Medelstor (2 - 10 MB)", - "large": "Stor (10 - 20 MB)", - "huge": "Mycket stor (≥20 MB)", - "sort": "Sortera", - "sizeDescription": "Storleken avser e-postens totala storlek, inklusive bilagor.", - "title": "Sök", - "searching": "Söker, vänligen vänta…", - "noEmailsFound": "Inga e-postmeddelanden hittades", - "startSearching": "Börja med att ange ett sökord, avsändare eller använd avancerade filter.", - "adjustSearch": "Prova att justera dina sökkriterier eller rensa filter.", - "tagFilter": "Etikettfilter", - "from": "Från", - "to": "Till", - "subject": "Ämne", - "date": "Datum", - "editTag": "Redigera etikett", - "keyword": "Sökord", - "sender": "Avsändare", - "recipient": "Mottagare", - "hasAttachment": "Har bilaga", - "yes": "Ja", - "no": "Nej", - "dateRange": "Datumintervall", - "startDate": "Startdatum", - "endDate": "Slutdatum", - "advancedFilters": "Avancerade filter", - "searchArchivedEmails": "Sök i arkiverade e-postmeddelanden", - "fullTextMultiAccount": "Fulltext · Flera konton · Avancerade filter", - "account": "Konto", - "mailbox": "Brevlåda", - "selectAccount": "Välj konto", - "selectMailbox": "Välj brevlåda", - "noActiveEmailAccount": "Inget aktivt e-postkonto.", - "addEmailAccount": "Lägg till e-postkonto", - "noMailboxSelectAccount": "Ingen brevlåda. Vänligen välj ett konto först.", - "searchInSubjectBody": "Sök i ämne, innehåll, bilagor...", - "searchingButton": "Söker...", - "searchButton": "Sök", - "advanced": "Avancerat", - "clear": "Rensa", - "since": "Sedan:", - "before": "Före:", - "selectDate": "Välj ett datum", - "pleaseSelectAtLeastOne": "Vänligen välj minst ett sökvillkor", - "cc": "Kopia (CC)", - "bcc": "Hemlig kopia (BCC)", - "attachmentName": "Filnamn på bilaga", - "messageId": "Meddelande-ID", - "minSize": "Min. storlek", - "maxSize": "Max. storlek", - "senderRecipients": "Avsändare / Mottagare", - "attachmentsSize": "Bilagor & storlek", - "minimumBytes": "Minimum", - "maximumBytes": "Maximum", - "originalMessageIdHeader": "Ursprungligt e-postmeddelandes Message-ID header", - "addTags": { - "title": "Redigera etiketter", - "none": "Inga etiketter tillagda", - "searchPlaceholder": "Sök eller skapa etikett...", - "createHint": "Skapa ny etikett: {{tag}}", - "invalidTitle": "Ogiltig etikett", - "updatedTitle": "Etiketter uppdaterade", - "updatedDesc": "Etiketterna har uppdaterats", - "updateFailedTitle": "Uppdatering misslyckades", - "tryAgain": "Vänligen försök igen senare", - "selectedCount": "{{count}} etiketter valda", - "cancel": "Avbryt", - "save": "Spara", - "saving": "Sparar..." - }, - "updateTags": { - "overwriteWarning": "Varning: Detta kommer att skriva över alla befintliga taggar på de valda objekten.", - "title": "Uppdatera taggar", - "none": "Inga taggar valda", - "searchPlaceholder": "Sök eller skapa ny tagg...", - "createHint": "Tryck på Enter för att skapa ny tagg: \"{{tag}}\"", - "selectedCount": "{{count}} tagg(ar) kommer att tillämpas", - "cancel": "Avbryt", - "invalidTitle": "Ogiltig tagg", - "updatedTitle": "Taggar uppdaterade", - "updatedDesc": "Taggarna har uppdaterats.", - "updateFailedTitle": "Uppdateringen misslyckades", - "tryAgain": "Försök igen senare.", - "actionAdd": "Lägg till", - "actionRemove": "Ta bort", - "actionOverwrite": "Skriv över", - "submitAdd": "Lägg till taggar", - "submitRemove": "Ta bort taggar", - "submitOverwrite": "Skriv över taggar", - "savingAdd": "Lägger till...", - "savingRemove": "Tar bort...", - "savingOverwrite": "Skriver över..." - }, - "thread": { - "title": "Tråd · {{count}} meddelanden", - "error": "Kunde inte ladda tråd", - "empty": "Inga meddelanden i denna tråd", - "invalidDate": "Ogiltigt datum", - "noSubject": "(Inget ämne)", - "loadingMore": "Laddar...", - "loadMore": "Ladda mer" - }, - "bulkActions": { - "ariaLabel": "{{count}} meddelanden valda. Verktygsfält", - "delete": "Ta bort", - "deleteDesc": "Ta bort valda meddelanden", - "selected": "{{count}} valda", - "clear": "Rensa val", - "manageTags": "Hantera taggar" - }, - "delete": { - "title": "Ta bort meddelanden", - "confirmPrefix": "Är du säker på att du vill ta bort", - "countLabel": "{{count}} meddelanden?", - "confirmDetail": "Denna åtgärd kan inte ångras.", - "confirmButton": "Ta bort", - "warningTitle": "Varning", - "warningDesc": "Meddelanden raderas permanent.", - "successTitle": "Borttagna", - "successDesc": "Meddelandena har tagits bort.", - "errorTitle": "Borttagning misslyckades" - } + "submit": "Skicka", + "syncAfterDate": "synkroniserar data efter ett angivet datum", + "syncRecentData": "förskjuter synkroniseringsdatumet över tid, och synkroniserar endast nyliga data", + "syncStartDateDescription": "Definierar startdatum för synkronisering – antingen specifikt eller relativt till nu. Tidigare e-postmeddelanden exkluderas, {{fixedPart}}.", + "theAccountHasNotCompletedTheAuthorizationProcess": "Kontot har inte slutfört auktoriseringsprocessen. Vänligen ", + "thisAccountIsUsedForIdentificationPurposesOnly": "Detta konto används endast för identifieringssyften och kräver inte synkronisering med en e-postserver. Det hjälper till med import av e-postdata.", + "thisWillPreventTheAccountFromBeingUsed": "Det här kontot kommer inte längre att synkronisera data från IMAP-servern, men befintlig data kommer fortfarande att vara åtkomlig.", + "title": "E-postkonton", + "toAuthorizeTheAccount": " för att auktorisera kontot.", + "type": "Typ", + "unit": "Enhet", + "updateAccount": "Uppdatera konto", + "updateFailed": "Uppdatering misslyckades, försök igen senare", + "updateTheEmailAccountHere": "Uppdatera e-postkontot här. ", + "updatedAt": "Uppdaterad", + "useDangerous": "Lita på vilken TLS‑certifikat som helst", + "useDangerousDescription": "Aktivera detta alternativ endast om IMAP‑servern använder ett offentligt eller självsignerat certifikat som inte är betrott av ditt system. Denna inställning kringgår standardverifiering av certifikat, vilket kan utsätta dig för man‑i‑mitten‑attacker — slå på endast om du förstår riskerna.", + "useNoProxy": "Ingen proxy", + "useProxy": "Använd Proxy", + "useProxyField": "använd proxy", + "value": "Värde", + "viewDetails": "visa detaljer", + "years": "År" + }, + "apiDocs": { + "choosePreferredType": "Välj föredragen typ av API-dokumentation", + "downloadSpecYAML": "Ladda ner Spec YAML", + "openAPIExplorer": "OpenAPI Explorer", + "reDoc": "ReDoc", + "scalar": "Scalar", + "swaggerUI": "Swagger UI" + }, + "apiTokens": { + "deleteDialog": { + "cancel": "Avbryt", + "confirm": "Ta bort", + "deleting": "Tar bort...", + "description": "Denna åtgärd kan inte ångras. Applikationer som använder denna token kommer omedelbart att förlora åtkomst.", + "title": "Ta bort åtkomsttoken?" }, - "mail": { - "emailViewer": "E-postvisare", - "noMessageSelected": "Inget meddelande valt", - "account": "Konto", - "from": "Från", - "to": "Till", - "subject": "Ämne", - "date": "Datum", - "tags": "Etiketter", - "noTagsYet": "Inga etiketter än", - "id": "ID", - "cc": "Kopia", - "bcc": "Hemlig kopia", - "attachments": "Bilagor", - "download": "Ladda ner", - "delete": "Ta bort", - "viewThread": "Visa tråd", - "downloadStarted": "Nedladdning påbörjad", - "downloadComplete": "Nedladdning slutförd", - "downloadFailed": "Nedladdning misslyckades", - "failedToDownloadFile": "Kunde inte ladda ner fil", - "failedToLoadEmail": "Kunde inte ladda e-postmeddelande.", - "isBeingDownloaded": "{{id}} laddas ner", - "downloaded": "{{id}} nedladdad", - "showLess": "visa mindre", - "showMore": "visa mer...", - "onlyNonInlineAttachments": "Endast icke-inbäddade bilagor visas här.", - "noAttachments": "Inga bilagor" + "dialog": { + "createTitle": "Skapa åtkomsttoken", + "description": "Klicka på spara när du är klar.", + "editTitle": "Redigera åtkomsttoken", + "save": "Spara", + "saveChanges": "Spara ändringar" }, - "oauth2": { - "title": "OAuth2", - "addConfiguration": "Lägg till konfiguration", - "id": "ID", - "provider": "Leverantör", - "clientId": "Klient-ID", - "clientSecret": "Klienthemlighet", - "redirectUri": "Omdirigerings-URI", - "scopes": "Omfattning (Scopes)", - "status": "Status", - "enabled": "Aktiverad", - "disabled": "Inaktiverad", - "edit": "Redigera", - "delete": "Ta bort", - "enable": "Aktivera", - "disable": "Inaktivera", - "noConfigurations": "Inga OAuth2-konfigurationer", - "noConfigurationsDesc": "Du har inte lagt till några OAuth2-konfigurationer ännu. Lägg till en för att börja använda OAuth2-funktioner.", - "description": "Hanterar automatiskt hämtning, lagring och uppdatering av åtkomsttokens, vilket säkerställer en sömlös och alltid redo autentiseringsupplevelse.", - "addNew": "Lägg till ny", - "updateHere": "Uppdatera här.", - "createNewHere": "Skapa ny här.", - "clickSaveWhenDone": "Klicka på spara när du är klar.", - "quickPresets": "Snabbval:", - "gmail": "Gmail", - "outlook": "Outlook", - "whenDisabled": "Vid inaktivering: - Nya auktoriseringsflöden avvisas omedelbart - Befintliga åtkomsttokens och uppdateringstokens återkallas inom 1 minut - Användare måste auktorisera på nytt vid återaktivering", - "clientIdLabel": "Klient-ID:", - "enterYourClientId": "Ange ditt klient-ID", - "theUniqueIdentifierForYourApplication": "Den unika identifieraren för din applikation, tillhandahållen av OAuth-leverantören.", - "clientSecretLabel": "Klienthemlighet:", - "leaveEmptyToKeepExistingSecret": "Lämna tomt för att behålla nuvarande hemlighet", - "enterYourClientSecret": "Ange din klienthemlighet", - "leaveEmptyToKeepTheExistingSecret": "Lämna tomt för att behålla den befintliga hemligheten. Ange endast ett nytt värde om du vill ändra den.", - "aSecretKeyProvidedByTheOAuthProvider": "En hemlig nyckel tillhandahållen av OAuth-leverantören för att autentisera din applikation.", - "authUrlLabel": "Auth-URL:", - "enterTheAuthorizationUrl": "Ange auktoriserings-URL", - "theUrlWhereUsersWillBeRedirected": "URL:en dit användare omdirigeras för att auktorisera din applikation.", - "tokenUrlLabel": "Token-URL:", - "enterTheTokenUrl": "Ange token-URL", - "theUrlUsedToExchange": "URL:en som används för att växla auktoriseringskoden mot en åtkomsttoken.", - "redirectUrlLabel": "Omdirigerings-URL:", - "enterYourRedirectUrl": "Ange din omdirigerings-URL", - "theRedirectUrlAfterAuthorization": "Omdirigerings-URL:en efter auktorisering. Den måste matcha den som registrerats hos OAuth-leverantören. Använd formatet http://[värd]:[port]/oauth2/callback (eller https://), där [värd] och [port] matchar din RustMailer-installation. Sökvägen /oauth2/callback är fast.", - "scope": "Omfattning:", - "enterTheScopeHere": "Ange omfattning här.", - "addScope": "Lägg till omfattning", - "key": "Nyckel:", - "enterTheKeyHere": "Ange nyckeln här.", - "value": "Värde:", - "enterTheValueHere": "Ange värdet här.", - "addExtraParams": "Lägg till extra parametrar", - "useProxyOptional": "Använd Proxy (valfritt):", - "selectAProxy": "Välj en proxy", - "noProxyAvailable": "Ingen proxy tillgänglig", - "useSocks5ProxyForOAuthRequests": "Använd SOCKS5-proxy för OAuth-förfrågningar när direkt åtkomst är blockerad.", - "descriptionLabel": "Beskrivning:", - "describeThePurposeOfTheOauth2Application": "Beskriv syftet med OAuth2-applikationen", - "optional": "Valfritt", - "saving": "Sparar...", - "creating": "Skapar...", - "saveChanges": "Spara ändringar", - "save": "Spara", - "updated": "Uppdaterad", - "created": "Skapad", - "yourOAuth2ApplicationHasBeenSuccessfully": "Din OAuth2-applikation har {{action}}.", - "updateFailed": "Uppdatering misslyckades", - "creationFailed": "Skapande misslyckades", - "updateOrCreationFailed": "{{action}} misslyckades, försök igen senare", - "clientSecretIsRequired": "Klienthemlighet krävs", - "clientSecretCannotBeEmpty": "Klienthemlighet kan inte vara tom", - "keyIsRequired": "Nyckel krävs", - "keyCannotBeEmpty": "Nyckel kan inte vara tom", - "valueIsRequired": "Värde krävs", - "valueCannotBeEmpty": "Värde kan inte vara tom", - "descriptionMustNotExceed255Characters": "Beskrivning får inte överskrida 255 tecken.", - "clientIdIsRequired": "Klient-ID krävs", - "clientIdCannotBeEmpty": "Klient-ID kan inte vara tomt", - "authorizationUrlIsRequired": "Auktoriserings-URL krävs", - "authorizationUrlCannotBeEmpty": "Auktoriserings-URL kan inte vara tom", - "invalidAuthorizationUrlFormat": "Ogiltigt format på auktoriserings-URL", - "tokenUrlIsRequired": "Token-URL krävs", - "tokenUrlCannotBeEmpty": "Token-URL kan inte vara tom", - "invalidTokenUrlFormat": "Ogiltigt format på token-URL", - "redirectUriIsRequired": "Omdirigerings-URI krävs", - "redirectUriCannotBeEmpty": "Omdirigerings-URI kan inte vara tom", - "invalidRedirectUriFormat": "Ogiltigt format på omdirigerings-URI", - "authorizeEmailAccount": "Auktorisera e-postkonto", - "authorizeAnEmailAccountToStartTheOAuth2AuthorizationProcess": "Auktorisera ett e-postkonto för att starta OAuth2-auktoriseringsprocessen.", - "loadingAccounts": "Laddar konton...", - "selectAnAccount": "Välj ett konto", - "noEmailAccountsRegistered": "Inga e-postkonton registrerade. Vänligen skapa ett.", - "pleaseCreateOne": "Vänligen skapa ett.", - "createAccount": "Skapa konto", - "authorize": "Auktorisera", - "getAuthorizeUrlFailed": "Hämtning av auktoriserings-URL misslyckades", - "getAuthorizeUrlFailedDesc": "kunde inte hämta auktoriserings-url, försök igen senare", - "oauth2ClientUpdated": "OAuth2-klient uppdaterad", - "oauth2ClientHasBeenSuccessfully": "OAuth2-klient har {{action}}.", - "statusUpdateFailed": "Statusuppdatering misslyckades, försök igen senare", - "disableOAuth2Client": "Inaktivera OAuth2-klient", - "enableOAuth2Client": "Aktivera OAuth2-klient", - "areYouSureYouWantTo": "Är du säker på att du vill {{action}} denna OAuth2-klient?", - "thisWillPreventTheOAuth2ClientFromBeingUsed": "Detta kommer att förhindra att OAuth2-klienten används.", - "deleteToken": "Ta bort token", - "areYouSureYouWantToDelete": "Är du säker på att du vill ta bort", - "thisActionWillPermanentlyRemoveTheOauth2Record": "Denna åtgärd kommer permanent att ta bort OAuth2-posten från systemet. Detta kan inte ångras.", - "enterIdToConfirmDeletion": "Ange id för att bekräfta borttagning.", - "warning": "Varning!", - "pleaseBeCareful": "Var försiktig, denna åtgärd kan inte ångras.", - "deleteSuccess": "Borttagning lyckades", - "yourOAuth2ApplicationHasBeenSuccessfullyDeleted": "Din OAuth2-applikation har tagits bort.", - "oauth2DeleteFailed": "Borttagning av OAuth2 misslyckades", - "deleteFailed": "Borttagning misslyckades, försök igen senare", - "actions": { - "openMenu": "Öppna meny", - "edit": "Redigera", - "authorize": "Auktorisera", - "delete": "Ta bort" - }, - "authFailed": "OAuth2-autentisering misslyckades", - "error": "Fel", - "unknownError": "Ett okänt fel inträffade.", - "tryAgain": "Försök igen", - "goHome": "Gå till startsidan", - "authSuccess": "OAuth2-autentisering lyckades", - "success": "Framgång", - "successMessage": "Ditt e-postkonto har autentiserats via OAuth2. Åtkomsttoken har sparats av systemet och kommer att uppdateras automatiskt vid behov.", - "goToAccounts": "Gå till Konton", - "authAtatus": "OAuth2-autentiseringsstatus", - "information": "Information", - "noStatus": "Denna sida visar resultatet av din OAuth2-autentisering. För närvarande finns ingen specifik status tillgänglig. Vänligen försök igen vid behov.", - "backToLogin": "Tillbaka till inloggning" + "form": { + "1day": "1 dag", + "30days": "30 dagar", + "7days": "7 dagar", + "errorInt": "Måste vara ett heltal", + "errorMax": "Max 32 tecken", + "errorNumber": "Måste vara ett nummer", + "errorPositive": "Måste vara större än 0", + "expirationDescription": "Tokens går ut automatiskt efter den valda tiden.", + "expirationLabel": "Giltighetstid", + "expirationPlaceholder": "Välj utgångstid", + "nameDescription": "Valfritt · Max 32 tecken", + "nameLabel": "Namn", + "namePlaceholder": "Ge denna token ett kort namn", + "never": "Aldrig" }, - "accessTokens": { - "title": "Åtkomsttokens", - "name": "Namn", - "accounts": "Konton", - "token": "Token", - "createdAt": "Skapad", - "expiresAt": "Utgår", - "edit": "Redigera", - "delete": "Ta bort", - "create": "Skapa", - "noTokens": "Inga åtkomsttokens", - "noTokensDesc": "Du har inte skapat några åtkomsttokens ännu. Skapa en för att börja använda API-funktioner.", - "description": "Hantera dina åtkomsttokens, deras åtkomstkontroller, IP-vitlistor och hastighetsbegränsningar här.", - "editToken": "Redigera token", - "addNew": "Lägg till ny", - "updateTheAccessTokenHere": "Uppdatera åtkomsttoken här.", - "createNewAccessTokenHere": "Skapa ny åtkomsttoken här.", - "selectAccounts": "Välj konton", - "selectMultipleAccountsForTheAccessToken": "Välj flera konton för åtkomsttokens behörighetsomfattning.", - "enterOneIpAddressPerLine": "Ange en IP-adress per rad, t.ex.:\n192.168.1.1\n192.168.1.2", - "aListOfIpAddressesAllowed": "En lista över IP-adresser som tillåts åtkomst till resursen. Ange en IP-adress per rad. (Valfritt)", - "enterQuota": "Ange kvot, t.ex. 100", - "theMaximumNumberOfRequestsAllowed": "Det maximala antalet förfrågningar som tillåts inom intervallet. (Valfritt)", - "enterIntervalInSeconds": "Ange intervall i sekunder, t.ex. 60", - "theTimeWindowForTheRateLimit": "Tidsfönstret (i sekunder) för hastighetsbegränsningen. (Valfritt)", - "describeThePurposeOfTheAccessToken": "Beskriv syftet med åtkomsttoken", - "updating": "Uppdaterar...", - "saving": "Sparar...", - "creating": "Skapar...", - "saveChanges": "Spara ändringar", - "save": "Spara", - "updated": "Uppdaterad", - "created": "Skapad", - "yourAccessTokenHasBeenSuccessfully": "Din åtkomsttoken har {{action}}.", - "updateFailed": "Uppdatering misslyckades", - "creationFailed": "Skapande misslyckades", - "updateOrCreationFailed": "{{action}} misslyckades, försök igen senare", - "quotaMustBeAPositiveInteger": "Kvot måste vara ett positivt heltal.", - "intervalMustBeAPositiveInteger": "Intervall måste vara ett positivt heltal.", - "invalidIpAddressesFound": "Ogiltiga IP-adresser hittades. Vänligen ange giltiga IPv4- eller IPv6-adresser.", - "atLeastOneAccountIsRequired": "Minst ett konto krävs.", - "descriptionMustNotExceed255Characters": "Beskrivning får inte överskrida 255 tecken.", - "notUsedYet": "Inte använd än", - "theListOfAccountsThatCanBeQueried": "Listan över konton som kan efterfrågas med hjälp av en åtkomsttoken.", - "accountId": "Konto-ID", - "filterByEmailAddressOrAccountId": "Filtrera på e-postadress eller konto-ID...", - "aclRulesForAccessTokens": "ACL-regler för åtkomsttokens inkluderar IP-vitlisteverifiering och upprätthållande av hastighetsbegränsningar.", - "actions": { - "openMenu": "Öppna meny", - "edit": "Redigera", - "delete": "Ta bort" - }, - "quota": "Kvot", - "interval": "Intervall" + "list": { + "createdLabel": "Skapad", + "deleteBtn": "Ta bort token", + "expiresOnLabel": "Går ut den", + "expiresOnShort": "Går ut {{date}}", + "lastUsedLabel": "Senast använd", + "neverExpires": "Går aldrig ut", + "neverLabel": "Aldrig", + "neverUsed": "Aldrig", + "statusActive": "Aktiv", + "statusExpired": "Utgången", + "tokenLabel": "Token", + "unnamedToken": "Namnlös token" }, - "settings": { - "appearance": { - "title": "Utseende", - "field": { - "language": "Gränssnittsspråk", - "theme": "Gränssnittstema" - }, - "description": { - "language": "Välj språk för webbanvändargränssnittet.", - "theme": "Välj mellan ljust eller mörkt läge för gränssnittet." - }, - "placeholder": { - "select_language": "Välj språk" - }, - "command": { - "search": "Sök språk...", - "no_results": "Inget språk hittades." - }, - "theme": { - "light": "Ljust", - "dark": "Mörkt" - }, - "button": { - "update": "Uppdatera inställningar" - }, - "validation": { - "language": { - "required": "Välj ett språk." - }, - "theme": { - "required": "Välj ett tema." - } - } - }, - "title": "Inställningar", - "general": "Allmänt", - "proxy": "Proxy", - "name": "Namn", - "host": "Värd", - "port": "Port", - "username": "Användarnamn", - "password": "Lösenord", - "type": "Typ", - "actions": "Åtgärder", - "edit": "Redigera", - "delete": "Ta bort", - "add": "Lägg till", - "noProxies": "Inga proxys", - "noProxiesDesc": "Du har inte lagt till några proxy-konfigurationer ännu. Lägg till en för att börja använda proxy-funktioner.", - "root": "Root", - "rootTitle": "Root", - "rootDesc": "Hantera autentiseringsuppgifter för root-åtkomst inklusive token och lösenord.", - "rootAccessManagement": "Hantering av root-åtkomst", - "manageRootTokenAndPassword": "Hantera root-token och lösenord säkert.", - "resetRootToken": "Återställ root-token", - "generateNewToken": "Generera ny token, den gamla upphör att gälla omedelbart.", - "reset": "Återställ", - "resetRootPassword": "Återställ root-lösenord", - "changePasswordForFutureLogins": "Byt lösenord för framtida inloggningar.", - "youAreAboutToResetTheRootToken": "Du är på väg att återställa root-token. Denna åtgärd kan inte ångras.", - "confirmReset": "Bekräfta återställning", - "youAreAboutToResetTheRootPassword": "Du är på väg att återställa root-lösenordet. Se till att lagra det säkert.", - "enterNewRootPassword": "Ange nytt root-lösenord", - "theRootTokenHasBeenReset": "Root-token har återställts", - "yourLoginInformationHasBeenUpdated": "Din inloggningsinformation har uppdaterats. Du behöver inte logga in igen.", - "invalidPassword": "Ogiltigt lösenord", - "rootPasswordMustBeAtLeast6Characters": "Root-lösenordet måste vara minst 6 tecken långt.", - "theRootPasswordHasBeenReset": "Root-lösenordet har återställts", - "useNewPasswordForNextLogin": "Använd det nya lösenordet vid nästa inloggning.", - "failedToCopyText": "Misslyckades att kopiera text", - "filterProxy": "Filtrera Proxy...", - "filterOauth2": "Filtrera oauth2...", - "filterAccount": "Filtrera konto...", - "filterAccessToken": "Filtrera åtkomsttoken...", - "selectAll": "Välj alla", - "theme": "Tema", - "id": "Id", - "url": "Url", - "createdAt": "Skapad", - "updatedAt": "Uppdaterad", - "enabled": "Aktiverad", - "useProxy": "Använd Proxy", - "authUrl": "Auth-URL", - "tokenUrl": "Token-URL", - "description": "Beskrivning", - "token": "Token", - "accounts": "Konton", - "acl": "Acl", - "lastAccess": "Senaste åtkomst", - "enterProxyIdToConfirmDeletion": "Ange Proxy-ID för att bekräfta borttagning.", - "updateTheProxyHere": "Uppdatera proxyn här. ", - "addNewProxyHere": "Lägg till ny proxy här. ", - "pleaseUseAnIpAddressForBetterReliability": "Vänligen använd en IP-adress (t.ex. 127.0.0.1) istället för ett värdnamn eller domän för bättre tillförlitlighet.", - "adding": "Lägger till...", - "yourProxyHasBeenSuccessfully": "Din proxy har {{action}}.", - "proxyUpdateOrAddFailed": "{{action}} misslyckades, försök igen senare", - "sidebar": { - "profile": "Profil", - "apiTokens": "API-tokens", - "proxy": "Nätverksproxy", - "configurations": "Systemkonfigurationer" - }, - "profile": { - "loadError": "Det gick inte att läsa in användarinformation.", - "uploadTitle": "Ladda upp avatar", - "maxSize": "Upp till {{size}}", - "avatarAlt": "Avatar", - "removeAvatar": "Ta bort avatar", - "uploadError": "Fel vid filuppladdning", - "field": { - "username": "Användarnamn", - "email": "E-post", - "password": "Lösenord" - }, - "placeholder": { - "password_keep": "Lämna tomt för att behålla nuvarande lösenord" - }, - "button": { - "update_profile": "Uppdatera profil", - "permissions": "Behörigheter", - "view_global_permissions": "Visa globala behörigheter" - }, - "section": { - "roles": "Roller", - "accounts": "{{count}} länkade konton" - }, - "account": { - "id": "Konto-ID: {{id}}" - }, - "toast": { - "updated": "Profilen har uppdaterats", - "update_failed": "Misslyckades med att uppdatera profilen" - }, - "validation": { - "username": { - "required": "Användarnamn krävs", - "min": "Användarnamnet måste vara minst 5 tecken", - "max": "Användarnamnet får vara högst 32 tecken" - }, - "email": { - "required": "E-post krävs", - "invalid": "Ange en giltig e-postadress" - }, - "password": { - "min": "Lösenordet måste vara minst 8 tecken", - "max": "Lösenordet får vara högst 256 tecken" - } - } - } + "notifications": { + "close": "Stäng", + "copied": "Kopierad till urklipp", + "createFailed": "Kunde inte skapa", + "createSuccess": "Åtkomsttoken skapad", + "createSuccessDesc": "Åtkomsttoken har skapats framgångsrikt.", + "deleteFailed": "Kunde inte ta bort token", + "deleteSuccess": "Token borttagen", + "genericError": "Åtgärden misslyckades. Försök igen.", + "tryAgain": "Försök igen", + "updateFailed": "Kunde inte uppdatera", + "updateSuccess": "Åtkomsttoken uppdaterad", + "updateSuccessDesc": "Åtkomsttoken har uppdaterats framgångsrikt." }, - "apiDocs": { - "choosePreferredType": "Välj föredragen typ av API-dokumentation", - "swaggerUI": "Swagger UI", - "reDoc": "ReDoc", - "openAPIExplorer": "OpenAPI Explorer", - "scalar": "Scalar", - "downloadSpecYAML": "Ladda ner Spec YAML" + "page": { + "addBtn": "Lägg till token", + "emptyDescription": "Du har inte skapat några API-tokens än. Klicka nedan för att skapa en.", + "emptyTitle": "Inga API-tokens", + "loadError": "Misslyckades med att ladda API-tokens." + } + }, + "attachment": { + "all_fields_desc": "Matchar bilagenamn, ämne och avsändare", + "date": "Datum", + "name": "Filnamn", + "search_input_placeholder": "Sök efter bilagor (använd \" \" för frassökning)", + "sender": "Avsändare", + "sender_with_count": "Avsändare ({{count}})", + "size": "Filstorlek", + "source": "Källa", + "subject": "Ämne" + }, + "auth": { + "areYouSureYouWantToLogOut": "Är du säker på att du vill logga ut?", + "invalidPassword": "Ogiltigt lösenord. Var god försök igen.", + "login": "Logga in", + "loginFailed": "Inloggning misslyckades", + "logout": "Logga ut", + "password": "Lösenord", + "sessionExpired": "Sessionen har löpt ut!", + "sessionExpiredDesc": "Din session har avslutas på grund av inaktivitet. Vänligen logga in igen för att fortsätta.", + "somethingWentWrong": "Något gick fel", + "username": "Användarnamn", + "welcome": "Välkommen till Bichon", + "youWillNeedToLogInAgain": "Du måste logga in igen för att komma åt ditt konto." + }, + "command": { + "dark": "Mörkt", + "light": "Ljust", + "noResultsFound": "Inga resultat hittades.", + "theme": "Tema", + "typeCommandOrSearch": "Skriv ett kommando eller sök..." + }, + "common": { + "actions": "Åtgärder", + "add": "Lägg till", + "all": "Alla", + "apply": "Använd", + "back": "Tillbaka", + "backToHome": "Tillbaka till start", + "cancel": "Avbryt", + "clear": "Rensa", + "close": "Stäng", + "confirm": "Bekräfta", + "create": "Skapa", + "delete": "Ta bort", + "deleting": "Tar bort...", + "deselectAll": "Avmarkera alla", + "edit": "Redigera", + "empty": "Tom", + "error": "Fel", + "failed": "Misslyckades", + "filter": "Filtrera", + "goBack": "Gå tillbaka", + "loading": "Laddar...", + "more": "Mer", + "na": "Saknas", + "no": "Nej", + "noData": "Ingen data", + "none": "Ingen", + "notFound": "Hittades inte", + "ok": "OK", + "op_failed": "Åtgärden misslyckades", + "project_description": "Bichon är ett open-source-projekt.", + "remove": "Ta bort", + "reset": "Återställ", + "retry": "Försök igen", + "save": "Spara", + "save_changes": "Spara ändringar", + "search": "Sök", + "select": "Välj", + "selectAll": "Välj alla", + "showLess": "Visa mindre", + "showMore": "Visa mer...", + "submit": "Skicka", + "table": { + "noResults": "Inga resultat." }, - "dialogs": { - "confirmDelete": "Bekräfta borttagning", - "confirmDeleteDesc": "Är du säker på att du vill ta bort detta objekt? Denna åtgärd kan inte ångras.", - "deleteSuccess": "Borttagning lyckades", - "deleteFailed": "Misslyckades att ta bort", - "saveSuccess": "Sparades framgångsrikt", - "saveFailed": "Misslyckades att spara", - "createSuccess": "Skapades framgångsrikt", - "createFailed": "Misslyckades att skapa", - "updateSuccess": "Uppdaterades framgångsrikt", - "updateFailed": "Misslyckades att uppdatera", - "continue": "Fortsätt", - "deleting": "Tar bort...", - "accountDeleted": "Konto raderat", - "accountDeletedDesc": "Ditt konto har tagits bort.", - "accountDeleteFailed": "Borttagning av konto misslyckades", - "deleteAccountPermanently": "Ta bort konto permanent", - "youAreDeleting": "Du tar bort {{email}}. Detta kommer permanent att radera:", - "accountCredentials": "Kontouppgifter och inställningar", - "localCachedMetadata": "Lokalt cachad metadata och synkroniseringsstatus", - "imapSyncData": "IMAP-synkroniseringsdata", - "oauthTokens": "OAuth-tokens och API-uppgifter", - "typeEmailToConfirm": "Skriv kontots e-postadress för att bekräfta:", - "typeToConfirm": "Skriv \"{{email}}\" för att bekräfta", - "cannotBeUndone": "Denna åtgärd kan inte ångras!", - "allResourcesErased": "Alla relaterade resurser kommer att raderas permanent.", - "permanentlyDeleteAccount": "Ta bort konto permanent" + "tryAgain": "Försök igen", + "update": "Uppdatera", + "view_on_github_button": "Visa på GitHub", + "yes": "Ja" + }, + "dashboard": { + "account": "Konto", + "actualDiskUsage": "Faktisk diskanvändning", + "attachmentRatio": "Bilagefrekvens", + "attachmentRatioDesc": "{{percent}}% av e-postmeddelandena har bilagor", + "attachments": "Bilagor", + "byMessageCount": "Efter antal meddelanden", + "byMessageSize": "Efter storlek", + "connected": "Ansluten", + "count": "Antal", + "dataStorage": "Datalagring", + "dayTrend": "30-dagarstrend", + "efficiency": "Lagringseffektivitet", + "emails": "E-post", + "indexSize": "Indexstorlek", + "localDataFiles": "Lokala datafiler", + "logicalVolume": "Ursprunglig storlek", + "mailAccounts": "E-postkonton", + "messageDistribution": "Meddelandefördelning", + "metadataSize": "Metadatastorlek", + "newEmails": "Nya e-postmeddelanden", + "noAccountData": "Inga kontodata", + "noAttachments": "Utan bilagor", + "noEmailsSynced": "Inga e-postmeddelanden synkroniserade ännu", + "noLargeEmails": "Inga stora e-postmeddelanden", + "noRecentActivity": "Ingen nylig aktivitet", + "noSendersData": "Inga avsändardata", + "noSubject": "(Inget ämne)", + "saved": "Sparat", + "sender": "Avsändare", + "size": "Storlek", + "subject": "Ämne", + "syncedLocally": "Synkroniserat lokalt", + "systemVersion": "Systemversion", + "tantivyDatabase": "Baserat på sökmotorn Tantivy", + "title": "Översikt", + "top10Accounts": "Topp 10 konton", + "top10LargestEmails": "Topp 10 största e-postmeddelanden", + "top10Senders": "Topp 10 avsändare", + "topLists": "Topplistor", + "totalEmailSize": "Total e-poststorlek", + "totalEmails": "Totalt antal e-postmeddelanden", + "withAttachments": "Med bilagor" + }, + "dialogs": { + "accountCredentials": "Kontouppgifter och inställningar", + "accountDeleteFailed": "Borttagning av konto misslyckades", + "accountDeleted": "Konto raderat", + "accountDeletedDesc": "Ditt konto har tagits bort.", + "allResourcesErased": "Alla relaterade resurser kommer att raderas permanent.", + "cannotBeUndone": "Denna åtgärd kan inte ångras!", + "confirmDelete": "Bekräfta borttagning", + "confirmDeleteDesc": "Är du säker på att du vill ta bort detta objekt? Denna åtgärd kan inte ångras.", + "continue": "Fortsätt", + "createFailed": "Misslyckades att skapa", + "createSuccess": "Skapades framgångsrikt", + "deleteAccountPermanently": "Ta bort konto permanent", + "deleteFailed": "Misslyckades att ta bort", + "deleteSuccess": "Borttagning lyckades", + "deleting": "Tar bort...", + "imapSyncData": "IMAP-synkroniseringsdata", + "localCachedMetadata": "Lokalt cachad metadata och synkroniseringsstatus", + "oauthTokens": "OAuth-tokens och API-uppgifter", + "permanentlyDeleteAccount": "Ta bort konto permanent", + "saveFailed": "Misslyckades att spara", + "saveSuccess": "Sparades framgångsrikt", + "typeEmailToConfirm": "Skriv kontots e-postadress för att bekräfta:", + "typeToConfirm": "Skriv \"{{email}}\" för att bekräfta", + "updateFailed": "Misslyckades att uppdatera", + "updateSuccess": "Uppdaterades framgångsrikt", + "youAreDeleting": "Du tar bort {{email}}. Detta kommer permanent att radera:" + }, + "errors": { + "contentNotModified": "Innehållet har inte ändrats!", + "forbidden": "Förbjudet", + "forbiddenDesc": "Du har inte behörighet att visa denna resurs.", + "forbiddenTitle": "Åtkomst nekad", + "internalServerError": "Internt serverfel!", + "learnMore": "Läs mer", + "maintenance": "Underhåll", + "maintenanceDesc": "Sidan är inte tillgänglig för tillfället. Vi är snart tillbaka online.", + "maintenanceTitle": "Webbplatsen ligger nere för underhåll!", + "networkError": "Nätverksfel", + "networkErrorDesc": "Kan inte ansluta till servern. Kontrollera din internetanslutning och försök igen.", + "pageNotFound": "Hoppsan! Sidan hittades inte!", + "pageNotFoundDesc": "Sidan du letar efter verkar inte finnas eller kan ha tagits bort.", + "somethingWentWrong": "Hoppsan! Något gick fel :')", + "somethingWentWrongDesc": "Vi ber om ursäkt för besväret. Vänligen försök igen senare.", + "unauthorized": "Obehörig", + "unauthorizedDesc": "Vänligen logga in med lämpliga uppgifter för att komma åt denna resurs.", + "unauthorizedTitle": "Obehörig åtkomst" + }, + "mail": { + "account": "Konto", + "attachments": "Bilagor", + "bcc": "Hemlig kopia", + "cc": "Kopia", + "date": "Datum", + "delete": "Ta bort", + "download": "Ladda ner", + "downloadComplete": "Nedladdning slutförd", + "downloadFailed": "Nedladdning misslyckades", + "downloadStarted": "Nedladdning påbörjad", + "downloaded": "{{id}} nedladdad", + "emailViewer": "E-postvisare", + "failedToDownloadFile": "Kunde inte ladda ner fil", + "failedToLoadEmail": "Kunde inte ladda e-postmeddelande.", + "from": "Från", + "id": "ID", + "isBeingDownloaded": "{{id}} laddas ner", + "noAttachments": "Inga bilagor", + "noMessageSelected": "Inget meddelande valt", + "noTagsYet": "Inga etiketter än", + "onlyNonInlineAttachments": "Endast icke-inbäddade bilagor visas här.", + "showLess": "visa mindre", + "showMore": "visa mer...", + "subject": "Ämne", + "tags": "Etiketter", + "to": "Till", + "viewThread": "Visa tråd" + }, + "mailbox": { + "bulkActions": { + "ariaLabel": "Massåtgärder för {{count}} valda {{emailLabel}}", + "clearSelection": "Rensa urval", + "clearSelectionWithKey": "Rensa urval ({{key}})", + "delete": "Ta bort", + "deleteTooltip": "Ta bort valda e-postmeddelanden", + "email": "e-post", + "emails": "e-postmeddelanden", + "selected": "valda" }, - "command": { - "typeCommandOrSearch": "Skriv ett kommando eller sök...", - "noResultsFound": "Inga resultat hittades.", - "theme": "Tema", - "light": "Ljust", - "dark": "Mörkt" + "deleteDialog": { + "confirm": "Ta bort", + "desc": "Är du säker på att du vill ta bort {{countText}}? Denna åtgärd tar bort valda e-postmeddelanden från den lokala databasen. E-postmeddelandena raderas permanent och kan inte återställas.", + "descCountMultiple": "dessa {{count}} e-postmeddelanden", + "descCountSingle": "detta e-postmeddelande", + "errorTitle": "Kunde inte ta bort meddelanden", + "successDesc": "Meddelandena har tagits bort.", + "successTitle": "Meddelanden raderades", + "title": "Ta bort e-post", + "warningDesc": "Vänligen var försiktig innan du fortsätter.", + "warningTitle": "Varning!" + }, + "deleteMailboxDialog": { + "confirm": "Ta bort permanent", + "desc": "Är du säker på att du vill ta bort den här mappen? Denna åtgärd kan inte ångras.", + "errorTitle": "Kunde inte ta bort", + "successDesc": "Brevlådemappen och dess innehåll har raderats.", + "successTitle": "Borttagen", + "title": "Ta bort brevlådemapp", + "warningDesc": "Om du tar bort den här mappen raderas även alla arkiverade e-postmeddelanden och undermappar i den permanent.", + "warningTitle": "Varning" + }, + "folders": "Mappar", + "messages": "Meddelanden", + "noMessages": "Inga meddelanden", + "selectFolder": "Välj en mapp för att visa meddelanden", + "thread": { + "empty": "Inga meddelanden i denna tråd.", + "invalidDate": "Ogiltigt datum", + "loadError": "Kunde inte ladda tråd", + "loadMore": "Ladda fler", + "loadingMore": "Laddar fler...", + "message": "meddelande", + "messages": "meddelanden", + "noSubject": "(Inget ämne)", + "title": "Tråd ({{count}} {{messageLabel}})" + }, + "title": "Brevlåda" + }, + "navigation": { + "accessTokens": "Åtkomsttokens", + "accounts": "Konton", + "apiDocs": "API-dokumentation", + "attachment": "Bilagor", + "auth": "Autentisering", + "dashboard": "Översikt", + "general": "Allmänt", + "home": "Hem", + "mailbox": "Brevlåda", + "oauth2": "OAuth2", + "other": "Övrigt", + "settings": "Inställningar", + "users": "Systemanvändare" + }, + "oauth2": { + "aSecretKeyProvidedByTheOAuthProvider": "En hemlig nyckel tillhandahållen av OAuth-leverantören för att autentisera din applikation.", + "actions": { + "authorize": "Auktorisera", + "delete": "Ta bort", + "edit": "Redigera", + "openMenu": "Öppna meny" + }, + "addConfiguration": "Lägg till konfiguration", + "addExtraParams": "Lägg till extra parametrar", + "addNew": "Lägg till ny", + "addScope": "Lägg till omfattning", + "areYouSureYouWantTo": "Är du säker på att du vill {{action}} denna OAuth2-klient?", + "areYouSureYouWantToDelete": "Är du säker på att du vill ta bort", + "authAtatus": "OAuth2-autentiseringsstatus", + "authFailed": "OAuth2-autentisering misslyckades", + "authSuccess": "OAuth2-autentisering lyckades", + "authUrlLabel": "Auth-URL:", + "authorizationUrlCannotBeEmpty": "Auktoriserings-URL kan inte vara tom", + "authorizationUrlIsRequired": "Auktoriserings-URL krävs", + "authorize": "Auktorisera", + "authorizeAnEmailAccountToStartTheOAuth2AuthorizationProcess": "Auktorisera ett e-postkonto för att starta OAuth2-auktoriseringsprocessen.", + "authorizeEmailAccount": "Auktorisera e-postkonto", + "backToLogin": "Tillbaka till inloggning", + "clickSaveWhenDone": "Klicka på spara när du är klar.", + "clientId": "Klient-ID", + "clientIdCannotBeEmpty": "Klient-ID kan inte vara tomt", + "clientIdIsRequired": "Klient-ID krävs", + "clientIdLabel": "Klient-ID:", + "clientSecret": "Klienthemlighet", + "clientSecretCannotBeEmpty": "Klienthemlighet kan inte vara tom", + "clientSecretIsRequired": "Klienthemlighet krävs", + "clientSecretLabel": "Klienthemlighet:", + "createAccount": "Skapa konto", + "createNewHere": "Skapa ny här.", + "created": "Skapad", + "creating": "Skapar...", + "creationFailed": "Skapande misslyckades", + "delete": "Ta bort", + "deleteFailed": "Borttagning misslyckades, försök igen senare", + "deleteSuccess": "Borttagning lyckades", + "deleteToken": "Ta bort token", + "describeThePurposeOfTheOauth2Application": "Beskriv syftet med OAuth2-applikationen", + "description": "Hanterar automatiskt hämtning, lagring och uppdatering av åtkomsttokens, vilket säkerställer en sömlös och alltid redo autentiseringsupplevelse.", + "descriptionLabel": "Beskrivning:", + "descriptionMustNotExceed255Characters": "Beskrivning får inte överskrida 255 tecken.", + "disable": "Inaktivera", + "disableOAuth2Client": "Inaktivera OAuth2-klient", + "disabled": "Inaktiverad", + "edit": "Redigera", + "enable": "Aktivera", + "enableOAuth2Client": "Aktivera OAuth2-klient", + "enabled": "Aktiverad", + "enterIdToConfirmDeletion": "Ange id för att bekräfta borttagning.", + "enterTheAuthorizationUrl": "Ange auktoriserings-URL", + "enterTheKeyHere": "Ange nyckeln här.", + "enterTheScopeHere": "Ange omfattning här.", + "enterTheTokenUrl": "Ange token-URL", + "enterTheValueHere": "Ange värdet här.", + "enterYourClientId": "Ange ditt klient-ID", + "enterYourClientSecret": "Ange din klienthemlighet", + "enterYourRedirectUrl": "Ange din omdirigerings-URL", + "error": "Fel", + "getAuthorizeUrlFailed": "Hämtning av auktoriserings-URL misslyckades", + "getAuthorizeUrlFailedDesc": "kunde inte hämta auktoriserings-url, försök igen senare", + "gmail": "Gmail", + "goHome": "Gå till startsidan", + "goToAccounts": "Gå till Konton", + "id": "ID", + "information": "Information", + "invalidAuthorizationUrlFormat": "Ogiltigt format på auktoriserings-URL", + "invalidRedirectUriFormat": "Ogiltigt format på omdirigerings-URI", + "invalidTokenUrlFormat": "Ogiltigt format på token-URL", + "key": "Nyckel:", + "keyCannotBeEmpty": "Nyckel kan inte vara tom", + "keyIsRequired": "Nyckel krävs", + "leaveEmptyToKeepExistingSecret": "Lämna tomt för att behålla nuvarande hemlighet", + "leaveEmptyToKeepTheExistingSecret": "Lämna tomt för att behålla den befintliga hemligheten. Ange endast ett nytt värde om du vill ändra den.", + "loadingAccounts": "Laddar konton...", + "noConfigurations": "Inga OAuth2-konfigurationer", + "noConfigurationsDesc": "Du har inte lagt till några OAuth2-konfigurationer ännu. Lägg till en för att börja använda OAuth2-funktioner.", + "noEmailAccountsRegistered": "Inga e-postkonton registrerade. Vänligen skapa ett.", + "noProxyAvailable": "Ingen proxy tillgänglig", + "noStatus": "Denna sida visar resultatet av din OAuth2-autentisering. För närvarande finns ingen specifik status tillgänglig. Vänligen försök igen vid behov.", + "oauth2ClientHasBeenSuccessfully": "OAuth2-klient har {{action}}.", + "oauth2ClientUpdated": "OAuth2-klient uppdaterad", + "oauth2DeleteFailed": "Borttagning av OAuth2 misslyckades", + "optional": "Valfritt", + "outlook": "Outlook", + "pleaseBeCareful": "Var försiktig, denna åtgärd kan inte ångras.", + "pleaseCreateOne": "Vänligen skapa ett.", + "provider": "Leverantör", + "quickPresets": "Snabbval:", + "redirectUri": "Omdirigerings-URI", + "redirectUriCannotBeEmpty": "Omdirigerings-URI kan inte vara tom", + "redirectUriIsRequired": "Omdirigerings-URI krävs", + "redirectUrlLabel": "Omdirigerings-URL:", + "save": "Spara", + "saveChanges": "Spara ändringar", + "saving": "Sparar...", + "scope": "Omfattning:", + "scopes": "Omfattning (Scopes)", + "selectAProxy": "Välj en proxy", + "selectAnAccount": "Välj ett konto", + "status": "Status", + "statusUpdateFailed": "Statusuppdatering misslyckades, försök igen senare", + "success": "Framgång", + "successMessage": "Ditt e-postkonto har autentiserats via OAuth2. Åtkomsttoken har sparats av systemet och kommer att uppdateras automatiskt vid behov.", + "theRedirectUrlAfterAuthorization": "Omdirigerings-URL:en efter auktorisering. Den måste matcha den som registrerats hos OAuth-leverantören. Använd formatet http://[värd]:[port]/oauth2/callback (eller https://), där [värd] och [port] matchar din RustMailer-installation. Sökvägen /oauth2/callback är fast.", + "theUniqueIdentifierForYourApplication": "Den unika identifieraren för din applikation, tillhandahållen av OAuth-leverantören.", + "theUrlUsedToExchange": "URL:en som används för att växla auktoriseringskoden mot en åtkomsttoken.", + "theUrlWhereUsersWillBeRedirected": "URL:en dit användare omdirigeras för att auktorisera din applikation.", + "thisActionWillPermanentlyRemoveTheOauth2Record": "Denna åtgärd kommer permanent att ta bort OAuth2-posten från systemet. Detta kan inte ångras.", + "thisWillPreventTheOAuth2ClientFromBeingUsed": "Detta kommer att förhindra att OAuth2-klienten används.", + "title": "OAuth2", + "tokenUrlCannotBeEmpty": "Token-URL kan inte vara tom", + "tokenUrlIsRequired": "Token-URL krävs", + "tokenUrlLabel": "Token-URL:", + "tryAgain": "Försök igen", + "unknownError": "Ett okänt fel inträffade.", + "updateFailed": "Uppdatering misslyckades", + "updateHere": "Uppdatera här.", + "updateOrCreationFailed": "{{action}} misslyckades, försök igen senare", + "updated": "Uppdaterad", + "useProxyOptional": "Använd Proxy (valfritt):", + "useSocks5ProxyForOAuthRequests": "Använd SOCKS5-proxy för OAuth-förfrågningar när direkt åtkomst är blockerad.", + "value": "Värde:", + "valueCannotBeEmpty": "Värde kan inte vara tom", + "valueIsRequired": "Värde krävs", + "warning": "Varning!", + "whenDisabled": "Vid inaktivering: - Nya auktoriseringsflöden avvisas omedelbart - Befintliga åtkomsttokens och uppdateringstokens återkallas inom 1 minut - Användare måste auktorisera på nytt vid återaktivering", + "yourOAuth2ApplicationHasBeenSuccessfully": "Din OAuth2-applikation har {{action}}.", + "yourOAuth2ApplicationHasBeenSuccessfullyDeleted": "Din OAuth2-applikation har tagits bort." + }, + "permission": { + "account": { + "create": "Skapa e-postkonton", + "manage": "Hantera tilldelade konton", + "manage_all": "Hantera alla kontoinställningar", + "read_details": "Visa kontodetaljer" + }, + "category": { + "account": "Kontobehörigheter", + "global_data": "Globala data (Administratör)", + "system_identity": "System och identitet" + }, + "data": { + "delete": "Ta bort tilldelade e-postmeddelanden", + "delete_all": "Ta bort e-postmeddelanden från alla konton", + "export_batch": "Batch-exportera tilldelad data", + "export_batch_all": "Batch-exportera all data", + "import_batch": "Batch-importera e-postdata", + "manage": "Hantera tilldelad e-postmetadata", + "manage_all": "Hantera all e-postmetadata", + "raw_download": "Ladda ner tilldelade råa e-postmeddelanden", + "raw_download_all": "Ladda ner alla råa e-postmeddelanden", + "read": "Läsa tilldelad e-postdata", + "read_all": "Läsa all e-postdata", + "smtp_ingest": "Hämta e-post via SMTP-protokoll" + }, + "dialog": { + "account_description": "Behörigheter som är begränsade till det valda kontot.", + "account_title": "Kontobehörigheter", + "global_description": "Systemomfattande behörigheter som tilldelats denna användare.", + "global_title": "Globala behörigheter" + }, + "scope": { + "account": "Konto #{{id}}", + "global": "Global" + }, + "system": { + "access": "Grundläggande systemåtkomst", + "root": "Fullständig systemkontroll" + }, + "token": { + "manage": "Hantera åtkomsttoken" + }, + "user": { + "manage": "Hantera alla användare", + "view": "Visa grundläggande användarnamn" + } + }, + "profile": { + "avatar_alt": "Avatar", + "menu": { + "profile": "Profil", + "settings": "Inställningar", + "sign_out": "Logga ut" + } + }, + "proxyDelete": { + "close": "Stäng", + "confirmText": "Är du säker på att du vill ta bort", + "deleteBtn": "Ta bort", + "failedDesc": "Borttagning misslyckades, försök igen senare", + "failedTitle": "Borttagning av Proxy misslyckades", + "permanent": "Denna åtgärd kommer permanent att ta bort Proxyn från systemet. Detta kan inte ångras.", + "proxyIdLabel": "Proxy-ID:", + "proxyIdPlaceholder": "Ange Proxy-ID för att bekräfta borttagning.", + "successDesc": "Proxy har tagits bort.", + "successTitle": "Borttagning lyckades", + "title": "Ta bort Proxy", + "tryAgain": "Försök igen", + "warningDesc": "Vänligen var försiktig, denna åtgärd kan inte ångras.", + "warningTitle": "Varning!" + }, + "restore_message": { + "accountsInvolved": "Inblandade konton", + "bulkTitle": "Återställ flera meddelanden", + "bulkWarning": "Obs: Meddelanden kommer att återställas till sina ursprungliga mappar.", + "confirm": "Utför återställning", + "desc": "Denna åtgärd kommer att ladda upp de valda meddelandena igen från Bichon och återställa dem till deras motsvarande inkorgar på IMAP-servern.", + "failed": "Återställning misslyckades", + "failedTitle": "Fel vid återställning", + "messages": "meddelanden", + "restore_to_imap": "Återställ meddelande", + "success": "Återställning lyckades", + "successDesc": "De valda meddelandena har återställts till IMAP-servern.", + "summary": "Återställningsdetaljer", + "title": "Återställ enstaka meddelande" + }, + "roles": { + "actions": { + "add": "Lägg till roll", + "cancel": "Avbryt", + "close": "Stäng", + "failed": "Åtgärden misslyckades", + "retry": "Försök igen", + "submit_create": "Skapa roll", + "submit_update": "Uppdatera roll", + "success_create": "Roll skapad", + "success_update": "Roll uppdaterad" + }, + "categories": { + "account_resource": "Kontoresursåtkomst", + "global_data": "Global dataåtkomst", + "identity": "Identitet och hantering" + }, + "columns": { + "created_at": "Skapad", + "id": "ID", + "name": "Namn", + "permissions": "Behörigheter", + "role_type": "Rolltyp", + "updated_at": "Uppdaterad" + }, + "delete": { + "alert_desc": "Att ta bort denna roll tar bort den från alla tilldelade användare.", + "alert_title": "Varning: Permanent åtgärd.", + "confirm_btn": "Ta bort roll", + "confirm_label": "Skriv roll-ID för att bekräfta:", + "deleting": "Tar bort...", + "dialog_title": "Ta bort roll", + "error_fallback": "Kunde inte ta bort rollen.", + "error_title": "Borttagning misslyckades", + "irreversible": "Denna åtgärd kan inte ångras.", + "placeholder": "Skriv \"{{id}}\"", + "success_desc": "Rollen \"{{name}}\" har tagits bort.", + "success_title": "Roll borttagen", + "warning_text": "Du håller på att permanent ta bort rollen {{name}} (ID: {{id}})." + }, + "description_hint": "Definiera åtkomstomfång och behörigheter.", + "details": { + "close_btn": "Stäng detaljer", + "desc_account": "Åtkomst till enskilda konton.", + "desc_global": "Global hantering och systemåtkomst.", + "role_badge": "{{type}} Roll", + "title": "Rollbehörigheter: {{name}}", + "unknown": "Okänd roll", + "view_permissions": "Visa behörigheter" + }, + "empty": { + "desc": "Du har inte skapat några anpassade roller än.", + "title": "Inga roller hittades" + }, + "form": { + "builtin_badge": "Inbyggd roll", + "builtin_desc": "Denna roll är fördefinierad och skrivskyddad.", + "desc_label": "Beskrivning", + "matrix_label": "{{type}} Behörighetsmatris", + "name_label": "Rollnamn", + "type_label": "Rolltyp" + }, + "placeholder": { + "filter": "Sök roller..." + }, + "title": { + "create": "Skapa ny roll", + "edit": "Redigera roll: {{name}}" + }, + "types": { + "Account": "Konto", + "Global": "Global" }, "validation": { - "required": "Detta fält är obligatoriskt", - "invalidEmail": "Ogiltig e-postadress", - "invalidUrl": "Ogiltig URL", - "passwordMinLength": "Lösenordet måste vara minst {{min}} tecken långt", - "pleaseEnterPassword": "Vänligen ange ditt lösenord", - "passwordRequired": "Lösenord krävs när autentiseringsmetoden är Lösenord", - "emailRequired": "E-post krävs", - "imapHostRequired": "IMAP-värd krävs", - "imapHostCannotBeEmpty": "IMAP-värd kan inte vara tom", - "imapPortMustBePositive": "IMAP-port måste vara ett positivt heltal", - "imapPortMustBeLessThan65536": "IMAP-port måste vara mindre än 65536", - "folderLimitMustBeNumber": "Mappgräns måste vara ett tal", - "folderLimitMustBeAtLeast100": "Mappgräns måste vara minst 100", - "incrementalSyncMustBeNumber": "Intervall för inkrementell synkronisering måste vara ett tal", - "incrementalSyncMustBeAtLeast10": "Intervall för inkrementell synkronisering måste vara minst 10 minuter", - "pleaseEnterUsernameOrEmail": "Vänligen ange ditt användarnamn eller din e-postadress", - "singleRequestBatchSizeMustBeNumber": "Batchstorlek måste vara ett tal", - "singleRequestBatchSizeTooSmall": "Batchstorlek måste vara minst 10", - "singleRequestBatchSizeTooLarge": "Batchstorlek måste vara högst 200" - }, - "table": { - "noResults": "Inga resultat hittades", - "loading": "Laddar...", - "page": "Sida", - "of": "av", - "rowsPerPage": "Rader per sida", - "showing": "Visar", - "to": "till", - "results": "resultat", - "asc": "Stigande", - "desc": "Fallande", - "hide": "Dölj", - "edit": "Redigera", - "delete": "Ta bort", - "pagination": { - "selected": "{{selected}} av {{total}} rader valda.", - "fixed_page_size": "{{size}} rader per sida.", - "rows_per_page": "Rader per sida", - "page_info": "Sida {{page}} av {{total}}", - "first": "Första sidan", - "previous": "Föregående sida", - "next": "Nästa sida", - "last": "Sista sidan" - } - }, - "proxyDelete": { - "title": "Ta bort Proxy", - "successTitle": "Borttagning lyckades", - "successDesc": "Proxy har tagits bort.", - "close": "Stäng", - "failedTitle": "Borttagning av Proxy misslyckades", - "failedDesc": "Borttagning misslyckades, försök igen senare", - "tryAgain": "Försök igen", - "confirmText": "Är du säker på att du vill ta bort", - "permanent": "Denna åtgärd kommer permanent att ta bort Proxyn från systemet. Detta kan inte ångras.", - "proxyIdLabel": "Proxy-ID:", - "proxyIdPlaceholder": "Ange Proxy-ID för att bekräfta borttagning.", - "warningTitle": "Varning!", - "warningDesc": "Vänligen var försiktig, denna åtgärd kan inte ångras.", - "deleteBtn": "Ta bort" - }, - "systemConfig": { - "pageTitle": "Systemkonfigurationer", - "pageDescription": "Dessa parametrar initieras via CLI-flaggor eller miljövariabler. De är skrivskyddade.", - "status": { - "enabled": "Aktiverad", - "disabled": "Inaktiverad", - "configured": "Konfigurerad", - "missing": "Saknas", - "auto": "Auto", - "notSet": "Ej inställd" - }, - "sections": { - "network": { - "title": "Nätverk", - "desc": "HTTP och offentlig åtkomst" - }, - "cors": { - "title": "CORS", - "desc": "Åtkomstregler för cross-origin" - }, - "logging": { - "title": "Loggning", - "desc": "Loggutmatning" - }, - "storage": { - "title": "Lagring & Cache", - "desc": "Databasvägar och gränser" - }, - "security": { - "title": "Säkerhet", - "desc": "Autentisering & kryptering" - }, - "performance": { - "title": "Prestanda", - "desc": "Samtidighet & komprimering" - }, - "smtp": { - "title": "SMTP-server", - "desc": "Inställningar för mottagning av inkommande e-post för realtidsarkivering" - } - } - }, - "apiTokens": { - "page": { - "loadError": "Misslyckades med att ladda API-tokens.", - "emptyTitle": "Inga API-tokens", - "emptyDescription": "Du har inte skapat några API-tokens än. Klicka nedan för att skapa en.", - "addBtn": "Lägg till token" - }, - "list": { - "unnamedToken": "Namnlös token", - "statusActive": "Aktiv", - "statusExpired": "Utgången", - "neverExpires": "Går aldrig ut", - "expiresOnShort": "Går ut {{date}}", - "tokenLabel": "Token", - "createdLabel": "Skapad", - "lastUsedLabel": "Senast använd", - "expiresOnLabel": "Går ut den", - "neverUsed": "Aldrig", - "neverLabel": "Aldrig", - "deleteBtn": "Ta bort token" - }, - "dialog": { - "createTitle": "Skapa åtkomsttoken", - "editTitle": "Redigera åtkomsttoken", - "description": "Klicka på spara när du är klar.", - "save": "Spara", - "saveChanges": "Spara ändringar" - }, - "deleteDialog": { - "title": "Ta bort åtkomsttoken?", - "description": "Denna åtgärd kan inte ångras. Applikationer som använder denna token kommer omedelbart att förlora åtkomst.", - "cancel": "Avbryt", - "confirm": "Ta bort", - "deleting": "Tar bort..." - }, - "form": { - "nameLabel": "Namn", - "namePlaceholder": "Ge denna token ett kort namn", - "nameDescription": "Valfritt · Max 32 tecken", - "expirationLabel": "Giltighetstid", - "expirationPlaceholder": "Välj utgångstid", - "expirationDescription": "Tokens går ut automatiskt efter den valda tiden.", - "never": "Aldrig", - "1day": "1 dag", - "7days": "7 dagar", - "30days": "30 dagar", - "errorMax": "Max 32 tecken", - "errorNumber": "Måste vara ett nummer", - "errorInt": "Måste vara ett heltal", - "errorPositive": "Måste vara större än 0" - }, - "notifications": { - "createSuccess": "Åtkomsttoken skapad", - "createSuccessDesc": "Åtkomsttoken har skapats framgångsrikt.", - "updateSuccess": "Åtkomsttoken uppdaterad", - "updateSuccessDesc": "Åtkomsttoken har uppdaterats framgångsrikt.", - "createFailed": "Kunde inte skapa", - "updateFailed": "Kunde inte uppdatera", - "deleteSuccess": "Token borttagen", - "deleteFailed": "Kunde inte ta bort token", - "copied": "Kopierad till urklipp", - "genericError": "Åtgärden misslyckades. Försök igen.", - "close": "Stäng", - "tryAgain": "Försök igen" - } - }, - "permission": { - "scope": { - "global": "Global", - "account": "Konto #{{id}}" - }, - "dialog": { - "global_title": "Globala behörigheter", - "account_title": "Kontobehörigheter", - "global_description": "Systemomfattande behörigheter som tilldelats denna användare.", - "account_description": "Behörigheter som är begränsade till det valda kontot." - }, - "category": { - "system_identity": "System och identitet", - "global_data": "Globala data (Administratör)", - "account": "Kontobehörigheter" - }, - "system": { - "access": "Grundläggande systemåtkomst", - "root": "Fullständig systemkontroll" - }, - "user": { - "manage": "Hantera alla användare", - "view": "Visa grundläggande användarnamn" - }, - "token": { - "manage": "Hantera åtkomsttoken" - }, - "account": { - "create": "Skapa e-postkonton", - "manage": "Hantera tilldelade konton", - "manage_all": "Hantera alla kontoinställningar", - "read_details": "Visa kontodetaljer" - }, - "data": { - "read": "Läsa tilldelad e-postdata", - "read_all": "Läsa all e-postdata", - "manage": "Hantera tilldelad e-postmetadata", - "manage_all": "Hantera all e-postmetadata", - "raw_download": "Ladda ner tilldelade råa e-postmeddelanden", - "raw_download_all": "Ladda ner alla råa e-postmeddelanden", - "delete": "Ta bort tilldelade e-postmeddelanden", - "delete_all": "Ta bort e-postmeddelanden från alla konton", - "export_batch": "Batch-exportera tilldelad data", - "export_batch_all": "Batch-exportera all data", - "import_batch": "Batch-importera e-postdata", - "smtp_ingest": "Hämta e-post via SMTP-protokoll" - } - }, - "users": { - "columns": { - "id": "ID", - "avatar": "Avatar", - "username": "Användarnamn", - "email": "E-postadress", - "roles": "Roller och behörigheter", - "created_at": "Skapad", - "updated_at": "Uppdaterad", - "actions": "Åtgärder" - }, - "buttons": { - "add": "Lägg till användare", - "add_new": "Lägg till ny användare" - }, - "empty": { - "title": "Inga användare hittades", - "description": "Klicka på knappen nedan för att lägga till din första användare." - }, - "nav": { - "users": "Användare", - "roles": "Roller", - "api_tokens": "API-nycklar" - }, - "api_tokens": { - "empty": { - "title": "Inga API-nycklar hittades", - "description": "Inga API-tokens har genererats i systemet än." - }, - "button": { - "generate": "Skapa ny nyckel" - }, - "toolbar": { - "search_placeholder": "Sök efter namn, ägare eller nyckel..." - }, - "table": { - "name": "Namn", - "type": "Typ", - "last_used": "Senast använd", - "expires_at": "Går ut den", - "owner": "Ägare", - "created": "Skapad", - "api_key": "API-nyckel", - "web_ui": "Webbgränssnitt", - "never": "Aldrig", - "permanent": "Permanent", - "expired": "Gått ut", - "unnamed": "Namnlös nyckel" - }, - "unnamed": "Namnlös nyckel", - "delete": { - "title": "Ta bort API-nyckel", - "desc": "Du håller på att permanent ta bort denna API-nyckel", - "prefix": "Prefix för nyckel", - "irreversible": "Denna åtgärd kan inte ångras. Applikationer som använder denna nyckel kommer omedelbart att förlora åtkomst.", - "confirm_label": "Skriv {{word}} nedan för att bekräfta:", - "confirm_placeholder": "Skriv \"{{word}}\" för att bekräfta", - "warning_title": "Varning", - "warning_desc": "Skript eller tjänster som använder denna nyckel kommer att sluta fungera. Se till att du har uppdaterat dina system.", - "confirm_button": "Ta bort nyckel", - "deleting": "Tar bort..." - }, - "toast": { - "deleted_title": "API-nyckel borttagen", - "deleted_desc": "Nyckeln \"{{name}}\" har tagits bort.", - "delete_failed_title": "Borttagning misslyckades", - "delete_failed": "Kunde inte ta bort nyckeln, försök igen." - } - }, - "tokens": { - "schema": { - "name_max": "Max 32 tecken", - "expire_number": "Måste vara ett nummer", - "expire_int": "Måste vara ett heltal", - "expire_positive": "Måste vara större än 0" - }, - "toast": { - "update_success_title": "Åtkomstnyckel uppdaterad", - "update_success_desc": "Åtkomstnyckeln har uppdaterats.", - "create_success_title": "Åtkomstnyckel skapad", - "create_success_desc": "Åtkomstnyckeln har skapats.", - "update_failed_title": "Uppdatering misslyckades", - "create_failed_title": "Skapande misslyckades" - }, - "error": { - "fallback": "Åtgärden misslyckades, försök igen senare." - }, - "dialog": { - "edit_title": "Redigera åtkomstnyckel", - "create_title": "Skapa åtkomstnyckel", - "description": "Klicka på spara när du är klar." - }, - "fields": { - "name_label": "Namn", - "name_placeholder": "Ge nyckeln ett kort namn", - "name_hint": "Valfritt · Max 32 tecken", - "expire_label": "Utgångsdatum", - "expire_placeholder": "Välj utgångsdatum", - "expire_hint": "Nyckeln går ut automatiskt efter den valda tiden." - }, - "expire_options": { - "never": "Går aldrig ut", - "1_day": "1 dag", - "7_days": "7 dagar", - "30_days": "30 dagar" - } - }, - "tokens_action": { - "dialog": { - "title": "API-nycklar", - "description": "Hantera API-nycklar för denna användare." - }, - "empty": { - "title": "Inga API-nycklar", - "description": "Användaren har inga API-nycklar för tillfället." - }, - "buttons": { - "add": "Lägg till nyckel" - }, - "list": { - "unnamed_token": "Namnlös nyckel", - "status_expired": "Gått ut", - "status_active": "Aktiv", - "expires_on_brief": "Går ut {{date}}", - "never_expires": "Går aldrig ut", - "label_token": "Nyckel", - "label_created": "Skapad", - "label_last_used": "Senast använd", - "label_expires_at": "Går ut den", - "never": "Aldrig", - "button_delete": "Ta bort nyckel" - }, - "delete_dialog": { - "title": "Ta bort åtkomstnyckel?", - "description": "Denna åtgärd kan inte ångras." - } - }, - "actions": { - "schema": { - "account_required": "Välj ett konto", - "role_required": "Välj en roll", - "username_required": "Användarnamn krävs", - "username_min": "Användarnamnet måste vara minst 3 tecken", - "username_max": "Användarnamnet får inte överstiga 32 tecken", - "email_required": "E-postadress krävs", - "email_invalid": "Ange en giltig e-postadress", - "global_role_required": "Tilldela minst en global roll till användaren", - "description_max": "Beskrivningen får vara max 256 tecken", - "ip_invalid": "Ogiltig IP-adress upptäckt", - "password_required": "Lösenord krävs", - "password_min": "Lösenordet måste vara minst 8 tecken", - "password_max": "Lösenordet får vara max 256 tecken" - }, - "toast": { - "updated": "Användaren uppdaterad", - "created": "Användaren skapad" - }, - "dialog": { - "edit_title": "Redigera användare: {{name}}", - "create_title": "Skapa ny användare", - "subtitle": "Konfigurera identitet, åtkomstnivåer och säkerhet." - }, - "tabs": { - "general": "Allmänt", - "permissions": "Kontobehörigheter", - "security": "Säkerhet och ACL" - }, - "sections": { - "basic": "Basidentitet", - "global": "Globala behörigheter", - "mail_access": "E-poståtkomst", - "mail_access_subtitle": "Definiera vilka e-postkonton användaren kan hantera.", - "policy": "Policyinställningar" - }, - "fields": { - "username": "Användarnamn", - "username_hint": "Unikt ID för inloggning.", - "email": "E-postadress", - "email_hint": "Primär kontakt och aviseringar.", - "password": "Lösenord", - "password_placeholder_create": "Minst 8 tecken", - "password_placeholder_edit": "Lämna tomt för att behålla nuvarande", - "password_hint_create": "Säkert lösenord för nyskapad användare.", - "password_hint_edit": "Ange endast nytt lösenord om du vill byta.", - "global_roles_hint": "Tilldela systembehörigheter.", - "description": "Beskrivning (valfritt)", - "description_placeholder": "Lägg till anteckningar...", - "description_hint": "Interna anteckningar (max 256 tecken).", - "select_account": "Välj konto", - "assign_role": "Tilldela roll", - "ip_whitelist": "Vitlista IP", - "ip_whitelist_hint": "Begränsa inloggning till dessa IP-adresser (en per rad).", - "rate_quota": "Hastighetsbegränsning", - "burst_interval": "Burst-intervall (sek)" - }, - "buttons": { - "add_account": "Lägg till konto", - "update": "Uppdatera användare", - "create": "Skapa användare" - }, - "states": { - "full_access": "Full åtkomst", - "full_access_desc": "Systemadministratörer har automatiskt åtkomst till alla konton.", - "no_accounts": "Inga specifika konton tilldelade.", - "security_disabled": "Säkerhetspolicyer är inaktiverade." - }, - "api_tokens": "API-nycklar", - "placeholder": { - "filter": "Sök användare..." - }, - "delete": { - "title": "Ta bort användare", - "confirm_msg": "Du håller på att permanent ta bort användaren {{name}} (ID: {{id}}).", - "irreversible": "Denna åtgärd kan inte ångras.", - "input_label": "Skriv användar-ID nedan för att bekräfta:", - "placeholder": "Skriv \"{{id}}\" för att bekräfta", - "alert_title": "Varning: Permanent åtgärd.", - "alert_desc": "Användaren och all tillhörande data kommer att raderas.", - "button_confirm": "Ta bort användare", - "button_deleting": "Tar bort...", - "toast": { - "success_title": "Användare borttagen", - "success_desc": "Användaren \"{{name}}\" har tagits bort.", - "failed_title": "Borttagning misslyckades", - "failed_fallback": "Kunde inte ta bort användaren." - } - } - } - }, - "roles": { - "title": { - "create": "Skapa ny roll", - "edit": "Redigera roll: {{name}}" - }, - "description_hint": "Definiera åtkomstomfång och behörigheter.", - "form": { - "name_label": "Rollnamn", - "type_label": "Rolltyp", - "desc_label": "Beskrivning", - "matrix_label": "{{type}} Behörighetsmatris", - "builtin_badge": "Inbyggd roll", - "builtin_desc": "Denna roll är fördefinierad och skrivskyddad." - }, - "types": { - "Global": "Global", - "Account": "Konto" - }, - "categories": { - "identity": "Identitet och hantering", - "global_data": "Global dataåtkomst", - "account_resource": "Kontoresursåtkomst" - }, - "actions": { - "cancel": "Avbryt", - "submit_create": "Skapa roll", - "submit_update": "Uppdatera roll", - "success_create": "Roll skapad", - "success_update": "Roll uppdaterad", - "failed": "Åtgärden misslyckades", - "close": "Stäng", - "retry": "Försök igen", - "add": "Lägg till roll" - }, - "validation": { - "name_required": "Rollnamn krävs", - "perm_required": "Välj minst en behörighet" - }, - "columns": { - "id": "ID", - "name": "Namn", - "role_type": "Rolltyp", - "permissions": "Behörigheter", - "created_at": "Skapad", - "updated_at": "Uppdaterad" - }, - "placeholder": { - "filter": "Sök roller..." - }, - "delete": { - "dialog_title": "Ta bort roll", - "warning_text": "Du håller på att permanent ta bort rollen {{name}} (ID: {{id}}).", - "irreversible": "Denna åtgärd kan inte ångras.", - "confirm_label": "Skriv roll-ID för att bekräfta:", - "placeholder": "Skriv \"{{id}}\"", - "alert_title": "Varning: Permanent åtgärd.", - "alert_desc": "Att ta bort denna roll tar bort den från alla tilldelade användare.", - "confirm_btn": "Ta bort roll", - "deleting": "Tar bort...", - "success_title": "Roll borttagen", - "success_desc": "Rollen \"{{name}}\" har tagits bort.", - "error_title": "Borttagning misslyckades", - "error_fallback": "Kunde inte ta bort rollen." - }, - "details": { - "title": "Rollbehörigheter: {{name}}", - "unknown": "Okänd roll", - "role_badge": "{{type}} Roll", - "desc_global": "Global hantering och systemåtkomst.", - "desc_account": "Åtkomst till enskilda konton.", - "close_btn": "Stäng detaljer", - "view_permissions": "Visa behörigheter" - }, - "empty": { - "title": "Inga roller hittades", - "desc": "Du har inte skapat några anpassade roller än." - } - }, - "profile": { - "avatar_alt": "Avatar", - "menu": { - "profile": "Profil", - "settings": "Inställningar", - "sign_out": "Logga ut" - } - }, - "sign_out": { - "title": "Logga ut", - "desc": "Är du säker på att du vill logga ut? Du måste logga in igen för att få åtkomst till ditt konto.", - "confirm": "Logga ut" - }, - "restore_message": { - "title": "Återställ enstaka meddelande", - "bulkTitle": "Återställ flera meddelanden", - "bulkWarning": "Obs: Meddelanden kommer att återställas till sina ursprungliga mappar.", - "accountsInvolved": "Inblandade konton", - "summary": "Återställningsdetaljer", - "messages": "meddelanden", - "desc": "Denna åtgärd kommer att ladda upp de valda meddelandena igen från Bichon och återställa dem till deras motsvarande inkorgar på IMAP-servern.", - "confirm": "Utför återställning", - "restore_to_imap": "Återställ meddelande", - "success": "Återställning lyckades", - "successDesc": "De valda meddelandena har återställts till IMAP-servern.", - "failed": "Återställning misslyckades", - "failedTitle": "Fel vid återställning" - }, - "time": { - "label": "Tid", - "since": "Sedan", - "before": "Före", - "recent_range": "Senaste intervall (sedan...)", - "historical": "Historiskt intervall (före...)", - "absolute_range": "Absolut datumintervall", - "last_day": "Senaste 1 dagen", - "last_days": "Senaste {{count}} dagarna", - "last_months": "Senaste {{count}} månaderna", - "over_years_ago": "För {{count}} {{unit}} sedan", - "year": "år", - "years": "år", - "recent_prefix": "Senaste:", - "days_ago_to_now": "dagar sedan till nu", - "apply": "Använd", - "start_date": "Startdatum", - "end_date": "Slutdatum", - "clear_filters": "Rensa tidsfilter", - "format": "yyyy-MM-dd" - }, - "tag": { - "label": "Taggar", - "search_placeholder": "Sök taggar...", - "clear_all": "Rensa alla taggar", - "no_tags_found": "Inga taggar hittades" - }, - "search_accounts": { - "label": "E-postkonton", - "search_placeholder": "Sök e-postkonton...", - "clear_accounts": "Rensa valda konton", - "no_accounts_found": "Inga konton hittades" - }, - "search_mailbox": { - "label": "E-postmappar", - "search_placeholder": "Sök mappar", - "clear_mailboxes": "Rensa valda mappar", - "select_account_first": "Välj först ett e-postkonto", - "no_mailbox_found": "Inga mappar hittades" - }, - "search_contacts": { - "label": "Kontakter", - "label_with_count": "Kontakter ({{count}})", - "any": "Alla", - "search_placeholder": "Sök {{field}}...", - "reset_all": "Återställ alla kontakter", - "no_contact_found": "Inga kontakter hittades", - "loading": "Laddar...", - "showing_limit": "Visar endast de första 100 resultaten • Totalt {{total}}" - }, - "search_more": { - "trigger_label": "Avancerat", - "title": "Avancerade filter", - "reset": "Återställ", - "has_attachment": "Har bilaga", - "attachment_name_label": "Bilagans namn", - "attachment_name_placeholder": "t.ex. invoice.pdf", - "message_size_label": "Meddelandestorlek", - "message_id_label": "Ursprungligt Message-ID", - "message_id_description": "Sök via Message-ID i e-posthuvudet", - "apply": "Använd filter", - "size_presets": { - "any": "Valfri storlek", - "tiny": "Mycket liten (< 15 KB)", - "small": "Liten (< 2 MB)", - "medium": "Mellan (2–10 MB)", - "large": "Stor (10–20 MB)", - "huge": "Mycket stor (> 20 MB)" - }, - "any": "Alla", - "search_placeholder": "Sök {{field}}...", - "extension": "Filändelse", - "category": "Bilagskategori", - "content_types": "Specifik typ" - }, - "search_view": { - "button_label": "Vy", - "menu_title": "Inställningar för kolumner" - }, - "search_reset": { - "label": "Återställ", - "tooltip": "Rensa alla filter" - }, - "search_input": { - "placeholder": "Sök e-post... (Regex stöds)", - "button": "Sök", - "recent_title": "Senaste sökningar", - "clear_history": "Rensa historik", - "no_history": "Ingen sökhistorik", - "all": "Alla", - "all_fields_desc": "Matchar ämne, innehåll, avsändare och mottagare", - "subject": "Ämne", - "body": "Innehåll" + "name_required": "Rollnamn krävs", + "perm_required": "Välj minst en behörighet" } + }, + "search": { + "account": "Konto", + "addEmailAccount": "Lägg till e-postkonto", + "addTags": { + "cancel": "Avbryt", + "createHint": "Skapa ny etikett: {{tag}}", + "invalidTitle": "Ogiltig etikett", + "none": "Inga etiketter tillagda", + "save": "Spara", + "saving": "Sparar...", + "searchPlaceholder": "Sök eller skapa etikett...", + "selectedCount": "{{count}} etiketter valda", + "title": "Redigera etiketter", + "tryAgain": "Vänligen försök igen senare", + "updateFailedTitle": "Uppdatering misslyckades", + "updatedDesc": "Etiketterna har uppdaterats", + "updatedTitle": "Etiketter uppdaterade" + }, + "adjustSearch": "Prova att justera dina sökkriterier eller rensa filter.", + "advanced": "Avancerat", + "advancedFilters": "Avancerade filter", + "any": "Alla", + "attachmentName": "Filnamn på bilaga", + "attachmentsSize": "Bilagor & storlek", + "bcc": "Hemlig kopia (BCC)", + "before": "Före:", + "bulkActions": { + "ariaLabel": "{{count}} meddelanden valda. Verktygsfält", + "clear": "Rensa val", + "delete": "Ta bort", + "deleteDesc": "Ta bort valda meddelanden", + "manageTags": "Hantera taggar", + "selected": "{{count}} valda" + }, + "cc": "Kopia (CC)", + "clear": "Rensa", + "date": "Datum", + "dateRange": "Datumintervall", + "delete": { + "confirmButton": "Ta bort", + "confirmDetail": "Denna åtgärd kan inte ångras.", + "confirmPrefix": "Är du säker på att du vill ta bort", + "countLabel": "{{count}} meddelanden?", + "errorTitle": "Borttagning misslyckades", + "successDesc": "Meddelandena har tagits bort.", + "successTitle": "Borttagna", + "title": "Ta bort meddelanden", + "warningDesc": "Meddelanden raderas permanent.", + "warningTitle": "Varning" + }, + "editTag": "Redigera etikett", + "endDate": "Slutdatum", + "from": "Från", + "fullTextMultiAccount": "Fulltext · Flera konton · Avancerade filter", + "hasAttachment": "Har bilaga", + "huge": "Mycket stor (≥20 MB)", + "keyword": "Sökord", + "large": "Stor (10 - 20 MB)", + "mailbox": "Brevlåda", + "maxSize": "Max. storlek", + "maximumBytes": "Maximum", + "medium": "Medelstor (2 - 10 MB)", + "messageId": "Meddelande-ID", + "minSize": "Min. storlek", + "minimumBytes": "Minimum", + "no": "Nej", + "noActiveEmailAccount": "Inget aktivt e-postkonto.", + "noEmailsFound": "Inga e-postmeddelanden hittades", + "noMailboxSelectAccount": "Ingen brevlåda. Vänligen välj ett konto först.", + "originalMessageIdHeader": "Ursprungligt e-postmeddelandes Message-ID header", + "pleaseSelectAtLeastOne": "Vänligen välj minst ett sökvillkor", + "preview": "Förhandsvisning", + "recipient": "Mottagare", + "searchArchivedEmails": "Sök i arkiverade e-postmeddelanden", + "searchButton": "Sök", + "searchInSubjectBody": "Sök i ämne, innehåll, bilagor...", + "searching": "Söker, vänligen vänta…", + "searchingButton": "Söker...", + "selectAccount": "Välj konto", + "selectDate": "Välj ett datum", + "selectMailbox": "Välj brevlåda", + "sender": "Avsändare", + "senderRecipients": "Avsändare / Mottagare", + "since": "Sedan:", + "size": "Storlek", + "sizeDescription": "Storleken avser e-postens totala storlek, inklusive bilagor.", + "small": "Liten (<2 MB)", + "sort": "Sortera", + "source": "Källa", + "startDate": "Startdatum", + "startSearching": "Börja med att ange ett sökord, avsändare eller använd avancerade filter.", + "subject": "Ämne", + "tagFilter": "Etikettfilter", + "thread": { + "empty": "Inga meddelanden i denna tråd", + "error": "Kunde inte ladda tråd", + "invalidDate": "Ogiltigt datum", + "loadMore": "Ladda mer", + "loadingMore": "Laddar...", + "noSubject": "(Inget ämne)", + "title": "Tråd · {{count}} meddelanden" + }, + "tiny": "Mycket liten (<15 KB)", + "title": "Sök", + "to": "Till", + "updateTags": { + "actionAdd": "Lägg till", + "actionOverwrite": "Skriv över", + "actionRemove": "Ta bort", + "cancel": "Avbryt", + "createHint": "Tryck på Enter för att skapa ny tagg: \"{{tag}}\"", + "invalidTitle": "Ogiltig tagg", + "none": "Inga taggar valda", + "overwriteWarning": "Varning: Detta kommer att skriva över alla befintliga taggar på de valda objekten.", + "savingAdd": "Lägger till...", + "savingOverwrite": "Skriver över...", + "savingRemove": "Tar bort...", + "searchPlaceholder": "Sök eller skapa ny tagg...", + "selectedCount": "{{count}} tagg(ar) kommer att tillämpas", + "submitAdd": "Lägg till taggar", + "submitOverwrite": "Skriv över taggar", + "submitRemove": "Ta bort taggar", + "title": "Uppdatera taggar", + "tryAgain": "Försök igen senare.", + "updateFailedTitle": "Uppdateringen misslyckades", + "updatedDesc": "Taggarna har uppdaterats.", + "updatedTitle": "Taggar uppdaterade" + }, + "yes": "Ja" + }, + "search_accounts": { + "clear_accounts": "Rensa valda konton", + "label": "E-postkonton", + "no_accounts_found": "Inga konton hittades", + "search_placeholder": "Sök e-postkonton..." + }, + "search_contacts": { + "any": "Alla", + "label": "Kontakter", + "label_with_count": "Kontakter ({{count}})", + "loading": "Laddar...", + "no_contact_found": "Inga kontakter hittades", + "reset_all": "Återställ alla kontakter", + "search_placeholder": "Sök {{field}}...", + "showing_limit": "Visar endast de första 100 resultaten • Totalt {{total}}" + }, + "search_input": { + "all": "Alla", + "all_fields_desc": "Matchar ämne, innehåll, avsändare och mottagare", + "body": "Innehåll", + "button": "Sök", + "clear_history": "Rensa historik", + "no_history": "Ingen sökhistorik", + "placeholder": "Sök efter e-post (använd \" \" för frassökning)", + "recent_title": "Senaste sökningar", + "subject": "Ämne" + }, + "search_mailbox": { + "clear_mailboxes": "Rensa valda mappar", + "label": "E-postmappar", + "no_mailbox_found": "Inga mappar hittades", + "search_placeholder": "Sök mappar", + "select_account_first": "Välj först ett e-postkonto" + }, + "search_more": { + "any": "Alla", + "apply": "Använd filter", + "attachment_name_label": "Bilagans namn", + "attachment_name_placeholder": "t.ex. invoice.pdf", + "category": "Bilagskategori", + "content_type": "Filtyp", + "extension": "Filändelse", + "has_attachment": "Har bilaga", + "is_message": "Bilaga i e-postformat", + "is_message_desc": "Denna bilaga är en e-postfil, till exempel en .eml-fil.", + "message_id_description": "Sök via Message-ID i e-posthuvudet", + "message_id_label": "Ursprungligt Message-ID", + "message_size_label": "Meddelandestorlek", + "reset": "Återställ", + "search_placeholder": "Sök {{field}}...", + "size_presets": { + "any": "Valfri storlek", + "huge": "Mycket stor (> 20 MB)", + "large": "Stor (10–20 MB)", + "medium": "Mellan (2–10 MB)", + "small": "Liten (< 2 MB)", + "tiny": "Mycket liten (< 15 KB)" + }, + "title": "Avancerade filter", + "trigger_label": "Avancerat" + }, + "search_reset": { + "label": "Återställ", + "tooltip": "Rensa alla filter" + }, + "search_view": { + "button_label": "Vy", + "menu_title": "Inställningar för kolumner" + }, + "settings": { + "accounts": "Konton", + "acl": "Acl", + "actions": "Åtgärder", + "add": "Lägg till", + "addNewProxyHere": "Lägg till ny proxy här. ", + "adding": "Lägger till...", + "appearance": { + "button": { + "update": "Uppdatera inställningar" + }, + "command": { + "no_results": "Inget språk hittades.", + "search": "Sök språk..." + }, + "description": { + "language": "Välj språk för webbanvändargränssnittet.", + "theme": "Välj mellan ljust eller mörkt läge för gränssnittet." + }, + "field": { + "language": "Gränssnittsspråk", + "theme": "Gränssnittstema" + }, + "placeholder": { + "select_language": "Välj språk" + }, + "theme": { + "dark": "Mörkt", + "light": "Ljust" + }, + "title": "Utseende", + "validation": { + "language": { + "required": "Välj ett språk." + }, + "theme": { + "required": "Välj ett tema." + } + } + }, + "authUrl": "Auth-URL", + "changePasswordForFutureLogins": "Byt lösenord för framtida inloggningar.", + "confirmReset": "Bekräfta återställning", + "createdAt": "Skapad", + "delete": "Ta bort", + "description": "Beskrivning", + "edit": "Redigera", + "enabled": "Aktiverad", + "enterNewRootPassword": "Ange nytt root-lösenord", + "enterProxyIdToConfirmDeletion": "Ange Proxy-ID för att bekräfta borttagning.", + "failedToCopyText": "Misslyckades att kopiera text", + "filterAccessToken": "Filtrera åtkomsttoken...", + "filterAccount": "Filtrera konto...", + "filterOauth2": "Filtrera oauth2...", + "filterProxy": "Filtrera Proxy...", + "general": "Allmänt", + "generateNewToken": "Generera ny token, den gamla upphör att gälla omedelbart.", + "host": "Värd", + "id": "Id", + "invalidPassword": "Ogiltigt lösenord", + "lastAccess": "Senaste åtkomst", + "manageRootTokenAndPassword": "Hantera root-token och lösenord säkert.", + "name": "Namn", + "noProxies": "Inga proxys", + "noProxiesDesc": "Du har inte lagt till några proxy-konfigurationer ännu. Lägg till en för att börja använda proxy-funktioner.", + "password": "Lösenord", + "pleaseUseAnIpAddressForBetterReliability": "Vänligen använd en IP-adress (t.ex. 127.0.0.1) istället för ett värdnamn eller domän för bättre tillförlitlighet.", + "port": "Port", + "profile": { + "account": { + "id": "Konto-ID: {{id}}" + }, + "avatarAlt": "Avatar", + "button": { + "permissions": "Behörigheter", + "update_profile": "Uppdatera profil", + "view_global_permissions": "Visa globala behörigheter" + }, + "field": { + "email": "E-post", + "password": "Lösenord", + "username": "Användarnamn" + }, + "loadError": "Det gick inte att läsa in användarinformation.", + "maxSize": "Upp till {{size}}", + "placeholder": { + "password_keep": "Lämna tomt för att behålla nuvarande lösenord" + }, + "removeAvatar": "Ta bort avatar", + "section": { + "accounts": "{{count}} länkade konton", + "roles": "Roller" + }, + "toast": { + "update_failed": "Misslyckades med att uppdatera profilen", + "updated": "Profilen har uppdaterats" + }, + "uploadError": "Fel vid filuppladdning", + "uploadTitle": "Ladda upp avatar", + "validation": { + "email": { + "invalid": "Ange en giltig e-postadress", + "required": "E-post krävs" + }, + "password": { + "max": "Lösenordet får vara högst 256 tecken", + "min": "Lösenordet måste vara minst 8 tecken" + }, + "username": { + "max": "Användarnamnet får vara högst 32 tecken", + "min": "Användarnamnet måste vara minst 5 tecken", + "required": "Användarnamn krävs" + } + } + }, + "proxy": "Proxy", + "proxyUpdateOrAddFailed": "{{action}} misslyckades, försök igen senare", + "reset": "Återställ", + "resetRootPassword": "Återställ root-lösenord", + "resetRootToken": "Återställ root-token", + "root": "Root", + "rootAccessManagement": "Hantering av root-åtkomst", + "rootDesc": "Hantera autentiseringsuppgifter för root-åtkomst inklusive token och lösenord.", + "rootPasswordMustBeAtLeast6Characters": "Root-lösenordet måste vara minst 6 tecken långt.", + "rootTitle": "Root", + "selectAll": "Välj alla", + "sidebar": { + "apiTokens": "API-tokens", + "configurations": "Systemkonfigurationer", + "profile": "Profil", + "proxy": "Nätverksproxy" + }, + "theRootPasswordHasBeenReset": "Root-lösenordet har återställts", + "theRootTokenHasBeenReset": "Root-token har återställts", + "theme": "Tema", + "title": "Inställningar", + "token": "Token", + "tokenUrl": "Token-URL", + "type": "Typ", + "updateTheProxyHere": "Uppdatera proxyn här. ", + "updatedAt": "Uppdaterad", + "url": "Url", + "useNewPasswordForNextLogin": "Använd det nya lösenordet vid nästa inloggning.", + "useProxy": "Använd Proxy", + "username": "Användarnamn", + "youAreAboutToResetTheRootPassword": "Du är på väg att återställa root-lösenordet. Se till att lagra det säkert.", + "youAreAboutToResetTheRootToken": "Du är på väg att återställa root-token. Denna åtgärd kan inte ångras.", + "yourLoginInformationHasBeenUpdated": "Din inloggningsinformation har uppdaterats. Du behöver inte logga in igen.", + "yourProxyHasBeenSuccessfully": "Din proxy har {{action}}." + }, + "sign_out": { + "confirm": "Logga ut", + "desc": "Är du säker på att du vill logga ut? Du måste logga in igen för att få åtkomst till ditt konto.", + "title": "Logga ut" + }, + "systemConfig": { + "pageDescription": "Dessa parametrar initieras via CLI-flaggor eller miljövariabler. De är skrivskyddade.", + "pageTitle": "Systemkonfigurationer", + "sections": { + "cors": { + "desc": "Åtkomstregler för cross-origin", + "title": "CORS" + }, + "logging": { + "desc": "Loggutmatning", + "title": "Loggning" + }, + "network": { + "desc": "HTTP och offentlig åtkomst", + "title": "Nätverk" + }, + "performance": { + "desc": "Samtidighet & komprimering", + "title": "Prestanda" + }, + "security": { + "desc": "Autentisering & kryptering", + "title": "Säkerhet" + }, + "smtp": { + "desc": "Inställningar för mottagning av inkommande e-post för realtidsarkivering", + "title": "SMTP-server" + }, + "storage": { + "desc": "Databasvägar och gränser", + "title": "Lagring & Cache" + } + }, + "status": { + "auto": "Auto", + "configured": "Konfigurerad", + "disabled": "Inaktiverad", + "enabled": "Aktiverad", + "missing": "Saknas", + "notSet": "Ej inställd" + } + }, + "table": { + "asc": "Stigande", + "delete": "Ta bort", + "desc": "Fallande", + "edit": "Redigera", + "hide": "Dölj", + "loading": "Laddar...", + "noResults": "Inga resultat hittades", + "of": "av", + "page": "Sida", + "pagination": { + "first": "Första sidan", + "fixed_page_size": "{{size}} rader per sida.", + "last": "Sista sidan", + "next": "Nästa sida", + "page_info": "Sida {{page}} av {{total}}", + "previous": "Föregående sida", + "rows_per_page": "Rader per sida", + "selected": "{{selected}} av {{total}} rader valda." + }, + "results": "resultat", + "rowsPerPage": "Rader per sida", + "showing": "Visar", + "to": "till" + }, + "tag": { + "clear_all": "Rensa alla taggar", + "label": "Taggar", + "no_tags_found": "Inga taggar hittades", + "search_placeholder": "Sök taggar..." + }, + "time": { + "absolute_range": "Absolut datumintervall", + "apply": "Använd", + "before": "Före", + "clear_filters": "Rensa tidsfilter", + "days_ago_to_now": "dagar sedan till nu", + "end_date": "Slutdatum", + "format": "yyyy-MM-dd", + "historical": "Historiskt intervall (före...)", + "label": "Tid", + "last_day": "Senaste 1 dagen", + "last_days": "Senaste {{count}} dagarna", + "last_months": "Senaste {{count}} månaderna", + "over_years_ago": "För {{count}} {{unit}} sedan", + "recent_prefix": "Senaste:", + "recent_range": "Senaste intervall (sedan...)", + "since": "Sedan", + "start_date": "Startdatum", + "year": "år", + "years": "år" + }, + "users": { + "actions": { + "api_tokens": "API-nycklar", + "buttons": { + "add_account": "Lägg till konto", + "create": "Skapa användare", + "update": "Uppdatera användare" + }, + "delete": { + "alert_desc": "Användaren och all tillhörande data kommer att raderas.", + "alert_title": "Varning: Permanent åtgärd.", + "button_confirm": "Ta bort användare", + "button_deleting": "Tar bort...", + "confirm_msg": "Du håller på att permanent ta bort användaren {{name}} (ID: {{id}}).", + "input_label": "Skriv användar-ID nedan för att bekräfta:", + "irreversible": "Denna åtgärd kan inte ångras.", + "placeholder": "Skriv \"{{id}}\" för att bekräfta", + "title": "Ta bort användare", + "toast": { + "failed_fallback": "Kunde inte ta bort användaren.", + "failed_title": "Borttagning misslyckades", + "success_desc": "Användaren \"{{name}}\" har tagits bort.", + "success_title": "Användare borttagen" + } + }, + "dialog": { + "create_title": "Skapa ny användare", + "edit_title": "Redigera användare: {{name}}", + "subtitle": "Konfigurera identitet, åtkomstnivåer och säkerhet." + }, + "fields": { + "assign_role": "Tilldela roll", + "burst_interval": "Burst-intervall (sek)", + "description": "Beskrivning (valfritt)", + "description_hint": "Interna anteckningar (max 256 tecken).", + "description_placeholder": "Lägg till anteckningar...", + "email": "E-postadress", + "email_hint": "Primär kontakt och aviseringar.", + "global_roles_hint": "Tilldela systembehörigheter.", + "ip_whitelist": "Vitlista IP", + "ip_whitelist_hint": "Begränsa inloggning till dessa IP-adresser (en per rad).", + "password": "Lösenord", + "password_hint_create": "Säkert lösenord för nyskapad användare.", + "password_hint_edit": "Ange endast nytt lösenord om du vill byta.", + "password_placeholder_create": "Minst 8 tecken", + "password_placeholder_edit": "Lämna tomt för att behålla nuvarande", + "rate_quota": "Hastighetsbegränsning", + "select_account": "Välj konto", + "username": "Användarnamn", + "username_hint": "Unikt ID för inloggning." + }, + "placeholder": { + "filter": "Sök användare..." + }, + "schema": { + "account_required": "Välj ett konto", + "description_max": "Beskrivningen får vara max 256 tecken", + "email_invalid": "Ange en giltig e-postadress", + "email_required": "E-postadress krävs", + "global_role_required": "Tilldela minst en global roll till användaren", + "ip_invalid": "Ogiltig IP-adress upptäckt", + "password_max": "Lösenordet får vara max 256 tecken", + "password_min": "Lösenordet måste vara minst 8 tecken", + "password_required": "Lösenord krävs", + "role_required": "Välj en roll", + "username_max": "Användarnamnet får inte överstiga 32 tecken", + "username_min": "Användarnamnet måste vara minst 3 tecken", + "username_required": "Användarnamn krävs" + }, + "sections": { + "basic": "Basidentitet", + "global": "Globala behörigheter", + "mail_access": "E-poståtkomst", + "mail_access_subtitle": "Definiera vilka e-postkonton användaren kan hantera.", + "policy": "Policyinställningar" + }, + "states": { + "full_access": "Full åtkomst", + "full_access_desc": "Systemadministratörer har automatiskt åtkomst till alla konton.", + "no_accounts": "Inga specifika konton tilldelade.", + "security_disabled": "Säkerhetspolicyer är inaktiverade." + }, + "tabs": { + "general": "Allmänt", + "permissions": "Kontobehörigheter", + "security": "Säkerhet och ACL" + }, + "toast": { + "created": "Användaren skapad", + "updated": "Användaren uppdaterad" + } + }, + "api_tokens": { + "button": { + "generate": "Skapa ny nyckel" + }, + "delete": { + "confirm_button": "Ta bort nyckel", + "confirm_label": "Skriv {{word}} nedan för att bekräfta:", + "confirm_placeholder": "Skriv \"{{word}}\" för att bekräfta", + "deleting": "Tar bort...", + "desc": "Du håller på att permanent ta bort denna API-nyckel", + "irreversible": "Denna åtgärd kan inte ångras. Applikationer som använder denna nyckel kommer omedelbart att förlora åtkomst.", + "prefix": "Prefix för nyckel", + "title": "Ta bort API-nyckel", + "warning_desc": "Skript eller tjänster som använder denna nyckel kommer att sluta fungera. Se till att du har uppdaterat dina system.", + "warning_title": "Varning" + }, + "empty": { + "description": "Inga API-tokens har genererats i systemet än.", + "title": "Inga API-nycklar hittades" + }, + "table": { + "api_key": "API-nyckel", + "created": "Skapad", + "expired": "Gått ut", + "expires_at": "Går ut den", + "last_used": "Senast använd", + "name": "Namn", + "never": "Aldrig", + "owner": "Ägare", + "permanent": "Permanent", + "type": "Typ", + "unnamed": "Namnlös nyckel", + "web_ui": "Webbgränssnitt" + }, + "toast": { + "delete_failed": "Kunde inte ta bort nyckeln, försök igen.", + "delete_failed_title": "Borttagning misslyckades", + "deleted_desc": "Nyckeln \"{{name}}\" har tagits bort.", + "deleted_title": "API-nyckel borttagen" + }, + "toolbar": { + "search_placeholder": "Sök efter namn, ägare eller nyckel..." + }, + "unnamed": "Namnlös nyckel" + }, + "buttons": { + "add": "Lägg till användare", + "add_new": "Lägg till ny användare" + }, + "columns": { + "actions": "Åtgärder", + "avatar": "Avatar", + "created_at": "Skapad", + "email": "E-postadress", + "id": "ID", + "roles": "Roller och behörigheter", + "updated_at": "Uppdaterad", + "username": "Användarnamn" + }, + "empty": { + "description": "Klicka på knappen nedan för att lägga till din första användare.", + "title": "Inga användare hittades" + }, + "nav": { + "api_tokens": "API-nycklar", + "roles": "Roller", + "users": "Användare" + }, + "tokens": { + "dialog": { + "create_title": "Skapa åtkomstnyckel", + "description": "Klicka på spara när du är klar.", + "edit_title": "Redigera åtkomstnyckel" + }, + "error": { + "fallback": "Åtgärden misslyckades, försök igen senare." + }, + "expire_options": { + "1_day": "1 dag", + "30_days": "30 dagar", + "7_days": "7 dagar", + "never": "Går aldrig ut" + }, + "fields": { + "expire_hint": "Nyckeln går ut automatiskt efter den valda tiden.", + "expire_label": "Utgångsdatum", + "expire_placeholder": "Välj utgångsdatum", + "name_hint": "Valfritt · Max 32 tecken", + "name_label": "Namn", + "name_placeholder": "Ge nyckeln ett kort namn" + }, + "schema": { + "expire_int": "Måste vara ett heltal", + "expire_number": "Måste vara ett nummer", + "expire_positive": "Måste vara större än 0", + "name_max": "Max 32 tecken" + }, + "toast": { + "create_failed_title": "Skapande misslyckades", + "create_success_desc": "Åtkomstnyckeln har skapats.", + "create_success_title": "Åtkomstnyckel skapad", + "update_failed_title": "Uppdatering misslyckades", + "update_success_desc": "Åtkomstnyckeln har uppdaterats.", + "update_success_title": "Åtkomstnyckel uppdaterad" + } + }, + "tokens_action": { + "buttons": { + "add": "Lägg till nyckel" + }, + "delete_dialog": { + "description": "Denna åtgärd kan inte ångras.", + "title": "Ta bort åtkomstnyckel?" + }, + "dialog": { + "description": "Hantera API-nycklar för denna användare.", + "title": "API-nycklar" + }, + "empty": { + "description": "Användaren har inga API-nycklar för tillfället.", + "title": "Inga API-nycklar" + }, + "list": { + "button_delete": "Ta bort nyckel", + "expires_on_brief": "Går ut {{date}}", + "label_created": "Skapad", + "label_expires_at": "Går ut den", + "label_last_used": "Senast använd", + "label_token": "Nyckel", + "never": "Aldrig", + "never_expires": "Går aldrig ut", + "status_active": "Aktiv", + "status_expired": "Gått ut", + "unnamed_token": "Namnlös nyckel" + } + } + }, + "validation": { + "emailRequired": "E-post krävs", + "folderLimitMustBeAtLeast100": "Mappgräns måste vara minst 100", + "folderLimitMustBeNumber": "Mappgräns måste vara ett tal", + "imapHostCannotBeEmpty": "IMAP-värd kan inte vara tom", + "imapHostRequired": "IMAP-värd krävs", + "imapPortMustBeLessThan65536": "IMAP-port måste vara mindre än 65536", + "imapPortMustBePositive": "IMAP-port måste vara ett positivt heltal", + "incrementalSyncMustBeAtLeast10": "Intervall för inkrementell synkronisering måste vara minst 10 minuter", + "incrementalSyncMustBeNumber": "Intervall för inkrementell synkronisering måste vara ett tal", + "invalidEmail": "Ogiltig e-postadress", + "invalidUrl": "Ogiltig URL", + "passwordMinLength": "Lösenordet måste vara minst {{min}} tecken långt", + "passwordRequired": "Lösenord krävs när autentiseringsmetoden är Lösenord", + "pleaseEnterPassword": "Vänligen ange ditt lösenord", + "pleaseEnterUsernameOrEmail": "Vänligen ange ditt användarnamn eller din e-postadress", + "required": "Detta fält är obligatoriskt", + "singleRequestBatchSizeMustBeNumber": "Batchstorlek måste vara ett tal", + "singleRequestBatchSizeTooLarge": "Batchstorlek måste vara högst 200", + "singleRequestBatchSizeTooSmall": "Batchstorlek måste vara minst 10" + } } \ No newline at end of file diff --git a/web/src/locales/zh-tw.json b/web/src/locales/zh-tw.json index 671cf55..52ecfb3 100644 --- a/web/src/locales/zh-tw.json +++ b/web/src/locales/zh-tw.json @@ -1,1614 +1,1630 @@ { - "common": { - "submit": "提交", + "accessTokens": { + "aListOfIpAddressesAllowed": "允許存取資源的 IP 地址列表。每行輸入一個 IP 地址。(選填)", + "accountId": "帳號 ID", + "accounts": "帳號", + "aclRulesForAccessTokens": "存取權杖的 ACL 規則包括 IP 白名單驗證和速率限制應用。", + "actions": { + "delete": "刪除", + "edit": "編輯", + "openMenu": "開啟選單" + }, + "addNew": "新增", + "atLeastOneAccountIsRequired": "至少需要一個帳號。", + "create": "建立", + "createNewAccessTokenHere": "在此建立新的存取權杖。", + "created": "已建立", + "createdAt": "建立時間", + "creating": "正在建立...", + "creationFailed": "建立失敗", + "delete": "刪除", + "describeThePurposeOfTheAccessToken": "描述存取權杖的目的", + "description": "在此管理存取權杖、存取控制列表 (ACL)、IP 白名單和速率限制設定。", + "descriptionMustNotExceed255Characters": "描述不得超過 255 個字元。", + "edit": "編輯", + "editToken": "編輯權杖", + "enterIntervalInSeconds": "輸入間隔時間(秒)。例如:60", + "enterOneIpAddressPerLine": "每行輸入一個 IP 地址。例如:\n192.168.1.1\n192.168.1.2", + "enterQuota": "輸入配額。例如:100", + "expiresAt": "到期時間", + "filterByEmailAddressOrAccountId": "依電子郵件地址或帳號 ID 篩選...", + "interval": "間隔", + "intervalMustBeAPositiveInteger": "間隔時間必須是正整數。", + "invalidIpAddressesFound": "發現無效的 IP 地址。請輸入有效的 IPv4 或 IPv6 地址。", + "name": "名稱", + "noTokens": "無存取權杖", + "noTokensDesc": "您尚未建立任何存取權杖。請建立權杖以使用 API 功能。", + "notUsedYet": "尚未使用", + "quota": "配額", + "quotaMustBeAPositiveInteger": "配額必須是正整數。", + "save": "儲存", + "saveChanges": "儲存變更", + "saving": "正在儲存...", + "selectAccounts": "選擇帳號", + "selectMultipleAccountsForTheAccessToken": "為此存取權杖選擇多個帳號作為授權範圍。", + "theListOfAccountsThatCanBeQueried": "可以使用此存取權杖查詢的帳號列表。", + "theMaximumNumberOfRequestsAllowed": "在間隔時間內允許的最大請求數。(選填)", + "theTimeWindowForTheRateLimit": "速率限制的時間視窗(以秒為單位)。(選填)", + "title": "存取權杖", + "token": "權杖", + "updateFailed": "更新失敗", + "updateOrCreationFailed": "{{action}} 失敗,請稍後再試", + "updateTheAccessTokenHere": "在此更新存取權杖。", + "updated": "已更新", + "updating": "正在更新...", + "yourAccessTokenHasBeenSuccessfully": "您的存取權杖已成功{{action}}。" + }, + "accounts": { + "accessControl": "訪問控制", + "accessTokenCopiedToClipboard": "存取權杖已複製到剪貼簿", + "access_control": { + "buttons": { "cancel": "取消", - "save": "儲存", - "save_changes": "儲存修改", - "delete": "刪除", - "edit": "編輯", - "search": "搜尋", - "add": "新增", - "remove": "移除", - "create": "建立", - "update": "更新", - "confirm": "確認", + "save": "保存分配" + }, + "description": "為 {{email}} 分配角色和授權用戶", + "role_label": "訪問角色", + "role_loading": "正在加載角色...", + "role_placeholder": "選擇角色", + "title": "帳戶訪問分配", + "toast": { + "failed_title": "分配失敗", + "success_desc": "權限已成功分配給 {{email}}", + "success_title": "分配成功" + }, + "user_empty": "未找到相關用戶", + "user_label": "選擇授權用戶", + "user_search_placeholder": "按用戶名或信箱搜尋...", + "user_selected_count": "已選擇:{{count}} 個用戶", + "validation": { + "role_required": "請選擇要分配的角色", + "user_required": "請至少選擇一個用戶" + } + }, + "accountCreated": "帳號已建立", + "accountCreatedDesc": "帳號已成功建立。", + "accountCreationFailed": "帳號建立失敗", + "accountDetails": "帳號詳細資訊", + "accountHasBeenSuccessfully": "帳戶已成功{{action}}", + "accountSyncFoldersUpdateFailed": "帳號同步資料夾更新失敗", + "accountSyncFoldersUpdated": "帳號同步資料夾已更新", + "accountUpdateFailed": "帳號更新失敗", + "accountUpdated": "帳號已更新", + "accountUpdatedDesc": "帳號已成功更新。", + "actions": "操作", + "addAccount": "新增帳號", + "addConfiguration": "新增設定", + "addImap": "新增 IMAP 帳號", + "addNewEmailAccountHere": "在此新增電子郵件帳號。", + "addNoSync": "新增非同步帳號", + "allMailFolderSelected": "注意:「所有郵件」資料夾已選擇", + "allMailFolderSelectedDesc": "選擇具有「所有郵件」屬性的資料夾可能會導致已從收件匣或寄件備份等資料夾同步的郵件重複。這可能會大幅增加您的儲存用量。", + "allMailSkipped": "標準資料夾已選擇,為避免重複已跳過「所有郵件」。", + "areYouSureYouWantTo": "你確定要{{action}}此帳戶嗎?", + "auth": "驗證", + "authType": "驗證類型", + "autoConfiguring": "正在自動設定...", + "beforeRelative": "僅下載舊郵件", + "beforeRelativeValue": "下載 {{value}} {{unit}} 之前的郵件", + "capabilities": "功能", + "chooseAuthMethod": "請選擇 IMAP 的驗證方法。", + "chooseEncryptionMethod": "請選擇 IMAP 的加密方法。", + "chooseMailboxesToDownload": "為 {{email}} 選擇要下載的郵件夾。新加入的郵件夾會在下個週期下載。", + "clickHere": "點擊此處", + "clickSaveWhenDone": "完成後點擊「儲存」。", + "continue": "繼續", + "createdAt": "建立時間", + "creationFailed": "建立失敗,請稍後再試。", + "dateSelection": "日期選擇", + "dateSince": "同步起始日期", + "days": "天", + "delete": "刪除", + "description": "管理和設定您的郵件帳號。", + "detail": "詳細資訊", + "detailsOfTheOAuth2TokensForTheAccount": "此帳號的 OAuth2 權杖詳細資訊。", + "determinesWhetherThisAccountIsActiveNoSync": "用來判斷帳戶是否啟用。若停用,將無法匯入資料。", + "disable": "停用", + "disableAccount": "停用帳戶", + "disabled": "已停用", + "downloadAll": "下載所有郵件", + "downloadBatchSize": "下載批量大小", + "downloadBatchSizeDescription": "每個 IMAP 請求獲取的郵件數量", + "downloadInterval": "下載週期 (分鐘)", + "downloadIntervalPlaceholder": "請輸入分鐘數", + "downloadScope": "下載策略", + "downloadScopeDescription": "選擇哪些郵件應被索引和下載。", + "duration": "時長", + "edit": "編輯", + "email": "電子郵件", + "emailAccountRegistration": "電子郵件帳號註冊", + "emailAccountRegistrationDesc": "請輸入您的電子郵件地址。在接下來的步驟中,您將設定 IMAP 詳細資訊。我們將使用此地址自動偵測 IMAP 伺服器設定。", + "emailAddress": "電子郵件地址", + "emailCannotBeModified": "編輯時無法修改電子郵件帳號地址。", + "emailPlaceholder": "例如:john.doe@example.com", + "enable": "啟用", + "enableAccount": "啟用帳戶", + "enabled": "啟用", + "enabledDescription": "確定此帳戶是否處於活動狀態。如果禁用,相關的下載任務將不會運行。", + "encryption": "加密", + "enterPassword": "輸入密碼", + "enterValue": "輸入值", + "everyMinutes": "每 {{minutes}} 分鐘", + "field": "欄位", + "fixed": "固定", + "folderLimit": "資料夾限制", + "folderLimitDescription": "限制每個資料夾要同步的郵件數量(最小 100)。若無限制請留空。", + "folderLimitPlaceholder": "例如:1000", + "folderSync": { + "autoSelectDescendants": "自動選取子項", + "autoSelectParents": "自動選取父項", + "batches": "批次", + "collapseAll": "全部收合", + "expandAll": "全部展開", + "loadingMailboxFolders": "正在載入郵件資料夾…", + "noData": "無資料", + "noFolders": "沒有可同步的資料夾" + }, + "foldersConfiguredForSync": "已設定同步的資料夾:{{count}} 個", + "foldersSelected": "已選資料夾:{{count}} 個", + "goBack": "返回", + "host": "主機", + "id": "ID", + "imap": "IMAP", + "imapAuthMethod": "IMAP 驗證方法", + "imapEncryption": "IMAP 加密", + "imapHost": "IMAP 主機", + "imapHostPlaceholder": "例如:imap.example.com", + "imapPassword": "IMAP 密碼", + "imapPort": "IMAP 連接埠", + "imapPortPlaceholder": "例如:993", + "imapProxy": "使用 SOCKS5 代理進行 IMAP 連線。", + "incSync": "增量同步", + "lastSync": "上次同步", + "leaveEmptyToKeepExisting": "保留現有密碼請留空。若要更新,請輸入新密碼。", + "leaveEmptyToKeepPassword": "保留現有密碼請留空", + "login_name": "登入名稱", + "minutes": "分鐘", + "months": "月", + "moreAccountTypes": "更多帳號類型", + "mustBeAtLeast1": "必須大於或等於 1", + "name": "名稱", + "nameDescription": "IMAP 使用者名稱。預設為電子郵件,也可在此自訂。", + "namePlaceholder": "例如:john.doe", + "noAccountConfigurations": "沒有帳號設定", + "noAccountConfigurationsDesc": "您尚未新增任何帳號設定。請新增設定以使用功能。", + "noOAuth2Tokens": "無 OAuth2 權杖", + "none": "無", + "notAvailable": "不適用", + "oauth2Tokens": "OAuth2 權杖", + "openMenu": "開啟選單", + "optional": "選填", + "owner": "建立者", + "password": "密碼", + "port": "連接埠", + "recent": "近期", + "refreshToken": "更新權杖 (Refresh Token)", + "refreshTokenCopiedToClipboard": "更新權杖已複製到剪貼簿", + "relative": "相對", + "runningState": { + "account": { + "id": "帳戶 ID" + }, + "common": { "close": "關閉", - "yes": "是", - "no": "否", - "ok": "確定", - "loading": "載入中...", - "empty": "空", - "noData": "無數據", - "table": { - "noResults": "無結果。" - }, - "failed": "失敗", - "notFound": "未找到", - "back": "返回", - "goBack": "返回", - "backToHome": "返回首頁", - "tryAgain": "重試", - "more": "更多", - "actions": "操作", - "filter": "篩選", - "reset": "重置", - "clear": "清除", - "error": "錯誤", - "apply": "套用", - "select": "選擇", - "selectAll": "全選", - "deselectAll": "取消全選", - "all": "全部", - "none": "無", - "showLess": "顯示更少", - "showMore": "顯示更多...", - "project_description": "Bichon 是一個開源項目。", - "view_on_github_button": "在 GitHub 上查看", - "op_failed": "操作失敗", - "na": "無", - "retry": "重試", - "deleting": "正在刪除..." - }, - "navigation": { - "home": "首頁", - "settings": "設定", - "accounts": "帳號", - "dashboard": "儀表板", - "mailbox": "信箱", - "oauth2": "OAuth2", - "accessTokens": "存取權杖", - "apiDocs": "API文件", - "general": "一般", - "auth": "驗證", - "other": "其他", - "users": "系統使用者" - }, - "auth": { - "welcome": "歡迎使用 Bichon", - "username": "使用者名稱", - "password": "密碼", - "login": "登入", - "loginFailed": "登入失敗", - "invalidPassword": "密碼無效,請再試一次。", - "somethingWentWrong": "發生錯誤", - "sessionExpired": "連線逾時!", - "sessionExpiredDesc": "由於閒置過久,您的連線已終止。請重新登入以繼續。", - "logout": "登出", - "areYouSureYouWantToLogOut": "確定要登出嗎?", - "youWillNeedToLogInAgain": "您將需要再次登入才能存取您的帳號。" - }, - "errors": { - "pageNotFound": "糟糕!找不到頁面!", - "pageNotFoundDesc": "您要尋找的頁面可能不存在或已被刪除。", - "somethingWentWrong": "糟糕!發生錯誤 :')", - "somethingWentWrongDesc": "很抱歉造成不便,請稍後再試。", - "internalServerError": "內部伺服器錯誤!", - "contentNotModified": "內容未變更!", - "networkError": "網路錯誤", - "networkErrorDesc": "無法連線到伺服器。請檢查您的網路連線並重試。", - "forbidden": "禁止存取", - "forbiddenTitle": "拒絕存取", - "forbiddenDesc": "您沒有檢視此資源所需的權限。", - "unauthorized": "未經授權", - "unauthorizedTitle": "無權存取", - "unauthorizedDesc": "請使用正確的憑證登入,以存取此資源。", - "maintenance": "系統維護中", - "maintenanceTitle": "網站正在維護中!", - "maintenanceDesc": "網站目前無法使用。我們將很快恢復服務。", - "learnMore": "瞭解更多" - }, - "dashboard": { - "title": "儀表板", - "mailAccounts": "郵件帳號", - "connected": "已連線", - "totalEmails": "郵件總數", - "syncedLocally": "本地同步數量", - "totalEmailSize": "郵件總容量", - "logicalVolume": "原始大小", - "localDataFiles": "本地資料檔案", - "actualDiskUsage": "實際磁碟用量", - "efficiency": "壓縮效率", - "saved": "節省空間", - "dataStorage": "資料儲存", - "indexSize": "索引體積", - "metadataSize": "元數據大小", - "tantivyDatabase": "基于 Tantivy 搜索引擎", - "dayTrend": "30 天趨勢", - "attachments": "附件", - "topLists": "排行榜", - "newEmails": "新郵件", - "messageDistribution": "訊息分佈", - "attachmentRatio": "附件比例", - "attachmentRatioDesc": "{{percent}}% 的郵件包含附件", - "noEmailsSynced": "尚未同步任何郵件", - "withAttachments": "包含附件", - "noAttachments": "無附件", - "top10Senders": "前 10 名寄件人", - "byMessageCount": "依郵件數量", - "sender": "寄件人", - "count": "數量", - "top10LargestEmails": "前 10 封最大郵件", - "byMessageSize": "依郵件大小", - "subject": "主旨", - "size": "大小", - "noSubject": "(無主旨)", - "top10Accounts": "前 10 名帳號", - "emails": "郵件", - "account": "帳號", - "noRecentActivity": "無近期活動", - "noSendersData": "無寄件人資料", - "noLargeEmails": "無大容量郵件", - "noAccountData": "無帳號資料", - "systemVersion": "系統版本" - }, - "accounts": { - "beforeRelativeValue": "下載 {{value}} {{unit}} 之前的郵件", - "sinceRelativeValue": "下載最近一段時期的郵件", - "downloadBatchSize": "下載批量大小", - "downloadBatchSizeDescription": "每個 IMAP 請求獲取的郵件數量", - "downloadScopeDescription": "選擇哪些郵件應被索引和下載。", - "downloadScope": "下載策略", - "selectMode": "選擇過濾模式", - "downloadAll": "下載所有郵件", - "sinceFixed": "自特定日期起", - "sinceRelative": "僅下載最近郵件", - "beforeRelative": "僅下載舊郵件", - "duration": "時長", - "unit": "單位", - "accessControl": "訪問控制", - "owner": "建立者", - "access_control": { - "title": "帳戶訪問分配", - "description": "為 {{email}} 分配角色和授權用戶", - "role_label": "訪問角色", - "role_placeholder": "選擇角色", - "role_loading": "正在加載角色...", - "user_label": "選擇授權用戶", - "user_search_placeholder": "按用戶名或信箱搜尋...", - "user_empty": "未找到相關用戶", - "user_selected_count": "已選擇:{{count}} 個用戶", - "buttons": { - "cancel": "取消", - "save": "保存分配" - }, - "validation": { - "user_required": "請至少選擇一個用戶", - "role_required": "請選擇要分配的角色" - }, - "toast": { - "success_title": "分配成功", - "success_desc": "權限已成功分配給 {{email}}", - "failed_title": "分配失敗" - } - }, - "title": "郵件帳號", - "description": "管理和設定您的郵件帳號。", - "addImap": "新增 IMAP 帳號", - "addNoSync": "新增非同步帳號", - "moreAccountTypes": "更多帳號類型", - "noAccountConfigurations": "沒有帳號設定", - "noAccountConfigurationsDesc": "您尚未新增任何帳號設定。請新增設定以使用功能。", - "addConfiguration": "新增設定", - "useNoProxy": "不使用代理", - "login_name": "登入名稱", - "name": "名稱", - "email": "電子郵件", + "folders": "個郵件夾" + }, + "empty": { + "no_active_download": "目前沒有下載任務", + "no_errors_current": "目前任務沒有錯誤", + "no_errors_session": "此任務沒有錯誤", + "no_global_errors": "沒有全域錯誤", + "no_history": "沒有歷史記錄" + }, + "folders": "個郵件夾", + "latest": "最新", + "loading": { + "fetching_account_state": "正在取得帳戶狀態..." + }, + "message": "訊息", + "session": { + "started_at": "開始時間", "status": "狀態", - "type": "類型", - "lastSync": "上次同步", - "actions": "操作", - "edit": "編輯", - "delete": "刪除", - "detail": "詳細資訊", - "selectMailboxes": "選擇郵件夾", - "oauth2Tokens": "OAuth2 權杖", - "id": "ID", - "enabled": "啟用", - "auth": "驗證", - "incSync": "增量同步", - "state": "狀態", - "createdAt": "建立時間", - "updatedAt": "更新時間", - "openMenu": "開啟選單", - "emailAccountRegistration": "電子郵件帳號註冊", - "emailAccountRegistrationDesc": "請輸入您的電子郵件地址。在接下來的步驟中,您將設定 IMAP 詳細資訊。我們將使用此地址自動偵測 IMAP 伺服器設定。", - "emailAddress": "電子郵件地址", - "emailPlaceholder": "例如:john.doe@example.com", - "namePlaceholder": "例如:john.doe", - "optional": "選填", - "nameDescription": "IMAP 使用者名稱。預設為電子郵件,也可在此自訂。", - "emailCannotBeModified": "編輯時無法修改電子郵件帳號地址。", - "addAccount": "新增帳號", - "updateAccount": "更新帳號", - "accountUpdated": "帳號已更新", - "accountCreated": "帳號已建立", - "accountUpdatedDesc": "帳號已成功更新。", - "accountCreatedDesc": "帳號已成功建立。", - "accountUpdateFailed": "帳號更新失敗", - "accountCreationFailed": "帳號建立失敗", - "updateFailed": "更新失敗,請稍後再試。", - "creationFailed": "建立失敗,請稍後再試。", - "allMailFolderSelected": "注意:「所有郵件」資料夾已選擇", - "accountSyncFoldersUpdated": "帳號同步資料夾已更新", - "accountSyncFoldersUpdateFailed": "帳號同步資料夾更新失敗", - "serverConfiguration": "伺服器設定 (IMAP)", - "selectedMailboxes": "已選擇的郵件夾", - "allMailFolderSelectedDesc": "選擇具有「所有郵件」屬性的資料夾可能會導致已從收件匣或寄件備份等資料夾同步的郵件重複。這可能會大幅增加您的儲存用量。", - "allMailSkipped": "標準資料夾已選擇,為避免重複已跳過「所有郵件」。", - "selectAtLeastOneFolder": "請至少選擇一個資料夾", - "chooseMailboxesToDownload": "為 {{email}} 選擇要下載的郵件夾。新加入的郵件夾會在下個週期下載。", - "accountDetails": "帳號詳細資訊", - "capabilities": "功能", - "folderLimit": "資料夾限制", - "everyMinutes": "每 {{minutes}} 分鐘", - "foldersConfiguredForSync": "已設定同步的資料夾:{{count}} 個", - "foldersSelected": "已選資料夾:{{count}} 個", - "imapHost": "IMAP 主機", - "imapHostPlaceholder": "例如:imap.example.com", - "imapPort": "IMAP 連接埠", - "imapPortPlaceholder": "例如:993", - "imapEncryption": "IMAP 加密", - "selectEncryptionMethod": "選擇加密方法", - "chooseEncryptionMethod": "請選擇 IMAP 的加密方法。", - "imapAuthMethod": "IMAP 驗證方法", - "selectAuthMethod": "選擇驗證方法", - "chooseAuthMethod": "請選擇 IMAP 的驗證方法。", - "imapPassword": "IMAP 密碼", - "leaveEmptyToKeepPassword": "保留現有密碼請留空", - "enterPassword": "輸入密碼", - "leaveEmptyToKeepExisting": "保留現有密碼請留空。若要更新,請輸入新密碼。", - "useProxy": "使用代理", - "selectProxy": "選擇代理", - "downloadInterval": "下載週期 (分鐘)", - "downloadIntervalPlaceholder": "請輸入分鐘數", - "enabledDescription": "確定此帳戶是否處於活動狀態。如果禁用,相關的下載任務將不會運行。", - "dateSince": "同步起始日期", - "none": "無", - "fixed": "固定", - "relative": "相對", - "selectDate": "選擇日期", - "selectUnit": "選擇單位", - "days": "天", - "months": "月", - "years": "年", - "enterValue": "輸入值", - "mustBeAtLeast1": "必須大於或等於 1", - "dateSelection": "日期選擇", - "since": "自", - "recent": "近期", - "notAvailable": "不適用", - "host": "主機", - "port": "連接埠", - "encryption": "加密", - "authType": "驗證類型", - "password": "密碼", - "useProxyField": "使用代理", - "clickSaveWhenDone": "完成後點擊「儲存」。", - "step": "步驟 {{index}}", - "goBack": "返回", - "autoConfiguring": "正在自動設定...", - "continue": "繼續", - "saveChanges": "儲存變更", - "submit": "送出", - "field": "欄位", - "value": "值", - "refreshToken": "更新權杖 (Refresh Token)", - "accessTokenCopiedToClipboard": "存取權杖已複製到剪貼簿", - "refreshTokenCopiedToClipboard": "更新權杖已複製到剪貼簿", - "noOAuth2Tokens": "無 OAuth2 權杖", - "theAccountHasNotCompletedTheAuthorizationProcess": "此帳號尚未完成授權程序。", - "clickHere": "點擊此處", - "toAuthorizeTheAccount": "以授權帳號。", - "detailsOfTheOAuth2TokensForTheAccount": "此帳號的 OAuth2 權杖詳細資訊。", - "updateTheEmailAccountHere": "在此更新電子郵件帳號。", - "addNewEmailAccountHere": "在此新增電子郵件帳號。", - "thisAccountIsUsedForIdentificationPurposesOnly": "此帳號僅用於識別目的,不需要與郵件伺服器同步。有助於匯入郵件資料。", - "determinesWhetherThisAccountIsActiveNoSync": "用來判斷帳戶是否啟用。若停用,將無法匯入資料。", - "folderSync": { - "noData": "無資料", - "noFolders": "沒有可同步的資料夾", - "batches": "批次", - "autoSelectDescendants": "自動選取子項", - "autoSelectParents": "自動選取父項", - "expandAll": "全部展開", - "collapseAll": "全部收合", - "loadingMailboxFolders": "正在載入郵件資料夾…" - }, - "viewDetails": "檢視詳細資訊", - "runningState": { - "message": "訊息", - "account": { - "id": "帳戶 ID" - }, - "tabs": { - "active_session": "目前任務", - "history": "歷史記錄", - "global_errors": "全域錯誤", - "folders": "郵件夾", - "errors": "錯誤" - }, - "loading": { - "fetching_account_state": "正在取得帳戶狀態..." - }, - "empty": { - "no_active_download": "目前沒有下載任務", - "no_errors_current": "目前任務沒有錯誤", - "no_errors_session": "此任務沒有錯誤", - "no_global_errors": "沒有全域錯誤", - "no_history": "沒有歷史記錄" - }, - "session": { - "status": "狀態", - "trigger": "觸發方式", - "started_at": "開始時間" - }, - "common": { - "folders": "個郵件夾", - "close": "關閉" - }, - "latest": "最新", - "folders": "個郵件夾" - }, - "steps": { - "complete": "完成", - "emailAddress": "電子郵件地址", - "imap": "IMAP", - "syncPreferences": "同步偏好設定", - "summary": "摘要" - }, - "imapProxy": "使用 SOCKS5 代理進行 IMAP 連線。", - "syncStartDateDescription": "定義同步的起始日期(固定日期或相對於現在的日期)。早於此日期的郵件將被排除。{{fixedPart}}。", - "syncAfterDate": "同步設定日期之後的資料", - "syncRecentData": "隨著時間推移調整同步日期,僅同步最新資料", - "folderLimitDescription": "限制每個資料夾要同步的郵件數量(最小 100)。若無限制請留空。", - "folderLimitPlaceholder": "例如:1000", - "imap": "IMAP", - "minutes": "分鐘", - "accountHasBeenSuccessfully": "帳戶已成功{{action}}", - "enableAccount": "啟用帳戶", - "disableAccount": "停用帳戶", - "areYouSureYouWantTo": "你確定要{{action}}此帳戶嗎?", - "enable": "啟用", - "disable": "停用", - "thisWillPreventTheAccountFromBeingUsed": "該帳戶將不會繼續從 IMAP 伺服器同步資料,但已有資料仍然可以查詢。", - "disabled": "已停用", - "useDangerous": "信任任意 TLS 憑證", - "useDangerousDescription": "僅當你連線的 IMAP 伺服器使用公開根憑證或自簽憑證,且系統無法驗證該憑證時才啟用此選項。本選項會略過標準憑證驗證流程,可能導致中間人攻擊等安全風險 — 請確認你了解並接受這些風險後再啟用。" + "trigger": "觸發方式" + }, + "tabs": { + "active_session": "目前任務", + "errors": "錯誤", + "folders": "郵件夾", + "global_errors": "全域錯誤", + "history": "歷史記錄" + } }, - "mailbox": { - "deleteMailboxDialog": { - "title": "刪除郵箱資料夾", - "desc": "您確定要刪除此郵箱資料夾嗎?此操作無法撤銷。", - "warningTitle": "警告", - "warningDesc": "刪除此資料夾將永久移除其中包含的所有歸檔郵件及子資料夾。", - "confirm": "永久刪除", - "successTitle": "刪除成功", - "successDesc": "郵箱資料夾及其內容已被成功移除。", - "errorTitle": "刪除失敗" - }, - "title": "信箱", - "folders": "資料夾", - "messages": "訊息", - "noMessages": "無訊息", - "selectFolder": "選擇資料夾以檢視訊息", - "deleteDialog": { - "title": "刪除郵件", - "desc": "確定要刪除{{countText}}嗎?此操作將從本地資料庫中永久移除選取的郵件,且無法復原。", - "descCountSingle": "此郵件", - "descCountMultiple": "這 {{count}} 封郵件", - "warningTitle": "警告!", - "warningDesc": "在繼續之前請注意。", - "confirm": "刪除", - "successTitle": "訊息已成功刪除", - "successDesc": "訊息已刪除。", - "errorTitle": "訊息刪除失敗" - }, - "thread": { - "title": "串流 ({{count}} 則{{messageLabel}})", - "message": "訊息", - "messages": "訊息", - "noSubject": "(無主旨)", - "invalidDate": "無效日期", - "empty": "此串流中沒有訊息。", - "loadError": "載入串流失敗", - "loadingMore": "正在載入更多...", - "loadMore": "載入更多" - }, - "bulkActions": { - "ariaLabel": "對選取的 {{count}} 則{{emailLabel}}執行批次操作", - "email": "郵件", - "emails": "郵件", - "selected": "已選取", - "clearSelection": "清除選取", - "clearSelectionWithKey": "清除選取 ({{key}})", - "delete": "刪除", - "deleteTooltip": "刪除選取的郵件" - } + "saveChanges": "儲存變更", + "selectAtLeastOneFolder": "請至少選擇一個資料夾", + "selectAuthMethod": "選擇驗證方法", + "selectDate": "選擇日期", + "selectEncryptionMethod": "選擇加密方法", + "selectMailboxes": "選擇郵件夾", + "selectMode": "選擇過濾模式", + "selectProxy": "選擇代理", + "selectUnit": "選擇單位", + "selectedMailboxes": "已選擇的郵件夾", + "serverConfiguration": "伺服器設定 (IMAP)", + "since": "自", + "sinceFixed": "自特定日期起", + "sinceRelative": "僅下載最近郵件", + "sinceRelativeValue": "下載最近一段時期的郵件", + "state": "狀態", + "status": "狀態", + "step": "步驟 {{index}}", + "steps": { + "complete": "完成", + "emailAddress": "電子郵件地址", + "imap": "IMAP", + "summary": "摘要", + "syncPreferences": "同步偏好設定" }, - "search": { - "size": "大小", - "any": "不限", - "tiny": "很小(<15 KB)", - "small": "小(<2 MB)", - "medium": "中(2 - 10 MB)", - "large": "大(10 - 20 MB)", - "huge": "極大 (≥20 MB)", - "sort": "排序", - "sizeDescription": "大小指的是整封郵件的大小,包含附件。", - "title": "搜尋", - "searching": "正在搜尋,請稍候...", - "noEmailsFound": "找不到任何郵件", - "startSearching": "開始使用關鍵字、寄件人或進階篩選條件進行搜尋。", - "adjustSearch": "請嘗試調整您的搜尋條件或清除篩選條件。", - "tagFilter": "標籤篩選", - "from": "寄件人", - "to": "收件人", - "subject": "主旨", - "date": "日期", - "editTag": "編輯標籤", - "keyword": "關鍵字", - "sender": "寄件人", - "recipient": "收件人", - "hasAttachment": "有附件", - "yes": "是", - "no": "否", - "dateRange": "日期範圍", - "startDate": "開始日期", - "endDate": "結束日期", - "advancedFilters": "進階篩選", - "searchArchivedEmails": "搜尋已封存郵件", - "fullTextMultiAccount": "全文搜尋、多帳號、進階篩選", - "account": "帳號", - "mailbox": "信箱", - "selectAccount": "選擇帳號", - "selectMailbox": "選擇信箱", - "noActiveEmailAccount": "沒有啟用的電子郵件帳號。", - "addEmailAccount": "新增電子郵件帳號", - "noMailboxSelectAccount": "沒有信箱,請先選擇一個帳號。", - "searchInSubjectBody": "在主旨、內文或附件名字中搜尋...", - "searchingButton": "正在搜尋...", - "searchButton": "搜尋", - "advanced": "進階", - "clear": "清除", - "since": "自:", - "before": "前於:", - "selectDate": "選擇日期", - "pleaseSelectAtLeastOne": "請至少選擇一個搜尋條件", - "cc": "副本 (CC)", - "bcc": "密件副本 (BCC)", - "attachmentName": "附件名稱", - "messageId": "訊息 ID", - "minSize": "最小大小", - "maxSize": "最大大小", - "senderRecipients": "寄件人 / 收件人", - "attachmentsSize": "附件與大小", - "minimumBytes": "最小 (位元組)", - "maximumBytes": "最大 (位元組)", - "originalMessageIdHeader": "原始郵件的 Message-ID 標頭", - "addTags": { - "title": "編輯標籤", - "none": "尚未新增標籤", - "searchPlaceholder": "搜尋或建立標籤...", - "createHint": "建立新標籤:{{tag}}", - "invalidTitle": "無效標籤", - "updatedTitle": "標籤已更新", - "updatedDesc": "標籤已成功更新", - "updateFailedTitle": "更新失敗", - "tryAgain": "請稍後再試", - "selectedCount": "已選取 {{count}} 個標籤", - "cancel": "取消", - "save": "儲存", - "saving": "正在儲存..." - }, - "updateTags": { - "overwriteWarning": "警告:此操作將覆蓋所選項目的所有現有標籤。", - "title": "更新標籤", - "none": "未選擇標籤", - "searchPlaceholder": "搜尋或建立新標籤...", - "createHint": "按 Enter 鍵建立新標籤:\"{{tag}}\"", - "selectedCount": "將套用 {{count}} 個標籤", - "cancel": "取消", - "invalidTitle": "標籤無效", - "updatedTitle": "標籤已更新", - "updatedDesc": "標籤已成功更新。", - "updateFailedTitle": "更新失敗", - "tryAgain": "請稍後再試。", - "actionAdd": "新增", - "actionRemove": "移除", - "actionOverwrite": "覆蓋", - "submitAdd": "新增標籤", - "submitRemove": "移除標籤", - "submitOverwrite": "覆蓋標籤", - "savingAdd": "正在新增...", - "savingRemove": "正在移除...", - "savingOverwrite": "正在覆蓋..." - }, - "thread": { - "title": "串流 · {{count}} 則訊息", - "error": "載入串流失敗", - "empty": "此串流中沒有訊息", - "invalidDate": "無效日期", - "noSubject": "(無主旨)", - "loadingMore": "載入中...", - "loadMore": "載入更多" - }, - "bulkActions": { - "ariaLabel": "已選擇 {{count}} 條訊息。批量操作工具列", - "delete": "刪除", - "deleteDesc": "刪除選中的訊息", - "selected": "已選擇 {{count}} 項", - "clear": "清除選取", - "manageTags": "管理標籤" - }, - "delete": { - "title": "刪除訊息", - "confirmPrefix": "確認要刪除", - "countLabel": "{{count}} 條訊息嗎?", - "confirmDetail": "此操作無法復原。", - "confirmButton": "刪除", - "warningTitle": "警告", - "warningDesc": "刪除的訊息將被永久移除,無法恢復。", - "successTitle": "訊息已刪除", - "successDesc": "選定的訊息已成功刪除。", - "errorTitle": "刪除失敗" - } + "submit": "送出", + "syncAfterDate": "同步設定日期之後的資料", + "syncRecentData": "隨著時間推移調整同步日期,僅同步最新資料", + "syncStartDateDescription": "定義同步的起始日期(固定日期或相對於現在的日期)。早於此日期的郵件將被排除。{{fixedPart}}。", + "theAccountHasNotCompletedTheAuthorizationProcess": "此帳號尚未完成授權程序。", + "thisAccountIsUsedForIdentificationPurposesOnly": "此帳號僅用於識別目的,不需要與郵件伺服器同步。有助於匯入郵件資料。", + "thisWillPreventTheAccountFromBeingUsed": "該帳戶將不會繼續從 IMAP 伺服器同步資料,但已有資料仍然可以查詢。", + "title": "郵件帳號", + "toAuthorizeTheAccount": "以授權帳號。", + "type": "類型", + "unit": "單位", + "updateAccount": "更新帳號", + "updateFailed": "更新失敗,請稍後再試。", + "updateTheEmailAccountHere": "在此更新電子郵件帳號。", + "updatedAt": "更新時間", + "useDangerous": "信任任意 TLS 憑證", + "useDangerousDescription": "僅當你連線的 IMAP 伺服器使用公開根憑證或自簽憑證,且系統無法驗證該憑證時才啟用此選項。本選項會略過標準憑證驗證流程,可能導致中間人攻擊等安全風險 — 請確認你了解並接受這些風險後再啟用。", + "useNoProxy": "不使用代理", + "useProxy": "使用代理", + "useProxyField": "使用代理", + "value": "值", + "viewDetails": "檢視詳細資訊", + "years": "年" + }, + "apiDocs": { + "choosePreferredType": "選擇您偏好的 API 文件類型", + "downloadSpecYAML": "下載規格 YAML", + "openAPIExplorer": "OpenAPI Explorer", + "reDoc": "ReDoc", + "scalar": "Scalar", + "swaggerUI": "Swagger UI" + }, + "apiTokens": { + "deleteDialog": { + "cancel": "取消", + "confirm": "刪除", + "deleting": "正在刪除...", + "description": "此操作無法撤銷。任何使用此權杖的應用程式將立即失去存取權限。", + "title": "刪除存取權杖?" }, - "mail": { - "emailViewer": "郵件檢視器", - "noMessageSelected": "未選取任何訊息", - "account": "帳號", - "from": "寄件人", - "to": "收件人", - "subject": "主旨", - "date": "日期", - "tags": "標籤", - "noTagsYet": "尚無標籤", - "id": "ID", - "cc": "副本 (CC)", - "bcc": "密件副本 (BCC)", - "attachments": "附件", - "download": "下載", - "delete": "刪除", - "viewThread": "檢視串流", - "downloadStarted": "已開始下載", - "downloadComplete": "下載完成", - "downloadFailed": "下載失敗", - "failedToDownloadFile": "檔案下載失敗", - "failedToLoadEmail": "載入電子郵件訊息失敗。", - "isBeingDownloaded": "正在下載 {{id}}", - "downloaded": "已下載 {{id}}", - "showLess": "顯示較少", - "showMore": "顯示更多...", - "onlyNonInlineAttachments": "此處僅顯示非內嵌附件。", - "noAttachments": "無附件" + "dialog": { + "createTitle": "建立存取權杖", + "description": "完成後點擊儲存。", + "editTitle": "編輯存取權杖", + "save": "儲存", + "saveChanges": "儲存修改" }, - "oauth2": { - "title": "OAuth2", - "addConfiguration": "新增設定", - "id": "ID", - "provider": "服務供應商", - "clientId": "客戶端 ID (Client ID)", - "clientSecret": "客戶端密鑰 (Client Secret)", - "redirectUri": "重新導向 URI", - "scopes": "範圍 (Scopes)", - "status": "狀態", - "enabled": "已啟用", - "disabled": "已停用", - "edit": "編輯", - "delete": "刪除", - "enable": "啟用", - "disable": "停用", - "noConfigurations": "沒有 OAuth2 設定", - "noConfigurationsDesc": "您尚未新增任何 OAuth2 設定。請新增設定以使用功能。", - "description": "自動處理存取權杖的取得、儲存和更新,確保驗證體驗順暢且隨時可用。", - "addNew": "新增", - "updateHere": "在此更新。", - "createNewHere": "在此建立新的。", - "clickSaveWhenDone": "完成後點擊「儲存」。", - "quickPresets": "快速預設:", - "gmail": "Gmail", - "outlook": "Outlook", - "whenDisabled": "停用時:- 新的授權流程將立即被拒絕 - 現有的存取和更新權杖將在 1 分鐘內被撤銷 - 重新啟用時,使用者將需要重新授權", - "clientIdLabel": "客戶端 ID:", - "enterYourClientId": "輸入您的客戶端 ID", - "theUniqueIdentifierForYourApplication": "由 OAuth 服務供應商提供給您的應用程式的唯一識別碼。", - "clientSecretLabel": "客戶端密鑰:", - "leaveEmptyToKeepExistingSecret": "保留現有密鑰請留空", - "enterYourClientSecret": "輸入您的客戶端密鑰", - "leaveEmptyToKeepTheExistingSecret": "保留現有密鑰請留空。僅在變更時輸入新值。", - "aSecretKeyProvidedByTheOAuthProvider": "由 OAuth 服務供應商提供,用於驗證您的應用程式的密鑰。", - "authUrlLabel": "授權 URL:", - "enterTheAuthorizationUrl": "輸入授權 URL", - "theUrlWhereUsersWillBeRedirected": "使用者將被重新導向以進行授權的 URL。", - "tokenUrlLabel": "權杖 URL:", - "enterTheTokenUrl": "輸入權杖 URL", - "theUrlUsedToExchange": "用於將授權碼換取存取權杖的 URL。", - "redirectUrlLabel": "重新導向 URL:", - "enterYourRedirectUrl": "輸入您的重新導向 URL", - "theRedirectUrlAfterAuthorization": "授權後的重新導向 URL。必須與在 OAuth 服務供應商處註冊的 URL 相符。請使用 http://[host]:[port]/oauth2/callback (或 https://) 格式,其中 [host] 和 [port] 應與您的 RustMailer 部署相符。路徑 `/oauth2/callback` 是固定的。", - "scope": "範圍 (Scope):", - "enterTheScopeHere": "在此輸入範圍。", - "addScope": "新增範圍", - "key": "金鑰:", - "enterTheKeyHere": "在此輸入金鑰。", - "value": "值:", - "enterTheValueHere": "在此輸入值。", - "addExtraParams": "新增額外參數", - "useProxyOptional": "使用代理 (選填):", - "selectAProxy": "選擇代理", - "noProxyAvailable": "無可用代理", - "useSocks5ProxyForOAuthRequests": "如果直接存取被阻擋,則使用 SOCKS5 代理進行 OAuth 請求。", - "descriptionLabel": "描述:", - "describeThePurposeOfTheOauth2Application": "描述 OAuth2 應用程式的目的", - "optional": "選填", - "saving": "正在儲存...", - "creating": "正在建立...", - "saveChanges": "儲存變更", - "save": "儲存", - "updated": "已更新", - "created": "已建立", - "yourOAuth2ApplicationHasBeenSuccessfully": "您的 OAuth2 應用程式已成功{{action}}。", - "updateFailed": "更新失敗", - "creationFailed": "建立失敗", - "updateOrCreationFailed": "{{action}} 失敗,請稍後再試", - "clientSecretIsRequired": "客戶端密鑰為必填項", - "clientSecretCannotBeEmpty": "客戶端密鑰不可為空", - "keyIsRequired": "金鑰為必填項", - "keyCannotBeEmpty": "金鑰不可為空", - "valueIsRequired": "值為必填項", - "valueCannotBeEmpty": "值不可為空", - "descriptionMustNotExceed255Characters": "描述不得超過 255 個字元。", - "clientIdIsRequired": "客戶端 ID 為必填項", - "clientIdCannotBeEmpty": "客戶端 ID 不可為空", - "authorizationUrlIsRequired": "授權 URL 為必填項", - "authorizationUrlCannotBeEmpty": "授權 URL 不可為空", - "invalidAuthorizationUrlFormat": "授權 URL 格式無效", - "tokenUrlIsRequired": "權杖 URL 為必填項", - "tokenUrlCannotBeEmpty": "權杖 URL 不可為空", - "invalidTokenUrlFormat": "權杖 URL 格式無效", - "redirectUriIsRequired": "重新導向 URI 為必填項", - "redirectUriCannotBeEmpty": "重新導向 URI 不可為空", - "invalidRedirectUriFormat": "重新導向 URI 格式無效", - "authorizeEmailAccount": "授權電子郵件帳號", - "authorizeAnEmailAccountToStartTheOAuth2AuthorizationProcess": "授權電子郵件帳號以開始 OAuth2 授權程序。", - "loadingAccounts": "正在載入帳號...", - "selectAnAccount": "選擇一個帳號", - "noEmailAccountsRegistered": "沒有已註冊的電子郵件帳號。請建立一個。", - "pleaseCreateOne": "請建立一個。", - "createAccount": "建立帳號", - "authorize": "授權", - "getAuthorizeUrlFailed": "取得授權 URL 失敗", - "getAuthorizeUrlFailedDesc": "取得授權 URL 失敗,請稍後再試", - "oauth2ClientUpdated": "OAuth2 客戶端已更新", - "oauth2ClientHasBeenSuccessfully": "OAuth2 客戶端已成功{{action}}。", - "statusUpdateFailed": "狀態更新失敗,請稍後再試", - "disableOAuth2Client": "停用 OAuth2 客戶端", - "enableOAuth2Client": "啟用 OAuth2 客戶端", - "areYouSureYouWantTo": "您確定要{{action}}此 OAuth2 客戶端嗎?", - "thisWillPreventTheOAuth2ClientFromBeingUsed": "這將導致此 OAuth2 客戶端無法被使用。", - "deleteToken": "刪除權杖", - "areYouSureYouWantToDelete": "確定要刪除嗎", - "thisActionWillPermanentlyRemoveTheOauth2Record": "此操作將從系統中永久移除 OAuth2 紀錄,無法復原。", - "enterIdToConfirmDeletion": "請輸入 ID 以確認刪除。", - "warning": "警告!", - "pleaseBeCareful": "請小心,此操作無法復原。", - "deleteSuccess": "刪除成功", - "yourOAuth2ApplicationHasBeenSuccessfullyDeleted": "您的 OAuth2 應用程式已成功刪除。", - "oauth2DeleteFailed": "OAuth2 刪除失敗", - "deleteFailed": "刪除失敗,請稍後再試", - "actions": { - "openMenu": "開啟選單", - "edit": "編輯", - "authorize": "授權", - "delete": "刪除" - }, - "authFailed": "OAuth2 授權失敗", - "error": "錯誤", - "unknownError": "發生未知錯誤。", - "tryAgain": "重試", - "goHome": "回首頁", - "authSuccess": "OAuth2 授權成功", - "success": "成功", - "successMessage": "電子郵件帳號已透過 OAuth2 成功授權。存取權杖已儲存於系統中,並將根據需要自動更新。", - "goToAccounts": "前往帳號頁面", - "authAtatus": "OAuth2 授權狀態", - "information": "資訊", - "noStatus": "此頁面顯示 OAuth2 授權結果。目前沒有特定狀態可用,請根據需要重試。", - "backToLogin": "返回登入頁面" + "form": { + "1day": "1 天", + "30days": "30 天", + "7days": "7 天", + "errorInt": "必須為整數", + "errorMax": "最多 32 個字元", + "errorNumber": "必須為數字", + "errorPositive": "必須大於 0", + "expirationDescription": "權杖將在選定時間後自動過期。", + "expirationLabel": "有效期", + "expirationPlaceholder": "選擇有效期", + "nameDescription": "可選 · 最多 32 個字元", + "nameLabel": "名稱", + "namePlaceholder": "為該權杖起一個簡短名稱", + "never": "永久" }, - "accessTokens": { - "title": "存取權杖", - "name": "名稱", - "accounts": "帳號", - "token": "權杖", - "createdAt": "建立時間", - "expiresAt": "到期時間", - "edit": "編輯", - "delete": "刪除", - "create": "建立", - "noTokens": "無存取權杖", - "noTokensDesc": "您尚未建立任何存取權杖。請建立權杖以使用 API 功能。", - "description": "在此管理存取權杖、存取控制列表 (ACL)、IP 白名單和速率限制設定。", - "editToken": "編輯權杖", - "addNew": "新增", - "updateTheAccessTokenHere": "在此更新存取權杖。", - "createNewAccessTokenHere": "在此建立新的存取權杖。", - "selectAccounts": "選擇帳號", - "selectMultipleAccountsForTheAccessToken": "為此存取權杖選擇多個帳號作為授權範圍。", - "enterOneIpAddressPerLine": "每行輸入一個 IP 地址。例如:\n192.168.1.1\n192.168.1.2", - "aListOfIpAddressesAllowed": "允許存取資源的 IP 地址列表。每行輸入一個 IP 地址。(選填)", - "enterQuota": "輸入配額。例如:100", - "theMaximumNumberOfRequestsAllowed": "在間隔時間內允許的最大請求數。(選填)", - "enterIntervalInSeconds": "輸入間隔時間(秒)。例如:60", - "theTimeWindowForTheRateLimit": "速率限制的時間視窗(以秒為單位)。(選填)", - "describeThePurposeOfTheAccessToken": "描述存取權杖的目的", - "updating": "正在更新...", - "saving": "正在儲存...", - "creating": "正在建立...", - "saveChanges": "儲存變更", - "save": "儲存", - "updated": "已更新", - "created": "已建立", - "yourAccessTokenHasBeenSuccessfully": "您的存取權杖已成功{{action}}。", - "updateFailed": "更新失敗", - "creationFailed": "建立失敗", - "updateOrCreationFailed": "{{action}} 失敗,請稍後再試", - "quotaMustBeAPositiveInteger": "配額必須是正整數。", - "intervalMustBeAPositiveInteger": "間隔時間必須是正整數。", - "invalidIpAddressesFound": "發現無效的 IP 地址。請輸入有效的 IPv4 或 IPv6 地址。", - "atLeastOneAccountIsRequired": "至少需要一個帳號。", - "descriptionMustNotExceed255Characters": "描述不得超過 255 個字元。", - "notUsedYet": "尚未使用", - "theListOfAccountsThatCanBeQueried": "可以使用此存取權杖查詢的帳號列表。", - "accountId": "帳號 ID", - "filterByEmailAddressOrAccountId": "依電子郵件地址或帳號 ID 篩選...", - "aclRulesForAccessTokens": "存取權杖的 ACL 規則包括 IP 白名單驗證和速率限制應用。", - "actions": { - "openMenu": "開啟選單", - "edit": "編輯", - "delete": "刪除" - }, - "quota": "配額", - "interval": "間隔" + "list": { + "createdLabel": "建立於", + "deleteBtn": "刪除權杖", + "expiresOnLabel": "有效期至", + "expiresOnShort": "有效期至 {{date}}", + "lastUsedLabel": "最後使用", + "neverExpires": "永不過期", + "neverLabel": "從不", + "neverUsed": "未使用", + "statusActive": "已激活", + "statusExpired": "已過期", + "tokenLabel": "權杖", + "unnamedToken": "未命名權杖" }, - "settings": { - "appearance": { - "title": "外觀設置", - "field": { - "language": "介面语言", - "theme": "介面主題" - }, - "description": { - "language": "選擇網頁介面顯示的语言。", - "theme": "為介面選擇淺色或深色顯示模式。" - }, - "placeholder": { - "select_language": "選擇語言" - }, - "command": { - "search": "搜尋語言...", - "no_results": "未找到相關語言。" - }, - "theme": { - "light": "淺色", - "dark": "深色" - }, - "button": { - "update": "更新偏好設置" - }, - "validation": { - "language": { - "required": "請選擇一種語言。" - }, - "theme": { - "required": "請選擇一個主題。" - } - } - }, - "title": "設定", - "general": "一般", - "proxy": "代理", - "name": "名稱", - "host": "主機", - "port": "連接埠", - "username": "使用者名稱", - "password": "密碼", - "type": "類型", - "actions": "操作", - "edit": "編輯", - "delete": "刪除", - "add": "新增", - "noProxies": "無代理設定", - "noProxiesDesc": "您尚未新增任何代理設定。請新增設定以使用功能。", - "root": "根目錄", - "rootTitle": "根目錄", - "rootDesc": "管理包含權杖和密碼的根目錄存取憑證。", - "rootAccessManagement": "根目錄存取管理", - "manageRootTokenAndPassword": "安全地管理根權杖和密碼。", - "resetRootToken": "重設根權杖", - "generateNewToken": "產生一個新權杖。舊權杖將立即失效。", - "reset": "重設", - "resetRootPassword": "重設根目錄密碼", - "changePasswordForFutureLogins": "變更密碼以供未來登入使用。", - "youAreAboutToResetTheRootToken": "您即將重設根權杖。此操作無法復原。", - "confirmReset": "確認重設", - "youAreAboutToResetTheRootPassword": "您即將重設根目錄密碼。請安全保管。", - "enterNewRootPassword": "輸入新的根目錄密碼", - "theRootTokenHasBeenReset": "根權杖已重設", - "yourLoginInformationHasBeenUpdated": "您的登入資訊已更新。您無需再次登入。", - "invalidPassword": "密碼無效", - "rootPasswordMustBeAtLeast6Characters": "根目錄密碼必須至少為 6 個字元。", - "theRootPasswordHasBeenReset": "根目錄密碼已重設", - "useNewPasswordForNextLogin": "下次登入時請使用新密碼。", - "failedToCopyText": "複製文字失敗", - "filterProxy": "篩選代理...", - "filterOauth2": "篩選 OAuth2...", - "filterAccount": "篩選帳號...", - "filterAccessToken": "篩選存取權杖...", - "selectAll": "全選", - "theme": "佈景主題", - "id": "ID", - "url": "網址", - "createdAt": "建立時間", - "updatedAt": "更新時間", - "enabled": "啟用", - "useProxy": "使用代理", - "authUrl": "授權 URL", - "tokenUrl": "權杖 URL", - "description": "描述", - "token": "權杖", - "accounts": "帳號", - "acl": "ACL", - "lastAccess": "上次存取", - "enterProxyIdToConfirmDeletion": "請輸入代理 ID 以確認刪除。", - "updateTheProxyHere": "在此更新代理。", - "addNewProxyHere": "在此新增代理。", - "pleaseUseAnIpAddressForBetterReliability": "為了提高可靠性,請使用 IP 地址(例如:127.0.0.1),而非主機名稱或網域。", - "adding": "正在新增...", - "yourProxyHasBeenSuccessfully": "您的代理已成功{{action}}。", - "proxyUpdateOrAddFailed": "{{action}} 失敗,請稍後再試", - "sidebar": { - "profile": "個人資料", - "apiTokens": "API 權杖", - "proxy": "網路代理", - "configurations": "系統配置" - }, - "profile": { - "loadError": "無法載入使用者資訊。", - "uploadTitle": "上傳頭像", - "maxSize": "最大 {{size}}", - "avatarAlt": "頭像", - "removeAvatar": "移除頭像", - "uploadError": "檔案上傳錯誤", - "field": { - "username": "使用者名稱", - "email": "電子郵件", - "password": "密碼" - }, - "placeholder": { - "password_keep": "留空以保留目前的密碼" - }, - "button": { - "update_profile": "更新個人資料", - "permissions": "權限", - "view_global_permissions": "查看全域權限" - }, - "section": { - "roles": "角色", - "accounts": "已連結 {{count}} 個帳戶" - }, - "account": { - "id": "帳戶 ID:{{id}}" - }, - "toast": { - "updated": "個人資料更新成功", - "update_failed": "更新個人資料失敗" - }, - "validation": { - "username": { - "required": "必須填寫使用者名稱", - "min": "使用者名稱至少需要 5 個字元", - "max": "使用者名稱最多 32 個字元" - }, - "email": { - "required": "必須填寫電子郵件", - "invalid": "請輸入有效的電子郵件地址" - }, - "password": { - "min": "密碼至少需要 8 個字元", - "max": "密碼最多 256 個字元" - } - } - } + "notifications": { + "close": "關閉", + "copied": "已複製到剪貼簿", + "createFailed": "建立失敗", + "createSuccess": "權杖已建立", + "createSuccessDesc": "存取權杖已成功建立。", + "deleteFailed": "刪除失敗", + "deleteSuccess": "權杖已刪除", + "genericError": "操作失敗,請重試。", + "tryAgain": "重試", + "updateFailed": "更新失敗", + "updateSuccess": "權杖已更新", + "updateSuccessDesc": "存取權杖已成功更新。" }, - "apiDocs": { - "choosePreferredType": "選擇您偏好的 API 文件類型", - "swaggerUI": "Swagger UI", - "reDoc": "ReDoc", - "openAPIExplorer": "OpenAPI Explorer", - "scalar": "Scalar", - "downloadSpecYAML": "下載規格 YAML" + "page": { + "addBtn": "添加權杖", + "emptyDescription": "您尚未建立任何 API 權杖。點擊下方按鈕建立一個。", + "emptyTitle": "無 API 權杖", + "loadError": "載入 API 權杖失敗。" + } + }, + "attachment": { + "all_fields_desc": "匹配附件名稱、郵件主題和發件人", + "date": "日期", + "name": "檔案名稱", + "search_input_placeholder": "搜尋附件(使用 \" \" 進行短語搜尋)", + "sender": "寄件人", + "sender_with_count": "寄件人 ({{count}})", + "size": "檔案大小", + "source": "來源", + "subject": "主旨" + }, + "auth": { + "areYouSureYouWantToLogOut": "確定要登出嗎?", + "invalidPassword": "密碼無效,請再試一次。", + "login": "登入", + "loginFailed": "登入失敗", + "logout": "登出", + "password": "密碼", + "sessionExpired": "連線逾時!", + "sessionExpiredDesc": "由於閒置過久,您的連線已終止。請重新登入以繼續。", + "somethingWentWrong": "發生錯誤", + "username": "使用者名稱", + "welcome": "歡迎使用 Bichon", + "youWillNeedToLogInAgain": "您將需要再次登入才能存取您的帳號。" + }, + "command": { + "dark": "深色", + "light": "淺色", + "noResultsFound": "找不到任何結果。", + "theme": "佈景主題", + "typeCommandOrSearch": "輸入指令或搜尋..." + }, + "common": { + "actions": "操作", + "add": "新增", + "all": "全部", + "apply": "套用", + "back": "返回", + "backToHome": "返回首頁", + "cancel": "取消", + "clear": "清除", + "close": "關閉", + "confirm": "確認", + "create": "建立", + "delete": "刪除", + "deleting": "正在刪除...", + "deselectAll": "取消全選", + "edit": "編輯", + "empty": "空", + "error": "錯誤", + "failed": "失敗", + "filter": "篩選", + "goBack": "返回", + "loading": "載入中...", + "more": "更多", + "na": "無", + "no": "否", + "noData": "無數據", + "none": "無", + "notFound": "未找到", + "ok": "確定", + "op_failed": "操作失敗", + "project_description": "Bichon 是一個開源項目。", + "remove": "移除", + "reset": "重置", + "retry": "重試", + "save": "儲存", + "save_changes": "儲存修改", + "search": "搜尋", + "select": "選擇", + "selectAll": "全選", + "showLess": "顯示更少", + "showMore": "顯示更多...", + "submit": "提交", + "table": { + "noResults": "無結果。" }, - "dialogs": { - "confirmDelete": "確認刪除", - "confirmDeleteDesc": "您確定要刪除此項目嗎?此操作無法復原。", - "deleteSuccess": "刪除成功", - "deleteFailed": "刪除失敗", - "saveSuccess": "儲存成功", - "saveFailed": "儲存失敗", - "createSuccess": "建立成功", - "createFailed": "建立失敗", - "updateSuccess": "更新成功", - "updateFailed": "更新失敗", - "continue": "繼續", - "deleting": "正在刪除...", - "accountDeleted": "帳號已刪除", - "accountDeletedDesc": "帳號已成功刪除。", - "accountDeleteFailed": "帳號刪除失敗", - "deleteAccountPermanently": "永久刪除帳號", - "youAreDeleting": "您正在刪除 {{email}}。這將永久移除:", - "accountCredentials": "帳號憑證和設定", - "localCachedMetadata": "本地快取的中繼資料和同步狀態", - "imapSyncData": "IMAP 同步資料", - "oauthTokens": "OAuth 權杖和 API 憑證", - "typeEmailToConfirm": "請輸入帳號的電子郵件地址以確認:", - "typeToConfirm": "請輸入「{{email}}」以確認", - "cannotBeUndone": "此操作無法復原!", - "allResourcesErased": "所有相關資源將被永久清除。", - "permanentlyDeleteAccount": "永久刪除帳號" + "tryAgain": "重試", + "update": "更新", + "view_on_github_button": "在 GitHub 上查看", + "yes": "是" + }, + "dashboard": { + "account": "帳號", + "actualDiskUsage": "實際磁碟用量", + "attachmentRatio": "附件比例", + "attachmentRatioDesc": "{{percent}}% 的郵件包含附件", + "attachments": "附件", + "byMessageCount": "依郵件數量", + "byMessageSize": "依郵件大小", + "connected": "已連線", + "count": "數量", + "dataStorage": "資料儲存", + "dayTrend": "30 天趨勢", + "efficiency": "壓縮效率", + "emails": "郵件", + "indexSize": "索引體積", + "localDataFiles": "本地資料檔案", + "logicalVolume": "原始大小", + "mailAccounts": "郵件帳號", + "messageDistribution": "訊息分佈", + "metadataSize": "元數據大小", + "newEmails": "新郵件", + "noAccountData": "無帳號資料", + "noAttachments": "無附件", + "noEmailsSynced": "尚未同步任何郵件", + "noLargeEmails": "無大容量郵件", + "noRecentActivity": "無近期活動", + "noSendersData": "無寄件人資料", + "noSubject": "(無主旨)", + "saved": "節省空間", + "sender": "寄件人", + "size": "大小", + "subject": "主旨", + "syncedLocally": "本地同步數量", + "systemVersion": "系統版本", + "tantivyDatabase": "基于 Tantivy 搜索引擎", + "title": "儀表板", + "top10Accounts": "前 10 名帳號", + "top10LargestEmails": "前 10 封最大郵件", + "top10Senders": "前 10 名寄件人", + "topLists": "排行榜", + "totalEmailSize": "郵件總容量", + "totalEmails": "郵件總數", + "withAttachments": "包含附件" + }, + "dialogs": { + "accountCredentials": "帳號憑證和設定", + "accountDeleteFailed": "帳號刪除失敗", + "accountDeleted": "帳號已刪除", + "accountDeletedDesc": "帳號已成功刪除。", + "allResourcesErased": "所有相關資源將被永久清除。", + "cannotBeUndone": "此操作無法復原!", + "confirmDelete": "確認刪除", + "confirmDeleteDesc": "您確定要刪除此項目嗎?此操作無法復原。", + "continue": "繼續", + "createFailed": "建立失敗", + "createSuccess": "建立成功", + "deleteAccountPermanently": "永久刪除帳號", + "deleteFailed": "刪除失敗", + "deleteSuccess": "刪除成功", + "deleting": "正在刪除...", + "imapSyncData": "IMAP 同步資料", + "localCachedMetadata": "本地快取的中繼資料和同步狀態", + "oauthTokens": "OAuth 權杖和 API 憑證", + "permanentlyDeleteAccount": "永久刪除帳號", + "saveFailed": "儲存失敗", + "saveSuccess": "儲存成功", + "typeEmailToConfirm": "請輸入帳號的電子郵件地址以確認:", + "typeToConfirm": "請輸入「{{email}}」以確認", + "updateFailed": "更新失敗", + "updateSuccess": "更新成功", + "youAreDeleting": "您正在刪除 {{email}}。這將永久移除:" + }, + "errors": { + "contentNotModified": "內容未變更!", + "forbidden": "禁止存取", + "forbiddenDesc": "您沒有檢視此資源所需的權限。", + "forbiddenTitle": "拒絕存取", + "internalServerError": "內部伺服器錯誤!", + "learnMore": "瞭解更多", + "maintenance": "系統維護中", + "maintenanceDesc": "網站目前無法使用。我們將很快恢復服務。", + "maintenanceTitle": "網站正在維護中!", + "networkError": "網路錯誤", + "networkErrorDesc": "無法連線到伺服器。請檢查您的網路連線並重試。", + "pageNotFound": "糟糕!找不到頁面!", + "pageNotFoundDesc": "您要尋找的頁面可能不存在或已被刪除。", + "somethingWentWrong": "糟糕!發生錯誤 :')", + "somethingWentWrongDesc": "很抱歉造成不便,請稍後再試。", + "unauthorized": "未經授權", + "unauthorizedDesc": "請使用正確的憑證登入,以存取此資源。", + "unauthorizedTitle": "無權存取" + }, + "mail": { + "account": "帳號", + "attachments": "附件", + "bcc": "密件副本 (BCC)", + "cc": "副本 (CC)", + "date": "日期", + "delete": "刪除", + "download": "下載", + "downloadComplete": "下載完成", + "downloadFailed": "下載失敗", + "downloadStarted": "已開始下載", + "downloaded": "已下載 {{id}}", + "emailViewer": "郵件檢視器", + "failedToDownloadFile": "檔案下載失敗", + "failedToLoadEmail": "載入電子郵件訊息失敗。", + "from": "寄件人", + "id": "ID", + "isBeingDownloaded": "正在下載 {{id}}", + "noAttachments": "無附件", + "noMessageSelected": "未選取任何訊息", + "noTagsYet": "尚無標籤", + "onlyNonInlineAttachments": "此處僅顯示非內嵌附件。", + "showLess": "顯示較少", + "showMore": "顯示更多...", + "subject": "主旨", + "tags": "標籤", + "to": "收件人", + "viewThread": "檢視串流" + }, + "mailbox": { + "bulkActions": { + "ariaLabel": "對選取的 {{count}} 則{{emailLabel}}執行批次操作", + "clearSelection": "清除選取", + "clearSelectionWithKey": "清除選取 ({{key}})", + "delete": "刪除", + "deleteTooltip": "刪除選取的郵件", + "email": "郵件", + "emails": "郵件", + "selected": "已選取" }, - "command": { - "typeCommandOrSearch": "輸入指令或搜尋...", - "noResultsFound": "找不到任何結果。", - "theme": "佈景主題", - "light": "淺色", - "dark": "深色" + "deleteDialog": { + "confirm": "刪除", + "desc": "確定要刪除{{countText}}嗎?此操作將從本地資料庫中永久移除選取的郵件,且無法復原。", + "descCountMultiple": "這 {{count}} 封郵件", + "descCountSingle": "此郵件", + "errorTitle": "訊息刪除失敗", + "successDesc": "訊息已刪除。", + "successTitle": "訊息已成功刪除", + "title": "刪除郵件", + "warningDesc": "在繼續之前請注意。", + "warningTitle": "警告!" + }, + "deleteMailboxDialog": { + "confirm": "永久刪除", + "desc": "您確定要刪除此郵箱資料夾嗎?此操作無法撤銷。", + "errorTitle": "刪除失敗", + "successDesc": "郵箱資料夾及其內容已被成功移除。", + "successTitle": "刪除成功", + "title": "刪除郵箱資料夾", + "warningDesc": "刪除此資料夾將永久移除其中包含的所有歸檔郵件及子資料夾。", + "warningTitle": "警告" + }, + "folders": "資料夾", + "messages": "訊息", + "noMessages": "無訊息", + "selectFolder": "選擇資料夾以檢視訊息", + "thread": { + "empty": "此串流中沒有訊息。", + "invalidDate": "無效日期", + "loadError": "載入串流失敗", + "loadMore": "載入更多", + "loadingMore": "正在載入更多...", + "message": "訊息", + "messages": "訊息", + "noSubject": "(無主旨)", + "title": "串流 ({{count}} 則{{messageLabel}})" + }, + "title": "信箱" + }, + "navigation": { + "accessTokens": "存取權杖", + "accounts": "帳號", + "apiDocs": "API文件", + "attachment": "附件", + "auth": "驗證", + "dashboard": "儀表板", + "general": "一般", + "home": "首頁", + "mailbox": "信箱", + "oauth2": "OAuth2", + "other": "其他", + "settings": "設定", + "users": "系統使用者" + }, + "oauth2": { + "aSecretKeyProvidedByTheOAuthProvider": "由 OAuth 服務供應商提供,用於驗證您的應用程式的密鑰。", + "actions": { + "authorize": "授權", + "delete": "刪除", + "edit": "編輯", + "openMenu": "開啟選單" + }, + "addConfiguration": "新增設定", + "addExtraParams": "新增額外參數", + "addNew": "新增", + "addScope": "新增範圍", + "areYouSureYouWantTo": "您確定要{{action}}此 OAuth2 客戶端嗎?", + "areYouSureYouWantToDelete": "確定要刪除嗎", + "authAtatus": "OAuth2 授權狀態", + "authFailed": "OAuth2 授權失敗", + "authSuccess": "OAuth2 授權成功", + "authUrlLabel": "授權 URL:", + "authorizationUrlCannotBeEmpty": "授權 URL 不可為空", + "authorizationUrlIsRequired": "授權 URL 為必填項", + "authorize": "授權", + "authorizeAnEmailAccountToStartTheOAuth2AuthorizationProcess": "授權電子郵件帳號以開始 OAuth2 授權程序。", + "authorizeEmailAccount": "授權電子郵件帳號", + "backToLogin": "返回登入頁面", + "clickSaveWhenDone": "完成後點擊「儲存」。", + "clientId": "客戶端 ID (Client ID)", + "clientIdCannotBeEmpty": "客戶端 ID 不可為空", + "clientIdIsRequired": "客戶端 ID 為必填項", + "clientIdLabel": "客戶端 ID:", + "clientSecret": "客戶端密鑰 (Client Secret)", + "clientSecretCannotBeEmpty": "客戶端密鑰不可為空", + "clientSecretIsRequired": "客戶端密鑰為必填項", + "clientSecretLabel": "客戶端密鑰:", + "createAccount": "建立帳號", + "createNewHere": "在此建立新的。", + "created": "已建立", + "creating": "正在建立...", + "creationFailed": "建立失敗", + "delete": "刪除", + "deleteFailed": "刪除失敗,請稍後再試", + "deleteSuccess": "刪除成功", + "deleteToken": "刪除權杖", + "describeThePurposeOfTheOauth2Application": "描述 OAuth2 應用程式的目的", + "description": "自動處理存取權杖的取得、儲存和更新,確保驗證體驗順暢且隨時可用。", + "descriptionLabel": "描述:", + "descriptionMustNotExceed255Characters": "描述不得超過 255 個字元。", + "disable": "停用", + "disableOAuth2Client": "停用 OAuth2 客戶端", + "disabled": "已停用", + "edit": "編輯", + "enable": "啟用", + "enableOAuth2Client": "啟用 OAuth2 客戶端", + "enabled": "已啟用", + "enterIdToConfirmDeletion": "請輸入 ID 以確認刪除。", + "enterTheAuthorizationUrl": "輸入授權 URL", + "enterTheKeyHere": "在此輸入金鑰。", + "enterTheScopeHere": "在此輸入範圍。", + "enterTheTokenUrl": "輸入權杖 URL", + "enterTheValueHere": "在此輸入值。", + "enterYourClientId": "輸入您的客戶端 ID", + "enterYourClientSecret": "輸入您的客戶端密鑰", + "enterYourRedirectUrl": "輸入您的重新導向 URL", + "error": "錯誤", + "getAuthorizeUrlFailed": "取得授權 URL 失敗", + "getAuthorizeUrlFailedDesc": "取得授權 URL 失敗,請稍後再試", + "gmail": "Gmail", + "goHome": "回首頁", + "goToAccounts": "前往帳號頁面", + "id": "ID", + "information": "資訊", + "invalidAuthorizationUrlFormat": "授權 URL 格式無效", + "invalidRedirectUriFormat": "重新導向 URI 格式無效", + "invalidTokenUrlFormat": "權杖 URL 格式無效", + "key": "金鑰:", + "keyCannotBeEmpty": "金鑰不可為空", + "keyIsRequired": "金鑰為必填項", + "leaveEmptyToKeepExistingSecret": "保留現有密鑰請留空", + "leaveEmptyToKeepTheExistingSecret": "保留現有密鑰請留空。僅在變更時輸入新值。", + "loadingAccounts": "正在載入帳號...", + "noConfigurations": "沒有 OAuth2 設定", + "noConfigurationsDesc": "您尚未新增任何 OAuth2 設定。請新增設定以使用功能。", + "noEmailAccountsRegistered": "沒有已註冊的電子郵件帳號。請建立一個。", + "noProxyAvailable": "無可用代理", + "noStatus": "此頁面顯示 OAuth2 授權結果。目前沒有特定狀態可用,請根據需要重試。", + "oauth2ClientHasBeenSuccessfully": "OAuth2 客戶端已成功{{action}}。", + "oauth2ClientUpdated": "OAuth2 客戶端已更新", + "oauth2DeleteFailed": "OAuth2 刪除失敗", + "optional": "選填", + "outlook": "Outlook", + "pleaseBeCareful": "請小心,此操作無法復原。", + "pleaseCreateOne": "請建立一個。", + "provider": "服務供應商", + "quickPresets": "快速預設:", + "redirectUri": "重新導向 URI", + "redirectUriCannotBeEmpty": "重新導向 URI 不可為空", + "redirectUriIsRequired": "重新導向 URI 為必填項", + "redirectUrlLabel": "重新導向 URL:", + "save": "儲存", + "saveChanges": "儲存變更", + "saving": "正在儲存...", + "scope": "範圍 (Scope):", + "scopes": "範圍 (Scopes)", + "selectAProxy": "選擇代理", + "selectAnAccount": "選擇一個帳號", + "status": "狀態", + "statusUpdateFailed": "狀態更新失敗,請稍後再試", + "success": "成功", + "successMessage": "電子郵件帳號已透過 OAuth2 成功授權。存取權杖已儲存於系統中,並將根據需要自動更新。", + "theRedirectUrlAfterAuthorization": "授權後的重新導向 URL。必須與在 OAuth 服務供應商處註冊的 URL 相符。請使用 http://[host]:[port]/oauth2/callback (或 https://) 格式,其中 [host] 和 [port] 應與您的 RustMailer 部署相符。路徑 `/oauth2/callback` 是固定的。", + "theUniqueIdentifierForYourApplication": "由 OAuth 服務供應商提供給您的應用程式的唯一識別碼。", + "theUrlUsedToExchange": "用於將授權碼換取存取權杖的 URL。", + "theUrlWhereUsersWillBeRedirected": "使用者將被重新導向以進行授權的 URL。", + "thisActionWillPermanentlyRemoveTheOauth2Record": "此操作將從系統中永久移除 OAuth2 紀錄,無法復原。", + "thisWillPreventTheOAuth2ClientFromBeingUsed": "這將導致此 OAuth2 客戶端無法被使用。", + "title": "OAuth2", + "tokenUrlCannotBeEmpty": "權杖 URL 不可為空", + "tokenUrlIsRequired": "權杖 URL 為必填項", + "tokenUrlLabel": "權杖 URL:", + "tryAgain": "重試", + "unknownError": "發生未知錯誤。", + "updateFailed": "更新失敗", + "updateHere": "在此更新。", + "updateOrCreationFailed": "{{action}} 失敗,請稍後再試", + "updated": "已更新", + "useProxyOptional": "使用代理 (選填):", + "useSocks5ProxyForOAuthRequests": "如果直接存取被阻擋,則使用 SOCKS5 代理進行 OAuth 請求。", + "value": "值:", + "valueCannotBeEmpty": "值不可為空", + "valueIsRequired": "值為必填項", + "warning": "警告!", + "whenDisabled": "停用時:- 新的授權流程將立即被拒絕 - 現有的存取和更新權杖將在 1 分鐘內被撤銷 - 重新啟用時,使用者將需要重新授權", + "yourOAuth2ApplicationHasBeenSuccessfully": "您的 OAuth2 應用程式已成功{{action}}。", + "yourOAuth2ApplicationHasBeenSuccessfullyDeleted": "您的 OAuth2 應用程式已成功刪除。" + }, + "permission": { + "account": { + "create": "建立電子郵件帳戶", + "manage": "管理指派的帳戶", + "manage_all": "管理所有帳戶設定", + "read_details": "檢視帳戶詳細資訊" + }, + "category": { + "account": "帳戶權限", + "global_data": "全域資料(管理員)", + "system_identity": "系統與身分" + }, + "data": { + "delete": "刪除指派帳戶的郵件", + "delete_all": "刪除所有帳戶的郵件", + "export_batch": "批次匯出指派帳戶的資料", + "export_batch_all": "批次匯出所有資料", + "import_batch": "批次匯入郵件資料", + "manage": "管理指派帳戶的郵件中繼資料", + "manage_all": "管理所有郵件中繼資料", + "raw_download": "下載指派帳戶的原始郵件", + "raw_download_all": "下載所有原始郵件", + "read": "讀取指派帳戶的郵件資料", + "read_all": "讀取所有郵件資料", + "smtp_ingest": "透過 SMTP 協定歸檔郵件" + }, + "dialog": { + "account_description": "僅適用於所選帳戶的權限。", + "account_title": "帳戶權限", + "global_description": "授予此使用者的系統層級權限。", + "global_title": "全域權限" + }, + "scope": { + "account": "帳戶 #{{id}}", + "global": "全域" + }, + "system": { + "access": "基本系統存取", + "root": "系統最高控制權" + }, + "token": { + "manage": "管理存取權杖" + }, + "user": { + "manage": "管理所有使用者", + "view": "檢視基本使用者名稱" + } + }, + "profile": { + "avatar_alt": "頭像", + "menu": { + "profile": "個人資料", + "settings": "設定", + "sign_out": "登出" + } + }, + "proxyDelete": { + "close": "關閉", + "confirmText": "確定要刪除嗎", + "deleteBtn": "刪除", + "failedDesc": "刪除失敗,請稍後再試", + "failedTitle": "代理刪除失敗", + "permanent": "此操作將從系統中永久移除此代理。無法復原。", + "proxyIdLabel": "代理 ID:", + "proxyIdPlaceholder": "請輸入代理 ID 以確認刪除。", + "successDesc": "代理已成功刪除。", + "successTitle": "刪除成功", + "title": "刪除代理", + "tryAgain": "重試", + "warningDesc": "請小心,此操作無法復原。", + "warningTitle": "警告!" + }, + "restore_message": { + "accountsInvolved": "涉及帳戶", + "bulkTitle": "批量還原多個郵件", + "bulkWarning": "請注意:郵件將被還原至其原始存儲的資料夾中。", + "confirm": "執行還原", + "desc": "此操作將把選定的郵件從 Bichon 系統重新上傳並恢復到其在 IMAP 服務器上對應的郵箱中。", + "failed": "還原郵件失敗", + "failedTitle": "還原失敗", + "messages": "封郵件", + "restore_to_imap": "還原郵件", + "success": "郵件還原成功", + "successDesc": "選定的郵件已成功恢復到 IMAP 服務器。", + "summary": "待還原詳情", + "title": "還原單個郵件" + }, + "roles": { + "actions": { + "add": "新增角色", + "cancel": "取消", + "close": "關閉", + "failed": "操作失敗", + "retry": "重試", + "submit_create": "建立角色", + "submit_update": "更新角色", + "success_create": "角色建立成功", + "success_update": "角色更新成功" + }, + "categories": { + "account_resource": "帳戶資源存取", + "global_data": "全域數據存取", + "identity": "身份與管理" + }, + "columns": { + "created_at": "建立時間", + "id": "ID", + "name": "名稱", + "permissions": "權限", + "role_type": "角色類型", + "updated_at": "更新時間" + }, + "delete": { + "alert_desc": "刪除此角色將從所有當前分配了該角色的使用者中將其移除。在繼續之前,請確保您已檢查並重新分配受影響的使用者。", + "alert_title": "警告:此操作是永久性的。", + "confirm_btn": "刪除角色", + "confirm_label": "請鍵入角色 ID 以確認:", + "deleting": "正在刪除...", + "dialog_title": "刪除使用者角色", + "error_fallback": "無法刪除該角色,請稍後重試。", + "error_title": "刪除失敗", + "irreversible": "此操作無法撤銷。", + "placeholder": "鍵入「{{id}}」以確認", + "success_desc": "使用者角色「{{name}}」(ID: {{id}}) 已成功移除。", + "success_title": "角色已刪除", + "warning_text": "您即將永久刪除角色 {{name}} (ID: {{id}})。" + }, + "description_hint": "定義存取範圍和功能權限。", + "details": { + "close_btn": "關閉詳情視圖", + "desc_account": "單個帳戶的存取及數據操作權限。", + "desc_global": "全域管理與系統級存取權限。", + "role_badge": "{{type}} 角色", + "title": "角色權限: {{name}}", + "unknown": "未知角色", + "view_permissions": "權限詳情" + }, + "empty": { + "desc": "您尚未建立任何自定義角色。點擊下方按鈕開始新增新角色。", + "title": "未找到角色" + }, + "form": { + "builtin_badge": "內建角色", + "builtin_desc": "此角色由系統預定義。其權限為**唯讀**,無法被修改。", + "desc_label": "描述", + "matrix_label": "{{type}} 權限矩陣", + "name_label": "角色名稱", + "type_label": "角色類型" + }, + "placeholder": { + "filter": "搜尋角色..." + }, + "title": { + "create": "建立新角色", + "edit": "編輯角色: {{name}}" + }, + "types": { + "Account": "帳戶", + "Global": "全域" }, "validation": { - "required": "此欄位為必填項", - "invalidEmail": "無效的電子郵件地址", - "invalidUrl": "無效的網址", - "passwordMinLength": "密碼長度必須至少 {{min}} 個字元", - "pleaseEnterPassword": "請輸入密碼", - "passwordRequired": "如果驗證方法是密碼,則密碼為必填項", - "emailRequired": "電子郵件地址為必填項", - "imapHostRequired": "IMAP 主機為必填項", - "imapHostCannotBeEmpty": "IMAP 主機不可為空", - "imapPortMustBePositive": "IMAP 連接埠必須是正整數", - "imapPortMustBeLessThan65536": "IMAP 連接埠必須小於 65536", - "folderLimitMustBeNumber": "資料夾限制必須是數字", - "folderLimitMustBeAtLeast100": "資料夾限制必須至少為 100", - "incrementalSyncMustBeNumber": "增量同步間隔必須是數字", - "incrementalSyncMustBeAtLeast10": "增量同步間隔必須至少為 10 分鐘", - "pleaseEnterUsernameOrEmail": "請輸入您的使用者名稱或電子郵件", - "singleRequestBatchSizeMustBeNumber": "批次大小必須是數字", - "singleRequestBatchSizeTooSmall": "批次大小必須至少為10", - "singleRequestBatchSizeTooLarge": "批次大小必須最多為200" - }, - "table": { - "noResults": "查無結果", - "loading": "載入中...", - "page": "第", - "of": "頁,共", - "rowsPerPage": "每頁行數", - "showing": "顯示", - "to": "至", - "results": "筆結果", - "asc": "升冪", - "desc": "降冪", - "hide": "隱藏", - "edit": "編輯", - "delete": "刪除", - "pagination": { - "selected": "已選擇 {{selected}} / {{total}} 行。", - "fixed_page_size": "每頁 {{size}} 行。", - "rows_per_page": "每頁行數", - "page_info": "第 {{page}} 頁,共 {{total}} 頁", - "first": "跳轉到第一頁", - "previous": "上一頁", - "next": "下一頁", - "last": "跳轉到最後一頁" - } - }, - "proxyDelete": { - "title": "刪除代理", - "successTitle": "刪除成功", - "successDesc": "代理已成功刪除。", - "close": "關閉", - "failedTitle": "代理刪除失敗", - "failedDesc": "刪除失敗,請稍後再試", - "tryAgain": "重試", - "confirmText": "確定要刪除嗎", - "permanent": "此操作將從系統中永久移除此代理。無法復原。", - "proxyIdLabel": "代理 ID:", - "proxyIdPlaceholder": "請輸入代理 ID 以確認刪除。", - "warningTitle": "警告!", - "warningDesc": "請小心,此操作無法復原。", - "deleteBtn": "刪除" - }, - "systemConfig": { - "pageTitle": "系統級配置", - "pageDescription": "這些參數透過 CLI 標誌或環境變數初始化。它們目前為唯讀,以確保環境一致性。", - "status": { - "enabled": "已啟用", - "disabled": "已禁用", - "configured": "已配置", - "missing": "缺失", - "auto": "自動", - "notSet": "未設置" - }, - "sections": { - "network": { - "title": "網路", - "desc": "HTTP 與公共存取" - }, - "cors": { - "title": "CORS", - "desc": "跨來源資源共用規則" - }, - "logging": { - "title": "日誌", - "desc": "日誌輸出行為" - }, - "storage": { - "title": "儲存與快取", - "desc": "資料庫路徑與限制" - }, - "security": { - "title": "安全", - "desc": "身分驗證與加密" - }, - "performance": { - "title": "效能", - "desc": "並行與壓縮" - }, - "smtp": { - "title": "SMTP 伺服器", - "desc": "內置郵件接收服務設定,用於實時歸檔" - } - } - }, - "apiTokens": { - "page": { - "loadError": "載入 API 權杖失敗。", - "emptyTitle": "無 API 權杖", - "emptyDescription": "您尚未建立任何 API 權杖。點擊下方按鈕建立一個。", - "addBtn": "添加權杖" - }, - "list": { - "unnamedToken": "未命名權杖", - "statusActive": "已激活", - "statusExpired": "已過期", - "neverExpires": "永不過期", - "expiresOnShort": "有效期至 {{date}}", - "tokenLabel": "權杖", - "createdLabel": "建立於", - "lastUsedLabel": "最後使用", - "expiresOnLabel": "有效期至", - "neverUsed": "未使用", - "neverLabel": "從不", - "deleteBtn": "刪除權杖" - }, - "dialog": { - "createTitle": "建立存取權杖", - "editTitle": "編輯存取權杖", - "description": "完成後點擊儲存。", - "save": "儲存", - "saveChanges": "儲存修改" - }, - "deleteDialog": { - "title": "刪除存取權杖?", - "description": "此操作無法撤銷。任何使用此權杖的應用程式將立即失去存取權限。", - "cancel": "取消", - "confirm": "刪除", - "deleting": "正在刪除..." - }, - "form": { - "nameLabel": "名稱", - "namePlaceholder": "為該權杖起一個簡短名稱", - "nameDescription": "可選 · 最多 32 個字元", - "expirationLabel": "有效期", - "expirationPlaceholder": "選擇有效期", - "expirationDescription": "權杖將在選定時間後自動過期。", - "never": "永久", - "1day": "1 天", - "7days": "7 天", - "30days": "30 天", - "errorMax": "最多 32 個字元", - "errorNumber": "必須為數字", - "errorInt": "必須為整數", - "errorPositive": "必須大於 0" - }, - "notifications": { - "createSuccess": "權杖已建立", - "createSuccessDesc": "存取權杖已成功建立。", - "updateSuccess": "權杖已更新", - "updateSuccessDesc": "存取權杖已成功更新。", - "createFailed": "建立失敗", - "updateFailed": "更新失敗", - "deleteSuccess": "權杖已刪除", - "deleteFailed": "刪除失敗", - "copied": "已複製到剪貼簿", - "genericError": "操作失敗,請重試。", - "close": "關閉", - "tryAgain": "重試" - } - }, - "permission": { - "scope": { - "global": "全域", - "account": "帳戶 #{{id}}" - }, - "dialog": { - "global_title": "全域權限", - "account_title": "帳戶權限", - "global_description": "授予此使用者的系統層級權限。", - "account_description": "僅適用於所選帳戶的權限。" - }, - "category": { - "system_identity": "系統與身分", - "global_data": "全域資料(管理員)", - "account": "帳戶權限" - }, - "system": { - "access": "基本系統存取", - "root": "系統最高控制權" - }, - "user": { - "manage": "管理所有使用者", - "view": "檢視基本使用者名稱" - }, - "token": { - "manage": "管理存取權杖" - }, - "account": { - "create": "建立電子郵件帳戶", - "manage": "管理指派的帳戶", - "manage_all": "管理所有帳戶設定", - "read_details": "檢視帳戶詳細資訊" - }, - "data": { - "read": "讀取指派帳戶的郵件資料", - "read_all": "讀取所有郵件資料", - "manage": "管理指派帳戶的郵件中繼資料", - "manage_all": "管理所有郵件中繼資料", - "raw_download": "下載指派帳戶的原始郵件", - "raw_download_all": "下載所有原始郵件", - "delete": "刪除指派帳戶的郵件", - "delete_all": "刪除所有帳戶的郵件", - "export_batch": "批次匯出指派帳戶的資料", - "export_batch_all": "批次匯出所有資料", - "import_batch": "批次匯入郵件資料", - "smtp_ingest": "透過 SMTP 協定歸檔郵件" - } - }, - "users": { - "columns": { - "id": "ID", - "avatar": "頭像", - "username": "使用者名稱", - "email": "電子郵件地址", - "roles": "角色權限", - "created_at": "建立時間", - "updated_at": "更新時間", - "actions": "操作" - }, - "buttons": { - "add": "新增使用者", - "add_new": "新增使用者" - }, - "empty": { - "title": "未發現使用者", - "description": "點擊下方按鈕開始新增第一個使用者。" - }, - "nav": { - "users": "使用者", - "roles": "角色", - "api_tokens": "API 權杖" - }, - "api_tokens": { - "empty": { - "title": "未找到 API 權杖", - "description": "系統中尚未產生任何 API 權杖。" - }, - "button": { - "generate": "產生新權杖" - }, - "toolbar": { - "search_placeholder": "按名稱、所有者或權杖搜尋..." - }, - "table": { - "name": "名稱", - "type": "類型", - "last_used": "上次使用", - "expires_at": "過期時間", - "owner": "所有者", - "created": "建立時間", - "api_key": "API 金鑰", - "web_ui": "Web 介面", - "never": "從未", - "permanent": "永久", - "expired": "已過期", - "unnamed": "未命名權杖" - }, - "unnamed": "未命名權杖", - "delete": { - "title": "刪除 API 權杖", - "desc": "您即將永久刪除該 API 權杖", - "prefix": "權杖前綴", - "irreversible": "此操作無法撤銷。任何使用該權杖的應用程式將立即失去存取權限。", - "confirm_label": "為確認操作,請在下方輸入 {{word}}:", - "confirm_placeholder": "輸入「{{word}}」以確認", - "warning_title": "警告", - "warning_desc": "任何使用該權杖的腳本、服務或整合都會失敗。請在繼續之前確保已更新您的系統。", - "confirm_button": "刪除權杖", - "deleting": "正在刪除..." - }, - "toast": { - "deleted_title": "API 權杖已刪除", - "deleted_desc": "權杖「{{name}}」已成功移除。", - "delete_failed_title": "刪除失敗", - "delete_failed": "刪除權杖失敗,請重試。" - } - }, - "tokens": { - "schema": { - "name_max": "最多 32 個字元", - "expire_number": "必須是數字", - "expire_int": "必須是整數", - "expire_positive": "必須大於 0" - }, - "toast": { - "update_success_title": "存取權杖已更新", - "update_success_desc": "存取權杖已成功更新。", - "create_success_title": "存取權杖已建立", - "create_success_desc": "存取權杖已成功建立。", - "update_failed_title": "更新失敗", - "create_failed_title": "建立失敗" - }, - "error": { - "fallback": "操作失敗,請稍後重試。" - }, - "dialog": { - "edit_title": "編輯存取權杖", - "create_title": "建立存取權杖", - "description": "完成後點擊儲存。" - }, - "fields": { - "name_label": "名稱", - "name_placeholder": "為該存取權杖起一個簡短的名稱", - "name_hint": "可選 · 最多 32 個字元", - "expire_label": "有效期", - "expire_placeholder": "選擇有效期", - "expire_hint": "權杖將在選定的時間後自動過期。" - }, - "expire_options": { - "never": "永不過期", - "1_day": "1 天", - "7_days": "7 天", - "30_days": "30 天" - } - }, - "tokens_action": { - "dialog": { - "title": "API 權杖", - "description": "管理此使用者的 API 權杖。您可以查看、複製或監控權杖使用情況。" - }, - "empty": { - "title": "無 API 權杖", - "description": "該使用者目前沒有 API 權杖。點擊下方按鈕建立一個。" - }, - "buttons": { - "add": "新增權杖" - }, - "list": { - "unnamed_token": "未命名權杖", - "status_expired": "已過期", - "status_active": "活躍", - "expires_on_brief": "有效期至 {{date}}", - "never_expires": "永不過期", - "label_token": "權杖", - "label_created": "建立於", - "label_last_used": "上次使用", - "label_expires_at": "過期時間", - "never": "從未", - "button_delete": "刪除權杖" - }, - "delete_dialog": { - "title": "刪除存取權杖?", - "description": "此操作無法撤銷。任何正在使用此權杖的應用程式都將立即失去存取權限。" - } - }, - "actions": { - "schema": { - "account_required": "請選擇一個帳戶", - "role_required": "請選擇一個角色", - "username_required": "使用者名稱不能為空", - "username_min": "使用者名稱長度至少為 3 個字元", - "username_max": "使用者名稱長度不能超過 32 個字元", - "email_required": "電子郵件地址不能為空", - "email_invalid": "請輸入有效的電子郵件地址", - "global_role_required": "請至少為此使用者分配一個全域角色", - "description_max": "描述長度不能超過 256 個字元", - "ip_invalid": "發現無效的 IP 地址", - "password_required": "密碼不能為空", - "password_min": "密碼長度至少為 8 個字元", - "password_max": "密碼長度不能超過 256 個字元" - }, - "toast": { - "updated": "使用者已更新", - "created": "使用者已建立" - }, - "dialog": { - "edit_title": "編輯使用者: {{name}}", - "create_title": "建立新使用者", - "subtitle": "配置身份、存取級別和安全策略。" - }, - "tabs": { - "general": "基本資訊", - "permissions": "帳戶權限", - "security": "安全與 ACL" - }, - "sections": { - "basic": "基礎身份", - "global": "全域權限", - "mail_access": "郵件存取控制", - "mail_access_subtitle": "定義此使用者可以管理的郵件帳戶。", - "policy": "策略開關" - }, - "fields": { - "username": "使用者名稱", - "username_hint": "用於系統登入的唯一識別碼。", - "email": "電子郵件地址", - "email_hint": "主要聯繫方式和通知地址。", - "password": "密碼", - "password_placeholder_create": "至少 8 個字元", - "password_placeholder_edit": "留空則保持當前密碼", - "password_hint_create": "初始使用者設定的安全密碼。", - "password_hint_edit": "僅在您希望更改密碼時輸入新密碼。", - "global_roles_hint": "分配高級系統權限。可以選擇多個角色。", - "description": "描述(可選)", - "description_placeholder": "新增關於此使用者的一些註釋...", - "description_hint": "此帳戶的內部說明或附加背景資訊(最多 256 個字元)。", - "select_account": "選擇帳戶", - "assign_role": "分配角色", - "ip_whitelist": "IP 白名單", - "ip_whitelist_hint": "限制這些 IP 地址登入(每行一個)。", - "rate_quota": "頻率限額", - "burst_interval": "突發間隔 (秒)" - }, - "buttons": { - "add_account": "新增帳戶", - "update": "更新使用者", - "create": "建立使用者" - }, - "states": { - "full_access": "全權限模式", - "full_access_desc": "擁有系統管理員角色的使用者擁有對所有帳戶的固有存取權限,無需手動分配。", - "no_accounts": "未分配特定帳戶。", - "security_disabled": "此使用者當前禁用了高級安全策略。" - }, - "api_tokens": "API 權杖", - "placeholder": { - "filter": "搜尋使用者..." - }, - "delete": { - "title": "刪除使用者", - "confirm_msg": "您即將永久刪除使用者 {{name}} (ID: {{id}})。", - "irreversible": "此操作無法撤銷。", - "input_label": "為確認操作,請在下方輸入使用者 ID:", - "placeholder": "輸入「{{id}}」以確認", - "alert_title": "警告:此操作是永久性的。", - "alert_desc": "一旦刪除,該使用者及其所有相關數據將立即被清除。請在繼續操作前核實此帳戶是否已不再需要。", - "button_confirm": "刪除使用者", - "button_deleting": "正在刪除...", - "toast": { - "success_title": "使用者已刪除", - "success_desc": "使用者「{{name}}」(ID: {{id}}) 已成功移除。", - "failed_title": "刪除失敗", - "failed_fallback": "刪除使用者失敗,請重試。" - } - } - } - }, - "roles": { - "title": { - "create": "建立新角色", - "edit": "編輯角色: {{name}}" - }, - "description_hint": "定義存取範圍和功能權限。", - "form": { - "name_label": "角色名稱", - "type_label": "角色類型", - "desc_label": "描述", - "matrix_label": "{{type}} 權限矩陣", - "builtin_badge": "內建角色", - "builtin_desc": "此角色由系統預定義。其權限為**唯讀**,無法被修改。" - }, - "types": { - "Global": "全域", - "Account": "帳戶" - }, - "categories": { - "identity": "身份與管理", - "global_data": "全域數據存取", - "account_resource": "帳戶資源存取" - }, - "actions": { - "cancel": "取消", - "submit_create": "建立角色", - "submit_update": "更新角色", - "success_create": "角色建立成功", - "success_update": "角色更新成功", - "failed": "操作失敗", - "close": "關閉", - "retry": "重試", - "add": "新增角色" - }, - "validation": { - "name_required": "角色名稱不能為空", - "perm_required": "請至少選擇一個權限" - }, - "columns": { - "id": "ID", - "name": "名稱", - "role_type": "角色類型", - "permissions": "權限", - "created_at": "建立時間", - "updated_at": "更新時間" - }, - "placeholder": { - "filter": "搜尋角色..." - }, - "delete": { - "dialog_title": "刪除使用者角色", - "warning_text": "您即將永久刪除角色 {{name}} (ID: {{id}})。", - "irreversible": "此操作無法撤銷。", - "confirm_label": "請鍵入角色 ID 以確認:", - "placeholder": "鍵入「{{id}}」以確認", - "alert_title": "警告:此操作是永久性的。", - "alert_desc": "刪除此角色將從所有當前分配了該角色的使用者中將其移除。在繼續之前,請確保您已檢查並重新分配受影響的使用者。", - "confirm_btn": "刪除角色", - "deleting": "正在刪除...", - "success_title": "角色已刪除", - "success_desc": "使用者角色「{{name}}」(ID: {{id}}) 已成功移除。", - "error_title": "刪除失敗", - "error_fallback": "無法刪除該角色,請稍後重試。" - }, - "details": { - "title": "角色權限: {{name}}", - "unknown": "未知角色", - "role_badge": "{{type}} 角色", - "desc_global": "全域管理與系統級存取權限。", - "desc_account": "單個帳戶的存取及數據操作權限。", - "close_btn": "關閉詳情視圖", - "view_permissions": "權限詳情" - }, - "empty": { - "title": "未找到角色", - "desc": "您尚未建立任何自定義角色。點擊下方按鈕開始新增新角色。" - } - }, - "profile": { - "avatar_alt": "頭像", - "menu": { - "profile": "個人資料", - "settings": "設定", - "sign_out": "登出" - } - }, - "sign_out": { - "title": "登出", - "desc": "您確定要登出嗎?您需要重新登入才能存取帳戶。", - "confirm": "登出" - }, - "restore_message": { - "title": "還原單個郵件", - "bulkTitle": "批量還原多個郵件", - "bulkWarning": "請注意:郵件將被還原至其原始存儲的資料夾中。", - "accountsInvolved": "涉及帳戶", - "summary": "待還原詳情", - "messages": "封郵件", - "desc": "此操作將把選定的郵件從 Bichon 系統重新上傳並恢復到其在 IMAP 服務器上對應的郵箱中。", - "confirm": "執行還原", - "restore_to_imap": "還原郵件", - "success": "郵件還原成功", - "successDesc": "選定的郵件已成功恢復到 IMAP 服務器。", - "failed": "還原郵件失敗", - "failedTitle": "還原失敗" - }, - "time": { - "label": "時間", - "since": "自", - "before": "早於", - "recent_range": "近期範圍(自…)", - "historical": "歷史範圍(早於…)", - "absolute_range": "絕對日期範圍", - "last_day": "最近 1 天", - "last_days": "最近 {{count}} 天", - "last_months": "最近 {{count}} 個月", - "over_years_ago": "{{count}} {{unit}} 前", - "year": "年", - "years": "年", - "recent_prefix": "最近:", - "days_ago_to_now": "天前至今", - "apply": "套用", - "start_date": "開始日期", - "end_date": "結束日期", - "clear_filters": "清除時間篩選", - "format": "yyyy-MM-dd" - }, - "tag": { - "label": "標籤", - "search_placeholder": "搜尋標籤…", - "clear_all": "清除所有標籤", - "no_tags_found": "未找到標籤" - }, - "search_accounts": { - "label": "郵件帳戶", - "search_placeholder": "搜尋郵件帳戶…", - "clear_accounts": "清除已選帳戶", - "no_accounts_found": "未找到帳戶" - }, - "search_mailbox": { - "label": "信箱資料夾", - "search_placeholder": "搜尋信箱資料夾", - "clear_mailboxes": "清除已選資料夾", - "select_account_first": "請先選擇郵件帳戶", - "no_mailbox_found": "未找到資料夾" - }, - "search_contacts": { - "label": "聯絡人", - "label_with_count": "聯絡人({{count}})", - "any": "不限", - "search_placeholder": "搜尋 {{field}}…", - "reset_all": "重設所有聯絡人", - "no_contact_found": "未找到聯絡人", - "loading": "載入中…", - "showing_limit": "僅顯示前 100 筆結果 • 共 {{total}} 筆" - }, - "search_more": { - "trigger_label": "進階", - "title": "進階篩選", - "reset": "重設", - "has_attachment": "包含附件", - "attachment_name_label": "附件名稱", - "attachment_name_placeholder": "例如:invoice.pdf", - "message_size_label": "郵件大小", - "message_id_label": "原始 Message-ID", - "message_id_description": "依郵件標頭中的 Message-ID 搜尋", - "apply": "套用篩選", - "size_presets": { - "any": "不限大小", - "tiny": "極小(< 15 KB)", - "small": "較小(< 2 MB)", - "medium": "一般(2–10 MB)", - "large": "較大(10–20 MB)", - "huge": "極大(> 20 MB)" - }, - "any": "不限", - "search_placeholder": "搜尋{{field}}...", - "extension": "檔案副檔名", - "category": "附件分類", - "content_types": "具體類型" - }, - "search_view": { - "button_label": "檢視", - "menu_title": "顯示欄位設定" - }, - "search_reset": { - "label": "重設", - "tooltip": "清除所有篩選條件" - }, - "search_input": { - "placeholder": "搜尋郵件... (支援正規表示式)", - "button": "搜尋", - "recent_title": "最近搜尋", - "clear_history": "清除紀錄", - "no_history": "尚無搜尋紀錄", - "all": "全部", - "all_fields_desc": "匹配郵件主題、正文、發件人及收件人", - "subject": "郵件主題", - "body": "郵件正文" + "name_required": "角色名稱不能為空", + "perm_required": "請至少選擇一個權限" } + }, + "search": { + "account": "帳號", + "addEmailAccount": "新增電子郵件帳號", + "addTags": { + "cancel": "取消", + "createHint": "建立新標籤:{{tag}}", + "invalidTitle": "無效標籤", + "none": "尚未新增標籤", + "save": "儲存", + "saving": "正在儲存...", + "searchPlaceholder": "搜尋或建立標籤...", + "selectedCount": "已選取 {{count}} 個標籤", + "title": "編輯標籤", + "tryAgain": "請稍後再試", + "updateFailedTitle": "更新失敗", + "updatedDesc": "標籤已成功更新", + "updatedTitle": "標籤已更新" + }, + "adjustSearch": "請嘗試調整您的搜尋條件或清除篩選條件。", + "advanced": "進階", + "advancedFilters": "進階篩選", + "any": "不限", + "attachmentName": "附件名稱", + "attachmentsSize": "附件與大小", + "bcc": "密件副本 (BCC)", + "before": "前於:", + "bulkActions": { + "ariaLabel": "已選擇 {{count}} 條訊息。批量操作工具列", + "clear": "清除選取", + "delete": "刪除", + "deleteDesc": "刪除選中的訊息", + "manageTags": "管理標籤", + "selected": "已選擇 {{count}} 項" + }, + "cc": "副本 (CC)", + "clear": "清除", + "date": "日期", + "dateRange": "日期範圍", + "delete": { + "confirmButton": "刪除", + "confirmDetail": "此操作無法復原。", + "confirmPrefix": "確認要刪除", + "countLabel": "{{count}} 條訊息嗎?", + "errorTitle": "刪除失敗", + "successDesc": "選定的訊息已成功刪除。", + "successTitle": "訊息已刪除", + "title": "刪除訊息", + "warningDesc": "刪除的訊息將被永久移除,無法恢復。", + "warningTitle": "警告" + }, + "editTag": "編輯標籤", + "endDate": "結束日期", + "from": "寄件人", + "fullTextMultiAccount": "全文搜尋、多帳號、進階篩選", + "hasAttachment": "有附件", + "huge": "極大 (≥20 MB)", + "keyword": "關鍵字", + "large": "大(10 - 20 MB)", + "mailbox": "信箱", + "maxSize": "最大大小", + "maximumBytes": "最大 (位元組)", + "medium": "中(2 - 10 MB)", + "messageId": "訊息 ID", + "minSize": "最小大小", + "minimumBytes": "最小 (位元組)", + "no": "否", + "noActiveEmailAccount": "沒有啟用的電子郵件帳號。", + "noEmailsFound": "找不到任何郵件", + "noMailboxSelectAccount": "沒有信箱,請先選擇一個帳號。", + "originalMessageIdHeader": "原始郵件的 Message-ID 標頭", + "pleaseSelectAtLeastOne": "請至少選擇一個搜尋條件", + "preview": "預覽", + "recipient": "收件人", + "searchArchivedEmails": "搜尋已封存郵件", + "searchButton": "搜尋", + "searchInSubjectBody": "在主旨、內文或附件名字中搜尋...", + "searching": "正在搜尋,請稍候...", + "searchingButton": "正在搜尋...", + "selectAccount": "選擇帳號", + "selectDate": "選擇日期", + "selectMailbox": "選擇信箱", + "sender": "寄件人", + "senderRecipients": "寄件人 / 收件人", + "since": "自:", + "size": "大小", + "sizeDescription": "大小指的是整封郵件的大小,包含附件。", + "small": "小(<2 MB)", + "sort": "排序", + "source": "來源", + "startDate": "開始日期", + "startSearching": "開始使用關鍵字、寄件人或進階篩選條件進行搜尋。", + "subject": "主旨", + "tagFilter": "標籤篩選", + "thread": { + "empty": "此串流中沒有訊息", + "error": "載入串流失敗", + "invalidDate": "無效日期", + "loadMore": "載入更多", + "loadingMore": "載入中...", + "noSubject": "(無主旨)", + "title": "串流 · {{count}} 則訊息" + }, + "tiny": "很小(<15 KB)", + "title": "搜尋", + "to": "收件人", + "updateTags": { + "actionAdd": "新增", + "actionOverwrite": "覆蓋", + "actionRemove": "移除", + "cancel": "取消", + "createHint": "按 Enter 鍵建立新標籤:\"{{tag}}\"", + "invalidTitle": "標籤無效", + "none": "未選擇標籤", + "overwriteWarning": "警告:此操作將覆蓋所選項目的所有現有標籤。", + "savingAdd": "正在新增...", + "savingOverwrite": "正在覆蓋...", + "savingRemove": "正在移除...", + "searchPlaceholder": "搜尋或建立新標籤...", + "selectedCount": "將套用 {{count}} 個標籤", + "submitAdd": "新增標籤", + "submitOverwrite": "覆蓋標籤", + "submitRemove": "移除標籤", + "title": "更新標籤", + "tryAgain": "請稍後再試。", + "updateFailedTitle": "更新失敗", + "updatedDesc": "標籤已成功更新。", + "updatedTitle": "標籤已更新" + }, + "yes": "是" + }, + "search_accounts": { + "clear_accounts": "清除已選帳戶", + "label": "郵件帳戶", + "no_accounts_found": "未找到帳戶", + "search_placeholder": "搜尋郵件帳戶…" + }, + "search_contacts": { + "any": "不限", + "label": "聯絡人", + "label_with_count": "聯絡人({{count}})", + "loading": "載入中…", + "no_contact_found": "未找到聯絡人", + "reset_all": "重設所有聯絡人", + "search_placeholder": "搜尋 {{field}}…", + "showing_limit": "僅顯示前 100 筆結果 • 共 {{total}} 筆" + }, + "search_input": { + "all": "全部", + "all_fields_desc": "匹配郵件主題、正文、發件人及收件人", + "body": "郵件正文", + "button": "搜尋", + "clear_history": "清除紀錄", + "no_history": "尚無搜尋紀錄", + "placeholder": "搜尋郵件(使用 \" \" 進行短語搜尋)", + "recent_title": "最近搜尋", + "subject": "郵件主題" + }, + "search_mailbox": { + "clear_mailboxes": "清除已選資料夾", + "label": "信箱資料夾", + "no_mailbox_found": "未找到資料夾", + "search_placeholder": "搜尋信箱資料夾", + "select_account_first": "請先選擇郵件帳戶" + }, + "search_more": { + "any": "不限", + "apply": "套用篩選", + "attachment_name_label": "附件名稱", + "attachment_name_placeholder": "例如:invoice.pdf", + "category": "附件分類", + "content_type": "檔案類型", + "extension": "檔案副檔名", + "has_attachment": "包含附件", + "is_message": "郵件格式附件", + "is_message_desc": "這種附件是一個郵件檔案,例如 .eml 檔案。", + "message_id_description": "依郵件標頭中的 Message-ID 搜尋", + "message_id_label": "原始 Message-ID", + "message_size_label": "郵件大小", + "reset": "重設", + "search_placeholder": "搜尋{{field}}...", + "size_presets": { + "any": "不限大小", + "huge": "極大(> 20 MB)", + "large": "較大(10–20 MB)", + "medium": "一般(2–10 MB)", + "small": "較小(< 2 MB)", + "tiny": "極小(< 15 KB)" + }, + "title": "進階篩選", + "trigger_label": "進階" + }, + "search_reset": { + "label": "重設", + "tooltip": "清除所有篩選條件" + }, + "search_view": { + "button_label": "檢視", + "menu_title": "顯示欄位設定" + }, + "settings": { + "accounts": "帳號", + "acl": "ACL", + "actions": "操作", + "add": "新增", + "addNewProxyHere": "在此新增代理。", + "adding": "正在新增...", + "appearance": { + "button": { + "update": "更新偏好設置" + }, + "command": { + "no_results": "未找到相關語言。", + "search": "搜尋語言..." + }, + "description": { + "language": "選擇網頁介面顯示的语言。", + "theme": "為介面選擇淺色或深色顯示模式。" + }, + "field": { + "language": "介面语言", + "theme": "介面主題" + }, + "placeholder": { + "select_language": "選擇語言" + }, + "theme": { + "dark": "深色", + "light": "淺色" + }, + "title": "外觀設置", + "validation": { + "language": { + "required": "請選擇一種語言。" + }, + "theme": { + "required": "請選擇一個主題。" + } + } + }, + "authUrl": "授權 URL", + "changePasswordForFutureLogins": "變更密碼以供未來登入使用。", + "confirmReset": "確認重設", + "createdAt": "建立時間", + "delete": "刪除", + "description": "描述", + "edit": "編輯", + "enabled": "啟用", + "enterNewRootPassword": "輸入新的根目錄密碼", + "enterProxyIdToConfirmDeletion": "請輸入代理 ID 以確認刪除。", + "failedToCopyText": "複製文字失敗", + "filterAccessToken": "篩選存取權杖...", + "filterAccount": "篩選帳號...", + "filterOauth2": "篩選 OAuth2...", + "filterProxy": "篩選代理...", + "general": "一般", + "generateNewToken": "產生一個新權杖。舊權杖將立即失效。", + "host": "主機", + "id": "ID", + "invalidPassword": "密碼無效", + "lastAccess": "上次存取", + "manageRootTokenAndPassword": "安全地管理根權杖和密碼。", + "name": "名稱", + "noProxies": "無代理設定", + "noProxiesDesc": "您尚未新增任何代理設定。請新增設定以使用功能。", + "password": "密碼", + "pleaseUseAnIpAddressForBetterReliability": "為了提高可靠性,請使用 IP 地址(例如:127.0.0.1),而非主機名稱或網域。", + "port": "連接埠", + "profile": { + "account": { + "id": "帳戶 ID:{{id}}" + }, + "avatarAlt": "頭像", + "button": { + "permissions": "權限", + "update_profile": "更新個人資料", + "view_global_permissions": "查看全域權限" + }, + "field": { + "email": "電子郵件", + "password": "密碼", + "username": "使用者名稱" + }, + "loadError": "無法載入使用者資訊。", + "maxSize": "最大 {{size}}", + "placeholder": { + "password_keep": "留空以保留目前的密碼" + }, + "removeAvatar": "移除頭像", + "section": { + "accounts": "已連結 {{count}} 個帳戶", + "roles": "角色" + }, + "toast": { + "update_failed": "更新個人資料失敗", + "updated": "個人資料更新成功" + }, + "uploadError": "檔案上傳錯誤", + "uploadTitle": "上傳頭像", + "validation": { + "email": { + "invalid": "請輸入有效的電子郵件地址", + "required": "必須填寫電子郵件" + }, + "password": { + "max": "密碼最多 256 個字元", + "min": "密碼至少需要 8 個字元" + }, + "username": { + "max": "使用者名稱最多 32 個字元", + "min": "使用者名稱至少需要 5 個字元", + "required": "必須填寫使用者名稱" + } + } + }, + "proxy": "代理", + "proxyUpdateOrAddFailed": "{{action}} 失敗,請稍後再試", + "reset": "重設", + "resetRootPassword": "重設根目錄密碼", + "resetRootToken": "重設根權杖", + "root": "根目錄", + "rootAccessManagement": "根目錄存取管理", + "rootDesc": "管理包含權杖和密碼的根目錄存取憑證。", + "rootPasswordMustBeAtLeast6Characters": "根目錄密碼必須至少為 6 個字元。", + "rootTitle": "根目錄", + "selectAll": "全選", + "sidebar": { + "apiTokens": "API 權杖", + "configurations": "系統配置", + "profile": "個人資料", + "proxy": "網路代理" + }, + "theRootPasswordHasBeenReset": "根目錄密碼已重設", + "theRootTokenHasBeenReset": "根權杖已重設", + "theme": "佈景主題", + "title": "設定", + "token": "權杖", + "tokenUrl": "權杖 URL", + "type": "類型", + "updateTheProxyHere": "在此更新代理。", + "updatedAt": "更新時間", + "url": "網址", + "useNewPasswordForNextLogin": "下次登入時請使用新密碼。", + "useProxy": "使用代理", + "username": "使用者名稱", + "youAreAboutToResetTheRootPassword": "您即將重設根目錄密碼。請安全保管。", + "youAreAboutToResetTheRootToken": "您即將重設根權杖。此操作無法復原。", + "yourLoginInformationHasBeenUpdated": "您的登入資訊已更新。您無需再次登入。", + "yourProxyHasBeenSuccessfully": "您的代理已成功{{action}}。" + }, + "sign_out": { + "confirm": "登出", + "desc": "您確定要登出嗎?您需要重新登入才能存取帳戶。", + "title": "登出" + }, + "systemConfig": { + "pageDescription": "這些參數透過 CLI 標誌或環境變數初始化。它們目前為唯讀,以確保環境一致性。", + "pageTitle": "系統級配置", + "sections": { + "cors": { + "desc": "跨來源資源共用規則", + "title": "CORS" + }, + "logging": { + "desc": "日誌輸出行為", + "title": "日誌" + }, + "network": { + "desc": "HTTP 與公共存取", + "title": "網路" + }, + "performance": { + "desc": "並行與壓縮", + "title": "效能" + }, + "security": { + "desc": "身分驗證與加密", + "title": "安全" + }, + "smtp": { + "desc": "內置郵件接收服務設定,用於實時歸檔", + "title": "SMTP 伺服器" + }, + "storage": { + "desc": "資料庫路徑與限制", + "title": "儲存與快取" + } + }, + "status": { + "auto": "自動", + "configured": "已配置", + "disabled": "已禁用", + "enabled": "已啟用", + "missing": "缺失", + "notSet": "未設置" + } + }, + "table": { + "asc": "升冪", + "delete": "刪除", + "desc": "降冪", + "edit": "編輯", + "hide": "隱藏", + "loading": "載入中...", + "noResults": "查無結果", + "of": "頁,共", + "page": "第", + "pagination": { + "first": "跳轉到第一頁", + "fixed_page_size": "每頁 {{size}} 行。", + "last": "跳轉到最後一頁", + "next": "下一頁", + "page_info": "第 {{page}} 頁,共 {{total}} 頁", + "previous": "上一頁", + "rows_per_page": "每頁行數", + "selected": "已選擇 {{selected}} / {{total}} 行。" + }, + "results": "筆結果", + "rowsPerPage": "每頁行數", + "showing": "顯示", + "to": "至" + }, + "tag": { + "clear_all": "清除所有標籤", + "label": "標籤", + "no_tags_found": "未找到標籤", + "search_placeholder": "搜尋標籤…" + }, + "time": { + "absolute_range": "絕對日期範圍", + "apply": "套用", + "before": "早於", + "clear_filters": "清除時間篩選", + "days_ago_to_now": "天前至今", + "end_date": "結束日期", + "format": "yyyy-MM-dd", + "historical": "歷史範圍(早於…)", + "label": "時間", + "last_day": "最近 1 天", + "last_days": "最近 {{count}} 天", + "last_months": "最近 {{count}} 個月", + "over_years_ago": "{{count}} {{unit}} 前", + "recent_prefix": "最近:", + "recent_range": "近期範圍(自…)", + "since": "自", + "start_date": "開始日期", + "year": "年", + "years": "年" + }, + "users": { + "actions": { + "api_tokens": "API 權杖", + "buttons": { + "add_account": "新增帳戶", + "create": "建立使用者", + "update": "更新使用者" + }, + "delete": { + "alert_desc": "一旦刪除,該使用者及其所有相關數據將立即被清除。請在繼續操作前核實此帳戶是否已不再需要。", + "alert_title": "警告:此操作是永久性的。", + "button_confirm": "刪除使用者", + "button_deleting": "正在刪除...", + "confirm_msg": "您即將永久刪除使用者 {{name}} (ID: {{id}})。", + "input_label": "為確認操作,請在下方輸入使用者 ID:", + "irreversible": "此操作無法撤銷。", + "placeholder": "輸入「{{id}}」以確認", + "title": "刪除使用者", + "toast": { + "failed_fallback": "刪除使用者失敗,請重試。", + "failed_title": "刪除失敗", + "success_desc": "使用者「{{name}}」(ID: {{id}}) 已成功移除。", + "success_title": "使用者已刪除" + } + }, + "dialog": { + "create_title": "建立新使用者", + "edit_title": "編輯使用者: {{name}}", + "subtitle": "配置身份、存取級別和安全策略。" + }, + "fields": { + "assign_role": "分配角色", + "burst_interval": "突發間隔 (秒)", + "description": "描述(可選)", + "description_hint": "此帳戶的內部說明或附加背景資訊(最多 256 個字元)。", + "description_placeholder": "新增關於此使用者的一些註釋...", + "email": "電子郵件地址", + "email_hint": "主要聯繫方式和通知地址。", + "global_roles_hint": "分配高級系統權限。可以選擇多個角色。", + "ip_whitelist": "IP 白名單", + "ip_whitelist_hint": "限制這些 IP 地址登入(每行一個)。", + "password": "密碼", + "password_hint_create": "初始使用者設定的安全密碼。", + "password_hint_edit": "僅在您希望更改密碼時輸入新密碼。", + "password_placeholder_create": "至少 8 個字元", + "password_placeholder_edit": "留空則保持當前密碼", + "rate_quota": "頻率限額", + "select_account": "選擇帳戶", + "username": "使用者名稱", + "username_hint": "用於系統登入的唯一識別碼。" + }, + "placeholder": { + "filter": "搜尋使用者..." + }, + "schema": { + "account_required": "請選擇一個帳戶", + "description_max": "描述長度不能超過 256 個字元", + "email_invalid": "請輸入有效的電子郵件地址", + "email_required": "電子郵件地址不能為空", + "global_role_required": "請至少為此使用者分配一個全域角色", + "ip_invalid": "發現無效的 IP 地址", + "password_max": "密碼長度不能超過 256 個字元", + "password_min": "密碼長度至少為 8 個字元", + "password_required": "密碼不能為空", + "role_required": "請選擇一個角色", + "username_max": "使用者名稱長度不能超過 32 個字元", + "username_min": "使用者名稱長度至少為 3 個字元", + "username_required": "使用者名稱不能為空" + }, + "sections": { + "basic": "基礎身份", + "global": "全域權限", + "mail_access": "郵件存取控制", + "mail_access_subtitle": "定義此使用者可以管理的郵件帳戶。", + "policy": "策略開關" + }, + "states": { + "full_access": "全權限模式", + "full_access_desc": "擁有系統管理員角色的使用者擁有對所有帳戶的固有存取權限,無需手動分配。", + "no_accounts": "未分配特定帳戶。", + "security_disabled": "此使用者當前禁用了高級安全策略。" + }, + "tabs": { + "general": "基本資訊", + "permissions": "帳戶權限", + "security": "安全與 ACL" + }, + "toast": { + "created": "使用者已建立", + "updated": "使用者已更新" + } + }, + "api_tokens": { + "button": { + "generate": "產生新權杖" + }, + "delete": { + "confirm_button": "刪除權杖", + "confirm_label": "為確認操作,請在下方輸入 {{word}}:", + "confirm_placeholder": "輸入「{{word}}」以確認", + "deleting": "正在刪除...", + "desc": "您即將永久刪除該 API 權杖", + "irreversible": "此操作無法撤銷。任何使用該權杖的應用程式將立即失去存取權限。", + "prefix": "權杖前綴", + "title": "刪除 API 權杖", + "warning_desc": "任何使用該權杖的腳本、服務或整合都會失敗。請在繼續之前確保已更新您的系統。", + "warning_title": "警告" + }, + "empty": { + "description": "系統中尚未產生任何 API 權杖。", + "title": "未找到 API 權杖" + }, + "table": { + "api_key": "API 金鑰", + "created": "建立時間", + "expired": "已過期", + "expires_at": "過期時間", + "last_used": "上次使用", + "name": "名稱", + "never": "從未", + "owner": "所有者", + "permanent": "永久", + "type": "類型", + "unnamed": "未命名權杖", + "web_ui": "Web 介面" + }, + "toast": { + "delete_failed": "刪除權杖失敗,請重試。", + "delete_failed_title": "刪除失敗", + "deleted_desc": "權杖「{{name}}」已成功移除。", + "deleted_title": "API 權杖已刪除" + }, + "toolbar": { + "search_placeholder": "按名稱、所有者或權杖搜尋..." + }, + "unnamed": "未命名權杖" + }, + "buttons": { + "add": "新增使用者", + "add_new": "新增使用者" + }, + "columns": { + "actions": "操作", + "avatar": "頭像", + "created_at": "建立時間", + "email": "電子郵件地址", + "id": "ID", + "roles": "角色權限", + "updated_at": "更新時間", + "username": "使用者名稱" + }, + "empty": { + "description": "點擊下方按鈕開始新增第一個使用者。", + "title": "未發現使用者" + }, + "nav": { + "api_tokens": "API 權杖", + "roles": "角色", + "users": "使用者" + }, + "tokens": { + "dialog": { + "create_title": "建立存取權杖", + "description": "完成後點擊儲存。", + "edit_title": "編輯存取權杖" + }, + "error": { + "fallback": "操作失敗,請稍後重試。" + }, + "expire_options": { + "1_day": "1 天", + "30_days": "30 天", + "7_days": "7 天", + "never": "永不過期" + }, + "fields": { + "expire_hint": "權杖將在選定的時間後自動過期。", + "expire_label": "有效期", + "expire_placeholder": "選擇有效期", + "name_hint": "可選 · 最多 32 個字元", + "name_label": "名稱", + "name_placeholder": "為該存取權杖起一個簡短的名稱" + }, + "schema": { + "expire_int": "必須是整數", + "expire_number": "必須是數字", + "expire_positive": "必須大於 0", + "name_max": "最多 32 個字元" + }, + "toast": { + "create_failed_title": "建立失敗", + "create_success_desc": "存取權杖已成功建立。", + "create_success_title": "存取權杖已建立", + "update_failed_title": "更新失敗", + "update_success_desc": "存取權杖已成功更新。", + "update_success_title": "存取權杖已更新" + } + }, + "tokens_action": { + "buttons": { + "add": "新增權杖" + }, + "delete_dialog": { + "description": "此操作無法撤銷。任何正在使用此權杖的應用程式都將立即失去存取權限。", + "title": "刪除存取權杖?" + }, + "dialog": { + "description": "管理此使用者的 API 權杖。您可以查看、複製或監控權杖使用情況。", + "title": "API 權杖" + }, + "empty": { + "description": "該使用者目前沒有 API 權杖。點擊下方按鈕建立一個。", + "title": "無 API 權杖" + }, + "list": { + "button_delete": "刪除權杖", + "expires_on_brief": "有效期至 {{date}}", + "label_created": "建立於", + "label_expires_at": "過期時間", + "label_last_used": "上次使用", + "label_token": "權杖", + "never": "從未", + "never_expires": "永不過期", + "status_active": "活躍", + "status_expired": "已過期", + "unnamed_token": "未命名權杖" + } + } + }, + "validation": { + "emailRequired": "電子郵件地址為必填項", + "folderLimitMustBeAtLeast100": "資料夾限制必須至少為 100", + "folderLimitMustBeNumber": "資料夾限制必須是數字", + "imapHostCannotBeEmpty": "IMAP 主機不可為空", + "imapHostRequired": "IMAP 主機為必填項", + "imapPortMustBeLessThan65536": "IMAP 連接埠必須小於 65536", + "imapPortMustBePositive": "IMAP 連接埠必須是正整數", + "incrementalSyncMustBeAtLeast10": "增量同步間隔必須至少為 10 分鐘", + "incrementalSyncMustBeNumber": "增量同步間隔必須是數字", + "invalidEmail": "無效的電子郵件地址", + "invalidUrl": "無效的網址", + "passwordMinLength": "密碼長度必須至少 {{min}} 個字元", + "passwordRequired": "如果驗證方法是密碼,則密碼為必填項", + "pleaseEnterPassword": "請輸入密碼", + "pleaseEnterUsernameOrEmail": "請輸入您的使用者名稱或電子郵件", + "required": "此欄位為必填項", + "singleRequestBatchSizeMustBeNumber": "批次大小必須是數字", + "singleRequestBatchSizeTooLarge": "批次大小必須最多為200", + "singleRequestBatchSizeTooSmall": "批次大小必須至少為10" + } } \ No newline at end of file diff --git a/web/src/locales/zh.json b/web/src/locales/zh.json index 6acd9ae..6566b2b 100644 --- a/web/src/locales/zh.json +++ b/web/src/locales/zh.json @@ -1,334 +1,217 @@ { - "common": { - "submit": "提交", - "cancel": "取消", - "save": "保存", - "save_changes": "保存修改", - "delete": "删除", - "edit": "编辑", - "search": "搜索", - "add": "添加", - "remove": "移除", - "create": "创建", - "update": "更新", - "confirm": "确认", - "close": "关闭", - "yes": "是", - "no": "否", - "ok": "确定", - "loading": "加载中...", - "empty": "空", - "noData": "无数据", - "table": { - "noResults": "无结果。" - }, - "failed": "失败", - "notFound": "未找到", - "back": "返回", - "goBack": "返回", - "backToHome": "返回首页", - "tryAgain": "重试", - "more": "更多", - "actions": "操作", - "filter": "筛选", - "reset": "重置", - "clear": "清除", - "error": "错误", - "apply": "应用", - "select": "选择", - "selectAll": "全选", - "deselectAll": "取消全选", - "all": "全部", - "none": "无", - "showLess": "显示更少", - "showMore": "显示更多...", - "project_description": "Bichon 是一个开源项目。", - "view_on_github_button": "在 GitHub 上查看", - "op_failed": "操作失败", - "na": "无", - "retry": "重试", - "deleting": "正在删除..." - }, - "navigation": { - "home": "首页", - "settings": "设置", + "accessTokens": { + "aListOfIpAddressesAllowed": "允许访问资源的 IP 地址列表。每行输入一个 IP 地址。(可选)", + "accountId": "账户 ID", "accounts": "账户", - "dashboard": "仪表板", - "mailbox": "邮箱", - "oauth2": "OAuth2", - "accessTokens": "访问令牌", - "apiDocs": "API 文档", - "general": "常规", - "auth": "认证", - "other": "其他", - "users": "系统用户" - }, - "auth": { - "welcome": "欢迎使用 Bichon", - "username": "用户名", - "password": "密码", - "login": "登录", - "loginFailed": "登录失败", - "invalidPassword": "密码无效,请重试。", - "somethingWentWrong": "出错了", - "sessionExpired": "会话已过期!", - "sessionExpiredDesc": "由于长时间未活动,您的会话已结束。请重新登录以继续。", - "logout": "退出登录", - "areYouSureYouWantToLogOut": "您确定要退出登录吗?", - "youWillNeedToLogInAgain": "您需要重新登录才能访问您的账户。" - }, - "errors": { - "pageNotFound": "糟糕!页面未找到!", - "pageNotFoundDesc": "您要查找的页面似乎不存在或已被删除。", - "somethingWentWrong": "糟糕!出错了 :')", - "somethingWentWrongDesc": "我们为给您带来的不便深表歉意。请稍后再试。", - "internalServerError": "内部服务器错误!", - "contentNotModified": "内容未修改!", - "networkError": "网络错误", - "networkErrorDesc": "无法连接到服务器。请检查您的网络连接并重试。", - "forbidden": "禁止访问", - "forbiddenTitle": "访问被禁止", - "forbiddenDesc": "您没有查看此资源的必要权限。", - "unauthorized": "未授权", - "unauthorizedTitle": "未授权访问", - "unauthorizedDesc": "请使用适当的凭据登录以访问此资源。", - "maintenance": "维护中", - "maintenanceTitle": "网站正在维护中!", - "maintenanceDesc": "网站目前不可用。我们很快就会恢复在线。", - "learnMore": "了解更多" - }, - "dashboard": { - "title": "仪表板", - "mailAccounts": "邮件账户", - "connected": "已连接", - "totalEmails": "邮件总数", - "syncedLocally": "本地已同步", - "totalEmailSize": "邮件总大小", - "logicalVolume": "原始大小", - "localDataFiles": "本地数据文件", - "actualDiskUsage": "实际磁盘使用", - "efficiency": "压缩效率", - "saved": "节省空间", - "dataStorage": "数据存储", - "indexSize": "索引体积", - "metadataSize": "元数据大小", - "tantivyDatabase": "基於 Tantivy 搜尋引擎", - "dayTrend": "30天趋势", - "attachments": "附件", - "topLists": "排行榜", - "newEmails": "新邮件", - "messageDistribution": "消息分布", - "attachmentRatio": "附件比例", - "attachmentRatioDesc": "{{percent}}% 的邮件包含附件", - "noEmailsSynced": "尚未同步邮件", - "withAttachments": "包含附件", - "noAttachments": "无附件", - "top10Senders": "前10名发件人", - "byMessageCount": "按消息数量", - "sender": "发件人", - "count": "数量", - "top10LargestEmails": "前10大邮件", - "byMessageSize": "按消息大小", - "subject": "主题", - "size": "大小", - "noSubject": "(无主题)", - "top10Accounts": "前10名账户", - "emails": "邮件", - "account": "账户", - "noRecentActivity": "无最近活动", - "noSendersData": "无发件人数据", - "noLargeEmails": "无大邮件", - "noAccountData": "无账户数据", - "systemVersion": "系统版本" + "aclRulesForAccessTokens": "访问令牌的 ACL 规则包括 IP 白名单验证和速率限制执行。", + "actions": { + "delete": "删除", + "edit": "编辑", + "openMenu": "打开菜单" + }, + "addNew": "添加新令牌", + "atLeastOneAccountIsRequired": "至少需要一个账户。", + "create": "创建", + "createNewAccessTokenHere": "在此创建新访问令牌。", + "created": "已创建", + "createdAt": "创建时间", + "creating": "创建中...", + "creationFailed": "创建失败", + "delete": "删除", + "describeThePurposeOfTheAccessToken": "描述访问令牌的用途", + "description": "在此管理您的访问令牌、访问控制、IP 白名单和速率限制设置。", + "descriptionMustNotExceed255Characters": "描述不能超过 255 个字符。", + "edit": "编辑", + "editToken": "编辑令牌", + "enterIntervalInSeconds": "输入时间间隔(秒),例如:60", + "enterOneIpAddressPerLine": "每行输入一个 IP 地址,例如:\n192.168.1.1\n192.168.1.2", + "enterQuota": "输入配额,例如:100", + "expiresAt": "过期时间", + "filterByEmailAddressOrAccountId": "按邮箱地址或账户 ID 筛选...", + "interval": "间隔", + "intervalMustBeAPositiveInteger": "时间间隔必须是正整数。", + "invalidIpAddressesFound": "发现无效的 IP 地址。请输入有效的 IPv4 或 IPv6 地址。", + "name": "名称", + "noTokens": "无访问令牌", + "noTokensDesc": "您尚未创建任何访问令牌。创建一个以开始使用 API 功能。", + "notUsedYet": "尚未使用", + "quota": "配额", + "quotaMustBeAPositiveInteger": "配额必须是正整数。", + "save": "保存", + "saveChanges": "保存更改", + "saving": "保存中...", + "selectAccounts": "选择账户", + "selectMultipleAccountsForTheAccessToken": "为访问令牌的授权范围选择多个账户。", + "theListOfAccountsThatCanBeQueried": "可以使用访问令牌查询的账户列表。", + "theMaximumNumberOfRequestsAllowed": "在时间间隔内允许的最大请求数。(可选)", + "theTimeWindowForTheRateLimit": "速率限制的时间窗口(秒)。(可选)", + "title": "访问令牌", + "token": "令牌", + "updateFailed": "更新失败", + "updateOrCreationFailed": "{{action}}失败,请稍后重试", + "updateTheAccessTokenHere": "在此更新访问令牌。", + "updated": "已更新", + "updating": "更新中...", + "yourAccessTokenHasBeenSuccessfully": "您的访问令牌已成功{{action}}。" }, "accounts": { - "beforeRelativeValue": "下载 {{value}} {{unit}} 之前的邮件", - "sinceRelativeValue": "下载最近一段时期的邮件", - "downloadBatchSize": "下载批量大小", - "downloadBatchSizeDescription": "每个 IMAP 请求获取的邮件数量", - "downloadScopeDescription": "选择哪些邮件应被索引和下载。", - "downloadScope": "下载策略", - "selectMode": "选择过滤模式", - "downloadAll": "下载所有邮件", - "sinceFixed": "自特定日期起", - "sinceRelative": "仅下载最近邮件", - "beforeRelative": "仅下载旧邮件", - "duration": "时长", - "unit": "单位", "accessControl": "访问控制", - "owner": "创建者", + "accessTokenCopiedToClipboard": "访问令牌已复制到剪贴板", "access_control": { - "title": "账户访问分配", - "description": "为 {{email}} 分配角色和授权用户", - "role_label": "访问角色", - "role_placeholder": "选择角色", - "role_loading": "正在加载角色...", - "user_label": "选择授权用户", - "user_search_placeholder": "按用户名或邮箱搜索...", - "user_empty": "未找到相关用户", - "user_selected_count": "已选择:{{count}} 个用户", "buttons": { "cancel": "取消", "save": "保存分配" }, - "validation": { - "user_required": "请至少选择一个用户", - "role_required": "请选择要分配的角色" - }, + "description": "为 {{email}} 分配角色和授权用户", + "role_label": "访问角色", + "role_loading": "正在加载角色...", + "role_placeholder": "选择角色", + "title": "账户访问分配", "toast": { - "success_title": "分配成功", + "failed_title": "分配失败", "success_desc": "权限已成功分配给 {{email}}", - "failed_title": "分配失败" + "success_title": "分配成功" + }, + "user_empty": "未找到相关用户", + "user_label": "选择授权用户", + "user_search_placeholder": "按用户名或邮箱搜索...", + "user_selected_count": "已选择:{{count}} 个用户", + "validation": { + "role_required": "请选择要分配的角色", + "user_required": "请至少选择一个用户" } }, - "title": "邮件账户", - "description": "管理和配置您的邮件账户。", - "addImap": "添加 IMAP", - "addNoSync": "添加 NoSync", - "moreAccountTypes": "更多账户类型", - "noAccountConfigurations": "无账户配置", - "noAccountConfigurationsDesc": "您尚未添加任何账户配置。添加一个以开始使用账户功能。", - "addConfiguration": "添加配置", - "useNoProxy": "不使用代理", - "login_name": "登录名", - "name": "名称", - "email": "邮箱", - "status": "状态", - "type": "类型", - "lastSync": "最后同步", + "accountCreated": "账户已创建", + "accountCreatedDesc": "您的账户已成功创建。", + "accountCreationFailed": "账户创建失败", + "accountDetails": "账户详情", + "accountHasBeenSuccessfully": "账户已成功{{action}}", + "accountSyncFoldersUpdateFailed": "账户同步文件夹更新失败", + "accountSyncFoldersUpdated": "账户同步文件夹已更新", + "accountUpdateFailed": "账户更新失败", + "accountUpdated": "账户已更新", + "accountUpdatedDesc": "您的账户已成功更新。", "actions": "操作", - "edit": "编辑", - "delete": "删除", - "detail": "详情", - "selectMailboxes": "选择邮件夹", - "oauth2Tokens": "OAuth2 令牌", - "id": "ID", - "enabled": "已启用", + "addAccount": "添加账户", + "addConfiguration": "添加配置", + "addImap": "添加 IMAP", + "addNewEmailAccountHere": "在此添加新邮件账户。", + "addNoSync": "添加 NoSync", + "allMailFolderSelected": "提示:已选择\"所有邮件\"文件夹", + "allMailFolderSelectedDesc": "选择具有\"所有邮件\"属性的文件夹可能会导致重复已从收件箱和已发送等文件夹同步的消息。这可能会消耗更多的存储空间。", + "allMailSkipped": "已选择标准文件夹。已跳过'所有邮件'以避免重复。", + "areYouSureYouWantTo": "你确定要{{action}}此账户吗?", "auth": "认证", - "incSync": "增量同步", - "state": "状态", + "authType": "认证类型", + "autoConfiguring": "自动配置中...", + "beforeRelative": "仅下载旧邮件", + "beforeRelativeValue": "下载 {{value}} {{unit}} 之前的邮件", + "capabilities": "功能", + "chooseAuthMethod": "选择 IMAP 的认证方法。", + "chooseEncryptionMethod": "选择 IMAP 的加密方法。", + "chooseMailboxesToDownload": "为 {{email}} 选择要下载的邮件夹。新添加的邮件夹将在下一个周期下载。", + "clickHere": "点击此处", + "clickSaveWhenDone": "完成后请点击保存。", + "continue": "继续", "createdAt": "创建时间", - "updatedAt": "更新时间", - "openMenu": "打开菜单", + "creationFailed": "创建失败,请稍后重试", + "dateSelection": "日期选择", + "dateSince": "起始日期", + "days": "天", + "delete": "删除", + "description": "管理和配置您的邮件账户。", + "detail": "详情", + "detailsOfTheOAuth2TokensForTheAccount": "账户的 OAuth2 令牌详情。", + "determinesWhetherThisAccountIsActiveNoSync": "用于判断账户是否处于启用状态。如果被禁用,将无法导入数据。", + "disable": "禁用", + "disableAccount": "禁用账户", + "disabled": "已禁用", + "downloadAll": "下载所有邮件", + "downloadBatchSize": "下载批量大小", + "downloadBatchSizeDescription": "每个 IMAP 请求获取的邮件数量", + "downloadInterval": "下载周期 (分钟)", + "downloadIntervalPlaceholder": "请输入分钟数", + "downloadScope": "下载策略", + "downloadScopeDescription": "选择哪些邮件应被索引和下载。", + "duration": "时长", + "edit": "编辑", + "email": "邮箱", "emailAccountRegistration": "邮件账户注册", "emailAccountRegistrationDesc": "请输入您的邮箱地址。在接下来的步骤中,您将配置 IMAP 相关信息。我们将使用该邮箱地址尝试自动获取 IMAP 服务器配置。", "emailAddress": "邮箱地址", - "emailPlaceholder": "例如:john.doe@example.com", - "namePlaceholder": "例如:john.doe", - "optional": "可选", - "nameDescription": "IMAP 用户名。默认使用邮箱地址,也可在此自定义。", "emailCannotBeModified": "编辑时无法修改邮箱账户地址。", - "addAccount": "添加账户", - "updateAccount": "更新账户", - "accountUpdated": "账户已更新", - "accountCreated": "账户已创建", - "accountUpdatedDesc": "您的账户已成功更新。", - "accountCreatedDesc": "您的账户已成功创建。", - "accountUpdateFailed": "账户更新失败", - "accountCreationFailed": "账户创建失败", - "updateFailed": "更新失败,请稍后重试", - "creationFailed": "创建失败,请稍后重试", - "allMailFolderSelected": "提示:已选择\"所有邮件\"文件夹", - "accountSyncFoldersUpdated": "账户同步文件夹已更新", - "accountSyncFoldersUpdateFailed": "账户同步文件夹更新失败", - "serverConfiguration": "服务器配置 (IMAP)", - "selectedMailboxes": "已选择的邮件夹", - "allMailFolderSelectedDesc": "选择具有\"所有邮件\"属性的文件夹可能会导致重复已从收件箱和已发送等文件夹同步的消息。这可能会消耗更多的存储空间。", - "allMailSkipped": "已选择标准文件夹。已跳过'所有邮件'以避免重复。", - "selectAtLeastOneFolder": "请至少选择一个文件夹", - "chooseMailboxesToDownload": "为 {{email}} 选择要下载的邮件夹。新添加的邮件夹将在下一个周期下载。", - "accountDetails": "账户详情", - "capabilities": "功能", - "folderLimit": "文件夹限制", - "everyMinutes": "每 {{minutes}} 分钟", - "foldersConfiguredForSync": "已配置 {{count}} 个文件夹用于同步", - "foldersSelected": "已选择 {{count}} 个文件夹", - "imapHost": "IMAP 主机", - "imapHostPlaceholder": "例如:imap.example.com", - "imapPort": "IMAP 端口", - "imapPortPlaceholder": "例如:993", - "imapEncryption": "IMAP 加密", - "selectEncryptionMethod": "选择加密方法", - "chooseEncryptionMethod": "选择 IMAP 的加密方法。", - "imapAuthMethod": "IMAP 认证方法", - "selectAuthMethod": "选择认证方法", - "chooseAuthMethod": "选择 IMAP 的认证方法。", - "imapPassword": "IMAP 密码", - "leaveEmptyToKeepPassword": "留空以保持当前密码", - "enterPassword": "请输入您的密码", - "leaveEmptyToKeepExisting": "留空以保持现有密码,或输入新密码进行更新。", - "useProxy": "使用代理", - "selectProxy": "选择代理", - "downloadInterval": "下载周期 (分钟)", - "downloadIntervalPlaceholder": "请输入分钟数", + "emailPlaceholder": "例如:john.doe@example.com", + "enable": "启用", + "enableAccount": "启用账户", + "enabled": "已启用", "enabledDescription": "确定此账户是否处于活动状态。如果禁用,相关的下载任务将不会运行。", - "dateSince": "起始日期", - "none": "无", - "fixed": "固定", - "relative": "相对", - "selectDate": "选择日期", - "selectUnit": "选择单位", - "days": "天", - "months": "月", - "years": "年", - "enterValue": "请输入一个值", - "mustBeAtLeast1": "必须至少为 1", - "dateSelection": "日期选择", - "since": "自", - "recent": "最近", - "notAvailable": "暂无", - "host": "主机", - "port": "端口", "encryption": "加密", - "authType": "认证类型", - "password": "密码", - "useProxyField": "使用代理", - "clickSaveWhenDone": "完成后请点击保存。", - "step": "步骤 {{index}}", - "goBack": "返回", - "autoConfiguring": "自动配置中...", - "continue": "继续", - "saveChanges": "保存更改", - "submit": "提交", + "enterPassword": "请输入您的密码", + "enterValue": "请输入一个值", + "everyMinutes": "每 {{minutes}} 分钟", "field": "字段", - "value": "值", - "refreshToken": "刷新令牌", - "accessTokenCopiedToClipboard": "访问令牌已复制到剪贴板", - "refreshTokenCopiedToClipboard": "刷新令牌已复制到剪贴板", - "noOAuth2Tokens": "无 OAuth2 令牌", - "theAccountHasNotCompletedTheAuthorizationProcess": "账户尚未完成授权流程。请", - "clickHere": "点击此处", - "toAuthorizeTheAccount": "以授权账户。", - "detailsOfTheOAuth2TokensForTheAccount": "账户的 OAuth2 令牌详情。", - "updateTheEmailAccountHere": "在此更新邮件账户。", - "addNewEmailAccountHere": "在此添加新邮件账户。", - "thisAccountIsUsedForIdentificationPurposesOnly": "此账户仅用于识别目的,不需要与邮件服务器同步。它有助于导入邮件数据。", - "determinesWhetherThisAccountIsActiveNoSync": "用于判断账户是否处于启用状态。如果被禁用,将无法导入数据。", + "fixed": "固定", + "folderLimit": "文件夹限制", + "folderLimitDescription": "限制每个文件夹同步的邮件数量(最少 100)。留空表示不限制。", + "folderLimitPlaceholder": "例如 1000", "folderSync": { - "noData": "无数据", - "noFolders": "没有需要同步的文件夹", - "batches": "批次", "autoSelectDescendants": "自动选择子项", "autoSelectParents": "自动选择父项", - "expandAll": "全部展开", + "batches": "批次", "collapseAll": "全部收起", - "loadingMailboxFolders": "正在加载邮箱文件夹…" + "expandAll": "全部展开", + "loadingMailboxFolders": "正在加载邮箱文件夹…", + "noData": "无数据", + "noFolders": "没有需要同步的文件夹" }, - "viewDetails": "查看详情", + "foldersConfiguredForSync": "已配置 {{count}} 个文件夹用于同步", + "foldersSelected": "已选择 {{count}} 个文件夹", + "goBack": "返回", + "host": "主机", + "id": "ID", + "imap": "IMAP", + "imapAuthMethod": "IMAP 认证方法", + "imapEncryption": "IMAP 加密", + "imapHost": "IMAP 主机", + "imapHostPlaceholder": "例如:imap.example.com", + "imapPassword": "IMAP 密码", + "imapPort": "IMAP 端口", + "imapPortPlaceholder": "例如:993", + "imapProxy": "为 IMAP 连接使用 SOCKS5 代理。", + "incSync": "增量同步", + "lastSync": "最后同步", + "leaveEmptyToKeepExisting": "留空以保持现有密码,或输入新密码进行更新。", + "leaveEmptyToKeepPassword": "留空以保持当前密码", + "login_name": "登录名", + "minutes": "分钟", + "months": "月", + "moreAccountTypes": "更多账户类型", + "mustBeAtLeast1": "必须至少为 1", + "name": "名称", + "nameDescription": "IMAP 用户名。默认使用邮箱地址,也可在此自定义。", + "namePlaceholder": "例如:john.doe", + "noAccountConfigurations": "无账户配置", + "noAccountConfigurationsDesc": "您尚未添加任何账户配置。添加一个以开始使用账户功能。", + "noOAuth2Tokens": "无 OAuth2 令牌", + "none": "无", + "notAvailable": "暂无", + "oauth2Tokens": "OAuth2 令牌", + "openMenu": "打开菜单", + "optional": "可选", + "owner": "创建者", + "password": "密码", + "port": "端口", + "recent": "最近", + "refreshToken": "刷新令牌", + "refreshTokenCopiedToClipboard": "刷新令牌已复制到剪贴板", + "relative": "相对", "runningState": { - "message": "消息", "account": { "id": "账户 ID" }, - "tabs": { - "active_session": "当前任务", - "history": "历史记录", - "global_errors": "全局错误", - "folders": "邮件夹", - "errors": "错误" - }, - "loading": { - "fetching_account_state": "正在获取账户状态..." + "common": { + "close": "关闭", + "folders": "个文件夹" }, "empty": { "no_active_download": "当前没有下载任务", @@ -337,1156 +220,596 @@ "no_global_errors": "暂无全局错误", "no_history": "暂无历史记录" }, - "session": { - "status": "状态", - "trigger": "触发方式", - "started_at": "开始时间" - }, - "common": { - "folders": "个文件夹", - "close": "关闭" - }, + "folders": "个文件夹", "latest": "最新", - "folders": "个文件夹" + "loading": { + "fetching_account_state": "正在获取账户状态..." + }, + "message": "消息", + "session": { + "started_at": "开始时间", + "status": "状态", + "trigger": "触发方式" + }, + "tabs": { + "active_session": "当前任务", + "errors": "错误", + "folders": "邮件夹", + "global_errors": "全局错误", + "history": "历史记录" + } }, + "saveChanges": "保存更改", + "selectAtLeastOneFolder": "请至少选择一个文件夹", + "selectAuthMethod": "选择认证方法", + "selectDate": "选择日期", + "selectEncryptionMethod": "选择加密方法", + "selectMailboxes": "选择邮件夹", + "selectMode": "选择过滤模式", + "selectProxy": "选择代理", + "selectUnit": "选择单位", + "selectedMailboxes": "已选择的邮件夹", + "serverConfiguration": "服务器配置 (IMAP)", + "since": "自", + "sinceFixed": "自特定日期起", + "sinceRelative": "仅下载最近邮件", + "sinceRelativeValue": "下载最近一段时期的邮件", + "state": "状态", + "status": "状态", + "step": "步骤 {{index}}", "steps": { "complete": "完成", "emailAddress": "邮箱地址", "imap": "IMAP", - "syncPreferences": "同步偏好", - "summary": "摘要" + "summary": "摘要", + "syncPreferences": "同步偏好" }, - "imapProxy": "为 IMAP 连接使用 SOCKS5 代理。", - "syncStartDateDescription": "定义同步开始日期——可以是具体日期或相对当前时间。之前的邮件将被排除,{{fixedPart}}。", + "submit": "提交", "syncAfterDate": "同步固定日期之后的数据", "syncRecentData": "随时间调整同步日期,仅同步近期数据", - "folderLimitDescription": "限制每个文件夹同步的邮件数量(最少 100)。留空表示不限制。", - "folderLimitPlaceholder": "例如 1000", - "imap": "IMAP", - "minutes": "分钟", - "accountHasBeenSuccessfully": "账户已成功{{action}}", - "enableAccount": "启用账户", - "disableAccount": "禁用账户", - "areYouSureYouWantTo": "你确定要{{action}}此账户吗?", - "enable": "启用", - "disable": "禁用", + "syncStartDateDescription": "定义同步开始日期——可以是具体日期或相对当前时间。之前的邮件将被排除,{{fixedPart}}。", + "theAccountHasNotCompletedTheAuthorizationProcess": "账户尚未完成授权流程。请", + "thisAccountIsUsedForIdentificationPurposesOnly": "此账户仅用于识别目的,不需要与邮件服务器同步。它有助于导入邮件数据。", "thisWillPreventTheAccountFromBeingUsed": "该账户将不会继续从 IMAP 服务器同步数据,但已有数据仍然可以查询。", - "disabled": "已禁用", + "title": "邮件账户", + "toAuthorizeTheAccount": "以授权账户。", + "type": "类型", + "unit": "单位", + "updateAccount": "更新账户", + "updateFailed": "更新失败,请稍后重试", + "updateTheEmailAccountHere": "在此更新邮件账户。", + "updatedAt": "更新时间", "useDangerous": "信任任意 TLS 证书", - "useDangerousDescription": "如果你连接的 IMAP 服务器使用公开 CA 或者自签证书,而系统不认可该证书时,启用此选项可绕过标准证书校验。但请注意,这样可能使你的连接容易受到中间人攻击 —— 仅当你完全理解风险时才启用。" + "useDangerousDescription": "如果你连接的 IMAP 服务器使用公开 CA 或者自签证书,而系统不认可该证书时,启用此选项可绕过标准证书校验。但请注意,这样可能使你的连接容易受到中间人攻击 —— 仅当你完全理解风险时才启用。", + "useNoProxy": "不使用代理", + "useProxy": "使用代理", + "useProxyField": "使用代理", + "value": "值", + "viewDetails": "查看详情", + "years": "年" + }, + "apiDocs": { + "choosePreferredType": "选择您首选的 API 文档类型", + "downloadSpecYAML": "下载规范 YAML", + "openAPIExplorer": "OpenAPI Explorer", + "reDoc": "ReDoc", + "scalar": "Scalar", + "swaggerUI": "Swagger UI" + }, + "apiTokens": { + "deleteDialog": { + "cancel": "取消", + "confirm": "删除", + "deleting": "正在删除...", + "description": "此操作无法撤销。任何使用此令牌的应用将立即失去访问权限。", + "title": "删除访问令牌?" + }, + "dialog": { + "createTitle": "创建访问令牌", + "description": "完成后点击保存。", + "editTitle": "编辑访问令牌", + "save": "保存", + "saveChanges": "保存修改" + }, + "form": { + "1day": "1 天", + "30days": "30 天", + "7days": "7 天", + "errorInt": "必须为整数", + "errorMax": "最多 32 个字符", + "errorNumber": "必须为数字", + "errorPositive": "必须大于 0", + "expirationDescription": "令牌将在选定时间后自动过期。", + "expirationLabel": "有效期", + "expirationPlaceholder": "选择有效期", + "nameDescription": "可选 · 最多 32 个字符", + "nameLabel": "名称", + "namePlaceholder": "为该访问令牌起一个简短的名称", + "never": "永久" + }, + "list": { + "createdLabel": "创建于", + "deleteBtn": "删除令牌", + "expiresOnLabel": "有效期至", + "expiresOnShort": "有效期至 {{date}}", + "lastUsedLabel": "最后使用", + "neverExpires": "永不过期", + "neverLabel": "从不", + "neverUsed": "未使用", + "statusActive": "已激活", + "statusExpired": "已过期", + "tokenLabel": "令牌", + "unnamedToken": "未命名令牌" + }, + "notifications": { + "close": "关闭", + "copied": "已复制到剪贴板", + "createFailed": "创建失败", + "createSuccess": "访问令牌已创建", + "createSuccessDesc": "访问令牌已成功创建。", + "deleteFailed": "删除访问令牌失败", + "deleteSuccess": "访问令牌已成功删除", + "genericError": "操作失败,请重试。", + "tryAgain": "重试", + "updateFailed": "更新失败", + "updateSuccess": "访问令牌已更新", + "updateSuccessDesc": "访问令牌已成功更新。" + }, + "page": { + "addBtn": "添加令牌", + "emptyDescription": "您尚未创建任何 API 令牌。点击下方按钮创建一个。", + "emptyTitle": "无 API 令牌", + "loadError": "加载 API 令牌失败。" + } + }, + "attachment": { + "all_fields_desc": "匹配附件名称、邮件主题和发件人", + "date": "日期", + "name": "文件名", + "search_input_placeholder": "搜索附件(使用 \" \" 进行短语搜索)", + "sender": "发件人", + "sender_with_count": "发件人 ({{count}})", + "size": "文件大小", + "source": "来源", + "subject": "主题" + }, + "auth": { + "areYouSureYouWantToLogOut": "您确定要退出登录吗?", + "invalidPassword": "密码无效,请重试。", + "login": "登录", + "loginFailed": "登录失败", + "logout": "退出登录", + "password": "密码", + "sessionExpired": "会话已过期!", + "sessionExpiredDesc": "由于长时间未活动,您的会话已结束。请重新登录以继续。", + "somethingWentWrong": "出错了", + "username": "用户名", + "welcome": "欢迎使用 Bichon", + "youWillNeedToLogInAgain": "您需要重新登录才能访问您的账户。" + }, + "command": { + "dark": "深色", + "light": "浅色", + "noResultsFound": "未找到结果。", + "theme": "主题", + "typeCommandOrSearch": "输入命令或搜索..." + }, + "common": { + "actions": "操作", + "add": "添加", + "all": "全部", + "apply": "应用", + "back": "返回", + "backToHome": "返回首页", + "cancel": "取消", + "clear": "清除", + "close": "关闭", + "confirm": "确认", + "create": "创建", + "delete": "删除", + "deleting": "正在删除...", + "deselectAll": "取消全选", + "edit": "编辑", + "empty": "空", + "error": "错误", + "failed": "失败", + "filter": "筛选", + "goBack": "返回", + "loading": "加载中...", + "more": "更多", + "na": "无", + "no": "否", + "noData": "无数据", + "none": "无", + "notFound": "未找到", + "ok": "确定", + "op_failed": "操作失败", + "project_description": "Bichon 是一个开源项目。", + "remove": "移除", + "reset": "重置", + "retry": "重试", + "save": "保存", + "save_changes": "保存修改", + "search": "搜索", + "select": "选择", + "selectAll": "全选", + "showLess": "显示更少", + "showMore": "显示更多...", + "submit": "提交", + "table": { + "noResults": "无结果。" + }, + "tryAgain": "重试", + "update": "更新", + "view_on_github_button": "在 GitHub 上查看", + "yes": "是" + }, + "dashboard": { + "account": "账户", + "actualDiskUsage": "实际磁盘使用", + "attachmentRatio": "附件比例", + "attachmentRatioDesc": "{{percent}}% 的邮件包含附件", + "attachments": "附件", + "byMessageCount": "按消息数量", + "byMessageSize": "按消息大小", + "connected": "已连接", + "count": "数量", + "dataStorage": "数据存储", + "dayTrend": "30天趋势", + "efficiency": "压缩效率", + "emails": "邮件", + "indexSize": "索引体积", + "localDataFiles": "本地数据文件", + "logicalVolume": "原始大小", + "mailAccounts": "邮件账户", + "messageDistribution": "消息分布", + "metadataSize": "元数据大小", + "newEmails": "新邮件", + "noAccountData": "无账户数据", + "noAttachments": "无附件", + "noEmailsSynced": "尚未同步邮件", + "noLargeEmails": "无大邮件", + "noRecentActivity": "无最近活动", + "noSendersData": "无发件人数据", + "noSubject": "(无主题)", + "saved": "节省空间", + "sender": "发件人", + "size": "大小", + "subject": "主题", + "syncedLocally": "本地已同步", + "systemVersion": "系统版本", + "tantivyDatabase": "基於 Tantivy 搜尋引擎", + "title": "仪表板", + "top10Accounts": "前10名账户", + "top10LargestEmails": "前10大邮件", + "top10Senders": "前10名发件人", + "topLists": "排行榜", + "totalEmailSize": "邮件总大小", + "totalEmails": "邮件总数", + "withAttachments": "包含附件" + }, + "dialogs": { + "accountCredentials": "账户凭据和设置", + "accountDeleteFailed": "账户删除失败", + "accountDeleted": "账户已删除", + "accountDeletedDesc": "您的账户已成功删除。", + "allResourcesErased": "所有相关资源将被永久删除。", + "cannotBeUndone": "此操作无法撤销!", + "confirmDelete": "确认删除", + "confirmDeleteDesc": "您确定要删除此项吗?此操作无法撤销。", + "continue": "继续", + "createFailed": "创建失败", + "createSuccess": "创建成功", + "deleteAccountPermanently": "永久删除账户", + "deleteFailed": "删除失败", + "deleteSuccess": "删除成功", + "deleting": "删除中...", + "imapSyncData": "IMAP 同步数据", + "localCachedMetadata": "本地缓存的元数据和同步状态", + "oauthTokens": "OAuth 令牌和 API 凭据", + "permanentlyDeleteAccount": "永久删除账户", + "saveFailed": "保存失败", + "saveSuccess": "保存成功", + "typeEmailToConfirm": "请输入账户邮箱以确认:", + "typeToConfirm": "请输入 \"{{email}}\" 以确认", + "updateFailed": "更新失败", + "updateSuccess": "更新成功", + "youAreDeleting": "您正在删除 {{email}}。这将永久移除:" + }, + "errors": { + "contentNotModified": "内容未修改!", + "forbidden": "禁止访问", + "forbiddenDesc": "您没有查看此资源的必要权限。", + "forbiddenTitle": "访问被禁止", + "internalServerError": "内部服务器错误!", + "learnMore": "了解更多", + "maintenance": "维护中", + "maintenanceDesc": "网站目前不可用。我们很快就会恢复在线。", + "maintenanceTitle": "网站正在维护中!", + "networkError": "网络错误", + "networkErrorDesc": "无法连接到服务器。请检查您的网络连接并重试。", + "pageNotFound": "糟糕!页面未找到!", + "pageNotFoundDesc": "您要查找的页面似乎不存在或已被删除。", + "somethingWentWrong": "糟糕!出错了 :')", + "somethingWentWrongDesc": "我们为给您带来的不便深表歉意。请稍后再试。", + "unauthorized": "未授权", + "unauthorizedDesc": "请使用适当的凭据登录以访问此资源。", + "unauthorizedTitle": "未授权访问" + }, + "mail": { + "account": "账户", + "attachments": "附件", + "bcc": "密送", + "cc": "抄送", + "date": "日期", + "delete": "删除", + "download": "下载", + "downloadComplete": "下载完成", + "downloadFailed": "下载失败", + "downloadStarted": "下载已开始", + "downloaded": "{{id}} 已下载", + "emailViewer": "邮件查看器", + "failedToDownloadFile": "下载文件失败", + "failedToLoadEmail": "加载邮件消息失败。", + "from": "发件人", + "id": "ID", + "isBeingDownloaded": "{{id}} 正在下载", + "noAttachments": "无附件", + "noMessageSelected": "未选择消息", + "noTagsYet": "暂无标签", + "onlyNonInlineAttachments": "此处仅显示非内联附件。", + "showLess": "显示更少", + "showMore": "显示更多...", + "subject": "主题", + "tags": "标签", + "to": "收件人", + "viewThread": "查看对话" }, "mailbox": { + "bulkActions": { + "ariaLabel": "批量操作,共选中 {{count}} 个{{emailLabel}}", + "clearSelection": "清除选择", + "clearSelectionWithKey": "清除选择({{key}})", + "delete": "删除", + "deleteTooltip": "删除所选邮件", + "email": "邮件", + "emails": "邮件", + "selected": "已选" + }, + "deleteDialog": { + "confirm": "删除", + "desc": "你确定要删除{{countText}}吗?此操作将从本地数据库中删除所选邮件。邮件将被永久删除,无法恢复。", + "descCountMultiple": "这些 {{count}} 封邮件", + "descCountSingle": "这封邮件", + "errorTitle": "删除邮件失败", + "successDesc": "所选邮件已被删除。", + "successTitle": "邮件已成功删除", + "title": "删除邮件", + "warningDesc": "请谨慎操作。", + "warningTitle": "警告!" + }, "deleteMailboxDialog": { + "confirm": "永久删除", + "desc": "您确定要删除此邮箱文件夹吗?此操作无法撤销。", + "errorTitle": "删除失败", + "successDesc": "邮箱文件夹及其内容已被成功移除。", + "successTitle": "删除成功", "title": "删除邮箱文件夹", - "desc": "您确定要删除此邮箱文件夹吗?此操作无法撤销。", - "warningTitle": "警告", "warningDesc": "删除此文件夹将永久移除其中包含的所有归档邮件及子文件夹。", - "confirm": "永久删除", - "successTitle": "删除成功", - "successDesc": "邮箱文件夹及其内容已被成功移除。", - "errorTitle": "删除失败" + "warningTitle": "警告" }, - "title": "邮箱", "folders": "文件夹", "messages": "消息", "noMessages": "无消息", "selectFolder": "选择一个文件夹以查看消息", - "deleteDialog": { - "title": "删除邮件", - "desc": "你确定要删除{{countText}}吗?此操作将从本地数据库中删除所选邮件。邮件将被永久删除,无法恢复。", - "descCountSingle": "这封邮件", - "descCountMultiple": "这些 {{count}} 封邮件", - "warningTitle": "警告!", - "warningDesc": "请谨慎操作。", - "confirm": "删除", - "successTitle": "邮件已成功删除", - "successDesc": "所选邮件已被删除。", - "errorTitle": "删除邮件失败" - }, "thread": { - "title": "会话 ({{count}} {{messageLabel}})", + "empty": "该会话没有消息。", + "invalidDate": "无效日期", + "loadError": "加载会话失败", + "loadMore": "加载更多", + "loadingMore": "加载更多...", "message": "条消息", "messages": "条消息", "noSubject": "(无主题)", - "invalidDate": "无效日期", - "empty": "该会话没有消息。", - "loadError": "加载会话失败", - "loadingMore": "加载更多...", - "loadMore": "加载更多" + "title": "会话 ({{count}} {{messageLabel}})" }, - "bulkActions": { - "ariaLabel": "批量操作,共选中 {{count}} 个{{emailLabel}}", - "email": "邮件", - "emails": "邮件", - "selected": "已选", - "clearSelection": "清除选择", - "clearSelectionWithKey": "清除选择({{key}})", - "delete": "删除", - "deleteTooltip": "删除所选邮件" - } + "title": "邮箱" }, - "search": { - "size": "大小", - "any": "不限", - "tiny": "很小(<15 KB)", - "small": "小(<2 MB)", - "medium": "中(2 - 10 MB)", - "large": "大(10 - 20 MB)", - "huge": "极大 (≥20 MB)", - "sort": "排序", - "sizeDescription": "大小指的是邮件整体大小,包含附件。", - "title": "搜索", - "searching": "搜索中,请稍候…", - "noEmailsFound": "未找到邮件", - "startSearching": "请输入关键词、发件人或使用高级筛选开始搜索。", - "adjustSearch": "请尝试调整搜索条件或清除筛选。", - "tagFilter": "标签筛选", - "from": "发件人", - "to": "收件人", - "subject": "主题", - "date": "日期", - "editTag": "编辑标签", - "keyword": "关键词", - "sender": "发件人", - "recipient": "收件人", - "hasAttachment": "包含附件", - "yes": "是", - "no": "否", - "dateRange": "日期范围", - "startDate": "开始日期", - "endDate": "结束日期", - "advancedFilters": "高级筛选", - "searchArchivedEmails": "搜索归档邮件", - "fullTextMultiAccount": "全文搜索 · 多账户 · 高级筛选", - "account": "账户", + "navigation": { + "accessTokens": "访问令牌", + "accounts": "账户", + "apiDocs": "API 文档", + "attachment": "附件", + "auth": "认证", + "dashboard": "仪表板", + "general": "常规", + "home": "首页", "mailbox": "邮箱", - "selectAccount": "选择账户", - "selectMailbox": "选择邮箱", - "noActiveEmailAccount": "没有活动的邮件账户。", - "addEmailAccount": "添加邮件账户", - "noMailboxSelectAccount": "没有邮箱。请先选择一个账户。", - "searchInSubjectBody": "在主题、正文、附件名字中搜索...", - "searchingButton": "搜索中...", - "searchButton": "搜索", - "advanced": "高级", - "clear": "清除", - "since": "自:", - "before": "之前:", - "selectDate": "选择日期", - "pleaseSelectAtLeastOne": "请至少选择一个搜索条件", - "cc": "抄送", - "bcc": "密送", - "attachmentName": "附件名称", - "messageId": "消息 ID", - "minSize": "最小", - "maxSize": "最大", - "senderRecipients": "发件人 / 收件人", - "attachmentsSize": "附件和大小", - "minimumBytes": "最小值", - "maximumBytes": "最大值", - "originalMessageIdHeader": "原始邮件 Message-ID 标头", - "addTags": { - "title": "编辑标签", - "none": "暂无标签", - "searchPlaceholder": "搜索或创建标签...", - "createHint": "创建新标签:{{tag}}", - "invalidTitle": "无效的标签", - "updatedTitle": "已更新标签", - "updatedDesc": "标签已成功更新", - "updateFailedTitle": "更新失败", - "tryAgain": "请稍后重试", - "selectedCount": "已选择 {{count}} 个标签", - "cancel": "取消", - "save": "保存", - "saving": "保存中..." - }, - "updateTags": { - "overwriteWarning": "警告:此操作将覆盖所选项目的所有现有标签。", - "title": "更新标签", - "none": "未选择标签", - "searchPlaceholder": "搜索或创建新标签...", - "createHint": "按回车键创建新标签:\"{{tag}}\"", - "selectedCount": "将应用 {{count}} 个标签", - "saving": "正在更新...", - "invalidTitle": "标签无效", - "updatedTitle": "标签已更新", - "updatedDesc": "标签已成功更新。", - "updateFailedTitle": "更新失败", - "tryAgain": "请稍后再试。", - "actionAdd": "追加", - "actionRemove": "移除", - "actionOverwrite": "覆盖", - "submitAdd": "追加标签", - "submitRemove": "移除标签", - "submitOverwrite": "覆盖标签", - "savingAdd": "正在追加...", - "savingRemove": "正在移除...", - "savingOverwrite": "正在覆盖..." - }, - "thread": { - "title": "会话 · 共 {{count}} 封邮件", - "error": "加载会话失败", - "empty": "此会话没有邮件", - "invalidDate": "无效日期", - "noSubject": "(无主题)", - "loadingMore": "加载中...", - "loadMore": "加载更多" - }, - "bulkActions": { - "ariaLabel": "已选择 {{count}} 条消息。批量操作工具栏", - "delete": "删除", - "deleteDesc": "删除选中的消息", - "selected": "已选择 {{count}} 项", - "clear": "清除选择", - "manageTags": "管理标签" - }, - "delete": { - "title": "删除消息", - "confirmPrefix": "确认要删除", - "countLabel": "{{count}} 条消息吗?", - "confirmDetail": "此操作无法撤销。", - "confirmButton": "删除", - "warningTitle": "警告", - "warningDesc": "删除的消息将被永久移除,无法恢复。", - "successTitle": "消息已删除", - "successDesc": "选定的消息已成功删除。", - "errorTitle": "删除失败" - } - }, - "mail": { - "emailViewer": "邮件查看器", - "noMessageSelected": "未选择消息", - "account": "账户", - "from": "发件人", - "to": "收件人", - "subject": "主题", - "date": "日期", - "tags": "标签", - "noTagsYet": "暂无标签", - "id": "ID", - "cc": "抄送", - "bcc": "密送", - "attachments": "附件", - "download": "下载", - "delete": "删除", - "viewThread": "查看对话", - "downloadStarted": "下载已开始", - "downloadComplete": "下载完成", - "downloadFailed": "下载失败", - "failedToDownloadFile": "下载文件失败", - "failedToLoadEmail": "加载邮件消息失败。", - "isBeingDownloaded": "{{id}} 正在下载", - "downloaded": "{{id}} 已下载", - "showLess": "显示更少", - "showMore": "显示更多...", - "onlyNonInlineAttachments": "此处仅显示非内联附件。", - "noAttachments": "无附件" + "oauth2": "OAuth2", + "other": "其他", + "settings": "设置", + "users": "系统用户" }, "oauth2": { - "title": "OAuth2", + "aSecretKeyProvidedByTheOAuthProvider": "由 OAuth 提供商提供的密钥,用于验证您的应用程序。", + "actions": { + "authorize": "授权", + "delete": "删除", + "edit": "编辑", + "openMenu": "打开菜单" + }, "addConfiguration": "添加配置", - "id": "ID", - "provider": "提供商", + "addExtraParams": "添加额外参数", + "addNew": "添加新配置", + "addScope": "添加作用域", + "areYouSureYouWantTo": "您确定要{{action}}此 OAuth2 客户端吗?", + "areYouSureYouWantToDelete": "您确定要删除", + "authAtatus": "OAuth2 认证状态", + "authFailed": "OAuth2 认证失败", + "authSuccess": "OAuth2 认证成功", + "authUrlLabel": "授权 URL:", + "authorizationUrlCannotBeEmpty": "授权 URL 不能为空", + "authorizationUrlIsRequired": "授权 URL 为必填项", + "authorize": "授权", + "authorizeAnEmailAccountToStartTheOAuth2AuthorizationProcess": "授权邮件账户以启动 OAuth2 授权流程。", + "authorizeEmailAccount": "授权邮件账户", + "backToLogin": "返回登录", + "clickSaveWhenDone": "完成后请点击保存。", "clientId": "客户端 ID", + "clientIdCannotBeEmpty": "客户端 ID 不能为空", + "clientIdIsRequired": "客户端 ID 为必填项", + "clientIdLabel": "客户端 ID:", "clientSecret": "客户端密钥", - "redirectUri": "重定向 URI", - "scopes": "作用域", - "status": "状态", - "enabled": "已启用", + "clientSecretCannotBeEmpty": "客户端密钥不能为空", + "clientSecretIsRequired": "客户端密钥为必填项", + "clientSecretLabel": "客户端密钥:", + "createAccount": "创建账户", + "createNewHere": "在此创建新配置。", + "created": "已创建", + "creating": "创建中...", + "creationFailed": "创建失败", + "delete": "删除", + "deleteFailed": "删除失败,请稍后重试", + "deleteSuccess": "删除成功", + "deleteToken": "删除令牌", + "describeThePurposeOfTheOauth2Application": "描述 oauth2 应用程序的用途", + "description": "自动处理访问令牌的获取、存储和刷新,确保无缝且始终就绪的认证体验。", + "descriptionLabel": "描述:", + "descriptionMustNotExceed255Characters": "描述不能超过 255 个字符。", + "disable": "禁用", + "disableOAuth2Client": "禁用 OAuth2 客户端", "disabled": "已禁用", "edit": "编辑", - "delete": "删除", "enable": "启用", - "disable": "禁用", - "noConfigurations": "无 OAuth2 配置", - "noConfigurationsDesc": "您尚未添加任何 OAuth2 配置。添加一个以开始使用 OAuth2 功能。", - "description": "自动处理访问令牌的获取、存储和刷新,确保无缝且始终就绪的认证体验。", - "addNew": "添加新配置", - "updateHere": "在此更新。", - "createNewHere": "在此创建新配置。", - "clickSaveWhenDone": "完成后请点击保存。", - "quickPresets": "快速预设:", - "gmail": "Gmail", - "outlook": "Outlook", - "whenDisabled": "禁用时:- 新的授权流程将立即被拒绝 - 现有的访问令牌和刷新令牌将在 1 分钟内被撤销 - 重新启用时用户必须重新授权", - "clientIdLabel": "客户端 ID:", - "enterYourClientId": "输入您的客户端 ID", - "theUniqueIdentifierForYourApplication": "您应用程序的唯一标识符,由 OAuth 提供商提供。", - "clientSecretLabel": "客户端密钥:", - "leaveEmptyToKeepExistingSecret": "留空以保持现有密钥", - "enterYourClientSecret": "输入您的客户端密钥", - "leaveEmptyToKeepTheExistingSecret": "留空以保持现有密钥。只有在要更改时才输入新值。", - "aSecretKeyProvidedByTheOAuthProvider": "由 OAuth 提供商提供的密钥,用于验证您的应用程序。", - "authUrlLabel": "授权 URL:", + "enableOAuth2Client": "启用 OAuth2 客户端", + "enabled": "已启用", + "enterIdToConfirmDeletion": "输入 ID 以确认删除。", "enterTheAuthorizationUrl": "输入授权 URL", - "theUrlWhereUsersWillBeRedirected": "用户将被重定向以授权您的应用程序的 URL。", - "tokenUrlLabel": "令牌 URL:", - "enterTheTokenUrl": "输入令牌 URL", - "theUrlUsedToExchange": "用于将授权代码交换为访问令牌的 URL。", - "redirectUrlLabel": "重定向 URL:", - "enterYourRedirectUrl": "输入您的重定向 URL", - "theRedirectUrlAfterAuthorization": "授权后的重定向 URL。它必须与在 OAuth 提供商处注册的 URL 匹配。使用格式 http://[host]:[port]/oauth2/callback(或 https://),其中 [host] 和 [port] 与您的 RustMailer 部署匹配。路径 /oauth2/callback 是固定的。", - "scope": "作用域:", - "enterTheScopeHere": "在此输入作用域。", - "addScope": "添加作用域", - "key": "键:", "enterTheKeyHere": "在此输入键。", - "value": "值:", + "enterTheScopeHere": "在此输入作用域。", + "enterTheTokenUrl": "输入令牌 URL", "enterTheValueHere": "在此输入值。", - "addExtraParams": "添加额外参数", - "useProxyOptional": "使用代理(可选):", - "selectAProxy": "选择代理", - "noProxyAvailable": "无可用代理", - "useSocks5ProxyForOAuthRequests": "当直接访问被阻止时,使用 SOCKS5 代理进行 OAuth 请求。", - "descriptionLabel": "描述:", - "describeThePurposeOfTheOauth2Application": "描述 oauth2 应用程序的用途", - "optional": "可选", - "saving": "保存中...", - "creating": "创建中...", - "saveChanges": "保存更改", - "save": "保存", - "updated": "已更新", - "created": "已创建", - "yourOAuth2ApplicationHasBeenSuccessfully": "您的 OAuth2 应用程序已成功{{action}}。", - "updateFailed": "更新失败", - "creationFailed": "创建失败", - "updateOrCreationFailed": "{{action}}失败,请稍后重试", - "clientSecretIsRequired": "客户端密钥为必填项", - "clientSecretCannotBeEmpty": "客户端密钥不能为空", - "keyIsRequired": "键为必填项", - "keyCannotBeEmpty": "键不能为空", - "valueIsRequired": "值为必填项", - "valueCannotBeEmpty": "值不能为空", - "descriptionMustNotExceed255Characters": "描述不能超过 255 个字符。", - "clientIdIsRequired": "客户端 ID 为必填项", - "clientIdCannotBeEmpty": "客户端 ID 不能为空", - "authorizationUrlIsRequired": "授权 URL 为必填项", - "authorizationUrlCannotBeEmpty": "授权 URL 不能为空", - "invalidAuthorizationUrlFormat": "无效的授权 URL 格式", - "tokenUrlIsRequired": "令牌 URL 为必填项", - "tokenUrlCannotBeEmpty": "令牌 URL 不能为空", - "invalidTokenUrlFormat": "无效的令牌 URL 格式", - "redirectUriIsRequired": "重定向 URI 为必填项", - "redirectUriCannotBeEmpty": "重定向 URI 不能为空", - "invalidRedirectUriFormat": "无效的重定向 URI 格式", - "authorizeEmailAccount": "授权邮件账户", - "authorizeAnEmailAccountToStartTheOAuth2AuthorizationProcess": "授权邮件账户以启动 OAuth2 授权流程。", - "loadingAccounts": "加载账户中...", - "selectAnAccount": "选择账户", - "noEmailAccountsRegistered": "未注册邮件账户。请创建一个。", - "pleaseCreateOne": "请创建一个。", - "createAccount": "创建账户", - "authorize": "授权", + "enterYourClientId": "输入您的客户端 ID", + "enterYourClientSecret": "输入您的客户端密钥", + "enterYourRedirectUrl": "输入您的重定向 URL", + "error": "错误", "getAuthorizeUrlFailed": "获取授权 URL 失败", "getAuthorizeUrlFailedDesc": "获取授权 URL 失败,请稍后重试", - "oauth2ClientUpdated": "OAuth2 客户端已更新", - "oauth2ClientHasBeenSuccessfully": "OAuth2 客户端已成功{{action}}。", - "statusUpdateFailed": "状态更新失败,请稍后重试", - "disableOAuth2Client": "禁用 OAuth2 客户端", - "enableOAuth2Client": "启用 OAuth2 客户端", - "areYouSureYouWantTo": "您确定要{{action}}此 OAuth2 客户端吗?", - "thisWillPreventTheOAuth2ClientFromBeingUsed": "这将阻止 OAuth2 客户端被使用。", - "deleteToken": "删除令牌", - "areYouSureYouWantToDelete": "您确定要删除", - "thisActionWillPermanentlyRemoveTheOauth2Record": "此操作将永久从系统中删除 oauth2 记录。此操作无法撤销。", - "enterIdToConfirmDeletion": "输入 ID 以确认删除。", - "warning": "警告!", - "pleaseBeCareful": "请小心,此操作无法回滚。", - "deleteSuccess": "删除成功", - "yourOAuth2ApplicationHasBeenSuccessfullyDeleted": "您的 OAuth2 应用程序已成功删除。", - "oauth2DeleteFailed": "OAuth2 删除失败", - "deleteFailed": "删除失败,请稍后重试", - "actions": { - "openMenu": "打开菜单", - "edit": "编辑", - "authorize": "授权", - "delete": "删除" - }, - "authFailed": "OAuth2 认证失败", - "error": "错误", - "unknownError": "发生未知错误。", - "tryAgain": "重试", + "gmail": "Gmail", "goHome": "返回首页", - "authSuccess": "OAuth2 认证成功", + "goToAccounts": "前往账户管理", + "id": "ID", + "information": "信息", + "invalidAuthorizationUrlFormat": "无效的授权 URL 格式", + "invalidRedirectUriFormat": "无效的重定向 URI 格式", + "invalidTokenUrlFormat": "无效的令牌 URL 格式", + "key": "键:", + "keyCannotBeEmpty": "键不能为空", + "keyIsRequired": "键为必填项", + "leaveEmptyToKeepExistingSecret": "留空以保持现有密钥", + "leaveEmptyToKeepTheExistingSecret": "留空以保持现有密钥。只有在要更改时才输入新值。", + "loadingAccounts": "加载账户中...", + "noConfigurations": "无 OAuth2 配置", + "noConfigurationsDesc": "您尚未添加任何 OAuth2 配置。添加一个以开始使用 OAuth2 功能。", + "noEmailAccountsRegistered": "未注册邮件账户。请创建一个。", + "noProxyAvailable": "无可用代理", + "noStatus": "本页面显示您 OAuth2 认证的结果。目前没有可用的具体状态。如有需要,请重试。", + "oauth2ClientHasBeenSuccessfully": "OAuth2 客户端已成功{{action}}。", + "oauth2ClientUpdated": "OAuth2 客户端已更新", + "oauth2DeleteFailed": "OAuth2 删除失败", + "optional": "可选", + "outlook": "Outlook", + "pleaseBeCareful": "请小心,此操作无法回滚。", + "pleaseCreateOne": "请创建一个。", + "provider": "提供商", + "quickPresets": "快速预设:", + "redirectUri": "重定向 URI", + "redirectUriCannotBeEmpty": "重定向 URI 不能为空", + "redirectUriIsRequired": "重定向 URI 为必填项", + "redirectUrlLabel": "重定向 URL:", + "save": "保存", + "saveChanges": "保存更改", + "saving": "保存中...", + "scope": "作用域:", + "scopes": "作用域", + "selectAProxy": "选择代理", + "selectAnAccount": "选择账户", + "status": "状态", + "statusUpdateFailed": "状态更新失败,请稍后重试", "success": "成功", "successMessage": "您的邮箱账户已通过 OAuth2 成功认证。访问令牌已被系统保存,并会在需要时自动更新。", - "goToAccounts": "前往账户管理", - "authAtatus": "OAuth2 认证状态", - "information": "信息", - "noStatus": "本页面显示您 OAuth2 认证的结果。目前没有可用的具体状态。如有需要,请重试。", - "backToLogin": "返回登录" - }, - "accessTokens": { - "title": "访问令牌", - "name": "名称", - "accounts": "账户", - "token": "令牌", - "createdAt": "创建时间", - "expiresAt": "过期时间", - "edit": "编辑", - "delete": "删除", - "create": "创建", - "noTokens": "无访问令牌", - "noTokensDesc": "您尚未创建任何访问令牌。创建一个以开始使用 API 功能。", - "description": "在此管理您的访问令牌、访问控制、IP 白名单和速率限制设置。", - "editToken": "编辑令牌", - "addNew": "添加新令牌", - "updateTheAccessTokenHere": "在此更新访问令牌。", - "createNewAccessTokenHere": "在此创建新访问令牌。", - "selectAccounts": "选择账户", - "selectMultipleAccountsForTheAccessToken": "为访问令牌的授权范围选择多个账户。", - "enterOneIpAddressPerLine": "每行输入一个 IP 地址,例如:\n192.168.1.1\n192.168.1.2", - "aListOfIpAddressesAllowed": "允许访问资源的 IP 地址列表。每行输入一个 IP 地址。(可选)", - "enterQuota": "输入配额,例如:100", - "theMaximumNumberOfRequestsAllowed": "在时间间隔内允许的最大请求数。(可选)", - "enterIntervalInSeconds": "输入时间间隔(秒),例如:60", - "theTimeWindowForTheRateLimit": "速率限制的时间窗口(秒)。(可选)", - "describeThePurposeOfTheAccessToken": "描述访问令牌的用途", - "updating": "更新中...", - "saving": "保存中...", - "creating": "创建中...", - "saveChanges": "保存更改", - "save": "保存", - "updated": "已更新", - "created": "已创建", - "yourAccessTokenHasBeenSuccessfully": "您的访问令牌已成功{{action}}。", - "updateFailed": "更新失败", - "creationFailed": "创建失败", - "updateOrCreationFailed": "{{action}}失败,请稍后重试", - "quotaMustBeAPositiveInteger": "配额必须是正整数。", - "intervalMustBeAPositiveInteger": "时间间隔必须是正整数。", - "invalidIpAddressesFound": "发现无效的 IP 地址。请输入有效的 IPv4 或 IPv6 地址。", - "atLeastOneAccountIsRequired": "至少需要一个账户。", - "descriptionMustNotExceed255Characters": "描述不能超过 255 个字符。", - "notUsedYet": "尚未使用", - "theListOfAccountsThatCanBeQueried": "可以使用访问令牌查询的账户列表。", - "accountId": "账户 ID", - "filterByEmailAddressOrAccountId": "按邮箱地址或账户 ID 筛选...", - "aclRulesForAccessTokens": "访问令牌的 ACL 规则包括 IP 白名单验证和速率限制执行。", - "actions": { - "openMenu": "打开菜单", - "edit": "编辑", - "delete": "删除" - }, - "quota": "配额", - "interval": "间隔" - }, - "settings": { - "appearance": { - "title": "外观设置", - "field": { - "language": "语言", - "theme": "界面主题" - }, - "description": { - "language": "选择 Web 界面显示的语言。", - "theme": "为界面选择浅色或深色显示模式。" - }, - "placeholder": { - "select_language": "选择语言" - }, - "command": { - "search": "搜索语言...", - "no_results": "未找到相关语言。" - }, - "theme": { - "light": "浅色", - "dark": "深色" - }, - "button": { - "update": "更新偏好设置" - }, - "validation": { - "language": { - "required": "请选择一种语言。" - }, - "theme": { - "required": "请选择一个主题。" - } - } - }, - "title": "设置", - "general": "常规", - "proxy": "网络代理", - "name": "名称", - "host": "主机", - "port": "端口", - "username": "用户名", - "password": "密码", - "type": "类型", - "actions": "操作", - "edit": "编辑", - "delete": "删除", - "add": "添加", - "noProxies": "无代理", - "noProxiesDesc": "您尚未添加任何代理配置。添加一个以开始使用代理功能。", - "root": "管理员账户", - "rootTitle": "管理员账户", - "rootDesc": "管理root账户访问凭据,包括令牌和密码。", - "rootAccessManagement": "root账户访问管理", - "manageRootTokenAndPassword": "安全地管理root账户令牌和密码。", - "resetRootToken": "重置root账户令牌", - "generateNewToken": "生成新令牌,旧令牌立即失效。", - "reset": "重置", - "resetRootPassword": "重置root账户密码", - "changePasswordForFutureLogins": "更改未来登录的密码。", - "youAreAboutToResetTheRootToken": "您即将重置root账户令牌。此操作无法撤销。", - "confirmReset": "确认重置", - "youAreAboutToResetTheRootPassword": "您即将重置root账户密码。请确保安全存储。", - "enterNewRootPassword": "输入新的root账户密码", - "theRootTokenHasBeenReset": "root账户令牌已重置", - "yourLoginInformationHasBeenUpdated": "您的登录信息已更新。无需重新登录。", - "invalidPassword": "密码无效", - "rootPasswordMustBeAtLeast6Characters": "root账户密码必须至少为 6 个字符。", - "theRootPasswordHasBeenReset": "root账户密码已重置", - "useNewPasswordForNextLogin": "下次登录时使用新密码。", - "failedToCopyText": "复制文本失败", - "filterProxy": "筛选代理...", - "filterOauth2": "筛选 oauth2...", - "filterAccount": "筛选账户...", - "filterAccessToken": "筛选访问令牌...", - "selectAll": "全选", - "theme": "主题", - "id": "ID", - "url": "URL", - "createdAt": "创建时间", - "updatedAt": "更新时间", - "enabled": "已启用", - "useProxy": "使用代理", - "authUrl": "授权 URL", - "tokenUrl": "令牌 URL", - "description": "描述", - "token": "令牌", - "accounts": "账户", - "acl": "访问控制列表", - "lastAccess": "最后访问", - "enterProxyIdToConfirmDeletion": "输入代理 ID 以确认删除。", - "updateTheProxyHere": "在此更新代理。", - "addNewProxyHere": "在此添加新代理。", - "pleaseUseAnIpAddressForBetterReliability": "请使用 IP 地址(例如:127.0.0.1)而不是主机名或域名,以获得更好的可靠性。", - "adding": "添加中...", - "yourProxyHasBeenSuccessfully": "您的代理已成功{{action}}。", - "proxyUpdateOrAddFailed": "{{action}}失败,请稍后重试", - "sidebar": { - "profile": "个人资料", - "apiTokens": "API 令牌", - "proxy": "网络代理", - "configurations": "系统配置" - }, - "profile": { - "loadError": "加载用户信息失败。", - "uploadTitle": "上传头像", - "maxSize": "最大 {{size}}", - "avatarAlt": "头像", - "removeAvatar": "移除头像", - "uploadError": "文件上传错误", - "field": { - "username": "用户名", - "email": "邮箱", - "password": "密码" - }, - "placeholder": { - "password_keep": "留空以保持当前密码" - }, - "button": { - "update_profile": "更新资料", - "permissions": "权限", - "view_global_permissions": "查看全局权限" - }, - "section": { - "roles": "角色", - "accounts": "已关联 {{count}} 个账户" - }, - "account": { - "id": "账户 ID:{{id}}" - }, - "toast": { - "updated": "个人资料更新成功", - "update_failed": "个人资料更新失败" - }, - "validation": { - "username": { - "required": "用户名不能为空", - "min": "用户名长度至少为 5 个字符", - "max": "用户名长度不能超过 32 个字符" - }, - "email": { - "required": "邮箱不能为空", - "invalid": "请输入有效的邮箱地址" - }, - "password": { - "min": "密码长度至少为 8 个字符", - "max": "密码长度不能超过 256 个字符" - } - } - } - }, - "apiDocs": { - "choosePreferredType": "选择您首选的 API 文档类型", - "swaggerUI": "Swagger UI", - "reDoc": "ReDoc", - "openAPIExplorer": "OpenAPI Explorer", - "scalar": "Scalar", - "downloadSpecYAML": "下载规范 YAML" - }, - "dialogs": { - "confirmDelete": "确认删除", - "confirmDeleteDesc": "您确定要删除此项吗?此操作无法撤销。", - "deleteSuccess": "删除成功", - "deleteFailed": "删除失败", - "saveSuccess": "保存成功", - "saveFailed": "保存失败", - "createSuccess": "创建成功", - "createFailed": "创建失败", - "updateSuccess": "更新成功", - "updateFailed": "更新失败", - "continue": "继续", - "deleting": "删除中...", - "accountDeleted": "账户已删除", - "accountDeletedDesc": "您的账户已成功删除。", - "accountDeleteFailed": "账户删除失败", - "deleteAccountPermanently": "永久删除账户", - "youAreDeleting": "您正在删除 {{email}}。这将永久移除:", - "accountCredentials": "账户凭据和设置", - "localCachedMetadata": "本地缓存的元数据和同步状态", - "imapSyncData": "IMAP 同步数据", - "oauthTokens": "OAuth 令牌和 API 凭据", - "typeEmailToConfirm": "请输入账户邮箱以确认:", - "typeToConfirm": "请输入 \"{{email}}\" 以确认", - "cannotBeUndone": "此操作无法撤销!", - "allResourcesErased": "所有相关资源将被永久删除。", - "permanentlyDeleteAccount": "永久删除账户" - }, - "command": { - "typeCommandOrSearch": "输入命令或搜索...", - "noResultsFound": "未找到结果。", - "theme": "主题", - "light": "浅色", - "dark": "深色" - }, - "validation": { - "required": "此字段为必填项", - "invalidEmail": "无效的电子邮件地址", - "invalidUrl": "无效的 URL", - "passwordMinLength": "密码长度至少为 {{min}} 个字符", - "pleaseEnterPassword": "请输入您的密码", - "passwordRequired": "当认证方法为密码时,密码为必填项", - "emailRequired": "邮箱为必填项", - "imapHostRequired": "IMAP 主机为必填项", - "imapHostCannotBeEmpty": "IMAP 主机不能为空", - "imapPortMustBePositive": "IMAP 端口必须是正整数", - "imapPortMustBeLessThan65536": "IMAP 端口必须小于 65536", - "folderLimitMustBeNumber": "文件夹限制必须是数字", - "folderLimitMustBeAtLeast100": "文件夹限制必须至少为 100", - "incrementalSyncMustBeNumber": "增量同步间隔必须是数字", - "incrementalSyncMustBeAtLeast10": "增量同步间隔必须至少为 10 分钟", - "pleaseEnterUsernameOrEmail": "请输入您的用户名或邮箱", - "singleRequestBatchSizeMustBeNumber": "批大小必须是数字", - "singleRequestBatchSizeTooSmall": "批大小必须至少为10", - "singleRequestBatchSizeTooLarge": "批大小必须最多为200" - }, - "table": { - "noResults": "未找到结果", - "loading": "加载中...", - "page": "第", - "of": "页,共", - "rowsPerPage": "每页行数", - "showing": "显示", - "to": "到", - "results": "条结果", - "asc": "升序", - "desc": "降序", - "hide": "隐藏", - "edit": "编辑", - "delete": "删除", - "pagination": { - "selected": "已选择 {{selected}} / {{total}} 行。", - "fixed_page_size": "每页 {{size}} 行。", - "rows_per_page": "每页行数", - "page_info": "第 {{page}} 页,共 {{total}} 页", - "first": "跳转到第一页", - "previous": "上一页", - "next": "下一页", - "last": "跳转到最后一页" - } - }, - "proxyDelete": { - "title": "删除代理", - "successTitle": "删除成功", - "successDesc": "代理已成功删除。", - "close": "关闭", - "failedTitle": "删除代理失败", - "failedDesc": "删除失败,请稍后重试", + "theRedirectUrlAfterAuthorization": "授权后的重定向 URL。它必须与在 OAuth 提供商处注册的 URL 匹配。使用格式 http://[host]:[port]/oauth2/callback(或 https://),其中 [host] 和 [port] 与您的 RustMailer 部署匹配。路径 /oauth2/callback 是固定的。", + "theUniqueIdentifierForYourApplication": "您应用程序的唯一标识符,由 OAuth 提供商提供。", + "theUrlUsedToExchange": "用于将授权代码交换为访问令牌的 URL。", + "theUrlWhereUsersWillBeRedirected": "用户将被重定向以授权您的应用程序的 URL。", + "thisActionWillPermanentlyRemoveTheOauth2Record": "此操作将永久从系统中删除 oauth2 记录。此操作无法撤销。", + "thisWillPreventTheOAuth2ClientFromBeingUsed": "这将阻止 OAuth2 客户端被使用。", + "title": "OAuth2", + "tokenUrlCannotBeEmpty": "令牌 URL 不能为空", + "tokenUrlIsRequired": "令牌 URL 为必填项", + "tokenUrlLabel": "令牌 URL:", "tryAgain": "重试", - "confirmText": "您确定要删除", - "permanent": "此操作将永久删除该代理,无法撤销。", - "proxyIdLabel": "代理 ID:", - "proxyIdPlaceholder": "输入代理 ID 以确认删除。", - "warningTitle": "警告!", - "warningDesc": "请小心,此操作无法回滚。", - "deleteBtn": "删除" - }, - "systemConfig": { - "pageTitle": "系统级配置", - "pageDescription": "这些参数通过 CLI 标志或环境变量初始化。它们当前为只读,以确保环境一致性。", - "status": { - "enabled": "已启用", - "disabled": "已禁用", - "configured": "已配置", - "missing": "缺失", - "auto": "自动", - "notSet": "未设置" - }, - "sections": { - "network": { - "title": "网络", - "desc": "HTTP 与公共访问" - }, - "cors": { - "title": "CORS", - "desc": "跨域访问规则" - }, - "logging": { - "title": "日志", - "desc": "日志输出行为" - }, - "storage": { - "title": "存储与缓存", - "desc": "数据库路径与限制" - }, - "security": { - "title": "安全", - "desc": "身份验证与加密" - }, - "performance": { - "title": "性能", - "desc": "并发与压缩" - }, - "smtp": { - "title": "SMTP 服务器", - "desc": "内置邮件接收服务设置,用于实时归档" - } - } - }, - "apiTokens": { - "page": { - "loadError": "加载 API 令牌失败。", - "emptyTitle": "无 API 令牌", - "emptyDescription": "您尚未创建任何 API 令牌。点击下方按钮创建一个。", - "addBtn": "添加令牌" - }, - "list": { - "unnamedToken": "未命名令牌", - "statusActive": "已激活", - "statusExpired": "已过期", - "neverExpires": "永不过期", - "expiresOnShort": "有效期至 {{date}}", - "tokenLabel": "令牌", - "createdLabel": "创建于", - "lastUsedLabel": "最后使用", - "expiresOnLabel": "有效期至", - "neverUsed": "未使用", - "neverLabel": "从不", - "deleteBtn": "删除令牌" - }, - "dialog": { - "createTitle": "创建访问令牌", - "editTitle": "编辑访问令牌", - "description": "完成后点击保存。", - "save": "保存", - "saveChanges": "保存修改" - }, - "deleteDialog": { - "title": "删除访问令牌?", - "description": "此操作无法撤销。任何使用此令牌的应用将立即失去访问权限。", - "cancel": "取消", - "confirm": "删除", - "deleting": "正在删除..." - }, - "form": { - "nameLabel": "名称", - "namePlaceholder": "为该访问令牌起一个简短的名称", - "nameDescription": "可选 · 最多 32 个字符", - "expirationLabel": "有效期", - "expirationPlaceholder": "选择有效期", - "expirationDescription": "令牌将在选定时间后自动过期。", - "never": "永久", - "1day": "1 天", - "7days": "7 天", - "30days": "30 天", - "errorMax": "最多 32 个字符", - "errorNumber": "必须为数字", - "errorInt": "必须为整数", - "errorPositive": "必须大于 0" - }, - "notifications": { - "createSuccess": "访问令牌已创建", - "createSuccessDesc": "访问令牌已成功创建。", - "updateSuccess": "访问令牌已更新", - "updateSuccessDesc": "访问令牌已成功更新。", - "createFailed": "创建失败", - "updateFailed": "更新失败", - "deleteSuccess": "访问令牌已成功删除", - "deleteFailed": "删除访问令牌失败", - "copied": "已复制到剪贴板", - "genericError": "操作失败,请重试。", - "close": "关闭", - "tryAgain": "重试" - } + "unknownError": "发生未知错误。", + "updateFailed": "更新失败", + "updateHere": "在此更新。", + "updateOrCreationFailed": "{{action}}失败,请稍后重试", + "updated": "已更新", + "useProxyOptional": "使用代理(可选):", + "useSocks5ProxyForOAuthRequests": "当直接访问被阻止时,使用 SOCKS5 代理进行 OAuth 请求。", + "value": "值:", + "valueCannotBeEmpty": "值不能为空", + "valueIsRequired": "值为必填项", + "warning": "警告!", + "whenDisabled": "禁用时:- 新的授权流程将立即被拒绝 - 现有的访问令牌和刷新令牌将在 1 分钟内被撤销 - 重新启用时用户必须重新授权", + "yourOAuth2ApplicationHasBeenSuccessfully": "您的 OAuth2 应用程序已成功{{action}}。", + "yourOAuth2ApplicationHasBeenSuccessfullyDeleted": "您的 OAuth2 应用程序已成功删除。" }, "permission": { - "scope": { - "global": "全局", - "account": "账户 #{{id}}" - }, - "dialog": { - "global_title": "全局权限", - "account_title": "账户权限", - "global_description": "授予该用户的系统级权限。", - "account_description": "仅适用于指定账户的权限。" - }, - "category": { - "system_identity": "系统与身份", - "global_data": "全局数据(管理员)", - "account": "账户权限" - }, - "system": { - "access": "基础系统访问", - "root": "系统最高控制权" - }, - "user": { - "manage": "管理所有用户", - "view": "查看基础用户名" - }, - "token": { - "manage": "管理访问令牌" - }, "account": { "create": "创建邮箱账户", "manage": "管理分配的账户", "manage_all": "管理所有账户配置", "read_details": "查看账户详细信息" }, + "category": { + "account": "账户权限", + "global_data": "全局数据(管理员)", + "system_identity": "系统与身份" + }, "data": { - "read": "读取分配账户的邮件数据", - "read_all": "读取所有邮件数据", - "manage": "管理分配账户的邮件元数据", - "manage_all": "管理所有邮件元数据", - "raw_download": "下载分配账户的原始邮件", - "raw_download_all": "下载所有原始邮件", "delete": "删除分配账户的邮件", "delete_all": "删除所有账户的邮件", "export_batch": "批量导出分配账户的数据", "export_batch_all": "批量导出所有数据", "import_batch": "批量导入邮件数据", + "manage": "管理分配账户的邮件元数据", + "manage_all": "管理所有邮件元数据", + "raw_download": "下载分配账户的原始邮件", + "raw_download_all": "下载所有原始邮件", + "read": "读取分配账户的邮件数据", + "read_all": "读取所有邮件数据", "smtp_ingest": "通过 SMTP 协议归档邮件" - } - }, - "users": { - "columns": { - "id": "ID", - "avatar": "头像", - "username": "用户名", - "email": "邮箱地址", - "roles": "角色权限", - "created_at": "创建时间", - "updated_at": "更新时间", - "actions": "操作" }, - "buttons": { - "add": "添加用户", - "add_new": "添加新用户" + "dialog": { + "account_description": "仅适用于指定账户的权限。", + "account_title": "账户权限", + "global_description": "授予该用户的系统级权限。", + "global_title": "全局权限" }, - "empty": { - "title": "未发现用户", - "description": "点击下方按钮开始添加第一个用户。" + "scope": { + "account": "账户 #{{id}}", + "global": "全局" }, - "nav": { - "users": "用户", - "roles": "角色", - "api_tokens": "API 令牌" + "system": { + "access": "基础系统访问", + "root": "系统最高控制权" }, - "api_tokens": { - "empty": { - "title": "未找到 API 令牌", - "description": "系统中尚未生成任何 API 令牌。" - }, - "button": { - "generate": "生成新令牌" - }, - "toolbar": { - "search_placeholder": "按名称、所有者或令牌搜索..." - }, - "table": { - "name": "名称", - "type": "类型", - "last_used": "上次使用", - "expires_at": "过期时间", - "owner": "所有者", - "created": "创建时间", - "api_key": "API 密钥", - "web_ui": "Web 界面", - "never": "从未", - "permanent": "永久", - "expired": "已过期", - "unnamed": "未命名令牌" - }, - "unnamed": "未命名令牌", - "delete": { - "title": "删除 API 令牌", - "desc": "你即将永久删除该 API 令牌", - "prefix": "令牌前缀", - "irreversible": "此操作无法撤销。任何使用该令牌的应用将立即失去访问权限。", - "confirm_label": "为确认操作,请在下方输入 {{word}}:", - "confirm_placeholder": "输入“{{word}}”以确认", - "warning_title": "警告", - "warning_desc": "任何使用该令牌的脚本、服务或集成都会失败。请在继续之前确保已更新你的系统。", - "confirm_button": "删除令牌", - "deleting": "正在删除..." - }, - "toast": { - "deleted_title": "API 令牌已删除", - "deleted_desc": "令牌“{{name}}”已成功移除。", - "delete_failed_title": "删除失败", - "delete_failed": "删除令牌失败,请重试。" - } + "token": { + "manage": "管理访问令牌" }, - "tokens": { - "schema": { - "name_max": "最多 32 个字符", - "expire_number": "必须是数字", - "expire_int": "必须是整数", - "expire_positive": "必须大于 0" - }, - "toast": { - "update_success_title": "访问令牌已更新", - "update_success_desc": "访问令牌已成功更新。", - "create_success_title": "访问令牌已创建", - "create_success_desc": "访问令牌已成功创建。", - "update_failed_title": "更新失败", - "create_failed_title": "创建失败" - }, - "error": { - "fallback": "操作失败,请稍后重试。" - }, - "dialog": { - "edit_title": "编辑访问令牌", - "create_title": "创建访问令牌", - "description": "完成后点击保存。" - }, - "fields": { - "name_label": "名称", - "name_placeholder": "为该访问令牌起一个简短的名称", - "name_hint": "可选 · 最多 32 个字符", - "expire_label": "有效期", - "expire_placeholder": "选择有效期", - "expire_hint": "令牌将在选定的时间后自动过期。" - }, - "expire_options": { - "never": "永不过期", - "1_day": "1 天", - "7_days": "7 天", - "30_days": "30 天" - } - }, - "tokens_action": { - "dialog": { - "title": "API 令牌", - "description": "管理此用户的 API 令牌。您可以查看、复制或监控令牌使用情况。" - }, - "empty": { - "title": "无 API 令牌", - "description": "该用户目前没有 API 令牌。点击下方按钮创建一个。" - }, - "buttons": { - "add": "添加令牌" - }, - "list": { - "unnamed_token": "未命名令牌", - "status_expired": "已过期", - "status_active": "活跃", - "expires_on_brief": "有效期至 {{date}}", - "never_expires": "永不过期", - "label_token": "令牌", - "label_created": "创建于", - "label_last_used": "上次使用", - "label_expires_at": "过期时间", - "never": "从未", - "button_delete": "删除令牌" - }, - "delete_dialog": { - "title": "删除访问令牌?", - "description": "此操作无法撤销。任何正在使用此令牌的应用程序都将立即失去访问权限。" - } - }, - "actions": { - "schema": { - "account_required": "请选择一个账户", - "role_required": "请选择一个角色", - "username_required": "用户名不能为空", - "username_min": "用户名长度至少为 3 个字符", - "username_max": "用户名长度不能超过 32 个字符", - "email_required": "邮箱地址不能为空", - "email_invalid": "请输入有效的邮箱地址", - "global_role_required": "请至少为此用户分配一个全局角色", - "description_max": "描述长度不能超过 256 个字符", - "ip_invalid": "发现无效的 IP 地址", - "password_required": "密码不能为空", - "password_min": "密码长度至少为 8 个字符", - "password_max": "密码长度不能超过 256 个字符" - }, - "toast": { - "updated": "用户已更新", - "created": "用户已创建" - }, - "dialog": { - "edit_title": "编辑用户: {{name}}", - "create_title": "创建新用户", - "subtitle": "配置身份、访问级别和安全策略。" - }, - "tabs": { - "general": "基本信息", - "permissions": "账户权限", - "security": "安全与 ACL" - }, - "sections": { - "basic": "基础身份", - "global": "全局权限", - "mail_access": "邮件访问控制", - "mail_access_subtitle": "定义此用户可以管理的邮件账户。", - "policy": "策略开关" - }, - "fields": { - "username": "用户名", - "username_hint": "用于系统登录的唯一标识。", - "email": "邮箱地址", - "email_hint": "主要联系方式和通知地址。", - "password": "密码", - "password_placeholder_create": "至少 8 个字符", - "password_placeholder_edit": "留空则保持当前密码", - "password_hint_create": "初始用户设置的安全密码。", - "password_hint_edit": "仅在您希望更改密码时输入新密码。", - "global_roles_hint": "分配高级系统权限。可以选择多个角色。", - "description": "描述(可选)", - "description_placeholder": "添加关于此用户的一些注释...", - "description_hint": "此账户的内部说明或附加背景信息(最多 256 个字符)。", - "select_account": "选择账户", - "assign_role": "分配角色", - "ip_whitelist": "IP 白名单", - "ip_whitelist_hint": "限制这些 IP 地址登录(每行一个)。", - "rate_quota": "频率限额", - "burst_interval": "突发间隔 (秒)" - }, - "buttons": { - "add_account": "添加账户", - "update": "更新用户", - "create": "创建用户" - }, - "states": { - "full_access": "全权限模式", - "full_access_desc": "拥有系统管理员角色的用户拥有对所有账户的固有访问权限,无需手动分配。", - "no_accounts": "未分配特定账户。", - "security_disabled": "此用户当前禁用了高级安全策略。" - }, - "api_tokens": "API 令牌", - "placeholder": { - "filter": "搜索用户..." - }, - "delete": { - "title": "删除用户", - "confirm_msg": "您即将永久删除用户 {{name}} (ID: {{id}})。", - "irreversible": "此操作无法撤销。", - "input_label": "为确认操作,请在下方输入用户 ID:", - "placeholder": "输入 \"{{id}}\" 以确认", - "alert_title": "警告:此操作是永久性的。", - "alert_desc": "一旦删除,该用户及其所有相关数据将立即被清除。请在继续操作前核实此账户是否已不再需要。", - "button_confirm": "删除用户", - "button_deleting": "正在删除...", - "toast": { - "success_title": "用户已删除", - "success_desc": "用户 \"{{name}}\" (ID: {{id}}) 已成功移除。", - "failed_title": "删除失败", - "failed_fallback": "删除用户失败,请重试。" - } - } - } - }, - "roles": { - "title": { - "create": "创建新角色", - "edit": "编辑角色: {{name}}" - }, - "description_hint": "定义访问范围和功能权限。", - "form": { - "name_label": "角色名称", - "type_label": "角色类型", - "desc_label": "描述", - "matrix_label": "{{type}} 权限矩阵", - "builtin_badge": "内置角色", - "builtin_desc": "此角色由系统预定义。其权限为**只读**,无法被修改。" - }, - "types": { - "Global": "全局", - "Account": "账户" - }, - "categories": { - "identity": "身份与管理", - "global_data": "全局数据访问", - "account_resource": "账户资源访问" - }, - "actions": { - "cancel": "取消", - "submit_create": "创建角色", - "submit_update": "更新角色", - "success_create": "角色创建成功", - "success_update": "角色更新成功", - "failed": "操作失败", - "close": "关闭", - "retry": "重试", - "add": "添加角色" - }, - "validation": { - "name_required": "角色名称不能为空", - "perm_required": "请至少选择一个权限" - }, - "columns": { - "id": "ID", - "name": "名称", - "role_type": "角色类型", - "permissions": "权限", - "created_at": "创建时间", - "updated_at": "更新时间" - }, - "placeholder": { - "filter": "搜索角色..." - }, - "delete": { - "dialog_title": "删除用户角色", - "warning_text": "您即将永久删除角色 {{name}} (ID: {{id}})。", - "irreversible": "此操作无法撤销。", - "confirm_label": "请键入角色 ID 以确认:", - "placeholder": "键入 \"{{id}}\" 以确认", - "alert_title": "警告:此操作是永久性的。", - "alert_desc": "删除此角色将从所有当前分配了该角色的用户中将其移除。在继续之前,请确保您已检查并重新分配受影响的用户。", - "confirm_btn": "删除角色", - "deleting": "正在删除...", - "success_title": "角色已删除", - "success_desc": "用户角色 \"{{name}}\" (ID: {{id}}) 已成功移除。", - "error_title": "删除失败", - "error_fallback": "无法删除该角色,请稍后重试。" - }, - "details": { - "title": "角色权限: {{name}}", - "unknown": "未知角色", - "role_badge": "{{type}} 角色", - "desc_global": "全局管理与系统级访问权限。", - "desc_account": "单个账户的访问及数据操作权限。", - "close_btn": "关闭详情视图", - "view_permissions": "权限详情" - }, - "empty": { - "title": "未找到角色", - "desc": "您尚未创建任何自定义角色。点击下方按钮开始添加新角色。" + "user": { + "manage": "管理所有用户", + "view": "查看基础用户名" } }, "profile": { @@ -1497,118 +820,811 @@ "sign_out": "退出登录" } }, - "sign_out": { - "title": "退出登录", - "desc": "您确定要退出登录吗?您需要重新登录才能访问账户。", - "confirm": "退出登录" + "proxyDelete": { + "close": "关闭", + "confirmText": "您确定要删除", + "deleteBtn": "删除", + "failedDesc": "删除失败,请稍后重试", + "failedTitle": "删除代理失败", + "permanent": "此操作将永久删除该代理,无法撤销。", + "proxyIdLabel": "代理 ID:", + "proxyIdPlaceholder": "输入代理 ID 以确认删除。", + "successDesc": "代理已成功删除。", + "successTitle": "删除成功", + "title": "删除代理", + "tryAgain": "重试", + "warningDesc": "请小心,此操作无法回滚。", + "warningTitle": "警告!" }, "restore_message": { - "title": "还原单个邮件", + "accountsInvolved": "涉及账户", "bulkTitle": "批量还原多个邮件", "bulkWarning": "请注意:邮件将被还原至其原始存储的文件夹中。", - "accountsInvolved": "涉及账户", - "summary": "待还原详情", - "messages": "封邮件", - "desc": "此操作将把选定的邮件从 Bichon 系统重新上传并恢复到其在 IMAP 服务器上对应的邮箱中。", "confirm": "执行还原", + "desc": "此操作将把选定的邮件从 Bichon 系统重新上传并恢复到其在 IMAP 服务器上对应的邮箱中。", + "failed": "还原邮件失败", + "failedTitle": "还原失败", + "messages": "封邮件", "restore_to_imap": "还原邮件", "success": "邮件还原成功", "successDesc": "选定的邮件已成功恢复到 IMAP 服务器。", - "failed": "还原邮件失败", - "failedTitle": "还原失败" + "summary": "待还原详情", + "title": "还原单个邮件" }, - "time": { - "label": "时间", - "since": "自", - "before": "早于", - "recent_range": "近期范围 (自...)", - "historical": "历史范围 (早于...)", - "absolute_range": "绝对日期范围", - "last_day": "最近 1 天", - "last_days": "最近 {{count}} 天", - "last_months": "最近 {{count}} 个月", - "over_years_ago": "{{count}} {{unit}}前", - "year": "年", - "years": "年", - "recent_prefix": "最近:", - "days_ago_to_now": "天前至今", - "apply": "应用", - "start_date": "开始日期", - "end_date": "结束日期", - "clear_filters": "清除时间筛选", - "format": "yyyy-MM-dd" + "roles": { + "actions": { + "add": "添加角色", + "cancel": "取消", + "close": "关闭", + "failed": "操作失败", + "retry": "重试", + "submit_create": "创建角色", + "submit_update": "更新角色", + "success_create": "角色创建成功", + "success_update": "角色更新成功" + }, + "categories": { + "account_resource": "账户资源访问", + "global_data": "全局数据访问", + "identity": "身份与管理" + }, + "columns": { + "created_at": "创建时间", + "id": "ID", + "name": "名称", + "permissions": "权限", + "role_type": "角色类型", + "updated_at": "更新时间" + }, + "delete": { + "alert_desc": "删除此角色将从所有当前分配了该角色的用户中将其移除。在继续之前,请确保您已检查并重新分配受影响的用户。", + "alert_title": "警告:此操作是永久性的。", + "confirm_btn": "删除角色", + "confirm_label": "请键入角色 ID 以确认:", + "deleting": "正在删除...", + "dialog_title": "删除用户角色", + "error_fallback": "无法删除该角色,请稍后重试。", + "error_title": "删除失败", + "irreversible": "此操作无法撤销。", + "placeholder": "键入 \"{{id}}\" 以确认", + "success_desc": "用户角色 \"{{name}}\" (ID: {{id}}) 已成功移除。", + "success_title": "角色已删除", + "warning_text": "您即将永久删除角色 {{name}} (ID: {{id}})。" + }, + "description_hint": "定义访问范围和功能权限。", + "details": { + "close_btn": "关闭详情视图", + "desc_account": "单个账户的访问及数据操作权限。", + "desc_global": "全局管理与系统级访问权限。", + "role_badge": "{{type}} 角色", + "title": "角色权限: {{name}}", + "unknown": "未知角色", + "view_permissions": "权限详情" + }, + "empty": { + "desc": "您尚未创建任何自定义角色。点击下方按钮开始添加新角色。", + "title": "未找到角色" + }, + "form": { + "builtin_badge": "内置角色", + "builtin_desc": "此角色由系统预定义。其权限为**只读**,无法被修改。", + "desc_label": "描述", + "matrix_label": "{{type}} 权限矩阵", + "name_label": "角色名称", + "type_label": "角色类型" + }, + "placeholder": { + "filter": "搜索角色..." + }, + "title": { + "create": "创建新角色", + "edit": "编辑角色: {{name}}" + }, + "types": { + "Account": "账户", + "Global": "全局" + }, + "validation": { + "name_required": "角色名称不能为空", + "perm_required": "请至少选择一个权限" + } }, - "tag": { - "label": "标签", - "search_placeholder": "搜索标签...", - "clear_all": "清除所有标签", - "no_tags_found": "未找到标签" + "search": { + "account": "账户", + "addEmailAccount": "添加邮件账户", + "addTags": { + "cancel": "取消", + "createHint": "创建新标签:{{tag}}", + "invalidTitle": "无效的标签", + "none": "暂无标签", + "save": "保存", + "saving": "保存中...", + "searchPlaceholder": "搜索或创建标签...", + "selectedCount": "已选择 {{count}} 个标签", + "title": "编辑标签", + "tryAgain": "请稍后重试", + "updateFailedTitle": "更新失败", + "updatedDesc": "标签已成功更新", + "updatedTitle": "已更新标签" + }, + "adjustSearch": "请尝试调整搜索条件或清除筛选。", + "advanced": "高级", + "advancedFilters": "高级筛选", + "any": "不限", + "attachmentName": "附件名称", + "attachmentsSize": "附件和大小", + "bcc": "密送", + "before": "之前:", + "bulkActions": { + "ariaLabel": "已选择 {{count}} 条消息。批量操作工具栏", + "clear": "清除选择", + "delete": "删除", + "deleteDesc": "删除选中的消息", + "manageTags": "管理标签", + "selected": "已选择 {{count}} 项" + }, + "cc": "抄送", + "clear": "清除", + "date": "日期", + "dateRange": "日期范围", + "delete": { + "confirmButton": "删除", + "confirmDetail": "此操作无法撤销。", + "confirmPrefix": "确认要删除", + "countLabel": "{{count}} 条消息吗?", + "errorTitle": "删除失败", + "successDesc": "选定的消息已成功删除。", + "successTitle": "消息已删除", + "title": "删除消息", + "warningDesc": "删除的消息将被永久移除,无法恢复。", + "warningTitle": "警告" + }, + "editTag": "编辑标签", + "endDate": "结束日期", + "from": "发件人", + "fullTextMultiAccount": "全文搜索 · 多账户 · 高级筛选", + "hasAttachment": "包含附件", + "huge": "极大 (≥20 MB)", + "keyword": "关键词", + "large": "大(10 - 20 MB)", + "mailbox": "邮箱", + "maxSize": "最大", + "maximumBytes": "最大值", + "medium": "中(2 - 10 MB)", + "messageId": "消息 ID", + "minSize": "最小", + "minimumBytes": "最小值", + "no": "否", + "noActiveEmailAccount": "没有活动的邮件账户。", + "noEmailsFound": "未找到邮件", + "noMailboxSelectAccount": "没有邮箱。请先选择一个账户。", + "originalMessageIdHeader": "原始邮件 Message-ID 标头", + "pleaseSelectAtLeastOne": "请至少选择一个搜索条件", + "preview": "预览", + "recipient": "收件人", + "searchArchivedEmails": "搜索归档邮件", + "searchButton": "搜索", + "searchInSubjectBody": "在主题、正文、附件名字中搜索...", + "searching": "搜索中,请稍候…", + "searchingButton": "搜索中...", + "selectAccount": "选择账户", + "selectDate": "选择日期", + "selectMailbox": "选择邮箱", + "sender": "发件人", + "senderRecipients": "发件人 / 收件人", + "since": "自:", + "size": "大小", + "sizeDescription": "大小指的是邮件整体大小,包含附件。", + "small": "小(<2 MB)", + "sort": "排序", + "source": "来源", + "startDate": "开始日期", + "startSearching": "请输入关键词、发件人或使用高级筛选开始搜索。", + "subject": "主题", + "tagFilter": "标签筛选", + "thread": { + "empty": "此会话没有邮件", + "error": "加载会话失败", + "invalidDate": "无效日期", + "loadMore": "加载更多", + "loadingMore": "加载中...", + "noSubject": "(无主题)", + "title": "会话 · 共 {{count}} 封邮件" + }, + "tiny": "很小(<15 KB)", + "title": "搜索", + "to": "收件人", + "updateTags": { + "actionAdd": "追加", + "actionOverwrite": "覆盖", + "actionRemove": "移除", + "cancel": "取消", + "createHint": "按回车键创建新标签:\"{{tag}}\"", + "invalidTitle": "标签无效", + "none": "未选择标签", + "overwriteWarning": "警告:此操作将覆盖所选项目的所有现有标签。", + "savingAdd": "正在追加...", + "savingOverwrite": "正在覆盖...", + "savingRemove": "正在移除...", + "searchPlaceholder": "搜索或创建新标签...", + "selectedCount": "将应用 {{count}} 个标签", + "submitAdd": "追加标签", + "submitOverwrite": "覆盖标签", + "submitRemove": "移除标签", + "title": "更新标签", + "tryAgain": "请稍后再试。", + "updateFailedTitle": "更新失败", + "updatedDesc": "标签已成功更新。", + "updatedTitle": "标签已更新" + }, + "yes": "是" }, "search_accounts": { - "label": "邮件账户", - "search_placeholder": "搜索邮件账户...", "clear_accounts": "清除已选账户", - "no_accounts_found": "未找到账户" - }, - "search_mailbox": { - "label": "邮箱文件夹", - "search_placeholder": "搜索邮箱文件夹", - "clear_mailboxes": "清除已选文件夹", - "select_account_first": "请先选择邮件账户", - "no_mailbox_found": "未找到文件夹" + "label": "邮件账户", + "no_accounts_found": "未找到账户", + "search_placeholder": "搜索邮件账户..." }, "search_contacts": { + "any": "不限", "label": "联系人", "label_with_count": "联系人 ({{count}})", - "any": "不限", - "search_placeholder": "搜索 {{field}}...", - "reset_all": "重置所有联系人", - "no_contact_found": "未找到联系人", "loading": "加载中...", + "no_contact_found": "未找到联系人", + "reset_all": "重置所有联系人", + "search_placeholder": "搜索 {{field}}...", "showing_limit": "仅显示前 100 条结果 • 总计 {{total}} 条" }, + "search_input": { + "all": "全部", + "all_fields_desc": "匹配邮件主题、正文、发件人及收件人", + "body": "邮件正文", + "button": "搜索", + "clear_history": "清空记录", + "no_history": "暂无搜索记录", + "placeholder": "搜索邮件(使用 \" \" 进行短语搜索)", + "recent_title": "最近搜索", + "subject": "邮件主题" + }, + "search_mailbox": { + "clear_mailboxes": "清除已选文件夹", + "label": "邮箱文件夹", + "no_mailbox_found": "未找到文件夹", + "search_placeholder": "搜索邮箱文件夹", + "select_account_first": "请先选择邮件账户" + }, "search_more": { - "trigger_label": "高级", - "title": "高级筛选", - "reset": "重置", - "has_attachment": "包含附件", + "any": "不限", + "apply": "应用筛选", "attachment_name_label": "附件名称", "attachment_name_placeholder": "例如: invoice.pdf", - "message_size_label": "邮件大小", - "message_id_label": "原始消息 ID", + "category": "附件分类", + "content_type": "文件类型", + "extension": "文件后缀", + "has_attachment": "包含附件", + "is_message": "邮件格式附件", + "is_message_desc": "这种附件是一个邮件文件,例如 .eml 文件。", "message_id_description": "通过邮件头中的 'Message-ID' 进行搜索", - "apply": "应用筛选", + "message_id_label": "原始消息 ID", + "message_size_label": "邮件大小", + "reset": "重置", + "search_placeholder": "搜索{{field}}...", "size_presets": { "any": "不限大小", - "tiny": "极小 (< 15 KB)", - "small": "较小 (< 2 MB)", - "medium": "普通 (2 - 10 MB)", + "huge": "极大 (> 20 MB)", "large": "较大 (10 - 20 MB)", - "huge": "极大 (> 20 MB)" + "medium": "普通 (2 - 10 MB)", + "small": "较小 (< 2 MB)", + "tiny": "极小 (< 15 KB)" }, - "any": "不限", - "search_placeholder": "搜索{{field}}...", - "extension": "文件后缀", - "category": "附件分类", - "content_types": "具体类型" - }, - "search_view": { - "button_label": "视图", - "menu_title": "显示列设置" + "title": "高级筛选", + "trigger_label": "高级" }, "search_reset": { "label": "重置", "tooltip": "清除所有筛选条件" }, - "search_input": { - "placeholder": "搜索邮件... (支持正则表达式)", - "button": "搜索", - "recent_title": "最近搜索", - "clear_history": "清空记录", - "no_history": "暂无搜索记录", - "all": "全部", - "all_fields_desc": "匹配邮件主题、正文、发件人及收件人", - "subject": "邮件主题", - "body": "邮件正文" + "search_view": { + "button_label": "视图", + "menu_title": "显示列设置" + }, + "settings": { + "accounts": "账户", + "acl": "访问控制列表", + "actions": "操作", + "add": "添加", + "addNewProxyHere": "在此添加新代理。", + "adding": "添加中...", + "appearance": { + "button": { + "update": "更新偏好设置" + }, + "command": { + "no_results": "未找到相关语言。", + "search": "搜索语言..." + }, + "description": { + "language": "选择 Web 界面显示的语言。", + "theme": "为界面选择浅色或深色显示模式。" + }, + "field": { + "language": "语言", + "theme": "界面主题" + }, + "placeholder": { + "select_language": "选择语言" + }, + "theme": { + "dark": "深色", + "light": "浅色" + }, + "title": "外观设置", + "validation": { + "language": { + "required": "请选择一种语言。" + }, + "theme": { + "required": "请选择一个主题。" + } + } + }, + "authUrl": "授权 URL", + "changePasswordForFutureLogins": "更改未来登录的密码。", + "confirmReset": "确认重置", + "createdAt": "创建时间", + "delete": "删除", + "description": "描述", + "edit": "编辑", + "enabled": "已启用", + "enterNewRootPassword": "输入新的root账户密码", + "enterProxyIdToConfirmDeletion": "输入代理 ID 以确认删除。", + "failedToCopyText": "复制文本失败", + "filterAccessToken": "筛选访问令牌...", + "filterAccount": "筛选账户...", + "filterOauth2": "筛选 oauth2...", + "filterProxy": "筛选代理...", + "general": "常规", + "generateNewToken": "生成新令牌,旧令牌立即失效。", + "host": "主机", + "id": "ID", + "invalidPassword": "密码无效", + "lastAccess": "最后访问", + "manageRootTokenAndPassword": "安全地管理root账户令牌和密码。", + "name": "名称", + "noProxies": "无代理", + "noProxiesDesc": "您尚未添加任何代理配置。添加一个以开始使用代理功能。", + "password": "密码", + "pleaseUseAnIpAddressForBetterReliability": "请使用 IP 地址(例如:127.0.0.1)而不是主机名或域名,以获得更好的可靠性。", + "port": "端口", + "profile": { + "account": { + "id": "账户 ID:{{id}}" + }, + "avatarAlt": "头像", + "button": { + "permissions": "权限", + "update_profile": "更新资料", + "view_global_permissions": "查看全局权限" + }, + "field": { + "email": "邮箱", + "password": "密码", + "username": "用户名" + }, + "loadError": "加载用户信息失败。", + "maxSize": "最大 {{size}}", + "placeholder": { + "password_keep": "留空以保持当前密码" + }, + "removeAvatar": "移除头像", + "section": { + "accounts": "已关联 {{count}} 个账户", + "roles": "角色" + }, + "toast": { + "update_failed": "个人资料更新失败", + "updated": "个人资料更新成功" + }, + "uploadError": "文件上传错误", + "uploadTitle": "上传头像", + "validation": { + "email": { + "invalid": "请输入有效的邮箱地址", + "required": "邮箱不能为空" + }, + "password": { + "max": "密码长度不能超过 256 个字符", + "min": "密码长度至少为 8 个字符" + }, + "username": { + "max": "用户名长度不能超过 32 个字符", + "min": "用户名长度至少为 5 个字符", + "required": "用户名不能为空" + } + } + }, + "proxy": "网络代理", + "proxyUpdateOrAddFailed": "{{action}}失败,请稍后重试", + "reset": "重置", + "resetRootPassword": "重置root账户密码", + "resetRootToken": "重置root账户令牌", + "root": "管理员账户", + "rootAccessManagement": "root账户访问管理", + "rootDesc": "管理root账户访问凭据,包括令牌和密码。", + "rootPasswordMustBeAtLeast6Characters": "root账户密码必须至少为 6 个字符。", + "rootTitle": "管理员账户", + "selectAll": "全选", + "sidebar": { + "apiTokens": "API 令牌", + "configurations": "系统配置", + "profile": "个人资料", + "proxy": "网络代理" + }, + "theRootPasswordHasBeenReset": "root账户密码已重置", + "theRootTokenHasBeenReset": "root账户令牌已重置", + "theme": "主题", + "title": "设置", + "token": "令牌", + "tokenUrl": "令牌 URL", + "type": "类型", + "updateTheProxyHere": "在此更新代理。", + "updatedAt": "更新时间", + "url": "URL", + "useNewPasswordForNextLogin": "下次登录时使用新密码。", + "useProxy": "使用代理", + "username": "用户名", + "youAreAboutToResetTheRootPassword": "您即将重置root账户密码。请确保安全存储。", + "youAreAboutToResetTheRootToken": "您即将重置root账户令牌。此操作无法撤销。", + "yourLoginInformationHasBeenUpdated": "您的登录信息已更新。无需重新登录。", + "yourProxyHasBeenSuccessfully": "您的代理已成功{{action}}。" + }, + "sign_out": { + "confirm": "退出登录", + "desc": "您确定要退出登录吗?您需要重新登录才能访问账户。", + "title": "退出登录" + }, + "systemConfig": { + "pageDescription": "这些参数通过 CLI 标志或环境变量初始化。它们当前为只读,以确保环境一致性。", + "pageTitle": "系统级配置", + "sections": { + "cors": { + "desc": "跨域访问规则", + "title": "CORS" + }, + "logging": { + "desc": "日志输出行为", + "title": "日志" + }, + "network": { + "desc": "HTTP 与公共访问", + "title": "网络" + }, + "performance": { + "desc": "并发与压缩", + "title": "性能" + }, + "security": { + "desc": "身份验证与加密", + "title": "安全" + }, + "smtp": { + "desc": "内置邮件接收服务设置,用于实时归档", + "title": "SMTP 服务器" + }, + "storage": { + "desc": "数据库路径与限制", + "title": "存储与缓存" + } + }, + "status": { + "auto": "自动", + "configured": "已配置", + "disabled": "已禁用", + "enabled": "已启用", + "missing": "缺失", + "notSet": "未设置" + } + }, + "table": { + "asc": "升序", + "delete": "删除", + "desc": "降序", + "edit": "编辑", + "hide": "隐藏", + "loading": "加载中...", + "noResults": "未找到结果", + "of": "页,共", + "page": "第", + "pagination": { + "first": "跳转到第一页", + "fixed_page_size": "每页 {{size}} 行。", + "last": "跳转到最后一页", + "next": "下一页", + "page_info": "第 {{page}} 页,共 {{total}} 页", + "previous": "上一页", + "rows_per_page": "每页行数", + "selected": "已选择 {{selected}} / {{total}} 行。" + }, + "results": "条结果", + "rowsPerPage": "每页行数", + "showing": "显示", + "to": "到" + }, + "tag": { + "clear_all": "清除所有标签", + "label": "标签", + "no_tags_found": "未找到标签", + "search_placeholder": "搜索标签..." + }, + "time": { + "absolute_range": "绝对日期范围", + "apply": "应用", + "before": "早于", + "clear_filters": "清除时间筛选", + "days_ago_to_now": "天前至今", + "end_date": "结束日期", + "format": "yyyy-MM-dd", + "historical": "历史范围 (早于...)", + "label": "时间", + "last_day": "最近 1 天", + "last_days": "最近 {{count}} 天", + "last_months": "最近 {{count}} 个月", + "over_years_ago": "{{count}} {{unit}}前", + "recent_prefix": "最近:", + "recent_range": "近期范围 (自...)", + "since": "自", + "start_date": "开始日期", + "year": "年", + "years": "年" + }, + "users": { + "actions": { + "api_tokens": "API 令牌", + "buttons": { + "add_account": "添加账户", + "create": "创建用户", + "update": "更新用户" + }, + "delete": { + "alert_desc": "一旦删除,该用户及其所有相关数据将立即被清除。请在继续操作前核实此账户是否已不再需要。", + "alert_title": "警告:此操作是永久性的。", + "button_confirm": "删除用户", + "button_deleting": "正在删除...", + "confirm_msg": "您即将永久删除用户 {{name}} (ID: {{id}})。", + "input_label": "为确认操作,请在下方输入用户 ID:", + "irreversible": "此操作无法撤销。", + "placeholder": "输入 \"{{id}}\" 以确认", + "title": "删除用户", + "toast": { + "failed_fallback": "删除用户失败,请重试。", + "failed_title": "删除失败", + "success_desc": "用户 \"{{name}}\" (ID: {{id}}) 已成功移除。", + "success_title": "用户已删除" + } + }, + "dialog": { + "create_title": "创建新用户", + "edit_title": "编辑用户: {{name}}", + "subtitle": "配置身份、访问级别和安全策略。" + }, + "fields": { + "assign_role": "分配角色", + "burst_interval": "突发间隔 (秒)", + "description": "描述(可选)", + "description_hint": "此账户的内部说明或附加背景信息(最多 256 个字符)。", + "description_placeholder": "添加关于此用户的一些注释...", + "email": "邮箱地址", + "email_hint": "主要联系方式和通知地址。", + "global_roles_hint": "分配高级系统权限。可以选择多个角色。", + "ip_whitelist": "IP 白名单", + "ip_whitelist_hint": "限制这些 IP 地址登录(每行一个)。", + "password": "密码", + "password_hint_create": "初始用户设置的安全密码。", + "password_hint_edit": "仅在您希望更改密码时输入新密码。", + "password_placeholder_create": "至少 8 个字符", + "password_placeholder_edit": "留空则保持当前密码", + "rate_quota": "频率限额", + "select_account": "选择账户", + "username": "用户名", + "username_hint": "用于系统登录的唯一标识。" + }, + "placeholder": { + "filter": "搜索用户..." + }, + "schema": { + "account_required": "请选择一个账户", + "description_max": "描述长度不能超过 256 个字符", + "email_invalid": "请输入有效的邮箱地址", + "email_required": "邮箱地址不能为空", + "global_role_required": "请至少为此用户分配一个全局角色", + "ip_invalid": "发现无效的 IP 地址", + "password_max": "密码长度不能超过 256 个字符", + "password_min": "密码长度至少为 8 个字符", + "password_required": "密码不能为空", + "role_required": "请选择一个角色", + "username_max": "用户名长度不能超过 32 个字符", + "username_min": "用户名长度至少为 3 个字符", + "username_required": "用户名不能为空" + }, + "sections": { + "basic": "基础身份", + "global": "全局权限", + "mail_access": "邮件访问控制", + "mail_access_subtitle": "定义此用户可以管理的邮件账户。", + "policy": "策略开关" + }, + "states": { + "full_access": "全权限模式", + "full_access_desc": "拥有系统管理员角色的用户拥有对所有账户的固有访问权限,无需手动分配。", + "no_accounts": "未分配特定账户。", + "security_disabled": "此用户当前禁用了高级安全策略。" + }, + "tabs": { + "general": "基本信息", + "permissions": "账户权限", + "security": "安全与 ACL" + }, + "toast": { + "created": "用户已创建", + "updated": "用户已更新" + } + }, + "api_tokens": { + "button": { + "generate": "生成新令牌" + }, + "delete": { + "confirm_button": "删除令牌", + "confirm_label": "为确认操作,请在下方输入 {{word}}:", + "confirm_placeholder": "输入“{{word}}”以确认", + "deleting": "正在删除...", + "desc": "你即将永久删除该 API 令牌", + "irreversible": "此操作无法撤销。任何使用该令牌的应用将立即失去访问权限。", + "prefix": "令牌前缀", + "title": "删除 API 令牌", + "warning_desc": "任何使用该令牌的脚本、服务或集成都会失败。请在继续之前确保已更新你的系统。", + "warning_title": "警告" + }, + "empty": { + "description": "系统中尚未生成任何 API 令牌。", + "title": "未找到 API 令牌" + }, + "table": { + "api_key": "API 密钥", + "created": "创建时间", + "expired": "已过期", + "expires_at": "过期时间", + "last_used": "上次使用", + "name": "名称", + "never": "从未", + "owner": "所有者", + "permanent": "永久", + "type": "类型", + "unnamed": "未命名令牌", + "web_ui": "Web 界面" + }, + "toast": { + "delete_failed": "删除令牌失败,请重试。", + "delete_failed_title": "删除失败", + "deleted_desc": "令牌“{{name}}”已成功移除。", + "deleted_title": "API 令牌已删除" + }, + "toolbar": { + "search_placeholder": "按名称、所有者或令牌搜索..." + }, + "unnamed": "未命名令牌" + }, + "buttons": { + "add": "添加用户", + "add_new": "添加新用户" + }, + "columns": { + "actions": "操作", + "avatar": "头像", + "created_at": "创建时间", + "email": "邮箱地址", + "id": "ID", + "roles": "角色权限", + "updated_at": "更新时间", + "username": "用户名" + }, + "empty": { + "description": "点击下方按钮开始添加第一个用户。", + "title": "未发现用户" + }, + "nav": { + "api_tokens": "API 令牌", + "roles": "角色", + "users": "用户" + }, + "tokens": { + "dialog": { + "create_title": "创建访问令牌", + "description": "完成后点击保存。", + "edit_title": "编辑访问令牌" + }, + "error": { + "fallback": "操作失败,请稍后重试。" + }, + "expire_options": { + "1_day": "1 天", + "30_days": "30 天", + "7_days": "7 天", + "never": "永不过期" + }, + "fields": { + "expire_hint": "令牌将在选定的时间后自动过期。", + "expire_label": "有效期", + "expire_placeholder": "选择有效期", + "name_hint": "可选 · 最多 32 个字符", + "name_label": "名称", + "name_placeholder": "为该访问令牌起一个简短的名称" + }, + "schema": { + "expire_int": "必须是整数", + "expire_number": "必须是数字", + "expire_positive": "必须大于 0", + "name_max": "最多 32 个字符" + }, + "toast": { + "create_failed_title": "创建失败", + "create_success_desc": "访问令牌已成功创建。", + "create_success_title": "访问令牌已创建", + "update_failed_title": "更新失败", + "update_success_desc": "访问令牌已成功更新。", + "update_success_title": "访问令牌已更新" + } + }, + "tokens_action": { + "buttons": { + "add": "添加令牌" + }, + "delete_dialog": { + "description": "此操作无法撤销。任何正在使用此令牌的应用程序都将立即失去访问权限。", + "title": "删除访问令牌?" + }, + "dialog": { + "description": "管理此用户的 API 令牌。您可以查看、复制或监控令牌使用情况。", + "title": "API 令牌" + }, + "empty": { + "description": "该用户目前没有 API 令牌。点击下方按钮创建一个。", + "title": "无 API 令牌" + }, + "list": { + "button_delete": "删除令牌", + "expires_on_brief": "有效期至 {{date}}", + "label_created": "创建于", + "label_expires_at": "过期时间", + "label_last_used": "上次使用", + "label_token": "令牌", + "never": "从未", + "never_expires": "永不过期", + "status_active": "活跃", + "status_expired": "已过期", + "unnamed_token": "未命名令牌" + } + } + }, + "validation": { + "emailRequired": "邮箱为必填项", + "folderLimitMustBeAtLeast100": "文件夹限制必须至少为 100", + "folderLimitMustBeNumber": "文件夹限制必须是数字", + "imapHostCannotBeEmpty": "IMAP 主机不能为空", + "imapHostRequired": "IMAP 主机为必填项", + "imapPortMustBeLessThan65536": "IMAP 端口必须小于 65536", + "imapPortMustBePositive": "IMAP 端口必须是正整数", + "incrementalSyncMustBeAtLeast10": "增量同步间隔必须至少为 10 分钟", + "incrementalSyncMustBeNumber": "增量同步间隔必须是数字", + "invalidEmail": "无效的电子邮件地址", + "invalidUrl": "无效的 URL", + "passwordMinLength": "密码长度至少为 {{min}} 个字符", + "passwordRequired": "当认证方法为密码时,密码为必填项", + "pleaseEnterPassword": "请输入您的密码", + "pleaseEnterUsernameOrEmail": "请输入您的用户名或邮箱", + "required": "此字段为必填项", + "singleRequestBatchSizeMustBeNumber": "批大小必须是数字", + "singleRequestBatchSizeTooLarge": "批大小必须最多为200", + "singleRequestBatchSizeTooSmall": "批大小必须至少为10" } } \ No newline at end of file diff --git a/web/src/routeTree.gen.ts b/web/src/routeTree.gen.ts index 0f5fee8..08544f1 100644 --- a/web/src/routeTree.gen.ts +++ b/web/src/routeTree.gen.ts @@ -18,6 +18,7 @@ import { Route as AuthenticatedIndexImport } from './routes/_authenticated/index import { Route as authSignInImport } from './routes/(auth)/sign-in' import { Route as auth500Import } from './routes/(auth)/500' import { Route as AuthenticatedSearchIndexImport } from './routes/_authenticated/search/index' +import { Route as AuthenticatedAttachmentIndexImport } from './routes/_authenticated/attachment/index' // Create Virtual Routes @@ -217,6 +218,13 @@ const AuthenticatedSearchIndexRoute = AuthenticatedSearchIndexImport.update({ getParentRoute: () => AuthenticatedRouteRoute, } as any) +const AuthenticatedAttachmentIndexRoute = + AuthenticatedAttachmentIndexImport.update({ + id: '/attachment/', + path: '/attachment/', + getParentRoute: () => AuthenticatedRouteRoute, + } as any) + const AuthenticatedUsersRolesLazyRoute = AuthenticatedUsersRolesLazyImport.update({ id: '/roles', @@ -420,6 +428,13 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof AuthenticatedUsersRolesLazyImport parentRoute: typeof AuthenticatedUsersRouteLazyImport } + '/_authenticated/attachment/': { + id: '/_authenticated/attachment/' + path: '/attachment' + fullPath: '/attachment' + preLoaderRoute: typeof AuthenticatedAttachmentIndexImport + parentRoute: typeof AuthenticatedRouteImport + } '/_authenticated/search/': { id: '/_authenticated/search/' path: '/search' @@ -524,6 +539,7 @@ interface AuthenticatedRouteRouteChildren { AuthenticatedSettingsRouteLazyRoute: typeof AuthenticatedSettingsRouteLazyRouteWithChildren AuthenticatedUsersRouteLazyRoute: typeof AuthenticatedUsersRouteLazyRouteWithChildren AuthenticatedIndexRoute: typeof AuthenticatedIndexRoute + AuthenticatedAttachmentIndexRoute: typeof AuthenticatedAttachmentIndexRoute AuthenticatedSearchIndexRoute: typeof AuthenticatedSearchIndexRoute AuthenticatedAccountsIndexLazyRoute: typeof AuthenticatedAccountsIndexLazyRoute AuthenticatedApiDocsIndexLazyRoute: typeof AuthenticatedApiDocsIndexLazyRoute @@ -537,6 +553,7 @@ const AuthenticatedRouteRouteChildren: AuthenticatedRouteRouteChildren = { AuthenticatedUsersRouteLazyRoute: AuthenticatedUsersRouteLazyRouteWithChildren, AuthenticatedIndexRoute: AuthenticatedIndexRoute, + AuthenticatedAttachmentIndexRoute: AuthenticatedAttachmentIndexRoute, AuthenticatedSearchIndexRoute: AuthenticatedSearchIndexRoute, AuthenticatedAccountsIndexLazyRoute: AuthenticatedAccountsIndexLazyRoute, AuthenticatedApiDocsIndexLazyRoute: AuthenticatedApiDocsIndexLazyRoute, @@ -566,6 +583,7 @@ export interface FileRoutesByFullPath { '/settings/proxy': typeof AuthenticatedSettingsProxyLazyRoute '/users/api-tokens': typeof AuthenticatedUsersApiTokensLazyRoute '/users/roles': typeof AuthenticatedUsersRolesLazyRoute + '/attachment': typeof AuthenticatedAttachmentIndexRoute '/search': typeof AuthenticatedSearchIndexRoute '/accounts': typeof AuthenticatedAccountsIndexLazyRoute '/api-docs': typeof AuthenticatedApiDocsIndexLazyRoute @@ -590,6 +608,7 @@ export interface FileRoutesByTo { '/settings/proxy': typeof AuthenticatedSettingsProxyLazyRoute '/users/api-tokens': typeof AuthenticatedUsersApiTokensLazyRoute '/users/roles': typeof AuthenticatedUsersRolesLazyRoute + '/attachment': typeof AuthenticatedAttachmentIndexRoute '/search': typeof AuthenticatedSearchIndexRoute '/accounts': typeof AuthenticatedAccountsIndexLazyRoute '/api-docs': typeof AuthenticatedApiDocsIndexLazyRoute @@ -619,6 +638,7 @@ export interface FileRoutesById { '/_authenticated/settings/proxy': typeof AuthenticatedSettingsProxyLazyRoute '/_authenticated/users/api-tokens': typeof AuthenticatedUsersApiTokensLazyRoute '/_authenticated/users/roles': typeof AuthenticatedUsersRolesLazyRoute + '/_authenticated/attachment/': typeof AuthenticatedAttachmentIndexRoute '/_authenticated/search/': typeof AuthenticatedSearchIndexRoute '/_authenticated/accounts/': typeof AuthenticatedAccountsIndexLazyRoute '/_authenticated/api-docs/': typeof AuthenticatedApiDocsIndexLazyRoute @@ -648,6 +668,7 @@ export interface FileRouteTypes { | '/settings/proxy' | '/users/api-tokens' | '/users/roles' + | '/attachment' | '/search' | '/accounts' | '/api-docs' @@ -671,6 +692,7 @@ export interface FileRouteTypes { | '/settings/proxy' | '/users/api-tokens' | '/users/roles' + | '/attachment' | '/search' | '/accounts' | '/api-docs' @@ -698,6 +720,7 @@ export interface FileRouteTypes { | '/_authenticated/settings/proxy' | '/_authenticated/users/api-tokens' | '/_authenticated/users/roles' + | '/_authenticated/attachment/' | '/_authenticated/search/' | '/_authenticated/accounts/' | '/_authenticated/api-docs/' @@ -756,6 +779,7 @@ export const routeTree = rootRoute "/_authenticated/settings", "/_authenticated/users", "/_authenticated/", + "/_authenticated/attachment/", "/_authenticated/search/", "/_authenticated/accounts/", "/_authenticated/api-docs/", @@ -837,6 +861,10 @@ export const routeTree = rootRoute "filePath": "_authenticated/users/roles.lazy.tsx", "parent": "/_authenticated/users" }, + "/_authenticated/attachment/": { + "filePath": "_authenticated/attachment/index.tsx", + "parent": "/_authenticated" + }, "/_authenticated/search/": { "filePath": "_authenticated/search/index.tsx", "parent": "/_authenticated" diff --git a/web/src/routes/_authenticated/attachment/index.tsx b/web/src/routes/_authenticated/attachment/index.tsx new file mode 100644 index 0000000..55bb301 --- /dev/null +++ b/web/src/routes/_authenticated/attachment/index.tsx @@ -0,0 +1,23 @@ +import { createFileRoute } from '@tanstack/react-router' +import { z } from 'zod' +import AttachmentSearch from '@/features/attachment' + +const searchSchema = z.object({ + page: z.number().catch(1), + pageSize: z.number().optional(), + sortBy: z.enum(['DATE', 'SIZE']).catch('DATE'), + sortOrder: z.enum(['asc', 'desc']).catch('desc'), + q: z.string().optional(), +}) + +export const Route = createFileRoute('/_authenticated/attachment/')({ + component: AttachmentSearch, + validateSearch: (search) => { + const result = searchSchema.parse(search); + return { + ...result, + page: result.page ?? 1, + pageSize: result.pageSize ?? (Number(localStorage.getItem('bichon_search_attachment_page_size')) || 30), + } + } +}) diff --git a/web/src/routes/_authenticated/search/index.tsx b/web/src/routes/_authenticated/search/index.tsx index 3d73f2a..16f992b 100644 --- a/web/src/routes/_authenticated/search/index.tsx +++ b/web/src/routes/_authenticated/search/index.tsx @@ -18,7 +18,7 @@ import { createFileRoute } from '@tanstack/react-router' -import Search from '@/features/search' +import EmailSearch from '@/features/search' import { z } from 'zod' const searchSchema = z.object({ @@ -30,7 +30,7 @@ const searchSchema = z.object({ }) export const Route = createFileRoute('/_authenticated/search/')({ - component: Search, + component: EmailSearch, validateSearch: (search) => { const result = searchSchema.parse(search); return {