diff --git a/README.md b/README.md index e73e6b675..c6c509ad6 100644 --- a/README.md +++ b/README.md @@ -77,6 +77,7 @@ Deploy your resource to: ### Services + - [Appwrite](https://appwrite.io) - [WordPress](https://docs.coollabs.io/coolify/services/wordpress) - [Ghost](https://ghost.org) @@ -103,11 +104,29 @@ Deploy your resource to: - Email: [andras@coollabs.io](mailto:andras@coollabs.io) - Discord: [Invitation](https://coollabs.io/discord) -## Development Contributions +--- -Coolify is developed under the Apache License and you can help to make it grow → [Start coding!](./CONTRIBUTION.md) +## ⚗️ Expertise Contributions -## Financial Contributors +Coolify is developed under the [Apache License](./LICENSE) and you can help to make it grow. +Our community will be glad to have you on board! + +Learn how to contribute to Coolify as as ... + +→ [👩🏾‍💻 Software developer](./CONTRIBUTION.md) + +→ [🧑🏻‍🏫 Translator](./docs/contribution/Translating.md) + + + +--- + +## 💰 Financial Contributors Become a financial contributor and help us sustain our community. [[Contribute](https://opencollective.com/coollabsio/contribute)] diff --git a/apps/ui/src/lib/components/LocalePicker.svelte b/apps/ui/src/lib/components/LocalePicker.svelte new file mode 100644 index 000000000..dfd004165 --- /dev/null +++ b/apps/ui/src/lib/components/LocalePicker.svelte @@ -0,0 +1,11 @@ + + +
+ +
\ No newline at end of file diff --git a/apps/ui/src/lib/lang.json b/apps/ui/src/lib/lang.json index fdfc5bf80..f5485ece0 100644 --- a/apps/ui/src/lib/lang.json +++ b/apps/ui/src/lib/lang.json @@ -1,4 +1,7 @@ { "fr": "Français", + "pt": "Português", + "es": "Espanhol", + "ko": "Korean", "en": "English" } diff --git a/apps/ui/src/lib/locales/es.json b/apps/ui/src/lib/locales/es.json new file mode 100644 index 000000000..54eb5f716 --- /dev/null +++ b/apps/ui/src/lib/locales/es.json @@ -0,0 +1,341 @@ +{ + "layout":{ + "update_done":"Actualización completada.", + "wait_new_version_startup":"Esperando que comience la nueva versión.", + "new_version":"Nueva versión accesible. Recargando.", + "switch_to_a_different_team":"Cambia a otro equipo.", + "update_available":"Actualización disponible" + }, + "error":{ + "you_can_find_your_way_back":"Puedes encontrar tu camino de vuelta", + "here":"Aquí.", + "you_are_lost":"¡Estás perdido! ¡Pero no tengas miedo!" + }, + "index":{ + "dashboard":"Dashboard", + "applications":"Aplicaciones", + "destinations":"Destinos", + "git_sources":"Fuentes Git", + "databases":"Bases de datos", + "services":"Servicios", + "teams":"Equipos", + "not_implemented_yet":"Aún no se ha aplicado", + "database":"Base de datos", + "settings":"Ajustes", + "global_settings":"Ajustes mundiales", + "secret":"Secret", + "team":"Equipo", + "logout":"Cerrar sesión" + }, + "login":{ + "already_logged_in":"Ya se ha registrado.", + "authenticating":"Autenticando.", + "login":"Iniciar sesión" + }, + "forms":{ + "password":"Contraseña", + "email":"Dirección de correo electrónico", + "passwords_not_match":"Las contraseñas no coinciden.", + "password_again":"Contraseña de nuevo", + "save":"Guardar", + "saving":"Salvando.", + "name":"Nombre", + "value":"Valor", + "action":"Acciones", + "is_required":"es necesario.", + "add":"Añadir", + "set":"Set", + "remove":"Retirar", + "path":"Camino", + "confirm_continue":"¿Estás seguro de continuar?", + "must_be_stopped_to_modify":"Debe ser detenido para modificar.", + "port":"Puerto", + "default":"Por defecto", + "base_directory":"Base Directory", + "publish_directory":"Publish Directory", + "generated_automatically_after_start":"Generado automáticamente después del inicio", + "roots_password":"La contraseña de Root", + "root_user":"Usuario raíz", + "eg":"eg", + "user":"Usuario", + "loading":"Carga.", + "version":"Versión", + "host":"Host", + "already_used_for":"##########################################################################################################################################################################################################################################################", + "configuration":"Configuración", + "engine":"Motor", + "network":"Red", + "ip_address":"Dirección IP", + "ssh_private_key":"SSH Clave privada", + "type":"Tipo", + "html_url":"URL", + "api_url":"API", + "organization":"Organización", + "new_password":"Nueva contraseña", + "super_secure_new_password":"Super seguro nueva contraseña", + "submit":"Submit", + "default_email_address":"Dirección de correo electrónico predeterminada", + "default_password":"Contraseña predeterminada", + "username":"Nombre de usuario", + "root_db_user":"Root DB Usuario", + "root_db_password":"Root DB Contraseña", + "api_port":"API Port", + "verifying":"Verificación", + "verify_emails_without_smtp":"Verificar correos electrónicos sin SMTP", + "extra_config":"Extra Config", + "select_a_service":"Seleccione un Servicio", + "select_a_service_version":"Seleccione una versión de servicio", + "removing":"Retirándose.", + "remove_domain":"Eliminar el dominio", + "public_port_range":"Public Port Range", + "public_port_range_explainer":"Puertos utilizados para exponer bases de datos/servicios/servicios internos. Añádalos a su cortafuegos (si es aplicable).Seguido se indicará una gama de puertos, por ejemplo: tachuelas clase='text-settings '9000-9100 seg/span", + "no_actions_available":"No se dispone de medidas", + "admin_api_key":"Clave de API de Admin" + }, + "register":{ + "register":"Registro", + "registering":"Registro.", + "first_user":"Está registrando al primer usuario. Será el administrador de tu instancia de Coolify." + }, + "reset":{ + "reset_password":"Reset", + "invalid_secret_key":"Una llave secreta inválida.", + "secret_key":"Secret Key", + "find_path_secret_key":"Puedes encontrarlo en ~coolify/.env (COOLIFY_SECRET_KEY)" + }, + "application":{ + "configuration":{ + "buildpack":{ + "choose_this_one":"Elige esta." + }, + "branch_already_in_use":"Esta rama ya es utilizada por otra aplicación. Webhooks no funcionará en este caso para ambas aplicaciones. ¿Seguro que quieres usarlo?", + "no_repositories_configured":"No hay repositorios configurados para su aplicación Git.", + "configure_it_now":"Configure ahora", + "loading_repositories":"Carga de repositorios ...", + "select_a_repository":"Seleccione un repositorio", + "loading_branches":"Cargando ramas ...", + "select_a_repository_first":"Por favor seleccione un repositorio primero", + "select_a_branch":"Por favor seleccione una rama", + "loading_groups":"Grupos de carga.", + "select_a_group":"Seleccione un grupo", + "loading_projects":"Cargando proyectos.", + "select_a_project":"Seleccione un proyecto", + "no_projects_found":"No se han encontrado proyectos", + "no_branches_found":"No hay ramas encontradas", + "configure_build_pack":"Configure Build Pack", + "scanning_repository_suggest_build_pack":"Repositorio de exploración para sugerir un paquete de construcción para usted.", + "found_lock_file":"encontrado archivo de bloqueo para {{packageManager}}.Seguido de comandos predefinidos.", + "configure_destination":"Configurar Destino", + "no_configurable_destination":"No hay destino configurable encontrado", + "select_a_repository_project":"Seleccione un Repositorio / Proyecto", + "select_a_git_source":"Seleccione una fuente de Git", + "no_configurable_git":"No se encontró una fuente de Git configurable", + "configuration_missing":"Falta de configuración" + }, + "build":{ + "queued_waiting_exec":"Queued and waiting for execution.", + "build_logs_of":"Construir registros de", + "running":"Corriendo", + "queued":"Queued", + "finished_in":"Terminado en", + "load_more":"Carga más", + "no_logs":"No hay registros encontrados", + "waiting_logs":"Esperando los registros." + }, + "preview":{ + "need_during_buildtime":"¿Necesitas durante el tiempo de construcción?", + "setup_secret_app_first":"Puede añadir secretos a las implementaciones PR/MR. Por favor, agregue secretos a la aplicación primero. √≠br]Useful for creating יspan class='text-settings 'staging won/span environments.", + "values_overwriting_app_secrets":"Estos valores sobrescriben los secretos de aplicación en las implementaciones PR/MR. Útil para la creación de clase 0'text-settings 'estaging significan ambientes / paño.", + "redeploy":"Redistribución", + "no_previews_available":"No hay vistas previas disponibles" + }, + "secrets":{ + "secret_saved":"Secreto salvado.", + "use_isbuildsecret":"Use isBuildSecret", + "secrets_for":"Secretos para" + }, + "storage":{ + "path_is_required":"Se requiere camino.", + "storage_saved":"Almacenamiento guardado.", + "storage_updated":"Almacenamiento actualizado.", + "storage_deleted":"Almacenamiento eliminado.", + "persistent_storage_explainer":"Puede especificar cualquier carpeta que desee ser persistente a través de las implementaciones.Seguido de la clase='text-settings 'ejemplo observado/span significa que preservará {{type}}이(가) 이미 사용됨", + "configuration":"구성", + "engine":"엔진", + "network":"회로망", + "ip_address":"IP 주소", + "ssh_private_key":"SSH 개인 키", + "type":"유형", + "html_url":"HTML URL", + "api_url":"API URL", + "organization":"조직", + "new_password":"새 비밀번호", + "super_secure_new_password":"매우 안전한 새 비밀번호", + "submit":"제출하다", + "default_email_address":"기본 이메일 주소", + "default_password":"기본 비밀번호", + "username":"사용자 이름", + "root_db_user":"루트 DB 사용자", + "root_db_password":"루트 DB 비밀번호", + "api_port":"API 포트", + "verifying":"확인 중", + "verify_emails_without_smtp":"SMTP 없이 이메일 확인", + "extra_config":"추가 구성", + "select_a_service":"서비스 선택", + "select_a_service_version":"서비스 버전 선택", + "removing":"풀이...", + "remove_domain":"도메인 제거", + "public_port_range":"공용 포트 범위", + "public_port_range_explainer":"데이터베이스/서비스/내부 서비스를 노출하는 데 사용되는 포트입니다.
방화벽에 추가합니다(해당되는 경우).

포트 범위를 지정할 수 있습니다(예: ). 9000-9100", + "no_actions_available":"사용 가능한 작업이 없습니다.", + "admin_api_key":"관리 API 키" + }, + "register":{ + "register":"등록하다", + "registering":"등록 중...", + "first_user":"첫 번째 사용자를 등록하고 있습니다. Coolify 인스턴스의 관리자가 됩니다." + }, + "reset":{ + "reset_password":"초기화", + "invalid_secret_key":"잘못된 비밀 키입니다.", + "secret_key":"비밀 키", + "find_path_secret_key":"~/coolify/.env(COOLIFY_SECRET_KEY)에서 찾을 수 있습니다." + }, + "application":{ + "configuration":{ + "buildpack":{ + "choose_this_one":"이걸 선택..." + }, + "branch_already_in_use":"이 분기는 이미 다른 응용 프로그램에서 사용하고 있습니다. 이 경우 두 애플리케이션 모두에 대해 Webhook이 작동하지 않습니다. 사용하시겠습니까?", + "no_repositories_configured":"Git 애플리케이션에 대해 구성된 저장소가 없습니다.", + "configure_it_now":"지금 구성", + "loading_repositories":"저장소 로드 중...", + "select_a_repository":"저장소를 선택하십시오", + "loading_branches":"브랜치 로드 중...", + "select_a_repository_first":"먼저 저장소를 선택하십시오", + "select_a_branch":"지점을 선택해 주세요", + "loading_groups":"그룹 로드 중...", + "select_a_group":"그룹을 선택하세요.", + "loading_projects":"프로젝트 로드 중...", + "select_a_project":"프로젝트를 선택하세요.", + "no_projects_found":"프로젝트를 찾을 수 없습니다.", + "no_branches_found":"지점을 찾을 수 없습니다", + "configure_build_pack":"빌드 팩 구성", + "scanning_repository_suggest_build_pack":"빌드 팩을 제안하기 위해 저장소를 검색하는 중...", + "found_lock_file":"{{packageManager}}에 대한 잠금 파일을 찾았습니다.
사전 정의된 명령 명령에 사용합니다.", + "configure_destination":"대상 구성", + "no_configurable_destination":"구성 가능한 대상을 찾을 수 없습니다.", + "select_a_repository_project":"리포지토리/프로젝트 선택", + "select_a_git_source":"Git 소스 선택", + "no_configurable_git":"구성 가능한 Git 소스를 찾을 수 없습니다.", + "configuration_missing":"구성 누락" + }, + "build":{ + "queued_waiting_exec":"큐에 넣고 실행을 기다리고 있습니다.", + "build_logs_of":"빌드 로그", + "running":"달리기", + "queued":"대기 중", + "finished_in":"완료", + "load_more":"더 찾아보기", + "no_logs":"로그를 찾을 수 없습니다.", + "waiting_logs":"로그를 기다리는 중..." + }, + "preview":{ + "need_during_buildtime":"빌드 시간에 필요하십니까?", + "setup_secret_app_first":"PR/MR 배포에 비밀을 추가할 수 있습니다. 먼저 응용 프로그램에 비밀을 추가하십시오.
스테이징 환경을 만드는 데 유용합니다.", + "values_overwriting_app_secrets":"이러한 값은 PR/MR 배포에서 애플리케이션 비밀을 덮어씁니다. 스테이징 환경을 만드는 데 유용합니다.", + "redeploy":"재배포", + "no_previews_available":"사용 가능한 미리보기가 없습니다." + }, + "secrets":{ + "secret_saved":"비밀이 저장되었습니다.", + "use_isbuildsecret":"isBuildSecret 사용", + "secrets_for":"비밀" + }, + "storage":{ + "path_is_required":"경로는 필수 항목입니다.", + "storage_saved":"저장용량이 저장되었습니다.", + "storage_updated":"스토리지가 업데이트되었습니다.", + "storage_deleted":"스토리지가 삭제되었습니다.", + "persistent_storage_explainer":"배포 간에 유지하려는 모든 폴더를 지정할 수 있습니다.
/example/app/를 보존함을 의미합니다. /app과 같은 컨테이너의 example은 애플리케이션의 루트 디렉토리입니다.

데이터베이스(SQLite) 또는 캐시와 같은 데이터를 저장하는 데 유용합니다." + }, + "deployment_queued":"배포가 대기 중입니다.", + "confirm_to_delete":"'{{name}}'을(를) 삭제하시겠습니까?", + "stop_application":"애플리케이션 중지", + "permission_denied_stop_application":"애플리케이션을 중지할 권한이 없습니다.", + "rebuild_application":"애플리케이션 재구축", + "permission_denied_rebuild_application":"애플리케이션을 다시 빌드할 권한이 없습니다.", + "build_and_start_application":"배포", + "permission_denied_build_and_start_application":"애플리케이션을 배포할 권한이 없습니다.", + "configurations":"구성", + "secret":"비밀", + "persistent_storage":"영구 스토리지", + "previews":"미리보기", + "logs":"애플리케이션 로그", + "build_logs":"빌드 로그", + "delete_application":"삭제", + "permission_denied_delete_application":"이 애플리케이션을 삭제할 권한이 없습니다.", + "domain_already_in_use":"도메인 {{domain}}은(는) 이미 사용 중입니다.", + "dns_not_set_error":"DNS가 올바르게 설정되지 않았거나 {{domain}}에 대해 전파되었습니다.

DNS 설정을 확인하십시오.", + "domain_required":"도메인은 필수 항목입니다.", + "settings_saved":"구성이 저장되었습니다.", + "dns_not_set_partial_error":"DNS가 설정되지 않았습니다.", + "domain_not_valid":"도메인을 확인할 수 없거나 서버 IP 주소를 가리키지 않습니다.

DNS 구성을 확인하고 다시 시도하십시오.", + "git_source":"힘내 소스", + "git_repository":"Git 저장소", + "build_pack":"빌드 팩", + "base_image":"배포 이미지", + "base_image_explainer":"배포에 사용할 이미지입니다.", + "base_build_image":"빌드 이미지", + "base_build_image_explainer":"빌드 프로세스 중에 사용될 이미지입니다.", + "destination":"목적지", + "application":"신청", + "url_fqdn":"URL(FQDN)", + "domain_fqdn":"도메인(FQDN)", + "https_explainer":"https를 지정하면 https를 통해서만 애플리케이션에 액세스할 수 있습니다. SSL 인증서가 생성됩니다.
www를 지정하면 애플리케이션이 www가 아닌 ​​곳에서 리디렉션(302)되거나 그 반대의 경우도 마찬가지입니다.
< br>도메인을 수정하려면 먼저 애플리케이션을 중지해야 합니다.

미리 DNS가 서버 IP를 가리키도록 설정해야 합니다.", + "ssl_www_and_non_www":"www 및 www가 없는 SSL을 생성하시겠습니까?", + "ssl_explainer":"www 및 non-www 모두에 대한 인증서를 생성합니다.
미리 두 DNS 항목을 설정해야 합니다.

두 DNS 항목 모두에 방문자가 있을 것으로 예상되는 경우 유용합니다.", + "install_command":"설치 명령", + "build_command":"빌드 명령", + "start_command":"시작 명령", + "directory_to_use_explainer":"모든 명령의 기반으로 사용할 디렉토리입니다.
monorepos와 함께 유용할 수 있습니다.", + "publish_directory_explainer":"배포를 위한 모든 자산이 포함된 디렉터리입니다.
예: dist,_site 또는 public< /스팬>.", + "features":"특징", + "enable_automatic_deployment":"자동 배포 활성화", + "enable_auto_deploy_webhooks":"웹훅을 통한 자동 배포를 활성화합니다.", + "enable_mr_pr_previews":"MR/PR 미리보기 활성화", + "expose_a_port":"포트 노출", + "enable_preview_deploy_mr_pr_requests":"끌어오기 또는 병합 요청에서 미리보기 배포를 활성화합니다.", + "debug_logs":"디버그 로그", + "enable_debug_log_during_build":"빌드 단계에서 디버그 로그를 활성화합니다.
민감한 정보가 표시되고 로그에 저장될 수 있습니다.", + "cant_activate_auto_deploy_without_repo":"이 리포지토리/분기에 대해 하나의 애플리케이션만 정의될 때까지 자동 배포를 활성화할 수 없습니다.", + "no_applications_found":"애플리케이션을 찾을 수 없습니다.", + "secret__batch_dot_env":".env 파일 붙여넣기", + "batch_secrets":"일괄 추가 비밀" + }, + "general":"일반적인", + "database":{ + "default_database":"기본 데이터베이스", + "generated_automatically_after_set_to_public":"public으로 설정 후 자동 생성", + "connection_string":"연결 문자열", + "set_public":"공개 설정", + "warning_database_public":"인터넷을 통해 데이터베이스에 연결할 수 있습니다.
이 경우 보안을 심각하게 생각하십시오!", + "change_append_only_mode":"추가 전용 모드 변경", + "warning_append_only":"백업에서 redis 데이터를 복원하려는 경우에 유용합니다.
데이터베이스를 다시 시작해야 합니다.", + "select_database_type":"데이터베이스 유형 선택", + "select_database_version":"데이터베이스 버전 선택", + "confirm_stop":"{{name}}을(를) 중지하시겠습니까?", + "stop_database":"중지", + "permission_denied_stop_database":"데이터베이스를 중지할 권한이 없습니다.", + "start_database":"시작", + "permission_denied_start_database":"데이터베이스를 시작할 권한이 없습니다.", + "delete_database":"삭제", + "permission_denied_delete_database":"데이터베이스를 삭제할 권한이 없습니다.", + "no_databases_found":"데이터베이스를 찾을 수 없습니다.", + "logs":"로그" + }, + "destination":{ + "delete_destination":"삭제", + "permission_denied_delete_destination":"이 목적지를 삭제할 권한이 없습니다.", + "add_to_coolify":"Coolify에 추가", + "coolify_proxy_stopped":"Coolify 프록시가 중지되었습니다!", + "coolify_proxy_started":"Coolify 프록시가 시작되었습니다!", + "confirm_restart_proxy":"프록시를 다시 시작하시겠습니까? 모든 것이 ~10초 안에 재구성됩니다.", + "coolify_proxy_restarting":"Coolify 프록시 다시 시작 중...", + "restarting_please_wait":"다시 시작 중입니다... 잠시만 기다려 주십시오...", + "force_restart_proxy":"강제 재시작 프록시", + "use_coolify_proxy":"Coolify 프록시를 사용하시겠습니까?", + "no_destination_found":"목적지를 찾을 수 없습니다", + "new_error_network_already_exists":"다른 팀에 대해 네트워크 {{network}}이(가) 이미 구성되었습니다!", + "new":{ + "saving_and_configuring_proxy":"절약...", + "install_proxy":"그러면 수동 구성 없이 애플리케이션과 서비스에 액세스할 수 있도록 대상에 프록시가 설치됩니다(Docker에 권장됨).

데이터베이스에는 자체 프록시가 있습니다.", + "add_new_destination":"새 목적지 추가", + "predefined_destinations":"사전 정의된 목적지" + } + }, + "sources":{ + "local_docker":"로컬 도커", + "remote_docker":"원격 도커", + "organization_explainer":"조직을 Git 소스로 사용하려면 입력하십시오. 그렇지 않으면 사용자가 사용됩니다." + }, + "source":{ + "new":{ + "git_source":"새 Git 소스 추가", + "official_providers":"공식 제공업체" + }, + "no_git_sources_found":"git 소스를 찾을 수 없습니다.", + "delete_git_source":"삭제", + "permission_denied":"Git 소스를 삭제할 권한이 없습니다.", + "create_new_app":"새 {{name}} 앱 만들기", + "change_app_settings":"{{name}} 앱 설정 변경", + "install_repositories":"저장소 설치", + "application_id":"애플리케이션 ID", + "group_name":"그룹 이름", + "oauth_id":"인증 ID", + "oauth_id_explainer":"OAuth ID는 GitLab 애플리케이션의 고유 식별자입니다.
GitLab OAuth 애플리케이션의 URL에서 찾을 수 있습니다.", + "register_oauth_gitlab":"GitLab에 새 OAuth 애플리케이션 등록", + "gitlab":{ + "self_hosted":"인스턴스 전체 애플리케이션(자체 호스팅)", + "user_owned":"사용자 소유 애플리케이션", + "group_owned":"그룹 소유 애플리케이션", + "gitlab_application_type":"GitLab 애플리케이션 유형", + "already_configured":"GitLab 앱이 이미 구성되어 있습니다." + }, + "github":{ + "redirecting":"Github으로 리디렉션 중..." + } + }, + "services":{ + "all_email_verified":"모든 이메일이 확인되었습니다. 지금 로그인할 수 있습니다.", + "generate_www_non_www_ssl":"www 및 non-www 모두에 대한 인증서를 생성합니다.
미리 두 DNS 항목을 설정해야 합니다.

서비스를 다시 시작해야 합니다." + }, + "service":{ + "stop_service":"중지", + "permission_denied_stop_service":"서비스를 중지할 권한이 없습니다.", + "start_service":"시작", + "permission_denied_start_service":"서비스를 시작할 권한이 없습니다.", + "delete_service":"삭제", + "permission_denied_delete_service":"서비스를 삭제할 권한이 없습니다.", + "no_service":"서비스를 찾을 수 없습니다.", + "logs":"로그" + }, + "setting":{ + "change_language":"언어 변경", + "permission_denied":"이 작업을 수행할 권한이 없습니다. \\n관리자에게 권한 수정을 요청하세요.", + "domain_removed":"도메인이 삭제됨", + "ssl_explainer":"https를 지정하면 Coolify는 https를 통해서만 액세스할 수 있습니다. SSL 인증서가 자동으로 생성됩니다.
www를 지정하면 Coolify가 www가 아닌 ​​곳에서 리디렉션(302)되거나 그 반대의 경우도 마찬가지입니다.

경고: 이미 설정된 도메인을 변경하면 웹훅 및 기타 통합이 중단됩니다! 수동으로 업데이트해야 합니다.", + "must_remove_domain_before_changing":"이 설정을 변경하려면 먼저 도메인을 제거해야 합니다.", + "registration_allowed":"등록이 허용됩니까?", + "registration_allowed_explainer":"애플리케이션에 대한 추가 등록을 허용합니다.
최초 등록 후에는 꺼져 있습니다.", + "coolify_proxy_settings":"Coolify 프록시 설정", + "credential_stat_explainer":"통계 페이지에 대한 자격 증명입니다.", + "auto_update_enabled":"자동 업데이트가 활성화되었습니까?", + "auto_update_enabled_explainer":"Coolify에 대한 자동 업데이트를 활성화합니다. 실행 중인 빌드 프로세스가 없는 경우 배후에서 자동으로 수행됩니다.", + "generate_www_non_www_ssl":"www 및 non-www 모두에 대한 인증서를 생성합니다.
미리 두 DNS 항목을 설정해야 합니다.", + "is_dns_check_enabled":"DNS 확인이 활성화되었습니까?", + "is_dns_check_enabled_explainer":"SSL 인증서를 생성하기 전에 DNS 확인을 비활성화할 수 있습니다.

Coolify가 역방향 프록시 또는 터널 뒤에 있을 때 비활성화하는 것이 유용합니다." + }, + "team":{ + "pending_invitations":"대기 중인 초대", + "accept":"수용하다", + "delete":"삭제", + "member":"회원", + "root":"(뿌리)", + "invited_with_permissions":"{{permission}} 권한으로 {{teamName}}에 초대되었습니다.", + "members":"회원", + "root_team_explainer":"루트 팀입니다. 즉, 이 그룹의 구성원은 인스턴스 전체 설정을 관리하고 Coolify의 모든 권한을 가질 수 있습니다(Linux의 루트 사용자와 같은 경우).", + "permission":"허가", + "you":"너", + "promote_to":"{{grade}}(으)로 승격", + "revoke_invitation":"초대 취소", + "pending_invitation":"대기 중인 초대", + "invite_new_member":"새 회원 초대", + "send_invitation":"초대장을 보내다", + "invite_only_register_explainer":"등록된 사용자만 초대할 수 있습니다.", + "admin":"관리자", + "read":"읽다" + } +} \ No newline at end of file diff --git a/apps/ui/src/lib/locales/pt.json b/apps/ui/src/lib/locales/pt.json new file mode 100644 index 000000000..0ac5deb46 --- /dev/null +++ b/apps/ui/src/lib/locales/pt.json @@ -0,0 +1,341 @@ +{ + "layout":{ + "update_done":"Atualização completa.", + "wait_new_version_startup":"Aguardando a nova versão iniciar...", + "new_version":"Nova versão acessível. Recarregando...", + "switch_to_a_different_team":"Mudar para uma equipa diferente...", + "update_available":"Atualização disponível" + }, + "error":{ + "you_can_find_your_way_back":"Você pode encontrar o seu caminho de volta", + "here":"aqui", + "you_are_lost":"Ooops você está perdido! Mas não tenha medo!" + }, + "index":{ + "dashboard":"Painel", + "applications":"Formulários", + "destinations":"Destinos", + "git_sources":"Fontes Git", + "databases":"Bancos de dados", + "services":"Serviços", + "teams":"Equipes", + "not_implemented_yet":"Ainda não implementado", + "database":"Base de dados", + "settings":"Definições", + "global_settings":"Configurações globais", + "secret":"Segredo", + "team":"Equipe", + "logout":"Sair" + }, + "login":{ + "already_logged_in":"Já logado...", + "authenticating":"Autenticando...", + "login":"Conecte-se" + }, + "forms":{ + "password":"Senha", + "email":"Endereço de email", + "passwords_not_match":"As senhas não coincidem.", + "password_again":"Senha novamente", + "save":"Salvar", + "saving":"Salvando...", + "name":"Nome", + "value":"Valor", + "action":"Ações", + "is_required":"É necessário.", + "add":"Adicionar", + "set":"Definir", + "remove":"Remover", + "path":"Caminho", + "confirm_continue":"Tem certeza de continuar?", + "must_be_stopped_to_modify":"Deve ser parado para modificar.", + "port":"Porta", + "default":"predefinição", + "base_directory":"Diretório base", + "publish_directory":"Publicar diretório", + "generated_automatically_after_start":"Gerado automaticamente após o início", + "roots_password":"Senha do Root", + "root_user":"Usuário raiz", + "eg":"por exemplo", + "user":"Do utilizador", + "loading":"Carregando...", + "version":"Versão", + "host":"Hospedeiro", + "already_used_for":"{{type}} já usado para", + "configuration":"Configuração", + "engine":"Motor", + "network":"Rede", + "ip_address":"Endereço de IP", + "ssh_private_key":"Chave privada SSH", + "type":"Modelo", + "html_url":"URL HTML", + "api_url":"URL da API", + "organization":"Organização", + "new_password":"Nova Senha", + "super_secure_new_password":"Nova senha super segura", + "submit":"Enviar", + "default_email_address":"Endereço de e-mail padrão", + "default_password":"Senha padrão", + "username":"Nome de usuário", + "root_db_user":"Usuário raiz do banco de dados", + "root_db_password":"Senha do banco de dados raiz", + "api_port":"Porta API", + "verifying":"Verificando", + "verify_emails_without_smtp":"Verifique e-mails sem SMTP", + "extra_config":"Configuração extra", + "select_a_service":"Selecione um serviço", + "select_a_service_version":"Selecione uma versão do serviço", + "removing":"Removendo...", + "remove_domain":"Remover domínio", + "public_port_range":"Intervalo de portas públicas", + "public_port_range_explainer":"Portas usadas para expor bancos de dados/serviços/serviços internos.
Adicione-os ao seu firewall (se aplicável).

Você pode especificar um intervalo de portas, por exemplo: 9000-9100", + "no_actions_available":"Nenhuma ação disponível", + "admin_api_key":"Chave de API de administrador" + }, + "register":{ + "register":"Registro", + "registering":"Registrando...", + "first_user":"Você está registrando o primeiro usuário. Será o administrador da sua instância Coolify." + }, + "reset":{ + "reset_password":"Redefinir", + "invalid_secret_key":"Chave secreta inválida.", + "secret_key":"Chave secreta", + "find_path_secret_key":"Você pode encontrá-lo em ~/coolify/.env (COOLIFY_SECRET_KEY)" + }, + "application":{ + "configuration":{ + "buildpack":{ + "choose_this_one":"Escolha este..." + }, + "branch_already_in_use":"Esta ramificação já é usada por outro aplicativo. Os webhooks não funcionarão neste caso para ambos os aplicativos. Tem certeza de que deseja usá-lo?", + "no_repositories_configured":"Nenhum repositório configurado para seu aplicativo Git.", + "configure_it_now":"Configure agora", + "loading_repositories":"Carregando repositórios...", + "select_a_repository":"Selecione um repositório", + "loading_branches":"Carregando ramos...", + "select_a_repository_first":"Selecione um repositório primeiro", + "select_a_branch":"Selecione uma filial", + "loading_groups":"Carregando grupos...", + "select_a_group":"Selecione um grupo", + "loading_projects":"Carregando projetos...", + "select_a_project":"Por favor selecione um projeto", + "no_projects_found":"Nenhum projeto encontrado", + "no_branches_found":"Nenhuma ramificação encontrada", + "configure_build_pack":"Configurar pacote de compilação", + "scanning_repository_suggest_build_pack":"Verificando repositório para sugerir um pacote de compilação para você...", + "found_lock_file":"Arquivo de bloqueio encontrado para {{packageManager}}.
Usando-o para comandos de comandos predefinidos.", + "configure_destination":"Configurar destino", + "no_configurable_destination":"Nenhum destino configurável encontrado", + "select_a_repository_project":"Selecione um Repositório/Projeto", + "select_a_git_source":"Selecione uma fonte Git", + "no_configurable_git":"Nenhuma fonte Git configurável encontrada", + "configuration_missing":"Configuração ausente" + }, + "build":{ + "queued_waiting_exec":"Na fila e aguardando execução.", + "build_logs_of":"Construir registros de", + "running":"Corrida", + "queued":"Enfileiradas", + "finished_in":"Terminando em", + "load_more":"Carregue mais", + "no_logs":"Nenhum registro encontrado", + "waiting_logs":"Aguardando os logs..." + }, + "preview":{ + "need_during_buildtime":"Precisa durante o tempo de construção?", + "setup_secret_app_first":"Você pode adicionar segredos a implantações de PR/MR. Por favor, adicione segredos ao aplicativo primeiro.
Útil para criar ambientes de preparação.", + "values_overwriting_app_secrets":"Esses valores substituem os segredos do aplicativo em implantações PR/MR. Útil para criar ambientes de preparação.", + "redeploy":"Reimplantar", + "no_previews_available":"Nenhuma visualização disponível" + }, + "secrets":{ + "secret_saved":"Segredo salvo.", + "use_isbuildsecret":"Use isBuildSecret", + "secrets_for":"Segredos para" + }, + "storage":{ + "path_is_required":"O caminho é obrigatório.", + "storage_saved":"Armazenamento salvo.", + "storage_updated":"Armazenamento atualizado.", + "storage_deleted":"Armazenamento excluído.", + "persistent_storage_explainer":"Você pode especificar qualquer pasta que deseja que seja persistente nas implantações.
/example significa que ela preservará /app/ example no contêiner, pois /app é o diretório raiz para seu aplicativo.

Isto é útil para armazenar dados como um banco de dados (SQLite) ou um cache." + }, + "deployment_queued":"Implantação em fila.", + "confirm_to_delete":"Tem certeza de que deseja excluir '{{name}}'?", + "stop_application":"Parar aplicativo", + "permission_denied_stop_application":"Você não tem permissão para parar o aplicativo.", + "rebuild_application":"Reconstruir aplicativo", + "permission_denied_rebuild_application":"Você não tem permissão para reconstruir o aplicativo.", + "build_and_start_application":"Implantar", + "permission_denied_build_and_start_application":"Você não tem permissão para implantar o aplicativo.", + "configurations":"Configurações", + "secret":"Segredos", + "persistent_storage":"Armazenamento persistente", + "previews":"Visualizações", + "logs":"Registros de aplicativos", + "build_logs":"Construir registros", + "delete_application":"Excluir", + "permission_denied_delete_application":"Você não tem permissão para excluir este aplicativo", + "domain_already_in_use":"O domínio {{domain}} já está em uso.", + "dns_not_set_error":"DNS não definido corretamente ou propagado para {{domain}}.

Verifique suas configurações de DNS.", + "domain_required":"O domínio é obrigatório.", + "settings_saved":"Configuração salva.", + "dns_not_set_partial_error":"DNS não definido", + "domain_not_valid":"Não foi possível resolver o domínio ou não está apontando para o endereço IP do servidor.

Verifique sua configuração de DNS e tente novamente.", + "git_source":"Fonte do Git", + "git_repository":"Repositório Git", + "build_pack":"Pacote de compilação", + "base_image":"Imagem de implantação", + "base_image_explainer":"Imagem que será usada para a implantação.", + "base_build_image":"Construir imagem", + "base_build_image_explainer":"Imagem que será usada durante o processo de compilação.", + "destination":"Destino", + "application":"Inscrição", + "url_fqdn":"URL (FQDN)", + "domain_fqdn":"Domínio (FQDN)", + "https_explainer":"Se você especificar https, o aplicativo será acessível apenas por https. O certificado SSL será gerado para você.
Se você especificar www, o aplicativo será redirecionado (302) de não www e vice-versa.
< br>Para modificar o domínio, você deve primeiro parar o aplicativo.

Você deve configurar seu DNS para apontar para o IP do servidor com antecedência.", + "ssl_www_and_non_www":"Gerar SSL para www e não www?", + "ssl_explainer":"Ele irá gerar certificados para www e não www.
Você precisa ter ambas as entradas DNS definidas com antecedência.

Útil se você espera receber visitantes em ambas.", + "install_command":"Comando de instalação", + "build_command":"Comando de compilação", + "start_command":"Comando Iniciar", + "directory_to_use_explainer":"Diretório a ser usado como base para todos os comandos.
Pode ser útil com monorepos.", + "publish_directory_explainer":"Diretório contendo todos os ativos para implantação.
Por exemplo: dist,_site ou public< /span>.", + "features":"Características", + "enable_automatic_deployment":"Ativar implantação automática", + "enable_auto_deploy_webhooks":"Habilite a implantação automática por meio de webhooks.", + "enable_mr_pr_previews":"Ativar visualizações de MR/PR", + "expose_a_port":"Expor uma porta", + "enable_preview_deploy_mr_pr_requests":"Habilite implantações de visualização de solicitações de pull ou mesclagem.", + "debug_logs":"Registros de depuração", + "enable_debug_log_during_build":"Ative os registros de depuração durante a fase de compilação.
Informações confidenciais podem ser visíveis e salvas nos registros.", + "cant_activate_auto_deploy_without_repo":"Não é possível ativar implantações automáticas até que apenas um aplicativo seja definido para este repositório/ramificação.", + "no_applications_found":"Nenhum aplicativo encontrado", + "secret__batch_dot_env":"Colar arquivo .env", + "batch_secrets":"Adicionar segredos em lote" + }, + "general":"Em geral", + "database":{ + "default_database":"Banco de dados padrão", + "generated_automatically_after_set_to_public":"Gerado automaticamente após definido como público", + "connection_string":"Cadeia de conexão", + "set_public":"Defina-o como público", + "warning_database_public":"Seu banco de dados estará acessível pela internet.
Leve a segurança a sério neste caso!", + "change_append_only_mode":"Alterar o modo somente anexar", + "warning_append_only":"Útil se você deseja restaurar dados redis de um backup.
É necessário reiniciar o banco de dados.", + "select_database_type":"Selecione um tipo de banco de dados", + "select_database_version":"Selecione uma versão do banco de dados", + "confirm_stop":"Tem certeza de que deseja parar {{name}}?", + "stop_database":"Pare", + "permission_denied_stop_database":"Você não tem permissão para parar o banco de dados.", + "start_database":"Começar", + "permission_denied_start_database":"Você não tem permissão para iniciar o banco de dados.", + "delete_database":"Excluir", + "permission_denied_delete_database":"Você não tem permissão para excluir um banco de dados", + "no_databases_found":"Nenhum banco de dados encontrado", + "logs":"Histórico" + }, + "destination":{ + "delete_destination":"Excluir", + "permission_denied_delete_destination":"Você não tem permissão para excluir este destino", + "add_to_coolify":"Adicionar ao Coolify", + "coolify_proxy_stopped":"Coolify Proxy parou!", + "coolify_proxy_started":"Coolify Proxy iniciado!", + "confirm_restart_proxy":"Tem certeza de que deseja reiniciar o proxy? Tudo será reconfigurado em ~10 segundos.", + "coolify_proxy_restarting":"Coolify Proxy reiniciando...", + "restarting_please_wait":"Reiniciando... aguarde...", + "force_restart_proxy":"Forçar reinicialização do proxy", + "use_coolify_proxy":"Usar Coolify Proxy?", + "no_destination_found":"Nenhum destino encontrado", + "new_error_network_already_exists":"Rede {{network}} já configurada para outra equipe!", + "new":{ + "saving_and_configuring_proxy":"Salvando...", + "install_proxy":"Isso instalará um proxy no destino para permitir que você acesse seus aplicativos e serviços sem qualquer configuração manual (recomendado para o Docker).

Os bancos de dados terão seu próprio proxy.", + "add_new_destination":"Adicionar novo destino", + "predefined_destinations":"Destinos predefinidos" + } + }, + "sources":{ + "local_docker":"Docker local", + "remote_docker":"Docker remoto", + "organization_explainer":"Preencha-o se quiser usar o de uma organização como seu Git Source. Caso contrário, seu usuário será usado." + }, + "source":{ + "new":{ + "git_source":"Adicionar nova fonte Git", + "official_providers":"Fornecedores oficiais" + }, + "no_git_sources_found":"Nenhuma fonte git encontrada", + "delete_git_source":"Excluir", + "permission_denied":"Você não tem permissão para excluir uma fonte Git", + "create_new_app":"Criar novo aplicativo {{name}}", + "change_app_settings":"Alterar {{name}} configurações do aplicativo", + "install_repositories":"Instalar repositórios", + "application_id":"ID do aplicativo", + "group_name":"Nome do grupo", + "oauth_id":"ID OAuth", + "oauth_id_explainer":"O OAuth ID é o identificador exclusivo do aplicativo GitLab.
Você pode encontrá-lo no URL do seu aplicativo GitLab OAuth.", + "register_oauth_gitlab":"Registre um novo aplicativo OAuth no GitLab", + "gitlab":{ + "self_hosted":"Aplicativo em toda a instância (auto-hospedado)", + "user_owned":"Aplicativo de propriedade do usuário", + "group_owned":"Aplicativo de propriedade do grupo", + "gitlab_application_type":"Tipo de aplicativo GitLab", + "already_configured":"O aplicativo GitLab já está configurado." + }, + "github":{ + "redirecting":"Redirecionando para o Github..." + } + }, + "services":{ + "all_email_verified":"Todos os e-mails são verificados. Você pode entrar agora.", + "generate_www_non_www_ssl":"Ele irá gerar certificados para www e não www.
Você precisa ter ambas as entradas DNS definidas com antecedência.

O serviço precisa ser reiniciado." + }, + "service":{ + "stop_service":"Pare", + "permission_denied_stop_service":"Você não tem permissão para interromper o serviço.", + "start_service":"Começar", + "permission_denied_start_service":"Você não tem permissão para iniciar o serviço.", + "delete_service":"Excluir", + "permission_denied_delete_service":"Você não tem permissão para excluir um serviço.", + "no_service":"Nenhum serviço encontrado", + "logs":"Histórico" + }, + "setting":{ + "change_language":"Mudar idioma", + "permission_denied":"Você não tem permissão para fazer isso. \\nPeça a um administrador para modificar suas permissões.", + "domain_removed":"Domínio removido", + "ssl_explainer":"Se você especificar https, o Coolify será acessível apenas por https. O certificado SSL será gerado para você.
Se você especificar www, Coolify será redirecionado (302) de não www e vice-versa.

AVISO: Se você alterar um domínio já definido, isso interromperá webhooks e outras integrações! Você precisa atualizá-los manualmente.", + "must_remove_domain_before_changing":"Deve remover o domínio antes de alterar esta configuração.", + "registration_allowed":"Registro permitido?", + "registration_allowed_explainer":"Permitir mais registros no aplicativo.
É desligado após o primeiro registro.", + "coolify_proxy_settings":"Configurações de proxy do Coolify", + "credential_stat_explainer":"Credenciais para a página de estatísticas.", + "auto_update_enabled":"Atualização automática habilitada?", + "auto_update_enabled_explainer":"Habilite atualizações automáticas para Coolify. Isso será feito automaticamente nos bastidores, se não houver nenhum processo de compilação em execução.", + "generate_www_non_www_ssl":"Ele irá gerar certificados para www e não www.
Você precisa ter ambas as entradas de DNS configuradas antecipadamente.", + "is_dns_check_enabled":"Verificação de DNS habilitada?", + "is_dns_check_enabled_explainer":"Você pode desabilitar a verificação de DNS antes de criar certificados SSL.

Desligá-la é útil quando o Coolify está atrás de um proxy reverso ou túnel." + }, + "team":{ + "pending_invitations":"Convites pendentes", + "accept":"Aceitar", + "delete":"Excluir", + "member":"membros)", + "root":"(raiz)", + "invited_with_permissions":"Convidado para {{teamName}} com permissão {{permission}}.", + "members":"Membros", + "root_team_explainer":"Esta é a equipe raiz. Isso significa que os membros deste grupo podem gerenciar as configurações de toda a instância e ter todos os privilégios no Coolify (imagine como usuário root no Linux).", + "permission":"Permissão", + "you":"Você", + "promote_to":"Promover para {{grade}}", + "revoke_invitation":"Revogar convite", + "pending_invitation":"Convite pendente", + "invite_new_member":"Convidar novo membro", + "send_invitation":"Enviar convite", + "invite_only_register_explainer":"Você só pode convidar usuários registrados.", + "admin":"Administrador", + "read":"Ler" + } +} \ No newline at end of file diff --git a/apps/ui/src/lib/translations.ts b/apps/ui/src/lib/translations.ts index 3ead4e1ec..9cc71a118 100644 --- a/apps/ui/src/lib/translations.ts +++ b/apps/ui/src/lib/translations.ts @@ -1,11 +1,18 @@ import i18n from 'sveltekit-i18n'; +import { derived, writable } from "svelte/store"; import lang from './lang.json'; +export let currentLocale = writable("en"); +export let debugTranslation = writable(false); + /** @type {import('sveltekit-i18n').Config} */ export const config = { fallbackLocale: 'en', translations: { en: { lang }, + es: { lang }, + pt: { lang }, + ko: { lang }, fr: { lang } }, loaders: [ @@ -14,12 +21,27 @@ export const config = { key: '', loader: async () => (await import('./locales/en.json')).default }, + { + locale: 'es', + key: '', + loader: async () => (await import('./locales/es.json')).default + }, + { + locale: 'pt', + key: '', + loader: async () => (await import('./locales/pt.json')).default + }, { locale: 'fr', key: '', loader: async () => (await import('./locales/fr.json')).default + }, + { + locale: 'ko', + key: '', + loader: async () => (await import('./locales/ko.json')).default } ] }; -export const { t, locales, locale, loadTranslations } = new i18n(config); +export const { t, locales, locale, loadTranslations } = new i18n(config); \ No newline at end of file diff --git a/apps/ui/src/routes/__layout.svelte b/apps/ui/src/routes/__layout.svelte index 4663e6d9f..7c2bcf36d 100644 --- a/apps/ui/src/routes/__layout.svelte +++ b/apps/ui/src/routes/__layout.svelte @@ -95,6 +95,7 @@ import Toasts from '$lib/components/Toasts.svelte'; import Tooltip from '$lib/components/Tooltip.svelte'; import { onMount } from 'svelte'; + import LocalePicker from '$lib/components/LocalePicker.svelte'; if (userId) $appSession.userId = userId; if (teamId) $appSession.teamId = teamId; @@ -292,6 +293,9 @@ +
+ +
@@ -311,19 +315,22 @@ {/if} {/if}