wp_dropdown_languages

The timeline below displays how wordpress function wp_dropdown_languages has changed across different WordPress versions. If a version is not listed, refer to the next available version below.

WordPress Version: 6.4

/**
 * Displays or returns a Language selector.
 *
 * @since 4.0.0
 * @since 4.3.0 Introduced the `echo` argument.
 * @since 4.7.0 Introduced the `show_option_site_default` argument.
 * @since 5.1.0 Introduced the `show_option_en_us` argument.
 * @since 5.9.0 Introduced the `explicit_option_en_us` 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 'locale'.
 *     @type string   $name                         Name attribute of the select element. Default 'locale'.
 *     @type string[] $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 the generated markup. Accepts 0, 1, or their
 *                                                  boolean equivalents. Default 1.
 *     @type bool     $show_available_translations  Whether to show available translations. Default true.
 *     @type bool     $show_option_site_default     Whether to show an option to fall back to the site's locale. Default false.
 *     @type bool     $show_option_en_us            Whether to show an option for English (United States). Default true.
 *     @type bool     $explicit_option_en_us        Whether the English (United States) option uses an explicit value of en_US
 *                                                  instead of an empty value. Default false.
 * }
 * @return string HTML dropdown list of languages.
 */
function wp_dropdown_languages($args = array())
{
    $parsed_args = wp_parse_args($args, array('id' => 'locale', 'name' => 'locale', 'languages' => array(), 'translations' => array(), 'selected' => '', 'echo' => 1, 'show_available_translations' => true, 'show_option_site_default' => false, 'show_option_en_us' => true, 'explicit_option_en_us' => false));
    // Bail if no ID or no name.
    if (!$parsed_args['id'] || !$parsed_args['name']) {
        return;
    }
    // English (United States) uses an empty string for the value attribute.
    if ('en_US' === $parsed_args['selected'] && !$parsed_args['explicit_option_en_us']) {
        $parsed_args['selected'] = '';
    }
    $translations = $parsed_args['translations'];
    if (empty($translations)) {
        require_once ABSPATH . 'wp-admin/includes/translation-install.php';
        $translations = wp_get_available_translations();
    }
    /*
     * $parsed_args['languages'] should only contain the locales. Find the locale in
     * $translations to get the native name. Fall back to locale.
     */
    $languages = array();
    foreach ($parsed_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) && $parsed_args['show_available_translations'];
    // Holds the HTML markup.
    $structure = array();
    // List installed languages.
    if ($translations_available) {
        $structure[] = '<optgroup label="' . esc_attr_x('Installed', 'translations') . '">';
    }
    // Site default.
    if ($parsed_args['show_option_site_default']) {
        $structure[] = sprintf('<option value="site-default" data-installed="1"%s>%s</option>', selected('site-default', $parsed_args['selected'], false), _x('Site Default', 'default site language'));
    }
    if ($parsed_args['show_option_en_us']) {
        $value = $parsed_args['explicit_option_en_us'] ? 'en_US' : '';
        $structure[] = sprintf('<option value="%s" lang="en" data-installed="1"%s>English (United States)</option>', esc_attr($value), selected('', $parsed_args['selected'], false));
    }
    // List installed languages.
    foreach ($languages as $language) {
        $structure[] = sprintf('<option value="%s" lang="%s"%s data-installed="1">%s</option>', esc_attr($language['language']), esc_attr($language['lang']), selected($language['language'], $parsed_args['selected'], false), esc_html($language['native_name']));
    }
    if ($translations_available) {
        $structure[] = '</optgroup>';
    }
    // List available translations.
    if ($translations_available) {
        $structure[] = '<optgroup label="' . esc_attr_x('Available', 'translations') . '">';
        foreach ($translations as $translation) {
            $structure[] = sprintf('<option value="%s" lang="%s"%s>%s</option>', esc_attr($translation['language']), esc_attr(current($translation['iso'])), selected($translation['language'], $parsed_args['selected'], false), esc_html($translation['native_name']));
        }
        $structure[] = '</optgroup>';
    }
    // Combine the output string.
    $output = sprintf('<select name="%s" id="%s">', esc_attr($parsed_args['name']), esc_attr($parsed_args['id']));
    $output .= implode("\n", $structure);
    $output .= '</select>';
    if ($parsed_args['echo']) {
        echo $output;
    }
    return $output;
}

WordPress Version: 6.1

/**
 * Displays or returns a Language selector.
 *
 * @since 4.0.0
 * @since 4.3.0 Introduced the `echo` argument.
 * @since 4.7.0 Introduced the `show_option_site_default` argument.
 * @since 5.1.0 Introduced the `show_option_en_us` argument.
 * @since 5.9.0 Introduced the `explicit_option_en_us` 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 'locale'.
 *     @type string   $name                         Name attribute of the select element. Default 'locale'.
 *     @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 the generated markup. Accepts 0, 1, or their
 *                                                  boolean equivalents. Default 1.
 *     @type bool     $show_available_translations  Whether to show available translations. Default true.
 *     @type bool     $show_option_site_default     Whether to show an option to fall back to the site's locale. Default false.
 *     @type bool     $show_option_en_us            Whether to show an option for English (United States). Default true.
 *     @type bool     $explicit_option_en_us        Whether the English (United States) option uses an explicit value of en_US
 *                                                  instead of an empty value. Default false.
 * }
 * @return string HTML dropdown list of languages.
 */
