From 9cac0953faec1ceeae68bf451c3a07b6bd9788b8 Mon Sep 17 00:00:00 2001 From: Thoronium <107363768+NotThorny@users.noreply.github.com> Date: Mon, 3 Jul 2023 05:01:50 -0600 Subject: [PATCH 01/13] Add alternate val name (#2245) --- src/main/java/emu/grasscutter/data/excels/ItemData.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/emu/grasscutter/data/excels/ItemData.java b/src/main/java/emu/grasscutter/data/excels/ItemData.java index 929b1787e..eb7065726 100644 --- a/src/main/java/emu/grasscutter/data/excels/ItemData.java +++ b/src/main/java/emu/grasscutter/data/excels/ItemData.java @@ -89,7 +89,7 @@ public class ItemData extends GameResource { @SerializedName( value = "roomSceneId", - alternate = {"BMEPAMCNABE", "DANFGGLKLNO", "JFDLJGDFIGL", "OHIANNAEEAK", "MFGACDIOHGF"}) + alternate = {"BMEPAMCNABE", "DANFGGLKLNO", "JFDLJGDFIGL", "OHIANNAEEAK", "MFGACDIOHGF", "roomSceneID"}) private int roomSceneId; // Custom From df7941bc1ba88dd3e84eb4d8cce6f6c02748449a Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 3 Jul 2023 11:03:03 +0000 Subject: [PATCH 02/13] Format code [skip actions] --- src/main/java/emu/grasscutter/data/excels/ItemData.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/java/emu/grasscutter/data/excels/ItemData.java b/src/main/java/emu/grasscutter/data/excels/ItemData.java index eb7065726..9ae04d278 100644 --- a/src/main/java/emu/grasscutter/data/excels/ItemData.java +++ b/src/main/java/emu/grasscutter/data/excels/ItemData.java @@ -89,7 +89,14 @@ public class ItemData extends GameResource { @SerializedName( value = "roomSceneId", - alternate = {"BMEPAMCNABE", "DANFGGLKLNO", "JFDLJGDFIGL", "OHIANNAEEAK", "MFGACDIOHGF", "roomSceneID"}) + alternate = { + "BMEPAMCNABE", + "DANFGGLKLNO", + "JFDLJGDFIGL", + "OHIANNAEEAK", + "MFGACDIOHGF", + "roomSceneID" + }) private int roomSceneId; // Custom From 5b9508d7a4d6fb1097098c3cc9642348618865d8 Mon Sep 17 00:00:00 2001 From: Xotak <57544287+loulou310@users.noreply.github.com> Date: Tue, 4 Jul 2023 03:30:22 +0000 Subject: [PATCH 03/13] Update French translations (#2246) --- docs/README_fr-FR.md | 89 ++++++++----------------- src/main/resources/languages/fr-FR.json | 50 +++++++------- 2 files changed, 53 insertions(+), 86 deletions(-) diff --git a/docs/README_fr-FR.md b/docs/README_fr-FR.md index ff6dfec4f..2644f9011 100644 --- a/docs/README_fr-FR.md +++ b/docs/README_fr-FR.md @@ -18,90 +18,57 @@ * Apparition de monstres via la console * Inventaire (obtention d'objets/de personnages, amélioration d'objets/personnages, etc) -## Guide de démarrage rapide +## Guide d'installation rapide **Note:** Pour obtenir un support, rejoignez notre serveur [Discord](https://discord.gg/T5vZU6UyeG) (en anglais). -### Logiciels requis +### Démarage rapide (Automatique) -* Java SE - 17 ([link](https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html)) +- Téléchargez Java 17: https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html +- Téléchargez [MongoDB Community Server](https://www.mongodb.com/try/download/community) +- Téléchargez la version du jeu REL3.7 (Le client de jeut peut être obtenu ici si vous ne l'avez pas): https://github.com/MAnggiarMustofa/GI-Download-Library/blob/main/GenshinImpact/Client/3.7.0.md - **Note:** Si vous voulez juste **l'exécuter**, Alors vous pouvez télécharger seulement le **jre** +- Téléchargez la [dernière version de Cultivation](https://github.com/Grasscutters/Cultivation/releases/latest). Ulilisez l'installateur en `.msi`. +- Après avoir ouvert Cultivation (en administrateur), appuyez sur le bouton de téléchargement en haut a droite. +- Cliquez sur le bouton `Téléchargez tout-en-un` +- Cliquez sur l'engrenage dans le coin en haut a droite. +- Définisez l'emplacement d'installation du jeu. +- Définisez le chemin Java personnalisé à `C:\Program Files\Java\jdk-17\bin\java.exe` +- Laissez tous les autres paramètes par défauts -* MongoDB (4.0+ recommandé) +- Appuyez sur le bouton a coté de Lancer. +- Appuyez sur le bouton Lancer. +- Connectez vous avec le nom d'utilisateur que vous voulez. Le mot de passe n'a pas d'importance. -* Proxy daemon: mitmproxy (mitmdump, recommended), Fiddler Classic, etc. +### Compilation -### Lancement +Grasscutter utilise Gradle pour la gestion des dépendances et la compilation. -**Note:** Si vous avez mis à jour depuis une ancienne version, supprimez `config.json` pour le regénérer. +**Prérequis** -1. Obtenez `grasscutter.jar` - - Téléchargez le depuis les [actions](https://github.com/Grasscutters/Grasscutter/suites/6895963598/artifacts/267483297) - - [Buildez le par vous-même](#Building) -2. Créez un dossier `resources` dans le dossier où grasscutter.jar est situé et déplacez vos dossiers `BinOutput` et `ExcelBinOutput` ici *(Vérifiez le [wiki](https://github.com/Grasscutters/Grasscutter/wiki) pour plus de détails sur comment les obtenir.)* -3. Exécutez Grasscutter avec `java -jar grasscutter.jar`. **Soyez sûr que le service MongoDB est en cours d'exécution.** - -### Connection avec le client - -½. Créez un compte avec la [console de commande du serveur](https://github.com/Grasscutters/Grasscutter/wiki/Commands#targeting). - -1. Redirection du traffic: (Choisissez-en un) - - mitmdump: `mitmdump -s proxy.py -k` - - Approuvez le certificat CA: - - ​ **Note:**Le certificat CA est généralement stocké sous `%USERPROFILE%\ .mitmproxy`, ou vous pouvez le télécharger depuis `http://mitm.it` - - ​ Double-cliquez pour [installer](https://docs.microsoft.com/en-us/skype-sdk/sdn/articles/installing-the-trusted-root-certificate#installing-a-trusted-root-certificate) oo ... - - - Via la ligne de commande - - ```shell - certutil -addstore root %USERPROFILE%\.mitmproxy\mitmproxy-ca-cert.cer - ``` - - - Fiddler Classic: Exécutez Fiddler Classic, Activez `Decrypt https traffic` dans les paramètres et changez le port par défaut ici (Tools -> Options -> Connections) à autre chose que `8888`, et chargez [ce script](https://github.lunatic.moe/fiddlerscript). - - - [Fichier hosts](https://github.com/Grasscutters/Grasscutter/wiki/Running#traffic-route-map) - -2. Définissez le proxy du réseau comme `127.0.0.1:8080` ou le port du proxy que vous avez spécifié. - -**Vous pouvez aussi utiliser `start.cmd` to démarrer les serveurs et le proxy automatiquement, mais vous devez mettre en place la variable d'environnement JAVA_HOME** - -### Building - -Grasscutter utilise Gradle pour gérer les dépendances et la construction. - -**Logiciels requis:** - -- [Java SE Development Kits - 17](https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html) +- [Java SE Development Kits - 17](https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html) ou plus récent - [Git](https://git-scm.com/downloads) ##### Windows ```shell -git clone https://github.com/Grasscutters/Grasscutter.git +git clone --recurse-submodules https://github.com/Grasscutters/Grasscutter.git cd Grasscutter -.\gradlew.bat # Mettre en place l'environnement -.\gradlew jar # Compiler +.\gradlew.bat # Setting up environments +.\gradlew jar # Compile ``` -##### Linux +##### Linux (GNU) ```bash -git clone https://github.com/Grasscutters/Grasscutter.git +git clone --recurse-submodules https://github.com/Grasscutters/Grasscutter.git cd Grasscutter chmod +x gradlew -./gradlew jar # Compiler +./gradlew jar # Compile ``` -Vous trouverez le fichier jar compilé à la racine du dossier du projet. +Vous pouvez trouver le jar de sortie dans la racine du dossier du projet. -### Les commandes ont été déplacé vers le [wiki](https://github.com/Grasscutters/Grasscutter/wiki/Commands)! (en anglais) +### Dépanage -# Dépannage rapide - -* Si la compilation a échoué, veuillez vérifier votre installation de votre JDK (JDK 17 et le bon dossier bin du JDK dans la variable PATH) -* Mon client ne se connecte pas au serveur, impossible de se connecter a mon compte, 4206, etc... - La plupart du temps, *le problème* vient de la configuration de votre proxy. Si vous utilisez Fiddler, vérifiez s'il est exécuté sur un port autre que 8888 -* Séquence de démarrage : MongoDB > Grasscutter > Proxy (mitmdump, fiddler, etc...) > Jeu +Pour une liste des problèmes communs et leur solution et pour demander de l'aide, veuillez rejoindre [notre serveur Discord](https://discord.gg/T5vZU6UyeG) (en anglais) et dirigez vous vers le salon de support. \ No newline at end of file diff --git a/src/main/resources/languages/fr-FR.json b/src/main/resources/languages/fr-FR.json index fc365c5f4..a1cf230f2 100644 --- a/src/main/resources/languages/fr-FR.json +++ b/src/main/resources/languages/fr-FR.json @@ -64,9 +64,9 @@ "resources": { "loading": "Chargement des ressources...", "finish": "Chargement des ressources terminé.", - "custom": "🇺🇸Find additional resources at: 'Anime-Game-Servers/CustomGCResources'.", - "missing_server": "🇺🇸To fully use questing, it is recommended to add the 'Server' folder.", - "missing_scenes": "🇺🇸To fully use questing, it is recommended to add the 'ScriptSceneData' folder." + "custom": "Obtenez des ressources additionelles à: 'Anime-Game-Servers/CustomGCResources'.", + "missing_server": "Pour utiliser pleinement les quetes, il est recommendé d'ajouter le dossier 'Server'.", + "missing_scenes": "Pour utiliser pleinement les quetes, il est recommendé d'ajouter le dossier 'ScriptSceneData'." } } }, @@ -87,7 +87,7 @@ "artifactId": "ID de l'artéfact invalide.", "avatarId": "ID de l'avatar invalide.", "avatarLevel": "avatarLevel invalide.", - "cfgId": "🇺🇸Invalid cfg ID.", + "cfgId": "ID de cfg invalide.", "entityId": "ID de l'entité invalide.", "itemId": "ID de l'objet invalide.", "itemLevel": "Niveau de l'objet invalide.", @@ -171,8 +171,8 @@ "description": "Entrer dans un donjon" }, "entity": { - "description": "🇺🇸Modify an existing entity's properties", - "not_found_error": "🇺🇸Entity does not exist" + "description": "Modifie les propriétés d'une entité existante", + "not_found_error": "L'entité n'existe pas" }, "give": { "usage_relic": "Utilisation: give [mainPropID] [[,]]... [lv]", @@ -239,31 +239,31 @@ "not_found": "Quête introuvable.", "invalid_id": "ID de la quête invalide.", "description": "Ajoute ou termine une quête", - "running": "🇺🇸Quest %s is %s (%s).", - "talking": "🇺🇸Talk %s is %s for main quest %s (%s).", + "running": "La quête %s est %s (%s).", + "talking": "Le dialogue %s est %s pour la quête principale %s (%s).", "state": { - "none": "🇺🇸unknown (none)", - "unstarted": "🇺🇸unfinished (not started, not completed)", - "unfinished": "🇺🇸unfinished (started, not completed)", - "finished": "🇺🇸finished (completed)", - "failed": "🇺🇸finished (completed, but failed)", - "exists": "🇺🇸found", - "not_exists": "🇺🇸not found" + "none": "Inconnu (none)", + "unstarted": "Pas finie (pas démarée, pas complêtée)", + "unfinished": "Pas finie (Démarée, pas complêtée)", + "finished": "Terminée (complêtée)", + "failed": "Terminée (complêtée, mais échouée)", + "exists": "Trouvée", + "not_exists": "Introuvable" }, "enabled": "Quêtes activées." }, "group": { - "invalid_groupid": "🇺🇸Invalid group ID.", - "invalid_suiteid": "🇺🇸Invalid suite ID.", - "group_not_found": "🇺🇸Group not found.", - "description": "🇺🇸Alter group loading", - "refreshed": "🇺🇸Group %s refreshed." + "invalid_groupid": "ID de groupe invalide.", + "invalid_suiteid": "ID de suite invalide.", + "group_not_found": "Groupe introuvable", + "description": "Altère le chargement de groupe", + "refreshed": "Groupe %s actualisé" }, "cutscene": { "description": "Joue une cinématique" }, "sound": { - "description": "🇺🇸Plays a sound" + "description": "Joue un son" }, "reload": { "reload_start": "Rechargement de la configuration.", @@ -408,7 +408,7 @@ "description": "Retire le bannissement d'un joueur" }, "troubleshoot": { - "description": "🇺🇸Generate debugging information for troubleshooting." + "description": "Génère des informations de déboguage pour le dépannage." } }, "gacha": { @@ -462,9 +462,9 @@ "disabling_plugin": "Désactivation du plugin %s", "disabling_failed": "Impossible de désactiver le plugin %s", "invalid_api": { - "not_present": "🇺🇸Plugin %s does not specify an API version.", - "lower": "🇺🇸Plugin %s is using API version %s, while the server is using API version %s.", - "outdated": "🇺🇸Plugin %s is using an outdated API method." + "not_present": "Le plugin %s ne spécifie pas de version d'API.", + "lower": "Le plugin %s utilise la version %s de l'API, alors que le serveur utilise la version %s.", + "outdated": "Le plugin %s utilise une fonction obsolète de l'API." } } } From 5090b17b801e3f4ac21a0a5b0cf66442b48a48f8 Mon Sep 17 00:00:00 2001 From: TotallyNotOndre <40639199+TotallyNotOndre@users.noreply.github.com> Date: Tue, 4 Jul 2023 06:32:15 +0300 Subject: [PATCH 04/13] Update ru-RU.json (#2247) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ty Scaldy for help♥♥♥ --- src/main/resources/languages/ru-RU.json | 52 ++++++++++++------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/src/main/resources/languages/ru-RU.json b/src/main/resources/languages/ru-RU.json index 11cc8a34e..835349ced 100644 --- a/src/main/resources/languages/ru-RU.json +++ b/src/main/resources/languages/ru-RU.json @@ -64,9 +64,9 @@ "resources": { "loading": "Загружаем ресурсы...", "finish": "Загрузка ресурсов завершена.", - "custom": "🇺🇸Find additional resources at: 'Anime-Game-Servers/CustomGCResources'.", - "missing_server": "🇺🇸To fully use questing, it is recommended to add the 'Server' folder.", - "missing_scenes": "🇺🇸To fully use questing, it is recommended to add the 'ScriptSceneData' folder." + "custom": "Ищите дополнительные ресурсы в репозитории: 'Anime-Game-Servers/CustomGCResources'.", + "missing_server": "Для полноценной поддержки квестов, рекомендуется добавить папку 'Server'.", + "missing_scenes": "Для полноценной поддержки квестов, рекомендуется добавить папку 'ScriptSceneData'." } } }, @@ -87,7 +87,7 @@ "artifactId": "Некорректный ID артефакта.", "avatarId": "Некорректный ID персонажа.", "avatarLevel": "Некорректный уровень персонажа (avatarLevel).", - "cfgId": "🇺🇸Invalid cfg ID.", + "cfgId": "Некорректный ID конфига.", "entityId": "Некорректный ID сущности.", "itemId": "Некорректный ID предмета.", "itemLevel": "Некорректный уровень предмета (itemLevel).", @@ -171,8 +171,8 @@ "description": "Позволяет войти в подземелье" }, "entity": { - "description": "🇺🇸Modify an existing entity's properties", - "not_found_error": "🇺🇸Entity does not exist" + "description": "Изменяет свойства выбранной сущности", + "not_found_error": "Сущность не найдена" }, "give": { "usage_relic": "Применение: give [ID_глав_хар-ки] [[,<раз>]]... [lv<уровень 0-20>]", @@ -239,31 +239,31 @@ "not_found": "Квест не найден.", "invalid_id": "Некорректный ID квеста.", "description": "Добавляет (add) или завершает (finish) квесты", - "running": "🇺🇸Quest %s is %s (%s).", - "talking": "🇺🇸Talk %s is %s for main quest %s (%s).", + "running": "Квест %s %s (%s).", + "talking": "Разговор %s %s для главного квеста %s (%s).", "state": { - "none": "🇺🇸unknown (none)", - "unstarted": "🇺🇸unfinished (not started, not completed)", - "unfinished": "🇺🇸unfinished (started, not completed)", - "finished": "🇺🇸finished (completed)", - "failed": "🇺🇸finished (completed, but failed)", - "exists": "🇺🇸found", - "not_exists": "🇺🇸not found" + "none": "неизвестно (none)", + "unstarted": "незавершен (не начат)", + "unfinished": "незавершен (начат, но не закончен)", + "finished": "завершен", + "failed": "завершен (но провален)", + "exists": "найден", + "not_exists": "не найден" }, - "enabled": "🇺🇸Questing enabled." + "enabled": "Квестинг включен." }, "group": { - "invalid_groupid": "🇺🇸Invalid group ID.", - "invalid_suiteid": "🇺🇸Invalid suite ID.", - "group_not_found": "🇺🇸Group not found.", - "description": "🇺🇸Alter group loading", - "refreshed": "🇺🇸Group %s refreshed." + "invalid_groupid": "Некорректный ID Группы.", + "invalid_suiteid": "Некорректный ID Комплекта.", + "group_not_found": "Группа не найдена.", + "description": "Меняет загрузку группы", + "refreshed": "Группа %s обновлена." }, "cutscene": { "description": "Odtwarza przerywnik filmowy" }, "sound": { - "description": "🇺🇸Plays a sound" + "description": "Проигрывает звук" }, "reload": { "reload_start": "Перезагружаем файл конфигурации.", @@ -408,7 +408,7 @@ "description": "Разблокировывает доступ к серверу (\"разбанивает\")" }, "troubleshoot": { - "description": "🇺🇸Generate debugging information for troubleshooting." + "description": "Генерирует отладочную информацию для решения проблем." } }, "gacha": { @@ -462,9 +462,9 @@ "disabling_plugin": "Отключаем Плагин: %s", "disabling_failed": "Ошибка отключения Плагина: %s", "invalid_api": { - "not_present": "🇺🇸Plugin %s does not specify an API version.", - "lower": "🇺🇸Plugin %s is using API version %s, while the server is using API version %s.", - "outdated": "🇺🇸Plugin %s is using an outdated API method." + "not_present": "В Плагине %s не указана версия API.", + "lower": "Плагин %s использует версию API %s, однако сервер работает на версии API %s.", + "outdated": "Плагин %s использует устаревший API метод." } } } From 47186a47b2bbbf603cf67160284dd564b4b15fcc Mon Sep 17 00:00:00 2001 From: "y.mi" <124384047+dasha-yarkoff@users.noreply.github.com> Date: Sat, 8 Jul 2023 19:27:12 +0300 Subject: [PATCH 05/13] It now can bind on correct addr (#2254) Now Grasscutter will bind on address specified in config.json (bindAddress), instead of 0.0.0.0 --- src/main/java/emu/grasscutter/server/http/HttpServer.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/emu/grasscutter/server/http/HttpServer.java b/src/main/java/emu/grasscutter/server/http/HttpServer.java index 1889e943e..e2cf01d68 100644 --- a/src/main/java/emu/grasscutter/server/http/HttpServer.java +++ b/src/main/java/emu/grasscutter/server/http/HttpServer.java @@ -113,6 +113,7 @@ public final class HttpServer { } serverConnector.setPort(HTTP_INFO.bindPort); + serverConnector.setHost(HTTP_INFO.bindAddress); server.setConnectors(new ServerConnector[]{serverConnector}); return server; From d332861ed82e631bba3c0b333df1a27407238008 Mon Sep 17 00:00:00 2001 From: laura o3o <137661531+iidoki@users.noreply.github.com> Date: Sun, 9 Jul 2023 08:03:54 +0200 Subject: [PATCH 06/13] add italian support (italian translation fix) (#2249) * Updated IT Readme * Update it-IT.json * Update it-IT.json (2) * fixed a couple errors while reviewing --- docs/README_it-IT.md | 30 ++--- src/main/resources/languages/it-IT.json | 170 ++++++++++++------------ 2 files changed, 100 insertions(+), 100 deletions(-) diff --git a/docs/README_it-IT.md b/docs/README_it-IT.md index 138c1eb7e..8eb4fa6f2 100644 --- a/docs/README_it-IT.md +++ b/docs/README_it-IT.md @@ -5,7 +5,7 @@ [EN](../README.md) | [简中](README_zh-CN.md) | [繁中](README_zh-TW.md) | [FR](README_fr-FR.md) | [ES](README_es-ES.md) | [HE](README_HE.md) | [RU](README_ru-RU.md) | [PL](README_pl-PL.md) | [ID](README_id-ID.md) | [KR](README_ko-KR.md) | [FIL/PH](README_fil-PH.md) | [NL](README_NL.md) | [JP](README_ja-JP.md) | [IT](README_it-IT.md) | [VI](README_vi-VN.md) -**Attenzione:** Diamo sempre il benvenuto ai contributori del progetto. Prima di aggiungere il tuo contributo, leggi attentamente il nostro [Codice di condotta](https://github.com/Grasscutters/Grasscutter/blob/stable/CONTRIBUTING.md). +**Attenzione:** Diamo sempre il benvenuto ai contributori del progetto. Prima di contribuire, leggi attentamente il nostro [Codice di condotta](https://github.com/Grasscutters/Grasscutter/blob/stable/CONTRIBUTING.md). ## Funzionalità attuali @@ -15,12 +15,12 @@ * Teletrasporto * Sistema Gacha * Cooperativa *parzialmente* funzionale -* Evoca mostri dalla console -* Funzionalità dell'inventario (ricevi oggetti/personaggi, aggiorna oggetti/personaggi, ecc.) +* Evocazione nemici usando la console +* Inventario (ricevi e aggiorna oggetti/personaggi, ecc.) ## Guida rapida all'installazione -**Nota:** Per il supporto, unisciti al nostro [Discord](https://discord.gg/T5vZU6UyeG). +**Nota:** Se hai bisogno di aiuto, unisciti al nostro [Discord](https://discord.gg/T5vZU6UyeG). ### Requisiti @@ -30,30 +30,30 @@ * [MongoDB](https://www.mongodb.com/try/download/community) (consigliato 4.0+) -* Servizio proxy: mitmproxy (mitmdump, consigliato), Fiddler Classic, ecc. +* Servizi proxy: mitmproxy (mitmdump, consigliato), Fiddler Classic, ecc. ### Esecuzione -**Nota:** Se hai eseguito l'aggiornamento da una versione precedente, rimuovi `config.json` in modo che venga generato di nuovo. +**Nota:** Se hai aggiornato da una versione precedente, elimina `config.json` in modo che venga generato di nuovo. 1. Ottieni "grasscutter.jar". - Scarica da [azioni](https://github.com/Grasscutters/Grasscutter/suites/6895963598/artifacts/267483297) - [Compilalo tu stesso](#Compilazione) -2. Crea una cartella `resources` nella directory in cui si trova grasscutter.jar e sposta lì le cartelle `BinOutput` ed `ExcelBinOutput` *(Vedi il [wiki](https://github.com/Grasscutters/Grasscutter/wiki ) per maggiori dettagli su come ottenerli.)* -3. Eseguire Grasscutter con `java -jar grasscutter.jar`. **Assicurati che il servizio mongodb sia attivo.** +2. Crea una cartella chiamata `resources` nella directory in cui si trova grasscutter.jar e sposta lì le cartelle `BinOutput` ed `ExcelBinOutput` *(Vedi il [wiki](https://github.com/Grasscutters/Grasscutter/wiki ) per maggiori dettagli su come ottenerli.)* +3. Esegui Grasscutter con `java -jar grasscutter.jar`. **Assicurati che il servizio mongodb sia attivo.** -### Connessione client +### Connessione al client ½. Crea un account usando [il comando corrispondente nella console del server](https://github.com/Grasscutters/Grasscutter/wiki/Commands#targeting). 1. Reindirizza il traffico: (scegli uno) - - mitmdump: `mitmdump -s proxy.py -k` + - Con mitmdump: `mitmdump -s proxy.py -k` Autorizza il certificato CA: ​ **Nota:**Il certificato CA si trova solitamente in `%USERPROFILE%\ .mitmproxy`, oppure puoi scaricarlo da `http://mitm.it` - Fare doppio clic su [installa](https://docs.microsoft.com/en-us/skype-sdk/sdn/articles/installing-the-trusted-root-certificate#installing-a-trusted-root-certificate) o ... + Fai doppio clic su [installa](https://docs.microsoft.com/en-us/skype-sdk/sdn/articles/installing-the-trusted-root-certificate#installing-a-trusted-root-certificate) o ... - Con riga di comando @@ -61,11 +61,11 @@ certutil -addstore root %USERPROFILE%\.mitmproxy\mitmproxy-ca-cert.cer ``` - - Fiddler Classic: esegui Fiddler Classic, abilita `Decrypt https traffic` nelle opzioni e cambia la porta predefinita in (Strumenti -> Opzioni -> Connessioni) in qualcosa di diverso da `8888`, e carica [questo script](https :/ /github.lunatic.moe/fiddlerscript). + - Con Fiddler Classic: esegui Fiddler Classic, abilita `Decrypt https traffic` nelle opzioni e cambia la porta predefinita in (Strumenti -> Opzioni -> Connessioni) in qualcosa di diverso da `8888`, e carica [questo script](https://github.lunatic.moe/fiddlerscript). - [File host](https://github.com/Grasscutters/Grasscutter/wiki/Running#traffic-route-map) -2. Impostare il proxy di rete su `127.0.0.1:8080` o la porta proxy impostata. +2. Imposta il proxy di rete a `127.0.0.1:8080` o la porta proxy impostata. **Puoi anche usare `start.cmd` per avviare automaticamente il server e il servizio proxy, ma devi impostare l'ambiente JAVA_HOME** @@ -98,11 +98,11 @@ chmod +x gradlew Puoi trovare il jar generato nella cartella principale del progetto. -### I comandi sono stati spostati nel [wiki](https://github.com/Grasscutters/Grasscutter/wiki/Commands)! +### I comandi sono stati spostati al [wiki](https://github.com/Grasscutters/Grasscutter/wiki/Commands)! # Soluzioni agli errori comuni * Se la compilazione non riesce, controlla l'installazione di JDK (JDK 17 e convalida la variabile JDK bin PATH) -* Il mio client non si connette, non accede, 4206, ecc... - Probabilmente le tue impostazioni proxy sono *il problema*, se usi +* Se il tuo client non si connette, non accede, da errore 4206, ecc... - Probabilmente *il problema* sono le tue impostazioni proxy, se usi Fiddler assicurati di utilizzare una porta diversa da 8888 * Sequenza di avvio: MongoDB > Grasscutter > Servizio proxy (mitmdump, fiddler, ecc.) > Gioco diff --git a/src/main/resources/languages/it-IT.json b/src/main/resources/languages/it-IT.json index 33d64ae65..40394c9f2 100644 --- a/src/main/resources/languages/it-IT.json +++ b/src/main/resources/languages/it-IT.json @@ -14,9 +14,9 @@ "request": "[Dispatch] Client %s %s richiesta: %s", "keystore": { "general_error": "[Dispatch] Errore nel caricamento di keystore!", - "password_error": "[Dispatch] Impossibile caricare il keystore. Provando passwrd di default keystore...", - "no_keystore_error": "[Dispatch] Nessun cert SSL trovato! Ritorno ad un server HTTP.", - "default_password": "[Dispatch] La password di default del keystore è stata caricata con successo. Considera di impostare la password a 123456 in config.json." + "password_error": "[Dispatch] Impossibile caricare il keystore. Provando password di default keystore...", + "no_keystore_error": "[Dispatch] Nessun cert SSL trovato! Ritornando ad un server HTTP.", + "default_password": "[Dispatch] La password di default del keystore è stata caricata con successo. Prova ad impostare la password a 123456 in config.json." }, "authentication": { "default_unable_to_verify": "[Authentication] [Autenticazione] Qualcosa ha chiamato metodo VerifyUser che non è disponibile nel gestore di autenticazione predefinito." @@ -24,8 +24,8 @@ "no_commands_error": "I comandi non sono supportati in modalità solo dispatch.", "unhandled_request_error": "[Dispatch] Potenziali %s richieste non gestite: %s.", "account": { - "login_attempt": "[Dispatch] Il client %s sta provando a fare il login.", - "login_success": "[Dispatch] Client %s loggato come %s.", + "login_attempt": "[Dispatch] Il client %s sta provando ad accedere.", + "login_success": "[Dispatch] Client %s ha accesso come %s.", "login_max_player_limit": "[Dispatch] Client %s non è riuscito ad accedere: Il numero di giocatori online ha raggiunto il limite", "login_token_attempt": "[Dispatch] Il client %s sta tentando di accedere tramite token.", "login_token_error": "[Dispatch] Client %s non è riuscito ad accedere tramite token.", @@ -49,24 +49,24 @@ "router_error": "[Dispatch] Impossibile collegare il router." }, "status": { - "free_software": "Grasscutter è un software GRATUITO. Se hai pagato per questo, potresti essere stato truffato. Homepage: https://github.com/Grasscutters/Grasscutter", + "free_software": "Grasscutter è un software GRATUITO. Se lo hai pagato, potresti essere stato truffato. Homepage: https://github.com/Grasscutters/Grasscutter", "starting": "Avvio di Grasscutter...", "shutdown": "Chiusura in corso...", "done": "Fatto! Per aiuto, digita \"help\"", "error": "Si è verificato un errore.", - "welcome": "Benvenuto in Grasscutter!", + "welcome": "Benvenuto a Grasscutter!", "run_mode_error": "Modalità di esecuzione del server non valida: %s.", "run_mode_help": "La modalità di esecuzione del server deve essere 'HYBRID', 'DISPATCH_ONLY' o 'GAME_ONLY'. Impossibile avviare Grasscutter...", - "create_resources": "Creazione cartella risorse...", + "create_resources": "Creazione cartella delle risorse...", "resources_error": "Inserisci una copia di 'BinOutput' e 'ExcelBinOutput' nella cartella delle risorse.", "version": "Versione Grassscutter: %s-%s", "game_version": "Versione del gioco: %s", "resources": { "loading": "Caricamento risorse...", "finish": "Terminato il caricamento delle risorse.", - "custom": "🇺🇸Find additional resources at: 'Anime-Game-Servers/CustomGCResources'.", - "missing_server": "🇺🇸To fully use questing, it is recommended to add the 'Server' folder.", - "missing_scenes": "🇺🇸To fully use questing, it is recommended to add the 'ScriptSceneData' folder." + "custom": "Puoi trovare risorse aggiuntive a: 'Anime-Game-Servers/CustomGCResources'.", + "missing_server": "Per usare questing al completo, è consigliato aggiungere la cartella 'Server'.", + "missing_scenes": "Per usare questing al completo, è consigliato aggiungere la cartella 'ScriptSceneData'." } } }, @@ -84,10 +84,10 @@ "set_for_to": "%s per %s impostato su %s.", "invalid": { "amount": "Importo non valido.", - "artifactId": "ID artefatto non valido.", - "avatarId": "ID avatar non valido.", - "avatarLevel": "Livello avatar non valido.", - "cfgId": "🇺🇸Invalid cfg ID.", + "artifactId": "ID manufatto non valido.", + "AvatarId": "ID Avatar non valido.", + "AvatarLevel": "Livello Avatar non valido.", + "cfgId": "cfg ID invalido.", "entityId": "ID entità non valido.", "itemId": "ID articolo non valido.", "itemLevel": "ItemLevel non valido.", @@ -130,25 +130,25 @@ }, "achievement": { "success": { - "grant": "🇺🇸Granted the achievement to %s.", - "revoke": "🇺🇸Revoked the achievement from %s.", - "progress": "🇺🇸Set progress of %s's achievement(id: %s) to %s.", - "grantall": "🇺🇸Granted %s achievement(s) to %s.", - "revokeall": "🇺🇸Revoked %s achievement(s) from %s." + "grant": "Concesso l'obbiettivo a %s.", + "revoke": "Revocato l'obbiettivo from %s.", + "progress": "Impostato il progresso della completazione dell'obbiettivo(id: %s) di %s a %s.", + "grantall": "Concesso/i l'/gli obbiettivo/i a %s.", + "revokeall": "Revocato/i l'/gli obbiettivo/i da %s." }, "fail": { - "achievement_not_found": "🇺🇸Achievement not found.", - "already_achieved": "🇺🇸%s has already achieved the achievement.", - "not_yet_achieved": "🇺🇸%s hasn't achieved the achievement yet." + "achievement_not_found": "Obbiettivo non trovato.", + "already_achieved": "%s ha già completato l'obbiettivo.", + "not_yet_achieved": "🇺🇸%s non ha ancora completato l'obbiettivo." }, - "description": "🇺🇸Grant, Revoke or Progress achievements." + "description": "Concedi, revoca o imposta il progresso della completazione degli obbiettivi." }, "announce": { "send_success": "Invia un annuncio con successo, puoi revocarlo /a revoca %s.", "refresh_success": "Aggiorna il file di configurazione dell'annuncio con successo. [Totale %s]", "revoke_done": "Prova a revocare l'annuncio %s.", "not_found": "Impossibile trovare l'annuncio %s.", - "description": "Invia annuncio a tutti i giocatori online o gestisci l'annuncio del server" + "description": "Invia un annuncio a tutti i giocatori online o gestisci l'annuncio del server" }, "clear": { "weapons": "Armi cancellate per %s.", @@ -162,7 +162,7 @@ }, "coop": { "success": "Convocato %s nel mondo di %s.", - "description": "Forza qualcuno a unirsi al mondo degli altri. Se nessuno viene preso di mira, ti manda comunque in modalità cooperativa." + "description": "Forza qualcuno a unirsi al mondo degli altri. Se il bersaglio non è impostato, ti manda comunque in modalità cooperativa." }, "enter_dungeon": { "changed": "Cambiato nel dungeon %s.", @@ -171,22 +171,22 @@ "description": "Entra in un dungeon" }, "entity": { - "description": "🇺🇸Modify an existing entity's properties", - "not_found_error": "🇺🇸Entity does not exist" + "description": "Modifica le proprietà di un entità esistente", + "not_found_error": "L'entità non esiste." }, "give": { "usage_relic": "Utilizzo: fornire [mainPropID] [[,]]... [lv]", - "illegal_relic": "Questo ID artefatto appartiene a un intervallo nella blacklist, potrebbe non essere quello che volevi.", + "illegal_relic": "Questo ID manufatto appartiene a un intervallo nella blacklist, potrebbe non essere quello che volevi.", "given": "Dato %s di %s a %s.", "given_with_level_and_refinement": "Dato %s con livello %s, perfezionamento %s %s volte a %s.", "given_level": "Dato %s con livello %s %s volte a %s.", - "given_avatar": "Dato %s con livello da %s a %s.", + "given_Avatar": "Dato %s con livello da %s a %s.", "giveall_success": "Ha dato tutti gli oggetti con successo.", - "description": "Dà un oggetto a te o al giocatore specificato. Può anche dare tutte le armi, avatar e/o materiali, e può costruire artefatti personalizzati." + "description": "Dà un oggetto a te o al giocatore specificato. Può anche dare tutte le armi, Avatar e/o materiali, e può costruire manufatti personalizzati." }, "heal": { "success": "Tutti i personaggi sono stati curati.", - "description": "Guarisci tutti i personaggi della tua squadra attuale." + "description": "Guarisce tutti i personaggi della tua squadra attuale" }, "help": { "aliases": "Alias: ", @@ -199,26 +199,26 @@ }, "kick": { "player_kick_player": "Il giocatore [%s:%s] ha espulso un giocatore [%s:%s]", - "server_kick_player": "Ha preso a calci il giocatore [%s:%s]...", + "server_kick_player": "È stato espulso il giocatore [%s:%s]...", "description": "Espelle il giocatore specificato dal server (WIP)" }, "killall": { "scene_not_found_in_player_world": "Scena non trovata nel mondo del giocatore.", - "kill_monsters_in_scene": "Uccidere %s mostri nella scena %s.", - "description": "Uccidi tutte le entità" + "kill_monsters_in_scene": "Uccisi %s mostri nella scena %s.", + "description": "Uccide tutte le entità" }, "killCharacter": { - "success": "Hai ucciso il personaggio attuale di %s.", + "success": "Ucciso il personaggio attuale di %s.", "description": "Uccide il personaggio attuale del giocatore" }, "language": { "current_language": "La lingua attuale è %s.", - "language_changed": "Lingua modificata in %s.", + "language_changed": "Lingua cambiata a %s.", "language_not_found": "Attualmente, il server non ha quella lingua.", "description": "Mostra o cambia la lingua corrente" }, "list": { - "success": "Ci sono %s player(s) online:", + "success": "Ci sono %s player online:", "description": "Lista player online" }, "permission": { @@ -231,7 +231,7 @@ }, "position": { "success": "Coordinate: %s, %s, %s\nRotazione:%s, %s, %s\nID scena: %a", - "description": "Ottiene informazioni sulla posizione e sulla rotazione" + "description": "Ottiene informazioni sulla posizione e sulla rotazione attuale del giocatore" }, "quest": { "added": "Missione %s aggiunta.", @@ -239,39 +239,39 @@ "not_found": "Missione non trovata.", "invalid_id": "ID missione non valido.", "description": "Aggiungi o completa missioni", - "running": "🇺🇸Quest %s is %s (%s).", - "talking": "🇺🇸Talk %s is %s for main quest %s (%s).", + "running": "Missione %s è %s (%s).", + "talking": "Talk %s è %s per la missione principale %s (%s).", "state": { - "none": "🇺🇸unknown (none)", - "unstarted": "🇺🇸unfinished (not started, not completed)", - "unfinished": "🇺🇸unfinished (started, not completed)", - "finished": "🇺🇸finished (completed)", - "failed": "🇺🇸finished (completed, but failed)", - "exists": "🇺🇸found", - "not_exists": "🇺🇸not found" + "none": "sconosciuta (nessuna)", + "unstarted": "incompleta (not cominciata, non completata)", + "unfinished": "incompleta (cominciata, non completata)", + "finished": "completa (completata)", + "failed": "incompleta (completata, ma fallita)", + "exists": "Missione esistente", + "not_exists": "Missione non esistente." }, - "enabled": "🇺🇸Questing enabled." + "enabled": "Questing abilitato." }, "group": { - "invalid_groupid": "🇺🇸Invalid group ID.", - "invalid_suiteid": "🇺🇸Invalid suite ID.", - "group_not_found": "🇺🇸Group not found.", - "description": "🇺🇸Alter group loading", - "refreshed": "🇺🇸Group %s refreshed." + "invalid_groupid": "group ID non valido.", + "invalid_suiteid": "suite ID non valido.", + "group_not_found": "group non trovato.", + "description": "Carica Alter Group", + "refreshed": "Group %s ricaricato." }, "cutscene": { - "description": "Riproduce un filmato" + "description": "Riproduce una cutscene" }, "sound": { - "description": "🇺🇸Plays a sound" + "description": "Riproduce un suono" }, "reload": { - "reload_start": "Ricarica configurazione.", + "reload_start": "Ricarica in configurazione.", "reload_done": "Ricarica completa.", - "description": "Ricarica configurazione server" + "description": "Ricarica la configurazione del server" }, "resetConst": { - "reset_all": "Ripristina le costellazioni di tutti gli avatar.", + "reset_all": "Ripristina le costellazioni di tutti gli Avatar.", "success": "Le costellazioni per %s sono state reimpostate. Effettua nuovamente il login per vedere le modifiche.", "description": "Reimposta il livello della costellazione sul tuo personaggio attivo corrente, dovrai reloggare dopo aver usato il comando per vedere eventuali modifiche" }, @@ -304,7 +304,7 @@ }, "sendMessage": { "success": "Messaggio inviato.", - "description": "Invia un messaggio a un giocatore come server. Se usato senza target, invia a tutti i giocatori sul server." + "description": "Invia un messaggio a un giocatore come server. Se usato senza bersaglio, invia a tutti i giocatori sul server." }, "setConst": { "range_error": "Il livello della costellazione deve essere compreso tra 0 e 6.", @@ -316,10 +316,10 @@ "description": "Imposta il livello di costellazione per il tuo attuale personaggio attivo" }, "setFetterLevel": { - "range_error": "Il livello di restrizione deve essere compreso tra 0 e 10.", - "success": "Livello di restrizione impostato su %s.", - "level_error": "Livello restrizione non valido.", - "description": "Imposta il tuo livello di restrizione per il tuo attuale personaggio attivo" + "range_error": "Il livello di amicizia deve essere compreso tra 0 e 10.", + "success": "Livello di amicizia impostato a %s.", + "level_error": "Livello di amicizia non valido.", + "description": "Imposta il tuo livello di amicizia per il tuo attuale personaggio attivo" }, "setProp": { "description": "Imposta le proprietà dell'intero account. Cose come godmode possono essere abilitate in questo modo, oltre a cambiare cose come il pavimento dell'abisso sbloccato e il progresso del pass battaglia.\n\tValori per (senza distinzione tra maiuscole e minuscole): GodMode | UnlimitedStamina | UnlimitedEnergy | TowerLevel | WorldLevel | BPLevel | SetOpenState | UnsetOpenState | UnlockMap\n\t(cont.) vedi PlayerProperty enum per altri possibili valori, nella forma PROP_MAX_SPRING_VOLUME -> max_spring_volume" @@ -354,19 +354,19 @@ "team": { "invalid_usage": "Utilizzo non valido.", "invalid_index": "L'indice non è valido.", - "add_too_much": "Il server ti permette di avere al massimo %s avatar nella tua squadra.", - "failed_to_add_avatar": "Impossibile aggiungere l'ID avatar %s.", + "add_too_much": "Il server ti permette di avere al massimo %s personaggi nella tua squadra.", + "failed_to_add_Avatar": "Impossibile aggiungere l'ID Avatar %s.", "failed_to_parse_index": "Impossibile analizzare l'indice: %s", - "remove_too_much": "Non puoi rimuovere tutti i tuoi avatar.", + "remove_too_much": "Non puoi rimuovere tutti i tuoi personaggi.", "ignore_index": "Indici ignorati: %s", "index_out_of_range": "L'indice che hai specificato non è compreso nell'intervallo.", - "failed_parse_avatar_id": "Impossibile analizzare l'ID avatar: %s", - "avatar_already_in_team": "Avatar è già nel team.", - "avatar_not_found": "Avatar %s non trovato.", + "failed_parse_Avatar_id": "Impossibile analizzare l'ID Avatar: %s", + "Avatar_already_in_team": "Il personaggio è già nella squadra.", + "Avatar_not_found": "Personaggio %s non trovato.", "description": "Modifica manualmente la tua squadra." }, "teleportAll": { - "success": "Evoca tutti i giocatori nella tua posizione.", + "success": "Teletrasportati tutti i giocatori nella tua posizione.", "error": "Puoi usare questo comando solo in modalità MP.", "description": "Teletrasporta tutti i giocatori del tuo mondo nella tua posizione" }, @@ -377,15 +377,15 @@ "description": "Cambia la posizione del giocatore" }, "trialAvatarActivity": { - "description": "Manipolare le funzionalità dell'attività Avatar di prova. Ciò include la commutazione degli stati dei sotterranei e delle ricompense.", - "not_found": "Dati giocatore attività avatar di prova non trovati. Forse l'attività non è abilitata.", + "description": "Manipola le funzionalità dell'attività Trial del personaggio. Ciò include la commutazione degli stati dei dungeon e delle ricompense.", + "not_found": "Dati giocatore attività personaggi di prova non trovati. Forse l'attività non è abilitata.", "invalid_param": "Parametro non valido.", "schedule_not_found": "Programma %s non trovato.", "success_schedule": "ID programma modificato in %s.", - "success_dungeon": "Stato del dungeon dell'avatar %s attivato.", - "success_dungeon_all": "Modificato lo stato dei dungeon di tutti gli avatar.", - "success_reward": "Stato della ricompensa dell'avatar %s attivato/disattivato.", - "success_reward_all": "Attivato/disattivato lo stato di ricompensa di tutti gli avatar." + "success_dungeon": "Stato del dungeon del personaggio %s attivato.", + "success_dungeon_all": "Modificato lo stato dei dungeon di tutti i personaggi.", + "success_reward": "Stato della ricompensa del personaggio %s attivato/disattivato.", + "success_reward_all": "Attivato/disattivato lo stato di ricompensa di tutti i personaggi." }, "weather": { "success": "Imposta l'ID meteo su %s con il tipo di clima %s.", @@ -393,7 +393,7 @@ "description": "Cambia l'ID meteo e il tipo di clima. Gli ID meteo possono essere trovati in ./Resources/ExcelBinOutput/WeatherExcelConfigData.json.\nTipi di clima: soleggiato, nuvoloso, pioggia, temporale, neve, nebbia" }, "ban": { - "success": "Soccesso.", + "success": "Successo.", "failure": "Fallito, giocatore non trovato.", "invalid_time": "Impossibile analizzare il timestamp.", "description": "Banna un giocatore" @@ -408,7 +408,7 @@ "description": "Sbanna un giocatore" }, "troubleshoot": { - "description": "🇺🇸Generate debugging information for troubleshooting." + "description": "Genera informazioni di debugging per il troubleshooting." } }, "gacha": { @@ -419,7 +419,7 @@ "available_three_stars": "Articoli a 3 stelle disponibili" }, "records": { - "title": "🇺🇸Gacha Records", + "title": "Cronologia Gacha", "date": "Data", "item": "oggetto" } @@ -428,14 +428,14 @@ "handbook": { "title": "Manuale GM", "title_commands": "Comandi", - "title_avatars": "Avatar", + "title_Avatars": "Personaggi", "title_items": "Articoli", "title_scenes": "Scene", "title_monsters": "Mostri", "header_id": "ID", "header_command": "Comando", "header_description": "Descrizione", - "header_avatar": "🇺🇸Avatar", + "header_Avatar": "Personaggi", "header_item": "Articolo", "header_scene": "Scena", "header_monster": "Mostro" @@ -462,9 +462,9 @@ "disabling_plugin": "Disabilitazione plug-in: %s", "disabling_failed": "Impossibile disabilitare il plug-in: %s", "invalid_api": { - "not_present": "🇺🇸Plugin %s does not specify an API version.", - "lower": "🇺🇸Plugin %s is using API version %s, while the server is using API version %s.", - "outdated": "🇺🇸Plugin %s is using an outdated API method." + "not_present": "Il plugin %s non ha una versione API specifica.", + "lower": "Il plugin %s sta usando la versione API %s, mentre il server sta usando la versione API %s.", + "outdated": "Il plugin %s sta usando un metodo API obsoleto." } } } From d0a4da8a1f813d6db8a7a7a84f30b551fb533b08 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 9 Jul 2023 06:04:19 +0000 Subject: [PATCH 07/13] Update languages [skip actions] --- src/main/resources/languages/it-IT.json | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/main/resources/languages/it-IT.json b/src/main/resources/languages/it-IT.json index 40394c9f2..02fff0df5 100644 --- a/src/main/resources/languages/it-IT.json +++ b/src/main/resources/languages/it-IT.json @@ -85,8 +85,8 @@ "invalid": { "amount": "Importo non valido.", "artifactId": "ID manufatto non valido.", - "AvatarId": "ID Avatar non valido.", - "AvatarLevel": "Livello Avatar non valido.", + "avatarId": "🇺🇸Invalid avatar ID.", + "avatarLevel": "🇺🇸Invalid avatarLevel.", "cfgId": "cfg ID invalido.", "entityId": "ID entità non valido.", "itemId": "ID articolo non valido.", @@ -180,7 +180,7 @@ "given": "Dato %s di %s a %s.", "given_with_level_and_refinement": "Dato %s con livello %s, perfezionamento %s %s volte a %s.", "given_level": "Dato %s con livello %s %s volte a %s.", - "given_Avatar": "Dato %s con livello da %s a %s.", + "given_avatar": "🇺🇸Given %s with level %s to %s.", "giveall_success": "Ha dato tutti gli oggetti con successo.", "description": "Dà un oggetto a te o al giocatore specificato. Può anche dare tutte le armi, Avatar e/o materiali, e può costruire manufatti personalizzati." }, @@ -245,7 +245,7 @@ "none": "sconosciuta (nessuna)", "unstarted": "incompleta (not cominciata, non completata)", "unfinished": "incompleta (cominciata, non completata)", - "finished": "completa (completata)", + "finished": "completa (completata)", "failed": "incompleta (completata, ma fallita)", "exists": "Missione esistente", "not_exists": "Missione non esistente." @@ -355,14 +355,14 @@ "invalid_usage": "Utilizzo non valido.", "invalid_index": "L'indice non è valido.", "add_too_much": "Il server ti permette di avere al massimo %s personaggi nella tua squadra.", - "failed_to_add_Avatar": "Impossibile aggiungere l'ID Avatar %s.", + "failed_to_add_avatar": "🇺🇸Failed to add avatar ID %s.", "failed_to_parse_index": "Impossibile analizzare l'indice: %s", "remove_too_much": "Non puoi rimuovere tutti i tuoi personaggi.", "ignore_index": "Indici ignorati: %s", "index_out_of_range": "L'indice che hai specificato non è compreso nell'intervallo.", - "failed_parse_Avatar_id": "Impossibile analizzare l'ID Avatar: %s", - "Avatar_already_in_team": "Il personaggio è già nella squadra.", - "Avatar_not_found": "Personaggio %s non trovato.", + "failed_parse_avatar_id": "🇺🇸Failed to parse avatar ID: %s", + "avatar_already_in_team": "🇺🇸Avatar is already in team.", + "avatar_not_found": "🇺🇸Avatar %s not found.", "description": "Modifica manualmente la tua squadra." }, "teleportAll": { @@ -428,14 +428,14 @@ "handbook": { "title": "Manuale GM", "title_commands": "Comandi", - "title_Avatars": "Personaggi", + "title_avatars": "🇺🇸Avatars", "title_items": "Articoli", "title_scenes": "Scene", "title_monsters": "Mostri", "header_id": "ID", "header_command": "Comando", "header_description": "Descrizione", - "header_Avatar": "Personaggi", + "header_avatar": "🇺🇸Avatar", "header_item": "Articolo", "header_scene": "Scena", "header_monster": "Mostro" From 0d71d2993235d051e3701ed93a3dc0d1e70ac2ad Mon Sep 17 00:00:00 2001 From: pfyy <112098515+pfyy@users.noreply.github.com> Date: Thu, 13 Jul 2023 10:00:55 +0800 Subject: [PATCH 08/13] fix first entering teapot failure (#2259) --- .../java/emu/grasscutter/scripts/SceneScriptManager.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/emu/grasscutter/scripts/SceneScriptManager.java b/src/main/java/emu/grasscutter/scripts/SceneScriptManager.java index bf459cb4d..3a3c88bec 100644 --- a/src/main/java/emu/grasscutter/scripts/SceneScriptManager.java +++ b/src/main/java/emu/grasscutter/scripts/SceneScriptManager.java @@ -99,7 +99,13 @@ public class SceneScriptManager { } public SceneConfig getConfig() { - return this.isInit ? this.meta.config : null; + for (int i = 0; i < 10; ++i) { + if (this.isInit) { + return this.meta.config; + } + Utils.sleep(100); + } + return null; } public Map getBlocks() { From 73acfa11785dfff01c3bc83f5963e9bb2dc921ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?AxelPLN=EF=BC=88Axel=20Yinjia=20Huang=EF=BC=89?= <54173955+axelpln@users.noreply.github.com> Date: Thu, 13 Jul 2023 10:01:20 +0800 Subject: [PATCH 09/13] Update README_zh-TW (#2261) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update README_zh-TW.md 添加繁體版快速開始 * Update README_zh-TW.md --- docs/README_zh-TW.md | 57 +++++++++++--------------------------------- 1 file changed, 14 insertions(+), 43 deletions(-) diff --git a/docs/README_zh-TW.md b/docs/README_zh-TW.md index 578c0010d..2d93bd783 100644 --- a/docs/README_zh-TW.md +++ b/docs/README_zh-TW.md @@ -22,52 +22,23 @@ **注意:** 如需幫助請加入 [Discord](https://discord.gg/T5vZU6UyeG) -### 環境需求 +### 快速開始(全自動) -* Java SE - 17 ([連結](https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html)) +- 下載 Java 17:https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html +- 下載 [MongoDB 社區伺服器](https://www.mongodb.com/try/download/community) +- 下載遊戲版本 REL3.7(如果你沒有的話,可以在[這裡](https://github.com/MAnggiarMustofa/GI-Download-Library/blob/main/GenshinImpact/Client/3.7.0.md)找到 3.7 客戶端) - **注意:** 如果僅想**執行服務端**, 使用 **jre** 即可 +- 下載 [最新的 Cultivation 版本](https://github.com/Grasscutters/Cultivation/releases/latest)。使用 `.msi` 安裝程式。 +- 以管理員身分打開 Culivation,按右上角的下載按鈕。 +- 點擊 `Download All-in-One` +- 點擊右上角的齒輪 +- 將遊戲安裝路徑設置為你的遊戲所在的位置。 +- 將自定義 Java 路徑設置為 `C:\Program Files\Java\jdk-17\bin\java.exe` +- 其他設置保持預設 -* [MongoDB](https://www.mongodb.com/try/download/community) (推薦 4.0+) - -* 代理程式: mitmproxy (推薦 mitmdump), Fiddler Classic 等 - -### 執行 - -**注意:** 從舊版本升級到新版本, 需要刪除 `config.json` - -1. 獲取 `grasscutter.jar` - - 從 [actions](https://github.com/Grasscutters/Grasscutter/suites/6895963598/artifacts/267483297) 下載 - - [自行編譯](#編譯) -2. 在 JAR 檔案根目錄中建立 `resources` 資料夾並複製 `BinOutput` 和 `ExcelBinOutput` *(查看 [wiki](https://github.com/Grasscutters/Grasscutter/wiki) 瞭解更多)* -3. 命令列 `java -jar grasscutter.jar` 執行 Grasscutter。**在此之前請確認 MongoDB 服務執行正常** - -### 客戶端連線 - -½. 在伺服器控制台[建立賬戶](https://github.com/Grasscutters/Grasscutter/wiki/Commands#targeting) - -1. 重定向流量: (選擇其中一個) - - mitmdump: `mitmdump -s proxy.py -k` - - 信任 CA 證書: - - ​ **注意:** mitmproxy 的 CA 證書通常存放在 `%USERPROFILE%\ .mitmproxy`, 或者在 `http://mitm.it` 下載證書 - - ​ 雙擊[安裝根證書](https://docs.microsoft.com/en-us/skype-sdk/sdn/articles/installing-the-trusted-root-certificate#installing-a-trusted-root-certificate)或者... - - - 使用命令列 - - ```shell - certutil -addstore root %USERPROFILE%\.mitmproxy\mitmproxy-ca-cert.cer - ``` - - - Fiddler Classic: 執行 Fiddler Classic, 在設定中開啟 `解密 https 通訊` 並將通訊埠設為除 `8888` 以外的任意通訊埠 (工具 -> 選項 -> 連線) 並載入[此指令碼](https://github.lunatic.moe/fiddlerscript) - - - [Hosts 檔案](https://github.com/Grasscutters/Grasscutter/wiki/Running#traffic-route-map) - -2. 設定代理為 `127.0.0.1:8080` 或你設定的通訊埠 - -**也可直接執行 `start.cmd` 一鍵啟動服務端並設定代理, 但必須設定 `JAVA_HOME` 環境變數** +- 點擊啟動旁邊的小按鈕。 +- 點擊啟動按鈕。 +- 用你想要的用戶名登錄,密碼無所謂。 ### 編譯 From a4d5de06d14558cd28a1ba0ba1dcd58cb80ec2fb Mon Sep 17 00:00:00 2001 From: Nazrin Date: Fri, 14 Jul 2023 16:36:50 -0700 Subject: [PATCH 10/13] Fix starting wrong quest for story quests (#2264) --- .../server/packet/recv/HandlerUnlockPersonalLineReq.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/emu/grasscutter/server/packet/recv/HandlerUnlockPersonalLineReq.java b/src/main/java/emu/grasscutter/server/packet/recv/HandlerUnlockPersonalLineReq.java index 7350ecbf5..688273a46 100644 --- a/src/main/java/emu/grasscutter/server/packet/recv/HandlerUnlockPersonalLineReq.java +++ b/src/main/java/emu/grasscutter/server/packet/recv/HandlerUnlockPersonalLineReq.java @@ -21,7 +21,6 @@ public class HandlerUnlockPersonalLineReq extends PacketHandler { return; } - session.getPlayer().getQuestManager().addQuest(data.getStartQuestId()); session.getPlayer().addPersonalLine(data.getId()); session.getPlayer().useLegendaryKey(1); From d62394e35e950c22e630da1bd391ee79a7dca4b2 Mon Sep 17 00:00:00 2001 From: Nazrin Date: Fri, 14 Jul 2023 16:37:08 -0700 Subject: [PATCH 11/13] Remove obsolete code in ScriptLib.java (#2263) --- src/main/java/emu/grasscutter/scripts/ScriptLib.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/main/java/emu/grasscutter/scripts/ScriptLib.java b/src/main/java/emu/grasscutter/scripts/ScriptLib.java index f967d3101..abf16983e 100644 --- a/src/main/java/emu/grasscutter/scripts/ScriptLib.java +++ b/src/main/java/emu/grasscutter/scripts/ScriptLib.java @@ -256,12 +256,6 @@ public class ScriptLib { Grasscutter.getLogger().warn("trying to get suite that doesn't exist: {} {}", groupId, suite); return 1; } - // avoid spawn wrong monster - if(getSceneScriptManager().getScene().getChallenge() != null) - if(!getSceneScriptManager().getScene().getChallenge().inProgress() || - getSceneScriptManager().getScene().getChallenge().getGroup().id != groupId){ - return 0; - } this.getSceneScriptManager().addGroupSuite(groupInstance, suiteData); return 0; From f725d9203d4293b594bfb034ab7c2e9fe12b0024 Mon Sep 17 00:00:00 2001 From: Nazrin Date: Fri, 14 Jul 2023 16:37:29 -0700 Subject: [PATCH 12/13] Fix QUEST_CONTENT_LEAVE_SCENE (#2262) --- .../emu/grasscutter/game/quest/content/ContentLeaveScene.java | 2 +- .../server/packet/recv/HandlerPostEnterSceneReq.java | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/emu/grasscutter/game/quest/content/ContentLeaveScene.java b/src/main/java/emu/grasscutter/game/quest/content/ContentLeaveScene.java index 24f2ec921..45f2d6bf4 100644 --- a/src/main/java/emu/grasscutter/game/quest/content/ContentLeaveScene.java +++ b/src/main/java/emu/grasscutter/game/quest/content/ContentLeaveScene.java @@ -12,6 +12,6 @@ public class ContentLeaveScene extends BaseContent { @Override public boolean execute( GameQuest quest, QuestData.QuestContentCondition condition, String paramStr, int... params) { - return quest.getOwner().getScene().getPrevScene() == params[0]; + return condition.getParam()[0] == params[0]; } } diff --git a/src/main/java/emu/grasscutter/server/packet/recv/HandlerPostEnterSceneReq.java b/src/main/java/emu/grasscutter/server/packet/recv/HandlerPostEnterSceneReq.java index 6339003cc..96559a622 100644 --- a/src/main/java/emu/grasscutter/server/packet/recv/HandlerPostEnterSceneReq.java +++ b/src/main/java/emu/grasscutter/server/packet/recv/HandlerPostEnterSceneReq.java @@ -28,6 +28,7 @@ public class HandlerPostEnterSceneReq extends PacketHandler { if (dungeonManager != null) dungeonManager.startDungeon(); } } + questManager.queueEvent(QuestContent.QUEST_CONTENT_LEAVE_SCENE, scene.getPrevScene()); session.send(new PacketPostEnterSceneRsp(session.getPlayer())); } From acb3575c7708563fffafd6ead54dfa38bd1a7029 Mon Sep 17 00:00:00 2001 From: 5idereal Date: Sat, 15 Jul 2023 07:37:54 +0800 Subject: [PATCH 13/13] update zh-TW.json (#2260) --- src/main/resources/languages/zh-TW.json | 366 ++++++++++++------------ 1 file changed, 183 insertions(+), 183 deletions(-) diff --git a/src/main/resources/languages/zh-TW.json b/src/main/resources/languages/zh-TW.json index 5f22441a0..82f578bce 100644 --- a/src/main/resources/languages/zh-TW.json +++ b/src/main/resources/languages/zh-TW.json @@ -1,72 +1,72 @@ { "messages": { "game": { - "address_bind": "🇺🇸Game Server started at \u001b[1m\u001b[33m%s:%s\u001b[0m", - "port_bind": "遊戲伺服器已成功啟動。端口號:%s", - "connect": "客戶端已連接至 %s", - "disconnect": "客戶端 %s 已斷開連接。", + "address_bind": "遊戲伺服器已於 \u001b[1m\u001b[33m%s:%s\u001b[0m 啟動", + "port_bind": "遊戲伺服器已在連接埠 %s 上啟動", + "connect": "客戶端 %s 已連線", + "disconnect": "客戶端 %s 已斷開連線", "game_update_error": "遊戲更新時發生了錯誤。", "command_error": "指令發生錯誤:" }, "dispatch": { - "address_bind": "🇺🇸[Dispatch] Dispatch server started at \u001b[1m\u001b[33m%s:%s\u001b[0m", - "port_bind": "[Dispatch] 伺服器已在端口 %s 上開啟。", - "request": "[Dispatch] 客戶端 %s 請求: %s %s", + "address_bind": "[Dispatch] Dispatch 伺服器已於 \u001b[1m\u001b[33m%s:%s\u001b[0m 啟動", + "port_bind": "[Dispatch] Dispatch 伺服器已在連接埠 %s 上啟動", + "request": "[Dispatch] 客戶端 %s 請求:%s %s", "keystore": { - "general_error": "[Dispatch] 加載keystore文件時發生錯誤!", - "password_error": "[Dispatch] 加載 keystore 失敗。正在嘗試使用預設 keystore 密碼...", - "no_keystore_error": "[Dispatch] 未找到 SSL 憑證!已後降到 HTTP 伺服器。", - "default_password": "[Dispatch] 默認的 keystore 密碼加載成功。請考慮將 config.json 的憑證密碼設定成 123456。" + "general_error": "[Dispatch] 載入 keystore 檔案時發生錯誤!", + "password_error": "[Dispatch] 載入 keystore 失敗。正在嘗試使用預設 keystore 密碼...", + "no_keystore_error": "[Dispatch] 未找到 SSL 憑證!已回退到 HTTP 伺服器。", + "default_password": "[Dispatch] keystore 預設密碼載入成功。請考慮將 config.json 的憑證密碼設定成 123456。" }, "authentication": { "default_unable_to_verify": "[驗證系統] 稱為 verifyUser 方法的東西在默認身份驗證程序中不可用。" }, - "no_commands_error": "此指令不適用於Dispatch-only模式。", + "no_commands_error": "此指令不適用於僅限 Dispatch 模式。", "unhandled_request_error": "[Dispatch] 潛在的未處理請求 %s 請求:%s", "account": { "login_attempt": "[Dispatch] 客戶端 %s 正在嘗試登入", - "login_success": "[Dispatch] 客戶端 %s 已登入,UID為 %s", - "login_max_player_limit": "[Dispatch] 客戶端 %s 登入失敗:在線人數已滿", + "login_success": "[Dispatch] 客戶端 %s 已登入,UID 為 %s", + "login_max_player_limit": "[Dispatch] 客戶端 %s 登入失敗:線上人數已滿", "login_token_attempt": "[Dispatch] 客戶端 %s 正在嘗試用憑證登入", "login_token_error": "[Dispatch] 客戶端 %s 使用憑證登入失敗", - "login_token_success": "[Dispatch] 客戶端 %s 已透過憑證登入,UID為 %s", + "login_token_success": "[Dispatch] 客戶端 %s 已透過憑證登入,UID 為 %s", "login_password_error": "[Dispatch] 客戶端 %s 使用密碼登入失敗", "login_password_storage_error": "[Dispatch] 客戶端 %s 使用密碼登入失敗,因為該帳號在資料庫裡面沒有設定密碼。", "combo_token_success": "[Dispatch] 客戶端 %s 交換憑證成功", "combo_token_error": "[Dispatch] 客戶端 %s 交換憑證失敗", - "account_login_create_success": "[Dispatch] 客戶端 %s 登入失敗: 已註冊UID為 %s 的帳號。", + "account_login_create_success": "[Dispatch] 客戶端 %s 登入失敗:已註冊 UID 為 %s 的帳號。", "account_login_create_error": "[Dispatch] 客戶端 %s 登入失敗:帳號建立失敗。", - "account_login_exist_error": "[Dispatch] 客戶端 %s 登入失敗: 帳號不存在。", - "account_cache_error": "遊戲帳號緩存資訊錯誤", - "session_key_error": "對話密鑰不符。", - "username_error": "未找到此用戶名。", - "username_create_error": "未找到用戶名,建立失敗。", - "password_error": "無效的密碼", - "password_length_error": "密碼長度必須大於或等於 8。", - "password_storage_error": "此帳號沒有設定密碼,請聯繫伺服器管理員。", - "server_max_player_limit": "伺服器在線人數已滿" + "account_login_exist_error": "[Dispatch] 客戶端 %s 登入失敗:帳號不存在。", + "account_cache_error": "遊戲帳號快取資訊錯誤。", + "session_key_error": "工作階段金鑰錯誤。", + "username_error": "找不到此使用者名稱。", + "username_create_error": "找不到使用者名稱,建立失敗。", + "password_error": "密碼無效", + "password_length_error": "密碼長度必須大於或等於 8", + "password_storage_error": "您的帳號沒有設定密碼,請聯繫管理員。", + "server_max_player_limit": "伺服器線上人數已滿" }, - "router_error": "[Dispatch] 無法附加到路由上。" + "router_error": "[Dispatch] 無法附加路由。" }, "status": { "free_software": "Grasscutter 是免費開源軟體。如果你已經付錢了,那你可能被騙了。主頁:https://github.com/Grasscutters/Grasscutter", "starting": "正在啟動 Grasscutter...", "shutdown": "正在關閉...", - "done": "加載完成!需要指令幫助請輸入 \"help\"", + "done": "載入完成!需要指令幫助請輸入 \"help\"", "error": "發生了一個錯誤。", - "welcome": "歡迎使用 Grasscutter", - "run_mode_error": "無效的伺服器運行模式: %s。", - "run_mode_help": "伺服器運行模式必須為 HYBRID 或者 DISPATCH_ONLY 或者 GAME_ONLY。 Grasscutter 啟動失敗...", + "welcome": "歡迎使用 Grasscutter!", + "run_mode_error": "無效的伺服器運行模式:%s。", + "run_mode_help": "伺服器運行模式必須為 HYBRID 或者 DISPATCH_ONLY 或者 GAME_ONLY。Grasscutter 啟動失敗...", "create_resources": "正在建立 resources 資料夾...", "resources_error": "請將 BinOutput 和 ExcelBinOutput 複製到 resources 資料夾。", - "version": "Grasscutter版本: %s-%s", + "version": "Grasscutter 版本: %s-%s", "game_version": "遊戲版本:%s", "resources": { - "loading": "加載資源中...", - "finish": "資源加載完成.。", - "custom": "🇺🇸Find additional resources at: 'Anime-Game-Servers/CustomGCResources'.", - "missing_server": "🇺🇸To fully use questing, it is recommended to add the 'Server' folder.", - "missing_scenes": "🇺🇸To fully use questing, it is recommended to add the 'ScriptSceneData' folder." + "loading": "載入資源中...", + "finish": "資源載入完成。", + "custom": "在 'Anime-Game-Servers/CustomGCResources' 尋找額外資源。", + "missing_server": "若要完整使用任務功能,建議加入 'Server' 資料夾。", + "missing_scenes": "若要完整使用任務功能,建議加入 'ScriptSceneData' 資料夾。" } } }, @@ -83,36 +83,36 @@ "set_to": "%s 已經設為 %s。", "set_for_to": "%s 的使用者 %s 更改為 %s。", "invalid": { - "amount": "無效的數量。", - "artifactId": "無效的聖遺物ID。", - "avatarId": "無效的角色ID。", - "avatarLevel": "無效的角色等級。", - "cfgId": "🇺🇸Invalid cfg ID.", - "entityId": "無效的實體ID。", - "itemId": "無效的物品ID。", - "itemLevel": "無效的物品等級。", - "itemRefinement": "無效的物品精煉度。", - "statValue": "無效的數據值。", - "value_between": "無效的屬性值:%s 必須在 %s 到 %s 之間。", - "playerId": "無效的玩家ID。", - "uid": "無效的UID。", - "id": "無效的ID。" + "amount": "數量無效。", + "artifactId": "聖遺物 ID 無效。", + "avatarId": "角色 ID 無效。", + "avatarLevel": "角色等級無效。", + "cfgId": "cfg ID 無效。", + "entityId": "實體 ID 無效。", + "itemId": "物品 ID 無效。", + "itemLevel": "物品等級無效。", + "itemRefinement": "物品精煉度無效。", + "statValue": "數據值無效。", + "value_between": "屬性值:%s 必須在 %s 到 %s 之間。", + "playerId": "玩家 ID 無效。", + "uid": "UID 無效。", + "id": "ID 無效。" } }, "execution": { "usage_prefix": "用法:", - "player_exist_error": "用戶不存在。", + "player_exist_error": "使用者不存在。", "player_offline_error": "玩家已離線。", - "item_player_exist_error": "無效的物品/玩家UID。", + "item_player_exist_error": "無效的物品/玩家 UID。", "player_exist_offline_error": "玩家不存在或已離線。", "argument_error": "無效的參數。", "clear_target": "目標已清除.", - "set_target": "隨後的指令都會以@%s為預設。", - "set_target_online": "@%s 在線。 某些命令可能需要離線目標。", - "set_target_offline": "@%s 離線。 某些命令可能需要在線目標。", + "set_target": "隨後的指令都會以 @%s 為預設。", + "set_target_online": "@%s 正在線上。某些命令可能需要離線目標。", + "set_target_offline": "@%s 目前離線。某些命令可能需要線上目標。", "need_target": "此指令需要一個目標 UID。添加 <@UID> 引數或者使用 /target @UID 來設定持久目標。", - "need_target_online": "此命令需要在線目標 UID,但當前目標離線。 添加不同的 <@UID> 參數或使用 /target @UID 設置持久目標。", - "need_target_offline": "此命令需要離線目標 UID,但當前目標在線。 添加不同的 <@UID> 參數或使用 /target @UID 設置持久目標。" + "need_target_online": "此命令需要線上目標 UID,但目前目標離線。添加不同的 <@UID> 參數或使用 /target @UID 設置持久目標。", + "need_target_offline": "此命令需要離線目標 UID,但目前目標線上。添加不同的 <@UID> 參數或使用 /target @UID 設置持久目標。" }, "status": { "enabled": "已啟用", @@ -121,34 +121,34 @@ "success": "成功" }, "account": { - "invalid": "無效的UID。", + "invalid": "無效的 UID。", "exists": "帳號已存在。", - "create": "已建立帳號,UID 為 %s 。", + "create": "已建立帳號,UID 為 %s。", "delete": "帳號已刪除。", "no_account": "帳號不存在。", "description": "建立或刪除帳號。" }, "achievement": { "success": { - "grant": "🇺🇸Granted the achievement to %s.", - "revoke": "🇺🇸Revoked the achievement from %s.", - "progress": "🇺🇸Set progress of %s's achievement(id: %s) to %s.", - "grantall": "🇺🇸Granted %s achievement(s) to %s.", - "revokeall": "🇺🇸Revoked %s achievement(s) from %s." + "grant": "已將成就授予 %s。", + "revoke": "已從 %s 撤回成就。", + "progress": "將 %s 的成就 (id: %s) 進度設為 %s。", + "grantall": "已授予 %s 項成就給 %s。", + "revokeall": "已撤回 %s 項成就:%s。" }, "fail": { - "achievement_not_found": "🇺🇸Achievement not found.", - "already_achieved": "🇺🇸%s has already achieved the achievement.", - "not_yet_achieved": "🇺🇸%s hasn't achieved the achievement yet." + "achievement_not_found": "找不到成就。", + "already_achieved": "%s 已經達成成就了。", + "not_yet_achieved": "%s 尚未達成成就。" }, - "description": "🇺🇸Grant, Revoke or Progress achievements." + "description": "授予、撤回,或提升成就。" }, "announce": { - "send_success": "成功發送了一則公告,你可以通過 /a revoke %s 撤銷。", - "refresh_success": "已重新整理了%s個公告。", + "send_success": "成功傳送了一則公告,你可以通過 /a revoke %s 撤銷。", + "refresh_success": "已重新整理了 %s 個公告。", "revoke_done": "嘗試撤回公告 %s。", "not_found": "找不到公告 %s。", - "description": "發送公告給所有在線玩家,或者是更改伺服器的公告。" + "description": "傳送公告給所有線上玩家,或者是更改伺服器的公告。" }, "clear": { "weapons": "已將 %s 的武器清空。", @@ -158,11 +158,11 @@ "displays": "已清除 %s 的顯示。", "virtuals": "已將 %s 的所有貨幣和經驗值清空。", "everything": "已將 %s 的所有物品清空。", - "description": "從你的背包中刪除所有未裝備且未上鎖的物品,包括稀有物品。" + "description": "從你的背包中刪除所有未裝備且未上鎖的物品,預設為 4 星且等級和精煉均為 1 以下的物品,但可以提高限制。" }, "coop": { "success": "召喚了 %s 到 %s 的世界。", - "description": "強制傳送指定用戶到他人的世界。如果未指定玩家,則會將你設為多人遊戲狀態。" + "description": "強制傳送指定使用者到他人的世界。如果未指定玩家,則會將你設為多人遊戲狀態。" }, "enter_dungeon": { "changed": "已進入祕境 %s", @@ -171,14 +171,14 @@ "description": "進入指定祕境。" }, "entity": { - "description": "🇺🇸Modify an existing entity's properties", - "not_found_error": "🇺🇸Entity does not exist" + "description": "編輯現有實體的屬性", + "not_found_error": "實體不存在" }, "give": { - "usage_relic": "用法: give [mainPropID] [[,]]... [lv]", - "illegal_relic": "你不可以取得這個聖遺物,因為該聖遺物ID在黑名單列表內。", + "usage_relic": "用法: give <聖遺物 ID> [主詞條 ID] [<副詞條 ID>[,<次數>]]... [lv<等級 0-20>]", + "illegal_relic": "你不可以取得這個聖遺物,因為該聖遺物 ID 在黑名單列表內。", "given": "已經將 %s 個 %s 給予 %s。", - "given_with_level_and_refinement": "已將 %s [等級%s, 精煉%s] %s個給予 %s", + "given_with_level_and_refinement": "已將 %s [等級 %s, 精煉 %s] %s 個給予 %s", "given_level": "已將 %s 等級 %s %s 個給予 %s", "given_avatar": "已將 %s 等級 %s 給予 %s。", "giveall_success": "成功給予所有物品。", @@ -186,16 +186,16 @@ }, "heal": { "success": "所有角色已被治療。", - "description": "治療當前隊伍的角色。" + "description": "治療目前隊伍的角色。" }, "help": { "aliases": "別名:", "available_commands": "可用指令:", - "tip_need_permission": "需要的權限: ", + "tip_need_permission": "需要的權限:", "tip_need_no_permission": "無", - "tip_permission_targeted": "(對其他的玩家使用這個指令還需要權限%s)", + "tip_permission_targeted": "(對其他的玩家使用這個指令還需要權限 %s)", "warn_player_has_no_permission": "注意:你沒有執行這條指令的權限", - "description": "發送幫助信息或顯示特定命令的信息" + "description": "傳送幫助訊息或顯示特定命令的資訊" }, "kick": { "player_kick_player": "玩家 [%s:%s] 已把 [%s:%s] 踢出", @@ -204,7 +204,7 @@ }, "killall": { "scene_not_found_in_player_world": "未在玩家世界中找到此場景", - "kill_monsters_in_scene": "已殺死 %s 個怪物。 [場景ID: %s]", + "kill_monsters_in_scene": "已殺死 %s 個怪物。[場景ID: %s]", "description": "殺死所有怪物。" }, "killCharacter": { @@ -212,14 +212,14 @@ "description": "殺死玩家目前使用的場上角色。" }, "language": { - "current_language": "當前語言是: %s", - "language_changed": "語言切換至: %s", - "language_not_found": "目前客戶端沒有這種語言: %s", - "description": "顯示或切換當前語言。" + "current_language": "目前語言是:%s", + "language_changed": "語言切換至:%s", + "language_not_found": "目前客戶端沒有這種語言:%s", + "description": "顯示或切換目前語言。" }, "list": { "success": "目前總線上人數:%s", - "description": "查看所有在線玩家" + "description": "查看所有線上玩家" }, "permission": { "add": "已指派權限。", @@ -231,7 +231,7 @@ }, "position": { "success": "坐標:%s, %s, %s\n旋轉:%s, %s, %s\n場景ID:%s", - "description": "獲取所在坐標和旋轉信息" + "description": "獲取所在坐標和旋轉資訊" }, "quest": { "added": "已添加任務 %s", @@ -239,128 +239,128 @@ "not_found": "未找到任務", "invalid_id": "無效的任務ID", "description": "添加或完成任務", - "running": "🇺🇸Quest %s is %s (%s).", - "talking": "🇺🇸Talk %s is %s for main quest %s (%s).", + "running": "任務 %s 的狀態為 %s (%s)。", + "talking": "對話 %s 的狀態為 %s,主任務為 %s (%s)。", "state": { - "none": "🇺🇸unknown (none)", - "unstarted": "🇺🇸unfinished (not started, not completed)", - "unfinished": "🇺🇸unfinished (started, not completed)", - "finished": "🇺🇸finished (completed)", - "failed": "🇺🇸finished (completed, but failed)", - "exists": "🇺🇸found", - "not_exists": "🇺🇸not found" + "none": "未知 (無)", + "unstarted": "未完成 (未開始,未結束)", + "unfinished": "未完成 (已開始,未結束)", + "finished": "已完成 (已結束)", + "failed": "已完成 (已結束,但失敗)", + "exists": "存在", + "not_exists": "找不到" }, - "enabled": "🇺🇸Questing enabled." + "enabled": "已啟用任務。" }, "group": { - "invalid_groupid": "🇺🇸Invalid group ID.", - "invalid_suiteid": "🇺🇸Invalid suite ID.", - "group_not_found": "🇺🇸Group not found.", - "description": "🇺🇸Alter group loading", - "refreshed": "🇺🇸Group %s refreshed." + "invalid_groupid": "群組 ID 無效。", + "invalid_suiteid": "suite ID 無效。", + "group_not_found": "找不到群組。", + "description": "更改群組載入", + "refreshed": "已重新載入群組 %s。" }, "cutscene": { - "description": "🇺🇸Plays a cutscene" + "description": "播放過場動畫" }, "sound": { - "description": "🇺🇸Plays a sound" + "description": "播放音效" }, "reload": { - "reload_start": "正在重新加載設定檔。", - "reload_done": "重新加載已完成。", - "description": "重新加載設定檔和數據。" + "reload_start": "正在重新載入設定檔。", + "reload_done": "重新載入已完成。", + "description": "重新載入設定檔和數據。" }, "resetConst": { - "reset_all": "重設所有角色的命座。", - "success": "已重設 %s 的命座,重新登入後將會生效。", - "description": "重置當前角色的命之座,重新登入後將會生效。" + "reset_all": "重設所有角色的命之座。", + "success": "已重設 %s 的命之座,重新登入後將會生效。", + "description": "重置目前角色的命之座,重新登入後將會生效。" }, "resetShopLimit": { "success": "重置完成。", "description": "重置所選玩家的商店刷新時間。" }, "sendMail": { - "give_usage": "用法: give [amount] [level] [refinement]", + "give_usage": "用法: give <玩家> <物品 ID|物品名稱> [數量] [等級] [精煉]", "user_not_exist": "ID '%s' 的使用者不存在。", - "start_composition": "發送郵件流程。\n請使用`/send <郵件標題>`來進到下一步。\n你可以在任何時間使用`/sendmail stop`來停止發送。", + "start_composition": "寄送郵件流程。\n請使用`/send <郵件標題>`來進到下一步。\n你可以在任何時間使用`/sendmail stop`來停止傳送。", "templates": "郵件模板尚未實裝...", "invalid_arguments": "無效的參數。\n指令使用方法 `/sendmail [templateId]`", - "send_cancel": "取消傳送信息", - "send_done": "已將消息發送給 %s!", - "send_all_done": "消息已發送給全體用戶!", - "not_composition_end": "現在郵件發送未到最後階段。\n請使用 `/sendmail %s` 繼續發送郵件,或者 `/sendmail stop` 來停止發送郵件。", + "send_cancel": "取消傳送郵件", + "send_done": "已將郵件傳送給 %s!", + "send_all_done": "郵件已傳送給全體使用者!", + "not_composition_end": "現在郵件傳送未到最後階段。\n請使用 `/sendmail %s` 繼續傳送郵件,或者 `/sendmail stop` 來停止傳送郵件。", "please_use": "請使用 `/sendmail %s`", "set_title": "成功將郵件標題設定成 '%s'。\n接下來請繼續使用 '/sendmail ' 來設定郵件內容。", - "set_contents": "成功將'%s'為郵件內容。\n接下來請打出 '/sendmail <寄件者名稱>' 來設定郵件寄件者名稱。", - "set_message_sender": "郵件寄件者已設為 '%s'。\n使用 '/sendmail [amount] [level]' 以繼續操作。", - "send": "已添加 %s 個 %s (等級為 %s) 到郵件附件。\n如果沒有要繼續添加道具請使用 `/sendmail finish` 來完成郵件發送。", + "set_contents": "成功將 '%s' 為郵件內容。\n接下來請打出 '/sendmail <寄件者名稱>' 來設定郵件寄件者名稱。", + "set_message_sender": "郵件寄件者已設為 '%s'。\n使用 '/sendmail [數量] [等級]' 以繼續操作。", + "send": "已添加 %s 個 %s (等級為 %s) 到郵件附件。\n如果沒有要繼續添加道具,請使用 `/sendmail finish` 來完成郵件傳送。", "invalid_arguments_please_use": "無效的參數 \n 請改用 `/sendmail %s`", "title": "<標題>", "message": "<正文>", "sender": "<寄件者>", "arguments": " [數量] [等級]", "error": "錯誤:無效的編寫階段 %s。需要 stacktrace 請查看伺服器命令提示字元。", - "description": "向指定用戶發送郵件。此指令的用法可根據附加的參數而改變。" + "description": "向指定使用者傳送郵件。此指令的用法可根據附加的參數而改變。" }, "sendMessage": { - "success": "訊息已發送。", - "description": "向指定玩家發送訊息。" + "success": "訊息已傳送。", + "description": "向指定玩家傳送訊息。" }, "setConst": { - "range_error": "命座必須在0到6之間。", - "level_error": "無效的命座等級。", - "fail": "設定命座失敗。", - "failed_success": "%s的命之座已設定為成%s,重新登入後將會生效。", - "success": "%s的命之座已設定為成%s。", - "successall": "🇺🇸Constellations for all characters have been set to %s.", - "description": "設定當前角色的命之座。" + "range_error": "命之座必須在 0 到 6 之間。", + "level_error": "無效的命之座等級。", + "fail": "設定命之座失敗。", + "failed_success": "%s 的命之座已設為 %s,重新登入後將會生效。", + "success": "%s 的命之座已設為 %s。", + "successall": "所有角色的命之座已設為 %s。", + "description": "設定目前角色的命之座" }, "setFetterLevel": { "range_error": "好感度必須在 0 到 10 之間。", "success": "好感等級已設定為 %s", "level_error": "無效的好感度。", - "description": "設定當前角色的好感度等級。" + "description": "設定目前角色的好感度等級。" }, "setProp": { - "description": "設定帳號屬性。 比如可以通過此命令啟用無敵,也可以解鎖深淵或更改紀行等級。\n\t可更改的屬性列表: godmode(無敵)|nostamina(無限體力)|unlimitedenergy(無限元素能量)|abyss(深淵螺旋)|worldlevel(世界等級)|bplevel(紀行等級)\n\t(cont.) `有關其他可能的數值,請參閱 PlayerProperty 列舉。 (範例 PROP_MAX_SPRING_VOLUME -> max_spring_volume)`" + "description": "設定帳號屬性。比如可以通過此命令啟用無敵,也可以解鎖深淵或更改紀行等級。\n\t可更改的屬性列表: godmode(無敵)|nostamina(無限體力)|unlimitedenergy(無限元素能量)|abyss(深淵螺旋)|worldlevel(世界等級)|bplevel(紀行等級)\n\t(cont.) `有關其他可能的數值,請參閱 PlayerProperty 列舉。 (範例 PROP_MAX_SPRING_VOLUME -> max_spring_volume)`" }, "setStats": { - "description": "設定當前角色的數據類型。\n\t可使用的數據類型:hp (生命值)| maxhp (最大生命值) | def(防禦力) | atk (攻擊力)| em (元素精通) | er (元素充能效率) | crate(暴擊率) | cdmg (暴擊傷害)| cdr (冷卻縮減) | heal(治療加成)| heali (受治療加成)| shield (護盾強效)| defi (無視防禦)\n\t(cont.) 元素增傷類:epyro (火傷) | ecryo (冰傷) | ehydro (水傷) | egeo (岩傷) | edendro (草傷) | eelectro (雷傷) | ephys (物傷)(cont.) 元素減傷類:respyro (火抗) | rescryo (冰抗) | reshydro (水抗) | resgeo (岩抗) | resdendro (草抗) | reselectro (雷抗) | resphys (物抗)", - "locked_to": "🇺🇸%s locked to %s.", - "locked_for_to": "🇺🇸%s for %s locked to %s.", - "unlocked": "🇺🇸%s unlocked.", - "unlocked_for": "🇺🇸%s for %s unlocked." + "description": "設定目前角色的數據類型。\n\t可使用的數據類型:hp (生命值)| maxhp (最大生命值) | def(防禦力) | atk (攻擊力)| em (元素精通) | er (元素充能效率) | crate(暴擊率) | cdmg (暴擊傷害)| cdr (冷卻縮減) | heal(治療加成)| heali (受治療加成)| shield (護盾強效)| defi (無視防禦)\n\t(cont.) 元素增傷類:epyro (火傷) | ecryo (冰傷) | ehydro (水傷) | egeo (岩傷) | edendro (草傷) | eelectro (雷傷) | ephys (物傷)(cont.) 元素減傷類:respyro (火抗) | rescryo (冰抗) | reshydro (水抗) | resgeo (岩抗) | resdendro (草抗) | reselectro (雷抗) | resphys (物抗)", + "locked_to": "%s 已鎖定為 %s.", + "locked_for_to": "%s (玩家 %s) 已鎖定為 %s。", + "unlocked": "%s 已解鎖。", + "unlocked_for": "%s (玩家 %s) 已解鎖。" }, "spawn": { "success": "已生成 %s 個 %s。", - "limit_reached": "已達到場景生成上限,已改為%s個實體。", - "description": "在你附近生成一個實體動物。" + "limit_reached": "已達到場景生成上限,已改為 %s 個實體。", + "description": "在你附近生成一個實體。" }, "stop": { "success": "正在關閉伺服器...", - "description": "以正常的方式關閉伺服器。" + "description": "關閉伺服器" }, "talent": { - "out_of_range": "🇺🇸Invalid talent level. Level should be in range of 1-15.", - "set_id": "🇺🇸Set talent %s - \"%s\" to %s.", - "id_desc": "🇺🇸Talent %s - \"%s\" - \"%s\"", - "invalid_skill_id": "無效的技能ID。", + "out_of_range": "天賦等級無效。等級應在 1-15 之間。", + "set_id": "設置天賦 %s - \"%s\" 至 %s。", + "id_desc": "天賦 %s - \"%s\" - \"%s\"", + "invalid_skill_id": "無效的技能 ID。", "invalid_level": "無效的天賦等級。", "normal_attack_id": "普通攻擊的 ID 為 %s。", - "e_skill_id": "元素戰技技能ID %s。", - "q_skill_id": "元素爆發技能ID %s。", - "description": "設定當前角色的天賦等級" + "e_skill_id": "元素戰技技能 ID 為 %s。", + "q_skill_id": "元素爆發技能 ID 為 %s。", + "description": "設定目前角色的天賦等級" }, "team": { "invalid_usage": "無效的用法。", "invalid_index": "無效索引。", "add_too_much": "服務端只允許您的隊伍裡最多 %s 名角色。", - "failed_to_add_avatar": "無法根據ID %s 添加角色。", + "failed_to_add_avatar": "無法根據 ID %s 添加角色。", "failed_to_parse_index": "無法解析的索引:%s", "remove_too_much": "您不能删除那麼多的角色,因為您的隊伍列表角色會全部被刪除。", "ignore_index": "無視的索引列表:%s", "index_out_of_range": "您指定的索引超出了範圍。", - "failed_parse_avatar_id": "無法解析的角色ID:%s", + "failed_parse_avatar_id": "無法解析的角色 ID:%s", "avatar_already_in_team": "該角色已經在您的隊伍當中了。", "avatar_not_found": "無法找到該角色:%s", "description": "手動修改您的隊伍配置。" @@ -373,24 +373,24 @@ "teleport": { "invalid_position": "無效的座標。", "exists_error": "此場景不存在。", - "success": "傳送 %s 到座標 %s,%s,%s ,場景為 %s 。", + "success": "傳送 %s 到座標 %s,%s,%s,場景為 %s。", "description": "將玩家的位置傳送到你所指定的座標。" }, "trialAvatarActivity": { - "description": "操縱試用角色活動的功能。這包括切換地牢和獎勵的狀態。", + "description": "操縱試用角色活動的功能。這包括切換秘境和獎勵的狀態。", "not_found": "未找到試用角色活動玩家數據。也許該活動未被啟用。", "invalid_param": "無效的參數。", "schedule_not_found": "未找到計劃 %s。", "success_schedule": "已將計劃 ID 更改為 %s。", - "success_dungeon": "已切換角色 %s 的地牢狀態。", - "success_dungeon_all": "已切換所有角色的地牢狀態。", + "success_dungeon": "已切換角色 %s 的秘境狀態。", + "success_dungeon_all": "已切換所有角色的秘境狀態。", "success_reward": "已切換角色 %s 的獎勵狀態。", "success_reward_all": "已切換所有角色的獎勵狀態。" }, "weather": { - "success": "已設定天氣ID 為 %s,氣候型別為 %s。", - "status": "當前天氣ID 為 %s,氣候型別為 %s。", - "description": "更改天氣ID和氣候型別。天氣ID可以在 ./Resources/ExcelBinOutput/WeatherExcelConfigData.json 中找到。\n氣候型別:sunny(晴天), cloudy(多雲), rain(雨), thunderstorm(雷雨), snow(雪), mist(霧)" + "success": "已設定天氣 ID 為 %s,氣候型別為 %s。", + "status": "目前天氣 ID 為 %s,氣候型別為 %s。", + "description": "更改天氣 ID 和氣候型別。天氣 ID 可以在 ./Resources/ExcelBinOutput/WeatherExcelConfigData.json 中找到。\n氣候型別:sunny(晴天), cloudy(多雲), rain(雨), thunderstorm(雷雨), snow(雪), mist(霧)" }, "ban": { "success": "停權成功。", @@ -399,8 +399,8 @@ "description": "停權指定玩家。" }, "unlockall": { - "success": "🇺🇸Unlocked all open states for %s.", - "description": "🇺🇸Unlocks all open states for a player." + "success": "已為 %s 解鎖所有開放狀態。", + "description": "為指定玩家解鎖所有開放狀態。" }, "unban": { "success": "撤銷停權成功。", @@ -408,15 +408,15 @@ "description": "撤銷停權指定玩家。" }, "troubleshoot": { - "description": "🇺🇸Generate debugging information for troubleshooting." + "description": "產生疑難排解用的除錯資訊。" } }, "gacha": { "details": { "title": "祈願詳情", - "available_five_stars": "可獲得的5星物品", - "available_four_stars": "可獲得的4星物品", - "available_three_stars": "可獲得的3星物品" + "available_five_stars": "可獲得的 5 星物品", + "available_four_stars": "可獲得的 4 星物品", + "available_three_stars": "可獲得的 3 星物品" }, "records": { "title": "祈願記錄", @@ -426,7 +426,7 @@ }, "documentation": { "handbook": { - "title": "🇺🇸GM Handbook", + "title": "GM 手冊", "title_commands": "指令", "title_avatars": "角色", "title_items": "道具", @@ -442,29 +442,29 @@ }, "index": { "title": "文件", - "handbook": "🇺🇸GM Handbook", - "gacha_mapping": "祈願物品映射到JSON上" + "handbook": "GM 手冊", + "gacha_mapping": "祈願物品映射到 JSON 上" } }, "plugin": { - "directory_failed": "🇺🇸Failed to create plugins directory: ", - "unable_to_load": "🇺🇸Unable to load plugin.", - "invalid_config": "🇺🇸Plugin %s has an invalid config file.", - "invalid_main_class": "🇺🇸Plugin %s has an invalid main class.", - "missing_config": "🇺🇸Plugin %s lacks a valid config file.", - "failed_to_load_plugin": "🇺🇸Failed to load plugin: %s", - "failed_to_load": "🇺🇸Failed to load a plugin.", - "failed_to_load_dependencies": "🇺🇸Failed to load plugins with dependencies.", - "loading_plugin": "🇺🇸Loading plugin: %s", - "failed_add_id": "🇺🇸Failed to add plugin identifier: %s", - "enabling_plugin": "🇺🇸Enabling plugin: %s", - "enabling_failed": "🇺🇸Failed to enable plugin: %s", - "disabling_plugin": "🇺🇸Disabling plugin: %s", - "disabling_failed": "🇺🇸Failed to disable plugin: %s", + "directory_failed": "無法建立外掛程式路徑:", + "unable_to_load": "無法載入外掛程式。", + "invalid_config": "外掛程式 %s 的設定檔無效。", + "invalid_main_class": "外掛程式 %s 的主類別無效。", + "missing_config": "外掛程式 %s 缺少有效的設定檔。", + "failed_to_load_plugin": "無法載入外掛程式:%s", + "failed_to_load": "無法載入外掛程式。", + "failed_to_load_dependencies": "無法載入外掛程式的相依項目。", + "loading_plugin": "正在載入外掛程式:%s", + "failed_add_id": "無法新增外掛程式識別碼:%s", + "enabling_plugin": "正在啟用外掛程式:%s", + "enabling_failed": "無法啟用外掛程式:%s", + "disabling_plugin": "正在停用外掛程式:%s", + "disabling_failed": "無法停用外掛程式:%s", "invalid_api": { - "not_present": "🇺🇸Plugin %s does not specify an API version.", - "lower": "🇺🇸Plugin %s is using API version %s, while the server is using API version %s.", - "outdated": "🇺🇸Plugin %s is using an outdated API method." + "not_present": "外掛程式 %s 並未指定 API 版本。", + "lower": "外掛程式 %s 使用的 API 版本為 %s,而伺服器使用的 API 版本為 %s。", + "outdated": "外掛程式 %s 使用了舊版的 API 方法。" } } }