From 183b108b4bedc403bad6a93fa35bb937148d3c62 Mon Sep 17 00:00:00 2001 From: Ben Date: Mon, 5 Oct 2026 11:10:50 +0700 Subject: [PATCH 01/23] Add chinese_simplified translation for Monitor 1.5.0 --- language/chinese_simplified_utf-8.php | 295 ++++++++++++++++++++++++++ 1 file changed, 295 insertions(+) create mode 100644 language/chinese_simplified_utf-8.php diff --git a/language/chinese_simplified_utf-8.php b/language/chinese_simplified_utf-8.php new file mode 100644 index 0000000..625da39 --- /dev/null +++ b/language/chinese_simplified_utf-8.php @@ -0,0 +1,295 @@ + 'Monitor', + 'home' => '概览', + 'health' => '状态', + 'security' => '安全', + 'file' => '文件:', + 'log_file' => '日志文件:', + 'view_logs' => '查看当前日志', + 'clear_logs' => '清除日志', + 'configuration' => '配置', + 'main' => '站点状态概览', + 'logs' => '日志文件', + 'updates' => '插件', + 'status' => '状态', + 'check' => '检查', + 'value' => '值', + 'recommendation' => '建议', + 'health_ok' => 'OK', + 'health_info' => '信息', + 'health_warning' => '警告', + 'health_error' => '错误', + 'security_observations' => '安全观察', + 'ban_integration' => 'Ban 插件', + 'legacy_ban_notice' => 'Monitor 记录有限的安全观察。可选的 Ban 插件可提供集中式阻止功能,而不会把 Monitor 变成第二套封禁引擎。', + 'security_status' => '安全状态', + 'security_no_issue' => '可用的 Monitor 安全检查未检测到问题。', + 'ban_not_installed' => '未安装', + 'ban_installed' => '已安装', + 'ban_optional_intro' => 'Ban 为可选项。即使未安装,Monitor 仍会继续记录有限的安全观察。', + 'ban_optional_capability' => '安装 Ban 后会增加集中式阻止功能,Monitor 可在其可用时使用。', + 'ban_view_plugin' => '查看 Ban 插件信息', + 'ban_version' => '版本', + 'ban_ip_capability' => 'IP 封禁请求能力', + 'ban_capability_available' => '可用', + 'ban_capability_unavailable' => '不可用', + 'ban_direct_sql' => '与 Ban 的直接 SQL 耦合', + 'ban_direct_sql_no' => '否', + 'security_no_legacy_table' => '不存在旧版 Monitor 安全表。', + 'security_no_observations' => '没有最近的安全观察。', + 'read_only_advice' => 'Monitor 默认只进行观察和建议。任何更改都需要管理员明确执行操作。', + 'config_tooltip_emails' => '可选的 Monitor 通知收件人,多个地址用逗号分隔。留空可禁用电子邮件通知。', + 'config_tooltip_repository' => 'Monitor 用于检查插件元数据和版本的 GitHub 公共仓库所有者。留空可禁用远程检查。', + 'config_tooltip_github_token' => '可选的细粒度只读 GitHub 令牌。MONITOR_GITHUB_TOKEN 优先。经过身份验证的检查具有更高的 API 配额并使用更短的标签缓存。', + + // Media diagnostics + 'media_oversized_single' => '1 张图片超出建议限制。', + 'media_oversized_multiple' => '%d 张图片超出建议限制。', + 'media_show_files' => '显示文件(%d)', + 'media_hide_files' => '隐藏文件(%d)', + 'media_open_file_manager' => '打开文件管理器', + 'media_view_image' => '查看图片', + 'media_more_files' => '还有其他超大图片;列表已限制显示数量。', + 'media_partial_scan' => '文件系统扫描已达到安全限制。', + + // Daily log archives + 'log_archive_title' => '日志归档', + 'log_archive_intro' => 'Monitor 每天轮换 Geeklog 的 .log 文件,并保留最近 %d 天的归档。', + 'log_archive_safety' => '活动日志仅在归档副本成功写入后才会被截断。归档存储在 path_data 下方,位于公共 Web 目录之外。', + 'log_archive_empty' => '目前还没有每日日志归档。第一次计划任务运行会建立轮换基线;归档将在下一个自然日之后出现。', + 'log_archive_date' => '日期', + 'log_archive_log' => '日志', + 'log_archive_size' => '大小', + 'log_archive_actions' => '操作', + 'log_archive_view' => '查看', + 'log_archive_download' => '下载', + 'log_archive_back' => '返回日志归档', + 'log_archive_preview_limited' => '此预览仅显示归档中最新的 512 KiB。下载文件可获取完整的每日日志。', + 'log_email_title' => '每日日志摘要', + 'log_email_lines' => '扫描行数', + 'log_email_issue_lines' => '错误/警告行', + 'log_email_top_patterns' => '主要 error.log 模式', + 'log_email_no_activity' => '当天没有归档任何非空 Geeklog 日志。', + + // Changes monitor + 'changes' => '变更', + 'changes_page_title' => 'Monitor 变更', + 'changes_intro' => '比较站点的轻量快照,以查看两次检查之间发生了什么变化。Monitor 仅记录状态,不修改站点。', + 'changes_capture' => '捕获当前状态', + 'changes_capture_ok' => '当前状态已保存。', + 'changes_capture_failed' => 'Monitor 无法保存快照。请检查 path_data 是否可写。', + 'changes_baseline_created' => '已创建基线。稍后再捕获一个状态以查看发生了哪些变化。', + 'changes_waiting' => '在比较变更之前需要第二个快照。', + 'changes_period' => '比较期间:', + 'changes_previous' => '上一个', + 'changes_current' => '当前', + 'changes_summary_changes' => '变更', + 'changes_summary_plugins' => '插件变更', + 'changes_summary_log' => '新的日志模式', + 'changes_summary_snapshots' => '快照', + 'changes_none' => '这两个快照之间未检测到有意义的变化。', + 'changes_detected' => '检测到的变更', + 'changes_environment' => '环境', + 'changes_plugins' => '插件', + 'changes_storage' => '存储', + 'changes_logs' => '新的 error.log 活动', + 'changes_before' => '之前', + 'changes_after' => '之后', + 'changes_occurrences' => '次', + 'changes_log_none' => '此期间的 error.log 中未检测到新的错误、警告或异常模式。', + 'changes_log_rotated' => '在两个快照之间,error.log 已轮换或被截断,因此无法可靠比较新部分。', + 'changes_log_truncated' => '新的日志数据超过分析限制。Monitor 仅分析了最新的 512 KiB。', + 'changes_current_state' => '当前状态', + 'changes_geeklog' => 'Geeklog', + 'changes_php' => 'PHP', + 'changes_plugins_count' => '已安装插件', + 'changes_disk_free' => '可用磁盘空间', + 'changes_error_log_size' => 'error.log 大小', + 'changes_unknown' => '未知', + 'changes_enabled' => '已启用', + 'changes_disabled' => '已禁用', + 'changes_code_geeklog_changed' => 'Geeklog 版本已更改', + 'changes_code_php_changed' => 'PHP 版本已更改', + 'changes_code_plugin_installed' => '插件已安装', + 'changes_code_plugin_removed' => '插件已移除', + 'changes_code_plugin_version_changed' => '插件版本已更改', + 'changes_code_plugin_enabled' => '插件已启用', + 'changes_code_plugin_disabled' => '插件已禁用', + 'changes_code_disk_free_decreased' => '可用磁盘空间减少', + + // Configuration audit + 'config_audit_title' => '配置审计', + 'config_audit_page_title' => 'Monitor 配置审计', + 'config_audit_quick_description' => '检查 siteconfig.php 与数据库中对应 Core 值之间的差异。', + 'config_audit_back' => 'Monitor 概览', + 'config_audit_access_denied' => '访问被拒绝', + 'config_audit_root_only' => '仅 Root 管理员可访问。', + 'config_audit_intro_title' => '只读配置审计。', + 'config_audit_intro' => '将 siteconfig.php 中明确配置的 Core 值与 conf_values 中对应值进行比较。只有差异或无效值需要关注。', + 'config_audit_issues' => '问题', + 'config_audit_review' => '复核', + 'config_audit_normal' => '正常', + 'config_audit_active_host' => '主机:', + 'config_audit_siteconfig' => 'siteconfig.php:', + 'config_audit_unreadable_title' => '警告:', + 'config_audit_unreadable' => 'Monitor 无法读取当前生效的 siteconfig.php,因此比较结果不完整。', + 'config_audit_items_review' => '需要关注', + 'config_audit_no_issues' => '配置一致。没有冲突的 Core 值需要关注。', + 'config_audit_secondary' => '显示 %d 个正常或信息性值', + 'config_audit_footer' => '敏感值已隐藏。可选的数据库对齐 SQL 永远不会自动执行。', + 'config_audit_source_siteconfig' => 'siteconfig.php', + 'config_audit_source_database' => '数据库', + 'config_audit_priority' => '生效来源:', + 'config_audit_effective_value' => '生效值', + 'config_audit_details' => '详细信息', + 'config_audit_recommendation' => '建议', + 'config_audit_path' => '路径:', + 'config_audit_path_exists' => '存在', + 'config_audit_path_missing' => '缺失', + 'config_audit_optional_sql' => '可选数据库对齐', + 'config_audit_absent' => '不存在', + 'config_audit_redacted' => '[已隐藏]', + 'config_audit_value_true' => '真', + 'config_audit_value_false' => '假', + 'config_audit_value_null' => 'NULL', + 'config_audit_value_object' => '[OBJECT]', + + 'config_audit_level_ok' => '符合预期', + 'config_audit_level_info' => '信息', + 'config_audit_level_review' => '复核', + 'config_audit_level_warning' => '警告', + + 'config_audit_status_identical' => '相同', + 'config_audit_status_core_file' => '应在 siteconfig.php 中', + 'config_audit_status_file_only' => '仅 siteconfig.php', + 'config_audit_status_db_unset' => '数据库值未设置', + 'config_audit_status_different' => '值不同', + 'config_audit_status_decode_error' => '数据库值无法读取', + 'config_audit_status_invalid_path' => '无效路径', + + 'config_audit_why_identical' => 'siteconfig.php 和 conf_values 中存在相同值。', + 'config_audit_why_core_file' => '此 Core 键通常直接在 siteconfig.php 中定义。', + 'config_audit_why_file_only' => 'conf_values 中不存在对应 Core 值。将使用 siteconfig.php 中的值。', + 'config_audit_why_db_unset' => 'conf_values 中存在对应 Core 行,但值未设置。siteconfig.php 仍然生效。', + 'config_audit_why_different' => 'siteconfig.php 与 conf_values 包含不同值。运行时以 siteconfig.php 为准。', + 'config_audit_why_decode_error' => '无法可靠解码 conf_values 中对应的 Core 值。', + 'config_audit_why_invalid_path' => '当前生效的文件系统路径不存在。', + + 'config_audit_action_none' => '无需操作。', + 'config_audit_action_file_only' => '除非该值也需要在数据库中管理,否则无需操作。', + 'config_audit_action_db_unset' => '确认数据库值是否有意保持未设置状态。', + 'config_audit_action_different' => '确认此覆盖是否有意为之。仅当存储值已过时时才对齐数据库值。', + 'config_audit_action_decode_error' => '进行任何更改前,请检查 conf_values 中对应的 Core 行。', + 'config_audit_action_invalid_path' => '检查配置的路径以及文件系统是否可用。', + + // Plugin catalog + 'plugin_catalog_intro' => '已安装插件会与配置的 GitHub 所有者下的公共仓库进行比较。Monitor 会报告可用版本和发现候选项,但绝不会安装或更新代码。', + 'plugin_catalog_owner' => 'GitHub 来源:', + 'plugin_catalog_refresh' => '刷新 GitHub 数据', + 'plugin_catalog_installed' => '已安装插件', + 'plugin_catalog_discover' => '发现插件', + 'plugin_catalog_discover_compatible' => '与此站点兼容', + 'plugin_catalog_discover_incompatible' => '与此站点不兼容', + 'plugin_catalog_discover_unknown' => '兼容性未知', + 'plugin_catalog_discover_requirements_missing' => '未声明要求', + 'plugin_catalog_discover_metadata_unavailable' => '元数据不可用', + 'plugin_catalog_discover_intro' => '此站点尚未安装的近期公共仓库。安装任何内容前请检查兼容性和文档。', + 'plugin_catalog_legacy_discover' => '较旧的仓库', + 'plugin_catalog_legacy_intro' => '较旧的公共仓库可能仍有用,但其与近期 Geeklog 和 PHP 的兼容性未知。', + 'plugin_catalog_plugin' => '插件', + 'plugin_catalog_core_plugin' => 'Core 插件', + 'plugin_catalog_core_update' => '随 Geeklog 更新提供', + 'plugin_catalog_latest_core_version' => '最新 Core 版本', + 'plugin_catalog_current_geeklog' => '当前 Geeklog', + 'plugin_catalog_latest_geeklog_baseline' => '最新 Geeklog 基线', + 'plugin_catalog_open_core_plugin' => '打开 Core 插件', + 'plugin_catalog_version' => '版本', + 'plugin_catalog_bundled_with_geeklog' => '随 Geeklog 提供', + 'plugin_catalog_available_with_geeklog' => '可随 Geeklog 使用', + 'plugin_catalog_installed_version' => '已安装', + 'plugin_catalog_code_version' => '代码', + 'plugin_catalog_latest_release' => '最新发布版', + 'plugin_catalog_latest_version' => '最新 GitHub 版本', + 'plugin_catalog_version_source_release' => '发布版', + 'plugin_catalog_version_source_tag' => '标签', + 'plugin_catalog_state' => '状态', + 'plugin_catalog_enabled' => '已启用', + 'plugin_catalog_geeklog' => 'Geeklog 要求', + 'plugin_catalog_php_requirement' => 'PHP 要求', + 'plugin_catalog_update_compatible' => '更新兼容', + 'plugin_catalog_update_incompatible' => '更新不兼容', + 'plugin_catalog_compatibility_unknown' => '兼容性未知', + 'plugin_catalog_repository' => '仓库', + 'plugin_catalog_yes' => '是', + 'plugin_catalog_no' => '否', + 'plugin_catalog_unknown' => '未知', + 'plugin_catalog_no_release' => '没有发布元数据', + 'plugin_catalog_no_version' => '未找到发布版或版本标签', + 'plugin_catalog_no_repository' => '没有匹配的仓库', + 'plugin_catalog_catalog_unavailable' => 'GitHub 目录不可用', + 'plugin_catalog_current_compatible' => '对于此 Geeklog 已是最新', + 'plugin_catalog_latest_compatible_version' => '最新兼容版本', + 'plugin_catalog_newer_release' => '有更新的发布版', + 'plugin_catalog_requires_geeklog' => '需要 Geeklog %s', + 'plugin_catalog_requires_php' => '需要 PHP %s', + 'plugin_catalog_current' => '已是最新', + 'plugin_catalog_update' => '有可用更新', + 'plugin_catalog_ahead' => '已安装版本更新', + 'plugin_catalog_remote_unavailable' => 'GitHub 元数据不可用。仍会显示本地插件信息。', + 'plugin_catalog_remote_disabled' => '由于未配置有效的 GitHub 所有者,远程元数据检查已禁用。', + 'plugin_catalog_none_discoverable' => '未找到属于此 GitHub 所有者的其他近期插件仓库。', + 'plugin_catalog_open_repository' => '打开仓库', + 'plugin_catalog_open_release' => '打开发布版', + 'plugin_catalog_open_version' => '打开版本', + 'plugin_catalog_updated' => '已更新', + 'plugin_catalog_summary_installed' => '已安装', + 'plugin_catalog_summary_updates' => '有可用更新', + 'plugin_catalog_summary_discover' => '近期候选项', + 'plugin_catalog_summary_unmatched' => '无 GitHub 匹配'); + +$PLG_monitor_MESSAGE3002 = $LANG32[9]; +$PLG_monitor_MESSAGE3003 = 'Monitor 无法完成数据库迁移。已安装版本未更改;请检查 error.log 后重试升级。'; + +$GLOBALS['LANG_configsections']['monitor'] = array( + 'label' => 'Monitor', + 'title' => 'Monitor 配置' +); + +$GLOBALS['LANG_configsubgroups']['monitor'] = array( + 'sg_main' => '主要设置' +); + +$GLOBALS['LANG_tab']['monitor'] = array( + 'tab_main' => '主要' +); + +$GLOBALS['LANG_fs']['monitor'] = array( + 'fs_main' => '常规设置' +); + +$GLOBALS['LANG_confignames']['monitor'] = array( + 'emails' => '用于可选 Monitor 通知的电子邮件地址列表(用逗号分隔)', + 'repository' => '用于插件发布元数据的 GitHub 仓库所有者(默认:Geeklog-Plugins)。留空可禁用远程元数据检查。', + 'github_token' => '用于 API 元数据请求的可选 GitHub 令牌。建议使用细粒度只读令牌。环境变量 MONITOR_GITHUB_TOKEN 优先。' +); + +$LANG_configsections =& $GLOBALS['LANG_configsections']; +$LANG_configsubgroups =& $GLOBALS['LANG_configsubgroups']; +$LANG_tab =& $GLOBALS['LANG_tab']; +$LANG_fs =& $GLOBALS['LANG_fs']; +$LANG_confignames =& $GLOBALS['LANG_confignames']; From b5913c9888fbc2c668ccedcc72b24d18ae05fd10 Mon Sep 17 00:00:00 2001 From: Ben Date: Mon, 5 Oct 2026 11:10:53 +0700 Subject: [PATCH 02/23] Add chinese_traditional translation for Monitor 1.5.0 --- language/chinese_traditional_utf-8.php | 295 +++++++++++++++++++++++++ 1 file changed, 295 insertions(+) create mode 100644 language/chinese_traditional_utf-8.php diff --git a/language/chinese_traditional_utf-8.php b/language/chinese_traditional_utf-8.php new file mode 100644 index 0000000..dda6e12 --- /dev/null +++ b/language/chinese_traditional_utf-8.php @@ -0,0 +1,295 @@ + 'Monitor', + 'home' => '概覽', + 'health' => '狀態', + 'security' => '安全', + 'file' => '檔案:', + 'log_file' => '日誌檔案:', + 'view_logs' => '檢視目前日誌', + 'clear_logs' => '清除日誌', + 'configuration' => '設定', + 'main' => '網站狀態概覽', + 'logs' => '日誌檔案', + 'updates' => '外掛', + 'status' => '狀態', + 'check' => '檢查', + 'value' => '值', + 'recommendation' => '建議', + 'health_ok' => 'OK', + 'health_info' => '資訊', + 'health_warning' => '警告', + 'health_error' => '錯誤', + 'security_observations' => '安全觀察', + 'ban_integration' => 'Ban 外掛', + 'legacy_ban_notice' => 'Monitor 記錄有限的安全觀察。可選的 Ban 外掛可提供集中式封鎖功能,而不會把 Monitor 變成第二套封鎖引擎。', + 'security_status' => '安全狀態', + 'security_no_issue' => '可用的 Monitor 安全檢查未偵測到问题。', + 'ban_not_installed' => '未安裝', + 'ban_installed' => '已安裝', + 'ban_optional_intro' => 'Ban 為可選項。即使未安裝,Monitor 仍會继续記錄有限的安全觀察。', + 'ban_optional_capability' => '安裝 Ban 後會增加集中式封鎖功能,Monitor 可在其可用時使用。', + 'ban_view_plugin' => '檢視 Ban 外掛資訊', + 'ban_version' => '版本', + 'ban_ip_capability' => 'IP 封鎖請求能力', + 'ban_capability_available' => '可用', + 'ban_capability_unavailable' => '不可用', + 'ban_direct_sql' => '與 Ban 的直接 SQL 耦合', + 'ban_direct_sql_no' => '否', + 'security_no_legacy_table' => '不存在舊版 Monitor 安全表。', + 'security_no_observations' => '沒有最近的安全觀察。', + 'read_only_advice' => 'Monitor 默認只進行觀察和建議。任何變更都需要管理員明确执行操作。', + 'config_tooltip_emails' => '可選的 Monitor 通知收件人,多個地址以逗號分隔。留空可停用電子郵件通知。', + 'config_tooltip_repository' => 'Monitor 用於檢查外掛程式中繼資料和版本的 GitHub 公開儲存庫擁有者。留空可停用遠端檢查。', + 'config_tooltip_github_token' => '可選的細粒度唯讀 GitHub 權杖。MONITOR_GITHUB_TOKEN 優先。已驗證的檢查具有較高的 API 配額並使用較短的標籤快取。', + + // Media diagnostics + 'media_oversized_single' => '1 张圖片超出建議限制。', + 'media_oversized_multiple' => '%d 张圖片超出建議限制。', + 'media_show_files' => '顯示檔案(%d)', + 'media_hide_files' => '隱藏檔案(%d)', + 'media_open_file_manager' => '打開檔案管理器', + 'media_view_image' => '檢視圖片', + 'media_more_files' => '還有其他超大圖片;列表已限制顯示數量。', + 'media_partial_scan' => '檔案系統掃描已达到安全限制。', + + // Daily log archives + 'log_archive_title' => '日誌封存', + 'log_archive_intro' => 'Monitor 每日輪替 Geeklog 的 .log 檔案,並保留最近 %d 天的封存。', + 'log_archive_safety' => '活动日誌僅在封存副本成功寫入後才會被截断。封存儲存在 path_data 下方,位於公開 Web 目錄之外。', + 'log_archive_empty' => '目前還沒有每日日誌封存。第一次排程工作运行會建立輪替基準;封存將在下一個自然日之後出現。', + 'log_archive_date' => '日期', + 'log_archive_log' => '日誌', + 'log_archive_size' => '大小', + 'log_archive_actions' => '操作', + 'log_archive_view' => '檢視', + 'log_archive_download' => '下載', + 'log_archive_back' => '返回日誌封存', + 'log_archive_preview_limited' => '此预覽僅顯示封存中最新的 512 KiB。下載檔案可獲取完整的每日日誌。', + 'log_email_title' => '每日日誌摘要', + 'log_email_lines' => '掃描行數', + 'log_email_issue_lines' => '錯誤/警告行', + 'log_email_top_patterns' => '主要 error.log 模式', + 'log_email_no_activity' => '當天沒有封存任何非空 Geeklog 日誌。', + + // Changes monitor + 'changes' => '變更', + 'changes_page_title' => 'Monitor 變更', + 'changes_intro' => '比較網站的轻量快照,以檢視两次檢查之间發生了什麼變化。Monitor 僅記錄狀態,不修改網站。', + 'changes_capture' => '擷取目前狀態', + 'changes_capture_ok' => '目前狀態已儲存。', + 'changes_capture_failed' => 'Monitor 無法儲存快照。請檢查 path_data 是否可寫。', + 'changes_baseline_created' => '已创建基準。稍後再擷取一個狀態以檢視發生了哪些變化。', + 'changes_waiting' => '在比較變更之前需要第二個快照。', + 'changes_period' => '比較期间:', + 'changes_previous' => '上一個', + 'changes_current' => '目前', + 'changes_summary_changes' => '變更', + 'changes_summary_plugins' => '外掛變更', + 'changes_summary_log' => '新的日誌模式', + 'changes_summary_snapshots' => '快照', + 'changes_none' => '這两個快照之间未偵測到有意义的變化。', + 'changes_detected' => '偵測到的變更', + 'changes_environment' => '環境', + 'changes_plugins' => '外掛', + 'changes_storage' => '儲存', + 'changes_logs' => '新的 error.log 活动', + 'changes_before' => '之前', + 'changes_after' => '之後', + 'changes_occurrences' => '次', + 'changes_log_none' => '此期间的 error.log 中未偵測到新的錯誤、警告或异常模式。', + 'changes_log_rotated' => '在两個快照之间,error.log 已輪替或被截断,因此無法可靠比較新部分。', + 'changes_log_truncated' => '新的日誌數據超過分析限制。Monitor 僅分析了最新的 512 KiB。', + 'changes_current_state' => '目前狀態', + 'changes_geeklog' => 'Geeklog', + 'changes_php' => 'PHP', + 'changes_plugins_count' => '已安裝外掛', + 'changes_disk_free' => '可用磁碟空間', + 'changes_error_log_size' => 'error.log 大小', + 'changes_unknown' => '未知', + 'changes_enabled' => '已啟用', + 'changes_disabled' => '已停用', + 'changes_code_geeklog_changed' => 'Geeklog 版本已變更', + 'changes_code_php_changed' => 'PHP 版本已變更', + 'changes_code_plugin_installed' => '外掛已安裝', + 'changes_code_plugin_removed' => '外掛已移除', + 'changes_code_plugin_version_changed' => '外掛版本已變更', + 'changes_code_plugin_enabled' => '外掛已啟用', + 'changes_code_plugin_disabled' => '外掛已停用', + 'changes_code_disk_free_decreased' => '可用磁碟空間减少', + + // Configuration audit + 'config_audit_title' => '設定審計', + 'config_audit_page_title' => 'Monitor 設定審計', + 'config_audit_quick_description' => '檢查 siteconfig.php 與資料庫中對應 Core 值之间的差异。', + 'config_audit_back' => 'Monitor 概覽', + 'config_audit_access_denied' => '访问被拒绝', + 'config_audit_root_only' => '僅 Root 管理員可访问。', + 'config_audit_intro_title' => '唯讀設定審計。', + 'config_audit_intro' => '將 siteconfig.php 中明确設定的 Core 值與 conf_values 中對應值進行比較。只有差异或無效值需要注意。', + 'config_audit_issues' => '问题', + 'config_audit_review' => '复核', + 'config_audit_normal' => '正常', + 'config_audit_active_host' => '主机:', + 'config_audit_siteconfig' => 'siteconfig.php:', + 'config_audit_unreadable_title' => '警告:', + 'config_audit_unreadable' => 'Monitor 無法讀取目前生效的 siteconfig.php,因此比較結果不完整。', + 'config_audit_items_review' => '需要注意', + 'config_audit_no_issues' => '設定一致。沒有冲突的 Core 值需要注意。', + 'config_audit_secondary' => '顯示 %d 個正常或資訊性值', + 'config_audit_footer' => '敏感值已隱藏。可選的資料庫對齐 SQL 永远不會自动执行。', + 'config_audit_source_siteconfig' => 'siteconfig.php', + 'config_audit_source_database' => '資料庫', + 'config_audit_priority' => '生效來源:', + 'config_audit_effective_value' => '生效值', + 'config_audit_details' => '詳细資訊', + 'config_audit_recommendation' => '建議', + 'config_audit_path' => '路徑:', + 'config_audit_path_exists' => '存在', + 'config_audit_path_missing' => '缺失', + 'config_audit_optional_sql' => '可選資料庫對齐', + 'config_audit_absent' => '不存在', + 'config_audit_redacted' => '[已隱藏]', + 'config_audit_value_true' => '真', + 'config_audit_value_false' => '假', + 'config_audit_value_null' => 'NULL', + 'config_audit_value_object' => '[OBJECT]', + + 'config_audit_level_ok' => '符合预期', + 'config_audit_level_info' => '資訊', + 'config_audit_level_review' => '复核', + 'config_audit_level_warning' => '警告', + + 'config_audit_status_identical' => '相同', + 'config_audit_status_core_file' => '應在 siteconfig.php 中', + 'config_audit_status_file_only' => '僅 siteconfig.php', + 'config_audit_status_db_unset' => '資料庫值未設置', + 'config_audit_status_different' => '值不同', + 'config_audit_status_decode_error' => '資料庫值無法讀取', + 'config_audit_status_invalid_path' => '無效路徑', + + 'config_audit_why_identical' => 'siteconfig.php 和 conf_values 中存在相同值。', + 'config_audit_why_core_file' => '此 Core 键通常直接在 siteconfig.php 中定义。', + 'config_audit_why_file_only' => 'conf_values 中不存在對應 Core 值。將使用 siteconfig.php 中的值。', + 'config_audit_why_db_unset' => 'conf_values 中存在對應 Core 行,但值未設置。siteconfig.php 仍然生效。', + 'config_audit_why_different' => 'siteconfig.php 與 conf_values 包含不同值。运行時以 siteconfig.php 為准。', + 'config_audit_why_decode_error' => '無法可靠解码 conf_values 中對應的 Core 值。', + 'config_audit_why_invalid_path' => '目前生效的檔案系統路徑不存在。', + + 'config_audit_action_none' => '無需操作。', + 'config_audit_action_file_only' => '除非該值也需要在資料庫中管理,否則無需操作。', + 'config_audit_action_db_unset' => '確認資料庫值是否有意保持未設置狀態。', + 'config_audit_action_different' => '確認此覆寫是否有意為之。僅當儲存值已過時時才對齐資料庫值。', + 'config_audit_action_decode_error' => '進行任何變更前,請檢查 conf_values 中對應的 Core 行。', + 'config_audit_action_invalid_path' => '檢查設定的路徑以及檔案系統是否可用。', + + // Plugin catalog + 'plugin_catalog_intro' => '已安裝外掛會與設定的 GitHub 擁有者下的公開儲存庫進行比較。Monitor 會报告可用版本和探索候选項,但绝不會安裝或更新程式碼。', + 'plugin_catalog_owner' => 'GitHub 來源:', + 'plugin_catalog_refresh' => '刷新 GitHub 數據', + 'plugin_catalog_installed' => '已安裝外掛', + 'plugin_catalog_discover' => '探索外掛', + 'plugin_catalog_discover_compatible' => '與此網站相容', + 'plugin_catalog_discover_incompatible' => '與此網站不相容', + 'plugin_catalog_discover_unknown' => '相容性未知', + 'plugin_catalog_discover_requirements_missing' => '未声明需求', + 'plugin_catalog_discover_metadata_unavailable' => '中繼資料不可用', + 'plugin_catalog_discover_intro' => '此網站尚未安裝的近期公開儲存庫。安裝任何内容前請檢查相容性和文檔。', + 'plugin_catalog_legacy_discover' => '較舊的儲存庫', + 'plugin_catalog_legacy_intro' => '較舊的公開儲存庫可能仍有用,但其與近期 Geeklog 和 PHP 的相容性未知。', + 'plugin_catalog_plugin' => '外掛', + 'plugin_catalog_core_plugin' => 'Core 外掛', + 'plugin_catalog_core_update' => '随 Geeklog 更新提供', + 'plugin_catalog_latest_core_version' => '最新 Core 版本', + 'plugin_catalog_current_geeklog' => '目前 Geeklog', + 'plugin_catalog_latest_geeklog_baseline' => '最新 Geeklog 基準', + 'plugin_catalog_open_core_plugin' => '打開 Core 外掛', + 'plugin_catalog_version' => '版本', + 'plugin_catalog_bundled_with_geeklog' => '随 Geeklog 提供', + 'plugin_catalog_available_with_geeklog' => '可随 Geeklog 使用', + 'plugin_catalog_installed_version' => '已安裝', + 'plugin_catalog_code_version' => '程式碼', + 'plugin_catalog_latest_release' => '最新發行版', + 'plugin_catalog_latest_version' => '最新 GitHub 版本', + 'plugin_catalog_version_source_release' => '發行版', + 'plugin_catalog_version_source_tag' => '標籤', + 'plugin_catalog_state' => '狀態', + 'plugin_catalog_enabled' => '已啟用', + 'plugin_catalog_geeklog' => 'Geeklog 需求', + 'plugin_catalog_php_requirement' => 'PHP 需求', + 'plugin_catalog_update_compatible' => '更新相容', + 'plugin_catalog_update_incompatible' => '更新不相容', + 'plugin_catalog_compatibility_unknown' => '相容性未知', + 'plugin_catalog_repository' => '儲存庫', + 'plugin_catalog_yes' => '是', + 'plugin_catalog_no' => '否', + 'plugin_catalog_unknown' => '未知', + 'plugin_catalog_no_release' => '沒有發佈中繼資料', + 'plugin_catalog_no_version' => '未找到發行版或版本標籤', + 'plugin_catalog_no_repository' => '沒有符合的儲存庫', + 'plugin_catalog_catalog_unavailable' => 'GitHub 目錄不可用', + 'plugin_catalog_current_compatible' => '對於此 Geeklog 已是最新', + 'plugin_catalog_latest_compatible_version' => '最新相容版本', + 'plugin_catalog_newer_release' => '有更新的發行版', + 'plugin_catalog_requires_geeklog' => '需要 Geeklog %s', + 'plugin_catalog_requires_php' => '需要 PHP %s', + 'plugin_catalog_current' => '已是最新', + 'plugin_catalog_update' => '有可用更新', + 'plugin_catalog_ahead' => '已安裝版本更新', + 'plugin_catalog_remote_unavailable' => 'GitHub 中繼資料不可用。仍會顯示本地外掛資訊。', + 'plugin_catalog_remote_disabled' => '由於未設定有效的 GitHub 擁有者,远程中繼資料檢查已停用。', + 'plugin_catalog_none_discoverable' => '未找到属於此 GitHub 擁有者的其他近期外掛儲存庫。', + 'plugin_catalog_open_repository' => '打開儲存庫', + 'plugin_catalog_open_release' => '打開發行版', + 'plugin_catalog_open_version' => '打開版本', + 'plugin_catalog_updated' => '已更新', + 'plugin_catalog_summary_installed' => '已安裝', + 'plugin_catalog_summary_updates' => '有可用更新', + 'plugin_catalog_summary_discover' => '近期候选項', + 'plugin_catalog_summary_unmatched' => '無 GitHub 符合'); + +$PLG_monitor_MESSAGE3002 = $LANG32[9]; +$PLG_monitor_MESSAGE3003 = 'Monitor 无法完成数据库迁移。已安装版本未更改;请检查 error.log 后重试升级。'; + +$GLOBALS['LANG_configsections']['monitor'] = array( + 'label' => 'Monitor', + 'title' => 'Monitor 設定' +); + +$GLOBALS['LANG_configsubgroups']['monitor'] = array( + 'sg_main' => '主要設定' +); + +$GLOBALS['LANG_tab']['monitor'] = array( + 'tab_main' => '主要' +); + +$GLOBALS['LANG_fs']['monitor'] = array( + 'fs_main' => '一般設定' +); + +$GLOBALS['LANG_confignames']['monitor'] = array( + 'emails' => '用於可選 Monitor 通知的電子郵件地址列表(用逗号分隔)', + 'repository' => '用於外掛發佈中繼資料的 GitHub 儲存庫擁有者(默認:Geeklog-Plugins)。留空可停用远程中繼資料檢查。', + 'github_token' => '用於 API 中繼資料請求的可選 GitHub 權杖。建議使用细粒度唯讀權杖。環境變量 MONITOR_GITHUB_TOKEN 優先。' +); + +$LANG_configsections =& $GLOBALS['LANG_configsections']; +$LANG_configsubgroups =& $GLOBALS['LANG_configsubgroups']; +$LANG_tab =& $GLOBALS['LANG_tab']; +$LANG_fs =& $GLOBALS['LANG_fs']; +$LANG_confignames =& $GLOBALS['LANG_confignames']; From cce76b24f3958e4e477544f083b32b95b48a7c71 Mon Sep 17 00:00:00 2001 From: Ben Date: Mon, 5 Oct 2026 11:10:56 +0700 Subject: [PATCH 03/23] Add french_canada translation for Monitor 1.5.0 --- language/french_canada_utf-8.php | 295 +++++++++++++++++++++++++++++++ 1 file changed, 295 insertions(+) create mode 100644 language/french_canada_utf-8.php diff --git a/language/french_canada_utf-8.php b/language/french_canada_utf-8.php new file mode 100644 index 0000000..a11799b --- /dev/null +++ b/language/french_canada_utf-8.php @@ -0,0 +1,295 @@ + 'Monitor', + 'home' => 'Vue d’ensemble', + 'health' => 'Santé', + 'security' => 'Sécurité', + 'file' => 'Fichier :', + 'log_file' => 'Fichier journal :', + 'view_logs' => 'Voir les journaux actuels', + 'clear_logs' => 'Effacer les journaux', + 'configuration' => 'Configuration', + 'main' => 'Vue d’ensemble de l’état du site', + 'logs' => 'Fichiers journaux', + 'updates' => 'Plugins', + 'status' => 'État', + 'check' => 'Vérification', + 'value' => 'Valeur', + 'recommendation' => 'Recommandation', + 'health_ok' => 'OK', + 'health_info' => 'Information', + 'health_warning' => 'Avertissement', + 'health_error' => 'Erreur', + 'security_observations' => 'Observations de sécurité', + 'ban_integration' => 'Plugin Ban', + 'legacy_ban_notice' => 'Monitor enregistre des observations de sécurité limitées. Le plugin Ban facultatif peut fournir des fonctions de blocage centralisées sans transformer Monitor en second moteur de bannissement.', + 'security_status' => 'État de la sécurité', + 'security_no_issue' => 'Aucun problème détecté par les contrôles de sécurité disponibles de Monitor.', + 'ban_not_installed' => 'Non installé', + 'ban_installed' => 'Installé', + 'ban_optional_intro' => 'Ban est facultatif. Monitor continue d’enregistrer ses observations de sécurité limitées sans lui.', + 'ban_optional_capability' => 'L’installation de Ban ajoute des fonctions de blocage centralisées que Monitor peut utiliser lorsqu’elles sont disponibles.', + 'ban_view_plugin' => 'Voir les informations du plugin Ban', + 'ban_version' => 'Version', + 'ban_ip_capability' => 'Capacité de demande de bannissement IP', + 'ban_capability_available' => 'Disponible', + 'ban_capability_unavailable' => 'Indisponible', + 'ban_direct_sql' => 'Couplage SQL direct avec Ban', + 'ban_direct_sql_no' => 'Non', + 'security_no_legacy_table' => 'Aucune ancienne table de sécurité Monitor n’est présente.', + 'security_no_observations' => 'Aucune observation de sécurité récente.', + 'read_only_advice' => 'Par défaut, Monitor observe et recommande. Les modifications nécessitent une action explicite d’un administrateur.', + 'config_tooltip_emails' => 'Destinataires facultatifs des notifications Monitor, séparés par des virgules. Laissez vide pour désactiver les notifications par courriel.', + 'config_tooltip_repository' => 'Propriétaire GitHub dont Monitor vérifie les dépôts publics pour les métadonnées et versions des plugins. Laissez vide pour désactiver les vérifications distantes.', + 'config_tooltip_github_token' => 'Jeton GitHub facultatif, à granularité fine et en lecture seule. MONITOR_GITHUB_TOKEN est prioritaire. Les vérifications authentifiées disposent d’un quota API supérieur et utilisent un cache de tags plus court.', + + // Media diagnostics + 'media_oversized_single' => '1 image dépasse les limites recommandées.', + 'media_oversized_multiple' => '%d images dépassent les limites recommandées.', + 'media_show_files' => 'Afficher les fichiers (%d)', + 'media_hide_files' => 'Masquer les fichiers (%d)', + 'media_open_file_manager' => 'Ouvrir le gestionnaire de fichiers', + 'media_view_image' => 'Voir l’image', + 'media_more_files' => 'D’autres images surdimensionnées existent ; la liste est limitée.', + 'media_partial_scan' => 'L’analyse du système de fichiers a atteint sa limite de sécurité.', + + // Daily log archives + 'log_archive_title' => 'Archives des journaux', + 'log_archive_intro' => 'Monitor effectue une rotation quotidienne des fichiers .log de Geeklog et conserve les %d derniers jours d’archives.', + 'log_archive_safety' => 'Un journal actif n’est tronqué qu’après l’écriture réussie de sa copie d’archive. Les archives sont stockées sous path_data, hors du répertoire web public.', + 'log_archive_empty' => 'Aucune archive quotidienne n’est encore disponible. La première exécution planifiée crée la référence de rotation ; les archives apparaissent après le jour calendaire suivant.', + 'log_archive_date' => 'Date', + 'log_archive_log' => 'Journal', + 'log_archive_size' => 'Taille', + 'log_archive_actions' => 'Actions', + 'log_archive_view' => 'Voir', + 'log_archive_download' => 'Télécharger', + 'log_archive_back' => 'Retour aux archives des journaux', + 'log_archive_preview_limited' => 'Cet aperçu affiche uniquement les 512 Kio les plus récents de l’archive. Téléchargez le fichier pour récupérer le journal quotidien complet.', + 'log_email_title' => 'Résumé quotidien des journaux', + 'log_email_lines' => 'Lignes analysées', + 'log_email_issue_lines' => 'Lignes d’erreur/d’avertissement', + 'log_email_top_patterns' => 'Principaux motifs d’error.log', + 'log_email_no_activity' => 'Aucun journal Geeklog non vide n’a été archivé pour cette journée.', + + // Changes monitor + 'changes' => 'Modifications', + 'changes_page_title' => 'Modifications Monitor', + 'changes_intro' => 'Comparez des instantanés légers du site pour voir ce qui a changé entre deux contrôles. Monitor enregistre uniquement l’état ; il ne modifie pas le site.', + 'changes_capture' => 'Capturer l’état actuel', + 'changes_capture_ok' => 'État actuel enregistré.', + 'changes_capture_failed' => 'Monitor n’a pas pu enregistrer l’instantané. Vérifiez que path_data est accessible en écriture.', + 'changes_baseline_created' => 'Référence créée. Capturez un autre état plus tard pour voir ce qui a changé.', + 'changes_waiting' => 'Un deuxième instantané est nécessaire avant de pouvoir comparer les modifications.', + 'changes_period' => 'Période comparée :', + 'changes_previous' => 'Précédent', + 'changes_current' => 'Actuel', + 'changes_summary_changes' => 'Modifications', + 'changes_summary_plugins' => 'Modifications des plugins', + 'changes_summary_log' => 'Nouveaux motifs de journal', + 'changes_summary_snapshots' => 'Instantanés', + 'changes_none' => 'Aucune modification significative n’a été détectée entre ces deux instantanés.', + 'changes_detected' => 'Modifications détectées', + 'changes_environment' => 'Environnement', + 'changes_plugins' => 'Plugins', + 'changes_storage' => 'Stockage', + 'changes_logs' => 'Nouvelle activité dans error.log', + 'changes_before' => 'Avant', + 'changes_after' => 'Après', + 'changes_occurrences' => 'occurrence(s)', + 'changes_log_none' => 'Aucun nouveau motif d’erreur, d’avertissement ou d’exception n’a été détecté dans error.log pour cette période.', + 'changes_log_rotated' => 'error.log a été soumis à une rotation ou tronqué entre les deux instantanés ; la nouvelle partie ne peut donc pas être comparée de manière fiable.', + 'changes_log_truncated' => 'Les nouvelles données du journal ont dépassé la limite d’analyse. Monitor n’a analysé que les 512 Kio les plus récents.', + 'changes_current_state' => 'État actuel', + 'changes_geeklog' => 'Geeklog', + 'changes_php' => 'PHP', + 'changes_plugins_count' => 'Plugins installés', + 'changes_disk_free' => 'Espace disque libre', + 'changes_error_log_size' => 'Taille d’error.log', + 'changes_unknown' => 'Inconnu', + 'changes_enabled' => 'activé', + 'changes_disabled' => 'désactivé', + 'changes_code_geeklog_changed' => 'Version de Geeklog modifiée', + 'changes_code_php_changed' => 'Version de PHP modifiée', + 'changes_code_plugin_installed' => 'Plugin installé', + 'changes_code_plugin_removed' => 'Plugin supprimé', + 'changes_code_plugin_version_changed' => 'Version du plugin modifiée', + 'changes_code_plugin_enabled' => 'Plugin activé', + 'changes_code_plugin_disabled' => 'Plugin désactivé', + 'changes_code_disk_free_decreased' => 'Espace disque libre réduit', + + // Configuration audit + 'config_audit_title' => 'Audit de configuration', + 'config_audit_page_title' => 'Audit de configuration Monitor', + 'config_audit_quick_description' => 'Vérifier les différences entre siteconfig.php et les valeurs Core correspondantes dans la base de données.', + 'config_audit_back' => 'Vue d’ensemble de Monitor', + 'config_audit_access_denied' => 'Accès refusé', + 'config_audit_root_only' => 'Accès réservé aux administrateurs Root.', + 'config_audit_intro_title' => 'Audit de configuration en lecture seule.', + 'config_audit_intro' => 'Compare les valeurs Core explicitement définies dans siteconfig.php aux valeurs correspondantes de conf_values. Seules les différences ou valeurs invalides nécessitent une attention.', + 'config_audit_issues' => 'Problèmes', + 'config_audit_review' => 'À vérifier', + 'config_audit_normal' => 'Normal', + 'config_audit_active_host' => 'Hôte :', + 'config_audit_siteconfig' => 'siteconfig.php :', + 'config_audit_unreadable_title' => 'Avertissement :', + 'config_audit_unreadable' => 'Monitor n’a pas pu lire le siteconfig.php actif ; la comparaison est donc incomplète.', + 'config_audit_items_review' => 'Nécessite une attention', + 'config_audit_no_issues' => 'La configuration est cohérente. Aucune valeur Core conflictuelle ne nécessite d’attention.', + 'config_audit_secondary' => 'Afficher %d valeur(s) normale(s) ou informative(s)', + 'config_audit_footer' => 'Les valeurs sensibles sont masquées. Le SQL facultatif d’alignement de la base n’est jamais exécuté automatiquement.', + 'config_audit_source_siteconfig' => 'siteconfig.php', + 'config_audit_source_database' => 'Base de données', + 'config_audit_priority' => 'Source effective :', + 'config_audit_effective_value' => 'Valeur effective', + 'config_audit_details' => 'Détails', + 'config_audit_recommendation' => 'Recommandation', + 'config_audit_path' => 'Chemin :', + 'config_audit_path_exists' => 'existe', + 'config_audit_path_missing' => 'absent', + 'config_audit_optional_sql' => 'Alignement facultatif de la base de données', + 'config_audit_absent' => 'ABSENT', + 'config_audit_redacted' => '[MASQUÉ]', + 'config_audit_value_true' => 'vrai', + 'config_audit_value_false' => 'faux', + 'config_audit_value_null' => 'NULL', + 'config_audit_value_object' => '[OBJECT]', + + 'config_audit_level_ok' => 'Attendu', + 'config_audit_level_info' => 'Information', + 'config_audit_level_review' => 'À vérifier', + 'config_audit_level_warning' => 'Avertissement', + + 'config_audit_status_identical' => 'Identique', + 'config_audit_status_core_file' => 'Attendu dans siteconfig.php', + 'config_audit_status_file_only' => 'siteconfig.php uniquement', + 'config_audit_status_db_unset' => 'Valeur de base de données non définie', + 'config_audit_status_different' => 'Valeurs différentes', + 'config_audit_status_decode_error' => 'Valeur de base de données illisible', + 'config_audit_status_invalid_path' => 'Chemin invalide', + + 'config_audit_why_identical' => 'La même valeur existe dans siteconfig.php et conf_values.', + 'config_audit_why_core_file' => 'Cette clé Core est normalement définie directement dans siteconfig.php.', + 'config_audit_why_file_only' => 'Aucune valeur Core correspondante n’existe dans conf_values. La valeur de siteconfig.php est utilisée.', + 'config_audit_why_db_unset' => 'Une ligne Core correspondante existe dans conf_values mais sa valeur n’est pas définie. siteconfig.php reste effectif.', + 'config_audit_why_different' => 'siteconfig.php et conf_values contiennent des valeurs différentes. siteconfig.php est effectif à l’exécution.', + 'config_audit_why_decode_error' => 'La valeur Core correspondante dans conf_values n’a pas pu être décodée de manière fiable.', + 'config_audit_why_invalid_path' => 'Le chemin effectif du système de fichiers n’existe pas actuellement.', + + 'config_audit_action_none' => 'Aucune action requise.', + 'config_audit_action_file_only' => 'Aucune action requise sauf si cette valeur doit également être gérée dans la base de données.', + 'config_audit_action_db_unset' => 'Vérifiez que la valeur de base de données est volontairement non définie.', + 'config_audit_action_different' => 'Vérifiez que cette surcharge est intentionnelle. N’alignez la valeur de base de données que si la valeur enregistrée est obsolète.', + 'config_audit_action_decode_error' => 'Inspectez la ligne Core correspondante dans conf_values avant toute modification.', + 'config_audit_action_invalid_path' => 'Vérifiez le chemin configuré et la disponibilité du système de fichiers.', + + // Plugin catalog + 'plugin_catalog_intro' => 'Les plugins installés sont comparés aux dépôts publics du propriétaire GitHub configuré. Monitor indique les versions disponibles et les candidats découverts, mais n’installe ni ne met jamais à jour le code.', + 'plugin_catalog_owner' => 'Source GitHub :', + 'plugin_catalog_refresh' => 'Actualiser les données GitHub', + 'plugin_catalog_installed' => 'Plugins installés', + 'plugin_catalog_discover' => 'Découvrir des plugins', + 'plugin_catalog_discover_compatible' => 'Compatible avec ce site', + 'plugin_catalog_discover_incompatible' => 'Non compatible avec ce site', + 'plugin_catalog_discover_unknown' => 'Compatibilité inconnue', + 'plugin_catalog_discover_requirements_missing' => 'Prérequis non déclarés', + 'plugin_catalog_discover_metadata_unavailable' => 'Métadonnées indisponibles', + 'plugin_catalog_discover_intro' => 'Dépôts publics récents non installés sur ce site. Vérifiez la compatibilité et la documentation avant toute installation.', + 'plugin_catalog_legacy_discover' => 'Dépôts plus anciens', + 'plugin_catalog_legacy_intro' => 'Les anciens dépôts publics peuvent encore être utiles, mais leur compatibilité avec les versions récentes de Geeklog et PHP est inconnue.', + 'plugin_catalog_plugin' => 'Plugin', + 'plugin_catalog_core_plugin' => 'Plugin Core', + 'plugin_catalog_core_update' => 'Disponible avec la mise à jour de Geeklog', + 'plugin_catalog_latest_core_version' => 'Dernière version Core', + 'plugin_catalog_current_geeklog' => 'Geeklog actuel', + 'plugin_catalog_latest_geeklog_baseline' => 'Dernière référence Geeklog', + 'plugin_catalog_open_core_plugin' => 'Ouvrir le plugin Core', + 'plugin_catalog_version' => 'Version', + 'plugin_catalog_bundled_with_geeklog' => 'Fourni avec Geeklog', + 'plugin_catalog_available_with_geeklog' => 'Disponible avec Geeklog', + 'plugin_catalog_installed_version' => 'Installé', + 'plugin_catalog_code_version' => 'Code', + 'plugin_catalog_latest_release' => 'Dernière version publiée', + 'plugin_catalog_latest_version' => 'Dernière version GitHub', + 'plugin_catalog_version_source_release' => 'Version publiée', + 'plugin_catalog_version_source_tag' => 'Tag', + 'plugin_catalog_state' => 'État', + 'plugin_catalog_enabled' => 'Activé', + 'plugin_catalog_geeklog' => 'Prérequis Geeklog', + 'plugin_catalog_php_requirement' => 'Prérequis PHP', + 'plugin_catalog_update_compatible' => 'Mise à jour compatible', + 'plugin_catalog_update_incompatible' => 'Mise à jour non compatible', + 'plugin_catalog_compatibility_unknown' => 'Compatibilité inconnue', + 'plugin_catalog_repository' => 'Dépôt', + 'plugin_catalog_yes' => 'Oui', + 'plugin_catalog_no' => 'Non', + 'plugin_catalog_unknown' => 'Inconnu', + 'plugin_catalog_no_release' => 'Aucune métadonnée de version', + 'plugin_catalog_no_version' => 'Aucune version publiée ni balise de version trouvée', + 'plugin_catalog_no_repository' => 'Aucun dépôt correspondant', + 'plugin_catalog_catalog_unavailable' => 'Catalogue GitHub indisponible', + 'plugin_catalog_current_compatible' => 'À jour pour ce Geeklog', + 'plugin_catalog_latest_compatible_version' => 'Dernière version compatible', + 'plugin_catalog_newer_release' => 'Version plus récente', + 'plugin_catalog_requires_geeklog' => 'nécessite Geeklog %s', + 'plugin_catalog_requires_php' => 'nécessite PHP %s', + 'plugin_catalog_current' => 'À jour', + 'plugin_catalog_update' => 'Mise à jour disponible', + 'plugin_catalog_ahead' => 'Version installée plus récente', + 'plugin_catalog_remote_unavailable' => 'Les métadonnées GitHub sont indisponibles. Les informations locales du plugin restent affichées.', + 'plugin_catalog_remote_disabled' => 'Les vérifications de métadonnées distantes sont désactivées car aucun propriétaire GitHub valide n’est configuré.', + 'plugin_catalog_none_discoverable' => 'Aucun autre dépôt de plugin récent n’a été trouvé pour ce propriétaire GitHub.', + 'plugin_catalog_open_repository' => 'Ouvrir le dépôt', + 'plugin_catalog_open_release' => 'Ouvrir la version publiée', + 'plugin_catalog_open_version' => 'Ouvrir la version', + 'plugin_catalog_updated' => 'Mis à jour', + 'plugin_catalog_summary_installed' => 'Installé', + 'plugin_catalog_summary_updates' => 'Mises à jour disponibles', + 'plugin_catalog_summary_discover' => 'Candidats récents', + 'plugin_catalog_summary_unmatched' => 'Sans correspondance GitHub'); + +$PLG_monitor_MESSAGE3002 = $LANG32[9]; +$PLG_monitor_MESSAGE3003 = 'Monitor n’a pas pu terminer la migration de la base de données. La version installée n’a pas été modifiée ; consultez error.log et relancez la mise à niveau.'; + +$GLOBALS['LANG_configsections']['monitor'] = array( + 'label' => 'Monitor', + 'title' => 'Configuration de Monitor' +); + +$GLOBALS['LANG_configsubgroups']['monitor'] = array( + 'sg_main' => 'Paramètres principaux' +); + +$GLOBALS['LANG_tab']['monitor'] = array( + 'tab_main' => 'Principal' +); + +$GLOBALS['LANG_fs']['monitor'] = array( + 'fs_main' => 'Paramètres généraux' +); + +$GLOBALS['LANG_confignames']['monitor'] = array( + 'emails' => 'Liste des adresses courriel pour les notifications facultatives de Monitor (séparées par des virgules)', + 'repository' => 'Propriétaire du dépôt GitHub réservé aux métadonnées de versions des plugins (par défaut : Geeklog-Plugins). Laissez vide pour désactiver les vérifications de métadonnées distantes.', + 'github_token' => 'Jeton GitHub facultatif pour les requêtes de métadonnées API. Préférez un jeton à granularité fine en lecture seule. La variable d’environnement MONITOR_GITHUB_TOKEN est prioritaire.' +); + +$LANG_configsections =& $GLOBALS['LANG_configsections']; +$LANG_configsubgroups =& $GLOBALS['LANG_configsubgroups']; +$LANG_tab =& $GLOBALS['LANG_tab']; +$LANG_fs =& $GLOBALS['LANG_fs']; +$LANG_confignames =& $GLOBALS['LANG_confignames']; From 168dc3807d811a982eb7a567f15de903ff9dce42 Mon Sep 17 00:00:00 2001 From: Ben Date: Mon, 5 Oct 2026 11:10:58 +0700 Subject: [PATCH 04/23] Add french_france translation for Monitor 1.5.0 --- language/french_france_utf-8.php | 295 +++++++++++++++++++++++++++++++ 1 file changed, 295 insertions(+) create mode 100644 language/french_france_utf-8.php diff --git a/language/french_france_utf-8.php b/language/french_france_utf-8.php new file mode 100644 index 0000000..bd48f53 --- /dev/null +++ b/language/french_france_utf-8.php @@ -0,0 +1,295 @@ + 'Monitor', + 'home' => 'Vue d’ensemble', + 'health' => 'Santé', + 'security' => 'Sécurité', + 'file' => 'Fichier :', + 'log_file' => 'Fichier journal :', + 'view_logs' => 'Voir les journaux actuels', + 'clear_logs' => 'Effacer les journaux', + 'configuration' => 'Configuration', + 'main' => 'Vue d’ensemble de l’état du site', + 'logs' => 'Fichiers journaux', + 'updates' => 'Plugins', + 'status' => 'État', + 'check' => 'Vérification', + 'value' => 'Valeur', + 'recommendation' => 'Recommandation', + 'health_ok' => 'OK', + 'health_info' => 'Information', + 'health_warning' => 'Avertissement', + 'health_error' => 'Erreur', + 'security_observations' => 'Observations de sécurité', + 'ban_integration' => 'Plugin Ban', + 'legacy_ban_notice' => 'Monitor enregistre des observations de sécurité limitées. Le plugin Ban facultatif peut fournir des fonctions de blocage centralisées sans transformer Monitor en second moteur de bannissement.', + 'security_status' => 'État de la sécurité', + 'security_no_issue' => 'Aucun problème détecté par les contrôles de sécurité disponibles de Monitor.', + 'ban_not_installed' => 'Non installé', + 'ban_installed' => 'Installé', + 'ban_optional_intro' => 'Ban est facultatif. Monitor continue d’enregistrer ses observations de sécurité limitées sans lui.', + 'ban_optional_capability' => 'L’installation de Ban ajoute des fonctions de blocage centralisées que Monitor peut utiliser lorsqu’elles sont disponibles.', + 'ban_view_plugin' => 'Voir les informations du plugin Ban', + 'ban_version' => 'Version', + 'ban_ip_capability' => 'Capacité de demande de bannissement IP', + 'ban_capability_available' => 'Disponible', + 'ban_capability_unavailable' => 'Indisponible', + 'ban_direct_sql' => 'Couplage SQL direct avec Ban', + 'ban_direct_sql_no' => 'Non', + 'security_no_legacy_table' => 'Aucune ancienne table de sécurité Monitor n’est présente.', + 'security_no_observations' => 'Aucune observation de sécurité récente.', + 'read_only_advice' => 'Par défaut, Monitor observe et recommande. Les modifications nécessitent une action explicite d’un administrateur.', + 'config_tooltip_emails' => 'Destinataires facultatifs des notifications Monitor, séparés par des virgules. Laissez vide pour désactiver les notifications par e-mail.', + 'config_tooltip_repository' => 'Propriétaire GitHub dont Monitor vérifie les dépôts publics pour les métadonnées et versions des plugins. Laissez vide pour désactiver les vérifications distantes.', + 'config_tooltip_github_token' => 'Jeton GitHub facultatif, à granularité fine et en lecture seule. MONITOR_GITHUB_TOKEN est prioritaire. Les vérifications authentifiées disposent d’un quota API supérieur et utilisent un cache de tags plus court.', + + // Media diagnostics + 'media_oversized_single' => '1 image dépasse les limites recommandées.', + 'media_oversized_multiple' => '%d images dépassent les limites recommandées.', + 'media_show_files' => 'Afficher les fichiers (%d)', + 'media_hide_files' => 'Masquer les fichiers (%d)', + 'media_open_file_manager' => 'Ouvrir le gestionnaire de fichiers', + 'media_view_image' => 'Voir l’image', + 'media_more_files' => 'D’autres images surdimensionnées existent ; la liste est limitée.', + 'media_partial_scan' => 'L’analyse du système de fichiers a atteint sa limite de sécurité.', + + // Daily log archives + 'log_archive_title' => 'Archives des journaux', + 'log_archive_intro' => 'Monitor effectue une rotation quotidienne des fichiers .log de Geeklog et conserve les %d derniers jours d’archives.', + 'log_archive_safety' => 'Un journal actif n’est tronqué qu’après l’écriture réussie de sa copie d’archive. Les archives sont stockées sous path_data, hors du répertoire web public.', + 'log_archive_empty' => 'Aucune archive quotidienne n’est encore disponible. La première exécution planifiée crée la référence de rotation ; les archives apparaissent après le jour calendaire suivant.', + 'log_archive_date' => 'Date', + 'log_archive_log' => 'Journal', + 'log_archive_size' => 'Taille', + 'log_archive_actions' => 'Actions', + 'log_archive_view' => 'Voir', + 'log_archive_download' => 'Télécharger', + 'log_archive_back' => 'Retour aux archives des journaux', + 'log_archive_preview_limited' => 'Cet aperçu affiche uniquement les 512 Kio les plus récents de l’archive. Téléchargez le fichier pour récupérer le journal quotidien complet.', + 'log_email_title' => 'Résumé quotidien des journaux', + 'log_email_lines' => 'Lignes analysées', + 'log_email_issue_lines' => 'Lignes d’erreur/d’avertissement', + 'log_email_top_patterns' => 'Principaux motifs d’error.log', + 'log_email_no_activity' => 'Aucun journal Geeklog non vide n’a été archivé pour cette journée.', + + // Changes monitor + 'changes' => 'Modifications', + 'changes_page_title' => 'Modifications Monitor', + 'changes_intro' => 'Comparez des instantanés légers du site pour voir ce qui a changé entre deux contrôles. Monitor enregistre uniquement l’état ; il ne modifie pas le site.', + 'changes_capture' => 'Capturer l’état actuel', + 'changes_capture_ok' => 'État actuel enregistré.', + 'changes_capture_failed' => 'Monitor n’a pas pu enregistrer l’instantané. Vérifiez que path_data est accessible en écriture.', + 'changes_baseline_created' => 'Référence créée. Capturez un autre état plus tard pour voir ce qui a changé.', + 'changes_waiting' => 'Un deuxième instantané est nécessaire avant de pouvoir comparer les modifications.', + 'changes_period' => 'Période comparée :', + 'changes_previous' => 'Précédent', + 'changes_current' => 'Actuel', + 'changes_summary_changes' => 'Modifications', + 'changes_summary_plugins' => 'Modifications des plugins', + 'changes_summary_log' => 'Nouveaux motifs de journal', + 'changes_summary_snapshots' => 'Instantanés', + 'changes_none' => 'Aucune modification significative n’a été détectée entre ces deux instantanés.', + 'changes_detected' => 'Modifications détectées', + 'changes_environment' => 'Environnement', + 'changes_plugins' => 'Plugins', + 'changes_storage' => 'Stockage', + 'changes_logs' => 'Nouvelle activité dans error.log', + 'changes_before' => 'Avant', + 'changes_after' => 'Après', + 'changes_occurrences' => 'occurrence(s)', + 'changes_log_none' => 'Aucun nouveau motif d’erreur, d’avertissement ou d’exception n’a été détecté dans error.log pour cette période.', + 'changes_log_rotated' => 'error.log a été soumis à une rotation ou tronqué entre les deux instantanés ; la nouvelle partie ne peut donc pas être comparée de manière fiable.', + 'changes_log_truncated' => 'Les nouvelles données du journal ont dépassé la limite d’analyse. Monitor n’a analysé que les 512 Kio les plus récents.', + 'changes_current_state' => 'État actuel', + 'changes_geeklog' => 'Geeklog', + 'changes_php' => 'PHP', + 'changes_plugins_count' => 'Plugins installés', + 'changes_disk_free' => 'Espace disque libre', + 'changes_error_log_size' => 'Taille d’error.log', + 'changes_unknown' => 'Inconnu', + 'changes_enabled' => 'activé', + 'changes_disabled' => 'désactivé', + 'changes_code_geeklog_changed' => 'Version de Geeklog modifiée', + 'changes_code_php_changed' => 'Version de PHP modifiée', + 'changes_code_plugin_installed' => 'Plugin installé', + 'changes_code_plugin_removed' => 'Plugin supprimé', + 'changes_code_plugin_version_changed' => 'Version du plugin modifiée', + 'changes_code_plugin_enabled' => 'Plugin activé', + 'changes_code_plugin_disabled' => 'Plugin désactivé', + 'changes_code_disk_free_decreased' => 'Espace disque libre réduit', + + // Configuration audit + 'config_audit_title' => 'Audit de configuration', + 'config_audit_page_title' => 'Audit de configuration Monitor', + 'config_audit_quick_description' => 'Vérifier les différences entre siteconfig.php et les valeurs Core correspondantes dans la base de données.', + 'config_audit_back' => 'Vue d’ensemble de Monitor', + 'config_audit_access_denied' => 'Accès refusé', + 'config_audit_root_only' => 'Accès réservé aux administrateurs Root.', + 'config_audit_intro_title' => 'Audit de configuration en lecture seule.', + 'config_audit_intro' => 'Compare les valeurs Core explicitement définies dans siteconfig.php aux valeurs correspondantes de conf_values. Seules les différences ou valeurs invalides nécessitent une attention.', + 'config_audit_issues' => 'Problèmes', + 'config_audit_review' => 'À vérifier', + 'config_audit_normal' => 'Normal', + 'config_audit_active_host' => 'Hôte :', + 'config_audit_siteconfig' => 'siteconfig.php :', + 'config_audit_unreadable_title' => 'Avertissement :', + 'config_audit_unreadable' => 'Monitor n’a pas pu lire le siteconfig.php actif ; la comparaison est donc incomplète.', + 'config_audit_items_review' => 'Nécessite une attention', + 'config_audit_no_issues' => 'La configuration est cohérente. Aucune valeur Core conflictuelle ne nécessite d’attention.', + 'config_audit_secondary' => 'Afficher %d valeur(s) normale(s) ou informative(s)', + 'config_audit_footer' => 'Les valeurs sensibles sont masquées. Le SQL facultatif d’alignement de la base n’est jamais exécuté automatiquement.', + 'config_audit_source_siteconfig' => 'siteconfig.php', + 'config_audit_source_database' => 'Base de données', + 'config_audit_priority' => 'Source effective :', + 'config_audit_effective_value' => 'Valeur effective', + 'config_audit_details' => 'Détails', + 'config_audit_recommendation' => 'Recommandation', + 'config_audit_path' => 'Chemin :', + 'config_audit_path_exists' => 'existe', + 'config_audit_path_missing' => 'absent', + 'config_audit_optional_sql' => 'Alignement facultatif de la base de données', + 'config_audit_absent' => 'ABSENT', + 'config_audit_redacted' => '[MASQUÉ]', + 'config_audit_value_true' => 'vrai', + 'config_audit_value_false' => 'faux', + 'config_audit_value_null' => 'NULL', + 'config_audit_value_object' => '[OBJECT]', + + 'config_audit_level_ok' => 'Attendu', + 'config_audit_level_info' => 'Information', + 'config_audit_level_review' => 'À vérifier', + 'config_audit_level_warning' => 'Avertissement', + + 'config_audit_status_identical' => 'Identique', + 'config_audit_status_core_file' => 'Attendu dans siteconfig.php', + 'config_audit_status_file_only' => 'siteconfig.php uniquement', + 'config_audit_status_db_unset' => 'Valeur de base de données non définie', + 'config_audit_status_different' => 'Valeurs différentes', + 'config_audit_status_decode_error' => 'Valeur de base de données illisible', + 'config_audit_status_invalid_path' => 'Chemin invalide', + + 'config_audit_why_identical' => 'La même valeur existe dans siteconfig.php et conf_values.', + 'config_audit_why_core_file' => 'Cette clé Core est normalement définie directement dans siteconfig.php.', + 'config_audit_why_file_only' => 'Aucune valeur Core correspondante n’existe dans conf_values. La valeur de siteconfig.php est utilisée.', + 'config_audit_why_db_unset' => 'Une ligne Core correspondante existe dans conf_values mais sa valeur n’est pas définie. siteconfig.php reste effectif.', + 'config_audit_why_different' => 'siteconfig.php et conf_values contiennent des valeurs différentes. siteconfig.php est effectif à l’exécution.', + 'config_audit_why_decode_error' => 'La valeur Core correspondante dans conf_values n’a pas pu être décodée de manière fiable.', + 'config_audit_why_invalid_path' => 'Le chemin effectif du système de fichiers n’existe pas actuellement.', + + 'config_audit_action_none' => 'Aucune action requise.', + 'config_audit_action_file_only' => 'Aucune action requise sauf si cette valeur doit également être gérée dans la base de données.', + 'config_audit_action_db_unset' => 'Vérifiez que la valeur de base de données est volontairement non définie.', + 'config_audit_action_different' => 'Vérifiez que cette surcharge est intentionnelle. N’alignez la valeur de base de données que si la valeur enregistrée est obsolète.', + 'config_audit_action_decode_error' => 'Inspectez la ligne Core correspondante dans conf_values avant toute modification.', + 'config_audit_action_invalid_path' => 'Vérifiez le chemin configuré et la disponibilité du système de fichiers.', + + // Plugin catalog + 'plugin_catalog_intro' => 'Les plugins installés sont comparés aux dépôts publics du propriétaire GitHub configuré. Monitor indique les versions disponibles et les candidats découverts, mais n’installe ni ne met jamais à jour le code.', + 'plugin_catalog_owner' => 'Source GitHub :', + 'plugin_catalog_refresh' => 'Actualiser les données GitHub', + 'plugin_catalog_installed' => 'Plugins installés', + 'plugin_catalog_discover' => 'Découvrir des plugins', + 'plugin_catalog_discover_compatible' => 'Compatible avec ce site', + 'plugin_catalog_discover_incompatible' => 'Non compatible avec ce site', + 'plugin_catalog_discover_unknown' => 'Compatibilité inconnue', + 'plugin_catalog_discover_requirements_missing' => 'Prérequis non déclarés', + 'plugin_catalog_discover_metadata_unavailable' => 'Métadonnées indisponibles', + 'plugin_catalog_discover_intro' => 'Dépôts publics récents non installés sur ce site. Vérifiez la compatibilité et la documentation avant toute installation.', + 'plugin_catalog_legacy_discover' => 'Dépôts plus anciens', + 'plugin_catalog_legacy_intro' => 'Les anciens dépôts publics peuvent encore être utiles, mais leur compatibilité avec les versions récentes de Geeklog et PHP est inconnue.', + 'plugin_catalog_plugin' => 'Plugin', + 'plugin_catalog_core_plugin' => 'Plugin Core', + 'plugin_catalog_core_update' => 'Disponible avec la mise à jour de Geeklog', + 'plugin_catalog_latest_core_version' => 'Dernière version Core', + 'plugin_catalog_current_geeklog' => 'Geeklog actuel', + 'plugin_catalog_latest_geeklog_baseline' => 'Dernière référence Geeklog', + 'plugin_catalog_open_core_plugin' => 'Ouvrir le plugin Core', + 'plugin_catalog_version' => 'Version', + 'plugin_catalog_bundled_with_geeklog' => 'Fourni avec Geeklog', + 'plugin_catalog_available_with_geeklog' => 'Disponible avec Geeklog', + 'plugin_catalog_installed_version' => 'Installé', + 'plugin_catalog_code_version' => 'Code', + 'plugin_catalog_latest_release' => 'Dernière version publiée', + 'plugin_catalog_latest_version' => 'Dernière version GitHub', + 'plugin_catalog_version_source_release' => 'Version publiée', + 'plugin_catalog_version_source_tag' => 'Tag', + 'plugin_catalog_state' => 'État', + 'plugin_catalog_enabled' => 'Activé', + 'plugin_catalog_geeklog' => 'Prérequis Geeklog', + 'plugin_catalog_php_requirement' => 'Prérequis PHP', + 'plugin_catalog_update_compatible' => 'Mise à jour compatible', + 'plugin_catalog_update_incompatible' => 'Mise à jour non compatible', + 'plugin_catalog_compatibility_unknown' => 'Compatibilité inconnue', + 'plugin_catalog_repository' => 'Dépôt', + 'plugin_catalog_yes' => 'Oui', + 'plugin_catalog_no' => 'Non', + 'plugin_catalog_unknown' => 'Inconnu', + 'plugin_catalog_no_release' => 'Aucune métadonnée de version', + 'plugin_catalog_no_version' => 'Aucune version publiée ni balise de version trouvée', + 'plugin_catalog_no_repository' => 'Aucun dépôt correspondant', + 'plugin_catalog_catalog_unavailable' => 'Catalogue GitHub indisponible', + 'plugin_catalog_current_compatible' => 'À jour pour ce Geeklog', + 'plugin_catalog_latest_compatible_version' => 'Dernière version compatible', + 'plugin_catalog_newer_release' => 'Version plus récente', + 'plugin_catalog_requires_geeklog' => 'nécessite Geeklog %s', + 'plugin_catalog_requires_php' => 'nécessite PHP %s', + 'plugin_catalog_current' => 'À jour', + 'plugin_catalog_update' => 'Mise à jour disponible', + 'plugin_catalog_ahead' => 'Version installée plus récente', + 'plugin_catalog_remote_unavailable' => 'Les métadonnées GitHub sont indisponibles. Les informations locales du plugin restent affichées.', + 'plugin_catalog_remote_disabled' => 'Les vérifications de métadonnées distantes sont désactivées car aucun propriétaire GitHub valide n’est configuré.', + 'plugin_catalog_none_discoverable' => 'Aucun autre dépôt de plugin récent n’a été trouvé pour ce propriétaire GitHub.', + 'plugin_catalog_open_repository' => 'Ouvrir le dépôt', + 'plugin_catalog_open_release' => 'Ouvrir la version publiée', + 'plugin_catalog_open_version' => 'Ouvrir la version', + 'plugin_catalog_updated' => 'Mis à jour', + 'plugin_catalog_summary_installed' => 'Installé', + 'plugin_catalog_summary_updates' => 'Mises à jour disponibles', + 'plugin_catalog_summary_discover' => 'Candidats récents', + 'plugin_catalog_summary_unmatched' => 'Sans correspondance GitHub'); + +$PLG_monitor_MESSAGE3002 = $LANG32[9]; +$PLG_monitor_MESSAGE3003 = 'Monitor n’a pas pu terminer la migration de la base de données. La version installée n’a pas été modifiée ; consultez error.log et relancez la mise à niveau.'; + +$GLOBALS['LANG_configsections']['monitor'] = array( + 'label' => 'Monitor', + 'title' => 'Configuration de Monitor' +); + +$GLOBALS['LANG_configsubgroups']['monitor'] = array( + 'sg_main' => 'Paramètres principaux' +); + +$GLOBALS['LANG_tab']['monitor'] = array( + 'tab_main' => 'Principal' +); + +$GLOBALS['LANG_fs']['monitor'] = array( + 'fs_main' => 'Paramètres généraux' +); + +$GLOBALS['LANG_confignames']['monitor'] = array( + 'emails' => 'Liste des adresses e-mail pour les notifications facultatives de Monitor (séparées par des virgules)', + 'repository' => 'Propriétaire du dépôt GitHub réservé aux métadonnées de versions des plugins (par défaut : Geeklog-Plugins). Laissez vide pour désactiver les vérifications de métadonnées distantes.', + 'github_token' => 'Jeton GitHub facultatif pour les requêtes de métadonnées API. Préférez un jeton à granularité fine en lecture seule. La variable d’environnement MONITOR_GITHUB_TOKEN est prioritaire.' +); + +$LANG_configsections =& $GLOBALS['LANG_configsections']; +$LANG_configsubgroups =& $GLOBALS['LANG_configsubgroups']; +$LANG_tab =& $GLOBALS['LANG_tab']; +$LANG_fs =& $GLOBALS['LANG_fs']; +$LANG_confignames =& $GLOBALS['LANG_confignames']; From 4dad8840b751d5f2ab955e46426563878ad4aab0 Mon Sep 17 00:00:00 2001 From: Ben Date: Mon, 5 Oct 2026 11:11:02 +0700 Subject: [PATCH 05/23] Add german_formal translation for Monitor 1.5.0 --- language/german_formal_utf-8.php | 295 +++++++++++++++++++++++++++++++ 1 file changed, 295 insertions(+) create mode 100644 language/german_formal_utf-8.php diff --git a/language/german_formal_utf-8.php b/language/german_formal_utf-8.php new file mode 100644 index 0000000..cfcf742 --- /dev/null +++ b/language/german_formal_utf-8.php @@ -0,0 +1,295 @@ + 'Monitor', + 'home' => 'Übersicht', + 'health' => 'Zustand', + 'security' => 'Sicherheit', + 'file' => 'Datei:', + 'log_file' => 'Protokolldatei:', + 'view_logs' => 'Aktuelle Protokolle anzeigen', + 'clear_logs' => 'Protokolle löschen', + 'configuration' => 'Konfiguration', + 'main' => 'Übersicht zum Website-Zustand', + 'logs' => 'Protokolldateien', + 'updates' => 'Plugins', + 'status' => 'Status', + 'check' => 'Prüfung', + 'value' => 'Wert', + 'recommendation' => 'Empfehlung', + 'health_ok' => 'OK', + 'health_info' => 'Information', + 'health_warning' => 'Warnung', + 'health_error' => 'Fehler', + 'security_observations' => 'Sicherheitsbeobachtungen', + 'ban_integration' => 'Ban-Plugin', + 'legacy_ban_notice' => 'Monitor zeichnet begrenzte Sicherheitsbeobachtungen auf. Das optionale Ban-Plugin kann zentrale Sperrfunktionen bereitstellen, ohne Monitor zu einer zweiten Sperr-Engine zu machen.', + 'security_status' => 'Sicherheitsstatus', + 'security_no_issue' => 'Die verfügbaren Monitor-Sicherheitsprüfungen haben kein Problem erkannt.', + 'ban_not_installed' => 'Nicht installiert', + 'ban_installed' => 'Installiert', + 'ban_optional_intro' => 'Ban ist optional. Monitor zeichnet seine begrenzten Sicherheitsbeobachtungen auch ohne Ban weiterhin auf.', + 'ban_optional_capability' => 'Die Installation von Ban fügt zentrale Sperrfunktionen hinzu, die Monitor bei Verfügbarkeit nutzen kann.', + 'ban_view_plugin' => 'Informationen zum Ban-Plugin anzeigen', + 'ban_version' => 'Version', + 'ban_ip_capability' => 'Funktion für IP-Sperranfragen', + 'ban_capability_available' => 'Verfügbar', + 'ban_capability_unavailable' => 'Nicht verfügbar', + 'ban_direct_sql' => 'Direkte SQL-Kopplung mit Ban', + 'ban_direct_sql_no' => 'Nein', + 'security_no_legacy_table' => 'Es ist keine alte Monitor-Sicherheitstabelle vorhanden.', + 'security_no_observations' => 'Keine aktuellen Sicherheitsbeobachtungen.', + 'read_only_advice' => 'Monitor beobachtet und empfiehlt standardmäßig. Änderungen erfordern eine ausdrückliche Administratoraktion.', + 'config_tooltip_emails' => 'Optionale, durch Kommas getrennte Empfänger für Monitor-Benachrichtigungen. Leer lassen, um E-Mail-Benachrichtigungen zu deaktivieren.', + 'config_tooltip_repository' => 'GitHub-Eigentümer, dessen öffentliche Repositories Monitor auf Plugin-Metadaten und Versionen prüft. Leer lassen, um Remote-Prüfungen zu deaktivieren.', + 'config_tooltip_github_token' => 'Optionales fein abgestuftes, schreibgeschütztes GitHub-Token. MONITOR_GITHUB_TOKEN hat Vorrang. Authentifizierte Prüfungen haben ein höheres API-Kontingent und verwenden einen kürzeren Tag-Cache.', + + // Media diagnostics + 'media_oversized_single' => '1 Bild überschreitet die empfohlenen Grenzwerte.', + 'media_oversized_multiple' => '%d Bilder überschreiten die empfohlenen Grenzwerte.', + 'media_show_files' => 'Dateien anzeigen (%d)', + 'media_hide_files' => 'Dateien ausblenden (%d)', + 'media_open_file_manager' => 'Dateimanager öffnen', + 'media_view_image' => 'Bild anzeigen', + 'media_more_files' => 'Weitere übergroße Bilder sind vorhanden; die Liste ist begrenzt.', + 'media_partial_scan' => 'Die Dateisystemprüfung hat ihr Sicherheitslimit erreicht.', + + // Daily log archives + 'log_archive_title' => 'Protokollarchive', + 'log_archive_intro' => 'Monitor rotiert die .log-Dateien von Geeklog täglich und bewahrt die Archive der letzten %d Tage auf.', + 'log_archive_safety' => 'Ein aktives Protokoll wird erst gekürzt, nachdem seine Archivkopie erfolgreich geschrieben wurde. Archive werden unter path_data außerhalb des öffentlichen Webverzeichnisses gespeichert.', + 'log_archive_empty' => 'Noch ist kein tägliches Protokollarchiv verfügbar. Der erste geplante Lauf erstellt die Rotationsbasis; Archive erscheinen nach dem nächsten Kalendertag.', + 'log_archive_date' => 'Datum', + 'log_archive_log' => 'Protokoll', + 'log_archive_size' => 'Größe', + 'log_archive_actions' => 'Aktionen', + 'log_archive_view' => 'Anzeigen', + 'log_archive_download' => 'Herunterladen', + 'log_archive_back' => 'Zurück zu den Protokollarchiven', + 'log_archive_preview_limited' => 'Diese Vorschau zeigt nur die neuesten 512 KiB des Archivs. Laden Sie die Datei herunter, um das vollständige Tagesprotokoll zu erhalten.', + 'log_email_title' => 'Tägliche Protokollzusammenfassung', + 'log_email_lines' => 'Analysierte Zeilen', + 'log_email_issue_lines' => 'Fehler-/Warnzeilen', + 'log_email_top_patterns' => 'Häufigste error.log-Muster', + 'log_email_no_activity' => 'Für diesen Tag wurde kein nicht leeres Geeklog-Protokoll archiviert.', + + // Changes monitor + 'changes' => 'Änderungen', + 'changes_page_title' => 'Monitor-Änderungen', + 'changes_intro' => 'Vergleichen Sie leichte Momentaufnahmen der Website, um Änderungen zwischen zwei Prüfungen zu sehen. Monitor zeichnet nur den Zustand auf und verändert die Website nicht.', + 'changes_capture' => 'Aktuellen Zustand erfassen', + 'changes_capture_ok' => 'Aktueller Zustand gespeichert.', + 'changes_capture_failed' => 'Monitor konnte die Momentaufnahme nicht speichern. Prüfen Sie, ob path_data beschreibbar ist.', + 'changes_baseline_created' => 'Basis erstellt. Erfassen Sie später einen weiteren Zustand, um Änderungen zu sehen.', + 'changes_waiting' => 'Vor dem Vergleich der Änderungen ist eine zweite Momentaufnahme erforderlich.', + 'changes_period' => 'Vergleichszeitraum:', + 'changes_previous' => 'Vorherig', + 'changes_current' => 'Aktuell', + 'changes_summary_changes' => 'Änderungen', + 'changes_summary_plugins' => 'Plugin-Änderungen', + 'changes_summary_log' => 'Neue Protokollmuster', + 'changes_summary_snapshots' => 'Momentaufnahmen', + 'changes_none' => 'Zwischen diesen beiden Momentaufnahmen wurde keine wesentliche Änderung erkannt.', + 'changes_detected' => 'Erkannte Änderungen', + 'changes_environment' => 'Umgebung', + 'changes_plugins' => 'Plugins', + 'changes_storage' => 'Speicher', + 'changes_logs' => 'Neue error.log-Aktivität', + 'changes_before' => 'Vorher', + 'changes_after' => 'Nachher', + 'changes_occurrences' => 'Vorkommen', + 'changes_log_none' => 'Für diesen Zeitraum wurde in error.log kein neues Fehler-, Warn- oder Ausnahmemuster erkannt.', + 'changes_log_rotated' => 'error.log wurde zwischen den beiden Momentaufnahmen rotiert oder gekürzt, daher kann der neue Teil nicht zuverlässig verglichen werden.', + 'changes_log_truncated' => 'Die neuen Protokolldaten überschritten das Analyselimit. Monitor analysierte nur die neuesten 512 KiB.', + 'changes_current_state' => 'Aktueller Zustand', + 'changes_geeklog' => 'Geeklog', + 'changes_php' => 'PHP', + 'changes_plugins_count' => 'Installierte Plugins', + 'changes_disk_free' => 'Freier Speicherplatz', + 'changes_error_log_size' => 'Größe von error.log', + 'changes_unknown' => 'Unbekannt', + 'changes_enabled' => 'aktiviert', + 'changes_disabled' => 'deaktiviert', + 'changes_code_geeklog_changed' => 'Geeklog-Version geändert', + 'changes_code_php_changed' => 'PHP-Version geändert', + 'changes_code_plugin_installed' => 'Plugin installiert', + 'changes_code_plugin_removed' => 'Plugin entfernt', + 'changes_code_plugin_version_changed' => 'Plugin-Version geändert', + 'changes_code_plugin_enabled' => 'Plugin aktiviert', + 'changes_code_plugin_disabled' => 'Plugin deaktiviert', + 'changes_code_disk_free_decreased' => 'Freier Speicherplatz verringert', + + // Configuration audit + 'config_audit_title' => 'Konfigurationsprüfung', + 'config_audit_page_title' => 'Monitor-Konfigurationsprüfung', + 'config_audit_quick_description' => 'Prüft Unterschiede zwischen siteconfig.php und den entsprechenden Core-Werten in der Datenbank.', + 'config_audit_back' => 'Monitor-Übersicht', + 'config_audit_access_denied' => 'Zugriff verweigert', + 'config_audit_root_only' => 'Zugriff ist Root-Administratoren vorbehalten.', + 'config_audit_intro_title' => 'Schreibgeschützte Konfigurationsprüfung.', + 'config_audit_intro' => 'Vergleicht explizit in siteconfig.php definierte Core-Werte mit den entsprechenden Werten in conf_values. Nur Unterschiede oder ungültige Werte erfordern Aufmerksamkeit.', + 'config_audit_issues' => 'Probleme', + 'config_audit_review' => 'Prüfen', + 'config_audit_normal' => 'Normal', + 'config_audit_active_host' => 'Host:', + 'config_audit_siteconfig' => 'siteconfig.php:', + 'config_audit_unreadable_title' => 'Warnung:', + 'config_audit_unreadable' => 'Monitor konnte die aktive siteconfig.php nicht lesen, daher ist der Vergleich unvollständig.', + 'config_audit_items_review' => 'Erfordert Aufmerksamkeit', + 'config_audit_no_issues' => 'Die Konfiguration ist konsistent. Kein widersprüchlicher Core-Wert erfordert Aufmerksamkeit.', + 'config_audit_secondary' => '%d normale oder informative Werte anzeigen', + 'config_audit_footer' => 'Sensible Werte werden geschwärzt. Optionales SQL zur Datenbankangleichung wird niemals automatisch ausgeführt.', + 'config_audit_source_siteconfig' => 'siteconfig.php', + 'config_audit_source_database' => 'Datenbank', + 'config_audit_priority' => 'Wirksame Quelle:', + 'config_audit_effective_value' => 'Wirksamer Wert', + 'config_audit_details' => 'Details', + 'config_audit_recommendation' => 'Empfehlung', + 'config_audit_path' => 'Pfad:', + 'config_audit_path_exists' => 'vorhanden', + 'config_audit_path_missing' => 'fehlt', + 'config_audit_optional_sql' => 'Optionale Datenbankangleichung', + 'config_audit_absent' => 'FEHLT', + 'config_audit_redacted' => '[GESCHWÄRZT]', + 'config_audit_value_true' => 'wahr', + 'config_audit_value_false' => 'falsch', + 'config_audit_value_null' => 'NULL', + 'config_audit_value_object' => '[OBJECT]', + + 'config_audit_level_ok' => 'Erwartet', + 'config_audit_level_info' => 'Information', + 'config_audit_level_review' => 'Prüfen', + 'config_audit_level_warning' => 'Warnung', + + 'config_audit_status_identical' => 'Identisch', + 'config_audit_status_core_file' => 'In siteconfig.php erwartet', + 'config_audit_status_file_only' => 'Nur siteconfig.php', + 'config_audit_status_db_unset' => 'Datenbankwert nicht gesetzt', + 'config_audit_status_different' => 'Unterschiedliche Werte', + 'config_audit_status_decode_error' => 'Datenbankwert nicht lesbar', + 'config_audit_status_invalid_path' => 'Ungültiger Pfad', + + 'config_audit_why_identical' => 'Derselbe Wert ist in siteconfig.php und conf_values vorhanden.', + 'config_audit_why_core_file' => 'Dieser Core-Schlüssel wird normalerweise direkt in siteconfig.php definiert.', + 'config_audit_why_file_only' => 'In conf_values existiert kein entsprechender Core-Wert. Der Wert aus siteconfig.php wird verwendet.', + 'config_audit_why_db_unset' => 'In conf_values existiert eine passende Core-Zeile, ihr Wert ist jedoch nicht gesetzt. siteconfig.php bleibt wirksam.', + 'config_audit_why_different' => 'siteconfig.php und conf_values enthalten unterschiedliche Werte. Zur Laufzeit ist siteconfig.php wirksam.', + 'config_audit_why_decode_error' => 'Der entsprechende Core-Wert in conf_values konnte nicht zuverlässig dekodiert werden.', + 'config_audit_why_invalid_path' => 'Der wirksame Dateisystempfad existiert derzeit nicht.', + + 'config_audit_action_none' => 'Keine Aktion erforderlich.', + 'config_audit_action_file_only' => 'Keine Aktion erforderlich, sofern dieser Wert nicht auch in der Datenbank verwaltet werden soll.', + 'config_audit_action_db_unset' => 'Prüfen Sie, ob der Datenbankwert absichtlich nicht gesetzt ist.', + 'config_audit_action_different' => 'Prüfen Sie, ob diese Überschreibung beabsichtigt ist. Gleichen Sie den Datenbankwert nur an, wenn der gespeicherte Wert veraltet ist.', + 'config_audit_action_decode_error' => 'Prüfen Sie die passende Core-Zeile in conf_values, bevor Sie Änderungen vornehmen.', + 'config_audit_action_invalid_path' => 'Prüfen Sie den konfigurierten Pfad und die Verfügbarkeit des Dateisystems.', + + // Plugin catalog + 'plugin_catalog_intro' => 'Installierte Plugins werden mit öffentlichen Repositories des konfigurierten GitHub-Eigentümers verglichen. Monitor meldet verfügbare Versionen und Entdeckungskandidaten, installiert oder aktualisiert jedoch niemals Code.', + 'plugin_catalog_owner' => 'GitHub-Quelle:', + 'plugin_catalog_refresh' => 'GitHub-Daten aktualisieren', + 'plugin_catalog_installed' => 'Installierte Plugins', + 'plugin_catalog_discover' => 'Plugins entdecken', + 'plugin_catalog_discover_compatible' => 'Mit dieser Website kompatibel', + 'plugin_catalog_discover_incompatible' => 'Nicht mit dieser Website kompatibel', + 'plugin_catalog_discover_unknown' => 'Kompatibilität unbekannt', + 'plugin_catalog_discover_requirements_missing' => 'Anforderungen nicht angegeben', + 'plugin_catalog_discover_metadata_unavailable' => 'Metadaten nicht verfügbar', + 'plugin_catalog_discover_intro' => 'Aktuelle öffentliche Repositories, die auf dieser Website nicht installiert sind. Prüfen Sie Kompatibilität und Dokumentation vor einer Installation.', + 'plugin_catalog_legacy_discover' => 'Ältere Repositories', + 'plugin_catalog_legacy_intro' => 'Ältere öffentliche Repositories können weiterhin nützlich sein, ihre Kompatibilität mit aktuellen Geeklog- und PHP-Versionen ist jedoch unbekannt.', + 'plugin_catalog_plugin' => 'Plugin', + 'plugin_catalog_core_plugin' => 'Core-Plugin', + 'plugin_catalog_core_update' => 'Mit Geeklog-Update verfügbar', + 'plugin_catalog_latest_core_version' => 'Neueste Core-Version', + 'plugin_catalog_current_geeklog' => 'Aktuelles Geeklog', + 'plugin_catalog_latest_geeklog_baseline' => 'Neueste Geeklog-Basis', + 'plugin_catalog_open_core_plugin' => 'Core-Plugin öffnen', + 'plugin_catalog_version' => 'Version', + 'plugin_catalog_bundled_with_geeklog' => 'Mit Geeklog gebündelt', + 'plugin_catalog_available_with_geeklog' => 'Mit Geeklog verfügbar', + 'plugin_catalog_installed_version' => 'Installiert', + 'plugin_catalog_code_version' => 'Code', + 'plugin_catalog_latest_release' => 'Neueste Veröffentlichung', + 'plugin_catalog_latest_version' => 'Neueste GitHub-Version', + 'plugin_catalog_version_source_release' => 'Veröffentlichung', + 'plugin_catalog_version_source_tag' => 'Tag', + 'plugin_catalog_state' => 'Status', + 'plugin_catalog_enabled' => 'Aktiviert', + 'plugin_catalog_geeklog' => 'Geeklog-Anforderung', + 'plugin_catalog_php_requirement' => 'PHP-Anforderung', + 'plugin_catalog_update_compatible' => 'Update kompatibel', + 'plugin_catalog_update_incompatible' => 'Update nicht kompatibel', + 'plugin_catalog_compatibility_unknown' => 'Kompatibilität unbekannt', + 'plugin_catalog_repository' => 'Repository', + 'plugin_catalog_yes' => 'Ja', + 'plugin_catalog_no' => 'Nein', + 'plugin_catalog_unknown' => 'Unbekannt', + 'plugin_catalog_no_release' => 'Keine Veröffentlichungsmetadaten', + 'plugin_catalog_no_version' => 'Keine Veröffentlichung oder Versionsmarke gefunden', + 'plugin_catalog_no_repository' => 'Kein passendes Repository', + 'plugin_catalog_catalog_unavailable' => 'GitHub-Katalog nicht verfügbar', + 'plugin_catalog_current_compatible' => 'Für dieses Geeklog aktuell', + 'plugin_catalog_latest_compatible_version' => 'Neueste kompatible Version', + 'plugin_catalog_newer_release' => 'Neuere Veröffentlichung', + 'plugin_catalog_requires_geeklog' => 'erfordert Geeklog %s', + 'plugin_catalog_requires_php' => 'erfordert PHP %s', + 'plugin_catalog_current' => 'Aktuell', + 'plugin_catalog_update' => 'Update verfügbar', + 'plugin_catalog_ahead' => 'Installierte Version neuer', + 'plugin_catalog_remote_unavailable' => 'GitHub-Metadaten sind nicht verfügbar. Lokale Plugin-Informationen werden weiterhin angezeigt.', + 'plugin_catalog_remote_disabled' => 'Remote-Metadatenprüfungen sind deaktiviert, da kein gültiger GitHub-Eigentümer konfiguriert ist.', + 'plugin_catalog_none_discoverable' => 'Für diesen GitHub-Eigentümer wurde kein weiteres aktuelles Plugin-Repository gefunden.', + 'plugin_catalog_open_repository' => 'Repository öffnen', + 'plugin_catalog_open_release' => 'Veröffentlichung öffnen', + 'plugin_catalog_open_version' => 'Version öffnen', + 'plugin_catalog_updated' => 'Aktualisiert', + 'plugin_catalog_summary_installed' => 'Installiert', + 'plugin_catalog_summary_updates' => 'Updates verfügbar', + 'plugin_catalog_summary_discover' => 'Aktuelle Kandidaten', + 'plugin_catalog_summary_unmatched' => 'Ohne GitHub-Treffer'); + +$PLG_monitor_MESSAGE3002 = $LANG32[9]; +$PLG_monitor_MESSAGE3003 = 'Monitor konnte die Datenbankmigration nicht abschließen. Die installierte Version wurde nicht geändert; prüfen Sie error.log und versuchen Sie das Upgrade erneut.'; + +$GLOBALS['LANG_configsections']['monitor'] = array( + 'label' => 'Monitor', + 'title' => 'Monitor-Konfiguration' +); + +$GLOBALS['LANG_configsubgroups']['monitor'] = array( + 'sg_main' => 'Haupteinstellungen' +); + +$GLOBALS['LANG_tab']['monitor'] = array( + 'tab_main' => 'Hauptbereich' +); + +$GLOBALS['LANG_fs']['monitor'] = array( + 'fs_main' => 'Allgemeine Einstellungen' +); + +$GLOBALS['LANG_confignames']['monitor'] = array( + 'emails' => 'Liste von E-Mail-Adressen für optionale Monitor-Benachrichtigungen (durch Kommas getrennt)', + 'repository' => 'GitHub-Repository-Eigentümer für Plugin-Veröffentlichungsmetadaten (Standard: Geeklog-Plugins). Leer lassen, um Remote-Metadatenprüfungen zu deaktivieren.', + 'github_token' => 'Optionales GitHub-Token für API-Metadatenanfragen. Bevorzugen Sie ein fein abgestuftes Nur-Lese-Token. Die Umgebungsvariable MONITOR_GITHUB_TOKEN hat Vorrang.' +); + +$LANG_configsections =& $GLOBALS['LANG_configsections']; +$LANG_configsubgroups =& $GLOBALS['LANG_configsubgroups']; +$LANG_tab =& $GLOBALS['LANG_tab']; +$LANG_fs =& $GLOBALS['LANG_fs']; +$LANG_confignames =& $GLOBALS['LANG_confignames']; From efc01269dac2049a65b393d99b7fe0b47198427e Mon Sep 17 00:00:00 2001 From: Ben Date: Mon, 5 Oct 2026 11:11:05 +0700 Subject: [PATCH 06/23] Add german translation for Monitor 1.5.0 --- language/german_utf-8.php | 295 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 295 insertions(+) create mode 100644 language/german_utf-8.php diff --git a/language/german_utf-8.php b/language/german_utf-8.php new file mode 100644 index 0000000..cea8eb8 --- /dev/null +++ b/language/german_utf-8.php @@ -0,0 +1,295 @@ + 'Monitor', + 'home' => 'Übersicht', + 'health' => 'Zustand', + 'security' => 'Sicherheit', + 'file' => 'Datei:', + 'log_file' => 'Protokolldatei:', + 'view_logs' => 'Aktuelle Protokolle anzeigen', + 'clear_logs' => 'Protokolle löschen', + 'configuration' => 'Konfiguration', + 'main' => 'Übersicht zum Website-Zustand', + 'logs' => 'Protokolldateien', + 'updates' => 'Plugins', + 'status' => 'Status', + 'check' => 'Prüfung', + 'value' => 'Wert', + 'recommendation' => 'Empfehlung', + 'health_ok' => 'OK', + 'health_info' => 'Information', + 'health_warning' => 'Warnung', + 'health_error' => 'Fehler', + 'security_observations' => 'Sicherheitsbeobachtungen', + 'ban_integration' => 'Ban-Plugin', + 'legacy_ban_notice' => 'Monitor zeichnet begrenzte Sicherheitsbeobachtungen auf. Das optionale Ban-Plugin kann zentrale Sperrfunktionen bereitstellen, ohne Monitor zu einer zweiten Sperr-Engine zu machen.', + 'security_status' => 'Sicherheitsstatus', + 'security_no_issue' => 'Die verfügbaren Monitor-Sicherheitsprüfungen haben kein Problem erkannt.', + 'ban_not_installed' => 'Nicht installiert', + 'ban_installed' => 'Installiert', + 'ban_optional_intro' => 'Ban ist optional. Monitor zeichnet seine begrenzten Sicherheitsbeobachtungen auch ohne Ban weiterhin auf.', + 'ban_optional_capability' => 'Die Installation von Ban fügt zentrale Sperrfunktionen hinzu, die Monitor bei Verfügbarkeit nutzen kann.', + 'ban_view_plugin' => 'Informationen zum Ban-Plugin anzeigen', + 'ban_version' => 'Version', + 'ban_ip_capability' => 'Funktion für IP-Sperranfragen', + 'ban_capability_available' => 'Verfügbar', + 'ban_capability_unavailable' => 'Nicht verfügbar', + 'ban_direct_sql' => 'Direkte SQL-Kopplung mit Ban', + 'ban_direct_sql_no' => 'Nein', + 'security_no_legacy_table' => 'Es ist keine alte Monitor-Sicherheitstabelle vorhanden.', + 'security_no_observations' => 'Keine aktuellen Sicherheitsbeobachtungen.', + 'read_only_advice' => 'Monitor beobachtet und empfiehlt standardmäßig. Änderungen erfordern eine ausdrückliche Administratoraktion.', + 'config_tooltip_emails' => 'Optionale, durch Kommas getrennte Empfänger für Monitor-Benachrichtigungen. Leer lassen, um E-Mail-Benachrichtigungen zu deaktivieren.', + 'config_tooltip_repository' => 'GitHub-Eigentümer, dessen öffentliche Repositories Monitor auf Plugin-Metadaten und Versionen prüft. Leer lassen, um Remote-Prüfungen zu deaktivieren.', + 'config_tooltip_github_token' => 'Optionales fein abgestuftes, schreibgeschütztes GitHub-Token. MONITOR_GITHUB_TOKEN hat Vorrang. Authentifizierte Prüfungen haben ein höheres API-Kontingent und verwenden einen kürzeren Tag-Cache.', + + // Media diagnostics + 'media_oversized_single' => '1 Bild überschreitet die empfohlenen Grenzwerte.', + 'media_oversized_multiple' => '%d Bilder überschreiten die empfohlenen Grenzwerte.', + 'media_show_files' => 'Dateien anzeigen (%d)', + 'media_hide_files' => 'Dateien ausblenden (%d)', + 'media_open_file_manager' => 'Dateimanager öffnen', + 'media_view_image' => 'Bild anzeigen', + 'media_more_files' => 'Weitere übergroße Bilder sind vorhanden; die Liste ist begrenzt.', + 'media_partial_scan' => 'Die Dateisystemprüfung hat ihr Sicherheitslimit erreicht.', + + // Daily log archives + 'log_archive_title' => 'Protokollarchive', + 'log_archive_intro' => 'Monitor rotiert die .log-Dateien von Geeklog täglich und bewahrt die Archive der letzten %d Tage auf.', + 'log_archive_safety' => 'Ein aktives Protokoll wird erst gekürzt, nachdem seine Archivkopie erfolgreich geschrieben wurde. Archive werden unter path_data außerhalb des öffentlichen Webverzeichnisses gespeichert.', + 'log_archive_empty' => 'Noch ist kein tägliches Protokollarchiv verfügbar. Der erste geplante Lauf erstellt die Rotationsbasis; Archive erscheinen nach dem nächsten Kalendertag.', + 'log_archive_date' => 'Datum', + 'log_archive_log' => 'Protokoll', + 'log_archive_size' => 'Größe', + 'log_archive_actions' => 'Aktionen', + 'log_archive_view' => 'Anzeigen', + 'log_archive_download' => 'Herunterladen', + 'log_archive_back' => 'Zurück zu den Protokollarchiven', + 'log_archive_preview_limited' => 'Diese Vorschau zeigt nur die neuesten 512 KiB des Archivs. Laden Sie die Datei herunter, um das vollständige Tagesprotokoll zu erhalten.', + 'log_email_title' => 'Tägliche Protokollzusammenfassung', + 'log_email_lines' => 'Analysierte Zeilen', + 'log_email_issue_lines' => 'Fehler-/Warnzeilen', + 'log_email_top_patterns' => 'Häufigste error.log-Muster', + 'log_email_no_activity' => 'Für diesen Tag wurde kein nicht leeres Geeklog-Protokoll archiviert.', + + // Changes monitor + 'changes' => 'Änderungen', + 'changes_page_title' => 'Monitor-Änderungen', + 'changes_intro' => 'Vergleichen Sie leichte Momentaufnahmen der Website, um Änderungen zwischen zwei Prüfungen zu sehen. Monitor zeichnet nur den Zustand auf und verändert die Website nicht.', + 'changes_capture' => 'Aktuellen Zustand erfassen', + 'changes_capture_ok' => 'Aktueller Zustand gespeichert.', + 'changes_capture_failed' => 'Monitor konnte die Momentaufnahme nicht speichern. Prüfen Sie, ob path_data beschreibbar ist.', + 'changes_baseline_created' => 'Basis erstellt. Erfassen Sie später einen weiteren Zustand, um Änderungen zu sehen.', + 'changes_waiting' => 'Vor dem Vergleich der Änderungen ist eine zweite Momentaufnahme erforderlich.', + 'changes_period' => 'Vergleichszeitraum:', + 'changes_previous' => 'Vorherig', + 'changes_current' => 'Aktuell', + 'changes_summary_changes' => 'Änderungen', + 'changes_summary_plugins' => 'Plugin-Änderungen', + 'changes_summary_log' => 'Neue Protokollmuster', + 'changes_summary_snapshots' => 'Momentaufnahmen', + 'changes_none' => 'Zwischen diesen beiden Momentaufnahmen wurde keine wesentliche Änderung erkannt.', + 'changes_detected' => 'Erkannte Änderungen', + 'changes_environment' => 'Umgebung', + 'changes_plugins' => 'Plugins', + 'changes_storage' => 'Speicher', + 'changes_logs' => 'Neue error.log-Aktivität', + 'changes_before' => 'Vorher', + 'changes_after' => 'Nachher', + 'changes_occurrences' => 'Vorkommen', + 'changes_log_none' => 'Für diesen Zeitraum wurde in error.log kein neues Fehler-, Warn- oder Ausnahmemuster erkannt.', + 'changes_log_rotated' => 'error.log wurde zwischen den beiden Momentaufnahmen rotiert oder gekürzt, daher kann der neue Teil nicht zuverlässig verglichen werden.', + 'changes_log_truncated' => 'Die neuen Protokolldaten überschritten das Analyselimit. Monitor analysierte nur die neuesten 512 KiB.', + 'changes_current_state' => 'Aktueller Zustand', + 'changes_geeklog' => 'Geeklog', + 'changes_php' => 'PHP', + 'changes_plugins_count' => 'Installierte Plugins', + 'changes_disk_free' => 'Freier Speicherplatz', + 'changes_error_log_size' => 'Größe von error.log', + 'changes_unknown' => 'Unbekannt', + 'changes_enabled' => 'aktiviert', + 'changes_disabled' => 'deaktiviert', + 'changes_code_geeklog_changed' => 'Geeklog-Version geändert', + 'changes_code_php_changed' => 'PHP-Version geändert', + 'changes_code_plugin_installed' => 'Plugin installiert', + 'changes_code_plugin_removed' => 'Plugin entfernt', + 'changes_code_plugin_version_changed' => 'Plugin-Version geändert', + 'changes_code_plugin_enabled' => 'Plugin aktiviert', + 'changes_code_plugin_disabled' => 'Plugin deaktiviert', + 'changes_code_disk_free_decreased' => 'Freier Speicherplatz verringert', + + // Configuration audit + 'config_audit_title' => 'Konfigurationsprüfung', + 'config_audit_page_title' => 'Monitor-Konfigurationsprüfung', + 'config_audit_quick_description' => 'Prüft Unterschiede zwischen siteconfig.php und den entsprechenden Core-Werten in der Datenbank.', + 'config_audit_back' => 'Monitor-Übersicht', + 'config_audit_access_denied' => 'Zugriff verweigert', + 'config_audit_root_only' => 'Zugriff ist Root-Administratoren vorbehalten.', + 'config_audit_intro_title' => 'Schreibgeschützte Konfigurationsprüfung.', + 'config_audit_intro' => 'Vergleicht explizit in siteconfig.php definierte Core-Werte mit den entsprechenden Werten in conf_values. Nur Unterschiede oder ungültige Werte erfordern Aufmerksamkeit.', + 'config_audit_issues' => 'Probleme', + 'config_audit_review' => 'Prüfen', + 'config_audit_normal' => 'Normal', + 'config_audit_active_host' => 'Host:', + 'config_audit_siteconfig' => 'siteconfig.php:', + 'config_audit_unreadable_title' => 'Warnung:', + 'config_audit_unreadable' => 'Monitor konnte die aktive siteconfig.php nicht lesen, daher ist der Vergleich unvollständig.', + 'config_audit_items_review' => 'Erfordert Aufmerksamkeit', + 'config_audit_no_issues' => 'Die Konfiguration ist konsistent. Kein widersprüchlicher Core-Wert erfordert Aufmerksamkeit.', + 'config_audit_secondary' => '%d normale oder informative Werte anzeigen', + 'config_audit_footer' => 'Sensible Werte werden geschwärzt. Optionales SQL zur Datenbankangleichung wird niemals automatisch ausgeführt.', + 'config_audit_source_siteconfig' => 'siteconfig.php', + 'config_audit_source_database' => 'Datenbank', + 'config_audit_priority' => 'Wirksame Quelle:', + 'config_audit_effective_value' => 'Wirksamer Wert', + 'config_audit_details' => 'Details', + 'config_audit_recommendation' => 'Empfehlung', + 'config_audit_path' => 'Pfad:', + 'config_audit_path_exists' => 'vorhanden', + 'config_audit_path_missing' => 'fehlt', + 'config_audit_optional_sql' => 'Optionale Datenbankangleichung', + 'config_audit_absent' => 'FEHLT', + 'config_audit_redacted' => '[GESCHWÄRZT]', + 'config_audit_value_true' => 'wahr', + 'config_audit_value_false' => 'falsch', + 'config_audit_value_null' => 'NULL', + 'config_audit_value_object' => '[OBJECT]', + + 'config_audit_level_ok' => 'Erwartet', + 'config_audit_level_info' => 'Information', + 'config_audit_level_review' => 'Prüfen', + 'config_audit_level_warning' => 'Warnung', + + 'config_audit_status_identical' => 'Identisch', + 'config_audit_status_core_file' => 'In siteconfig.php erwartet', + 'config_audit_status_file_only' => 'Nur siteconfig.php', + 'config_audit_status_db_unset' => 'Datenbankwert nicht gesetzt', + 'config_audit_status_different' => 'Unterschiedliche Werte', + 'config_audit_status_decode_error' => 'Datenbankwert nicht lesbar', + 'config_audit_status_invalid_path' => 'Ungültiger Pfad', + + 'config_audit_why_identical' => 'Derselbe Wert ist in siteconfig.php und conf_values vorhanden.', + 'config_audit_why_core_file' => 'Dieser Core-Schlüssel wird normalerweise direkt in siteconfig.php definiert.', + 'config_audit_why_file_only' => 'In conf_values existiert kein entsprechender Core-Wert. Der Wert aus siteconfig.php wird verwendet.', + 'config_audit_why_db_unset' => 'In conf_values existiert eine passende Core-Zeile, ihr Wert ist jedoch nicht gesetzt. siteconfig.php bleibt wirksam.', + 'config_audit_why_different' => 'siteconfig.php und conf_values enthalten unterschiedliche Werte. Zur Laufzeit ist siteconfig.php wirksam.', + 'config_audit_why_decode_error' => 'Der entsprechende Core-Wert in conf_values konnte nicht zuverlässig dekodiert werden.', + 'config_audit_why_invalid_path' => 'Der wirksame Dateisystempfad existiert derzeit nicht.', + + 'config_audit_action_none' => 'Keine Aktion erforderlich.', + 'config_audit_action_file_only' => 'Keine Aktion erforderlich, sofern dieser Wert nicht auch in der Datenbank verwaltet werden soll.', + 'config_audit_action_db_unset' => 'Prüfen Sie, ob der Datenbankwert absichtlich nicht gesetzt ist.', + 'config_audit_action_different' => 'Prüfen Sie, ob diese Überschreibung beabsichtigt ist. Gleichen Sie den Datenbankwert nur an, wenn der gespeicherte Wert veraltet ist.', + 'config_audit_action_decode_error' => 'Prüfen Sie die passende Core-Zeile in conf_values, bevor Sie Änderungen vornehmen.', + 'config_audit_action_invalid_path' => 'Prüfen Sie den konfigurierten Pfad und die Verfügbarkeit des Dateisystems.', + + // Plugin catalog + 'plugin_catalog_intro' => 'Installierte Plugins werden mit öffentlichen Repositories des konfigurierten GitHub-Eigentümers verglichen. Monitor meldet verfügbare Versionen und Entdeckungskandidaten, installiert oder aktualisiert jedoch niemals Code.', + 'plugin_catalog_owner' => 'GitHub-Quelle:', + 'plugin_catalog_refresh' => 'GitHub-Daten aktualisieren', + 'plugin_catalog_installed' => 'Installierte Plugins', + 'plugin_catalog_discover' => 'Plugins entdecken', + 'plugin_catalog_discover_compatible' => 'Mit dieser Website kompatibel', + 'plugin_catalog_discover_incompatible' => 'Nicht mit dieser Website kompatibel', + 'plugin_catalog_discover_unknown' => 'Kompatibilität unbekannt', + 'plugin_catalog_discover_requirements_missing' => 'Anforderungen nicht angegeben', + 'plugin_catalog_discover_metadata_unavailable' => 'Metadaten nicht verfügbar', + 'plugin_catalog_discover_intro' => 'Aktuelle öffentliche Repositories, die auf dieser Website nicht installiert sind. Prüfen Sie Kompatibilität und Dokumentation vor einer Installation.', + 'plugin_catalog_legacy_discover' => 'Ältere Repositories', + 'plugin_catalog_legacy_intro' => 'Ältere öffentliche Repositories können weiterhin nützlich sein, ihre Kompatibilität mit aktuellen Geeklog- und PHP-Versionen ist jedoch unbekannt.', + 'plugin_catalog_plugin' => 'Plugin', + 'plugin_catalog_core_plugin' => 'Core-Plugin', + 'plugin_catalog_core_update' => 'Mit Geeklog-Update verfügbar', + 'plugin_catalog_latest_core_version' => 'Neueste Core-Version', + 'plugin_catalog_current_geeklog' => 'Aktuelles Geeklog', + 'plugin_catalog_latest_geeklog_baseline' => 'Neueste Geeklog-Basis', + 'plugin_catalog_open_core_plugin' => 'Core-Plugin öffnen', + 'plugin_catalog_version' => 'Version', + 'plugin_catalog_bundled_with_geeklog' => 'Mit Geeklog gebündelt', + 'plugin_catalog_available_with_geeklog' => 'Mit Geeklog verfügbar', + 'plugin_catalog_installed_version' => 'Installiert', + 'plugin_catalog_code_version' => 'Code', + 'plugin_catalog_latest_release' => 'Neueste Veröffentlichung', + 'plugin_catalog_latest_version' => 'Neueste GitHub-Version', + 'plugin_catalog_version_source_release' => 'Veröffentlichung', + 'plugin_catalog_version_source_tag' => 'Tag', + 'plugin_catalog_state' => 'Status', + 'plugin_catalog_enabled' => 'Aktiviert', + 'plugin_catalog_geeklog' => 'Geeklog-Anforderung', + 'plugin_catalog_php_requirement' => 'PHP-Anforderung', + 'plugin_catalog_update_compatible' => 'Update kompatibel', + 'plugin_catalog_update_incompatible' => 'Update nicht kompatibel', + 'plugin_catalog_compatibility_unknown' => 'Kompatibilität unbekannt', + 'plugin_catalog_repository' => 'Repository', + 'plugin_catalog_yes' => 'Ja', + 'plugin_catalog_no' => 'Nein', + 'plugin_catalog_unknown' => 'Unbekannt', + 'plugin_catalog_no_release' => 'Keine Veröffentlichungsmetadaten', + 'plugin_catalog_no_version' => 'Keine Veröffentlichung oder Versionsmarke gefunden', + 'plugin_catalog_no_repository' => 'Kein passendes Repository', + 'plugin_catalog_catalog_unavailable' => 'GitHub-Katalog nicht verfügbar', + 'plugin_catalog_current_compatible' => 'Für dieses Geeklog aktuell', + 'plugin_catalog_latest_compatible_version' => 'Neueste kompatible Version', + 'plugin_catalog_newer_release' => 'Neuere Veröffentlichung', + 'plugin_catalog_requires_geeklog' => 'erfordert Geeklog %s', + 'plugin_catalog_requires_php' => 'erfordert PHP %s', + 'plugin_catalog_current' => 'Aktuell', + 'plugin_catalog_update' => 'Update verfügbar', + 'plugin_catalog_ahead' => 'Installierte Version neuer', + 'plugin_catalog_remote_unavailable' => 'GitHub-Metadaten sind nicht verfügbar. Lokale Plugin-Informationen werden weiterhin angezeigt.', + 'plugin_catalog_remote_disabled' => 'Remote-Metadatenprüfungen sind deaktiviert, da kein gültiger GitHub-Eigentümer konfiguriert ist.', + 'plugin_catalog_none_discoverable' => 'Für diesen GitHub-Eigentümer wurde kein weiteres aktuelles Plugin-Repository gefunden.', + 'plugin_catalog_open_repository' => 'Repository öffnen', + 'plugin_catalog_open_release' => 'Veröffentlichung öffnen', + 'plugin_catalog_open_version' => 'Version öffnen', + 'plugin_catalog_updated' => 'Aktualisiert', + 'plugin_catalog_summary_installed' => 'Installiert', + 'plugin_catalog_summary_updates' => 'Updates verfügbar', + 'plugin_catalog_summary_discover' => 'Aktuelle Kandidaten', + 'plugin_catalog_summary_unmatched' => 'Ohne GitHub-Treffer'); + +$PLG_monitor_MESSAGE3002 = $LANG32[9]; +$PLG_monitor_MESSAGE3003 = 'Monitor konnte die Datenbankmigration nicht abschließen. Die installierte Version wurde nicht geändert; prüfen Sie error.log und versuchen Sie das Upgrade erneut.'; + +$GLOBALS['LANG_configsections']['monitor'] = array( + 'label' => 'Monitor', + 'title' => 'Monitor-Konfiguration' +); + +$GLOBALS['LANG_configsubgroups']['monitor'] = array( + 'sg_main' => 'Haupteinstellungen' +); + +$GLOBALS['LANG_tab']['monitor'] = array( + 'tab_main' => 'Hauptbereich' +); + +$GLOBALS['LANG_fs']['monitor'] = array( + 'fs_main' => 'Allgemeine Einstellungen' +); + +$GLOBALS['LANG_confignames']['monitor'] = array( + 'emails' => 'Liste von E-Mail-Adressen für optionale Monitor-Benachrichtigungen (durch Kommas getrennt)', + 'repository' => 'GitHub-Repository-Eigentümer für Plugin-Veröffentlichungsmetadaten (Standard: Geeklog-Plugins). Leer lassen, um Remote-Metadatenprüfungen zu deaktivieren.', + 'github_token' => 'Optionales GitHub-Token für API-Metadatenanfragen. Bevorzugen Sie ein fein abgestuftes Nur-Lese-Token. Die Umgebungsvariable MONITOR_GITHUB_TOKEN hat Vorrang.' +); + +$LANG_configsections =& $GLOBALS['LANG_configsections']; +$LANG_configsubgroups =& $GLOBALS['LANG_configsubgroups']; +$LANG_tab =& $GLOBALS['LANG_tab']; +$LANG_fs =& $GLOBALS['LANG_fs']; +$LANG_confignames =& $GLOBALS['LANG_confignames']; From 87575e7d3a6424072622ed8887a66c79166eeda4 Mon Sep 17 00:00:00 2001 From: Ben Date: Mon, 5 Oct 2026 11:11:13 +0700 Subject: [PATCH 07/23] Add hebrew translation for Monitor 1.5.0 --- language/hebrew_utf-8.php | 295 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 295 insertions(+) create mode 100644 language/hebrew_utf-8.php diff --git a/language/hebrew_utf-8.php b/language/hebrew_utf-8.php new file mode 100644 index 0000000..ce0aaf6 --- /dev/null +++ b/language/hebrew_utf-8.php @@ -0,0 +1,295 @@ + 'Monitor', + 'home' => 'סקירה', + 'health' => 'מצב', + 'security' => 'אבטחה', + 'file' => 'קובץ:', + 'log_file' => 'קובץ יומן:', + 'view_logs' => 'הצגת יומנים נוכחיים', + 'clear_logs' => 'ניקוי יומנים', + 'configuration' => 'הגדרות', + 'main' => 'סקירת מצב האתר', + 'logs' => 'קובצי יומן', + 'updates' => 'תוספים', + 'status' => 'מצב', + 'check' => 'בדיקה', + 'value' => 'ערך', + 'recommendation' => 'המלצה', + 'health_ok' => 'OK', + 'health_info' => 'מידע', + 'health_warning' => 'אזהרה', + 'health_error' => 'שגיאה', + 'security_observations' => 'תצפיות אבטחה', + 'ban_integration' => 'תוסף Ban', + 'legacy_ban_notice' => 'Monitor מתעד תצפיות אבטחה מוגבלות. התוסף האופציונלי Ban יכול לספק יכולות חסימה מרכזיות מבלי להפוך את Monitor למנוע חסימה נוסף.', + 'security_status' => 'מצב אבטחה', + 'security_no_issue' => 'לא זוהתה בעיה בבדיקות האבטחה הזמינות של Monitor.', + 'ban_not_installed' => 'לא מותקן', + 'ban_installed' => 'מותקן', + 'ban_optional_intro' => 'Ban הוא אופציונלי. Monitor ממשיך לתעד את תצפיות האבטחה המוגבלות גם בלעדיו.', + 'ban_optional_capability' => 'התקנת Ban מוסיפה יכולות חסימה מרכזיות ש-Monitor יכול להשתמש בהן כאשר הן זמינות.', + 'ban_view_plugin' => 'הצגת מידע על תוסף Ban', + 'ban_version' => 'גרסה', + 'ban_ip_capability' => 'יכולת בקשת חסימת IP', + 'ban_capability_available' => 'זמין', + 'ban_capability_unavailable' => 'לא זמין', + 'ban_direct_sql' => 'קישור SQL ישיר ל-Ban', + 'ban_direct_sql_no' => 'לא', + 'security_no_legacy_table' => 'לא קיימת טבלת אבטחה ישנה של Monitor.', + 'security_no_observations' => 'אין תצפיות אבטחה אחרונות.', + 'read_only_advice' => 'כברירת מחדל Monitor צופה וממליץ בלבד. שינויים דורשים פעולה מפורשת של מנהל.', + 'config_tooltip_emails' => 'נמענים אופציונליים להתראות Monitor, מופרדים בפסיקים. השאירו ריק כדי להשבית התראות בדוא״ל.', + 'config_tooltip_repository' => 'בעל חשבון GitHub שמאגריו הציבוריים נבדקים על ידי Monitor לצורך מטא-נתונים וגרסאות של תוספים. השאירו ריק כדי להשבית בדיקות מרוחקות.', + 'config_tooltip_github_token' => 'אסימון GitHub אופציונלי, מוגבל והרשאת קריאה בלבד. MONITOR_GITHUB_TOKEN מקבל עדיפות. בדיקות מאומתות נהנות ממכסת API גבוהה יותר ומשתמשות במטמון תגיות קצר יותר.', + + // Media diagnostics + 'media_oversized_single' => 'תמונה אחת חורגת מהמגבלות המומלצות.', + 'media_oversized_multiple' => '%d תמונות חורגות מהמגבלות המומלצות.', + 'media_show_files' => 'הצגת קבצים (%d)', + 'media_hide_files' => 'הסתרת קבצים (%d)', + 'media_open_file_manager' => 'פתיחת מנהל הקבצים', + 'media_view_image' => 'הצגת תמונה', + 'media_more_files' => 'קיימות תמונות גדולות נוספות; הרשימה מוגבלת.', + 'media_partial_scan' => 'סריקת מערכת הקבצים הגיעה למגבלת הבטיחות.', + + // Daily log archives + 'log_archive_title' => 'ארכיוני יומן', + 'log_archive_intro' => 'Monitor מבצע סבב יומי לקובצי .log של Geeklog ושומר ארכיונים של %d הימים האחרונים.', + 'log_archive_safety' => 'יומן פעיל נקצץ רק לאחר שעותק הארכיון נכתב בהצלחה. הארכיונים נשמרים מתחת ל-path_data, מחוץ לתיקיית האינטרנט הציבורית.', + 'log_archive_empty' => 'עדיין אין ארכיון יומן יומי זמין. ההרצה המתוזמנת הראשונה יוצרת את בסיס הסבב; הארכיונים יופיעו לאחר יום הלוח הבא.', + 'log_archive_date' => 'תאריך', + 'log_archive_log' => 'יומן', + 'log_archive_size' => 'גודל', + 'log_archive_actions' => 'פעולות', + 'log_archive_view' => 'הצגה', + 'log_archive_download' => 'הורדה', + 'log_archive_back' => 'חזרה לארכיוני היומן', + 'log_archive_preview_limited' => 'תצוגה מקדימה זו מציגה רק את 512 KiB האחרונים של הארכיון. הורידו את הקובץ לקבלת היומן היומי המלא.', + 'log_email_title' => 'סיכום יומן יומי', + 'log_email_lines' => 'שורות שנסרקו', + 'log_email_issue_lines' => 'שורות שגיאה/אזהרה', + 'log_email_top_patterns' => 'דפוסי error.log המובילים', + 'log_email_no_activity' => 'לא נשמר ארכיון של יומן Geeklog שאינו ריק עבור יום זה.', + + // Changes monitor + 'changes' => 'שינויים', + 'changes_page_title' => 'שינויים ב-Monitor', + 'changes_intro' => 'השוואת תמונות מצב קלות של האתר כדי לראות מה השתנה בין שתי בדיקות. Monitor מתעד רק מצב ואינו משנה את האתר.', + 'changes_capture' => 'לכידת המצב הנוכחי', + 'changes_capture_ok' => 'המצב הנוכחי נשמר.', + 'changes_capture_failed' => 'Monitor לא הצליח לשמור את תמונת המצב. בדקו שניתן לכתוב אל path_data.', + 'changes_baseline_created' => 'נוצר בסיס. לכדו מצב נוסף מאוחר יותר כדי לראות מה השתנה.', + 'changes_waiting' => 'נדרשת תמונת מצב שנייה לפני שניתן להשוות שינויים.', + 'changes_period' => 'תקופה מושווית:', + 'changes_previous' => 'קודם', + 'changes_current' => 'נוכחי', + 'changes_summary_changes' => 'שינויים', + 'changes_summary_plugins' => 'שינויים בתוספים', + 'changes_summary_log' => 'דפוסי יומן חדשים', + 'changes_summary_snapshots' => 'תמונות מצב', + 'changes_none' => 'לא זוהה שינוי משמעותי בין שתי תמונות המצב.', + 'changes_detected' => 'שינויים שזוהו', + 'changes_environment' => 'סביבה', + 'changes_plugins' => 'תוספים', + 'changes_storage' => 'אחסון', + 'changes_logs' => 'פעילות חדשה ב-error.log', + 'changes_before' => 'לפני', + 'changes_after' => 'אחרי', + 'changes_occurrences' => 'מופע(ים)', + 'changes_log_none' => 'לא זוהה ב-error.log דפוס חדש של שגיאה, אזהרה או חריגה בתקופה זו.', + 'changes_log_rotated' => 'error.log עבר סבב או קוצץ בין שתי תמונות המצב, ולכן לא ניתן להשוות את החלק החדש באופן מהימן.', + 'changes_log_truncated' => 'נתוני היומן החדשים עברו את מגבלת הניתוח. Monitor ניתח רק את 512 KiB האחרונים.', + 'changes_current_state' => 'מצב נוכחי', + 'changes_geeklog' => 'Geeklog', + 'changes_php' => 'PHP', + 'changes_plugins_count' => 'תוספים מותקנים', + 'changes_disk_free' => 'שטח דיסק פנוי', + 'changes_error_log_size' => 'גודל error.log', + 'changes_unknown' => 'לא ידוע', + 'changes_enabled' => 'מופעל', + 'changes_disabled' => 'מושבת', + 'changes_code_geeklog_changed' => 'גרסת Geeklog השתנתה', + 'changes_code_php_changed' => 'גרסת PHP השתנתה', + 'changes_code_plugin_installed' => 'תוסף הותקן', + 'changes_code_plugin_removed' => 'תוסף הוסר', + 'changes_code_plugin_version_changed' => 'גרסת תוסף השתנתה', + 'changes_code_plugin_enabled' => 'תוסף הופעל', + 'changes_code_plugin_disabled' => 'תוסף הושבת', + 'changes_code_disk_free_decreased' => 'שטח הדיסק הפנוי הצטמצם', + + // Configuration audit + 'config_audit_title' => 'בדיקת הגדרות', + 'config_audit_page_title' => 'בדיקת הגדרות Monitor', + 'config_audit_quick_description' => 'בדיקת הבדלים בין siteconfig.php לערכי Core תואמים במסד הנתונים.', + 'config_audit_back' => 'סקירת Monitor', + 'config_audit_access_denied' => 'הגישה נדחתה', + 'config_audit_root_only' => 'הגישה שמורה למנהלי Root.', + 'config_audit_intro_title' => 'בדיקת הגדרות לקריאה בלבד.', + 'config_audit_intro' => 'השוואת ערכי Core שהוגדרו במפורש ב-siteconfig.php לערכים תואמים ב-conf_values. רק הבדלים או ערכים לא תקינים דורשים תשומת לב.', + 'config_audit_issues' => 'בעיות', + 'config_audit_review' => 'לבדיקה', + 'config_audit_normal' => 'תקין', + 'config_audit_active_host' => 'מארח:', + 'config_audit_siteconfig' => 'siteconfig.php:', + 'config_audit_unreadable_title' => 'אזהרה:', + 'config_audit_unreadable' => 'Monitor לא הצליח לקרוא את siteconfig.php הפעיל, ולכן ההשוואה אינה מלאה.', + 'config_audit_items_review' => 'דורש תשומת לב', + 'config_audit_no_issues' => 'ההגדרות עקביות. אין ערך Core סותר שדורש תשומת לב.', + 'config_audit_secondary' => 'הצגת %d ערכים תקינים או מידעיים', + 'config_audit_footer' => 'ערכים רגישים מוסתרים. SQL אופציונלי ליישור מסד הנתונים אינו מופעל אוטומטית לעולם.', + 'config_audit_source_siteconfig' => 'siteconfig.php', + 'config_audit_source_database' => 'מסד נתונים', + 'config_audit_priority' => 'מקור אפקטיבי:', + 'config_audit_effective_value' => 'ערך אפקטיבי', + 'config_audit_details' => 'פרטים', + 'config_audit_recommendation' => 'המלצה', + 'config_audit_path' => 'נתיב:', + 'config_audit_path_exists' => 'קיים', + 'config_audit_path_missing' => 'חסר', + 'config_audit_optional_sql' => 'יישור אופציונלי של מסד הנתונים', + 'config_audit_absent' => 'חסר', + 'config_audit_redacted' => '[מוסתר]', + 'config_audit_value_true' => 'אמת', + 'config_audit_value_false' => 'שקר', + 'config_audit_value_null' => 'NULL', + 'config_audit_value_object' => '[OBJECT]', + + 'config_audit_level_ok' => 'צפוי', + 'config_audit_level_info' => 'מידע', + 'config_audit_level_review' => 'לבדיקה', + 'config_audit_level_warning' => 'אזהרה', + + 'config_audit_status_identical' => 'זהה', + 'config_audit_status_core_file' => 'צפוי ב-siteconfig.php', + 'config_audit_status_file_only' => 'siteconfig.php בלבד', + 'config_audit_status_db_unset' => 'ערך מסד הנתונים לא מוגדר', + 'config_audit_status_different' => 'ערכים שונים', + 'config_audit_status_decode_error' => 'ערך מסד הנתונים אינו קריא', + 'config_audit_status_invalid_path' => 'נתיב לא תקין', + + 'config_audit_why_identical' => 'אותו ערך קיים ב-siteconfig.php וב-conf_values.', + 'config_audit_why_core_file' => 'מפתח Core זה מוגדר בדרך כלל ישירות ב-siteconfig.php.', + 'config_audit_why_file_only' => 'לא קיים ערך Core תואם ב-conf_values. נעשה שימוש בערך מ-siteconfig.php.', + 'config_audit_why_db_unset' => 'קיימת שורת Core תואמת ב-conf_values אך הערך שלה לא מוגדר. siteconfig.php נשאר אפקטיבי.', + 'config_audit_why_different' => 'siteconfig.php ו-conf_values מכילים ערכים שונים. בזמן ריצה siteconfig.php הוא האפקטיבי.', + 'config_audit_why_decode_error' => 'לא ניתן היה לפענח באופן מהימן את ערך ה-Core התואם ב-conf_values.', + 'config_audit_why_invalid_path' => 'נתיב מערכת הקבצים האפקטיבי אינו קיים כרגע.', + + 'config_audit_action_none' => 'אין צורך בפעולה.', + 'config_audit_action_file_only' => 'אין צורך בפעולה אלא אם ערך זה אמור להיות מנוהל גם במסד הנתונים.', + 'config_audit_action_db_unset' => 'ודאו שערך מסד הנתונים לא הוגדר בכוונה.', + 'config_audit_action_different' => 'ודאו שהעקיפה מכוונת. ישרו את ערך מסד הנתונים רק אם הערך השמור מיושן.', + 'config_audit_action_decode_error' => 'בדקו את שורת ה-Core התואמת ב-conf_values לפני כל שינוי.', + 'config_audit_action_invalid_path' => 'בדקו את הנתיב המוגדר ואת זמינות מערכת הקבצים.', + + // Plugin catalog + 'plugin_catalog_intro' => 'התוספים המותקנים מושווים למאגרים ציבוריים של בעלי GitHub שהוגדרו. Monitor מדווח על גרסאות זמינות ומועמדים שנמצאו, אך לעולם אינו מתקין או מעדכן קוד.', + 'plugin_catalog_owner' => 'מקור GitHub:', + 'plugin_catalog_refresh' => 'רענון נתוני GitHub', + 'plugin_catalog_installed' => 'תוספים מותקנים', + 'plugin_catalog_discover' => 'גילוי תוספים', + 'plugin_catalog_discover_compatible' => 'תואם לאתר זה', + 'plugin_catalog_discover_incompatible' => 'לא תואם לאתר זה', + 'plugin_catalog_discover_unknown' => 'תאימות לא ידועה', + 'plugin_catalog_discover_requirements_missing' => 'דרישות לא הוצהרו', + 'plugin_catalog_discover_metadata_unavailable' => 'מטא-נתונים לא זמינים', + 'plugin_catalog_discover_intro' => 'מאגרים ציבוריים עדכניים שאינם מותקנים באתר זה. בדקו תאימות ותיעוד לפני התקנה.', + 'plugin_catalog_legacy_discover' => 'מאגרים ישנים יותר', + 'plugin_catalog_legacy_intro' => 'מאגרים ציבוריים ישנים יותר עדיין עשויים להיות שימושיים, אך תאימותם לגרסאות Geeklog ו-PHP עדכניות אינה ידועה.', + 'plugin_catalog_plugin' => 'תוסף', + 'plugin_catalog_core_plugin' => 'תוסף Core', + 'plugin_catalog_core_update' => 'זמין עם עדכון Geeklog', + 'plugin_catalog_latest_core_version' => 'גרסת Core האחרונה', + 'plugin_catalog_current_geeklog' => 'Geeklog נוכחי', + 'plugin_catalog_latest_geeklog_baseline' => 'בסיס Geeklog האחרון', + 'plugin_catalog_open_core_plugin' => 'פתיחת תוסף Core', + 'plugin_catalog_version' => 'גרסה', + 'plugin_catalog_bundled_with_geeklog' => 'מצורף ל-Geeklog', + 'plugin_catalog_available_with_geeklog' => 'זמין עם Geeklog', + 'plugin_catalog_installed_version' => 'מותקן', + 'plugin_catalog_code_version' => 'קוד', + 'plugin_catalog_latest_release' => 'מהדורה אחרונה', + 'plugin_catalog_latest_version' => 'גרסת GitHub האחרונה', + 'plugin_catalog_version_source_release' => 'מהדורה', + 'plugin_catalog_version_source_tag' => 'תג', + 'plugin_catalog_state' => 'מצב', + 'plugin_catalog_enabled' => 'מופעל', + 'plugin_catalog_geeklog' => 'דרישת Geeklog', + 'plugin_catalog_php_requirement' => 'דרישת PHP', + 'plugin_catalog_update_compatible' => 'עדכון תואם', + 'plugin_catalog_update_incompatible' => 'עדכון לא תואם', + 'plugin_catalog_compatibility_unknown' => 'תאימות לא ידועה', + 'plugin_catalog_repository' => 'מאגר', + 'plugin_catalog_yes' => 'כן', + 'plugin_catalog_no' => 'לא', + 'plugin_catalog_unknown' => 'לא ידוע', + 'plugin_catalog_no_release' => 'אין מטא-נתוני מהדורה', + 'plugin_catalog_no_version' => 'לא נמצאו מהדורה או תג גרסה', + 'plugin_catalog_no_repository' => 'לא נמצא מאגר תואם', + 'plugin_catalog_catalog_unavailable' => 'קטלוג GitHub לא זמין', + 'plugin_catalog_current_compatible' => 'מעודכן עבור Geeklog זה', + 'plugin_catalog_latest_compatible_version' => 'הגרסה התואמת האחרונה', + 'plugin_catalog_newer_release' => 'מהדורה חדשה יותר', + 'plugin_catalog_requires_geeklog' => 'דורש Geeklog %s', + 'plugin_catalog_requires_php' => 'דורש PHP %s', + 'plugin_catalog_current' => 'מעודכן', + 'plugin_catalog_update' => 'עדכון זמין', + 'plugin_catalog_ahead' => 'הגרסה המותקנת חדשה יותר', + 'plugin_catalog_remote_unavailable' => 'מטא-נתוני GitHub אינם זמינים. מידע מקומי על התוסף עדיין מוצג.', + 'plugin_catalog_remote_disabled' => 'בדיקות מטא-נתונים מרוחקות מושבתות כי לא הוגדר בעל GitHub תקין.', + 'plugin_catalog_none_discoverable' => 'לא נמצא מאגר תוסף עדכני נוסף עבור בעל GitHub זה.', + 'plugin_catalog_open_repository' => 'פתיחת מאגר', + 'plugin_catalog_open_release' => 'פתיחת מהדורה', + 'plugin_catalog_open_version' => 'פתיחת גרסה', + 'plugin_catalog_updated' => 'עודכן', + 'plugin_catalog_summary_installed' => 'מותקן', + 'plugin_catalog_summary_updates' => 'עדכונים זמינים', + 'plugin_catalog_summary_discover' => 'מועמדים עדכניים', + 'plugin_catalog_summary_unmatched' => 'ללא התאמת GitHub'); + +$PLG_monitor_MESSAGE3002 = $LANG32[9]; +$PLG_monitor_MESSAGE3003 = 'Monitor לא הצליח להשלים את העברת מסד הנתונים. הגרסה המותקנת לא שונתה; בדקו את error.log ונסו שוב את השדרוג.'; + +$GLOBALS['LANG_configsections']['monitor'] = array( + 'label' => 'Monitor', + 'title' => 'הגדרות Monitor' +); + +$GLOBALS['LANG_configsubgroups']['monitor'] = array( + 'sg_main' => 'הגדרות ראשיות' +); + +$GLOBALS['LANG_tab']['monitor'] = array( + 'tab_main' => 'ראשי' +); + +$GLOBALS['LANG_fs']['monitor'] = array( + 'fs_main' => 'הגדרות כלליות' +); + +$GLOBALS['LANG_confignames']['monitor'] = array( + 'emails' => 'רשימת כתובות דוא״ל להתראות אופציונליות של Monitor (מופרדות בפסיקים)', + 'repository' => 'בעל מאגר GitHub המשמש למטא-נתוני מהדורות תוספים (ברירת מחדל: Geeklog-Plugins). השאירו ריק כדי להשבית בדיקות מטא-נתונים מרוחקות.', + 'github_token' => 'אסימון GitHub אופציונלי לבקשות מטא-נתונים דרך API. מומלץ אסימון קריאה בלבד עם הרשאות מדויקות. משתנה הסביבה MONITOR_GITHUB_TOKEN מקבל עדיפות.' +); + +$LANG_configsections =& $GLOBALS['LANG_configsections']; +$LANG_configsubgroups =& $GLOBALS['LANG_configsubgroups']; +$LANG_tab =& $GLOBALS['LANG_tab']; +$LANG_fs =& $GLOBALS['LANG_fs']; +$LANG_confignames =& $GLOBALS['LANG_confignames']; From de093199f91573761b11730cf675223b7cb4e020 Mon Sep 17 00:00:00 2001 From: Ben Date: Mon, 5 Oct 2026 11:11:16 +0700 Subject: [PATCH 08/23] Add italian translation for Monitor 1.5.0 --- language/italian_utf-8.php | 295 +++++++++++++++++++++++++++++++++++++ 1 file changed, 295 insertions(+) create mode 100644 language/italian_utf-8.php diff --git a/language/italian_utf-8.php b/language/italian_utf-8.php new file mode 100644 index 0000000..fb821ba --- /dev/null +++ b/language/italian_utf-8.php @@ -0,0 +1,295 @@ + 'Monitor', + 'home' => 'Panoramica', + 'health' => 'Stato', + 'security' => 'Sicurezza', + 'file' => 'File:', + 'log_file' => 'File di log:', + 'view_logs' => 'Visualizza log correnti', + 'clear_logs' => 'Cancella log', + 'configuration' => 'Configurazione', + 'main' => 'Panoramica dello stato del sito', + 'logs' => 'File di log', + 'updates' => 'Plugin', + 'status' => 'Stato', + 'check' => 'Controllo', + 'value' => 'Valore', + 'recommendation' => 'Raccomandazione', + 'health_ok' => 'OK', + 'health_info' => 'Informazioni', + 'health_warning' => 'Avviso', + 'health_error' => 'Errore', + 'security_observations' => 'Osservazioni di sicurezza', + 'ban_integration' => 'Plugin Ban', + 'legacy_ban_notice' => 'Monitor registra osservazioni di sicurezza limitate. Il plugin opzionale Ban può fornire funzioni di blocco centralizzate senza trasformare Monitor in un secondo motore di ban.', + 'security_status' => 'Stato della sicurezza', + 'security_no_issue' => 'Nessun problema rilevato dai controlli di sicurezza disponibili di Monitor.', + 'ban_not_installed' => 'Non installato', + 'ban_installed' => 'Installato', + 'ban_optional_intro' => 'Ban è opzionale. Monitor continua a registrare le proprie osservazioni di sicurezza limitate anche senza di esso.', + 'ban_optional_capability' => 'L\'installazione di Ban aggiunge funzioni di blocco centralizzate che Monitor può usare quando disponibili.', + 'ban_view_plugin' => 'Visualizza informazioni sul plugin Ban', + 'ban_version' => 'Versione', + 'ban_ip_capability' => 'Capacità di richiesta di blocco IP', + 'ban_capability_available' => 'Disponibile', + 'ban_capability_unavailable' => 'Non disponibile', + 'ban_direct_sql' => 'Accoppiamento SQL diretto con Ban', + 'ban_direct_sql_no' => 'No', + 'security_no_legacy_table' => 'Non è presente alcuna tabella di sicurezza legacy di Monitor.', + 'security_no_observations' => 'Nessuna osservazione di sicurezza recente.', + 'read_only_advice' => 'Per impostazione predefinita Monitor osserva e consiglia. Le modifiche richiedono un\'azione esplicita dell\'amministratore.', + 'config_tooltip_emails' => 'Destinatari opzionali delle notifiche Monitor, separati da virgole. Lascia vuoto per disattivare le notifiche e-mail.', + 'config_tooltip_repository' => 'Proprietario GitHub i cui repository pubblici vengono controllati da Monitor per metadati e versioni dei plugin. Lascia vuoto per disattivare i controlli remoti.', + 'config_tooltip_github_token' => 'Token GitHub opzionale, granulare e di sola lettura. MONITOR_GITHUB_TOKEN ha la precedenza. I controlli autenticati dispongono di una quota API maggiore e usano una cache dei tag più breve.', + + // Media diagnostics + 'media_oversized_single' => '1 immagine supera i limiti consigliati.', + 'media_oversized_multiple' => '%d immagini superano i limiti consigliati.', + 'media_show_files' => 'Mostra file (%d)', + 'media_hide_files' => 'Nascondi file (%d)', + 'media_open_file_manager' => 'Apri Gestione file', + 'media_view_image' => 'Visualizza immagine', + 'media_more_files' => 'Esistono altre immagini sovradimensionate; l\'elenco è limitato.', + 'media_partial_scan' => 'La scansione del file system ha raggiunto il limite di sicurezza.', + + // Daily log archives + 'log_archive_title' => 'Archivi dei log', + 'log_archive_intro' => 'Monitor ruota quotidianamente i file .log di Geeklog e conserva gli archivi degli ultimi %d giorni.', + 'log_archive_safety' => 'Un log attivo viene troncato solo dopo che la copia d\'archivio è stata scritta correttamente. Gli archivi sono memorizzati sotto path_data, fuori dalla directory web pubblica.', + 'log_archive_empty' => 'Non è ancora disponibile alcun archivio giornaliero. La prima esecuzione pianificata crea la base di rotazione; gli archivi compaiono dopo il giorno di calendario successivo.', + 'log_archive_date' => 'Data', + 'log_archive_log' => 'Log', + 'log_archive_size' => 'Dimensione', + 'log_archive_actions' => 'Azioni', + 'log_archive_view' => 'Visualizza', + 'log_archive_download' => 'Scarica', + 'log_archive_back' => 'Torna agli archivi dei log', + 'log_archive_preview_limited' => 'Questa anteprima mostra solo i 512 KiB più recenti dell\'archivio. Scarica il file per recuperare il log giornaliero completo.', + 'log_email_title' => 'Riepilogo giornaliero dei log', + 'log_email_lines' => 'Righe analizzate', + 'log_email_issue_lines' => 'Righe di errore/avviso', + 'log_email_top_patterns' => 'Principali pattern di error.log', + 'log_email_no_activity' => 'Nessun log Geeklog non vuoto è stato archiviato per questo giorno.', + + // Changes monitor + 'changes' => 'Modifiche', + 'changes_page_title' => 'Modifiche di Monitor', + 'changes_intro' => 'Confronta snapshot leggeri del sito per vedere cosa è cambiato tra due controlli. Monitor registra solo lo stato; non modifica il sito.', + 'changes_capture' => 'Acquisisci stato corrente', + 'changes_capture_ok' => 'Stato corrente salvato.', + 'changes_capture_failed' => 'Monitor non ha potuto salvare lo snapshot. Verifica che path_data sia scrivibile.', + 'changes_baseline_created' => 'Base creata. Acquisisci un altro stato più avanti per vedere cosa è cambiato.', + 'changes_waiting' => 'È necessario un secondo snapshot prima di poter confrontare le modifiche.', + 'changes_period' => 'Periodo confrontato:', + 'changes_previous' => 'Precedente', + 'changes_current' => 'Corrente', + 'changes_summary_changes' => 'Modifiche', + 'changes_summary_plugins' => 'Modifiche dei plugin', + 'changes_summary_log' => 'Nuovi pattern di log', + 'changes_summary_snapshots' => 'Snapshot', + 'changes_none' => 'Nessuna modifica significativa rilevata tra questi due snapshot.', + 'changes_detected' => 'Modifiche rilevate', + 'changes_environment' => 'Ambiente', + 'changes_plugins' => 'Plugin', + 'changes_storage' => 'Archiviazione', + 'changes_logs' => 'Nuova attività in error.log', + 'changes_before' => 'Prima', + 'changes_after' => 'Dopo', + 'changes_occurrences' => 'occorrenza/e', + 'changes_log_none' => 'Nessun nuovo pattern di errore, avviso o eccezione è stato rilevato in error.log per questo periodo.', + 'changes_log_rotated' => 'error.log è stato ruotato o troncato tra i due snapshot, quindi la nuova parte non può essere confrontata in modo affidabile.', + 'changes_log_truncated' => 'I nuovi dati del log hanno superato il limite di analisi. Monitor ha analizzato solo i 512 KiB più recenti.', + 'changes_current_state' => 'Stato corrente', + 'changes_geeklog' => 'Geeklog', + 'changes_php' => 'PHP', + 'changes_plugins_count' => 'Plugin installati', + 'changes_disk_free' => 'Spazio libero su disco', + 'changes_error_log_size' => 'Dimensione di error.log', + 'changes_unknown' => 'Sconosciuto', + 'changes_enabled' => 'attivato', + 'changes_disabled' => 'disattivato', + 'changes_code_geeklog_changed' => 'Versione di Geeklog modificata', + 'changes_code_php_changed' => 'Versione di PHP modificata', + 'changes_code_plugin_installed' => 'Plugin installato', + 'changes_code_plugin_removed' => 'Plugin rimosso', + 'changes_code_plugin_version_changed' => 'Versione del plugin modificata', + 'changes_code_plugin_enabled' => 'Plugin attivato', + 'changes_code_plugin_disabled' => 'Plugin disattivato', + 'changes_code_disk_free_decreased' => 'Spazio libero su disco diminuito', + + // Configuration audit + 'config_audit_title' => 'Audit della configurazione', + 'config_audit_page_title' => 'Audit della configurazione di Monitor', + 'config_audit_quick_description' => 'Controlla le differenze tra siteconfig.php e i valori Core corrispondenti nel database.', + 'config_audit_back' => 'Panoramica di Monitor', + 'config_audit_access_denied' => 'Accesso negato', + 'config_audit_root_only' => 'Accesso riservato agli amministratori Root.', + 'config_audit_intro_title' => 'Audit della configurazione in sola lettura.', + 'config_audit_intro' => 'Confronta i valori Core definiti esplicitamente in siteconfig.php con i valori corrispondenti in conf_values. Solo differenze o valori non validi richiedono attenzione.', + 'config_audit_issues' => 'Problemi', + 'config_audit_review' => 'Da verificare', + 'config_audit_normal' => 'Normale', + 'config_audit_active_host' => 'Host:', + 'config_audit_siteconfig' => 'siteconfig.php:', + 'config_audit_unreadable_title' => 'Avviso:', + 'config_audit_unreadable' => 'Monitor non ha potuto leggere il siteconfig.php attivo, quindi il confronto è incompleto.', + 'config_audit_items_review' => 'Richiede attenzione', + 'config_audit_no_issues' => 'La configurazione è coerente. Nessun valore Core in conflitto richiede attenzione.', + 'config_audit_secondary' => 'Mostra %d valore/i normale/i o informativo/i', + 'config_audit_footer' => 'I valori sensibili sono oscurati. L\'SQL opzionale di allineamento del database non viene mai eseguito automaticamente.', + 'config_audit_source_siteconfig' => 'siteconfig.php', + 'config_audit_source_database' => 'Database', + 'config_audit_priority' => 'Origine effettiva:', + 'config_audit_effective_value' => 'Valore effettivo', + 'config_audit_details' => 'Dettagli', + 'config_audit_recommendation' => 'Raccomandazione', + 'config_audit_path' => 'Percorso:', + 'config_audit_path_exists' => 'esiste', + 'config_audit_path_missing' => 'manca', + 'config_audit_optional_sql' => 'Allineamento opzionale del database', + 'config_audit_absent' => 'ASSENTE', + 'config_audit_redacted' => '[OSCURATO]', + 'config_audit_value_true' => 'vero', + 'config_audit_value_false' => 'falso', + 'config_audit_value_null' => 'NULL', + 'config_audit_value_object' => '[OBJECT]', + + 'config_audit_level_ok' => 'Previsto', + 'config_audit_level_info' => 'Informazioni', + 'config_audit_level_review' => 'Da verificare', + 'config_audit_level_warning' => 'Avviso', + + 'config_audit_status_identical' => 'Identico', + 'config_audit_status_core_file' => 'Previsto in siteconfig.php', + 'config_audit_status_file_only' => 'Solo siteconfig.php', + 'config_audit_status_db_unset' => 'Valore del database non impostato', + 'config_audit_status_different' => 'Valori diversi', + 'config_audit_status_decode_error' => 'Valore del database illeggibile', + 'config_audit_status_invalid_path' => 'Percorso non valido', + + 'config_audit_why_identical' => 'Lo stesso valore esiste in siteconfig.php e conf_values.', + 'config_audit_why_core_file' => 'Questa chiave Core è normalmente definita direttamente in siteconfig.php.', + 'config_audit_why_file_only' => 'Nessun valore Core corrispondente esiste in conf_values. Viene usato il valore di siteconfig.php.', + 'config_audit_why_db_unset' => 'Esiste una riga Core corrispondente in conf_values, ma il suo valore non è impostato. siteconfig.php rimane effettivo.', + 'config_audit_why_different' => 'siteconfig.php e conf_values contengono valori diversi. siteconfig.php è effettivo durante l\'esecuzione.', + 'config_audit_why_decode_error' => 'Il valore Core corrispondente in conf_values non può essere decodificato in modo affidabile.', + 'config_audit_why_invalid_path' => 'Il percorso effettivo del file system attualmente non esiste.', + + 'config_audit_action_none' => 'Nessuna azione richiesta.', + 'config_audit_action_file_only' => 'Nessuna azione richiesta, a meno che questo valore debba essere gestito anche nel database.', + 'config_audit_action_db_unset' => 'Verifica che il valore del database sia intenzionalmente non impostato.', + 'config_audit_action_different' => 'Verifica che questa sovrascrittura sia intenzionale. Allinea il valore del database solo se quello memorizzato è obsoleto.', + 'config_audit_action_decode_error' => 'Controlla la riga Core corrispondente in conf_values prima di apportare modifiche.', + 'config_audit_action_invalid_path' => 'Controlla il percorso configurato e la disponibilità del file system.', + + // Plugin catalog + 'plugin_catalog_intro' => 'I plugin installati vengono confrontati con i repository pubblici del proprietario GitHub configurato. Monitor segnala le versioni disponibili e i candidati scoperti, ma non installa né aggiorna mai il codice.', + 'plugin_catalog_owner' => 'Origine GitHub:', + 'plugin_catalog_refresh' => 'Aggiorna dati GitHub', + 'plugin_catalog_installed' => 'Plugin installati', + 'plugin_catalog_discover' => 'Scopri plugin', + 'plugin_catalog_discover_compatible' => 'Compatibile con questo sito', + 'plugin_catalog_discover_incompatible' => 'Non compatibile con questo sito', + 'plugin_catalog_discover_unknown' => 'Compatibilità sconosciuta', + 'plugin_catalog_discover_requirements_missing' => 'Requisiti non dichiarati', + 'plugin_catalog_discover_metadata_unavailable' => 'Metadati non disponibili', + 'plugin_catalog_discover_intro' => 'Repository pubblici recenti non installati su questo sito. Verifica compatibilità e documentazione prima di installare qualsiasi cosa.', + 'plugin_catalog_legacy_discover' => 'Repository meno recenti', + 'plugin_catalog_legacy_intro' => 'I repository pubblici meno recenti possono essere ancora utili, ma la loro compatibilità con versioni recenti di Geeklog e PHP è sconosciuta.', + 'plugin_catalog_plugin' => 'Plugin', + 'plugin_catalog_core_plugin' => 'Plugin Core', + 'plugin_catalog_core_update' => 'Disponibile con l\'aggiornamento di Geeklog', + 'plugin_catalog_latest_core_version' => 'Ultima versione Core', + 'plugin_catalog_current_geeklog' => 'Geeklog corrente', + 'plugin_catalog_latest_geeklog_baseline' => 'Ultima base Geeklog', + 'plugin_catalog_open_core_plugin' => 'Apri plugin Core', + 'plugin_catalog_version' => 'Versione', + 'plugin_catalog_bundled_with_geeklog' => 'Incluso con Geeklog', + 'plugin_catalog_available_with_geeklog' => 'Disponibile con Geeklog', + 'plugin_catalog_installed_version' => 'Installato', + 'plugin_catalog_code_version' => 'Codice', + 'plugin_catalog_latest_release' => 'Ultima release', + 'plugin_catalog_latest_version' => 'Ultima versione GitHub', + 'plugin_catalog_version_source_release' => 'Release', + 'plugin_catalog_version_source_tag' => 'Tag', + 'plugin_catalog_state' => 'Stato', + 'plugin_catalog_enabled' => 'Attivato', + 'plugin_catalog_geeklog' => 'Requisito Geeklog', + 'plugin_catalog_php_requirement' => 'Requisito PHP', + 'plugin_catalog_update_compatible' => 'Aggiornamento compatibile', + 'plugin_catalog_update_incompatible' => 'Aggiornamento non compatibile', + 'plugin_catalog_compatibility_unknown' => 'Compatibilità sconosciuta', + 'plugin_catalog_repository' => 'Repository', + 'plugin_catalog_yes' => 'Sì', + 'plugin_catalog_no' => 'No', + 'plugin_catalog_unknown' => 'Sconosciuto', + 'plugin_catalog_no_release' => 'Nessun metadato di release', + 'plugin_catalog_no_version' => 'Nessuna release o tag di versione trovato', + 'plugin_catalog_no_repository' => 'Nessun repository corrispondente', + 'plugin_catalog_catalog_unavailable' => 'Catalogo GitHub non disponibile', + 'plugin_catalog_current_compatible' => 'Aggiornato per questo Geeklog', + 'plugin_catalog_latest_compatible_version' => 'Ultima versione compatibile', + 'plugin_catalog_newer_release' => 'Release più recente', + 'plugin_catalog_requires_geeklog' => 'richiede Geeklog %s', + 'plugin_catalog_requires_php' => 'richiede PHP %s', + 'plugin_catalog_current' => 'Aggiornato', + 'plugin_catalog_update' => 'Aggiornamento disponibile', + 'plugin_catalog_ahead' => 'Versione installata più recente', + 'plugin_catalog_remote_unavailable' => 'I metadati GitHub non sono disponibili. Le informazioni locali del plugin vengono comunque mostrate.', + 'plugin_catalog_remote_disabled' => 'I controlli remoti dei metadati sono disattivati perché non è configurato alcun proprietario GitHub valido.', + 'plugin_catalog_none_discoverable' => 'Nessun altro repository recente di plugin è stato trovato per questo proprietario GitHub.', + 'plugin_catalog_open_repository' => 'Apri repository', + 'plugin_catalog_open_release' => 'Apri release', + 'plugin_catalog_open_version' => 'Apri versione', + 'plugin_catalog_updated' => 'Aggiornato', + 'plugin_catalog_summary_installed' => 'Installato', + 'plugin_catalog_summary_updates' => 'Aggiornamenti disponibili', + 'plugin_catalog_summary_discover' => 'Candidati recenti', + 'plugin_catalog_summary_unmatched' => 'Senza corrispondenza GitHub'); + +$PLG_monitor_MESSAGE3002 = $LANG32[9]; +$PLG_monitor_MESSAGE3003 = 'Monitor non ha potuto completare la migrazione del database. La versione installata non è stata modificata; controlla error.log e riprova l\'aggiornamento.'; + +$GLOBALS['LANG_configsections']['monitor'] = array( + 'label' => 'Monitor', + 'title' => 'Configurazione di Monitor' +); + +$GLOBALS['LANG_configsubgroups']['monitor'] = array( + 'sg_main' => 'Impostazioni principali' +); + +$GLOBALS['LANG_tab']['monitor'] = array( + 'tab_main' => 'Principale' +); + +$GLOBALS['LANG_fs']['monitor'] = array( + 'fs_main' => 'Impostazioni generali' +); + +$GLOBALS['LANG_confignames']['monitor'] = array( + 'emails' => 'Elenco di indirizzi email per le notifiche opzionali di Monitor (separati da virgole)', + 'repository' => 'Proprietario del repository GitHub riservato ai metadati delle release dei plugin (predefinito: Geeklog-Plugins). Lascia vuoto per disattivare i controlli remoti dei metadati.', + 'github_token' => 'Token GitHub opzionale per richieste di metadati API. Preferisci un token granulare di sola lettura. La variabile d\'ambiente MONITOR_GITHUB_TOKEN ha la priorità.' +); + +$LANG_configsections =& $GLOBALS['LANG_configsections']; +$LANG_configsubgroups =& $GLOBALS['LANG_configsubgroups']; +$LANG_tab =& $GLOBALS['LANG_tab']; +$LANG_fs =& $GLOBALS['LANG_fs']; +$LANG_confignames =& $GLOBALS['LANG_confignames']; From 1d196009927c42e39258b1ac1984a59fb48a466c Mon Sep 17 00:00:00 2001 From: Ben Date: Mon, 5 Oct 2026 11:11:19 +0700 Subject: [PATCH 09/23] Add japanese translation for Monitor 1.5.0 --- language/japanese_utf-8.php | 295 ++++++++++++++++++++++++++++++++++++ 1 file changed, 295 insertions(+) create mode 100644 language/japanese_utf-8.php diff --git a/language/japanese_utf-8.php b/language/japanese_utf-8.php new file mode 100644 index 0000000..c9b9250 --- /dev/null +++ b/language/japanese_utf-8.php @@ -0,0 +1,295 @@ + 'Monitor', + 'home' => '概要', + 'health' => '状態', + 'security' => 'セキュリティ', + 'file' => 'ファイル:', + 'log_file' => 'ログファイル:', + 'view_logs' => '現在のログを表示', + 'clear_logs' => 'ログを消去', + 'configuration' => '設定', + 'main' => 'サイト状態の概要', + 'logs' => 'ログファイル', + 'updates' => 'プラグイン', + 'status' => '状態', + 'check' => 'チェック', + 'value' => '値', + 'recommendation' => '推奨事項', + 'health_ok' => 'OK', + 'health_info' => '情報', + 'health_warning' => '警告', + 'health_error' => 'エラー', + 'security_observations' => 'セキュリティ観察', + 'ban_integration' => 'Ban プラグイン', + 'legacy_ban_notice' => 'Monitor は限定的なセキュリティ観察を記録します。オプションの Ban プラグインを使うと、Monitor を別の禁止エンジンにすることなく集中型のブロック機能を利用できます。', + 'security_status' => 'セキュリティ状態', + 'security_no_issue' => '利用可能な Monitor のセキュリティチェックでは問題は検出されませんでした。', + 'ban_not_installed' => '未インストール', + 'ban_installed' => 'インストール済み', + 'ban_optional_intro' => 'Ban はオプションです。なくても Monitor は限定的なセキュリティ観察を記録し続けます。', + 'ban_optional_capability' => 'Ban をインストールすると、Monitor が利用できる集中型ブロック機能が追加されます。', + 'ban_view_plugin' => 'Ban プラグイン情報を表示', + 'ban_version' => 'バージョン', + 'ban_ip_capability' => 'IP 禁止要求機能', + 'ban_capability_available' => '利用可能', + 'ban_capability_unavailable' => '利用不可', + 'ban_direct_sql' => 'Ban との直接 SQL 連携', + 'ban_direct_sql_no' => 'いいえ', + 'security_no_legacy_table' => '旧 Monitor セキュリティテーブルは存在しません。', + 'security_no_observations' => '最近のセキュリティ観察はありません。', + 'read_only_advice' => 'Monitor は既定で観察と推奨のみを行います。変更には管理者の明示的な操作が必要です。', + 'config_tooltip_emails' => 'Monitor 通知の送信先をカンマ区切りで指定します。空欄にするとメール通知は無効になります。', + 'config_tooltip_repository' => 'Monitor がプラグインのメタデータとバージョンを確認する公開リポジトリの GitHub 所有者です。空欄にするとリモート確認は無効になります。', + 'config_tooltip_github_token' => '任意の細粒度・読み取り専用 GitHub トークンです。MONITOR_GITHUB_TOKEN が優先されます。認証済みの確認では API 上限が高くなり、タグキャッシュの保持時間が短くなります。', + + // Media diagnostics + 'media_oversized_single' => '1 個の画像が推奨上限を超えています。', + 'media_oversized_multiple' => '%d 個の画像が推奨上限を超えています。', + 'media_show_files' => 'ファイルを表示 (%d)', + 'media_hide_files' => 'ファイルを非表示 (%d)', + 'media_open_file_manager' => 'ファイルマネージャーを開く', + 'media_view_image' => '画像を表示', + 'media_more_files' => 'ほかにも大きすぎる画像があります。表示件数は制限されています。', + 'media_partial_scan' => 'ファイルシステムのスキャンが安全上限に達しました。', + + // Daily log archives + 'log_archive_title' => 'ログアーカイブ', + 'log_archive_intro' => 'Monitor は Geeklog の .log ファイルを毎日ローテーションし、直近 %d 日分のアーカイブを保持します。', + 'log_archive_safety' => 'アクティブなログは、アーカイブコピーが正常に書き込まれた後でのみ切り詰められます。アーカイブは公開 Web ディレクトリ外の path_data 配下に保存されます。', + 'log_archive_empty' => '日次ログアーカイブはまだありません。最初の定期実行でローテーション基準が作成され、次の暦日以降にアーカイブが表示されます。', + 'log_archive_date' => '日付', + 'log_archive_log' => 'ログ', + 'log_archive_size' => 'サイズ', + 'log_archive_actions' => '操作', + 'log_archive_view' => '表示', + 'log_archive_download' => 'ダウンロード', + 'log_archive_back' => 'ログアーカイブに戻る', + 'log_archive_preview_limited' => 'このプレビューにはアーカイブの最新 512 KiB のみが表示されます。完全な日次ログを取得するにはファイルをダウンロードしてください。', + 'log_email_title' => '日次ログ概要', + 'log_email_lines' => 'スキャンした行数', + 'log_email_issue_lines' => 'エラー/警告行', + 'log_email_top_patterns' => 'error.log の主要パターン', + 'log_email_no_activity' => 'この日は内容のある Geeklog ログがアーカイブされませんでした。', + + // Changes monitor + 'changes' => '変更', + 'changes_page_title' => 'Monitor の変更', + 'changes_intro' => 'サイトの軽量スナップショットを比較して、2 回のチェック間の変更を確認します。Monitor は状態だけを記録し、サイトは変更しません。', + 'changes_capture' => '現在の状態を取得', + 'changes_capture_ok' => '現在の状態を保存しました。', + 'changes_capture_failed' => 'Monitor はスナップショットを保存できませんでした。path_data が書き込み可能か確認してください。', + 'changes_baseline_created' => '基準を作成しました。後で別の状態を取得して変更を確認してください。', + 'changes_waiting' => '変更を比較するには 2 つ目のスナップショットが必要です。', + 'changes_period' => '比較期間:', + 'changes_previous' => '前回', + 'changes_current' => '現在', + 'changes_summary_changes' => '変更', + 'changes_summary_plugins' => 'プラグインの変更', + 'changes_summary_log' => '新しいログパターン', + 'changes_summary_snapshots' => 'スナップショット', + 'changes_none' => '2 つのスナップショット間で重要な変更は検出されませんでした。', + 'changes_detected' => '検出された変更', + 'changes_environment' => '環境', + 'changes_plugins' => 'プラグイン', + 'changes_storage' => 'ストレージ', + 'changes_logs' => '新しい error.log アクティビティ', + 'changes_before' => '変更前', + 'changes_after' => '変更後', + 'changes_occurrences' => '件', + 'changes_log_none' => 'この期間の error.log では新しいエラー、警告、例外パターンは検出されませんでした。', + 'changes_log_rotated' => '2 つのスナップショット間で error.log がローテーションまたは切り詰められたため、新しい部分を確実に比較できません。', + 'changes_log_truncated' => '新しいログデータが解析上限を超えました。Monitor は最新 512 KiB のみを解析しました。', + 'changes_current_state' => '現在の状態', + 'changes_geeklog' => 'Geeklog', + 'changes_php' => 'PHP', + 'changes_plugins_count' => 'インストール済みプラグイン', + 'changes_disk_free' => '空きディスク容量', + 'changes_error_log_size' => 'error.log のサイズ', + 'changes_unknown' => '不明', + 'changes_enabled' => '有効', + 'changes_disabled' => '無効', + 'changes_code_geeklog_changed' => 'Geeklog のバージョンが変更されました', + 'changes_code_php_changed' => 'PHP のバージョンが変更されました', + 'changes_code_plugin_installed' => 'プラグインがインストールされました', + 'changes_code_plugin_removed' => 'プラグインが削除されました', + 'changes_code_plugin_version_changed' => 'プラグインのバージョンが変更されました', + 'changes_code_plugin_enabled' => 'プラグインが有効になりました', + 'changes_code_plugin_disabled' => 'プラグインが無効になりました', + 'changes_code_disk_free_decreased' => '空きディスク容量が減少しました', + + // Configuration audit + 'config_audit_title' => '設定監査', + 'config_audit_page_title' => 'Monitor 設定監査', + 'config_audit_quick_description' => 'siteconfig.php とデータベース内の対応する Core 値の差異を確認します。', + 'config_audit_back' => 'Monitor 概要', + 'config_audit_access_denied' => 'アクセス拒否', + 'config_audit_root_only' => 'アクセスは Root 管理者に限定されています。', + 'config_audit_intro_title' => '読み取り専用の設定監査です。', + 'config_audit_intro' => 'siteconfig.php で明示的に定義された Core 値と conf_values の対応値を比較します。差異または無効な値のみ注意が必要です。', + 'config_audit_issues' => '問題', + 'config_audit_review' => '確認', + 'config_audit_normal' => '正常', + 'config_audit_active_host' => 'ホスト:', + 'config_audit_siteconfig' => 'siteconfig.php:', + 'config_audit_unreadable_title' => '警告:', + 'config_audit_unreadable' => 'Monitor は有効な siteconfig.php を読み取れなかったため、比較は不完全です。', + 'config_audit_items_review' => '要確認', + 'config_audit_no_issues' => '設定は整合しています。競合する Core 値はありません。', + 'config_audit_secondary' => '正常または情報値を %d 件表示', + 'config_audit_footer' => '機密値は伏せられます。任意のデータベース整合 SQL が自動実行されることはありません。', + 'config_audit_source_siteconfig' => 'siteconfig.php', + 'config_audit_source_database' => 'データベース', + 'config_audit_priority' => '有効なソース:', + 'config_audit_effective_value' => '有効な値', + 'config_audit_details' => '詳細', + 'config_audit_recommendation' => '推奨事項', + 'config_audit_path' => 'パス:', + 'config_audit_path_exists' => '存在', + 'config_audit_path_missing' => '欠落', + 'config_audit_optional_sql' => '任意のデータベース整合', + 'config_audit_absent' => 'なし', + 'config_audit_redacted' => '[伏字]', + 'config_audit_value_true' => '真', + 'config_audit_value_false' => '偽', + 'config_audit_value_null' => 'NULL', + 'config_audit_value_object' => '[OBJECT]', + + 'config_audit_level_ok' => '期待値', + 'config_audit_level_info' => '情報', + 'config_audit_level_review' => '確認', + 'config_audit_level_warning' => '警告', + + 'config_audit_status_identical' => '同一', + 'config_audit_status_core_file' => 'siteconfig.php に存在する想定', + 'config_audit_status_file_only' => 'siteconfig.php のみ', + 'config_audit_status_db_unset' => 'データベース値が未設定', + 'config_audit_status_different' => '異なる値', + 'config_audit_status_decode_error' => 'データベース値を読み取れません', + 'config_audit_status_invalid_path' => '無効なパス', + + 'config_audit_why_identical' => 'siteconfig.php と conf_values に同じ値があります。', + 'config_audit_why_core_file' => 'この Core キーは通常 siteconfig.php で直接定義されます。', + 'config_audit_why_file_only' => 'conf_values に対応する Core 値がありません。siteconfig.php の値が使用されます。', + 'config_audit_why_db_unset' => 'conf_values に対応する Core 行がありますが値は未設定です。siteconfig.php が引き続き有効です。', + 'config_audit_why_different' => 'siteconfig.php と conf_values の値が異なります。実行時には siteconfig.php が有効です。', + 'config_audit_why_decode_error' => 'conf_values の対応する Core 値を確実にデコードできませんでした。', + 'config_audit_why_invalid_path' => '有効なファイルシステムパスは現在存在しません。', + + 'config_audit_action_none' => '対応は不要です。', + 'config_audit_action_file_only' => 'この値をデータベースでも管理する必要がない限り対応は不要です。', + 'config_audit_action_db_unset' => 'データベース値が意図的に未設定か確認してください。', + 'config_audit_action_different' => 'この上書きが意図したものか確認してください。保存値が古い場合のみデータベース値を合わせてください。', + 'config_audit_action_decode_error' => '変更前に conf_values の対応する Core 行を確認してください。', + 'config_audit_action_invalid_path' => '設定されたパスとファイルシステムの可用性を確認してください。', + + // Plugin catalog + 'plugin_catalog_intro' => 'インストール済みプラグインを、設定された GitHub 所有者の公開リポジトリと比較します。Monitor は利用可能なバージョンと候補を報告しますが、コードのインストールや更新は行いません。', + 'plugin_catalog_owner' => 'GitHub ソース:', + 'plugin_catalog_refresh' => 'GitHub データを更新', + 'plugin_catalog_installed' => 'インストール済みプラグイン', + 'plugin_catalog_discover' => 'プラグインを探す', + 'plugin_catalog_discover_compatible' => 'このサイトと互換', + 'plugin_catalog_discover_incompatible' => 'このサイトと非互換', + 'plugin_catalog_discover_unknown' => '互換性不明', + 'plugin_catalog_discover_requirements_missing' => '要件未定義', + 'plugin_catalog_discover_metadata_unavailable' => 'メタデータ利用不可', + 'plugin_catalog_discover_intro' => 'このサイトに未インストールの最近の公開リポジトリです。インストール前に互換性とドキュメントを確認してください。', + 'plugin_catalog_legacy_discover' => '古いリポジトリ', + 'plugin_catalog_legacy_intro' => '古い公開リポジトリも役立つ場合がありますが、最近の Geeklog と PHP との互換性は不明です。', + 'plugin_catalog_plugin' => 'プラグイン', + 'plugin_catalog_core_plugin' => 'Core プラグイン', + 'plugin_catalog_core_update' => 'Geeklog 更新で利用可能', + 'plugin_catalog_latest_core_version' => '最新 Core バージョン', + 'plugin_catalog_current_geeklog' => '現在の Geeklog', + 'plugin_catalog_latest_geeklog_baseline' => '最新 Geeklog 基準', + 'plugin_catalog_open_core_plugin' => 'Core プラグインを開く', + 'plugin_catalog_version' => 'バージョン', + 'plugin_catalog_bundled_with_geeklog' => 'Geeklog に同梱', + 'plugin_catalog_available_with_geeklog' => 'Geeklog で利用可能', + 'plugin_catalog_installed_version' => 'インストール済み', + 'plugin_catalog_code_version' => 'コード', + 'plugin_catalog_latest_release' => '最新リリース', + 'plugin_catalog_latest_version' => '最新 GitHub バージョン', + 'plugin_catalog_version_source_release' => 'リリース', + 'plugin_catalog_version_source_tag' => 'タグ', + 'plugin_catalog_state' => '状態', + 'plugin_catalog_enabled' => '有効', + 'plugin_catalog_geeklog' => 'Geeklog 要件', + 'plugin_catalog_php_requirement' => 'PHP 要件', + 'plugin_catalog_update_compatible' => '更新互換', + 'plugin_catalog_update_incompatible' => '更新非互換', + 'plugin_catalog_compatibility_unknown' => '互換性不明', + 'plugin_catalog_repository' => 'リポジトリ', + 'plugin_catalog_yes' => 'はい', + 'plugin_catalog_no' => 'いいえ', + 'plugin_catalog_unknown' => '不明', + 'plugin_catalog_no_release' => 'リリースメタデータなし', + 'plugin_catalog_no_version' => 'リリースまたはバージョンタグが見つかりません', + 'plugin_catalog_no_repository' => '対応するリポジトリなし', + 'plugin_catalog_catalog_unavailable' => 'GitHub カタログ利用不可', + 'plugin_catalog_current_compatible' => 'この Geeklog では最新', + 'plugin_catalog_latest_compatible_version' => '最新互換バージョン', + 'plugin_catalog_newer_release' => 'より新しいリリース', + 'plugin_catalog_requires_geeklog' => 'Geeklog %s が必要', + 'plugin_catalog_requires_php' => 'PHP %s が必要', + 'plugin_catalog_current' => '最新', + 'plugin_catalog_update' => '更新あり', + 'plugin_catalog_ahead' => 'インストール済みバージョンの方が新しい', + 'plugin_catalog_remote_unavailable' => 'GitHub メタデータは利用できません。ローカルのプラグイン情報は引き続き表示されます。', + 'plugin_catalog_remote_disabled' => '有効な GitHub 所有者が設定されていないため、リモートメタデータ確認は無効です。', + 'plugin_catalog_none_discoverable' => 'この GitHub 所有者について追加の最近のプラグインリポジトリは見つかりませんでした。', + 'plugin_catalog_open_repository' => 'リポジトリを開く', + 'plugin_catalog_open_release' => 'リリースを開く', + 'plugin_catalog_open_version' => 'バージョンを開く', + 'plugin_catalog_updated' => '更新済み', + 'plugin_catalog_summary_installed' => 'インストール済み', + 'plugin_catalog_summary_updates' => '更新あり', + 'plugin_catalog_summary_discover' => '最近の候補', + 'plugin_catalog_summary_unmatched' => 'GitHub 対応なし'); + +$PLG_monitor_MESSAGE3002 = $LANG32[9]; +$PLG_monitor_MESSAGE3003 = 'Monitor はデータベース移行を完了できませんでした。インストール済みバージョンは変更されていません。error.log を確認してアップグレードを再試行してください。'; + +$GLOBALS['LANG_configsections']['monitor'] = array( + 'label' => 'Monitor', + 'title' => 'Monitor 設定' +); + +$GLOBALS['LANG_configsubgroups']['monitor'] = array( + 'sg_main' => '主設定' +); + +$GLOBALS['LANG_tab']['monitor'] = array( + 'tab_main' => 'メイン' +); + +$GLOBALS['LANG_fs']['monitor'] = array( + 'fs_main' => '一般設定' +); + +$GLOBALS['LANG_confignames']['monitor'] = array( + 'emails' => 'Monitor の任意通知に使用するメールアドレス一覧(カンマ区切り)', + 'repository' => 'プラグインのリリースメタデータに使用する GitHub リポジトリ所有者(既定: Geeklog-Plugins)。空欄にするとリモートメタデータ確認を無効にします。', + 'github_token' => 'API メタデータ要求用の任意の GitHub トークン。細粒度の読み取り専用トークンを推奨します。環境変数 MONITOR_GITHUB_TOKEN が優先されます。' +); + +$LANG_configsections =& $GLOBALS['LANG_configsections']; +$LANG_configsubgroups =& $GLOBALS['LANG_configsubgroups']; +$LANG_tab =& $GLOBALS['LANG_tab']; +$LANG_fs =& $GLOBALS['LANG_fs']; +$LANG_confignames =& $GLOBALS['LANG_confignames']; From 516d221d22907714ebb67cf836585aa925d36cac Mon Sep 17 00:00:00 2001 From: Ben Date: Mon, 5 Oct 2026 11:11:22 +0700 Subject: [PATCH 10/23] Add persian translation for Monitor 1.5.0 --- language/persian_utf-8.php | 295 +++++++++++++++++++++++++++++++++++++ 1 file changed, 295 insertions(+) create mode 100644 language/persian_utf-8.php diff --git a/language/persian_utf-8.php b/language/persian_utf-8.php new file mode 100644 index 0000000..1c7611d --- /dev/null +++ b/language/persian_utf-8.php @@ -0,0 +1,295 @@ + 'Monitor', + 'home' => 'نمای کلی', + 'health' => 'وضعیت', + 'security' => 'امنیت', + 'file' => 'فایل:', + 'log_file' => 'فایل گزارش:', + 'view_logs' => 'مشاهده گزارش‌های فعلی', + 'clear_logs' => 'پاک‌کردن گزارش‌ها', + 'configuration' => 'پیکربندی', + 'main' => 'نمای کلی وضعیت سایت', + 'logs' => 'فایل‌های گزارش', + 'updates' => 'افزونه‌ها', + 'status' => 'وضعیت', + 'check' => 'بررسی', + 'value' => 'مقدار', + 'recommendation' => 'پیشنهاد', + 'health_ok' => 'OK', + 'health_info' => 'اطلاعات', + 'health_warning' => 'هشدار', + 'health_error' => 'خطا', + 'security_observations' => 'مشاهدات امنیتی', + 'ban_integration' => 'افزونه Ban', + 'legacy_ban_notice' => 'Monitor مشاهدات امنیتی محدودی را ثبت می‌کند. افزونه اختیاری Ban می‌تواند قابلیت‌های مسدودسازی متمرکز فراهم کند، بدون اینکه Monitor به یک موتور مسدودسازی دوم تبدیل شود.', + 'security_status' => 'وضعیت امنیت', + 'security_no_issue' => 'هیچ مشکلی توسط بررسی‌های امنیتی موجود Monitor شناسایی نشد.', + 'ban_not_installed' => 'نصب نشده', + 'ban_installed' => 'نصب شده', + 'ban_optional_intro' => 'Ban اختیاری است. Monitor بدون آن نیز به ثبت مشاهدات امنیتی محدود خود ادامه می‌دهد.', + 'ban_optional_capability' => 'نصب Ban قابلیت‌های مسدودسازی متمرکز را اضافه می‌کند که Monitor می‌تواند در صورت وجود از آن‌ها استفاده کند.', + 'ban_view_plugin' => 'مشاهده اطلاعات افزونه Ban', + 'ban_version' => 'نسخه', + 'ban_ip_capability' => 'قابلیت درخواست مسدودسازی IP', + 'ban_capability_available' => 'در دسترس', + 'ban_capability_unavailable' => 'در دسترس نیست', + 'ban_direct_sql' => 'اتصال مستقیم SQL به Ban', + 'ban_direct_sql_no' => 'خیر', + 'security_no_legacy_table' => 'هیچ جدول امنیتی قدیمی Monitor وجود ندارد.', + 'security_no_observations' => 'مشاهده امنیتی جدیدی وجود ندارد.', + 'read_only_advice' => 'Monitor به‌طور پیش‌فرض مشاهده و پیشنهاد می‌کند. تغییرات نیازمند اقدام صریح مدیر هستند.', + 'config_tooltip_emails' => 'گیرندگان اختیاری اعلان‌های Monitor را با ویرگول جدا کنید. برای غیرفعال کردن اعلان‌های ایمیلی خالی بگذارید.', + 'config_tooltip_repository' => 'مالک GitHub که Monitor مخزن‌های عمومی او را برای فراداده و نسخه‌های افزونه بررسی می‌کند. برای غیرفعال کردن بررسی‌های راه‌دور خالی بگذارید.', + 'config_tooltip_github_token' => 'توکن اختیاری GitHub با دسترسی دقیق و فقط‌خواندنی. MONITOR_GITHUB_TOKEN اولویت دارد. بررسی‌های احراز هویت‌شده سهمیه API بیشتری دارند و از کش کوتاه‌تری برای تگ‌ها استفاده می‌کنند.', + + // Media diagnostics + 'media_oversized_single' => '۱ تصویر از محدودیت‌های پیشنهادی بیشتر است.', + 'media_oversized_multiple' => '%d تصویر از محدودیت‌های پیشنهادی بیشتر هستند.', + 'media_show_files' => 'نمایش فایل‌ها (%d)', + 'media_hide_files' => 'پنهان‌کردن فایل‌ها (%d)', + 'media_open_file_manager' => 'بازکردن مدیر فایل', + 'media_view_image' => 'مشاهده تصویر', + 'media_more_files' => 'تصاویر بزرگ دیگری نیز وجود دارند؛ فهرست محدود شده است.', + 'media_partial_scan' => 'اسکن سیستم فایل به حد ایمنی خود رسید.', + + // Daily log archives + 'log_archive_title' => 'بایگانی گزارش‌ها', + 'log_archive_intro' => 'Monitor فایل‌های .log مربوط به Geeklog را روزانه چرخش می‌دهد و بایگانی %d روز اخیر را نگه می‌دارد.', + 'log_archive_safety' => 'گزارش فعال فقط پس از نوشته‌شدن موفق نسخه بایگانی کوتاه می‌شود. بایگانی‌ها زیر path_data و خارج از پوشه عمومی وب ذخیره می‌شوند.', + 'log_archive_empty' => 'هنوز بایگانی روزانه‌ای در دسترس نیست. نخستین اجرای زمان‌بندی‌شده خط مبنای چرخش را ایجاد می‌کند؛ بایگانی‌ها پس از روز تقویمی بعدی ظاهر می‌شوند.', + 'log_archive_date' => 'تاریخ', + 'log_archive_log' => 'گزارش', + 'log_archive_size' => 'اندازه', + 'log_archive_actions' => 'عملیات', + 'log_archive_view' => 'مشاهده', + 'log_archive_download' => 'دانلود', + 'log_archive_back' => 'بازگشت به بایگانی گزارش‌ها', + 'log_archive_preview_limited' => 'این پیش‌نمایش فقط جدیدترین ۵۱۲ KiB بایگانی را نشان می‌دهد. برای دریافت گزارش روزانه کامل، فایل را دانلود کنید.', + 'log_email_title' => 'خلاصه روزانه گزارش', + 'log_email_lines' => 'خطوط اسکن‌شده', + 'log_email_issue_lines' => 'خطوط خطا/هشدار', + 'log_email_top_patterns' => 'الگوهای پرتکرار error.log', + 'log_email_no_activity' => 'برای این روز هیچ گزارش غیرخالی Geeklog بایگانی نشد.', + + // Changes monitor + 'changes' => 'تغییرات', + 'changes_page_title' => 'تغییرات Monitor', + 'changes_intro' => 'تصاویر لحظه‌ای سبک سایت را مقایسه کنید تا تغییرات بین دو بررسی مشخص شوند. Monitor فقط وضعیت را ثبت می‌کند و سایت را تغییر نمی‌دهد.', + 'changes_capture' => 'ثبت وضعیت فعلی', + 'changes_capture_ok' => 'وضعیت فعلی ذخیره شد.', + 'changes_capture_failed' => 'Monitor نتوانست تصویر لحظه‌ای را ذخیره کند. بررسی کنید path_data قابل نوشتن باشد.', + 'changes_baseline_created' => 'خط مبنا ایجاد شد. بعداً وضعیت دیگری ثبت کنید تا تغییرات مشخص شوند.', + 'changes_waiting' => 'برای مقایسه تغییرات به تصویر لحظه‌ای دوم نیاز است.', + 'changes_period' => 'دوره مقایسه‌شده:', + 'changes_previous' => 'قبلی', + 'changes_current' => 'فعلی', + 'changes_summary_changes' => 'تغییرات', + 'changes_summary_plugins' => 'تغییرات افزونه', + 'changes_summary_log' => 'الگوهای جدید گزارش', + 'changes_summary_snapshots' => 'تصاویر لحظه‌ای', + 'changes_none' => 'هیچ تغییر معناداری بین این دو تصویر لحظه‌ای شناسایی نشد.', + 'changes_detected' => 'تغییرات شناسایی‌شده', + 'changes_environment' => 'محیط', + 'changes_plugins' => 'افزونه‌ها', + 'changes_storage' => 'فضای ذخیره‌سازی', + 'changes_logs' => 'فعالیت جدید error.log', + 'changes_before' => 'قبل', + 'changes_after' => 'بعد', + 'changes_occurrences' => 'مورد', + 'changes_log_none' => 'در این دوره هیچ الگوی جدید خطا، هشدار یا استثنا در error.log شناسایی نشد.', + 'changes_log_rotated' => 'error.log بین دو تصویر لحظه‌ای چرخش داده یا کوتاه شده است، بنابراین بخش جدید قابل مقایسه مطمئن نیست.', + 'changes_log_truncated' => 'داده‌های جدید گزارش از حد تحلیل عبور کردند. Monitor فقط جدیدترین ۵۱۲ KiB را تحلیل کرد.', + 'changes_current_state' => 'وضعیت فعلی', + 'changes_geeklog' => 'Geeklog', + 'changes_php' => 'PHP', + 'changes_plugins_count' => 'افزونه‌های نصب‌شده', + 'changes_disk_free' => 'فضای آزاد دیسک', + 'changes_error_log_size' => 'اندازه error.log', + 'changes_unknown' => 'نامشخص', + 'changes_enabled' => 'فعال', + 'changes_disabled' => 'غیرفعال', + 'changes_code_geeklog_changed' => 'نسخه Geeklog تغییر کرد', + 'changes_code_php_changed' => 'نسخه PHP تغییر کرد', + 'changes_code_plugin_installed' => 'افزونه نصب شد', + 'changes_code_plugin_removed' => 'افزونه حذف شد', + 'changes_code_plugin_version_changed' => 'نسخه افزونه تغییر کرد', + 'changes_code_plugin_enabled' => 'افزونه فعال شد', + 'changes_code_plugin_disabled' => 'افزونه غیرفعال شد', + 'changes_code_disk_free_decreased' => 'فضای آزاد دیسک کاهش یافت', + + // Configuration audit + 'config_audit_title' => 'ممیزی پیکربندی', + 'config_audit_page_title' => 'ممیزی پیکربندی Monitor', + 'config_audit_quick_description' => 'تفاوت‌های بین siteconfig.php و مقادیر متناظر Core در پایگاه داده را بررسی کنید.', + 'config_audit_back' => 'نمای کلی Monitor', + 'config_audit_access_denied' => 'دسترسی رد شد', + 'config_audit_root_only' => 'دسترسی فقط برای مدیران Root محفوظ است.', + 'config_audit_intro_title' => 'ممیزی پیکربندی فقط‌خواندنی.', + 'config_audit_intro' => 'مقادیر Core که صراحتاً در siteconfig.php تعریف شده‌اند با مقادیر متناظر در conf_values مقایسه می‌شوند. فقط تفاوت‌ها یا مقادیر نامعتبر نیازمند توجه‌اند.', + 'config_audit_issues' => 'مشکلات', + 'config_audit_review' => 'بازبینی', + 'config_audit_normal' => 'عادی', + 'config_audit_active_host' => 'میزبان:', + 'config_audit_siteconfig' => 'siteconfig.php:', + 'config_audit_unreadable_title' => 'هشدار:', + 'config_audit_unreadable' => 'Monitor نتوانست siteconfig.php فعال را بخواند، بنابراین مقایسه ناقص است.', + 'config_audit_items_review' => 'نیازمند توجه', + 'config_audit_no_issues' => 'پیکربندی سازگار است. هیچ مقدار Core متعارضی نیازمند توجه نیست.', + 'config_audit_secondary' => 'نمایش %d مقدار عادی یا اطلاعاتی', + 'config_audit_footer' => 'مقادیر حساس پوشانده می‌شوند. SQL اختیاری برای هم‌ترازسازی پایگاه داده هرگز به‌طور خودکار اجرا نمی‌شود.', + 'config_audit_source_siteconfig' => 'siteconfig.php', + 'config_audit_source_database' => 'پایگاه داده', + 'config_audit_priority' => 'منبع مؤثر:', + 'config_audit_effective_value' => 'مقدار مؤثر', + 'config_audit_details' => 'جزئیات', + 'config_audit_recommendation' => 'پیشنهاد', + 'config_audit_path' => 'مسیر:', + 'config_audit_path_exists' => 'وجود دارد', + 'config_audit_path_missing' => 'وجود ندارد', + 'config_audit_optional_sql' => 'هم‌ترازسازی اختیاری پایگاه داده', + 'config_audit_absent' => 'غایب', + 'config_audit_redacted' => '[پوشانده‌شده]', + 'config_audit_value_true' => 'درست', + 'config_audit_value_false' => 'نادرست', + 'config_audit_value_null' => 'NULL', + 'config_audit_value_object' => '[OBJECT]', + + 'config_audit_level_ok' => 'مورد انتظار', + 'config_audit_level_info' => 'اطلاعات', + 'config_audit_level_review' => 'بازبینی', + 'config_audit_level_warning' => 'هشدار', + + 'config_audit_status_identical' => 'یکسان', + 'config_audit_status_core_file' => 'مورد انتظار در siteconfig.php', + 'config_audit_status_file_only' => 'فقط siteconfig.php', + 'config_audit_status_db_unset' => 'مقدار پایگاه داده تنظیم نشده', + 'config_audit_status_different' => 'مقادیر متفاوت', + 'config_audit_status_decode_error' => 'مقدار پایگاه داده قابل خواندن نیست', + 'config_audit_status_invalid_path' => 'مسیر نامعتبر', + + 'config_audit_why_identical' => 'همان مقدار در siteconfig.php و conf_values وجود دارد.', + 'config_audit_why_core_file' => 'این کلید Core معمولاً مستقیماً در siteconfig.php تعریف می‌شود.', + 'config_audit_why_file_only' => 'هیچ مقدار Core متناظری در conf_values وجود ندارد. مقدار siteconfig.php استفاده می‌شود.', + 'config_audit_why_db_unset' => 'یک ردیف Core متناظر در conf_values وجود دارد اما مقدار آن تنظیم نشده است. siteconfig.php همچنان مؤثر است.', + 'config_audit_why_different' => 'siteconfig.php و conf_values مقادیر متفاوتی دارند. در زمان اجرا siteconfig.php مؤثر است.', + 'config_audit_why_decode_error' => 'مقدار Core متناظر در conf_values به‌طور قابل اعتماد قابل رمزگشایی نبود.', + 'config_audit_why_invalid_path' => 'مسیر مؤثر سیستم فایل در حال حاضر وجود ندارد.', + + 'config_audit_action_none' => 'اقدامی لازم نیست.', + 'config_audit_action_file_only' => 'اقدامی لازم نیست مگر اینکه این مقدار باید در پایگاه داده نیز مدیریت شود.', + 'config_audit_action_db_unset' => 'بررسی کنید که مقدار پایگاه داده عمداً تنظیم نشده باشد.', + 'config_audit_action_different' => 'بررسی کنید که این بازنویسی عمدی باشد. فقط در صورت منسوخ‌بودن مقدار ذخیره‌شده، مقدار پایگاه داده را هم‌تراز کنید.', + 'config_audit_action_decode_error' => 'پیش از هر تغییری، ردیف Core متناظر در conf_values را بررسی کنید.', + 'config_audit_action_invalid_path' => 'مسیر پیکربندی‌شده و دسترس‌پذیری سیستم فایل را بررسی کنید.', + + // Plugin catalog + 'plugin_catalog_intro' => 'افزونه‌های نصب‌شده با مخازن عمومی مالک GitHub پیکربندی‌شده مقایسه می‌شوند. Monitor نسخه‌های موجود و گزینه‌های کشف‌شده را گزارش می‌کند، اما هرگز کد نصب یا به‌روزرسانی نمی‌کند.', + 'plugin_catalog_owner' => 'منبع GitHub:', + 'plugin_catalog_refresh' => 'به‌روزرسانی داده‌های GitHub', + 'plugin_catalog_installed' => 'افزونه‌های نصب‌شده', + 'plugin_catalog_discover' => 'کشف افزونه‌ها', + 'plugin_catalog_discover_compatible' => 'سازگار با این سایت', + 'plugin_catalog_discover_incompatible' => 'ناسازگار با این سایت', + 'plugin_catalog_discover_unknown' => 'سازگاری نامشخص', + 'plugin_catalog_discover_requirements_missing' => 'نیازمندی‌ها اعلام نشده‌اند', + 'plugin_catalog_discover_metadata_unavailable' => 'فراداده در دسترس نیست', + 'plugin_catalog_discover_intro' => 'مخازن عمومی جدیدی که روی این سایت نصب نشده‌اند. پیش از نصب هر چیزی، سازگاری و مستندات را بررسی کنید.', + 'plugin_catalog_legacy_discover' => 'مخازن قدیمی‌تر', + 'plugin_catalog_legacy_intro' => 'مخازن عمومی قدیمی‌تر ممکن است هنوز مفید باشند، اما سازگاری آن‌ها با نسخه‌های جدید Geeklog و PHP نامشخص است.', + 'plugin_catalog_plugin' => 'افزونه', + 'plugin_catalog_core_plugin' => 'افزونه Core', + 'plugin_catalog_core_update' => 'همراه به‌روزرسانی Geeklog در دسترس', + 'plugin_catalog_latest_core_version' => 'جدیدترین نسخه Core', + 'plugin_catalog_current_geeklog' => 'Geeklog فعلی', + 'plugin_catalog_latest_geeklog_baseline' => 'جدیدترین خط مبنای Geeklog', + 'plugin_catalog_open_core_plugin' => 'بازکردن افزونه Core', + 'plugin_catalog_version' => 'نسخه', + 'plugin_catalog_bundled_with_geeklog' => 'همراه Geeklog', + 'plugin_catalog_available_with_geeklog' => 'همراه Geeklog در دسترس', + 'plugin_catalog_installed_version' => 'نصب شده', + 'plugin_catalog_code_version' => 'کد', + 'plugin_catalog_latest_release' => 'آخرین انتشار', + 'plugin_catalog_latest_version' => 'آخرین نسخه GitHub', + 'plugin_catalog_version_source_release' => 'انتشار', + 'plugin_catalog_version_source_tag' => 'برچسب', + 'plugin_catalog_state' => 'وضعیت', + 'plugin_catalog_enabled' => 'فعال', + 'plugin_catalog_geeklog' => 'نیازمندی Geeklog', + 'plugin_catalog_php_requirement' => 'نیازمندی PHP', + 'plugin_catalog_update_compatible' => 'به‌روزرسانی سازگار', + 'plugin_catalog_update_incompatible' => 'به‌روزرسانی ناسازگار', + 'plugin_catalog_compatibility_unknown' => 'سازگاری نامشخص', + 'plugin_catalog_repository' => 'مخزن', + 'plugin_catalog_yes' => 'بله', + 'plugin_catalog_no' => 'خیر', + 'plugin_catalog_unknown' => 'نامشخص', + 'plugin_catalog_no_release' => 'فراداده انتشار وجود ندارد', + 'plugin_catalog_no_version' => 'هیچ انتشار یا برچسب نسخه‌ای یافت نشد', + 'plugin_catalog_no_repository' => 'مخزن متناظری یافت نشد', + 'plugin_catalog_catalog_unavailable' => 'فهرست GitHub در دسترس نیست', + 'plugin_catalog_current_compatible' => 'برای این Geeklog به‌روز است', + 'plugin_catalog_latest_compatible_version' => 'جدیدترین نسخه سازگار', + 'plugin_catalog_newer_release' => 'انتشار جدیدتر', + 'plugin_catalog_requires_geeklog' => 'نیازمند Geeklog %s', + 'plugin_catalog_requires_php' => 'نیازمند PHP %s', + 'plugin_catalog_current' => 'به‌روز', + 'plugin_catalog_update' => 'به‌روزرسانی موجود است', + 'plugin_catalog_ahead' => 'نسخه نصب‌شده جدیدتر است', + 'plugin_catalog_remote_unavailable' => 'فراداده GitHub در دسترس نیست. اطلاعات محلی افزونه همچنان نمایش داده می‌شود.', + 'plugin_catalog_remote_disabled' => 'بررسی فراداده راه دور غیرفعال است زیرا مالک معتبر GitHub پیکربندی نشده است.', + 'plugin_catalog_none_discoverable' => 'هیچ مخزن افزونه جدید دیگری برای این مالک GitHub یافت نشد.', + 'plugin_catalog_open_repository' => 'بازکردن مخزن', + 'plugin_catalog_open_release' => 'بازکردن انتشار', + 'plugin_catalog_open_version' => 'بازکردن نسخه', + 'plugin_catalog_updated' => 'به‌روزرسانی‌شده', + 'plugin_catalog_summary_installed' => 'نصب شده', + 'plugin_catalog_summary_updates' => 'به‌روزرسانی‌ها موجودند', + 'plugin_catalog_summary_discover' => 'گزینه‌های جدید', + 'plugin_catalog_summary_unmatched' => 'بدون تطابق GitHub'); + +$PLG_monitor_MESSAGE3002 = $LANG32[9]; +$PLG_monitor_MESSAGE3003 = 'Monitor نتوانست مهاجرت پایگاه داده را کامل کند. نسخه نصب‌شده تغییر نکرد؛ error.log را بررسی کرده و ارتقا را دوباره امتحان کنید.'; + +$GLOBALS['LANG_configsections']['monitor'] = array( + 'label' => 'Monitor', + 'title' => 'پیکربندی Monitor' +); + +$GLOBALS['LANG_configsubgroups']['monitor'] = array( + 'sg_main' => 'تنظیمات اصلی' +); + +$GLOBALS['LANG_tab']['monitor'] = array( + 'tab_main' => 'اصلی' +); + +$GLOBALS['LANG_fs']['monitor'] = array( + 'fs_main' => 'تنظیمات عمومی' +); + +$GLOBALS['LANG_confignames']['monitor'] = array( + 'emails' => 'فهرست نشانی‌های ایمیل برای اعلان‌های اختیاری Monitor (جداشده با ویرگول)', + 'repository' => 'مالک مخزن GitHub برای فراداده انتشار افزونه‌ها (پیش‌فرض: Geeklog-Plugins). برای غیرفعال‌کردن بررسی فراداده راه دور، خالی بگذارید.', + 'github_token' => 'توکن اختیاری GitHub برای درخواست‌های فراداده API. توکن فقط‌خواندنی با دسترسی ریزدانه ترجیح داده می‌شود. متغیر محیطی MONITOR_GITHUB_TOKEN اولویت دارد.' +); + +$LANG_configsections =& $GLOBALS['LANG_configsections']; +$LANG_configsubgroups =& $GLOBALS['LANG_configsubgroups']; +$LANG_tab =& $GLOBALS['LANG_tab']; +$LANG_fs =& $GLOBALS['LANG_fs']; +$LANG_confignames =& $GLOBALS['LANG_confignames']; From d71d9570adaa385d438761b77d021707a10cec7d Mon Sep 17 00:00:00 2001 From: Ben Date: Mon, 5 Oct 2026 11:11:24 +0700 Subject: [PATCH 11/23] Add russian translation for Monitor 1.5.0 --- language/russian_utf-8.php | 295 +++++++++++++++++++++++++++++++++++++ 1 file changed, 295 insertions(+) create mode 100644 language/russian_utf-8.php diff --git a/language/russian_utf-8.php b/language/russian_utf-8.php new file mode 100644 index 0000000..6c0a6c4 --- /dev/null +++ b/language/russian_utf-8.php @@ -0,0 +1,295 @@ + 'Monitor', + 'home' => 'Обзор', + 'health' => 'Состояние', + 'security' => 'Безопасность', + 'file' => 'Файл:', + 'log_file' => 'Файл журнала:', + 'view_logs' => 'Просмотреть текущие журналы', + 'clear_logs' => 'Очистить журналы', + 'configuration' => 'Конфигурация', + 'main' => 'Обзор состояния сайта', + 'logs' => 'Файлы журналов', + 'updates' => 'Плагины', + 'status' => 'Статус', + 'check' => 'Проверка', + 'value' => 'Значение', + 'recommendation' => 'Рекомендация', + 'health_ok' => 'OK', + 'health_info' => 'Информация', + 'health_warning' => 'Предупреждение', + 'health_error' => 'Ошибка', + 'security_observations' => 'Наблюдения безопасности', + 'ban_integration' => 'Плагин Ban', + 'legacy_ban_notice' => 'Monitor записывает ограниченные наблюдения безопасности. Необязательный плагин Ban может предоставить централизованные функции блокировки, не превращая Monitor во второй механизм блокировок.', + 'security_status' => 'Статус безопасности', + 'security_no_issue' => 'Доступные проверки безопасности Monitor не обнаружили проблем.', + 'ban_not_installed' => 'Не установлен', + 'ban_installed' => 'Установлен', + 'ban_optional_intro' => 'Ban необязателен. Monitor продолжает записывать ограниченные наблюдения безопасности и без него.', + 'ban_optional_capability' => 'Установка Ban добавляет централизованные функции блокировки, которые Monitor может использовать при наличии.', + 'ban_view_plugin' => 'Просмотреть информацию о плагине Ban', + 'ban_version' => 'Версия', + 'ban_ip_capability' => 'Возможность запроса блокировки IP', + 'ban_capability_available' => 'Доступно', + 'ban_capability_unavailable' => 'Недоступно', + 'ban_direct_sql' => 'Прямая SQL-связь с Ban', + 'ban_direct_sql_no' => 'Нет', + 'security_no_legacy_table' => 'Устаревшая таблица безопасности Monitor отсутствует.', + 'security_no_observations' => 'Нет недавних наблюдений безопасности.', + 'read_only_advice' => 'По умолчанию Monitor наблюдает и рекомендует. Для изменений требуется явное действие администратора.', + 'config_tooltip_emails' => 'Необязательные получатели уведомлений Monitor, разделённые запятыми. Оставьте поле пустым, чтобы отключить уведомления по электронной почте.', + 'config_tooltip_repository' => 'Владелец GitHub, чьи публичные репозитории Monitor проверяет для получения метаданных и версий плагинов. Оставьте поле пустым, чтобы отключить удалённые проверки.', + 'config_tooltip_github_token' => 'Необязательный GitHub-токен с детальными правами только на чтение. MONITOR_GITHUB_TOKEN имеет приоритет. Аутентифицированные проверки имеют более высокий лимит API и используют более короткий кэш тегов.', + + // Media diagnostics + 'media_oversized_single' => '1 изображение превышает рекомендуемые пределы.', + 'media_oversized_multiple' => '%d изображений превышают рекомендуемые пределы.', + 'media_show_files' => 'Показать файлы (%d)', + 'media_hide_files' => 'Скрыть файлы (%d)', + 'media_open_file_manager' => 'Открыть файловый менеджер', + 'media_view_image' => 'Просмотреть изображение', + 'media_more_files' => 'Есть дополнительные изображения слишком большого размера; список ограничен.', + 'media_partial_scan' => 'Сканирование файловой системы достигло безопасного предела.', + + // Daily log archives + 'log_archive_title' => 'Архивы журналов', + 'log_archive_intro' => 'Monitor ежедневно ротирует файлы .log Geeklog и хранит архивы за последние %d дней.', + 'log_archive_safety' => 'Активный журнал обрезается только после успешной записи архивной копии. Архивы хранятся под path_data, вне публичного веб-каталога.', + 'log_archive_empty' => 'Ежедневный архив журнала пока недоступен. Первый запланированный запуск создаёт базовую точку ротации; архивы появятся после следующего календарного дня.', + 'log_archive_date' => 'Дата', + 'log_archive_log' => 'Журнал', + 'log_archive_size' => 'Размер', + 'log_archive_actions' => 'Действия', + 'log_archive_view' => 'Просмотр', + 'log_archive_download' => 'Скачать', + 'log_archive_back' => 'Назад к архивам журналов', + 'log_archive_preview_limited' => 'Этот предварительный просмотр показывает только последние 512 КиБ архива. Скачайте файл, чтобы получить полный ежедневный журнал.', + 'log_email_title' => 'Ежедневная сводка журнала', + 'log_email_lines' => 'Просканировано строк', + 'log_email_issue_lines' => 'Строки ошибок/предупреждений', + 'log_email_top_patterns' => 'Основные шаблоны error.log', + 'log_email_no_activity' => 'За этот день не было архивировано ни одного непустого журнала Geeklog.', + + // Changes monitor + 'changes' => 'Изменения', + 'changes_page_title' => 'Изменения Monitor', + 'changes_intro' => 'Сравнивает лёгкие снимки сайта, чтобы увидеть изменения между двумя проверками. Monitor записывает только состояние и не изменяет сайт.', + 'changes_capture' => 'Сохранить текущее состояние', + 'changes_capture_ok' => 'Текущее состояние сохранено.', + 'changes_capture_failed' => 'Monitor не смог сохранить снимок. Проверьте, доступен ли path_data для записи.', + 'changes_baseline_created' => 'Базовая точка создана. Позже сохраните ещё одно состояние, чтобы увидеть изменения.', + 'changes_waiting' => 'Для сравнения изменений требуется второй снимок.', + 'changes_period' => 'Сравниваемый период:', + 'changes_previous' => 'Предыдущее', + 'changes_current' => 'Текущее', + 'changes_summary_changes' => 'Изменения', + 'changes_summary_plugins' => 'Изменения плагинов', + 'changes_summary_log' => 'Новые шаблоны журнала', + 'changes_summary_snapshots' => 'Снимки', + 'changes_none' => 'Между этими двумя снимками не обнаружено существенных изменений.', + 'changes_detected' => 'Обнаруженные изменения', + 'changes_environment' => 'Среда', + 'changes_plugins' => 'Плагины', + 'changes_storage' => 'Хранилище', + 'changes_logs' => 'Новая активность error.log', + 'changes_before' => 'До', + 'changes_after' => 'После', + 'changes_occurrences' => 'случай(ев)', + 'changes_log_none' => 'За этот период в error.log не обнаружено новых шаблонов ошибок, предупреждений или исключений.', + 'changes_log_rotated' => 'Между двумя снимками error.log был ротирован или обрезан, поэтому новый фрагмент нельзя надёжно сравнить.', + 'changes_log_truncated' => 'Новые данные журнала превысили предел анализа. Monitor проанализировал только последние 512 КиБ.', + 'changes_current_state' => 'Текущее состояние', + 'changes_geeklog' => 'Geeklog', + 'changes_php' => 'PHP', + 'changes_plugins_count' => 'Установленные плагины', + 'changes_disk_free' => 'Свободное место на диске', + 'changes_error_log_size' => 'Размер error.log', + 'changes_unknown' => 'Неизвестно', + 'changes_enabled' => 'включено', + 'changes_disabled' => 'выключено', + 'changes_code_geeklog_changed' => 'Версия Geeklog изменена', + 'changes_code_php_changed' => 'Версия PHP изменена', + 'changes_code_plugin_installed' => 'Плагин установлен', + 'changes_code_plugin_removed' => 'Плагин удалён', + 'changes_code_plugin_version_changed' => 'Версия плагина изменена', + 'changes_code_plugin_enabled' => 'Плагин включён', + 'changes_code_plugin_disabled' => 'Плагин выключен', + 'changes_code_disk_free_decreased' => 'Свободное место на диске уменьшилось', + + // Configuration audit + 'config_audit_title' => 'Аудит конфигурации', + 'config_audit_page_title' => 'Аудит конфигурации Monitor', + 'config_audit_quick_description' => 'Проверяет различия между siteconfig.php и соответствующими значениями Core в базе данных.', + 'config_audit_back' => 'Обзор Monitor', + 'config_audit_access_denied' => 'Доступ запрещён', + 'config_audit_root_only' => 'Доступ разрешён только администраторам Root.', + 'config_audit_intro_title' => 'Аудит конфигурации только для чтения.', + 'config_audit_intro' => 'Сравнивает значения Core, явно заданные в siteconfig.php, с соответствующими значениями в conf_values. Внимания требуют только различия или недопустимые значения.', + 'config_audit_issues' => 'Проблемы', + 'config_audit_review' => 'Проверить', + 'config_audit_normal' => 'Норма', + 'config_audit_active_host' => 'Хост:', + 'config_audit_siteconfig' => 'siteconfig.php:', + 'config_audit_unreadable_title' => 'Предупреждение:', + 'config_audit_unreadable' => 'Monitor не смог прочитать активный siteconfig.php, поэтому сравнение неполное.', + 'config_audit_items_review' => 'Требует внимания', + 'config_audit_no_issues' => 'Конфигурация согласована. Конфликтующих значений Core, требующих внимания, нет.', + 'config_audit_secondary' => 'Показать %d нормальных или информационных значений', + 'config_audit_footer' => 'Чувствительные значения скрыты. Необязательный SQL для выравнивания базы никогда не выполняется автоматически.', + 'config_audit_source_siteconfig' => 'siteconfig.php', + 'config_audit_source_database' => 'База данных', + 'config_audit_priority' => 'Действующий источник:', + 'config_audit_effective_value' => 'Действующее значение', + 'config_audit_details' => 'Подробности', + 'config_audit_recommendation' => 'Рекомендация', + 'config_audit_path' => 'Путь:', + 'config_audit_path_exists' => 'существует', + 'config_audit_path_missing' => 'отсутствует', + 'config_audit_optional_sql' => 'Необязательное выравнивание базы данных', + 'config_audit_absent' => 'ОТСУТСТВУЕТ', + 'config_audit_redacted' => '[СКРЫТО]', + 'config_audit_value_true' => 'истина', + 'config_audit_value_false' => 'ложь', + 'config_audit_value_null' => 'NULL', + 'config_audit_value_object' => '[OBJECT]', + + 'config_audit_level_ok' => 'Ожидается', + 'config_audit_level_info' => 'Информация', + 'config_audit_level_review' => 'Проверить', + 'config_audit_level_warning' => 'Предупреждение', + + 'config_audit_status_identical' => 'Идентично', + 'config_audit_status_core_file' => 'Ожидается в siteconfig.php', + 'config_audit_status_file_only' => 'Только siteconfig.php', + 'config_audit_status_db_unset' => 'Значение базы не задано', + 'config_audit_status_different' => 'Разные значения', + 'config_audit_status_decode_error' => 'Значение базы не читается', + 'config_audit_status_invalid_path' => 'Недопустимый путь', + + 'config_audit_why_identical' => 'Одинаковое значение существует в siteconfig.php и conf_values.', + 'config_audit_why_core_file' => 'Этот ключ Core обычно определяется непосредственно в siteconfig.php.', + 'config_audit_why_file_only' => 'В conf_values нет соответствующего значения Core. Используется значение siteconfig.php.', + 'config_audit_why_db_unset' => 'В conf_values существует соответствующая строка Core, но её значение не задано. siteconfig.php остаётся действующим.', + 'config_audit_why_different' => 'siteconfig.php и conf_values содержат разные значения. Во время выполнения действует siteconfig.php.', + 'config_audit_why_decode_error' => 'Соответствующее значение Core в conf_values не удалось надёжно декодировать.', + 'config_audit_why_invalid_path' => 'Действующий путь файловой системы сейчас не существует.', + + 'config_audit_action_none' => 'Действия не требуются.', + 'config_audit_action_file_only' => 'Действия не требуются, если это значение не должно также управляться в базе данных.', + 'config_audit_action_db_unset' => 'Проверьте, что значение базы данных намеренно не задано.', + 'config_audit_action_different' => 'Проверьте, что переопределение сделано намеренно. Выравнивайте значение базы только если сохранённое значение устарело.', + 'config_audit_action_decode_error' => 'Перед изменениями проверьте соответствующую строку Core в conf_values.', + 'config_audit_action_invalid_path' => 'Проверьте настроенный путь и доступность файловой системы.', + + // Plugin catalog + 'plugin_catalog_intro' => 'Установленные плагины сравниваются с публичными репозиториями настроенного владельца GitHub. Monitor сообщает о доступных версиях и кандидатах, но никогда не устанавливает и не обновляет код.', + 'plugin_catalog_owner' => 'Источник GitHub:', + 'plugin_catalog_refresh' => 'Обновить данные GitHub', + 'plugin_catalog_installed' => 'Установленные плагины', + 'plugin_catalog_discover' => 'Найти плагины', + 'plugin_catalog_discover_compatible' => 'Совместимо с этим сайтом', + 'plugin_catalog_discover_incompatible' => 'Несовместимо с этим сайтом', + 'plugin_catalog_discover_unknown' => 'Совместимость неизвестна', + 'plugin_catalog_discover_requirements_missing' => 'Требования не указаны', + 'plugin_catalog_discover_metadata_unavailable' => 'Метаданные недоступны', + 'plugin_catalog_discover_intro' => 'Недавние публичные репозитории, не установленные на этом сайте. Перед установкой проверьте совместимость и документацию.', + 'plugin_catalog_legacy_discover' => 'Старые репозитории', + 'plugin_catalog_legacy_intro' => 'Старые публичные репозитории могут быть полезны, но их совместимость с современными версиями Geeklog и PHP неизвестна.', + 'plugin_catalog_plugin' => 'Плагин', + 'plugin_catalog_core_plugin' => 'Плагин Core', + 'plugin_catalog_core_update' => 'Доступно с обновлением Geeklog', + 'plugin_catalog_latest_core_version' => 'Последняя версия Core', + 'plugin_catalog_current_geeklog' => 'Текущий Geeklog', + 'plugin_catalog_latest_geeklog_baseline' => 'Последняя базовая версия Geeklog', + 'plugin_catalog_open_core_plugin' => 'Открыть плагин Core', + 'plugin_catalog_version' => 'Версия', + 'plugin_catalog_bundled_with_geeklog' => 'Поставляется с Geeklog', + 'plugin_catalog_available_with_geeklog' => 'Доступно с Geeklog', + 'plugin_catalog_installed_version' => 'Установлен', + 'plugin_catalog_code_version' => 'Код', + 'plugin_catalog_latest_release' => 'Последний релиз', + 'plugin_catalog_latest_version' => 'Последняя версия GitHub', + 'plugin_catalog_version_source_release' => 'Релиз', + 'plugin_catalog_version_source_tag' => 'Тег', + 'plugin_catalog_state' => 'Состояние', + 'plugin_catalog_enabled' => 'Включено', + 'plugin_catalog_geeklog' => 'Требование Geeklog', + 'plugin_catalog_php_requirement' => 'Требование PHP', + 'plugin_catalog_update_compatible' => 'Обновление совместимо', + 'plugin_catalog_update_incompatible' => 'Обновление несовместимо', + 'plugin_catalog_compatibility_unknown' => 'Совместимость неизвестна', + 'plugin_catalog_repository' => 'Репозиторий', + 'plugin_catalog_yes' => 'Да', + 'plugin_catalog_no' => 'Нет', + 'plugin_catalog_unknown' => 'Неизвестно', + 'plugin_catalog_no_release' => 'Нет метаданных релиза', + 'plugin_catalog_no_version' => 'Релиз или тег версии не найден', + 'plugin_catalog_no_repository' => 'Соответствующий репозиторий не найден', + 'plugin_catalog_catalog_unavailable' => 'Каталог GitHub недоступен', + 'plugin_catalog_current_compatible' => 'Актуально для этого Geeklog', + 'plugin_catalog_latest_compatible_version' => 'Последняя совместимая версия', + 'plugin_catalog_newer_release' => 'Более новый релиз', + 'plugin_catalog_requires_geeklog' => 'требуется Geeklog %s', + 'plugin_catalog_requires_php' => 'требуется PHP %s', + 'plugin_catalog_current' => 'Актуально', + 'plugin_catalog_update' => 'Доступно обновление', + 'plugin_catalog_ahead' => 'Установленная версия новее', + 'plugin_catalog_remote_unavailable' => 'Метаданные GitHub недоступны. Локальная информация о плагине всё равно отображается.', + 'plugin_catalog_remote_disabled' => 'Удалённые проверки метаданных отключены, поскольку не настроен допустимый владелец GitHub.', + 'plugin_catalog_none_discoverable' => 'Для этого владельца GitHub не найдено дополнительных недавних репозиториев плагинов.', + 'plugin_catalog_open_repository' => 'Открыть репозиторий', + 'plugin_catalog_open_release' => 'Открыть релиз', + 'plugin_catalog_open_version' => 'Открыть версию', + 'plugin_catalog_updated' => 'Обновлено', + 'plugin_catalog_summary_installed' => 'Установлен', + 'plugin_catalog_summary_updates' => 'Доступны обновления', + 'plugin_catalog_summary_discover' => 'Недавние кандидаты', + 'plugin_catalog_summary_unmatched' => 'Без совпадения GitHub'); + +$PLG_monitor_MESSAGE3002 = $LANG32[9]; +$PLG_monitor_MESSAGE3003 = 'Monitor не смог завершить миграцию базы данных. Установленная версия не была изменена; проверьте error.log и повторите обновление.'; + +$GLOBALS['LANG_configsections']['monitor'] = array( + 'label' => 'Monitor', + 'title' => 'Конфигурация Monitor' +); + +$GLOBALS['LANG_configsubgroups']['monitor'] = array( + 'sg_main' => 'Основные настройки' +); + +$GLOBALS['LANG_tab']['monitor'] = array( + 'tab_main' => 'Основное' +); + +$GLOBALS['LANG_fs']['monitor'] = array( + 'fs_main' => 'Общие настройки' +); + +$GLOBALS['LANG_confignames']['monitor'] = array( + 'emails' => 'Список адресов электронной почты для необязательных уведомлений Monitor (через запятую)', + 'repository' => 'Владелец репозитория GitHub для метаданных релизов плагинов (по умолчанию: Geeklog-Plugins). Оставьте пустым, чтобы отключить удалённые проверки метаданных.', + 'github_token' => 'Необязательный токен GitHub для запросов метаданных API. Предпочтителен токен только для чтения с точными разрешениями. Переменная окружения MONITOR_GITHUB_TOKEN имеет приоритет.' +); + +$LANG_configsections =& $GLOBALS['LANG_configsections']; +$LANG_configsubgroups =& $GLOBALS['LANG_configsubgroups']; +$LANG_tab =& $GLOBALS['LANG_tab']; +$LANG_fs =& $GLOBALS['LANG_fs']; +$LANG_confignames =& $GLOBALS['LANG_confignames']; From 5061e81a5366b2d92e039dfa8d37783a3f061e76 Mon Sep 17 00:00:00 2001 From: Ben Date: Mon, 5 Oct 2026 11:11:27 +0700 Subject: [PATCH 12/23] Add spanish_argentina translation for Monitor 1.5.0 --- language/spanish_argentina_utf-8.php | 295 +++++++++++++++++++++++++++ 1 file changed, 295 insertions(+) create mode 100644 language/spanish_argentina_utf-8.php diff --git a/language/spanish_argentina_utf-8.php b/language/spanish_argentina_utf-8.php new file mode 100644 index 0000000..dd1b891 --- /dev/null +++ b/language/spanish_argentina_utf-8.php @@ -0,0 +1,295 @@ + 'Monitor', + 'home' => 'Resumen', + 'health' => 'Salud', + 'security' => 'Seguridad', + 'file' => 'Archivo:', + 'log_file' => 'Archivo de registro:', + 'view_logs' => 'Ver registros actuales', + 'clear_logs' => 'Borrar registros', + 'configuration' => 'Configuración', + 'main' => 'Resumen del estado del sitio', + 'logs' => 'Archivos de registro', + 'updates' => 'Plugins', + 'status' => 'Estado', + 'check' => 'Comprobación', + 'value' => 'Valor', + 'recommendation' => 'Recomendación', + 'health_ok' => 'OK', + 'health_info' => 'Información', + 'health_warning' => 'Advertencia', + 'health_error' => 'Error', + 'security_observations' => 'Observaciones de seguridad', + 'ban_integration' => 'Plugin Ban', + 'legacy_ban_notice' => 'Monitor registra observaciones de seguridad limitadas. El plugin opcional Ban puede proporcionar funciones de bloqueo centralizadas sin convertir Monitor en un segundo motor de bloqueo.', + 'security_status' => 'Estado de seguridad', + 'security_no_issue' => 'No se detectó ningún problema con las comprobaciones de seguridad disponibles de Monitor.', + 'ban_not_installed' => 'No instalado', + 'ban_installed' => 'Instalado', + 'ban_optional_intro' => 'Ban es opcional. Monitor continúa registrando sus observaciones de seguridad limitadas sin él.', + 'ban_optional_capability' => 'Instalar Ban añade funciones de bloqueo centralizadas que Monitor puede utilizar cuando estén disponibles.', + 'ban_view_plugin' => 'Ver información del plugin Ban', + 'ban_version' => 'Versión', + 'ban_ip_capability' => 'Capacidad de solicitud de bloqueo de IP', + 'ban_capability_available' => 'Disponible', + 'ban_capability_unavailable' => 'No disponible', + 'ban_direct_sql' => 'Acoplamiento SQL directo con Ban', + 'ban_direct_sql_no' => 'No', + 'security_no_legacy_table' => 'No existe ninguna tabla de seguridad heredada de Monitor.', + 'security_no_observations' => 'No hay observaciones de seguridad recientes.', + 'read_only_advice' => 'De forma predeterminada, Monitor observa y recomienda. Los cambios requieren una acción explícita de un administrador.', + 'config_tooltip_emails' => 'Destinatarios opcionales de las notificaciones de Monitor, separados por comas. Dejalo vacío para desactivar las notificaciones por correo electrónico.', + 'config_tooltip_repository' => 'Propietario de GitHub cuyos repositorios públicos revisa Monitor para obtener metadatos y versiones de plugins. Dejalo vacío para desactivar las comprobaciones remotas.', + 'config_tooltip_github_token' => 'Token de GitHub opcional, detallado y de solo lectura. MONITOR_GITHUB_TOKEN tiene prioridad. Las comprobaciones autenticadas disponen de una cuota de API mayor y usan una caché de etiquetas más corta.', + + // Media diagnostics + 'media_oversized_single' => '1 imagen supera los límites recomendados.', + 'media_oversized_multiple' => '%d imágenes superan los límites recomendados.', + 'media_show_files' => 'Mostrar archivos (%d)', + 'media_hide_files' => 'Ocultar archivos (%d)', + 'media_open_file_manager' => 'Abrir gestor de archivos', + 'media_view_image' => 'Ver imagen', + 'media_more_files' => 'Hay más imágenes sobredimensionadas; la lista está limitada.', + 'media_partial_scan' => 'El análisis del sistema de archivos alcanzó su límite de seguridad.', + + // Daily log archives + 'log_archive_title' => 'Archivos de registros', + 'log_archive_intro' => 'Monitor rota diariamente los archivos .log de Geeklog y conserva los últimos %d días de archivos.', + 'log_archive_safety' => 'Un registro activo solo se trunca después de que su copia de archivo se haya escrito correctamente. Los archivos se guardan bajo path_data, fuera del directorio web público.', + 'log_archive_empty' => 'Todavía no hay ningún archivo diario de registro disponible. La primera ejecución programada crea la referencia de rotación; los archivos aparecen después del siguiente día natural.', + 'log_archive_date' => 'Fecha', + 'log_archive_log' => 'Registro', + 'log_archive_size' => 'Tamaño', + 'log_archive_actions' => 'Acciones', + 'log_archive_view' => 'Ver', + 'log_archive_download' => 'Descargar', + 'log_archive_back' => 'Volver a los archivos de registros', + 'log_archive_preview_limited' => 'Esta vista previa muestra solo los 512 KiB más recientes del archivo. Descargá el archivo para obtener el registro diario completo.', + 'log_email_title' => 'Resumen diario de registros', + 'log_email_lines' => 'Líneas analizadas', + 'log_email_issue_lines' => 'Líneas de error/advertencia', + 'log_email_top_patterns' => 'Principales patrones de error.log', + 'log_email_no_activity' => 'No se archivó ningún registro de Geeklog no vacío para este día.', + + // Changes monitor + 'changes' => 'Cambios', + 'changes_page_title' => 'Cambios de Monitor', + 'changes_intro' => 'Compare instantáneas ligeras del sitio para ver qué cambió entre dos comprobaciones. Monitor solo registra el estado; no modifica el sitio.', + 'changes_capture' => 'Capturar estado actual', + 'changes_capture_ok' => 'Estado actual guardado.', + 'changes_capture_failed' => 'Monitor no pudo guardar la instantánea. Revisá que path_data permite escritura.', + 'changes_baseline_created' => 'Referencia creada. Capturá otro estado más adelante para ver qué cambió.', + 'changes_waiting' => 'Se necesita una segunda instantánea antes de poder comparar los cambios.', + 'changes_period' => 'Periodo comparado:', + 'changes_previous' => 'Anterior', + 'changes_current' => 'Actual', + 'changes_summary_changes' => 'Cambios', + 'changes_summary_plugins' => 'Cambios de plugins', + 'changes_summary_log' => 'Nuevos patrones de registro', + 'changes_summary_snapshots' => 'Instantáneas', + 'changes_none' => 'No se detectó ningún cambio significativo entre estas dos instantáneas.', + 'changes_detected' => 'Cambios detectados', + 'changes_environment' => 'Entorno', + 'changes_plugins' => 'Plugins', + 'changes_storage' => 'Almacenamiento', + 'changes_logs' => 'Nueva actividad de error.log', + 'changes_before' => 'Antes', + 'changes_after' => 'Después', + 'changes_occurrences' => 'ocurrencia(s)', + 'changes_log_none' => 'No se detectó ningún patrón nuevo de error, advertencia o excepción en error.log durante este periodo.', + 'changes_log_rotated' => 'error.log se rotó o truncó entre las dos instantáneas, por lo que la nueva parte no puede compararse de forma fiable.', + 'changes_log_truncated' => 'Los nuevos datos del registro superaron el límite de análisis. Monitor analizó únicamente los 512 KiB más recientes.', + 'changes_current_state' => 'Estado actual', + 'changes_geeklog' => 'Geeklog', + 'changes_php' => 'PHP', + 'changes_plugins_count' => 'Plugins instalados', + 'changes_disk_free' => 'Espacio libre en disco', + 'changes_error_log_size' => 'Tamaño de error.log', + 'changes_unknown' => 'Desconocido', + 'changes_enabled' => 'activado', + 'changes_disabled' => 'desactivado', + 'changes_code_geeklog_changed' => 'Versión de Geeklog modificada', + 'changes_code_php_changed' => 'Versión de PHP modificada', + 'changes_code_plugin_installed' => 'Plugin instalado', + 'changes_code_plugin_removed' => 'Plugin eliminado', + 'changes_code_plugin_version_changed' => 'Versión del plugin modificada', + 'changes_code_plugin_enabled' => 'Plugin activado', + 'changes_code_plugin_disabled' => 'Plugin desactivado', + 'changes_code_disk_free_decreased' => 'Disminuyó el espacio libre en disco', + + // Configuration audit + 'config_audit_title' => 'Auditoría de configuración', + 'config_audit_page_title' => 'Auditoría de configuración de Monitor', + 'config_audit_quick_description' => 'Revisá las diferencias entre siteconfig.php y los valores Core correspondientes de la base de datos.', + 'config_audit_back' => 'Resumen de Monitor', + 'config_audit_access_denied' => 'Acceso denegado', + 'config_audit_root_only' => 'Acceso reservado a administradores Root.', + 'config_audit_intro_title' => 'Auditoría de configuración de solo lectura.', + 'config_audit_intro' => 'Compara los valores Core definidos explícitamente en siteconfig.php con los valores correspondientes de conf_values. Solo las diferencias o los valores no válidos requieren atención.', + 'config_audit_issues' => 'Problemas', + 'config_audit_review' => 'Revisar', + 'config_audit_normal' => 'Normal', + 'config_audit_active_host' => 'Host:', + 'config_audit_siteconfig' => 'siteconfig.php:', + 'config_audit_unreadable_title' => 'Advertencia:', + 'config_audit_unreadable' => 'Monitor no pudo leer el siteconfig.php activo, por lo que la comparación está incompleta.', + 'config_audit_items_review' => 'Requiere atención', + 'config_audit_no_issues' => 'La configuración es coherente. Ningún valor Core en conflicto requiere atención.', + 'config_audit_secondary' => 'Mostrar %d valor(es) normal(es) o informativo(s)', + 'config_audit_footer' => 'Los valores sensibles se ocultan. El SQL opcional de alineación de la base de datos nunca se ejecuta automáticamente.', + 'config_audit_source_siteconfig' => 'siteconfig.php', + 'config_audit_source_database' => 'Base de datos', + 'config_audit_priority' => 'Fuente efectiva:', + 'config_audit_effective_value' => 'Valor efectivo', + 'config_audit_details' => 'Detalles', + 'config_audit_recommendation' => 'Recomendación', + 'config_audit_path' => 'Ruta:', + 'config_audit_path_exists' => 'existe', + 'config_audit_path_missing' => 'falta', + 'config_audit_optional_sql' => 'Alineación opcional de la base de datos', + 'config_audit_absent' => 'AUSENTE', + 'config_audit_redacted' => '[OCULTO]', + 'config_audit_value_true' => 'verdadero', + 'config_audit_value_false' => 'falso', + 'config_audit_value_null' => 'NULL', + 'config_audit_value_object' => '[OBJECT]', + + 'config_audit_level_ok' => 'Esperado', + 'config_audit_level_info' => 'Información', + 'config_audit_level_review' => 'Revisar', + 'config_audit_level_warning' => 'Advertencia', + + 'config_audit_status_identical' => 'Idéntico', + 'config_audit_status_core_file' => 'Esperado en siteconfig.php', + 'config_audit_status_file_only' => 'Solo siteconfig.php', + 'config_audit_status_db_unset' => 'Valor de base de datos sin definir', + 'config_audit_status_different' => 'Valores diferentes', + 'config_audit_status_decode_error' => 'Valor de base de datos ilegible', + 'config_audit_status_invalid_path' => 'Ruta no válida', + + 'config_audit_why_identical' => 'El mismo valor existe en siteconfig.php y conf_values.', + 'config_audit_why_core_file' => 'Esta clave Core se define normalmente directamente en siteconfig.php.', + 'config_audit_why_file_only' => 'No existe ningún valor Core correspondiente en conf_values. Se utiliza el valor de siteconfig.php.', + 'config_audit_why_db_unset' => 'Existe una fila Core correspondiente en conf_values, pero su valor no está definido. siteconfig.php sigue siendo efectivo.', + 'config_audit_why_different' => 'siteconfig.php y conf_values contienen valores diferentes. siteconfig.php es efectivo en tiempo de ejecución.', + 'config_audit_why_decode_error' => 'El valor Core correspondiente en conf_values no pudo decodificarse de forma fiable.', + 'config_audit_why_invalid_path' => 'La ruta efectiva del sistema de archivos no existe actualmente.', + + 'config_audit_action_none' => 'No se requiere ninguna acción.', + 'config_audit_action_file_only' => 'No se requiere ninguna acción salvo que este valor también deba gestionarse en la base de datos.', + 'config_audit_action_db_unset' => 'Verificá que el valor de la base de datos esté sin definir intencionadamente.', + 'config_audit_action_different' => 'Verificá que esta sobrescritura sea intencionada. Alinee el valor de la base de datos solo si el valor almacenado está obsoleto.', + 'config_audit_action_decode_error' => 'Revisá la fila Core correspondiente en conf_values antes de realizar cambios.', + 'config_audit_action_invalid_path' => 'Revisá la ruta configurada y la disponibilidad del sistema de archivos.', + + // Plugin catalog + 'plugin_catalog_intro' => 'Los plugins instalados se comparan con los repositorios públicos del propietario de GitHub configurado. Monitor informa de versiones disponibles y candidatos descubiertos, pero nunca instala ni actualiza código.', + 'plugin_catalog_owner' => 'Fuente de GitHub:', + 'plugin_catalog_refresh' => 'Actualizar datos de GitHub', + 'plugin_catalog_installed' => 'Plugins instalados', + 'plugin_catalog_discover' => 'Descubrir plugins', + 'plugin_catalog_discover_compatible' => 'Compatible con este sitio', + 'plugin_catalog_discover_incompatible' => 'No compatible con este sitio', + 'plugin_catalog_discover_unknown' => 'Compatibilidad desconocida', + 'plugin_catalog_discover_requirements_missing' => 'Requisitos no declarados', + 'plugin_catalog_discover_metadata_unavailable' => 'Metadatos no disponibles', + 'plugin_catalog_discover_intro' => 'Repositorios públicos recientes no instalados en este sitio. Revise la compatibilidad y la documentación antes de instalar nada.', + 'plugin_catalog_legacy_discover' => 'Repositorios antiguos', + 'plugin_catalog_legacy_intro' => 'Los repositorios públicos antiguos aún pueden ser útiles, pero se desconoce su compatibilidad con versiones recientes de Geeklog y PHP.', + 'plugin_catalog_plugin' => 'Plugin', + 'plugin_catalog_core_plugin' => 'Plugin Core', + 'plugin_catalog_core_update' => 'Disponible con la actualización de Geeklog', + 'plugin_catalog_latest_core_version' => 'Última versión Core', + 'plugin_catalog_current_geeklog' => 'Geeklog actual', + 'plugin_catalog_latest_geeklog_baseline' => 'Última referencia de Geeklog', + 'plugin_catalog_open_core_plugin' => 'Abrir plugin Core', + 'plugin_catalog_version' => 'Versión', + 'plugin_catalog_bundled_with_geeklog' => 'Incluido con Geeklog', + 'plugin_catalog_available_with_geeklog' => 'Disponible con Geeklog', + 'plugin_catalog_installed_version' => 'Instalado', + 'plugin_catalog_code_version' => 'Código', + 'plugin_catalog_latest_release' => 'Última versión publicada', + 'plugin_catalog_latest_version' => 'Última versión de GitHub', + 'plugin_catalog_version_source_release' => 'Versión publicada', + 'plugin_catalog_version_source_tag' => 'Etiqueta', + 'plugin_catalog_state' => 'Estado', + 'plugin_catalog_enabled' => 'Activado', + 'plugin_catalog_geeklog' => 'Requisito de Geeklog', + 'plugin_catalog_php_requirement' => 'Requisito de PHP', + 'plugin_catalog_update_compatible' => 'Actualización compatible', + 'plugin_catalog_update_incompatible' => 'Actualización no compatible', + 'plugin_catalog_compatibility_unknown' => 'Compatibilidad desconocida', + 'plugin_catalog_repository' => 'Repositorio', + 'plugin_catalog_yes' => 'Sí', + 'plugin_catalog_no' => 'No', + 'plugin_catalog_unknown' => 'Desconocido', + 'plugin_catalog_no_release' => 'Sin metadatos de versión', + 'plugin_catalog_no_version' => 'No se encontró ninguna versión publicada ni etiqueta de versión', + 'plugin_catalog_no_repository' => 'No hay repositorio coincidente', + 'plugin_catalog_catalog_unavailable' => 'Catálogo de GitHub no disponible', + 'plugin_catalog_current_compatible' => 'Actualizado para este Geeklog', + 'plugin_catalog_latest_compatible_version' => 'Última versión compatible', + 'plugin_catalog_newer_release' => 'Versión más reciente', + 'plugin_catalog_requires_geeklog' => 'requiere Geeklog %s', + 'plugin_catalog_requires_php' => 'requiere PHP %s', + 'plugin_catalog_current' => 'Actualizado', + 'plugin_catalog_update' => 'Actualización disponible', + 'plugin_catalog_ahead' => 'Versión instalada más reciente', + 'plugin_catalog_remote_unavailable' => 'Los metadatos de GitHub no están disponibles. La información local del plugin sigue mostrándose.', + 'plugin_catalog_remote_disabled' => 'Las comprobaciones remotas de metadatos están desactivadas porque no hay ningún propietario de GitHub válido configurado.', + 'plugin_catalog_none_discoverable' => 'No se encontró ningún repositorio adicional reciente de plugins para este propietario de GitHub.', + 'plugin_catalog_open_repository' => 'Abrir repositorio', + 'plugin_catalog_open_release' => 'Abrir versión publicada', + 'plugin_catalog_open_version' => 'Abrir versión', + 'plugin_catalog_updated' => 'Actualizado', + 'plugin_catalog_summary_installed' => 'Instalado', + 'plugin_catalog_summary_updates' => 'Actualizaciones disponibles', + 'plugin_catalog_summary_discover' => 'Candidatos recientes', + 'plugin_catalog_summary_unmatched' => 'Sin coincidencia en GitHub'); + +$PLG_monitor_MESSAGE3002 = $LANG32[9]; +$PLG_monitor_MESSAGE3003 = 'Monitor no pudo completar la migración de la base de datos. La versión instalada no cambió; revise error.log y vuelva a intentar la actualización.'; + +$GLOBALS['LANG_configsections']['monitor'] = array( + 'label' => 'Monitor', + 'title' => 'Configuración de Monitor' +); + +$GLOBALS['LANG_configsubgroups']['monitor'] = array( + 'sg_main' => 'Configuración principal' +); + +$GLOBALS['LANG_tab']['monitor'] = array( + 'tab_main' => 'Principal' +); + +$GLOBALS['LANG_fs']['monitor'] = array( + 'fs_main' => 'Configuración general' +); + +$GLOBALS['LANG_confignames']['monitor'] = array( + 'emails' => 'Lista de direcciones de correo electrónico para notificaciones opcionales de Monitor (separadas por comas)', + 'repository' => 'Propietario del repositorio de GitHub reservado para metadatos de versiones de plugins (predeterminado: Geeklog-Plugins). Dejalo vacío para desactivar las comprobaciones remotas de metadatos.', + 'github_token' => 'Token de GitHub opcional para solicitudes de metadatos de la API. Se recomienda un token de solo lectura con permisos específicos. La variable de entorno MONITOR_GITHUB_TOKEN tiene prioridad.' +); + +$LANG_configsections =& $GLOBALS['LANG_configsections']; +$LANG_configsubgroups =& $GLOBALS['LANG_configsubgroups']; +$LANG_tab =& $GLOBALS['LANG_tab']; +$LANG_fs =& $GLOBALS['LANG_fs']; +$LANG_confignames =& $GLOBALS['LANG_confignames']; From b813da9eb38c5445bff9d6abfeb355bd95c5927a Mon Sep 17 00:00:00 2001 From: Ben Date: Mon, 5 Oct 2026 11:11:30 +0700 Subject: [PATCH 13/23] Add spanish translation for Monitor 1.5.0 --- language/spanish_utf-8.php | 295 +++++++++++++++++++++++++++++++++++++ 1 file changed, 295 insertions(+) create mode 100644 language/spanish_utf-8.php diff --git a/language/spanish_utf-8.php b/language/spanish_utf-8.php new file mode 100644 index 0000000..cfb5838 --- /dev/null +++ b/language/spanish_utf-8.php @@ -0,0 +1,295 @@ + 'Monitor', + 'home' => 'Resumen', + 'health' => 'Salud', + 'security' => 'Seguridad', + 'file' => 'Archivo:', + 'log_file' => 'Archivo de registro:', + 'view_logs' => 'Ver registros actuales', + 'clear_logs' => 'Borrar registros', + 'configuration' => 'Configuración', + 'main' => 'Resumen del estado del sitio', + 'logs' => 'Archivos de registro', + 'updates' => 'Plugins', + 'status' => 'Estado', + 'check' => 'Comprobación', + 'value' => 'Valor', + 'recommendation' => 'Recomendación', + 'health_ok' => 'OK', + 'health_info' => 'Información', + 'health_warning' => 'Advertencia', + 'health_error' => 'Error', + 'security_observations' => 'Observaciones de seguridad', + 'ban_integration' => 'Plugin Ban', + 'legacy_ban_notice' => 'Monitor registra observaciones de seguridad limitadas. El plugin opcional Ban puede proporcionar funciones de bloqueo centralizadas sin convertir Monitor en un segundo motor de bloqueo.', + 'security_status' => 'Estado de seguridad', + 'security_no_issue' => 'No se detectó ningún problema con las comprobaciones de seguridad disponibles de Monitor.', + 'ban_not_installed' => 'No instalado', + 'ban_installed' => 'Instalado', + 'ban_optional_intro' => 'Ban es opcional. Monitor continúa registrando sus observaciones de seguridad limitadas sin él.', + 'ban_optional_capability' => 'Instalar Ban añade funciones de bloqueo centralizadas que Monitor puede utilizar cuando estén disponibles.', + 'ban_view_plugin' => 'Ver información del plugin Ban', + 'ban_version' => 'Versión', + 'ban_ip_capability' => 'Capacidad de solicitud de bloqueo de IP', + 'ban_capability_available' => 'Disponible', + 'ban_capability_unavailable' => 'No disponible', + 'ban_direct_sql' => 'Acoplamiento SQL directo con Ban', + 'ban_direct_sql_no' => 'No', + 'security_no_legacy_table' => 'No existe ninguna tabla de seguridad heredada de Monitor.', + 'security_no_observations' => 'No hay observaciones de seguridad recientes.', + 'read_only_advice' => 'De forma predeterminada, Monitor observa y recomienda. Los cambios requieren una acción explícita de un administrador.', + 'config_tooltip_emails' => 'Destinatarios opcionales de las notificaciones de Monitor, separados por comas. Déjalo vacío para desactivar las notificaciones por correo electrónico.', + 'config_tooltip_repository' => 'Propietario de GitHub cuyos repositorios públicos revisa Monitor para obtener metadatos y versiones de plugins. Déjalo vacío para desactivar las comprobaciones remotas.', + 'config_tooltip_github_token' => 'Token de GitHub opcional, detallado y de solo lectura. MONITOR_GITHUB_TOKEN tiene prioridad. Las comprobaciones autenticadas disponen de una cuota de API mayor y usan una caché de etiquetas más corta.', + + // Media diagnostics + 'media_oversized_single' => '1 imagen supera los límites recomendados.', + 'media_oversized_multiple' => '%d imágenes superan los límites recomendados.', + 'media_show_files' => 'Mostrar archivos (%d)', + 'media_hide_files' => 'Ocultar archivos (%d)', + 'media_open_file_manager' => 'Abrir gestor de archivos', + 'media_view_image' => 'Ver imagen', + 'media_more_files' => 'Hay más imágenes sobredimensionadas; la lista está limitada.', + 'media_partial_scan' => 'El análisis del sistema de archivos alcanzó su límite de seguridad.', + + // Daily log archives + 'log_archive_title' => 'Archivos de registros', + 'log_archive_intro' => 'Monitor rota diariamente los archivos .log de Geeklog y conserva los últimos %d días de archivos.', + 'log_archive_safety' => 'Un registro activo solo se trunca después de que su copia de archivo se haya escrito correctamente. Los archivos se guardan bajo path_data, fuera del directorio web público.', + 'log_archive_empty' => 'Todavía no hay ningún archivo diario de registro disponible. La primera ejecución programada crea la referencia de rotación; los archivos aparecen después del siguiente día natural.', + 'log_archive_date' => 'Fecha', + 'log_archive_log' => 'Registro', + 'log_archive_size' => 'Tamaño', + 'log_archive_actions' => 'Acciones', + 'log_archive_view' => 'Ver', + 'log_archive_download' => 'Descargar', + 'log_archive_back' => 'Volver a los archivos de registros', + 'log_archive_preview_limited' => 'Esta vista previa muestra solo los 512 KiB más recientes del archivo. Descargue el archivo para obtener el registro diario completo.', + 'log_email_title' => 'Resumen diario de registros', + 'log_email_lines' => 'Líneas analizadas', + 'log_email_issue_lines' => 'Líneas de error/advertencia', + 'log_email_top_patterns' => 'Principales patrones de error.log', + 'log_email_no_activity' => 'No se archivó ningún registro de Geeklog no vacío para este día.', + + // Changes monitor + 'changes' => 'Cambios', + 'changes_page_title' => 'Cambios de Monitor', + 'changes_intro' => 'Compare instantáneas ligeras del sitio para ver qué cambió entre dos comprobaciones. Monitor solo registra el estado; no modifica el sitio.', + 'changes_capture' => 'Capturar estado actual', + 'changes_capture_ok' => 'Estado actual guardado.', + 'changes_capture_failed' => 'Monitor no pudo guardar la instantánea. Compruebe que path_data permite escritura.', + 'changes_baseline_created' => 'Referencia creada. Capture otro estado más adelante para ver qué cambió.', + 'changes_waiting' => 'Se necesita una segunda instantánea antes de poder comparar los cambios.', + 'changes_period' => 'Periodo comparado:', + 'changes_previous' => 'Anterior', + 'changes_current' => 'Actual', + 'changes_summary_changes' => 'Cambios', + 'changes_summary_plugins' => 'Cambios de plugins', + 'changes_summary_log' => 'Nuevos patrones de registro', + 'changes_summary_snapshots' => 'Instantáneas', + 'changes_none' => 'No se detectó ningún cambio significativo entre estas dos instantáneas.', + 'changes_detected' => 'Cambios detectados', + 'changes_environment' => 'Entorno', + 'changes_plugins' => 'Plugins', + 'changes_storage' => 'Almacenamiento', + 'changes_logs' => 'Nueva actividad de error.log', + 'changes_before' => 'Antes', + 'changes_after' => 'Después', + 'changes_occurrences' => 'ocurrencia(s)', + 'changes_log_none' => 'No se detectó ningún patrón nuevo de error, advertencia o excepción en error.log durante este periodo.', + 'changes_log_rotated' => 'error.log se rotó o truncó entre las dos instantáneas, por lo que la nueva parte no puede compararse de forma fiable.', + 'changes_log_truncated' => 'Los nuevos datos del registro superaron el límite de análisis. Monitor analizó únicamente los 512 KiB más recientes.', + 'changes_current_state' => 'Estado actual', + 'changes_geeklog' => 'Geeklog', + 'changes_php' => 'PHP', + 'changes_plugins_count' => 'Plugins instalados', + 'changes_disk_free' => 'Espacio libre en disco', + 'changes_error_log_size' => 'Tamaño de error.log', + 'changes_unknown' => 'Desconocido', + 'changes_enabled' => 'activado', + 'changes_disabled' => 'desactivado', + 'changes_code_geeklog_changed' => 'Versión de Geeklog modificada', + 'changes_code_php_changed' => 'Versión de PHP modificada', + 'changes_code_plugin_installed' => 'Plugin instalado', + 'changes_code_plugin_removed' => 'Plugin eliminado', + 'changes_code_plugin_version_changed' => 'Versión del plugin modificada', + 'changes_code_plugin_enabled' => 'Plugin activado', + 'changes_code_plugin_disabled' => 'Plugin desactivado', + 'changes_code_disk_free_decreased' => 'Disminuyó el espacio libre en disco', + + // Configuration audit + 'config_audit_title' => 'Auditoría de configuración', + 'config_audit_page_title' => 'Auditoría de configuración de Monitor', + 'config_audit_quick_description' => 'Compruebe las diferencias entre siteconfig.php y los valores Core correspondientes de la base de datos.', + 'config_audit_back' => 'Resumen de Monitor', + 'config_audit_access_denied' => 'Acceso denegado', + 'config_audit_root_only' => 'Acceso reservado a administradores Root.', + 'config_audit_intro_title' => 'Auditoría de configuración de solo lectura.', + 'config_audit_intro' => 'Compara los valores Core definidos explícitamente en siteconfig.php con los valores correspondientes de conf_values. Solo las diferencias o los valores no válidos requieren atención.', + 'config_audit_issues' => 'Problemas', + 'config_audit_review' => 'Revisar', + 'config_audit_normal' => 'Normal', + 'config_audit_active_host' => 'Host:', + 'config_audit_siteconfig' => 'siteconfig.php:', + 'config_audit_unreadable_title' => 'Advertencia:', + 'config_audit_unreadable' => 'Monitor no pudo leer el siteconfig.php activo, por lo que la comparación está incompleta.', + 'config_audit_items_review' => 'Requiere atención', + 'config_audit_no_issues' => 'La configuración es coherente. Ningún valor Core en conflicto requiere atención.', + 'config_audit_secondary' => 'Mostrar %d valor(es) normal(es) o informativo(s)', + 'config_audit_footer' => 'Los valores sensibles se ocultan. El SQL opcional de alineación de la base de datos nunca se ejecuta automáticamente.', + 'config_audit_source_siteconfig' => 'siteconfig.php', + 'config_audit_source_database' => 'Base de datos', + 'config_audit_priority' => 'Fuente efectiva:', + 'config_audit_effective_value' => 'Valor efectivo', + 'config_audit_details' => 'Detalles', + 'config_audit_recommendation' => 'Recomendación', + 'config_audit_path' => 'Ruta:', + 'config_audit_path_exists' => 'existe', + 'config_audit_path_missing' => 'falta', + 'config_audit_optional_sql' => 'Alineación opcional de la base de datos', + 'config_audit_absent' => 'AUSENTE', + 'config_audit_redacted' => '[OCULTO]', + 'config_audit_value_true' => 'verdadero', + 'config_audit_value_false' => 'falso', + 'config_audit_value_null' => 'NULL', + 'config_audit_value_object' => '[OBJECT]', + + 'config_audit_level_ok' => 'Esperado', + 'config_audit_level_info' => 'Información', + 'config_audit_level_review' => 'Revisar', + 'config_audit_level_warning' => 'Advertencia', + + 'config_audit_status_identical' => 'Idéntico', + 'config_audit_status_core_file' => 'Esperado en siteconfig.php', + 'config_audit_status_file_only' => 'Solo siteconfig.php', + 'config_audit_status_db_unset' => 'Valor de base de datos sin definir', + 'config_audit_status_different' => 'Valores diferentes', + 'config_audit_status_decode_error' => 'Valor de base de datos ilegible', + 'config_audit_status_invalid_path' => 'Ruta no válida', + + 'config_audit_why_identical' => 'El mismo valor existe en siteconfig.php y conf_values.', + 'config_audit_why_core_file' => 'Esta clave Core se define normalmente directamente en siteconfig.php.', + 'config_audit_why_file_only' => 'No existe ningún valor Core correspondiente en conf_values. Se utiliza el valor de siteconfig.php.', + 'config_audit_why_db_unset' => 'Existe una fila Core correspondiente en conf_values, pero su valor no está definido. siteconfig.php sigue siendo efectivo.', + 'config_audit_why_different' => 'siteconfig.php y conf_values contienen valores diferentes. siteconfig.php es efectivo en tiempo de ejecución.', + 'config_audit_why_decode_error' => 'El valor Core correspondiente en conf_values no pudo decodificarse de forma fiable.', + 'config_audit_why_invalid_path' => 'La ruta efectiva del sistema de archivos no existe actualmente.', + + 'config_audit_action_none' => 'No se requiere ninguna acción.', + 'config_audit_action_file_only' => 'No se requiere ninguna acción salvo que este valor también deba gestionarse en la base de datos.', + 'config_audit_action_db_unset' => 'Verifique que el valor de la base de datos esté sin definir intencionadamente.', + 'config_audit_action_different' => 'Verifique que esta sobrescritura sea intencionada. Alinee el valor de la base de datos solo si el valor almacenado está obsoleto.', + 'config_audit_action_decode_error' => 'Inspeccione la fila Core correspondiente en conf_values antes de realizar cambios.', + 'config_audit_action_invalid_path' => 'Compruebe la ruta configurada y la disponibilidad del sistema de archivos.', + + // Plugin catalog + 'plugin_catalog_intro' => 'Los plugins instalados se comparan con los repositorios públicos del propietario de GitHub configurado. Monitor informa de versiones disponibles y candidatos descubiertos, pero nunca instala ni actualiza código.', + 'plugin_catalog_owner' => 'Fuente de GitHub:', + 'plugin_catalog_refresh' => 'Actualizar datos de GitHub', + 'plugin_catalog_installed' => 'Plugins instalados', + 'plugin_catalog_discover' => 'Descubrir plugins', + 'plugin_catalog_discover_compatible' => 'Compatible con este sitio', + 'plugin_catalog_discover_incompatible' => 'No compatible con este sitio', + 'plugin_catalog_discover_unknown' => 'Compatibilidad desconocida', + 'plugin_catalog_discover_requirements_missing' => 'Requisitos no declarados', + 'plugin_catalog_discover_metadata_unavailable' => 'Metadatos no disponibles', + 'plugin_catalog_discover_intro' => 'Repositorios públicos recientes no instalados en este sitio. Revise la compatibilidad y la documentación antes de instalar nada.', + 'plugin_catalog_legacy_discover' => 'Repositorios antiguos', + 'plugin_catalog_legacy_intro' => 'Los repositorios públicos antiguos aún pueden ser útiles, pero se desconoce su compatibilidad con versiones recientes de Geeklog y PHP.', + 'plugin_catalog_plugin' => 'Plugin', + 'plugin_catalog_core_plugin' => 'Plugin Core', + 'plugin_catalog_core_update' => 'Disponible con la actualización de Geeklog', + 'plugin_catalog_latest_core_version' => 'Última versión Core', + 'plugin_catalog_current_geeklog' => 'Geeklog actual', + 'plugin_catalog_latest_geeklog_baseline' => 'Última referencia de Geeklog', + 'plugin_catalog_open_core_plugin' => 'Abrir plugin Core', + 'plugin_catalog_version' => 'Versión', + 'plugin_catalog_bundled_with_geeklog' => 'Incluido con Geeklog', + 'plugin_catalog_available_with_geeklog' => 'Disponible con Geeklog', + 'plugin_catalog_installed_version' => 'Instalado', + 'plugin_catalog_code_version' => 'Código', + 'plugin_catalog_latest_release' => 'Última versión publicada', + 'plugin_catalog_latest_version' => 'Última versión de GitHub', + 'plugin_catalog_version_source_release' => 'Versión publicada', + 'plugin_catalog_version_source_tag' => 'Etiqueta', + 'plugin_catalog_state' => 'Estado', + 'plugin_catalog_enabled' => 'Activado', + 'plugin_catalog_geeklog' => 'Requisito de Geeklog', + 'plugin_catalog_php_requirement' => 'Requisito de PHP', + 'plugin_catalog_update_compatible' => 'Actualización compatible', + 'plugin_catalog_update_incompatible' => 'Actualización no compatible', + 'plugin_catalog_compatibility_unknown' => 'Compatibilidad desconocida', + 'plugin_catalog_repository' => 'Repositorio', + 'plugin_catalog_yes' => 'Sí', + 'plugin_catalog_no' => 'No', + 'plugin_catalog_unknown' => 'Desconocido', + 'plugin_catalog_no_release' => 'Sin metadatos de versión', + 'plugin_catalog_no_version' => 'No se encontró ninguna versión publicada ni etiqueta de versión', + 'plugin_catalog_no_repository' => 'No hay repositorio coincidente', + 'plugin_catalog_catalog_unavailable' => 'Catálogo de GitHub no disponible', + 'plugin_catalog_current_compatible' => 'Actualizado para este Geeklog', + 'plugin_catalog_latest_compatible_version' => 'Última versión compatible', + 'plugin_catalog_newer_release' => 'Versión más reciente', + 'plugin_catalog_requires_geeklog' => 'requiere Geeklog %s', + 'plugin_catalog_requires_php' => 'requiere PHP %s', + 'plugin_catalog_current' => 'Actualizado', + 'plugin_catalog_update' => 'Actualización disponible', + 'plugin_catalog_ahead' => 'Versión instalada más reciente', + 'plugin_catalog_remote_unavailable' => 'Los metadatos de GitHub no están disponibles. La información local del plugin sigue mostrándose.', + 'plugin_catalog_remote_disabled' => 'Las comprobaciones remotas de metadatos están desactivadas porque no hay ningún propietario de GitHub válido configurado.', + 'plugin_catalog_none_discoverable' => 'No se encontró ningún repositorio adicional reciente de plugins para este propietario de GitHub.', + 'plugin_catalog_open_repository' => 'Abrir repositorio', + 'plugin_catalog_open_release' => 'Abrir versión publicada', + 'plugin_catalog_open_version' => 'Abrir versión', + 'plugin_catalog_updated' => 'Actualizado', + 'plugin_catalog_summary_installed' => 'Instalado', + 'plugin_catalog_summary_updates' => 'Actualizaciones disponibles', + 'plugin_catalog_summary_discover' => 'Candidatos recientes', + 'plugin_catalog_summary_unmatched' => 'Sin coincidencia en GitHub'); + +$PLG_monitor_MESSAGE3002 = $LANG32[9]; +$PLG_monitor_MESSAGE3003 = 'Monitor no pudo completar la migración de la base de datos. La versión instalada no cambió; revise error.log y vuelva a intentar la actualización.'; + +$GLOBALS['LANG_configsections']['monitor'] = array( + 'label' => 'Monitor', + 'title' => 'Configuración de Monitor' +); + +$GLOBALS['LANG_configsubgroups']['monitor'] = array( + 'sg_main' => 'Configuración principal' +); + +$GLOBALS['LANG_tab']['monitor'] = array( + 'tab_main' => 'Principal' +); + +$GLOBALS['LANG_fs']['monitor'] = array( + 'fs_main' => 'Configuración general' +); + +$GLOBALS['LANG_confignames']['monitor'] = array( + 'emails' => 'Lista de direcciones de correo electrónico para notificaciones opcionales de Monitor (separadas por comas)', + 'repository' => 'Propietario del repositorio de GitHub reservado para metadatos de versiones de plugins (predeterminado: Geeklog-Plugins). Déjelo vacío para desactivar las comprobaciones remotas de metadatos.', + 'github_token' => 'Token de GitHub opcional para solicitudes de metadatos de la API. Se recomienda un token de solo lectura con permisos específicos. La variable de entorno MONITOR_GITHUB_TOKEN tiene prioridad.' +); + +$LANG_configsections =& $GLOBALS['LANG_configsections']; +$LANG_configsubgroups =& $GLOBALS['LANG_configsubgroups']; +$LANG_tab =& $GLOBALS['LANG_tab']; +$LANG_fs =& $GLOBALS['LANG_fs']; +$LANG_confignames =& $GLOBALS['LANG_confignames']; From 293feae595a50ab861e574683f7443df184d87a3 Mon Sep 17 00:00:00 2001 From: Ben Date: Mon, 5 Oct 2026 11:45:17 +0700 Subject: [PATCH 14/23] Add CI guard for Monitor language parity --- .github/workflows/php-compatibility.yml | 60 +++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/.github/workflows/php-compatibility.yml b/.github/workflows/php-compatibility.yml index b53708e..f7e7ea9 100644 --- a/.github/workflows/php-compatibility.yml +++ b/.github/workflows/php-compatibility.yml @@ -82,6 +82,66 @@ jobs: grep -q "name IN ('emails', 'repository', 'github_token')" lib/MonitorConfigCompat.php test -f language/english_utf-8.php + - name: Check language package parity + shell: bash + run: | + set -euo pipefail + python3 - <<'PY' + import re + from pathlib import Path + + expected = [ + 'chinese_simplified_utf-8.php', + 'chinese_traditional_utf-8.php', + 'french_canada_utf-8.php', + 'french_france_utf-8.php', + 'german_formal_utf-8.php', + 'german_utf-8.php', + 'hebrew_utf-8.php', + 'italian_utf-8.php', + 'japanese_utf-8.php', + 'persian_utf-8.php', + 'russian_utf-8.php', + 'spanish_argentina_utf-8.php', + 'spanish_utf-8.php', + ] + + key_re = re.compile(r"^\\s*'([^']+)'\\s*=>", re.MULTILINE) + placeholder_re = re.compile(r'%(?:\\d+\\$)?[sd]') + + english = Path('language/english.php').read_text(encoding='utf-8') + english_keys = key_re.findall(english) + english_values = {} + for line in english.splitlines(): + match = re.match(r"^\\s*'([^']+)'\\s*=>\\s*'(.*)'[,]?\\s*$", line) + if match: + english_values[match.group(1)] = match.group(2) + + for filename in expected: + path = Path('language') / filename + assert path.is_file(), 'Missing language file: ' + filename + source = path.read_text(encoding='utf-8') + keys = key_re.findall(source) + assert keys == english_keys, 'Language key drift: ' + filename + + values = {} + for line in source.splitlines(): + match = re.match(r"^\\s*'([^']+)'\\s*=>\\s*'(.*)'[,]?\\s*$", line) + if match: + values[match.group(1)] = match.group(2) + + for key, value in english_values.items(): + if key not in values: + continue + expected_placeholders = sorted(placeholder_re.findall(value)) + actual_placeholders = sorted(placeholder_re.findall(values[key])) + assert actual_placeholders == expected_placeholders, ( + 'Placeholder mismatch in %s for %s' % (filename, key) + ) + + print('All Monitor UTF-8 language files match the English key and placeholder contract.') + PY + - name: Check shared Monitor navigation shell: bash run: | From 86b197470471321035e6201f50a6e9f84012ae2e Mon Sep 17 00:00:00 2001 From: Ben Date: Mon, 5 Oct 2026 11:45:20 +0700 Subject: [PATCH 15/23] Document Monitor 1.5.0 language support --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index 730adbd..5293e90 100644 --- a/README.md +++ b/README.md @@ -73,6 +73,12 @@ The data remains owned and calculated by Monitor. Consumers use Geeklog's servic A static `plugin.json` manifest also exposes Monitor identity, icon and minimum Geeklog/PHP requirements without executing plugin code. +## Languages + +Monitor 1.5.0 includes UTF-8 translations for English plus Chinese Simplified, Chinese Traditional, French Canada, French France, German, German Formal, Hebrew, Italian, Japanese, Persian, Russian, Spanish and Spanish Argentina. + +The translated files are kept in key and placeholder parity with the canonical English language file through CI checks. + ## Development notes The code version and installer metadata now declare **Monitor 1.5.0**. The release remains subject to the release gates documented in `ROADMAP.md`, with the interrupted-migration/retry test remaining as the principal release gate. From bae82d639b3c965160ee35d8f64de3a9426dc8ea Mon Sep 17 00:00:00 2001 From: Ben Date: Mon, 5 Oct 2026 11:45:25 +0700 Subject: [PATCH 16/23] Add Monitor 1.5.0 language release notes --- RELEASE-NOTES-1.5.0.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/RELEASE-NOTES-1.5.0.md b/RELEASE-NOTES-1.5.0.md index eb5eec7..e85b854 100644 --- a/RELEASE-NOTES-1.5.0.md +++ b/RELEASE-NOTES-1.5.0.md @@ -41,3 +41,23 @@ After upgrading, verify: 3. Plugins > Discover is sorted alphabetically. 4. GitHub version metadata refreshes correctly with and without a configured token. 5. `dist/monitor_1.5.0_2.1.1.zip` is the only tracked distribution archive. + +## Languages + +Monitor 1.5.0 now includes the completed UTF-8 language set for: + +- Chinese Simplified +- Chinese Traditional +- French Canada +- French France +- German +- German Formal +- Hebrew +- Italian +- Japanese +- Persian +- Russian +- Spanish +- Spanish Argentina + +The language files are aligned with the final 1.5.0 English key set, including the new configuration tooltips, and CI verifies key and placeholder parity. From e71392f56f9c829833f1c39cb90114f218c52525 Mon Sep 17 00:00:00 2001 From: Ben Date: Mon, 5 Oct 2026 11:45:27 +0700 Subject: [PATCH 17/23] Record Monitor 1.5.0 language integration --- ROADMAP.md | 1 + 1 file changed, 1 insertion(+) diff --git a/ROADMAP.md b/ROADMAP.md index b63d88a..6903175 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -334,6 +334,7 @@ A dedicated updater/deployment component remains preferable to rebuilding deploy - [x] adapt GitHub tag-cache freshness to authentication state (4 h anonymous, 1 h authenticated) while preserving explicit refresh; - [x] sort Discover plugins alphabetically; - [x] keep dist limited to the current installable archive and make concurrent archive publication safe. +- [x] integrate the completed 13-language UTF-8 set from the historical `lang` branch on top of the merged 1.5.0 baseline, with key/placeholder parity checks; ## Post-1.5 diagnostic roadmap From 80fe4961333a5907811fcce6734b9a20a7f315ca Mon Sep 17 00:00:00 2001 From: Ben Date: Mon, 5 Oct 2026 11:45:30 +0700 Subject: [PATCH 18/23] Allow Monitor 1.5.0 language branch to rebuild dist archive --- .github/workflows/build-dist.yml | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build-dist.yml b/.github/workflows/build-dist.yml index c731ab8..3f82505 100644 --- a/.github/workflows/build-dist.yml +++ b/.github/workflows/build-dist.yml @@ -5,6 +5,7 @@ on: push: branches: - monitor-1.5.0 + - monitor-1.5.0-lang paths-ignore: - 'dist/**' @@ -93,15 +94,16 @@ jobs: sha256sum dist/monitor_1.5.0_2.1.1.zip - name: Commit dist archive to branch - if: github.ref == 'refs/heads/monitor-1.5.0' + if: github.ref == 'refs/heads/monitor-1.5.0' || github.ref == 'refs/heads/monitor-1.5.0-lang' shell: bash run: | set -euo pipefail # Each run builds the commit that triggered it. If the branch moved # while the ZIP was being built, do not publish a stale archive. - git fetch origin monitor-1.5.0 - REMOTE_HEAD="$(git rev-parse origin/monitor-1.5.0)" + BRANCH="${GITHUB_REF#refs/heads/}" + git fetch origin "$BRANCH" + REMOTE_HEAD="$(git rev-parse origin/$BRANCH)" if [ "$REMOTE_HEAD" != "$GITHUB_SHA" ]; then echo "Branch advanced from $GITHUB_SHA to $REMOTE_HEAD; skipping stale dist commit." exit 0 @@ -117,12 +119,13 @@ jobs: echo 'Distribution archive is already up to date.' else git commit -m 'Update Monitor 1.5.0 distribution archive' - if ! git push origin HEAD:monitor-1.5.0; then + if ! git push origin HEAD:"$BRANCH"; then # The branch may have advanced after the pre-push check. In that # case this archive belongs to an older source commit and must not # overwrite the newer branch head. - git fetch origin monitor-1.5.0 - REMOTE_AFTER_PUSH="$(git rev-parse origin/monitor-1.5.0)" + BRANCH="${GITHUB_REF#refs/heads/}" + git fetch origin "$BRANCH" + REMOTE_AFTER_PUSH="$(git rev-parse origin/$BRANCH)" if [ "$REMOTE_AFTER_PUSH" != "$GITHUB_SHA" ]; then echo "Branch advanced during archive publication; skipping stale dist push." exit 0 From 49e47c6e3a14b6b697fbf39e0b36cd5e68c69ba0 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 5 Oct 2026 04:45:37 +0000 Subject: [PATCH 19/23] Update Monitor 1.5.0 distribution archive --- dist/monitor_1.5.0_2.1.1.zip | Bin 162147 -> 235577 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/dist/monitor_1.5.0_2.1.1.zip b/dist/monitor_1.5.0_2.1.1.zip index 159c73471d48146059f9d5fbbd5de7dc9bf728d3..2d19db287759d22149dbdaceab5a3a4306c73570 100644 GIT binary patch delta 88139 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

