Loads a plugin’s translated strings.
Description
If the path is not given then it will be the root of the plugin directory.
The .mo file should be named based on the text domain with a dash, and then the locale exactly.
Parameters
$domain
stringrequired- Unique identifier for retrieving translated strings
$deprecated
string|falseoptional- Deprecated. Use the $plugin_rel_path parameter instead.
Default:
false
$plugin_rel_path
string|falseoptional- Relative path to WP_PLUGIN_DIR where the .mo file resides.
Default:
false
Source
*/
function load_plugin_textdomain( $domain, $deprecated = false, $plugin_rel_path = false ) {
/** @var WP_Textdomain_Registry $wp_textdomain_registry */
global $wp_textdomain_registry;
if ( ! is_string( $domain ) ) {
return false;
}
if ( false !== $plugin_rel_path ) {
$path = WP_PLUGIN_DIR . '/' . trim( $plugin_rel_path, '/' );
} elseif ( false !== $deprecated ) {
_deprecated_argument( __FUNCTION__, '2.7.0' );
$path = ABSPATH . trim( $deprecated, '/' );
} else {
$path = WP_PLUGIN_DIR;
}
$wp_textdomain_registry->set_custom_path( $domain, $path );
return true;
}
/**
* Loads the translated strings for a plugin residing in the mu-plugins directory.
*
* @since 3.0.0
* @since 4.6.0 The function now tries to load the .mo file from the languages directory first.
* @since 6.7.0 Translations are no longer immediately loaded, but handed off to the just-in-time loading mechanism.
*
* @global WP_Textdomain_Registry $wp_textdomain_registry WordPress Textdomain Registry.
*
* @param string $domain Text domain. Unique identifier for retrieving translated strings.
* @param string $mu_plugin_rel_path Optional. Relative to `WPMU_PLUGIN_DIR` directory in which the .mo
* file resides. Default empty string.
* @return bool True when textdomain is successfully loaded, false otherwise.
*/
function load_muplugin_textdomain( $domain, $mu_plugin_rel_path = '' ) {
Loading the plugin translations should not be done during
plugins_loaded
action since that is too early and prevent other language related plugins from correctly hooking up withload_textdomain()
function and doing whatever they want to do.Calling
load_plugin_textdomain()
should be delayed untilinit
action.after_setup_theme
can work better. The default WordPress themes use this hook to load the theme textdomains and some plugininit
actions require the translations to be in place and load before the default priority 10.init
hook doesn’t work for all the strings. For example, translations for admin menu items will not be loaded, while later strings will be translated.plugins_loaded
hook is more appropriate than theinit
hook for loading translations because it ensures that all plugins are fully loaded before your plugin’s text domain is registered.Just a note,
load_plugin_textdomain()
will try to load the mo file firstly from:WP_LANG_DIR . ‘/plugins/’ . $mofile
Only if it is not able to it will load it from WP_PLUGIN_DIR folder
“The text domain name must use dashes and not underscores, be lower case, and have no spaces.”
Source: https://developer.wordpress.org/plugins/internationalization/how-to-internationalize-your-plugin/
So use ‘wpdocs-textdomain’ instead of ‘wpdocs_textdomain’, e.g.
load_plugin_textdomain( 'wpdocs-textdomain', false, dirname( plugin_basename( __FILE__ ) ) . '/languages' );
Plugin Text domain load
init
action (and notplugins_loaded
)./**
* Load plugin textdomain.
*/
function load_translation() {
load_plugin_textdomain( 'your-plugin-textdomain', false, dirname( plugin_basename( __FILE__ ) ) . '/languages' );
}
add_action( 'plugins_loaded', 'load_translation' );
The
plugins_loaded
hook is more appropriate than theinit
hook for loading translations because it ensures that all plugins are fully loaded before your plugin’s text domain is registered. This avoids potential issues with translation files being loaded too early.plugins_loaded
hook: This hook fires after all active plugins have been loaded. It’s the recommended place for loading the text domain since all necessary plugin files will be available by then.init
hook: While it can work, it’s fired earlier than plugins_loaded, and loading the text domain here may result in translations not being fully registered, especially if your plugin depends on other plugins being loaded.Therefore, using plugins_loaded is the best practice for ensuring reliable translation loading.
plugins_loaded
is beforeinit
and is too early for loading translations.