1.20.x locale.module | locale($string = NULL, $context = NULL, $langcode = NULL) |
Provides interface translation services.
This function is called from t() to translate a string if needed.
Parameters
$string: A string to look up translation for. If omitted, all the cached strings will be returned in all languages already used on the page.
$context: The context of this string.
$langcode: Language code to use for the lookup.
File
- modules/
locale/ locale.module, line 531 - Add language handling functionality and enables the translation of the user interface to languages other than English.
Code
function locale($string = NULL, $context = NULL, $langcode = NULL) {
global $language;
// Use the advanced backdrop_static() pattern, since this is called very often.
static $backdrop_static_fast;
if (!isset($backdrop_static_fast)) {
$backdrop_static_fast['locale'] = &backdrop_static(__FUNCTION__);
}
$locale_t = &$backdrop_static_fast['locale'];
if (!isset($string)) {
// Return all cached strings if no string was specified
return $locale_t;
}
$langcode = isset($langcode) ? $langcode : $language->langcode;
// Store database cached translations in a static variable. Only build the
// cache after $language has been set to avoid an unnecessary cache
// rebuild.
if (!isset($locale_t[$langcode]) && isset($language)) {
$locale_t[$langcode] = array();
// Disabling the usage of string caching allows a module to watch for
// the exact list of strings used on a page. From a performance
// perspective that is a really bad idea, so we have no user
// interface for this. Be careful when turning this option off!
if (settings_get('locale_cache_strings', 1) == 1) {
if ($cache = cache()->get('locale:' . $langcode)) {
$locale_t[$langcode] = $cache->data;
}
elseif (lock_acquire('locale_cache_' . $langcode)) {
// Refresh database stored cache of translations for given language.
// We only store short strings used in current version, to improve
// performance and consume less memory.
try {
$result = db_query("SELECT s.source, s.context, t.translation, t.language FROM {locales_source} s LEFT JOIN {locales_target} t ON s.lid = t.lid AND t.language = :language WHERE s.version = :version AND LENGTH(s.source) < :length", array(
':language' => $langcode,
':version' => BACKDROP_VERSION,
':length' => config_get('locale.settings', 'cache_length'),
));
foreach ($result as $data) {
$locale_t[$langcode][$data->context][$data->source] = (empty($data->translation) ? TRUE : $data->translation);
}
cache()->set('locale:' . $langcode, $locale_t[$langcode]);
lock_release('locale_cache_' . $langcode);
}
catch (PDOException $e) {
// Throw exception for any problem except for missing database tables.
if ($e->getCode() !== '42S02') {
throw $e;
}
return $string;
}
}
}
}
// If we have the translation cached, skip checking the database
if (!isset($locale_t[$langcode][$context][$string])) {
// We do not have this translation cached, so get it from the DB.
try {
$translation = db_query("SELECT s.lid, t.translation, s.version FROM {locales_source} s LEFT JOIN {locales_target} t ON s.lid = t.lid AND t.language = :language WHERE s.source = :source AND s.context = :context", array(
':language' => $langcode,
':source' => $string,
':context' => (string) $context,
))->fetchObject();
}
// In the event the table does not exist (such as when uninstalling the
// module), just return the untranslated string.
catch (PDOException $e) {
return $string;
}
if ($translation) {
// We have the source string at least.
// Cache translation string or TRUE if no translation exists.
$locale_t[$langcode][$context][$string] = (empty($translation->translation) ? TRUE : $translation->translation);
if ($translation->version != BACKDROP_VERSION) {
// This is the first use of this string under current Backdrop version. Save version
// and clear cache, to include the string into caching next time. Saved version is
// also a string-history information for later pruning of the tables.
db_update('locales_source')
->fields(array('version' => BACKDROP_VERSION))
->condition('lid', $translation->lid)
->execute();
cache()->deletePrefix('locale:');
}
}
else {
// We don't have the source string, cache this as untranslated.
db_merge('locales_source')
->insertFields(array(
'location' => request_uri(),
'version' => BACKDROP_VERSION,
))
->key(array(
'source' => $string,
'context' => (string) $context,
))
->execute();
$locale_t[$langcode][$context][$string] = TRUE;
// Clear locale cache so this string can be added in a later request.
cache()->deletePrefix('locale:');
}
}
return ($locale_t[$langcode][$context][$string] === TRUE ? $string : $locale_t[$langcode][$context][$string]);
}