From b03bc997fc17d04d7e0e6d8f3615e977e9be0a71 Mon Sep 17 00:00:00 2001 From: Mauro <34335419+Velin92@users.noreply.github.com> Date: Wed, 5 Apr 2023 19:36:51 +0200 Subject: [PATCH] Translations workflow and tools (#768) * Translations workflow and tools * improved the name of the workflow * need this commit to trigger the workflow for the first time * swift tools can now run on CI * only strings and stringsdict will be committed * fixed a workflow issue * starting the workflow to save it * fixing downgrade issues * fixing URL usage * install localazy * fixing add-paths typo * downloaded strings * removing on push trigger * Update Tools/Sources/DownloadTranslations.swift Co-authored-by: Doug <6060466+pixlwave@users.noreply.github.com> * Added locheck for string verification * code formatting improvement * Update Tools/Sources/Locheck.swift Co-authored-by: Doug <6060466+pixlwave@users.noreply.github.com> * pr suggestion --------- Co-authored-by: Doug <6060466+pixlwave@users.noreply.github.com> --- .github/workflows/translations-pr.yml | 37 +++ .../es.lproj/Localizable.strings | 281 ++++++++++++++++++ .../es.lproj/Localizable.stringsdict | 54 ++++ .../it.lproj/Localizable.strings | 6 +- .../ro.lproj/Localizable.strings | 266 ++++++++--------- Package.swift | 2 +- Tools/Sources/BuildSDK.swift | 4 +- Tools/Sources/DownloadStrings.swift | 18 ++ Tools/Sources/Locheck.swift | 44 +++ Tools/Sources/OutdatedPackages.swift | 2 +- Tools/Sources/SetupProject.swift | 2 +- Tools/Sources/Tools.swift | 4 +- Tools/Sources/Utilities.swift | 4 +- localazy.json => localazy-all.json | 0 localazy-en.json | 36 +++ 15 files changed, 616 insertions(+), 144 deletions(-) create mode 100644 .github/workflows/translations-pr.yml create mode 100644 ElementX/Resources/Localizations/es.lproj/Localizable.strings create mode 100644 ElementX/Resources/Localizations/es.lproj/Localizable.stringsdict create mode 100644 Tools/Sources/DownloadStrings.swift create mode 100644 Tools/Sources/Locheck.swift rename localazy.json => localazy-all.json (100%) create mode 100644 localazy-en.json diff --git a/.github/workflows/translations-pr.yml b/.github/workflows/translations-pr.yml new file mode 100644 index 000000000..3a34e3452 --- /dev/null +++ b/.github/workflows/translations-pr.yml @@ -0,0 +1,37 @@ +name: Open Translations PR +on: + schedule: + # At 00:00 on every Monday UTC + - cron: '0 0 * * 1' + workflow_dispatch: + +jobs: + open-translations-pr: + runs-on: macos-12 + # Skip in forks + if: github.repository == 'vector-im/element-x-ios' + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Setup Localazy and Mint + run: brew install mint localazy/tools/localazy + + - name: Download All Translations + run: swift run tools download-strings --all-languages + + - name: Verify Translations + run: swift run tools locheck + + - name: Create PR for Translations + uses: peter-evans/create-pull-request@v5 + with: + commit-message: Translations update + title: Translations update + body: | + - Translations update + branch: translations/update + base: develop + add-paths: | + *.strings + *.stringsdict \ No newline at end of file diff --git a/ElementX/Resources/Localizations/es.lproj/Localizable.strings b/ElementX/Resources/Localizations/es.lproj/Localizable.strings new file mode 100644 index 000000000..b98c526f0 --- /dev/null +++ b/ElementX/Resources/Localizations/es.lproj/Localizable.strings @@ -0,0 +1,281 @@ +"Notification" = "Notificación"; +"a11y_hide_password" = "Ocultar contraseña"; +"a11y_send_files" = "Enviar archivos"; +"a11y_show_password" = "Mostrar contraseña"; +"a11y_user_menu" = "Menú de usuario"; +"action_back" = "Atrás"; +"action_cancel" = "Cancelar"; +"action_clear" = "Borrar"; +"action_close" = "Cerrar"; +"action_complete_verification" = "Completar verificación"; +"action_confirm" = "Confirmar"; +"action_continue" = "Continuar"; +"action_copy" = "Copiar"; +"action_copy_link" = "Copiar enlace"; +"action_create_a_room" = "Crear una sala"; +"action_disable" = "Desactivar"; +"action_done" = "Hecho"; +"action_edit" = "Editar"; +"action_enable" = "Activar"; +"action_invite" = "Invitar"; +"action_invite_friends_to_app" = "Invitar amigos a %1$@"; +"action_learn_more" = "Más información"; +"action_leave" = "Salir"; +"action_leave_room" = "Salir de la sala"; +"action_next" = "Siguiente"; +"action_no" = "No"; +"action_not_now" = "Ahora no"; +"action_ok" = "OK"; +"action_quick_reply" = "Respuesta rápida"; +"action_quote" = "Citar"; +"action_remove" = "Eliminar"; +"action_reply" = "Responder"; +"action_report_bug" = "Informar de un error"; +"action_report_content" = "Reportar Contenido"; +"action_retry" = "Reintentar"; +"action_retry_decryption" = "Reintentar descifrado"; +"action_save" = "Guardar"; +"action_search" = "Buscar"; +"action_send" = "Enviar"; +"action_share" = "Compartir"; +"action_share_link" = "Compartir enlace"; +"action_skip" = "Saltar"; +"action_start" = "Comenzar"; +"action_start_chat" = "Iniciar chat"; +"action_start_verification" = "Iniciar la verificación"; +"action_view_source" = "Ver Fuente"; +"action_yes" = "Sí"; +"common_about" = "Acerca de"; +"common_audio" = "Sonido"; +"common_bubbles" = "Burbujas"; +"common_creating_room" = "Creando sala…"; +"common_current_user_left_room" = "Saliste de la sala"; +"common_decryption_error" = "Error de descifrado"; +"common_developer_options" = "Opciones de desarrollador"; +"common_edited_suffix" = "(editado)"; +"common_editing" = "Edición"; +"common_encryption_enabled" = "Cifrado activado"; +"common_error" = "Error"; +"common_file" = "Archivo"; +"common_gif" = "GIF"; +"common_image" = "Imagen"; +"common_link_copied_to_clipboard" = "Enlace copiado al portapapeles"; +"common_loading" = "Cargando…"; +"common_message" = "Mensaje"; +"common_message_layout" = "Diseño del mensaje"; +"common_message_removed" = "Mensaje eliminado"; +"common_modern" = "Moderno"; +"common_no_results" = "No hay resultados"; +"common_offline" = "Sin conexión"; +"common_password" = "Contraseña"; +"common_people" = "Personas"; +"common_permalink" = "Enlace permanente"; +"common_reactions" = "Reacciones"; +"common_replying_to" = "Respondiendo a %1$@"; +"common_report_a_bug" = "Informar de un error"; +"common_report_submitted" = "Informe enviado"; +"common_search_for_someone" = "Buscar a alguien"; +"common_security" = "Seguridad"; +"common_select_your_server" = "Selecciona tu servidor"; +"common_sending" = "Enviando…"; +"common_server_not_supported" = "Servidor no compatible"; +"common_server_url" = "Dirección del servidor"; +"common_settings" = "Ajustes"; +"common_sticker" = "Sticker"; +"common_success" = "Terminado"; +"common_suggestions" = "Sugerencias"; +"common_topic" = "Tema"; +"common_unable_to_decrypt" = "No se puede descifrar"; +"common_unsupported_event" = "Evento no compatible"; +"common_username" = "Usuario"; +"common_verification_cancelled" = "Verificación cancelada"; +"common_verification_complete" = "Verificación completada"; +"common_video" = "Vídeo"; +"common_waiting" = "Esperando…"; +"crash_detection_dialog_content" = "%1$@ se cerró inesperadamente la última vez que se lo usaste. ¿Quieres compartir un informe de error con nosotros?"; +"dialog_title_confirmation" = "Confirmar"; +"dialog_title_error" = "Error"; +"dialog_title_success" = "Terminado"; +"dialog_title_warning" = "Atención"; +"emoji_picker_category_activity" = "Actividades"; +"emoji_picker_category_flags" = "Banderas"; +"emoji_picker_category_foods" = "Comida y bebida"; +"emoji_picker_category_nature" = "Animales y naturaleza"; +"emoji_picker_category_objects" = "Objetos"; +"emoji_picker_category_people" = "Emojis y personas"; +"emoji_picker_category_places" = "Viajes y lugares"; +"emoji_picker_category_symbols" = "Símbolos"; +"error_failed_creating_the_permalink" = "No se pudo crear el enlace permanente"; +"error_failed_loading_messages" = "Error al cargar mensajes"; +"error_no_compatible_app_found" = "No se encontró ninguna aplicación compatible con esta acción."; +"error_some_messages_have_not_been_sent" = "Algunos mensajes no se han enviado"; +"error_unknown" = "Lo siento, se ha producido un error"; +"invite_friends_text" = "Hola, puedes hablar conmigo en %1$@: %2$@"; +"leave_room_alert_empty_subtitle" = "¿Estás seguro de que quieres salir de esta sala? Eres la única persona aquí. Si te vas, nadie podrá unirse en el futuro, ni siquiera tú."; +"leave_room_alert_private_subtitle" = "¿Estás seguro de que quieres abandonar esta sala? Esta sala no es pública y no podrás volver a entrar sin una invitación."; +"leave_room_alert_subtitle" = "¿Seguro que quieres salir de la habitación?"; +"login_initial_device_name_ios" = "%1$@ iOS"; +"preference_rageshake" = "Agitar con fuerza para informar de un error"; +"rageshake_detection_dialog_content" = "Parece que sacudes el teléfono con frustración. ¿Quieres abrir la pantalla de informe de errores?"; +"rageshake_dialog_content" = "Parece que sacudes el teléfono con frustración. ¿Quieres abrir la pantalla de informe de errores?"; +"report_content_explanation" = "Este mensaje se notificará al administrador de su homeserver. No podrán leer ningún mensaje cifrado."; +"report_content_hint" = "Motivo para denunciar este contenido"; +"rich_text_editor_bullet_list" = "Lista de puntos"; +"rich_text_editor_code_block" = "Bloque de código"; +"rich_text_editor_composer_placeholder" = "Mensaje…"; +"rich_text_editor_format_bold" = "Aplicar formato negrita"; +"rich_text_editor_format_italic" = "Aplicar formato cursiva"; +"rich_text_editor_format_strikethrough" = "Aplicar formato tachado"; +"rich_text_editor_format_underline" = "Aplicar formato de subrayado"; +"rich_text_editor_full_screen_toggle" = "Pantalla completa"; +"rich_text_editor_indent" = "Añadir sangría"; +"rich_text_editor_inline_code" = "Código"; +"rich_text_editor_link" = "Enlazar"; +"rich_text_editor_numbered_list" = "Lista numérica"; +"rich_text_editor_quote" = "Cita"; +"rich_text_editor_unindent" = "Quitar sangría"; +"room_timeline_beginning_of_room" = "Este es el principio de %1$@."; +"room_timeline_beginning_of_room_no_name" = "Este es el principio de esta conversación."; +"room_timeline_read_marker_title" = "Nuevos"; +"screen_bug_report_attach_screenshot" = "Adjuntar captura de pantalla"; +"screen_bug_report_contact_me" = "Podéis poneros en contacto conmigo para resolver dudas relacionadas"; +"screen_bug_report_edit_screenshot" = "Editar captura de pantalla"; +"screen_bug_report_editor_description" = "Describe el problema. ¿Qué hiciste? ¿Qué esperabas que ocurriera? ¿Qué ocurrió en realidad? Por favor, detállalo todo lo que puedas."; +"screen_bug_report_editor_placeholder" = "Describe el error…"; +"screen_bug_report_editor_supporting" = "Si es posible, escriba la descripción en inglés."; +"screen_bug_report_include_crash_logs" = "Enviar registros de fallos"; +"screen_bug_report_include_logs" = "Enviar registros para ayudar"; +"screen_bug_report_include_screenshot" = "Enviar captura de pantalla"; +"screen_bug_report_logs_description" = "Para comprobar que todo funciona correctamente, se enviarán registros de fallos con su mensaje. Serán privados. Para enviar sólo tu mensaje, desactiva esta opción."; +"screen_bug_report_rash_logs_alert_title" = "%1$@ se cerró inesperadamente la última vez que se lo usaste. ¿Quieres compartir un informe de error con nosotros?"; +"screen_change_server_error_invalid_homeserver" = "No hemos podido acceder a este servidor. Comprueba que has introducido correctamente la dirección del servidor. Si la dirección es correcta, ponte en contacto con el administrador del servidor para obtener más ayuda."; +"screen_change_server_error_no_sliding_sync_message" = "Este servidor no soporta sliding sync."; +"screen_change_server_form_header" = "Dirección del homeserver"; +"screen_change_server_form_notice" = "Solo puedes conectarte a un servidor que soporte sliding sync. El administrador de tu servidor tendrá que configurarlo. %1$@"; +"screen_change_server_submit" = "Continuar"; +"screen_change_server_subtitle" = "¿Cuál es la dirección de tu servidor?"; +"screen_change_server_title" = "Selecciona tu servidor"; +"screen_create_room_action_create_room" = "Nueva sala"; +"screen_create_room_action_invite_people" = "Invitar gente"; +"screen_create_room_add_people_title" = "Añadir personas"; +"screen_dm_details_block_alert_action" = "Bloquear"; +"screen_dm_details_block_alert_description" = "Los usuarios bloqueados no podrán enviarte mensajes y se ocultarán todos sus mensajes. Puedes revertir esta acción en cualquier momento."; +"screen_dm_details_block_user" = "Bloquear usuario"; +"screen_dm_details_unblock_alert_action" = "Desbloquear"; +"screen_dm_details_unblock_alert_description" = "Al desbloquear al usuario, podrás volver a ver todos sus mensajes."; +"screen_dm_details_unblock_user" = "Desbloquear usuario"; +"screen_login_error_deactivated_account" = "Esta cuenta ha sido desactivada."; +"screen_login_error_invalid_credentials" = "Usuario y/o contraseña incorrectos"; +"screen_login_error_invalid_user_id" = "Este no es un id de usuario válido. Formato esperado: '@user:homeserver.org'"; +"screen_login_error_unsupported_authentication" = "El servidor seleccionado no admite contraseñas ni inicio de sesión OIDC. Póngase en contacto con su administrador o elija otro homeserver."; +"screen_login_form_header" = "Introduce tus datos"; +"screen_login_password_hint" = "Contraseña"; +"screen_login_server_header" = "Donde viven tus conversaciones"; +"screen_login_submit" = "Continuar"; +"screen_login_title" = "¡Hola de nuevo!"; +"screen_login_username_hint" = "Usuario"; +"screen_onboarding_welcome_subtitle" = "Bienvenido a la beta de %1$@. Vitaminado, para mayor rapidez y sencillez."; +"screen_onboarding_welcome_title" = "Siéntente en tu Elemento"; +"screen_report_content_block_user" = "Bloquear usuario"; +"screen_report_content_block_user_hint" = "Marque si quieres ocultar todos los mensajes actuales y futuros de este usuario"; +"screen_room_details_encryption_enabled_subtitle" = "Los mensajes están protegidos con \"candados\". Sólo tú y los destinatarios tenéis las llaves únicas para abrirlos."; +"screen_room_details_encryption_enabled_title" = "Cifrado de mensajes activado"; +"screen_room_details_invite_people_title" = "Invitar a otras personas"; +"screen_room_details_leave_room_title" = "Salir de la sala"; +"screen_room_details_people_title" = "Personas"; +"screen_room_details_security_title" = "Seguridad"; +"screen_room_details_share_room_title" = "Compartir sala"; +"screen_room_details_topic_title" = "Tema"; +"screen_room_member_details_block_alert_action" = "Bloquear"; +"screen_room_member_details_block_alert_description" = "Los usuarios bloqueados no podrán enviarte mensajes y se ocultarán todos sus mensajes. Puede revertir esta acción en cualquier momento."; +"screen_room_member_details_block_user" = "Bloquear usuario"; +"screen_room_member_details_unblock_alert_action" = "Desbloquear"; +"screen_room_member_details_unblock_alert_description" = "Al desbloquear al usuario, podrás volver a ver todos sus mensajes."; +"screen_room_member_details_unblock_user" = "Desbloquear usuario"; +"screen_roomlist_a11y_create_message" = "Crear una nueva conversación o sala"; +"screen_roomlist_main_space_title" = "Todos los chats"; +"screen_session_verification_cancelled_subtitle" = "Algo no fue bien. Se agotó el tiempo de espera de la solicitud o se rechazó."; +"screen_session_verification_cancelled_title" = "Verificación cancelada"; +"screen_session_verification_compare_emojis_subtitle" = "Confirma que los emojis que aparecen a continuación coinciden con los que aparecen en tu otra sesión."; +"screen_session_verification_compare_emojis_title" = "Comparar emojis"; +"screen_session_verification_complete_subtitle" = "Tu nueva sesión ya está verificada. Tienes acceso a tus mensajes cifrados y otros usuarios lo considerarán de confianza."; +"screen_session_verification_open_existing_session_subtitle" = "Demuestra que eres tú para acceder a tu historial de mensajes cifrados."; +"screen_session_verification_open_existing_session_title" = "Abrir una sesión existente"; +"screen_session_verification_positive_button_canceled" = "Reintentar la verificación"; +"screen_session_verification_positive_button_initial" = "Estoy listo"; +"screen_session_verification_positive_button_ready" = "Comenzar"; +"screen_session_verification_positive_button_verifying_ongoing" = "Esperando a que coincida"; +"screen_session_verification_request_accepted_subtitle" = "Compara los emoji, asegurándote de que aparecen en el mismo orden."; +"screen_session_verification_they_dont_match" = "No coinciden"; +"screen_session_verification_they_match" = "Coinciden"; +"screen_session_verification_waiting_to_accept_subtitle" = "Acepta la solicitud para iniciar el proceso de verificación en tu otra sesión para continuar."; +"screen_session_verification_waiting_to_accept_title" = "A la espera de aceptar la solicitud"; +"screen_signout_confirmation_dialog_content" = "¿Estás seguro de que quieres cerrar sesión?"; +"screen_signout_confirmation_dialog_submit" = "Cerrar sesión"; +"screen_signout_confirmation_dialog_title" = "Cerrar sesión"; +"screen_signout_in_progress_dialog_content" = "Cerrando sesión…"; +"screen_signout_preference_item" = "Cerrar sesión"; +"screen_start_chat_error_starting_chat" = "Se ha producido un error al intentar iniciar un chat"; +"screen_start_chat_unknown_profile" = "No podemos validar el ID de Matrix de este usuario. Es posible que no reciba la invitación."; +"session_verification_banner_message" = "Parece que estás usando un nuevo dispositivo. Verifica que eres tú para acceder a tus mensajes cifrados."; +"session_verification_banner_title" = "Accede a tu historial de mensajes"; +"settings_rageshake" = "Agitar con fuerza"; +"settings_rageshake_detection_threshold" = "Umbral de detección"; +"settings_title_general" = "General"; +"settings_version_number" = "Versión: %1$@ (%2$@)"; +"state_event_avatar_changed_too" = "(el avatar también cambió)"; +"state_event_avatar_url_changed" = "%1$@ cambió su avatar"; +"state_event_avatar_url_changed_by_you" = "Cambiaste tu avatar"; +"state_event_display_name_changed_from" = "%1$@ cambió su nombre de %2$@ a %3$@"; +"state_event_display_name_changed_from_by_you" = "Cambiaste tu nombre de %1$@ a %2$@"; +"state_event_display_name_removed" = "%1$@ eliminó su nombre (era %2$@)"; +"state_event_display_name_removed_by_you" = "Eliminaste tu nombre (era %1$@)"; +"state_event_display_name_set" = "%1$@ cambió su nombre a %2$@"; +"state_event_display_name_set_by_you" = "Cambiaste tu nombre a %1$@"; +"state_event_room_avatar_changed" = "%1$@ cambió el avatar de la sala"; +"state_event_room_avatar_changed_by_you" = "Cambiaste el avatar de la sala"; +"state_event_room_avatar_removed" = "%1$@ eliminó el avatar de la sala"; +"state_event_room_avatar_removed_by_you" = "Eliminaste el avatar de la sala"; +"state_event_room_ban" = "%1$@ expulsó permanentemente a %2$@"; +"state_event_room_ban_by_you" = "Expulsaste permanentemente a %1$@"; +"state_event_room_created" = "%1$@ creó la sala"; +"state_event_room_created_by_you" = "Tú creaste la sala"; +"state_event_room_invite" = "%1$@ invitó a %2$@"; +"state_event_room_invite_accepted" = "%1$@ aceptó la invitación"; +"state_event_room_invite_accepted_by_you" = "Aceptaste la invitación"; +"state_event_room_invite_by_you" = "Invitaste a %1$@"; +"state_event_room_invite_you" = "%1$@ te invitó."; +"state_event_room_join" = "%1$@ se unió a la sala"; +"state_event_room_join_by_you" = "Te uniste a la sala"; +"state_event_room_knock" = "%1$@ solicitó unirse"; +"state_event_room_knock_accepted" = "%1$@ permitió que %2$@ se uniera"; +"state_event_room_knock_accepted_by_you" = "%1$@ te permitió unirte"; +"state_event_room_knock_by_you" = "Solicitaste unirte"; +"state_event_room_knock_denied" = "%1$@ rechazó la solicitud de %2$@ para unirse"; +"state_event_room_knock_denied_by_you" = "Rechazaste la solicitud de %1$@ para unirte"; +"state_event_room_knock_denied_you" = "%1$@ rechazó su solicitud para unirte"; +"state_event_room_knock_retracted" = "%1$@ ya no está interesado en unirse"; +"state_event_room_knock_retracted_by_you" = "Cancelaste tu solicitud de unirte"; +"state_event_room_leave" = "%1$@ salió de la sala"; +"state_event_room_leave_by_you" = "Saliste de la sala"; +"state_event_room_name_changed" = "%1$@ cambió el nombre de la sala a: %2$@"; +"state_event_room_name_changed_by_you" = "Cambiaste el nombre de la sala a: %1$@"; +"state_event_room_name_removed" = "%1$@ eliminó el nombre de la sala"; +"state_event_room_name_removed_by_you" = "Eliminaste el nombre de la sala"; +"state_event_room_reject" = "%1$@ rechazó la invitación"; +"state_event_room_reject_by_you" = "Rechazaste la invitación"; +"state_event_room_remove" = "%1$@ echó a %2$@"; +"state_event_room_remove_by_you" = "Echaste a %1$@"; +"state_event_room_third_party_invite" = "%1$@ envió una invitación a %2$@ para unirse a la sala"; +"state_event_room_third_party_invite_by_you" = "Enviaste una invitación a %1$@ para unirse a la sala"; +"state_event_room_third_party_revoked_invite" = "%1$@ revocó la invitación a %2$@ para unirse a la sala"; +"state_event_room_third_party_revoked_invite_by_you" = "Revocaste la invitación de %1$@ para unirse a la sala"; +"state_event_room_topic_changed" = "%1$@ cambió el tema a: %2$@"; +"state_event_room_topic_changed_by_you" = "Cambiaste el tema a: %1$@"; +"state_event_room_topic_removed" = "%1$@ eliminó el tema de la sala"; +"state_event_room_topic_removed_by_you" = "Eliminaste el tema de la sala"; +"state_event_room_unban" = "%1$@ readmitió a %2$@"; +"state_event_room_unban_by_you" = "Readmitiste a %1$@"; +"state_event_room_unknown_membership_change" = "%1$@ realizó un cambio desconocido en su membresía"; +"test_language_identifier" = "es"; +"test_untranslated_default_language_identifier" = "en"; diff --git a/ElementX/Resources/Localizations/es.lproj/Localizable.stringsdict b/ElementX/Resources/Localizations/es.lproj/Localizable.stringsdict new file mode 100644 index 000000000..213a8dbfd --- /dev/null +++ b/ElementX/Resources/Localizations/es.lproj/Localizable.stringsdict @@ -0,0 +1,54 @@ + + + + + common_member_count + + NSStringLocalizedFormatKey + %#@COUNT@ + COUNT + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + %1$d miembro + other + %1$d miembros + + + room_timeline_state_changes + + NSStringLocalizedFormatKey + %#@COUNT@ + COUNT + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + %1$d cambio en la sala + other + %1$d cambios en la sala + + + screen_room_member_list_header_title + + NSStringLocalizedFormatKey + %#@COUNT@ + COUNT + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + Una persona + other + %1$d personas + + + + \ No newline at end of file diff --git a/ElementX/Resources/Localizations/it.lproj/Localizable.strings b/ElementX/Resources/Localizations/it.lproj/Localizable.strings index b8da99e1d..a5eb54f41 100644 --- a/ElementX/Resources/Localizations/it.lproj/Localizable.strings +++ b/ElementX/Resources/Localizations/it.lproj/Localizable.strings @@ -48,7 +48,7 @@ "common_about" = "Informazioni"; "common_audio" = "Audio"; "common_bubbles" = "Fumetti"; -"common_creating_room" = "Creazione stanza..."; +"common_creating_room" = "Creazione stanza…"; "common_current_user_left_room" = "Hai lasciato la stanza"; "common_decryption_error" = "Errore di decrittazione"; "common_developer_options" = "Opzioni sviluppatore"; @@ -141,7 +141,7 @@ "screen_bug_report_contact_me" = "Potete contattarmi per qualsiasi altra domanda"; "screen_bug_report_edit_screenshot" = "Modifica istantanea schermo"; "screen_bug_report_editor_description" = "Descrivi il bug. Che cosa hai fatto? Cosa ti aspettavi che accadesse? Cosa è effettivamente accaduto. Si prega di inserire il maggior numero di dettagli possibile."; -"screen_bug_report_editor_placeholder" = "Descrivi il problema..."; +"screen_bug_report_editor_placeholder" = "Descrivi il problema…"; "screen_bug_report_editor_supporting" = "Se possibile, scrivere la descrizione in inglese."; "screen_bug_report_include_crash_logs" = "Invia i log degli arresti anomali"; "screen_bug_report_include_logs" = "Invia i log per aiutarci"; @@ -213,7 +213,7 @@ "screen_signout_confirmation_dialog_content" = "Sei sicuro di voler uscire?"; "screen_signout_confirmation_dialog_submit" = "Esci"; "screen_signout_confirmation_dialog_title" = "Esci"; -"screen_signout_in_progress_dialog_content" = "Uscita in corso..."; +"screen_signout_in_progress_dialog_content" = "Uscita in corso…"; "screen_signout_preference_item" = "Esci"; "screen_start_chat_error_starting_chat" = "Si è verificato un errore durante il tentativo di avviare una chat"; "screen_start_chat_unknown_profile" = "Non possiamo convalidare l'ID Matrix di questo utente. L'invito potrebbe non essere ricevuto."; diff --git a/ElementX/Resources/Localizations/ro.lproj/Localizable.strings b/ElementX/Resources/Localizations/ro.lproj/Localizable.strings index aac9a4906..38d5c3161 100644 --- a/ElementX/Resources/Localizations/ro.lproj/Localizable.strings +++ b/ElementX/Resources/Localizations/ro.lproj/Localizable.strings @@ -1,55 +1,55 @@ "Notification" = "Notificare"; -"a11y_hide_password" = "Ascunde parola"; -"a11y_send_files" = "Trimite fișiere"; -"a11y_show_password" = "Arata parola"; +"a11y_hide_password" = "Ascundeți parola"; +"a11y_send_files" = "Trimiteți fișiere"; +"a11y_show_password" = "Afișați parola"; "a11y_user_menu" = "Meniu utilizator"; "action_back" = "Înapoi"; -"action_cancel" = "Anulează"; -"action_clear" = "Șterge"; -"action_close" = "Închide"; +"action_cancel" = "Anulați"; +"action_clear" = "Ștergeți"; +"action_close" = "Închideți"; "action_complete_verification" = "Verificare completă"; -"action_confirm" = "Confirmă"; -"action_continue" = "Continuă"; -"action_copy" = "Copiază"; -"action_copy_link" = "Copiază linkul"; -"action_create_a_room" = "Crează o cameră"; -"action_disable" = "Dezactivează"; -"action_done" = "Gata"; -"action_edit" = "Editează"; -"action_enable" = "Activează"; -"action_invite" = "Invită"; -"action_invite_friends_to_app" = "Invită prieteni în %1$@"; -"action_learn_more" = "Află mai multe"; -"action_leave" = "Părăsește"; -"action_leave_room" = "Părăsește camera"; +"action_confirm" = "Confirmați"; +"action_continue" = "Continuați"; +"action_copy" = "Copiați"; +"action_copy_link" = "Copiați linkul"; +"action_create_a_room" = "Creați o cameră"; +"action_disable" = "Dezactivați"; +"action_done" = "Efectuat"; +"action_edit" = "Editați"; +"action_enable" = "Activați"; +"action_invite" = "Invitați"; +"action_invite_friends_to_app" = "Invitați prieteni în %1$@"; +"action_learn_more" = "Aflați mai multe"; +"action_leave" = "Părăsiți"; +"action_leave_room" = "Părăsiți camera"; "action_next" = "Următorul"; "action_no" = "Nu"; "action_not_now" = "Nu acum"; "action_ok" = "OK"; "action_quick_reply" = "Raspuns rapid"; -"action_quote" = "Citează"; -"action_remove" = "Șterge"; -"action_reply" = "Răspunde"; -"action_report_bug" = "Raportează o eroare"; -"action_report_content" = "Raportează conținutul"; -"action_retry" = "Reîncearcă"; -"action_retry_decryption" = "Reîncearcă decriptarea"; -"action_save" = "Salvează"; -"action_search" = "Caută"; -"action_send" = "Trimite"; -"action_share" = "Partajează"; -"action_share_link" = "Partajează linkul"; -"action_skip" = "Omite"; -"action_start" = "Începe"; -"action_start_chat" = "Începe discuția"; -"action_start_verification" = "Începe verificarea"; -"action_view_source" = "Vezi sursa"; +"action_quote" = "Citat"; +"action_remove" = "Ștergeți"; +"action_reply" = "Răspundeți"; +"action_report_bug" = "Raportați o eroare"; +"action_report_content" = "Raportați conținutul"; +"action_retry" = "Reîncercați"; +"action_retry_decryption" = "Reîncercați decriptarea"; +"action_save" = "Salvați"; +"action_search" = "Căutați"; +"action_send" = "Trimiteți"; +"action_share" = "Partajați"; +"action_share_link" = "Partajați linkul"; +"action_skip" = "Omiteți"; +"action_start" = "Începeți"; +"action_start_chat" = "Începeți discuția"; +"action_start_verification" = "Începeți verificarea"; +"action_view_source" = "Vedeți sursă"; "action_yes" = "Da"; "common_about" = "Despre"; "common_audio" = "Audio"; "common_bubbles" = "Baloane"; "common_creating_room" = "Se creează camera…"; -"common_current_user_left_room" = "Left room"; +"common_current_user_left_room" = "Ați parăsit camera"; "common_decryption_error" = "Eroare de decriptare"; "common_developer_options" = "Opțiuni programator"; "common_edited_suffix" = "(editat)"; @@ -72,11 +72,11 @@ "common_permalink" = "Permalink"; "common_reactions" = "Reacții"; "common_replying_to" = "Răspuns pentru %1$@"; -"common_report_a_bug" = "Raporteaza o eroare"; +"common_report_a_bug" = "Raportați o eroare"; "common_report_submitted" = "Raport trimis"; -"common_search_for_someone" = "Caută pe cineva"; +"common_search_for_someone" = "Căutați pe cineva"; "common_security" = "Securitate"; -"common_select_your_server" = "Selectează serverul"; +"common_select_your_server" = "Selectați serverul"; "common_sending" = "Se trimite…"; "common_server_not_supported" = "Serverul nu este compatibil"; "common_server_url" = "Adresa URL a serverului"; @@ -92,7 +92,7 @@ "common_verification_complete" = "Verificare completă"; "common_video" = "Video"; "common_waiting" = "Se aşteaptă…"; -"crash_detection_dialog_content" = "%1$@ s-a blocat ultima dată când a fost folosit. Dorești să ne trimiti un raport?"; +"crash_detection_dialog_content" = "%1$@ s-a blocat ultima dată când a fost folosit. Doriți să ne trimiteți un raport?"; "dialog_title_confirmation" = "Confirmare"; "dialog_title_error" = "Eroare"; "dialog_title_success" = "Succes"; @@ -111,171 +111,171 @@ "error_some_messages_have_not_been_sent" = "Unele mesaje nu au fost trimise"; "error_unknown" = "Ne pare rău, a apărut o eroare"; "invite_friends_text" = "Hei, vorbește cu mine pe %1$@: %2$@"; -"leave_room_alert_empty_subtitle" = "Ești sigur că vrei să părăsești această cameră? Ești singura persoană de aici. Dacă o părasești, nimeni nu se va mai putea alătura în viitor, inclusiv tu."; -"leave_room_alert_private_subtitle" = "Ești sigur că vrei să părăsești această cameră? Această cameră nu este publică și nu te vei putea alătura din nou fără o invitație."; -"leave_room_alert_subtitle" = "Ești sigur că vrei să părăsești camera?"; +"leave_room_alert_empty_subtitle" = "Sunteți sigur că vreți să părăsiți această cameră? Sunteți singura persoană de aici. Dacă o părasiți, nimeni nu se va mai putea alătura în viitor, inclusiv dumneavoastra."; +"leave_room_alert_private_subtitle" = "Sunteți sigur că vrei să părăsiți această cameră? Această cameră nu este publică și nu va veti putea alătura din nou fără o invitație."; +"leave_room_alert_subtitle" = "Sunteți sigur că vreți să părăsiți camera?"; "login_initial_device_name_ios" = "%1$@ iOS"; "preference_rageshake" = "Rageshake pentru a raporta erori"; -"rageshake_detection_dialog_content" = "Se pare că scuturi telefonul de frustrare. Dorești să deschizi ecranul de raportare a unei erori?"; -"rageshake_dialog_content" = "Se pare că scuturi telefonul de frustrare. Dorești să deschizi ecranul de raportare a unei erori?"; +"rageshake_detection_dialog_content" = "Se pare că scuturați telefonul de frustrare. Doriți să deschdeți ecranul de raportare a unei erori?"; +"rageshake_dialog_content" = "Se pare că scuturați telefonul de frustrare. Doriți să deschdeți ecranul de raportare a unei erori?"; "report_content_explanation" = "Acest mesaj va fi raportat administratorilor homeserver-ului tau. Ei nu vor putea citi niciun mesaj criptat."; "report_content_hint" = "Motivul raportării acestui conținut"; -"rich_text_editor_bullet_list" = "Comutează lista cu puncte"; -"rich_text_editor_code_block" = "Comutează blocul de cod"; +"rich_text_editor_bullet_list" = "Comutați lista cu puncte"; +"rich_text_editor_code_block" = "Comutați blocul de cod"; "rich_text_editor_composer_placeholder" = "Mesaj…"; -"rich_text_editor_format_bold" = "Aplică formatul aldin"; -"rich_text_editor_format_italic" = "Aplică formatul italic"; -"rich_text_editor_format_strikethrough" = "Aplică formatul barat"; +"rich_text_editor_format_bold" = "Aplicați formatul aldin"; +"rich_text_editor_format_italic" = "Aplicați formatul italic"; +"rich_text_editor_format_strikethrough" = "Aplicați formatul barat"; "rich_text_editor_format_underline" = "Aplică formatul de subliniere"; -"rich_text_editor_full_screen_toggle" = "Comută modul ecran intreg"; +"rich_text_editor_full_screen_toggle" = "Comutați modul ecran complet"; "rich_text_editor_indent" = "Indentare"; -"rich_text_editor_inline_code" = "Aplică formatul de cod in linie"; +"rich_text_editor_inline_code" = "Aplicați formatul de cod inline"; "rich_text_editor_link" = "Setați linkul"; -"rich_text_editor_numbered_list" = "Comută lista numerotată"; -"rich_text_editor_quote" = "Aplică citatul"; +"rich_text_editor_numbered_list" = "Comutați lista numerotată"; +"rich_text_editor_quote" = "Aplicați citatul"; "rich_text_editor_unindent" = "Dez-identare"; "room_timeline_beginning_of_room" = "Acesta este începutul conversației %1$@."; "room_timeline_beginning_of_room_no_name" = "Acesta este începutul acestei conversații."; "room_timeline_read_marker_title" = "Nou"; -"screen_bug_report_attach_screenshot" = "Atașează o captură de ecran"; +"screen_bug_report_attach_screenshot" = "Atașați o captură de ecran"; "screen_bug_report_contact_me" = "Puteți să mă contactați dacă aveți întrebări suplimentare"; -"screen_bug_report_edit_screenshot" = "Editează captura de ecran"; -"screen_bug_report_editor_description" = "Te rugăm să descrii eroarea. Ce-ai făcut? Ce te aşteptai să se întâmple? Ce s-a întâmplat de fapt. Te rugam să intri în cât mai multe detalii cu putință."; -"screen_bug_report_editor_placeholder" = "Descrie eroarea…"; -"screen_bug_report_editor_supporting" = "Dacă posibil, te rugăm să scrii descrierea în engleză."; -"screen_bug_report_include_crash_logs" = "Trimite log-uri"; -"screen_bug_report_include_logs" = "Trimite log-uri pentru a ajuta"; -"screen_bug_report_include_screenshot" = "Trimite captură de ecran"; +"screen_bug_report_edit_screenshot" = "Editați captura de ecran"; +"screen_bug_report_editor_description" = "Vă rugăm să descrieți eroarea. Ce ați făcut? Ce vă aşteptați să se întâmple? Ce s-a întâmplat de fapt. Vă rugam să intrați în cât mai multe detalii cu putință."; +"screen_bug_report_editor_placeholder" = "Descrieți eroarea…"; +"screen_bug_report_editor_supporting" = "Dacă posibil, vă rugăm să scrieți descrierea în engleză."; +"screen_bug_report_include_crash_logs" = "Trimiteți log-uri"; +"screen_bug_report_include_logs" = "Trimiteți log-uri pentru a ajuta"; +"screen_bug_report_include_screenshot" = "Trimiteți captură de ecran"; "screen_bug_report_logs_description" = "Pentru a verifica că lucrurile funcționează conform așteptărilor, log-uri vor fi trimise împreună cu mesajul. Acestea vor fi private. Pentru a trimite doar mesajul, dezactivați această setare."; "screen_bug_report_rash_logs_alert_title" = "%1$@ s-a blocat ultima dată când a fost folosit. Dorești să ne trimiti un raport?"; "screen_change_server_error_invalid_homeserver" = "Nu am putut accesa acest homeserver. Te rugăm să verifici că ai introdus corect adresa URL a homeserver-ului. Dacă adresa URL este corectă, contactează administratorul homeserver-ului pentru ajutor suplimentar."; "screen_change_server_error_no_sliding_sync_message" = "Momentan acest server nu oferă suport pentru sliding sync."; "screen_change_server_form_header" = "Adresa URL a homeserver-ului"; -"screen_change_server_form_notice" = "Te poți conecta numai la un server existent care oferă suport pentru sliding sync. Administratorul homeserver-ului tău va trebui să îl configureze. %1$@"; -"screen_change_server_submit" = "Continuă"; -"screen_change_server_subtitle" = "Care este adresa serverului tău?"; -"screen_change_server_title" = "Selectează serverul"; +"screen_change_server_form_notice" = "Vă putețo conecta numai la un server existent care oferă suport pentru sliding sync. Administratorul homeserver-ului dumneavoastră va trebui să îl configureze. %1$@"; +"screen_change_server_submit" = "Continuați"; +"screen_change_server_subtitle" = "Care este adresa serverului dumneavoastră?"; +"screen_change_server_title" = "Selectați serverul"; "screen_create_room_action_create_room" = "Cameră nouă"; -"screen_create_room_action_invite_people" = "Invită persoane"; -"screen_create_room_add_people_title" = "Adaugă persoane"; -"screen_dm_details_block_alert_action" = "Blochează"; -"screen_dm_details_block_alert_description" = "Utilizatorii blocați nu iți vor putea trimite mesaje și toate mesajele lor vor fi ascunse. Poți anula această acțiune oricând."; -"screen_dm_details_block_user" = "Blochează utilizatorul"; -"screen_dm_details_unblock_alert_action" = "Deblochează"; -"screen_dm_details_unblock_alert_description" = "La deblocarea utilizatorului, vei putea vedea din nou toate mesajele de la acesta."; -"screen_dm_details_unblock_user" = "Deblochează utilizatorul"; +"screen_create_room_action_invite_people" = "Invitați persoane"; +"screen_create_room_add_people_title" = "Adaugați persoane"; +"screen_dm_details_block_alert_action" = "Blocați"; +"screen_dm_details_block_alert_description" = "Utilizatorii blocați nu vă vor putea trimite mesaje și toate mesajele lor vor fi ascunse. Puteți anula această acțiune oricând."; +"screen_dm_details_block_user" = "Blocați utilizatorul"; +"screen_dm_details_unblock_alert_action" = "Deblocați"; +"screen_dm_details_unblock_alert_description" = "La deblocarea utilizatorului, veți putea vedea din nou toate mesajele de la acesta."; +"screen_dm_details_unblock_user" = "Deblocați utilizatorul"; "screen_login_error_deactivated_account" = "Acest cont a fost dezactivat."; "screen_login_error_invalid_credentials" = "Utilizator și/sau parolă incorecte"; "screen_login_error_invalid_user_id" = "Acesta nu este un identificator de utilizator valid. Format așteptat: „@user:homeserver.org”"; "screen_login_error_unsupported_authentication" = "Homeserver-ul selectat nu acceptă autentificarea prin parola sau OIDC. Te rugăm să contactezi administratorul sau să alegi un alt homeserver."; -"screen_login_form_header" = "Introdu-ți detaliile"; +"screen_login_form_header" = "Introduceți detaliile"; "screen_login_password_hint" = "Parolă"; "screen_login_server_header" = "Locul unde trăiesc conversațiile tale"; -"screen_login_submit" = "Continuă"; -"screen_login_title" = "Bine ai revenit!"; +"screen_login_submit" = "Continuați"; +"screen_login_title" = "Bine ați revenit!"; "screen_login_username_hint" = "Utilizator"; "screen_onboarding_welcome_subtitle" = "Bun venit la versiunea beta a %1$@. Supraalimentat, pentru viteză și simplitate."; "screen_onboarding_welcome_title" = "Fii în Elementul tău"; -"screen_report_content_block_user" = "Blochează utilizatorul"; -"screen_report_content_block_user_hint" = "Verifică că dorești să ascunzi toate mesajele curente și viitoare de la acest utilizator"; -"screen_room_details_encryption_enabled_subtitle" = "Mesajele sunt securizate cu încuietori. Doar tu și destinatarii aveți cheile unice pentru a le debloca."; +"screen_report_content_block_user" = "Blocați utilizatorul"; +"screen_report_content_block_user_hint" = "Confirmați că doriți să ascundeți toate mesajele curente și viitoare de la acest utilizator"; +"screen_room_details_encryption_enabled_subtitle" = "Mesajele sunt securizate cu încuietori. Doar dumneavoastră și destinatarii aveți cheile unice pentru a le debloca."; "screen_room_details_encryption_enabled_title" = "Criptarea mesajelor este activată"; -"screen_room_details_invite_people_title" = "Invită persoane"; -"screen_room_details_leave_room_title" = "Părăsește camera"; +"screen_room_details_invite_people_title" = "Invitați persoane"; +"screen_room_details_leave_room_title" = "Părăsiți camera"; "screen_room_details_people_title" = "Persoane"; "screen_room_details_security_title" = "Securitate"; -"screen_room_details_share_room_title" = "Partajează camera"; +"screen_room_details_share_room_title" = "Partajați camera"; "screen_room_details_topic_title" = "Subiect"; -"screen_room_member_details_block_alert_action" = "Blochează"; -"screen_room_member_details_block_alert_description" = "Utilizatorii blocați nu iți vor putea trimite mesaje și toate mesajele lor vor fi ascunse. Poți anula această acțiune oricând."; +"screen_room_member_details_block_alert_action" = "Blocați"; +"screen_room_member_details_block_alert_description" = "Utilizatorii blocați nu vă vor putea trimite mesaje și toate mesajele lor vor fi ascunse. Puteți anula această acțiune oricând."; "screen_room_member_details_block_user" = "Blocați utilizatorul"; -"screen_room_member_details_unblock_alert_action" = "Deblochează"; -"screen_room_member_details_unblock_alert_description" = "La deblocarea utilizatorului, vei putea vedea din nou toate mesajele de la acesta."; -"screen_room_member_details_unblock_user" = "Deblochează utilizatorul"; -"screen_roomlist_a11y_create_message" = "Crează o conversație sau o cameră nouă"; +"screen_room_member_details_unblock_alert_action" = "Deblocați"; +"screen_room_member_details_unblock_alert_description" = "La deblocarea utilizatorului, veți putea vedea din nou toate mesajele de la acesta."; +"screen_room_member_details_unblock_user" = "Deblocați utilizatorul"; +"screen_roomlist_a11y_create_message" = "Creați o conversație sau o cameră nouă"; "screen_roomlist_main_space_title" = "Toate conversatiile"; "screen_session_verification_cancelled_subtitle" = "Ceva nu este în regulă. Fie cererea a expirat, fie a fost respinsă."; "screen_session_verification_cancelled_title" = "Verificare anulată"; -"screen_session_verification_compare_emojis_subtitle" = "Confirmă că emoticoanele de mai jos se potrivesc cu cele afișate în cealaltă sesiune."; -"screen_session_verification_compare_emojis_title" = "Compară emoticoanele"; -"screen_session_verification_complete_subtitle" = "Noua ta sesiune este acum verificată. Are acces la mesajele tale criptate, iar alți utilizatori îl te vor vedea ca fiind de încredere."; -"screen_session_verification_open_existing_session_subtitle" = "Demonstreaza-ți identitatea pentru a accesa istoricul mesajelor tale criptate."; -"screen_session_verification_open_existing_session_title" = "Deschide o sesiune existentă"; -"screen_session_verification_positive_button_canceled" = "Reîncearcă verificarea"; +"screen_session_verification_compare_emojis_subtitle" = "Confirmați că emoticoanele de mai jos se potrivesc cu cele afișate în cealaltă sesiune."; +"screen_session_verification_compare_emojis_title" = "Comparați emoticoanele"; +"screen_session_verification_complete_subtitle" = "Noua dumneavoastră sesiune este acum verificată. Are acces la mesajele dumneavoastră criptate, iar alți utilizatori vă vor vedea ca fiind de încredere."; +"screen_session_verification_open_existing_session_subtitle" = "Demonstrați-vă identitatea pentru a accesa istoricul mesajelor criptate."; +"screen_session_verification_open_existing_session_title" = "Deschideți o sesiune existentă"; +"screen_session_verification_positive_button_canceled" = "Reîncercați verificarea"; "screen_session_verification_positive_button_initial" = "Sunt pregătit"; -"screen_session_verification_positive_button_ready" = "Începe"; +"screen_session_verification_positive_button_ready" = "Începeți"; "screen_session_verification_positive_button_verifying_ongoing" = "Se așteaptă confirmarea"; -"screen_session_verification_request_accepted_subtitle" = "Compară emoticoalene asigurându-te că apar în aceeași ordine."; +"screen_session_verification_request_accepted_subtitle" = "Comparăți emoticoalene asigurându-vă că apar în aceeași ordine."; "screen_session_verification_they_dont_match" = "Nu se potrivesc"; "screen_session_verification_they_match" = "Se potrivesc"; -"screen_session_verification_waiting_to_accept_subtitle" = "Acceptă solicitarea de a începe procesul de verificare în cealaltă sesiune pentru a continua."; +"screen_session_verification_waiting_to_accept_subtitle" = "Acceptați solicitarea de a începe procesul de verificare în cealaltă sesiune pentru a continua."; "screen_session_verification_waiting_to_accept_title" = "Se așteptă acceptarea cererii"; -"screen_signout_confirmation_dialog_content" = "Ești sigur că vrei să te deconectezi?"; -"screen_signout_confirmation_dialog_submit" = "Deconectează-te"; -"screen_signout_confirmation_dialog_title" = "Deconectează-te"; +"screen_signout_confirmation_dialog_content" = "Sunteți sigur că vreți să vă deconectați?"; +"screen_signout_confirmation_dialog_submit" = "Deconectați-vă"; +"screen_signout_confirmation_dialog_title" = "Deconectați-vă"; "screen_signout_in_progress_dialog_content" = "Deconectare în curs…"; -"screen_signout_preference_item" = "Deconectează-te"; +"screen_signout_preference_item" = "Deconectați-vă"; "screen_start_chat_error_starting_chat" = "A apărut o eroare la încercarea începerii conversației"; "screen_start_chat_unknown_profile" = "Nu am putut valida ID-ul Matrix al acestui utilizator. Este posibil ca invitația să nu fi fost primită."; -"session_verification_banner_message" = "Se pare că folosești un dispozitiv nou. Verifică-ți identitatea pentru acces la mesajele tale criptate."; -"session_verification_banner_title" = "Accesează istoricul mesajelor"; +"session_verification_banner_message" = "Se pare că folosiți un dispozitiv nou. Verificați-vă identitatea pentru acces la mesajele dumneavoastră criptate."; +"session_verification_banner_title" = "Accesați istoricul mesajelor"; "settings_rageshake" = "Rageshake"; "settings_rageshake_detection_threshold" = "Prag de detecție"; "settings_title_general" = "General"; "settings_version_number" = "Versiunea: %1$@ (%2$@)"; "state_event_avatar_changed_too" = "(s-a schimbat si avatarul)"; "state_event_avatar_url_changed" = "%1$@ și-a schimbat avatarul"; -"state_event_avatar_url_changed_by_you" = "Ți-ai schimbat avatarul"; +"state_event_avatar_url_changed_by_you" = "V-ați schimbat avatarul"; "state_event_display_name_changed_from" = "%1$@ și-a schimbat numele din %2$@ în %3$@"; -"state_event_display_name_changed_from_by_you" = "Ți-ai schimbat numele din %1$@ în %2$@"; +"state_event_display_name_changed_from_by_you" = "V-ați schimbat numele din %1$@ în %2$@"; "state_event_display_name_removed" = "%1$@ și-a sters numele (era %2$@)"; -"state_event_display_name_removed_by_you" = "Ți-ai sters numele (era %1$@)"; +"state_event_display_name_removed_by_you" = "V-ați sters numele (era %1$@)"; "state_event_display_name_set" = "%1$@ și-a schimbat numele %2$@"; -"state_event_display_name_set_by_you" = "Ți-ai schimbat numele în %1$@"; +"state_event_display_name_set_by_you" = "V-ați schimbat numele în %1$@"; "state_event_room_avatar_changed" = "%1$@ a schimbat avatarul camerei"; -"state_event_room_avatar_changed_by_you" = "Ai schimbat avatarul camerei"; +"state_event_room_avatar_changed_by_you" = "Ați schimbat avatarul camerei"; "state_event_room_avatar_removed" = "%1$@ a șters avatarul camerei"; -"state_event_room_avatar_removed_by_you" = "Ai șters avatarul camerei"; +"state_event_room_avatar_removed_by_you" = "Ați șters avatarul camerei"; "state_event_room_ban" = "%1$@ a adăugat o interdicție pentru %2$@"; -"state_event_room_ban_by_you" = "Ai adăugat o interdicție pentru %1$@"; +"state_event_room_ban_by_you" = "Ați adăugat o interdicție pentru %1$@"; "state_event_room_created" = "%1$@ a creat camera"; -"state_event_room_created_by_you" = "Ai creat camera"; +"state_event_room_created_by_you" = "Ați creat camera"; "state_event_room_invite" = "%1$@ l-a invitat pe %2$@"; "state_event_room_invite_accepted" = "%1$@ a acceptat invitația"; -"state_event_room_invite_accepted_by_you" = "Ai acceptat invitația"; -"state_event_room_invite_by_you" = "L-ai invitat pe %1$@"; -"state_event_room_invite_you" = "%1$@ te-a invitat"; +"state_event_room_invite_accepted_by_you" = "Ați acceptat invitația"; +"state_event_room_invite_by_you" = "L-ați invitat pe %1$@"; +"state_event_room_invite_you" = "%1$@ v-a invitat"; "state_event_room_join" = "%1$@ a intrat în cameră"; -"state_event_room_join_by_you" = "Ai intrat în cameră"; +"state_event_room_join_by_you" = "Ați intrat în cameră"; "state_event_room_knock" = "%1$@ a solicitat să se alăture camerei"; "state_event_room_knock_accepted" = "%1$@ i-a permis lui %2$@ să se alăture camerei"; -"state_event_room_knock_accepted_by_you" = "%1$@ ți-a permis să te alături camerei"; -"state_event_room_knock_by_you" = "Ai solicitat să te alături camerei"; +"state_event_room_knock_accepted_by_you" = "%1$@ v-a permis să vă alăturați camerei"; +"state_event_room_knock_by_you" = "Ați solicitat să vă alăturați camerei"; "state_event_room_knock_denied" = "%1$@ a respins solicitarea de alăturare a lui %2$@"; -"state_event_room_knock_denied_by_you" = "Ai respins solicitarea de alăturare a lui %1$@"; -"state_event_room_knock_denied_you" = "%1$@ a respins cererea ta de alăturare"; +"state_event_room_knock_denied_by_you" = "Ați respins solicitarea de alăturare a lui %1$@"; +"state_event_room_knock_denied_you" = "%1$@ a respins cererea dumneavoastră de alăturare"; "state_event_room_knock_retracted" = "%1$@ nu mai este interesat să se alăture camerei"; -"state_event_room_knock_retracted_by_you" = "Ți-ai anulat cererea de alăturare"; +"state_event_room_knock_retracted_by_you" = "Ați anulat cererea de alăturare"; "state_event_room_leave" = "%1$@ a părăsit camera"; -"state_event_room_leave_by_you" = "Ai părăsit camera"; +"state_event_room_leave_by_you" = "Ați părăsit camera"; "state_event_room_name_changed" = "%1$@ a schimbat numele camerei în: %2$@"; -"state_event_room_name_changed_by_you" = "Ai schimbat numele camerei în: %1$@"; +"state_event_room_name_changed_by_you" = "Ați schimbat numele camerei în: %1$@"; "state_event_room_name_removed" = "%1$@ a sters numele camerei"; -"state_event_room_name_removed_by_you" = "Ai șters numele camerei"; +"state_event_room_name_removed_by_you" = "Ați șters numele camerei"; "state_event_room_reject" = "%1$@ a respins invitația"; -"state_event_room_reject_by_you" = "Ai respins invitația"; +"state_event_room_reject_by_you" = "Ați respins invitația"; "state_event_room_remove" = "%1$@ l-a îndepărtat pe %2$@"; -"state_event_room_remove_by_you" = "L-ai îndepărtat pe %1$@"; +"state_event_room_remove_by_you" = "L-ați îndepărtat pe %1$@"; "state_event_room_third_party_invite" = "%1$@ a trimis o invitație către %2$@ pentru a se alătura camerei"; -"state_event_room_third_party_invite_by_you" = "Ai trimis o invitație către %1$@ pentru a se alătura camerei"; +"state_event_room_third_party_invite_by_you" = "Ați trimis o invitație către %1$@ pentru a se alătura camerei"; "state_event_room_third_party_revoked_invite" = "%1$@ a revocat invitația pentru %2$@ de a se alătura camerei"; -"state_event_room_third_party_revoked_invite_by_you" = "Ai revocat invitația pentru %1$@ de a se alătura camerei"; +"state_event_room_third_party_revoked_invite_by_you" = "Ați revocat invitația pentru %1$@ de a se alătura camerei"; "state_event_room_topic_changed" = "%1$@ a schimbat subiectul în: %2$@"; -"state_event_room_topic_changed_by_you" = "Ai schimbat subiectul în: %1$@"; +"state_event_room_topic_changed_by_you" = "Ați schimbat subiectul în: %1$@"; "state_event_room_topic_removed" = "%1$@ a șters subiectul camerei"; -"state_event_room_topic_removed_by_you" = "Ai șters subiectul camerei"; +"state_event_room_topic_removed_by_you" = "Ați șters subiectul camerei"; "state_event_room_unban" = "%1$@ a anulat interdicția pentru %2$@"; -"state_event_room_unban_by_you" = "Ai anulat interdicția pentru %1$@"; +"state_event_room_unban_by_you" = "Ați anulat interdicția pentru %1$@"; "state_event_room_unknown_membership_change" = "%1$@ a făcut o modificare necunoscută asupra calității sale de membru"; "test_language_identifier" = "ro"; "test_untranslated_default_language_identifier" = "en"; diff --git a/Package.swift b/Package.swift index 90005dcbb..c1167fbc8 100644 --- a/Package.swift +++ b/Package.swift @@ -6,7 +6,7 @@ import PackageDescription let package = Package( name: "Element Swift", platforms: [ - .macOS(.v13) + .macOS(.v12) ], products: [ .executable(name: "tools", targets: ["Tools"]) diff --git a/Tools/Sources/BuildSDK.swift b/Tools/Sources/BuildSDK.swift index 3b6aedc25..f2f8d5a4c 100644 --- a/Tools/Sources/BuildSDK.swift +++ b/Tools/Sources/BuildSDK.swift @@ -28,7 +28,7 @@ struct BuildSDK: ParsableCommand { var profile: Profile = .debug private var parentDirectoryURL: URL { Utilities.projectDirectoryURL.deletingLastPathComponent() } - private var sdkDirectoryURL: URL { parentDirectoryURL.appending(path: "matrix-rust-sdk") } + private var sdkDirectoryURL: URL { parentDirectoryURL.appendingPathComponent("matrix-rust-sdk") } enum Error: LocalizedError { case rustupOutputFailure @@ -109,7 +109,7 @@ struct BuildSDK: ParsableCommand { /// Update project.yml with the local path of the SDK. func updateProjectYAML() throws { - let yamlURL = Utilities.projectDirectoryURL.appending(path: "project.yml") + let yamlURL = Utilities.projectDirectoryURL.appendingPathComponent("project.yml") let yamlString = try String(contentsOf: yamlURL) guard var projectConfig = try Yams.compose(yaml: yamlString) else { throw Error.failureParsingProjectYAML } diff --git a/Tools/Sources/DownloadStrings.swift b/Tools/Sources/DownloadStrings.swift new file mode 100644 index 000000000..2029d8760 --- /dev/null +++ b/Tools/Sources/DownloadStrings.swift @@ -0,0 +1,18 @@ +import ArgumentParser +import Foundation + +struct DownloadStrings: ParsableCommand { + static var configuration = CommandConfiguration(abstract: "A tool to download localizable strings from localazy") + + @Flag(help: "Use to download translation keys for all languages") + var allLanguages = false + + func run() throws { + try localazyDownload() + } + + private func localazyDownload() throws { + let json = allLanguages ? "localazy-all.json" : "localazy-en.json" + try Utilities.zsh("localazy download --config \(json)") + } +} diff --git a/Tools/Sources/Locheck.swift b/Tools/Sources/Locheck.swift new file mode 100644 index 000000000..82c887189 --- /dev/null +++ b/Tools/Sources/Locheck.swift @@ -0,0 +1,44 @@ +import ArgumentParser +import Foundation + +struct Locheck: ParsableCommand { + enum LocheckError: LocalizedError { + case missingMint + case outputError + + var errorDescription: String? { + switch self { + case .missingMint: + return "💥 Unable to find mint. Fix by running:\nbrew install mint\n" + case .outputError: + return "💥 Failed to read the output from locheck." + } + } + } + + static var configuration = CommandConfiguration(abstract: "A tool that verifies bad strings contained in localization files") + + private var stringsDirectoryURL: URL { + Utilities.projectDirectoryURL.appendingPathComponent("ElementX/Resources/Localizations") + } + + func run() throws { + try checkMint() + try checkStrings() + } + + func checkStrings() throws { + guard let output = try Utilities.zsh("mint run locheck discoverlproj --ignore-missing --ignore lproj_file_missing_from_translation --treat-warnings-as-errors \(stringsDirectoryURL.path)") else { + throw LocheckError.missingMint + } + print(output) + } + + private func checkMint() throws { + let result = try Utilities.zsh("which mint") + + if result?.contains("not found") == true { + throw LocheckError.missingMint + } + } +} diff --git a/Tools/Sources/OutdatedPackages.swift b/Tools/Sources/OutdatedPackages.swift index f882f111a..0e9d647cc 100644 --- a/Tools/Sources/OutdatedPackages.swift +++ b/Tools/Sources/OutdatedPackages.swift @@ -4,7 +4,7 @@ import Foundation struct OutdatedPackages: ParsableCommand { static var configuration = CommandConfiguration(abstract: "A tool to check outdated package dependencies. Please make sure you have already run setup-project before using this tool.") - private var projectSwiftPMDirectoryURL: URL { Utilities.projectDirectoryURL.appending(path: "ElementX.xcodeproj/project.xcworkspace/xcshareddata/swiftpm") } + private var projectSwiftPMDirectoryURL: URL { Utilities.projectDirectoryURL.appendingPathComponent("ElementX.xcodeproj/project.xcworkspace/xcshareddata/swiftpm") } func run() throws { try checkToolsDependencies() diff --git a/Tools/Sources/SetupProject.swift b/Tools/Sources/SetupProject.swift index 942ec4c67..1f5113d25 100644 --- a/Tools/Sources/SetupProject.swift +++ b/Tools/Sources/SetupProject.swift @@ -15,7 +15,7 @@ struct SetupProject: ParsableCommand { } func brewBundleInstall() throws { - try Utilities.zsh("brew install xcodegen swiftgen swiftlint swiftformat git-lfs sourcery kiliankoe/formulae/swift-outdated localazy/tools/localazy") + try Utilities.zsh("brew install xcodegen swiftgen swiftlint swiftformat git-lfs sourcery mint kiliankoe/formulae/swift-outdated localazy/tools/localazy") } func xcodegen() throws { diff --git a/Tools/Sources/Tools.swift b/Tools/Sources/Tools.swift index d9ad51f10..0e69e11cb 100644 --- a/Tools/Sources/Tools.swift +++ b/Tools/Sources/Tools.swift @@ -6,5 +6,7 @@ struct Tools: ParsableCommand { static var configuration = CommandConfiguration(abstract: "A collection of command line tools for ElementX", subcommands: [BuildSDK.self, SetupProject.self, - OutdatedPackages.self]) + OutdatedPackages.self, + DownloadStrings.self, + Locheck.self]) } diff --git a/Tools/Sources/Utilities.swift b/Tools/Sources/Utilities.swift index 2f44241b8..e0c0602b1 100644 --- a/Tools/Sources/Utilities.swift +++ b/Tools/Sources/Utilities.swift @@ -13,13 +13,13 @@ enum Utilities { } } - static var projectDirectoryURL: URL { URL(filePath: FileManager.default.currentDirectoryPath) } + static var projectDirectoryURL: URL { URL(fileURLWithPath: FileManager.default.currentDirectoryPath) } /// Runs a command in zsh. @discardableResult static func zsh(_ command: String, workingDirectoryURL: URL = projectDirectoryURL) throws -> String? { let process = Process() - process.executableURL = URL(filePath: "/bin/zsh") + process.executableURL = URL(fileURLWithPath: "/bin/zsh") process.arguments = ["-cu", command] process.currentDirectoryURL = workingDirectoryURL diff --git a/localazy.json b/localazy-all.json similarity index 100% rename from localazy.json rename to localazy-all.json diff --git a/localazy-en.json b/localazy-en.json new file mode 100644 index 000000000..30b8c0709 --- /dev/null +++ b/localazy-en.json @@ -0,0 +1,36 @@ +{ + "readKey": "a7876306080832595063-aa37154bb3772f6146890fca868d155b2228b492c56c91f67abdcdfb74d6142d", + + "conversion": { + "actions": [ + { + "type": "ios-strings", + "output": "ElementX/Resources/Localizations/${iosLprojFolder}/Localizable.strings", + "excludeKeys": ["REGEX:.*_android"], + "conditions": [ + "equals: ${languageCode}, en" + ], + "filterPlurals": true, + "replacements": { + "%s": "%@", + "$s": "$@" + } + }, + { + "type": "ios-stringsdict", + "output": "ElementX/Resources/Localizations/${iosLprojFolder}/Localizable.stringsdict", + "excludeKeys": ["REGEX:.*_android"], + "conditions": [ + "equals: ${languageCode}, en" + ], + "replacements": { + "%s": "%@", + "$s": "$@" + }, + "params": { + "variable": "COUNT" + } + } + ] + } +}