xPg^@ ztdqpnM2=>{HY!sO8vQihKfV4FM2a=t58;tGBl+^dUu!RuCsyw`+YeU#KGceoFmC-# zazW&rH;LjzxyUbIX5Pqj=Z`-K9q>@U2d_-2GC_A{l5_dwxx!UQu05UbvILu&%s}%~; ze=@!+Cbh30ZZ=}RNZ}_FN`;$hjGysg*B)J1JGZmn1^DE&%YT&hs_;7DV+^w~m(GZY zj=h(=z3Fe@?ee~7-VTz>QLLSY?u0a}2XFNQN!qOStv??p z=yDj5-~i11OCoP(m168>3m`y?&qRW6*4tYi-mIIKGVjmjr74K8r%iUhcz6mrN-5TJ zm(oM7o@W9B*iAwbVcv){w}LX~A4q2trFkp`_}&2j{3>98{#}2S&plMC|4}~Unb1=a zOhF+2>7le}eE&lmf1%m@lSotNOh9lDZ7hu#{*QI={~ba?!T;Y7bBfUam*tL*?LS0A zUjX|r@hlhbe+Zeo8SWn%6J!4mfr+cY|3g|T|9ksvm37E}$X$o?zo-@+POyLI&Vcnl zL~R%Y{10^){iowLz8TR%{X-PiJpV;mSpUNQht`AscOYso2f{xjllZ@Pj7@C%f9XZj z{x?@pnk3S{sM#{^|8gOg$ATgJQ;1Pufgh0|fPjwS6054I0RKOp%06nFF`Mj2KCkLX zW0lp;i$#O0#Y6F|jG`5!rnQetfHT4uY0r=(n_F_afM}D5)Il!u znJJRzNVhC+1hKAkWY2*$R6plJt)9ZRDcGXSq0WZe9*WW(B-?r=&02@hVHPl*N;PQXzM1mxuP5*!86j4~dX(uA?t8cWYX20tk?1CRtR-VubVM^;SFNa+T zs`|?UBH%T_dU5v?Djpan&^cY&`W2Gj*r1mpFL!u;C3WZbgn%DAKxsfrGo6EbrDb}0 zy{a9SlpyJD&iqWHTC-S4Il+d^mp@>J+(A~b6C%Q^Ri6!)m_Y1ee(p%xiw`kZ`86Qi;zo8l@GQdKk=s=o|-8ff=@+;duR2Wk;

$1iH#1j<~r`uuY*IG2NDol()cEqksztv9>Mn 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 delta 14526 zcmajG1yoyW(>9zC+})j`#VPLY?!~Q0arfX*+(UsPMT$dlEl{jLvEuGp+@*yNdQMNz zdES4mKdhaVTr+cx?7ihZl2 z-QVva7`&h-1mXb#a{P@Y0l#B4bb){Fd3A!|3000Rj$b%h-6wJxY%4}!; zuiAClxOpN0fY7@j0N~e?pVqwn0vERLawU1ZcBR?}SydjZz#Nn{sJ2G7Z`v7{akX&r z35>D_-e(iw9kNS#zVPHr)BI4AqnB$IJRFv&Mny)g>-%}l_De5}ie*w=DK~u!YhN0C zvZbx3p$8vnETLz$_126LMaBw$|LVD9T45n=GvY-R_0fLTS%{8Q{G6Y#f77*qZy%Gs zWVj_OoPKJSs9Mz8GP$=pK_kMvaj?1W+Wte}yFJ&bDYPM*i?z_^O%t<|j6m0NZ~ynT z(NXy=Ut5|F{l%61$mdK8s}0wY2Rmn1idA*IM5=zv6x-3RRWx4fg!2xI4BwFehB2X$p87 z@`VqaB)9+=#hxbm0bC~uKoB`-<&XB4+gn^zmh&K?CO?ZEhQqD6hz6cBA|^GJ6axCN zs)pk=25if1&_q8#H-?5*C$1>1uosgNm;z49)YRs}V(jUI>0YC;JIX`jMk!@FZ@4oc z6T*gvG7VCRGWcqPC2dVfnj%anl0UGZo1#DY&YV(R%Mx7Jb33l?i)8p3{Rd<^WOO9NLT!#H!Aorh30wT{BRVPBNV1^0(<$EIk;;qvLhsEp7O$M~>i zWkDscl?e^QrVyVTzN+6Ti#T%%c{9ieR=GOSNTq~f92OKUIu*k47F0NXTZf-5i zXuz-q+DKwv4s*WM^GR=&B2u+Da3EP~XnUzTX{YbecHy_0?n?`-GCSl&Rh!OR(A%w| zfCvps?EqOPrID@deAbXx&kO+zn1ek{57Ti$UqVL1h!!ztFf|kIGaF%F^7dSO46Gf; zC%m{vm`j;{Wv=Z8z3{Gn+&7ha^s64VXrWYvQ@blYMJfqR)lKEu&icpDM6hyaa->i* z(p*yc62n!5g0k-W*e&J&Mfn;$%zU-aHyc?8`-50Ly^tlt5r20ezE{y`iH{J>kJqu> zg+_v|AfURorw}UcOM=*oS9?`1{QNu7EjL1LndDZ?dCgg*1nlHDka&>;=+c(C_id7a z`puYh%NOuaoH#i%yK)oj_uv55HX$$h7s@VGfzJ)Ld{?<9%M3Y3Y=bZ1;lnj*w&~@; zEQIj+7C$9-UtQEm$RBJhXQ%UD%Wm$Sm$h-1P7j^E9vs8^5T&@iUgq3n0q+&%b1_Su zZ>W$ynIR=8rw!)S@`;o?#&4?}hwo7}$XG1XgVT8U6+#D;vPrC(LmZNc|i8-Fh20 z|1`U^O`rqflcM=Ckoh-b+A;7O`4ec10rgK?{D1)kjrIhVlm7vC$e{{;na4ecV*PF2 z^BjumSFhaThWZ_40vjGI)UVG55MCZA?%%5JJWvLKcdl?a9*|Ea;zh zMF+k9r)ZPWl;_2XUJ65U9smZ8X!=cr+>gcKk z+AOf5RdLw_ipXay0*FuHAP#RH$CfYb|j{*8dG|=Z8__O=3#G&B-k*( zVx#%DD;bQWPBjhppYc|~TZ=8lTx-xbRX;IzK|3eak6B zv5GI0_j0ktg^qYM?~esu(JFt>Z>_;|v+t+Bt!pUcLRbd)n8pTNi(BwvF7`j!1xGUhBI zEW{~0{!;~}eYxJm7O_2BN$8f*6Sstk0Y|cW@ZBVtq`+~SIR$h8Yhawfdxc>uTJA9>uUVO&tjcTZ`4N1@{o-YsR zc?5xN@CS)Y=Tb19IE=lkYm=*xtYRY@v1C#cC}LMixyf1bCC$h0AQC!OV|#RWAmK4t zG}5S)5sDLSUL^0ORn>^<ONU*>sU;_K0YGC63B7!Oe@7^vddnyIKr!yer^=bFb`4dy<6xZqfHaO{%NogQ8g^Cb6!r+HtE1fQznX zI%Ckcw?HCOIE>?r8L!Mkwi@+*<9N&5$TRyzmA8m#)4q07y%Xu9Wj@KL@14=cQI1$} zzsjwG*((=h%EV%Vl<1Mf-PgYG?9kNlH}v8H2LwHcRwv6%U`*hNhOs+E=^`N@>>>j+ zrCxSLvw*xQ>9oj>4a@BxT_cI_FRWx)f^NQd2W!EJ^6yX&nvB(!zDlK!#`UZZ1G=#T zrU*~FTn?HqzH-Z(=OE!oFBweTe#Mc7m>mMZ3Okf6A*u(lfN42FsGoj}92e>pT-<{O z;&nX-pYL=iv(#S}aWctE3SE(HkGzsUJ^-R!pos0|kT%fvaHCqhO06k&8c(56>2J(o zVhuWEFiXf{0oSRSNCaei$B9tEXC?lIusnRj->ljvTcpnJv(B)^wo^uF&K!fgf! z3FcLDb^vS4L>Tvst1i7d+H<9g4v{+OgYk8^Qjb3qMB}DE=-#gYu59kEt45s zh%IRLD>DxLHMJU@@I&L-^3yM#3C@%6b+o&{YFF=J<6p%W&z&0&E*SLRyF`1XtuRJ) zYUsXtFg;;>4%PeRBQaS{ei?djTA#Hdi&u_z=1&+zOs{x2gLVv%BeBlr_8@s49N3&N zfyRbE`Jly#VAc?!mc;Fq;QVq>LukwGMobx#0Os|x%kDgB{~FZfwF)3N78&jX=-;0@ zBn>jfpgOC_0e~;M001U{7+~jMZ|&;f%%Y|&DxoN<^8fP%5nQgn=)BOI@@ZQ=XP`JT zpBgsRl;6-Ri7EYkd9ey6B>$c5K_QQz$Oy6mGOH*kpQa#6;LD-Q{!byfEc5oW@fg@w zMGLk~n6kl#QdhfYXYYi46Ix&IRllCw*xdg<3+Z<=i!7ggm+5;VdFrw|P$(us{*5_olYR&of&H1krD;&O8 z-BkCozz%BTpmfg-G3>r>op-I5aV)H6Hu!LKkY4Cq!#WGLOaH`>STK}PzNud4ZlR~Q z&2=+2=QEeQ&!%f~9feo1Z(IGbaF6Tpn{&F`Vq?YEMeA?-WvyKrZ)&`j*CujM+dq^| ze|S@DJI^arzZ#QnA$inQ>a-HH-HgX_zVQ7MBWujA-s*m(vXXz?6v=x$Ix>oqF@Lv2>ty|M+O?zMuhh!|TMf(X5~+mOg-@P{zx- zs}lQkY%5QFBryY3L+LE0c)C`PH%-32?Yqb%v=0kJ0?#KsKxqCOhLK6@(2<=}dgikJ zL;Tt>zdnfpZfd3CJXf4&<)G*{s0|*6dj3{JeEMAla7#VOmxM4P?~}F3{mp&q!%Dl` z3mPxZE-=r_bp5ur&*PPr%ORG_!-n5-m*=Ic6ih5Wv?UGF&aEa7m)Wj)XSPti+T)Vg zgq!CR(lgSYYU&Wf(0z+MMNM5Xd(mPL%s$@XDK3Zg@S;=0qO&!YqOqP~w4m&xsV0Ku>ZWjb!pb&L%lCa;NK)(V z=_I$p$iwyZwoI94#c}Czy~Ws76i0u1##d8odH1lQoTOft<7L<38yPlZT&qm(9A%{! zel}bN+CNszs(Buc51HYBe0P_Zi<=oVN3sb5KHyIPO`FjKeC+623dJBImg{I^m*({; z`&>^%-H?zUOr$fZG?ra)!Y@`d?oak@4%f;j!rUfw`t9UYa)!8l=;BIjNJ-G_w4NU$ zRqU2f+?q=3)cC(+>~MO`x*IEj=PL>>lS7Jmty_B{9ZuCK=~?-6MsbO5{cSeh3XW=o zM?9FWM%f?I`mlS7*$qH&{7#aF13{u>1yOSrO{RKb7E)WRE}ILB1y^&i zPIf)fRAU9HMXs*?H)hNQrNEt-M!FHvG|6nLO>g}joUH1+s zPt>e_W;_s?!Y~^Fx@Yy97U}RvIk3H)cny{@iEnniYvv$JI^#X;9dR%sa(Wei*_)KPjSQS95(#i^#8G!UbiR(62_v4%v|5=LzOYMO#o7KWXIBSjQ( z6B6s8`pOo}OTt1jY^^R-AFks_g)oH9th)hRYs&?{G`zS2(v0Mo=6U=o>j90g^?s8n zKU~_oh$5|&PA&Z%<}dmA@Yu+9H_gF%ds@{~?mVc9@?RB9=JG>-Bcy@TRV($E1D16-WcJ4@P(LnwbSK#@uu}?Sn*e{{= zV}*WjlT&JIH@S4XKadmi#XyOzfrngSrT&3zPI@!C8cwfWDhfiPDNc18Y=+-LS}gv} zM>|KlO_oe~S0OrzRD$riVBZVx)J#zV+mB5G_;%5!GI2U9FFN~A9yU{>XR$wF>Yw7r zmDOMHQ-(CN@#BB&#=wx7+zdMhe-t(}0nK!#8aP;r1!{8yaI=fC62(Gu_oZM91|s=y z168n+B=vwE=j68~l`z_fN|fp7-!)!sL&x3S30R&Q=e{e5VtKF;#Pop1IT;lh4-P#R z7NFGZCAz9Eb7hb;V__nw%J(WGSRK{%2N}bwtG=torW+1LpHNcKm!0+p%ZkMA%+-Y~ z>T#2gN}bd2Kz73YOk=Cg5w+eaT=i-N;4xEKz1&K@jM0-nEMN5cG-XgN*F_Uhr8^c> z*_Jqhqoak3d@|Yr&+cnXo>BI)rjF5)TwZs^N>OlAn}?dBXOpy6m!Jq)O^Y;Els$0% zyTOP}SM$QY$oZ!(w0(JWune&yLIQ9rGYqrlI)jhDT>+nwKMPds)xkDhkH3Jz{Z2fM zaKTrZCz7Tq5B=S%H(B-lli?Y9q|FB{CW`MZoPE5KHd3(#mIZT-Z=TBrTHuALij76M zOkrmB!uT(I2ni^~)O%-?&?nJ=o)AehnSY&RF}ZQ&ODkbV*z?t916+`wrXO0~xWkDm zVN48csBo_`K={5_P2;#mBKR%Y)`&_#+$in%5Em9ZbGuV`TR1tr z&d<*d4yYxF-h-2C5Fq0TaZsuoyYwS(k#$qf7dBLSnR|p}9f2o2@e<#pw}blG&CS!_ z!O9i(s#>r18Wu*HR4CPybsLYtkZ8?IqfaQG4f8GC^>)!5sn-k}8-~R+yapZl<~pUf z6cpnz9-5S5!%@icgeH9p^_xPOK~A>3BGac560T4Lx`R^=y^Yy2ze48()`@bkf*Cc5 zf?|zmy3O|HkqPV8jl7 z=!ng}R?Oyk2|IMMyMc9>eSeky5R~wFJKKtT7a;#k;({LWBt9i8#A;%9w4pERr~4(_ z9d1^oF<<*zax)dJ>_lB>_naD<(NqVVMRgIUbNC~nF!@c z(iXQ3`!p?dR9|>5VbPHqO8CZM^=iT67r4mPS$=1mXFa*8n+yDGb6f_W-v9FO{-2$R5yJG?W9T+jzPa080A5%_1S@NE&(aPZIW$1z5KET&0dotG&|ns{i|(C%6OR2u!XXMjt!)-NhpGR|;y zw&V`&!Vz@J^J7B{-ad}}(plLg$7B-r{;|d201XZ;DrR^ZeY>VSJ3N$^Jj=l0bm8E= z)sU}7oUiselV{`5jbJ0n($_ssm0ky}YLW+rONa%ct$`A(_defD3V#!Ury_M*r%&bQ zk@J_92Yd<&PYQHbO^(+Aa6dCqaKEui4)BS2A@Ov)$W?I_ ztg5|41Eo|&MiRgsqFH_fN{g*urQrsTO@nudzQIS~^t5IVz2aE$kuf@=92^g-rm;j^ zpUfAn7B3w}-bpE_x|%sJZrI05F@7dm1Sc*VL5eo5S%Z9iU|jRnTfRd(vIOBpz|VCM zkv~x%qQLOWA2#E2&TYH6`ENx(iV~OSR|;rSsnZsE5Qg`>;fo1LymA%FhBZY4!z!?x za5qYzlofqqGq7B7YR(GQ-4n*P4XiGOjL=dxLFaY$E7}hp9271y(xCHD&pn%G(5yI4BB4RUfj}P7j!`2A{lOQT zHb}ihl+bMzehpJqGZqehrVd3KoN1aJrqXov`h7QIkDVm)YTiMFsFSF#BcOl~Ts4J` z(T!`Uyk;INt`jS+ff-4}Z>@xL#Q1i+x16XCF1c0*_3BiFS1k~}c`8}^6I5lZDi1%( zjZ^d7otchFX1Y&rH0Z#+m}_XANa(IV`62s~zqLhXf!&jVqHUCu|3{f9m?2Fswy$(# zH6?V%B$J@_3ah8BA-MC<_r1B{^iakT4i!Tgo#_fv2GS9U$4ij|IOh3uA0mFuR(*I% ziCI#F@NqLVw=d5b>0SnxyBNL*x&MeTqzHpae{^lG*4OlmY^CzjRIL?9I5m_gP}=MC zmXkP;KWwB?R&IN2lX*v)0DQbZ?akKi|0yE3k52zyqrzcz%437yhLGil-{xl{G&QeQ zUfGec9z_=qq&L_d--)YT)`Hbdhb67H1L<0>CpTyB$SxR_dRuySH#~;8q|mD7SIM4# zFn>ck`Resa%Sba!{e<}y)IF1zNjgT(?Cqeza=Eei%~c6o=tz&$%P8<^$j6_=V%p+U zC;hhT&lG>0bina^WjdVce3uWwAy#AkR%`utGqOKEZ6hg|L*+G|yz z&pmatS&2!bks`-4gk*kT@?&y|@5;sM30xxL};EP5hvVw#F#mz z(+Xgg5*^Sp*qzi<<0xPqg_1MJm4f(}})RoBGJ)!7r=X=~*piAOIa)O~EhX)!EFd+ADxabbQH~pH9GM zM5$XHS)aSxaTK9Tx~takQUW$~?sa5YECX{lZOqVHS-LI--Xm~k9aUpSwcrTu%QI== zC^aAEP}qI5+Ynj=5{d$@L2BasQiTN(R62?9fnNVOTx2Ve#A$hYWnJ{+x2=wJ)T__& z8TcXq>lR%Xci;Hp#kv4a1OxO18>Ly5G~Lp4@<)E8jm}q`FfngSdmXx`)KQKVmxgyS zD&AG~&@J$`EpUTh^0S)SDE=rl%7w7q^>AL~>Y^ciQDEjAjlzzgAtvT^!iZ1Ozzf|p z!1JHRXG}B0u7n&Q#bw#l8pW4*(7Tbu4myXvDTBLyjzBYh7-t={3QdKXI$RmA7K*If zJDpX>yMgttM^-cldcq)rvrs0?EAHM zkc>~LWpUI1EgyPsf`pwLYaQe(3%w!#zJ{(rL!-<#FOP)l{6?#jR^91*^mVbY3I3f= zL83`zu@jfz9EYFkK||90q7PPs79&M^ZQaXke0MK)Bm=h-by@;m&GBZm9pt42z{BC` z6ivX?eeMggVbk0yh@-S&*nm0`uzuEo3qy?XAffWMqh2On*sls@ag|3*dr6bL6&EjZ;>3jJL0bt-bX;GCcf=4 zI|(c?dk^fia_T{*_PfrdBVj(ol}}`EVey~x_<8hjZN|6~VB3%nrE^rI%8!FglCeNr zbj;HHbGbCz!W>lctxrfxM!y^06qzqB=UYNtLhQ3;?SKeF|K?oHF|#}78p=6sUReh??hN3OHwKg?sl!s>bmFRBK*4v#SN{0Uz8!528CIl#m790s$#5y z+9Wx+iA!s=_(_55$>b2NywDBkMV(R39S(`6Iq;UX|cU8MZ%O1CbqM z(eoxgmaeW5Q(1O~r7Ew;=p*+Ptd)zn&H7~;miA0=!5h}2q}(s2Q~fFfe`L3!QvQ7zU0{>ioEH(M02+|;rB z>PV*H^Q4m_*U=)ak#EN7ObgoN5)G8sRtQD8eHRhFvg_!;#u9e6uAQd1(BxcMv@fC% zv9=6*cn2`4p(2S%A>(3P7?SR5BIVw|qUj^3k1$IW|`TS7x^lrdC3c z<=$#^I?<-tMjsMX;#Agn@vbH~h+BwYTrS1Q+2w>H>ob0od_^&J;+*(hvxnewFP-=G zgFH8KfFo9s%{Gbbui(l0c$J}CWd362Q$cn77|FQ+z$0TM}OKqqva$a9k#$ zF)+exf-j_%x)05Il@YV^x*5-7!a*)FXBAO5u}gs@^hIUSvnVh}a&@R;Q<4_kJ(0U8 zgAd&emyZ)|72KS)FJnzU|9E*U9`YxuVg|->_2iu_taq(3x*7t~J@2`xptmPJA}SWF z7T2>_#icdSB($e55c?x{E^5FwFcwiuzsLfg#=h%V-z)n*iN zlBZNqW@wI1X|@E1*wekIa2?1}=zWj+;pU*{hAeTu=7@zQan?5Vhoieo3wqsGY43(` z#t=k56}O+;U=xfx`XG#sxNY2l~R?PWQ=XN^S~Om}Cc9 zo(a(_ z>4AKaE zq$jyB4d=_t1)E`FfIP$xdAeT|OPX=YMqB-vJs_!`C%}gN$2b4 zV6cEiW0LBg@4>_RDs}k7^a#jybSm7+qEao7HPGRc3z$Pdpm@NdF#0<6jTjx@z2+xt z$Lr@#nsR0o_+Dvx0mZ_+=%y_#I1^A=D+n0pn_{E#2m2VeD$`7gnY$Vm6P!LEzi1nhntZ_ z#9bmKDh_zOC%3}cFH29a5p={X!+De`R$wxW*jwRnU|I6|0|^SUEmmCHj5UGHZk$I` z++y392WguBtPbKjtPlHZQX9spQG%bRv4a_SeI=GMTZ)nxv3`7`iaT_3DSqc4$<$A2 zNo{VUrIT55N)RVgNfEq1rl=_XP>pX);uD+_@yh`VH;F0NO?FHy`SCygXH>@Kz)W87 z5F2H4&IISVO^3SdG76KusCG%Mgwv(ivQR%#NbFGQ&Bjs(WFd!TJgh}1+wwDv5H=1P zrtuK}S|Uo=ON=hRt$E-$*Zq2{bKa8PhQ{rP%c|dI|MPV0{{`u zE>8F37e6kSy+rLxEQB549pjnmIW=KzT)yHbptQ6`RzG@)P>+R+ zESMh(X?WZaZ#jLA`>M60vn8VDoo+=(Pb~}u{?s4fy_-Z`10;5?;PxyY1wlh_L3GnI zDO@@%V!dKiQXYVclj5UVQ}zM9YmaM&>9;GvAF`#FzKsVLF@X!OexB3C;C#)$|L(Y; z^8ST^oFF$AgICyEE>#U?L0m_nW76JvpCY{)gh7D~N?2oLMcYK&A32c)YP;3ZZH1;r)*jKO5s*HPz4#{c0Z8yrekeiC4Dv-oVBCK|o(ZkP#k{PKD6+*|)s>iP@t(wut zWZngHvv0naDKQe#V&|htltf4*W0ZPf36AO&^)agGGC?mlIBwMF&gfGvl|kv#yney| zjpL=q-XvD^_v<{{TiqATFELwkQ^3ljLC>Li8uN!-L}8#0)~U)d<%D9MiD+c_#z8yq zWy`b3BE7(FDiao=Hi2Wl{Lt7CySOO3O`dIfTfi%b{d!GI%xlfjWwC@nv-#m9x&~Y; z<^46gD3H5<=*OBt@9y(}8$oIFFJ3u`6a*rvmCMxMK+lD5KHt(+Gb$pL3y=w6<&nZO z>FO<_if(y&mQN;bJ1ki)tbJ$?+p<|9kHwF`M>!|%E84x|`7xQS619@zy@-7AGwD+u z8H+vV#-Ux*kYzE^d569!6y(hJC>8E5jbu-u|UFLs?-sek^NE zK2UhCTplHUxsS~j#H26P2GZvOv*$l+Q&e%o!Mzo5%#oz6yj;;N;)&-*AMw$rpc6PW9jz$p)h>oRC9xu8@;`ltH~zkW z;+oipbbL%1%=V%}Gz$OjT3Zgjf|wzunmD*GE)7ocT!=xEKaibR>iyz>nBSuPFXg>}#Zw;{B zTqC71E^ns{iNTTL6*jK&Gk)5n_Vu*e!9B^2!4S&75L+G4L+Z2BsKZpx2(z)!XWNL1 zqdr&33bd}##NAeIq)hI$*7F)zm`?Ch*UaDgF4$`q(aL18 zB#1yMOnpyhzm~MGFNq62ha*0hIY8ftcOhFwq$E$7!N&IEl{ainYcX$8evh_w_;Aq^ zm85;X6BlC7Nxoe~rp+F5{)3xu5?q4P=f*DrK_K#2nzG8n+Dn-Ogl-pXTI$;Z5ZS$|I2n){I zvlx9zi8-)Q>WETEv2MtwezXc!J)0w6RH{7`RmrlqH|b9)5UQHphHEYAAgGzM{SUv! zC4X-ckTiho@_;D+cjS?o7xd5Ay%jI$2J|#uXeJ0^`8|l3CI}k)wRhmP3P|ENSf>K& z|Fu0JK>N=iVuv=!@s~Nf-XBg|Jy7T`^D{fpKNFM8_MkJZ#0U#zQS#n5cAP5hF76|$k5ndpO>u-?cNhu%^Aw_>a#30Pyk158S~7K!D*Oy8k%%W%Env z?M@l7)zl52Qe@gMI zazBrZ3rU~>fH4FBfZ{)Vw)%gWz(;|w{>>*4^~kqj{Fl%n3WWA=VfK@-!t^g;RtFFk z66Xy>`rjn>yF3jw2mpX{Zvf!gf1DD%{@Yab(NrWFg#K@Gr|3uWp%4HhJ{m;zTktCj zGK8zPw~tx4BLe_5{~;7f`iqdL6o~V$FrI2H67xvMoAxB9{vT1%lc=lc?^rs3nE#Uh za`IUUDds=7QKqd^t;^#rk@I+9{f9&7 zD*&Pz_y2LxN5z4N3GToC@nB+ZXKnwuG3gKWQ{9#y)j(210LXpZpEO0D;@%?a8`#v2u2c!{hQG;++H{`7Pjk3hK{f zIRJq1A0CD);6E3Rn&jhHoaC>mxIbt1R~-Kxr2F^U8+;FhFem@Bc>GmDt|y=W)bH^H z%0Gp8T6@7{Q2+QecQAALKUY$7@?#>sWKa-cUJ&`8^Yg1okfc0Sj0y@OkOCt8o#a#Y zK2HJ=Hx$HI1;qM4Mu$%_d?6@Ef;NceU$S4x@sU}@* Date: Mon, 5 Oct 2026 11:45:45 +0700 Subject: [PATCH 20/23] Fix Monitor 1.5.0 language branch archive workflow --- .github/workflows/build-dist.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/build-dist.yml b/.github/workflows/build-dist.yml index 3f82505..e445d6f 100644 --- a/.github/workflows/build-dist.yml +++ b/.github/workflows/build-dist.yml @@ -123,8 +123,7 @@ jobs: # The branch may have advanced after the pre-push check. In that # case this archive belongs to an older source commit and must not # overwrite the newer branch head. - BRANCH="${GITHUB_REF#refs/heads/}" - git fetch origin "$BRANCH" + git fetch origin "$BRANCH" REMOTE_AFTER_PUSH="$(git rev-parse origin/$BRANCH)" if [ "$REMOTE_AFTER_PUSH" != "$GITHUB_SHA" ]; then echo "Branch advanced during archive publication; skipping stale dist push." From 0d6fa51b9f8897db48072bb35c086cc4d0bc0403 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 5 Oct 2026 04:45:52 +0000 Subject: [PATCH 21/23] Update Monitor 1.5.0 distribution archive --- dist/monitor_1.5.0_2.1.1.zip | Bin 235577 -> 235577 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/dist/monitor_1.5.0_2.1.1.zip b/dist/monitor_1.5.0_2.1.1.zip index 2d19db287759d22149dbdaceab5a3a4306c73570..217acc604d02c4e7e490970eae4385d8211ada13 100644 GIT binary patch delta 2103 zcmZWqZBSHY6z1F`5TDDoyDXMAFql&=L=?pmEszQYNf{;9S{g28 zQZ{u@xPoFQ7mSvK=v1A*)}}#7*@KYBn0D$=SFeE(-Y>^n$O7pqR~I(=v-; zcMPdHPznzlGUrR-?F0gOtHEPHp=$UbkwDG0kZ(XoYhhy&fw0l+U)Bge#u6xF7Z@gK zFOq+k5a@sx9x@8&yx<1{)wS>)ZQAh`xPv?f<=YN;)F4_rVdqi;bsRElKRN{NWCH#9 zp4rqr3CC%N>&KX!mOTX(DFpJ)f^lMPW)_AhtNgUNX4h%RqMJ{jWjE0l&ca2BK%bt2 zY-5O<=U|51T{(6ITsov&zCsoVDLbyhN&}&9TsK#{%Jda7zD> zFqclC2CKvzpRh{N76KhfH=$qBr3qR%=#p}cE{}Q9rv2cOtn?D|`I0f>;#*L1+!D3V z?Uvj|pWSZhCUv2)Tw;zMEtgy;2y`(9&9`sUvSKkzy}?9eGv+5^9TMoE1&!}jJ7dA0 z>2VJ`(RhSf*ol@50$p?C-M2WAU4ZQ3+Y0b+slOs0m z<5rBLH~+$i_dy#qGflCyBb_9*9rJbQE)q4hTH3sIo(hKJ36JcrLROH}FX5 z6m$P{VmZ&%cj4na`ld_N^z0RL@9f2AIMdlJYPNObYMzVyCs*FXnC6nxJ?Q52xL#bZ zM<(HQ1(z$sz3AYq&wH_wM|pj?mPg}#xQ<8IkEJ}S?`P`N(DVJ`N`?Dy4QIZ&j}1zh zF#}k^b2|q_=G=g&S-fAYJG@`CH)T+qbJw6~Q+N;yd52s-7U+@bLcbsLIN_3Clv+K6 z9-ez^NX(%uM%!d8{-5w?GV7cc8y_XnA5SG?7|Xa|&#<`t@5ACw&jrNRT0nfT$s_Et z<`!E=@Ifvd91)FNHi|_&*D@-;u-`_-rklpZy5N|&;c|tkm`%w8dVmXmtt=K>$MK$j E0X`n?8vpnwSgwbn#pGRQ}4U?zW04gesP}joadbL zocBU_IxRe%mRz$2mn6l}A5~7yiub!uZ1pR(gXpkuy!tKymxDKfDo?D|p_%BU1JqET zvs{nm=rVP|nd&6iUn@BlT5!Imo^uaV?&k6b8P}nP%db-II~yt)W>*vH8YypElgaa_ zKQ*;e?Ai8W#&f9C?Jv{Xobe(ZQ(qWgq@=Y|Mq^c;T0t4Ja|RoY-Bb|Dlnrb9b{ka{ygzjK1YRnjxy5J8S*Fhq_zHJb}w zA(BeJ8&>MoF;`>mDd*f!s)Jf)F0@cRcN^ZC*8Jk8y!GoWamdf07kpI;Wo!n!mQw~h z6G+Ye3V6VfIa>j5B@-x63nd2hK`p$WLLh%V6dKUsdRU)IAZ#}KS2n|si3G~t0ftH1 z^W@hh1lk{f`;Ef+00eJcWVd8VN%oj`#(Fixz^&cQHc`A(W^cAtb?y7|m$b`x#!G@O?R^ywM! z7(-k?1GD7r%8^Up)*x1i*CC2F77 zD|wARJH66%>O!+mVvZj6N$z6=I-h{%+qY}Ei5Q{YU<$Gs3sbNG3G})Zjqg=EWyPQA zaSyuCc!XNSh1P5WUGd@_H#p%bLU!>jMff*W+f;)0FcV7fd-_zj)}Zm}Xz$hFm-HUH z>)3GGCw1tjh4~vzt)`9GLks_CLFS(4CA?rEP)fj*Csr-Q6Nr2Xx8E?Czm2KMQM>kW z8(Qeizi7w1A@=7gQ?Yg+og||J3w7u=618;TlRUcEfsga3x>Jlk?8L`-E~g9E@kr?s zbN_UqkLMb@@lhUq(=BS2>=AQs@4=@y)72wt?(V@=JQw{>&ezMB=8`kL=;d@vAFkCS zlklp7%axHnbaK|`eOS$-f__}hqltc8!y_EP3LZ5MFm-C^*#U8-;=T9?XTGtQ4N92_ zgIL9L+XqGF{Gg~=woj}(xKFeh$B<}KWC)9Shx{NG>5=KeKoAQ!;X+W9S~ZL% zJoo0Xm_u2Nw#ZoaKjF`0);TjVDNdsQJeBMbtmJ~dBjWbIkBB=x6B1i%A@RYcjk3#{ zTWlW1`?zp;R5Wtg7?$!}>zMe$ej5{;ZWtHq!sFtG%N3?#HYE?}UM~E#5-YY%;GO>h DtgYa` From 656191f182132401a744fe95574f6b54853d6249 Mon Sep 17 00:00:00 2001 From: Ben Date: Mon, 5 Oct 2026 11:45:56 +0700 Subject: [PATCH 22/23] Run Monitor compatibility CI on 1.5.0 language branch --- .github/workflows/php-compatibility.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/php-compatibility.yml b/.github/workflows/php-compatibility.yml index f7e7ea9..399f71c 100644 --- a/.github/workflows/php-compatibility.yml +++ b/.github/workflows/php-compatibility.yml @@ -4,6 +4,8 @@ on: push: branches: - monitor-1.4.0 + - monitor-1.5.0 + - monitor-1.5.0-lang pull_request: permissions: From a40ab46489b8bc5ec1b5528dbf34394684d5d3ae Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 5 Oct 2026 04:46:02 +0000 Subject: [PATCH 23/23] Update Monitor 1.5.0 distribution archive --- dist/monitor_1.5.0_2.1.1.zip | Bin 235577 -> 235577 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/dist/monitor_1.5.0_2.1.1.zip b/dist/monitor_1.5.0_2.1.1.zip index 217acc604d02c4e7e490970eae4385d8211ada13..bcb1fc9dd48fb0db372de9baf6865d4910cfe29a 100644 GIT binary patch delta 2103 zcmZWqZBSHY6z1F`5TDDoEQ_TL4CRyy5k;{?d}Km_Qcx;W7ELmvB#_dm?a+jL$;XN; zmjy14j{T^?CUk_k*@ent$E?h<50u85baqB`bIy6r zdtqiWab_|xu4)Y~iH)E?K{YNd(&s+8)u&bWV{(kZEANqT)qe{F)v?tkG!+_8hG3xA zSz^X&Xqmp?OmGtHuayD|EI8lL&$|aHcXP?ZoSUrAlw70ScQ%x9%%Mls)KlKJ28)-a z|J2Y%vFFWnEuk}A|zOzjFfPYDp<@gditUIHHD}hTR3P z5lOAj4J*y+u&ZJBwDWE#GC?CX6Pl==yA^LwYbkx>jg zqe#vEQh12ToGXR5;t1rehC&8?Pz~?L6R5cs@)&fq7S<;a2pg^bWsUG-G=b8005i#W zk^H)ZK>NM$AS;~nf*%M}*CKXw7{^=SHu4y>Z#&=-MznXr_N4^sIB3;=bPzm=1p4z` ztEp!Kj?)g;j&V67YZ5Aw2;`jwc4A|C76vJ+{FJq3*D1)Pn@^qLH!&8^zy*aspPq#* zHpGpyFiq~R9lH!}6VfhSCJO|$ZC79gL+Bef%{8uYeT|IoFe0zQ3$cV;cO9~sqIMnT z(g@UGSGeQjb|unApd)D(^h=sDP74RzN)GGts23f^4{pUyFR_rPuo1&=LCf|i)IN_# z@vuHSJ<1L0LSwnY9X(pExK9x1LKIqW-(h4%<2>~SY%jhCkEe z9(EyngvPuJZRrHM>cP8iaw01q`Ng;7-cC)okrZCrN3?JQKQuL{07Zw1_UX)BGNkL z+&`UIE^_r<__&C^>5?@I_sF@o_uw;v>FSm>cX#6|kqiANSKh;!){;{_=n?doUR-NN z7U6Xbmuo}4=oGBad$CePxqY}=L}PupMnvetQW4erxH>iToKIez6f)_sMmK_sRAq4ajru7?5q6AHV|9A;*vTW@NeG^JA_cT=dIQs|K-9 zVbEwME78Q&CC;XYpJEum+Mkw^3rf{;9S{g28 zQZ{u@xPoFQ7mSvK=v1A*)}}#7*@KYBn0D$=SFeE(-Y>^n$O7pqR~I(=v-; zcMPdHPznzlGUrR-?F0gOtHEPHp=$UbkwDG0kZ(XoYhhy&fw0l+U)Bge#u6xF7Z@gK zFOq+k5a@sx9x@8&yx<1{)wS>)ZQAh`xPv?f<=YN;)F4_rVdqi;bsRElKRN{NWCH#9 zp4rqr3CC%N>&KX!mOTX(DFpJ)f^lMPW)_AhtNgUNX4h%RqMJ{jWjE0l&ca2BK%bt2 zY-5O<=U|51T{(6ITsov&zCsoVDLbyhN&}&9TsK#{%Jda7zD> zFqclC2CKvzpRh{N76KhfH=$qBr3qR%=#p}cE{}Q9rv2cOtn?D|`I0f>;#*L1+!D3V z?Uvj|pWSZhCUv2)Tw;zMEtgy;2y`(9&9`sUvSKkzy}?9eGv+5^9TMoE1&!}jJ7dA0 z>2VJ`(RhSf*ol@50$p?C-M2WAU4ZQ3+Y0b+slOs0m z<5rBLH~+$i_dy#qGflCyBb_9*9rJbQE)q4hTH3sIo(hKJ36JcrLROH}FX5 z6m$P{VmZ&%cj4na`ld_N^z0RL@9f2AIMdlJYPNObYMzVyCs*FXnC6nxJ?Q52xL#bZ zM<(HQ1(z$sz3AYq&wH_wM|pj?mPg}#xQ<8IkEJ}S?`P`N(DVJ`N`?Dy4QIZ&j}1zh zF#}k^b2|q_=G=g&S-fAYJG@`CH)T+qbJw6~Q+N;yd52s-7U+@bLcbsLIN_3Clv+K6 z9-ez^NX(%uM%!d8{-5w?GV7cc8y_XnA5SG?7|Xa|&#<`t@5ACw&jrNRT0nfT$s_Et z<`!E=@Ifvd91)FNHi|_&*D@-;u-`_-rklpZy5N|&;c|tkm`%w8dVmXmtt=K>$MK$j E0X`n?8vp