记记Drupal7中t()函数的相关用法,如有疏漏之处,还望指正。
/ E1 a9 m. P2 Y, Z! S% t' h0 M' x" \. `& Y7 v* g
每个开发者必须理解的三个功能:
7 T7 k5 D M9 S; h* }
' }! D% ]& C) H5 N1 X+ V' i1.t()是怎样被执行的?5 l' P, x6 R& b) x
1 c2 R! r9 C) K+ |$ \) \2.Drupal怎样建立翻译表?- E5 U$ Z/ N5 [, K% m4 u
* ?( k! Q+ L/ {4 s- A2 v" v
3.怎样使用t()实现一些其它功能?$ n8 t4 }$ Y) j3 P! n& u H
+ w: W9 O; n. X& E% R% k$ P" Y+ B( R; u/ x6 F" t4 ?
6 J& f7 T% s+ x6 q
首先,让我们看下t()的执行过程。如果多语言模块没被开启,并且第二个参数没被传递到t(),它仅仅返回原来的字符串。如果多语言模块被开启,并且传递给t()第二个参数,Drupal将试图用适当的语言替换掉默认的字符串。 {4 \- n6 C; l& F0 t! W
3 N/ Q/ ]6 L7 w8 ?9 C9 ]3 G$ N+ [& t/ w9 O( b8 u2 o
- {5 F2 G# n& I/ X$ P6 c然后,让我们看下Drupal怎样生成翻译信息的。这有两个方面:人为的和技术上的。人为的方面,在Drupal官方上,有很多志愿者贡献自己的翻译文件(.po),你能下载安装它们。技术上的,该翻译组不是简单地搜索源代码调用t(),而是使用一个自动工具挑选出代码,且重新标示所有可翻译的字符串,这个工具只能翻译字面意思。你可以这样写:
* r3 `4 @" w4 P7 ^
# @1 v/ Z. H. Y9 [t('This is my string');/ D8 p& P% `# R& G
* u* U, |: N! m$ u$ z
但如果你象下面这样写,它不会有任何作用:) C7 h+ \) Z/ V
1 t/ [, S/ ?( z0 h1 j
$variable = 'This is a string';3 S) m2 z( t4 Q+ O/ V0 l7 B" C0 m( ?
0 @ M( Q$ [0 p5 P" }, l* |
t($variable);
3 E9 P8 r7 j9 G4 w' L
0 ^( p3 l$ j0 I0 M# L+ o2 K6 J为什么上面的代码不会有任何作用?因为当这个自动工具运行这段代码时,它不会执行这段代码,仅仅读取它。那个自动工具很难确认哪个字符串才是$variable变量。
1 b* X# {4 x, Q$ E! \6 w$ g; |( l( k% k* d, Z8 [. S
所以,最好给t()的第一个参数一个字符串,而不是变量。
) S6 ]" M; i) c
6 J1 J- _0 Y2 R& }* b! n4 E1 R) ^- T$ @' W& ?
8 U' m2 G. L2 `% d1 e# {1 j$ e' v最后,是关于t()怎样完成一些其它的功能。它提供了一个比常规方法更安全的变量处理方法。在许多php应用程序中,你可能见过这样的代码:
4 }* W2 |) ^3 X) C
7 l; O6 {% r# U' |print "Welcome, $username.";
5 J( ?( j8 \5 `, w- i' |
$ [5 @: b% ?7 _6 B6 q上面的代码就是显示用户输入的一个用户名。糟糕的是,用户可能输入一段Javascript或者其它代码在username这个变量里,这将会影响你的程序。
2 n8 X4 f8 _$ d: |8 m% I6 h
$ d1 x4 l: W5 j! {t()提供一个多样的更安全的替代符。这时,它需要一个关联数组作为第二个参数。下面就是一段代码例子:
6 N( h& ^7 E5 M- t; e5 h
9 T8 A8 l0 O9 o4 X$values = array('@user' => $username);
2 A5 b3 C6 E0 s) T6 J
' q4 L$ ?+ F( x& ?" x: iprint t('Welcome, @user', $values);
) k8 y8 s z& u& T/ g1 v5 a0 @/ s
上面的替换过程经过Drupal的安全处理。6 u: g7 J; F4 s
/ U; w+ X/ k; ~+ m6 N1 A& t S; g2 f2 A
( W) x2 @6 f- G% W' g* w如果替换符是以@开头,在替换它之前,Drupal将使用内置的check_plain()对值进行处理。
" G% _% G# M2 P+ A6 l( C2 l4 b- h& ^
3 c b7 P8 g8 ~+ Z' n如果你确信你的字符串不包含任何危险信息,那么你可以使用!开头。Drupal不会对值进行任何处理,除了替换。比如:3 X5 U6 x/ ?$ G. F
; B2 D) d- X* x4 ]: F8 r8 J- t
$values = array('!url' => 'http://example.com');6 o) g; ?3 e1 M
$ i" E. d; P5 z. A( oprint t('The website can be found at !url', $values);
" ^' _' H7 e/ i8 m" I' c& J6 ?5 N4 g0 H: C# C/ A! d/ [
0 J9 P+ X% ^' Q/ |* ]% d
) ]" x8 A7 L+ a$ \7 y$ e第三种替换符是以%开头,它过滤掉代码,并告诉Drupal字符串是重点,+ U* l+ z) R1 D$ H' v
9 m- E1 }7 f' o9 Z j( q8 \7 Q7 M0 e$values = array('%color' => 'blue');
5 F m, [1 n+ R& a( d: S1 R4 A! t. Q
print t('My favorite color is %color.', $values);
4 ^" s6 G* q1 Q+ M: A9 A7 l
+ l6 E8 N7 h3 o3 `3 ]3 D它不仅移除危险的字符串,而且会在替换的文本两端加入强调标签,比如“<em></em>”。你可以在theme_placeholder()里查看详细实现。
z! C* @+ c+ z0 l
9 R3 A, E: G& S, z* T3 f/ @, g/ y8 t* f9 w3 M- y
" |% r l. i" c& T* U8 n5 P3 y5 H
还有更多的功能能被t()实现,format_plural()等。如果你象查看更多,请访问:http://api.drupal.org/api/function/t/7。
2 G! G2 ]( ?. W: Q. L9 C6 E5 _8 R' \* b, u! I- H
感谢溯游分享!!!
* |* S$ w- p8 v0 ]: o1 f: j) |9 \& t
1 D0 G4 u* u+ L" D) X* |6 d) n
* U+ S i3 J; U1 \9 F. H2 y, g
* P% u+ A2 E3 z
' A, ~% @* W$ e; K" } |
|