记记Drupal7中t()函数的相关用法,如有疏漏之处,还望指正。
% S& u7 u" K, L: ^# x/ f+ g. d! P2 ?% C2 \/ I: v
每个开发者必须理解的三个功能:
0 P2 |4 e7 D! p+ q& \$ z
X* _5 N3 r( f' o1 p1 O" w1 E$ n1.t()是怎样被执行的?! r- Y' T( T1 C! D D1 b
2 G0 G7 i( ] I" J' ^4 n
2.Drupal怎样建立翻译表?: b; \4 r+ L% ~6 ~8 d# j& `
' W$ h# |8 g0 p$ F% t
3.怎样使用t()实现一些其它功能?
7 B: @6 k5 x4 s
' E [, J" q Y# j; L0 W
; `- y" J \' i+ M, `" b- X' b$ X7 @# f" X0 i
首先,让我们看下t()的执行过程。如果多语言模块没被开启,并且第二个参数没被传递到t(),它仅仅返回原来的字符串。如果多语言模块被开启,并且传递给t()第二个参数,Drupal将试图用适当的语言替换掉默认的字符串。
2 R* I |( i: k% d ^- t+ E' B$ q& S7 n
8 b, f0 O1 A/ O$ f2 J6 O- ]
$ m6 U F0 f- d4 R* K& j然后,让我们看下Drupal怎样生成翻译信息的。这有两个方面:人为的和技术上的。人为的方面,在Drupal官方上,有很多志愿者贡献自己的翻译文件(.po),你能下载安装它们。技术上的,该翻译组不是简单地搜索源代码调用t(),而是使用一个自动工具挑选出代码,且重新标示所有可翻译的字符串,这个工具只能翻译字面意思。你可以这样写:
5 B0 K n) b* f, w: Y7 Z' c& A& p4 \) {% i0 J' ]6 L/ @) x0 W0 G
t('This is my string');
9 j* C: h7 X! w5 k7 i/ c9 _6 L
( E% S8 h2 ^7 o c/ B& y% n但如果你象下面这样写,它不会有任何作用:0 v1 y/ F9 ?. r: W% t9 c' _( K; f0 b
$ F$ q P2 c* H8 q5 M3 q# C6 g$variable = 'This is a string';
4 | }5 b# k3 G; q7 v/ a# _ Q" ~
1 x- ]6 n$ y/ M1 E7 z% St($variable); l/ u0 e4 z' @" @* G; z0 `
' Y; r3 }3 e; W4 B/ M. a为什么上面的代码不会有任何作用?因为当这个自动工具运行这段代码时,它不会执行这段代码,仅仅读取它。那个自动工具很难确认哪个字符串才是$variable变量。
* W8 j5 Y8 Y3 i' _* C( V! ~: y
W- e6 [* Z0 @. j) j3 M1 t! w* m所以,最好给t()的第一个参数一个字符串,而不是变量。
# r2 f. Y% Y; j4 S4 c$ d( \4 g! X# O7 P& U4 J# ~# l
8 F/ h& E. t3 v1 c# M D$ l
9 ?' K0 y& k% L: R* l最后,是关于t()怎样完成一些其它的功能。它提供了一个比常规方法更安全的变量处理方法。在许多php应用程序中,你可能见过这样的代码:
& r& F+ H: K8 E0 A/ q" @5 _$ Y6 P# }4 Y* g
print "Welcome, $username.";
4 S; W& E" T9 x2 [, H1 l/ B, s1 h7 o
上面的代码就是显示用户输入的一个用户名。糟糕的是,用户可能输入一段Javascript或者其它代码在username这个变量里,这将会影响你的程序。; z9 C2 B8 }1 G. r. B+ Y' ~0 p7 x9 E
9 H& {4 T8 g. {t()提供一个多样的更安全的替代符。这时,它需要一个关联数组作为第二个参数。下面就是一段代码例子:8 H6 X: K9 w7 a% |; K* d6 r
3 m0 h( X* ~2 l5 t) [ |
$values = array('@user' => $username);
7 n4 j0 r4 o; D4 y! Z3 @" D# D/ u9 L" Y+ B6 m
print t('Welcome, @user', $values);- J0 e6 u, h) J
: u/ \7 C5 G. I+ F
上面的替换过程经过Drupal的安全处理。
$ I C. S! c& w: [( P; h0 Y) ~0 R% v
6 ?2 O6 M' ?6 E
. @! n0 `% @: z: c% q) b
/ Y, E1 y2 i% [/ t, W如果替换符是以@开头,在替换它之前,Drupal将使用内置的check_plain()对值进行处理。
1 q% ^9 R7 D( n- x% c1 Z
1 Z" {4 y. Q* D7 G2 x( j: l0 w" v如果你确信你的字符串不包含任何危险信息,那么你可以使用!开头。Drupal不会对值进行任何处理,除了替换。比如:/ ~$ t) e6 ^) v' M: U
, x6 X0 Z1 [2 l, }- S+ ], R
$values = array('!url' => 'http://example.com');: k/ S6 X% O+ d1 `& y% X) Z1 x# q
" B( ?! e$ L9 `" @
print t('The website can be found at !url', $values);" h. \& X, t3 e4 M- o
% R. p1 V5 `% L6 J# P% t% A
/ Z; b8 \5 C- |, b/ p5 [5 E
: b k+ d+ b. n# b/ n% P: b- K% O第三种替换符是以%开头,它过滤掉代码,并告诉Drupal字符串是重点,6 W" T( Q) I2 E
) Y; l+ e/ e9 A1 ]- K* L
$values = array('%color' => 'blue');0 ^; O9 H) D4 ~6 N" ]3 l# y
. ~0 }0 o, t8 r( J+ z, H5 G
print t('My favorite color is %color.', $values);9 m9 v! ~7 R7 @$ G, }6 S$ g
: i) P1 W" P" B$ ]: m6 S
它不仅移除危险的字符串,而且会在替换的文本两端加入强调标签,比如“<em></em>”。你可以在theme_placeholder()里查看详细实现。* q9 y: q, x( r2 G) M, _0 F: ]
5 C7 i4 }, O0 q/ m; j, V7 m8 C
2 N. j- G/ g' A+ e. ]0 h7 d/ Y7 }
. g* P/ h% v6 A3 l: ^7 ?还有更多的功能能被t()实现,format_plural()等。如果你象查看更多,请访问:http://api.drupal.org/api/function/t/7。6 H& v* X- ]/ I( y7 L9 B2 \
0 H @* z- v$ r8 i) X
感谢溯游分享!!!3 c% t( g" g% s& v4 I
7 M# x: `9 z' M1 F; G) P
- m- u7 {* v7 V! ]
" V3 ?2 Q; c9 j/ j1 i
; `+ o" G' |/ x- r, n7 D
3 Z2 e' ~' W0 h
|
|