WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I've created custom post type and taxonomy via generator, but not quite sure how to make it translatable. Google doesn't help in this. I have no idea where to put text-domain here and things what I've tried made taxonomies don't work at all.

Thanks in advance.

The code:

    add_action( 'init', 'register_cpt_portfolio' );
    function register_cpt_portfolio() {

        $labels = array( 
            'name' => _x( 'Portfolios',  'portfolio'),
            'singular_name' => _x( 'single-portfolio',  'portfolio' ),
            'add_new' => _x( 'Add New', 'portfolio' ),
            'add_new_item' => _x( 'Add New Portfolio', 'portfolio' ),
            'edit_item' => _x( 'Edit Portfolio',  'portfolio' ),
            'new_item' => _x( 'New Portfolio', 'portfolio' ),
            'view_item' => _x( 'View Portfolio',  'portfolio' ),
            'search_items' => _x( 'Search Portfolios',  'portfolio' ),
            'not_found' => __( 'No portfolios found',  'portfolio' ),
            'not_found_in_trash' => _x( 'No portfolios found in Trash',  'portfolio' ),
            'parent_item_colon' => _x( 'Parent Portfolio:', 'portfolio' ),
            'menu_name' => _x( 'Portfolio',  'portfolio' ),

        $args = array( 
            'labels' => $labels,
            'hierarchical' => false,
            'supports' => array( 'title', 'editor', 'thumbnail' ),
            'taxonomies' => array( 'portfolio_taxonomy' ),
            'public' => true,
            'show_ui' => true,
            'show_in_menu' => true,
            'show_in_nav_menus' => true,
            'publicly_queryable' => true,
            'exclude_from_search' => false,
            'has_archive' => true,
            'query_var' => true,
            'can_export' => true,
            'rewrite' => true,
            'capability_type' => 'post'

        register_post_type( 'portfolio', $args );

    add_action( 'init', 'register_taxonomy_portfolio_taxonomy' );

    function register_taxonomy_portfolio_taxonomy() {

        $labels = array( 
            'name' => _x( 'Portfolio Categories',  'portfolio_taxonomy' ),
            'singular_name' => _x( 'Portfolio Category', 'portfolio_taxonomy' ),
            'search_items' => _x('Search Portfolio Categories',  'portfolio_taxonomy'),
            'popular_items' => _x( 'Popular Portfolio Categories',  'portfolio_taxonomy' ),
            'all_items' => _x('All Portfolio Categories', 'portfolio_taxonomy' ),
            'parent_item' => _x('Parent Portfolio Category',  'portfolio_taxonomy' ),
            'parent_item_colon' => _x( 'Parent Portfolio Category:',  'portfolio_taxonomy' ),
            'edit_item' => _x( 'Edit Portfolio Category', 'portfolio_taxonomy' ),
            'update_item' => _x( 'Update Portfolio Category', 'portfolio_taxonomy' ),
            'add_new_item' => _x( 'Add New Portfolio Category', 'portfolio_taxonomy'),
            'new_item_name' => _x( 'New Portfolio Category',  'portfolio_taxonomy' ),
            'separate_items_with_commas' => _x( 'Separate portfolio categories with commas', 'portfolio_taxonomy'),
            'add_or_remove_items' => _x( 'Add or remove portfolio categories',  'portfolio_taxonomy' ),
            'choose_from_most_used' => _x( 'Choose from the most used portfolio categories', 'portfolio_taxonomy' ),
            'menu_name' => _x( 'Portfolio Categories','portfolio_taxonomy'),

        $args = array( 
            'labels' => $labels,
            'public' => true,
            'show_in_nav_menus' => true,
            'show_ui' => true,
            'show_tagcloud' => true,
            'hierarchical' => true,
            'rewrite' => true,
            'query_var' => true

        register_taxonomy( 'portfolio_taxonomy', array('portfolio'), $args );
share|improve this question
I don't understand your question. The text domain is 'portfolio'? – toscho Sep 22 '12 at 0:31
Nope, that the code generated by themergency.com/generators/wordpress-custom-post-types – denoizzed Sep 22 '12 at 9:22
In your code portfolio and portfolio_taxonomy are the text domains. Do you ask how you should change these values or which parts of your code are the text domains? – toscho Sep 22 '12 at 9:52
Got it, thanks! For some reason I thought they're not. – denoizzed Sep 22 '12 at 12:38
up vote 2 down vote accepted

Since you have already figured out what the text domain is - the last parameter of __() - I want to add something most people forget when custom post types or taxonomies are made translatable: slugs.

Your post type or taxonomy name can mean something very different or even embarrassing in another language. Or it can contain letters that are not available (like the famous i in Turkish) and therefore hard to type.

See untranslatable slugs as bugs in your code.

The rewrite argument for register_taxonomy() and register_post_type() accepts an array. One of the array keys is slug. Use it, make it translatable too:

    array (
        'rewrite' => array (
            'slug' => _x( 'post_type_name', 'URL slug', 'your_text_domain' )
    array ( 'post', 'post_type_name' ), 
    array (
        'rewrite' => array (
            'slug' => _x( 'taxonomy_name', 'URL slug', 'your_text_domain' )

The function _x() uses a context parameter. This will help translators to see where the string will be used.

share|improve this answer
Thanks, nice addition. – denoizzed Sep 22 '12 at 21:16

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.