From 187625885f7d62cdf857e7c8c511040cb317b50a Mon Sep 17 00:00:00 2001 From: Fabric Bot <159731069+FabricMCBot@users.noreply.github.com> Date: Mon, 1 Jul 2024 11:35:32 +0100 Subject: [PATCH] New Crowdin updates (#120) --- .../introduction-to-fabric-and-modding.md | 65 +++++++++++++ translated/ru_ru/sidebar_translations.json | 14 +-- translated/zh_cn/develop/codecs.md | 94 ++++++++++++++----- .../zh_cn/develop/commands/arguments.md | 14 +-- translated/zh_cn/develop/commands/basics.md | 43 +++++---- .../getting-started/launching-the-game.md | 63 +++++++++++++ translated/zh_cn/develop/items/potions.md | 3 +- translated/zh_cn/develop/sounds/custom.md | 16 ++-- translated/zh_tw/index.md | 6 +- translated/zh_tw/navbar_translations.json | 8 ++ translated/zh_tw/players/faq.md | 4 +- .../zh_tw/players/installing-java/linux.md | 2 +- .../zh_tw/players/installing-java/windows.md | 12 +-- .../players/troubleshooting/crash-reports.md | 10 +- .../players/troubleshooting/uploading-logs.md | 2 +- translated/zh_tw/sidebar_translations.json | 3 +- 16 files changed, 274 insertions(+), 85 deletions(-) create mode 100644 translated/ru_ru/develop/getting-started/introduction-to-fabric-and-modding.md create mode 100644 translated/zh_cn/develop/getting-started/launching-the-game.md create mode 100644 translated/zh_tw/navbar_translations.json diff --git a/translated/ru_ru/develop/getting-started/introduction-to-fabric-and-modding.md b/translated/ru_ru/develop/getting-started/introduction-to-fabric-and-modding.md new file mode 100644 index 000000000..a9707af86 --- /dev/null +++ b/translated/ru_ru/develop/getting-started/introduction-to-fabric-and-modding.md @@ -0,0 +1,65 @@ +--- +title: Введение в Fabric и создание модов +description: "Краткое знакомство с Fabric и созданием модов для Minecraft: Java Edition." +authors: + - IMB11 + - itsmiir +--- + + + +# Введение в Fabric и создание модов + +## Подготовка + +Перед тем как начать, вам следует иметь базовые знания разработки на Java и понимание концепций объектно-ориентированного программирования (ООП). + +Если эти концепции вам не знакомы, рекомендуем сначала изучить несколько учебных материалов по Java и ООП. Эти ресурсы могут помочь: + +- [W3: Уроки по Java](https://www.w3schools.com/java/) +- [Codecademy: Выучите Java](https://www.codecademy.com/learn/learn-java) +- [W3: Java в ООП](https://www.w3schools.com/java/java_oop.asp) +- [Medium: Введение в ООП](https://medium.com/@Adekola_Olawale/beginners-guide-to-object-oriented-programming-a94601ea2fbd) + +### Термины + +Прежде чем начнём, давайте рассмотрим некоторые термины, с которыми вы столкнетесь при создании мода на Fabric: + +- **Мод**: Изменение игры, добавляющее новые функции или изменяющее существующие. +- **Загрузчик модов**: Инструмент для загрузки модов в игру, такой как загрузчик Fabric. +- **Mixin**: Инструмент для модификации кода игры во время её выполнения — подробнее во [введении в Mixin](https://fabricmc.net/wiki/tutorial:mixin_introduction). +- **Gradle**: Инструмент автоматизации сборки, применяемый для создания и компиляции модов. Fabric использует его для сборки своих модов. +- **Маппинги**: Набор маппингов, преобразующих обфусцированный код в тот, который может прочесть человек. +- **Обфускация**: Процесс усложнения кода для его затруднённого понимания, используемый Mojang для защиты кода Minecraft. +- **Remapping**: Процесс преобразования обфусцированного кода в тот, который будет читаем для людей. + +## Что такое Fabric? + +Fabric — лёгкий инструмент для создания модов для Minecraft: Java Edition. + +Он разработан как простая и удобная платформа для разработки модов. Fabric — это проект, который ведёт сообщество, и у него открытый исходный код, что означает, что любой может внести в него свой вклад. + +Вам следует знать о четырёх основных компонентах Fabric: + +- **Загрузчик Fabric**: гибкий загрузчик модов, не зависящий от платформы, предназначенный для Minecraft и других игр и приложений. +- **Fabric Loom**: плагин для Gradle, позволяющий разработчикам легко разрабатывать и отлаживать моды. +- **Fabric API**: набор API и инструментов для разработчиков модов, которые можно использовать при создании модов. +- **Yarn**: набор открытых маппингов Minecraft, свободных для использования под лицензией Creative Commons Zero. + +## Почему Fabric необходим для модификации Minecraft? + +> Модификация игры — это процесс изменения игры с целью изменения её поведения или добавления новых возможностей. В случае Minecraft это может включать в себя всё, от добавления новых предметов, блоков или существ до изменения механик игры или добавления новых режимов игры. + +Minecraft: Java Edition обфусцирован компанией Mojang, что делает самостоятельное модифицирование сложным. Однако с помощью инструментов для модификации, таких как Fabric, процесс становится намного проще. Существуют различные системы маппинга, которые могут помочь в этом процессе. + +Loom преобразует обфусцированный код в читаемый формат с помощью этих маппингов, что облегчает мододелам понимание и изменение кода игры. Yarn является популярным и отличным выбором для маппинга, но также существуют и другие варианты. Каждый проект маппинга может иметь свои собственные достоинства и фокусироваться на различных аспектах. + +Loom позволяет легко разрабатывать и компилировать моды на основе кода, над которым провели remapping, а загрузчик Fabric позволяет загружать эти моды в игру. + +## Что даёт Fabric API и зачем это нужно? + +> Fabric API — это набор API и инструментов для разработчиков модов, которые можно использовать при создании модов. + +Fabric API предоставляет широкий набор API, которые расширяют существующие функциональные возможности Minecraft. Например, он предлагает новые хуки и события, которые могут использоваться мододелами, или новые утилиты и инструменты, упрощающие процесс модификации игры, такие как транзитивные расширители доступа и возможность доступа к внутренним реестрам, таким как реестр предметов, которые можно использовать в компостнице. + +Хотя Fabric API предлагает довольно мощные функции, некоторые задачи, такие как базовая регистрация блоков, можно выполнять и без него, используя стандартные API Minecraft. diff --git a/translated/ru_ru/sidebar_translations.json b/translated/ru_ru/sidebar_translations.json index b9a1631fc..caa1037a9 100644 --- a/translated/ru_ru/sidebar_translations.json +++ b/translated/ru_ru/sidebar_translations.json @@ -8,9 +8,9 @@ "players.installingFabric": "Установка Fabric", "players.findingMods": "Поиск безопасных модов", "players.installingMods": "Установка модов", - "players.troubleshooting": "Исправление ошибок", + "players.troubleshooting": "Устранение неполадок", "players.troubleshooting.uploadingLogs": "Загрузка журналов", - "players.troubleshooting.crashReports": "Краш-репорты", + "players.troubleshooting.crashReports": "Сообщения о сбоях", "players.updatingFabric": "Обновление Fabric", "develop.title": "Руководства для разработчиков", "develop.gettingStarted": "Начало работы", @@ -29,12 +29,12 @@ "develop.commands.arguments": "Аргументы команд", "develop.commands.suggestions": "Подсказки к командам", "develop.rendering": "Отрисовка", - "develop.rendering.basicConcepts": "Основные концепции рендера", - "develop.rendering.drawContext": "Использование DrawContext", - "develop.rendering.hud": "Рендер на экране", + "develop.rendering.basicConcepts": "Основные концепции отрисовки", + "develop.rendering.drawContext": "Использование Drawing Context", + "develop.rendering.hud": "Отрисовка в HUD", "develop.rendering.gui": "Интерфейсы и экраны", - "develop.rendering.gui.customScreens": "Экраны", - "develop.rendering.gui.customWidgets": "Виджеты", + "develop.rendering.gui.customScreens": "Собственные экраны", + "develop.rendering.gui.customWidgets": "Собственные виджеты", "develop.rendering.particles": "Частицы", "develop.rendering.particles.creatingParticles": "Создание своих частиц", "develop.misc": "Прочие страницы", diff --git a/translated/zh_cn/develop/codecs.md b/translated/zh_cn/develop/codecs.md index 43b97378a..391e464b1 100644 --- a/translated/zh_cn/develop/codecs.md +++ b/translated/zh_cn/develop/codecs.md @@ -1,13 +1,14 @@ --- -title: Codecs +title: Codec description: 一份全面的指南,用于理解和使用 Mojang 的 codec 系统,以便序列化和反序列化对象。 authors: - enjarai + - Syst3ms --- -# Codecs +# Codec -Codec 是一个为了轻松序列化 Java 对象的系统,它被包含在 Mojang 的 DataFixerUpper (DFU) 库中,并且 DFU 被包含在 Minecraft 中。 在模组开发的上下文中,它们可以作为用于读写自定义 json 文件的 GSON 和 Jankson 的替代品。但因为 Mojang 正在重写许多旧代码以使用 Codec,它们和模组开发越来越息息相关。 +Codec 是一个为了简单地解析 Java 对象的系统,它被包含在 Mojang 的 DataFixerUpper (DFU) 库中,DFU 被包含在 Minecraft 中。 在模组环境中,它们可以在读取和写入自定义JSON文件时用作GSON和Jankson的替代品,但它们开始变得越来越重要,因为Mojang正在重写大量旧代码以使用Codec。 Codec 与 DFU 的另一个 API `DynamicOps` 一起使用。 一个 Codec 定义一个对象的结构,而 dynamic ops 用于定义一个序列化格式,例如 json 或 NBT。 这意味着任何 codec 都可以与任何 dynamic ops 一起使用,反之亦然,这样就允许了极大的灵活性。 @@ -94,7 +95,7 @@ public class CoolBeansClass { - 一个 `Codec` - 一个 `Codec>` -我们可以从 `Codec` 类中上文所述的基本类型 codec 中获取第一个,具体来说是 `Codec.INT`。 第二个可以从 `Registries.ITEM` 注册表中得到,它有一个 `getCodec()` 方法返回一个 `Codec`。 我们没有用于 `List` 的默认 codec,但我们可以从 `BlockPos.CODEC` 制作一个。 +我们可以从 `Codec` 类中上文所述的基本类型 codec 中获取第一个,具体来说是 `Codec.INT`。 而第二个可以从`Registries.ITEM`注册表中获取,它有一个`getCodec()`方法,返回一个`Codec`。 我们没有用于 `List` 的默认 codec,但我们可以从 `BlockPos.CODEC` 制作一个。 ### List @@ -104,7 +105,7 @@ public class CoolBeansClass { Codec> listCodec = BlockPos.CODEC.listOf(); ``` -应该注意的是,以这种方式创建的 codec 总是会反序列化为一个 `ImmutableList`。 如果你需要一个可变的列表,你可以利用 [xmap](#mutually-convertible-types-and-you) 在反序列化期间转换为一个可变列表。 +应该注意的是,以这种方式创建的 codec 总是会反序列化为一个 `ImmutableList`。 正如你所见,因为 `Identifier.CODEC` 直接序列化到字符串,所以可以工作。 对于不序列化为字符串的简单对象,可以通过使用 [xmap及其相关函数](#mutually-convertible-types-and-you) 来转换它们以达到类似的效果。 ### 合并用于类似 Record 类的 Codec @@ -121,15 +122,16 @@ public static final Codec CODEC = RecordCodecBuilder.create(inst ).apply(instance, CoolBeansClass::new)); ``` -在 group 中的每一行指定一个 codec,一个字段名和一个 getter 方法。 `Codec#fieldOf` 调用用于将编解码器转换为 [map codec](#mapcodec-not-to-be-confused-with-codecltmapgt),而 `forGetter` 调用指定了用于从类的实例中检索字段值的 `getter` 方法。 与此同时,`apply` 调用指定了用于创建新实例的构造函数。 需要注意的是在 group 中的字段顺序需要和构造方法的参数顺序保持一致。 +在 group 中的每一行指定一个 codec,一个字段名和一个 getter 方法。 在 group 中的每一行指定一个 codec,一个字段名和一个 getter 方法。 `Codec#fieldOf` 调用用于将编解码器转换为 [map codec](#mapcodec-not-to-be-confused-with-codecltmapgt),而 `forGetter` 调用指定了用于从类的实例中检索字段值的 `getter` 方法。 与此同时,`apply` 调用指定了用于创建新实例的构造函数。 需要注意的是在 group 中的字段顺序需要和构造方法的参数顺序保持一致。 同时,`apply`调用指定了用于创建新实例的构造函数。 请注意,组中字段的顺序应与构造函数中参数的顺序相同。 在这个上下文中您也可以使用 `Codec#optionalFieldOf` 使字段可选,解释在 [Optional Fields](#optional-fields) 部分。 -### 不要将 MapCodec 与 Codec<Map> 混淆 +### 不要将 MapCodec 与 Codec&lt;Map&gt; 混淆 -调用 `Codec#fieldOf` 会将 `Codec` 转换成 `MapCodec`,这是 `Codec` 的一个变体,但不是直接实现。 正如它们名称所暗示的,`MapCodec` 保证序列化成一个键值映射,或者在使用的 `DynamicOps` 中的等效物。 一些函数可能需要使用 `MapCodec` 而不是常规编解码器。 +调用 `Codec#fieldOf` 会将 `Codec` 转换成 `MapCodec`,这是 `Codec` 的一个变体,但不是直接实现。 正如其名称所示,`MapCodec`保证序列化为 +键到值的映射,或所使用的`DynamicOps`中的等效项。 一些函数可能需要使用 `MapCodec` 而不是常规编解码器。 -这种创建 `MapCodec` 的特殊方式本质上是在一个map中封装源 codec 的值,使用给定的字段名作为键。 例如,一个 `Codec` 序列化为 json 时看起来像是这样: +这种创建 `MapCodec` 的特殊方式本质上是在一个map中封装源 codec 的值,使用给定的字段名作为键。 例如,一个 `Codec` 序列化为 json 时看起来像是这样: 例如,一个 `Codec` 序列化为 json 时看起来像是这样: ```json [1, 2, 3] @@ -159,7 +161,8 @@ MapCodec optionalCodec = BlockPos.CODEC.optionalFieldOf("pos", BlockPo 需要注意,可选字段会默默忽略可能发生的任何错误。 这意味着如果这个字段存在,但值无效,该字段总是会被反序列化为默认值。 -**从 1.20.2 开始**,Minecraft 自己 (不是 DFU!) 提供了 `Codecs#createStrictOptionalFieldCodec`,如果字段值无效,则完全不进行反序列化。 +**从 1.20.2 开始**,Minecraft 自己 (不是 DFU!) 但是确实提供了`Codecs#createStrictOptionalFieldCodec`, +如果字段值无效,则根本无法反序列化。 ### 常量、约束和组合 @@ -173,7 +176,7 @@ Codec theMeaningOfCodec = Codec.unit(42); #### 数值范围 -`Codec.intRange` 及其伙伴 `Codec.floatRange` 和 `Codec.doubleRange` 可用于创建一个只接受在指定**包含**范围内的数字值的 codec。 这适用于序列化和反序列化。 +`Codec.intRange` 及其伙伴 `Codec.floatRange` 和 `Codec.doubleRange` 可用于创建一个只接受在指定**包含**范围内的数字值的 codec。 这适用于序列化和反序列化。 这适用于序列化和反序列化。 ```java // 不能大于 2 @@ -182,7 +185,8 @@ Codec amountOfFriendsYouHave = Codec.intRange(0, 2); #### Pair -`Codec.pair` 将两个 codec `Codec` 和 `Codec` 合并为 `Codec>`。 请记住,它只适用于序列化到特定字段的 codec,例如 [转换的 `MapCodec`](#mapcodec-not-to-be-confused-with-codecltmapgt) 或 [record codec](#merging-codecs-for-record-like-classes)。 +`Codec.pair` 将两个 codec `Codec` 和 `Codec` 合并为 `Codec>`。 请记住,它只能与序列化到特定字段的Codec配合使用,例如[转换的`MapCodec`](#mapcodec)或 +[记录Codec](#merging-codecs-for-record-like-classes)。 结果 codec 将序列化为结合了两个使用的 codec 字段的 map。 例如,运行这些代码: @@ -210,14 +214,15 @@ DataResult result = pairCodec.encodeStart(JsonOps.INSTANCE, Pair.of #### Either -`Codec.either` 将两个 codec `Codec` 和 `Codec` 组合为 `Codec>`。 在反序列化过程中,结果 codec 将首先尝试使用第一个 codec,**只有在失败时**才尝试使用第二个 codec。 -如果第二个也失败,将返回**第二个** codec 的错误。 +`Codec.either` 将两个 codec `Codec` 和 `Codec` 组合为 `Codec>`。 生成的Codec将在反序列化过程中尝试使用第一个Codec,并且_仅当失败时_才尝试使用第二个Codec。 +如果第二个也失败,则会返回第二个Codec的错误。 #### Map -对于处理具有任意键的 map,如 `HashMaps`,可以使用 `Codec.unboundedMap`。 这将返回给定 `Codec` 和 `Codec` 的 `Codec>`。 结果 codec 将序列化为一个 json object 或当前 dynamic ops 可用的等效物。 +对于处理具有任意键的 map,如 `HashMaps`,可以使用 `Codec.unboundedMap`。 这将返回给定 `Codec` 和 `Codec` 的 `Codec>`。 生成的Codec将序列化为JSON对象或 +当前动态操作可用的任何等效对象。 -由于 json 和 nbt 的局限性,作为键的 codec **必须**序列化为 string。 这包含类型不是 string 但序列化为他们自身的 codec,例如 `Identifier.CODEC`。 在下面的示例中: +由于JSON和NBT的限制,使用的密钥Codec必须序列化为字符串。 这包含类型不是 string 但序列化为他们自身的 codec,例如 `Identifier.CODEC`。 在下面的示例中: ```java // 创建一个 Identifier 到 Integer 的 map 的 codec @@ -239,11 +244,11 @@ DataResult result = mapCodec.encodeStart(JsonOps.INSTANCE, Map.of( } ``` -正如你所见,因为 `Identifier.CODEC` 直接序列化到字符串,所以可以工作。 对于不序列化为字符串的简单对象,可以通过使用 [xmap及其相关函数](#mutually-convertible-types-and-you) 来转换它们以达到类似的效果。 +正如你所见,因为 `Identifier.CODEC` 直接序列化到字符串,所以可以工作。 对于无法序列化为字符串的简单对象,可以使用[XMAP及其友元](#mutually-convertible-types-and-you)进行转换,从而实现类似的效果。 ### 相互可转换的类型与您 -#### xmap +#### `xmap` 我们有两个可以互相转换的类,但没有继承关系。 例如,原版的 `BlockPos` 和 `Vec3d`。 如果我们有其中一个 codec,我们可以使用 `Codec#xmap` 创建一个双向的特定转换函数。 @@ -264,9 +269,10 @@ Codec blockPosCodec = Vec3d.CODEC.xmap( #### flatComapMap、comapFlatMap 与 flatXMap -`flatComapMap`、`comapFlatMap` 与 `flatXMap` 类似于 xmap,但是他们允许一个或多个转换函数返回 DataResult。 这在实践中很有用,因为特定的对象实例可能并不总是适合转换。 +`flatComapMap`、`comapFlatMap` 与 `flatXMap` 类似于 xmap,但是他们允许一个或多个转换函数返回 DataResult。 这在实践中很有用,因为特定的对象实例可能并不总是适合转换。 这在实践中很有用,因为特定的对象实例可能并不总是适合转换。 -以原版的 `Identifier` 为例。 虽然所有的标识符都可以转换为字符串,但并不是所有的字符串都是有效的标识符,所以使用 xmap 意味着当转换失败时会抛出不雅观的异常。 +以原版的 `Identifier` 为例。 以原版的 `Identifier` 为例。 虽然所有的标识符都可以转换为字符串,但并不是所有的字符串都是有效的标识符,所以使用 xmap 意味着当转换失败时会抛出不雅观的异常。 +正因为此,它的内置编解码器实际上是 `Codec.STRING` 上的一个 `comapFlatMap`,很好地说明了如何使用它: 正因为此,它的内置编解码器实际上是 `Codec.STRING` 上的一个 `comapFlatMap`,很好地说明了如何使用它: ```java @@ -300,7 +306,7 @@ public class Identifier { ### 注册表分派 -`Codec#dispatch` 让我们可以定义一个 codec 的注册表,并根据序列化数据中字段的值分派到一个特定的 codec。 当反序列化具有不同字段的对象,这些字段依赖于它们的类型,但仍代表相同的事物时,这非常有用。 +`Codec#dispatch` 让我们可以定义一个 codec 的注册表,并根据序列化数据中字段的值分派到一个特定的 codec。 当反序列化具有不同字段的对象,这些字段依赖于它们的类型,但仍代表相同的事物时,这非常有用。 当反序列化具有不同字段的对象,这些字段依赖于它们的类型,但仍代表相同的事物时,这非常有用。 例如我们有一个抽象的 `Bean` 接口与两个实现类:`StringyBean` 和 `CountingBean`。 为了用注册表分派序列化他们,我们需要一些事: @@ -308,7 +314,7 @@ public class Identifier { - 一个 `BeanType` 类或 record,代表 bean 的类型并可返回它的 codec。 - 一个在 `Bean` 中可以用于检索其 `BeanType` 的函数。 - 一个 `Identifier` 到 `BeanType` 的 map 或注册表 -- 一个基于改注册表的 `Codec>`。 如果你使用 `net.minecraft.registry.Registry` 可以简单的调用 `Registry#getCodec`。 +- 一个基于改注册表的 `Codec>`。 一个基于改注册表的 `Codec>`。 如果你使用 `net.minecraft.registry.Registry` 可以简单的调用 `Registry#getCodec`。 集齐这些,我们可以创建一个 bean 的注册表分派 codec。 @@ -345,6 +351,50 @@ Codec beanCodec = beanTypeCodec.dispatch("type", Bean::getType, BeanType:: } ``` +### 递归Codec + +有时,使用自身来解码特定字段的Codec很有用,例如在处理某些递归数据结构时。 在原始代码中,这用于`Text`对象,它可以将其他`Text`存储为子对象。 可以使用`Codecs#createRecursive`构建这样的Codec。 + +例如,让我们尝试序列化单链列表。 这种表示列表的方式由一组节点组成,这些节点既包含一个值,也包含对列表中下一个节点的引用。 然后列表由其第一个节点表示,遍历列表是通过跟随下一个节点来完成的,直到没有剩余节点。 以下是存储整数的节点的简单实现。 + +```java +public record ListNode(int value, ListNode next) {} +``` + +我们无法通过普通方法为此构建codec,因为我们会对`next`字段使用什么codec? 我们需要一个`Codec`,这就是我们正在构建的! `Codecs#createRecursive` 让我们使用一个神奇的 lambda 来实现这一点: + +```java +Codec codec = Codecs.createRecursive( + "ListNode", // codec的名称 + selfCodec -> { + // 这里,`selfCodec` 代表 `Codec`,就像它已经构造好了一样 + // 这个 lambda 应该返回我们从一开始就想要使用的codec, + // 通过`selfCodec`引用自身 + return RecordCodecBuilder.create(instance -> + instance.group( + Codec.INT.fieldOf("value").forGetter(ListNode::value), + // `next`字段将使用自编解码器递归处理 + Codecs.createStrictOptionalFieldCodec(selfCodec, "next", null).forGetter(ListNode::next) + ).apply(instance, ListNode::new) + ); + } +); +``` + +序列化的`ListNode`可能看起来像这样: + +```json +{ + "value": 2, + "next": { + "value": 3, + "next" : { + "value": 5 + } + } +} +``` + ## 引用 - 关于编解码器及相关API的更全面的文档,可以在[非官方DFU JavaDoc](https://kvverti.github.io/Documented-DataFixerUpper/snapshot/com/mojang/serialization/Codec.html)中找到。 diff --git a/translated/zh_cn/develop/commands/arguments.md b/translated/zh_cn/develop/commands/arguments.md index 2156634b8..021689b1a 100644 --- a/translated/zh_cn/develop/commands/arguments.md +++ b/translated/zh_cn/develop/commands/arguments.md @@ -5,19 +5,19 @@ description: 学习如何创建带有复杂参数的命令。 # 命令参数 -大多数的命令都有参数。 有些时候他们是可选的,这意味着如果你不提供这些参数命令照样可以工作 一个节点可能有多个参数类型导致用户感到困惑,请注意避免这个问题。 +大多数的命令都有参数。 有些时候他们是可选的,这意味着如果你不提供这些参数命令照样可以工作 一个节点可能有多种参数类型,此时有可能使用户困惑,请注意避免这个问题。 @[code lang=java highlight={3} transcludeWith=:::4](@/reference/latest/src/main/java/com/example/docs/command/FabricDocsReferenceCommands.java) -比如说,在命令文本`/argtater`之后,您应该输入一个整型数字。 比如说,在命令文本`/argtater`之后,您应该输入一个整型数字。 举个例子,如果您输入了`/argtater 3`,您应该会收到一条反馈消息:`Called /argtater with value = 3`。 如果您输入了 `/argtataer` 并且没有任何参数,那么这个命令将不会被正确解析。 如果您输入了 `/argtataer` 并且没有任何参数,那么这个命令将不会被正确解析。 +在这个情况里,在命令`/argtater`之后,您应该输入一个整型数字。 举个例子,如果您输入了`/argtater 3`,您应该会收到一条消息:`Called /argtater with value = 3`。 如果您输入了 `/argtataer` 并且没有任何参数,那么这个命令将不会被正确解析。 接下来我们将添加第二个可选的参数: @[code lang=java highlight={3,13} transcludeWith=:::5](@/reference/latest/src/main/java/com/example/docs/command/FabricDocsReferenceCommands.java) -现在您可以输入一个或者两个整型数字了。 如果您提供了一个整型数字,那么会打印单个值的反馈文本。 现在您可以输入一个或者两个整型数字了。 如果您提供了一个整型数字,那么会打印单个值的反馈文本。 如果您提供了两个整型数字,那么会打印有两个值的反馈文本。 +现在您可以输入一个或者两个整型数字了。 如果您提供了一个整型数字,那么会打印单个值的反馈文本。 如果您提供了两个整型数字,那么会打印有两个值的反馈文本。 -您可能会发现没有必要指定两次相似的执行。 因此,我们可以创建一个方法,用于两次执行。 因此,我们可以创建一个方法,用于两次执行。 +您可能会发现没有必要指定两次相似的执行。 因此,我们可以创建一个方法同时用于两种执行。 @[code lang=java highlight={3,5,6,7} transcludeWith=:::6](@/reference/latest/src/main/java/com/example/docs/command/FabricDocsReferenceCommands.java) @@ -25,7 +25,7 @@ description: 学习如何创建带有复杂参数的命令。 如果原版并没有提供您想要的命令参数类型,您可以创建您自己的类型。 为此,您需要创建一个继承`ArgumentType < T >` 接口的类,其中 `T` 是参数的类型。 -您想要实现 `parse` 这个方法,这个方法会把输入的字符串解析为期望的类型。 +您需要实现 `parse` 这个方法,这个方法会把输入的字符串解析为期望的类型。 举个例子,您可以创建一个可以把格式形如 `{x, y, z}` 的字符串解析为一个 `BlockPos` 参数类型。 @@ -34,7 +34,7 @@ description: 学习如何创建带有复杂参数的命令。 ### 注册自定义参数类型 :::warning -您需要在服务端和客户端把您的自定义参数类型都注册一次,否则您的命令将不会工作! +您需要同时在服务端和客户端注册您的自定义参数类型,否则您的命令将不会工作! ::: 您可以在您的模组的初始化方法 `onInitialize` 中使用 `ArgumentTypeRegistry` 类来注册: @@ -43,7 +43,7 @@ description: 学习如何创建带有复杂参数的命令。 ### 使用自定义参数类型 -我们可以在命令中使用我们的自定义参数类型──通过传递实例到 `.argument` 方法到 command builder 中即可。 +我们可以在命令中使用我们的自定义参数类型──通过在 command builder 中传递实例到 `.argument` 方法。 @[code lang=java transcludeWith=:::10 highlight={3}](@/reference/latest/src/main/java/com/example/docs/command/FabricDocsReferenceCommands.java) diff --git a/translated/zh_cn/develop/commands/basics.md b/translated/zh_cn/develop/commands/basics.md index ba36bef2e..271e20492 100644 --- a/translated/zh_cn/develop/commands/basics.md +++ b/translated/zh_cn/develop/commands/basics.md @@ -19,13 +19,13 @@ authors: # 创建命令 -创建命令可以允许模组开发者添加一些可以通过命令使用的功能。 这个指南将会教会你如何注册命令和Brigadier的一般命令结构。 +创建命令可以允许模组开发者添加一些可以通过命令使用的功能。 这个指南将会教会你如何注册命令和 Brigadier 的一般命令结构。 :::info -Brigadier是一款由Mojang为Minecraft编写的命令解析器和调度器。 它是一款基于树的命令库,让您可以通过构建树的方式来构建您的命令和参数。 Brigadier是开源的: https://github.com/Mojang/brigadier +Brigadier 是 Mojang 为 Minecraft 编写的命令解析器和调度器。 它是一个树状命令库,让您可以构建命令和参数的树。 Brigadier 被开源在:https://github.com/Mojang/brigadier ::: -### `Command` 接口 +## `Command` 接口 `com.mojang.brigadier.Command` 是一个可以执行指定行为的函数式接口, 并且在某些情况下会抛出 `CommandSyntaxException` 异常。 它有一个泛型参数 `S`,定义了_命令来源_的类型。 命令来源提供了命令运行的上下文。 在 Minecraft 中,命令来源通常是代表服务器的 `ServerCommandSource`,命令方块,远程连接(RCON),玩家或者实体。 @@ -42,7 +42,7 @@ Command command = context -> { 该整型数字可以被认为是命令的执行结果。 通常,小于或等于零的值表示命令失败并将继续执行并且什么也不做。 大于零的值则意味着命令被成功执行并做了某些事情。 Brigadier 提供了一个常量来表示执行成功: `Command#SINGLE_SUCCESS`。 -#### `ServerCommandSource` 可以做什么? +### `ServerCommandSource` 可以做什么? 当执行时 `ServerCommandSource` 提供了一些额外的特殊实现的上下文。 它有获得执行命令的实体、在哪个世界运行或者在哪个服务器上运行的能力。 @@ -55,7 +55,7 @@ Command command = context -> { }; ``` -### 注册一个基本命令 +## 注册一个基本命令 可以通过 Fabric API 提供的 `CommandRegistrationCallback` 来注册命令 。 @@ -81,17 +81,17 @@ Command command = context -> { 如果一个命令失败了,您可以直接抛出任何异常而不是调用 `sendFeedback()`,服务器会妥善处理。 -通常抛出 `CommandSyntaxException` 异常来指示语法异常或者参数异常。 您也可以实现您自己的异常。 +通常抛出 `CommandSyntaxException` 异常来指示语法异常或者参数异常。 你也可以实现一个专属的异常类型。 为了执行这个命令,您必须输入大小写敏感的 `/foo`。 -#### 注册环境 +### 注册环境 如果需要,您还可以确保仅在某些特定情况下注册命令,例如仅在专用环境中: @[code lang=java highlight={2} transcludeWith=:::2](@/reference/latest/src/main/java/com/example/docs/command/FabricDocsReferenceCommands.java) -#### 命令需求 +### 命令需求 假设您有一个只希望管理员可以执行的命令。 有一个 `requires()` 方法可以做到这一点。 `requires()` 方法有一个 `Predicate` 参数,它将提供一个 `ServerCommandSource` 测试并确定 `CommandSource` 是否可以执行该命令。 @@ -101,7 +101,7 @@ Command command = context -> { 这样做的副作用是不会向不具备 2 级管理员的人显示此命令。 这也是您为什么在未开启作弊模式的情况下不能使用 tab 补全绝大多数命令的原因。 -#### 子命令 +### 子命令 要添加子命令,通常需要注册该命令的第一个字面量节点。 为了添加一个子命令,您必须将下一个字面量节点添加到一个已经存在的节点上。 @@ -111,34 +111,36 @@ Command command = context -> { @[code lang=java highlight={2,8} transcludeWith=:::8](@/reference/latest/src/main/java/com/example/docs/command/FabricDocsReferenceCommands.java) -### 客户端命令 +## 客户端命令 Fabric API 有一个存在于 `net.fabricmc.fabric.api.client.command.v2` 包中的 `ClientCommandManager`,可以帮助您注册客户端端的命令。 代码应当仅存在于客户端端的代码中。 @[code lang=java transcludeWith=:::1](@/reference/latest/src/client/java/com/example/docs/client/command/FabricDocsReferenceClientCommands.java) -### 命令重定向 +## 命令重定向 -命令重定向(也称为别名)是将一个命令的功能重定向到另一个命令的方法。 这对于您如果想改变一个命令的名字但是您依然想支持旧名的情况下十分有用。 +命令重定向(也称为别名)是将一个命令的功能重定向到另一个命令的方法。 这在您想更改命令名称但仍希望支持旧名称时非常有用。 @[code lang=java transcludeWith=:::12](@/reference/latest/src/client/java/com/example/docs/client/command/FabricDocsReferenceClientCommands.java) -### 常见问题 +## 常见问题
-###### 为什么我的代码不可以被编译? +### 为什么我的代码不可以被编译? - 捕捉或者抛出 `CommandSyntaxException` - `CommandSyntaxException` 并不是一个 `RuntimeException`。 如果你抛出了它, 抛出它的地方应该是在方法签名中抛出 `CommandSyntaxException` 的方法中,或者被捕获。 + Brigadier 将处理已检查的异常并为您转发游戏中正确的错误消息。 如果抛出异常, + 那么应该在方法签名中声明该方法会抛出 `CommandSyntaxException`,或者应该对其进行捕获处理。 Brigadier 将处理已检查的异常并为您转发游戏中正确的错误消息。 -- 泛型问题──您可能有时候会遇到泛型的问题。 如果您要注册服务器命令(大多数情况),请确保使用 `CommandManager.literal` 或者 `CommandManager.argument` 而不是 `LiteralArgumentBuilder.literal` 或者 `RequiredArgumentBuilder.argument`。 +- 泛型问题──您可能有时候会遇到泛型的问题。 泛型问题──您可能有时候会遇到泛型的问题。 如果您要注册服务器命令(大多数情况),请确保使用 `CommandManager.literal` 或者 `CommandManager.argument` 而不是 `LiteralArgumentBuilder.literal` 或者 `RequiredArgumentBuilder.argument`。 -- 检查 `sendFeedback()` 方法 - 您可能忘记提供布尔值作为第二个参数。 请您谨记,自从 Minecraft 1.20 版本开始, 第一个参数是类型 `Supplier` 而不是 `Text`。 +- 检查 `sendFeedback()` 方法 - 您可能忘记提供布尔值作为第二个参数。 检查 `sendFeedback()` 方法 - 您可能忘记提供布尔值作为第二个参数。 请您谨记,自从 Minecraft 1.20 版本开始, 第一个参数是类型 `Supplier` 而不是 `Text`。 -- 命令应当返回一个整型数字 - 注册命令时,`executes()` 方法接受一个 `Command` 对象,该对象通常是 lambda。 lambda 应该返回一个整型数字,而不是其他类型。 +- 命令应当返回一个整型数字 - 注册命令时,`executes()` 方法接受一个 `Command` 对象,该对象通常是 lambda。 lambda 应该返回一个整型数字,而不是其他类型。 lambda 应该返回一个整型数字,而不是其他类型。 -###### 我可以在运行时注册命令吗? +### 我可以在运行时注册命令吗? ::: warning You can do this, but it is not recommended. You would get the `CommandManager` from the server and add anything commands @@ -149,13 +151,14 @@ you wish to its `CommandDispatcher`. 这是必须的,因为客户端只会在玩家登录时本地缓存命令树(或者发送操作包时)以完成丰富的错误信息补全。 ::: -###### 我可以在运行时注销命令吗? +### 我可以在运行时注销命令吗? ::: warning You can also do this, however, it is much less stable than registering commands at runtime and could cause unwanted side effects. -为了保持事情简单,你需要对 Brigadier 使用反射来移除节点。 在那之后,您需要使用 `sendCommandTree(ServerPlayerEntity)` 将命令树再次发送给所有玩家。 +为了保持事情简单,你需要对 Brigadier 使用反射来移除节点。 为了保持事情简单,你需要对 Brigadier 使用反射来移除节点。 在那之后,您需要使用 `sendCommandTree(ServerPlayerEntity)` 将命令树再次发送给所有玩家。 如果您不发送更新后的命令树,客户端可能认为命令依然存在,即使服务器会执行失败。 ::: +::: diff --git a/translated/zh_cn/develop/getting-started/launching-the-game.md b/translated/zh_cn/develop/getting-started/launching-the-game.md new file mode 100644 index 000000000..2d0e048ea --- /dev/null +++ b/translated/zh_cn/develop/getting-started/launching-the-game.md @@ -0,0 +1,63 @@ +--- +title: 启动游戏 +description: 了解如何利用各种启动配置文件在实时游戏环境中启动和调试你的模组。 +authors: + - IMB11 +--- + +# 启动游戏 + +Fabric Loom 提供了各种启动配置文件, 可以帮助你在实时游戏环境中启动以及调试你的模组。 本指南将介绍各种启动配置文件以及如何用它们来调试和在游戏中测试你的模组。 + +## 启动配置文件 + +如果你在用 IntelliJ IDEA, 那么你可以从窗口右上角找到启动配置文件。 单击下拉菜单可以查看可用的启动配置文件。 + +应该有一个客户端和服务器配置文件,可以选择正常运行或在调试模式下运行它: + +![启动配置文件](/assets/develop/getting-started/launch-profiles.png) + +## Gradle 任务 + +如果您使用的是命令行,则可以使用以下 Gradle 命令启动游戏: + +- `./gradlew runClient` - 以客户端模式启动游戏。 +- `./gradlew runServer` - 以服务器模式启动游戏。 + +这种方法的唯一问题是无法轻松调试代码。 如果要调试代码,则需要使用 IntelliJ IDEA 中的启动配置文件或通过你所使用的 IDE 中的 Gradle 集成。 + +## 热交换类 + +当你在调试模式下运行游戏时,你可以热交换你的类而无需重启游戏。 这对于快速测试代码的更改很有用。 + +但你仍然受到很大限制: + +- 你无法添加或移除方法 +- 你无法更改方法参数 +- 你无法添加或移除字段 + +## 热交换 Mixin + +如果你正在使用 Mixin,则可以热交换 Mixin 类而无需重启游戏。 这对于快速测试 Mixin 的更改很有用。 + +但是你需要安装 Mixin Java 代理才能使其正常工作。 + +### 1. 找到 Mixin 库 Jar + +在 IntelliJ IDEA 中,你可以在“项目”部分的“外部库”部分中找到 mixin 库 jar: + +![Mixin 库](/assets/develop/getting-started/mixin-library.png) + +你需要复制 jar 的“绝对路径”以供下一步使用。 + +### 2. 添加 `-javaagent` VM 参数 + +在你的“Minecraft 客户端”和/或“Minecraft 服务器”运行配置中,将以下内容添加到 VM 参数选项: + +```:no-line-numbers +-javaagent:"此处为 mixin 库 jar 的路径" +``` + +![VM 参数屏幕截图](/assets/develop/getting-started/vm-arguments.png) + +现在,你应该能够在调试期间修改 mixin 方法的内容,并且无需重启游戏即可使更改生效。 diff --git a/translated/zh_cn/develop/items/potions.md b/translated/zh_cn/develop/items/potions.md index e14e19b67..66780d648 100644 --- a/translated/zh_cn/develop/items/potions.md +++ b/translated/zh_cn/develop/items/potions.md @@ -57,8 +57,7 @@ authors: ![玩家物品栏内的效果](/assets/develop/tater-potion.png) -::: info -**Registering Potions Using an `Ingredient`** +:::info 使用`Ingredient`注册药水 在 Fabric API 的帮助下,使用 ` net.fabricmc.fabric.api.registry.FabricBrewingRecipeRegistry` 可以使用 `Ingredient` 而非 `Item` 来注册药水配方。 diff --git a/translated/zh_cn/develop/sounds/custom.md b/translated/zh_cn/develop/sounds/custom.md index f93126114..776757776 100644 --- a/translated/zh_cn/develop/sounds/custom.md +++ b/translated/zh_cn/develop/sounds/custom.md @@ -9,23 +9,23 @@ authors: ## 准备音频文件 -你的音频文件需要转化为特定格式。 OGG Vorbis 是一种用于音频等多媒体数据的开放式容器格式,Minecraft 的声音文件就使用了这种格式。 为了避免 Minecraft 处理声音传播距离的问题,你的音频必须只有单声道 (Mono)。 +你的音频文件需要转化为特定格式。 你的音频文件需要转化为特定格式。 OGG Vorbis 是一种用于音频等多媒体数据的开放式容器格式,Minecraft 的声音文件就使用了这种格式。 为了避免 Minecraft 处理声音传播距离的问题,你的音频必须只有单声道 (Mono)。 为了避免 Minecraft 处理声音传播距离的问题,你的音频必须只有单声道 (Mono)。 -大部分现代 DAW (数字音频工作站) 软件都可以使用这种格式进行导入和导出。 在下面的例子中,我们将使用免费开源软件“[Audacity](https://www.audacityteam.org/)”将音频文件转换成规定的格式,当然其他的 DAW 也可以做到。 +整理工作 大部分现代 DAW (数字音频工作站) 软件都可以使用这种格式进行导入和导出。 在下面的例子中,我们将使用免费开源软件“[Audacity](https://www.audacityteam.org/)”将音频文件转换成规定的格式,当然其他的 DAW 也可以做到。 ![Audacity 中未准备好的音频文件](/assets/develop/sounds/custom_sounds_0.png) -在本例中,[哨声](https://freesound.org/people/strongbot/sounds/568995/) 被作为例子导入 Audacity。 它目前被保存为`.wav`格式的文件,有两个音频通道 (立体声) 。 按照自己的需求编辑音频,并确保使用“音轨头”顶部的下拉元素删除其中一个音频通道。 +在本例中,[哨声](https://freesound.org/people/strongbot/sounds/568995/) 被作为例子导入 Audacity。 它目前被保存为`.wav`格式的文件,有两个音频通道 (立体声) 。 按照自己的需求编辑音频,并确保使用“音轨头”顶部的下拉元素删除其中一个音频通道。 它目前被保存为`.wav`格式的文件,有两个音频通道 (立体声) 。 按照自己的需求编辑音频,并确保使用“音轨头”顶部的下拉元素删除其中一个音频通道。 ![分割立体声轨](/assets/develop/sounds/custom_sounds_1.png) ![删除一个音频通道](/assets/develop/sounds/custom_sounds_2.png) -导出或渲染音频文件时,请确认选择的是 OGG 文件格式。 有些 DAW (如 REAPER) 可能支持多种 OGG 音频层格式。 在这种情况下,选择 OGG Vorbis 即可。 +导出或渲染音频文件时,请确认选择的是 OGG 文件格式。 有些 DAW (如 REAPER) 可能支持多种 OGG 音频层格式。 在这种情况下,选择 OGG Vorbis 即可。 根据注册表项的数量,入口点类可能很快就会变得十分杂乱。 为了避免这种情况,我们可以使用一个新的辅助类。 在这种情况下,选择 OGG Vorbis 即可。 ![导出为 OGG 文件](/assets/develop/sounds/custom_sounds_3.png) -另外,音频文件过大会导致模组文件也更大。 如有必要,在编辑和导出文件时适量压缩音频本身,以尽量减小导出的文件大小。 +另外,音频文件过大会导致模组文件也更大。 如有必要,在编辑和导出文件时适量压缩音频本身,以尽量减小导出的文件大小。 如有必要,在编辑和导出文件时适量压缩音频本身,以尽量减小导出的文件大小。 ## 加载音频文件 @@ -35,7 +35,7 @@ authors: @[code lang=json](@/reference/latest/src/main/resources/assets/fabric-docs-reference/sounds.json) -声音字幕 (subtitle) 条目为玩家提供了更多的关于该声音的信息。 声音字幕翻译键会在 `resources/assets//lang` 目录下的语言文件中用到,如果游戏内字幕设置已打开且正在播放自定义声音,则会显示该翻译键在语言文件内对应的值,如果找不到,那么会直接显示该声音字幕的翻译键。 +声音字幕 (subtitle) 条目为玩家提供了更多的关于该声音的信息。 声音字幕 (subtitle) 条目为玩家提供了更多的关于该声音的信息。 声音字幕翻译键会在 `resources/assets//lang` 目录下的语言文件中用到,如果游戏内字幕设置已打开且正在播放自定义声音,则会显示该翻译键在语言文件内对应的值,如果找不到,那么会直接显示该声音字幕的翻译键。 ## 注册自定义音效 @@ -46,7 +46,7 @@ Registry.register(Registries.SOUND_EVENT, new Identifier(MOD_ID, "metal_whistle" SoundEvent.of(new Identifier(MOD_ID, "metal_whistle"))); ``` -## 整理工作 +## 规范化 根据注册表项的数量,入口点类可能很快就会变得十分杂乱。 为了避免这种情况,我们可以使用一个新的辅助类。 @@ -60,4 +60,4 @@ Registry.register(Registries.SOUND_EVENT, new Identifier(MOD_ID, "metal_whistle" ## 使用自定义的 SoundEvent -使用辅助类去访问自定义的 SoundEvent。 查看 [播放声音事件(SoundEvent)](/develop/sounds/using-sounds) 页面,了解如何播放声音。 +在新创建的辅助类中添加两个新方法: 一个用于注册所有音效,一个用于初始化该类。 之后就可以根据需要,添加新的自定义 `SoundEvent` 常量了。 使用辅助类去访问自定义的 SoundEvent。 查看 [播放声音事件(SoundEvent)](/develop/sounds/using-sounds) 页面,了解如何播放声音。 diff --git a/translated/zh_tw/index.md b/translated/zh_tw/index.md index dfe92a33e..223467996 100644 --- a/translated/zh_tw/index.md +++ b/translated/zh_tw/index.md @@ -9,13 +9,13 @@ hero: features: - title: 開發人員指南 icon: 🛠️ - details: 我們的精選開發人員指南,由社群撰寫,涵蓋了從建立開發環境到更進階的主題,如繪製和網路等廣泛範疇的議題。 + details: 我們的精選開發人員指南,由社群撰寫,涵蓋了從建立開發環境到更進階的主題,如繪製和網路等廣泛範疇的議題。 /zh_tw/develop/ link: /zh_tw/develop/ linkText: 開始使用 - title: 玩家指南 icon: 📚 - details: 你是一位希望使用由 Fabric 驅動的模組的玩家嗎?我們的玩家指南可以滿足你的需求。這些指南將幫助你下載、安裝和疑難排解 Fabric 模組。 我們的玩家指南可以滿足你的需求。 這些指南將幫助你下載、安裝和疑難排解 Fabric 模組。 - link: /zh_tw/develop/ + details: 你是一位希望使用由 Fabric 驅動的模組的玩家嗎?我們的玩家指南可以滿足你的需求。這些指南將幫助你下載、安裝和疑難排解 Fabric 模組。 我們的玩家指南可以滿足你的需求。 這些指南將幫助你下載、安裝和疑難排解 Fabric 模組。 我們的玩家指南可以滿足你的需求。 這些指南將幫助你下載、安裝和疑難排解 Fabric 模組。 + link: ./players/index.md linkText: 閱讀更多 --- diff --git a/translated/zh_tw/navbar_translations.json b/translated/zh_tw/navbar_translations.json new file mode 100644 index 000000000..7c6dde312 --- /dev/null +++ b/translated/zh_tw/navbar_translations.json @@ -0,0 +1,8 @@ +{ + "title": "Fabric 文件", + "home": "主頁", + "download": "下載", + "contribute": "貢獻", + "contribute.api": "Fabric API", + "version_switcher": "切換版本" +} \ No newline at end of file diff --git a/translated/zh_tw/players/faq.md b/translated/zh_tw/players/faq.md index f58db3d9f..d84540954 100644 --- a/translated/zh_tw/players/faq.md +++ b/translated/zh_tw/players/faq.md @@ -13,7 +13,7 @@ description: 關於 Fabric 的玩家和伺服器管理員常見問題解答手 官方支援的 Fabric 版本包括從 `18w43b` 開始的所有快照版本,以及 `1.14` 及以上的正式版本。 -### 我可以在哪裡發布 Fabric 模組? +### 我在哪裡可以下載已發佈的 Fabric 模組? :::info 你都應該檢查模組是否來自可信賴的來源。 請參閱[尋找可信賴的模組](./finding-mods.md)指南以獲得更多資訊。 @@ -21,7 +21,7 @@ description: 關於 Fabric 的玩家和伺服器管理員常見問題解答手 大多數作者會將他們的模組發布到 [Modrinth](https://modrinth.com/mods?g=categories:%27fabric%27) 和 [CurseForge](https://www.curseforge.com/minecraft/search?class=mc-mods\\&gameVersionTypeId=4),但有些可能選擇將它們上傳到他們的個人網站,或者其他平台,如 GitHub 存儲庫。 -### 我可以在哪裡找到預製的 Fabric 模組包? +### 我在哪裡可以找到預製的 Fabric 模組包? 你可以在各種平台上找到預製的 Fabric 模組包,例如: diff --git a/translated/zh_tw/players/installing-java/linux.md b/translated/zh_tw/players/installing-java/linux.md index 9a60a1ab1..82f905010 100644 --- a/translated/zh_tw/players/installing-java/linux.md +++ b/translated/zh_tw/players/installing-java/linux.md @@ -16,7 +16,7 @@ authors: ![終端機中輸入了「java -version」。](/assets/players/installing-java/linux-java-version.png) :::warning -要使用大多數現代的 Minecraft,你需要至少安裝 Java 17。 如果這個命令顯示低於 17 的任何版本,你需要更新現有的 Java 安裝。 如果你打算開發模組,你應參考另一個指南。 +要使用大多數現代的 Minecraft,你需要至少安裝 Java 17。 如果這個命令顯示低於 17 的任何版本,你需要更新現有的 Java 安裝。 如果你打算開發模組,你應參考另一個指南。 如果你打算開發模組,你應參考另一個指南。 ::: ## 2. 下載並安裝 Java 17 diff --git a/translated/zh_tw/players/installing-java/windows.md b/translated/zh_tw/players/installing-java/windows.md index 7e4f87836..3a7cebe17 100644 --- a/translated/zh_tw/players/installing-java/windows.md +++ b/translated/zh_tw/players/installing-java/windows.md @@ -21,17 +21,17 @@ Minecraft 啟動器附帶了自己的 Java 安裝,因此這部分只在你想 開啟命令提示字元後,輸入 `java -version` 並按下 Enter 鍵。 -如果命令成功執行,你會看到類似這樣的內容。如果命令失敗,請繼續進行下一步。 如果命令失敗,請繼續進行下一步。 +如果命令成功執行,你會看到類似這樣的內容。如果命令失敗,請繼續進行下一步。 如果命令失敗,請繼續進行下一步。 如果命令失敗,請繼續進行下一步。 ![命令提示字元中輸入了「java -version」。](/assets/players/installing-java/windows-java-version.png) :::warning -要使用大多數現代的 Minecraft,你需要至少安裝 Java 17。 如果這個命令顯示低於 17 的任何版本,你需要更新現有的 Java 安裝。 +要使用大多數現代的 Minecraft,你需要至少安裝 Java 17。 如果這個命令顯示低於 17 的任何版本,你需要更新現有的 Java 安裝。 要檢查 Java 是否已安裝,你首先必須開啟命令提示字元。 ::: ## 2. 下載 Java 17 安裝程式。 -要安裝 Java 17,你需要從 [Adoptium](https://adoptium.net/en-GB/temurin/releases/?os=windows\&package=jdk\&version=17) 下載安裝程式。 +要安裝 Java 17,你需要從 [Adoptium](https://adoptium.net/en-GB/temurin/releases/?os=windows\\&package=jdk\\&version=17) 下載安裝程式。 你需要下載 `Windows Installer (.msi)` 版本: @@ -39,16 +39,16 @@ Minecraft 啟動器附帶了自己的 Java 安裝,因此這部分只在你想 如果你有 32 位元作業系統,應該選擇 `x86`;如果你有 64 位元作業系統,則應該選擇 `x64`。 -現代大多數電腦都執行 64 位元作業系統。 如果你不確定,請嘗試使用 64 位元的下載。 +現代大多數電腦都執行 64 位元作業系統。 如果你不確定,請嘗試使用 64 位元的下載。 如果你不確定,請嘗試使用 64 位元的下載。 ## 3. 執行安裝程式! -依照安裝程式中的步驟安裝 Java 17。 當你到達這個頁面時,你應該將以下功能設定為「整個功能將安裝在本機硬碟上」: +依照安裝程式中的步驟安裝 Java 17。 當你到達這個頁面時,你應該將以下功能設定為「整個功能將安裝在本機硬碟上」: 當你到達這個頁面時,你應該將以下功能設定為「整個功能將安裝在本機硬碟上」: - `Set JAVA_HOME environment variable` - 這將加入到你的 PATH 中。 - `JavaSoft (Oracle) registry keys` -![Java 17 安裝程式,凸顯了「Set JAVA\\_HOME variable」和「JavaSoft (Oracle) registry keys」。](/assets/players/installing-java/windows-wizard-screenshot.png) +![Java 17 安裝程式,凸顯了「Set JAVA\\\_HOME variable」和「JavaSoft (Oracle) registry keys」。](/assets/players/installing-java/windows-wizard-screenshot.png) 完成後,你可以按 `下一步` 繼續安裝。 diff --git a/translated/zh_tw/players/troubleshooting/crash-reports.md b/translated/zh_tw/players/troubleshooting/crash-reports.md index 9eaac8ef7..e1520721d 100644 --- a/translated/zh_tw/players/troubleshooting/crash-reports.md +++ b/translated/zh_tw/players/troubleshooting/crash-reports.md @@ -15,7 +15,7 @@ authors: ## 尋找崩潰報告 -崩潰報告儲存在遊戲目錄中的 crash-reports 資料夾中。 如果您正在使用伺服器,則它們儲存在伺服器目錄中的 `crash-reports` 資料夾中。 如果您正在使用伺服器,則它們儲存在伺服器目錄中的 `crash-reports` 資料夾中。 +崩潰報告儲存在遊戲目錄中的 crash-reports 資料夾中。 如果您正在使用伺服器,則它們儲存在伺服器目錄中的 `crash-reports` 資料夾中。 如果您正在使用伺服器,則它們儲存在伺服器目錄中的 `crash-reports` 資料夾中。 如果您正在使用伺服器,則它們儲存在伺服器目錄中的 `crash-reports` 資料夾中。 對於第三方啟動器,你應參考它們的文件以找到崩潰報告的位置。 @@ -47,9 +47,9 @@ authors: 崩潰報告由幾個部分組成,每個部分都使用標題分隔: -- `---- Minecraft Crash Report ----`,報告的摘要。 這個部分包含導致崩潰的主要錯誤、發生時間以及相關的堆疊追蹤。 這是崩潰報告中最重要的部分,因為堆疊追蹤通常包含導致崩潰的模組的參考。 這個部分包含導致崩潰的主要錯誤、發生時間以及相關的堆疊追蹤。 這是崩潰報告中最重要的部分,因為堆疊追蹤通常包含導致崩潰的模組的參考。 +- `---- Minecraft Crash Report ----`,報告的摘要。 這個部分包含導致崩潰的主要錯誤、發生時間以及相關的堆疊追蹤。 這是崩潰報告中最重要的部分,因為堆疊追蹤通常包含導致崩潰的模組的參考。 這個部分包含導致崩潰的主要錯誤、發生時間以及相關的堆疊追蹤。 這是崩潰報告中最重要的部分,因為堆疊追蹤通常包含導致崩潰的模組的參考。 這個部分包含導致崩潰的主要錯誤、發生時間以及相關的堆疊追蹤。 這是崩潰報告中最重要的部分,因為堆疊追蹤通常包含導致崩潰的模組的參考。 - `-- Last Reload --`,這個部分除非崩潰發生在資源重新載入期間(F3+T),否則沒有什麼用。 這個部分將包含上次重新載入的時間以及重新載入過程中發生的任何錯誤的相關堆疊追踪。 這些錯誤通常是由資源包引起的,除非它們對遊戲造成問題,否則可以忽略。 -- `-- System Details --`,這個部分包含有關你系統的資訊,例如作業系統、Java 版本和配置給遊戲的記憶體。 這個部分對於確定你是否使用正確的 Java 版本以及是否為遊戲配置足夠的記憶體很有用。 這個部分對於確定你是否使用正確的 Java 版本以及是否為遊戲配置足夠的記憶體很有用。 +- `-- System Details --`,這個部分包含有關你系統的資訊,例如作業系統、Java 版本和配置給遊戲的記憶體。 這個部分對於確定你是否使用正確的 Java 版本以及是否為遊戲配置足夠的記憶體很有用。 這個部分對於確定你是否使用正確的 Java 版本以及是否為遊戲配置足夠的記憶體很有用。 這個部分對於確定你是否使用正確的 Java 版本以及是否為遊戲配置足夠的記憶體很有用。 - 在這一部分,Fabric 將包括一個自訂行,其中說明了 `Fabric Mods:`,後面跟著您安裝的所有模組的清單。 這個部分對於確定模組之間是否可能發生衝突很有用。 ### 分解崩潰報告 @@ -58,7 +58,7 @@ authors: 使用上面連結的範例,我們可以分析崩潰報告,找出崩潰的原因,包括導致崩潰的模組。 -崩潰報告是排解遊戲或伺服器問題的非常重要的一部分。 它們包含了關於崩潰的大量資訊,可以幫助你找到崩潰的原因。 `---- Minecraft Crash Report ----` 部分中的堆棧跟踪在這種情況下最重要,因為它包含導致崩潰的主要錯誤。 在這個案例中,錯誤是 `java.lang.NullPointerException: Cannot invoke "net.minecraft.class_2248.method_9539()" because "net.minecraft.class_2248.field_10540" is null`。 +崩潰報告是排解遊戲或伺服器問題的非常重要的一部分。 它們包含了關於崩潰的大量資訊,可以幫助你找到崩潰的原因。 `---- Minecraft Crash Report ----` 部分中的堆棧跟踪在這種情況下最重要,因為它包含導致崩潰的主要錯誤。 在這個案例中,錯誤是 `java.lang.NullPointerException: Cannot invoke "net.minecraft.class_2248.method_9539()" because "net.minecraft.class_2248.field_10540" is null`。 在這個案例中,錯誤是 `java.lang.NullPointerException: Cannot invoke "net.minecraft.class_2248.method_9539()" because "net.minecraft.class_2248.field_10540" is null`。 由於堆疊追蹤中提到了大量的模組,要指出責任者可能有些困難,但首先要做的是尋找導致崩潰的模組。 @@ -77,7 +77,7 @@ at link.infra.indium.renderer.render.TerrainBlockRenderInfo.shouldDrawFaceInner( ## Mixin 崩潰 :::info -Mixin 是一種讓模組無需修改遊戲原始碼即可修改遊戲的方法。 它們被許多模組使用,是模組開發人員非常強大的工具。 它們被許多模組使用,是模組開發人員非常強大的工具。 +Mixin 是一種讓模組無需修改遊戲原始碼即可修改遊戲的方法。 它們被許多模組使用,是模組開發人員非常強大的工具。 它們被許多模組使用,是模組開發人員非常強大的工具。 它們被許多模組使用,是模組開發人員非常強大的工具。 ::: 當 mixin 崩潰時,堆疊追蹤通常會提到 mixin 和被修改的類。 diff --git a/translated/zh_tw/players/troubleshooting/uploading-logs.md b/translated/zh_tw/players/troubleshooting/uploading-logs.md index 3d66bdbff..33475358e 100644 --- a/translated/zh_tw/players/troubleshooting/uploading-logs.md +++ b/translated/zh_tw/players/troubleshooting/uploading-logs.md @@ -17,7 +17,7 @@ authors: ## 崩潰報告 -當遊戲崩潰時,會自動產生崩潰報告。 它們只包含崩潰資訊,而不包含遊戲的實際記錄檔。 它們位於遊戲目錄中的 `crash-reports` 資料夾中。 +當遊戲崩潰時,會自動產生崩潰報告。 它們只包含崩潰資訊,而不包含遊戲的實際記錄檔。 它們位於遊戲目錄中的 `crash-reports` 資料夾中。 它們只包含崩潰資訊,而不包含遊戲的實際記錄檔。 它們位於遊戲目錄中的 `crash-reports` 資料夾中。 有關崩潰報告的更多資訊,請參閱[崩潰報告](./crash-reports.md)。 diff --git a/translated/zh_tw/sidebar_translations.json b/translated/zh_tw/sidebar_translations.json index e8b1a5ea6..d1631f521 100644 --- a/translated/zh_tw/sidebar_translations.json +++ b/translated/zh_tw/sidebar_translations.json @@ -42,5 +42,6 @@ "develop.misc.events": "事件", "develop.sounds": "音效", "develop.sounds.using-sounds": "撥放音效事件", - "develop.sounds.custom": "建立自訂音效" + "develop.sounds.custom": "建立自訂音效", + "github.edit": "在 GitHub 上編輯此頁面" } \ No newline at end of file