🇷🇺 Русский (Russian)
🇷🇺 Русский (Russian)
Внешний вид
🇷🇺 Русский (Russian)
🇷🇺 Русский (Russian)
Внешний вид
Страница написана для версии игры:
1.21.4
Всякий раз, когда Minecraft отображает текст в игре, он, вероятно, определяется с помощью объекта Text. Этот пользовательский тип используется вместо String для обеспечения более сложного форматирования, включая цвета, выделение жирным шрифтом, обфускации и событий нажатия (click). Они также обеспечивают легкий доступ в систему перевода, что упрощает перевод любого элемента пользовательского интерфейса в разные языки.
Если вы раньше работали с пакетами данных (датапаками) или функциями, вы можете увидеть параллели с текстовым форматом json, используемым для отображения названий, книг, табличек и другого. Как вы, возможно, догадываетесь, это на самом деле json-представление объекта Text, и его можно преобразовать в Text.Serializer и обратно с помощью Text.Serializer\`.
При создании мода, предпочтительнее создавать свои Text объекты непосредственно в коде, используя перевод, когда это возможно.
Самый простой способ создать объект Text это использовать литерал. По сути это строка которая будет отображена как есть, без форматирования по умолчанию.
Они создаются с помощью методов Text.of и Text.literal, которые действуют немного по-разному. Text.of принимает значения null в себя и возвращает экземпляр класса Text. Text.literal же наоборот не сможет принять значение null, и вернётMutableText являющийся наследуемым классом от Text, который можно легко стилизовать и конкатенировать. Подробнее об этом будет сказано позже.
Text literal = Text.of("Hello, world!");
MutableText mutable = Text.literal("Hello, world!");
// Keep in mind that a MutableText can be used as a Text, making this valid:
Text mutableAsText = mutable;Когда вы хотите предоставить несколько переводов для одной и той же строчки текста, вы можете использовать метод Text.translatable для ссылки на ключ перевода в любом языковом файле. Если ключ не существует, ключ перевода конвертируется в литерал.
Text translatable = Text.translatable("my_mod.text.hello");
// Similarly to literals, translatable text can be easily made mutable.
MutableText mutable = Text.translatable("my_mod.text.bye");Файл языка, en_us.json, выглядит как то так:
{
"my_mod.text.hello": "Hello!",
"my_mod.text.bye": "Goodbye :("
}Если вы хотите иметь возможность использовать переменные в переводе, подобно тому, как сообщения о смерти позволяют вам использовать задействованных игроков и предметы в переводе, вы можете добавить указанные переменные в качестве параметров. Вы можете добавить сколько угодно параметров.
Text translatable = Text.translatable("my_mod.text.hello", player.getDisplayName());Вы можете ссылаться на эти переменные в переводе следующим образом:
{
"my_mod.text.hello": "%1$s said hello!"
}В игре %1$s будет заменено именем игрока, на которого вы ссылаетесь в коде. Использование player.getDisplayName() приведет к тому, что дополнительная информация об объекте появится во всплывающей подсказке при наведении курсора на имя в сообщении чата, в отличие от использования player.getName(), которое все равно получит имя; однако дополнительные детали не отображаются. Аналогичное можно сделать с itemStacks, используя stack.toHoverableText().
Что касается того, что вообще означает %1$s, все, что вам действительно нужно знать, это то, что это число соответствует переменной, которую вы пытаетесь использовать. Допустим, у вас есть три переменные, которые вы используете.
Text translatable = Text.translatable("my_mod.text.whack.item", victim.getDisplayName(), attacker.getDisplayName(), itemStack.toHoverableText());Если вы хотите указать, кто в нашем случае является злоумышленником, вы должны использовать %2$s, потому что это вторая переменная, которую мы передали. Аналогично, %3$s относится к itemStack. Перевод с таким количеством дополнительных параметров может выглядеть так:
{
"my_mod.text.whack.item": "%1$s was whacked by %2$s using %3$s"
}Как было упомянуто выше, вы можете сериализовать текст в JSON используя текстовый кодек. Для большей информации об кодеках, посмотрите страницу Codec.
Gson gson = new Gson();
MutableText mutable = Text.translatable("my_mod.text.bye");
String json = gson.toJson(TextCodecs.CODEC.encodeStart(JsonOps.INSTANCE, mutable).getOrThrow());В результате получается JSON, который можно использовать в датапаках, командах и других местах которые принимают JSON формат текста вместо буквального или переводимого текста.
Кроме того, чтобы десериализовать текстовый объект в реальный класс Text, опять же, используйте кодек.
String jsonString = "...";
Text deserialized = TextCodecs.CODEC
.decode(JsonOps.INSTANCE, gson.fromJson(jsonString, JsonElement.class))
.getOrThrow()
.getFirst();Вы можете быть знакомы со стандартом форматирования в Minecraft:
Вы можете применить эти стили форматирования, используя перечисление Formatting в классе MutableText:
MutableText result = Text.literal("Hello World!")
.formatted(Formatting.AQUA, Formatting.BOLD, Formatting.UNDERLINE);| Цвет | Название | Код в чате | Код для MOTD | HEX-код |
|---|---|---|---|---|
| Чёрный (black) | §0 | \u00A70 | #000000 | |
| Тёмно-синий (dark_blue) | §1 | \u00A71 | #0000AA | |
| Тёмно-зелёный (dark_green) | §2 | \u00A72 | #00AA00 | |
| Тёмно-голубой (dark_aqua) | §3 | \u00A73 | #00AAAA | |
| Тёмно-красный (dark_red) | §4 | \u00A74 | #AA0000 | |
| Тёмно-фиолетовый (dark_purple) | §5 | \u00A75 | #AA00AA | |
| Золотой (gold) | §6 | \u00A76 | #FFAA00 | |
| Серый (gray) | §7 | \u00A77 | #AAAAAA | |
| Тёмно-серый (dark_gray) | §8 | \u00A78 | #555555 | |
| Синий (blue) | §9 | \u00A79 | #5555FF | |
| Зелёный (green) | §a | \u00A7a | #55FF55 | |
| Голубой (aqua) | §b | \u00A7b | #55FFFF | |
| Красный (red) | §c | \u00A7c | #FF5555 | |
| Фиолетовый (light_purple) | §d | \u00A7d | #FF55FF | |
| Жёлтый (yellow) | §e | \u00A7e | #FFFF55 | |
| Белый (white) | §f | \u00A7f | #FFFFFF | |
| Сброс форматирования | §r | |||
| Жирный | §l | |||
| §m | ||||
| Подчёркнутый | §n | |||
| Курсив | §o | |||
| Зашифрованный | §k |