¿Configurar el lenguaje de WordPress mediante programación?

4 minutos de lectura

Tengo un sitio web basado en usuarios con WordPress y desde la configuración de su perfil pueden seleccionar el idioma, esta información y otras configuraciones se establecen para cada usuario en user_meta.

Sé cómo traducir pero, ¿hay alguna forma de configurar el idioma del tema mediante programación?

¡Gracias!

Editar: No hay complementos, por favor, necesito hacer esto lo más simple posible.

avatar de usuario
Kris

Desde WP 4.7 puedes usar:

switch_to_locale('en_US');

Referencia: https://developer.wordpress.org/reference/functions/switch_to_locale/

  • ¿Dónde se debe usar esto? Lo puse en el gancho ‘init’ pero no funciona (funcionó un par de veces en realidad y luego se detuvo, por extraño que parezca)

    – gilad905

    8 de julio a las 14:36

avatar de usuario
Vlad.P

Encontré una solución diferente:

// Set user selected language by loading the lang.mo file
if ( is_user_logged_in() ) {

    // add local filter
    add_filter('locale', 'language');

    function language($locale) {
        /* Note: user_meta and user_info are two functions made by me,
           user_info will grab the current user ID and use it for
           grabbing user_meta */

        // grab user_meta "lang" value
        $lang = user_meta(user_info('ID', false), 'lang', false); 

        // if user_meta lang is not empty
        if ( !empty($lang) ) {
           $locale = $lang; /* set locale to lang */
        }

        return $locale; 
    }

    // load textdomain and .mo file if "lang" is set
    load_theme_textdomain('theme-domain', TEMPLATEPATH . '/lang');

}

A través de: http://codex.wordpress.org/Function_Reference/load_theme_textdomain

  • Descubrí que necesitaba descargar el dominio de texto en mi situación, antes de volver a cargar el dominio de texto. Lo que me dio el siguiente código (y lo estoy usando para un complemento, por lo que dice load_plugin_textdomain para mí. unload_textdomain('my-plugin-txt-domain'); load_plugin_textdomain('my-plugin-txt-domain', __DIR__ . '/../../languages');

    – Nieve fresca

    22 de agosto de 2018 a las 18:59


Se me ocurrió la siguiente solución, ya que necesitaba generar facturas desde un complemento en diferentes idiomas en el ámbito de la misma solicitud:

    global $locale;

    $locale="en_CA";
    load_plugin_textdomain('invoice', false, 'my-plugin/languages/');
    generateInvoice(); // produce the English localized invoice

    $locale="fr_CA";
    load_plugin_textdomain('invoice', false, 'my-plugin/languages/');
    generateInvoice(); // produce the French localized invoice

avatar de usuario
vmassuchetto

Supongo que estás buscando el override_load_textdomain filtro, llamado justo al principio de un load_textdomain Llamada de función.

Eso sería algo como:

function my_load_textdomain ($retval, $domain, $mofile) {

    if ($domain != 'theme_domain')
        return false;

    $user = get_currentuserinfo()
    $user_lang = get_user_lang($user);

    if ($new_mofile = get_my_mofile($user_lang)) {
        load_textdomain('theme_domain', $new_mofile);
        return true;
    }

    return false;
}
add_filter('override_load_textdomain', 'my_load_textdomain');

Código del cerebro al teclado, no probado. Deberías hacer algunas validaciones más y así.

Para mí, solo estas dos soluciones juntas funcionaron.

switch_to_locale($locale);
load_textdomain('example_domain', $mo_file_full_path);

A tenía la misma pregunta, la resolví de esta manera:

primer paso tienes que crear un .mo con un dominio de texto. Puedes usar el complemento de traducción loco: https://br.wordpress.org/plugins/loco-translate/

Cargue su dominio de texto que vincula el archivo .mo:

load_textdomain('your_text_domain', '/your/file.mo');

Cambiar la ubicación de wordpress a través de gancho. Cree una función que devuelva la ubicación deseada. Use WordPress Locale Id siempre, puede ver todos los Id locales aquí: https://wpastra.com/docs/lista-completa-wordpress-locale-codes/

Escribamos la función:

function wpsx_redefine_locale($locale){
  
  return 'ja';
}
add_filter('locale','wpsx_redefine_locale',10);

Puede cambiar por ubicación del usuario. De esta forma, wordpress establece el mismo idioma que el usuario configuró en su panel de control:

$user_locale = get_user_locale();
function wpsx_redefine_locale($locale){
  global $user_locale;
  return $user_locale;
}
add_filter('locale','wpsx_redefine_locale',10);

Obs: Mi versión de wordpress es 5.7. De esta manera no puede funcionar en otras versiones. ¡Buen aspecto!

avatar de usuario
El interruptor

Tuve un problema similar y lo resolví así:

  1. En mi caso, quería recuperar la configuración regional utilizando la configuración regional del usuario: $userLocale = get_user_locale($userObject->ID);

  2. Creé una función personalizada para cargar el theme_textdomain correcto con una configuración regional dinámica. Es casi lo mismo que la función WP, pero puede agregar una variable de configuración regional:

    /**
     * Loads text domain by custom locale
     * Based on a WP function, only change is the custom $locale
     * parameter so we can get translated strings on demand during runtime
     */
    function load_theme_textdomain_custom_locale($domain, $path = false, $locale)
    {
        /**
         * Filter a theme's locale.
         *
         * @since 3.0.0
         *
         * @param string $locale The theme's current locale.
         * @param string $domain Text domain. Unique identifier for retrieving translated strings.
         */
        $locale = apply_filters('theme_locale', $locale, $domain);
    
        if (!$path) {
            $path = get_template_directory();
        }
    
        // Load the textdomain according to the theme
        $mofile = "{$path}/{$locale}.mo";
        if ($loaded = load_textdomain($domain, $mofile)) {
            return $loaded;
        }
    
        // Otherwise, load from the languages directory
        $mofile = WP_LANG_DIR . "/themes/{$domain}-{$locale}.mo";
        return load_textdomain($domain, $mofile);
    }
    

Residencia en:
http://queryposts.com/function/load_theme_textdomain/

¿Ha sido útil esta solución?