WPML

Aprenda a crear paquetes de cadenas para sus plugins y temas con el fin de ayudar a los usuarios a traducir contenido fácilmente con WPML.

Los paquetes de cadenas son grupos de cadenas «empaquetados» juntos en un contexto específico. Su propósito es ayudar a los usuarios finales a traducir el contenido de manera más eficiente al eliminar la necesidad de traducir cada cadena individualmente.

Por ejemplo, así es como los usuarios traducirían campos personalizados de usuario, con y sin un paquete de cadenas:

Sin un paquete de cadenas

Los cuatro campos como cadenas separadas, en WPML → Traducciones → Cadenas
Los cuatro campos como cadenas separadas, en WPML → Traducciones → Cadenas

Los usuarios tienen que traducir las cadenas una por una, sin la opción de traducción automática.

Con un paquete de cadenas

Los mismos cuatro campos como un solo paquete, en el Escritorio de traducción
Los mismos cuatro campos como un solo paquete, en el Escritorio de traducción

Los usuarios pueden traducir varias cadenas juntas de una sola vez, con la opción de traducción automática.

Como puede ver, los paquetes de cadenas simplifican el proceso de traducción al permitir a los usuarios traducir varios campos personalizados de usuario a la vez. Para ofrecer a sus usuarios la mejor experiencia de traducción, siga los pasos a continuación para crear sus propios paquetes de cadenas.

Si quiere ver la implementación completa del paquete de cadenas que cubrimos en los pasos a continuación, consulte este repositorio de GitHub (se abre en una pestaña nueva) que contiene el plugin de prueba que utilizamos.

1. Identifique el contenido traducible

El primer paso es identificar el contenido que los usuarios querrán traducir, como títulos, etiquetas y contenido generado por el usuario.

2. Declare el tipo de paquete

A continuación, debe declarar el tipo de paquete. Este paso ayuda a WPML a detectar qué paquetes de cadenas están conectados a los plugins activos, y a traducir solo esos paquetes.

A modo de comparación, este filtro funciona para los paquetes de cadenas al igual que el filtro register_post_types funciona para los tipos de contenido.

Para declarar un tipo de paquete, use el filtro wpml_active_string_package_kinds (se abre en una pestaña nueva):

define( 'FOO_USER_FIELD_PACKAGE_KIND_TITLE', 'OTGS Foo User Fields' );

define( 'FOO_USER_FIELD_PACKAGE_KIND_SLUG', 'otgs-foo-user-fields' );

add_filter( 'wpml_active_string_package_kinds', function( $kinds ) {

   $kinds[ FOO_USER_FIELD_PACKAGE_KIND_SLUG ] = [

            'title'  => FOO_USER_FIELD_PACKAGE_KIND_TITLE,

            'slug'   => FOO_USER_FIELD_PACKAGE_KIND_SLUG,

            'plural' => FOO_USER_FIELD_PACKAGE_KIND_TITLE,

    ];

    return $kinds;

} );
Definición de argumentos

title – el título del tipo, debe ser el mismo que el tipo para los paquetes.
plural – la forma plural del título.
slug – el slug del tipo, debe ser el mismo que el kind_slug para los paquetes.

3. Cree un paquete y registre las cadenas

A continuación, debe crear un paquete y registrar las cadenas que va a agrupar usando el hook wpml_register_string (se abre en una pestaña nueva):

$userId = 123;

$user   = get_user_by( 'id', $userId );

$package = [

    'kind'      => FOO_USER_FIELD_PACKAGE_KIND_TITLE, // The "namespace".

    'kind_slug' => FOO_USER_FIELD_PACKAGE_KIND_SLUG, // The "namespace" slug.

    'name'      => $userId, // Can be a string or an integer, but should be unique inside the "kind" namespace.

    'title'     => $user->display_name, // The title for the package entity inside the "kind" namespace.

];

