aboutsummaryrefslogtreecommitdiff
path: root/src/translate.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/translate.erl')
-rw-r--r--src/translate.erl57
1 files changed, 38 insertions, 19 deletions
diff --git a/src/translate.erl b/src/translate.erl
index 0488530f3..391d22574 100644
--- a/src/translate.erl
+++ b/src/translate.erl
@@ -32,6 +32,8 @@
load_file/2,
translate/2]).
+-export([tokens/2, ascii_tolower/1]).
+
-include("ejabberd.hrl").
start() ->
@@ -67,13 +69,13 @@ load_dir(Dir) ->
end, Files),
lists:foreach(
fun(FN) ->
- LP = ascii_tolower(
- string:substr(FN, 1, string:len(FN) - 4)),
- L = case string:tokens(LP, ".") of
- [Language] -> Language;
- [Language, _Project] -> Language
- end,
- load_file(L, Dir ++ "/" ++ FN)
+ LP = string:substr(FN, 1, string:len(FN) - 4),
+ L1 = case string:tokens(LP, ".") of
+ [Language] -> Language;
+ [Language, _Project] -> Language
+ end,
+ L2 = ascii_tolower(list_to_binary(L1)),
+ load_file(L2, Dir ++ "/" ++ FN)
end, MsgFiles),
ok;
{error, Reason} ->
@@ -111,14 +113,14 @@ translate(Lang, Msg) ->
[{_, Trans}] ->
Trans;
_ ->
- ShortLang = case string:tokens(LLang, "-") of
+ ShortLang = case tokens(LLang, $-) of
[] ->
LLang;
[SL | _] ->
SL
end,
case ShortLang of
- "en" ->
+ <<"en">> ->
Msg;
LLang ->
translate(Msg);
@@ -133,27 +135,29 @@ translate(Lang, Msg) ->
end.
translate(Msg) ->
+ %%TODO: ?MYLANG macro returns lang as a list(). Lang should be a binary.
case ?MYLANG of
undefined ->
Msg;
"en" ->
Msg;
Lang ->
- LLang = ascii_tolower(Lang),
+ BLang = list_to_binary(Lang),
+ LLang = ascii_tolower(BLang),
case ets:lookup(translations, {LLang, Msg}) of
[{_, Trans}] ->
Trans;
_ ->
- ShortLang = case string:tokens(LLang, "-") of
+ ShortLang = case tokens(LLang, $-) of
[] ->
LLang;
[SL | _] ->
SL
end,
case ShortLang of
- "en" ->
+ <<"en">> ->
Msg;
- Lang ->
+ BLang ->
Msg;
_ ->
case ets:lookup(translations, {ShortLang, Msg}) of
@@ -166,10 +170,25 @@ translate(Msg) ->
end
end.
-ascii_tolower([C | Cs]) when C >= $A, C =< $Z ->
- [C + ($a - $A) | ascii_tolower(Cs)];
-ascii_tolower([C | Cs]) ->
- [C | ascii_tolower(Cs)];
-ascii_tolower([]) ->
- [].
+ascii_tolower(undefined) ->
+ <<>>;
+ascii_tolower(Bin) ->
+ << <<(char_tolower(X))>> || <<X>> <= Bin >>.
+
+char_tolower(C) when C >= $A, C =< $Z ->
+ C + ($a -$A);
+char_tolower(C) ->
+ C.
+
+tokens(<<>>,_Sep) ->
+ [];
+tokens(Bin, Sep) ->
+ tokens(Bin, Sep, <<>>, []).
+
+tokens(<<>>, _Sep, T, Tokens) ->
+ lists:reverse([T|Tokens]);
+tokens(<<Sep, R/binary>>, Sep, T, Tokens) ->
+ tokens(R, Sep, <<>>, [T | Tokens]);
+tokens(<<C, R/binary>>, Sep, T, Tokens) ->
+ tokens(R, Sep, <<T/binary, C>>, Tokens).