2026-04-29 17:49:07 +03:00
/// Supported languages.
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Lang {
Ru ,
En ,
}
impl Lang {
pub fn code ( self ) -> & 'static str {
match self {
Lang ::Ru => "ru" ,
Lang ::En => "en" ,
}
}
pub fn from_code ( code : & str ) -> Option < Self > {
match code {
"ru" => Some ( Lang ::Ru ),
"en" => Some ( Lang ::En ),
_ => None ,
}
}
/// Parse Accept-Language header and pick best match.
pub fn from_accept_language ( header : & str ) -> Self {
for part in header . split ( ',' ) {
let tag = part . split ( ';' ). next (). unwrap_or ( "" ). trim (). to_lowercase ();
if tag . starts_with ( "ru" ) {
return Lang ::Ru ;
}
if tag . starts_with ( "en" ) {
return Lang ::En ;
}
}
Lang ::En
}
pub fn t ( self ) -> & 'static Translations {
match self {
Lang ::Ru => & RU ,
Lang ::En => & EN ,
}
}
/// The other language (for the switcher).
pub fn other ( self ) -> Self {
match self {
Lang ::Ru => Lang ::En ,
Lang ::En => Lang ::Ru ,
}
}
pub fn label ( self ) -> & 'static str {
match self {
Lang ::Ru => "Русский" ,
Lang ::En => "English" ,
}
}
}
#[derive(Debug)]
#[allow(dead_code)]
pub struct Translations {
// Nav
pub nav_leads : & 'static str ,
pub nav_clients : & 'static str ,
pub nav_visits : & 'static str ,
pub nav_users : & 'static str ,
pub nav_settings : & 'static str ,
pub nav_title : & 'static str ,
// Leads
pub leads_title : & 'static str ,
pub leads_empty : & 'static str ,
pub leads_name : & 'static str ,
pub leads_phone : & 'static str ,
pub leads_email : & 'static str ,
pub leads_comment : & 'static str ,
pub leads_status : & 'static str ,
pub leads_created : & 'static str ,
pub leads_actions : & 'static str ,
// Lead statuses
pub status_new : & 'static str ,
pub status_in_progress : & 'static str ,
pub status_converted : & 'static str ,
pub status_rejected : & 'static str ,
// Leads (add)
pub leads_add_title : & 'static str ,
pub leads_add_button : & 'static str ,
// Clients
pub clients_title : & 'static str ,
pub clients_empty : & 'static str ,
pub clients_name : & 'static str ,
pub clients_phone : & 'static str ,
pub clients_email : & 'static str ,
pub clients_address : & 'static str ,
pub clients_notes : & 'static str ,
pub clients_status : & 'static str ,
pub clients_created : & 'static str ,
pub clients_media_link : & 'static str ,
pub clients_add_title : & 'static str ,
pub clients_add_button : & 'static str ,
2026-06-04 13:41:18 +03:00
pub clients_delete : & 'static str ,
pub clients_delete_confirm : & 'static str ,
2026-04-29 17:49:07 +03:00
pub client_status_active : & 'static str ,
pub client_status_archived : & 'static str ,
2026-06-04 13:41:18 +03:00
pub client_status_deleted : & 'static str ,
2026-04-29 17:49:07 +03:00
// Users
pub users_title : & 'static str ,
pub users_login : & 'static str ,
pub users_display_name : & 'static str ,
pub users_status : & 'static str ,
pub users_created : & 'static str ,
pub users_password : & 'static str ,
pub users_password_confirm : & 'static str ,
pub users_add_title : & 'static str ,
pub users_add_button : & 'static str ,
pub users_error_passwords_mismatch : & 'static str ,
pub users_error_login_taken : & 'static str ,
2026-05-15 15:28:19 +03:00
pub users_telegram_chat_id : & 'static str ,
pub users_telegram_enabled : & 'static str ,
2026-04-29 17:49:07 +03:00
// Settings
pub settings_title : & 'static str ,
pub settings_key : & 'static str ,
pub settings_value : & 'static str ,
pub settings_save : & 'static str ,
pub settings_saved : & 'static str ,
pub settings_empty : & 'static str ,
2026-08-09 01:32:10 +01:00
pub settings_intro : & 'static str ,
pub settings_section_general_help : & 'static str ,
pub settings_section_notifications_help : & 'static str ,
pub settings_section_captcha_help : & 'static str ,
pub settings_section_oidc_help : & 'static str ,
pub settings_secret_saved : & 'static str ,
pub settings_secret_not_set : & 'static str ,
pub settings_secret_clear : & 'static str ,
pub settings_status_enabled : & 'static str ,
pub settings_status_disabled : & 'static str ,
2026-04-29 17:49:07 +03:00
pub settings_telegram_bot_token : & 'static str ,
pub settings_telegram_chat_id : & 'static str ,
pub settings_contact_info : & 'static str ,
2026-05-11 11:34:11 +01:00
pub settings_pricing_info : & 'static str ,
2026-05-11 13:43:16 +01:00
pub settings_timezone : & 'static str ,
2026-05-14 16:12:33 +03:00
pub settings_site_domain : & 'static str ,
2026-05-18 14:47:04 +03:00
pub settings_seo_keywords : & 'static str ,
2026-05-18 21:48:02 +03:00
pub settings_turnstile_site_key : & 'static str ,
pub settings_turnstile_secret_key : & 'static str ,
2026-05-18 23:50:34 +03:00
pub settings_oidc_issuer_url : & 'static str ,
pub settings_oidc_client_id : & 'static str ,
pub settings_oidc_client_secret : & 'static str ,
2026-05-19 00:57:05 +03:00
pub settings_oidc_allowed_groups : & 'static str ,
2026-05-19 00:16:22 +03:00
pub settings_auth_password_enabled : & 'static str ,
pub settings_auth_sso_enabled : & 'static str ,
2026-05-19 00:57:05 +03:00
pub settings_section_advanced : & 'static str ,
pub settings_section_notifications : & 'static str ,
pub settings_section_captcha : & 'static str ,
pub settings_section_oidc : & 'static str ,
pub settings_section_general : & 'static str ,
2026-08-09 00:15:40 +01:00
pub settings_section_storage : & 'static str ,
pub settings_r2_enabled : & 'static str ,
pub settings_r2_help : & 'static str ,
pub settings_r2_account_id : & 'static str ,
pub settings_r2_bucket : & 'static str ,
pub settings_r2_access_key_id : & 'static str ,
pub settings_r2_secret_access_key : & 'static str ,
pub settings_r2_secret_unchanged : & 'static str ,
pub settings_r2_migration_help : & 'static str ,
pub settings_r2_error_incomplete : & 'static str ,
2026-08-08 11:02:56 +01:00
pub settings_client_notifications_enabled : & 'static str ,
pub settings_client_notifications_help : & 'static str ,
pub settings_vapid_public_key : & 'static str ,
pub settings_vapid_private_key : & 'static str ,
pub settings_vapid_subject : & 'static str ,
pub settings_vapid_warning : & 'static str ,
pub settings_vapid_generate : & 'static str ,
pub settings_push_subscribers : & 'static str ,
pub settings_push_no_subscribers : & 'static str ,
pub settings_push_client : & 'static str ,
pub settings_push_devices : & 'static str ,
pub settings_push_language : & 'static str ,
pub settings_push_updated : & 'static str ,
2026-04-29 17:49:07 +03:00
pub landing_contact_label : & 'static str ,
2026-05-11 11:34:11 +01:00
pub landing_pricing_title : & 'static str ,
2026-04-29 17:49:07 +03:00
2026-09-20 17:00:59 +03:00
// Analytics
pub nav_analytics : & 'static str ,
pub analytics_title : & 'static str ,
pub analytics_intro : & 'static str ,
pub analytics_metric_landing_views : & 'static str ,
pub analytics_metric_landing_unique : & 'static str ,
pub analytics_metric_portal_opens : & 'static str ,
pub analytics_metric_media_views : & 'static str ,
pub analytics_range_from : & 'static str ,
pub analytics_range_to : & 'static str ,
pub analytics_granularity : & 'static str ,
pub analytics_gran_day : & 'static str ,
pub analytics_gran_week : & 'static str ,
pub analytics_gran_month : & 'static str ,
pub analytics_preset_7 : & 'static str ,
pub analytics_preset_30 : & 'static str ,
pub analytics_preset_90 : & 'static str ,
pub analytics_preset_365 : & 'static str ,
pub analytics_metrics_label : & 'static str ,
pub analytics_top_clients : & 'static str ,
pub analytics_top_media : & 'static str ,
pub analytics_count : & 'static str ,
pub analytics_no_data : & 'static str ,
pub analytics_loading : & 'static str ,
pub analytics_load_error : & 'static str ,
pub analytics_summary_title : & 'static str ,
pub analytics_summary_period : & 'static str ,
pub analytics_open_dashboard : & 'static str ,
pub analytics_log_title : & 'static str ,
2026-09-20 20:11:18 +03:00
pub analytics_log_show : & 'static str ,
2026-09-20 17:00:59 +03:00
pub analytics_log_empty : & 'static str ,
pub analytics_log_end : & 'static str ,
pub analytics_log_visitor : & 'static str ,
pub analytics_ev_landing_view : & 'static str ,
pub analytics_ev_portal_open : & 'static str ,
pub analytics_ev_media_view : & 'static str ,
2026-09-20 21:00:03 +03:00
pub analytics_ev_landing_short : & 'static str ,
pub analytics_ev_portal_short : & 'static str ,
pub analytics_ev_media_short : & 'static str ,
pub analytics_log_media_prefix : & 'static str ,
2026-09-20 17:00:59 +03:00
2026-04-29 17:49:07 +03:00
// Dashboard
pub dashboard_title : & 'static str ,
pub dashboard_today_visits : & 'static str ,
pub dashboard_no_visits : & 'static str ,
pub dashboard_recent_feedbacks : & 'static str ,
pub dashboard_no_feedbacks : & 'static str ,
// Login / Setup
pub login_title : & 'static str ,
pub login_button : & 'static str ,
pub login_error : & 'static str ,
2026-05-18 23:50:34 +03:00
pub login_sso_button : & 'static str ,
pub login_sso_error : & 'static str ,
2026-05-19 00:57:05 +03:00
pub login_sso_error_group : & 'static str ,
pub login_sso_error_provider : & 'static str ,
pub login_sso_error_user_disabled : & 'static str ,
2026-04-29 17:49:07 +03:00
pub logout : & 'static str ,
pub setup_title : & 'static str ,
pub setup_description : & 'static str ,
pub setup_button : & 'static str ,
// Landing page
pub landing_meta_description : & 'static str ,
pub landing_hero_title : & 'static str ,
pub landing_hero_subtitle : & 'static str ,
2026-05-11 11:34:11 +01:00
pub landing_hero_description : & 'static str ,
2026-04-29 17:49:07 +03:00
pub landing_hero_cta : & 'static str ,
pub landing_services_title : & 'static str ,
pub landing_service_cats_title : & 'static str ,
pub landing_service_cats_text : & 'static str ,
2026-05-11 11:34:11 +01:00
pub landing_service_exotic_title : & 'static str ,
pub landing_service_exotic_text : & 'static str ,
pub landing_service_bonus_title : & 'static str ,
pub landing_service_bonus_text : & 'static str ,
2026-04-29 17:49:07 +03:00
pub landing_how_title : & 'static str ,
pub landing_how_step1_title : & 'static str ,
pub landing_how_step1_text : & 'static str ,
pub landing_how_step2_title : & 'static str ,
pub landing_how_step2_text : & 'static str ,
pub landing_how_step3_title : & 'static str ,
pub landing_how_step3_text : & 'static str ,
pub landing_form_title : & 'static str ,
pub landing_form_subtitle : & 'static str ,
pub landing_form_name : & 'static str ,
pub landing_form_phone : & 'static str ,
pub landing_form_comment : & 'static str ,
pub landing_form_comment_placeholder : & 'static str ,
pub landing_form_submit : & 'static str ,
pub landing_thank_you_title : & 'static str ,
pub landing_thank_you_text : & 'static str ,
pub landing_thank_you_back : & 'static str ,
2026-05-11 11:34:11 +01:00
pub landing_guarantee : & 'static str ,
pub landing_testimonials_title : & 'static str ,
2026-05-11 12:52:41 +01:00
pub landing_form_consent : & 'static str ,
2026-04-29 17:49:07 +03:00
pub landing_footer_text : & 'static str ,
2026-05-11 12:52:41 +01:00
pub landing_footer_copyright : & 'static str ,
2026-04-29 17:49:07 +03:00
2026-09-20 21:00:03 +03:00
// Cookies & privacy
pub cookie_banner_text : & 'static str ,
pub cookie_banner_accept : & 'static str ,
pub cookie_privacy_link : & 'static str ,
pub privacy_title : & 'static str ,
2026-05-11 11:34:11 +01:00
// Testimonials admin
pub nav_testimonials : & 'static str ,
pub testimonials_title : & 'static str ,
pub testimonials_empty : & 'static str ,
pub testimonials_add_title : & 'static str ,
pub testimonials_text : & 'static str ,
pub testimonials_author_note : & 'static str ,
pub testimonials_image : & 'static str ,
pub testimonials_add_button : & 'static str ,
pub testimonials_status_active : & 'static str ,
pub testimonials_status_hidden : & 'static str ,
2026-05-11 13:30:34 +01:00
pub testimonials_edit : & 'static str ,
pub testimonials_save : & 'static str ,
pub testimonials_remove_image : & 'static str ,
2026-05-11 11:34:11 +01:00
2026-04-29 17:49:07 +03:00
// Client edit
pub clients_edit_title : & 'static str ,
pub clients_save : & 'static str ,
pub clients_color : & 'static str ,
// Filters
pub filter_show_all : & 'static str ,
pub filter_show_active : & 'static str ,
// Schedule
pub nav_schedule : & 'static str ,
pub schedule_title : & 'static str ,
pub schedule_new : & 'static str ,
pub schedule_new_title : & 'static str ,
pub schedule_client : & 'static str ,
pub schedule_admin : & 'static str ,
pub schedule_default_time : & 'static str ,
pub schedule_time_start : & 'static str ,
pub schedule_time_end : & 'static str ,
pub schedule_pick_dates : & 'static str ,
pub schedule_range_from : & 'static str ,
pub schedule_range_to : & 'static str ,
pub schedule_fill_range : & 'static str ,
pub schedule_selected_days : & 'static str ,
pub schedule_no_days : & 'static str ,
pub schedule_notes : & 'static str ,
pub schedule_public_notes : & 'static str ,
pub schedule_client_feedback : & 'static str ,
pub schedule_create : & 'static str ,
pub schedule_remove_day : & 'static str ,
pub visit_status_scheduled : & 'static str ,
pub visit_status_completed : & 'static str ,
pub visit_status_cancelled : & 'static str ,
2026-06-04 13:41:18 +03:00
pub visit_status_deleted : & 'static str ,
2026-04-29 17:49:07 +03:00
pub schedule_mark_done : & 'static str ,
pub schedule_cancel : & 'static str ,
pub schedule_edit_title : & 'static str ,
pub schedule_date : & 'static str ,
pub schedule_status : & 'static str ,
pub schedule_save : & 'static str ,
pub schedule_delete : & 'static str ,
pub schedule_delete_confirm : & 'static str ,
// Media
pub nav_media : & 'static str ,
pub media_title : & 'static str ,
pub media_upload : & 'static str ,
pub media_upload_title : & 'static str ,
pub media_caption : & 'static str ,
pub media_choose_files : & 'static str ,
pub media_empty : & 'static str ,
pub media_delete : & 'static str ,
pub media_delete_confirm : & 'static str ,
pub media_all_clients : & 'static str ,
2026-08-09 01:05:47 +01:00
pub media_files_selected : & 'static str ,
pub media_upload_sending : & 'static str ,
pub media_upload_processing : & 'static str ,
pub media_upload_done : & 'static str ,
pub media_upload_connection_error : & 'static str ,
2026-04-29 17:49:07 +03:00
// Client portal
pub portal_title : & 'static str ,
pub portal_upcoming : & 'static str ,
pub portal_past : & 'static str ,
pub portal_no_upcoming : & 'static str ,
pub portal_no_past : & 'static str ,
pub portal_photos : & 'static str ,
pub portal_feedback_placeholder : & 'static str ,
pub portal_feedback_submit : & 'static str ,
pub portal_feedback_thanks : & 'static str ,
pub portal_link : & 'static str ,
2026-09-01 10:51:22 +01:00
pub portal_settings : & 'static str ,
2026-08-08 11:02:56 +01:00
pub portal_notifications : & 'static str ,
pub portal_notifications_text : & 'static str ,
pub portal_notifications_enable : & 'static str ,
pub portal_notifications_disable : & 'static str ,
pub portal_notifications_denied : & 'static str ,
2026-08-08 11:21:23 +01:00
pub portal_notifications_active : & 'static str ,
pub portal_notifications_error : & 'static str ,
pub portal_notifications_unsupported : & 'static str ,
2026-08-08 11:02:56 +01:00
pub portal_calendar : & 'static str ,
pub portal_future_visit : & 'static str ,
pub portal_previous : & 'static str ,
pub portal_next : & 'static str ,
2026-04-29 17:49:07 +03:00
// Common
pub no_value : & 'static str ,
pub action_convert : & 'static str ,
pub action_reject : & 'static str ,
pub action_in_progress : & 'static str ,
pub action_archive : & 'static str ,
pub action_activate : & 'static str ,
}
static RU : Translations = Translations {
nav_leads : "Заявки" ,
nav_clients : "Клиенты" ,
nav_visits : "Визиты" ,
nav_users : "Админы" ,
nav_settings : "Настройки" ,
2026-05-13 15:00:38 +01:00
nav_title : "МурНяня.РФ" ,
2026-04-29 17:49:07 +03:00
leads_title : "Заявки" ,
leads_empty : "Заявок пока нет." ,
leads_name : "Имя" ,
leads_phone : "Телефон" ,
leads_email : "Email" ,
leads_comment : "Комментарий" ,
leads_status : "Статус" ,
leads_created : "Создана" ,
leads_actions : "Действия" ,
status_new : "Новая" ,
status_in_progress : "В работе" ,
status_converted : "Конвертирована" ,
status_rejected : "Отклонена" ,
leads_add_title : "Добавить заявку" ,
leads_add_button : "Добавить" ,
clients_title : "Клиенты" ,
clients_empty : "Клиентов пока нет." ,
clients_name : "Имя" ,
clients_phone : "Телефон" ,
clients_email : "Email" ,
clients_address : "Адрес" ,
clients_notes : "Заметки" ,
clients_status : "Статус" ,
clients_created : "Добавлен" ,
clients_media_link : "Медиа" ,
clients_add_title : "Добавить клиента" ,
clients_add_button : "Добавить" ,
2026-06-04 13:41:18 +03:00
clients_delete : "Удалить клиента" ,
clients_delete_confirm : "Точно удалить этого клиента?" ,
2026-04-29 17:49:07 +03:00
client_status_active : "Активный" ,
client_status_archived : "Архив" ,
2026-06-04 13:41:18 +03:00
client_status_deleted : "Удалён" ,
2026-04-29 17:49:07 +03:00
users_title : "Администраторы" ,
users_login : "Логин" ,
users_display_name : "Отображаемое имя" ,
users_status : "Статус" ,
users_created : "Создан" ,
users_password : "Пароль" ,
users_password_confirm : "Подтверждение пароля" ,
users_add_title : "Добавить администратора" ,
users_add_button : "Добавить" ,
users_error_passwords_mismatch : "Пароли не совпадают." ,
users_error_login_taken : "Этот логин уже занят." ,
2026-05-15 15:28:19 +03:00
users_telegram_chat_id : "Telegram Chat ID" ,
users_telegram_enabled : "Уведомления" ,
2026-04-29 17:49:07 +03:00
settings_title : "Настройки" ,
settings_key : "Параметр" ,
settings_value : "Значение" ,
settings_save : "Сохранить" ,
settings_saved : "Сохранено!" ,
settings_empty : "Настройки не заданы." ,
2026-08-09 01:32:10 +01:00
settings_intro : "Параметры сайта, интеграций, хранения медиа и способов входа." ,
settings_section_general_help : "Публичные данные сайта и параметры, используемые при формировании ссылок и дат." ,
settings_section_notifications_help : "Telegram для администратора и браузерные push-уведомления для клиентов." ,
settings_section_captcha_help : "Ключи Cloudflare Turnstile для защиты публичных форм от автоматических отправок." ,
settings_section_oidc_help : "Настройте доступ администраторов по паролю и через внешний OIDC-провайдер." ,
settings_secret_saved : "Секрет сохранён. Оставьте поле пустым, чтобы не менять его." ,
settings_secret_not_set : "Секрет пока не задан." ,
settings_secret_clear : "Удалить сохранённый секрет" ,
settings_status_enabled : "Включено" ,
settings_status_disabled : "Выключено" ,
2026-04-29 17:49:07 +03:00
settings_telegram_bot_token : "Токен Telegram бота" ,
settings_telegram_chat_id : "Chat ID для уведомлений" ,
settings_contact_info : "Контактная информация (отображается на лендинге)" ,
2026-05-11 11:34:11 +01:00
settings_pricing_info : "Блок с ценами (отображается на лендинге)" ,
2026-05-11 13:43:16 +01:00
settings_timezone : "Часовой пояс (например Asia/Vladivostok)" ,
2026-05-14 16:12:33 +03:00
settings_site_domain : "Домен сайта (например https://example.com)" ,
2026-05-18 14:47:04 +03:00
settings_seo_keywords : "SEO-ключевые слова (через запятую, отображаются на сайте и в мета-теге keywords)" ,
2026-05-18 21:48:02 +03:00
settings_turnstile_site_key : "Cloudflare Turnstile — Site Key (ключ виджета)" ,
settings_turnstile_secret_key : "Cloudflare Turnstile — Secret Key (секретный ключ)" ,
2026-05-18 23:50:34 +03:00
settings_oidc_issuer_url : "OIDC — URL провайдера (Issuer URL)" ,
settings_oidc_client_id : "OIDC — Client ID" ,
settings_oidc_client_secret : "OIDC — Client Secret" ,
2026-05-19 00:57:05 +03:00
settings_oidc_allowed_groups : "OIDC — Разрешённые группы (через запятую, пусто = все)" ,
2026-05-19 00:16:22 +03:00
settings_auth_password_enabled : "Вход по логину и паролю" ,
settings_auth_sso_enabled : "Вход через SSO (OIDC)" ,
2026-05-19 00:57:05 +03:00
settings_section_advanced : "Расширенные настройки" ,
settings_section_notifications : "Уведомления" ,
settings_section_captcha : "Защита от ботов" ,
settings_section_oidc : "Единый вход (SSO / OIDC)" ,
settings_section_general : "Сайт" ,
2026-08-09 00:15:40 +01:00
settings_section_storage : "Хранилище медиа" ,
settings_r2_enabled : "Использовать Cloudflare R2" ,
settings_r2_help : "Пока R2 выключен или настроен не полностью, медиа хранится локально. После включения новые файлы и миниатюры загружаются в приватный бакет, а страницы получают подписанные ссылки на 6 часов." ,
settings_r2_account_id : "Cloudflare Account ID" ,
settings_r2_bucket : "Имя R2-бакета" ,
settings_r2_access_key_id : "R2 Access Key ID" ,
settings_r2_secret_access_key : "R2 Secret Access Key" ,
settings_r2_secret_unchanged : "Секрет уже сохранён; оставьте поле пустым, чтобы не менять его" ,
2026-08-09 01:05:47 +01:00
settings_r2_migration_help : "Порядок перехода: сохраните реквизиты с выключенным R2, выполните в контейнере migrate_uploads_to_r2 и normalize_videos_to_r2, затем включите R2 и отключите PVC. Для бакета разрешите CORS GET/HEAD с домена сайта и заголовок Range." ,
2026-08-09 00:15:40 +01:00
settings_r2_error_incomplete : "R2 не включён: проверьте Account ID, имя бакета, Access Key ID и Secret Access Key." ,
2026-08-08 11:02:56 +01:00
settings_client_notifications_enabled : "Разрешить клиентам браузерные уведомления" ,
settings_client_notifications_help : "Показывает клиентам настройку уведомлений о завершённых визитах." ,
settings_vapid_public_key : "VAPID — публичный ключ" ,
settings_vapid_private_key : "VAPID — приватный ключ" ,
settings_vapid_subject : "VAPID — контакт (например mailto:admin@example.com)" ,
settings_vapid_warning : "Важно: смена пары VAPID-ключей сделает недействительными подписки всех клиентов. Им потребуется снова включить уведомления." ,
settings_vapid_generate : "Для генерации новой пары ключей выполните:" ,
settings_push_subscribers : "Активные подписки клиентов" ,
settings_push_no_subscribers : "Активных подписок пока нет." ,
settings_push_client : "Клиент" ,
settings_push_devices : "Устройства" ,
settings_push_language : "Язык" ,
settings_push_updated : "Обновлено" ,
2026-04-29 17:49:07 +03:00
landing_contact_label : "Или свяжитесь с нами напрямую" ,
2026-05-11 11:34:11 +01:00
landing_pricing_title : "Стоимость" ,
2026-04-29 17:49:07 +03:00
2026-09-20 17:00:59 +03:00
nav_analytics : "Статистика" ,
analytics_title : "Статистика посещений" ,
analytics_intro : "Уникальные заходы на сайт, открытия клиентских страниц и просмотры фото из архива." ,
analytics_metric_landing_views : "Заходы на сайт" ,
analytics_metric_landing_unique : "Уникальные посетители" ,
analytics_metric_portal_opens : "Открытия страниц клиентов" ,
analytics_metric_media_views : "Просмотры фото" ,
analytics_range_from : "С " ,
analytics_range_to : "По" ,
analytics_granularity : "Разбивка" ,
analytics_gran_day : "По дням" ,
analytics_gran_week : "По неделям" ,
analytics_gran_month : "По месяцам" ,
analytics_preset_7 : "7 дней" ,
analytics_preset_30 : "30 дней" ,
analytics_preset_90 : "90 дней" ,
analytics_preset_365 : "Год" ,
analytics_metrics_label : "Метрики" ,
analytics_top_clients : "Топ клиентов по открытиям страницы" ,
analytics_top_media : "Топ фото по просмотрам" ,
analytics_count : "Количество" ,
analytics_no_data : "Нет данных за выбранный период." ,
analytics_loading : "Загрузка..." ,
analytics_load_error : "Не удалось загрузить данные. Обновите страницу." ,
analytics_summary_title : "Статистика посещений" ,
analytics_summary_period : "за последние 30 дней" ,
analytics_open_dashboard : "Открыть подробную статистику" ,
analytics_log_title : "Последние события" ,
2026-09-20 20:11:18 +03:00
analytics_log_show : "Показывать" ,
2026-09-20 17:00:59 +03:00
analytics_log_empty : "Событий пока нет." ,
analytics_log_end : "Это все события." ,
analytics_log_visitor : "Посетитель" ,
analytics_ev_landing_view : "Заход на сайт" ,
analytics_ev_portal_open : "Открытие страницы клиента" ,
analytics_ev_media_view : "Просмотр фото" ,
2026-09-20 21:00:03 +03:00
analytics_ev_landing_short : "Сайт" ,
analytics_ev_portal_short : "Портал" ,
analytics_ev_media_short : "Фото" ,
analytics_log_media_prefix : "Просмотр медиа" ,
2026-09-20 17:00:59 +03:00
2026-04-29 17:49:07 +03:00
dashboard_title : "Главная" ,
dashboard_today_visits : "Визиты на сегодня" ,
dashboard_no_visits : "На сегодня визитов нет." ,
dashboard_recent_feedbacks : "Недавние отзывы клиентов" ,
dashboard_no_feedbacks : "Новых отзывов нет." ,
nav_media : "Медиа" ,
media_title : "Медиа" ,
media_upload : "Загрузить" ,
media_upload_title : "Загрузить медиа" ,
media_caption : "Подпись" ,
media_choose_files : "Выберите файлы" ,
media_empty : "Медиа нет." ,
media_delete : "Удалить" ,
media_delete_confirm : "Удалить этот файл?" ,
media_all_clients : "Все клиенты" ,
2026-08-09 01:05:47 +01:00
media_files_selected : "Выбрано файлов" ,
media_upload_sending : "Загрузка на сервер..." ,
media_upload_processing : "Конвертация и загрузка в R2..." ,
media_upload_done : "Готово — обновляем медиагалерею..." ,
media_upload_connection_error : "Ошибка соединения" ,
2026-04-29 17:49:07 +03:00
2026-05-12 14:47:24 +01:00
portal_title : "Визиты" ,
2026-04-29 17:49:07 +03:00
portal_upcoming : "Предстоящие визиты" ,
portal_past : "Прошлые визиты" ,
portal_no_upcoming : "Нет предстоящих визитов." ,
portal_no_past : "Прошлых визитов пока нет." ,
portal_photos : "Фото и видео" ,
portal_feedback_placeholder : "Оставьте отзыв о визите..." ,
portal_feedback_submit : "Отправить" ,
portal_feedback_thanks : "Спасибо за отзыв!" ,
portal_link : "Ссылка клиента" ,
2026-09-01 10:51:22 +01:00
portal_settings : "Настройки" ,
2026-08-08 11:02:56 +01:00
portal_notifications : "Уведомления" ,
portal_notifications_text : "Получайте уведомления о завершённых визитах, даже когда страница закрыта. На iPhone сначала добавьте сайт на экран «Домой» и откройте его оттуда." ,
portal_notifications_enable : "Включить уведомления" ,
portal_notifications_disable : "Отключить уведомления" ,
portal_notifications_denied : "Уведомления заблокированы в настройках браузера." ,
2026-08-08 11:21:23 +01:00
portal_notifications_active : "Уведомления подключены на этом устройстве." ,
portal_notifications_error : "Не удалось сохранить подписку. Обновите страницу и попробуйте ещё раз." ,
portal_notifications_unsupported : "Этот браузер не поддерживает фоновые уведомления." ,
2026-08-08 11:02:56 +01:00
portal_calendar : "Календарь визитов" ,
portal_future_visit : "Будущий визит" ,
portal_previous : "Назад" ,
portal_next : "Далее" ,
2026-04-29 17:49:07 +03:00
login_title : "Вход в систему" ,
login_button : "Войти" ,
login_error : "Неверный логин или пароль." ,
2026-05-18 23:50:34 +03:00
login_sso_button : "Войти через SSO" ,
login_sso_error : "Ошибка SSO-авторизации." ,
2026-05-19 00:57:05 +03:00
login_sso_error_group : "У вас нет доступа: вы не состоите в разрешённой группе." ,
login_sso_error_provider : "Не удалось связаться с провайдером авторизации." ,
login_sso_error_user_disabled : "Ваша учётная запись отключена." ,
2026-04-29 17:49:07 +03:00
logout : "Выйти" ,
setup_title : "Создание администратора" ,
setup_description : "В системе нет ни одного администратора. Создайте первого для начала работы." ,
setup_button : "Создать и войти" ,
clients_edit_title : "Редактировать клиента" ,
clients_save : "Сохранить" ,
clients_color : "Цвет в календаре" ,
filter_show_all : "Показать все" ,
filter_show_active : "Только активные" ,
nav_schedule : "Расписание" ,
schedule_title : "Расписание" ,
schedule_new : "Новые визиты" ,
schedule_new_title : "Запланировать визиты" ,
schedule_client : "Клиент" ,
schedule_admin : "Исполнитель" ,
2026-05-18 17:07:43 +03:00
schedule_default_time : "Время" ,
2026-04-29 17:49:07 +03:00
schedule_time_start : "С " ,
schedule_time_end : "До" ,
schedule_pick_dates : "Добавить дату" ,
schedule_range_from : "С " ,
schedule_range_to : "По" ,
schedule_fill_range : "Заполнить диапазон" ,
schedule_selected_days : "Выбранные дни" ,
schedule_no_days : "Дни не выбраны" ,
schedule_notes : "Приватные заметки" ,
schedule_public_notes : "Комментарий для клиента" ,
schedule_client_feedback : "Отзыв клиента" ,
schedule_create : "Создать визиты" ,
schedule_remove_day : "Убрать" ,
visit_status_scheduled : "Запланирован" ,
visit_status_completed : "Выполнен" ,
visit_status_cancelled : "Отменён" ,
2026-06-04 13:41:18 +03:00
visit_status_deleted : "Удалён" ,
2026-04-29 17:49:07 +03:00
schedule_mark_done : "Выполнен" ,
schedule_cancel : "Отменить" ,
schedule_edit_title : "Редактировать визит" ,
schedule_date : "Дата" ,
schedule_status : "Статус" ,
schedule_save : "Сохранить" ,
schedule_delete : "Удалить визит" ,
schedule_delete_confirm : "Точно удалить этот визит?" ,
2026-05-11 11:34:11 +01:00
landing_meta_description : "Профессиональный пет-ситтинг: кормление и уход за кошками, грызунами, рептилиями на вашей территории. Оставьте заявку — позаботимся о вашем любимце!" ,
2026-05-18 14:47:04 +03:00
landing_hero_title : "Позаботимся о вашем питомце, пока вас нет дома. Город Хабаровск" ,
2026-05-11 11:34:11 +01:00
landing_hero_subtitle : "Кормление и уход за кошками, грызунами, рептилиями на вашей территории. Ежедневные визиты — ваш питомец в надёжных руках, пока вы в отпуске или командировке." ,
landing_hero_description : "Почему лучше оставить кошку дома на время отъезда, чем, скажем, поместить в зоогостиницу? Как известно — кошка территориальное животное. Поэтому, когда кошка оказывается на незнакомой территории — она может испытывать стресс. К тому же в зоогостинице животное часто содержится в клетке. А кошки любят свободу. И дома ожидать своих хозяев — ей будет гораздо проще и комфортнее." ,
2026-04-29 17:49:07 +03:00
landing_hero_cta : "Оставить заявку" ,
landing_services_title : "Наши услуги" ,
2026-05-11 11:34:11 +01:00
landing_service_cats_title : "Кошки" ,
landing_service_cats_text : "Приедем к вам домой, покормим, помоем миски, поменяем воду, уберём лоток, поиграем, погладим, поговорим — всё, что пожелает ваш любимец. Уделим ей максимум внимания. Отправим вам фото/видео отчёт с рассказом, как всё прошло." ,
landing_service_exotic_title : "Грызуны, рептилии" ,
landing_service_exotic_text : "Приедем к вам домой, покормим, уберём в клетке. Отправим вам фото/видео отчёт с рассказом, как всё прошло." ,
landing_service_bonus_title : "Цветы, рыбки" ,
landing_service_bonus_text : "Бонусом польём цветы, покормим рыбок, заберём почту — будет всё, как при вас." ,
2026-04-29 17:49:07 +03:00
landing_how_title : "Как это работает" ,
landing_how_step1_title : "Оставьте заявку" ,
2026-05-11 11:34:11 +01:00
landing_how_step1_text : "Заполните форму ниже — укажите имя и телефон. Мы свяжемся с вами в ближайшее время" ,
2026-04-29 17:49:07 +03:00
landing_how_step2_title : "Обсудим детали" ,
2026-05-11 11:34:11 +01:00
landing_how_step2_text : "Встретимся, познакомимся с вашим питомцем, обсудим расписание визитов и особые пожелания. Предъявим документ, удостоверяющий личность." ,
2026-04-29 17:49:07 +03:00
landing_how_step3_title : "Заботимся о питомце" ,
2026-05-11 11:34:11 +01:00
landing_how_step3_text : "Пока вас нет — мы рядом. После каждого визита отправим фото и отчёт о самочувствии вашего питомца." ,
2026-04-29 17:49:07 +03:00
landing_form_title : "Оставить заявку" ,
landing_form_subtitle : "Расскажите о себе, и мы свяжемся с вами в ближайшее время" ,
landing_form_name : "Ваше имя" ,
landing_form_phone : "Телефон" ,
landing_form_comment : "Комментарий" ,
landing_form_comment_placeholder : "Расскажите о питомце и когда нужна помощь..." ,
landing_form_submit : "Отправить заявку" ,
landing_thank_you_title : "Спасибо за заявку!" ,
landing_thank_you_text : "Мы получили вашу заявку и свяжемся с вами в ближайшее время." ,
landing_thank_you_back : "Вернуться на главную" ,
2026-05-11 11:34:11 +01:00
landing_guarantee : "Порядочность, честность и строгое выполнение ваших требований гарантировано." ,
landing_testimonials_title : "Отзывы" ,
2026-05-11 12:52:41 +01:00
landing_form_consent : "Я даю согласие на обработку персональных данных" ,
2026-05-13 15:00:38 +01:00
landing_footer_text : "МурНяня.РФ — Присмотрим, погладим, покормим" ,
2026-05-11 12:52:41 +01:00
landing_footer_copyright : "Все права защищены" ,
2026-04-29 17:49:07 +03:00
2026-09-20 21:00:03 +03:00
cookie_banner_text : "Мы используем файлы cookie для работы сайта и анонимной статистики посещений." ,
cookie_banner_accept : "Принять" ,
cookie_privacy_link : "Политика конфиденциальности" ,
privacy_title : "Политика конфиденциальности и использования cookie" ,
2026-05-11 11:34:11 +01:00
nav_testimonials : "Отзывы" ,
testimonials_title : "Отзывы" ,
testimonials_empty : "Отзывов пока нет." ,
testimonials_add_title : "Добавить отзыв" ,
testimonials_text : "Текст отзыва" ,
testimonials_author_note : "Имя / тип питомца" ,
testimonials_image : "Фото" ,
testimonials_add_button : "Добавить" ,
testimonials_status_active : "Отображается" ,
testimonials_status_hidden : "Скрыт" ,
2026-05-11 13:30:34 +01:00
testimonials_edit : "Редактировать" ,
testimonials_save : "Сохранить" ,
testimonials_remove_image : "Удалить фото" ,
2026-05-11 11:34:11 +01:00
2026-04-29 17:49:07 +03:00
no_value : "—" ,
action_convert : "Конвертировать" ,
action_reject : "Отклонить" ,
action_in_progress : "В работу" ,
action_archive : "В архив" ,
action_activate : "Активировать" ,
};
static EN : Translations = Translations {
nav_leads : "Leads" ,
nav_clients : "Clients" ,
nav_visits : "Visits" ,
nav_users : "Admins" ,
nav_settings : "Settings" ,
2026-05-13 15:00:38 +01:00
nav_title : "МурНяня.РФ" ,
2026-04-29 17:49:07 +03:00
leads_title : "Leads" ,
leads_empty : "No leads yet." ,
leads_name : "Name" ,
leads_phone : "Phone" ,
leads_email : "Email" ,
leads_comment : "Comment" ,
leads_status : "Status" ,
leads_created : "Created" ,
leads_actions : "Actions" ,
status_new : "New" ,
status_in_progress : "In Progress" ,
status_converted : "Converted" ,
status_rejected : "Rejected" ,
leads_add_title : "Add Lead" ,
leads_add_button : "Add" ,
clients_title : "Clients" ,
clients_empty : "No clients yet." ,
clients_name : "Name" ,
clients_phone : "Phone" ,
clients_email : "Email" ,
clients_address : "Address" ,
clients_notes : "Notes" ,
clients_status : "Status" ,
clients_created : "Created" ,
clients_media_link : "Media" ,
clients_add_title : "Add Client" ,
clients_add_button : "Add" ,
2026-06-04 13:41:18 +03:00
clients_delete : "Delete client" ,
clients_delete_confirm : "Are you sure you want to delete this client?" ,
2026-04-29 17:49:07 +03:00
client_status_active : "Active" ,
client_status_archived : "Archived" ,
2026-06-04 13:41:18 +03:00
client_status_deleted : "Deleted" ,
2026-04-29 17:49:07 +03:00
users_title : "Administrators" ,
users_login : "Login" ,
users_display_name : "Display Name" ,
users_status : "Status" ,
users_created : "Created" ,
users_password : "Password" ,
users_password_confirm : "Confirm Password" ,
users_add_title : "Add Administrator" ,
users_add_button : "Add" ,
users_error_passwords_mismatch : "Passwords do not match." ,
users_error_login_taken : "This login is already taken." ,
2026-05-15 15:28:19 +03:00
users_telegram_chat_id : "Telegram Chat ID" ,
users_telegram_enabled : "Notifications" ,
2026-04-29 17:49:07 +03:00
settings_title : "Settings" ,
settings_key : "Parameter" ,
settings_value : "Value" ,
settings_save : "Save" ,
settings_saved : "Saved!" ,
settings_empty : "No settings configured." ,
2026-08-09 01:32:10 +01:00
settings_intro : "Site, integration, media storage, and sign-in settings." ,
settings_section_general_help : "Public site details and values used to build links and display dates." ,
settings_section_notifications_help : "Telegram alerts for administrators and browser push notifications for clients." ,
settings_section_captcha_help : "Cloudflare Turnstile keys used to protect public forms from automated submissions." ,
settings_section_oidc_help : "Configure administrator access with passwords and an external OIDC provider." ,
settings_secret_saved : "A secret is stored. Leave this field blank to keep it unchanged." ,
settings_secret_not_set : "No secret is currently stored." ,
settings_secret_clear : "Remove the stored secret" ,
settings_status_enabled : "Enabled" ,
settings_status_disabled : "Disabled" ,
2026-04-29 17:49:07 +03:00
settings_telegram_bot_token : "Telegram Bot Token" ,
settings_telegram_chat_id : "Notification Chat ID" ,
settings_contact_info : "Contact info (shown on landing page)" ,
2026-05-11 11:34:11 +01:00
settings_pricing_info : "Pricing block (shown on landing page)" ,
2026-05-11 13:43:16 +01:00
settings_timezone : "Timezone (e.g. Asia/Vladivostok)" ,
2026-05-14 16:12:33 +03:00
settings_site_domain : "Site domain (e.g. https://example.com)" ,
2026-05-18 14:47:04 +03:00
settings_seo_keywords : "SEO keywords (comma-separated, shown on site and in keywords meta tag)" ,
2026-05-18 21:48:02 +03:00
settings_turnstile_site_key : "Cloudflare Turnstile — Site Key" ,
settings_turnstile_secret_key : "Cloudflare Turnstile — Secret Key" ,
2026-05-18 23:50:34 +03:00
settings_oidc_issuer_url : "OIDC — Issuer URL" ,
settings_oidc_client_id : "OIDC — Client ID" ,
settings_oidc_client_secret : "OIDC — Client Secret" ,
2026-05-19 00:57:05 +03:00
settings_oidc_allowed_groups : "OIDC — Allowed groups (comma-separated, empty = all)" ,
2026-05-19 00:16:22 +03:00
settings_auth_password_enabled : "Password login" ,
settings_auth_sso_enabled : "SSO login (OIDC)" ,
2026-05-19 00:57:05 +03:00
settings_section_advanced : "Advanced settings" ,
settings_section_notifications : "Notifications" ,
settings_section_captcha : "Bot protection" ,
settings_section_oidc : "Single Sign-On (SSO / OIDC)" ,
settings_section_general : "Site" ,
2026-08-09 00:15:40 +01:00
settings_section_storage : "Media storage" ,
settings_r2_enabled : "Use Cloudflare R2" ,
settings_r2_help : "While R2 is disabled or incomplete, media stays in local storage. Once enabled, new files and thumbnails are uploaded to the private bucket and pages receive signed URLs valid for 6 hours." ,
settings_r2_account_id : "Cloudflare Account ID" ,
settings_r2_bucket : "R2 bucket name" ,
settings_r2_access_key_id : "R2 Access Key ID" ,
settings_r2_secret_access_key : "R2 Secret Access Key" ,
settings_r2_secret_unchanged : "A secret is already stored; leave this blank to keep it unchanged" ,
2026-08-09 01:05:47 +01:00
settings_r2_migration_help : "Migration order: save the credentials with R2 disabled, run migrate_uploads_to_r2 and normalize_videos_to_r2 inside the container, then enable R2 and detach the PVC. Allow CORS GET/HEAD from the site domain and the Range header on the bucket." ,
2026-08-09 00:15:40 +01:00
settings_r2_error_incomplete : "R2 was not enabled: check the Account ID, bucket name, Access Key ID, and Secret Access Key." ,
2026-08-08 11:02:56 +01:00
settings_client_notifications_enabled : "Allow client browser notifications" ,
settings_client_notifications_help : "Shows clients the completed-visit notification setting." ,
settings_vapid_public_key : "VAPID public key" ,
settings_vapid_private_key : "VAPID private key" ,
settings_vapid_subject : "VAPID contact (for example mailto:admin@example.com)" ,
settings_vapid_warning : "Important: changing the VAPID key pair invalidates every client subscription. Clients will need to enable notifications again." ,
settings_vapid_generate : "To generate a new key pair, run:" ,
settings_push_subscribers : "Active client subscriptions" ,
settings_push_no_subscribers : "There are no active subscriptions yet." ,
settings_push_client : "Client" ,
settings_push_devices : "Devices" ,
settings_push_language : "Language" ,
settings_push_updated : "Updated" ,
2026-04-29 17:49:07 +03:00
landing_contact_label : "Or contact us directly" ,
2026-05-11 11:34:11 +01:00
landing_pricing_title : "Pricing" ,
2026-04-29 17:49:07 +03:00
2026-09-20 17:00:59 +03:00
nav_analytics : "Analytics" ,
analytics_title : "Visit analytics" ,
analytics_intro : "Unique landing-page visits, client portal opens, and archive photo views." ,
analytics_metric_landing_views : "Landing visits" ,
analytics_metric_landing_unique : "Unique visitors" ,
analytics_metric_portal_opens : "Client portal opens" ,
analytics_metric_media_views : "Photo views" ,
analytics_range_from : "From" ,
analytics_range_to : "To" ,
analytics_granularity : "Group by" ,
analytics_gran_day : "Day" ,
analytics_gran_week : "Week" ,
analytics_gran_month : "Month" ,
analytics_preset_7 : "7 days" ,
analytics_preset_30 : "30 days" ,
analytics_preset_90 : "90 days" ,
analytics_preset_365 : "Year" ,
analytics_metrics_label : "Metrics" ,
analytics_top_clients : "Top clients by portal opens" ,
analytics_top_media : "Top photos by views" ,
analytics_count : "Count" ,
analytics_no_data : "No data for the selected period." ,
analytics_loading : "Loading..." ,
analytics_load_error : "Failed to load data. Please refresh the page." ,
analytics_summary_title : "Visit analytics" ,
analytics_summary_period : "over the last 30 days" ,
analytics_open_dashboard : "Open detailed analytics" ,
analytics_log_title : "Recent events" ,
2026-09-20 20:11:18 +03:00
analytics_log_show : "Show" ,
2026-09-20 17:00:59 +03:00
analytics_log_empty : "No events yet." ,
analytics_log_end : "That's all events." ,
analytics_log_visitor : "Visitor" ,
analytics_ev_landing_view : "Landing visit" ,
analytics_ev_portal_open : "Client portal open" ,
analytics_ev_media_view : "Photo view" ,
2026-09-20 21:00:03 +03:00
analytics_ev_landing_short : "Site" ,
analytics_ev_portal_short : "Portal" ,
analytics_ev_media_short : "Photos" ,
analytics_log_media_prefix : "Media view" ,
2026-09-20 17:00:59 +03:00
2026-04-29 17:49:07 +03:00
dashboard_title : "Home" ,
dashboard_today_visits : "Today's visits" ,
dashboard_no_visits : "No visits for today." ,
dashboard_recent_feedbacks : "Recent client feedback" ,
dashboard_no_feedbacks : "No recent feedback." ,
nav_media : "Media" ,
media_title : "Media" ,
media_upload : "Upload" ,
media_upload_title : "Upload Media" ,
media_caption : "Caption" ,
media_choose_files : "Choose files" ,
media_empty : "No media yet." ,
media_delete : "Delete" ,
media_delete_confirm : "Delete this file?" ,
media_all_clients : "All clients" ,
2026-08-09 01:05:47 +01:00
media_files_selected : "Files selected" ,
media_upload_sending : "Uploading to the server..." ,
media_upload_processing : "Converting and uploading to R2..." ,
media_upload_done : "Done — refreshing the media gallery..." ,
media_upload_connection_error : "Connection error" ,
2026-04-29 17:49:07 +03:00
2026-05-12 14:47:24 +01:00
portal_title : "Visits" ,
2026-04-29 17:49:07 +03:00
portal_upcoming : "Upcoming visits" ,
portal_past : "Past visits" ,
portal_no_upcoming : "No upcoming visits." ,
portal_no_past : "No past visits yet." ,
portal_photos : "Photos & Videos" ,
portal_feedback_placeholder : "Leave feedback about this visit..." ,
portal_feedback_submit : "Submit" ,
portal_feedback_thanks : "Thank you for your feedback!" ,
portal_link : "Client link" ,
2026-09-01 10:51:22 +01:00
portal_settings : "Settings" ,
2026-08-08 11:02:56 +01:00
portal_notifications : "Notifications" ,
portal_notifications_text : "Receive completed-visit notifications even when this page is closed. On iPhone, first add this site to the Home Screen and open it from there." ,
portal_notifications_enable : "Enable notifications" ,
portal_notifications_disable : "Disable notifications" ,
portal_notifications_denied : "Notifications are blocked in your browser settings." ,
2026-08-08 11:21:23 +01:00
portal_notifications_active : "Notifications are enabled on this device." ,
portal_notifications_error : "The subscription could not be saved. Reload the page and try again." ,
portal_notifications_unsupported : "This browser does not support background notifications." ,
2026-08-08 11:02:56 +01:00
portal_calendar : "Visit calendar" ,
portal_future_visit : "Future visit" ,
portal_previous : "Previous" ,
portal_next : "Next" ,
2026-04-29 17:49:07 +03:00
login_title : "Sign In" ,
login_button : "Sign In" ,
login_error : "Invalid login or password." ,
2026-05-18 23:50:34 +03:00
login_sso_button : "Sign in with SSO" ,
login_sso_error : "SSO authentication failed." ,
2026-05-19 00:57:05 +03:00
login_sso_error_group : "Access denied: you are not a member of an allowed group." ,
login_sso_error_provider : "Could not reach the authentication provider." ,
login_sso_error_user_disabled : "Your account is disabled." ,
2026-04-29 17:49:07 +03:00
logout : "Sign Out" ,
setup_title : "Create Administrator" ,
setup_description : "There are no administrators yet. Create the first one to get started." ,
setup_button : "Create & Sign In" ,
clients_edit_title : "Edit Client" ,
clients_save : "Save" ,
clients_color : "Calendar color" ,
filter_show_all : "Show all" ,
filter_show_active : "Active only" ,
nav_schedule : "Schedule" ,
schedule_title : "Schedule" ,
schedule_new : "New Visits" ,
schedule_new_title : "Plan Visits" ,
schedule_client : "Client" ,
schedule_admin : "Assigned to" ,
2026-05-18 17:07:43 +03:00
schedule_default_time : "Time" ,
2026-04-29 17:49:07 +03:00
schedule_time_start : "From" ,
schedule_time_end : "To" ,
schedule_pick_dates : "Add date" ,
schedule_range_from : "From" ,
schedule_range_to : "To" ,
schedule_fill_range : "Fill range" ,
schedule_selected_days : "Selected days" ,
schedule_no_days : "No days selected" ,
schedule_notes : "Private notes" ,
schedule_public_notes : "Note for client" ,
schedule_client_feedback : "Client feedback" ,
schedule_create : "Create visits" ,
schedule_remove_day : "Remove" ,
visit_status_scheduled : "Scheduled" ,
visit_status_completed : "Completed" ,
visit_status_cancelled : "Cancelled" ,
2026-06-04 13:41:18 +03:00
visit_status_deleted : "Deleted" ,
2026-04-29 17:49:07 +03:00
schedule_mark_done : "Done" ,
schedule_cancel : "Cancel" ,
schedule_edit_title : "Edit Visit" ,
schedule_date : "Date" ,
schedule_status : "Status" ,
schedule_save : "Save" ,
schedule_delete : "Delete visit" ,
schedule_delete_confirm : "Are you sure you want to delete this visit?" ,
2026-05-11 11:34:11 +01:00
landing_meta_description : "Professional pet sitting: feeding and care for cats, rodents, reptiles at your home. Leave a request — we'll take care of your pet!" ,
2026-04-29 17:49:07 +03:00
landing_hero_title : "We'll take care of your pet while you're away" ,
2026-05-11 11:34:11 +01:00
landing_hero_subtitle : "Feeding and care for cats, rodents, and reptiles at your home. Daily visits — your pet is in safe hands while you're on vacation or a business trip." ,
landing_hero_description : "Why is it better to leave your cat at home while you're away rather than placing them in a pet hotel? As we know, cats are territorial animals. When a cat finds itself in an unfamiliar environment, it can experience stress. Moreover, in pet hotels animals are often kept in cages. But cats love freedom. Waiting for their owners at home is much easier and more comfortable for them." ,
2026-04-29 17:49:07 +03:00
landing_hero_cta : "Leave a Request" ,
landing_services_title : "Our Services" ,
2026-05-11 11:34:11 +01:00
landing_service_cats_title : "Cats" ,
landing_service_cats_text : "We'll come to your home, feed your cat, wash the bowls, change the water, clean the litter box, play, pet, and talk to them — everything your beloved pet desires. We'll give them maximum attention. We'll send you a photo/video report about how it went." ,
landing_service_exotic_title : "Rodents, Reptiles" ,
landing_service_exotic_text : "We'll come to your home, feed them, clean the cage. We'll send you a photo/video report about how it went." ,
landing_service_bonus_title : "Plants, Fish" ,
landing_service_bonus_text : "As a bonus, we'll water the plants, feed the fish, collect the mail — everything will be just like when you're home." ,
2026-04-29 17:49:07 +03:00
landing_how_title : "How It Works" ,
landing_how_step1_title : "Leave a Request" ,
2026-05-11 11:34:11 +01:00
landing_how_step1_text : "Fill out the form below — just your name and phone. We'll contact you shortly" ,
2026-04-29 17:49:07 +03:00
landing_how_step2_title : "Discuss the Details" ,
2026-05-11 11:34:11 +01:00
landing_how_step2_text : "We'll meet, get to know your pet, discuss the visit schedule and any special requirements. We'll present an ID document." ,
2026-04-29 17:49:07 +03:00
landing_how_step3_title : "We Take Care" ,
2026-05-11 11:34:11 +01:00
landing_how_step3_text : "While you're away — we're here. After each visit we'll send photos and a report on your pet's well-being." ,
2026-04-29 17:49:07 +03:00
landing_form_title : "Leave a Request" ,
landing_form_subtitle : "Tell us about yourself and we'll get back to you shortly" ,
landing_form_name : "Your Name" ,
landing_form_phone : "Phone" ,
landing_form_comment : "Comment" ,
landing_form_comment_placeholder : "Tell us about your pet and when you need help..." ,
landing_form_submit : "Submit Request" ,
landing_thank_you_title : "Thank you!" ,
landing_thank_you_text : "We've received your request and will contact you shortly." ,
landing_thank_you_back : "Back to Home" ,
2026-05-11 11:34:11 +01:00
landing_guarantee : "Integrity, honesty, and strict fulfillment of your requirements guaranteed." ,
landing_testimonials_title : "Testimonials" ,
2026-05-11 12:52:41 +01:00
landing_form_consent : "I consent to the processing of my personal data" ,
2026-05-13 15:00:38 +01:00
landing_footer_text : "МурНяня.РФ — Присмотрим, погладим, покормим" ,
2026-05-11 12:52:41 +01:00
landing_footer_copyright : "All rights reserved" ,
2026-04-29 17:49:07 +03:00
2026-09-20 21:00:03 +03:00
cookie_banner_text : "We use cookies to run the site and for anonymous visit statistics." ,
cookie_banner_accept : "Accept" ,
cookie_privacy_link : "Privacy Policy" ,
privacy_title : "Privacy & Cookie Policy" ,
2026-05-11 11:34:11 +01:00
nav_testimonials : "Testimonials" ,
testimonials_title : "Testimonials" ,
testimonials_empty : "No testimonials yet." ,
testimonials_add_title : "Add Testimonial" ,
testimonials_text : "Review text" ,
testimonials_author_note : "Name / pet type" ,
testimonials_image : "Photo" ,
testimonials_add_button : "Add" ,
testimonials_status_active : "Visible" ,
testimonials_status_hidden : "Hidden" ,
2026-05-11 13:30:34 +01:00
testimonials_edit : "Edit" ,
testimonials_save : "Save" ,
testimonials_remove_image : "Remove photo" ,
2026-05-11 11:34:11 +01:00
2026-04-29 17:49:07 +03:00
no_value : "—" ,
action_convert : "Convert" ,
action_reject : "Reject" ,
action_in_progress : "In Progress" ,
action_archive : "Archive" ,
action_activate : "Activate" ,
};
impl Translations {
2026-05-11 12:52:41 +01:00
pub fn app_version ( & self ) -> & 'static str {
env! ( "CARGO_PKG_VERSION" )
}
2026-04-29 17:49:07 +03:00
pub fn lead_status ( & self , status : & str ) -> & 'static str {
match status {
"new" => self . status_new ,
"in_progress" => self . status_in_progress ,
"converted" => self . status_converted ,
"rejected" => self . status_rejected ,
_ => "?" ,
}
}
pub fn visit_status ( & self , status : & str ) -> & 'static str {
match status {
"scheduled" => self . visit_status_scheduled ,
"completed" => self . visit_status_completed ,
"cancelled" => self . visit_status_cancelled ,
2026-06-04 13:41:18 +03:00
"deleted" => self . visit_status_deleted ,
2026-04-29 17:49:07 +03:00
_ => "?" ,
}
}
pub fn client_status ( & self , status : & str ) -> & 'static str {
match status {
"active" => self . client_status_active ,
"archived" => self . client_status_archived ,
2026-06-04 13:41:18 +03:00
"deleted" => self . client_status_deleted ,
2026-04-29 17:49:07 +03:00
_ => "?" ,
}
}
}