/** * Explain your records in the {node_access} table. * * In order to help developers and administrators understand the forces * that control access to any given node, the DNA module provides the * Devel Node Access block, which lists all the grant records in the * {node_access} table for that node. * * However, every Node Access module is free in how it defines and uses the * 'realm' and 'gid' fields in its records in the {node_access} table, and * it's often difficult to interpret them. This hook passes each record * that DNA wants to display, and the owning module is expected to return * an explanation of that record. * * The explanation should not be localized (not be passed through t()), so * that administrators seeking help can present English explanations. * * @param $row * The record from the {node_access} table, as object. The member fields are: * nid, gid, realm, grant_view, grant_update, grant_delete. * * @return * A string with a (short!) explanation of the given {node_access} row, * to be displayed in DNA's 'Devel Node Access' block. It will be displayed * as HTML; any variable parts must already be sanitized. * * @see hook_node_access_records() * @see devel_node_access_node_access_explain() * * @ingroup node_access */ function hook_node_access_explain($row) { if ($row->realm == 'mymodule_myrealm') { if ($row->grant_view) { $role = user_role_load($row->gid); return 'Role ' . drupal_placeholder($role->name) . ' may view this node.'; } else { return 'No access.'; } } }
protected function format_string($string, array $args = array()) { // Transform arguments before inserting them. foreach ($args as $key => $value) { switch ($key[0]) { case '@': // Escaped only. $args[$key] = $value; break; case '%': default: // Escaped and placeholder. $args[$key] = drupal_placeholder($value); break; case '!': // Pass-through. } } return strtr($string, $args); }
/** * 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. So, * 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 * @link http://drupal.org/node/322729 Localization API @endlink 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 * @code t($text); @endcode, 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 * @code t($user_text); @endcode, 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: * @code * $text = t("@name's blog", array('@name' => format_username($account))); * @endcode * Basically, you can put variables like @name into your string, and t() will * substitute their sanitized values at translation time (see $args below or * the Localization API pages referenced above for details). 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. * * @param $string * A string containing the English string to translate. * @param $args * An associative array of replacements to make after translation. * Occurrences in $string of any key in $args are replaced with the * corresponding value, after sanitization. The sanitization function depends * on the first character of the key: * - !variable: Inserted as is. Use this for text that has already been * sanitized. * - @variable: Escaped to HTML using check_plain(). Use this for anything * displayed on a page on the site. * - %variable: Escaped as a placeholder for user-submitted content using * drupal_placeholder(), which shows up as <em>emphasized</em> text. * @param $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 * The translated string. * * @see st() * @see get_t() * @ingroup sanitization */ 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 { // Transform arguments before inserting them. foreach ($args as $key => $value) { switch ($key[0]) { case '@': // Escaped only. $args[$key] = check_plain($value); break; case '%': default: // Escaped and placeholder. $args[$key] = drupal_placeholder($value); break; case '!': // Pass-through. } } return strtr($string, $args); } }