aboutsummaryrefslogtreecommitdiff
path: root/src/translate.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/translate.erl')
-rw-r--r--src/translate.erl219
1 files changed, 102 insertions, 117 deletions
diff --git a/src/translate.erl b/src/translate.erl
index 42eabd988..3257608f7 100644
--- a/src/translate.erl
+++ b/src/translate.erl
@@ -25,151 +25,136 @@
%%%----------------------------------------------------------------------
-module(translate).
+
-author('alexey@process-one.net').
--export([start/0,
- load_dir/1,
- load_file/2,
+-export([start/0, load_dir/1, load_file/2,
translate/2]).
-include("ejabberd.hrl").
start() ->
ets:new(translations, [named_table, public]),
- Dir =
- case os:getenv("EJABBERD_MSGS_PATH") of
+ Dir = case os:getenv("EJABBERD_MSGS_PATH") of
false ->
case code:priv_dir(ejabberd) of
- {error, _} ->
- ?MSGS_DIR;
- Path ->
- filename:join([Path, "msgs"])
+ {error, _} -> ?MSGS_DIR;
+ Path -> filename:join([Path, "msgs"])
end;
- Path ->
- Path
- end,
- load_dir(Dir),
+ Path -> Path
+ end,
+ load_dir(iolist_to_binary(Dir)),
ok.
+-spec load_dir(binary()) -> ok.
+
load_dir(Dir) ->
case file:list_dir(Dir) of
- {ok, Files} ->
- MsgFiles = lists:filter(
- fun(FN) ->
- case string:len(FN) > 4 of
- true ->
- string:substr(
- FN,
- string:len(FN) - 3) == ".msg";
- _ ->
- false
- end
- 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)
- end, MsgFiles),
- ok;
- {error, Reason} ->
- ?ERROR_MSG("~p", [Reason])
+ {ok, Files} ->
+ MsgFiles = lists:filter(fun (FN) ->
+ case length(FN) > 4 of
+ true ->
+ string:substr(FN, length(FN) - 3)
+ == ".msg";
+ _ -> false
+ end
+ end,
+ Files),
+ lists:foreach(fun (FNS) ->
+ FN = list_to_binary(FNS),
+ LP = ascii_tolower(str:substr(FN, 1,
+ byte_size(FN) - 4)),
+ L = case str:tokens(LP, <<".">>) of
+ [Language] -> Language;
+ [Language, _Project] -> Language
+ end,
+ load_file(L, <<Dir/binary, "/", FN/binary>>)
+ end,
+ MsgFiles),
+ ok;
+ {error, Reason} -> ?ERROR_MSG("~p", [Reason])
end.
load_file(Lang, File) ->
case file:consult(File) of
- {ok, Terms} ->
- lists:foreach(fun({Orig, Trans}) ->
- Trans1 = case Trans of
- "" ->
- Orig;
- _ ->
- Trans
- end,
- ets:insert(translations,
- {{Lang, Orig}, Trans1})
- end, Terms);
- %% Code copied from ejabberd_config.erl
- {error, {_LineNumber, erl_parse, _ParseMessage} = Reason} ->
- ExitText = lists:flatten(File ++ " approximately in the line "
- ++ file:format_error(Reason)),
- ?ERROR_MSG("Problem loading translation file ~n~s", [ExitText]),
- exit(ExitText);
- {error, Reason} ->
- ExitText = lists:flatten(File ++ ": " ++ file:format_error(Reason)),
- ?ERROR_MSG("Problem loading translation file ~n~s", [ExitText]),
- exit(ExitText)
+ {ok, Terms} ->
+ lists:foreach(fun ({Orig, Trans}) ->
+ Trans1 = case Trans of
+ <<"">> -> Orig;
+ _ -> Trans
+ end,
+ ets:insert(translations,
+ {{Lang, iolist_to_binary(Orig)},
+ iolist_to_binary(Trans1)})
+ end,
+ Terms);
+ %% Code copied from ejabberd_config.erl
+ {error,
+ {_LineNumber, erl_parse, _ParseMessage} = Reason} ->
+ ExitText = iolist_to_binary([File,
+ " approximately in the line ",
+ file:format_error(Reason)]),
+ ?ERROR_MSG("Problem loading translation file ~n~s",
+ [ExitText]),
+ exit(ExitText);
+ {error, Reason} ->
+ ExitText = iolist_to_binary([File, ": ",
+ file:format_error(Reason)]),
+ ?ERROR_MSG("Problem loading translation file ~n~s",
+ [ExitText]),
+ exit(ExitText)
end.
+-spec translate(binary(), binary()) -> binary().
+
translate(Lang, Msg) ->
LLang = ascii_tolower(Lang),
case ets:lookup(translations, {LLang, Msg}) of
- [{_, Trans}] ->
- Trans;
- _ ->
- ShortLang = case string:tokens(LLang, "-") of
- [] ->
- LLang;
- [SL | _] ->
- SL
- end,
- case ShortLang of
- "en" ->
- Msg;
- LLang ->
- translate(Msg);
- _ ->
- case ets:lookup(translations, {ShortLang, Msg}) of
- [{_, Trans}] ->
- Trans;
- _ ->
- translate(Msg)
- end
- end
+ [{_, Trans}] -> Trans;
+ _ ->
+ ShortLang = case str:tokens(LLang, <<"-">>) of
+ [] -> LLang;
+ [SL | _] -> SL
+ end,
+ case ShortLang of
+ <<"en">> -> Msg;
+ LLang -> translate(Msg);
+ _ ->
+ case ets:lookup(translations, {ShortLang, Msg}) of
+ [{_, Trans}] -> Trans;
+ _ -> translate(Msg)
+ end
+ end
end.
translate(Msg) ->
case ?MYLANG of
- undefined ->
- Msg;
- "en" ->
- Msg;
- Lang ->
- LLang = ascii_tolower(Lang),
- case ets:lookup(translations, {LLang, Msg}) of
- [{_, Trans}] ->
- Trans;
- _ ->
- ShortLang = case string:tokens(LLang, "-") of
- [] ->
- LLang;
- [SL | _] ->
- SL
- end,
- case ShortLang of
- "en" ->
- Msg;
- Lang ->
- Msg;
- _ ->
- case ets:lookup(translations, {ShortLang, Msg}) of
- [{_, Trans}] ->
- Trans;
- _ ->
- Msg
- end
- end
- end
+ <<"en">> -> Msg;
+ Lang ->
+ LLang = ascii_tolower(Lang),
+ case ets:lookup(translations, {LLang, Msg}) of
+ [{_, Trans}] -> Trans;
+ _ ->
+ ShortLang = case str:tokens(LLang, <<"-">>) of
+ [] -> LLang;
+ [SL | _] -> SL
+ end,
+ case ShortLang of
+ <<"en">> -> Msg;
+ Lang -> Msg;
+ _ ->
+ case ets:lookup(translations, {ShortLang, Msg}) of
+ [{_, Trans}] -> Trans;
+ _ -> Msg
+ end
+ end
+ 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(B) ->
+ iolist_to_binary(ascii_tolower_s(binary_to_list(B))).
+ascii_tolower_s([C | Cs]) when C >= $A, C =< $Z ->
+ [C + ($a - $A) | ascii_tolower_s(Cs)];
+ascii_tolower_s([C | Cs]) -> [C | ascii_tolower_s(Cs)];
+ascii_tolower_s([]) -> [].