chore: add pumpkin_macros::translate_cross! macro

validates translations at compile time, also update bedrock translations to latest 26.40.5
This commit is contained in:
Alexander Medvedev
2026-08-10 18:11:00 +02:00
parent 366c9cb323
commit 1ee7be3f8c
46 changed files with 42552 additions and 1144 deletions

View File

@@ -27,5 +27,10 @@ syn = { version = "3.0", features = ["full", "extra-traits"] }
pumpkin-util = { path = "../../crates/pumpkin-util", features = ["codegen"] }
pumpkin-nbt = { path = "../../crates/pumpkin-nbt" }
[lints]
workspace = true
[lints.clippy]
expect_used = "allow"
unwrap_used = "allow"
panic = "allow"
indexing_slicing = "allow"
pedantic = { level = "allow", priority = -1 }
all = { level = "allow", priority = -1 }

View File

@@ -314,6 +314,7 @@ pub fn build() -> TokenStream {
}
true
}
#[allow(deprecated)]
pub fn get_fullname(&self, level: i32) -> TextComponent {
let mut ret = TextComponent::translate(self.description, []).color_named(
if self.has_tag(&EnchantmentTag::MINECRAFT_CURSE) {

View File

@@ -1614,13 +1614,20 @@ pub fn build() -> TokenStream {
#constants
#[must_use]
#[allow(deprecated)]
pub fn translated_name(&self) -> TextComponent {
TextComponent::translate(
self.components
.iter()
.find_map(|(id, data)| (id == &ItemName).then(|| data.as_any().downcast_ref::<ItemNameImpl>().unwrap().name)).unwrap(),
&[],
)
let name = self
.components
.iter()
.find_map(|(id, data)| {
if id == &ItemName {
data.as_any().downcast_ref::<ItemNameImpl>().map(|n| n.name)
} else {
None
}
})
.unwrap_or(self.registry_key);
TextComponent::translate(name, &[])
}
#[doc = "Try to parse an item from a resource location string."]

View File

@@ -9,8 +9,10 @@ pub fn build() -> TokenStream {
.unwrap();
let mut java_constants = TokenStream::new();
let mut java_match_arms = TokenStream::new();
for (name, value) in &java_json {
let ident = to_valid_ident(name);
let ident_str = ident.to_string();
let doc = if !value.is_empty() {
quote!(#[doc = #value])
} else {
@@ -20,11 +22,15 @@ pub fn build() -> TokenStream {
#doc
pub const #ident: &str = #name;
});
java_match_arms.extend(quote! {
#ident_str => Some(#ident),
});
}
let bedrock_content =
fs::read_to_string("../../assets/en_us_bedrock.lang").expect("en_us_bedrock is missing");
let mut bedrock_constants = TokenStream::new();
let mut bedrock_match_arms = TokenStream::new();
for line in bedrock_content.lines() {
let line = line.trim();
@@ -36,6 +42,7 @@ pub fn build() -> TokenStream {
let name = name.trim();
let value = value.trim();
let ident = to_valid_ident(name);
let ident_str = ident.to_string();
let doc = if !value.is_empty() {
quote!(#[doc = #value])
@@ -46,6 +53,32 @@ pub fn build() -> TokenStream {
#doc
pub const #ident: &str = #name;
});
bedrock_match_arms.extend(quote! {
#ident_str => Some(#ident),
});
}
}
let mut java_value_match_arms = TokenStream::new();
for (name, value) in &java_json {
java_value_match_arms.extend(quote! {
#name => Some(#value),
});
}
let mut bedrock_value_match_arms = TokenStream::new();
for line in bedrock_content.lines() {
let line = line.trim();
if line.is_empty() || line.starts_with('#') || line.starts_with('/') {
continue;
}
if let Some((name, value)) = line.split_once('=') {
let name = name.trim();
let value = value.trim();
bedrock_value_match_arms.extend(quote! {
#name => Some(#value),
});
}
}
@@ -54,9 +87,33 @@ pub fn build() -> TokenStream {
#![allow(clippy::doc_markdown)]
pub mod java {
#java_constants
pub fn get(const_name: &str) -> Option<&'static str> {
match const_name {
#java_match_arms
_ => None,
}
}
pub fn get_value(key: &str) -> Option<&'static str> {
match key {
#java_value_match_arms
_ => None,
}
}
}
pub mod bedrock {
#bedrock_constants
pub fn get(const_name: &str) -> Option<&'static str> {
match const_name {
#bedrock_match_arms
_ => None,
}
}
pub fn get_value(key: &str) -> Option<&'static str> {
match key {
#bedrock_value_match_arms
_ => None,
}
}
}
}
}