function wp_dropdown_languages($args = array())
{
    $parsed_args = wp_parse_args($args, array('id' => 'locale', 'name' => 'locale', 'languages' => array(), 'translations' => array(), 'selected' => '', 'echo' => 1, 'show_available_translations' => true, 'show_option_site_default' => false, 'show_option_en_us' => true, 'explicit_option_en_us' => false));
    // Bail if no ID or no name.
    if (!$parsed_args['id'] || !$parsed_args['name']) {
        return;
    }
    // English (United States) uses an empty string for the value attribute.
    if ('en_US' === $parsed_args['selected'] && !$parsed_args['explicit_option_en_us']) {
        $parsed_args['selected'] = '';
    }
    $translations = $parsed_args['translations'];
    if (empty($translations)) {
        require_once ABSPATH . 'wp-admin/includes/translation-install.php';
        $translations = wp_get_available_translations();
    }
    /*
     * $parsed_args['languages'] should only contain the locales. Find the locale in
     * $translations to get the native name. Fall back to locale.
     */
    $languages = array();
    foreach ($parsed_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) && $parsed_args['show_available_translations'];
    // Holds the HTML markup.
    $structure = array();
    // List installed languages.
    if ($translations_available) {
        $structure[] = '<optgroup label="' . esc_attr_x('Installed', 'translations') . '">';
    }
    // Site default.
    if ($parsed_args['show_option_site_default']) {
        $structure[] = sprintf('<option value="site-default" data-installed="1"%s>%s</option>', selected('site-default', $parsed_args['selected'], false), _x('Site Default', 'default site language'));
    }
    if ($parsed_args['show_option_en_us']) {
        $value = $parsed_args['explicit_option_en_us'] ? 'en_US' : '';
        $structure[] = sprintf('<option value="%s" lang="en" data-installed="1"%s>English (United States)</option>', esc_attr($value), selected('', $parsed_args['selected'], false));
    }
    // List installed languages.
    foreach ($languages as $language) {
        $structure[] = sprintf('<option value="%s" lang="%s"%s data-installed="1">%s</option>', esc_attr($language['language']), esc_attr($language['lang']), selected($language['language'], $parsed_args['selected'], false), esc_html($language['native_name']));
    }
    if ($translations_available) {
        $structure[] = '</optgroup>';
    }
    // List available translations.
    if ($translations_available) {
        $structure[] = '<optgroup label="' . esc_attr_x('Available', 'translations') . '">';
        foreach ($translations as $translation) {
            $structure[] = sprintf('<option value="%s" lang="%s"%s>%s</option>', esc_attr($translation['language']), esc_attr(current($translation['iso'])), selected($translation['language'], $parsed_args['selected'], false), esc_html($translation['native_name']));
        }
        $structure[] = '</optgroup>';
    }
    // Combine the output string.
    $output = sprintf('<select name="%s" id="%s">', esc_attr($parsed_args['name']), esc_attr($parsed_args['id']));
    $output .= implode("\n", $structure);
    $output .= '</select>';
    if ($parsed_args['echo']) {
        echo $output;
    }
    return $output;
}

WordPress Version: 5.9

/**
 * Language selector.
 *
 * @since 4.0.0
 * @since 4.3.0 Introduced the `echo` argument.
 * @since 4.7.0 Introduced the `show_option_site_default` argument.
 * @since 5.1.0 Introduced the `show_option_en_us` argument.
 * @since 5.9.0 Introduced the `explicit_option_en_us` 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 'locale'.
 *     @type string   $name                         Name attribute of the select element. Default 'locale'.
 *     @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 the generated markup. Accepts 0, 1, or their
 *                                                  boolean equivalents. Default 1.
 *     @type bool     $show_available_translations  Whether to show available translations. Default true.
 *     @type bool     $show_option_site_default     Whether to show an option to fall back to the site's locale. Default false.
 *     @type bool     $show_option_en_us            Whether to show an option for English (United States). Default true.
 *     @type bool     $explicit_option_en_us        Whether the English (United States) option uses an explicit value of en_US
 *                                                  instead of an empty value. Default false.
 * }
 * @return string HTML dropdown list of languages.
 */
