summaryrefslogtreecommitdiff
path: root/server/common/src/grit.rs
diff options
context:
space:
mode:
authorJoel Klinghed <the_jk@spawned.biz>2025-06-06 23:55:23 +0200
committerJoel Klinghed <the_jk@spawned.biz>2025-06-07 00:00:39 +0200
commitad893a4fb44244132d710d7f94fc99a7d83f1b87 (patch)
treeb567690b5388de7919b6422e17b4637d3a323477 /server/common/src/grit.rs
parentf58f6b91e851897444186e9291804fc9b58bbd60 (diff)
grit: Add method for generating message translation id
reimplemented from a description of the grit id calculation
Diffstat (limited to 'server/common/src/grit.rs')
-rw-r--r--server/common/src/grit.rs33
1 files changed, 33 insertions, 0 deletions
diff --git a/server/common/src/grit.rs b/server/common/src/grit.rs
index dbf4f89..a510724 100644
--- a/server/common/src/grit.rs
+++ b/server/common/src/grit.rs
@@ -1156,3 +1156,36 @@ pub async fn parse_grit_with_parts(path: impl AsRef<Path>) -> anyhow::Result<Gri
expand_messages(&mut grit.release.messages.messages, path).await?;
Ok(grit)
}
+
+fn get_presentable_content(message: &Message) -> String {
+ let mut ret = String::new();
+ for c in &message.content {
+ match c {
+ TextPlaceholder::Text(value) => ret += value.as_str(),
+ TextPlaceholder::Placeholder {
+ name,
+ content: _,
+ example: _,
+ } => ret += name.as_str(),
+ }
+ }
+ ret
+}
+
+fn fingerprint(value: &str) -> i64 {
+ u64::from_be_bytes(md5::compute(value).0[0..8].try_into().unwrap()).cast_signed()
+}
+
+pub fn get_message_id(message: &Message) -> i64 {
+ let mut message_id = fingerprint(get_presentable_content(message).as_str());
+ if let Some(meaning) = &message.meaning {
+ let meaning_id = fingerprint(meaning.as_str());
+ if message_id < 0 {
+ message_id = (message_id << 1) + meaning_id + 1
+ } else {
+ message_id = (message_id << 1) + meaning_id
+ }
+ }
+ // Avoid returning negative ids
+ message_id & 0x7fffffffffffffff
+}