From a77c7e8e3c8df4c7bc4a0052dbebdd2a0db55c1c Mon Sep 17 00:00:00 2001 From: Ferran <3515290+ferranrego@users.noreply.github.com> Date: Thu, 7 Aug 2025 13:19:48 +0200 Subject: [PATCH] feat(lang): add Catalan localization support (#873) Co-authored-by: Gauvain <68083474+Gauvino@users.noreply.github.com> --- i18n.ts | 3 + translations/ca.json | 484 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 487 insertions(+) create mode 100644 translations/ca.json diff --git a/i18n.ts b/i18n.ts index fb95aa07..78469d0b 100644 --- a/i18n.ts +++ b/i18n.ts @@ -1,6 +1,7 @@ import { getLocales } from "expo-localization"; import i18n from "i18next"; import { initReactI18next } from "react-i18next"; +import ca from "./translations/ca.json"; import da from "./translations/da.json"; import de from "./translations/de.json"; import en from "./translations/en.json"; @@ -27,6 +28,7 @@ import zhCN from "./translations/zh-CN.json"; import zhTW from "./translations/zh-TW.json"; export const APP_LANGUAGES = [ + { label: "Catalan", value: "ca" }, { label: "Dansk", value: "da" }, { label: "Deutsch", value: "de" }, { label: "English", value: "en" }, @@ -56,6 +58,7 @@ export const APP_LANGUAGES = [ i18n.use(initReactI18next).init({ compatibilityJSON: "v4", resources: { + ca: { translation: ca }, da: { translation: da }, de: { translation: de }, en: { translation: en }, diff --git a/translations/ca.json b/translations/ca.json new file mode 100644 index 00000000..c00933eb --- /dev/null +++ b/translations/ca.json @@ -0,0 +1,484 @@ +{ + "login": { + "username_required": "Nom d'usuari requerit", + "error_title": "Error", + "login_title": "Inicia sessió", + "login_to_title": "Inicia sessió a", + "username_placeholder": "Nom d'usuari", + "password_placeholder": "Contrasenya", + "login_button": "Inicia sessió", + "quick_connect": "Connexió ràpida", + "enter_code_to_login": "Introdueix el codi {{code}} per iniciar sessió", + "failed_to_initiate_quick_connect": "No s'ha pogut iniciar la connexió ràpida", + "got_it": "Entesos", + "connection_failed": "Ha fallat la connexió", + "could_not_connect_to_server": "No s'ha pogut connectar amb el servidor. Comproveu l'URL i la connexió de xarxa.", + "an_unexpected_error_occured": "S'ha produït un error inesperat", + "change_server": "Canvia el servidor", + "invalid_username_or_password": "Nom d'usuari o contrasenya incorrectes", + "user_does_not_have_permission_to_log_in": "L'usuari no té permís per iniciar sessió", + "server_is_taking_too_long_to_respond_try_again_later": "El servidor triga massa a respondre, torneu-ho a provar més tard", + "server_received_too_many_requests_try_again_later": "El servidor ha rebut massa sol·licituds, torneu-ho a provar més tard.", + "there_is_a_server_error": "Error del servidor", + "an_unexpected_error_occured_did_you_enter_the_correct_url": "S'ha produït un error inesperat. Heu introduït correctament l'URL del servidor?" + }, + "server": { + "enter_url_to_jellyfin_server": "Introdueix l'URL del vostre servidor Jellyfin", + "server_url_placeholder": "http(s)://el-vostre-servidor.com", + "connect_button": "Connecta", + "previous_servers": "servidors anteriors", + "clear_button": "Esborra", + "search_for_local_servers": "Cercar servidors locals", + "searching": "Cercant...", + "servers": "Servidors" + }, + "home": { + "no_internet": "Sense internet", + "no_items": "No hi ha elements", + "no_internet_message": "No us preocupeu, encara podeu veure\nel contingut descarregat.", + "go_to_downloads": "Anar a les descàrregues", + "oops": "Oops!", + "error_message": "Alguna cosa ha anat malament.\nTanqueu la sessió i torneu-la a iniciar.", + "continue_watching": "Continua veient", + "next_up": "A continuació", + "recently_added_in": "Afegit recentment a {{libraryName}}", + "suggested_movies": "Pel·lícules suggerides", + "suggested_episodes": "Episodis suggerits", + "intro": { + "welcome_to_streamyfin": "Benvingut a Streamyfin", + "a_free_and_open_source_client_for_jellyfin": "Un client gratuït i de codi obert per a Jellyfin.", + "features_title": "Funcionalitats", + "features_description": "Streamyfin té moltes funcionalitats i s'integra amb una gran varietat de programari que podeu trobar al menú de configuració, això inclou:", + "jellyseerr_feature_description": "Connecteu-vos a la vostra instància de Jellyseerr i sol·liciteu pel·lícules directament des de l'aplicació.", + "downloads_feature_title": "Descàrregues", + "downloads_feature_description": "Descarregueu pel·lícules i sèries per veure-les sense connexió. Utilitzeu el mètode per defecte o instal·leu el servidor optimitzat per descarregar fitxers en segon pla.", + "chromecast_feature_description": "Envieu pel·lícules i sèries als vostres dispositius Chromecast.", + "centralised_settings_plugin_title": "Plugin de configuració centralitzada", + "centralised_settings_plugin_description": "Configureu els ajustos des d'una ubicació centralitzada al vostre servidor Jellyfin. Tots els ajustos del client per a tots els usuaris se sincronitzaran automàticament.", + "done_button": "Fet", + "go_to_settings_button": "Ves a la configuració", + "read_more": "Mostra més" + }, + "settings": { + "settings_title": "Configuració", + "log_out_button": "Tanca sessió", + "user_info": { + "user_info_title": "Informació de l'usuari", + "user": "Usuari", + "server": "Servidor", + "token": "Token", + "app_version": "Versió de l'aplicació" + }, + "quick_connect": { + "quick_connect_title": "Connexió ràpida", + "authorize_button": "Autoritza connexió ràpida", + "enter_the_quick_connect_code": "Introdueix el codi de connexió ràpida...", + "success": "Èxit", + "quick_connect_autorized": "Connexió ràpida autoritzada", + "error": "Error", + "invalid_code": "Codi invàlid", + "authorize": "Autoritza" + }, + "media_controls": { + "media_controls_title": "Controls multimèdia", + "forward_skip_length": "Durada del salt endavant", + "rewind_length": "Durada del rebobinat", + "seconds_unit": "s" + }, + "audio": { + "audio_title": "Àudio", + "set_audio_track": "Establir pista d'àudio de l'element anterior", + "audio_language": "Idioma de l'àudio", + "audio_hint": "Trieu un idioma d'àudio per defecte.", + "none": "Cap", + "language": "Idioma" + }, + "subtitles": { + "subtitle_title": "Subtítols", + "subtitle_language": "Idioma dels subtítols", + "subtitle_mode": "Mode dels subtítols", + "set_subtitle_track": "Establir pista de subtítols de l'element anterior", + "subtitle_size": "Mida dels subtítols", + "subtitle_hint": "Configureu les preferències dels subtítols.", + "none": "Cap", + "language": "Idioma", + "loading": "Carregant", + "modes": { + "Default": "Per defecte", + "Smart": "Intel·ligent", + "Always": "Sempre", + "None": "Cap", + "OnlyForced": "Només els forçats" + } + }, + "other": { + "other_title": "Altres", + "follow_device_orientation": "Rotació automàtica", + "video_orientation": "Orientació del vídeo", + "orientation": "Orientació", + "orientations": { + "DEFAULT": "Per defecte", + "ALL": "Totes", + "PORTRAIT": "Vertical", + "PORTRAIT_UP": "Vertical amunt", + "PORTRAIT_DOWN": "Vertical avall", + "LANDSCAPE": "Horitzontal", + "LANDSCAPE_LEFT": "Horitzontal esquerra", + "LANDSCAPE_RIGHT": "Horitzontal dreta", + "OTHER": "Altra", + "UNKNOWN": "Desconeguda" + }, + "safe_area_in_controls": "Àrea segura als controls", + "video_player": "Reproductor de vídeo", + "video_players": { + "VLC_3": "VLC 3", + "VLC_4": "VLC 4 (Experimental + PiP)" + }, + "show_custom_menu_links": "Mostrar enllaços del menú personalitzats", + "hide_libraries": "Oculta biblioteques", + "select_liraries_you_want_to_hide": "Seleccioneu les biblioteques que voleu ocultar de la pestanya Biblioteca i de les seccions de la pàgina d'inici.", + "disable_haptic_feedback": "Desactiva la resposta hàptica", + "default_quality": "Qualitat per defecte", + "max_auto_play_episode_count": "Nombre màxim d'episodis de reproducció automàtica", + "disabled": "Desactivat" + }, + "downloads": { + "downloads_title": "Descàrregues", + "download_method": "Mètode de descàrrega", + "remux_max_download": "Màxima descàrrega remux", + "auto_download": "Descàrrega automàtica", + "optimized_versions_server": "Servidor de versions optimitzades", + "save_button": "Desa", + "optimized_server": "Servidor optimitzat", + "optimized": "Optimitzat", + "default": "Per defecte", + "optimized_version_hint": "Introdueix l'URL del servidor d'optimització. L'URL ha d'incloure http o https i opcionalment el port.", + "read_more_about_optimized_server": "Mostra més sobre el servidor d'optimització.", + "url": "URL", + "server_url_placeholder": "http(s)://domini.org:port" + }, + "plugins": { + "plugins_title": "Connectors", + "jellyseerr": { + "jellyseerr_warning": "Aquesta integració es troba en una versió primerenca. Espereu que les coses canviïn.", + "server_url": "URL del servidor", + "server_url_hint": "Exemple: http(s)://el-vostre-domini.url\n(afegiu el port si és necessari)", + "server_url_placeholder": "URL de Jellyseerr...", + "password": "Contrasenya", + "password_placeholder": "Introdueix la contrasenya per a l'usuari de Jellyfin {{username}}", + "save_button": "Desa", + "clear_button": "Esborra", + "login_button": "Inicia sessió", + "total_media_requests": "Sol·licituds totals de contingut", + "movie_quota_limit": "Límit de quota de pel·lícules", + "movie_quota_days": "Dies de quota de pel·lícules", + "tv_quota_limit": "Límit de quota de sèries", + "tv_quota_days": "Dies de quota de sèries", + "reset_jellyseerr_config_button": "Restalbeix la configuració de Jellyseerr", + "unlimited": "Il·limitat", + "plus_n_more": "+{{n}} més", + "order_by": { + "DEFAULT": "Per defecte", + "VOTE_COUNT_AND_AVERAGE": "Recompte de vots i mitjana", + "POPULARITY": "Popularitat" + } + }, + "marlin_search": { + "enable_marlin_search": "Activa la cerca de Marlin", + "url": "URL", + "server_url_placeholder": "http(s)://domini.org:port", + "marlin_search_hint": "Introdueix l'URL del servidor Marlin. L'URL ha d'incloure http o https i opcionalment el port.", + "read_more_about_marlin": "Mostra més sobre Marlin.", + "save_button": "Desa", + "toasts": { + "saved": "Desat" + } + } + }, + "storage": { + "storage_title": "Emmagatzematge", + "app_usage": "Aplicació {{usedSpace}}%", + "device_usage": "Dispositiu {{availableSpace}}%", + "size_used": "{{used}} de {{total}} utilitzat", + "delete_all_downloaded_files": "Suprimeix tots els fitxers descarregats" + }, + "intro": { + "show_intro": "Mostra la introducció", + "reset_intro": "Restableix la introducció" + }, + "logs": { + "logs_title": "Registres", + "export_logs": "Exporta registres", + "click_for_more_info": "Feu clic per obtenir més informació", + "level": "Nivell", + "no_logs_available": "No hi ha registres disponibles", + "delete_all_logs": "Suprimeix tots els registres" + }, + "languages": { + "title": "Idiomes", + "app_language": "Idioma de l'aplicació", + "app_language_description": "Seleccioneu l'idioma de l'aplicació.", + "system": "Sistema" + }, + "toasts": { + "error_deleting_files": "Error en suprimir fitxers", + "background_downloads_enabled": "Descàrregues en segon pla activades", + "background_downloads_disabled": "Descàrregues en segon pla desactivades", + "connected": "Connectat", + "could_not_connect": "No s'ha pogut connectar", + "invalid_url": "URL invàlida" + } + }, + "sessions": { + "title": "Sessions", + "no_active_sessions": "No hi ha sessions actives" + }, + "downloads": { + "downloads_title": "Descàrregues", + "tvseries": "Sèries", + "movies": "Pel·lícules", + "queue": "Cua", + "queue_hint": "La cua i les descàrregues es perdran en reiniciar l'aplicació", + "no_items_in_queue": "No hi ha elements a la cua", + "no_downloaded_items": "No hi ha elements descarregats", + "delete_all_movies_button": "Suprimeix totes les pel·lícules", + "delete_all_tvseries_button": "Suprimeix totes les sèries", + "delete_all_button": "Suprimeix-ho tot", + "active_download": "Descàrrega activa", + "no_active_downloads": "No hi ha descàrregues actives", + "active_downloads": "Descàrregues actives", + "new_app_version_requires_re_download": "La nova versió de l'aplicació requereix tornar a descarregar", + "new_app_version_requires_re_download_description": "L'actualització nova requereix que el contingut es torni a descarregar. Suprimiu tot el contingut descarregat i torneu-ho a provar.", + "back": "Enrere", + "delete": "Suprimeix", + "something_went_wrong": "Alguna cosa ha anat malament", + "could_not_get_stream_url_from_jellyfin": "No s'ha pogut obtenir l'URL del flux de Jellyfin", + "eta": "ETA {{eta}}", + "methods": "Mètodes", + "toasts": { + "you_are_not_allowed_to_download_files": "No teniu permís per descarregar fitxers.", + "deleted_all_movies_successfully": "S'han suprimit totes les pel·lícules correctament!", + "failed_to_delete_all_movies": "No s'han pogut suprimir totes les pel·lícules", + "deleted_all_tvseries_successfully": "S'han suprimit totes les sèries correctament!", + "failed_to_delete_all_tvseries": "No s'han pogut suprimir totes les sèries", + "download_cancelled": "Descàrrega cancel·lada", + "could_not_cancel_download": "No s'ha pogut cancel·lar la descàrrega", + "download_completed": "Descàrrega completada", + "download_started_for": "S'ha iniciat la descàrrega per a {{item}}", + "item_is_ready_to_be_downloaded": "{{item}} està preparat per ser descarregat", + "download_stated_for_item": "S'ha iniciat la descàrrega per a {{item}}", + "download_failed_for_item": "Ha fallat la descàrrega per a {{item}} - {{error}}", + "download_completed_for_item": "S'ha completat la descàrrega per a {{item}}", + "queued_item_for_optimization": "S'ha afegit {{item}} a la cua per a l'optimització", + "failed_to_start_download_for_item": "No s'ha pogut iniciar la descàrrega per a {{item}}: {{message}}", + "server_responded_with_status_code": "El servidor ha respost amb l'estat {{statusCode}}", + "no_response_received_from_server": "No s'ha rebut resposta del servidor", + "error_setting_up_the_request": "Error en configurar la sol·licitud", + "failed_to_start_download_for_item_unexpected_error": "No s'ha pogut iniciar la descàrrega per a {{item}}: Error inesperat", + "all_files_folders_and_jobs_deleted_successfully": "Tots els fitxers, carpetes i treballs s'han suprimit correctament", + "an_error_occured_while_deleting_files_and_jobs": "S'ha produït un error en suprimir fitxers i treballs", + "go_to_downloads": "Ves a les descàrregues" + } + } + }, + "search": { + "search_here": "Cerca aquí...", + "search": "Cerca...", + "x_items": "{{count}} elements", + "library": "Biblioteca", + "discover": "Descobreix", + "no_results": "No hi ha resultats", + "no_results_found_for": "No s'han trobat resultats per a", + "movies": "Pel·lícules", + "series": "Sèries", + "episodes": "Episodis", + "collections": "Col·leccions", + "actors": "Actors", + "request_movies": "Sol·licita pel·lícules", + "request_series": "Sol·licita sèries", + "recently_added": "Afegit recentment", + "recent_requests": "Sol·licituds recents", + "plex_watchlist": "Llista de seguiment de Plex", + "trending": "Tendències", + "popular_movies": "Pel·lícules populars", + "movie_genres": "Gèneres de pel·lícules", + "upcoming_movies": "Pròximes pel·lícules", + "studios": "Estudis", + "popular_tv": "Sèries populars", + "tv_genres": "Gèneres de sèries", + "upcoming_tv": "Pròximes sèries", + "networks": "Cadenes", + "tmdb_movie_keyword": "Paraula clau de pel·lícula TMDB", + "tmdb_movie_genre": "Gènere de pel·lícula TMDB", + "tmdb_tv_keyword": "Paraula clau de sèrie TMDB", + "tmdb_tv_genre": "Gènere de sèrie TMDB", + "tmdb_search": "Cerca TMDB", + "tmdb_studio": "Estudi TMDB", + "tmdb_network": "Cadena TMDB", + "tmdb_movie_streaming_services": "Serveis de reproducció de pel·lícules TMDB", + "tmdb_tv_streaming_services": "Serveis de reproducció de sèries TMDB" + }, + "library": { + "no_items_found": "No s'han trobat elements", + "no_results": "No hi ha resultats", + "no_libraries_found": "No s'han trobat biblioteques", + "item_types": { + "movies": "pel·lícules", + "series": "sèries", + "boxsets": "col·leccions", + "items": "elements" + }, + "options": { + "display": "Visualització", + "row": "Fila", + "list": "Llista", + "image_style": "Estil d'imatge", + "poster": "Cartell", + "cover": "Coberta", + "show_titles": "Mostrar títols", + "show_stats": "Mostrar estadístiques" + }, + "filters": { + "genres": "Gèneres", + "years": "Anys", + "sort_by": "Ordenar per", + "sort_order": "Ordre", + "asc": "Ascendent", + "desc": "Descendent", + "tags": "Etiquetes" + } + }, + "favorites": { + "series": "Sèries", + "movies": "Pel·lícules", + "episodes": "Episodis", + "videos": "Vídeos", + "boxsets": "Col·leccions", + "playlists": "Llistes de reproducció", + "noDataTitle": "Encara no hi ha preferits", + "noData": "Marqueu elements com a preferits per veure'ls aparèixer aquí per a un accés ràpid." + }, + "custom_links": { + "no_links": "No hi ha enllaços" + }, + "player": { + "error": "Error", + "failed_to_get_stream_url": "No s'ha pogut obtenir l'URL del flux", + "an_error_occured_while_playing_the_video": "S'ha produït un error en reproduir el vídeo. Consulteu els registres a la configuració.", + "client_error": "Error del client", + "could_not_create_stream_for_chromecast": "No s'ha pogut crear un flux per a Chromecast", + "message_from_server": "Missatge del servidor: {{message}}", + "video_has_finished_playing": "El vídeo ha acabat de reproduir-se!", + "no_video_source": "No hi ha font de vídeo...", + "next_episode": "Episodi següent", + "refresh_tracks": "Actualitzar pistes", + "subtitle_tracks": "Pistes de subtítols:", + "audio_tracks": "Pistes d'àudio:", + "playback_state": "Estat de reproducció:", + "no_data_available": "No hi ha dades disponibles", + "index": "Índex:", + "continue_watching": "Continuar veient", + "go_back": "Enrere" + }, + "item_card": { + "next_up": "A continuació", + "no_items_to_display": "No hi ha elements per mostrar", + "cast_and_crew": "Repartiment i equip", + "series": "Sèries", + "seasons": "Temporades", + "season": "Temporada", + "no_episodes_for_this_season": "No hi ha episodis per a aquesta temporada", + "overview": "Descripció general", + "more_with": "Més amb {{name}}", + "similar_items": "Elements similars", + "no_similar_items_found": "No s'han trobat elements similars", + "video": "Vídeo", + "more_details": "Més detalls", + "quality": "Qualitat", + "audio": "Àudio", + "subtitles": "Subtítols", + "show_more": "Mostra més", + "show_less": "Mostra menys", + "appeared_in": "Va aparèixer a", + "could_not_load_item": "No s'ha pogut carregar l'element", + "none": "Cap", + "download": { + "download_season": "Descarrega la temporada", + "download_series": "Descarrega la sèrie", + "download_episode": "Descarrega l'episodi", + "download_movie": "Descarrega la pel·lícula", + "download_x_item": "Descarrega {{item_count}} elements", + "download_button": "Descarrega", + "using_optimized_server": "Utilitzant servidor optimitzat", + "using_default_method": "Utilitzant mètode per defecte" + } + }, + "live_tv": { + "next": "Següent", + "previous": "Anterior", + "live_tv": "TV en directe", + "coming_soon": "Pròximament", + "on_now": "Ara en emissió", + "shows": "Programes", + "movies": "Pel·lícules", + "sports": "Esports", + "for_kids": "Infantil", + "news": "Notícies" + }, + "jellyseerr": { + "confirm": "Confirma", + "cancel": "Cancel·la", + "yes": "Sí", + "whats_wrong": "Què està passant?", + "issue_type": "Tipus d'incidència", + "select_an_issue": "Seleccioneu una incidència", + "types": "Tipus", + "describe_the_issue": "(opcional) Descriviu la incidència...", + "submit_button": "Envia", + "report_issue_button": "Informa d'una incidència", + "request_button": "Sol·licita", + "are_you_sure_you_want_to_request_all_seasons": "Esteu segur que voleu sol·licitar totes les temporades?", + "failed_to_login": "No s'ha pogut iniciar sessió", + "cast": "Repartiment", + "details": "Detalls", + "status": "Estat", + "original_title": "Títol original", + "series_type": "Tipus de sèrie", + "release_dates": "Dates d'estrena", + "first_air_date": "Primera data d'emissió", + "next_air_date": "Propera data d'emissió", + "revenue": "Ingressos", + "budget": "Pressupost", + "original_language": "Idioma original", + "production_country": "País de producció", + "studios": "Estudis", + "network": "Cadena", + "currently_streaming_on": "Actualment en reproducció a", + "advanced": "Avançat", + "request_as": "Sol·licita com a", + "tags": "Etiquetes", + "quality_profile": "Perfil de qualitat", + "root_folder": "Carpeta arrel", + "season_all": "Temporada (totes)", + "season_number": "Temporada {{season_number}}", + "number_episodes": "{{episode_number}} episodis", + "born": "Nascut", + "appearances": "Aparicions", + "toasts": { + "jellyseer_does_not_meet_requirements": "El servidor Jellyseerr no compleix els requisits mínims de versió! Actualitzeu-lo almenys a la versió 2.0.0", + "jellyseerr_test_failed": "Ha fallat la prova de Jellyseerr. Torneu-ho a provar.", + "failed_to_test_jellyseerr_server_url": "No s'ha pogut provar l'URL del servidor de Jellyseerr", + "issue_submitted": "Incidència enviada!", + "requested_item": "S'ha sol·licitat {{item}}!", + "you_dont_have_permission_to_request": "No teniu permís per sol·licitar!", + "something_went_wrong_requesting_media": "Alguna cosa ha anat malament en sol·licitar contingut!" + } + }, + "tabs": { + "home": "Inici", + "search": "Cercar", + "library": "Biblioteca", + "custom_links": "Enllaços personalitzats", + "favorites": "Preferits" + } +}