Search code examples
wordpresscustom-post-typegettextpoedit

WordPress not honoring translations of _x() label functions of custom post type


In a WordPress theme I’m developing, I registered a custom post type called 'Project' as follows.

function add_custom_post_type() {

register_post_type( 'project', 
    array(
        'label'         => __( 'Projects', 'maria' ),
        'labels'        => array(
            'name'               => _x( 'Projects', 'post type general name', 'maria' ),
            'singular_name'      => _x( 'Project', 'post type singular name', 'maria' ),
            'menu_name'          => _x( 'Projects', 'admin menu', 'maria' ),
            'name_admin_bar'     => _x( 'Project', 'add new on admin bar', 'maria' ),
            'add_new'            => _x( 'Add New', 'project', 'maria' ),
            'add_new_item'       => __( 'Add New Project', 'maria' ),
            'new_item'           => __( 'New Project', 'maria' ),
            'edit_item'          => __( 'Edit Project', 'maria' ),
            'view_item'          => __( 'View Project', 'maria' ),
            'all_items'          => __( 'All Projects', 'maria' ),
            'search_items'       => __( 'Search Projects', 'maria' ),
            'parent_item_colon'  => __( 'Parent Projects:', 'maria' ),
            'not_found'          => __( 'No Projects found.', 'maria' ),
            'not_found_in_trash' => __( 'No Projects found in Trash.', 'maria' )
            ),
        'public'        => true,
        'menu_position' => 5,
        'supports'      => array( 'title', 'editor', 'thumbnail' ),
        'rewrite'       => array( 'slug' => __( 'project' ))
        )
    );
}
add_action( 'init', 'add_custom_post_type' );

Using the app Poedit, I am now trying to translate the labels of my custom post type to German. I am importing the functions/keywords __,_e and _x. The strings show up as expected.

https://abload.de/img/screenshot2019-09-29av4jhv.png (Screenshot)

However, upon translating my .po file and compiling the .mo file for WordPress localization, WordPress only seems to honor the translations I input for the __ and _e functions while ignoring the _x functions.

https://abload.de/img/screenshot2019-09-29ah7jxx.png (Screenshot)

In my dashboard, the Projects and Add New buttons still show up in English despite having been translated to Projekte and Erstellen respectively.

What am I doing wrong? Thanks very much in advance.


Solution

  • Okay, while I couldn’t solve the problem of WordPress not honoring the translations for _x functions, I got the labels to display correctly by using the following workaround.

    In my register_post_type function, I changed all _x functions to __ functions (removing the context argument in the process). Final working code below:

    function add_custom_post_type() {
    
    register_post_type( 'project', 
        array(
            'label'         => __( 'Projects', 'maria' ),
            'labels'        => array(
                'name'               => __( 'Projects', 'maria' ),
                'singular_name'      => __( 'Project', 'maria' ),
                'menu_name'          => __( 'Projects', 'maria' ),
                'name_admin_bar'     => __( 'Project', 'maria' ),
                'add_new'            => __( 'Add New', 'maria' ),
                'add_new_item'       => __( 'Add New Project', 'maria' ),
                'new_item'           => __( 'New Project', 'maria' ),
                'edit_item'          => __( 'Edit Project', 'maria' ),
                'view_item'          => __( 'View Project', 'maria' ),
                'all_items'          => __( 'All Projects', 'maria' ),
                'search_items'       => __( 'Search Projects', 'maria' ),
                'parent_item_colon'  => __( 'Parent Projects:', 'maria' ),
                'not_found'          => __( 'No Projects found.', 'maria' ),
                'not_found_in_trash' => __( 'No Projects found in Trash.', 'maria' )
                ),
            'public'        => true,
            'menu_position' => 5,
            'supports'      => array( 'title', 'editor', 'thumbnail' ),
            'rewrite'       => array( 'slug' => __( 'project' ))
            )
        );
    }
    add_action( 'init', 'add_custom_post_type' );