Reimplement the pull command of the crowdin script

This commit is contained in:
ErickSkrauch 2020-05-26 19:22:21 +03:00
parent b5d1cb01d4
commit e47eaf720f
No known key found for this signature in database
GPG Key ID: 669339FCBB30EE0E
9 changed files with 220 additions and 148 deletions

View File

@ -9,4 +9,4 @@ end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
indent_style = space
indent_size = 2
indent_size = 4

View File

@ -79,7 +79,7 @@
"components.contact.cannotAccessMyAccount": "Je ne peux pas accéder a mon compte",
"components.contact.close": "Fermer",
"components.contact.disclaimer": "Veuillez formuler vos commentaires en fournissant le plus d'informations utiles que possible pour nous aider à comprendre votre problème et à le résoudre",
"components.contact.email": "Email",
"components.contact.email": "E-mail",
"components.contact.foundBugOnSite": "J'ai trouvé un problème sur le site",
"components.contact.improvementsSuggestion": "J'ai une suggestion pour améliorer les fonctionnalités du site",
"components.contact.integrationQuestion": "Les questions d'intégration de service",
@ -91,56 +91,56 @@
"components.contact.title": "Formulaire de commentaires",
"components.contact.whichQuestion": "Qu'est-ce qui vous intéresse?",
"components.contact.youMessageReceived": "Votre message a été reçu. Nous vous répondrons sous peu. La réponse arrivera directement à votre adresse Email:",
"components.dev.apps.accountsAllowsYouYoUseOauth2": "Ely.by Accounts service provides users with a quick and easy-to-use way to login to your site, launcher or Minecraft server via OAuth2 authorization protocol. You can find more information about integration with Ely.by Accounts in {ourDocumentation}.",
"components.dev.apps.accountsForDevelopers": "Ely.by Accounts for developers",
"components.dev.apps.addNew": "Add new",
"components.dev.apps.allRefreshTokensWillBecomeInvalid": "All \"refresh\" tokens will become invalid and after next authorization the user will get permissions prompt.",
"components.dev.apps.appAndAllTokenWillBeDeleted": "Application and all associated tokens will be deleted.",
"components.dev.apps.applicationForm.appDescriptionWillBeAlsoVisibleOnOauthPage": "Application's description will be displayed at the authorization page too. It isn't a required field. In authorization process the value may be overridden.",
"components.dev.apps.applicationForm.applicationName": "Application name:",
"components.dev.apps.applicationForm.createApplication": "Create application",
"components.dev.apps.applicationForm.creatingApplication": "Creating an application",
"components.dev.apps.applicationForm.description": "Description:",
"components.dev.apps.applicationForm.ipAddressIsOptionButPreferable": "IP address is optional, but is very preferable. It might become handy in case of we suddenly decide to play on your server with the entire band (=",
"components.dev.apps.applicationForm.minecraftServer": "Minecraft server",
"components.dev.apps.applicationForm.redirectUri": "Redirect URI:",
"components.dev.apps.applicationForm.redirectUriLimitsAllowableBaseAddress": "Redirection URI (redirectUri) determines a base address, that user will be allowed to be redirected to after authorization. In order to improve security it's better to use the whole path instead of just a domain name. For example: https://example.com/oauth/ely.",
"components.dev.apps.applicationForm.serverIp": "Server IP:",
"components.dev.apps.applicationForm.serverName": "Server name:",
"components.dev.apps.applicationForm.toDisplayRegistrationFormChooseType": "To display registration form for a new application choose necessary type.",
"components.dev.apps.applicationForm.updateApplication": "Update application",
"components.dev.apps.applicationForm.updatingApplication": "Updating an application",
"components.dev.apps.applicationForm.website": "Web site",
"components.dev.apps.applicationForm.websiteLink": "Website link:",
"components.dev.apps.applicationForm.websiteLinkWillBeUsedAsAdditionalId": "Site's link is optional, but it can be used as an additional identifier of the application.",
"components.dev.apps.applicationForm.youCanAlsoSpecifyServerSite": "You also can specify either server's site URL or its community in a social network.",
"components.dev.apps.authorization": "Authorization",
"components.dev.apps.cancel": "Cancel",
"components.dev.apps.continue": "Continue",
"components.dev.apps.countUsers": "{count, plural, =0 {No users} one {# user} other {# users}}",
"components.dev.apps.delete": "Delete",
"components.dev.apps.editDescription": "{icon} Edit description",
"components.dev.apps.feedback": "feedback",
"components.dev.apps.ifYouHaveAnyTroubles": "If you are experiencing difficulties, you can always use {feedback}. We'll surely help you.",
"components.dev.apps.ifYouSuspectingThatSecretHasBeenCompromised": "If you are suspecting that your Client Secret has been compromised, then you may want to reset it value. It'll cause recall of the all \"access\" and \"refresh\" tokens that have been issued. You can also recall all issued tokens without changing Client Secret.",
"components.dev.apps.ourDocumentation": "our documentation",
"components.dev.apps.performing": "Performing…",
"components.dev.apps.resetClientSecret": "Reset Client Secret",
"components.dev.apps.revokeAllTokens": "Revoke all tokens",
"components.dev.apps.shallWeStart": "Shall we start?",
"components.dev.apps.takeCareAccessTokensInvalidation": "Take care because \"access\" tokens won't be invalidated immediately.",
"components.dev.apps.weDontKnowAnythingAboutYou": "We don't know anything about you yet.",
"components.dev.apps.youDontHaveAnyApplication": "You don't have any app registered yet.",
"components.dev.apps.youMustAuthToBegin": "You have to authorize to start.",
"components.dev.apps.yourApplications": "Your applications:",
"components.dev.apps.accountsAllowsYouYoUseOauth2": "Le service Comptes Ely.by offre aux utilisateurs un moyen simple et rapide de se connecter à votre site, à votre launcher ou à votre serveur Minecraft via le protocole d'autorisation OAuth2. Vous pouvez trouver plus dinformations sur lintégration avec Ely.by Accounts dans {ourDocumentation}.",
"components.dev.apps.accountsForDevelopers": "Comptes Ely.by pour les développeurs",
"components.dev.apps.addNew": "Ajouter un nouveau",
"components.dev.apps.allRefreshTokensWillBecomeInvalid": "Tous les jetons \"rafraîchir\" deviendront invalides et après la prochaine autorisation, l'utilisateur obtiendra une invite de permissions.",
"components.dev.apps.appAndAllTokenWillBeDeleted": "L'application et tous les jetons associés seront supprimés.",
"components.dev.apps.applicationForm.appDescriptionWillBeAlsoVisibleOnOauthPage": "La description de l'application sera également affichée sur la page d'autorisation. Ce n'est pas un champ obligatoire. Dans le processus d'autorisation, la valeur peut être remplacée.",
"components.dev.apps.applicationForm.applicationName": "Nom de l'application:",
"components.dev.apps.applicationForm.createApplication": "Créer une application",
"components.dev.apps.applicationForm.creatingApplication": "Création dune application",
"components.dev.apps.applicationForm.description": "Description :",
"components.dev.apps.applicationForm.ipAddressIsOptionButPreferable": "L'adresse IP est facultative, mais très préférable. Cela pourrait devenir pratique si nous décidions soudainement de jouer sur votre serveur avec lensemble du groupe (=",
"components.dev.apps.applicationForm.minecraftServer": "Serveur Minecraft",
"components.dev.apps.applicationForm.redirectUri": "URL de redirection:",
"components.dev.apps.applicationForm.redirectUriLimitsAllowableBaseAddress": "L'URI de redirection (redirectUri) détermine une adresse de base à laquelle cet utilisateur sera autorisé à être redirigé après autorisation. Afin d'améliorer la sécurité, il est préférable d'utiliser l'intégralité du chemin plutôt qu'un simple nom de domaine. Par exemple: https://example.com/oauth/ely.",
"components.dev.apps.applicationForm.serverIp": "IP du Serveur:",
"components.dev.apps.applicationForm.serverName": "Nom du serveur:",
"components.dev.apps.applicationForm.toDisplayRegistrationFormChooseType": "Pour afficher le formulaire d'inscription pour une nouvelle application, sélectionnez le type nécessaire.",
"components.dev.apps.applicationForm.updateApplication": "Mettre à jour de l'application",
"components.dev.apps.applicationForm.updatingApplication": "Mise à jour d'une application",
"components.dev.apps.applicationForm.website": "Site Web",
"components.dev.apps.applicationForm.websiteLink": "Adresse du site internet:",
"components.dev.apps.applicationForm.websiteLinkWillBeUsedAsAdditionalId": "Le lien du site est facultatif, mais il peut être utilisé comme identifiant supplémentaire de l'application.",
"components.dev.apps.applicationForm.youCanAlsoSpecifyServerSite": "Vous pouvez également spécifier l'URL du site du serveur ou sa communauté dans un réseau social.",
"components.dev.apps.authorization": "Autorisation",
"components.dev.apps.cancel": "Annuler",
"components.dev.apps.continue": "Continuer",
"components.dev.apps.countUsers": "{count, plural, =0 {Pas d'utilisateurs} one {# utilisateur} other {# utilisateurs}}",
"components.dev.apps.delete": "Supprimer",
"components.dev.apps.editDescription": "{icon} Modifier la description",
"components.dev.apps.feedback": "commentaires",
"components.dev.apps.ifYouHaveAnyTroubles": "Si vous rencontrez des difficultés, vous pouvez toujours utiliser {feedback}. Nous allons sûrement vous aider.",
"components.dev.apps.ifYouSuspectingThatSecretHasBeenCompromised": "Si vous pensez que votre secret client a été compromis, vous souhaiterez peut-être réinitialiser sa valeur. Cela provoquera le rappel de tous les jetons \"d'accès\" et \"d'actualisation\" qui ont été émis. Vous pouvez également rappeler tous les jetons émis sans modifier le Client Secret.",
"components.dev.apps.ourDocumentation": "notre documentation",
"components.dev.apps.performing": "Exécution…",
"components.dev.apps.resetClientSecret": "Réinitialiser le Client Secret",
"components.dev.apps.revokeAllTokens": "Révoquer touts les tokens",
"components.dev.apps.shallWeStart": "Allons-nous commencer?",
"components.dev.apps.takeCareAccessTokensInvalidation": "Prenez-en soin parce que les jetons \"d'accès\" ne seront pas invalidés immédiatement.",
"components.dev.apps.weDontKnowAnythingAboutYou": "Nous ne savons rien de vous pour le moment.",
"components.dev.apps.youDontHaveAnyApplication": "Vous n'avez pas d'application enregistrée pour le moment.",
"components.dev.apps.youMustAuthToBegin": "Vous devez autoriser le démarrage.",
"components.dev.apps.yourApplications": "Vos applications:",
"components.footerMenu.contactUs": "Nous contacter",
"components.footerMenu.forDevelopers": "For developers",
"components.footerMenu.forDevelopers": "Pour développeurs",
"components.footerMenu.rules": "Règles",
"components.footerMenu.siteLanguage": "Langue du site",
"components.languageSwitcher.improveTranslates": "Améliorer la traduction Ely.by",
"components.languageSwitcher.improveTranslatesDescription": "Ely.bys localization is a community effort. If you want to improve the translation of Ely.by, we'd love your help.",
"components.languageSwitcher.improveTranslatesParticipate": "Click here to participate.",
"components.languageSwitcher.mayBeInaccurate": "May be inaccurate",
"components.languageSwitcher.improveTranslatesDescription": "La traduction d'Ely.by est un effort de la communauté. Si vous souhaitez améliorer la traduction d'Ely.by, nous aimerions votre aide.",
"components.languageSwitcher.improveTranslatesParticipate": "Cliquer ici pour participer.",
"components.languageSwitcher.mayBeInaccurate": "Peut être inexacte",
"components.languageSwitcher.siteLanguage": "Langue du site",
"components.languageSwitcher.startTyping": "Commencer à écrire...",
"components.languageSwitcher.translationProgress": "{progress}% traduit",
@ -175,31 +175,31 @@
"components.profile.changeUsername.changeUsernameWarning": "Faites attention: si vous jouez sur un serveur avec un surnom, après l'avoir changé, vous risquez de perdre toute votre progression.",
"components.profile.changedAt": "Changé il y a {at}",
"components.profile.disabled": "Désactivée",
"components.profile.email": "Email:",
"components.profile.email": "E-mail:",
"components.profile.enabled": "Activer",
"components.profile.languageIsUnavailableWarning": "The locale \"{locale}\" you've used earlier isn't currently translated enough. If you want to continue using the selected language, please {participateInTheTranslation} of the project.",
"components.profile.languageIsUnavailableWarning": "Les paramètres régionaux \"{locale}\" vous avez utilisé précédemment n'est pas traduit actuellement assez. Si vous souhaitez continuer à utiliser la langue sélectionnée, veuillez {participateInTheTranslation} du projet.",
"components.profile.mojangPriorityWarning": "Un compte Mojang avec le même pseudo a été trouvé. Selon les {rules}, le propriétaire du compte a le droit d'exiger la restauration du contrôle sur le surnom.",
"components.profile.multiFactorAuth.codePlaceholder": "Entrez le code ici",
"components.profile.multiFactorAuth.disable": "Désactiver",
"components.profile.multiFactorAuth.disableMfa": "Désactiver l'authentification à deux facteurs",
"components.profile.multiFactorAuth.disableMfaInstruction": "In order to disable twofactor authentication, you need to provide a code from your mobile app and confirm your action with your current account password.",
"components.profile.multiFactorAuth.disableMfaInstruction": "Pour désactiver l'authentification à deux facteurs, vous devez fournir un code à partir de votre application mobile et confirmer votre action avec le mot de passe actuel de votre compte.",
"components.profile.multiFactorAuth.enable": "Activer",
"components.profile.multiFactorAuth.enterCodeFromApp": "In order to finish twofactor auth setup, please enter the code received in the mobile app:",
"components.profile.multiFactorAuth.enterKeyManually": "If you can't scan QR code, try entering your secret key manually:",
"components.profile.multiFactorAuth.enterCodeFromApp": "Afin de terminer la configuration de l'authentification à deux facteurs, veuillez entrer le code reçu dans l'application mobile:",
"components.profile.multiFactorAuth.enterKeyManually": "Si vous ne pouvez pas scanner le code QR, essayez d'entrer votre clé secrète manuellement:",
"components.profile.multiFactorAuth.findAlternativeApps": "Trouver des apps alternatives",
"components.profile.multiFactorAuth.installOnOfTheApps": "Installez une de ces apps:",
"components.profile.multiFactorAuth.mfaDescription": "Twofactor authentication is an extra layer of security designed to ensure you that you're the only person who can access your account, even if the password gets stolen.",
"components.profile.multiFactorAuth.mfaEnabledForYourAcc": "Twofactor authentication for your account is active now",
"components.profile.multiFactorAuth.mfaIntroduction": "First of all, you need to install one of our suggested apps on your phone. This app will generate login codes for you. Please choose your OS to get corresponding installation links.",
"components.profile.multiFactorAuth.mfaLoginFlowDesc": "Additional code will be requested next time you log in. Please note, that Minecraft authorization won't work when twofactor auth is enabled.",
"components.profile.multiFactorAuth.mfaDescription": "L'authentification à deux facteurs est une couche de sécurité supplémentaire conçue pour garantir que vous êtes la seule personne pouvant accéder à votre compte, même en cas de vol du mot de passe.",
"components.profile.multiFactorAuth.mfaEnabledForYourAcc": "L'authentification à deux facteurs pour votre compte est maintenant activée",
"components.profile.multiFactorAuth.mfaIntroduction": "Tout d'abord, vous devez installer l'une de nos applications suggérées sur votre téléphone. Cette application va générer des codes de connexion pour vous. Veuillez choisir votre système d'exploitation pour obtenir les liens d'installation correspondants.",
"components.profile.multiFactorAuth.mfaLoginFlowDesc": "Un code supplémentaire vous sera demandé lors de votre prochaine connexion. Veuillez noter que lautorisation Minecraft ne fonctionnera pas si lauthentification à deux facteurs est activée.",
"components.profile.multiFactorAuth.mfaTitle": "Authentification à deux facteurs",
"components.profile.multiFactorAuth.or": "OU",
"components.profile.multiFactorAuth.ready": "Prêt",
"components.profile.multiFactorAuth.scanQrCode": "Ouvrez votre scanner QR favoris et scannez ce code QR suivant:",
"components.profile.multiFactorAuth.theAppIsInstalled": "L'application a été installé",
"components.profile.multiFactorAuth.whenKeyEntered": "If a temporary code appears in your twofactor auth app, then you may proceed to the next step.",
"components.profile.multiFactorAuth.whenKeyEntered": "Si un code temporaire apparaît dans votre application d'authentification à deux facteurs, vous pouvez passer à l'étape suivante.",
"components.profile.nickname": "Surnom:",
"components.profile.participateInTheTranslation": "participate in the translation",
"components.profile.participateInTheTranslation": "participer à la traduction",
"components.profile.password": "Mot de passe:",
"components.profile.passwordRequestForm.continue": "Continuer",
"components.profile.passwordRequestForm.description": "Pour compléter cette action, entrez le mot de passe du compte",
@ -256,7 +256,7 @@
"services.errorsDict.emailNotFound": "L'E-mail specifié n'as pas été trouvé",
"services.errorsDict.emailRequired": "L'email est obligatoire",
"services.errorsDict.emailToLong": "L'email est trop longue",
"services.errorsDict.forgotYourPassword": "forgot your password",
"services.errorsDict.forgotYourPassword": "mot de passe oublié",
"services.errorsDict.invalidPassword": "Vous avez entré le mauvais mot de passe pour ce compte.",
"services.errorsDict.keyNotExists": "La clé est incorrecte ou a expiré.",
"services.errorsDict.keyRequired": "S'il vous plaît, entrez une clé d'activation",
@ -269,10 +269,10 @@
"services.errorsDict.passwordTooShort": "Votre mot de passe doit comporter au moins 8 caractères",
"services.errorsDict.passwordsDoesNotMatch": "Les mots de passe ne correspondent pas",
"services.errorsDict.rePasswordRequired": "Veuillez retaper votre mot de passe",
"services.errorsDict.redirectUriInvalid": "Redirect URI is invalid",
"services.errorsDict.redirectUriRequired": "Redirect URI is required",
"services.errorsDict.redirectUriInvalid": "URL de redirection invalide",
"services.errorsDict.redirectUriRequired": "Un URL de redirection est obligatoire",
"services.errorsDict.rulesAgreementRequired": "Vous devez accepter les règles afin de créer un compte",
"services.errorsDict.suggestResetPassword": "Have you {forgotYourPassword}?",
"services.errorsDict.suggestResetPassword": "Avez-vous {forgotYourPassword}?",
"services.errorsDict.totpIncorrect": "Le code est incorrect",
"services.errorsDict.totpRequired": "Veuillez entrer le code",
"services.errorsDict.usernameInvalid": "Surnom invalide",

