X-Git-Url: https://scripts.mit.edu/gitweb/autoinstalls/wordpress.git/blobdiff_plain/4713a14935b83517997f3c88f808eb41da55033d..3194d1bb103c2d8db4f44feeced5e58ee2756658:/wp-includes/l10n.php diff --git a/wp-includes/l10n.php b/wp-includes/l10n.php index 541cb15f..c0179525 100644 --- a/wp-includes/l10n.php +++ b/wp-includes/l10n.php @@ -1,32 +1,36 @@ Note: Don't use translate() directly, use __() or related functions. + * *Note:* Don't use translate() directly, use __() or related functions. * * @since 2.2.0 * * @param string $text Text to translate. * @param string $domain Optional. Text domain. Unique identifier for retrieving translated strings. + * Default 'default'. * @return string Translated text */ function translate( $text, $domain = 'default' ) { $translations = get_translations_for_domain( $domain ); $translations = $translations->translate( $text ); + /** * Filter text with its translation. * @@ -98,7 +118,7 @@ function translate( $text, $domain = 'default' ) { */ function before_last_bar( $string ) { $last_bar = strrpos( $string, '|' ); - if ( false == $last_bar ) + if ( false === $last_bar ) return $string; else return substr( $string, 0, $last_bar ); @@ -110,11 +130,14 @@ function before_last_bar( $string ) { * If there is no translation, or the text domain isn't loaded the original * text is returned. * + * *Note:* Don't use translate_with_gettext_context() directly, use _x() or related functions. + * * @since 2.8.0 * * @param string $text Text to translate. * @param string $context Context information for the translators. * @param string $domain Optional. Text domain. Unique identifier for retrieving translated strings. + * Default 'default'. * @return string Translated text on success, original text on failure. */ function translate_with_gettext_context( $text, $context, $domain = 'default' ) { @@ -134,13 +157,15 @@ function translate_with_gettext_context( $text, $context, $domain = 'default' ) } /** - * Retrieve the translation of $text. If there is no translation, - * or the text domain isn't loaded, the original text is returned. + * Retrieve the translation of $text. + * + * If there is no translation, or the text domain isn't loaded, the original text is returned. * * @since 2.1.0 * * @param string $text Text to translate. * @param string $domain Optional. Text domain. Unique identifier for retrieving translated strings. + * Default 'default'. * @return string Translated text. */ function __( $text, $domain = 'default' ) { @@ -156,6 +181,7 @@ function __( $text, $domain = 'default' ) { * * @param string $text Text to translate. * @param string $domain Optional. Text domain. Unique identifier for retrieving translated strings. + * Default 'default'. * @return string Translated text on success, original text on failure. */ function esc_attr__( $text, $domain = 'default' ) { @@ -171,6 +197,7 @@ function esc_attr__( $text, $domain = 'default' ) { * * @param string $text Text to translate. * @param string $domain Optional. Text domain. Unique identifier for retrieving translated strings. + * Default 'default'. * @return string Translated text */ function esc_html__( $text, $domain = 'default' ) { @@ -184,6 +211,7 @@ function esc_html__( $text, $domain = 'default' ) { * * @param string $text Text to translate. * @param string $domain Optional. Text domain. Unique identifier for retrieving translated strings. + * Default 'default'. */ function _e( $text, $domain = 'default' ) { echo translate( $text, $domain ); @@ -196,6 +224,7 @@ function _e( $text, $domain = 'default' ) { * * @param string $text Text to translate. * @param string $domain Optional. Text domain. Unique identifier for retrieving translated strings. + * Default 'default'. */ function esc_attr_e( $text, $domain = 'default' ) { echo esc_attr( translate( $text, $domain ) ); @@ -208,6 +237,7 @@ function esc_attr_e( $text, $domain = 'default' ) { * * @param string $text Text to translate. * @param string $domain Optional. Text domain. Unique identifier for retrieving translated strings. + * Default 'default'. */ function esc_html_e( $text, $domain = 'default' ) { echo esc_html( translate( $text, $domain ) ); @@ -227,6 +257,7 @@ function esc_html_e( $text, $domain = 'default' ) { * @param string $text Text to translate. * @param string $context Context information for the translators. * @param string $domain Optional. Text domain. Unique identifier for retrieving translated strings. + * Default 'default'. * @return string Translated context string without pipe. */ function _x( $text, $context, $domain = 'default' ) { @@ -241,6 +272,7 @@ function _x( $text, $context, $domain = 'default' ) { * @param string $text Text to translate. * @param string $context Context information for the translators. * @param string $domain Optional. Text domain. Unique identifier for retrieving translated strings. + * Default 'default'. * @return string Translated context string without pipe. */ function _ex( $text, $context, $domain = 'default' ) { @@ -255,6 +287,7 @@ function _ex( $text, $context, $domain = 'default' ) { * @param string $text Text to translate. * @param string $context Context information for the translators. * @param string $domain Optional. Text domain. Unique identifier for retrieving translated strings. + * Default 'default'. * @return string Translated text */ function esc_attr_x( $text, $context, $domain = 'default' ) { @@ -269,6 +302,7 @@ function esc_attr_x( $text, $context, $domain = 'default' ) { * @param string $text Text to translate. * @param string $context Context information for the translators. * @param string $domain Optional. Text domain. Unique identifier for retrieving translated strings. + * Default 'default'. * @return string Translated text. */ function esc_html_x( $text, $context, $domain = 'default' ) { @@ -276,67 +310,77 @@ function esc_html_x( $text, $context, $domain = 'default' ) { } /** - * Retrieve the plural or single form based on the supplied amount. + * Translates and retrieves the singular or plural form based on the supplied number. * - * If the text domain is not set in the $l10n list, then a comparison will be made - * and either $plural or $single parameters returned. + * Used when you want to use the appropriate form of a string based on whether a + * number is singular or plural. + * + * Example: * - * If the text domain does exist, then the parameters $single, $plural, and $number - * will first be passed to the text domain's ngettext method. Then it will be passed - * to the 'ngettext' filter hook along with the same parameters. The expected - * type will be a string. + * $people = sprintf( _n( '%s person', '%s people', $count, 'text-domain' ), number_format_i18n( $count ) ); * * @since 2.8.0 * - * @param string $single The text that will be used if $number is 1. - * @param string $plural The text that will be used if $number is not 1. - * @param int $number The number to compare against to use either $single or $plural. + * @param string $single The text to be used if the number is singular. + * @param string $plural The text to be used if the number is plural. + * @param int $number The number to compare against to use either the singular or plural form. * @param string $domain Optional. Text domain. Unique identifier for retrieving translated strings. - * @return string Either $single or $plural translated text. + * Default 'default'. + * @return string The translated singular or plural form. */ function _n( $single, $plural, $number, $domain = 'default' ) { $translations = get_translations_for_domain( $domain ); $translation = $translations->translate_plural( $single, $plural, $number ); + /** - * Filter text with its translation when plural option is available. + * Filter the singular or plural form of a string. * * @since 2.2.0 * * @param string $translation Translated text. - * @param string $single The text that will be used if $number is 1. - * @param string $plural The text that will be used if $number is not 1. - * @param string $number The number to compare against to use either $single or $plural. + * @param string $single The text to be used if the number is singular. + * @param string $plural The text to be used if the number is plural. + * @param string $number The number to compare against to use either the singular or plural form. * @param string $domain Text domain. Unique identifier for retrieving translated strings. */ return apply_filters( 'ngettext', $translation, $single, $plural, $number, $domain ); } /** - * Retrieve the plural or single form based on the supplied amount with gettext context. + * Translates and retrieves the singular or plural form based on the supplied number, with gettext context. + * + * This is a hybrid of _n() and _x(). It supports context and plurals. + * + * Used when you want to use the appropriate form of a string with context based on whether a + * number is singular or plural. * - * This is a hybrid of _n() and _x(). It supports contexts and plurals. + * Example: + * + * $people = sprintf( _n( '%s person', '%s people', $count, 'context', 'text-domain' ), number_format_i18n( $count ) ); * * @since 2.8.0 * - * @param string $single The text that will be used if $number is 1. - * @param string $plural The text that will be used if $number is not 1. - * @param int $number The number to compare against to use either $single or $plural. + * @param string $single The text to be used if the number is singular. + * @param string $plural The text to be used if the number is plural. + * @param int $number The number to compare against to use either the singular or plural form. * @param string $context Context information for the translators. * @param string $domain Optional. Text domain. Unique identifier for retrieving translated strings. - * @return string Either $single or $plural translated text with context. + * Default 'default'. + * @return string The translated singular or plural form. */ function _nx($single, $plural, $number, $context, $domain = 'default') { $translations = get_translations_for_domain( $domain ); $translation = $translations->translate_plural( $single, $plural, $number, $context ); + /** - * Filter text with its translation while plural option and context are available. + * Filter the singular or plural form of a string with gettext context. * * @since 2.8.0 * * @param string $translation Translated text. - * @param string $single The text that will be used if $number is 1. - * @param string $plural The text that will be used if $number is not 1. - * @param string $number The number to compare against to use either $single or $plural. + * @param string $single The text to be used if the number is singular. + * @param string $plural The text to be used if the number is plural. + * @param string $number The number to compare against to use either the singular or plural form. * @param string $context Context information for the translators. * @param string $domain Text domain. Unique identifier for retrieving translated strings. */ @@ -344,51 +388,102 @@ function _nx($single, $plural, $number, $context, $domain = 'default') { } /** - * Register plural strings in POT file, but don't translate them. + * Registers plural strings in POT file, but don't translate them. * * Used when you want to keep structures with translatable plural - * strings and use them later. + * strings and use them later when the number is known. * * Example: - * - * $messages = array( - * 'post' => _n_noop('%s post', '%s posts'), - * 'page' => _n_noop('%s pages', '%s pages') - * ); - * ... - * $message = $messages[$type]; - * $usable_text = sprintf( translate_nooped_plural( $message, $count ), $count ); - * + * + * $messages = array( + * 'post' => _n_noop( '%s post', '%s posts', 'text-domain' ), + * 'page' => _n_noop( '%s pages', '%s pages', 'text-domain' ), + * ); + * ... + * $message = $messages[ $type ]; + * $usable_text = sprintf( translate_nooped_plural( $message, $count, 'text-domain' ), number_format_i18n( $count ) ); * * @since 2.5.0 * - * @param string $singular Single form to be i18ned. - * @param string $plural Plural form to be i18ned. + * @param string $singular Singular form to be localized. + * @param string $plural Plural form to be localized. * @param string $domain Optional. Text domain. Unique identifier for retrieving translated strings. - * @return array array($singular, $plural) + * Default null. + * @return array { + * Array of translation information for the strings. + * + * @type string $0 Singular form to be localized. No longer used. + * @type string $1 Plural form to be localized. No longer used. + * @type string $singular Singular form to be localized. + * @type string $plural Plural form to be localized. + * @type null $context Context information for the translators. + * @type string $domain Text domain. + * } */ function _n_noop( $singular, $plural, $domain = null ) { return array( 0 => $singular, 1 => $plural, 'singular' => $singular, 'plural' => $plural, 'context' => null, 'domain' => $domain ); } /** - * Register plural strings with context in POT file, but don't translate them. + * Register plural strings with gettext context in the POT file, but don't translate them. + * + * Used when you want to keep structures with translatable plural + * strings and use them later when the number is known. + * + * Example: + * + * $messages = array( + * 'post' => _n_noop( '%s post', '%s posts', 'context', 'text-domain' ), + * 'page' => _n_noop( '%s pages', '%s pages', 'context', 'text-domain' ), + * ); + * ... + * $message = $messages[ $type ]; + * $usable_text = sprintf( translate_nooped_plural( $message, $count, 'text-domain' ), number_format_i18n( $count ) ); * * @since 2.8.0 + * + * @param string $singular Singular form to be localized. + * @param string $plural Plural form to be localized. + * @param string $domain Optional. Text domain. Unique identifier for retrieving translated strings. + * Default null. + * @return array { + * Array of translation information for the strings. + * + * @type string $0 Singular form to be localized. No longer used. + * @type string $1 Plural form to be localized. No longer used. + * @type string $2 Context information for the translators. No longer used. + * @type string $singular Singular form to be localized. + * @type string $plural Plural form to be localized. + * @type string $context Context information for the translators. + * @type string $domain Text domain. + * } */ function _nx_noop( $singular, $plural, $context, $domain = null ) { return array( 0 => $singular, 1 => $plural, 2 => $context, 'singular' => $singular, 'plural' => $plural, 'context' => $context, 'domain' => $domain ); } /** - * Translate the result of _n_noop() or _nx_noop(). + * Translates and retrieves the singular or plural form of a string that's been registered + * with _n_noop() or _nx_noop(). + * + * Used when you want to use a translatable plural string once the number is known. + * + * Example: + * + * $messages = array( + * 'post' => _n_noop( '%s post', '%s posts', 'text-domain' ), + * 'page' => _n_noop( '%s pages', '%s pages', 'text-domain' ), + * ); + * ... + * $message = $messages[ $type ]; + * $usable_text = sprintf( translate_nooped_plural( $message, $count, 'text-domain' ), number_format_i18n( $count ) ); * * @since 3.1.0 * - * @param array $nooped_plural Array with singular, plural and context keys, usually the result of _n_noop() or _nx_noop() - * @param int $count Number of objects + * @param array $nooped_plural Array with singular, plural, and context keys, usually the result of _n_noop() or _nx_noop(). + * @param int $count Number of objects. * @param string $domain Optional. Text domain. Unique identifier for retrieving translated strings. If $nooped_plural contains - * a text domain passed to _n_noop() or _nx_noop(), it will override this value. + * a text domain passed to _n_noop() or _nx_noop(), it will override this value. Default 'default'. * @return string Either $single or $plural translated text. */ function translate_nooped_plural( $nooped_plural, $count, $domain = 'default' ) { @@ -412,6 +507,8 @@ function translate_nooped_plural( $nooped_plural, $count, $domain = 'default' ) * * @since 1.5.0 * + * @global array $l10n + * * @param string $domain Text domain. Unique identifier for retrieving translated strings. * @param string $mofile Path to the .mo file. * @return bool True on success, false on failure. @@ -472,6 +569,8 @@ function load_textdomain( $domain, $mofile ) { * * @since 3.0.0 * + * @global array $l10n + * * @param string $domain Text domain. Unique identifier for retrieving translated strings. * @return bool Whether textdomain was unloaded. */ @@ -517,23 +616,33 @@ function unload_textdomain( $domain ) { * @see load_textdomain() * * @since 1.5.0 + * + * @param string $locale Optional. Locale to load. Default is the value of {@see get_locale()}. + * @return bool Whether the textdomain was loaded. */ -function load_default_textdomain() { - $locale = get_locale(); +function load_default_textdomain( $locale = null ) { + if ( null === $locale ) { + $locale = get_locale(); + } + + // Unload previously loaded strings so we can switch translations. + unload_textdomain( 'default' ); - load_textdomain( 'default', WP_LANG_DIR . "/$locale.mo" ); + $return = load_textdomain( 'default', WP_LANG_DIR . "/$locale.mo" ); if ( ( is_multisite() || ( defined( 'WP_INSTALLING_NETWORK' ) && WP_INSTALLING_NETWORK ) ) && ! file_exists( WP_LANG_DIR . "/admin-$locale.mo" ) ) { load_textdomain( 'default', WP_LANG_DIR . "/ms-$locale.mo" ); - return; + return $return; } - if ( is_admin() || ( defined( 'WP_REPAIRING' ) && WP_REPAIRING ) ) + if ( is_admin() || wp_installing() || ( defined( 'WP_REPAIRING' ) && WP_REPAIRING ) ) { load_textdomain( 'default', WP_LANG_DIR . "/admin-$locale.mo" ); + } if ( is_network_admin() || ( defined( 'WP_INSTALLING_NETWORK' ) && WP_INSTALLING_NETWORK ) ) load_textdomain( 'default', WP_LANG_DIR . "/admin-network-$locale.mo" ); + return $return; } /** @@ -548,6 +657,8 @@ function load_default_textdomain() { * @param string $domain Unique identifier for retrieving translated strings * @param string $deprecated Use the $plugin_rel_path parameter instead. * @param string $plugin_rel_path Optional. Relative path to WP_PLUGIN_DIR where the .mo file resides. + * Default false. + * @return bool True when textdomain is successfully loaded, false otherwise. */ function load_plugin_textdomain( $domain, $deprecated = false, $plugin_rel_path = false ) { $locale = get_locale(); @@ -563,7 +674,7 @@ function load_plugin_textdomain( $domain, $deprecated = false, $plugin_rel_path if ( false !== $plugin_rel_path ) { $path = WP_PLUGIN_DIR . '/' . trim( $plugin_rel_path, '/' ); - } else if ( false !== $deprecated ) { + } elseif ( false !== $deprecated ) { _deprecated_argument( __FUNCTION__, '2.7' ); $path = ABSPATH . trim( $deprecated, '/' ); } else { @@ -636,7 +747,7 @@ function load_theme_textdomain( $domain, $path = false ) { $path = get_template_directory(); // Load the textdomain according to the theme - $mofile = "{$path}/{$locale}.mo"; + $mofile = untrailingslashit( $path ) . "/{$locale}.mo"; if ( $loaded = load_textdomain( $domain, $mofile ) ) return $loaded; @@ -656,6 +767,8 @@ function load_theme_textdomain( $domain, $path = false ) { * @since 2.9.0 * * @param string $domain Text domain. Unique identifier for retrieving translated strings. + * @param string $path Optional. Path to the directory containing the .mo file. + * Default false. * @return bool True when the theme textdomain is successfully loaded, false otherwise. */ function load_child_theme_textdomain( $domain, $path = false ) { @@ -669,8 +782,12 @@ function load_child_theme_textdomain( $domain, $path = false ) { * * If there isn't one, returns empty Translations instance. * + * @since 2.8.0 + * + * @global array $l10n + * * @param string $domain Text domain. Unique identifier for retrieving translated strings. - * @return Translations A Translations instance. + * @return NOOP_Translations A Translations instance. */ function get_translations_for_domain( $domain ) { global $l10n; @@ -684,6 +801,9 @@ function get_translations_for_domain( $domain ) { * Whether there are translations for the text domain. * * @since 3.0.0 + * + * @global array $l10n + * * @param string $domain Text domain. Unique identifier for retrieving translated strings. * @return bool Whether there are translations. */ @@ -727,11 +847,15 @@ function translate_user_role( $name ) { function get_available_languages( $dir = null ) { $languages = array(); - foreach( (array)glob( ( is_null( $dir) ? WP_LANG_DIR : $dir ) . '/*.mo' ) as $lang_file ) { - $lang_file = basename($lang_file, '.mo'); - if ( 0 !== strpos( $lang_file, 'continents-cities' ) && 0 !== strpos( $lang_file, 'ms-' ) && - 0 !== strpos( $lang_file, 'admin-' )) - $languages[] = $lang_file; + $lang_files = glob( ( is_null( $dir) ? WP_LANG_DIR : $dir ) . '/*.mo' ); + if ( $lang_files ) { + foreach ( $lang_files as $lang_file ) { + $lang_file = basename( $lang_file, '.mo' ); + if ( 0 !== strpos( $lang_file, 'continents-cities' ) && 0 !== strpos( $lang_file, 'ms-' ) && + 0 !== strpos( $lang_file, 'admin-' ) ) { + $languages[] = $lang_file; + } + } } return $languages; @@ -767,16 +891,23 @@ function wp_get_installed_translations( $type ) { $language_data = array(); foreach ( $files as $file ) { - if ( '.' === $file[0] || is_dir( $file ) ) + if ( '.' === $file[0] || is_dir( $file ) ) { + continue; + } + if ( substr( $file, -3 ) !== '.po' ) { continue; - if ( substr( $file, -3 ) !== '.po' ) + } + if ( ! preg_match( '/(?:(.+)-)?([a-z]{2,3}(?:_[A-Z]{2})?(?:_[a-z0-9]+)?).po/', $file, $match ) ) { continue; - if ( ! preg_match( '/(?:(.+)-)?([A-Za-z_]{2,6}).po/', $file, $match ) ) + } + if ( ! in_array( substr( $file, 0, -3 ) . '.mo', $files ) ) { continue; + } list( , $textdomain, $language ) = $match; - if ( '' === $textdomain ) + if ( '' === $textdomain ) { $textdomain = 'default'; + } $language_data[ $textdomain ][ $language ] = wp_get_pomo_file_data( WP_LANG_DIR . "$dir/$file" ); } return $language_data; @@ -803,3 +934,122 @@ function wp_get_pomo_file_data( $po_file ) { } return $headers; } + +/** + * Language selector. + * + * @since 4.0.0 + * @since 4.3.0 Introduced the `echo` argument. + * + * @see get_available_languages() + * @see wp_get_available_translations() + * + * @param string|array $args { + * Optional. Array or string of arguments for outputting the language selector. + * + * @type string $id ID attribute of the select element. Default empty. + * @type string $name Name attribute of the select element. Default empty. + * @type array $languages List of installed languages, contain only the locales. + * Default empty array. + * @type array $translations List of available translations. Default result of + * wp_get_available_translations(). + * @type string $selected Language which should be selected. Default empty. + * @type bool|int $echo Whether to echo or return the generated markup. Accepts 0, 1, or their + * bool equivalents. Default 1. + * @type bool $show_available_translations Whether to show available translations. Default true. + * } + * @return string HTML content only if 'echo' argument is 0. + */ +function wp_dropdown_languages( $args = array() ) { + + $args = wp_parse_args( $args, array( + 'id' => '', + 'name' => '', + 'languages' => array(), + 'translations' => array(), + 'selected' => '', + 'echo' => 1, + 'show_available_translations' => true, + ) ); + + $translations = $args['translations']; + if ( empty( $translations ) ) { + require_once( ABSPATH . 'wp-admin/includes/translation-install.php' ); + $translations = wp_get_available_translations(); + } + + /* + * $args['languages'] should only contain the locales. Find the locale in + * $translations to get the native name. Fall back to locale. + */ + $languages = array(); + foreach ( $args['languages'] as $locale ) { + if ( isset( $translations[ $locale ] ) ) { + $translation = $translations[ $locale ]; + $languages[] = array( + 'language' => $translation['language'], + 'native_name' => $translation['native_name'], + 'lang' => current( $translation['iso'] ), + ); + + // Remove installed language from available translations. + unset( $translations[ $locale ] ); + } else { + $languages[] = array( + 'language' => $locale, + 'native_name' => $locale, + 'lang' => '', + ); + } + } + + $translations_available = ( ! empty( $translations ) && $args['show_available_translations'] ); + + $output = sprintf( ''; + + if ( $args['echo'] ) { + echo $output; + } + + return $output; +}