WordPress kopiert Sprachdateien nur dann automatisch nach wp-content/languages/plugins, wenn die Übersetzungen aus wordpress.org stammen (also über die normale Update-Mechanik kommen). Bei einem Plugin, das du manuell installierst oder aus einer anderen Quelle lädst, bleiben die Sprachdateien im Pluginverzeichnis (wp-content/plugins/plugin-name/languages).
So lange es sich um .po-Files handelt (Übersetzungen von PHP-Strings) ist das kein Problem, .po/.mo‑Dateien funktionieren im Pluginverzeichnis meist ohne Zusatzaufwand, weil load_plugin_textdomain() sie beim Aktivieren bzw. beim ersten plugins_loaded automatisch findet und lädt.
Da ich mehrfach verwendete Plugins zwar übers Dashboard aktualisieren, die jedoch nicht in WordPress Repository hochladen möchte, werden Einstellungen für Blöcke im Block-Editor nicht automatisch übersetzt, da die zuständige Übersetzungsdatei im Plugin bleibt.
Bei Block-Skripten werden die Übersetzungen clientseitig aus JSON nachgeladen, und WordPress muss wissen, welches Skript zu welcher JSON gehört. Deshalb braucht es das wp_set_script_translations().
Damit Übersetzungen generell direkt aus dem languages-Ordner des Plugins geladen geladen werden, braucht es:
- passende *.json/*.mo im Pluginordner
- load_plugin_textdomain()
- für Blockskripte zusätzlich wp_set_script_translations()
- md5hashtag vom relativen pfad zur index.js des blocks (editor-script)
/**
* Set script translations for block editor scripts
*/
public function set_block_script_translations()
{
if (!function_exists('wp_set_script_translations')) {
return;
}
$registry = \WP_Block_Type_Registry::get_instance();
$block_type = $registry->get_registered('namespace/block-name');
if (!$block_type) {
return;
}
$languages_path = plugin_dir_path(__FILE__) . 'languages';
if (!empty($block_type->editor_script_handles)) {
foreach ($block_type->editor_script_handles as $handle) {
wp_set_script_translations($handle, 'plugin-name', $languages_path);
}
return;
}
$block_name_slug = str_replace('/', '-', 'namespace/block-name');
wp_set_script_translations(
$block_name_slug . '-editor-script',
'plugin-name',
$languages_path
);
}
add_action('init', 'set_block_script_translations', 20);Die Json-datei bekommen einen namen wie plugin-name-de_DE-{hash}.json. Der Hash wird in diesem Fall aus dem relativen Pfad zur index.js gebildet (z.b. blocks/block-name/index.js, oder wie die Editor-Skript-Datei heißt). Das kann über ein Skript erfolgen, oder zum Beispiel über einen md5hashgenerator.
Unser Beispielhash sähe dann so aus

Bei mehreren Blöcken braucht es entsprechend auch mehrere jsons, da sich die hashes unterscheiden (müssen).




Schreibe einen Kommentar