function wp_dropdown_languages($args = array())
{
    $parsed_args = wp_parse_args($args, array('id' => 'locale', 'name' => 'locale', 'languages' => array(), 'translations' => array(), 'selected' => '', 'echo' => 1, 'show_available_translations' => true, 'show_option_site_default' => false, 'show_option_en_us' => true, 'explicit_option_en_us' => false));
    // Bail if no ID or no name.
    if (!$parsed_args['id'] || !$parsed_args['name']) {
        return;
    }
    // English (United States) uses an empty string for the value attribute.
    if ('en_US' === $parsed_args['selected'] && !$parsed_args['explicit_option_en_us']) {
        $parsed_args['selected'] = '';
    }
    $translations = $parsed_args['translations'];
    if (empty($translations)) {
        require_once ABSPATH . 'wp-admin/includes/translation-install.php';
        $translations = wp_get_available_translations();
    }
    /*
     * $parsed_args['languages'] should only contain the locales. Find the locale in
     * $translations to get the native name. Fall back to locale.
     */
    $languages = array();
    foreach ($parsed_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) && $parsed_args['show_available_translations'];
    // Holds the HTML markup.
    $structure = array();
    // List installed languages.
    if ($translations_available) {
        $structure[] = '<optgroup label="' . esc_attr_x('Installed', 'translations') . '">';
    }
    // Site default.
    if ($parsed_args['show_option_site_default']) {
        $structure[] = sprintf('<option value="site-default" data-installed="1"%s>%s</option>', selected('site-default', $parsed_args['selected'], false), _x('Site Default', 'default site language'));
    }
    if ($parsed_args['show_option_en_us']) {
        $value = $parsed_args['explicit_option_en_us'] ? 'en_US' : '';
        $structure[] = sprintf('<option value="%s" lang="en" data-installed="1"%s>English (United States)</option>', esc_attr($value), selected('', $parsed_args['selected'], false));
    }
    // List installed languages.
    foreach ($languages as $language) {
        $structure[] = sprintf('<option value="%s" lang="%s"%s data-installed="1">%s</option>', esc_attr($language['language']), esc_attr($language['lang']), selected($language['language'], $parsed_args['selected'], false), esc_html($language['native_name']));
    }
    if ($translations_available) {
        $structure[] = '</optgroup>';
    }
    // List available translations.
    if ($translations_available) {
        $structure[] = '<optgroup label="' . esc_attr_x('Available', 'translations') . '">';
        foreach ($translations as $translation) {
            $structure[] = sprintf('<option value="%s" lang="%s"%s>%s</option>', esc_attr($translation['language']), esc_attr(current($translation['iso'])), selected($translation['language'], $parsed_args['selected'], false), esc_html($translation['native_name']));
        }
        $structure[] = '</optgroup>';
    }
    // Combine the output string.
    $output = sprintf('<select name="%s" id="%s">', esc_attr($parsed_args['name']), esc_attr($parsed_args['id']));
    $output .= implode("\n", $structure);
    $output .= '</select>';
    if ($parsed_args['echo']) {
        echo $output;
    }
    return $output;
}

WordPress Version: 5.6

/**
 * Language selector.
 *
 * @since 4.0.0
 * @since 4.3.0 Introduced the `echo` argument.
 * @since 4.7.0 Introduced the `show_option_site_default` argument.
 * @since 5.1.0 Introduced the `show_option_en_us` 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 'locale'.
 *     @type string   $name                         Name attribute of the select element. Default 'locale'.
 *     @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 the generated markup. Accepts 0, 1, or their
 *                                                  boolean equivalents. Default 1.
 *     @type bool     $show_available_translations  Whether to show available translations. Default true.
 *     @type bool     $show_option_site_default     Whether to show an option to fall back to the site's locale. Default false.
 *     @type bool     $show_option_en_us            Whether to show an option for English (United States). Default true.
 * }
 * @return string HTML dropdown list of languages.
 */
function wp_dropdown_languages($args = array())
{
    $parsed_args = wp_parse_args($args, array('id' => 'locale', 'name' => 'locale', 'languages' => array(), 'translations' => array(), 'selected' => '', 'echo' => 1, 'show_available_translations' => true, 'show_option_site_default' => false, 'show_option_en_us' => true));
    // Bail if no ID or no name.
    if (!$parsed_args['id'] || !$parsed_args['name']) {
        return;
    }
    // English (United States) uses an empty string for the value attribute.
    if ('en_US' === $parsed_args['selected']) {
        $parsed_args['selected'] = '';
    }
    $translations = $parsed_args['translations'];
    if (empty($translations)) {
        require_once ABSPATH . 'wp-admin/includes/translation-install.php';
        $translations = wp_get_available_translations();
    }
    /*
     * $parsed_args['languages'] should only contain the locales. Find the locale in
     * $translations to get the native name. Fall back to locale.
     */
    $languages = array();
    foreach ($parsed_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) && $parsed_args['show_available_translations'];
    // Holds the HTML markup.
    $structure = array();
    // List installed languages.
    if ($translations_available) {
        $structure[] = '<optgroup label="' . esc_attr_x('Installed', 'translations') . '">';
    }
    // Site default.
    if ($parsed_args['show_option_site_default']) {
        $structure[] = sprintf('<option value="site-default" data-installed="1"%s>%s</option>', selected('site-default', $parsed_args['selected'], false), _x('Site Default', 'default site language'));
    }
    if ($parsed_args['show_option_en_us']) {
        $structure[] = sprintf('<option value="" lang="en" data-installed="1"%s>English (United States)</option>', selected('', $parsed_args['selected'], false));
    }
    // List installed languages.
    foreach ($languages as $language) {
        $structure[] = sprintf('<option value="%s" lang="%s"%s data-installed="1">%s</option>', esc_attr($language['language']), esc_attr($language['lang']), selected($language['language'], $parsed_args['selected'], false), esc_html($language['native_name']));
    }
    if ($translations_available) {
        $structure[] = '</optgroup>';
    }
    // List available translations.
    if ($translations_available) {
        $structure[] = '<optgroup label="' . esc_attr_x('Available', 'translations') . '">';
        foreach ($translations as $translation) {
            $structure[] = sprintf('<option value="%s" lang="%s"%s>%s</option>', esc_attr($translation['language']), esc_attr(current($translation['iso'])), selected($translation['language'], $parsed_args['selected'], false), esc_html($translation['native_name']));
        }
        $structure[] = '</optgroup>';
    }
    // Combine the output string.
    $output = sprintf('<select name="%s" id="%s">', esc_attr($parsed_args['name']), esc_attr($parsed_args['id']));
    $output .= implode("\n", $structure);
    $output .= '</select>';
    if ($parsed_args['echo']) {
        echo $output;
    }
    return $output;
}

