WordPress Version: 5.3
/**
* Loads a .mo file into the text domain $domain.
*
* If the text domain already exists, the translations will be merged. If both
* sets have the same string, the translation from the original value will be taken.
*
* On success, the .mo file will be placed in the $l10n global by $domain
* and will be a MO object.
*
* @since 1.5.0
* @since 6.1.0 Added the `$locale` parameter.
*
* @global MO[] $l10n An array of all currently loaded text domains.
* @global MO[] $l10n_unloaded An array of all text domains that have been unloaded again.
* @global WP_Textdomain_Registry $wp_textdomain_registry WordPress Textdomain Registry.
*
* @param string $domain Text domain. Unique identifier for retrieving translated strings.
* @param string $mofile Path to the .mo file.
* @param string $locale Optional. Locale. Default is the current locale.
* @return bool True on success, false on failure.
*/
function load_textdomain($domain, $mofile, $locale = null)
{
/** @var WP_Textdomain_Registry $wp_textdomain_registry */
global $l10n, $l10n_unloaded, $wp_textdomain_registry;
$l10n_unloaded = (array) $l10n_unloaded;
if (!is_string($domain)) {
return false;
}
/**
* Filters whether to short-circuit loading .mo file.
*
* Returning a non-null value from the filter will effectively short-circuit
* the loading, returning the passed value instead.
*
* @since 6.3.0
*
* @param bool|null $loaded The result of loading a .mo file. Default null.
* @param string $domain Text domain. Unique identifier for retrieving translated strings.
* @param string $mofile Path to the MO file.
* @param string|null $locale Locale.
*/
$loaded = apply_filters('pre_load_textdomain', null, $domain, $mofile, $locale);
if (null !== $loaded) {
if (true === $loaded) {
unset($l10n_unloaded[$domain]);
}
return $loaded;
}
/**
* Filters whether to override the .mo file loading.
*
* @since 2.9.0
* @since 6.2.0 Added the `$locale` parameter.
*
* @param bool $override Whether to override the .mo file loading. Default false.
* @param string $domain Text domain. Unique identifier for retrieving translated strings.
* @param string $mofile Path to the MO file.
* @param string|null $locale Locale.
*/
$plugin_override = apply_filters('override_load_textdomain', false, $domain, $mofile, $locale);
if (true === (bool) $plugin_override) {
unset($l10n_unloaded[$domain]);
return true;
}
/**
* Fires before the MO translation file is loaded.
*
* @since 2.9.0
*
* @param string $domain Text domain. Unique identifier for retrieving translated strings.
* @param string $mofile Path to the .mo file.
*/
do_action('load_textdomain', $domain, $mofile);
/**
* Filters MO file path for loading translations for a specific text domain.
*
* @since 2.9.0
*
* @param string $mofile Path to the MO file.
* @param string $domain Text domain. Unique identifier for retrieving translated strings.
*/
$mofile = apply_filters('load_textdomain_mofile', $mofile, $domain);
if (!$locale) {
$locale = determine_locale();
}
$i18n_controller = WP_Translation_Controller::get_instance();
// Ensures the correct locale is set as the current one, in case it was filtered.
$i18n_controller->set_locale($locale);
/**
* Filters the preferred file format for translation files.
*
* Can be used to disable the use of PHP files for translations.
*
* @since 6.5.0
*
* @param string $preferred_format Preferred file format. Possible values: 'php', 'mo'. Default: 'php'.
* @param string $domain The text domain.
*/
$preferred_format = apply_filters('translation_file_format', 'php', $domain);
if (!in_array($preferred_format, array('php', 'mo'), true)) {
$preferred_format = 'php';
}
$translation_files = array();
if ('mo' !== $preferred_format) {
$translation_files[] = substr_replace($mofile, ".l10n.{$preferred_format}", -strlen('.mo'));
}
$translation_files[] = $mofile;
foreach ($translation_files as $file) {
/**
* Filters the file path for loading translations for the given text domain.
*
* Similar to the {@see 'load_textdomain_mofile'} filter with the difference that
* the file path could be for an MO or PHP file.
*
* @since 6.5.0
*
* @param string $file Path to the translation file to load.
* @param string $domain The text domain.
*/
$file = (string) apply_filters('load_translation_file', $file, $domain);
$success = $i18n_controller->load_file($file, $domain, $locale);
if ($success) {
if (isset($l10n[$domain]) && $l10n[$domain] instanceof MO) {
$i18n_controller->load_file($l10n[$domain]->get_filename(), $domain, $locale);
}
// Unset NOOP_Translations reference in get_translations_for_domain().
unset($l10n[$domain]);
$l10n[$domain] = new WP_Translations($i18n_controller, $domain);
$wp_textdomain_registry->set($domain, $locale, dirname($file));
return true;
}
}
return false;
}