diff --git a/Gemfile b/Gemfile index 55cfe721f..3c7a8f9a6 100644 --- a/Gemfile +++ b/Gemfile @@ -3,4 +3,5 @@ source 'https://rubygems.org' gem 'fastlane', '~> 2.227' -gem 'fastlane-plugin-wpmreleasetoolkit', '~> 13.2' +gem 'fastlane-plugin-wpmreleasetoolkit', '~> 13.2', git: 'https://github.com/wordpress-mobile/release-toolkit.git', + branch: 'iangmaia/fluent-po-conversion-actions' diff --git a/Gemfile.lock b/Gemfile.lock index 3ac152194..1bc575004 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,3 +1,31 @@ +GIT + remote: https://github.com/wordpress-mobile/release-toolkit.git + revision: 552586996124e02ce189427e51d972d1cabcbea8 + branch: iangmaia/fluent-po-conversion-actions + specs: + fastlane-plugin-wpmreleasetoolkit (13.2.0) + activesupport (>= 6.1.7.1) + buildkit (~> 1.5) + chroma (= 0.2.0) + diffy (~> 3.3) + fastlane (~> 2.213) + gettext (~> 3.4) + git (~> 1.3) + google-cloud-storage (~> 1.31) + java-properties (~> 0.3.0) + nokogiri (~> 1.11) + octokit (~> 6.1) + parallel (~> 1.14) + plist (~> 3.1) + progress_bar (~> 1.3) + rake (>= 12.3, < 14.0) + rake-compiler-dock (~> 1.0) + rqrcode (~> 2.0) + rubocop (~> 1.50) + ruby-progressbar (~> 1.11) + twitter_cldr (~> 6.11) + xcodeproj (~> 1.22) + GEM remote: https://rubygems.org/ specs: @@ -21,33 +49,37 @@ GEM addressable (2.8.7) public_suffix (>= 2.0.2, < 7.0) artifactory (3.0.17) + ast (2.4.3) atomos (0.1.3) - aws-eventstream (1.3.2) - aws-partitions (1.1106.0) - aws-sdk-core (3.224.0) + aws-eventstream (1.4.0) + aws-partitions (1.1110.0) + aws-sdk-core (3.225.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.101.0) - aws-sdk-core (~> 3, >= 3.216.0) + aws-sdk-kms (1.102.0) + aws-sdk-core (~> 3, >= 3.225.0) aws-sigv4 (~> 1.5) - aws-sdk-s3 (1.186.1) - aws-sdk-core (~> 3, >= 3.216.0) + aws-sdk-s3 (1.189.0) + aws-sdk-core (~> 3, >= 3.225.0) aws-sdk-kms (~> 1) aws-sigv4 (~> 1.5) - aws-sigv4 (1.11.0) + aws-sigv4 (1.12.0) aws-eventstream (~> 1, >= 1.0.2) babosa (1.0.4) - base64 (0.2.0) - benchmark (0.4.0) - bigdecimal (3.1.9) + base64 (0.3.0) + benchmark (0.4.1) + bigdecimal (3.2.2) buildkit (1.6.1) sawyer (>= 0.6) + camertron-eprun (1.1.1) chroma (0.2.0) + chunky_png (1.4.0) claide (1.1.0) + cldr-plurals-runtime-rb (1.1.0) colored (1.2) colored2 (3.1.2) commander (4.6.0) @@ -60,8 +92,9 @@ GEM 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) + erubi (1.13.1) excon (0.112.0) faraday (1.10.4) faraday-em_http (~> 1.0) @@ -134,25 +167,15 @@ 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) - activesupport (>= 6.1.7.1) - buildkit (~> 1.5) - chroma (= 0.2.0) - diffy (~> 3.3) - fastlane (~> 2.213) - git (~> 1.3) - google-cloud-storage (~> 1.31) - java-properties (~> 0.3.0) - nokogiri (~> 1.11) - octokit (~> 6.1) - parallel (~> 1.14) - plist (~> 3.1) - progress_bar (~> 1.3) - rake (>= 12.3, < 14.0) - rake-compiler (~> 1.0) - xcodeproj (~> 1.22) fastlane-sirp (1.0.0) sysrandom (~> 1.0) + forwardable (1.3.3) + gettext (3.5.1) + erubi + locale (>= 2.0.5) + prime + racc + text (>= 1.3.0) gh_inspector (1.1.3) git (1.19.1) addressable (~> 2.8) @@ -202,9 +225,12 @@ GEM concurrent-ruby (~> 1.0) java-properties (0.3.0) jmespath (1.6.2) - json (2.12.0) + json (2.12.2) jwt (2.10.1) base64 + language_server-protocol (3.17.0.5) + lint_roller (1.1.0) + locale (2.1.4) logger (1.7.0) mini_magick (4.13.2) mini_mime (1.1.5) @@ -226,16 +252,24 @@ GEM optparse (0.6.0) os (1.1.4) parallel (1.27.0) + parser (3.3.8.0) + ast (~> 2.4.1) + racc plist (3.7.2) + prime (0.1.3) + forwardable + singleton + prism (1.4.0) progress_bar (1.3.4) highline (>= 1.6) options (~> 2.3.0) public_suffix (6.0.2) racc (1.8.1) - rake (13.2.1) - rake-compiler (1.3.0) - rake + rainbow (3.1.1) + rake (13.3.0) + rake-compiler-dock (1.9.1) rchardet (1.9.0) + regexp_parser (2.10.0) representable (3.2.0) declarative (< 0.1.0) trailblazer-option (>= 0.1.1, < 0.2.0) @@ -243,6 +277,25 @@ GEM retriable (3.1.2) rexml (3.4.1) rouge (3.28.0) + rqrcode (2.2.0) + chunky_png (~> 1.0) + rqrcode_core (~> 1.0) + rqrcode_core (1.2.0) + rubocop (1.76.0) + json (~> 2.3) + language_server-protocol (~> 3.17.0.2) + lint_roller (~> 1.1.0) + parallel (~> 1.10) + parser (>= 3.3.0.2) + rainbow (>= 2.2.2, < 4.0) + regexp_parser (>= 2.9.3, < 3.0) + rubocop-ast (>= 1.45.0, < 2.0) + ruby-progressbar (~> 1.7) + unicode-display_width (>= 2.4.0, < 4.0) + rubocop-ast (1.45.0) + parser (>= 3.3.7.2) + prism (~> 1.4) + ruby-progressbar (1.13.0) ruby2_keywords (0.0.5) rubyzip (2.4.1) sawyer (0.9.2) @@ -258,15 +311,22 @@ GEM simctl (1.6.10) CFPropertyList naturally + singleton (0.3.0) sysrandom (1.0.5) terminal-notifier (2.0.0) terminal-table (3.0.2) unicode-display_width (>= 1.1.1, < 3) + text (1.3.1) trailblazer-option (0.1.2) tty-cursor (0.7.1) tty-screen (0.8.2) tty-spinner (0.9.3) tty-cursor (~> 0.7) + twitter_cldr (6.14.0) + base64 + camertron-eprun + cldr-plurals-runtime-rb (~> 1.1) + tzinfo tzinfo (2.0.6) concurrent-ruby (~> 1.0) uber (0.1.0) @@ -292,7 +352,7 @@ PLATFORMS DEPENDENCIES fastlane (~> 2.227) - fastlane-plugin-wpmreleasetoolkit (~> 13.2) + fastlane-plugin-wpmreleasetoolkit (~> 13.2)! BUNDLED WITH 2.4.10 diff --git a/fastlane/Fastfile b/fastlane/Fastfile index 4d1a8a6f3..cb390923d 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -1,5 +1,7 @@ # frozen_string_literal: true +require 'open-uri' + PROJECT_ROOT = File.expand_path('..', __dir__) LANE_VALUE_VERSION = 'WP_VERSION' @@ -11,6 +13,35 @@ 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 +SUPPORTED_LOCALES = [ + { glotpress: 'ar', project: 'ar' }, + { glotpress: 'de', project: 'de' }, + { glotpress: 'es', project: 'es' }, + { glotpress: 'fr', project: 'fr' }, + { glotpress: 'he', project: 'he' }, + { glotpress: 'id', project: 'id' }, + { glotpress: 'it', project: 'it' }, + { glotpress: 'ja', project: 'ja' }, + { glotpress: 'ko', project: 'ko' }, + { glotpress: 'nl', project: 'nl' }, + { glotpress: 'pt-br', project: 'pt-BR' }, + { glotpress: 'ru', project: 'ru' }, + { glotpress: 'sv', project: 'sv' }, + { glotpress: 'tr', project: 'tr-TR' }, + { glotpress: 'zh-cn', project: 'zh-CN' }, + { 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 +136,155 @@ 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| + project_version = get_version_from_cargo_toml + + 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 + fluent_to_po( + input_file: fluent_file, + output_file: LOCALIZATION_PO_SOURCE_FILE, + locale: 'en-US', + project_name: PROJECT_NAME, + project_version: project_version + ) + + 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 + +# 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:| + locale = File.basename(file_path, '.po') + fluent_file_path = File.join(LOCALIZATION_FLUENT_FILES_DIR, locale, MAIN_FLUENT_FILE_NAME) + + UI.user_error!("❌ PO file not found: #{file_path}") unless File.exist?(file_path) + + FileUtils.mkdir_p(File.dirname(fluent_file_path)) + + po_to_fluent( + input_file: file_path, + output_file: 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 + +# 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') + + downloaded_files = download_po_files_from_glotpress + updated_fluent_files = [] + + # Convert PO files back to Fluent format + if downloaded_files.any? + 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") + end + + 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 + +# 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: nil| + UI.header('🌐 Downloading PO files from GlotPress') + + Dir.mktmpdir do |temp_download_dir| + download_dir = temp_download_dir if download_dir.nil? + 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 +end + +# Utils + def xcframework_checksum File.read(xcframework_checksum_file_path).strip! end @@ -126,3 +306,32 @@ end def remove_lane_context_values(names) names.each { |name| lane_context.delete(name) } end + +# Helper method to extract version from Cargo.toml +def get_version_from_cargo_toml + cargo_toml_path = File.join(PROJECT_ROOT, 'wp_api', 'Cargo.toml') + default_version = '1.0.0' + + File.readlines(cargo_toml_path).each do |line| + return line.split('=')[1].strip.gsub(/["']/, '') if line.start_with?('version = ') + end + + default_version +rescue StandardError + default_version +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..b88234fbb --- /dev/null +++ b/wp_localization/glotpress/en-US.pot @@ -0,0 +1,195 @@ +# Generated by fastlane-plugin-wpmreleasetoolkit (13.2.0) +msgid "" +msgstr "" +"Project-Id-Version: wordpress-rs 0.1.0\n" +"POT-Creation-Date: 2025-06-03 17:59+0200\n" +"PO-Revision-Date: 2025-06-03 17:59+0200\n" +"Language: en-US\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: main.ftl:1 +msgid "wp_api_error_generic_error" +msgstr "Something went wrong." + +#: main.ftl:3 +msgid "site_error_message" +msgstr "Your site sent an error message: {$error_message}." + +#: main.ftl:5 +msgid "url_parsing_error" +msgstr "URL is invalid." + +#: main.ftl:7 +msgid "response_parsing_error" +msgstr "Response couldn't be parsed: {$reason}." + +#: main.ftl:9 +msgid "media_file_not_found" +msgstr "Media file not found at {$path}." + +#: main.ftl:11 +msgid "invalid_http_status_code" +msgstr "Invalid HTTP status code: {$status_code}." + +#: main.ftl:13 +msgid "request_execution_failed" +msgstr "Failed to send HTTP." + +#: main.ftl:15 +msgid "just" +msgstr "{$message}" + +#: main.ftl:17 +msgid "invalid_ssl_error_certificate_not_valid_for_name" +msgstr "Invalid SSL certificate" + +#: main.ftl:18 +msgid "invalid_ssl_error_generic_ssl_error" +msgstr "Unable to establish a secure connection to the server" + +#: main.ftl:20 +msgid "non_existent_site_error" +msgstr "A server with the specified hostname could not be found." + +#: main.ftl:22 +msgid "http_authentication_required_error" +msgstr "The server at {$url} requires authentication. Please provide your username and password." + +#: main.ftl:23 +msgid "http_forbidden_error" +msgstr "The server at {$url} denied access to the requested resource. Please check your site's configuration." + +#: main.ftl:24 +msgid "http_timeout_error" +msgstr "The connection timed out" + +#: main.ftl:26 +msgid "http_authentication_rejected_error" +msgstr "The server at {$url} rejected your credentials. Please provide a valid username and password." + +#: main.ftl:28 +msgid "http_server_error" +msgstr "Unable to connect to server: {$reason}. Please contact your server provider." + +#: main.ftl:30 +msgid "misconfigured_http_authentication_error" +msgstr "The server is sending invalid HTTP authentication information. Please check your site's HTTP authentication configuration." + +#: main.ftl:32 +msgid "misconfigured_rate_limit_error" +msgstr "The server is rate limiting requests in a way that will never succeed. Please check your site's rate limit configuration." + +#: main.ftl:34 +msgid "oauth_response_url_error_url_invalid" +msgstr "The site sent an invalid authentication response URL." + +#: main.ftl:35 +msgid "oauth_response_url_error_unsuccessful_login" +msgstr "Unsuccessful Login." + +#: main.ftl:37 +msgid "boolean_true_is_returned_when_string_is_expected" +msgstr "Expecting a `String` value for this field, but received the boolean `true` instead." + +#: main.ftl:39 +msgid "invalid_header_name_error" +msgstr "Invalid header name: {$header_name}." + +#: main.ftl:41 +msgid "invalid_header_value_error" +msgstr "Invalid header value: {$header_value}." + +#: main.ftl:43 +msgid "http_auth_method_missing_nonce" +msgstr "Missing nonce in HTTP authentication method." + +#: main.ftl:44 +msgid "http_auth_method_missing_qop" +msgstr "Missing QOP (Quality of Protection) in HTTP authentication method." + +#: main.ftl:45 +msgid "http_auth_method_missing_algorithm" +msgstr "Missing algorithm in HTTP authentication method." + +#: main.ftl:46 +msgid "http_auth_method_missing_opaque" +msgstr "Missing opaque value in HTTP authentication method." + +#: main.ftl:47 +msgid "http_auth_method_unknown" +msgstr "Unknown HTTP authentication method." + +#: main.ftl:49 +msgid "uniffi_serialization_error_serde" +msgstr "Serialization error: {$reason}." + +#: main.ftl:51 +msgid "uuid_parse_error_invalid_uuid" +msgstr "Invalid UUID string." + +#: main.ftl:52 +msgid "uuid_parse_error_not_version_4" +msgstr "Not a version 4 UUID." + +#: main.ftl:54 +msgid "wordpress_org_api_client_error_request_encoding" +msgstr "Failed to encode request. Reason: {$reason}." + +#: main.ftl:56 +msgid "probably_not_wordpress_site" +msgstr "The site does not appear to be a WordPress site." + +#: main.ftl:57 +msgid "rest_api_disabled" +msgstr "The site's REST API is disabled. Please update your site settings to enable REST API." + +#: main.ftl:58 +msgid "xmlrpc_disabled_by_host" +msgstr "The site's XML-RPC is disabled. Please contact your hosting provider to solve this problem." + +#: main.ftl:59 +msgid "xmlrpc_disabled_by_plugin" +msgstr "The site's XML-RPC is disabled – the {$plugin} plugin might have disabled XML-RPC. Please visit {$support_url} to learn more." + +#: main.ftl:60 +msgid "xmlrpc_disabled_by_multiple_plugins" +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." + +#: main.ftl:61 +msgid "xmlrpc_endpoint_not_found" +msgstr "The site's XML-RPC endpoint could not be found. Please check your site settings and try again." + +#: main.ftl:63 +msgid "application_password_blocked_by_plugin" +msgstr "Unable to login to {$url} – the {$plugin} plugin might have disabled Application Passwords. Please visit {$support_url} to learn more." + +#: main.ftl:64 +msgid "application_password_blocked_by_multiple_plugins" +msgstr "Unable to login to {$url} – there are multiple installed plugins that might have disabled Application Passwords. Please disable them and try again." + +#: main.ftl:65 +msgid "site_is_local_development_environment" +msgstr "This site is a local development environment. You'll need to enable application passwords to connect to it with the app." + +#: main.ftl:66 +msgid "application_passwords_disabled_for_http_site" +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." + +#: main.ftl:67 +msgid "application_passwords_not_supported" +msgstr "The site does not support Application Passwords." + +#: main.ftl:69 +msgid "parse_api_root" +msgstr "Failed to parse the the site's WordPress REST API root response." + +#: main.ftl:70 +msgid "parse_api_root_failure_reason_server_fatal_error" +msgstr "Your server encountered an unrecoverable error and couldn't process the request. Please check your server error logs for details." + +#: main.ftl:71 +msgid "parse_api_root_failure_reason_wordfence_blocking_access" +msgstr "Wordfence is blocking access to the site's API. Please check your Wordfence configuration." diff --git a/wp_localization/localization/pt-BR/main.ftl b/wp_localization/localization/pt-BR/main.ftl new file mode 100644 index 000000000..ddf45b4e3 --- /dev/null +++ b/wp_localization/localization/pt-BR/main.ftl @@ -0,0 +1,80 @@ +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. + +probably_not_wordpress_site = O site não parece ser um site WordPress. + +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. + diff --git a/wp_localization/localization/tr-TR/main.ftl b/wp_localization/localization/tr-TR/main.ftl index 750d12178..ac1d6b152 100644 --- a/wp_localization/localization/tr-TR/main.ftl +++ b/wp_localization/localization/tr-TR/main.ftl @@ -1,72 +1,78 @@ -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ı. +probably_not_wordpress_site = Site bir WordPress sitesi gibi görünmüyor. -http_authentication_required_error = {$url} adresindeki sunucu kimlik doğrulaması gerektiriyor. Lütfen kullanıcı adınızı ve şifrenizi girin. +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. +uuid_parse_error_not_version_4 = Sürüm 4 UUID değil. -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. -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}. -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_unknown = Bilinmeyen HTTP kimlik doğrulama yöntemi. -boolean_true_is_returned_when_string_is_expected = Bu alan için `String` değeri beklenirken boolean `true` değeri alındı. +http_auth_method_missing_opaque = HTTP kimlik doğrulama yönteminde opak değer eksik. -invalid_header_name_error = Geçersiz başlık adı: {$header_name}. +http_auth_method_missing_algorithm = HTTP kimlik doğrulama yönteminde algoritma eksik. -invalid_header_value_error = Geçersiz başlık değeri: {$header_value}. +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. -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. -uniffi_serialization_error_serde = Serileştirme hatası: {$reason}. +invalid_header_value_error = Geçersiz başlık değeri: {$header_value}. -uuid_parse_error_invalid_uuid = Geçersiz UUID dizesi. -uuid_parse_error_not_version_4 = Sürüm 4 UUID değil. +invalid_header_name_error = Geçersiz başlık adı: {$header_name}. -wordpress_org_api_client_error_request_encoding = İstek kodlanamadı. Neden: {$reason}. +boolean_true_is_returned_when_string_is_expected = Bu alan için `String` değeri beklenirken boolean `true` değeri alındı. -http_forbidden_error = {$url} adresindeki sunucu istenen kaynağa erişimi reddetti. Lütfen sitenizin yapılandırmasını kontrol edin. +oauth_response_url_error_unsuccessful_login = Başarısız giriş. -probably_not_wordpress_site = Site bir WordPress sitesi gibi görünmüyor. +oauth_response_url_error_url_invalid = Site geçersiz bir kimlik doğrulama yanıt URL'si gönderdi. -rest_api_disabled = Sitenin REST API'si devre dışı. Lütfen REST API'yi etkinleştirmek için site ayarlarınızı güncelleyin. +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. -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. +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. -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. +http_server_error = Sunucuya bağlanılamıyor: {$reason}. Lütfen sunucu sağlayıcınızla iletişime geçin. -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. +http_authentication_rejected_error = {$url} adresindeki sunucu giriş bilgilerinizi reddetti. Lütfen geçerli bir kullanıcı adı ve şifre girin. -site_is_local_development_environment = Bu site yerel bir geliştirme ortamı. Uygulama ile bağlanabilmek için uygulama şifrelerini etkinleştirmeniz gerekiyor. +http_authentication_required_error = {$url} adresindeki sunucu kimlik doğrulaması gerektiriyor. Lütfen kullanıcı adınızı ve şifrenizi girin. -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. +non_existent_site_error = Belirtilen bilgisayar adına sahip bir sunucu bulunamadı. -application_passwords_not_supported = Site Uygulama Şifrelerini desteklemiyor. +invalid_ssl_error_certificate_not_valid_for_name = Geçersiz SSL sertifikası + +just = {$message} + +request_execution_failed = HTTP gönderimi başarısız oldu. + +invalid_http_status_code = Geçersiz HTTP durum kodu: {$status_code}. + +media_file_not_found = Medya dosyası {$path} konumunda bulunamadı. + +response_parsing_error = Yanıt işlenemedi: {$reason}. + +url_parsing_error = Geçersiz URL. + +site_error_message = Siteniz bir hata mesajı gönderdi: {$error_message}. + +wp_api_error_generic_error = Bir şeyler yanlış gitti. -parse_api_root = Sitenin WordPress REST API kök yanıtı ayrıştırılamadı.