From 1b3f51f494d121b02096bb3b97394b27b90b5d14 Mon Sep 17 00:00:00 2001 From: Hugo Landrin Date: Tue, 30 Sep 2025 15:50:21 +0200 Subject: [PATCH] Add data generator for english translations --- .github/workflows/check_build.yml | 6 +- .github/workflows/sync.yml | 71 +++--- crowdin.yml | 4 +- .../assets/promenade/lang/en_us.json | 239 ------------------ .../data/PromenadeDataGenerator.java | 1 + .../PromenadeEnglishLangProvider.java | 141 +++++++++++ 6 files changed, 187 insertions(+), 275 deletions(-) delete mode 100644 src/client/resources/assets/promenade/lang/en_us.json create mode 100644 src/datagen/java/fr/hugman/promenade/data/provider/PromenadeEnglishLangProvider.java diff --git a/.github/workflows/check_build.yml b/.github/workflows/check_build.yml index 3668b106..39d3ef85 100644 --- a/.github/workflows/check_build.yml +++ b/.github/workflows/check_build.yml @@ -1,9 +1,5 @@ -# Automatically build the project and run any configured tests for every push -# and submitted pull request. This can help catch issues that only occur on -# certain platforms or Java versions, and provides a first line of defence -# against bad commits. - name: Check Build + on: pull_request: branches: [ main, dev ] diff --git a/.github/workflows/sync.yml b/.github/workflows/sync.yml index cf91c375..c09e10c5 100644 --- a/.github/workflows/sync.yml +++ b/.github/workflows/sync.yml @@ -1,29 +1,42 @@ -# Automatically upload translations to Crowdin for every push to the main or dev branch. -# This allows strings to be translated before a new version is released. - -name: Synchronize Project - -on: - push: - paths: - - 'src/client/resources/assets/promenade/lang/en_us.json' - - 'crowdin.yml' - - 'docs/**/*.*' - branches: [ main, dev ] - -jobs: - crowdin: - runs-on: ubuntu-latest - steps: - - - name: Checkout repository - uses: actions/checkout@v3 - - - name: Upload translations source file to Crowdin - uses: crowdin/github-action@v1 - with: - upload_sources: true - upload_translations: false - download_translations: false - env: - CROWDIN_PERSONAL_TOKEN: ${{ secrets.CROWDIN_PERSONAL_TOKEN }} \ No newline at end of file +name: Synchronize Project + +on: + push: + branches: [ main, dev ] + +jobs: + build_and_crowdin: + strategy: + matrix: + java: [ 21 ] + os: [ ubuntu-latest ] + name: Build the project (Java ${{ matrix.java }}, on ${{ matrix.os }})) and upload translations to Crowdin + runs-on: ${{ matrix.os }} + steps: + + - name: Checkout repository + uses: actions/checkout@v2 + + - name: Validate Gradle wrapper + uses: gradle/wrapper-validation-action@v1 + + - name: Setup JDK ${{ matrix.java }} + uses: actions/setup-java@v1 + with: + java-version: ${{ matrix.java }} + + - name: Make Gradle wrapper executable + if: ${{ runner.os != 'Windows' }} + run: chmod +x ./gradlew + + - name: Generate data files + run: ./gradlew runDatagen + + - name: Upload translations source file to Crowdin + uses: crowdin/github-action@v1 + with: + upload_sources: true + upload_translations: false + download_translations: false + env: + CROWDIN_PERSONAL_TOKEN: ${{ secrets.CROWDIN_PERSONAL_TOKEN }} \ No newline at end of file diff --git a/crowdin.yml b/crowdin.yml index d9a29af3..0590270c 100644 --- a/crowdin.yml +++ b/crowdin.yml @@ -3,8 +3,8 @@ api_token_env: "CROWDIN_PERSONAL_TOKEN" preserve_hierarchy: true files: - - source: "src/client/resources/assets/promenade/lang/en_us.json" - translation: "src/client/resources/assets/promenade/lang/%locale_with_underscore%.json" + - source: "src/main/generated/assets/promenade/lang/en_us.json" + translation: "src/main/generated/assets/promenade/lang/%locale_with_underscore%.json" dest: "promenade.json" - source: "docs/**/*.*" ignore: diff --git a/src/client/resources/assets/promenade/lang/en_us.json b/src/client/resources/assets/promenade/lang/en_us.json deleted file mode 100644 index d6dc952a..00000000 --- a/src/client/resources/assets/promenade/lang/en_us.json +++ /dev/null @@ -1,239 +0,0 @@ -{ - "modmenu.descriptionTranslation.promenade": "Fancy and simplistic animals, biomes, structures and more!", - "block.promenade.oak_leaf_pile": "Oak Leaf Pile", - "block.promenade.spruce_leaf_pile": "Spruce Leaf Pile", - "block.promenade.birch_leaf_pile": "Birch Leaf Pile", - "block.promenade.jungle_leaf_pile": "Jungle Leaf Pile", - "block.promenade.acacia_leaf_pile": "Acacia Leaf Pile", - "block.promenade.cherry_leaf_pile": "Cherry Leaf Pile", - "block.promenade.dark_oak_leaf_pile": "Dark Oak Leaf Pile", - "block.promenade.pale_oak_leaf_pile": "Pale Oak Leaf Pile", - "block.promenade.mangrove_leaf_pile": "Mangrove Leaf Pile", - "block.promenade.azalea_leaf_pile": "Azalea Leaf Pile", - "block.promenade.flowering_azalea_leaf_pile": "Flowering Azalea Leaf Pile", - "block.promenade.dandelion_pile": "Dandelion Pile", - "block.promenade.poppy_pile": "Poppy Pile", - "block.promenade.blue_orchid_pile": "Blue Orchid Pile", - "block.promenade.allium_pile": "Allium Pile", - "block.promenade.azure_bluet_pile": "Azure Bluet Pile", - "block.promenade.red_tulip_pile": "Red Tulip Pile", - "block.promenade.orange_tulip_pile": "Orange Tulip Pile", - "block.promenade.white_tulip_pile": "White Tulip Pile", - "block.promenade.pink_tulip_pile": "Pink Tulip Pile", - "block.promenade.oxeye_daisy_pile": "Oxeye Daisy Pile", - "block.promenade.cornflower_pile": "Cornflower Pile", - "block.promenade.lily_of_the_valley_pile": "Lily of the Valley Pile", - "block.promenade.wither_rose_pile": "Wither Rose Pile", - "block.promenade.snowy_oak_leaves": "Snowy Oak Leaves", - "block.promenade.snowy_spruce_leaves": "Snowy Spruce Leaves", - "block.promenade.snowy_birch_leaves": "Snowy Birch Leaves", - "block.promenade.snowy_jungle_leaves": "Snowy Jungle Leaves", - "block.promenade.snowy_acacia_leaves": "Snowy Acacia Leaves", - "block.promenade.snowy_cherry_leaves": "Snowy Cherry Leaves", - "block.promenade.snowy_dark_oak_leaves": "Snowy Dark Oak Leaves", - "block.promenade.snowy_pale_oak_leaves": "Snowy Pale Oak Leaves", - "block.promenade.snowy_mangrove_leaves": "Snowy Mangrove Leaves", - "block.promenade.snowy_azalea_leaves": "Snowy Azalea Leaves", - "block.promenade.snowy_flowering_azalea_leaves": "Snowy Flowering Azalea Leaves", - "block.promenade.blunite": "Blunite", - "block.promenade.blunite_stairs": "Blunite Stairs", - "block.promenade.blunite_slab": "Blunite Slab", - "block.promenade.blunite_wall": "Blunite Wall", - "block.promenade.polished_blunite": "Polished Blunite", - "block.promenade.polished_blunite_stairs": "Polished Blunite Stairs", - "block.promenade.polished_blunite_slab": "Polished Blunite Slab", - "block.promenade.asphalt": "Asphalt", - "block.promenade.asphalt_stairs": "Asphalt Stairs", - "block.promenade.asphalt_slab": "Asphalt Slab", - "block.promenade.asphalt_wall": "Asphalt Wall", - "block.promenade.polished_asphalt": "Polished Asphalt", - "block.promenade.polished_asphalt_stairs": "Polished Asphalt Stairs", - "block.promenade.polished_asphalt_slab": "Polished Asphalt Slab", - "block.promenade.blush_sakura_sapling": "Blush Sakura Sapling", - "block.promenade.potted_blush_sakura_sapling": "Potted Blush Sakura Sapling", - "block.promenade.blush_sakura_blossoms": "Blush Sakura Blossoms", - "block.promenade.snowy_blush_sakura_blossoms": "Snowy Blush Sakura Blossoms", - "block.promenade.blush_sakura_blossom_pile": "Blush Sakura Blossom Pile", - "block.promenade.cotton_sakura_sapling": "Cotton Sakura Sapling", - "block.promenade.potted_cotton_sakura_sapling": "Potted Cotton Sakura Sapling", - "block.promenade.cotton_sakura_blossoms": "Cotton Sakura Blossoms", - "block.promenade.snowy_cotton_sakura_blossoms": "Snowy Cotton Sakura Blossoms", - "block.promenade.cotton_sakura_blossom_pile": "Cotton Sakura Blossom Pile", - "block.promenade.sakura_planks": "Sakura Planks", - "block.promenade.sakura_log": "Sakura Log", - "block.promenade.stripped_sakura_log": "Stripped Sakura Log", - "block.promenade.sakura_wood": "Sakura Wood", - "block.promenade.stripped_sakura_wood": "Stripped Sakura Wood", - "block.promenade.sakura_pressure_plate": "Sakura Pressure Plate", - "block.promenade.sakura_trapdoor": "Sakura Trapdoor", - "block.promenade.sakura_button": "Sakura Button", - "block.promenade.sakura_stairs": "Sakura Stairs", - "block.promenade.sakura_slab": "Sakura Slab", - "block.promenade.sakura_fence_gate": "Sakura Fence Gate", - "block.promenade.sakura_fence": "Sakura Fence", - "block.promenade.sakura_door": "Sakura Door", - "block.promenade.sakura_sign": "Sakura Sign", - "block.promenade.sakura_wall_sign": "Sakura Wall Sign", - "block.promenade.sakura_hanging_sign": "Sakura Hanging Sign", - "block.promenade.sakura_wall_hanging_sign": "Sakura Wall Hanging Sign", - "item.promenade.sakura_boat": "Sakura Boat", - "item.promenade.sakura_chest_boat": "Sakura Boat with Chest", - "block.promenade.maple_planks": "Maple Planks", - "block.promenade.maple_log": "Maple Log", - "block.promenade.stripped_maple_log": "Stripped Maple Log", - "block.promenade.maple_wood": "Maple Wood", - "block.promenade.stripped_maple_wood": "Stripped Maple Wood", - "block.promenade.maple_pressure_plate": "Maple Pressure Plate", - "block.promenade.maple_trapdoor": "Maple Trapdoor", - "block.promenade.maple_button": "Maple Button", - "block.promenade.maple_stairs": "Maple Stairs", - "block.promenade.maple_slab": "Maple Slab", - "block.promenade.maple_fence_gate": "Maple Fence Gate", - "block.promenade.maple_fence": "Maple Fence", - "block.promenade.maple_door": "Maple Door", - "block.promenade.maple_sign": "Maple Sign", - "block.promenade.maple_wall_sign": "Maple Wall Sign", - "block.promenade.maple_hanging_sign": "Maple Hanging Sign", - "block.promenade.maple_wall_hanging_sign": "Maple Wall Hanging Sign", - "item.promenade.maple_boat": "Maple Boat", - "item.promenade.maple_chest_boat": "Maple Boat with Chest", - "block.promenade.sap_maple_sapling": "Sap Maple Sapling", - "block.promenade.potted_sap_maple_sapling": "Potted Sap Maple Sapling", - "block.promenade.sap_maple_leaves": "Sap Maple Leaves", - "block.promenade.snowy_sap_maple_leaves": "Snowy Sap Maple Leaves", - "block.promenade.fallen_sap_maple_leaves": "Fallen Sap Maple Leaves", - "block.promenade.sap_maple_leaf_pile": "Sap Maple Leaf Pile", - "block.promenade.vermilion_maple_sapling": "Vermilion Maple Sapling", - "block.promenade.potted_vermilion_maple_sapling": "Potted Vermilion Maple Sapling", - "block.promenade.vermilion_maple_leaves": "Vermilion Maple Leaves", - "block.promenade.snowy_vermilion_maple_leaves": "Snowy Vermilion Maple Leaves", - "block.promenade.fallen_vermilion_maple_leaves": "Fallen Vermilion Maple Leaves", - "block.promenade.vermilion_maple_leaf_pile": "Vermilion Maple Leaf Pile", - "block.promenade.fulvous_maple_sapling": "Fulvous Maple Sapling", - "block.promenade.potted_fulvous_maple_sapling": "Potted Fulvous Maple Sapling", - "block.promenade.fulvous_maple_leaves": "Fulvous Maple Leaves", - "block.promenade.snowy_fulvous_maple_leaves": "Snowy Fulvous Maple Leaves", - "block.promenade.fallen_fulvous_maple_leaves": "Fallen Fulvous Maple Leaves", - "block.promenade.fulvous_maple_leaf_pile": "Fulvous Maple Leaf Pile", - "block.promenade.mikado_maple_sapling": "Mikado Maple Sapling", - "block.promenade.potted_mikado_maple_sapling": "Potted Mikado Maple Sapling", - "block.promenade.mikado_maple_leaves": "Mikado Maple Leaves", - "block.promenade.snowy_mikado_maple_leaves": "Snowy Mikado Maple Leaves", - "block.promenade.fallen_mikado_maple_leaves": "Fallen Mikado Maple Leaves", - "block.promenade.mikado_maple_leaf_pile": "Mikado Maple Leaf Pile", - "block.promenade.palm_planks": "Palm Planks", - "block.promenade.palm_sapling": "Palm Sapling", - "block.promenade.potted_palm_sapling": "Potted Palm Sapling", - "block.promenade.palm_log": "Palm Log", - "block.promenade.stripped_palm_log": "Stripped Palm Log", - "block.promenade.palm_wood": "Palm Wood", - "block.promenade.stripped_palm_wood": "Stripped Palm Wood", - "block.promenade.palm_leaves": "Palm Leaves", - "block.promenade.snowy_palm_leaves": "Snowy Palm Leaves", - "block.promenade.palm_hanging_leaves": "Palm Hanging Leaves", - "block.promenade.palm_leaf_pile": "Palm Leaf Pile", - "block.promenade.palm_pressure_plate": "Palm Pressure Plate", - "block.promenade.palm_trapdoor": "Palm Trapdoor", - "block.promenade.palm_button": "Palm Button", - "block.promenade.palm_stairs": "Palm Stairs", - "block.promenade.palm_slab": "Palm Slab", - "block.promenade.palm_fence_gate": "Palm Fence Gate", - "block.promenade.palm_fence": "Palm Fence", - "block.promenade.palm_door": "Palm Door", - "block.promenade.palm_sign": "Palm Sign", - "block.promenade.palm_wall_sign": "Palm Wall Sign", - "block.promenade.palm_hanging_sign": "Palm Hanging Sign", - "block.promenade.palm_wall_hanging_sign": "Palm Wall Hanging Sign", - "item.promenade.palm_boat": "Palm Boat", - "item.promenade.palm_chest_boat": "Palm Boat with Chest", - "block.promenade.moai": "Moai", - "block.promenade.dark_amaranth_nylium": "Dark Amaranth Nylium", - "block.promenade.dark_amaranth_roots": "Dark Amaranth Roots", - "block.promenade.potted_dark_amaranth_roots": "Potted Dark Amaranth Roots", - "block.promenade.dark_amaranth_wart_block": "Dark Amaranth Wart Block", - "block.promenade.dark_amaranth_planks": "Dark Amaranth Planks", - "block.promenade.dark_amaranth_fungus": "Dark Amaranth Fungus", - "block.promenade.potted_dark_amaranth_fungus": "Potted Dark Amaranth Fungus", - "block.promenade.dark_amaranth_stem": "Dark Amaranth Stem", - "block.promenade.stripped_dark_amaranth_stem": "Stripped Dark Amaranth Stem", - "block.promenade.dark_amaranth_hyphae": "Dark Amaranth Hyphae", - "block.promenade.stripped_dark_amaranth_hyphae": "Stripped Dark Amaranth Hyphae", - "block.promenade.dark_amaranth_pressure_plate": "Dark Amaranth Pressure Plate", - "block.promenade.dark_amaranth_trapdoor": "Dark Amaranth Trapdoor", - "block.promenade.dark_amaranth_button": "Dark Amaranth Button", - "block.promenade.dark_amaranth_stairs": "Dark Amaranth Stairs", - "block.promenade.dark_amaranth_slab": "Dark Amaranth Slab", - "block.promenade.dark_amaranth_fence_gate": "Dark Amaranth Fence Gate", - "block.promenade.dark_amaranth_fence": "Dark Amaranth Fence", - "block.promenade.dark_amaranth_door": "Dark Amaranth Door", - "block.promenade.dark_amaranth_sign": "Dark Amaranth Sign", - "block.promenade.dark_amaranth_wall_sign": "Dark Amaranth Wall Sign", - "block.promenade.dark_amaranth_hanging_sign": "Dark Amaranth Hanging Sign", - "block.promenade.dark_amaranth_wall_hanging_sign": "Dark Amaranth Wall Hanging Sign", - "block.promenade.soul_shroomlight": "Soul Shroomlight", - "block.promenade.coiled_vines": "Coiled Vines", - "block.promenade.coiled_vines_plant": "Coiled Vines Plant", - "block.promenade.blueberry_bush": "Blueberry Bush", - "item.promenade.blueberries": "Blueberries", - "item.promenade.banana": "Banana", - "item.promenade.apricot": "Apricot", - "item.promenade.mango": "Mango", - "item.promenade.duck": "Raw Duck", - "item.promenade.cooked_duck": "Cooked Duck", - "item.promenade.maple_syrup_bottle": "Maple Syrup Bottle", - "item.promenade.bovine_banner_pattern": "Bovine Banner Pattern", - "item.promenade.bovine_banner_pattern.desc": "Bovine", - "block.promenade.banner.bovine.black": "Black Bovine", - "block.promenade.banner.bovine.blue": "Blue Bovine", - "block.promenade.banner.bovine.brown": "Brown Bovine", - "block.promenade.banner.bovine.cyan": "Cyan Bovine", - "block.promenade.banner.bovine.gray": "Gray Bovine", - "block.promenade.banner.bovine.green": "Green Bovine", - "block.promenade.banner.bovine.light_blue": "Light Blue Bovine", - "block.promenade.banner.bovine.light_gray": "Light Gray Bovine", - "block.promenade.banner.bovine.lime": "Lime Bovine", - "block.promenade.banner.bovine.magenta": "Magenta Bovine", - "block.promenade.banner.bovine.orange": "Orange Bovine", - "block.promenade.banner.bovine.pink": "Pink Bovine", - "block.promenade.banner.bovine.purple": "Purple Bovine", - "block.promenade.banner.bovine.red": "Red Bovine", - "block.promenade.banner.bovine.white": "White Bovine", - "block.promenade.banner.bovine.yellow": "Yellow Bovine", - - "item.promenade.capybara_spawn_egg": "Capybara Spawn Egg", - "item.promenade.duck_spawn_egg": "Duck Spawn Egg", - "item.promenade.lush_creeper_spawn_egg": "Lush Creeper Spawn Egg", - "item.promenade.sunken_spawn_egg": "Sunken Spawn Egg", - "entity.promenade.capybara": "Capybara", - "entity.promenade.duck": "Duck", - "entity.promenade.lush_creeper": "Lush Creeper", - "entity.promenade.sunken": "Sunken", - "biome.promenade.blush_sakura_grove": "Blush Sakura Grove", - "biome.promenade.cotton_sakura_grove": "Cotton Sakura Grove", - "biome.promenade.carnelian_treeway": "Carnelian Treeway", - "biome.promenade.glacarian_taiga": "Glacarian Taiga", - "biome.promenade.dark_amaranth_forest": "Dark Amaranth Forest", - "biome.promenade.tall_dark_amaranth_forest": "Tall Dark Amaranth Forest", - "subtitles.promenade.entity.capybara.ambient": "Capybara squeaks", - "subtitles.promenade.entity.capybara.hurt": "Capybara hurts", - "subtitles.promenade.entity.capybara.death": "Capybara dies", - "subtitles.promenade.entity.capybara.fart": "Capybara farts", - "subtitles.promenade.entity.duck.ambient": "Duck quacks", - "subtitles.promenade.entity.duck.hurt": "Duck hurts", - "subtitles.promenade.entity.duck.death": "Duck dies", - "subtitles.promenade.entity.sunken.ambient": "Sunken rattles", - "subtitles.promenade.entity.sunken.hurt": "Sunken hurts", - "subtitles.promenade.entity.sunken.death": "Sunken dies", - "subtitles.promenade.entity.sunken.shoot": "Sunken shoots", - "advancements.promenade.adventure.kill_sunken_outside_water.title": "Supernautica: Above Sixty-Two", - "advancements.promenade.adventure.kill_sunken_outside_water.description": "Kill a sunken that's outside of water using a crossbow while being submerged yourself", - "advancements.promenade.husbandry.harvest_maple_syrup.title": "Don't Worry, Be Sappy!", - "advancements.promenade.husbandry.harvest_maple_syrup.description": "Strip a natural Maple tree using an Axe to collect Maple Syrup with a Bottle", - "painting.promenade.optimism.title": "Optimism", - "painting.promenade.nurture.title": "Nurture", - "name.hugman": "Hugman", - "item_group.promenade.promenade": "Promenade", - "death.fell.accident.coiled_vines": "%1$s fell off some coiled vines", - "gamerule.doBlocksGetSnowy": "Blocks can get snowy", - "gamerule.doBlocksGetSnowy.description": "Some blocks may turn into snowy variants when they are covered by a snow layer" -} \ No newline at end of file diff --git a/src/datagen/java/fr/hugman/promenade/data/PromenadeDataGenerator.java b/src/datagen/java/fr/hugman/promenade/data/PromenadeDataGenerator.java index e3a502cf..462777e7 100644 --- a/src/datagen/java/fr/hugman/promenade/data/PromenadeDataGenerator.java +++ b/src/datagen/java/fr/hugman/promenade/data/PromenadeDataGenerator.java @@ -20,6 +20,7 @@ public void onInitializeDataGenerator(FabricDataGenerator fabricDataGenerator) { // Resource Pack pack.addProvider(PromenadeModelProvider::new); pack.addProvider(PromenadeSoundsProvider::new); + pack.addProvider(PromenadeEnglishLangProvider::new); // Data Pack diff --git a/src/datagen/java/fr/hugman/promenade/data/provider/PromenadeEnglishLangProvider.java b/src/datagen/java/fr/hugman/promenade/data/provider/PromenadeEnglishLangProvider.java new file mode 100644 index 00000000..70523f18 --- /dev/null +++ b/src/datagen/java/fr/hugman/promenade/data/provider/PromenadeEnglishLangProvider.java @@ -0,0 +1,141 @@ +package fr.hugman.promenade.data.provider; + +import fr.hugman.promenade.Promenade; +import fr.hugman.promenade.item.PromenadeItems; +import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput; +import net.fabricmc.fabric.api.datagen.v1.provider.FabricLanguageProvider; +import net.minecraft.registry.Registry; +import net.minecraft.registry.RegistryKey; +import net.minecraft.registry.RegistryKeys; +import net.minecraft.registry.RegistryWrapper; +import net.minecraft.registry.entry.RegistryEntry; +import net.minecraft.util.DyeColor; +import net.minecraft.util.Util; + +import java.util.List; +import java.util.Set; +import java.util.concurrent.CompletableFuture; + +public class PromenadeEnglishLangProvider extends FabricLanguageProvider { + private static final Set DO_NOT_TITLE_CASE = Set.of( + "of", "the", "and", "a", "an", "in", "on", "for", "to", "at", "by", "from", "with" + ); + + public PromenadeEnglishLangProvider(FabricDataOutput dataOutput, CompletableFuture registryLookup) { + super(dataOutput, "en_us", registryLookup); + } + + @Override + public void generateTranslations(RegistryWrapper.WrapperLookup wrapperLookup, TranslationBuilder builder) { + builder.add(PromenadeItems.DUCK, "Raw Duck"); + + this.generateAutomaticTranslations(wrapperLookup, builder); + + builder.add("advancements.promenade.adventure.kill_sunken_outside_water.description", "Kill a sunken that's outside of water using a crossbow while being submerged yourself"); + builder.add("advancements.promenade.adventure.kill_sunken_outside_water.title", "Supernautica: Above Sixty-Two"); + builder.add("advancements.promenade.husbandry.harvest_maple_syrup.description", "Strip a natural Maple tree using an Axe to collect Maple Syrup with a Bottle"); + builder.add("advancements.promenade.husbandry.harvest_maple_syrup.title", "Don't Worry, Be Sappy!"); + + builder.add("subtitles.promenade.entity.capybara.ambient", "Capybara squeaks"); + builder.add("subtitles.promenade.entity.capybara.death", "Capybara dies"); + builder.add("subtitles.promenade.entity.capybara.fart", "Capybara farts"); + builder.add("subtitles.promenade.entity.capybara.hurt", "Capybara hurts"); + builder.add("subtitles.promenade.entity.duck.ambient", "Duck quacks"); + builder.add("subtitles.promenade.entity.duck.death", "Duck dies"); + builder.add("subtitles.promenade.entity.duck.hurt", "Duck hurts"); + builder.add("subtitles.promenade.entity.sunken.ambient", "Sunken rattles"); + builder.add("subtitles.promenade.entity.sunken.death", "Sunken dies"); + builder.add("subtitles.promenade.entity.sunken.hurt", "Sunken hurts"); + builder.add("subtitles.promenade.entity.sunken.shoot", "Sunken shoots"); + + builder.add("name.hugman", "Hugman"); + builder.add("death.fell.accident.coiled_vines", "%1$s fell off some coiled vines"); + builder.add("gamerule.doBlocksGetSnowy", "Blocks can get snowy"); + builder.add("gamerule.doBlocksGetSnowy.description", "Some blocks may turn into snowy variants when they are covered by a snow layer"); + + builder.add("modmenu.descriptionTranslation.promenade", "Fancy and simplistic animals, biomes, structures and more!"); + } + + private void generateAutomaticTranslations(RegistryWrapper.WrapperLookup wrapperLookup, TranslationBuilder builder) { + for (var block : getRegistryEntries(wrapperLookup, RegistryKeys.BLOCK)) { + builder.add(block.value(), snakeToTitleCase(block.registryKey().getValue().getPath())); + } + + for (var item : getRegistryEntries(wrapperLookup, RegistryKeys.ITEM)) { + if (item.value().getTranslationKey().startsWith("block.")) { + continue; + } + var path = item.registryKey().getValue().getPath(); + if (path.endsWith("_chest_boat")) { + path = path.replace("_chest_boat", "_boat_with_chest"); + } + try { + builder.add(item.value(), snakeToTitleCase(path)); + } catch (RuntimeException ignored) {} + } + + for (var entity : getRegistryEntries(wrapperLookup, RegistryKeys.ENTITY_TYPE)) { + var path = entity.registryKey().getValue().getPath(); + if (path.endsWith("_chest_boat")) { + path = path.replace("_chest_boat", "_boat_with_chest"); + } + builder.add(entity.value(), snakeToTitleCase(path)); + } + + for (var biome : getRegistryEntries(wrapperLookup, RegistryKeys.BIOME)) { + var id = biome.registryKey().getValue(); + builder.add(Util.createTranslationKey("biome", id), snakeToTitleCase(id.getPath())); + } + + for (var bannerPattern : getRegistryEntries(wrapperLookup, RegistryKeys.BANNER_PATTERN)) { + var id = bannerPattern.registryKey().getValue(); + builder.add( + Util.createTranslationKey("item", id.withPath(s -> s + "_banner_pattern.desc")), + snakeToTitleCase(id.getPath()) + ); + for (DyeColor color : DyeColor.values()) { + builder.add( + Util.createTranslationKey("block", id.withPath(s -> "banner." + s + "." + color.getId())), + snakeToTitleCase(color.getId() + "_" + id.getPath()) + ); + } + } + + for (var paintingVariant : getRegistryEntries(wrapperLookup, RegistryKeys.PAINTING_VARIANT)) { + var id = paintingVariant.registryKey().getValue(); + builder.add(Util.createTranslationKey("painting", id) + ".title", snakeToTitleCase(id.getPath())); + } + + for (var itemGroup : getRegistryEntries(wrapperLookup, RegistryKeys.ITEM_GROUP)) { + var id = itemGroup.registryKey().getValue(); + builder.add(Util.createTranslationKey("item_group", id), snakeToTitleCase(id.getPath())); + } + } + + private static List> getRegistryEntries(RegistryWrapper.WrapperLookup wrapperLookup, RegistryKey> registryKey) { + return wrapperLookup.getOrThrow(registryKey).streamEntries() + .filter(entry -> entry.registryKey().getValue().getNamespace().equals(Promenade.MOD_ID)) + .toList(); + } + + private static String snakeToTitleCase(String str) { + String[] words = str.split("_"); + StringBuilder titleCase = new StringBuilder(); + for (int i = 0; i < words.length; i++) { + String word = words[i]; + if (word.isEmpty()) { + continue; + } + if (i != 0 && DO_NOT_TITLE_CASE.contains(word.toLowerCase())) { + titleCase.append(word.toLowerCase()); + } else { + titleCase.append(Character.toUpperCase(word.charAt(0))) + .append(word.substring(1).toLowerCase()); + } + if (i < words.length - 1) { + titleCase.append(" "); + } + } + return titleCase.toString(); + } +} \ No newline at end of file