diff --git a/Gemfile b/Gemfile index 5f94803cb..0562894fe 100644 --- a/Gemfile +++ b/Gemfile @@ -2,5 +2,6 @@ source 'https://rubygems.org' -gem 'fastlane', '~> 2.228' +gem 'fastlane', '~> 2.227' gem 'fastlane-plugin-wpmreleasetoolkit', '~> 13.2' +gem 'fluent-tools', '~> 0.1', git: 'https://github.com/Automattic/fluent-rust-tools.git', branch: 'iangmaia/ruby-gem-support' diff --git a/Gemfile.lock b/Gemfile.lock index 03909d15d..a33617b71 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,3 +1,11 @@ +GIT + remote: https://github.com/Automattic/fluent-rust-tools.git + revision: aa6b5addcbac72089dd3490751a8390a3944341e + branch: iangmaia/ruby-gem-support + specs: + fluent-tools (0.2.0) + thor (~> 1.0) + GEM remote: https://rubygems.org/ specs: @@ -23,18 +31,18 @@ GEM artifactory (3.0.17) atomos (0.1.3) aws-eventstream (1.4.0) - aws-partitions (1.1115.0) - aws-sdk-core (3.225.2) + aws-partitions (1.1118.0) + aws-sdk-core (3.226.0) aws-eventstream (~> 1, >= 1.3.0) aws-partitions (~> 1, >= 1.992.0) aws-sigv4 (~> 1.9) base64 jmespath (~> 1, >= 1.6.1) logger - aws-sdk-kms (1.104.0) + aws-sdk-kms (1.105.0) aws-sdk-core (~> 3, >= 3.225.0) aws-sigv4 (~> 1.5) - aws-sdk-s3 (1.189.1) + aws-sdk-s3 (1.190.0) aws-sdk-core (~> 3, >= 3.225.0) aws-sdk-kms (~> 1) aws-sigv4 (~> 1.5) @@ -42,8 +50,8 @@ GEM aws-eventstream (~> 1, >= 1.0.2) babosa (1.0.4) base64 (0.3.0) - benchmark (0.4.0) - bigdecimal (3.1.9) + benchmark (0.4.1) + bigdecimal (3.2.2) buildkit (1.6.1) sawyer (>= 0.6) chroma (0.2.0) @@ -55,12 +63,12 @@ GEM concurrent-ruby (1.3.5) connection_pool (2.5.3) declarative (0.0.20) - diffy (3.4.3) + diffy (3.4.4) digest-crc (0.7.0) rake (>= 12.0.0, < 14.0.0) domain_name (0.6.20240107) dotenv (2.8.1) - drb (2.2.1) + drb (2.2.3) emoji_regex (3.2.3) excon (0.112.0) faraday (1.10.4) @@ -79,10 +87,10 @@ GEM faraday (>= 0.8.0) http-cookie (~> 1.0.0) faraday-em_http (1.0.0) - faraday-em_synchrony (1.0.0) + faraday-em_synchrony (1.0.1) faraday-excon (1.1.0) faraday-httpclient (1.0.1) - faraday-multipart (1.1.0) + faraday-multipart (1.1.1) multipart-post (~> 2.0) faraday-net_http (1.0.2) faraday-net_http_persistent (1.2.0) @@ -134,7 +142,7 @@ GEM xcodeproj (>= 1.13.0, < 2.0.0) xcpretty (~> 0.4.1) xcpretty-travis-formatter (>= 0.0.3, < 2.0.0) - fastlane-plugin-wpmreleasetoolkit (13.2.0) + fastlane-plugin-wpmreleasetoolkit (13.3.0) activesupport (>= 6.1.7.1) buildkit (~> 1.5) chroma (= 0.2.0) @@ -213,12 +221,24 @@ GEM multipart-post (2.4.1) mutex_m (0.3.0) nanaimo (0.4.0) - naturally (2.2.2) + naturally (2.3.0) nkf (0.2.0) + nokogiri (1.18.8-aarch64-linux-gnu) + racc (~> 1.4) + nokogiri (1.18.8-aarch64-linux-musl) + racc (~> 1.4) + nokogiri (1.18.8-arm-linux-gnu) + racc (~> 1.4) + nokogiri (1.18.8-arm-linux-musl) + racc (~> 1.4) nokogiri (1.18.8-arm64-darwin) racc (~> 1.4) + nokogiri (1.18.8-x86_64-darwin) + racc (~> 1.4) nokogiri (1.18.8-x86_64-linux-gnu) racc (~> 1.4) + nokogiri (1.18.8-x86_64-linux-musl) + racc (~> 1.4) octokit (6.1.1) faraday (>= 1, < 3) sawyer (~> 0.9) @@ -262,6 +282,7 @@ GEM terminal-notifier (2.0.0) terminal-table (3.0.2) unicode-display_width (>= 1.1.1, < 3) + thor (1.3.2) trailblazer-option (0.1.2) tty-cursor (0.7.1) tty-screen (0.8.2) @@ -286,13 +307,19 @@ GEM xcpretty (~> 0.2, >= 0.0.7) PLATFORMS - arm64-darwin-22 - arm64-darwin-23 - x86_64-linux + aarch64-linux-gnu + aarch64-linux-musl + arm-linux-gnu + arm-linux-musl + arm64-darwin + x86_64-darwin + x86_64-linux-gnu + x86_64-linux-musl DEPENDENCIES - fastlane (~> 2.228) + fastlane (~> 2.227) fastlane-plugin-wpmreleasetoolkit (~> 13.2) + fluent-tools (~> 0.1)! BUNDLED WITH - 2.4.10 + 2.6.3 diff --git a/fastlane/Fastfile b/fastlane/Fastfile index 4d1a8a6f3..725db099d 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -1,5 +1,8 @@ # frozen_string_literal: true +require 'open-uri' +require 'fluent_tools' + PROJECT_ROOT = File.expand_path('..', __dir__) LANE_VALUE_VERSION = 'WP_VERSION' @@ -11,6 +14,72 @@ LANE_VALUE_XCFRAMEWORK_CHECKSUM_PATH = 'WP_XCFRAMEWORK_CHECKSUM_PATH' GITHUB_REPO = 'automattic/wordpress-rs' GIT_REMOTE_NAME = 'origin' +# Localization constants +LOCALIZATION_FLUENT_FILES_DIR = File.join(PROJECT_ROOT, 'wp_localization', 'localization') +LOCALIZATION_PO_SOURCE_FILE = File.join(PROJECT_ROOT, 'wp_localization', 'glotpress', 'en-US.pot') +MAIN_FLUENT_FILE_NAME = 'main.ftl' +PROJECT_NAME = 'wordpress-rs' + +# GlotPress configuration +GLOTPRESS_PROJECT_BASE_URL = 'https://translate.wordpress.com/projects/mobile/wordpress-rs' + +# Supported locales mapping between GlotPress and project locale codes +# This list combines locales supported in the iOS and Android apps +SUPPORTED_LOCALES = [ + { glotpress: 'ar', project: 'ar' }, + { glotpress: 'az', project: 'az' }, + { glotpress: 'bg', project: 'bg' }, + { glotpress: 'cs', project: 'cs' }, + { glotpress: 'cy', project: 'cy' }, + { glotpress: 'da', project: 'da' }, + { glotpress: 'de', project: 'de' }, + { glotpress: 'el', project: 'el' }, + { glotpress: 'en-au', project: 'en-AU' }, + { glotpress: 'en-ca', project: 'en-CA' }, + { glotpress: 'en-gb', project: 'en-GB' }, + { glotpress: 'es', project: 'es' }, + { glotpress: 'es-cl', project: 'es-CL' }, + { glotpress: 'es-co', project: 'es-CO' }, + { glotpress: 'es-mx', project: 'es-MX' }, + { glotpress: 'es-ve', project: 'es-VE' }, + { glotpress: 'eu', project: 'eu' }, + { glotpress: 'fr', project: 'fr' }, + { glotpress: 'fr-ca', project: 'fr-CA' }, + { glotpress: 'gd', project: 'gd' }, + { glotpress: 'gl', project: 'gl' }, + { glotpress: 'he', project: 'he' }, + { glotpress: 'hi', project: 'hi' }, + { glotpress: 'hr', project: 'hr' }, + { glotpress: 'hu', project: 'hu' }, + { glotpress: 'id', project: 'id' }, + { glotpress: 'is', project: 'is' }, + { glotpress: 'it', project: 'it' }, + { glotpress: 'ja', project: 'ja' }, + { glotpress: 'kmr', project: 'kmr' }, + { glotpress: 'ko', project: 'ko' }, + { glotpress: 'lv', project: 'lv' }, + { glotpress: 'mk', project: 'mk' }, + { glotpress: 'ms', project: 'ms' }, + { glotpress: 'nb', project: 'nb' }, + { glotpress: 'nl', project: 'nl' }, + { glotpress: 'pl', project: 'pl' }, + { glotpress: 'pt', project: 'pt' }, + { glotpress: 'pt-br', project: 'pt-BR' }, + { glotpress: 'ro', project: 'ro' }, + { glotpress: 'ru', project: 'ru' }, + { glotpress: 'sk', project: 'sk' }, + { glotpress: 'sq', project: 'sq' }, + { glotpress: 'sr', project: 'sr' }, + { glotpress: 'sv', project: 'sv' }, + { glotpress: 'th', project: 'th' }, + { glotpress: 'tr', project: 'tr-TR' }, + { glotpress: 'uz', project: 'uz' }, + { glotpress: 'vi', project: 'vi' }, + { glotpress: 'zh-cn', project: 'zh-CN' }, + { glotpress: 'zh-hk', project: 'zh-HK' }, + { glotpress: 'zh-tw', project: 'zh-TW' } +].freeze + lane :release do |options| version = options[:version] || UI.user_error!('version is required') lane_context[LANE_VALUE_VERSION] = version @@ -105,6 +174,154 @@ lane :publish_to_s3 do ) end +# Converts the English Fluent localization file to PO format for translation +# +# The resulting PO file is saved as the source file (.pot) for translations and is synced to GlotPress. +# +# @param commit_and_push_changes [Boolean] Whether to commit and push the generated PO file (default: false) +# +lane :generate_source_po_file do |commit_and_push_changes: false| + UI.header('🔄 Converting English Fluent file to PO format') + + FileUtils.mkdir_p(File.dirname(LOCALIZATION_PO_SOURCE_FILE)) + + fluent_file = File.join(LOCALIZATION_FLUENT_FILES_DIR, 'en-US', MAIN_FLUENT_FILE_NAME) + + UI.user_error!("❌ English Fluent file not found: #{fluent_file}") unless File.exist?(fluent_file) + + begin + FluentTools.fluent_to_po( + fluent_file, + LOCALIZATION_PO_SOURCE_FILE, + locale: 'en-US' + ) + + UI.success("✅ #{File.basename(fluent_file)} → #{File.basename(LOCALIZATION_PO_SOURCE_FILE)}") + rescue StandardError => e + UI.error("❌ Failed to convert English Fluent file: #{e.message}") + end + + if commit_and_push_changes + commit_changed_files( + files: LOCALIZATION_PO_SOURCE_FILE, + message: 'Update source PO file (en-US.pot) to be synced to GlotPress' + ) + end +end + +# Downloads the latest translations from GlotPress and updates Fluent files +# +# This lane fetches translated PO files from GlotPress for all supported locales, +# converts them back to Fluent format, and optionally commits and pushes the changes. +# +# @param commit_and_push_changes [Boolean] Whether to commit and push the updated Fluent files (default: false) +# +lane :download_translations do |commit_and_push_changes: false| + UI.header('🌐 Downloading translations from GlotPress') + + Dir.mktmpdir do |temp_download_dir| + downloaded_files = download_po_files_from_glotpress(download_dir: temp_download_dir) + updated_fluent_files = [] + + if downloaded_files.empty? + UI.message("No .po files were downloaded from GlotPress") + next + end + + UI.header('🔄 Converting PO files to Fluent format') + + downloaded_files.each do |file_path| + fluent_file_path = generate_fluent_file_from_po(file_path: file_path) + updated_fluent_files << fluent_file_path if fluent_file_path + rescue StandardError => e + UI.error("❌ Failed to convert #{File.basename(file_path)}: #{e.message}") + end + + UI.success("✅ Updated Fluent files: #{updated_fluent_files.length} locales") + + if commit_and_push_changes && updated_fluent_files.any? + commit_changed_files( + files: updated_fluent_files, + message: 'Update generated Fluent files based on latest GlotPress translations' + ) + end + end +end + +# Downloads PO files from GlotPress for existing project locales +# +# This lane fetches translated PO files from GlotPress for all supported locales +# that exist in the project. It only downloads files for locales that have +# directories in the source localization folder. +# +# @return [Array] List of successfully downloaded files +# +lane :download_po_files_from_glotpress do |download_dir:| + UI.header('🌐 Downloading PO files from GlotPress') + + UI.user_error!("Download directory does not exist: #{download_dir}") unless Dir.exist?(download_dir) + + downloaded_files = [] + + SUPPORTED_LOCALES.each do |locale_mapping| + glotpress_locale = locale_mapping[:glotpress] + project_locale = locale_mapping[:project] + + po_file_path = File.join(download_dir, "#{project_locale}.po") + download_url = "#{GLOTPRESS_PROJECT_BASE_URL}/#{glotpress_locale}/default/export-translations/?format=po" + + UI.message("⬇️ Downloading PO file for #{project_locale}...") + + begin + # Download PO file using Ruby's URI.open + File.write(po_file_path, URI.open(download_url).read) + + if File.exist?(po_file_path) && !File.empty?(po_file_path) + downloaded_files << po_file_path + else + UI.error("❌ Failed to download #{project_locale}: empty response") + end + rescue StandardError => e + UI.error("❌ Failed to download #{project_locale}: #{e.message}") + end + end + + UI.success("✅ Downloaded: #{downloaded_files.length} PO files") if downloaded_files.any? + + downloaded_files +end + +# Converts a PO file for a given locale back to Fluent format +# +# This lane takes a PO file and converts it to the corresponding Fluent format file. +# The locale is extracted from the PO filename (e.g., 'fr-FR.po' becomes 'fr-FR'). +# The resulting Fluent file is saved in the appropriate locale directory. +# +# @param file_path [String] The PO file path to convert (e.g., 'path/to/fr-FR.po') +# @return [String] The path to the generated Fluent file +# +lane :generate_fluent_file_from_po do |file_path:| + UI.user_error!("PO file not found: #{file_path}") unless File.exist?(file_path) + + locale = File.basename(file_path, '.po') + fluent_file_path = File.join(LOCALIZATION_FLUENT_FILES_DIR, locale, MAIN_FLUENT_FILE_NAME) + + FileUtils.mkdir_p(File.dirname(fluent_file_path)) + + FluentTools.po_to_fluent( + file_path, + fluent_file_path + ) + + next if !File.exist?(fluent_file_path) || File.empty?(fluent_file_path) + + UI.message("✅ #{File.basename(file_path)} → #{fluent_file_path}") + + fluent_file_path +end + +# Utils + def xcframework_checksum File.read(xcframework_checksum_file_path).strip! end @@ -126,3 +343,18 @@ end def remove_lane_context_values(names) names.each { |name| lane_context.delete(name) } end + +def commit_changed_files(files:, message:, push: true) + git_add(path: files) + result = git_commit( + path: files, + message: message, + allow_nothing_to_commit: true + ) + + if result.nil? + UI.important('⚠️ No changed files') + elsif push + push_to_git_remote(set_upstream: true, tags: false) + end +end diff --git a/wp_localization/glotpress/en-US.pot b/wp_localization/glotpress/en-US.pot new file mode 100644 index 000000000..edc6a1df1 --- /dev/null +++ b/wp_localization/glotpress/en-US.pot @@ -0,0 +1,270 @@ + +msgid "" +msgstr "" +"Project-Id-Version: wordpress-rs 0.2.0\n" +"POT-Creation-Date: 2025-06-20 18:00+0200\n" +"PO-Revision-Date: 2025-06-20 18:00+0200\n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: en-US\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "wp_api_error_generic_error" +msgid "Something went wrong." +msgstr "Something went wrong." + +msgctxt "site_error_message" +msgid "Your site sent an error message: {$error_message}." +msgstr "Your site sent an error message: {$error_message}." + +msgctxt "url_parsing_error" +msgid "URL is invalid." +msgstr "URL is invalid." + +msgctxt "response_parsing_error" +msgid "Response couldn't be parsed: {$reason}." +msgstr "Response couldn't be parsed: {$reason}." + +msgctxt "media_file_not_found" +msgid "Media file not found at {$path}." +msgstr "Media file not found at {$path}." + +msgctxt "invalid_http_status_code" +msgid "Invalid HTTP status code: {$status_code}." +msgstr "Invalid HTTP status code: {$status_code}." + +msgctxt "request_execution_failed" +msgid "Failed to send HTTP." +msgstr "Failed to send HTTP." + +msgctxt "just" +msgid "{$message}" +msgstr "{$message}" + +msgctxt "invalid_ssl_error_certificate_not_valid_for_name" +msgid "Invalid SSL certificate" +msgstr "Invalid SSL certificate" + +msgctxt "invalid_ssl_error_generic_ssl_error" +msgid "Unable to establish a secure connection to the server" +msgstr "Unable to establish a secure connection to the server" + +msgctxt "non_existent_site_error" +msgid "A server with the specified hostname could not be found." +msgstr "A server with the specified hostname could not be found." + +msgctxt "http_authentication_required_error" +msgid "" +"The server at {$url} requires authentication. Please provide your username " +"and password." +msgstr "" +"The server at {$url} requires authentication. Please provide your username " +"and password." + +msgctxt "http_forbidden_error" +msgid "" +"The server at {$url} denied access to the requested resource. Please check " +"your site's configuration." +msgstr "" +"The server at {$url} denied access to the requested resource. Please check " +"your site's configuration." + +msgctxt "http_timeout_error" +msgid "The connection timed out" +msgstr "The connection timed out" + +msgctxt "http_authentication_rejected_error" +msgid "" +"The server at {$url} rejected your credentials. Please provide a valid " +"username and password." +msgstr "" +"The server at {$url} rejected your credentials. Please provide a valid " +"username and password." + +msgctxt "http_server_error" +msgid "" +"Unable to connect to server: {$reason}. Please contact your server provider." +msgstr "" +"Unable to connect to server: {$reason}. Please contact your server provider." + +msgctxt "misconfigured_http_authentication_error" +msgid "" +"The server is sending invalid HTTP authentication information. Please check " +"your site's HTTP authentication configuration." +msgstr "" +"The server is sending invalid HTTP authentication information. Please check " +"your site's HTTP authentication configuration." + +msgctxt "misconfigured_rate_limit_error" +msgid "" +"The server is rate limiting requests in a way that will never succeed. " +"Please check your site's rate limit configuration." +msgstr "" +"The server is rate limiting requests in a way that will never succeed. " +"Please check your site's rate limit configuration." + +msgctxt "oauth_response_url_error_url_invalid" +msgid "The site sent an invalid authentication response URL." +msgstr "The site sent an invalid authentication response URL." + +msgctxt "oauth_response_url_error_unsuccessful_login" +msgid "Unsuccessful Login." +msgstr "Unsuccessful Login." + +msgctxt "boolean_true_is_returned_when_string_is_expected" +msgid "" +"Expecting a `String` value for this field, but received the boolean `true` " +"instead." +msgstr "" +"Expecting a `String` value for this field, but received the boolean `true` " +"instead." + +msgctxt "invalid_header_name_error" +msgid "Invalid header name: {$header_name}." +msgstr "Invalid header name: {$header_name}." + +msgctxt "invalid_header_value_error" +msgid "Invalid header value: {$header_value}." +msgstr "Invalid header value: {$header_value}." + +msgctxt "http_auth_method_missing_nonce" +msgid "Missing nonce in HTTP authentication method." +msgstr "Missing nonce in HTTP authentication method." + +msgctxt "http_auth_method_missing_qop" +msgid "Missing QOP (Quality of Protection) in HTTP authentication method." +msgstr "Missing QOP (Quality of Protection) in HTTP authentication method." + +msgctxt "http_auth_method_missing_algorithm" +msgid "Missing algorithm in HTTP authentication method." +msgstr "Missing algorithm in HTTP authentication method." + +msgctxt "http_auth_method_missing_opaque" +msgid "Missing opaque value in HTTP authentication method." +msgstr "Missing opaque value in HTTP authentication method." + +msgctxt "http_auth_method_unknown" +msgid "Unknown HTTP authentication method." +msgstr "Unknown HTTP authentication method." + +msgctxt "uniffi_serialization_error_serde" +msgid "Serialization error: {$reason}." +msgstr "Serialization error: {$reason}." + +msgctxt "uuid_parse_error_invalid_uuid" +msgid "Invalid UUID string." +msgstr "Invalid UUID string." + +msgctxt "uuid_parse_error_not_version_4" +msgid "Not a version 4 UUID." +msgstr "Not a version 4 UUID." + +msgctxt "wordpress_org_api_client_error_request_encoding" +msgid "Failed to encode request. Reason: {$reason}." +msgstr "Failed to encode request. Reason: {$reason}." + +msgctxt "probably_not_wordpress_site" +msgid "The site does not appear to be a WordPress site." +msgstr "The site does not appear to be a WordPress site." + +msgctxt "rest_api_disabled" +msgid "" +"The site's REST API is disabled. Please update your site settings to enable " +"REST API." +msgstr "" +"The site's REST API is disabled. Please update your site settings to enable " +"REST API." + +msgctxt "xmlrpc_disabled_by_host" +msgid "" +"The site's XML-RPC is disabled. Please contact your hosting provider to " +"solve this problem." +msgstr "" +"The site's XML-RPC is disabled. Please contact your hosting provider to " +"solve this problem." + +msgctxt "xmlrpc_disabled_by_plugin" +msgid "" +"The site's XML-RPC is disabled – the {$plugin} plugin might have disabled " +"XML-RPC. Please visit {$support_url} to learn more." +msgstr "" +"The site's XML-RPC is disabled – the {$plugin} plugin might have disabled " +"XML-RPC. Please visit {$support_url} to learn more." + +msgctxt "xmlrpc_disabled_by_multiple_plugins" +msgid "" +"The site's XML-RPC is disabled – there are multiple installed plugins that " +"might have disabled XML-RPC. Please disable them and try again." +msgstr "" +"The site's XML-RPC is disabled – there are multiple installed plugins that " +"might have disabled XML-RPC. Please disable them and try again." + +msgctxt "xmlrpc_endpoint_not_found" +msgid "" +"The site's XML-RPC endpoint could not be found. Please check your site " +"settings and try again." +msgstr "" +"The site's XML-RPC endpoint could not be found. Please check your site " +"settings and try again." + +msgctxt "application_password_blocked_by_plugin" +msgid "" +"Unable to login to {$url} – the {$plugin} plugin might have disabled " +"Application Passwords. Please visit {$support_url} to learn more." +msgstr "" +"Unable to login to {$url} – the {$plugin} plugin might have disabled " +"Application Passwords. Please visit {$support_url} to learn more." + +msgctxt "application_password_blocked_by_multiple_plugins" +msgid "" +"Unable to login to {$url} – there are multiple installed plugins that might " +"have disabled Application Passwords. Please disable them and try again." +msgstr "" +"Unable to login to {$url} – there are multiple installed plugins that might " +"have disabled Application Passwords. Please disable them and try again." + +msgctxt "site_is_local_development_environment" +msgid "" +"This site is a local development environment. You'll need to enable " +"application passwords to connect to it with the app." +msgstr "" +"This site is a local development environment. You'll need to enable " +"application passwords to connect to it with the app." + +msgctxt "application_passwords_disabled_for_http_site" +msgid "" +"Application Passwords is not enabled for this site – this is likely because " +"we can't establish a secure connection to it. Please add an SSL certificate " +"to this site and try again." +msgstr "" +"Application Passwords is not enabled for this site – this is likely because " +"we can't establish a secure connection to it. Please add an SSL certificate " +"to this site and try again." + +msgctxt "application_passwords_not_supported" +msgid "The site does not support Application Passwords." +msgstr "The site does not support Application Passwords." + +msgctxt "parse_api_root" +msgid "Failed to parse the the site's WordPress REST API root response." +msgstr "Failed to parse the the site's WordPress REST API root response." + +msgctxt "parse_api_root_failure_reason_server_fatal_error" +msgid "" +"Your server encountered an unrecoverable error and couldn't process the " +"request. Please check your server error logs for details." +msgstr "" +"Your server encountered an unrecoverable error and couldn't process the " +"request. Please check your server error logs for details." + +msgctxt "parse_api_root_failure_reason_wordfence_blocking_access" +msgid "" +"Wordfence is blocking access to the site's API. Please check your Wordfence " +"configuration." +msgstr "" +"Wordfence is blocking access to the site's API. Please check your Wordfence " +"configuration." + diff --git a/wp_localization/localization/ar/main.ftl b/wp_localization/localization/ar/main.ftl new file mode 100644 index 000000000..e69de29bb diff --git a/wp_localization/localization/az/main.ftl b/wp_localization/localization/az/main.ftl new file mode 100644 index 000000000..e69de29bb diff --git a/wp_localization/localization/bg/main.ftl b/wp_localization/localization/bg/main.ftl new file mode 100644 index 000000000..e69de29bb diff --git a/wp_localization/localization/cs/main.ftl b/wp_localization/localization/cs/main.ftl new file mode 100644 index 000000000..e69de29bb diff --git a/wp_localization/localization/cy/main.ftl b/wp_localization/localization/cy/main.ftl new file mode 100644 index 000000000..e69de29bb diff --git a/wp_localization/localization/da/main.ftl b/wp_localization/localization/da/main.ftl new file mode 100644 index 000000000..e69de29bb diff --git a/wp_localization/localization/de/main.ftl b/wp_localization/localization/de/main.ftl new file mode 100644 index 000000000..e69de29bb diff --git a/wp_localization/localization/el/main.ftl b/wp_localization/localization/el/main.ftl new file mode 100644 index 000000000..e69de29bb diff --git a/wp_localization/localization/en-AU/main.ftl b/wp_localization/localization/en-AU/main.ftl new file mode 100644 index 000000000..e69de29bb diff --git a/wp_localization/localization/en-CA/main.ftl b/wp_localization/localization/en-CA/main.ftl new file mode 100644 index 000000000..e69de29bb diff --git a/wp_localization/localization/en-GB/main.ftl b/wp_localization/localization/en-GB/main.ftl new file mode 100644 index 000000000..e69de29bb diff --git a/wp_localization/localization/es-CL/main.ftl b/wp_localization/localization/es-CL/main.ftl new file mode 100644 index 000000000..e69de29bb diff --git a/wp_localization/localization/es-CO/main.ftl b/wp_localization/localization/es-CO/main.ftl new file mode 100644 index 000000000..e69de29bb diff --git a/wp_localization/localization/es-MX/main.ftl b/wp_localization/localization/es-MX/main.ftl new file mode 100644 index 000000000..e69de29bb diff --git a/wp_localization/localization/es-VE/main.ftl b/wp_localization/localization/es-VE/main.ftl new file mode 100644 index 000000000..e69de29bb diff --git a/wp_localization/localization/es/main.ftl b/wp_localization/localization/es/main.ftl new file mode 100644 index 000000000..e69de29bb diff --git a/wp_localization/localization/eu/main.ftl b/wp_localization/localization/eu/main.ftl new file mode 100644 index 000000000..e69de29bb diff --git a/wp_localization/localization/fr-CA/main.ftl b/wp_localization/localization/fr-CA/main.ftl new file mode 100644 index 000000000..e69de29bb diff --git a/wp_localization/localization/fr/main.ftl b/wp_localization/localization/fr/main.ftl new file mode 100644 index 000000000..e69de29bb diff --git a/wp_localization/localization/gd/main.ftl b/wp_localization/localization/gd/main.ftl new file mode 100644 index 000000000..e69de29bb diff --git a/wp_localization/localization/gl/main.ftl b/wp_localization/localization/gl/main.ftl new file mode 100644 index 000000000..e69de29bb diff --git a/wp_localization/localization/he/main.ftl b/wp_localization/localization/he/main.ftl new file mode 100644 index 000000000..e69de29bb diff --git a/wp_localization/localization/hi/main.ftl b/wp_localization/localization/hi/main.ftl new file mode 100644 index 000000000..e69de29bb diff --git a/wp_localization/localization/hr/main.ftl b/wp_localization/localization/hr/main.ftl new file mode 100644 index 000000000..e69de29bb diff --git a/wp_localization/localization/hu/main.ftl b/wp_localization/localization/hu/main.ftl new file mode 100644 index 000000000..e69de29bb diff --git a/wp_localization/localization/id/main.ftl b/wp_localization/localization/id/main.ftl new file mode 100644 index 000000000..e69de29bb diff --git a/wp_localization/localization/is/main.ftl b/wp_localization/localization/is/main.ftl new file mode 100644 index 000000000..e69de29bb diff --git a/wp_localization/localization/it/main.ftl b/wp_localization/localization/it/main.ftl new file mode 100644 index 000000000..e69de29bb diff --git a/wp_localization/localization/ja/main.ftl b/wp_localization/localization/ja/main.ftl new file mode 100644 index 000000000..e69de29bb diff --git a/wp_localization/localization/kmr/main.ftl b/wp_localization/localization/kmr/main.ftl new file mode 100644 index 000000000..e69de29bb diff --git a/wp_localization/localization/ko/main.ftl b/wp_localization/localization/ko/main.ftl new file mode 100644 index 000000000..e69de29bb diff --git a/wp_localization/localization/lv/main.ftl b/wp_localization/localization/lv/main.ftl new file mode 100644 index 000000000..e69de29bb diff --git a/wp_localization/localization/mk/main.ftl b/wp_localization/localization/mk/main.ftl new file mode 100644 index 000000000..e69de29bb diff --git a/wp_localization/localization/ms/main.ftl b/wp_localization/localization/ms/main.ftl new file mode 100644 index 000000000..e69de29bb diff --git a/wp_localization/localization/nb/main.ftl b/wp_localization/localization/nb/main.ftl new file mode 100644 index 000000000..e69de29bb diff --git a/wp_localization/localization/nl/main.ftl b/wp_localization/localization/nl/main.ftl new file mode 100644 index 000000000..e69de29bb diff --git a/wp_localization/localization/pl/main.ftl b/wp_localization/localization/pl/main.ftl new file mode 100644 index 000000000..e69de29bb diff --git a/wp_localization/localization/pt-BR/main.ftl b/wp_localization/localization/pt-BR/main.ftl new file mode 100644 index 000000000..ed5925f51 --- /dev/null +++ b/wp_localization/localization/pt-BR/main.ftl @@ -0,0 +1,79 @@ +parse_api_root_failure_reason_wordfence_blocking_access = O Wordfence está bloqueando o acesso à API do site. Por favor, verifique sua configuração do Wordfence. + +parse_api_root_failure_reason_server_fatal_error = Seu servidor encontrou um erro irrecuperável e não pôde processar a solicitação. Por favor, verifique os logs de erro do seu servidor para detalhes. + +parse_api_root = Falha ao analisar a resposta raiz da API REST do WordPress do site. + +application_passwords_not_supported = O site não suporta Senhas de Aplicativo. + +application_passwords_disabled_for_http_site = Senhas de Aplicativo não estão habilitadas para este site – isso provavelmente é porque não conseguimos estabelecer uma conexão segura com ele. Por favor, adicione um certificado SSL a este site e tente novamente. + +site_is_local_development_environment = Este site é um ambiente de desenvolvimento local. Você precisará habilitar senhas de aplicativo para conectar-se a ele com o app. + +application_password_blocked_by_multiple_plugins = Não foi possível fazer login em { $url } – há múltiplos plugins instalados que podem ter desabilitado as Senhas de Aplicativo. Por favor, desabilite-os e tente novamente. + +application_password_blocked_by_plugin = Não foi possível fazer login em { $url } – o plugin { $plugin } pode ter desabilitado as Senhas de Aplicativo. Por favor, visite { $support_url } para saber mais. + +xmlrpc_endpoint_not_found = O endpoint XML-RPC do site não pôde ser encontrado. Por favor, verifique as configurações do seu site e tente novamente. + +xmlrpc_disabled_by_multiple_plugins = O XML-RPC do site está desabilitado – há múltiplos plugins instalados que podem ter desabilitado o XML-RPC. Por favor, desabilite-os e tente novamente. + +wordpress_org_api_client_error_request_encoding = Falha ao codificar solicitação. Motivo: { $reason }. + +uuid_parse_error_not_version_4 = Não é um UUID versão 4. + +uuid_parse_error_invalid_uuid = String UUID inválida. + +uniffi_serialization_error_serde = Erro de serialização: { $reason }. + +http_auth_method_unknown = Método de autenticação HTTP desconhecido. + +http_auth_method_missing_opaque = Valor opaco ausente no método de autenticação HTTP. + +http_auth_method_missing_algorithm = Algoritmo ausente no método de autenticação HTTP. + +http_auth_method_missing_qop = QOP (Qualidade de Proteção) ausente no método de autenticação HTTP. + +http_auth_method_missing_nonce = Nonce ausente no método de autenticação HTTP. + +invalid_header_value_error = Valor de cabeçalho inválido: { $header_value }. + +invalid_header_name_error = Nome de cabeçalho inválido: { $header_name }. + +boolean_true_is_returned_when_string_is_expected = Esperando um valor `String` para este campo, mas o resultado foi `true`. + +oauth_response_url_error_unsuccessful_login = Falha no login. + +oauth_response_url_error_url_invalid = O site enviou uma URL de resposta de autenticação inválida. + +misconfigured_http_authentication_error = O servidor está enviando informações de autenticação HTTP inválidas. Por favor, verifique a configuração de autenticação HTTP do seu site. + +http_authentication_rejected_error = O servidor em { $url } rejeitou suas credenciais. Por favor, forneça um nome de usuário e senha válidos. + +http_timeout_error = A conexão expirou + +http_authentication_required_error = O servidor em { $url } requer autenticação. Por favor, forneça seu nome de usuário e senha. + +non_existent_site_error = Um servidor com o nome de host especificado não pôde ser encontrado. + +invalid_ssl_error_generic_ssl_error = Não foi possível estabelecer uma conexão segura com o servidor + +invalid_ssl_error_certificate_not_valid_for_name = Certificado SSL inválido + +just = { $message } + +request_execution_failed = Falha na requisição HTTP. + +invalid_http_status_code = Código de status HTTP inválido: { $status_code }. + +media_file_not_found = Arquivo de mídia não encontrado em { $path }. + +response_parsing_error = A resposta não pôde ser analisada: { $reason }. + +url_parsing_error = URL inválida. + +site_error_message = Seu site enviou uma mensagem de erro: { $error_message }. + +wp_api_error_generic_error = Algo deu errado. + +probably_not_wordpress_site = O site não parece ser um site WordPress. diff --git a/wp_localization/localization/pt/main.ftl b/wp_localization/localization/pt/main.ftl new file mode 100644 index 000000000..e69de29bb diff --git a/wp_localization/localization/ro/main.ftl b/wp_localization/localization/ro/main.ftl new file mode 100644 index 000000000..e69de29bb diff --git a/wp_localization/localization/ru/main.ftl b/wp_localization/localization/ru/main.ftl new file mode 100644 index 000000000..e69de29bb diff --git a/wp_localization/localization/sk/main.ftl b/wp_localization/localization/sk/main.ftl new file mode 100644 index 000000000..e69de29bb diff --git a/wp_localization/localization/sq/main.ftl b/wp_localization/localization/sq/main.ftl new file mode 100644 index 000000000..e69de29bb diff --git a/wp_localization/localization/sr/main.ftl b/wp_localization/localization/sr/main.ftl new file mode 100644 index 000000000..e69de29bb diff --git a/wp_localization/localization/sv/main.ftl b/wp_localization/localization/sv/main.ftl new file mode 100644 index 000000000..feb621187 --- /dev/null +++ b/wp_localization/localization/sv/main.ftl @@ -0,0 +1,39 @@ +parse_api_root_failure_reason_wordfence_blocking_access = Wordfence blockerar åtkomst till webbplatsens API. Kontrollera din Wordfence-konfiguration. + +application_passwords_not_supported = Webbplatsen stöder inte applikationslösenord. + +wordpress_org_api_client_error_request_encoding = Misslyckades att koda begäran. Orsak: { $reason }. + +uuid_parse_error_not_version_4 = Inte en version 4 UUID. + +uuid_parse_error_invalid_uuid = Ogiltig UUID-sträng. + +http_auth_method_unknown = Okänd HTTP-autentiseringsmetod. + +http_auth_method_missing_algorithm = Saknar algoritm i HTTP-autentiseringsmetod. + +http_auth_method_missing_qop = Saknar QOP (Quality of Protection) i HTTP-autentiseringsmetod. + +http_auth_method_missing_nonce = Saknar engångskod i HTTP-autentiseringsmetod. + +oauth_response_url_error_unsuccessful_login = Inloggning misslyckades. + +invalid_ssl_error_generic_ssl_error = Kan inte etablera en säker anslutning till servern + +invalid_ssl_error_certificate_not_valid_for_name = Ogiltigt SSL-ceritfikat + +just = { $message } + +request_execution_failed = Misslyckades att skicka HTTP. + +invalid_http_status_code = Ogiltig HTTP-statuskod: { $status_code }. + +media_file_not_found = Mediafil hittades inte på { $path }. + +url_parsing_error = URL är ogiltig. + +site_error_message = Din webbplats skickade ett felmeddelande: { $error_message }. + +wp_api_error_generic_error = Något gick fel. + +probably_not_wordpress_site = Webbplatsen verkar inte vara en WordPress-webbplats. diff --git a/wp_localization/localization/th/main.ftl b/wp_localization/localization/th/main.ftl new file mode 100644 index 000000000..e69de29bb diff --git a/wp_localization/localization/tr-TR/main.ftl b/wp_localization/localization/tr-TR/main.ftl index 750d12178..7a1a05410 100644 --- a/wp_localization/localization/tr-TR/main.ftl +++ b/wp_localization/localization/tr-TR/main.ftl @@ -1,72 +1,77 @@ -wp_api_error_generic_error = Bir şeyler yanlış gitti. +parse_api_root_failure_reason_server_fatal_error = Sunucunuz kurtarılamaz bir hatayla karşılaştı ve isteği işleyemedi. Lütfen sunucu hata günlüklerinizi kontrol edin. -site_error_message = Siteniz bir hata mesajı gönderdi: {$error_message}. +parse_api_root = Sitenin WordPress REST API kök yanıtı ayrıştırılamadı. -url_parsing_error = Geçersiz URL. +application_passwords_not_supported = Site Uygulama Şifrelerini desteklemiyor. -response_parsing_error = Yanıt işlenemedi: {$reason}. +application_passwords_disabled_for_http_site = Bu site için Uygulama Şifreleri etkin değil – bunun nedeni muhtemelen güvenli bir bağlantı kuramamamız. Lütfen bu siteye bir SSL sertifikası ekleyin ve tekrar deneyin. -media_file_not_found = Medya dosyası {$path} konumunda bulunamadı. +site_is_local_development_environment = Bu site yerel bir geliştirme ortamı. Uygulama ile bağlanabilmek için uygulama şifrelerini etkinleştirmeniz gerekiyor. -invalid_http_status_code = Geçersiz HTTP durum kodu: {$status_code}. +application_password_blocked_by_multiple_plugins = { $url } adresine giriş yapılamıyor – Uygulama Şifrelerini devre dışı bırakmış olabilecek birden fazla eklenti yüklü. Lütfen bunları devre dışı bırakın ve tekrar deneyin. -request_execution_failed = HTTP gönderimi başarısız oldu. +application_password_blocked_by_plugin = { $url } adresine giriş yapılamıyor – { $plugin } eklentisi Uygulama Şifrelerini devre dışı bırakmış olabilir. Daha fazla bilgi için lütfen { $support_url } adresini ziyaret edin. -just = {$message} +xmlrpc_endpoint_not_found = Sitenin XML-RPC uç noktası bulunamadı. Lütfen site ayarlarınızı kontrol edip tekrar deneyin. -invalid_ssl_error_certificate_not_valid_for_name = Geçersiz SSL sertifikası +xmlrpc_disabled_by_multiple_plugins = Sitenin XML-RPC özelliği devre dışı – XML-RPC'yi devre dışı bırakmış olabilecek birden fazla eklenti yüklü. Lütfen bu eklentileri devre dışı bırakıp tekrar deneyin. -non_existent_site_error = Belirtilen bilgisayar adına sahip bir sunucu bulunamadı. +wordpress_org_api_client_error_request_encoding = İstek kodlanamadı. Neden: { $reason }. -http_authentication_required_error = {$url} adresindeki sunucu kimlik doğrulaması gerektiriyor. Lütfen kullanıcı adınızı ve şifrenizi girin. +uuid_parse_error_not_version_4 = Sürüm 4 UUID değil. -http_authentication_rejected_error = {$url} adresindeki sunucu giriş bilgilerinizi reddetti. Lütfen geçerli bir kullanıcı adı ve şifre girin. +uuid_parse_error_invalid_uuid = Geçersiz UUID dizesi. -misconfigured_http_authentication_error = Sunucu geçersiz HTTP kimlik doğrulama bilgileri gönderiyor. Lütfen sitenizin HTTP kimlik doğrulama yapılandırmasını kontrol edin. +uniffi_serialization_error_serde = Serileştirme hatası: { $reason }. -misconfigured_rate_limit_error = Sunucu istekleri asla başarılı olmayacak şekilde sınırlıyor. Lütfen sitenizin hız sınırı yapılandırmasını kontrol edin. +http_auth_method_unknown = Bilinmeyen HTTP kimlik doğrulama yöntemi. -oauth_response_url_error_url_invalid = Site geçersiz bir kimlik doğrulama yanıt URL'si gönderdi. -oauth_response_url_error_unsuccessful_login = Başarısız giriş. +http_auth_method_missing_opaque = HTTP kimlik doğrulama yönteminde opak değer eksik. + +http_auth_method_missing_algorithm = HTTP kimlik doğrulama yönteminde algoritma eksik. + +http_auth_method_missing_qop = HTTP kimlik doğrulama yönteminde QOP (Koruma Kalitesi) eksik. + +http_auth_method_missing_nonce = HTTP kimlik doğrulama yönteminde nonce eksik. + +invalid_header_value_error = Geçersiz başlık değeri: { $header_value }. + +invalid_header_name_error = Geçersiz başlık adı: { $header_name }. boolean_true_is_returned_when_string_is_expected = Bu alan için `String` değeri beklenirken boolean `true` değeri alındı. -invalid_header_name_error = Geçersiz başlık adı: {$header_name}. +oauth_response_url_error_unsuccessful_login = Başarısız giriş. -invalid_header_value_error = Geçersiz başlık değeri: {$header_value}. +oauth_response_url_error_url_invalid = Site geçersiz bir kimlik doğrulama yanıt URL'si gönderdi. -http_auth_method_missing_nonce = HTTP kimlik doğrulama yönteminde nonce eksik. -http_auth_method_missing_qop = HTTP kimlik doğrulama yönteminde QOP (Koruma Kalitesi) eksik. -http_auth_method_missing_algorithm = HTTP kimlik doğrulama yönteminde algoritma eksik. -http_auth_method_missing_opaque = HTTP kimlik doğrulama yönteminde opak değer eksik. -http_auth_method_unknown = Bilinmeyen HTTP kimlik doğrulama yöntemi. +misconfigured_rate_limit_error = Sunucu istekleri asla başarılı olmayacak şekilde sınırlıyor. Lütfen sitenizin hız sınırı yapılandırmasını kontrol edin. -uniffi_serialization_error_serde = Serileştirme hatası: {$reason}. +misconfigured_http_authentication_error = Sunucu geçersiz HTTP kimlik doğrulama bilgileri gönderiyor. Lütfen sitenizin HTTP kimlik doğrulama yapılandırmasını kontrol edin. -uuid_parse_error_invalid_uuid = Geçersiz UUID dizesi. -uuid_parse_error_not_version_4 = Sürüm 4 UUID değil. +http_server_error = Sunucuya bağlanılamıyor: { $reason }. Lütfen sunucu sağlayıcınızla iletişime geçin. -wordpress_org_api_client_error_request_encoding = İstek kodlanamadı. Neden: {$reason}. +http_authentication_rejected_error = { $url } adresindeki sunucu giriş bilgilerinizi reddetti. Lütfen geçerli bir kullanıcı adı ve şifre girin. -http_forbidden_error = {$url} adresindeki sunucu istenen kaynağa erişimi reddetti. Lütfen sitenizin yapılandırmasını kontrol edin. +http_authentication_required_error = { $url } adresindeki sunucu kimlik doğrulaması gerektiriyor. Lütfen kullanıcı adınızı ve şifrenizi girin. -probably_not_wordpress_site = Site bir WordPress sitesi gibi görünmüyor. +non_existent_site_error = Belirtilen bilgisayar adına sahip bir sunucu bulunamadı. -rest_api_disabled = Sitenin REST API'si devre dışı. Lütfen REST API'yi etkinleştirmek için site ayarlarınızı güncelleyin. +invalid_ssl_error_certificate_not_valid_for_name = Geçersiz SSL sertifikası -xmlrpc_disabled_by_host = Sitenin XML-RPC özelliği devre dışı bırakılmış. Lütfen bu sorunu çözmek için barındırma sağlayıcınızla iletişime geçin. -xmlrpc_disabled_by_plugin = Sitenin XML-RPC özelliği devre dışı – {$plugin} eklentisi XML-RPC'yi devre dışı bırakmış olabilir. Daha fazla bilgi için {$support_url} adresini ziyaret edin. -xmlrpc_disabled_by_multiple_plugins = Sitenin XML-RPC özelliği devre dışı – XML-RPC'yi devre dışı bırakmış olabilecek birden fazla eklenti yüklü. Lütfen bu eklentileri devre dışı bırakıp tekrar deneyin. -xmlrpc_endpoint_not_found = Sitenin XML-RPC uç noktası bulunamadı. Lütfen site ayarlarınızı kontrol edip tekrar deneyin. +just = { $message } -application_password_blocked_by_plugin = {$url} adresine giriş yapılamıyor – {$plugin} eklentisi Uygulama Şifrelerini devre dışı bırakmış olabilir. Daha fazla bilgi için lütfen {$support_url} adresini ziyaret edin. +request_execution_failed = HTTP gönderimi başarısız oldu. -application_password_blocked_by_multiple_plugins = {$url} adresine giriş yapılamıyor – Uygulama Şifrelerini devre dışı bırakmış olabilecek birden fazla eklenti yüklü. Lütfen bunları devre dışı bırakın ve tekrar deneyin. +invalid_http_status_code = Geçersiz HTTP durum kodu: { $status_code }. -site_is_local_development_environment = Bu site yerel bir geliştirme ortamı. Uygulama ile bağlanabilmek için uygulama şifrelerini etkinleştirmeniz gerekiyor. +media_file_not_found = Medya dosyası { $path } konumunda bulunamadı. -application_passwords_disabled_for_http_site = Bu site için Uygulama Şifreleri etkin değil – bunun nedeni muhtemelen güvenli bir bağlantı kuramamamız. Lütfen bu siteye bir SSL sertifikası ekleyin ve tekrar deneyin. +response_parsing_error = Yanıt işlenemedi: { $reason }. -application_passwords_not_supported = Site Uygulama Şifrelerini desteklemiyor. +url_parsing_error = Geçersiz URL. -parse_api_root = Sitenin WordPress REST API kök yanıtı ayrıştırılamadı. +site_error_message = Siteniz bir hata mesajı gönderdi: { $error_message }. + +wp_api_error_generic_error = Bir şeyler yanlış gitti. + +probably_not_wordpress_site = Site bir WordPress sitesi gibi görünmüyor. diff --git a/wp_localization/localization/uz/main.ftl b/wp_localization/localization/uz/main.ftl new file mode 100644 index 000000000..e69de29bb diff --git a/wp_localization/localization/vi/main.ftl b/wp_localization/localization/vi/main.ftl new file mode 100644 index 000000000..e69de29bb diff --git a/wp_localization/localization/zh-CN/main.ftl b/wp_localization/localization/zh-CN/main.ftl new file mode 100644 index 000000000..e69de29bb diff --git a/wp_localization/localization/zh-HK/main.ftl b/wp_localization/localization/zh-HK/main.ftl new file mode 100644 index 000000000..e69de29bb diff --git a/wp_localization/localization/zh-TW/main.ftl b/wp_localization/localization/zh-TW/main.ftl new file mode 100644 index 000000000..e69de29bb