$fooUserFields = get_option( 'otgs_foo_user_fields' );

foreach ( $fooUserFields as $fooUserField ) {

$fieldValue = get_user_meta( $userId, $fooUserField, true );

do_action( 'wpml_register_string', $fieldValue, sanitize_key( $fooUserField ), $package, $fooUserField, 'LINE' );

}
Definición de argumentos

$kind – la etiqueta del espacio de nombres de la entidad (por ejemplo, Gravity Form).
$kind_slug – el slug del espacio de nombres de la entidad (por ejemplo, gravity-form). Si falta, será una versión en formato slug del «tipo».
$name – el identificador único de la entidad dentro del tipo, puede ser una cadena (por ejemplo, un slug) o un número entero (por ejemplo, un ID).
$title – el título de la entidad dentro del tipo. Se recomienda usar el título de la entidad real.

Aunque no es necesario, también puede incluir dos argumentos adicionales:
$edit_link – una URL para editar el objeto.
$view_link – una URL para ver el objeto.

4. Recupere las traducciones

Por último, para mostrar las traducciones en el front-end, debe usar el hook wpml_translate_string (se abre en una pestaña nueva):

$userId = 123;

$user   = get_user_by( 'id', $userId );

$package = [

        'kind'      => FOO_USER_FIELD_PACKAGE_KIND_TITLE, // The "namespace".

        'kind_slug' => FOO_USER_FIELD_PACKAGE_KIND_SLUG, // The "namespace" slug.

        'name'      => $userId, // Can be a string or an integer, but should be unique inside the "kind" namespace.

        'title'     => $user->display_name, // The title for the package entity inside the "kind" namespace.

];

$fooUserFields = get_option( 'otgs_foo_user_fields' );

$translatedFieldValues = [];

foreach ( $fooUserFields as $fooUserField ) {

    $fieldValue              = get_user_meta( $userId, $fooUserField, true );

    $translatedFieldValues[ $fooUserField ] = apply_filters( 'wpml_translate_string', $fieldValue, sanitize_key( $fooUserField ), $package );

}

Actualizar y eliminar cadenas

Cada vez que los usuarios actualizan el contenido, WPML debe poder identificar las nuevas cadenas, así como las que se eliminaron. Para notificar a WPML de estos cambios, envuelva su código de registro con dos funciones:

$userId = 123;

$package = [

        'kind'      => FOO_USER_FIELD_PACKAGE_KIND_TITLE, // The "namespace".

        'kind_slug' => FOO_USER_FIELD_PACKAGE_KIND_SLUG, // The "namespace" slug.

        'name'      => $userId, // Can be a string or an integer, but should be unique inside the "kind" namespace.

        // The 'title' key is not not required in the "translate" context.

];

do_action( 'wpml_start_string_package_registration', $package );

$fooUserFields = get_option( 'otgs_foo_user_fields' );

foreach ( $fooUserFields as $fooUserField ) {

    $fieldValue = get_user_meta( $userId, $fooUserField, true );

    do_action( 'wpml_register_string', $fieldValue, sanitize_key( $fooUserField ), $package, $fooUserField, 'LINE' );

}

do_action( 'wpml_delete_unused_package_strings',$package );

Eliminar paquetes de cadenas

Cuando los usuarios eliminan contenido, usted también debe eliminar su paquete de cadenas asociado. Esto incluye todas las cadenas, traducciones y trabajos relacionados. Al hacer esta limpieza, se asegura de que el sitio siga siendo eficiente sin que queden datos sobrantes que saturen la base de datos.

Para eliminar un paquete de cadenas, utilice un hook en una acción adecuada dentro de su plugin o tema y llame a la función wpml_delete_package (se abre en una pestaña nueva):

$userId = 123;

do_action( 'wpml_delete_package', $userId, FOO_USER_FIELD_PACKAGE_KIND_SLUG );

Recursos adicionales

Escrito porAmir