WordPress Version: 5.4

/**
 * Language selector.
 *
 * @since 4.0.0
 * @since 4.3.0 Introduced the `echo` argument.
 * @since 4.7.0 Introduced the `show_option_site_default` argument.
 * @since 5.1.0 Introduced the `show_option_en_us` 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 'locale'.
 *     @type string   $name                         Name attribute of the select element. Default 'locale'.
 *     @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 the generated markup. Accepts 0, 1, or their
 *                                                  boolean equivalents. Default 1.
 *     @type bool     $show_available_translations  Whether to show available translations. Default true.
 *     @type bool     $show_option_site_default     Whether to show an option to fall back to the site's locale. Default false.
 *     @type bool     $show_option_en_us            Whether to show an option for English (United States). Default true.
 * }
 * @return string HTML dropdown list of languages.
 */
function wp_dropdown_languages($args = array())
{
    $parsed_args = wp_parse_args($args, array('id' => 'locale', 'name' => 'locale', 'languages' => array(), 'translations' => array(), 'selected' => '', 'echo' => 1, 'show_available_translations' => true, 'show_option_site_default' => false, 'show_option_en_us' => true));
    // Bail if no ID or no name.
    if (!$parsed_args['id'] || !$parsed_args['name']) {
        return;
    }
    // English (United States) uses an empty string for the value attribute.
    if ('en_US' === $parsed_args['selected']) {
        $parsed_args['selected'] = '';
    }
    $translations = $parsed_args['translations'];
    if (empty($translations)) {
        require_once ABSPATH . 'wp-admin/includes/translation-install.php';
        $translations = wp_get_available_translations();
    }
    /*
     * $parsed_args['languages'] should only contain the locales. Find the locale in
     * $translations to get the native name. Fall back to locale.
     */
    $languages = array();
    foreach ($parsed_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) && $parsed_args['show_available_translations'];
    // Holds the HTML markup.
    $structure = array();
    // List installed languages.
    if ($translations_available) {
        $structure[] = '<optgroup label="' . esc_attr_x('Installed', 'translations') . '">';
    }
    // Site default.
    if ($parsed_args['show_option_site_default']) {
        $structure[] = sprintf('<option value="site-default" data-installed="1"%s>%s</option>', selected('site-default', $parsed_args['selected'], false), _x('Site Default', 'default site language'));
    }
    if ($parsed_args['show_option_en_us']) {
        $structure[] = sprintf('<option value="" lang="en" data-installed="1"%s>English (United States)</option>', selected('', $parsed_args['selected'], false));
    }
    // List installed languages.
    foreach ($languages as $language) {
        $structure[] = sprintf('<option value="%s" lang="%s"%s data-installed="1">%s</option>', esc_attr($language['language']), esc_attr($language['lang']), selected($language['language'], $parsed_args['selected'], false), esc_html($language['native_name']));
    }
    if ($translations_available) {
        $structure[] = '</optgroup>';
    }
    // List available translations.
    if ($translations_available) {
        $structure[] = '<optgroup label="' . esc_attr_x('Available', 'translations') . '">';
        foreach ($translations as $translation) {
            $structure[] = sprintf('<option value="%s" lang="%s"%s>%s</option>', esc_attr($translation['language']), esc_attr(current($translation['iso'])), selected($translation['language'], $parsed_args['selected'], false), esc_html($translation['native_name']));
        }
        $structure[] = '</optgroup>';
    }
    // Combine the output string.
    $output = sprintf('<select name="%s" id="%s">', esc_attr($parsed_args['name']), esc_attr($parsed_args['id']));
    $output .= join("\n", $structure);
    $output .= '</select>';
    if ($parsed_args['echo']) {
        echo $output;
    }
    return $output;
}

WordPress Version: 5.1