View File

@ -17,14 +17,14 @@ module.exports = {
code: 'fr',
name: 'Français',
englishName: 'French',
progress: 72.2,
progress: 100,
isReleased: true,
},
id: {
code: 'id',
name: 'Bahasa Indonesia',
englishName: 'Indonesian',
progress: 98.7,
progress: 98,
isReleased: true,
},
lt: {
@ -59,14 +59,14 @@ module.exports = {
code: 'sr',
name: 'Српски',
englishName: 'Serbian',
progress: 98.7,
progress: 100,
isReleased: false,
},
uk: {
code: 'uk',
name: 'Українська',
englishName: 'Ukrainian',
progress: 98.7,
progress: 98,
isReleased: true,
},
vi: {

View File

@ -3,9 +3,9 @@
"components.accounts.goToEly": "Idź do profilu Ely.by",
"components.accounts.logout": "Wyloguj się",
"components.auth.acceptRules.accept": "Akceptuj",
"components.auth.acceptRules.declineAndLogout": "Wyjdź i wyloguj się",
"components.auth.acceptRules.description1": "Zaktualizowaliśmy nasze {link}",
"components.auth.acceptRules.description2": "W celu kontynuowania używania {name}, musisz je zaakceptować.",
"components.auth.acceptRules.declineAndLogout": "Odrzuć i wyloguj się",
"components.auth.acceptRules.description1": "Zaktualizowaliśmy nasze {link}.",
"components.auth.acceptRules.description2": "W celu kontynuowania używania naszej usługi, musisz zaakceptować {name}.",
"components.auth.acceptRules.termsOfService": "warunki usługi",
"components.auth.acceptRules.title": "Zgoda użytkownika",
"components.auth.activation.accountActivationTitle": "Aktywacja konta",
@ -14,37 +14,37 @@
"components.auth.activation.confirmEmail": "Potwierdź E-mail",
"components.auth.activation.didNotReceivedEmail": "Nie otrzymałeś E-mail'a?",
"components.auth.activation.enterTheCode": "Wpisz tu kod z E-mail'a",
"components.auth.appInfo.appDescription": "Witamy w usłudze autoryzacji Ely.by, która umożliwia bezpieczne wykonywanie wszelkich czynności związanych z Twoim kontem. Jest to główny punkt wejścia do witryn internetowych i oprogramowania komputerowego, w tym uruchamiania gier.",
"components.auth.appInfo.appDescription": "Witamy w usłudze autoryzacji Ely.by, która umożliwia bezpieczne wykonywanie wszelkich czynności związanych z Twoim kontem. Jest to główny punkt wejścia do witryn internetowych i oprogramowania komputerowego, w tym launcherów.",
"components.auth.appInfo.appName": "Konta Ely",
"components.auth.appInfo.documentation": "dokumentację",
"components.auth.appInfo.goToAuth": "Przejdź do autoryzacji",
"components.auth.appInfo.useItYourself": "Odwiedź naszą {link}, aby dowiedzieć się, jak korzystać z tej usługi w Twoich projektach",
"components.auth.appInfo.useItYourself": "Odwiedź naszą {link}, aby dowiedzieć się, jak korzystać z tej usługi w Twoich projektach.",
"components.auth.chooseAccount.addAccount": "Zaloguj się na inne konto",
"components.auth.chooseAccount.chooseAccountTitle": "Wybierz konto",
"components.auth.chooseAccount.logoutAll": "Wyloguj się ze wszystkich kont",
"components.auth.chooseAccount.pleaseChooseAccount": "Wybierz konto, którego chcesz używać",
"components.auth.chooseAccount.pleaseChooseAccountForApp": "Wybierz konto, które chcesz autoryzować {appName} ",
"components.auth.chooseAccount.pleaseChooseAccountForApp": "Wybierz konto, które chcesz użyć do autoryzacji {appName}",
"components.auth.finish.authForAppFailed": "Autoryzacja {appName} nie powiodła się",
"components.auth.finish.authForAppSuccessful": "Autoryzacja dla {appName} została pomyślnie zakończona",
"components.auth.finish.authForAppSuccessful": "Autoryzacja {appName} została pomyślnie zakończona",
"components.auth.finish.copy": "Kopiuj",
"components.auth.finish.passCodeToApp": "Aby zakończyć proces autoryzacji, podaj następujący kod do {appName}",
"components.auth.finish.waitAppReaction": "Poczekaj, aż Twoja odpowiedź zostanie zgłoszona",
"components.auth.finish.waitAppReaction": "Poczekaj na odpowiedź aplikacji",
"components.auth.forgotPassword.alreadyHaveCode": "Już mam kod",
"components.auth.forgotPassword.pleasePressButton": "Naciśnij przycisk poniżej, aby uzyskać wiadomość e-mail z kodem odzyskiwania hasła.",
"components.auth.forgotPassword.pleasePressButton": "Naciśnij przycisk poniżej, aby dostać wiadomość e-mail z kodem do odzyskania hasła.",
"components.auth.forgotPassword.sendMail": "Wyślij maila",
"components.auth.forgotPassword.specifyEmail": "Podaj adres E-mailowy rejestracji lub ostatnią nazwę użytkownika konta, a my wyślemy wiadomość e-mail z instrukcjami dotyczącymi dalszego odzyskiwania hasła.",
"components.auth.forgotPassword.title": "Zapomniałeś hasła",
"components.auth.forgotPassword.specifyEmail": "Podaj adres E-mail który podałeś podczas rejestracji lub ostatnią nazwę użytkownika konta, a my wyślemy wiadomość e-mail z instrukcjami dotyczącymi dalszego odzyskiwania hasła.",
"components.auth.forgotPassword.title": "Odzyskiwanie hasła",
"components.auth.login.createNewAccount": "Stwórz nowe konto",
"components.auth.login.emailOrUsername": "Email lub nazwa użytkownika",
"components.auth.login.loginTitle": "Zaloguj",
"components.auth.login.next": "Następnie",
"components.auth.mfa.description": "Aby zalogować się na to konto, musisz wpisać jednorazowe hasło z aplikacji mobilnej",
"components.auth.mfa.enterTotp": "Wprowadź kod",
"components.auth.login.loginTitle": "Zaloguj się",
"components.auth.login.next": "Dalej",
"components.auth.mfa.description": "Aby zalogować się na to konto, musisz podać jednorazowe hasło z aplikacji mobilnej",
"components.auth.mfa.enterTotp": "Podaj kod",
"components.auth.password.accountPassword": "Hasło do konta",
"components.auth.password.forgotPassword": "Zapomniałeś hasła",
"components.auth.password.forgotPassword": "Zapomniałem hasło",
"components.auth.password.passwordTitle": "Wprowadź hasło",
"components.auth.password.rememberMe": "Zapamiętaj mnie na tym urządzeniu",
"components.auth.password.signInButton": "Zaloguj",
"components.auth.password.signInButton": "Zaloguj się",
"components.auth.permissions.approve": "Zezwól",
"components.auth.permissions.decline": "Odrzuć",
"components.auth.permissions.permissionsTitle": "Uprawnienia aplikacji",
@ -181,23 +181,23 @@
"components.profile.mojangPriorityWarning": "Znaleziono konto Mojang z tym samym nickiem. Zgodnie z {rules} właściciel konta ma prawo żądać przywrócenia kontroli nad pseudonimem.",
"components.profile.multiFactorAuth.codePlaceholder": "Wprowadź tutaj kod",
"components.profile.multiFactorAuth.disable": "Wyłącz",
"components.profile.multiFactorAuth.disableMfa": "Wyłącz uwierzytelnianie dwuetapowe",
"components.profile.multiFactorAuth.disableMfaInstruction": "Aby wyłączyć uwierzytelnianie dwuetapowe, musisz podać kod z aplikacji mobilnej i potwierdzić swoje działanie za pomocą bieżącego hasła do konta.",
"components.profile.multiFactorAuth.disableMfa": "Wyłącz weryfikację dwuetapową",
"components.profile.multiFactorAuth.disableMfaInstruction": "Aby wyłączyć weryfikację dwuetapową, musisz podać kod z aplikacji mobilnej i potwierdzić swoje działanie za pomocą bieżącego hasła do konta.",
"components.profile.multiFactorAuth.enable": "Włącz",
"components.profile.multiFactorAuth.enterCodeFromApp": "Aby zakończyć konfigurację dwuetapowej autoryzacji, wpisz kod otrzymany w aplikacji mobilnej:",
"components.profile.multiFactorAuth.enterCodeFromApp": "Aby zakończyć konfigurację autoryzacji dwuetapowej, wpisz kod otrzymany w aplikacji mobilnej:",
"components.profile.multiFactorAuth.enterKeyManually": "Jeśli nie możesz zeskanować kodu QR, spróbuj wpisać tajny klucz ręcznie:",
"components.profile.multiFactorAuth.findAlternativeApps": "Znajdź alternatywne aplikacje",
"components.profile.multiFactorAuth.installOnOfTheApps": "Zainstaluj jedną z tych aplikacji:",
"components.profile.multiFactorAuth.mfaDescription": "Uwierzytelnianie dwuetapowe to dodatkowa warstwa zabezpieczeń zaprojektowana, aby zapewnić, że jesteś jedyną osobą, która może uzyskać dostęp do Twojego konta, nawet jeśli hasło zostanie skradzione.",
"components.profile.multiFactorAuth.mfaEnabledForYourAcc": "Uwierzytelnianie dwuetapowe dla Twojego konta jest teraz aktywne",
"components.profile.multiFactorAuth.mfaDescription": "Weryfikacja dwuetapowa to dodatkowa warstwa zabezpieczeń zaprojektowana, aby zapewnić, że jesteś jedyną osobą, która może uzyskać dostęp do Twojego konta, nawet jeśli hasło zostanie skradzione.",
"components.profile.multiFactorAuth.mfaEnabledForYourAcc": "Weryfikacja dwuetapowa dla Twojego konta jest teraz aktywne",
"components.profile.multiFactorAuth.mfaIntroduction": "Najpierw powinieneś zainstalować jedną z naszych sugerowanych aplikacji na telefon. Pomoże Ci ona wygenerować kody weryfikacji dwuetapowej. Wybierz swój system operacyjny, by otrzymać odpowiedni link instalacyjny.",
"components.profile.multiFactorAuth.mfaLoginFlowDesc": "Dodatkowy kod będzie wymagany z następnym logowaniem. Miej to na uwadze, że autoryzacja Minecraft nie będzie działała, gdy uwierzytelnianie dwuetapowe będzie włączone.",
"components.profile.multiFactorAuth.mfaTitle": "Uwierzytelnianie dwuetapowe",
"components.profile.multiFactorAuth.mfaTitle": "Weryfikacja dwuetapowa",
"components.profile.multiFactorAuth.or": "LUB",
"components.profile.multiFactorAuth.ready": "Gotowe",
"components.profile.multiFactorAuth.scanQrCode": "Otwórz swoją ulubioną aplikację do kodów QR oraz zeskanuj poniższy kod:",
"components.profile.multiFactorAuth.theAppIsInstalled": "Aplikacja została zainstalowana",
"components.profile.multiFactorAuth.whenKeyEntered": "Jeżeli kod tymczasowy pojawia się w twojej aplikacji uwierzytelniania dwuetapowego, możesz przejść do następnego kroku.",
"components.profile.multiFactorAuth.theAppIsInstalled": "Już ją zainstalowałem",
"components.profile.multiFactorAuth.whenKeyEntered": "Jeżeli kod tymczasowy pojawia się w twojej aplikacji weryfikacji dwuetapowej, możesz przejść do następnego kroku.",
"components.profile.nickname": "Nick:",
"components.profile.participateInTheTranslation": "pomóż tłumaczyć",
"components.profile.password": "Hasło:",
@ -208,7 +208,7 @@
"components.profile.preferencesDescription": "Tu możesz zmienić kluczowe preferencje Twojego konta. Należy pamiętać, że wszystkie akcje muszą być potwierdzone przez wprowadzenie hasła.",
"components.profile.projectRules": "zasady projektu",
"components.profile.siteLanguage": "Język strony:",
"components.profile.twoFactorAuth": "Uwierzytelnianie dwuetapowe:",
"components.profile.twoFactorAuth": "Weryfikacja dwuetapowa:",
"components.profile.uuid": "UUID:",
"components.ui.bsod.alsoYouCanInteractWithBackground": "Możesz też pobawić się tłem - jest interaktywne ;)",
"components.ui.bsod.criticalErrorHappened": "Wystąpił krytyczny błąd, przez który aplikacja nie może kontynuować normalnej pracy.",
@ -262,7 +262,7 @@
"services.errorsDict.keyRequired": "Proszę podać klucz aktywacyjny",
"services.errorsDict.loginNotExist": "Przepraszamy, Ely nie rozpoznaje Twojego loginu.",
"services.errorsDict.loginRequired": "Proszę podać adres E-mail lub nazwę użytkownika",
"services.errorsDict.mfaAlreadyEnabled": "Uwierzytelnianie dwuetapowe jest już włączone",
"services.errorsDict.mfaAlreadyEnabled": "Weryfikacja dwuetapowa jest już włączona",
"services.errorsDict.newPasswordRequired": "Wprowadź nowe hasło",
"services.errorsDict.newRePasswordRequired": "Proszę powtórzyć nowe hasło",
"services.errorsDict.passwordRequired": "Proszę wpisać hasło",

View File

@ -13,8 +13,8 @@
"components.auth.activation.activationMailWasSentNoEmail": "Проверите е-пошту за поруке са даљим упутствима",
"components.auth.activation.confirmEmail": "Потврди е-пошту",
"components.auth.activation.didNotReceivedEmail": "Нисте примили е-поруку?",
"components.auth.activation.enterTheCode": "Овде унесите кôд из е-поруке",
"components.auth.appInfo.appDescription": "Ви сте на Ely.by услузи овлашћења која вам омогућава да безбедно извршите било коју операцију на налогу. Ово је једнострука тачка уноса за веб-сајтове и десктоп-софтвер, укључујући покретаче игрица.",
"components.auth.activation.enterTheCode": "Овде унесите код из е-поруке",
"components.auth.appInfo.appDescription": "Ви сте на Ely.by услузи овлашћења која вам омогућава да безбедно извршите било коју операцију на налогу. Ово је једнострука тачка уноса за веб-сајтове и десктоп софтвер, укључујући покретаче игрица.",
"components.auth.appInfo.appName": "Ely налози",
"components.auth.appInfo.documentation": "документацију",
"components.auth.appInfo.goToAuth": "Иди на овлашћење",
@ -27,7 +27,7 @@
"components.auth.finish.authForAppFailed": "Овлашћење на апликацију {appName} није успело",
"components.auth.finish.authForAppSuccessful": "Овлашћење на апликацију {appName} је успешно завршено",
"components.auth.finish.copy": "Копирај",
"components.auth.finish.passCodeToApp": "Да бисте довршили процес овлашћења, пружите следећи кôд апликацији {appName}",
"components.auth.finish.passCodeToApp": "Да бисте довршили процес овлашћења, пружите следећи код апликацији {appName}",
"components.auth.finish.waitAppReaction": "Сачекајте до одговора апликације",
"components.auth.forgotPassword.alreadyHaveCode": "Већ имате кôд",
"components.auth.forgotPassword.pleasePressButton": "Притисните дугме испод да бисте добили е-поруку са кодом за опоравак лозинке.",
@ -57,11 +57,11 @@
"components.auth.permissions.youAuthorizedAs": "Овластили сте се као:",
"components.auth.recoverPassword.change": "Промени лозинку",
"components.auth.recoverPassword.contactSupport": "Контактирајте са подршком",
"components.auth.recoverPassword.enterCodeBelow": "Унесите примљени кôд унутар поља испод:",
"components.auth.recoverPassword.enterCodeBelow": "Унесите примљени код унутар поља испод:",
"components.auth.recoverPassword.enterNewPasswordBelow": "Унесите и поновите нову лозинку испод:",
"components.auth.recoverPassword.enterTheCode": "Унесите кôд за потврду",
"components.auth.recoverPassword.messageWasSent": "Кôд за опоравак је послат на е-пошту налога.",
"components.auth.recoverPassword.messageWasSentTo": "Кôд за опоравак је послат на е-пошту {email}.",
"components.auth.recoverPassword.enterTheCode": "Унесите код за потврду",
"components.auth.recoverPassword.messageWasSent": "Код за опоравак је послат на е-пошту налога.",
"components.auth.recoverPassword.messageWasSentTo": "Код за опоравак је послат на е-пошту {email}.",
"components.auth.recoverPassword.newPassword": "Унесите нову лозинку",
"components.auth.recoverPassword.newRePassword": "Поновите нову лозинку",
"components.auth.recoverPassword.title": "Враћање лозинке",
@ -74,7 +74,7 @@
"components.auth.register.yourEmail": "Ваша е-пошта",
"components.auth.register.yourNickname": "Ваш надимак",
"components.auth.resendActivation.sendNewEmail": "Пошаљи нову е-поруку",
"components.auth.resendActivation.specifyYourEmail": "Унесите е-пошту са којом сте се регистровали и ми ћемо вам послати нови кôд за активацију",
"components.auth.resendActivation.specifyYourEmail": "Унесите е-пошту са којом сте се регистровали и ми ћемо вам послати нови код за активацију",
"components.auth.resendActivation.title": "Нисте примили е-поруку",
"components.contact.cannotAccessMyAccount": "Не могу да приступим налогу",
"components.contact.close": "Затвори",
@ -113,7 +113,7 @@
"components.dev.apps.applicationForm.website": "Веб-сајт",
"components.dev.apps.applicationForm.websiteLink": "Веза до веб-сајта:",
"components.dev.apps.applicationForm.websiteLinkWillBeUsedAsAdditionalId": "Веза до сајта је опционална, али се може користити као додатни идентификатор апликације.",
"components.dev.apps.applicationForm.youCanAlsoSpecifyServerSite": "Такође, можете да наведете или URL сајта сервера или његову заједницу на друштвеној мрежи.",
"components.dev.apps.applicationForm.youCanAlsoSpecifyServerSite": "Можете и да наведете или URL сајта сервера или његову заједницу на друштвеној мрежи.",
"components.dev.apps.authorization": "Овлашћење",
"components.dev.apps.cancel": "Откажи",
"components.dev.apps.continue": "Настави",
@ -154,10 +154,10 @@
"components.profile.changeEmail.changeEmailTitle": "Промена е-поште",
"components.profile.changeEmail.codePlaceholder": "Овде налепите кôд",
"components.profile.changeEmail.currentAccountEmail": "Тренутна е-адреса налога:",
"components.profile.changeEmail.enterFinalizationCode": "Како бисте потврдили нову е-пошту, унесите примљени кôд унутар поља испод:",
"components.profile.changeEmail.enterInitializationCode": "Е-порука са кодом за покретање процедуре промене е-поште је послата на е-пошту {email}. Унесите кôд унутар поља испод:",
"components.profile.changeEmail.enterFinalizationCode": "Како бисте потврдили нову е-пошту, унесите примљени код унутар поља испод:",
"components.profile.changeEmail.enterInitializationCode": "Е-порука са кодом за покретање процедуре промене е-поште је послата на е-пошту {email}. Унесите код унутар поља испод:",
"components.profile.changeEmail.enterNewEmail": "Затим пружите нову адресу е-поште коју желите да користите са овим налогом. Послаћемо вам е-поруку са кодом за потврду.",
"components.profile.changeEmail.finalizationCodeWasSentToEmail": "Кôд за потврду промене е-поште је послат на е-пошту {email}.",
"components.profile.changeEmail.finalizationCodeWasSentToEmail": "Код за потврду промене е-поште је послат на е-пошту {email}.",
"components.profile.changeEmail.newEmailPlaceholder": "Унесите нову е-пошту",
"components.profile.changeEmail.pressButtonToStart": "Притисните дугме испод да бисте послали поруку са кодом за покретање промене е-поште.",
"components.profile.changeEmail.sendEmailButton": "Пошаљи е-поруку",
@ -177,29 +177,29 @@
"components.profile.disabled": "онемогућена",
"components.profile.email": "Е-пошта:",
"components.profile.enabled": "омогућена",
"components.profile.languageIsUnavailableWarning": "The locale \"{locale}\" you've used earlier isn't currently translated enough. If you want to continue using the selected language, please {participateInTheTranslation} of the project.",
"components.profile.languageIsUnavailableWarning": "Локални стандард „{locale}” који сте користили раније тренутно није довољно преведен. Ако желите да наставите са коришћењем изабраног језика, {participateInTheTranslation} пројекта.",
"components.profile.mojangPriorityWarning": "Пронађен је Mojang налог са истим надимком. Према {rules}, власник налога има право да затражи враћање контроле над надимком.",
"components.profile.multiFactorAuth.codePlaceholder": "Овде унесите кôд",
"components.profile.multiFactorAuth.disable": "Онемогући",
"components.profile.multiFactorAuth.disableMfa": "Онемогућите потврду идентитета помоћу два фактора",
"components.profile.multiFactorAuth.disableMfaInstruction": "Како бисте онемогућили потврду идентитета помоћу два фактора, морате да пружите кôд из мобилне апликације и потврдите радњу са тренутном лозинком налога.",
"components.profile.multiFactorAuth.disableMfaInstruction": "Како бисте онемогућили потврду идентитета помоћу два фактора, морате да пружите код из мобилне апликације и потврдите радњу са тренутном лозинком налога.",
"components.profile.multiFactorAuth.enable": "Омогући",
"components.profile.multiFactorAuth.enterCodeFromApp": "Како бисте довршили подешавање потврде идентитета у два фактора, унесите примљени кôд у мобилну апликацију:",
"components.profile.multiFactorAuth.enterKeyManually": "Ако не можете да скенирате QR кôд, покушајте ручно да унесете тајни кључ:",
"components.profile.multiFactorAuth.enterCodeFromApp": "Како бисте довршили подешавање потврде идентитета у два фактора, унесите примљени код у мобилну апликацију:",
"components.profile.multiFactorAuth.enterKeyManually": "Ако не можете да скенирате QR код, покушајте ручно да унесете тајни кључ:",
"components.profile.multiFactorAuth.findAlternativeApps": "Пронађи алтернативне апликације",
"components.profile.multiFactorAuth.installOnOfTheApps": "Инсталирајте једну од следећих апликација:",
"components.profile.multiFactorAuth.mfaDescription": "Потврда идентитета помоћу два фактора је додатни слој безбедности осмишљен да осигура да сте једина особа која може приступити налогу, чак и ако се лозинка украде.",
"components.profile.multiFactorAuth.mfaEnabledForYourAcc": "Потврда идентитета помоћу два фактора за налог је сада активна",
"components.profile.multiFactorAuth.mfaIntroduction": "Пре свега, морате да инсталирате једну од наших предложених апликација на телефону. Ова апликација ће генерисати кодове за вас. Одаберите оперативни систем да бисте добили одговарајуће везе за инсталацију.",
"components.profile.multiFactorAuth.mfaLoginFlowDesc": "Додатни кôд ће бити затражен следећи пут када се пријавите. Запамтите да овлашћење на Minecraft неће радити када је омогућена потврда идентитета помоћу два фактора.",
"components.profile.multiFactorAuth.mfaLoginFlowDesc": "Додатни код биће затражен следећи пут када се пријавите. Запамтите да овлашћење на Minecraft неће радити када је омогућена потврда идентитета помоћу два фактора.",
"components.profile.multiFactorAuth.mfaTitle": "Потврда идентитета помоћу два фактора",
"components.profile.multiFactorAuth.or": "ИЛИ",
"components.profile.multiFactorAuth.ready": "Спремно",
"components.profile.multiFactorAuth.scanQrCode": "Отворите омиљену апликацију-скенер QR-а и скенирајте следећи QR кôд:",
"components.profile.multiFactorAuth.scanQrCode": "Отворите омиљену апликацију скенера QR-а и скенирајте следећи код:",
"components.profile.multiFactorAuth.theAppIsInstalled": "Апликација је инсталирана",
"components.profile.multiFactorAuth.whenKeyEntered": "Ако се привремени кôд појави у апликацији за потврду идентитета помоћу два фактора, можете прећи на следећи корак.",
"components.profile.multiFactorAuth.whenKeyEntered": "Ако се привремени код појави у апликацији за потврду идентитета помоћу два фактора, можете прећи на следећи корак.",
"components.profile.nickname": "Надимак:",
"components.profile.participateInTheTranslation": "participate in the translation",
"components.profile.participateInTheTranslation": "учествујте у превођењу",
"components.profile.password": "Лозинка:",
"components.profile.passwordRequestForm.continue": "Настави",
"components.profile.passwordRequestForm.description": "Да бисте довршили радњу, унесите лозинку налога",
@ -210,7 +210,7 @@
"components.profile.siteLanguage": "Језик сајта:",
"components.profile.twoFactorAuth": "Потврда идентитета помоћу два фактора",
"components.profile.uuid": "UUID:",
"components.ui.bsod.alsoYouCanInteractWithBackground": "Такође се можете играти позадином — интерактивна је ;)",
"components.ui.bsod.alsoYouCanInteractWithBackground": "Можете и да се играте позадином — интерактивна је ;)",
"components.ui.bsod.criticalErrorHappened": "Дошло је до критичне грешке због које апликација не може нормално да настави са радом.",
"components.ui.bsod.reloadPageOrContactUs": "Поново учитајте ову страницу, па покушајте поново. Ако се проблем и даље буде јављао, пријавите га програмерима слањем е-поруке на",
"components.userbar.login": "Пријава",
@ -273,7 +273,7 @@
"services.errorsDict.redirectUriRequired": "URI преусмеравања је обавезан",
"services.errorsDict.rulesAgreementRequired": "Морате да прихватите правила како бисте отворили налог",
"services.errorsDict.suggestResetPassword": "Нисте ли {forgotYourPassword}?",
"services.errorsDict.totpIncorrect": "Кôд је неисправан",
"services.errorsDict.totpIncorrect": "Код није исправан",
"services.errorsDict.totpRequired": "Унесите кôд",
"services.errorsDict.usernameInvalid": "Корисничко име је неважеће",
"services.errorsDict.usernameRequired": "Корисничко име је обавезно",

View File

@ -49,7 +49,7 @@
"components.auth.permissions.decline": "拒绝",
"components.auth.permissions.permissionsTitle": "应用程序权限",
"components.auth.permissions.scope_account_email": "访问您的邮件地址",
"components.auth.permissions.scope_account_info": "访问您的个人资料数据(除了邮件)",
"components.auth.permissions.scope_account_info": "访问您的个人资料数据(除了电子邮件地址",
"components.auth.permissions.scope_minecraft_server_session": "Minecraft服务器的授权数据",
"components.auth.permissions.scope_offline_access": "当您离线时访问您的个人资料数据",
"components.auth.permissions.theAppNeedsAccess1": "此应用程序需要访问",

View File

@ -3,7 +3,10 @@
import fs from 'fs';
import path from 'path';
import axios from 'axios';
import JSON5 from 'json5';
import CrowdinApi, { LanguageStatusNode, LanguageStatusResponse, ProjectInfoResponse } from 'crowdin-api';
import { TranslationStatus, Translations, Credentials } from '@crowdin/crowdin-api-client';
import MultiProgress from 'multi-progress';
import ch from 'chalk';
import iso639 from 'iso-639-1';
@ -18,7 +21,9 @@ if (!config.crowdinApiKey) {
process.exit(126);
}
const PROJECT_ID = 'elyby';
const ORGANIZATION_ID = 'elyby';
const PROJECT_ID = 350687;
const FILE_ID = 6;
const PROJECT_KEY = config.crowdinApiKey;
const CROWDIN_FILE_PATH = 'accounts/site.json';
const SOURCE_LANG = 'en';
@ -26,16 +31,22 @@ const LANG_DIR = path.resolve(`${__dirname}/../app/i18n`);
const INDEX_FILE_NAME = 'index.js';
const MIN_RELEASE_PROGRESS = 80; // Minimal ready percent before translation can be published
const credentials: Credentials = {
token: config.crowdinApiKey,
};
const translationStatusApi = new TranslationStatus(credentials);
const translationsApi = new Translations(credentials);
const crowdin = new CrowdinApi({
apiKey: PROJECT_KEY,
projectName: PROJECT_ID,
projectName: ORGANIZATION_ID,
});
const progressBar = new MultiProgress();
/**
* Locales that has been verified by core team members
*/
const RELEASED_LOCALES: Array<string> = ['be', 'fr', 'id', 'pt', 'ru', 'uk', 'vi', 'zh'];
const releasedLocales: Array<string> = ['be', 'fr', 'id', 'pt', 'ru', 'uk', 'vi', 'zh'];
/**
* Array of Crowdin locales to our internal locales representation
@ -80,7 +91,7 @@ function toInternalLocale(code: string): string {
* хранятся в самом приложении
*/
function serializeToModule(translates: Record<string, any>): string {
const src = JSON.stringify(sortByKeys(translates), null, 2);
const src = JSON5.stringify(sortByKeys(translates), null, 4);
return `module.exports = ${src};\n`;
}
@ -129,6 +140,70 @@ interface IndexFileEntry {
isReleased: boolean;
}
async function pullNew(): Promise<void> {
console.log('Pulling translation progress...');
const { data: translationProgress } = await translationStatusApi.getFileProgress(PROJECT_ID, FILE_ID, 100);
const localesToPull: Array<string> = [];
const indexFileEntries: Record<string, IndexFileEntry> = {
en: {
code: 'en',
name: 'English',
englishName: 'English',
progress: 100,
isReleased: true,
},
};
translationProgress.forEach(({ data: { languageId, approvalProgress } }) => {
const locale = toInternalLocale(languageId);
if (releasedLocales.includes(locale) || approvalProgress >= MIN_RELEASE_PROGRESS) {
localesToPull.push(languageId);
indexFileEntries[locale] = {
code: locale,
name: NATIVE_NAMES_MAP[locale] || iso639.getNativeName(locale),
englishName: ENGLISH_NAMES_MAP[locale] || iso639.getName(locale),
progress: approvalProgress,
isReleased: releasedLocales.includes(locale),
};
}
});
// Add prefix 'c' to current and total to prevent filling thees placeholders with real values
const downloadingProgressBar = progressBar.newBar('Downloading translates :bar :percent | :cCurrent/:total', {
total: localesToPull.length,
incomplete: '\u2591',
complete: '\u2588',
width: Object.keys(indexFileEntries).length - 1,
});
let downloadingReady = 0;
const promises = localesToPull.map(async (languageId): Promise<void> => {
const { data: { url } } = await translationsApi.buildProjectFileTranslation(PROJECT_ID, FILE_ID, {
targetLanguageId: languageId,
exportApprovedOnly: true,
});
const fileResponse = await axios.get(url, {
// Disable response parsing
transformResponse: [],
});
fs.writeFileSync(path.join(LANG_DIR, `${toInternalLocale(languageId)}.json`), fileResponse.data);
downloadingProgressBar.update(++downloadingReady / localesToPull, {
cCurrent: downloadingReady,
});
});
await Promise.all(promises);
console.log('Writing an index file');
fs.writeFileSync(path.join(LANG_DIR, INDEX_FILE_NAME), serializeToModule(indexFileEntries));
console.log(ch.green('The index file was successfully written'));
}
async function pull() {
console.log('Pulling locales list...');
const locales = await pullLocales();
@ -169,7 +244,7 @@ async function pull() {
const progress = (fileInfo.words_approved / fileInfo.words) * 100;
if (!RELEASED_LOCALES.includes(toInternalLocale(locale.code)) && progress < MIN_RELEASE_PROGRESS) {
if (!releasedLocales.includes(toInternalLocale(locale.code)) && progress < MIN_RELEASE_PROGRESS) {
return null;
}
@ -196,7 +271,7 @@ async function pull() {
console.log('Locales are downloaded. Writing them to file system.');
const indexFileEntries: { [key: string]: IndexFileEntry } = {
const indexFileEntries: Record<string, IndexFileEntry> = {
en: {
code: 'en',
name: 'English',
@ -223,7 +298,7 @@ async function pull() {
name: NATIVE_NAMES_MAP[ourCode] || iso639.getNativeName(ourCode),
englishName: ENGLISH_NAMES_MAP[ourCode] || name,
progress: parseFloat(progress.toFixed(1)),
isReleased: RELEASED_LOCALES.includes(ourCode),
isReleased: releasedLocales.includes(ourCode),
};
fs.copyFile(translatesFilePath, path.join(LANG_DIR, `${ourCode}.json`), 0, (err) => {
@ -286,7 +361,7 @@ try {
switch (action) {
case 'pull':
pull();
pullNew();
break;
case 'push':
push();

View File

@ -11,15 +11,18 @@
"license": "ISC",
"dependencies": {
"@babel/node": "^7.8.3",
"@crowdin/crowdin-api-client": "^1.8.0",
"@types/mkdirp": "^1.0.0",
"@types/progress": "^2.0.3",
"axios": "^0.19.2",
"chalk": "^4.0.0",
"crowdin-api": "^4.0.0",
"glob": "^7.1.6",
"iso-639-1": "^2.1.3",
"json5": "^2.1.3",
"mkdirp": "^1.0.4",
"multi-progress": "^2.0.0",
"prompt": "^1.0.0",
"prompt": "https://github.com/flatiron/prompt.git#master",
"utility-types": "^3.10.0"
},
"devDependencies": {

View File

@ -1905,6 +1905,13 @@
exec-sh "^0.3.2"
minimist "^1.2.0"
"@crowdin/crowdin-api-client@^1.8.0":
version "1.8.0"
resolved "https://registry.yarnpkg.com/@crowdin/crowdin-api-client/-/crowdin-api-client-1.8.0.tgz#017a7c62dd6fd115444a172620a9d5f937ec2fdf"
integrity sha512-OyQbSbIHnURNyAESuhE6ZK5WB0r0JKjMClo39Bc6+95UKNzy1rFTrF33W1stRJs7j6WfuOf3sYsPXu9deyYURQ==
dependencies:
axios "^0.19.0"
"@cypress/listr-verbose-renderer@0.4.1":
version "0.4.1"
resolved "https://registry.yarnpkg.com/@cypress/listr-verbose-renderer/-/listr-verbose-renderer-0.4.1.tgz#a77492f4b11dcc7c446a34b3e28721afd33c642a"
@ -4293,7 +4300,7 @@ axios@0.19.0:
follow-redirects "1.5.10"
is-buffer "^2.0.2"
axios@^0.19.2:
axios@^0.19.0, axios@^0.19.2:
version "0.19.2"
resolved "https://registry.yarnpkg.com/axios/-/axios-0.19.2.tgz#3ea36c5d8818d0d5f8a8a97a6d36b86cdc00cb27"
integrity sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==
@ -9998,7 +10005,7 @@ json5@^1.0.1:
dependencies:
minimist "^1.2.0"
json5@^2.1.0, json5@^2.1.2:
json5@^2.1.0, json5@^2.1.2, json5@^2.1.3:
version "2.1.3"
resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43"
integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==
@ -12006,16 +12013,6 @@ pkg-up@2.0.0, pkg-up@^2.0.0:
dependencies:
find-up "^2.1.0"
pkginfo@0.3.x:
version "0.3.1"
resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.3.1.tgz#5b29f6a81f70717142e09e765bbeab97b4f81e21"
integrity sha1-Wyn2qB9wcXFC4J52W76rl7T4HiE=
pkginfo@0.x.x:
version "0.4.1"
resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.4.1.tgz#b5418ef0439de5425fc4995042dced14fb2a84ff"
integrity sha1-tUGO8EOd5UJfxJlQQtztFPsqhP8=
please-upgrade-node@^3.2.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz#aeddd3f994c933e4ad98b99d9a556efa0e2fe942"
@ -12608,17 +12605,15 @@ promise@^7.1.1:
dependencies:
asap "~2.0.3"
prompt@^1.0.0:
"prompt@https://github.com/flatiron/prompt.git#master":
version "1.0.0"
resolved "https://registry.yarnpkg.com/prompt/-/prompt-1.0.0.tgz#8e57123c396ab988897fb327fd3aedc3e735e4fe"
integrity sha1-jlcSPDlquYiJf7Mn/Trtw+c15P4=
resolved "https://github.com/flatiron/prompt.git#8d5495c84c3f433b8f26ea2798f8ba68c3656459"
dependencies:
colors "^1.1.2"
pkginfo "0.x.x"
read "1.0.x"
revalidator "0.1.x"
utile "0.3.x"
winston "2.1.x"
winston "2.x"
prompts@^2.0.1:
version "2.3.0"
@ -16208,17 +16203,16 @@ widest-line@^3.1.0:
dependencies:
string-width "^4.0.0"
winston@2.1.x:
version "2.1.1"
resolved "https://registry.yarnpkg.com/winston/-/winston-2.1.1.tgz#3c9349d196207fd1bdff9d4bc43ef72510e3a12e"
integrity sha1-PJNJ0ZYgf9G9/51LxD73JRDjoS4=
winston@2.x:
version "2.4.4"
resolved "https://registry.yarnpkg.com/winston/-/winston-2.4.4.tgz#a01e4d1d0a103cf4eada6fc1f886b3110d71c34b"
integrity sha512-NBo2Pepn4hK4V01UfcWcDlmiVTs7VTB1h7bgnB0rgP146bYhMxX0ypCz3lBOfNxCO4Zuek7yeT+y/zM1OfMw4Q==
dependencies:
async "~1.0.0"
colors "1.0.x"
cycle "1.0.x"
eyes "0.1.x"
isstream "0.1.x"
pkginfo "0.3.x"
stack-trace "0.0.x"
word-wrap@^1.2.3, word-wrap@~1.2.3: