diff options
Diffstat (limited to 'src/translate.erl')
-rw-r--r-- | src/translate.erl | 219 |
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([]) -> []. |