/**
 * Language selector.
 *
 * @since 4.0.0
 * @since 4.3.0 Introduced the `echo` argument.
 * @since 4.7.0 Introduced the `show_option_site_default` argument.
 * @since 5.1.0 Introduced the `show_option_en_us` 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 'locale'.
 *     @type string   $name                         Name attribute of the select element. Default 'locale'.
 *     @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 the generated markup. Accepts 0, 1, or their
 *                                                  boolean equivalents. Default 1.
 *     @type bool     $show_available_translations  Whether to show available translations. Default true.
 *     @type bool     $show_option_site_default     Whether to show an option to fall back to the site's locale. Default false.
 *     @type bool     $show_option_en_us            Whether to show an option for English (United States). Default true.
 * }
 * @return string HTML content
 */
function wp_dropdown_languages($args = array())
{
    $parsed_args = wp_parse_args($args, array('id' => 'locale', 'name' => 'locale', 'languages' => array(), 'translations' => array(), 'selected' => '', 'echo' => 1, 'show_available_translations' => true, 'show_option_site_default' => false, 'show_option_en_us' => true));
    // Bail if no ID or no name.
    if (!$parsed_args['id'] || !$parsed_args['name']) {
        return;
    }
    // English (United States) uses an empty string for the value attribute.
    if ('en_US' === $parsed_args['selected']) {
        $parsed_args['selected'] = '';
    }
    $translations = $parsed_args['translations'];
    if (empty($translations)) {
        require_once ABSPATH . 'wp-admin/includes/translation-install.php';
        $translations = wp_get_available_translations();
    }
    /*
     * $parsed_args['languages'] should only contain the locales. Find the locale in
     * $translations to get the native name. Fall back to locale.
     */
    $languages = array();
    foreach ($parsed_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) && $parsed_args['show_available_translations'];
    // Holds the HTML markup.
    $structure = array();
    // List installed languages.
    if ($translations_available) {
        $structure[] = '<optgroup label="' . esc_attr_x('Installed', 'translations') . '">';
    }
    // Site default.
    if ($parsed_args['show_option_site_default']) {
        $structure[] = sprintf('<option value="site-default" data-installed="1"%s>%s</option>', selected('site-default', $parsed_args['selected'], false), _x('Site Default', 'default site language'));
    }
    if ($parsed_args['show_option_en_us']) {
        $structure[] = sprintf('<option value="" lang="en" data-installed="1"%s>English (United States)</option>', selected('', $parsed_args['selected'], false));
    }
    // List installed languages.
    foreach ($languages as $language) {
        $structure[] = sprintf('<option value="%s" lang="%s"%s data-installed="1">%s</option>', esc_attr($language['language']), esc_attr($language['lang']), selected($language['language'], $parsed_args['selected'], false), esc_html($language['native_name']));
    }
    if ($translations_available) {
        $structure[] = '</optgroup>';
    }
    // List available translations.
    if ($translations_available) {
        $structure[] = '<optgroup label="' . esc_attr_x('Available', 'translations') . '">';
        foreach ($translations as $translation) {
            $structure[] = sprintf('<option value="%s" lang="%s"%s>%s</option>', esc_attr($translation['language']), esc_attr(current($translation['iso'])), selected($translation['language'], $parsed_args['selected'], false), esc_html($translation['native_name']));
        }
        $structure[] = '</optgroup>';
    }
    // Combine the output string.
    $output = sprintf('<select name="%s" id="%s">', esc_attr($parsed_args['name']), esc_attr($parsed_args['id']));
    $output .= join("\n", $structure);
    $output .= '</select>';
    if ($parsed_args['echo']) {
        echo $output;
    }
    return $output;
}

WordPress Version: 5.0

/**
 * Language selector.
 *
 * @since 4.0.0
 * @since 4.3.0 Introduced the `echo` argument.
 * @since 4.7.0 Introduced the `show_option_site_default` 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 'locale'.
 *     @type string   $name                         Name attribute of the select element. Default 'locale'.
 *     @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 the generated markup. Accepts 0, 1, or their
 *                                                  boolean equivalents. Default 1.
 *     @type bool     $show_available_translations  Whether to show available translations. Default true.
 *     @type bool     $show_option_site_default     Whether to show an option to fall back to the site's locale. Default false.
 * }
 * @return string HTML content
 */
