7 bootstrap.inc | t($string, array $args = array(), array |
4.6 common.inc | t($string, $args = 0) |
4.7 common.inc | t($string, $args = 0) |
5 common.inc | t($string, $args = 0) |
6 common.inc | t($string, $args = array(), |
8 bootstrap.inc | t($string, array $args = array(), array $options = array()) |
Translates a string to the current language or to a given language.
The t() function serves two purposes. First, at run-time it translates user-visible text into the appropriate language. Second, various mechanisms that figure out what text needs to be translated work off t() -- the text inside t() calls is added to the database of strings to be translated. These strings are expected to be in English, so the first argument should always be in English. To enable a fully-translatable site, it is important that all human-readable text that will be displayed on the site or sent to a user is passed through the t() function, or a related function. See the Localization API pages for more information, including recommendations on how to break up or not break up strings for translation.
You should never use t() to translate variables, such as calling
t($text);
, unless the text that the variable holds has been passed through t() elsewhere (e.g., $text is one of several translated literal strings in an array). It is especially important never to call
t($user_text);
, where $user_text is some text that a user entered - doing that can lead to cross-site scripting and other security problems. However, you can use variable substitution in your string, to put variable text such as user names or link URLs into translated text. Variable substitution looks like this:
$text = t("@name's blog", array('@name' => format_username($account)));
Basically, you can put variables like @name into your string, and t() will substitute their sanitized values at translation time. (See the Localization API pages referenced above and the documentation of format_string() for details about how to define variables in your string.) Translators can then rearrange the string as necessary for the language (e.g., in Spanish, it might be "blog de @name").
During the Drupal installation phase, some resources used by t() wil not be available to code that needs localization. See st() and get_t() for alternatives.
Parameters
$string: A string containing the English string to translate.
$args: An associative array of replacements to make after translation. Based on the first character of the key, the value is escaped and/or themed. See format_string() for details.
$options: An associative array of additional options, with the following elements:
- 'langcode' (defaults to the current language): The language code to translate to a language other than what is used to display the page.
- 'context' (defaults to the empty context): The context the source string belongs to.
Return value
The translated string.
See also
st()
get_t()
Related topics
- AccessDeniedTestCase::testAccessDenied in modules/
system/ system.test - ActionLoopTestCase::testActionLoop in modules/
simpletest/ tests/ actions.test - Set up a loop with 3 - 12 recursions, and see if it aborts properly.
- ActionLoopTestCase::triggerActions in modules/
simpletest/ tests/ actions.test - Create an infinite loop by causing a watchdog message to be set, which causes the actions to be triggered again, up to actions_max_stack times.
- ActionsConfigurationTestCase::testActionConfiguration in modules/
simpletest/ tests/ actions.test - Test the configuration of advanced actions through the administration interface.
- actions_loop_test_action_info in modules/
simpletest/ tests/ actions_loop_test.module - Implements hook_action_info().
- CommonXssUnitTest::testFormatStringAndT in modules/
simpletest/ tests/ common.test - Test t() and format_string() replacement functionality.
- DatabaseBasicSyntaxTestCase::testLikeBackslash in modules/
simpletest/ tests/ database_test.test - Test LIKE query containing a backslash.
- DatabaseBasicSyntaxTestCase::testLikeEscape in modules/
simpletest/ tests/ database_test.test - Test escaping of LIKE wildcards.
- DatabaseDeleteTruncateTestCase::testSubselectDelete in modules/
simpletest/ tests/ database_test.test - Confirm that we can use a subselect in a delete successfully.
- DatabaseSelectCloneTest::testSelectConditionSubQueryCloning in modules/
simpletest/ tests/ database_test.test - Test that subqueries as value within conditions are cloned properly.
File
- includes/
bootstrap.inc, line 1452 - Functions that need to be loaded on every Drupal request.
Code
function t($string, array $args = array(), array $options = array()) {
global $language;
static $custom_strings;
// Merge in default.
if (empty($options['langcode'])) {
$options['langcode'] = isset($language->language) ? $language->language : 'en';
}
if (empty($options['context'])) {
$options['context'] = '';
}
// First, check for an array of customized strings. If present, use the array
// *instead of* database lookups. This is a high performance way to provide a
// handful of string replacements. See settings.php for examples.
// Cache the $custom_strings variable to improve performance.
if (!isset($custom_strings[$options['langcode']])) {
$custom_strings[$options['langcode']] = variable_get('locale_custom_strings_' . $options['langcode'], array());
}
// Custom strings work for English too, even if locale module is disabled.
if (isset($custom_strings[$options['langcode']][$options['context']][$string])) {
$string = $custom_strings[$options['langcode']][$options['context']][$string];
}
// Translate with locale module if enabled.
elseif ($options['langcode'] != 'en' && function_exists('locale')) {
$string = locale($string, $options['context'], $options['langcode']);
}
if (empty($args)) {
return $string;
}
else {
return format_string($string, $args);
}
}
Comments
Do not use in hook_schema()
Note: t() should not be used in hook_schema(). See: http://drupal.org/node/332123
Inserting a link in a t()
Allthough it's described, I thoughed the drupal 6 had some good examples.
There are three styles of placeholders:
!variable, which indicates that the text should be inserted as-is. This is useful for inserting variables into things like e-mail.
<?php
$message = t("If you don't want to receive such e-mails, you can change your settings at !url.", array('!url' => l(t('My account'), "user/$account->uid")));
?>
@variable, which indicates that the text should be run through check_plain, to escape HTML characters. Use this for any output that's displayed within a Drupal page.
<?php
$title = t("@name's blog", array('@name' => $account->name));
?>
%variable, which indicates that the string should be HTML escaped and highlighted with theme_placeholder() which shows up by default as emphasized.
<?php
$message = t('%name-from sent %name-to an e-mail.', array('%name-from' => $user->name, '%name-to' => $account->name));
?>
Thanks
Thanks I've been looking for info on this for long time. Nice to see it in your comments :)
Insert hyperlink markup into the translatable string
Core, and Dynamic or static links and HTML in translatable strings documentation page prefers that inline links insert HTML directly into the translatable string.
You shouldn't construct link markup as t() variables with l() etc.
<?php
// Do this instead.
// DO NOT DO THESE THINGS
$BAD_EXTERNAL_LINK = t('Look at Drupal documentation at !handbook.', array('!handbook' => '<a href="http://drupal.org/handbooks">'. t('the Drupal Handbooks') .'</a>'));
$external_link = t('Look at Drupal documentation at <a href="@drupal-handbook">the Drupal Handbooks</a>.', array('@drupal-handbook' => 'http://drupal.org/handbooks'));
?>
Extracted from http://drupal.org/node/322774
auto increase lid in locales_source table
edit the text in each function t () is automatically inserted in locales_source table on a line with other id, this will make the data of table locales_source is growing, while it contains only the text is not necessary to translate. how to solve this problem?
Overriding strings in settings.php
Because of t() also accepting a 'context' for string translations, the following doesn't work in D7:
<?php
$conf['locale_custom_strings_en'] = array(
'ORIGINAL STRING' => 'YOUR STRING',
);
?>
Instead, you need to nest it one level deeper in an empty string (assuming no context was provided in the original call to t()):
<?php
$conf['locale_custom_strings_en'][''] = array(
'ORIGINAL STRING' => 'YOUR STRING',
);
?>
Thanks
Thanks I've been looking for info on this for long time. Nice to see it in your comments :)
Example for context
Here is an example if you want to use a context for a translated string:
<?php
print t('Order', array(), array('context' => 'Verb'));
?>
That means that the word 'order' is a verb so that nobody thinks that is the drupal commerce order.
If it doesn't appear in the translate interface
If the text displayed with the t() function doesn't appear in the translate interface try displaying the page containing it, in a language other than the default one. It worked for me.
If you want to get a string into the translate interface
If you want to get a string into the translate interface programmatically (without displaying the page containing it) you can call:
locale($string, '');
The empty string as the second argument is important!