From 452d2d3398a20e4ce09e241091da472345b1ec82 Mon Sep 17 00:00:00 2001 From: Antonin Delpeuch Date: Wed, 3 Sep 2025 13:27:52 +0200 Subject: [PATCH] feat: Gettext support (*.po, *.pot) --- Cargo.lock | 11 +++++++++++ Cargo.toml | 1 + doc/src/languages.md | 1 + examples/po/working/messages/Base.po | 4 ++++ examples/po/working/messages/Expected.po | 11 +++++++++++ examples/po/working/messages/Left.po | 7 +++++++ examples/po/working/messages/Right.po | 7 +++++++ src/supported_langs.rs | 16 ++++++++++++++++ 8 files changed, 58 insertions(+) create mode 100644 examples/po/working/messages/Base.po create mode 100644 examples/po/working/messages/Expected.po create mode 100644 examples/po/working/messages/Left.po create mode 100644 examples/po/working/messages/Right.po diff --git a/Cargo.lock b/Cargo.lock index 2efc586..cce9413 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -569,6 +569,7 @@ dependencies = [ "tree-sitter-nix", "tree-sitter-ocaml", "tree-sitter-php", + "tree-sitter-po-orchard", "tree-sitter-properties", "tree-sitter-python-orchard", "tree-sitter-ruby", @@ -1243,6 +1244,16 @@ dependencies = [ "tree-sitter-language", ] +[[package]] +name = "tree-sitter-po-orchard" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4be5cb95a9a7d3e4ed0691545e7b78a0426becd99261249abd3444627df8d38" +dependencies = [ + "cc", + "tree-sitter-language", +] + [[package]] name = "tree-sitter-properties" version = "0.3.0" diff --git a/Cargo.toml b/Cargo.toml index 2a9dea5..6538076 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -41,6 +41,7 @@ tree-sitter-cpp = "0.23" tree-sitter-c-sharp = "0.23" tree-sitter-xml = "0.7.0" tree-sitter-go = "0.25.0" +tree-sitter-po-orchard = "0.1" tree-sitter-gomod-orchard = "0.4" tree-sitter-gosum-orchard = "0.2" tree-sitter-dart-orchard = "0.1" diff --git a/doc/src/languages.md b/doc/src/languages.md index 555dd2f..9055a4d 100644 --- a/doc/src/languages.md +++ b/doc/src/languages.md @@ -36,6 +36,7 @@ and the following declarative file formats: * Java properties files (*.properties) * HCL (*.hcl, *.tf, *.tfvars) * `go.mod` and `go.sum` files +* Gettext (*.po, *.pot) This list can also be obtained with the `mergiraf languages` command. diff --git a/examples/po/working/messages/Base.po b/examples/po/working/messages/Base.po new file mode 100644 index 0000000..de5afd9 --- /dev/null +++ b/examples/po/working/messages/Base.po @@ -0,0 +1,4 @@ +#: src/main.c:22 +msgid "Hello" +msgstr "Hallo" + diff --git a/examples/po/working/messages/Expected.po b/examples/po/working/messages/Expected.po new file mode 100644 index 0000000..7d0b36d --- /dev/null +++ b/examples/po/working/messages/Expected.po @@ -0,0 +1,11 @@ +#: src/main.c:22 +msgid "Hello" +msgstr "Hallo" + +#: src/main.c:38 +msgid "OK" +msgstr "Bestätigen" + +#: src/main.c:39 +msgid "Cancel" +msgstr "Abbrechen" diff --git a/examples/po/working/messages/Left.po b/examples/po/working/messages/Left.po new file mode 100644 index 0000000..8f9a0e2 --- /dev/null +++ b/examples/po/working/messages/Left.po @@ -0,0 +1,7 @@ +#: src/main.c:22 +msgid "Hello" +msgstr "Hallo" + +#: src/main.c:38 +msgid "OK" +msgstr "Bestätigen" diff --git a/examples/po/working/messages/Right.po b/examples/po/working/messages/Right.po new file mode 100644 index 0000000..3f5c327 --- /dev/null +++ b/examples/po/working/messages/Right.po @@ -0,0 +1,7 @@ +#: src/main.c:22 +msgid "Hello" +msgstr "Hallo" + +#: src/main.c:39 +msgid "Cancel" +msgstr "Abbrechen" diff --git a/src/supported_langs.rs b/src/supported_langs.rs index 28fd541..390f106 100644 --- a/src/supported_langs.rs +++ b/src/supported_langs.rs @@ -552,6 +552,22 @@ pub static SUPPORTED_LANGUAGES: LazyLock> = LazyLock::new(|| { flattened_nodes: &[], comment_nodes: &[], }, + LangProfile { + name: "PO", + alternate_names: &["Gettext"], + extensions: vec!["po", "pot"], + file_names: vec![], + language: tree_sitter_po_orchard::LANGUAGE.into(), + atomic_nodes: vec!["string"], + commutative_parents: vec![ + CommutativeParent::without_delimiters("source_file", "\n\n") + .restricted_to_groups(&[&["message"]]), + ], + signatures: vec![signature("message", vec![vec![ChildKind("msgid")]])], + injections: None, + flattened_nodes: &[], + comment_nodes: &["comment"], + }, LangProfile { name: "Javascript", alternate_names: &[], -- 2.47.3