function wp_dropdown_languages($args = array())
{
    $parsed_args = wp_parse_args($args, array('id' => 'locale', 'name' => 'locale', 'languages' => array(), 'translations' => array(), 'selected' => '', 'echo' => 1, 'show_available_translations' => true, 'show_option_site_default' => false));
    // Bail if no ID or no name.
    if (!$parsed_args['id'] || !$parsed_args['name']) {
        return;
    }
    // English (United States) uses an empty string for the value attribute.
    if ('en_US' === $parsed_args['selected']) {
        $parsed_args['selected'] = '';
    }
    $translations = $parsed_args['translations'];
    if (empty($translations)) {
        require_once ABSPATH . 'wp-admin/includes/translation-install.php';
        $translations = wp_get_available_translations();
    }
    /*
     * $parsed_args['languages'] should only contain the locales. Find the locale in
     * $translations to get the native name. Fall back to locale.
     */
    $languages = array();
    foreach ($parsed_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) && $parsed_args['show_available_translations'];
    // Holds the HTML markup.
    $structure = array();
    // List installed languages.
    if ($translations_available) {
        $structure[] = '<optgroup label="' . esc_attr_x('Installed', 'translations') . '">';
    }
    // Site default.
    if ($parsed_args['show_option_site_default']) {
        $structure[] = sprintf('<option value="site-default" data-installed="1"%s>%s</option>', selected('site-default', $parsed_args['selected'], false), _x('Site Default', 'default site language'));
    }
    // Always show English.
    $structure[] = sprintf('<option value="" lang="en" data-installed="1"%s>English (United States)</option>', selected('', $parsed_args['selected'], false));
    // List installed languages.
    foreach ($languages as $language) {
        $structure[] = sprintf('<option value="%s" lang="%s"%s data-installed="1">%s</option>', esc_attr($language['language']), esc_attr($language['lang']), selected($language['language'], $parsed_args['selected'], false), esc_html($language['native_name']));
    }
    if ($translations_available) {
        $structure[] = '</optgroup>';
    }
    // List available translations.
    if ($translations_available) {
        $structure[] = '<optgroup label="' . esc_attr_x('Available', 'translations') . '">';
        foreach ($translations as $translation) {
            $structure[] = sprintf('<option value="%s" lang="%s"%s>%s</option>', esc_attr($translation['language']), esc_attr(current($translation['iso'])), selected($translation['language'], $parsed_args['selected'], false), esc_html($translation['native_name']));
        }
        $structure[] = '</optgroup>';
    }
    // Combine the output string.
    $output = sprintf('<select name="%s" id="%s">', esc_attr($parsed_args['name']), esc_attr($parsed_args['id']));
    $output .= join("\n", $structure);
    $output .= '</select>';
    if ($parsed_args['echo']) {
        echo $output;
    }
    return $output;
}

WordPress Version: 4.9

/**
 * Language selector.
 *
 * @since 4.0.0
 * @since 4.3.0 Introduced the `echo` argument.
 * @since 4.7.0 Introduced the `show_option_site_default` 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 'locale'.
 *     @type string   $name                         Name attribute of the select element. Default 'locale'.
 *     @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 the generated markup. Accepts 0, 1, or their
 *                                                  boolean equivalents. Default 1.
 *     @type bool     $show_available_translations  Whether to show available translations. Default true.
 *     @type bool     $show_option_site_default     Whether to show an option to fall back to the site's locale. Default false.
 * }
 * @return string HTML content
 */
function wp_dropdown_languages($args = array())
{
    $parsed_args = wp_parse_args($args, array('id' => 'locale', 'name' => 'locale', 'languages' => array(), 'translations' => array(), 'selected' => '', 'echo' => 1, 'show_available_translations' => true, 'show_option_site_default' => false));
    // Bail if no ID or no name.
    if (!$parsed_args['id'] || !$parsed_args['name']) {
        return;
    }
    // English (United States) uses an empty string for the value attribute.
    if ('en_US' === $parsed_args['selected']) {
        $parsed_args['selected'] = '';
    }
    $translations = $parsed_args['translations'];
    if (empty($translations)) {
        require_once ABSPATH . 'wp-admin/includes/translation-install.php';
        $translations = wp_get_available_translations();
    }
    /*
     * $parsed_args['languages'] should only contain the locales. Find the locale in
     * $translations to get the native name. Fall back to locale.
     */
    $languages = array();
    foreach ($parsed_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) && $parsed_args['show_available_translations'];
    // Holds the HTML markup.
    $structure = array();
    // List installed languages.
    if ($translations_available) {
        $structure[] = '<optgroup label="' . esc_attr_x('Installed', 'translations') . '">';
    }
    // Site default.
    if ($parsed_args['show_option_site_default']) {
        $structure[] = sprintf('<option value="site-default" data-installed="1"%s>%s</option>', selected('site-default', $parsed_args['selected'], false), _x('Site Default', 'default site language'));
    }
    // Always show English.
    $structure[] = sprintf('<option value="" lang="en" data-installed="1"%s>English (United States)</option>', selected('', $parsed_args['selected'], false));
    // List installed languages. 
    foreach ($languages as $language) {
        $structure[] = sprintf('<option value="%s" lang="%s"%s data-installed="1">%s</option>', esc_attr($language['language']), esc_attr($language['lang']), selected($language['language'], $parsed_args['selected'], false), esc_html($language['native_name']));
    }
    if ($translations_available) {
        $structure[] = '</optgroup>';
    }
    // List available translations.
    if ($translations_available) {
        $structure[] = '<optgroup label="' . esc_attr_x('Available', 'translations') . '">';
        foreach ($translations as $translation) {
            $structure[] = sprintf('<option value="%s" lang="%s"%s>%s</option>', esc_attr($translation['language']), esc_attr(current($translation['iso'])), selected($translation['language'], $parsed_args['selected'], false), esc_html($translation['native_name']));
        }
        $structure[] = '</optgroup>';
    }
    // Combine the output string.
    $output = sprintf('<select name="%s" id="%s">', esc_attr($parsed_args['name']), esc_attr($parsed_args['id']));
    $output .= join("\n", $structure);
    $output .= '</select>';
    if ($parsed_args['echo']) {
        echo $output;
    }
    return $output;
}

