记记Drupal7中t()函数的相关用法,如有疏漏之处,还望指正。% l2 H4 @: c# k
. {( y' o. I" g9 _: k0 }
每个开发者必须理解的三个功能:' p6 c% f- o# z z! g L$ m
2 S# `- d% A/ M: v6 W; Z1.t()是怎样被执行的?
G0 I c6 i7 ?! m7 ?) \ {' [8 y! @: c, F" S* ?
2.Drupal怎样建立翻译表?
+ Z' M) j& Q: p8 ]# O4 o Z
* E, ?- }5 i& O" f( Y! Q: V3.怎样使用t()实现一些其它功能?. D% U7 U3 C6 x. ?
" o K4 s8 U, O9 `
8 z5 g- k4 d( ?3 H' R0 @
, i- w0 v( [5 p4 {0 F) a' O. {首先,让我们看下t()的执行过程。如果多语言模块没被开启,并且第二个参数没被传递到t(),它仅仅返回原来的字符串。如果多语言模块被开启,并且传递给t()第二个参数,Drupal将试图用适当的语言替换掉默认的字符串。+ C; @* |$ R3 m* l
: n7 n7 r6 q! _
; D! f1 I5 Z( t% i) r
1 z0 N, |+ I5 M$ p然后,让我们看下Drupal怎样生成翻译信息的。这有两个方面:人为的和技术上的。人为的方面,在Drupal官方上,有很多志愿者贡献自己的翻译文件(.po),你能下载安装它们。技术上的,该翻译组不是简单地搜索源代码调用t(),而是使用一个自动工具挑选出代码,且重新标示所有可翻译的字符串,这个工具只能翻译字面意思。你可以这样写:1 S: {" _6 G& k0 D3 a
) I& { g h+ M8 }0 ^2 Z _t('This is my string');
( [5 B+ t x* u$ q2 j6 j
w" a( O" |# e1 M. a但如果你象下面这样写,它不会有任何作用:
" ^, g( f+ U7 B6 o$ y" d
) {0 C7 `8 J5 @$ Z# D. c4 F- R$variable = 'This is a string';
2 q: W" J, B. K. h$ y5 K+ m8 U5 G+ ?9 c4 O% L0 F
t($variable);+ h1 D( _2 C! k" ] x
+ u% Z3 b, p( P& b为什么上面的代码不会有任何作用?因为当这个自动工具运行这段代码时,它不会执行这段代码,仅仅读取它。那个自动工具很难确认哪个字符串才是$variable变量。
' ~4 W% [8 l1 I( I% }4 R- x/ |9 Q1 \( }" `
所以,最好给t()的第一个参数一个字符串,而不是变量。
. |, R8 f$ O2 X9 `% t9 D1 f4 `7 E& ?7 D; {0 S
6 A$ f2 C, N% ] J* C$ }& e6 f1 Z5 K( k g
最后,是关于t()怎样完成一些其它的功能。它提供了一个比常规方法更安全的变量处理方法。在许多php应用程序中,你可能见过这样的代码:
4 x; p' D- J$ H+ j+ A
7 a$ }) T* O* P" h2 Fprint "Welcome, $username.";
) k u. s, M, S/ Z8 G0 k4 B! ?6 S0 M: E' ~: d0 G7 G8 v* b0 N+ {, e
上面的代码就是显示用户输入的一个用户名。糟糕的是,用户可能输入一段Javascript或者其它代码在username这个变量里,这将会影响你的程序。
8 h1 B( g9 D9 `0 L3 n7 ~& B# A% V0 }- h- ?# ^: r! Y% U' m! l
t()提供一个多样的更安全的替代符。这时,它需要一个关联数组作为第二个参数。下面就是一段代码例子:' l7 S9 a4 I0 N; x. s" M- p
4 }$ d$ R! @8 z* n3 `
$values = array('@user' => $username);. ]. w5 _+ _0 v9 D; J0 l ^
6 l {' w& j' k [1 ]' N2 i/ S8 g1 _0 n
print t('Welcome, @user', $values);" }" q, r& D' {0 c5 G
- _9 q; a% O7 W5 {上面的替换过程经过Drupal的安全处理。
7 k. u8 R8 |) B8 y4 p
2 g- P- f' X% Z
3 [( ]2 c; p2 l' Q7 V& h8 S( ~# Z, W* o( A5 Y& A" H* o
如果替换符是以@开头,在替换它之前,Drupal将使用内置的check_plain()对值进行处理。
# p2 z. y. A" [2 p) V
- }* G3 ^5 q& M( i) E, x% x* G如果你确信你的字符串不包含任何危险信息,那么你可以使用!开头。Drupal不会对值进行任何处理,除了替换。比如:
( X0 U. g8 S# l/ u! _
; \# r0 a+ I- U5 T' U$values = array('!url' => 'http://example.com');5 H% X* ~2 u$ q
5 g) J" U! p2 X' q$ nprint t('The website can be found at !url', $values);' }0 ^5 Q, E) v! X
% L* K: R" {5 G) `- w4 l
; K: w: }/ [* B% d; H& v& l- M* W0 {! T5 o" X
第三种替换符是以%开头,它过滤掉代码,并告诉Drupal字符串是重点,% @, P z! D u( q; [
Z( T I: v; Z" P; R( u
$values = array('%color' => 'blue');
. I" W- q3 _% K" j" S: Y" H. H' I3 L. |" a- |4 W1 p
print t('My favorite color is %color.', $values);
; X" J+ S, I4 C: Q9 g8 a0 B* n) L) B6 V" Z
它不仅移除危险的字符串,而且会在替换的文本两端加入强调标签,比如“<em></em>”。你可以在theme_placeholder()里查看详细实现。
9 H# O/ B7 s- s% A! ^
1 x v6 F6 G7 c4 I B$ N1 C" Z) v& p3 Z4 C# T8 v5 C4 K7 f
8 s0 Q( ^( n: Q7 a U& o+ x
还有更多的功能能被t()实现,format_plural()等。如果你象查看更多,请访问:http://api.drupal.org/api/function/t/7。
+ \4 m9 D/ ^5 G2 K0 S1 v2 @
, B; }% d, I7 r. _# e$ L9 x感谢溯游分享!!!3 P- }$ _% ~- H8 Z- {
7 H M9 ~! C' N! o. c$ Q2 f
( H+ q# G$ z( ]& p3 \- X- b( N! ]$ y$ I. [9 M" `) a2 C1 B
, ~, I7 D; t- W: C: c+ a4 V
; ]. T3 f+ @9 `$ H5 K& e- T4 O1 {' _
|
|