2020-06-23 13:48:59 +02:00
<?xml version="1.0" encoding="UTF-8" ?>
2023-07-06 10:08:05 +02:00
<class name= "EditorTranslationParserPlugin" inherits= "RefCounted" xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation= "../class.xsd" >
2020-06-23 13:48:59 +02:00
<brief_description >
Plugin for adding custom parsers to extract strings that are to be translated from custom files (.csv, .json etc.).
</brief_description>
<description >
2021-10-15 14:30:58 +02:00
[EditorTranslationParserPlugin] is invoked when a file is being parsed to extract strings that require translation. To define the parsing and string extraction logic, override the [method _parse_file] method in script.
2024-11-15 20:19:00 +01:00
The return value should be an [Array] of [PackedStringArray]s, one for each extracted translatable string. Each entry should contain [code][msgid, msgctxt, msgid_plural, comment][/code], where all except [code]msgid[/code] are optional. Empty strings will be ignored.
2020-06-23 13:48:59 +02:00
The extracted strings will be written into a POT file selected by user under "POT Generation" in "Localization" tab in "Project Settings" menu.
2020-07-23 00:07:35 +02:00
Below shows an example of a custom parser that extracts strings from a CSV file to write into a POT.
2020-09-13 14:45:36 +02:00
[codeblocks]
[gdscript]
2022-09-21 22:49:03 +02:00
@tool
2020-06-23 13:48:59 +02:00
extends EditorTranslationParserPlugin
2024-11-15 20:19:00 +01:00
func _parse_file(path):
var ret: Array[PackedStringArray] = []
2023-01-30 22:21:36 +08:00
var file = FileAccess.open(path, FileAccess.READ)
2020-07-03 20:24:54 +02:00
var text = file.get_as_text()
2020-09-13 14:45:36 +02:00
var split_strs = text.split(",", false)
2020-06-23 13:48:59 +02:00
for s in split_strs:
2024-11-15 20:19:00 +01:00
msgids.append(PackedStringArray([s]))
2020-06-23 13:48:59 +02:00
#print("Extracted string: " + s)
2024-11-15 20:19:00 +01:00
return ret
2021-05-15 23:48:59 +02:00
func _get_recognized_extensions():
2020-06-23 13:48:59 +02:00
return ["csv"]
2020-09-13 14:45:36 +02:00
[/gdscript]
[csharp]
using Godot;
[Tool]
2023-01-31 18:21:09 +01:00
public partial class CustomParser : EditorTranslationParserPlugin
2020-09-13 14:45:36 +02:00
{
2024-11-15 20:19:00 +01:00
public override Godot.Collections.Array< string[]> _ParseFile(string path)
2020-09-13 14:45:36 +02:00
{
2024-11-15 20:19:00 +01:00
Godot.Collections.Array< string[]> ret;
2023-01-31 18:21:09 +01:00
using var file = FileAccess.Open(path, FileAccess.ModeFlags.Read);
2020-09-13 14:45:36 +02:00
string text = file.GetAsText();
2023-01-31 18:21:09 +01:00
string[] splitStrs = text.Split(",", allowEmpty: false);
foreach (string s in splitStrs)
2020-09-13 14:45:36 +02:00
{
2024-11-15 20:19:00 +01:00
ret.Add([s]);
2023-01-31 18:21:09 +01:00
//GD.Print($"Extracted string: {s}");
2020-09-13 14:45:36 +02:00
}
2024-11-15 20:19:00 +01:00
return ret;
2020-09-13 14:45:36 +02:00
}
2023-01-31 18:21:09 +01:00
public override string[] _GetRecognizedExtensions()
2020-09-13 14:45:36 +02:00
{
2024-12-21 02:28:59 +01:00
return ["csv"];
2020-09-13 14:45:36 +02:00
}
}
[/csharp]
[/codeblocks]
2024-11-15 20:19:00 +01:00
To add a translatable string associated with a context, plural, or comment:
2020-09-13 14:45:36 +02:00
[codeblocks]
[gdscript]
2024-11-15 20:19:00 +01:00
# This will add a message with msgid "Test 1", msgctxt "context", msgid_plural "test 1 plurals", and comment "test 1 comment".
ret.append(PackedStringArray(["Test 1", "context", "test 1 plurals", "test 1 comment"]))
2020-08-07 13:17:12 +02:00
# This will add a message with msgid "A test without context" and msgid_plural "plurals".
2024-11-15 20:19:00 +01:00
ret.append(PackedStringArray(["A test without context", "", "plurals"]))
2020-08-07 13:17:12 +02:00
# This will add a message with msgid "Only with context" and msgctxt "a friendly context".
2024-11-15 20:19:00 +01:00
ret.append(PackedStringArray(["Only with context", "a friendly context"]))
2020-09-13 14:45:36 +02:00
[/gdscript]
[csharp]
2024-11-15 20:19:00 +01:00
// This will add a message with msgid "Test 1", msgctxt "context", msgid_plural "test 1 plurals", and comment "test 1 comment".
ret.Add(["Test 1", "context", "test 1 plurals", "test 1 comment"]);
2020-09-13 14:45:36 +02:00
// This will add a message with msgid "A test without context" and msgid_plural "plurals".
2024-11-15 20:19:00 +01:00
ret.Add(["A test without context", "", "plurals"]);
2020-09-13 14:45:36 +02:00
// This will add a message with msgid "Only with context" and msgctxt "a friendly context".
2024-11-15 20:19:00 +01:00
ret.Add(["Only with context", "a friendly context"]);
2020-09-13 14:45:36 +02:00
[/csharp]
[/codeblocks]
2024-09-06 00:25:59 +02:00
[b]Note:[/b] If you override parsing logic for standard script types (GDScript, C#, etc.), it would be better to load the [code]path[/code] argument using [method ResourceLoader.load]. This is because built-in scripts are loaded as [Resource] type, not [FileAccess] type. For example:
2020-09-13 14:45:36 +02:00
[codeblocks]
[gdscript]
2024-11-15 20:19:00 +01:00
func _parse_file(path):
2020-07-03 20:24:54 +02:00
var res = ResourceLoader.load(path, "Script")
2020-09-13 14:45:36 +02:00
var text = res.source_code
2020-07-03 20:24:54 +02:00
# Parsing logic.
2021-05-15 23:48:59 +02:00
func _get_recognized_extensions():
2020-07-25 21:38:34 +02:00
return ["gd"]
2020-09-13 14:45:36 +02:00
[/gdscript]
[csharp]
2024-11-15 20:19:00 +01:00
public override Godot.Collections.Array< string[]> _ParseFile(string path)
2020-09-13 14:45:36 +02:00
{
var res = ResourceLoader.Load< Script> (path, "Script");
string text = res.SourceCode;
// Parsing logic.
}
2023-01-31 18:21:09 +01:00
public override string[] _GetRecognizedExtensions()
2020-09-13 14:45:36 +02:00
{
2024-12-21 02:28:59 +01:00
return ["gd"];
2020-09-13 14:45:36 +02:00
}
[/csharp]
[/codeblocks]
2021-10-15 14:30:58 +02:00
To use [EditorTranslationParserPlugin], register it using the [method EditorPlugin.add_translation_parser_plugin] method first.
2020-06-23 13:48:59 +02:00
</description>
<tutorials >
</tutorials>
<methods >
2021-08-21 22:52:44 -03:00
<method name= "_get_recognized_extensions" qualifiers= "virtual const" >
<return type= "PackedStringArray" />
2020-06-23 13:48:59 +02:00
<description >
Gets the list of file extensions to associate with this parser, e.g. [code]["csv"][/code].
</description>
</method>
2021-05-15 23:48:59 +02:00
<method name= "_parse_file" qualifiers= "virtual" >
2024-11-15 20:19:00 +01:00
<return type= "PackedStringArray[]" />
2022-08-06 21:11:48 +03:00
<param index= "0" name= "path" type= "String" />
2020-06-23 13:48:59 +02:00
<description >
Override this method to define a custom parsing logic to extract the translatable strings.
</description>
</method>
</methods>
</class>