WordPress Version: 4.7

/**
 * Language selector.
 *
 * @since 4.0.0
 * @since 4.3.0 Introduced the `echo` argument.
 * @since 4.7.0 Introduced the `show_option_site_default` 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 the generated markup. Accepts 0, 1, or their
 *                                                  boolean equivalents. Default 1.
 *     @type bool     $show_available_translations  Whether to show available translations. Default true.
 *     @type bool     $show_option_site_default     Whether to show an option to fall back to the site's locale. Default false.
 * }
 * @return string HTML content
 */
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, 'show_option_site_default' => false));
    // English (United States) uses an empty string for the value attribute.
    if ('en_US' === $args['selected']) {
        $args['selected'] = '';
    }
    $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('<select name="%s" id="%s">', esc_attr($args['name']), esc_attr($args['id']));
    // Holds the HTML markup.
    $structure = array();
    // List installed languages.
    if ($translations_available) {
        $structure[] = '<optgroup label="' . esc_attr_x('Installed', 'translations') . '">';
    }
    if ($args['show_option_site_default']) {
        $structure[] = sprintf('<option value="site-default" data-installed="1"%s>%s</option>', selected('site-default', $args['selected'], false), _x('Site Default', 'default site language'));
    }
    $structure[] = sprintf('<option value="" lang="en" data-installed="1"%s>English (United States)</option>', selected('', $args['selected'], false));
    foreach ($languages as $language) {
        $structure[] = sprintf('<option value="%s" lang="%s"%s data-installed="1">%s</option>', esc_attr($language['language']), esc_attr($language['lang']), selected($language['language'], $args['selected'], false), esc_html($language['native_name']));
    }
    if ($translations_available) {
        $structure[] = '</optgroup>';
    }
    // List available translations.
    if ($translations_available) {
        $structure[] = '<optgroup label="' . esc_attr_x('Available', 'translations') . '">';
        foreach ($translations as $translation) {
            $structure[] = sprintf('<option value="%s" lang="%s"%s>%s</option>', esc_attr($translation['language']), esc_attr(current($translation['iso'])), selected($translation['language'], $args['selected'], false), esc_html($translation['native_name']));
        }
        $structure[] = '</optgroup>';
    }
    $output .= join("\n", $structure);
    $output .= '</select>';
    if ($args['echo']) {
        echo $output;
    }
    return $output;
}

WordPress Version: 4.5

/**
 * 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 the generated markup. Accepts 0, 1, or their
 *                                                  boolean equivalents. Default 1.
 *     @type bool     $show_available_translations  Whether to show available translations. Default true.
 * }
 * @return string HTML content
 */
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('<select name="%s" id="%s">', esc_attr($args['name']), esc_attr($args['id']));
    // Holds the HTML markup.
    $structure = array();
    // List installed languages.
    if ($translations_available) {
        $structure[] = '<optgroup label="' . esc_attr_x('Installed', 'translations') . '">';
    }
    $structure[] = '<option value="" lang="en" data-installed="1">English (United States)</option>';
    foreach ($languages as $language) {
        $structure[] = sprintf('<option value="%s" lang="%s"%s data-installed="1">%s</option>', esc_attr($language['language']), esc_attr($language['lang']), selected($language['language'], $args['selected'], false), esc_html($language['native_name']));
    }
    if ($translations_available) {
        $structure[] = '</optgroup>';
    }
    // List available translations.
    if ($translations_available) {
        $structure[] = '<optgroup label="' . esc_attr_x('Available', 'translations') . '">';
        foreach ($translations as $translation) {
            $structure[] = sprintf('<option value="%s" lang="%s"%s>%s</option>', esc_attr($translation['language']), esc_attr(current($translation['iso'])), selected($translation['language'], $args['selected'], false), esc_html($translation['native_name']));
        }
        $structure[] = '</optgroup>';
    }
    $output .= join("\n", $structure);
    $output .= '</select>';
    if ($args['echo']) {
        echo $output;
    }
    return $output;
}

WordPress Version: 4.3

/**
 * 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('<select name="%s" id="%s">', esc_attr($args['name']), esc_attr($args['id']));
    // Holds the HTML markup.
    $structure = array();
    // List installed languages.
    if ($translations_available) {
        $structure[] = '<optgroup label="' . esc_attr_x('Installed', 'translations') . '">';
    }
    $structure[] = '<option value="" lang="en" data-installed="1">English (United States)</option>';
    foreach ($languages as $language) {
        $structure[] = sprintf('<option value="%s" lang="%s"%s data-installed="1">%s</option>', esc_attr($language['language']), esc_attr($language['lang']), selected($language['language'], $args['selected'], false), esc_html($language['native_name']));
    }
    if ($translations_available) {
        $structure[] = '</optgroup>';
    }
    // List available translations.
    if ($translations_available) {
        $structure[] = '<optgroup label="' . esc_attr_x('Available', 'translations') . '">';
        foreach ($translations as $translation) {
            $structure[] = sprintf('<option value="%s" lang="%s"%s>%s</option>', esc_attr($translation['language']), esc_attr(current($translation['iso'])), selected($translation['language'], $args['selected'], false), esc_html($translation['native_name']));
        }
        $structure[] = '</optgroup>';
    }
    $output .= join("\n", $structure);
    $output .= '</select>';
    if ($args['echo']) {
        echo $output;
    }
    return $output;
}

WordPress Version: 4.2

/**
 * Language selector.
 *
 * @since 4.0.0
 *
 * @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
 *                                                 {@see wp_get_available_translations()}.
 *     @type string  $selected                     Language which should be selected. Default empty.
 *     @type bool    $show_available_translations  Whether to show available translations. Default true.
 * }
 */
