+
+/**
+ * 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>';
+}