Okay, maybe you do but what I’m talking about is a different kind of text. I’m talking about text strings in PHP code.
What are they? Why do they matter? Well, they matter in themes that you want to make public or share. Oh, and plugins as well, I guess. If you’re into that sort of thing.
Over the last few weeks I’ve come across a few themes that didn’t quite make every line of text translatable. It almost drove me mad. Seriously. I was about ready to just punch my monitor. Thankfully another song came on and I was back to my calm self.
Yep, they do exists within WordPress. It’s actually quite nice that they do. Here are some that can be found in the includes folder:
__( 'I am a text string', 'theme-domain' )
_e( 'I am echoed', 'theme-domain' )
_x( 'Form', 'Art related', 'theme-domain' )
_ex( 'Form', 'Filing related', 'theme-domain' )
_n( 'Single', 'Plural', 'Number', 'theme-domain' )
_nx( 'Single', 'Double', 'Number', 'theme-domain' )
esc_attr__( 'I am an attribute', 'theme-domain' )
esc_attr_e( 'I will be an echoed attribute', 'theme-domain' )
esc_attr_x( 'Link', 'hyperlink', 'theme-domain' )
There are a few more but those are some of the ones I feel would be used more often than the others. In particular the first two. Those are by far the easiest ones to really miss. At least those are the ones I seem to find not being used when they should be.
What qualifies as a string?
When it comes down to it: anything that is inside markup. If it is wrapped inside an HTML tag then odds are it is a text string. A great example of this would be a very common line used by many themes. The “posted on” phrase. Now, there are several ways of doing this but I feel there are very few that are correct when it comes to translation strings.
$phrase = 'Posted on %s by %s'; printf( $phrase, get_the_time( get_option( 'date_format' ) ), get_the_author();
As you can see from the example I’ve provided it is a simple phrase that can easily be translated. The only thing you really have to do now is wrap the actual phrase with a translation function like:
$phrase = __( 'Posted on %1$s by %2$s', 'text-domain' ); printf( $phrase, get_the_time( get_option( 'date_format' ) ), get_the_author();
Fairly simple, right? But what about when it comes to numbers? That is what
_n() is for actually. It’s a neat little function to use. It compares numbers! Yes, numbers. I love those things.
Okay, not literally compare numbers but fairly close. What it does do is actually determine which version of string to use. Sort of a juggling function with a twist. Really cool to use when you want to compare a single use, plural or even more.
A good example would be using it in a shopping cart.
echo "<h4>Items in cart</h4>"; $count = _n( 'Only one so far', 'Two items', get_total_items(), 'text-domain' ); printf( '<div class="cart-total">Currently: %s</div>', $count );
Pretty neat, right? I think so.
There are a few more functions to make translating a theme, or plugin, better but I feel those are the ones I find a bit more useful.