function wp_dropdown_languages($args = array())
{
    $args = wp_parse_args($args, array('id' => '', 'name' => '', 'languages' => array(), 'translations' => array(), 'selected' => '', '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'];
    printf('<select name="%s" id="%s">', esc_attr($args['name']), esc_attr($args['id']));
    // Holds the HTML markup.
    $structure = array();
    // List installed languages.
    if ($translations_available) {
        $structure[] = '<optgroup label="' . esc_attr_x('Installed', 'translations') . '">';
    }
    $structure[] = '<option value="" lang="en" data-installed="1">English (United States)</option>';
    foreach ($languages as $language) {
        $structure[] = sprintf('<option value="%s" lang="%s"%s data-installed="1">%s</option>', esc_attr($language['language']), esc_attr($language['lang']), selected($language['language'], $args['selected'], false), esc_html($language['native_name']));
    }
    if ($translations_available) {
        $structure[] = '</optgroup>';
    }
    // List available translations.
    if ($translations_available) {
        $structure[] = '<optgroup label="' . esc_attr_x('Available', 'translations') . '">';
        foreach ($translations as $translation) {
            $structure[] = sprintf('<option value="%s" lang="%s"%s>%s</option>', esc_attr($translation['language']), esc_attr(current($translation['iso'])), selected($translation['language'], $args['selected'], false), esc_html($translation['native_name']));
        }
        $structure[] = '</optgroup>';
    }
    echo join("\n", $structure);
    echo '</select>';
}

WordPress Version: 4.1

/**
 * Language selector.
 *
 * @since 4.0.0
 *
 * @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
 *                                                 {@see wp_get_available_translations()}.
 *     @type string  $selected                     Language which should be selected. Default empty.
 *     @type bool    $show_available_translations  Whether to show available translations. Default true.
 * }
 */
function wp_dropdown_languages($args = array())
{
    $args = wp_parse_args($args, array('id' => '', 'name' => '', 'languages' => array(), 'translations' => array(), 'selected' => '', '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' => $translation['iso'][1]);
            // 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'];
    printf('<select name="%s" id="%s">', esc_attr($args['name']), esc_attr($args['id']));
    // Holds the HTML markup.
    $structure = array();
    // List installed languages.
    if ($translations_available) {
        $structure[] = '<optgroup label="' . esc_attr_x('Installed', 'translations') . '">';
    }
    $structure[] = '<option value="" lang="en" data-installed="1">English (United States)</option>';
    foreach ($languages as $language) {
        $structure[] = sprintf('<option value="%s" lang="%s"%s data-installed="1">%s</option>', esc_attr($language['language']), esc_attr($language['lang']), selected($language['language'], $args['selected'], false), esc_html($language['native_name']));
    }
    if ($translations_available) {
        $structure[] = '</optgroup>';
    }
    // List available translations.
    if ($translations_available) {
        $structure[] = '<optgroup label="' . esc_attr_x('Available', 'translations') . '">';
        foreach ($translations as $translation) {
            $structure[] = sprintf('<option value="%s" lang="%s"%s>%s</option>', esc_attr($translation['language']), esc_attr($translation['iso'][1]), selected($translation['language'], $args['selected'], false), esc_html($translation['native_name']));
        }
        $structure[] = '</optgroup>';
    }
    echo join("\n", $structure);
    echo '</select>';
}

WordPress Version: 4.0

/**
 * Language selector.
 *
 * @since 4.0.0
 *
 * @see get_available_languages()
 * @see wp_get_available_translations()
 *
 * @param array $args Optional arguments. Default empty array.
 */
function wp_dropdown_languages($args = array())
{
    require_once ABSPATH . 'wp-admin/includes/translation-install.php';
    $args = wp_parse_args($args, array('id' => '', 'name' => '', 'languages' => array(), 'selected' => ''));
    if (empty($args['languages'])) {
        return false;
    }
    $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' => $translation['iso'][1]);
        } else {
            $languages[] = array('language' => $locale, 'native_name' => $locale, 'lang' => '');
        }
    }
    printf('<select name="%s" id="%s">', esc_attr($args['name']), esc_attr($args['id']));
    // List installed languages.
    echo '<option value="" lang="en">English (United States)</option>';
    foreach ($languages as $language) {
        $selected = selected($language['language'], $args['selected'], false);
        printf('<option value="%s" lang="%s"%s>%s</option>', esc_attr($language['language']), esc_attr($language['lang']), $selected, esc_html($language['native_name']));
    }
    echo '</select>';
}