ejabberd-2.1.11/ 0000775 0000000 0000000 00000000000 12240452476 010230 5 ustar ejabberd-2.1.11/COPYING 0000664 0000000 0000000 00000043320 12240230175 011253 0 ustar As a special exception, the authors give permission to link this program
with the OpenSSL library and distribute the resulting binary.
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Library General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
To be used, mod_pubsub must be configured :
%%% {mod_pubsub, [ % requires mod_caps
%%% {access_createnode, pubsub_createnode},
%%% {plugins, ["default", "pep","mb"]},
%%% {pep_mapping, [{"urn:xmpp:microblog", "mb"}]}
%%% ]},
%%% PubSub plugin nodes are using the {@link gen_pubsub_node} behaviour. Return the name of the node if known: Default is to return
%% node id. PubSub node tree plugins are using the {@link gen_nodetree} behaviour. This plugin development is still a work in progress. Due to optimizations in
%%% mod_pubsub, this plugin can not work anymore without altering functioning.
%%% Please, send us comments, feedback and improvements. Called during pubsub modules initialisation. Any pubsub plugin must
%% implement this function. It can return anything. This function is mainly used to trigger the setup task necessary for the
%% plugin. It can be used for example by the developer to create the specific
%% module database schema if it does not exists yet. Returns the default pubsub node tree options. No node record is stored on database. Just do nothing. Virtual node tree does not handle a node database. Any node is considered
%% as existing. Node record contains default values. Virtual node tree does not handle a node database. Any node is considered
%% as existing. Nodes list can not be determined. Virtual node tree does not handle parent/child. Child list is empty. Virtual node tree does not handle parent/child. Child list is empty. Virtual node tree does not handle parent/child. Child list is empty. Virtual node tree does not handle parent/child. Child list is empty. No node record is stored on database. Any valid node
%% is considered as already created. default allowed nodes: /home/host/user/any/node/name Virtual node tree does not handle parent/child.
%% node deletion just affects the corresponding node. The module {@module} defines the PubSub node
%%% tree plugin behaviour. This behaviour is used to check that a PubSub
%%% node tree plugin respects the current ejabberd PubSub plugin API. It is used as a default for all unknown PubSub node type. It can serve
%%% as a developer basis and reference to build its own custom pubsub node
%%% types. PubSub plugin nodes are using the {@link gen_node} behaviour. The API isn't stabilized yet. The pubsub plugin
%%% development is still a work in progress. However, the system is already
%%% useable and useful as is. Please, send us comments, feedback and
%%% improvements. Called during pubsub modules initialisation. Any pubsub plugin must
%% implement this function. It can return anything. This function is mainly used to trigger the setup task necessary for the
%% plugin. It can be used for example by the developer to create the specific
%% module database schema if it does not exists yet. Called during pubsub modules termination. Any pubsub plugin must
%% implement this function. It can return anything. Example of function return value: In {@link node_default}, the permission is decided by the place in the
%% hierarchy where the user is creating the node. The access parameter is also
%% checked in the default module. This parameter depends on the value of the
%% access_createnode ACL value in ejabberd config file. This function also check that node can be created a a children of its
%% parent node PubSub plugins can redefine the PubSub node creation rights as they
%% which. They can simply delegate this check to the {@link node_default}
%% module by implementing this function like this:
%% ```check_create_user_permission(Host, ServerHost, Node, ParentNode, Owner, Access) ->
%% node_default:check_create_user_permission(Host, ServerHost, Node, ParentNode, Owner, Access).''' purge items of deleted nodes after effective deletion. Accepts or rejects subcription requests on a PubSub node. The mechanism works as follow:
%% #ejabberd_commands{name = pow, tags = [test],
%%% desc = "Return the power of base for exponent",
%%% longdesc = "This is an example command. The formula is:\n"
%%% " power = base ^ exponent",
%%% module = ?MODULE, function = pow,
%%% args = [{base, integer}, {exponent, integer}],
%%% result = {power, integer}}
%%%
%%%
%%% === Implement the function associated to the command ===
%%%
%%% Now implement a function in your module that matches the arguments
%%% and result of the ejabberd command.
%%%
%%% For example the function calc_power gets two integers Base and
%%% Exponent. It calculates the power and rounds to an integer:
%%%
%%% calc_power(Base, Exponent) ->
%%% PowFloat = math:pow(Base, Exponent),
%%% round(PowFloat).
%%%
%%% Since this function will be called by ejabberd_commands, it must be exported.
%%% Add to your module:
%%% -export([calc_power/2]).
%%%
%%% Only some types of result formats are allowed.
%%% If the format is defined as 'rescode', then your function must return:
%%% ok | true | atom()
%%% where the atoms ok and true as considered positive answers,
%%% and any other response atom is considered negative.
%%%
%%% If the format is defined as 'restuple', then the command must return:
%%% {rescode(), string()}
%%%
%%% If the format is defined as '{list, something()}', then the command
%%% must return a list of something().
%%%
%%%
%%% === Register the command ===
%%%
%%% Define this function and put inside the #ejabberd_command you
%%% defined in the beginning:
%%%
%%% commands() ->
%%% [
%%%
%%% ].
%%%
%%% You need to include this header file in order to use the record:
%%%
%%% -include("ejabberd_commands.hrl").
%%%
%%% When your module is initialized or started, register your commands:
%%%
%%% ejabberd_commands:register_commands(commands()),
%%%
%%% And when your module is stopped, unregister your commands:
%%%
%%% ejabberd_commands:unregister_commands(commands()),
%%%
%%% That's all! Now when your module is started, the command will be
%%% registered and any frontend can access it. For example:
%%%
%%% $ ejabberdctl help pow
%%%
%%% Command Name: pow
%%%
%%% Arguments: base::integer
%%% exponent::integer
%%%
%%% Returns: power::integer
%%%
%%% Tags: test
%%%
%%% Description: Return the power of base for exponent
%%%
%%% This is an example command. The formula is:
%%% power = base ^ exponent
%%%
%%% $ ejabberdctl pow 3 4
%%% 81
%%%
%%%
%%%
%%% == Execute an ejabberd command ==
%%%
%%% ejabberd commands are mean to be executed using any valid
%%% frontend. An ejabberd commands is implemented in a regular Erlang
%%% function, so it is also possible to execute this function in any
%%% Erlang module, without dealing with the associated ejabberd
%%% commands.
%%%
%%%
%%% == Frontend to ejabberd commands ==
%%%
%%% Currently there are two frontends to ejabberd commands: the shell
%%% script {@link ejabberd_ctl. ejabberdctl}, and the XML-RPC server
%%% ejabberd_xmlrpc.
%%%
%%%
%%% === ejabberdctl as a frontend to ejabberd commands ===
%%%
%%% It is possible to use ejabberdctl to get documentation of any
%%% command. But ejabberdctl does not support all the argument types
%%% allowed in ejabberd commands, so there are some ejabberd commands
%%% that cannot be executed using ejabberdctl.
%%%
%%% Also note that the ejabberdctl shell administration script also
%%% manages ejabberdctl commands, which are unrelated to ejabberd
%%% commands and can only be executed using ejabberdctl.
%%%
%%%
%%% === ejabberd_xmlrpc as a frontend to ejabberd commands ===
%%%
%%% ejabberd_xmlrpc provides an XML-RPC server to execute ejabberd commands.
%%% ejabberd_xmlrpc is a contributed module published in ejabberd-modules SVN.
%%%
%%% Since ejabberd_xmlrpc does not provide any method to get documentation
%%% of the ejabberd commands, please use ejabberdctl to know which
%%% commands are available, and their usage.
%%%
%%% The number and format of the arguments provided when calling an
%%% ejabberd command must match the definition of that command. Please
%%% make sure the XML-RPC call provides the required arguments, with
%%% the specified format. The order of the arguments in an XML-RPC
%%% call is not important, because all the data is tagged and will be
%%% correctly prepared by ejabberd_xmlrpc before executing the ejabberd
%%% command.
%%% TODO: consider this feature:
%%% All commands are catched. If an error happens, return the restuple:
%%% {error, flattened error string}
%%% This means that ecomm call APIs (ejabberd_ctl, ejabberd_xmlrpc) need to allows this.
%%% And ejabberd_xmlrpc must be prepared to handle such an unexpected response.
-module(ejabberd_commands).
-author('badlop@process-one.net').
-export([init/0,
list_commands/0,
get_command_format/1,
get_command_definition/1,
get_tags_commands/0,
register_commands/1,
unregister_commands/1,
execute_command/2,
execute_command/4
]).
-include("ejabberd_commands.hrl").
-include("ejabberd.hrl").
init() ->
ets:new(ejabberd_commands, [named_table, set, public,
{keypos, #ejabberd_commands.name}]).
%% @spec ([ejabberd_commands()]) -> ok
%% @doc Register ejabberd commands.
%% If a command is already registered, a warning is printed and the old command is preserved.
register_commands(Commands) ->
lists:foreach(
fun(Command) ->
case ets:insert_new(ejabberd_commands, Command) of
true ->
ok;
false ->
?DEBUG("This command is already defined:~n~p", [Command])
end
end,
Commands).
%% @spec ([ejabberd_commands()]) -> ok
%% @doc Unregister ejabberd commands.
unregister_commands(Commands) ->
lists:foreach(
fun(Command) ->
ets:delete_object(ejabberd_commands, Command)
end,
Commands).
%% @spec () -> [{Name::atom(), Args::[aterm()], Desc::string()}]
%% @doc Get a list of all the available commands, arguments and description.
list_commands() ->
Commands = ets:match(ejabberd_commands,
#ejabberd_commands{name = '$1',
args = '$2',
desc = '$3',
_ = '_'}),
[{A, B, C} || [A, B, C] <- Commands].
%% @spec (Name::atom()) -> {Args::[aterm()], Result::rterm()} | {error, command_unknown}
%% @doc Get the format of arguments and result of a command.
get_command_format(Name) ->
Matched = ets:match(ejabberd_commands,
#ejabberd_commands{name = Name,
args = '$1',
result = '$2',
_ = '_'}),
case Matched of
[] ->
{error, command_unknown};
[[Args, Result]] ->
{Args, Result}
end.
%% @spec (Name::atom()) -> ejabberd_commands() | command_not_found
%% @doc Get the definition record of a command.
get_command_definition(Name) ->
case ets:lookup(ejabberd_commands, Name) of
[E] -> E;
[] -> command_not_found
end.
%% @spec (Name::atom(), Arguments) -> ResultTerm | {error, command_unknown}
%% @doc Execute a command.
execute_command(Name, Arguments) ->
execute_command([], noauth, Name, Arguments).
%% @spec (AccessCommands, Auth, Name::atom(), Arguments) -> ResultTerm | {error, Error}
%% where
%% AccessCommands = [{Access, CommandNames, Arguments}]
%% Auth = {User::string(), Server::string(), Password::string()} | noauth
%% Method = atom()
%% Arguments = [any()]
%% Error = command_unknown | account_unprivileged | invalid_account_data | no_auth_provided
execute_command(AccessCommands, Auth, Name, Arguments) ->
case ets:lookup(ejabberd_commands, Name) of
[Command] ->
try check_access_commands(AccessCommands, Auth, Name, Command, Arguments) of
ok -> execute_command2(Command, Arguments)
catch
{error, Error} -> {error, Error}
end;
[] -> {error, command_unknown}
end.
execute_command2(Command, Arguments) ->
Module = Command#ejabberd_commands.module,
Function = Command#ejabberd_commands.function,
?DEBUG("Executing command ~p:~p with Args=~p", [Module, Function, Arguments]),
apply(Module, Function, Arguments).
%% @spec () -> [{Tag::string(), [CommandName::string()]}]
%% @doc Get all the tags and associated commands.
get_tags_commands() ->
CommandTags = ets:match(ejabberd_commands,
#ejabberd_commands{
name = '$1',
tags = '$2',
_ = '_'}),
Dict = lists:foldl(
fun([CommandNameAtom, CTags], D) ->
CommandName = atom_to_list(CommandNameAtom),
case CTags of
[] ->
orddict:append("untagged", CommandName, D);
_ ->
lists:foldl(
fun(TagAtom, DD) ->
Tag = atom_to_list(TagAtom),
orddict:append(Tag, CommandName, DD)
end,
D,
CTags)
end
end,
orddict:new(),
CommandTags),
orddict:to_list(Dict).
%% -----------------------------
%% Access verification
%% -----------------------------
%% @spec (AccessCommands, Auth, Method, Command, Arguments) -> ok
%% where
%% AccessCommands = [ {Access, CommandNames, Arguments} ]
%% Auth = {User::string(), Server::string(), Password::string()} | noauth
%% Method = atom()
%% Arguments = [any()]
%% @doc Check access is allowed to that command.
%% At least one AccessCommand must be satisfied.
%% It may throw {error, Error} where:
%% Error = account_unprivileged | invalid_account_data
check_access_commands([], _Auth, _Method, _Command, _Arguments) ->
ok;
check_access_commands(AccessCommands, Auth, Method, Command, Arguments) ->
AccessCommandsAllowed =
lists:filter(
fun({Access, Commands, ArgumentRestrictions}) ->
case check_access(Access, Auth) of
true ->
check_access_command(Commands, Command, ArgumentRestrictions,
Method, Arguments);
false ->
false
end
end,
AccessCommands),
case AccessCommandsAllowed of
[] -> throw({error, account_unprivileged});
L when is_list(L) -> ok
end.
check_auth(noauth) ->
no_auth_provided;
check_auth({User, Server, Password}) ->
%% Check the account exists and password is valid
AccountPass = ejabberd_auth:get_password_s(User, Server),
AccountPassMD5 = get_md5(AccountPass),
case Password of
AccountPass -> {ok, User, Server};
AccountPassMD5 -> {ok, User, Server};
_ -> throw({error, invalid_account_data})
end.
get_md5(AccountPass) ->
lists:flatten([io_lib:format("~.16B", [X])
|| X <- binary_to_list(crypto:md5(AccountPass))]).
check_access(all, _) ->
true;
check_access(Access, Auth) ->
{ok, User, Server} = check_auth(Auth),
%% Check this user has access permission
case acl:match_rule(Server, Access, jlib:make_jid(User, Server, "")) of
allow -> true;
deny -> false
end.
check_access_command(Commands, Command, ArgumentRestrictions, Method, Arguments) ->
case Commands==all orelse lists:member(Method, Commands) of
true -> check_access_arguments(Command, ArgumentRestrictions, Arguments);
false -> false
end.
check_access_arguments(Command, ArgumentRestrictions, Arguments) ->
ArgumentsTagged = tag_arguments(Command#ejabberd_commands.args, Arguments),
lists:all(
fun({ArgName, ArgAllowedValue}) ->
%% If the call uses the argument, check the value is acceptable
case lists:keysearch(ArgName, 1, ArgumentsTagged) of
{value, {ArgName, ArgValue}} -> ArgValue == ArgAllowedValue;
false -> true
end
end, ArgumentRestrictions).
tag_arguments(ArgsDefs, Args) ->
lists:zipwith(
fun({ArgName, _ArgType}, ArgValue) ->
{ArgName, ArgValue}
end,
ArgsDefs,
Args).
ejabberd-2.1.11/src/win32_dns.erl 0000664 0000000 0000000 00000010625 12240230175 013323 0 ustar %%%----------------------------------------------------------------------
%%% File : win32_dns.erl
%%% Author : Geoff Cant
%%% Purpose : Get name servers in a Windows machine
%%% Created : 5 Mar 2009 by Geoff Cant
%%%
%%%
%%% ejabberd, Copyright (C) 2002-2012 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
%%% published by the Free Software Foundation; either version 2 of the
%%% License, or (at your option) any later version.
%%%
%%% This program is distributed in the hope that it will be useful,
%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
%%% General Public License for more details.
%%%
%%% You should have received a copy of the GNU General Public License
%%% along with this program; if not, write to the Free Software
%%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
%%% 02111-1307 USA
%%%
%%%----------------------------------------------------------------------
-module(win32_dns).
-export([get_nameservers/0]).
-include("ejabberd.hrl").
-define(IF_KEY, "\\hklm\\system\\CurrentControlSet\\Services\\TcpIp\\Parameters\\Interfaces").
-define(TOP_KEY, "\\hklm\\system\\CurrentControlSet\\Services\\TcpIp\\Parameters").
get_nameservers() ->
{_, Config} = pick_config(),
IPTs = get_value(["NameServer"], Config),
lists:filter(fun(IPTuple) -> is_good_ns(IPTuple) end, IPTs).
is_good_ns(Addr) ->
element(1,
inet_res:nnslookup("a.root-servers.net", in, any, [{Addr,53}],
timer:seconds(5)
)
) =:= ok.
reg() ->
{ok, R} = win32reg:open([read]),
R.
interfaces(R) ->
ok = win32reg:change_key(R, ?IF_KEY),
{ok, I} = win32reg:sub_keys(R),
I.
config_keys(R, Key) ->
ok = win32reg:change_key(R, Key),
[ {K,
case win32reg:value(R, K) of
{ok, V} -> try_translate(K, V);
_ -> undefined
end
} || K <- ["Domain", "DhcpDomain",
"NameServer", "DhcpNameServer", "SearchList"]].
try_translate(K, V) ->
try translate(K, V) of
Res ->
Res
catch
A:B ->
?ERROR_MSG("Error '~p' translating Win32 registry~n"
"K: ~p~nV: ~p~nError: ~p", [A, K, V, B]),
undefined
end.
translate(NS, V) when NS =:= "NameServer"; NS =:= "DhcpNameServer" ->
%% The IPs may be separated by commas ',' or by spaces " "
%% The parts of an IP are separated by dots '.'
IPsStrings = [string:tokens(IP, ".") || IP <- string:tokens(V, " ,")],
[ list_to_tuple([list_to_integer(String) || String <- IpStrings])
|| IpStrings <- IPsStrings];
translate(_, V) -> V.
interface_configs(R) ->
[{If, config_keys(R, ?IF_KEY ++ "\\" ++ If)}
|| If <- interfaces(R)].
sort_configs(Configs) ->
lists:sort(fun ({_, A}, {_, B}) ->
ANS = proplists:get_value("NameServer", A),
BNS = proplists:get_value("NameServer", B),
if ANS =/= undefined, BNS =:= undefined -> false;
true -> count_undef(A) < count_undef(B)
end
end,
Configs).
count_undef(L) when is_list(L) ->
lists:foldl(fun ({_K, undefined}, Acc) -> Acc +1;
({_K, []}, Acc) -> Acc +1;
(_, Acc) -> Acc
end, 0, L).
all_configs() ->
R = reg(),
TopConfig = config_keys(R, ?TOP_KEY),
Configs = [{top, TopConfig}
| interface_configs(R)],
win32reg:close(R),
{TopConfig, Configs}.
pick_config() ->
{TopConfig, Configs} = all_configs(),
NSConfigs = [{If, C} || {If, C} <- Configs,
get_value(["DhcpNameServer","NameServer"], C)
=/= undefined],
case get_value(["DhcpNameServer","NameServer"],
TopConfig) of
%% No top level nameserver to pick interface with
undefined ->
hd(sort_configs(NSConfigs));
%% Top level has a nameserver - use this to select an interface.
NS ->
Cs = [ {If, C}
|| {If, C} <- Configs,
lists:member(NS,
[get_value(["NameServer"], C),
get_value(["DhcpNameServer"], C)])],
hd(sort_configs(Cs))
end.
get_value([], _Config) -> undefined;
get_value([K|Keys], Config) ->
case proplists:get_value(K, Config) of
undefined -> get_value(Keys, Config);
V -> V
end.
ejabberd-2.1.11/src/cyrsasl_plain.erl 0000664 0000000 0000000 00000005450 12240230175 014360 0 ustar %%%----------------------------------------------------------------------
%%% File : cyrsasl_plain.erl
%%% Author : Alexey Shchepin
-->
%%
%% Dirección de correo (opcional):
-->
?XE("li", [
?INPUTT("submit", "register", "Register")
])
])
])
],
{200,
[{"Server", "ejabberd"},
{"Content-Type", "text/html"}],
ejabberd_web:make_xhtml(HeadEls, Els)}.
%% Copied from mod_register.erl
send_registration_notifications(UJID, Source) ->
Host = UJID#jid.lserver,
case gen_mod:get_module_opt(Host, ?MODULE, registration_watchers, []) of
[] -> ok;
JIDs when is_list(JIDs) ->
Body = lists:flatten(
io_lib:format(
"[~s] The account ~s was registered from IP address ~s "
"on node ~w using ~p.",
[get_time_string(), jlib:jid_to_string(UJID),
ip_to_string(Source), node(), ?MODULE])),
lists:foreach(
fun(S) ->
case jlib:string_to_jid(S) of
error -> ok;
JID ->
ejabberd_router:route(
jlib:make_jid("", Host, ""),
JID,
{xmlelement, "message", [{"type", "chat"}],
[{xmlelement, "body", [],
[{xmlcdata, Body}]}]})
end
end, JIDs);
_ ->
ok
end.
ip_to_string(Source) when is_tuple(Source) -> inet_parse:ntoa(Source);
ip_to_string(undefined) -> "undefined";
ip_to_string(_) -> "unknown".
get_time_string() -> write_time(erlang:localtime()).
%% Function copied from ejabberd_logger_h.erl and customized
write_time({{Y,Mo,D},{H,Mi,S}}) ->
io_lib:format("~w-~.2.0w-~.2.0w ~.2.0w:~.2.0w:~.2.0w",
[Y, Mo, D, H, Mi, S]).
%%%----------------------------------------------------------------------
%%% Formulary new POST
%%%----------------------------------------------------------------------
form_new_post(Q, Host) ->
case catch get_register_parameters(Q) of
[Username, Password, Password, Id, Key] ->
form_new_post(Username, Host, Password, {Id, Key});
[_Username, _Password, _Password2, false, false] ->
{error, passwords_not_identical};
[_Username, _Password, _Password2, Id, Key] ->
ejabberd_captcha:check_captcha(Id, Key), %% This deletes the captcha
{error, passwords_not_identical};
_ ->
{error, wrong_parameters}
end.
get_register_parameters(Q) ->
lists:map(
fun(Key) ->
case lists:keysearch(Key, 1, Q) of
{value, {_Key, Value}} -> Value;
false -> false
end
end,
["username", "password", "password2", "id", "key"]).
form_new_post(Username, Host, Password, {false, false}) ->
register_account(Username, Host, Password);
form_new_post(Username, Host, Password, {Id, Key}) ->
case ejabberd_captcha:check_captcha(Id, Key) of
captcha_valid ->
register_account(Username, Host, Password);
captcha_non_valid ->
{error, captcha_non_valid};
captcha_not_found ->
{error, captcha_non_valid}
end.
%%%----------------------------------------------------------------------
%%% Formulary Captcha support for new GET/POST
%%%----------------------------------------------------------------------
build_captcha_li_list(Lang, IP) ->
case ejabberd_captcha:is_feature_available() of
true -> build_captcha_li_list2(Lang, IP);
false -> []
end.
build_captcha_li_list2(Lang, IP) ->
SID = "",
From = #jid{user = "", server = "test", resource = ""},
To = #jid{user = "", server = "test", resource = ""},
Args = [],
case ejabberd_captcha:create_captcha(SID, From, To, Lang, IP, Args) of
{ok, Id, _} ->
{_, {CImg,CText,CId,CKey}} =
ejabberd_captcha:build_captcha_html(Id, Lang),
[?XE("li", [CText,
?C(" "),
CId,
CKey,
?BR,
CImg]
)];
_ ->
[]
end.
%%%----------------------------------------------------------------------
%%% Formulary change password GET
%%%----------------------------------------------------------------------
form_changepass_get(Host, Lang) ->
HeadEls = [
?XCT("title", "Change Password"),
?XA("link",
[{"href", "/register/register.css"},
{"type", "text/css"},
{"rel", "stylesheet"}])
],
Els=[
?XACT("h1",
[{"class", "title"}, {"style", "text-align:center;"}],
"Change Password"),
?XAE("form", [{"action", ""}, {"method", "post"}],
[
?XE("ol", [
?XE("li", [
?CT("Username:"),
?C(" "),
?INPUTS("text", "username", "", "20")
]),
?XE("li", [
?CT("Server:"),
?C(" "),
?C(Host)
]),
?XE("li", [
?CT("Old Password:"),
?C(" "),
?INPUTS("password", "passwordold", "", "20")
]),
?XE("li", [
?CT("New Password:"),
?C(" "),
?INPUTS("password", "password", "", "20")
]),
?XE("li", [
?CT("Password Verification:"),
?C(" "),
?INPUTS("password", "password2", "", "20")
]),
?XE("li", [
?INPUTT("submit", "changepass", "Change Password")
])
])
])
],
{200,
[{"Server", "ejabberd"},
{"Content-Type", "text/html"}],
ejabberd_web:make_xhtml(HeadEls, Els)}.
%%%----------------------------------------------------------------------
%%% Formulary change password POST
%%%----------------------------------------------------------------------
form_changepass_post(Q, Host) ->
case catch get_changepass_parameters(Q) of
[Username, PasswordOld, Password, Password] ->
try_change_password(Username, Host, PasswordOld, Password);
[_Username, _PasswordOld, _Password, _Password2] ->
{error, passwords_not_identical};
_ ->
{error, wrong_parameters}
end.
get_changepass_parameters(Q) ->
lists:map(
fun(Key) ->
{value, {_Key, Value}} = lists:keysearch(Key, 1, Q),
Value
end,
["username", "passwordold", "password", "password2"]).
%% @spec(Username,Host,PasswordOld,Password) -> {atomic, ok} |
%% {error, account_doesnt_exist} |
%% {error, password_not_changed} |
%% {error, password_incorrect}
try_change_password(Username, Host, PasswordOld, Password) ->
try change_password(Username, Host, PasswordOld, Password) of
{atomic, ok} ->
{atomic, ok}
catch
error:{badmatch, Error} ->
{error, Error}
end.
change_password(Username, Host, PasswordOld, Password) ->
%% Check the account exists
account_exists = check_account_exists(Username, Host),
%% Check the old password is correct
password_correct = check_password(Username, Host, PasswordOld),
%% This function always returns: ok
%% Change the password
ok = ejabberd_auth:set_password(Username, Host, Password),
%% Check the new password is correct
case check_password(Username, Host, Password) of
password_correct ->
{atomic, ok};
password_incorrect ->
{error, password_not_changed}
end.
check_account_exists(Username, Host) ->
case ejabberd_auth:is_user_exists(Username, Host) of
true -> account_exists;
false -> account_doesnt_exist
end.
check_password(Username, Host, Password) ->
case ejabberd_auth:check_password(Username, Host, Password) of
true -> password_correct;
false -> password_incorrect
end.
%%%----------------------------------------------------------------------
%%% Formulary delete account GET
%%%----------------------------------------------------------------------
form_del_get(Host, Lang) ->
HeadEls = [
?XCT("title", "Unregister a Jabber account"),
?XA("link",
[{"href", "/register/register.css"},
{"type", "text/css"},
{"rel", "stylesheet"}])
],
Els=[
?XACT("h1",
[{"class", "title"}, {"style", "text-align:center;"}],
"Unregister a Jabber account"),
?XCT("p",
"This page allows to unregister a Jabber account in this Jabber server."),
?XAE("form", [{"action", ""}, {"method", "post"}],
[
?XE("ol", [
?XE("li", [
?CT("Username:"),
?C(" "),
?INPUTS("text", "username", "", "20")
]),
?XE("li", [
?CT("Server:"),
?C(" "),
?C(Host)
]),
?XE("li", [
?CT("Password:"),
?C(" "),
?INPUTS("password", "password", "", "20")
]),
?XE("li", [
?INPUTT("submit", "unregister", "Unregister")
])
])
])
],
{200,
[{"Server", "ejabberd"},
{"Content-Type", "text/html"}],
ejabberd_web:make_xhtml(HeadEls, Els)}.
%% @spec(Username, Host, Password) -> {success, ok, {Username, Host, Password} |
%% {success, exists, {Username, Host, Password}} |
%% {error, not_allowed} |
%% {error, invalid_jid}
register_account(Username, Host, Password) ->
case jlib:make_jid(Username, Host, "") of
error -> {error, invalid_jid};
_ -> register_account2(Username, Host, Password)
end.
register_account2(Username, Host, Password) ->
case ejabberd_auth:try_register(Username, Host, Password) of
{atomic, Res} ->
{success, Res, {Username, Host, Password}};
Other ->
Other
end.
%%%----------------------------------------------------------------------
%%% Formulary delete POST
%%%----------------------------------------------------------------------
form_del_post(Q, Host) ->
case catch get_unregister_parameters(Q) of
[Username, Password] ->
try_unregister_account(Username, Host, Password);
_ ->
{error, wrong_parameters}
end.
get_unregister_parameters(Q) ->
lists:map(
fun(Key) ->
{value, {_Key, Value}} = lists:keysearch(Key, 1, Q),
Value
end,
["username", "password"]).
%% @spec(Username, Host, Password) -> {atomic, ok} |
%% {error, account_doesnt_exist} |
%% {error, account_exists} |
%% {error, password_incorrect}
try_unregister_account(Username, Host, Password) ->
try unregister_account(Username, Host, Password) of
{atomic, ok} ->
{atomic, ok}
catch
error:{badmatch, Error} ->
{error, Error}
end.
unregister_account(Username, Host, Password) ->
%% Check the account exists
account_exists = check_account_exists(Username, Host),
%% Check the password is correct
password_correct = check_password(Username, Host, Password),
%% This function always returns: ok
ok = ejabberd_auth:remove_user(Username, Host, Password),
%% Check the account does not exist anymore
account_doesnt_exist = check_account_exists(Username, Host),
%% If we reached this point, return success
{atomic, ok}.
%%%----------------------------------------------------------------------
%%% Error texts
%%%----------------------------------------------------------------------
get_error_text({error, captcha_non_valid}) ->
"The captcha you entered is wrong";
get_error_text({success, exists, _}) ->
get_error_text({atomic, exists});
get_error_text({atomic, exists}) ->
"The account already exists";
get_error_text({error, password_incorrect}) ->
"Incorrect password";
get_error_text({error, invalid_jid}) ->
"The username is not valid";
get_error_text({error, not_allowed}) ->
"Not allowed";
get_error_text({error, account_doesnt_exist}) ->
"Account doesn't exist";
get_error_text({error, account_exists}) ->
"The account was not deleted";
get_error_text({error, password_not_changed}) ->
"The password was not changed";
get_error_text({error, passwords_not_identical}) ->
"The passwords are different";
get_error_text({error, wrong_parameters}) ->
"Wrong parameters in the web formulary".
ejabberd-2.1.11/src/web/mod_http_fileserver.erl 0000664 0000000 0000000 00000042513 12240230175 016337 0 ustar %%%-------------------------------------------------------------------
%%% File : mod_http_fileserver.erl
%%% Author : Massimiliano Mirra
%%
%%
%%
The selected behaviour depends on the return parameter: %%
In the default plugin module, the record is unchanged.
subscribe_node(NodeId, Sender, Subscriber, AccessModel, SendLast, PresenceSubscription, RosterGroup, Options) -> SubKey = jlib:jid_tolower(Subscriber), GenKey = jlib:jid_remove_resource(SubKey), Authorized = (jlib:jid_tolower(jlib:jid_remove_resource(Sender)) == GenKey), {Affiliation, Subscriptions} = select_affiliation_subscriptions(NodeId, GenKey, SubKey), Whitelisted = lists:member(Affiliation, [member, publisher, owner]), PendingSubscription = lists:any(fun({pending, _}) -> true; (_) -> false end, Subscriptions), if not Authorized -> %% JIDs do not match {error, ?ERR_EXTENDED(?ERR_BAD_REQUEST, "invalid-jid")}; Affiliation == outcast -> %% Requesting entity is blocked {error, ?ERR_FORBIDDEN}; PendingSubscription -> %% Requesting entity has pending subscription {error, ?ERR_EXTENDED(?ERR_NOT_AUTHORIZED, "pending-subscription")}; (AccessModel == presence) and (not PresenceSubscription) -> %% Entity is not authorized to create a subscription (presence subscription required) {error, ?ERR_EXTENDED(?ERR_NOT_AUTHORIZED, "presence-subscription-required")}; (AccessModel == roster) and (not RosterGroup) -> %% Entity is not authorized to create a subscription (not in roster group) {error, ?ERR_EXTENDED(?ERR_NOT_AUTHORIZED, "not-in-roster-group")}; (AccessModel == whitelist) and (not Whitelisted) -> %% Node has whitelist access model and entity lacks required affiliation {error, ?ERR_EXTENDED(?ERR_NOT_ALLOWED, "closed-node")}; %%MustPay -> %% % Payment is required for a subscription %% {error, ?ERR_PAYMENT_REQUIRED}; %%ForbiddenAnonymous -> %% % Requesting entity is anonymous %% {error, ?ERR_FORBIDDEN}; true -> case pubsub_subscription_odbc:subscribe_node(Subscriber, NodeId, Options) of {result, SubId} -> NewSub = case AccessModel of authorize -> pending; _ -> subscribed end, update_subscription(NodeId, SubKey, [{NewSub, SubId} | Subscriptions]), case {NewSub, SendLast} of {subscribed, never} -> {result, {default, subscribed, SubId}}; {subscribed, _} -> {result, {default, subscribed, SubId, send_last}}; {_, _} -> {result, {default, pending, SubId}} end; _ -> {error, ?ERR_INTERNAL_SERVER_ERROR} end end. %% @spec (NodeId, Sender, Subscriber, SubId) -> %% {error, Reason} | {result, []} %% NodeId = mod_pubsub:pubsubNodeId() %% Sender = mod_pubsub:jid() %% Subscriber = mod_pubsub:jid() %% SubId = mod_pubsub:subid() %% Reason = mod_pubsub:stanzaError() %% @docUnsubscribe the Subscriber from the Node.
unsubscribe_node(NodeId, Sender, Subscriber, SubId) -> SubKey = jlib:jid_tolower(Subscriber), GenKey = jlib:jid_remove_resource(SubKey), Authorized = (jlib:jid_tolower(jlib:jid_remove_resource(Sender)) == GenKey), {Affiliation, Subscriptions} = select_affiliation_subscriptions(NodeId, SubKey), SubIdExists = case SubId of [] -> false; List when is_list(List) -> true; _ -> false end, if %% Requesting entity is prohibited from unsubscribing entity not Authorized -> {error, ?ERR_FORBIDDEN}; %% Entity did not specify SubId %%SubId == "", ?? -> %% {error, ?ERR_EXTENDED(?ERR_BAD_REQUEST, "subid-required")}; %% Invalid subscription identifier %%InvalidSubId -> %% {error, ?ERR_EXTENDED(?ERR_NOT_ACCEPTABLE, "invalid-subid")}; %% Requesting entity is not a subscriber Subscriptions == [] -> {error, ?ERR_EXTENDED(?ERR_UNEXPECTED_REQUEST_CANCEL, "not-subscribed")}; %% Subid supplied, so use that. SubIdExists -> Sub = first_in_list(fun(S) -> case S of {_Sub, SubId} -> true; _ -> false end end, Subscriptions), case Sub of {value, S} -> delete_subscription(SubKey, NodeId, S, Affiliation, Subscriptions), {result, default}; false -> {error, ?ERR_EXTENDED(?ERR_UNEXPECTED_REQUEST_CANCEL, "not-subscribed")} end; %% Asking to remove all subscriptions to the given node SubId == all -> [delete_subscription(SubKey, NodeId, S, Affiliation, Subscriptions) || S <- Subscriptions], {result, default}; %% No subid supplied, but there's only one matching %% subscription, so use that. length(Subscriptions) == 1 -> delete_subscription(SubKey, NodeId, hd(Subscriptions), Affiliation, Subscriptions), {result, default}; %% No subid and more than one possible subscription match. true -> {error, ?ERR_EXTENDED(?ERR_BAD_REQUEST, "subid-required")} end. delete_subscription(SubKey, NodeId, {Subscription, SubId}, Affiliation, Subscriptions) -> NewSubs = Subscriptions -- [{Subscription, SubId}], pubsub_subscription_odbc:unsubscribe_node(SubKey, NodeId, SubId), case {Affiliation, NewSubs} of {none, []} -> % Just a regular subscriber, and this is final item, so % delete the state. del_state(NodeId, SubKey); _ -> update_subscription(NodeId, SubKey, NewSubs) end. %% @spec (NodeId, Publisher, PublishModel, MaxItems, ItemId, Payload) -> %% {true, PubsubItem} | {result, Reply} %% NodeId = mod_pubsub:pubsubNodeId() %% Publisher = mod_pubsub:jid() %% PublishModel = atom() %% MaxItems = integer() %% ItemId = string() %% Payload = term() %% @docPublishes the item passed as parameter.
%%The mechanism works as follow: %%
The selected behaviour depends on the return parameter: %%
In the default plugin module, the record is unchanged.
publish_item(NodeId, Publisher, PublishModel, MaxItems, ItemId, Payload) -> SubKey = jlib:jid_tolower(Publisher), GenKey = jlib:jid_remove_resource(SubKey), {Affiliation, Subscriptions} = select_affiliation_subscriptions(NodeId, GenKey, SubKey), Subscribed = case PublishModel of subscribers -> is_subscribed(Subscriptions); _ -> undefined end, if not ((PublishModel == open) or ((PublishModel == publishers) and ((Affiliation == owner) or (Affiliation == publisher))) or (Subscribed == true)) -> %% Entity does not have sufficient privileges to publish to node {error, ?ERR_FORBIDDEN}; true -> %% TODO: check creation, presence, roster if MaxItems > 0 -> %% Note: this works cause set_item tries an update before %% the insert, and the update just ignore creation field. PubId = {now(), SubKey}, set_item(#pubsub_item{itemid = {ItemId, NodeId}, creation = {now(), GenKey}, modification = PubId, payload = Payload}), Items = [ItemId | itemids(NodeId, GenKey)--[ItemId]], {result, {_, OI}} = remove_extra_items(NodeId, MaxItems, Items), %% set new item list use useless {result, {default, broadcast, OI}}; true -> {result, {default, broadcast, []}} end end. %% @spec (NodeId, MaxItems, ItemIds) -> {NewItemIds,OldItemIds} %% NodeId = mod_pubsub:pubsubNodeId() %% MaxItems = integer() | unlimited %% ItemIds = [ItemId::string()] %% NewItemIds = [ItemId::string()] %% @docThis function is used to remove extra items, most notably when the %% maximum number of items has been reached.
%%This function is used internally by the core PubSub module, as no %% permission check is performed.
%%In the default plugin module, the oldest items are removed, but other %% rules can be used.
%%If another PubSub plugin wants to delegate the item removal (and if the %% plugin is using the default pubsub storage), it can implements this function like this: %% ```remove_extra_items(NodeId, MaxItems, ItemIds) -> %% node_default:remove_extra_items(NodeId, MaxItems, ItemIds).'''
remove_extra_items(_NodeId, unlimited, ItemIds) -> {result, {ItemIds, []}}; remove_extra_items(NodeId, MaxItems, ItemIds) -> NewItems = lists:sublist(ItemIds, MaxItems), OldItems = lists:nthtail(length(NewItems), ItemIds), %% Remove extra items: del_items(NodeId, OldItems), %% Return the new items list: {result, {NewItems, OldItems}}. %% @spec (NodeId, Publisher, PublishModel, ItemId) -> %% {error, Reason::stanzaError()} | %% {result, []} %% NodeId = mod_pubsub:pubsubNodeId() %% Publisher = mod_pubsub:jid() %% PublishModel = atom() %% ItemId = string() %% @docTriggers item deletion.
%%Default plugin: The user performing the deletion must be the node owner %% or a publisher.
delete_item(NodeId, Publisher, PublishModel, ItemId) -> SubKey = jlib:jid_tolower(Publisher), GenKey = jlib:jid_remove_resource(SubKey), {result, Affiliation} = get_affiliation(NodeId, GenKey), Allowed = (Affiliation == publisher) orelse (Affiliation == owner) orelse (PublishModel == open) orelse case get_item(NodeId, ItemId) of {result, #pubsub_item{creation = {_, GenKey}}} -> true; _ -> false end, if not Allowed -> %% Requesting entity does not have sufficient privileges {error, ?ERR_FORBIDDEN}; true -> case del_item(NodeId, ItemId) of {updated, 1} -> %% set new item list use useless {result, {default, broadcast}}; _ -> %% Non-existent node or item {error, ?ERR_ITEM_NOT_FOUND} end end. %% @spec (NodeId, Owner) -> %% {error, Reason::stanzaError()} | %% {result, {default, broadcast}} %% NodeId = mod_pubsub:pubsubNodeId() %% Owner = mod_pubsub:jid() purge_node(NodeId, Owner) -> SubKey = jlib:jid_tolower(Owner), GenKey = jlib:jid_remove_resource(SubKey), GenState = get_state(NodeId, GenKey), case GenState of #pubsub_state{affiliation = owner} -> {result, States} = get_states(NodeId), lists:foreach( fun(#pubsub_state{items = []}) -> ok; (#pubsub_state{items = Items}) -> del_items(NodeId, Items) end, States), {result, {default, broadcast}}; _ -> %% Entity is not owner {error, ?ERR_FORBIDDEN} end. %% @spec (Host, JID) -> [{Node,Affiliation}] %% Host = host() %% JID = mod_pubsub:jid() %% @docReturn the current affiliations for the given user
%%The default module reads affiliations in the main Mnesia %% pubsub_state table. If a plugin stores its data in the same %% table, it should return an empty list, as the affiliation will be read by %% the default PubSub module. Otherwise, it should return its own affiliation, %% that will be added to the affiliation stored in the main %% pubsub_state table.
get_entity_affiliations(Host, Owner) -> SubKey = jlib:jid_tolower(Owner), GenKey = jlib:jid_remove_resource(SubKey), H = ?PUBSUB:escape(Host), J = encode_jid(GenKey), Reply = case catch ejabberd_odbc:sql_query_t( ["select node, type, i.nodeid, affiliation " "from pubsub_state i, pubsub_node n " "where i.nodeid = n.nodeid " "and jid='", J, "' " "and host='", H, "';"]) of {selected, ["node", "type", "nodeid", "affiliation"], RItems} -> lists:map(fun({N, T, I, A}) -> Node = nodetree_tree_odbc:raw_to_node(Host, {N, "", T, I}), {Node, decode_affiliation(A)} end, RItems); _ -> [] end, {result, Reply}. get_node_affiliations(NodeId) -> Reply = case catch ejabberd_odbc:sql_query_t( ["select jid, affiliation " "from pubsub_state " "where nodeid='", NodeId, "';"]) of {selected, ["jid", "affiliation"], RItems} -> lists:map(fun({J, A}) -> {decode_jid(J), decode_affiliation(A)} end, RItems); _ -> [] end, {result, Reply}. get_affiliation(NodeId, Owner) -> SubKey = jlib:jid_tolower(Owner), GenKey = jlib:jid_remove_resource(SubKey), J = encode_jid(GenKey), Reply = case catch ejabberd_odbc:sql_query_t( ["select affiliation from pubsub_state " "where nodeid='", NodeId, "' and jid='", J, "';"]) of {selected, ["affiliation"], [{A}]} -> decode_affiliation(A); _ -> none end, {result, Reply}. set_affiliation(NodeId, Owner, Affiliation) -> SubKey = jlib:jid_tolower(Owner), GenKey = jlib:jid_remove_resource(SubKey), {_, Subscriptions} = select_affiliation_subscriptions(NodeId, GenKey), case {Affiliation, Subscriptions} of {none, none} -> del_state(NodeId, GenKey); _ -> update_affiliation(NodeId, GenKey, Affiliation) end. %% @spec (Host, Owner) -> [{Node,Subscription}] %% Host = host() %% Owner = mod_pubsub:jid() %% @docReturn the current subscriptions for the given user
%%The default module reads subscriptions in the main Mnesia %% pubsub_state table. If a plugin stores its data in the same %% table, it should return an empty list, as the affiliation will be read by %% the default PubSub module. Otherwise, it should return its own affiliation, %% that will be added to the affiliation stored in the main %% pubsub_state table.
get_entity_subscriptions(Host, Owner) -> SubKey = jlib:jid_tolower(Owner), GenKey = jlib:jid_remove_resource(SubKey), H = ?PUBSUB:escape(Host), SJ = encode_jid(SubKey), GJ = encode_jid(GenKey), Query = case SubKey of GenKey -> ["select node, type, i.nodeid, jid, subscriptions " "from pubsub_state i, pubsub_node n " "where i.nodeid = n.nodeid " "and jid like '", GJ, "%' " "and host='", H, "';"]; _ -> ["select node, type, i.nodeid, jid, subscriptions " "from pubsub_state i, pubsub_node n " "where i.nodeid = n.nodeid " "and jid in ('", SJ, "', '", GJ, "') " "and host='", H, "';"] end, Reply = case catch ejabberd_odbc:sql_query_t(Query) of {selected, ["node", "type", "nodeid", "jid", "subscriptions"], RItems} -> lists:foldl(fun({N, T, I, J, S}, Acc) -> Node = nodetree_tree_odbc:raw_to_node(Host, {N, "", T, I}), Jid = decode_jid(J), case decode_subscriptions(S) of [] -> [{Node, none, Jid}|Acc]; Subs -> lists:foldl(fun({Sub, SubId}, Acc2) -> [{Node, Sub, SubId, Jid}|Acc2]; (Sub, Acc2) -> [{Node, Sub, Jid}|Acc2] end, Acc, Subs) end end, [], RItems); _ -> [] end, {result, Reply}. %% do the same as get_entity_subscriptions but filter result only to %% nodes having send_last_published_item=on_sub_and_presence %% as this call avoid seeking node, it must return node and type as well get_entity_subscriptions_for_send_last(Host, Owner) -> SubKey = jlib:jid_tolower(Owner), GenKey = jlib:jid_remove_resource(SubKey), H = ?PUBSUB:escape(Host), SJ = encode_jid(SubKey), GJ = encode_jid(GenKey), Query = case SubKey of GenKey -> ["select node, type, i.nodeid, jid, subscriptions " "from pubsub_state i, pubsub_node n, pubsub_node_option o " "where i.nodeid = n.nodeid and n.nodeid = o.nodeid " "and name='send_last_published_item' and val='on_sub_and_presence' " "and jid like '", GJ, "%' " "and host='", H, "';"]; _ -> ["select node, type, i.nodeid, jid, subscriptions " "from pubsub_state i, pubsub_node n, pubsub_node_option o " "where i.nodeid = n.nodeid and n.nodeid = o.nodeid " "and name='send_last_published_item' and val='on_sub_and_presence' " "and jid in ('", SJ, "', '", GJ, "') " "and host='", H, "';"] end, Reply = case catch ejabberd_odbc:sql_query_t(Query) of {selected, ["node", "type", "nodeid", "jid", "subscriptions"], RItems} -> lists:foldl(fun({N, T, I, J, S}, Acc) -> Node = nodetree_tree_odbc:raw_to_node(Host, {N, "", T, I}), Jid = decode_jid(J), case decode_subscriptions(S) of [] -> [{Node, none, Jid}|Acc]; Subs -> lists:foldl(fun({Sub, SubId}, Acc2) -> [{Node, Sub, SubId, Jid}|Acc2]; (Sub, Acc2) -> [{Node, Sub, Jid}|Acc2] end, Acc, Subs) end end, [], RItems); _ -> [] end, {result, Reply}. get_node_subscriptions(NodeId) -> Reply = case catch ejabberd_odbc:sql_query_t( ["select jid, subscriptions " "from pubsub_state " "where nodeid='", NodeId, "';"]) of {selected, ["jid", "subscriptions"], RItems} -> lists:foldl(fun({J, S}, Acc) -> Jid = decode_jid(J), case decode_subscriptions(S) of [] -> [{Jid, none}|Acc]; Subs -> lists:foldl(fun({Sub, SubId}, Acc2) -> [{Jid, Sub, SubId}|Acc2]; (Sub, Acc2) -> [{Jid, Sub}|Acc2] end, Acc, Subs) end end, [], RItems); _ -> [] end, {result, Reply}. get_subscriptions(NodeId, Owner) -> SubKey = jlib:jid_tolower(Owner), J = encode_jid(SubKey), Reply = case catch ejabberd_odbc:sql_query_t( ["select subscriptions from pubsub_state " "where nodeid='", NodeId, "' and jid='", J, "';"]) of {selected, ["subscriptions"], [{S}]} -> decode_subscriptions(S); _ -> [] end, {result, Reply}. set_subscriptions(NodeId, Owner, Subscription, SubId) -> SubKey = jlib:jid_tolower(Owner), SubState = get_state_without_itemids(NodeId, SubKey), case {SubId, SubState#pubsub_state.subscriptions} of {_, []} -> case Subscription of none -> {error, ?ERR_EXTENDED(?ERR_BAD_REQUEST, "not-subscribed")}; _ -> new_subscription(NodeId, Owner, Subscription, SubState) end; {"", [{_, SID}]} -> case Subscription of none -> unsub_with_subid(NodeId, SID, SubState); _ -> replace_subscription({Subscription, SID}, SubState) end; {"", [_|_]} -> {error, ?ERR_EXTENDED(?ERR_BAD_REQUEST, "subid-required")}; _ -> case Subscription of none -> unsub_with_subid(NodeId, SubId, SubState); _ -> replace_subscription({Subscription, SubId}, SubState) end end. replace_subscription(NewSub, SubState) -> NewSubs = replace_subscription(NewSub, SubState#pubsub_state.subscriptions, []), set_state(SubState#pubsub_state{subscriptions = NewSubs}). replace_subscription(_, [], Acc) -> Acc; replace_subscription({Sub, SubId}, [{_, SubID} | T], Acc) -> replace_subscription({Sub, SubId}, T, [{Sub, SubID} | Acc]). new_subscription(NodeId, Owner, Subscription, SubState) -> case pubsub_subscription_odbc:subscribe_node(Owner, NodeId, []) of {result, SubId} -> Subscriptions = SubState#pubsub_state.subscriptions, set_state(SubState#pubsub_state{subscriptions = [{Subscription, SubId} | Subscriptions]}), {Subscription, SubId}; _ -> {error, ?ERR_INTERNAL_SERVER_ERROR} end. unsub_with_subid(NodeId, SubId, SubState) -> pubsub_subscription_odbc:unsubscribe_node(SubState#pubsub_state.stateid, NodeId, SubId), NewSubs = lists:filter(fun ({_, SID}) -> SubId =/= SID end, SubState#pubsub_state.subscriptions), case {NewSubs, SubState#pubsub_state.affiliation} of {[], none} -> del_state(NodeId, element(1, SubState#pubsub_state.stateid)); _ -> set_state(SubState#pubsub_state{subscriptions = NewSubs}) end. %% @spec (Host, Owner) -> {result, [Node]} | {error, Reason} %% Host = host() %% Owner = jid() %% Node = pubsubNode() %% @docReturns a list of Owner's nodes on Host with pending %% subscriptions.
get_pending_nodes(Host, Owner) -> GenKey = jlib:jid_remove_resource(jlib:jid_tolower(Owner)), States = mnesia:match_object(#pubsub_state{stateid = {GenKey, '_'}, affiliation = owner, _ = '_'}), NodeIDs = [ID || #pubsub_state{stateid = {_, ID}} <- States], NodeTree = case catch ets:lookup(gen_mod:get_module_proc(Host, config), nodetree) of [{nodetree, N}] -> N; _ -> nodetree_tree_odbc end, Reply = mnesia:foldl(fun(#pubsub_state{stateid = {_, NID}} = S, Acc) -> case lists:member(NID, NodeIDs) of true -> case get_nodes_helper(NodeTree, S) of {value, Node} -> [Node | Acc]; false -> Acc end; false -> Acc end end, [], pubsub_state), {result, Reply}. get_nodes_helper(NodeTree, #pubsub_state{stateid = {_, N}, subscriptions = Subs}) -> HasPending = fun ({pending, _}) -> true; (pending) -> true; (_) -> false end, case lists:any(HasPending, Subs) of true -> case NodeTree:get_node(N) of #pubsub_node{nodeid = {_, Node}} -> {value, Node}; _ -> false end; false -> false end. %% @spec (NodeId) -> [States] | [] %% NodeId = mod_pubsub:pubsubNodeId() %% @doc Returns the list of stored states for a given node. %%For the default PubSub module, states are stored in Mnesia database.
%%We can consider that the pubsub_state table have been created by the main %% mod_pubsub module.
%%PubSub plugins can store the states where they wants (for example in a %% relational database).
%%If a PubSub plugin wants to delegate the states storage to the default node, %% they can implement this function like this: %% ```get_states(NodeId) -> %% node_default:get_states(NodeId).'''
get_states(NodeId) -> case catch ejabberd_odbc:sql_query_t( ["select jid, affiliation, subscriptions " "from pubsub_state " "where nodeid='", NodeId, "';"]) of {selected, ["jid", "affiliation", "subscriptions"], RItems} -> {result, lists:map(fun({SJID, Affiliation, Subscriptions}) -> #pubsub_state{stateid = {decode_jid(SJID), NodeId}, items = itemids(NodeId, SJID), affiliation = decode_affiliation(Affiliation), subscriptions = decode_subscriptions(Subscriptions)} end, RItems)}; _ -> {result, []} end. %% @spec (NodeId, JID) -> [State] | [] %% NodeId = mod_pubsub:pubsubNodeId() %% JID = mod_pubsub:jid() %% State = mod_pubsub:pubsubItems() %% @docReturns a state (one state list), given its reference.
get_state(NodeId, JID) -> State = get_state_without_itemids(NodeId, JID), {SJID, _} = State#pubsub_state.stateid, State#pubsub_state{items = itemids(NodeId, SJID)}. get_state_without_itemids(NodeId, JID) -> J = encode_jid(JID), case catch ejabberd_odbc:sql_query_t( ["select jid, affiliation, subscriptions " "from pubsub_state " "where jid='", J, "' " "and nodeid='", NodeId, "';"]) of {selected, ["jid", "affiliation", "subscriptions"], [{SJID, Affiliation, Subscriptions}]} -> #pubsub_state{stateid = {decode_jid(SJID), NodeId}, affiliation = decode_affiliation(Affiliation), subscriptions = decode_subscriptions(Subscriptions)}; _ -> #pubsub_state{stateid={JID, NodeId}} end. %% @spec (State) -> ok | {error, Reason::stanzaError()} %% State = mod_pubsub:pubsubStates() %% @docWrite a state into database.
set_state(State) -> {_, NodeId} = State#pubsub_state.stateid, set_state(NodeId, State). set_state(NodeId, State) -> %% NOTE: in odbc version, as we do not handle item list, %% we just need to update affiliation and subscription %% cause {JID,NodeId} is the key. if it does not exists, then we insert it. %% MySQL can be optimized using INSERT ... ON DUPLICATE KEY as well {JID, _} = State#pubsub_state.stateid, J = encode_jid(JID), S = encode_subscriptions(State#pubsub_state.subscriptions), A = encode_affiliation(State#pubsub_state.affiliation), case catch ejabberd_odbc:sql_query_t( ["update pubsub_state " "set subscriptions='", S, "', affiliation='", A, "' " "where nodeid='", NodeId, "' and jid='", J, "';"]) of {updated, 1} -> ok; _ -> catch ejabberd_odbc:sql_query_t( ["insert into pubsub_state(nodeid, jid, affiliation, subscriptions) " "values('", NodeId, "', '", J, "', '", A, "', '", S, "');"]) end, {result, []}. %% @spec (NodeId, JID) -> ok | {error, Reason::stanzaError()} %% NodeId = mod_pubsub:pubsubNodeId() %% JID = mod_pubsub:jid() %% @docDelete a state from database.
del_state(NodeId, JID) -> J = encode_jid(JID), catch ejabberd_odbc:sql_query_t( ["delete from pubsub_state " "where jid='", J, "' " "and nodeid='", NodeId, "';"]), ok. %% @spec (NodeId, From) -> {[Items],RsmOut} | [] %% NodeId = mod_pubsub:pubsubNodeId() %% Items = mod_pubsub:pubsubItems() %% @doc Returns the list of stored items for a given node. %%For the default PubSub module, items are stored in Mnesia database.
%%We can consider that the pubsub_item table have been created by the main %% mod_pubsub module.
%%PubSub plugins can store the items where they wants (for example in a %% relational database), or they can even decide not to persist any items.
%%If a PubSub plugin wants to delegate the item storage to the default node, %% they can implement this function like this: %% ```get_items(NodeId, From) -> %% node_default:get_items(NodeId, From).'''
get_items(NodeId, _From) -> case catch ejabberd_odbc:sql_query_t( ["select itemid, publisher, creation, modification, payload " "from pubsub_item " "where nodeid='", NodeId, "' " "order by modification desc;"]) of {selected, ["itemid", "publisher", "creation", "modification", "payload"], RItems} -> {result, lists:map(fun(RItem) -> raw_to_item(NodeId, RItem) end, RItems)}; _ -> {result, []} end. get_items(NodeId, From, none) -> MaxItems = case catch ejabberd_odbc:sql_query_t( ["select val from pubsub_node_option " "where nodeid='", NodeId, "' " "and name='max_items';"]) of {selected, ["val"], [{Value}]} -> Tokens = element(2, erl_scan:string(Value++".")), element(2, erl_parse:parse_term(Tokens)); _ -> ?MAXITEMS end, get_items(NodeId, From, #rsm_in{max=MaxItems}); get_items(NodeId, _From, #rsm_in{max=M, direction=Direction, id=I, index=IncIndex})-> Max = ?PUBSUB:escape(i2l(M)), {Way, Order} = case Direction of aft -> {"<", "desc"}; before when I == [] -> {"is not", "asc"}; before -> {">", "asc"}; _ when IncIndex =/= undefined -> {"<", "desc"}; % using index _ -> {"is not", "desc"}% Can be better end, [AttrName, Id] = case I of undefined when IncIndex =/= undefined -> case catch ejabberd_odbc:sql_query_t( ["select modification from pubsub_item pi " "where exists ( " "select count(*) as count1 " "from pubsub_item " "where nodeid='", NodeId, "' " "and modification > pi.modification " "having count1 = ",?PUBSUB:escape(i2l(IncIndex))," );"]) of {selected, [_], [{O}]} -> ["modification", "'"++O++"'"]; _ -> ["modification", "null"] end; undefined -> ["modification", "null"]; [] -> ["modification", "null"]; I -> [A, B] = string:tokens(?PUBSUB:escape(i2l(I)), "@"), [A, "'"++B++"'"] end, Count= case catch ejabberd_odbc:sql_query_t( ["select count(*) " "from pubsub_item " "where nodeid='", NodeId, "';"]) of {selected, [_], [{C}]} -> C; _ -> "0" end, case catch ejabberd_odbc:sql_query_t( ["select itemid, publisher, creation, modification, payload " "from pubsub_item " "where nodeid='", NodeId, "' " "and ", AttrName," ", Way, " ", Id, " " "order by ", AttrName," ", Order," limit ", i2l(Max)," ;"]) of {selected, ["itemid", "publisher", "creation", "modification", "payload"], RItems} -> case length(RItems) of 0 -> {result, {[], #rsm_out{count=Count}}}; _ -> {_, _, _, F, _} = hd(RItems), Index = case catch ejabberd_odbc:sql_query_t( ["select count(*) " "from pubsub_item " "where nodeid='", NodeId, "' " "and ", AttrName," > '", F, "';"]) of %{selected, [_], [{C}, {In}]} -> [string:strip(C, both, $"), string:strip(In, both, $")]; {selected, [_], [{In}]} -> In; _ -> "0" end, %{F, _} = string:to_integer(FStr), {_, _, _, L, _} = lists:last(RItems), RsmOut = #rsm_out{count=Count, index=Index, first="modification@"++F, last="modification@"++i2l(L)}, {result, {lists:map(fun(RItem) -> raw_to_item(NodeId, RItem) end, RItems), RsmOut}} end; _ -> {result, {[], none}} end. get_items(NodeId, JID, AccessModel, PresenceSubscription, RosterGroup, SubId) -> get_items(NodeId, JID, AccessModel, PresenceSubscription, RosterGroup, SubId, none). get_items(NodeId, JID, AccessModel, PresenceSubscription, RosterGroup, _SubId, RSM) -> SubKey = jlib:jid_tolower(JID), GenKey = jlib:jid_remove_resource(SubKey), {Affiliation, Subscriptions} = select_affiliation_subscriptions(NodeId, GenKey, SubKey), Whitelisted = can_fetch_item(Affiliation, Subscriptions), if %%SubId == "", ?? -> %% Entity has multiple subscriptions to the node but does not specify a subscription ID %{error, ?ERR_EXTENDED(?ERR_BAD_REQUEST, "subid-required")}; %%InvalidSubId -> %% Entity is subscribed but specifies an invalid subscription ID %{error, ?ERR_EXTENDED(?ERR_NOT_ACCEPTABLE, "invalid-subid")}; Affiliation == outcast -> %% Requesting entity is blocked {error, ?ERR_FORBIDDEN}; (AccessModel == presence) and (not PresenceSubscription) -> %% Entity is not authorized to create a subscription (presence subscription required) {error, ?ERR_EXTENDED(?ERR_NOT_AUTHORIZED, "presence-subscription-required")}; (AccessModel == roster) and (not RosterGroup) -> %% Entity is not authorized to create a subscription (not in roster group) {error, ?ERR_EXTENDED(?ERR_NOT_AUTHORIZED, "not-in-roster-group")}; (AccessModel == whitelist) and (not Whitelisted) -> %% Node has whitelist access model and entity lacks required affiliation {error, ?ERR_EXTENDED(?ERR_NOT_ALLOWED, "closed-node")}; (AccessModel == authorize) and (not Whitelisted) -> %% Node has authorize access model {error, ?ERR_FORBIDDEN}; %%MustPay -> %% % Payment is required for a subscription %% {error, ?ERR_PAYMENT_REQUIRED}; true -> get_items(NodeId, JID, RSM) end. get_last_items(NodeId, _From, Count) -> case catch ejabberd_odbc:sql_query_t( ["select itemid, publisher, creation, modification, payload " "from pubsub_item " "where nodeid='", NodeId, "' " "order by modification desc limit ", i2l(Count), ";"]) of {selected, ["itemid", "publisher", "creation", "modification", "payload"], RItems} -> {result, lists:map(fun(RItem) -> raw_to_item(NodeId, RItem) end, RItems)}; _ -> {result, []} end. %% @spec (NodeId, ItemId) -> [Item] | [] %% NodeId = mod_pubsub:pubsubNodeId() %% ItemId = string() %% Item = mod_pubsub:pubsubItems() %% @docReturns an item (one item list), given its reference.
get_item(NodeId, ItemId) -> I = ?PUBSUB:escape(ItemId), case catch ejabberd_odbc:sql_query_t( ["select itemid, publisher, creation, modification, payload " "from pubsub_item " "where nodeid='", NodeId, "' " "and itemid='", I,"';"]) of {selected, ["itemid", "publisher", "creation", "modification", "payload"], [RItem]} -> {result, raw_to_item(NodeId, RItem)}; _ -> {error, ?ERR_ITEM_NOT_FOUND} end. get_item(NodeId, ItemId, JID, AccessModel, PresenceSubscription, RosterGroup, _SubId) -> SubKey = jlib:jid_tolower(JID), GenKey = jlib:jid_remove_resource(SubKey), {Affiliation, Subscriptions} = select_affiliation_subscriptions(NodeId, GenKey, SubKey), Whitelisted = can_fetch_item(Affiliation, Subscriptions), if %%SubId == "", ?? -> %% Entity has multiple subscriptions to the node but does not specify a subscription ID %{error, ?ERR_EXTENDED(?ERR_BAD_REQUEST, "subid-required")}; %%InvalidSubId -> %% Entity is subscribed but specifies an invalid subscription ID %{error, ?ERR_EXTENDED(?ERR_NOT_ACCEPTABLE, "invalid-subid")}; Affiliation == outcast -> %% Requesting entity is blocked {error, ?ERR_FORBIDDEN}; (AccessModel == presence) and (not PresenceSubscription) -> %% Entity is not authorized to create a subscription (presence subscription required) {error, ?ERR_EXTENDED(?ERR_NOT_AUTHORIZED, "presence-subscription-required")}; (AccessModel == roster) and (not RosterGroup) -> %% Entity is not authorized to create a subscription (not in roster group) {error, ?ERR_EXTENDED(?ERR_NOT_AUTHORIZED, "not-in-roster-group")}; (AccessModel == whitelist) and (not Whitelisted) -> %% Node has whitelist access model and entity lacks required affiliation {error, ?ERR_EXTENDED(?ERR_NOT_ALLOWED, "closed-node")}; (AccessModel == authorize) and (not Whitelisted) -> %% Node has authorize access model {error, ?ERR_FORBIDDEN}; %%MustPay -> %% % Payment is required for a subscription %% {error, ?ERR_PAYMENT_REQUIRED}; true -> get_item(NodeId, ItemId) end. %% @spec (Item) -> ok | {error, Reason::stanzaError()} %% Item = mod_pubsub:pubsubItems() %% @docWrite an item into database.
set_item(Item) -> {ItemId, NodeId} = Item#pubsub_item.itemid, I = ?PUBSUB:escape(ItemId), {C, _} = Item#pubsub_item.creation, {M, JID} = Item#pubsub_item.modification, P = encode_jid(JID), Payload = Item#pubsub_item.payload, XML = ?PUBSUB:escape(lists:flatten(lists:map(fun(X) -> xml:element_to_string(X) end, Payload))), S = fun({T1, T2, T3}) -> lists:flatten([i2l(T1, 6), ":", i2l(T2, 6), ":", i2l(T3, 6)]) end, case catch ejabberd_odbc:sql_query_t( ["update pubsub_item " "set publisher='", P, "', modification='", S(M), "', payload='", XML, "' " "where nodeid='", NodeId, "' and itemid='", I, "';"]) of {updated, 1} -> ok; _ -> catch ejabberd_odbc:sql_query_t( ["insert into pubsub_item " "(nodeid, itemid, publisher, creation, modification, payload) " "values('", NodeId, "', '", I, "', '", P, "', '", S(C), "', '", S(M), "', '", XML, "');"]) end, {result, []}. %% @spec (NodeId, ItemId) -> ok | {error, Reason::stanzaError()} %% NodeId = mod_pubsub:pubsubNodeId() %% ItemId = string() %% @docDelete an item from database.
del_item(NodeId, ItemId) -> I = ?PUBSUB:escape(ItemId), catch ejabberd_odbc:sql_query_t( ["delete from pubsub_item " "where itemid='", I, "' " "and nodeid='", NodeId, "';"]). del_items(_, []) -> ok; del_items(NodeId, [ItemId]) -> del_item(NodeId, ItemId); del_items(NodeId, ItemIds) -> I = string:join([["'", ?PUBSUB:escape(X), "'"] || X <- ItemIds], ","), catch ejabberd_odbc:sql_query_t( ["delete from pubsub_item " "where itemid in (", I, ") " "and nodeid='", NodeId, "';"]). %% @docReturn the name of the node if known: Default is to return %% node id.
get_item_name(_Host, _Node, Id) -> Id. node_to_path(Node) -> string:tokens(binary_to_list(Node), "/"). path_to_node([]) -> <<>>; path_to_node(Path) -> list_to_binary(string:join([""|Path], "/")). %% @spec (Affiliation, Subscription) -> true | false %% Affiliation = owner | member | publisher | outcast | none %% Subscription = subscribed | none %% @doc Determines if the combination of Affiliation and Subscribed %% are allowed to get items from a node. can_fetch_item(owner, _) -> true; can_fetch_item(member, _) -> true; can_fetch_item(publisher, _) -> true; can_fetch_item(outcast, _) -> false; can_fetch_item(none, Subscriptions) -> is_subscribed(Subscriptions); can_fetch_item(_Affiliation, _Subscription) -> false. is_subscribed(Subscriptions) -> lists:any(fun ({subscribed, _SubId}) -> true; (_) -> false end, Subscriptions). %% Returns the first item where Pred() is true in List first_in_list(_Pred, []) -> false; first_in_list(Pred, [H | T]) -> case Pred(H) of true -> {value, H}; _ -> first_in_list(Pred, T) end. itemids(NodeId, {U, S, R}) -> itemids(NodeId, encode_jid({U, S, R})); itemids(NodeId, SJID) -> case catch ejabberd_odbc:sql_query_t( ["select itemid " "from pubsub_item " "where nodeid='", NodeId, "' " "and publisher like '", SJID, "%' " "order by modification desc;"]) of {selected, ["itemid"], RItems} -> lists:map(fun({ItemId}) -> ItemId end, RItems); _ -> [] end. select_affiliation_subscriptions(NodeId, JID) -> J = encode_jid(JID), case catch ejabberd_odbc:sql_query_t( ["select affiliation,subscriptions from pubsub_state " "where nodeid='", NodeId, "' and jid='", J, "';"]) of {selected, ["affiliation", "subscriptions"], [{A, S}]} -> {decode_affiliation(A), decode_subscriptions(S)}; _ -> {none, []} end. select_affiliation_subscriptions(NodeId, JID, JID) -> select_affiliation_subscriptions(NodeId, JID); select_affiliation_subscriptions(NodeId, GenKey, SubKey) -> {result, Affiliation} = get_affiliation(NodeId, GenKey), {result, Subscriptions} = get_subscriptions(NodeId, SubKey), {Affiliation, Subscriptions}. update_affiliation(NodeId, JID, Affiliation) -> J = encode_jid(JID), A = encode_affiliation(Affiliation), case catch ejabberd_odbc:sql_query_t( ["update pubsub_state " "set affiliation='", A, "' " "where nodeid='", NodeId, "' and jid='", J, "';"]) of {updated, 1} -> ok; _ -> catch ejabberd_odbc:sql_query_t( ["insert into pubsub_state(nodeid, jid, affiliation, subscriptions) " "values('", NodeId, "', '", J, "', '", A, "', '');"]) end. update_subscription(NodeId, JID, Subscription) -> J = encode_jid(JID), S = encode_subscriptions(Subscription), case catch ejabberd_odbc:sql_query_t( ["update pubsub_state " "set subscriptions='", S, "' " "where nodeid='", NodeId, "' and jid='", J, "';"]) of {updated, 1} -> ok; _ -> catch ejabberd_odbc:sql_query_t( ["insert into pubsub_state(nodeid, jid, affiliation, subscriptions) " "values('", NodeId, "', '", J, "', 'n', '", S, "');"]) end. decode_jid(SJID) -> jlib:jid_tolower(jlib:string_to_jid(SJID)). decode_node(N) -> ?PUBSUB:string_to_node(N). decode_affiliation("o") -> owner; decode_affiliation("p") -> publisher; decode_affiliation("m") -> member; decode_affiliation("c") -> outcast; decode_affiliation(_) -> none. decode_subscription("s") -> subscribed; decode_subscription("p") -> pending; decode_subscription("u") -> unconfigured; decode_subscription(_) -> none. decode_subscriptions(Subscriptions) -> lists:foldl(fun(Subscription, Acc) -> case string:tokens(Subscription, ":") of [S, SubId] -> [{decode_subscription(S), SubId}|Acc]; _ -> Acc end end, [], string:tokens(Subscriptions, ",")). encode_jid(JID) -> ?PUBSUB:escape(jlib:jid_to_string(JID)). encode_affiliation(owner) -> "o"; encode_affiliation(publisher) -> "p"; encode_affiliation(member) -> "m"; encode_affiliation(outcast) -> "c"; encode_affiliation(_) -> "n". encode_subscription(subscribed) -> "s"; encode_subscription(pending) -> "p"; encode_subscription(unconfigured) -> "u"; encode_subscription(_) -> "n". encode_subscriptions(Subscriptions) -> string:join(lists:map(fun({S, SubId}) -> encode_subscription(S)++":"++SubId end, Subscriptions), ","). %%% record getter/setter state_to_raw(NodeId, State) -> {JID, _} = State#pubsub_state.stateid, J = encode_jid(JID), A = encode_affiliation(State#pubsub_state.affiliation), S = encode_subscriptions(State#pubsub_state.subscriptions), ["'", NodeId, "', '", J, "', '", A, "', '", S, "'"]. raw_to_item(NodeId, {ItemId, SJID, Creation, Modification, XML}) -> JID = decode_jid(SJID), ToTime = fun(Str) -> [T1,T2,T3] = string:tokens(Str, ":"), {l2i(T1), l2i(T2), l2i(T3)} end, Payload = case xml_stream:parse_element(XML) of {error, _Reason} -> []; El -> [El] end, #pubsub_item{itemid = {ItemId, NodeId}, creation={ToTime(Creation), JID}, modification={ToTime(Modification), JID}, payload = Payload}. l2i(L) when is_list(L) -> list_to_integer(L); l2i(I) when is_integer(I) -> I. i2l(I) when is_integer(I) -> integer_to_list(I); i2l(L) when is_list(L) -> L. i2l(I, N) when is_integer(I) -> i2l(i2l(I), N); i2l(L, N) when is_list(L) -> case length(L) of N -> L; C when C > N -> L; _ -> i2l([$0|L], N) end. ejabberd-2.1.11/src/mod_pubsub/nodetree_tree_odbc.erl 0000664 0000000 0000000 00000026615 12240230175 017475 0 ustar %%% ==================================================================== %%% ``The contents of this file are subject to the Erlang Public License, %%% Version 1.1, (the "License"); you may not use this file except in %%% compliance with the License. You should have received a copy of the %%% Erlang Public License along with this software. If not, it can be %%% retrieved via the world wide web at http://www.erlang.org/. %%% %%% Software distributed under the License is distributed on an "AS IS" %%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See %%% the License for the specific language governing rights and limitations %%% under the License. %%% %%% The Initial Developer of the Original Code is ProcessOne. %%% Portions created by ProcessOne are Copyright 2006-2012, ProcessOne %%% All Rights Reserved.'' %%% This software is copyright 2006-2012, ProcessOne. %%% %%% %%% @copyright 2006-2012 ProcessOne %%% @author Christophe RomainIt is used as a default for all unknown PubSub node type. It can serve %%% as a developer basis and reference to build its own custom pubsub node tree %%% types.
%%%PubSub node tree plugins are using the {@link gen_nodetree} behaviour.
%%%The API isn't stabilized yet. The pubsub plugin %%% development is still a work in progress. However, the system is already %%% useable and useful as is. Please, send us comments, feedback and %%% improvements.
-module(nodetree_tree_odbc). -author('christophe.romain@process-one.net'). -include("pubsub.hrl"). -include("jlib.hrl"). -define(PUBSUB, mod_pubsub_odbc). -define(PLUGIN_PREFIX, "node_"). -behaviour(gen_pubsub_nodetree). -export([init/3, terminate/2, options/0, set_node/1, get_node/3, get_node/2, get_node/1, get_nodes/2, get_nodes/1, get_parentnodes/3, get_parentnodes_tree/3, get_subnodes/3, get_subnodes_tree/3, create_node/6, delete_node/2 ]). -export([raw_to_node/2]). %% ================ %% API definition %% ================ %% @spec (Host, ServerHost, Opts) -> any() %% Host = mod_pubsub:host() %% ServerHost = host() %% Opts = list() %% @docCalled during pubsub modules initialisation. Any pubsub plugin must %% implement this function. It can return anything.
%%This function is mainly used to trigger the setup task necessary for the %% plugin. It can be used for example by the developer to create the specific %% module database schema if it does not exists yet.
init(_Host, _ServerHost, _Opts) -> ok. terminate(_Host, _ServerHost) -> ok. %% @spec () -> [Option] %% Option = mod_pubsub:nodetreeOption() %% @doc Returns the default pubsub node tree options. options() -> [{virtual_tree, false}, {odbc, true}]. %% @spec (Host, Node, From) -> pubsubNode() | {error, Reason} %% Host = mod_pubsub:host() %% Node = mod_pubsub:pubsubNode() get_node(Host, Node, _From) -> get_node(Host, Node). get_node(Host, Node) -> H = ?PUBSUB:escape(Host), N = ?PUBSUB:escape(?PUBSUB:node_to_string(Node)), case catch ejabberd_odbc:sql_query_t( ["select node, parent, type, nodeid " "from pubsub_node " "where host='", H, "' and node='", N, "';"]) of {selected, ["node", "parent", "type", "nodeid"], [RItem]} -> raw_to_node(Host, RItem); {'EXIT', _Reason} -> {error, ?ERR_INTERNAL_SERVER_ERROR}; _ -> {error, ?ERR_ITEM_NOT_FOUND} end. get_node(NodeId) -> case catch ejabberd_odbc:sql_query_t( ["select host, node, parent, type " "from pubsub_node " "where nodeid='", NodeId, "';"]) of {selected, ["host", "node", "parent", "type"], [{Host, Node, Parent, Type}]} -> raw_to_node(Host, {Node, Parent, Type, NodeId}); {'EXIT', _Reason} -> {error, ?ERR_INTERNAL_SERVER_ERROR}; _ -> {error, ?ERR_ITEM_NOT_FOUND} end. %% @spec (Host, From) -> [pubsubNode()] | {error, Reason} %% Host = mod_pubsub:host() | mod_pubsub:jid() get_nodes(Host, _From) -> get_nodes(Host). get_nodes(Host) -> H = ?PUBSUB:escape(Host), case catch ejabberd_odbc:sql_query_t( ["select node, parent, type, nodeid " "from pubsub_node " "where host='", H, "';"]) of {selected, ["node", "parent", "type", "nodeid"], RItems} -> lists:map(fun(Item) -> raw_to_node(Host, Item) end, RItems); _ -> [] end. %% @spec (Host, Node, From) -> [{Depth, Record}] | {error, Reason} %% Host = mod_pubsub:host() | mod_pubsub:jid() %% Node = mod_pubsub:pubsubNode() %% From = mod_pubsub:jid() %% Depth = integer() %% Record = pubsubNode() %% @docDefault node tree does not handle parents, return empty list.
get_parentnodes(_Host, _Node, _From) -> []. %% @spec (Host, Node, From) -> [{Depth, Record}] | {error, Reason} %% Host = mod_pubsub:host() | mod_pubsub:jid() %% Node = mod_pubsub:pubsubNode() %% From = mod_pubsub:jid() %% Depth = integer() %% Record = pubsubNode() %% @docDefault node tree does not handle parents, return a list %% containing just this node.
get_parentnodes_tree(Host, Node, From) -> case get_node(Host, Node, From) of N when is_record(N, pubsub_node) -> [{0, [N]}]; _Error -> [] end. get_subnodes(Host, Node, _From) -> get_subnodes(Host, Node). %% @spec (Host, Index) -> [pubsubNode()] | {error, Reason} %% Host = mod_pubsub:host() %% Node = mod_pubsub:pubsubNode() get_subnodes(Host, Node) -> H = ?PUBSUB:escape(Host), N = ?PUBSUB:escape(?PUBSUB:node_to_string(Node)), case catch ejabberd_odbc:sql_query_t( ["select node, parent, type, nodeid " "from pubsub_node " "where host='", H, "' and parent='", N, "';"]) of {selected, ["node", "parent", "type", "nodeid"], RItems} -> lists:map(fun(Item) -> raw_to_node(Host, Item) end, RItems); _ -> [] end. get_subnodes_tree(Host, Node, _From) -> get_subnodes_tree(Host, Node). %% @spec (Host, Index) -> [pubsubNode()] | {error, Reason} %% Host = mod_pubsub:host() %% Node = mod_pubsub:pubsubNode() get_subnodes_tree(Host, Node) -> H = ?PUBSUB:escape(Host), N = ?PUBSUB:escape(?PUBSUB:node_to_string(Node)), case catch ejabberd_odbc:sql_query_t( ["select node, parent, type, nodeid " "from pubsub_node " "where host='", H, "' and node like '", N, "%';"]) of {selected, ["node", "parent", "type", "nodeid"], RItems} -> lists:map(fun(Item) -> raw_to_node(Host, Item) end, RItems); _ -> [] end. %% @spec (Host, Node, Type, Owner, Options, Parents) -> ok | {error, Reason} %% Host = mod_pubsub:host() | mod_pubsub:jid() %% Node = mod_pubsub:pubsubNode() %% NodeType = mod_pubsub:nodeType() %% Owner = mod_pubsub:jid() %% Options = list() %% Parents = list() create_node(Host, Node, Type, Owner, Options, Parents) -> BJID = jlib:jid_tolower(jlib:jid_remove_resource(Owner)), case nodeid(Host, Node) of {error, ?ERR_ITEM_NOT_FOUND} -> ParentExists = case Host of {_U, _S, _R} -> %% This is special case for PEP handling %% PEP does not uses hierarchy true; _ -> case Parents of [] -> true; [Parent|_] -> case nodeid(Host, Parent) of {result, PNodeId} -> case nodeowners(PNodeId) of [{[], Host, []}] -> true; Owners -> lists:member(BJID, Owners) end; _ -> false end; _ -> false end end, case ParentExists of true -> case set_node(#pubsub_node{ nodeid={Host, Node}, parents=Parents, type=Type, options=Options}) of {result, NodeId} -> {ok, NodeId}; Other -> Other end; false -> %% Requesting entity is prohibited from creating nodes {error, ?ERR_FORBIDDEN} end; {result, _} -> %% NodeID already exists {error, ?ERR_CONFLICT}; Error -> Error end. %% @spec (Host, Node) -> [mod_pubsub:node()] %% Host = mod_pubsub:host() | mod_pubsub:jid() %% Node = mod_pubsub:pubsubNode() delete_node(Host, Node) -> H = ?PUBSUB:escape(Host), N = ?PUBSUB:escape(?PUBSUB:node_to_string(Node)), Removed = get_subnodes_tree(Host, Node), catch ejabberd_odbc:sql_query_t( ["delete from pubsub_node " "where host='", H, "' and node like '", N, "%';"]), Removed. %% helpers raw_to_node(Host, {Node, Parent, Type, NodeId}) -> Options = case catch ejabberd_odbc:sql_query_t( ["select name,val " "from pubsub_node_option " "where nodeid='", NodeId, "';"]) of {selected, ["name", "val"], ROptions} -> DbOpts = lists:map(fun({Key, Value}) -> RKey = list_to_atom(Key), Tokens = element(2, erl_scan:string(Value++".")), RValue = element(2, erl_parse:parse_term(Tokens)), {RKey, RValue} end, ROptions), Module = list_to_atom(?PLUGIN_PREFIX++Type), StdOpts = Module:options(), lists:foldl(fun({Key, Value}, Acc)-> lists:keyreplace(Key, 1, Acc, {Key, Value}) end, StdOpts, DbOpts); _ -> [] end, #pubsub_node{ nodeid = {Host, ?PUBSUB:string_to_node(Node)}, parents = [?PUBSUB:string_to_node(Parent)], id = NodeId, type = Type, options = Options}. %% @spec (NodeRecord) -> ok | {error, Reason} %% Record = mod_pubsub:pubsub_node() set_node(Record) -> {Host, Node} = Record#pubsub_node.nodeid, Parent = case Record#pubsub_node.parents of [] -> <<>>; [First|_] -> First end, Type = Record#pubsub_node.type, H = ?PUBSUB:escape(Host), N = ?PUBSUB:escape(?PUBSUB:node_to_string(Node)), P = ?PUBSUB:escape(?PUBSUB:node_to_string(Parent)), NodeId = case nodeid(Host, Node) of {result, OldNodeId} -> catch ejabberd_odbc:sql_query_t( ["delete from pubsub_node_option " "where nodeid='", OldNodeId, "';"]), catch ejabberd_odbc:sql_query_t( ["update pubsub_node " "set host='", H, "' " "node='", N, "' " "parent='", P, "' " "type='", Type, "' " "where nodeid='", OldNodeId, "';"]), OldNodeId; _ -> catch ejabberd_odbc:sql_query_t( ["insert into pubsub_node(host, node, parent, type) " "values('", H, "', '", N, "', '", P, "', '", Type, "');"]), case nodeid(Host, Node) of {result, NewNodeId} -> NewNodeId; _ -> none % this should not happen end end, case NodeId of none -> {error, ?ERR_INTERNAL_SERVER_ERROR}; _ -> lists:foreach(fun({Key, Value}) -> SKey = atom_to_list(Key), SValue = ?PUBSUB:escape(lists:flatten(io_lib:fwrite("~p",[Value]))), catch ejabberd_odbc:sql_query_t( ["insert into pubsub_node_option(nodeid, name, val) " "values('", NodeId, "', '", SKey, "', '", SValue, "');"]) end, Record#pubsub_node.options), {result, NodeId} end. nodeid(Host, Node) -> H = ?PUBSUB:escape(Host), N = ?PUBSUB:escape(?PUBSUB:node_to_string(Node)), case catch ejabberd_odbc:sql_query_t( ["select nodeid " "from pubsub_node " "where host='", H, "' and node='", N, "';"]) of {selected, ["nodeid"], [{NodeId}]} -> {result, NodeId}; {'EXIT', _Reason} -> {error, ?ERR_INTERNAL_SERVER_ERROR}; _ -> {error, ?ERR_ITEM_NOT_FOUND} end. nodeowners(NodeId) -> {result, Res} = node_hometree_odbc:get_node_affiliations(NodeId), lists:foldl(fun({LJID, owner}, Acc) -> [LJID|Acc]; (_, Acc) -> Acc end, [], Res). ejabberd-2.1.11/src/mod_pubsub/node_pep.erl 0000664 0000000 0000000 00000022055 12240230175 015445 0 ustar %%% ==================================================================== %%% ``The contents of this file are subject to the Erlang Public License, %%% Version 1.1, (the "License"); you may not use this file except in %%% compliance with the License. You should have received a copy of the %%% Erlang Public License along with this software. If not, it can be %%% retrieved via the world wide web at http://www.erlang.org/. %%% %%% Software distributed under the License is distributed on an "AS IS" %%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See %%% the License for the specific language governing rights and limitations %%% under the License. %%% %%% The Initial Developer of the Original Code is ProcessOne. %%% Portions created by ProcessOne are Copyright 2006-2012, ProcessOne %%% All Rights Reserved.'' %%% This software is copyright 2006-2012, ProcessOne. %%% %%% %%% @copyright 2006-2012 ProcessOne %%% @author Christophe RomainPubSub plugin nodes are using the {@link gen_pubsub_node} behaviour.
-module(node_pep). -author('christophe.romain@process-one.net'). -include("ejabberd.hrl"). -include("pubsub.hrl"). -include("jlib.hrl"). -behaviour(gen_pubsub_node). %% API definition -export([init/3, terminate/2, options/0, features/0, create_node_permission/6, create_node/2, delete_node/1, purge_node/2, subscribe_node/8, unsubscribe_node/4, publish_item/6, delete_item/4, remove_extra_items/3, get_entity_affiliations/2, get_node_affiliations/1, get_affiliation/2, set_affiliation/3, get_entity_subscriptions/2, get_node_subscriptions/1, get_subscriptions/2, set_subscriptions/4, get_pending_nodes/2, get_states/1, get_state/2, set_state/1, get_items/6, get_items/2, get_item/7, get_item/2, set_item/1, get_item_name/3, node_to_path/1, path_to_node/1 ]). init(Host, ServerHost, Opts) -> node_hometree:init(Host, ServerHost, Opts), complain_if_modcaps_disabled(ServerHost), ok. terminate(Host, ServerHost) -> node_hometree:terminate(Host, ServerHost), ok. options() -> [{deliver_payloads, true}, {notify_config, false}, {notify_delete, false}, {notify_retract, false}, {purge_offline, false}, {persist_items, false}, {max_items, ?MAXITEMS}, {subscribe, true}, {access_model, presence}, {roster_groups_allowed, []}, {publish_model, publishers}, {notification_type, headline}, {max_payload_size, ?MAX_PAYLOAD_SIZE}, {send_last_published_item, on_sub_and_presence}, {deliver_notifications, true}, {presence_based_delivery, true}]. features() -> ["create-nodes", %* "auto-create", %* "auto-subscribe", %* "delete-nodes", %* "delete-items", %* "filtered-notifications", %* "modify-affiliations", "outcast-affiliation", "persistent-items", "publish", %* "purge-nodes", "retract-items", "retrieve-affiliations", "retrieve-items", %* "retrieve-subscriptions", "subscribe" %* ]. create_node_permission(Host, ServerHost, _Node, _ParentNode, Owner, Access) -> LOwner = jlib:jid_tolower(Owner), {User, Server, _Resource} = LOwner, Allowed = case LOwner of {"", Host, ""} -> true; % pubsub service always allowed _ -> case acl:match_rule(ServerHost, Access, LOwner) of allow -> case Host of {User, Server, _} -> true; _ -> false end; E -> ?DEBUG("Create not allowed : ~p~n", [E]), false end end, {result, Allowed}. create_node(NodeId, Owner) -> node_hometree:create_node(NodeId, Owner). delete_node(Removed) -> case node_hometree:delete_node(Removed) of {result, {_, _, Removed}} -> {result, {[], Removed}}; Error -> Error end. subscribe_node(NodeId, Sender, Subscriber, AccessModel, SendLast, PresenceSubscription, RosterGroup, Options) -> node_hometree:subscribe_node( NodeId, Sender, Subscriber, AccessModel, SendLast, PresenceSubscription, RosterGroup, Options). unsubscribe_node(NodeId, Sender, Subscriber, SubID) -> case node_hometree:unsubscribe_node(NodeId, Sender, Subscriber, SubID) of {error, Error} -> {error, Error}; {result, _} -> {result, []} end. publish_item(NodeId, Publisher, Model, MaxItems, ItemId, Payload) -> node_hometree:publish_item(NodeId, Publisher, Model, MaxItems, ItemId, Payload). remove_extra_items(NodeId, MaxItems, ItemIds) -> node_hometree:remove_extra_items(NodeId, MaxItems, ItemIds). delete_item(NodeId, Publisher, PublishModel, ItemId) -> node_hometree:delete_item(NodeId, Publisher, PublishModel, ItemId). purge_node(NodeId, Owner) -> node_hometree:purge_node(NodeId, Owner). get_entity_affiliations(_Host, Owner) -> {_, D, _} = SubKey = jlib:jid_tolower(Owner), SubKey = jlib:jid_tolower(Owner), GenKey = jlib:jid_remove_resource(SubKey), States = mnesia:match_object(#pubsub_state{stateid = {GenKey, '_'}, _ = '_'}), NodeTree = case catch ets:lookup(gen_mod:get_module_proc(D, config), nodetree) of [{nodetree, N}] -> N; _ -> nodetree_tree end, Reply = lists:foldl(fun(#pubsub_state{stateid = {_, N}, affiliation = A}, Acc) -> case NodeTree:get_node(N) of #pubsub_node{nodeid = {{_, D, _}, _}} = Node -> [{Node, A}|Acc]; _ -> Acc end end, [], States), {result, Reply}. get_node_affiliations(NodeId) -> node_hometree:get_node_affiliations(NodeId). get_affiliation(NodeId, Owner) -> node_hometree:get_affiliation(NodeId, Owner). set_affiliation(NodeId, Owner, Affiliation) -> node_hometree:set_affiliation(NodeId, Owner, Affiliation). get_entity_subscriptions(_Host, Owner) -> {U, D, _} = SubKey = jlib:jid_tolower(Owner), GenKey = jlib:jid_remove_resource(SubKey), States = case SubKey of GenKey -> mnesia:match_object( #pubsub_state{stateid = {{U, D, '_'}, '_'}, _ = '_'}); _ -> mnesia:match_object( #pubsub_state{stateid = {GenKey, '_'}, _ = '_'}) ++ mnesia:match_object( #pubsub_state{stateid = {SubKey, '_'}, _ = '_'}) end, NodeTree = case catch ets:lookup(gen_mod:get_module_proc(D, config), nodetree) of [{nodetree, N}] -> N; _ -> nodetree_tree end, Reply = lists:foldl(fun(#pubsub_state{stateid = {J, N}, subscriptions = Ss}, Acc) -> case NodeTree:get_node(N) of #pubsub_node{nodeid = {{_, D, _}, _}} = Node -> lists:foldl(fun({subscribed, SubID}, Acc2) -> [{Node, subscribed, SubID, J} | Acc2]; ({pending, _SubID}, Acc2) -> [{Node, pending, J} | Acc2]; (S, Acc2) -> [{Node, S, J} | Acc2] end, Acc, Ss); _ -> Acc end end, [], States), {result, Reply}. get_node_subscriptions(NodeId) -> %% note: get_node_subscriptions is used for broadcasting %% there should not have any subscriptions %% but that call returns also all subscription to none %% and this is required for broadcast to occurs %% DO NOT REMOVE node_hometree:get_node_subscriptions(NodeId). get_subscriptions(NodeId, Owner) -> node_hometree:get_subscriptions(NodeId, Owner). set_subscriptions(NodeId, Owner, Subscription, SubId) -> node_hometree:set_subscriptions(NodeId, Owner, Subscription, SubId). get_pending_nodes(Host, Owner) -> node_hometree:get_pending_nodes(Host, Owner). get_states(NodeId) -> node_hometree:get_states(NodeId). get_state(NodeId, JID) -> node_hometree:get_state(NodeId, JID). set_state(State) -> node_hometree:set_state(State). get_items(NodeId, From) -> node_hometree:get_items(NodeId, From). get_items(NodeId, JID, AccessModel, PresenceSubscription, RosterGroup, SubId) -> node_hometree:get_items(NodeId, JID, AccessModel, PresenceSubscription, RosterGroup, SubId). get_item(NodeId, ItemId) -> node_hometree:get_item(NodeId, ItemId). get_item(NodeId, ItemId, JID, AccessModel, PresenceSubscription, RosterGroup, SubId) -> node_hometree:get_item(NodeId, ItemId, JID, AccessModel, PresenceSubscription, RosterGroup, SubId). set_item(Item) -> node_hometree:set_item(Item). get_item_name(Host, Node, Id) -> node_hometree:get_item_name(Host, Node, Id). node_to_path(Node) -> node_flat:node_to_path(Node). path_to_node(Path) -> node_flat:path_to_node(Path). %%% %%% Internal %%% %% @doc Check mod_caps is enabled, otherwise show warning. %% The PEP plugin for mod_pubsub requires mod_caps to be enabled in the host. %% Check that the mod_caps module is enabled in that Jabber Host %% If not, show a warning message in the ejabberd log file. complain_if_modcaps_disabled(ServerHost) -> Modules = ejabberd_config:get_local_option({modules, ServerHost}), ModCaps = [mod_caps_enabled || {mod_caps, _Opts} <- Modules], case ModCaps of [] -> ?WARNING_MSG("The PEP plugin is enabled in mod_pubsub of host ~p. " "This plugin requires mod_caps to be enabled, " "but it isn't.", [ServerHost]); _ -> ok end. ejabberd-2.1.11/src/mod_pubsub/pubsub_subscription_odbc.erl 0000664 0000000 0000000 00000025374 12240230175 020756 0 ustar %%% ==================================================================== %%% ``The contents of this file are subject to the Erlang Public License, %%% Version 1.1, (the "License"); you may not use this file except in %%% compliance with the License. You should have received a copy of the %%% Erlang Public License along with this software. If not, it can be %%% retrieved via the world wide web at http://www.erlang.org/. %%% %%% Software distributed under the License is distributed on an "AS IS" %%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See %%% the License for the specific language governing rights and limitations %%% under the License. %%% %%% The Initial Developer of the Original Code is ProcessOne. %%% Portions created by ProcessOne are Copyright 2006-2012, ProcessOne %%% All Rights Reserved.'' %%% This software is copyright 2006-2012, ProcessOne. %%% %%% @author Pablo PolvorinThe permission are not checked in this function.
%% @todo We probably need to check that the user doing the query has the right %% to read the items. -get_items(Host, Node, From, SubId, SMaxItems, ItemIDs) -> +get_items(Host, Node, From, SubId, SMaxItems, ItemIDs, RSM) -> MaxItems = if SMaxItems == "" -> get_max_items_node(Host); @@ -2272,12 +2085,13 @@ {error, Error} -> {error, Error}; _ -> - Action = fun(#pubsub_node{options = Options, type = Type, id = NodeId, owners = Owners}) -> + Action = fun(#pubsub_node{options = Options, type = Type, id = NodeId}) -> Features = features(Type), RetreiveFeature = lists:member("retrieve-items", Features), PersistentFeature = lists:member("persistent-items", Features), AccessModel = get_option(Options, access_model), AllowedGroups = get_option(Options, roster_groups_allowed, []), + Owners = node_owners_call(Type, NodeId), {PresenceSubscription, RosterGroup} = get_presence_and_roster_permissions(Host, From, Owners, AccessModel, AllowedGroups), if not RetreiveFeature -> @@ -2290,11 +2104,11 @@ node_call(Type, get_items, [NodeId, From, AccessModel, PresenceSubscription, RosterGroup, - SubId]) + SubId, RSM]) end end, case transaction(Host, Node, Action, sync_dirty) of - {result, {_, Items}} -> + {result, {_, {Items, RSMOut}}} -> SendItems = case ItemIDs of [] -> Items; @@ -2307,7 +2121,8 @@ %% number of items sent to MaxItems: {result, [{xmlelement, "pubsub", [{"xmlns", ?NS_PUBSUB}], [{xmlelement, "items", nodeAttr(Node), - itemsEls(lists:sublist(SendItems, MaxItems))}]}]}; + itemsEls(lists:sublist(SendItems, MaxItems))} + | jlib:rsm_encode(RSMOut)]}]}; Error -> Error end @@ -2329,10 +2144,15 @@ Error -> Error end. get_allowed_items_call(Host, NodeIdx, From, Type, Options, Owners) -> + case get_allowed_items_call(Host, NodeIdx, From, Type, Options, Owners, none) of + {result, {I, _}} -> {result, I}; + Error -> Error + end. +get_allowed_items_call(Host, NodeIdx, From, Type, Options, Owners, RSM) -> AccessModel = get_option(Options, access_model), AllowedGroups = get_option(Options, roster_groups_allowed, []), {PresenceSubscription, RosterGroup} = get_presence_and_roster_permissions(Host, From, Owners, AccessModel, AllowedGroups), - node_call(Type, get_items, [NodeIdx, From, AccessModel, PresenceSubscription, RosterGroup, undefined]). + node_call(Type, get_items, [NodeIdx, From, AccessModel, PresenceSubscription, RosterGroup, undefined, RSM]). %% @spec (Host, Node, NodeId, Type, LJID, Number) -> any() @@ -2344,31 +2164,29 @@ %% Number = last | integer() %% @docResend the items of a node to the user.
%% @todo use cache-last-item feature -send_items(Host, Node, NodeId, Type, {U,S,R} = LJID, last) -> - case get_cached_item(Host, NodeId) of +send_items(Host, Node, NodeId, Type, LJID, last) -> + Stanza = case get_cached_item(Host, NodeId) of undefined -> - send_items(Host, Node, NodeId, Type, LJID, 1); + % special ODBC optimization, works only with node_hometree_odbc, node_flat_odbc and node_pep_odbc + case node_action(Host, Type, get_last_items, [NodeId, LJID, 1]) of + {result, [LastItem]} -> + {ModifNow, ModifUSR} = LastItem#pubsub_item.modification, + event_stanza_with_delay( + [{xmlelement, "items", nodeAttr(Node), + itemsEls([LastItem])}], ModifNow, ModifUSR); + _ -> + event_stanza( + [{xmlelement, "items", nodeAttr(Node), + itemsEls([])}]) + end; LastItem -> {ModifNow, ModifUSR} = LastItem#pubsub_item.modification, - Stanza = event_stanza_with_delay( + event_stanza_with_delay( [{xmlelement, "items", nodeAttr(Node), - itemsEls([LastItem])}], ModifNow, ModifUSR), - case is_tuple(Host) of - false -> - ejabberd_router:route(service_jid(Host), jlib:make_jid(LJID), Stanza); - true -> - case ejabberd_sm:get_session_pid(U,S,R) of - C2SPid when is_pid(C2SPid) -> - ejabberd_c2s:broadcast(C2SPid, - {pep_message, binary_to_list(Node)++"+notify"}, - _Sender = service_jid(Host), - Stanza); - _ -> - ok - end - end - end; -send_items(Host, Node, NodeId, Type, {U,S,R} = LJID, Number) -> + itemsEls([LastItem])}], ModifNow, ModifUSR) + end, + ejabberd_router:route(service_jid(Host), jlib:make_jid(LJID), Stanza); +send_items(Host, Node, NodeId, Type, LJID, Number) -> ToSend = case node_action(Host, Type, get_items, [NodeId, LJID]) of {result, []} -> []; @@ -2391,20 +2209,7 @@ [{xmlelement, "items", nodeAttr(Node), itemsEls(ToSend)}]) end, - case is_tuple(Host) of - false -> - ejabberd_router:route(service_jid(Host), jlib:make_jid(LJID), Stanza); - true -> - case ejabberd_sm:get_session_pid(U,S,R) of - C2SPid when is_pid(C2SPid) -> - ejabberd_c2s:broadcast(C2SPid, - {pep_message, binary_to_list(Node)++"+notify"}, - _Sender = service_jid(Host), - Stanza); - _ -> - ok - end - end. + ejabberd_router:route(service_jid(Host), jlib:make_jid(LJID), Stanza). %% @spec (Host, JID, Plugins) -> {error, Reason} | {result, Response} %% Host = host() @@ -2540,7 +2345,8 @@ error -> {error, ?ERR_BAD_REQUEST}; _ -> - Action = fun(#pubsub_node{owners = Owners, type = Type, id = NodeId}=N) -> + Action = fun(#pubsub_node{type = Type, id = NodeId}) -> + Owners = node_owners_call(Type, NodeId), case lists:member(Owner, Owners) of true -> OwnerJID = jlib:make_jid(Owner), @@ -2550,24 +2356,7 @@ end, lists:foreach( fun({JID, Affiliation}) -> - node_call(Type, set_affiliation, [NodeId, JID, Affiliation]), - case Affiliation of - owner -> - NewOwner = jlib:jid_tolower(jlib:jid_remove_resource(JID)), - NewOwners = [NewOwner|Owners], - tree_call(Host, set_node, [N#pubsub_node{owners = NewOwners}]); - none -> - OldOwner = jlib:jid_tolower(jlib:jid_remove_resource(JID)), - case lists:member(OldOwner, Owners) of - true -> - NewOwners = Owners--[OldOwner], - tree_call(Host, set_node, [N#pubsub_node{owners = NewOwners}]); - _ -> - ok - end; - _ -> - ok - end + node_call(Type, set_affiliation, [NodeId, JID, Affiliation]) end, FilteredEntities), {result, []}; _ -> @@ -2620,11 +2409,11 @@ end. read_sub(Subscriber, Node, NodeID, SubID, Lang) -> - case pubsub_subscription:get_subscription(Subscriber, NodeID, SubID) of + case pubsub_subscription_odbc:get_subscription(Subscriber, NodeID, SubID) of {error, notfound} -> {error, extended_error(?ERR_NOT_ACCEPTABLE, "invalid-subid")}; {result, #pubsub_subscription{options = Options}} -> - {result, XdataEl} = pubsub_subscription:get_options_xform(Lang, Options), + {result, XdataEl} = pubsub_subscription_odbc:get_options_xform(Lang, Options), OptionsEl = {xmlelement, "options", [{"jid", jlib:jid_to_string(Subscriber)}, {"subid", SubID}|nodeAttr(Node)], [XdataEl]}, @@ -2650,7 +2439,7 @@ end. set_options_helper(Configuration, JID, NodeID, SubID, Type) -> - SubOpts = case pubsub_subscription:parse_options_xform(Configuration) of + SubOpts = case pubsub_subscription_odbc:parse_options_xform(Configuration) of {result, GoodSubOpts} -> GoodSubOpts; _ -> invalid end, @@ -2679,7 +2468,7 @@ write_sub(_Subscriber, _NodeID, _SubID, invalid) -> {error, extended_error(?ERR_BAD_REQUEST, "invalid-options")}; write_sub(Subscriber, NodeID, SubID, Options) -> - case pubsub_subscription:set_subscription(Subscriber, NodeID, SubID, Options) of + case pubsub_subscription_odbc:set_subscription(Subscriber, NodeID, SubID, Options) of {error, notfound} -> {error, extended_error(?ERR_NOT_ACCEPTABLE, "invalid-subid")}; {result, _} -> @@ -2847,8 +2636,8 @@ {"subscription", subscription_to_string(Sub)} | nodeAttr(Node)], []}]}]}, ejabberd_router:route(service_jid(Host), jlib:make_jid(JID), Stanza) end, - Action = fun(#pubsub_node{owners = Owners, type = Type, id = NodeId}) -> - case lists:member(Owner, Owners) of + Action = fun(#pubsub_node{type = Type, id = NodeId}) -> + case lists:member(Owner, node_owners_call(Type, NodeId)) of true -> Result = lists:foldl(fun({JID, Subscription, SubId}, Acc) -> @@ -3203,7 +2992,7 @@ {Depth, [{N, get_node_subs(N)} || N <- Nodes]} end, tree_call(Host, get_parentnodes_tree, [Host, Node, service_jid(Host)]))} end, - case transaction(Action, sync_dirty) of + case transaction(Host, Action, sync_dirty) of {result, CollSubs} -> CollSubs; _ -> [] end. @@ -3217,9 +3006,9 @@ get_options_for_subs(NodeID, Subs) -> lists:foldl(fun({JID, subscribed, SubID}, Acc) -> - case pubsub_subscription:read_subscription(JID, NodeID, SubID) of + case pubsub_subscription_odbc:get_subscription(JID, NodeID, SubID) of {error, notfound} -> [{JID, SubID, []} | Acc]; - #pubsub_subscription{options = Options} -> [{JID, SubID, Options} | Acc]; + {result, #pubsub_subscription{options = Options}} -> [{JID, SubID, Options} | Acc]; _ -> Acc end; (_, Acc) -> @@ -3408,6 +3197,30 @@ Result end. +%% @spec (Host, Type, NodeId) -> [ljid()] +%% NodeId = pubsubNodeId() +%% @docReturn list of node owners.
+node_owners(Host, Type, NodeId) -> + case node_action(Host, Type, get_node_affiliations, [NodeId]) of + {result, Affiliations} -> + lists:foldl( + fun({LJID, owner}, Acc) -> [LJID|Acc]; + (_, Acc) -> Acc + end, [], Affiliations); + _ -> + [] + end. +node_owners_call(Type, NodeId) -> + case node_call(Type, get_node_affiliations, [NodeId]) of + {result, Affiliations} -> + lists:foldl( + fun({LJID, owner}, Acc) -> [LJID|Acc]; + (_, Acc) -> Acc + end, [], Affiliations); + _ -> + [] + end. + %% @spec (Host, Options) -> MaxItems %% Host = host() %% Options = [Option] @@ -3804,7 +3617,13 @@ tree_action(Host, Function, Args) -> ?DEBUG("tree_action ~p ~p ~p",[Host,Function,Args]), Fun = fun() -> tree_call(Host, Function, Args) end, - catch mnesia:sync_dirty(Fun). + case catch ejabberd_odbc:sql_bloc(odbc_conn(Host), Fun) of + {atomic, Result} -> + Result; + {aborted, Reason} -> + ?ERROR_MSG("transaction return internal error: ~p~n",[{aborted, Reason}]), + {error, ?ERR_INTERNAL_SERVER_ERROR} + end. %% @docnode plugin call.
node_call(Type, Function, Args) -> @@ -3824,13 +3643,13 @@ node_action(Host, Type, Function, Args) -> ?DEBUG("node_action ~p ~p ~p ~p",[Host,Type,Function,Args]), - transaction(fun() -> + transaction(Host, fun() -> node_call(Type, Function, Args) end, sync_dirty). %% @docplugin transaction handling.
transaction(Host, Node, Action, Trans) -> - transaction(fun() -> + transaction(Host, fun() -> case tree_call(Host, get_node, [Host, Node]) of N when is_record(N, pubsub_node) -> case Action(N) of @@ -3842,13 +3661,19 @@ Error end end, Trans). -transaction(Host, Action, Trans) -> - transaction(fun() -> +transaction_on_nodes(Host, Action, Trans) -> + transaction(Host, fun() -> {result, lists:foldl(Action, [], tree_call(Host, get_nodes, [Host]))} end, Trans). -transaction(Fun, Trans) -> - case catch mnesia:Trans(Fun) of +transaction(Host, Fun, Trans) -> + transaction_retry(Host, Fun, Trans, 2). +transaction_retry(Host, Fun, Trans, Count) -> + SqlFun = case Trans of + transaction -> sql_transaction; + _ -> sql_bloc + end, + case catch ejabberd_odbc:SqlFun(odbc_conn(Host), Fun) of {result, Result} -> {result, Result}; {error, Error} -> {error, Error}; {atomic, {result, Result}} -> {result, Result}; @@ -3856,6 +3681,15 @@ {aborted, Reason} -> ?ERROR_MSG("transaction return internal error: ~p~n", [{aborted, Reason}]), {error, ?ERR_INTERNAL_SERVER_ERROR}; + {'EXIT', {timeout, _} = Reason} -> + case Count of + 0 -> + ?ERROR_MSG("transaction return internal error: ~p~n", [{'EXIT', Reason}]), + {error, ?ERR_INTERNAL_SERVER_ERROR}; + N -> + erlang:yield(), + transaction_retry(Host, Fun, Trans, N-1) + end; {'EXIT', Reason} -> ?ERROR_MSG("transaction return internal error: ~p~n", [{'EXIT', Reason}]), {error, ?ERR_INTERNAL_SERVER_ERROR}; @@ -3864,6 +3698,17 @@ {error, ?ERR_INTERNAL_SERVER_ERROR} end. +odbc_conn({_U, Host, _R})-> + Host; +odbc_conn(Host) -> + lists:dropwhile(fun(A) -> A/=$. end, Host) -- ".". + +%% escape value for database storage +escape({_U, _H, _R}=JID)-> + ejabberd_odbc:escape(jlib:jid_to_string(JID)); +escape(Value)-> + ejabberd_odbc:escape(Value). + %%%% helpers %% Add pubsub-specific error element ejabberd-2.1.11/src/mod_pubsub/node_hometree.erl 0000664 0000000 0000000 00000121221 12240230175 016464 0 ustar %%% ==================================================================== %%% ``The contents of this file are subject to the Erlang Public License, %%% Version 1.1, (the "License"); you may not use this file except in %%% compliance with the License. You should have received a copy of the %%% Erlang Public License along with this software. If not, it can be %%% retrieved via the world wide web at http://www.erlang.org/. %%% %%% Software distributed under the License is distributed on an "AS IS" %%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See %%% the License for the specific language governing rights and limitations %%% under the License. %%% %%% The Initial Developer of the Original Code is ProcessOne. %%% Portions created by ProcessOne are Copyright 2006-2012, ProcessOne %%% All Rights Reserved.'' %%% This software is copyright 2006-2012, ProcessOne. %%% %%% %%% @copyright 2006-2012 ProcessOne %%% @author Christophe RomainIt is used as a default for all unknown PubSub node type. It can serve %%% as a developer basis and reference to build its own custom pubsub node %%% types.
%%%PubSub plugin nodes are using the {@link gen_node} behaviour.
%%%The API isn't stabilized yet. The pubsub plugin %%% development is still a work in progress. However, the system is already %%% useable and useful as is. Please, send us comments, feedback and %%% improvements.
-module(node_hometree). -author('christophe.romain@process-one.net'). -include("pubsub.hrl"). -include("jlib.hrl"). -behaviour(gen_pubsub_node). %% API definition -export([init/3, terminate/2, options/0, features/0, create_node_permission/6, create_node/2, delete_node/1, purge_node/2, subscribe_node/8, unsubscribe_node/4, publish_item/6, delete_item/4, remove_extra_items/3, get_entity_affiliations/2, get_node_affiliations/1, get_affiliation/2, set_affiliation/3, get_entity_subscriptions/2, get_node_subscriptions/1, get_subscriptions/2, set_subscriptions/4, get_pending_nodes/2, get_states/1, get_state/2, set_state/1, get_items/6, get_items/2, get_item/7, get_item/2, set_item/1, get_item_name/3, node_to_path/1, path_to_node/1 ]). %% ================ %% API definition %% ================ %% @spec (Host, ServerHost, Options) -> ok %% Host = string() %% ServerHost = string() %% Options = [{atom(), term()}] %% @docCalled during pubsub modules initialisation. Any pubsub plugin must %% implement this function. It can return anything.
%%This function is mainly used to trigger the setup task necessary for the %% plugin. It can be used for example by the developer to create the specific %% module database schema if it does not exists yet.
init(_Host, _ServerHost, _Options) -> pubsub_subscription:init(), mnesia:create_table(pubsub_state, [{disc_copies, [node()]}, {attributes, record_info(fields, pubsub_state)}]), mnesia:create_table(pubsub_item, [{disc_only_copies, [node()]}, {attributes, record_info(fields, pubsub_item)}]), ItemsFields = record_info(fields, pubsub_item), case mnesia:table_info(pubsub_item, attributes) of ItemsFields -> ok; _ -> mnesia:transform_table(pubsub_item, ignore, ItemsFields) end, ok. %% @spec (Host, ServerHost) -> ok %% Host = string() %% ServerHost = string() %% @docCalled during pubsub modules termination. Any pubsub plugin must %% implement this function. It can return anything.
terminate(_Host, _ServerHost) -> ok. %% @spec () -> Options %% Options = [mod_pubsub:nodeOption()] %% @doc Returns the default pubsub node options. %%Example of function return value:
%% ``` %% [{deliver_payloads, true}, %% {notify_config, false}, %% {notify_delete, false}, %% {notify_retract, true}, %% {persist_items, true}, %% {max_items, 10}, %% {subscribe, true}, %% {access_model, open}, %% {publish_model, publishers}, %% {max_payload_size, 100000}, %% {send_last_published_item, never}, %% {presence_based_delivery, false}]''' options() -> [{deliver_payloads, true}, {notify_config, false}, {notify_delete, false}, {notify_retract, true}, {purge_offline, false}, {persist_items, true}, {max_items, ?MAXITEMS}, {subscribe, true}, {access_model, open}, {roster_groups_allowed, []}, {publish_model, publishers}, {notification_type, headline}, {max_payload_size, ?MAX_PAYLOAD_SIZE}, {send_last_published_item, on_sub_and_presence}, {deliver_notifications, true}, {presence_based_delivery, false}]. %% @spec () -> Features %% Features = [string()] %% @doc Returns the node features features() -> ["create-nodes", "auto-create", "access-authorize", "delete-nodes", "delete-items", "get-pending", "instant-nodes", "manage-subscriptions", "modify-affiliations", "multi-subscribe", "outcast-affiliation", "persistent-items", "publish", "purge-nodes", "retract-items", "retrieve-affiliations", "retrieve-items", "retrieve-subscriptions", "subscribe", "subscription-notifications", "subscription-options" ]. %% @spec (Host, ServerHost, NodeId, ParentNodeId, Owner, Access) -> {result, Allowed} %% Host = mod_pubsub:hostPubsub() %% ServerHost = string() %% NodeId = mod_pubsub:nodeId() %% ParentNodeId = mod_pubsub:nodeId() %% Owner = mod_pubsub:jid() %% Access = all | atom() %% Allowed = boolean() %% @doc Checks if the current user has the permission to create the requested node %%In {@link node_default}, the permission is decided by the place in the %% hierarchy where the user is creating the node. The access parameter is also %% checked in the default module. This parameter depends on the value of the %% access_createnode ACL value in ejabberd config file.
%%This function also check that node can be created a a children of its %% parent node
%%PubSub plugins can redefine the PubSub node creation rights as they %% which. They can simply delegate this check to the {@link node_default} %% module by implementing this function like this: %% ```check_create_user_permission(Host, ServerHost, NodeId, ParentNodeId, Owner, Access) -> %% node_default:check_create_user_permission(Host, ServerHost, NodeId, ParentNodeId, Owner, Access).'''
create_node_permission(Host, ServerHost, NodeId, _ParentNodeId, Owner, Access) -> LOwner = jlib:jid_tolower(Owner), {User, Server, _Resource} = LOwner, Allowed = case LOwner of {"", Host, ""} -> true; % pubsub service always allowed _ -> case acl:match_rule(ServerHost, Access, LOwner) of allow -> case node_to_path(NodeId) of ["home", Server, User | _] -> true; _ -> false end; _ -> false end end, {result, Allowed}. %% @spec (NodeIdx, Owner) -> {result, {default, broadcast}} %% NodeIdx = mod_pubsub:nodeIdx() %% Owner = mod_pubsub:jid() %% @doc create_node(NodeIdx, Owner) -> OwnerKey = jlib:jid_tolower(jlib:jid_remove_resource(Owner)), set_state(#pubsub_state{stateid = {OwnerKey, NodeIdx}, affiliation = owner}), {result, {default, broadcast}}. %% @spec (Nodes) -> {result, {default, broadcast, Reply}} %% Nodes = [mod_pubsub:pubsubNode()] %% Reply = [{mod_pubsub:pubsubNode(), %% [{mod_pubsub:ljid(), [{mod_pubsub:subscription(), mod_pubsub:subId()}]}]}] %% @docpurge items of deleted nodes after effective deletion.
delete_node(Nodes) -> Tr = fun(#pubsub_state{stateid = {J, _}, subscriptions = Ss}) -> lists:map(fun(S) -> {J, S} end, Ss) end, Reply = lists:map( fun(#pubsub_node{id = NodeId} = PubsubNode) -> {result, States} = get_states(NodeId), lists:foreach( fun(#pubsub_state{stateid = {LJID, _}, items = Items}) -> del_items(NodeId, Items), del_state(NodeId, LJID) end, States), {PubsubNode, lists:flatmap(Tr, States)} end, Nodes), {result, {default, broadcast, Reply}}. %% @spec (NodeIdx, Sender, Subscriber, AccessModel, SendLast, PresenceSubscription, RosterGroup, Options) -> {error, Reason} | {result, Result} %% NodeIdx = mod_pubsub:nodeIdx() %% Sender = mod_pubsub:jid() %% Subscriber = mod_pubsub:jid() %% AccessModel = mod_pubsub:accessModel() %% SendLast = atom() %% PresenceSubscription = boolean() %% RosterGroup = boolean() %% Options = [mod_pubsub:nodeOption()] %% Reason = mod_pubsub:stanzaError() %% Result = {result, {default, subscribed, mod_pubsub:subId()}} %% | {result, {default, subscribed, mod_pubsub:subId(), send_last}} %% | {result, {default, pending, mod_pubsub:subId()}} %% %% @docAccepts or rejects subcription requests on a PubSub node.
%%The mechanism works as follow: %%
The selected behaviour depends on the return parameter: %%
In the default plugin module, the record is unchanged.
subscribe_node(NodeIdx, Sender, Subscriber, AccessModel, SendLast, PresenceSubscription, RosterGroup, Options) -> SubKey = jlib:jid_tolower(Subscriber), GenKey = jlib:jid_remove_resource(SubKey), Authorized = (jlib:jid_tolower(jlib:jid_remove_resource(Sender)) == GenKey), GenState = get_state(NodeIdx, GenKey), SubState = case SubKey of GenKey -> GenState; _ -> get_state(NodeIdx, SubKey) end, Affiliation = GenState#pubsub_state.affiliation, Subscriptions = SubState#pubsub_state.subscriptions, Whitelisted = lists:member(Affiliation, [member, publisher, owner]), PendingSubscription = lists:any(fun({pending, _}) -> true; (_) -> false end, Subscriptions), if not Authorized -> %% JIDs do not match {error, ?ERR_EXTENDED(?ERR_BAD_REQUEST, "invalid-jid")}; Affiliation == outcast -> %% Requesting entity is blocked {error, ?ERR_FORBIDDEN}; PendingSubscription -> %% Requesting entity has pending subscription {error, ?ERR_EXTENDED(?ERR_NOT_AUTHORIZED, "pending-subscription")}; (AccessModel == presence) and (not PresenceSubscription) -> %% Entity is not authorized to create a subscription (presence subscription required) {error, ?ERR_EXTENDED(?ERR_NOT_AUTHORIZED, "presence-subscription-required")}; (AccessModel == roster) and (not RosterGroup) -> %% Entity is not authorized to create a subscription (not in roster group) {error, ?ERR_EXTENDED(?ERR_NOT_AUTHORIZED, "not-in-roster-group")}; (AccessModel == whitelist) and (not Whitelisted) -> %% Node has whitelist access model and entity lacks required affiliation {error, ?ERR_EXTENDED(?ERR_NOT_ALLOWED, "closed-node")}; %%MustPay -> %% % Payment is required for a subscription %% {error, ?ERR_PAYMENT_REQUIRED}; %%ForbiddenAnonymous -> %% % Requesting entity is anonymous %% {error, ?ERR_FORBIDDEN}; true -> case pubsub_subscription:add_subscription(Subscriber, NodeIdx, Options) of SubId when is_list(SubId) -> NewSub = case AccessModel of authorize -> pending; _ -> subscribed end, set_state(SubState#pubsub_state{subscriptions = [{NewSub, SubId} | Subscriptions]}), case {NewSub, SendLast} of {subscribed, never} -> {result, {default, subscribed, SubId}}; {subscribed, _} -> {result, {default, subscribed, SubId, send_last}}; {_, _} -> {result, {default, pending, SubId}} end; _ -> {error, ?ERR_INTERNAL_SERVER_ERROR} end end. %% @spec (NodeIdx, Sender, Subscriber, SubId) -> {error, Reason} | {result, default} %% NodeIdx = mod_pubsub:nodeIdx() %% Sender = mod_pubsub:jid() %% Subscriber = mod_pubsub:jid() %% SubId = mod_pubsub:subId() %% Reason = mod_pubsub:stanzaError() %% @docUnsubscribe the Subscriber from the Node.
unsubscribe_node(NodeIdx, Sender, Subscriber, SubId) -> SubKey = jlib:jid_tolower(Subscriber), GenKey = jlib:jid_remove_resource(SubKey), Authorized = (jlib:jid_tolower(jlib:jid_remove_resource(Sender)) == GenKey), GenState = get_state(NodeIdx, GenKey), SubState = case SubKey of GenKey -> GenState; _ -> get_state(NodeIdx, SubKey) end, Subscriptions = lists:filter(fun({_Sub, _SubId}) -> true; (_SubId) -> false end, SubState#pubsub_state.subscriptions), SubIdExists = case SubId of [] -> false; List when is_list(List) -> true; _ -> false end, if %% Requesting entity is prohibited from unsubscribing entity not Authorized -> {error, ?ERR_FORBIDDEN}; %% Entity did not specify SubId %%SubId == "", ?? -> %% {error, ?ERR_EXTENDED(?ERR_BAD_REQUEST, "subid-required")}; %% Invalid subscription identifier %%InvalidSubId -> %% {error, ?ERR_EXTENDED(?ERR_NOT_ACCEPTABLE, "invalid-subid")}; %% Requesting entity is not a subscriber Subscriptions == [] -> {error, ?ERR_EXTENDED(?ERR_UNEXPECTED_REQUEST_CANCEL, "not-subscribed")}; %% Subid supplied, so use that. SubIdExists -> Sub = first_in_list(fun(S) -> case S of {_Sub, SubId} -> true; _ -> false end end, SubState#pubsub_state.subscriptions), case Sub of {value, S} -> delete_subscriptions(SubKey, NodeIdx, [S], SubState), {result, default}; false -> {error, ?ERR_EXTENDED(?ERR_UNEXPECTED_REQUEST_CANCEL, "not-subscribed")} end; %% Asking to remove all subscriptions to the given node SubId == all -> delete_subscriptions(SubKey, NodeIdx, Subscriptions, SubState), {result, default}; %% No subid supplied, but there's only one matching subscription length(Subscriptions) == 1 -> delete_subscriptions(SubKey, NodeIdx, Subscriptions, SubState), {result, default}; %% No subid and more than one possible subscription match. true -> {error, ?ERR_EXTENDED(?ERR_BAD_REQUEST, "subid-required")} end. delete_subscriptions(SubKey, NodeIdx, Subscriptions, SubState) -> NewSubs = lists:foldl(fun({Subscription, SubId}, Acc) -> pubsub_subscription:delete_subscription(SubKey, NodeIdx, SubId), Acc -- [{Subscription, SubId}] end, SubState#pubsub_state.subscriptions, Subscriptions), case {SubState#pubsub_state.affiliation, NewSubs} of {none, []} -> % Just a regular subscriber, and this is final item, so % delete the state. del_state(NodeIdx, SubKey); _ -> set_state(SubState#pubsub_state{subscriptions = NewSubs}) end. %% @spec (NodeIdx, Publisher, PublishModel, MaxItems, ItemId, Payload) -> %% {result, {default, broadcast, ItemIds}} | {error, Reason} %% NodeIdx = mod_pubsub:nodeIdx() %% Publisher = mod_pubsub:jid() %% PublishModel = atom() %% MaxItems = integer() %% ItemId = mod_pubsub:itemId() %% Payload = mod_pubsub:payload() %% ItemIds = [mod_pubsub:itemId()] | [] %% Reason = mod_pubsub:stanzaError() %% @docPublishes the item passed as parameter.
%%The mechanism works as follow: %%
The selected behaviour depends on the return parameter: %%
In the default plugin module, the record is unchanged.
publish_item(NodeIdx, Publisher, PublishModel, MaxItems, ItemId, Payload) -> SubKey = jlib:jid_tolower(Publisher), GenKey = jlib:jid_remove_resource(SubKey), GenState = get_state(NodeIdx, GenKey), SubState = case SubKey of GenKey -> GenState; _ -> get_state(NodeIdx, SubKey) end, Affiliation = GenState#pubsub_state.affiliation, Subscribed = case PublishModel of subscribers -> is_subscribed(SubState#pubsub_state.subscriptions); _ -> undefined end, if not ((PublishModel == open) or ((PublishModel == publishers) and ((Affiliation == owner) or (Affiliation == publisher))) or (Subscribed == true)) -> %% Entity does not have sufficient privileges to publish to node {error, ?ERR_FORBIDDEN}; true -> %% TODO: check creation, presence, roster if MaxItems > 0 -> Now = now(), PubId = {Now, SubKey}, Item = case get_item(NodeIdx, ItemId) of {result, OldItem} -> OldItem#pubsub_item{modification = PubId, payload = Payload}; _ -> #pubsub_item{itemid = {ItemId, NodeIdx}, creation = {Now, GenKey}, modification = PubId, payload = Payload} end, Items = [ItemId | GenState#pubsub_state.items--[ItemId]], {result, {NI, OI}} = remove_extra_items(NodeIdx, MaxItems, Items), set_item(Item), set_state(GenState#pubsub_state{items = NI}), {result, {default, broadcast, OI}}; true -> {result, {default, broadcast, []}} end end. %% @spec (NodeIdx, MaxItems, ItemIds) -> {result, {NewItemIds,OldItemIds}} %% NodeIdx = mod_pubsub:nodeIdx() %% MaxItems = integer() | unlimited %% ItemIds = [mod_pubsub:itemId()] %% NewItemIds = [mod_pubsub:itemId()] %% OldItemIds = [mod_pubsub:itemId()] | [] %% @docThis function is used to remove extra items, most notably when the %% maximum number of items has been reached.
%%This function is used internally by the core PubSub module, as no %% permission check is performed.
%%In the default plugin module, the oldest items are removed, but other %% rules can be used.
%%If another PubSub plugin wants to delegate the item removal (and if the %% plugin is using the default pubsub storage), it can implements this function like this: %% ```remove_extra_items(NodeIdx, MaxItems, ItemIds) -> %% node_default:remove_extra_items(NodeIdx, MaxItems, ItemIds).'''
remove_extra_items(_NodeIdx, unlimited, ItemIds) -> {result, {ItemIds, []}}; remove_extra_items(NodeIdx, MaxItems, ItemIds) -> NewItems = lists:sublist(ItemIds, MaxItems), OldItems = lists:nthtail(length(NewItems), ItemIds), %% Remove extra items: del_items(NodeIdx, OldItems), %% Return the new items list: {result, {NewItems, OldItems}}. %% @spec (NodeIdx, Publisher, PublishModel, ItemId) -> %% {result, {default, broadcast}} | {error, Reason} %% NodeIdx = mod_pubsub:nodeIdx() %% Publisher = mod_pubsub:jid() %% PublishModel = atom() %% ItemId = mod_pubsub:itemId() %% Reason = mod_pubsub:stanzaError() %% @docTriggers item deletion.
%%Default plugin: The user performing the deletion must be the node owner %% or a publisher, or PublishModel being open.
delete_item(NodeIdx, Publisher, PublishModel, ItemId) -> SubKey = jlib:jid_tolower(Publisher), GenKey = jlib:jid_remove_resource(SubKey), GenState = get_state(NodeIdx, GenKey), #pubsub_state{affiliation = Affiliation, items = Items} = GenState, Allowed = (Affiliation == publisher) orelse (Affiliation == owner) orelse (PublishModel == open) orelse case get_item(NodeIdx, ItemId) of {result, #pubsub_item{creation = {_, GenKey}}} -> true; _ -> false end, if not Allowed -> %% Requesting entity does not have sufficient privileges {error, ?ERR_FORBIDDEN}; true -> case lists:member(ItemId, Items) of true -> del_item(NodeIdx, ItemId), set_state(GenState#pubsub_state{items = lists:delete(ItemId, Items)}), {result, {default, broadcast}}; false -> case Affiliation of owner -> %% Owner can delete any items from its own node {result, States} = get_states(NodeIdx), lists:foldl( fun(#pubsub_state{items = PI} = S, Res) -> case lists:member(ItemId, PI) of true -> del_item(NodeIdx, ItemId), set_state(S#pubsub_state{items = lists:delete(ItemId, PI)}), {result, {default, broadcast}}; false -> Res end; (_, Res) -> Res end, {error, ?ERR_ITEM_NOT_FOUND}, States); _ -> %% Non-existent node or item {error, ?ERR_ITEM_NOT_FOUND} end end end. %% @spec (NodeIdx, Owner) -> {error, Reason} | {result, {default, broadcast}} %% NodeIdx = mod_pubsub:nodeIdx() %% Owner = mod_pubsub:jid() %% Reason = mod_pubsub:stanzaError() purge_node(NodeIdx, Owner) -> SubKey = jlib:jid_tolower(Owner), GenKey = jlib:jid_remove_resource(SubKey), GenState = get_state(NodeIdx, GenKey), case GenState of #pubsub_state{affiliation = owner} -> {result, States} = get_states(NodeIdx), lists:foreach( fun(#pubsub_state{items = []}) -> ok; (#pubsub_state{items = Items} = S) -> del_items(NodeIdx, Items), set_state(S#pubsub_state{items = []}) end, States), {result, {default, broadcast}}; _ -> %% Entity is not owner {error, ?ERR_FORBIDDEN} end. %% @spec (Host, Owner) -> {result, Reply} %% Host = mod_pubsub:hostPubsub() %% Owner = mod_pubsub:jid() %% Reply = [] | [{mod_pubsub:pubsubNode(), mod_pubsub:affiliation()}] %% @docReturn the current affiliations for the given user
%%The default module reads affiliations in the main Mnesia %% pubsub_state table. If a plugin stores its data in the same %% table, it should return an empty list, as the affiliation will be read by %% the default PubSub module. Otherwise, it should return its own affiliation, %% that will be added to the affiliation stored in the main %% pubsub_state table.
get_entity_affiliations(Host, Owner) -> SubKey = jlib:jid_tolower(Owner), GenKey = jlib:jid_remove_resource(SubKey), States = mnesia:match_object(#pubsub_state{stateid = {GenKey, '_'}, _ = '_'}), NodeTree = case catch ets:lookup(gen_mod:get_module_proc(Host, config), nodetree) of [{nodetree, N}] -> N; _ -> nodetree_tree end, Reply = lists:foldl(fun(#pubsub_state{stateid = {_, N}, affiliation = A}, Acc) -> case NodeTree:get_node(N) of #pubsub_node{nodeid = {Host, _}} = Node -> [{Node, A}|Acc]; _ -> Acc end end, [], States), {result, Reply}. get_node_affiliations(NodeId) -> {result, States} = get_states(NodeId), Tr = fun(#pubsub_state{stateid = {J, _}, affiliation = A}) -> {J, A} end, {result, lists:map(Tr, States)}. get_affiliation(NodeId, Owner) -> SubKey = jlib:jid_tolower(Owner), GenKey = jlib:jid_remove_resource(SubKey), GenState = get_state(NodeId, GenKey), {result, GenState#pubsub_state.affiliation}. set_affiliation(NodeId, Owner, Affiliation) -> SubKey = jlib:jid_tolower(Owner), GenKey = jlib:jid_remove_resource(SubKey), GenState = get_state(NodeId, GenKey), case {Affiliation, GenState#pubsub_state.subscriptions} of {none, none} -> del_state(NodeId, GenKey); _ -> set_state(GenState#pubsub_state{affiliation = Affiliation}) end. %% @spec (Host, Owner) -> %% {'result', [] %% | [{Node, Subscription, SubId, Entity}] %% | [{Node, Subscription, Entity}]} %% Host = mod_pubsub:hostPubsub() %% Owner = mod_pubsub:jid() %% Node = mod_pubsub:pubsubNode() %% Subscription = mod_pubsub:subscription() %% SubId = mod_pubsub:subId() %% Entity = mod_pubsub:ljid() %% @docReturn the current subscriptions for the given user
%%The default module reads subscriptions in the main Mnesia %% pubsub_state table. If a plugin stores its data in the same %% table, it should return an empty list, as the affiliation will be read by %% the default PubSub module. Otherwise, it should return its own affiliation, %% that will be added to the affiliation stored in the main %% pubsub_state table.
get_entity_subscriptions(Host, Owner) -> {U, D, _} = SubKey = jlib:jid_tolower(Owner), GenKey = jlib:jid_remove_resource(SubKey), States = case SubKey of GenKey -> mnesia:match_object( #pubsub_state{stateid = {{U, D, '_'}, '_'}, _ = '_'}); _ -> mnesia:match_object( #pubsub_state{stateid = {GenKey, '_'}, _ = '_'}) ++ mnesia:match_object( #pubsub_state{stateid = {SubKey, '_'}, _ = '_'}) end, NodeTree = case catch ets:lookup(gen_mod:get_module_proc(Host, config), nodetree) of [{nodetree, N}] -> N; _ -> nodetree_tree end, Reply = lists:foldl(fun(#pubsub_state{stateid = {J, N}, subscriptions = Ss}, Acc) -> case NodeTree:get_node(N) of #pubsub_node{nodeid = {Host, _}} = Node -> lists:foldl(fun({Sub, SubId}, Acc2) -> [{Node, Sub, SubId, J} | Acc2]; (S, Acc2) -> [{Node, S, J} | Acc2] end, Acc, Ss); _ -> Acc end end, [], States), {result, Reply}. get_node_subscriptions(NodeId) -> {result, States} = get_states(NodeId), Tr = fun(#pubsub_state{stateid = {J, _}, subscriptions = Subscriptions}) -> %% TODO: get rid of cases to handle non-list subscriptions case Subscriptions of [_|_] -> lists:foldl(fun({S, SubId}, Acc) -> [{J, S, SubId} | Acc]; (S, Acc) -> [{J, S} | Acc] end, [], Subscriptions); [] -> []; _ -> [{J, none}] end end, {result, lists:flatmap(Tr, States)}. get_subscriptions(NodeId, Owner) -> SubKey = jlib:jid_tolower(Owner), SubState = get_state(NodeId, SubKey), {result, SubState#pubsub_state.subscriptions}. set_subscriptions(NodeId, Owner, Subscription, SubId) -> SubKey = jlib:jid_tolower(Owner), SubState = get_state(NodeId, SubKey), case {SubId, SubState#pubsub_state.subscriptions} of {_, []} -> case Subscription of none -> {error, ?ERR_EXTENDED(?ERR_BAD_REQUEST, "not-subscribed")}; _ -> new_subscription(NodeId, Owner, Subscription, SubState) end; {"", [{_, SID}]} -> case Subscription of none -> unsub_with_subid(NodeId, SID, SubState); _ -> replace_subscription({Subscription, SID}, SubState) end; {"", [_|_]} -> {error, ?ERR_EXTENDED(?ERR_BAD_REQUEST, "subid-required")}; _ -> case Subscription of none -> unsub_with_subid(NodeId, SubId, SubState); _ -> replace_subscription({Subscription, SubId}, SubState) end end. replace_subscription(NewSub, SubState) -> NewSubs = replace_subscription(NewSub, SubState#pubsub_state.subscriptions, []), set_state(SubState#pubsub_state{subscriptions = NewSubs}). replace_subscription(_, [], Acc) -> Acc; replace_subscription({Sub, SubId}, [{_, SubID} | T], Acc) -> replace_subscription({Sub, SubId}, T, [{Sub, SubID} | Acc]). new_subscription(NodeId, Owner, Subscription, SubState) -> SubId = pubsub_subscription:add_subscription(Owner, NodeId, []), Subscriptions = SubState#pubsub_state.subscriptions, set_state(SubState#pubsub_state{subscriptions = [{Subscription, SubId} | Subscriptions]}), {Subscription, SubId}. unsub_with_subid(NodeId, SubId, SubState) -> pubsub_subscription:delete_subscription(SubState#pubsub_state.stateid, NodeId, SubId), NewSubs = lists:filter(fun ({_, SID}) -> SubId =/= SID end, SubState#pubsub_state.subscriptions), case {NewSubs, SubState#pubsub_state.affiliation} of {[], none} -> del_state(NodeId, element(1, SubState#pubsub_state.stateid)); _ -> set_state(SubState#pubsub_state{subscriptions = NewSubs}) end. %% TODO : doc %% @spec (Host, Owner) -> {result, Reply} | {error, Reason} %% Host = mod_pubsub:hostPubsub() %% Owner = mod_pubsub:jid() %% Reply = [] | [mod_pubsub:nodeId()] %% @docReturns a list of Owner's nodes on Host with pending %% subscriptions.
get_pending_nodes(Host, Owner) -> GenKey = jlib:jid_remove_resource(jlib:jid_tolower(Owner)), States = mnesia:match_object(#pubsub_state{stateid = {GenKey, '_'}, affiliation = owner, _ = '_'}), NodeIDs = [ID || #pubsub_state{stateid = {_, ID}} <- States], NodeTree = case catch ets:lookup(gen_mod:get_module_proc(Host, config), nodetree) of [{nodetree, N}] -> N; _ -> nodetree_tree end, Reply = mnesia:foldl(fun(#pubsub_state{stateid = {_, NID}} = S, Acc) -> case lists:member(NID, NodeIDs) of true -> case get_nodes_helper(NodeTree, S) of {value, Node} -> [Node | Acc]; false -> Acc end; false -> Acc end end, [], pubsub_state), {result, Reply}. get_nodes_helper(NodeTree, #pubsub_state{stateid = {_, N}, subscriptions = Subs}) -> HasPending = fun ({pending, _}) -> true; (pending) -> true; (_) -> false end, case lists:any(HasPending, Subs) of true -> case NodeTree:get_node(N) of #pubsub_node{nodeid = {_, Node}} -> {value, Node}; _ -> false end; false -> false end. %% @spec (NodeIdx) -> {result, States} %% NodeIdx = mod_pubsub:nodeIdx() %% States = [] | [mod_pubsub:pubsubState()] %% @doc Returns the list of stored states for a given node. %%For the default PubSub module, states are stored in Mnesia database.
%%We can consider that the pubsub_state table have been created by the main %% mod_pubsub module.
%%PubSub plugins can store the states where they wants (for example in a %% relational database).
%%If a PubSub plugin wants to delegate the states storage to the default node, %% they can implement this function like this: %% ```get_states(NodeIdx) -> %% node_default:get_states(NodeIdx).'''
get_states(NodeIdx) -> States = case catch mnesia:match_object( #pubsub_state{stateid = {'_', NodeIdx}, _ = '_'}) of List when is_list(List) -> List; _ -> [] end, {result, States}. %% @spec (NodeIdx, JID) -> State %% NodeIdx = mod_pubsub:nodeIdx() %% JID = mod_pubsub:jid() %% State = mod_pubsub:pubsubState() %% @docReturns a state (one state list), given its reference.
get_state(NodeIdx, JID) -> StateId = {JID, NodeIdx}, case catch mnesia:read({pubsub_state, StateId}) of [State] when is_record(State, pubsub_state) -> State; _ -> #pubsub_state{stateid=StateId} end. %% @spec (State) -> ok | {error, Reason} %% State = mod_pubsub:pubsubState() %% Reason = mod_pubsub:stanzaError() %% @docWrite a state into database.
set_state(State) when is_record(State, pubsub_state) -> mnesia:write(State); set_state(_) -> {error, ?ERR_INTERNAL_SERVER_ERROR}. %% @spec (NodeIdx, JID) -> ok | {error, Reason} %% NodeIdx = mod_pubsub:nodeIdx() %% JID = mod_pubsub:jid() %% Reason = mod_pubsub:stanzaError() %% @docDelete a state from database.
del_state(NodeIdx, JID) -> mnesia:delete({pubsub_state, {JID, NodeIdx}}). %% @spec (NodeIdx, From) -> {result, Items} %% NodeIdx = mod_pubsub:nodeIdx() %% From = mod_pubsub:jid() %% Items = [] | [mod_pubsub:pubsubItem()] %% @doc Returns the list of stored items for a given node. %%For the default PubSub module, items are stored in Mnesia database.
%%We can consider that the pubsub_item table have been created by the main %% mod_pubsub module.
%%PubSub plugins can store the items where they wants (for example in a %% relational database), or they can even decide not to persist any items.
%%If a PubSub plugin wants to delegate the item storage to the default node, %% they can implement this function like this: %% ```get_items(NodeIdx, From) -> %% node_default:get_items(NodeIdx, From).'''
get_items(NodeIdx, _From) -> Items = mnesia:match_object(#pubsub_item{itemid = {'_', NodeIdx}, _ = '_'}), {result, lists:reverse(lists:keysort(#pubsub_item.modification, Items))}. get_items(NodeIdx, JID, AccessModel, PresenceSubscription, RosterGroup, _SubId) -> SubKey = jlib:jid_tolower(JID), GenKey = jlib:jid_remove_resource(SubKey), GenState = get_state(NodeIdx, GenKey), SubState = get_state(NodeIdx, SubKey), Affiliation = GenState#pubsub_state.affiliation, Subscriptions = SubState#pubsub_state.subscriptions, Whitelisted = can_fetch_item(Affiliation, Subscriptions), if %%SubId == "", ?? -> %% Entity has multiple subscriptions to the node but does not specify a subscription ID %{error, ?ERR_EXTENDED(?ERR_BAD_REQUEST, "subid-required")}; %%InvalidSubId -> %% Entity is subscribed but specifies an invalid subscription ID %{error, ?ERR_EXTENDED(?ERR_NOT_ACCEPTABLE, "invalid-subid")}; GenState#pubsub_state.affiliation == outcast -> %% Requesting entity is blocked {error, ?ERR_FORBIDDEN}; (AccessModel == presence) and (not PresenceSubscription) -> %% Entity is not authorized to create a subscription (presence subscription required) {error, ?ERR_EXTENDED(?ERR_NOT_AUTHORIZED, "presence-subscription-required")}; (AccessModel == roster) and (not RosterGroup) -> %% Entity is not authorized to create a subscription (not in roster group) {error, ?ERR_EXTENDED(?ERR_NOT_AUTHORIZED, "not-in-roster-group")}; (AccessModel == whitelist) and (not Whitelisted) -> %% Node has whitelist access model and entity lacks required affiliation {error, ?ERR_EXTENDED(?ERR_NOT_ALLOWED, "closed-node")}; (AccessModel == authorize) and (not Whitelisted) -> %% Node has authorize access model {error, ?ERR_FORBIDDEN}; %%MustPay -> %% % Payment is required for a subscription %% {error, ?ERR_PAYMENT_REQUIRED}; true -> get_items(NodeIdx, JID) end. %% @spec (NodeIdx, ItemId) -> {result, Item} | {error, 'item-not-found'} %% NodeIdx = mod_pubsub:nodeIdx() %% ItemId = mod_pubsub:itemId() %% Item = mod_pubsub:pubsubItem() %% @docReturns an item (one item list), given its reference.
get_item(NodeIdx, ItemId) -> case mnesia:read({pubsub_item, {ItemId, NodeIdx}}) of [Item] when is_record(Item, pubsub_item) -> {result, Item}; _ -> {error, ?ERR_ITEM_NOT_FOUND} end. %% @spec (NodeIdx, ItemId, JID, AccessModel, PresenceSubscription, RosterGroup, SubId) -> {result, Item} | {error, Reason} %% NodeIdx = mod_pubsub:nodeIdx() %% ItemId = mod_pubsub:itemId() %% JID = mod_pubsub:jid() %% AccessModel = mod_pubsub:accessModel() %% PresenceSubscription = boolean() %% RosterGroup = boolean() %% SubId = mod_pubsub:subId() %% Item = mod_pubsub:pubsubItem() %% Reason = mod_pubsub:stanzaError() | 'item-not-found' get_item(NodeIdx, ItemId, JID, AccessModel, PresenceSubscription, RosterGroup, _SubId) -> SubKey = jlib:jid_tolower(JID), GenKey = jlib:jid_remove_resource(SubKey), GenState = get_state(NodeIdx, GenKey), Affiliation = GenState#pubsub_state.affiliation, Subscriptions = GenState#pubsub_state.subscriptions, Whitelisted = can_fetch_item(Affiliation, Subscriptions), if %%SubId == "", ?? -> %% Entity has multiple subscriptions to the node but does not specify a subscription ID %{error, ?ERR_EXTENDED(?ERR_BAD_REQUEST, "subid-required")}; %%InvalidSubId -> %% Entity is subscribed but specifies an invalid subscription ID %{error, ?ERR_EXTENDED(?ERR_NOT_ACCEPTABLE, "invalid-subid")}; GenState#pubsub_state.affiliation == outcast -> %% Requesting entity is blocked {error, ?ERR_FORBIDDEN}; (AccessModel == presence) and (not PresenceSubscription) -> %% Entity is not authorized to create a subscription (presence subscription required) {error, ?ERR_EXTENDED(?ERR_NOT_AUTHORIZED, "presence-subscription-required")}; (AccessModel == roster) and (not RosterGroup) -> %% Entity is not authorized to create a subscription (not in roster group) {error, ?ERR_EXTENDED(?ERR_NOT_AUTHORIZED, "not-in-roster-group")}; (AccessModel == whitelist) and (not Whitelisted) -> %% Node has whitelist access model and entity lacks required affiliation {error, ?ERR_EXTENDED(?ERR_NOT_ALLOWED, "closed-node")}; (AccessModel == authorize) and (not Whitelisted) -> %% Node has authorize access model {error, ?ERR_FORBIDDEN}; %%MustPay -> %% % Payment is required for a subscription %% {error, ?ERR_PAYMENT_REQUIRED}; true -> get_item(NodeIdx, ItemId) end. %% @spec (Item) -> ok | {error, Reason} %% Item = mod_pubsub:pubsubItem() %% Reason = mod_pubsub:stanzaError() %% @docWrite an item into database.
set_item(Item) when is_record(Item, pubsub_item) -> mnesia:write(Item); set_item(_) -> {error, ?ERR_INTERNAL_SERVER_ERROR}. %% @spec (NodeIdx, ItemId) -> ok | {error, Reason} %% NodeIdx = mod_pubsub:nodeIdx() %% ItemId = mod_pubsub:itemId() %% Reason = mod_pubsub:stanzaError() %% @docDelete an item from database.
del_item(NodeIdx, ItemId) -> mnesia:delete({pubsub_item, {ItemId, NodeIdx}}). del_items(NodeIdx, ItemIds) -> lists:foreach(fun(ItemId) -> del_item(NodeIdx, ItemId) end, ItemIds). %% @docReturn the name of the node if known: Default is to return %% node id.
get_item_name(_Host, _Node, Id) -> Id. node_to_path(Node) -> string:tokens(binary_to_list(Node), "/"). path_to_node([]) -> <<>>; path_to_node(Path) -> list_to_binary(string:join([""|Path], "/")). %% @spec (Affiliation, Subscription) -> true | false %% Affiliation = owner | member | publisher | outcast | none %% Subscription = subscribed | none %% @doc Determines if the combination of Affiliation and Subscribed %% are allowed to get items from a node. can_fetch_item(owner, _) -> true; can_fetch_item(member, _) -> true; can_fetch_item(publisher, _) -> true; can_fetch_item(outcast, _) -> false; can_fetch_item(none, Subscriptions) -> is_subscribed(Subscriptions); can_fetch_item(_Affiliation, _Subscription) -> false. is_subscribed(Subscriptions) -> lists:any(fun ({subscribed, _SubId}) -> true; (_) -> false end, Subscriptions). %% Returns the first item where Pred() is true in List first_in_list(_Pred, []) -> false; first_in_list(Pred, [H | T]) -> case Pred(H) of true -> {value, H}; _ -> first_in_list(Pred, T) end. ejabberd-2.1.11/src/mod_pubsub/node_buddy.erl 0000664 0000000 0000000 00000014315 12240230175 015770 0 ustar %%% ==================================================================== %%% ``The contents of this file are subject to the Erlang Public License, %%% Version 1.1, (the "License"); you may not use this file except in %%% compliance with the License. You should have received a copy of the %%% Erlang Public License along with this software. If not, it can be %%% retrieved via the world wide web at http://www.erlang.org/. %%% %%% Software distributed under the License is distributed on an "AS IS" %%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See %%% the License for the specific language governing rights and limitations %%% under the License. %%% %%% The Initial Developer of the Original Code is ProcessOne. %%% Portions created by ProcessOne are Copyright 2006-2012, ProcessOne %%% All Rights Reserved.'' %%% This software is copyright 2006-2012, ProcessOne. %%% %%% %%% @copyright 2006-2012 ProcessOne %%% @author Christophe romainThe Erlang code for the plugin is located in a module called %% node_plugin. The 'node_' prefix is mandatory.
%%The modules are initialized in alphetical order and the list is checked %% and sorted to ensure that each module is initialized only once.
%%See {@link node_hometree:init/1} for an example implementation.
init_plugins(Host, ServerHost, Opts) -> TreePlugin = list_to_atom(?TREE_PREFIX ++ gen_mod:get_opt(nodetree, Opts, ?STDTREE)), ?DEBUG("** tree plugin is ~p",[TreePlugin]), TreePlugin:init(Host, ServerHost, Opts), Plugins = gen_mod:get_opt(plugins, Opts, [?STDNODE]), PepMapping = gen_mod:get_opt(pep_mapping, Opts, []), ?DEBUG("** PEP Mapping : ~p~n",[PepMapping]), PluginsOK = lists:foldl(fun(Name, Acc) -> Plugin = list_to_atom(?PLUGIN_PREFIX ++ Name), case catch apply(Plugin, init, [Host, ServerHost, Opts]) of {'EXIT', _Error} -> Acc; _ -> ?DEBUG("** init ~s plugin",[Name]), [Name | Acc] end end, [], Plugins), {lists:reverse(PluginsOK), TreePlugin, PepMapping}. terminate_plugins(Host, ServerHost, Plugins, TreePlugin) -> lists:foreach(fun(Name) -> ?DEBUG("** terminate ~s plugin",[Name]), Plugin = list_to_atom(?PLUGIN_PREFIX++Name), Plugin:terminate(Host, ServerHost) end, Plugins), TreePlugin:terminate(Host, ServerHost), ok. init_nodes(Host, ServerHost, _NodeTree, Plugins) -> %% TODO, this call should be done plugin side case lists:member("hometree_odbc", Plugins) of true -> create_node(Host, ServerHost, string_to_node("/home"), service_jid(Host), "hometree_odbc"), create_node(Host, ServerHost, string_to_node("/home/"++ServerHost), service_jid(Host), "hometree_odbc"); false -> ok end. send_loop(State) -> receive {presence, JID, Pid} -> Host = State#state.host, ServerHost = State#state.server_host, LJID = jlib:jid_tolower(JID), BJID = jlib:jid_remove_resource(LJID), %% for each node From is subscribed to %% and if the node is so configured, send the last published item to From lists:foreach(fun(PType) -> Subscriptions = case catch node_action(Host, PType, get_entity_subscriptions_for_send_last, [Host, JID]) of {result, S} -> S; _ -> [] end, lists:foreach( fun({Node, subscribed, _, SubJID}) -> if (SubJID == LJID) or (SubJID == BJID) -> #pubsub_node{nodeid = {H, N}, type = Type, id = NodeId} = Node, send_items(H, N, NodeId, Type, LJID, last); true -> % resource not concerned about that subscription ok end; (_) -> ok end, Subscriptions) end, State#state.plugins), %% and force send the last PEP events published by its offline and local contacts %% only if pubsub is explicitely configured for that. %% this is a hack in a sense that PEP should only be based on presence %% and is not able to "store" events of remote users (via s2s) %% this makes that hack only work for local domain by now if not State#state.ignore_pep_from_offline -> {User, Server, Resource} = jlib:jid_tolower(JID), case catch ejabberd_c2s:get_subscribed(Pid) of Contacts when is_list(Contacts) -> lists:foreach( fun({U, S, R}) -> case S of ServerHost -> %% local contacts case user_resources(U, S) of [] -> %% offline PeerJID = jlib:make_jid(U, S, R), self() ! {presence, User, Server, [Resource], PeerJID}; _ -> %% online % this is already handled by presence probe ok end; _ -> %% remote contacts % we can not do anything in any cases ok end end, Contacts); _ -> ok end; true -> ok end, send_loop(State); {presence, User, Server, Resources, JID} -> %% get resources caps and check if processing is needed spawn(fun() -> Host = State#state.host, Owner = jlib:jid_remove_resource(jlib:jid_tolower(JID)), lists:foreach(fun(#pubsub_node{nodeid = {_, Node}, type = Type, id = NodeId, options = Options}) -> case get_option(Options, send_last_published_item) of on_sub_and_presence -> lists:foreach( fun(Resource) -> LJID = {User, Server, Resource}, Subscribed = case get_option(Options, access_model) of open -> true; presence -> true; whitelist -> false; % subscribers are added manually authorize -> false; % likewise roster -> Grps = get_option(Options, roster_groups_allowed, []), {OU, OS, _} = Owner, element(2, get_roster_info(OU, OS, LJID, Grps)) end, if Subscribed -> send_items(Owner, Node, NodeId, Type, LJID, last); true -> ok end end, Resources); _ -> ok end end, tree_action(Host, get_nodes, [Owner, JID])) end), send_loop(State); stop -> ok end. %% ------- %% disco hooks handling functions %% disco_local_identity(Acc, _From, To, [], _Lang) -> case lists:member(?PEPNODE, plugins(To#jid.lserver)) of true -> [{xmlelement, "identity", [{"category", "pubsub"}, {"type", "pep"}], []} | Acc]; false -> Acc end; disco_local_identity(Acc, _From, _To, _Node, _Lang) -> Acc. disco_local_features(Acc, _From, To, [], _Lang) -> Host = To#jid.lserver, Feats = case Acc of {result, I} -> I; _ -> [] end, {result, Feats ++ lists:map(fun(Feature) -> ?NS_PUBSUB++"#"++Feature end, features(Host, <<>>))}; disco_local_features(Acc, _From, _To, _Node, _Lang) -> Acc. disco_local_items(Acc, _From, _To, [], _Lang) -> Acc; disco_local_items(Acc, _From, _To, _Node, _Lang) -> Acc. disco_sm_identity(Acc, From, To, Node, Lang) when is_list(Node) -> disco_sm_identity(Acc, From, To, list_to_binary(Node), Lang); disco_sm_identity(empty, From, To, Node, Lang) -> disco_sm_identity([], From, To, Node, Lang); disco_sm_identity(Acc, From, To, Node, _Lang) -> disco_identity(jlib:jid_tolower(jlib:jid_remove_resource(To)), Node, From) ++ Acc. disco_identity(_Host, <<>>, _From) -> [{xmlelement, "identity", [{"category", "pubsub"}, {"type", "pep"}], []}]; disco_identity(Host, Node, From) -> Action = fun(#pubsub_node{id = Idx, type = Type, options = Options}) -> Owners = node_owners_call(Type, Idx), case get_allowed_items_call(Host, Idx, From, Type, Options, Owners) of {result, _} -> {result, [{xmlelement, "identity", [{"category", "pubsub"}, {"type", "pep"}], []}, {xmlelement, "identity", [{"category", "pubsub"}, {"type", "leaf"} | case get_option(Options, title) of false -> []; [Title] -> [{"name", Title}] end], []}]}; _ -> {result, []} end end, case transaction(Host, Node, Action, sync_dirty) of {result, {_, Result}} -> Result; _ -> [] end. disco_sm_features(Acc, From, To, Node, Lang) when is_list(Node) -> disco_sm_features(Acc, From, To, list_to_binary(Node), Lang); disco_sm_features(empty, From, To, Node, Lang) -> disco_sm_features({result, []}, From, To, Node, Lang); disco_sm_features({result, OtherFeatures} = _Acc, From, To, Node, _Lang) -> {result, OtherFeatures ++ disco_features(jlib:jid_tolower(jlib:jid_remove_resource(To)), Node, From)}; disco_sm_features(Acc, _From, _To, _Node, _Lang) -> Acc. disco_features(_Host, <<>>, _From) -> [?NS_PUBSUB | [?NS_PUBSUB++"#"++Feature || Feature <- features("pep")]]; disco_features(Host, Node, From) -> Action = fun(#pubsub_node{id = Idx, type = Type, options = Options}) -> Owners = node_owners_call(Type, Idx), case get_allowed_items_call(Host, Idx, From, Type, Options, Owners) of {result, _} -> {result, [?NS_PUBSUB | [?NS_PUBSUB ++ "#" ++ Feature || Feature <- features("pep")]]}; _ -> {result, []} end end, case transaction(Host, Node, Action, sync_dirty) of {result, {_, Result}} -> Result; _ -> [] end. disco_sm_items(Acc, From, To, Node, Lang) when is_list(Node) -> disco_sm_items(Acc, From, To, list_to_binary(Node), Lang); disco_sm_items(empty, From, To, Node, Lang) -> disco_sm_items({result, []}, From, To, Node, Lang); disco_sm_items({result, OtherItems}, From, To, Node, _Lang) -> {result, lists:usort(OtherItems ++ disco_items(jlib:jid_tolower(jlib:jid_remove_resource(To)), Node, From))}; disco_sm_items(Acc, _From, _To, _Node, _Lang) -> Acc. disco_items(Host, <<>>, From) -> Action = fun(#pubsub_node{nodeid ={_, NodeID}, options = Options, type = Type, id = Idx}, Acc) -> Owners = node_owners_call(Type, Idx), case get_allowed_items_call(Host, Idx, From, Type, Options, Owners) of {result, _} -> [{xmlelement, "item", [{"node", binary_to_list(NodeID)}, {"jid", case Host of {_,_,_} -> jlib:jid_to_string(Host); _Host -> Host end} | case get_option(Options, title) of false -> []; [Title] -> [{"name", Title}] end], []} | Acc]; _ -> Acc end end, case transaction_on_nodes(Host, Action, sync_dirty) of {result, Items} -> Items; _ -> [] end; disco_items(Host, Node, From) -> Action = fun(#pubsub_node{id = Idx, type = Type, options = Options}) -> Owners = node_owners_call(Type, Idx), case get_allowed_items_call(Host, Idx, From, Type, Options, Owners) of {result, Items} -> {result, [{xmlelement, "item", [{"jid", case Host of {_,_,_} -> jlib:jid_to_string(Host); _Host -> Host end}, {"name", ItemID}], []} || #pubsub_item{itemid = {ItemID,_}} <- Items]}; _ -> {result, []} end end, case transaction(Host, Node, Action, sync_dirty) of {result, {_, Result}} -> Result; _ -> [] end. %% ------- %% presence hooks handling functions %% caps_update(#jid{luser = U, lserver = S, lresource = R} = From, To, _Features) -> Pid = ejabberd_sm:get_session_pid(U, S, R), presence_probe(From, To, Pid). presence_probe(#jid{luser = User, lserver = Server, lresource = Resource} = JID, JID, Pid) -> %%?DEBUG("presence probe self ~s@~s/~s ~s@~s/~s",[User,Server,Resource,element(2,JID),element(3,JID),element(4,JID)]), presence(Server, {presence, JID, Pid}), presence(Server, {presence, User, Server, [Resource], JID}); presence_probe(#jid{luser = User, lserver = Server}, #jid{luser = User, lserver = Server}, _Pid) -> %% ignore presence_probe from other ressources for the current user %% this way, we do not send duplicated last items if user already connected with other clients ok; presence_probe(#jid{luser = User, lserver = Server, lresource = Resource}, #jid{lserver = Host} = JID, _Pid) -> %%?DEBUG("presence probe peer ~s@~s/~s ~s@~s/~s",[User,Server,Resource,element(2,JID),element(3,JID),element(4,JID)]), presence(Host, {presence, User, Server, [Resource], JID}). presence(ServerHost, Presence) -> SendLoop = case whereis(gen_mod:get_module_proc(ServerHost, ?LOOPNAME)) of undefined -> % in case send_loop process died, we rebuild a minimal State record and respawn it Host = host(ServerHost), Plugins = plugins(Host), PepOffline = case catch ets:lookup(gen_mod:get_module_proc(ServerHost, config), ignore_pep_from_offline) of [{ignore_pep_from_offline, PO}] -> PO; _ -> true end, State = #state{host = Host, server_host = ServerHost, ignore_pep_from_offline = PepOffline, plugins = Plugins}, init_send_loop(ServerHost, State); Pid -> Pid end, SendLoop ! Presence. %% ------- %% subscription hooks handling functions %% out_subscription(User, Server, JID, subscribed) -> Owner = jlib:make_jid(User, Server, ""), {PUser, PServer, PResource} = jlib:jid_tolower(JID), PResources = case PResource of [] -> user_resources(PUser, PServer); _ -> [PResource] end, presence(Server, {presence, PUser, PServer, PResources, Owner}), true; out_subscription(_,_,_,_) -> true. in_subscription(_, User, Server, Owner, unsubscribed, _) -> unsubscribe_user(jlib:make_jid(User, Server, ""), Owner), true; in_subscription(_, _, _, _, _, _) -> true. unsubscribe_user(Entity, Owner) -> BJID = jlib:jid_tolower(jlib:jid_remove_resource(Owner)), Host = host(element(2, BJID)), spawn(fun() -> lists:foreach(fun(PType) -> {result, Subscriptions} = node_action(Host, PType, get_entity_subscriptions, [Host, Entity]), lists:foreach(fun ({#pubsub_node{options = Options, id = NodeId}, subscribed, _, JID}) -> case get_option(Options, access_model) of presence -> case lists:member(BJID, node_owners(Host, PType, NodeId)) of true -> node_action(Host, PType, unsubscribe_node, [NodeId, Entity, JID, all]); false -> {result, ok} end; _ -> {result, ok} end; (_) -> ok end, Subscriptions) end, plugins(Host)) end). %% ------- %% user remove hook handling function %% remove_user(User, Server) -> LUser = jlib:nodeprep(User), LServer = jlib:nameprep(Server), Entity = jlib:make_jid(LUser, LServer, ""), Host = host(LServer), HomeTreeBase = string_to_node("/home/"++LServer++"/"++LUser), spawn(fun() -> lists:foreach(fun(PType) -> {result, Subscriptions} = node_action(Host, PType, get_entity_subscriptions, [Host, Entity]), lists:foreach(fun ({#pubsub_node{id = NodeId}, _, _, JID}) -> node_action(Host, PType, unsubscribe_node, [NodeId, Entity, JID, all]) end, Subscriptions), {result, Affiliations} = node_action(Host, PType, get_entity_affiliations, [Host, Entity]), lists:foreach(fun ({#pubsub_node{nodeid = {H, N}, parents = []}, owner}) -> delete_node(H, N, Entity); ({#pubsub_node{nodeid = {H, N}, type = "hometree"}, owner}) when N == HomeTreeBase -> delete_node(H, N, Entity); ({#pubsub_node{id = NodeId}, publisher}) -> node_action(Host, PType, set_affiliation, [NodeId, Entity, none]); (_) -> ok end, Affiliations) end, plugins(Host)) end). %%-------------------------------------------------------------------- %% Function: %% handle_call(Request, From, State) -> {reply, Reply, State} | %% {reply, Reply, State, Timeout} | %% {noreply, State} | %% {noreply, State, Timeout} | %% {stop, Reason, Reply, State} | %% {stop, Reason, State} %% Description: Handling call messages %%-------------------------------------------------------------------- %% @private handle_call(server_host, _From, State) -> {reply, State#state.server_host, State}; handle_call(plugins, _From, State) -> {reply, State#state.plugins, State}; handle_call(pep_mapping, _From, State) -> {reply, State#state.pep_mapping, State}; handle_call(nodetree, _From, State) -> {reply, State#state.nodetree, State}; handle_call(stop, _From, State) -> {stop, normal, ok, State}. %%-------------------------------------------------------------------- %% Function: handle_cast(Msg, State) -> {noreply, State} | %% {noreply, State, Timeout} | %% {stop, Reason, State} %% Description: Handling cast messages %%-------------------------------------------------------------------- %% @private handle_cast(_Msg, State) -> {noreply, State}. %%-------------------------------------------------------------------- %% Function: handle_info(Info, State) -> {noreply, State} | %% {noreply, State, Timeout} | %% {stop, Reason, State} %% Description: Handling all non call/cast messages %%-------------------------------------------------------------------- %% @private handle_info({route, From, To, Packet}, #state{server_host = ServerHost, access = Access, plugins = Plugins} = State) -> case catch do_route(ServerHost, Access, Plugins, To#jid.lserver, From, To, Packet) of {'EXIT', Reason} -> ?ERROR_MSG("~p", [Reason]); _ -> ok end, {noreply, State}; handle_info(_Info, State) -> {noreply, State}. %%-------------------------------------------------------------------- %% Function: terminate(Reason, State) -> void() %% Description: This function is called by a gen_server when it is about to %% terminate. It should be the opposite of Module:init/1 and do any necessary %% cleaning up. When it returns, the gen_server terminates with Reason. %% The return value is ignored. %%-------------------------------------------------------------------- %% @private terminate(_Reason, #state{host = Host, server_host = ServerHost, nodetree = TreePlugin, plugins = Plugins}) -> ejabberd_router:unregister_route(Host), case lists:member(?PEPNODE, Plugins) of true -> ejabberd_hooks:delete(caps_update, ServerHost, ?MODULE, caps_update, 80), ejabberd_hooks:delete(disco_sm_identity, ServerHost, ?MODULE, disco_sm_identity, 75), ejabberd_hooks:delete(disco_sm_features, ServerHost, ?MODULE, disco_sm_features, 75), ejabberd_hooks:delete(disco_sm_items, ServerHost, ?MODULE, disco_sm_items, 75), gen_iq_handler:remove_iq_handler(ejabberd_sm, ServerHost, ?NS_PUBSUB), gen_iq_handler:remove_iq_handler(ejabberd_sm, ServerHost, ?NS_PUBSUB_OWNER); false -> ok end, ejabberd_hooks:delete(sm_remove_connection_hook, ServerHost, ?MODULE, on_user_offline, 75), ejabberd_hooks:delete(disco_local_identity, ServerHost, ?MODULE, disco_local_identity, 75), ejabberd_hooks:delete(disco_local_features, ServerHost, ?MODULE, disco_local_features, 75), ejabberd_hooks:delete(disco_local_items, ServerHost, ?MODULE, disco_local_items, 75), ejabberd_hooks:delete(presence_probe_hook, ServerHost, ?MODULE, presence_probe, 80), ejabberd_hooks:delete(roster_in_subscription, ServerHost, ?MODULE, in_subscription, 50), ejabberd_hooks:delete(roster_out_subscription, ServerHost, ?MODULE, out_subscription, 50), ejabberd_hooks:delete(remove_user, ServerHost, ?MODULE, remove_user, 50), ejabberd_hooks:delete(anonymous_purge_hook, ServerHost, ?MODULE, remove_user, 50), mod_disco:unregister_feature(ServerHost, ?NS_PUBSUB), gen_mod:get_module_proc(ServerHost, ?LOOPNAME) ! stop, terminate_plugins(Host, ServerHost, Plugins, TreePlugin). %%-------------------------------------------------------------------- %% Func: code_change(OldVsn, State, Extra) -> {ok, NewState} %% Description: Convert process state when code is changed %%-------------------------------------------------------------------- %% @private code_change(_OldVsn, State, _Extra) -> {ok, State}. %%-------------------------------------------------------------------- %%% Internal functions %%-------------------------------------------------------------------- do_route(ServerHost, Access, Plugins, Host, From, To, Packet) -> {xmlelement, Name, Attrs, _Els} = Packet, case To of #jid{luser = "", lresource = ""} -> case Name of "iq" -> case jlib:iq_query_info(Packet) of #iq{type = get, xmlns = ?NS_DISCO_INFO, sub_el = SubEl, lang = Lang} = IQ -> {xmlelement, _, QAttrs, _} = SubEl, Node = xml:get_attr_s("node", QAttrs), Info = ejabberd_hooks:run_fold( disco_info, ServerHost, [], [ServerHost, ?MODULE, "", ""]), Res = case iq_disco_info(Host, Node, From, Lang) of {result, IQRes} -> jlib:iq_to_xml( IQ#iq{type = result, sub_el = [{xmlelement, "query", QAttrs, IQRes++Info}]}); {error, Error} -> jlib:make_error_reply(Packet, Error) end, ejabberd_router:route(To, From, Res); #iq{type = get, xmlns = ?NS_DISCO_ITEMS, sub_el = SubEl} = IQ -> {xmlelement, _, QAttrs, _} = SubEl, Node = xml:get_attr_s("node", QAttrs), Rsm = jlib:rsm_decode(IQ), Res = case iq_disco_items(Host, Node, From, Rsm) of {result, IQRes} -> jlib:iq_to_xml( IQ#iq{type = result, sub_el = [{xmlelement, "query", QAttrs, IQRes}]}); {error, Error} -> jlib:make_error_reply(Packet, Error) end, ejabberd_router:route(To, From, Res); #iq{type = IQType, xmlns = ?NS_PUBSUB, lang = Lang, sub_el = SubEl} = IQ -> Res = case iq_pubsub(Host, ServerHost, From, IQType, SubEl, Lang, Access, Plugins) of {result, IQRes} -> jlib:iq_to_xml( IQ#iq{type = result, sub_el = IQRes}); {error, Error} -> jlib:make_error_reply(Packet, Error) end, ejabberd_router:route(To, From, Res); #iq{type = IQType, xmlns = ?NS_PUBSUB_OWNER, lang = Lang, sub_el = SubEl} = IQ -> Res = case iq_pubsub_owner(Host, ServerHost, From, IQType, SubEl, Lang) of {result, IQRes} -> jlib:iq_to_xml( IQ#iq{type = result, sub_el = IQRes}); {error, Error} -> jlib:make_error_reply(Packet, Error) end, ejabberd_router:route(To, From, Res); #iq{type = get, xmlns = ?NS_VCARD = XMLNS, lang = Lang, sub_el = _SubEl} = IQ -> Res = IQ#iq{type = result, sub_el = [{xmlelement, "vCard", [{"xmlns", XMLNS}], iq_get_vcard(Lang)}]}, ejabberd_router:route(To, From, jlib:iq_to_xml(Res)); #iq{type = set, xmlns = ?NS_COMMANDS} = IQ -> Res = case iq_command(Host, ServerHost, From, IQ, Access, Plugins) of {error, Error} -> jlib:make_error_reply(Packet, Error); {result, IQRes} -> jlib:iq_to_xml(IQ#iq{type = result, sub_el = IQRes}) end, ejabberd_router:route(To, From, Res); #iq{} -> Err = jlib:make_error_reply( Packet, ?ERR_FEATURE_NOT_IMPLEMENTED), ejabberd_router:route(To, From, Err); _ -> ok end; "message" -> case xml:get_attr_s("type", Attrs) of "error" -> ok; _ -> case find_authorization_response(Packet) of none -> ok; invalid -> ejabberd_router:route(To, From, jlib:make_error_reply(Packet, ?ERR_BAD_REQUEST)); XFields -> handle_authorization_response(Host, From, To, Packet, XFields) end end; _ -> ok end; _ -> case xml:get_attr_s("type", Attrs) of "error" -> ok; "result" -> ok; _ -> Err = jlib:make_error_reply(Packet, ?ERR_ITEM_NOT_FOUND), ejabberd_router:route(To, From, Err) end end. command_disco_info(_Host, <>, _From) -> IdentityEl = {xmlelement, "identity", [{"category", "automation"}, {"type", "command-list"}], []}, {result, [IdentityEl]}; command_disco_info(_Host, <>, _From) -> IdentityEl = {xmlelement, "identity", [{"category", "automation"}, {"type", "command-node"}], []}, FeaturesEl = {xmlelement, "feature", [{"var", ?NS_COMMANDS}], []}, {result, [IdentityEl, FeaturesEl]}. node_disco_info(Host, Node, From) -> node_disco_info(Host, Node, From, true, true). %node_disco_identity(Host, Node, From) -> % node_disco_info(Host, Node, From, true, false). %node_disco_features(Host, Node, From) -> % node_disco_info(Host, Node, From, false, true). node_disco_info(Host, Node, From, Identity, Features) -> Action = fun(#pubsub_node{type = Type, id = NodeId}) -> I = case Identity of false -> []; true -> Types = case tree_call(Host, get_subnodes, [Host, Node, From]) of [] -> ["leaf"]; %% No sub-nodes: it's a leaf node _ -> case node_call(Type, get_items, [NodeId, From, none]) of {result, []} -> ["collection"]; {result, _} -> ["leaf", "collection"]; _ -> [] end end, lists:map(fun(T) -> {xmlelement, "identity", [{"category", "pubsub"}, {"type", T}], []} end, Types) end, F = case Features of false -> []; true -> [{xmlelement, "feature", [{"var", ?NS_PUBSUB}], []} | lists:map(fun ("rsm")-> {xmlelement, "feature", [{"var", ?NS_RSM}], []}; (T) -> {xmlelement, "feature", [{"var", ?NS_PUBSUB++"#"++T}], []} end, features(Type))] end, %% TODO: add meta-data info (spec section 5.4) {result, I ++ F} end, case transaction(Host, Node, Action, sync_dirty) of {result, {_, Result}} -> {result, Result}; Other -> Other end. iq_disco_info(Host, SNode, From, Lang) -> [RealSNode|_] = case SNode of [] -> [[]]; _ -> string:tokens(SNode, "!") end, Node = string_to_node(RealSNode), case Node of <<>> -> {result, [{xmlelement, "identity", [{"category", "pubsub"}, {"type", "service"}, {"name", translate:translate(Lang, "Publish-Subscribe")}], []}, {xmlelement, "feature", [{"var", ?NS_DISCO_INFO}], []}, {xmlelement, "feature", [{"var", ?NS_DISCO_ITEMS}], []}, {xmlelement, "feature", [{"var", ?NS_PUBSUB}], []}, {xmlelement, "feature", [{"var", ?NS_COMMANDS}], []}, {xmlelement, "feature", [{"var", ?NS_VCARD}], []}] ++ lists:map(fun ("rsm")-> {xmlelement, "feature", [{"var", ?NS_RSM}], []}; (T) -> {xmlelement, "feature", [{"var", ?NS_PUBSUB++"#"++T}], []} end, features(Host, Node))}; <> -> command_disco_info(Host, Node, From); <> -> command_disco_info(Host, Node, From); _ -> node_disco_info(Host, Node, From) end. iq_disco_items(Host, [], From, _RSM) -> case tree_action(Host, get_subnodes, [Host, <<>>, From]) of Nodes when is_list(Nodes) -> {result, lists:map( fun(#pubsub_node{nodeid = {_, SubNode}, options = Options}) -> Attrs = case get_option(Options, title) of false -> [{"jid", Host} |nodeAttr(SubNode)]; Title -> [{"jid", Host}, {"name", Title}|nodeAttr(SubNode)] end, {xmlelement, "item", Attrs, []} end, Nodes)}; Other -> Other end; iq_disco_items(Host, ?NS_COMMANDS, _From, _RSM) -> %% TODO: support localization of this string CommandItems = [{xmlelement, "item", [{"jid", Host}, {"node", ?NS_PUBSUB_GET_PENDING}, {"name", "Get Pending"}], []}], {result, CommandItems}; iq_disco_items(_Host, ?NS_PUBSUB_GET_PENDING, _From, _RSM) -> CommandItems = [], {result, CommandItems}; iq_disco_items(Host, Item, From, RSM) -> case string:tokens(Item, "!") of [_SNode, _ItemID] -> {result, []}; [SNode] -> Node = string_to_node(SNode), Action = fun(#pubsub_node{id = Idx, type = Type, options = Options}) -> Owners = node_owners_call(Type, Idx), {NodeItems, RsmOut} = case get_allowed_items_call(Host, Idx, From, Type, Options, Owners, RSM) of {result, R} -> R; _ -> {[], none} end, Nodes = lists:map( fun(#pubsub_node{nodeid = {_, SubNode}, options = SubOptions}) -> Attrs = case get_option(SubOptions, title) of false -> [{"jid", Host} |nodeAttr(SubNode)]; Title -> [{"jid", Host}, {"name", Title}|nodeAttr(SubNode)] end, {xmlelement, "item", Attrs, []} end, tree_call(Host, get_subnodes, [Host, Node, From])), Items = lists:map( fun(#pubsub_item{itemid = {RN, _}}) -> {result, Name} = node_call(Type, get_item_name, [Host, Node, RN]), {xmlelement, "item", [{"jid", Host}, {"name", Name}], []} end, NodeItems), {result, Nodes ++ Items ++ jlib:rsm_encode(RsmOut)} end, case transaction(Host, Node, Action, sync_dirty) of {result, {_, Result}} -> {result, Result}; Other -> Other end end. iq_sm(From, To, #iq{type = Type, sub_el = SubEl, xmlns = XMLNS, lang = Lang} = IQ) -> ServerHost = To#jid.lserver, LOwner = jlib:jid_tolower(jlib:jid_remove_resource(To)), Res = case XMLNS of ?NS_PUBSUB -> iq_pubsub(LOwner, ServerHost, From, Type, SubEl, Lang); ?NS_PUBSUB_OWNER -> iq_pubsub_owner(LOwner, ServerHost, From, Type, SubEl, Lang) end, case Res of {result, IQRes} -> IQ#iq{type = result, sub_el = IQRes}; {error, Error} -> IQ#iq{type = error, sub_el = [Error, SubEl]} end. iq_get_vcard(Lang) -> [{xmlelement, "FN", [], [{xmlcdata, "ejabberd/mod_pubsub"}]}, {xmlelement, "URL", [], [{xmlcdata, ?EJABBERD_URI}]}, {xmlelement, "DESC", [], [{xmlcdata, translate:translate(Lang, "ejabberd Publish-Subscribe module") ++ "\nCopyright (c) 2004-2012 ProcessOne"}]}]. iq_pubsub(Host, ServerHost, From, IQType, SubEl, Lang) -> iq_pubsub(Host, ServerHost, From, IQType, SubEl, Lang, all, plugins(ServerHost)). iq_pubsub(Host, ServerHost, From, IQType, SubEl, Lang, Access, Plugins) -> {xmlelement, _, _, SubEls} = SubEl, case xml:remove_cdata(SubEls) of [{xmlelement, Name, Attrs, Els} | Rest] -> Node = string_to_node(xml:get_attr_s("node", Attrs)), case {IQType, Name} of {set, "create"} -> Config = case Rest of [{xmlelement, "configure", _, C}] -> C; _ -> [] end, %% Get the type of the node Type = case xml:get_attr_s("type", Attrs) of [] -> hd(Plugins); T -> T end, %% we use Plugins list matching because we do not want to allocate %% atoms for non existing type, this prevent atom allocation overflow case lists:member(Type, Plugins) of false -> {error, extended_error( ?ERR_FEATURE_NOT_IMPLEMENTED, unsupported, "create-nodes")}; true -> create_node(Host, ServerHost, Node, From, Type, Access, Config) end; {set, "publish"} -> case xml:remove_cdata(Els) of [{xmlelement, "item", ItemAttrs, Payload}] -> ItemId = xml:get_attr_s("id", ItemAttrs), publish_item(Host, ServerHost, Node, From, ItemId, Payload); [] -> %% Publisher attempts to publish to persistent node with no item {error, extended_error(?ERR_BAD_REQUEST, "item-required")}; _ -> %% Entity attempts to publish item with multiple payload elements or namespace does not match {error, extended_error(?ERR_BAD_REQUEST, "invalid-payload")} end; {set, "retract"} -> ForceNotify = case xml:get_attr_s("notify", Attrs) of "1" -> true; "true" -> true; _ -> false end, case xml:remove_cdata(Els) of [{xmlelement, "item", ItemAttrs, _}] -> ItemId = xml:get_attr_s("id", ItemAttrs), delete_item(Host, Node, From, ItemId, ForceNotify); _ -> %% Request does not specify an item {error, extended_error(?ERR_BAD_REQUEST, "item-required")} end; {set, "subscribe"} -> Config = case Rest of [{xmlelement, "options", _, C}] -> C; _ -> [] end, JID = xml:get_attr_s("jid", Attrs), subscribe_node(Host, Node, From, JID, Config); {set, "unsubscribe"} -> JID = xml:get_attr_s("jid", Attrs), SubId = xml:get_attr_s("subid", Attrs), unsubscribe_node(Host, Node, From, JID, SubId); {get, "items"} -> MaxItems = xml:get_attr_s("max_items", Attrs), SubId = xml:get_attr_s("subid", Attrs), ItemIDs = lists:foldl(fun ({xmlelement, "item", ItemAttrs, _}, Acc) -> case xml:get_attr_s("id", ItemAttrs) of "" -> Acc; ItemID -> [ItemID|Acc] end; (_, Acc) -> Acc end, [], xml:remove_cdata(Els)), RSM = jlib:rsm_decode(SubEl), get_items(Host, Node, From, SubId, MaxItems, ItemIDs, RSM); {get, "subscriptions"} -> get_subscriptions(Host, Node, From, Plugins); {get, "affiliations"} -> get_affiliations(Host, Node, From, Plugins); {get, "options"} -> SubID = xml:get_attr_s("subid", Attrs), JID = xml:get_attr_s("jid", Attrs), get_options(Host, Node, JID, SubID, Lang); {set, "options"} -> SubID = xml:get_attr_s("subid", Attrs), JID = xml:get_attr_s("jid", Attrs), set_options(Host, Node, JID, SubID, Els); _ -> {error, ?ERR_FEATURE_NOT_IMPLEMENTED} end; Other -> ?INFO_MSG("Too many actions: ~p", [Other]), {error, ?ERR_BAD_REQUEST} end. iq_pubsub_owner(Host, ServerHost, From, IQType, SubEl, Lang) -> {xmlelement, _, _, SubEls} = SubEl, Action = lists:filter(fun({xmlelement, "set", _, _}) -> false; (_) -> true end, xml:remove_cdata(SubEls)), case Action of [{xmlelement, Name, Attrs, Els}] -> Node = string_to_node(xml:get_attr_s("node", Attrs)), case {IQType, Name} of {get, "configure"} -> get_configure(Host, ServerHost, Node, From, Lang); {set, "configure"} -> set_configure(Host, Node, From, Els, Lang); {get, "default"} -> get_default(Host, Node, From, Lang); {set, "delete"} -> delete_node(Host, Node, From); {set, "purge"} -> purge_node(Host, Node, From); {get, "subscriptions"} -> get_subscriptions(Host, Node, From); {set, "subscriptions"} -> set_subscriptions(Host, Node, From, xml:remove_cdata(Els)); {get, "affiliations"} -> get_affiliations(Host, Node, From); {set, "affiliations"} -> set_affiliations(Host, Node, From, xml:remove_cdata(Els)); _ -> {error, ?ERR_FEATURE_NOT_IMPLEMENTED} end; _ -> ?INFO_MSG("Too many actions: ~p", [Action]), {error, ?ERR_BAD_REQUEST} end. iq_command(Host, ServerHost, From, IQ, Access, Plugins) -> case adhoc:parse_request(IQ) of Req when is_record(Req, adhoc_request) -> case adhoc_request(Host, ServerHost, From, Req, Access, Plugins) of Resp when is_record(Resp, adhoc_response) -> {result, [adhoc:produce_response(Req, Resp)]}; Error -> Error end; Err -> Err end. %% @docProcesses an Ad Hoc Command.
adhoc_request(Host, _ServerHost, Owner, #adhoc_request{node = ?NS_PUBSUB_GET_PENDING, lang = Lang, action = "execute", xdata = false}, _Access, Plugins) -> send_pending_node_form(Host, Owner, Lang, Plugins); adhoc_request(Host, _ServerHost, Owner, #adhoc_request{node = ?NS_PUBSUB_GET_PENDING, action = "execute", xdata = XData}, _Access, _Plugins) -> ParseOptions = case XData of {xmlelement, "x", _Attrs, _SubEls} = XEl -> case jlib:parse_xdata_submit(XEl) of invalid -> {error, ?ERR_BAD_REQUEST}; XData2 -> case set_xoption(Host, XData2, []) of NewOpts when is_list(NewOpts) -> {result, NewOpts}; Err -> Err end end; _ -> ?INFO_MSG("Bad XForm: ~p", [XData]), {error, ?ERR_BAD_REQUEST} end, case ParseOptions of {result, XForm} -> case lists:keysearch(node, 1, XForm) of {value, {_, Node}} -> send_pending_auth_events(Host, Node, Owner); false -> {error, extended_error(?ERR_BAD_REQUEST, "bad-payload")} end; Error -> Error end; adhoc_request(_Host, _ServerHost, _Owner, #adhoc_request{action = "cancel"}, _Access, _Plugins) -> #adhoc_response{status = canceled}; adhoc_request(Host, ServerHost, Owner, #adhoc_request{action = []} = R, Access, Plugins) -> adhoc_request(Host, ServerHost, Owner, R#adhoc_request{action = "execute"}, Access, Plugins); adhoc_request(_Host, _ServerHost, _Owner, Other, _Access, _Plugins) -> ?DEBUG("Couldn't process ad hoc command:~n~p", [Other]), {error, ?ERR_ITEM_NOT_FOUND}. %% @spec (Host, Owner, Lang, Plugins) -> iqRes() %% @docSends the process pending subscriptions XForm for Host to %% Owner.
send_pending_node_form(Host, Owner, _Lang, Plugins) -> Filter = fun (Plugin) -> lists:member("get-pending", features(Plugin)) end, case lists:filter(Filter, Plugins) of [] -> {error, ?ERR_FEATURE_NOT_IMPLEMENTED}; Ps -> XOpts = lists:map(fun (Node) -> {xmlelement, "option", [], [{xmlelement, "value", [], [{xmlcdata, node_to_string(Node)}]}]} end, get_pending_nodes(Host, Owner, Ps)), XForm = {xmlelement, "x", [{"xmlns", ?NS_XDATA}, {"type", "form"}], [{xmlelement, "field", [{"type", "list-single"}, {"var", "pubsub#node"}], lists:usort(XOpts)}]}, #adhoc_response{status = executing, defaultaction = "execute", elements = [XForm]} end. get_pending_nodes(Host, Owner, Plugins) -> Tr = fun (Type) -> case node_call(Type, get_pending_nodes, [Host, Owner]) of {result, Nodes} -> Nodes; _ -> [] end end, case transaction(Host, fun () -> {result, lists:flatmap(Tr, Plugins)} end, sync_dirty) of {result, Res} -> Res; Err -> Err end. %% @spec (Host, Node, Owner) -> iqRes() %% @docSend a subscription approval form to Owner for all pending %% subscriptions on Host and Node.
send_pending_auth_events(Host, Node, Owner) -> ?DEBUG("Sending pending auth events for ~s on ~s:~s", [jlib:jid_to_string(Owner), Host, node_to_string(Node)]), Action = fun (#pubsub_node{id = NodeID, type = Type}) -> case lists:member("get-pending", features(Type)) of true -> case node_call(Type, get_affiliation, [NodeID, Owner]) of {result, owner} -> node_call(Type, get_node_subscriptions, [NodeID]); _ -> {error, ?ERR_FORBIDDEN} end; false -> {error, ?ERR_FEATURE_NOT_IMPLEMENTED} end end, case transaction(Host, Node, Action, sync_dirty) of {result, {N, Subscriptions}} -> lists:foreach(fun({J, pending, _SubID}) -> send_authorization_request(N, jlib:make_jid(J)); ({J, pending}) -> send_authorization_request(N, jlib:make_jid(J)); (_) -> ok end, Subscriptions), #adhoc_response{}; Err -> Err end. %%% authorization handling send_authorization_request(#pubsub_node{nodeid = {Host, Node}, type = Type, id = NodeId}, Subscriber) -> Lang = "en", %% TODO fix Stanza = {xmlelement, "message", [], [{xmlelement, "x", [{"xmlns", ?NS_XDATA}, {"type", "form"}], [{xmlelement, "title", [], [{xmlcdata, translate:translate(Lang, "PubSub subscriber request")}]}, {xmlelement, "instructions", [], [{xmlcdata, translate:translate(Lang, "Choose whether to approve this entity's subscription.")}]}, {xmlelement, "field", [{"var", "FORM_TYPE"}, {"type", "hidden"}], [{xmlelement, "value", [], [{xmlcdata, ?NS_PUBSUB_SUB_AUTH}]}]}, {xmlelement, "field", [{"var", "pubsub#node"}, {"type", "text-single"}, {"label", translate:translate(Lang, "Node ID")}], [{xmlelement, "value", [], [{xmlcdata, node_to_string(Node)}]}]}, {xmlelement, "field", [{"var", "pubsub#subscriber_jid"}, {"type", "jid-single"}, {"label", translate:translate(Lang, "Subscriber Address")}], [{xmlelement, "value", [], [{xmlcdata, jlib:jid_to_string(Subscriber)}]}]}, {xmlelement, "field", [{"var", "pubsub#allow"}, {"type", "boolean"}, {"label", translate:translate(Lang, "Allow this Jabber ID to subscribe to this pubsub node?")}], [{xmlelement, "value", [], [{xmlcdata, "false"}]}]}]}]}, lists:foreach(fun(Owner) -> ejabberd_router:route(service_jid(Host), jlib:make_jid(Owner), Stanza) end, node_owners(Host, Type, NodeId)). find_authorization_response(Packet) -> {xmlelement, _Name, _Attrs, Els} = Packet, XData1 = lists:map(fun({xmlelement, "x", XAttrs, _} = XEl) -> case xml:get_attr_s("xmlns", XAttrs) of ?NS_XDATA -> case xml:get_attr_s("type", XAttrs) of "cancel" -> none; _ -> jlib:parse_xdata_submit(XEl) end; _ -> none end; (_) -> none end, xml:remove_cdata(Els)), XData = lists:filter(fun(E) -> E /= none end, XData1), case XData of [invalid] -> invalid; [] -> none; [XFields] when is_list(XFields) -> ?DEBUG("XFields: ~p", [XFields]), case lists:keysearch("FORM_TYPE", 1, XFields) of {value, {_, [?NS_PUBSUB_SUB_AUTH]}} -> XFields; _ -> invalid end end. %% @spec (Host, JID, Node, Subscription) -> void %% Host = mod_pubsub:host() %% JID = jlib:jid() %% SNode = string() %% Subscription = atom() | {atom(), mod_pubsub:subid()} %% @doc Send a message to JID with the supplied Subscription send_authorization_approval(Host, JID, SNode, Subscription) -> SubAttrs = case Subscription of {S, SID} -> [{"subscription", subscription_to_string(S)}, {"subid", SID}]; S -> [{"subscription", subscription_to_string(S)}] end, Stanza = event_stanza( [{xmlelement, "subscription", [{"jid", jlib:jid_to_string(JID)}|nodeAttr(SNode)] ++ SubAttrs, []}]), ejabberd_router:route(service_jid(Host), JID, Stanza). handle_authorization_response(Host, From, To, Packet, XFields) -> case {lists:keysearch("pubsub#node", 1, XFields), lists:keysearch("pubsub#subscriber_jid", 1, XFields), lists:keysearch("pubsub#allow", 1, XFields)} of {{value, {_, [SNode]}}, {value, {_, [SSubscriber]}}, {value, {_, [SAllow]}}} -> Node = string_to_node(SNode), Subscriber = jlib:string_to_jid(SSubscriber), Allow = case SAllow of "1" -> true; "true" -> true; _ -> false end, Action = fun(#pubsub_node{type = Type, id = NodeId}) -> IsApprover = lists:member(jlib:jid_tolower(jlib:jid_remove_resource(From)), node_owners_call(Type, NodeId)), {result, Subscriptions} = node_call(Type, get_subscriptions, [NodeId, Subscriber]), if not IsApprover -> {error, ?ERR_FORBIDDEN}; true -> update_auth(Host, SNode, Type, NodeId, Subscriber, Allow, Subscriptions) end end, case transaction(Host, Node, Action, sync_dirty) of {error, Error} -> ejabberd_router:route( To, From, jlib:make_error_reply(Packet, Error)); {result, {_, _NewSubscription}} -> %% XXX: notify about subscription state change, section 12.11 ok; _ -> ejabberd_router:route( To, From, jlib:make_error_reply(Packet, ?ERR_INTERNAL_SERVER_ERROR)) end; _ -> ejabberd_router:route( To, From, jlib:make_error_reply(Packet, ?ERR_NOT_ACCEPTABLE)) end. update_auth(Host, Node, Type, NodeId, Subscriber, Allow, Subscriptions) -> Subscription = lists:filter(fun({pending, _}) -> true; (_) -> false end, Subscriptions), case Subscription of [{pending, SubID}] -> %% TODO does not work if several pending NewSubscription = case Allow of true -> subscribed; false -> none end, node_call(Type, set_subscriptions, [NodeId, Subscriber, NewSubscription, SubID]), send_authorization_approval(Host, Subscriber, Node, NewSubscription), {result, ok}; _ -> {error, ?ERR_UNEXPECTED_REQUEST} end. -define(XFIELD(Type, Label, Var, Val), {xmlelement, "field", [{"type", Type}, {"label", translate:translate(Lang, Label)}, {"var", Var}], [{xmlelement, "value", [], [{xmlcdata, Val}]}]}). -define(BOOLXFIELD(Label, Var, Val), ?XFIELD("boolean", Label, Var, case Val of true -> "1"; _ -> "0" end)). -define(STRINGXFIELD(Label, Var, Val), ?XFIELD("text-single", Label, Var, Val)). -define(STRINGMXFIELD(Label, Var, Vals), {xmlelement, "field", [{"type", "text-multi"}, {"label", translate:translate(Lang, Label)}, {"var", Var}], [{xmlelement, "value", [], [{xmlcdata, V}]} || V <- Vals]}). -define(XFIELDOPT(Type, Label, Var, Val, Opts), {xmlelement, "field", [{"type", Type}, {"label", translate:translate(Lang, Label)}, {"var", Var}], lists:map(fun(Opt) -> {xmlelement, "option", [], [{xmlelement, "value", [], [{xmlcdata, Opt}]}]} end, Opts) ++ [{xmlelement, "value", [], [{xmlcdata, Val}]}]}). -define(LISTXFIELD(Label, Var, Val, Opts), ?XFIELDOPT("list-single", Label, Var, Val, Opts)). -define(LISTMXFIELD(Label, Var, Vals, Opts), {xmlelement, "field", [{"type", "list-multi"}, {"label", translate:translate(Lang, Label)}, {"var", Var}], lists:map(fun(Opt) -> {xmlelement, "option", [], [{xmlelement, "value", [], [{xmlcdata, Opt}]}]} end, Opts) ++ lists:map(fun(Val) -> {xmlelement, "value", [], [{xmlcdata, Val}]} end, Vals)}). %% @spec (Host::host(), ServerHost::host(), Node::pubsubNode(), Owner::jid(), NodeType::nodeType()) -> %% {error, Reason::stanzaError()} | %% {result, []} %% @docCreate new pubsub nodes
%%In addition to method-specific error conditions, there are several general reasons why the node creation request might fail:
%%ote: node creation is a particular case, error return code is evaluated at many places:
%%Delete specified node and all childs.
%%There are several reasons why the node deletion request might fail:
%%Accepts or rejects subcription requests on a PubSub node.
%%There are several reasons why the subscription request might fail:
%%Unsubscribe JID from the Node.
%%There are several reasons why the unsubscribe request might fail:
%%Publish item to a PubSub node.
%%The permission to publish an item must be verified by the plugin implementation.
%%There are several reasons why the publish request might fail:
%%Delete item from a PubSub node.
%%The permission to delete an item must be verified by the plugin implementation.
%%There are several reasons why the item retraction request might fail:
%%Delete all items of specified node owned by JID.
%%There are several reasons why the node purge request might fail:
%%Return the items of a given node.
%%The number of items to return is limited by MaxItems.
%%The permission are not checked in this function.
%% @todo We probably need to check that the user doing the query has the right %% to read the items. get_items(Host, Node, From, SubId, SMaxItems, ItemIDs, RSM) -> MaxItems = if SMaxItems == "" -> get_max_items_node(Host); true -> case catch list_to_integer(SMaxItems) of {'EXIT', _} -> {error, ?ERR_BAD_REQUEST}; Val -> Val end end, case MaxItems of {error, Error} -> {error, Error}; _ -> Action = fun(#pubsub_node{options = Options, type = Type, id = NodeId}) -> Features = features(Type), RetreiveFeature = lists:member("retrieve-items", Features), PersistentFeature = lists:member("persistent-items", Features), AccessModel = get_option(Options, access_model), AllowedGroups = get_option(Options, roster_groups_allowed, []), Owners = node_owners_call(Type, NodeId), {PresenceSubscription, RosterGroup} = get_presence_and_roster_permissions(Host, From, Owners, AccessModel, AllowedGroups), if not RetreiveFeature -> %% Item Retrieval Not Supported {error, extended_error(?ERR_FEATURE_NOT_IMPLEMENTED, unsupported, "retrieve-items")}; not PersistentFeature -> %% Persistent Items Not Supported {error, extended_error(?ERR_FEATURE_NOT_IMPLEMENTED, unsupported, "persistent-items")}; true -> node_call(Type, get_items, [NodeId, From, AccessModel, PresenceSubscription, RosterGroup, SubId, RSM]) end end, case transaction(Host, Node, Action, sync_dirty) of {result, {_, {Items, RSMOut}}} -> SendItems = case ItemIDs of [] -> Items; _ -> lists:filter(fun(#pubsub_item{itemid = {ItemId, _}}) -> lists:member(ItemId, ItemIDs) end, Items) end, %% Generate the XML response (Item list), limiting the %% number of items sent to MaxItems: {result, [{xmlelement, "pubsub", [{"xmlns", ?NS_PUBSUB}], [{xmlelement, "items", nodeAttr(Node), itemsEls(lists:sublist(SendItems, MaxItems))} | jlib:rsm_encode(RSMOut)]}]}; Error -> Error end end. get_items(Host, Node) -> Action = fun(#pubsub_node{type = Type, id = NodeId}) -> node_call(Type, get_items, [NodeId, service_jid(Host)]) end, case transaction(Host, Node, Action, sync_dirty) of {result, {_, Items}} -> Items; Error -> Error end. get_item(Host, Node, ItemId) -> Action = fun(#pubsub_node{type = Type, id = NodeId}) -> node_call(Type, get_item, [NodeId, ItemId]) end, case transaction(Host, Node, Action, sync_dirty) of {result, {_, Items}} -> Items; Error -> Error end. get_allowed_items_call(Host, NodeIdx, From, Type, Options, Owners) -> case get_allowed_items_call(Host, NodeIdx, From, Type, Options, Owners, none) of {result, {I, _}} -> {result, I}; Error -> Error end. get_allowed_items_call(Host, NodeIdx, From, Type, Options, Owners, RSM) -> AccessModel = get_option(Options, access_model), AllowedGroups = get_option(Options, roster_groups_allowed, []), {PresenceSubscription, RosterGroup} = get_presence_and_roster_permissions(Host, From, Owners, AccessModel, AllowedGroups), node_call(Type, get_items, [NodeIdx, From, AccessModel, PresenceSubscription, RosterGroup, undefined, RSM]). %% @spec (Host, Node, NodeId, Type, LJID, Number) -> any() %% Host = pubsubHost() %% Node = pubsubNode() %% NodeId = pubsubNodeId() %% Type = pubsubNodeType() %% LJID = {U, S, []} %% Number = last | integer() %% @docResend the items of a node to the user.
%% @todo use cache-last-item feature send_items(Host, Node, NodeId, Type, LJID, last) -> Stanza = case get_cached_item(Host, NodeId) of undefined -> % special ODBC optimization, works only with node_hometree_odbc, node_flat_odbc and node_pep_odbc case node_action(Host, Type, get_last_items, [NodeId, LJID, 1]) of {result, [LastItem]} -> {ModifNow, ModifUSR} = LastItem#pubsub_item.modification, event_stanza_with_delay( [{xmlelement, "items", nodeAttr(Node), itemsEls([LastItem])}], ModifNow, ModifUSR); _ -> event_stanza( [{xmlelement, "items", nodeAttr(Node), itemsEls([])}]) end; LastItem -> {ModifNow, ModifUSR} = LastItem#pubsub_item.modification, event_stanza_with_delay( [{xmlelement, "items", nodeAttr(Node), itemsEls([LastItem])}], ModifNow, ModifUSR) end, ejabberd_router:route(service_jid(Host), jlib:make_jid(LJID), Stanza); send_items(Host, Node, NodeId, Type, LJID, Number) -> ToSend = case node_action(Host, Type, get_items, [NodeId, LJID]) of {result, []} -> []; {result, Items} -> case Number of N when N > 0 -> lists:sublist(Items, N); _ -> Items end; _ -> [] end, Stanza = case ToSend of [LastItem] -> {ModifNow, ModifUSR} = LastItem#pubsub_item.modification, event_stanza_with_delay( [{xmlelement, "items", nodeAttr(Node), itemsEls(ToSend)}], ModifNow, ModifUSR); _ -> event_stanza( [{xmlelement, "items", nodeAttr(Node), itemsEls(ToSend)}]) end, ejabberd_router:route(service_jid(Host), jlib:make_jid(LJID), Stanza). %% @spec (Host, JID, Plugins) -> {error, Reason} | {result, Response} %% Host = host() %% JID = jid() %% Plugins = [Plugin::string()] %% Reason = stanzaError() %% Response = [pubsubIQResponse()] %% @docReturn the list of affiliations as an XMPP response.
get_affiliations(Host, <<>>, JID, Plugins) when is_list(Plugins) -> Result = lists:foldl( fun(Type, {Status, Acc}) -> Features = features(Type), RetrieveFeature = lists:member("retrieve-affiliations", Features), if not RetrieveFeature -> %% Service does not support retreive affiliatons {{error, extended_error(?ERR_FEATURE_NOT_IMPLEMENTED, unsupported, "retrieve-affiliations")}, Acc}; true -> {result, Affiliations} = node_action(Host, Type, get_entity_affiliations, [Host, JID]), {Status, [Affiliations|Acc]} end end, {ok, []}, Plugins), case Result of {ok, Affiliations} -> Entities = lists:flatmap( fun({_, none}) -> []; ({#pubsub_node{nodeid = {_, Node}}, Affiliation}) -> [{xmlelement, "affiliation", [{"affiliation", affiliation_to_string(Affiliation)}|nodeAttr(Node)], []}] end, lists:usort(lists:flatten(Affiliations))), {result, [{xmlelement, "pubsub", [{"xmlns", ?NS_PUBSUB}], [{xmlelement, "affiliations", [], Entities}]}]}; {Error, _} -> Error end; get_affiliations(Host, NodeId, JID, Plugins) when is_list(Plugins) -> Result = lists:foldl( fun(Type, {Status, Acc}) -> Features = features(Type), RetrieveFeature = lists:member("retrieve-affiliations", Features), if not RetrieveFeature -> %% Service does not support retreive affiliatons {{error, extended_error(?ERR_FEATURE_NOT_IMPLEMENTED, unsupported, "retrieve-affiliations")}, Acc}; true -> {result, Affiliations} = node_action(Host, Type, get_entity_affiliations, [Host, JID]), {Status, [Affiliations|Acc]} end end, {ok, []}, Plugins), case Result of {ok, Affiliations} -> Entities = lists:flatmap( fun({_, none}) -> []; ({#pubsub_node{nodeid = {_, Node}}, Affiliation}) when NodeId == Node -> [{xmlelement, "affiliation", [{"affiliation", affiliation_to_string(Affiliation)}|nodeAttr(Node)], []}]; (_) -> [] end, lists:usort(lists:flatten(Affiliations))), {result, [{xmlelement, "pubsub", [{"xmlns", ?NS_PUBSUB}], [{xmlelement, "affiliations", [], Entities}]}]}; {Error, _} -> Error end. get_affiliations(Host, Node, JID) -> Action = fun(#pubsub_node{type = Type, id = NodeId}) -> Features = features(Type), RetrieveFeature = lists:member("modify-affiliations", Features), {result, Affiliation} = node_call(Type, get_affiliation, [NodeId, JID]), if not RetrieveFeature -> %% Service does not support modify affiliations {error, extended_error(?ERR_FEATURE_NOT_IMPLEMENTED, unsupported, "modify-affiliations")}; Affiliation /= owner -> %% Entity is not an owner {error, ?ERR_FORBIDDEN}; true -> node_call(Type, get_node_affiliations, [NodeId]) end end, case transaction(Host, Node, Action, sync_dirty) of {result, {_, []}} -> {error, ?ERR_ITEM_NOT_FOUND}; {result, {_, Affiliations}} -> Entities = lists:flatmap( fun({_, none}) -> []; ({AJID, Affiliation}) -> [{xmlelement, "affiliation", [{"jid", jlib:jid_to_string(AJID)}, {"affiliation", affiliation_to_string(Affiliation)}], []}] end, Affiliations), {result, [{xmlelement, "pubsub", [{"xmlns", ?NS_PUBSUB_OWNER}], [{xmlelement, "affiliations", nodeAttr(Node), Entities}]}]}; Error -> Error end. set_affiliations(Host, Node, From, EntitiesEls) -> Owner = jlib:jid_tolower(jlib:jid_remove_resource(From)), Entities = lists:foldl( fun(El, Acc) -> case Acc of error -> error; _ -> case El of {xmlelement, "affiliation", Attrs, _} -> JID = jlib:string_to_jid( xml:get_attr_s("jid", Attrs)), Affiliation = string_to_affiliation( xml:get_attr_s("affiliation", Attrs)), if (JID == error) or (Affiliation == false) -> error; true -> [{jlib:jid_tolower(JID), Affiliation} | Acc] end end end end, [], EntitiesEls), case Entities of error -> {error, ?ERR_BAD_REQUEST}; _ -> Action = fun(#pubsub_node{type = Type, id = NodeId}) -> Owners = node_owners_call(Type, NodeId), case lists:member(Owner, Owners) of true -> OwnerJID = jlib:make_jid(Owner), FilteredEntities = case Owners of [Owner] -> [E || E <- Entities, element(1, E) =/= OwnerJID]; _ -> Entities end, lists:foreach( fun({JID, Affiliation}) -> node_call(Type, set_affiliation, [NodeId, JID, Affiliation]) end, FilteredEntities), {result, []}; _ -> {error, ?ERR_FORBIDDEN} end end, case transaction(Host, Node, Action, sync_dirty) of {result, {_, Result}} -> {result, Result}; Other -> Other end end. get_options(Host, Node, JID, SubID, Lang) -> Action = fun(#pubsub_node{type = Type, id = NodeID}) -> case lists:member("subscription-options", features(Type)) of true -> get_options_helper(JID, Lang, Node, NodeID, SubID, Type); false -> {error, extended_error( ?ERR_FEATURE_NOT_IMPLEMENTED, unsupported, "subscription-options")} end end, case transaction(Host, Node, Action, sync_dirty) of {result, {_Node, XForm}} -> {result, [XForm]}; Error -> Error end. get_options_helper(JID, Lang, Node, NodeID, SubID, Type) -> Subscriber = case jlib:string_to_jid(JID) of error -> {"", "", ""}; J -> jlib:jid_tolower(J) end, {result, Subs} = node_call(Type, get_subscriptions, [NodeID, Subscriber]), SubIDs = lists:foldl(fun({subscribed, SID}, Acc) -> [SID | Acc]; (_, Acc) -> Acc end, [], Subs), case {SubID, SubIDs} of {_, []} -> {error, extended_error(?ERR_NOT_ACCEPTABLE, "not-subscribed")}; {[], [SID]} -> read_sub(Subscriber, Node, NodeID, SID, Lang); {[], _} -> {error, extended_error(?ERR_NOT_ACCEPTABLE, "subid-required")}; {_, _} -> read_sub(Subscriber, Node, NodeID, SubID, Lang) end. read_sub(Subscriber, Node, NodeID, SubID, Lang) -> case pubsub_subscription_odbc:get_subscription(Subscriber, NodeID, SubID) of {error, notfound} -> {error, extended_error(?ERR_NOT_ACCEPTABLE, "invalid-subid")}; {result, #pubsub_subscription{options = Options}} -> {result, XdataEl} = pubsub_subscription_odbc:get_options_xform(Lang, Options), OptionsEl = {xmlelement, "options", [{"jid", jlib:jid_to_string(Subscriber)}, {"subid", SubID}|nodeAttr(Node)], [XdataEl]}, PubsubEl = {xmlelement, "pubsub", [{"xmlns", ?NS_PUBSUB}], [OptionsEl]}, {result, PubsubEl} end. set_options(Host, Node, JID, SubID, Configuration) -> Action = fun(#pubsub_node{type = Type, id = NodeID}) -> case lists:member("subscription-options", features(Type)) of true -> set_options_helper(Configuration, JID, NodeID, SubID, Type); false -> {error, extended_error( ?ERR_FEATURE_NOT_IMPLEMENTED, unsupported, "subscription-options")} end end, case transaction(Host, Node, Action, sync_dirty) of {result, {_Node, Result}} -> {result, Result}; Error -> Error end. set_options_helper(Configuration, JID, NodeID, SubID, Type) -> SubOpts = case pubsub_subscription_odbc:parse_options_xform(Configuration) of {result, GoodSubOpts} -> GoodSubOpts; _ -> invalid end, Subscriber = case jlib:string_to_jid(JID) of error -> {"", "", ""}; J -> jlib:jid_tolower(J) end, {result, Subs} = node_call(Type, get_subscriptions, [NodeID, Subscriber]), SubIDs = lists:foldl(fun({subscribed, SID}, Acc) -> [SID | Acc]; (_, Acc) -> Acc end, [], Subs), case {SubID, SubIDs} of {_, []} -> {error, extended_error(?ERR_NOT_ACCEPTABLE, "not-subscribed")}; {[], [SID]} -> write_sub(Subscriber, NodeID, SID, SubOpts); {[], _} -> {error, extended_error(?ERR_NOT_ACCEPTABLE, "subid-required")}; {_, _} -> write_sub(Subscriber, NodeID, SubID, SubOpts) end. write_sub(_Subscriber, _NodeID, _SubID, invalid) -> {error, extended_error(?ERR_BAD_REQUEST, "invalid-options")}; write_sub(Subscriber, NodeID, SubID, Options) -> case pubsub_subscription_odbc:set_subscription(Subscriber, NodeID, SubID, Options) of {error, notfound} -> {error, extended_error(?ERR_NOT_ACCEPTABLE, "invalid-subid")}; {result, _} -> {result, []} end. %% @spec (Host, Node, JID, Plugins) -> {error, Reason} | {result, Response} %% Host = host() %% Node = pubsubNode() %% JID = jid() %% Plugins = [Plugin::string()] %% Reason = stanzaError() %% Response = [pubsubIQResponse()] %% @docReturn the list of subscriptions as an XMPP response.
get_subscriptions(Host, Node, JID, Plugins) when is_list(Plugins) -> Result = lists:foldl( fun(Type, {Status, Acc}) -> Features = features(Type), RetrieveFeature = lists:member("retrieve-subscriptions", Features), if not RetrieveFeature -> %% Service does not support retreive subscriptions {{error, extended_error(?ERR_FEATURE_NOT_IMPLEMENTED, unsupported, "retrieve-subscriptions")}, Acc}; true -> Subscriber = jlib:jid_remove_resource(JID), {result, Subscriptions} = node_action(Host, Type, get_entity_subscriptions, [Host, Subscriber]), {Status, [Subscriptions|Acc]} end end, {ok, []}, Plugins), case Result of {ok, Subscriptions} -> Entities = lists:flatmap( fun({_, none}) -> []; ({#pubsub_node{nodeid = {_, SubsNode}}, Subscription}) -> case Node of <<>> -> [{xmlelement, "subscription", [{"subscription", subscription_to_string(Subscription)}|nodeAttr(SubsNode)], []}]; SubsNode -> [{xmlelement, "subscription", [{"subscription", subscription_to_string(Subscription)}], []}]; _ -> [] end; ({_, none, _}) -> []; ({#pubsub_node{nodeid = {_, SubsNode}}, Subscription, SubID, SubJID}) -> case Node of <<>> -> [{xmlelement, "subscription", [{"jid", jlib:jid_to_string(SubJID)}, {"subid", SubID}, {"subscription", subscription_to_string(Subscription)}|nodeAttr(SubsNode)], []}]; SubsNode -> [{xmlelement, "subscription", [{"jid", jlib:jid_to_string(SubJID)}, {"subid", SubID}, {"subscription", subscription_to_string(Subscription)}], []}]; _ -> [] end; ({#pubsub_node{nodeid = {_, SubsNode}}, Subscription, SubJID}) -> case Node of <<>> -> [{xmlelement, "subscription", [{"jid", jlib:jid_to_string(SubJID)}, {"subscription", subscription_to_string(Subscription)}|nodeAttr(SubsNode)], []}]; SubsNode -> [{xmlelement, "subscription", [{"jid", jlib:jid_to_string(SubJID)}, {"subscription", subscription_to_string(Subscription)}], []}]; _ -> [] end end, lists:usort(lists:flatten(Subscriptions))), {result, [{xmlelement, "pubsub", [{"xmlns", ?NS_PUBSUB}], [{xmlelement, "subscriptions", [], Entities}]}]}; {Error, _} -> Error end. get_subscriptions(Host, Node, JID) -> Action = fun(#pubsub_node{type = Type, id = NodeId}) -> Features = features(Type), RetrieveFeature = lists:member("manage-subscriptions", Features), {result, Affiliation} = node_call(Type, get_affiliation, [NodeId, JID]), if not RetrieveFeature -> %% Service does not support manage subscriptions {error, extended_error(?ERR_FEATURE_NOT_IMPLEMENTED, unsupported, "manage-subscriptions")}; Affiliation /= owner -> %% Entity is not an owner {error, ?ERR_FORBIDDEN}; true -> node_call(Type, get_node_subscriptions, [NodeId]) end end, case transaction(Host, Node, Action, sync_dirty) of {result, {_, Subscriptions}} -> Entities = lists:flatmap( fun({_, none}) -> []; ({_, pending, _}) -> []; ({AJID, Subscription}) -> [{xmlelement, "subscription", [{"jid", jlib:jid_to_string(AJID)}, {"subscription", subscription_to_string(Subscription)}], []}]; ({AJID, Subscription, SubId}) -> [{xmlelement, "subscription", [{"jid", jlib:jid_to_string(AJID)}, {"subscription", subscription_to_string(Subscription)}, {"subid", SubId}], []}] end, Subscriptions), {result, [{xmlelement, "pubsub", [{"xmlns", ?NS_PUBSUB_OWNER}], [{xmlelement, "subscriptions", nodeAttr(Node), Entities}]}]}; Error -> Error end. set_subscriptions(Host, Node, From, EntitiesEls) -> Owner = jlib:jid_tolower(jlib:jid_remove_resource(From)), Entities = lists:foldl( fun(El, Acc) -> case Acc of error -> error; _ -> case El of {xmlelement, "subscription", Attrs, _} -> JID = jlib:string_to_jid( xml:get_attr_s("jid", Attrs)), Subscription = string_to_subscription( xml:get_attr_s("subscription", Attrs)), SubId = xml:get_attr_s("subid", Attrs), if (JID == error) or (Subscription == false) -> error; true -> [{jlib:jid_tolower(JID), Subscription, SubId} | Acc] end end end end, [], EntitiesEls), case Entities of error -> {error, ?ERR_BAD_REQUEST}; _ -> Notify = fun(JID, Sub, _SubId) -> Stanza = {xmlelement, "message", [], [{xmlelement, "pubsub", [{"xmlns", ?NS_PUBSUB}], [{xmlelement, "subscription", [{"jid", jlib:jid_to_string(JID)}, %{"subid", SubId}, {"subscription", subscription_to_string(Sub)} | nodeAttr(Node)], []}]}]}, ejabberd_router:route(service_jid(Host), jlib:make_jid(JID), Stanza) end, Action = fun(#pubsub_node{type = Type, id = NodeId}) -> case lists:member(Owner, node_owners_call(Type, NodeId)) of true -> Result = lists:foldl(fun({JID, Subscription, SubId}, Acc) -> case node_call(Type, set_subscriptions, [NodeId, JID, Subscription, SubId]) of {error, Err} -> [{error, Err} | Acc]; _ -> Notify(JID, Subscription, SubId), Acc end end, [], Entities), case Result of [] -> {result, []}; _ -> {error, ?ERR_NOT_ACCEPTABLE} end; _ -> {error, ?ERR_FORBIDDEN} end end, case transaction(Host, Node, Action, sync_dirty) of {result, {_, Result}} -> {result, Result}; Other -> Other end end. get_presence_and_roster_permissions(Host, From, Owners, AccessModel, AllowedGroups) -> if (AccessModel == presence) or (AccessModel == roster) -> case Host of {User, Server, _} -> get_roster_info(User, Server, From, AllowedGroups); _ -> [{OUser, OServer, _}|_] = Owners, get_roster_info(OUser, OServer, From, AllowedGroups) end; true -> {true, true} end. %% @spec (OwnerUser, OwnerServer, {SubscriberUser, SubscriberServer, SubscriberResource}, AllowedGroups) %% -> {PresenceSubscription, RosterGroup} get_roster_info(_, _, {"", "", _}, _) -> {false, false}; get_roster_info(OwnerUser, OwnerServer, {SubscriberUser, SubscriberServer, _}, AllowedGroups) -> {Subscription, Groups} = ejabberd_hooks:run_fold( roster_get_jid_info, OwnerServer, {none, []}, [OwnerUser, OwnerServer, {SubscriberUser, SubscriberServer, ""}]), PresenceSubscription = (Subscription == both) orelse (Subscription == from) orelse ({OwnerUser, OwnerServer} == {SubscriberUser, SubscriberServer}), RosterGroup = lists:any(fun(Group) -> lists:member(Group, AllowedGroups) end, Groups), {PresenceSubscription, RosterGroup}; get_roster_info(OwnerUser, OwnerServer, JID, AllowedGroups) -> get_roster_info(OwnerUser, OwnerServer, jlib:jid_tolower(JID), AllowedGroups). %% @spec (AffiliationStr) -> Affiliation %% AffiliationStr = string() %% Affiliation = atom() %% @docConvert an affiliation type from string to atom.
string_to_affiliation("owner") -> owner; string_to_affiliation("publisher") -> publisher; string_to_affiliation("member") -> member; string_to_affiliation("outcast") -> outcast; string_to_affiliation("none") -> none; string_to_affiliation(_) -> false. %% @spec (SubscriptionStr) -> Subscription %% SubscriptionStr = string() %% Subscription = atom() %% @docConvert a subscription type from string to atom.
string_to_subscription("subscribed") -> subscribed; string_to_subscription("pending") -> pending; string_to_subscription("unconfigured") -> unconfigured; string_to_subscription("none") -> none; string_to_subscription(_) -> false. %% @spec (Affiliation) -> AffiliationStr %% Affiliation = atom() %% AffiliationStr = string() %% @docConvert an affiliation type from atom to string.
affiliation_to_string(owner) -> "owner"; affiliation_to_string(publisher) -> "publisher"; affiliation_to_string(member) -> "member"; affiliation_to_string(outcast) -> "outcast"; affiliation_to_string(_) -> "none". %% @spec (Subscription) -> SubscriptionStr %% Subscription = atom() %% SubscriptionStr = string() %% @docConvert a subscription type from atom to string.
subscription_to_string(subscribed) -> "subscribed"; subscription_to_string(pending) -> "pending"; subscription_to_string(unconfigured) -> "unconfigured"; subscription_to_string(_) -> "none". %% @spec (Node) -> NodeStr %% Node = pubsubNode() %% NodeStr = string() %% @docConvert a node type from pubsubNode to string.
node_to_string(Node) -> binary_to_list(Node). string_to_node(SNode) -> list_to_binary(SNode). %% @spec (Host) -> jid() %% Host = host() %% @docGenerate pubsub service JID.
service_jid(Host) -> case Host of {U,S,_} -> {jid, U, S, "", U, S, ""}; _ -> {jid, "", Host, "", "", Host, ""} end. %% @spec (LJID, NotifyType, Depth, NodeOptions, SubOptions) -> boolean() %% LJID = jid() %% NotifyType = items | nodes %% Depth = integer() %% NodeOptions = [{atom(), term()}] %% SubOptions = [{atom(), term()}] %% @docCheck if a notification must be delivered or not based on %% node and subscription options.
is_to_deliver(LJID, NotifyType, Depth, NodeOptions, SubOptions) -> sub_to_deliver(LJID, NotifyType, Depth, SubOptions) andalso node_to_deliver(LJID, NodeOptions). sub_to_deliver(_LJID, NotifyType, Depth, SubOptions) -> lists:all(fun (Option) -> sub_option_can_deliver(NotifyType, Depth, Option) end, SubOptions). sub_option_can_deliver(items, _, {subscription_type, nodes}) -> false; sub_option_can_deliver(nodes, _, {subscription_type, items}) -> false; sub_option_can_deliver(_, _, {subscription_depth, all}) -> true; sub_option_can_deliver(_, Depth, {subscription_depth, D}) -> Depth =< D; sub_option_can_deliver(_, _, {deliver, false}) -> false; sub_option_can_deliver(_, _, {expire, When}) -> now() < When; sub_option_can_deliver(_, _, _) -> true. node_to_deliver(LJID, NodeOptions) -> PresenceDelivery = get_option(NodeOptions, presence_based_delivery), presence_can_deliver(LJID, PresenceDelivery). presence_can_deliver(_, false) -> true; presence_can_deliver({User, Server, Resource}, true) -> case mnesia:dirty_match_object({session, '_', '_', {User, Server}, '_', '_'}) of [] -> false; Ss -> lists:foldl(fun(_, true) -> true; ({session, _, _ , _, undefined, _}, _Acc) -> false; ({session, _, {_, _, R}, _, _Priority, _}, _Acc) -> case Resource of [] -> true; R -> true; _ -> false end end, false, Ss) end. state_can_deliver({U, S, R}, []) -> [{U, S, R}]; state_can_deliver({U, S, R}, SubOptions) -> %% Check SubOptions for 'show_values' case lists:keysearch('show_values', 1, SubOptions) of %% If not in suboptions, item can be delivered, case doesn't apply false -> [{U, S, R}]; %% If in a suboptions ... {_, {_, ShowValues}} -> %% Get subscriber resources Resources = case R of %% If the subscriber JID is a bare one, get all its resources [] -> user_resources(U, S); %% If the subscriber JID is a full one, use its resource R -> [R] end, %% For each resource, test if the item is allowed to be delivered %% based on resource state lists:foldl( fun(Resource, Acc) -> get_resource_state({U, S, Resource}, ShowValues, Acc) end, [], Resources) end. get_resource_state({U, S, R}, ShowValues, JIDs) -> %% Get user session PID case ejabberd_sm:get_session_pid(U, S, R) of %% If no PID, item can be delivered none -> lists:append([{U, S, R}], JIDs); %% If PID ... Pid -> %% Get user resource state %% TODO : add a catch clause Show = case ejabberd_c2s:get_presence(Pid) of {_, _, "available", _} -> "online"; {_, _, State, _} -> State end, %% Is current resource state listed in 'show-values' suboption ? case lists:member(Show, ShowValues) of %andalso Show =/= "online" of %% If yes, item can be delivered true -> lists:append([{U, S, R}], JIDs); %% If no, item can't be delivered false -> JIDs end end. %% @spec (Payload) -> int() %% Payload = term() %% @docCount occurence of XML elements in payload.
payload_xmlelements(Payload) -> payload_xmlelements(Payload, 0). payload_xmlelements([], Count) -> Count; payload_xmlelements([{xmlelement, _, _, _}|Tail], Count) -> payload_xmlelements(Tail, Count+1); payload_xmlelements([_|Tail], Count) -> payload_xmlelements(Tail, Count). %% @spec (Els) -> stanza() %% Els = [xmlelement()] %% @docBuild pubsub event stanza
event_stanza(Els) -> event_stanza_withmoreels(Els, []). event_stanza_with_delay(Els, ModifNow, ModifUSR) -> DateTime = calendar:now_to_datetime(ModifNow), MoreEls = [jlib:timestamp_to_xml(DateTime, utc, ModifUSR, "")], event_stanza_withmoreels(Els, MoreEls). event_stanza_withmoreels(Els, MoreEls) -> {xmlelement, "message", [], [{xmlelement, "event", [{"xmlns", ?NS_PUBSUB_EVENT}], Els} | MoreEls]}. %%%%%% broadcast functions broadcast_publish_item(Host, Node, NodeId, Type, NodeOptions, Removed, ItemId, From, Payload) -> case get_collection_subscriptions(Host, Node) of SubsByDepth when is_list(SubsByDepth) -> Content = case get_option(NodeOptions, deliver_payloads) of true -> Payload; false -> [] end, Stanza = event_stanza( [{xmlelement, "items", nodeAttr(Node), [{xmlelement, "item", itemAttr(ItemId), Content}]}]), broadcast_stanza(Host, From, Node, NodeId, Type, NodeOptions, SubsByDepth, items, Stanza, true), case Removed of [] -> ok; _ -> case get_option(NodeOptions, notify_retract) of true -> RetractStanza = event_stanza( [{xmlelement, "items", nodeAttr(Node), [{xmlelement, "retract", itemAttr(RId), []} || RId <- Removed]}]), broadcast_stanza(Host, Node, NodeId, Type, NodeOptions, SubsByDepth, items, RetractStanza, true); _ -> ok end end, {result, true}; _ -> {result, false} end. broadcast_retract_items(Host, Node, NodeId, Type, NodeOptions, ItemIds) -> broadcast_retract_items(Host, Node, NodeId, Type, NodeOptions, ItemIds, false). broadcast_retract_items(_Host, _Node, _NodeId, _Type, _NodeOptions, [], _ForceNotify) -> {result, false}; broadcast_retract_items(Host, Node, NodeId, Type, NodeOptions, ItemIds, ForceNotify) -> case (get_option(NodeOptions, notify_retract) or ForceNotify) of true -> case get_collection_subscriptions(Host, Node) of SubsByDepth when is_list(SubsByDepth) -> Stanza = event_stanza( [{xmlelement, "items", nodeAttr(Node), [{xmlelement, "retract", itemAttr(ItemId), []} || ItemId <- ItemIds]}]), broadcast_stanza(Host, Node, NodeId, Type, NodeOptions, SubsByDepth, items, Stanza, true), {result, true}; _ -> {result, false} end; _ -> {result, false} end. broadcast_purge_node(Host, Node, NodeId, Type, NodeOptions) -> case get_option(NodeOptions, notify_retract) of true -> case get_collection_subscriptions(Host, Node) of SubsByDepth when is_list(SubsByDepth) -> Stanza = event_stanza( [{xmlelement, "purge", nodeAttr(Node), []}]), broadcast_stanza(Host, Node, NodeId, Type, NodeOptions, SubsByDepth, nodes, Stanza, false), {result, true}; _ -> {result, false} end; _ -> {result, false} end. broadcast_removed_node(Host, Node, NodeId, Type, NodeOptions, SubsByDepth) -> case get_option(NodeOptions, notify_delete) of true -> case SubsByDepth of [] -> {result, false}; _ -> Stanza = event_stanza( [{xmlelement, "delete", nodeAttr(Node), []}]), broadcast_stanza(Host, Node, NodeId, Type, NodeOptions, SubsByDepth, nodes, Stanza, false), {result, true} end; _ -> {result, false} end. broadcast_created_node(_, _, _, _, _, []) -> {result, false}; broadcast_created_node(Host, Node, NodeId, Type, NodeOptions, SubsByDepth) -> Stanza = event_stanza([{xmlelement, "create", nodeAttr(Node), []}]), broadcast_stanza(Host, Node, NodeId, Type, NodeOptions, SubsByDepth, nodes, Stanza, true), {result, true}. broadcast_config_notification(Host, Node, NodeId, Type, NodeOptions, Lang) -> case get_option(NodeOptions, notify_config) of true -> case get_collection_subscriptions(Host, Node) of SubsByDepth when is_list(SubsByDepth) -> Content = case get_option(NodeOptions, deliver_payloads) of true -> [{xmlelement, "x", [{"xmlns", ?NS_XDATA}, {"type", "result"}], get_configure_xfields(Type, NodeOptions, Lang, [])}]; false -> [] end, Stanza = event_stanza( [{xmlelement, "configuration", nodeAttr(Node), Content}]), broadcast_stanza(Host, Node, NodeId, Type, NodeOptions, SubsByDepth, nodes, Stanza, false), {result, true}; _ -> {result, false} end; _ -> {result, false} end. get_collection_subscriptions(Host, Node) -> Action = fun() -> {result, lists:map(fun({Depth, Nodes}) -> {Depth, [{N, get_node_subs(N)} || N <- Nodes]} end, tree_call(Host, get_parentnodes_tree, [Host, Node, service_jid(Host)]))} end, case transaction(Host, Action, sync_dirty) of {result, CollSubs} -> CollSubs; _ -> [] end. get_node_subs(#pubsub_node{type = Type, id = NodeID}) -> case node_call(Type, get_node_subscriptions, [NodeID]) of {result, Subs} -> get_options_for_subs(NodeID, Subs); Other -> Other end. get_options_for_subs(NodeID, Subs) -> lists:foldl(fun({JID, subscribed, SubID}, Acc) -> case pubsub_subscription_odbc:get_subscription(JID, NodeID, SubID) of {error, notfound} -> [{JID, SubID, []} | Acc]; {result, #pubsub_subscription{options = Options}} -> [{JID, SubID, Options} | Acc]; _ -> Acc end; (_, Acc) -> Acc end, [], Subs). broadcast_stanza(Host, _Node, _NodeId, _Type, NodeOptions, SubsByDepth, NotifyType, BaseStanza, SHIM) -> NotificationType = get_option(NodeOptions, notification_type, headline), BroadcastAll = get_option(NodeOptions, broadcast_all_resources), %% XXX this is not standard, but usefull From = service_jid(Host), Stanza = case NotificationType of normal -> BaseStanza; MsgType -> add_message_type(BaseStanza, atom_to_list(MsgType)) end, %% Handles explicit subscriptions SubIDsByJID = subscribed_nodes_by_jid(NotifyType, SubsByDepth), lists:foreach(fun ({LJID, NodeName, SubIDs}) -> LJIDs = case BroadcastAll of true -> {U, S, _} = LJID, [{U, S, R} || R <- user_resources(U, S)]; false -> [LJID] end, %% Determine if the stanza should have SHIM ('SubID' and 'name') headers StanzaToSend = case {SHIM, SubIDs} of {false, _} -> Stanza; %% If there's only one SubID, don't add it {true, [_]} -> add_shim_headers(Stanza, collection_shim(NodeName)); {true, SubIDs} -> add_shim_headers(Stanza, lists:append(collection_shim(NodeName), subid_shim(SubIDs))) end, lists:foreach(fun(To) -> ejabberd_router:route(From, jlib:make_jid(To), StanzaToSend) end, LJIDs) end, SubIDsByJID). broadcast_stanza({LUser, LServer, LResource}, Publisher, Node, NodeId, Type, NodeOptions, SubsByDepth, NotifyType, BaseStanza, SHIM) -> broadcast_stanza({LUser, LServer, LResource}, Node, NodeId, Type, NodeOptions, SubsByDepth, NotifyType, BaseStanza, SHIM), %% Handles implicit presence subscriptions SenderResource = case LResource of [] -> case user_resources(LUser, LServer) of [Resource|_] -> Resource; _ -> "" end; _ -> LResource end, case ejabberd_sm:get_session_pid(LUser, LServer, SenderResource) of C2SPid when is_pid(C2SPid) -> Stanza = case get_option(NodeOptions, notification_type, headline) of normal -> BaseStanza; MsgType -> add_message_type(BaseStanza, atom_to_list(MsgType)) end, %% set the from address on the notification to the bare JID of the account owner %% Also, add "replyto" if entity has presence subscription to the account owner %% See XEP-0163 1.1 section 4.3.1 ejabberd_c2s:broadcast(C2SPid, {pep_message, binary_to_list(Node)++"+notify"}, _Sender = jlib:make_jid(LUser, LServer, ""), _StanzaToSend = add_extended_headers(Stanza, _ReplyTo = extended_headers([jlib:jid_to_string(Publisher)]))); _ -> ?DEBUG("~p@~p has no session; can't deliver ~p to contacts", [LUser, LServer, BaseStanza]) end; broadcast_stanza(Host, _Publisher, Node, NodeId, Type, NodeOptions, SubsByDepth, NotifyType, BaseStanza, SHIM) -> broadcast_stanza(Host, Node, NodeId, Type, NodeOptions, SubsByDepth, NotifyType, BaseStanza, SHIM). subscribed_nodes_by_jid(NotifyType, SubsByDepth) -> NodesToDeliver = fun(Depth, Node, Subs, Acc) -> NodeName = case Node#pubsub_node.nodeid of {_, N} -> N; Other -> Other end, NodeOptions = Node#pubsub_node.options, lists:foldl(fun({LJID, SubID, SubOptions}, {JIDs, Recipients}) -> case is_to_deliver(LJID, NotifyType, Depth, NodeOptions, SubOptions) of true -> %% If is to deliver : case state_can_deliver(LJID, SubOptions) of [] -> {JIDs, Recipients}; JIDsToDeliver -> lists:foldl( fun(JIDToDeliver, {JIDsAcc, RecipientsAcc}) -> case lists:member(JIDToDeliver, JIDs) of %% check if the JIDs co-accumulator contains the Subscription Jid, false -> %% - if not, %% - add the Jid to JIDs list co-accumulator ; %% - create a tuple of the Jid, NodeId, and SubID (as list), %% and add the tuple to the Recipients list co-accumulator {[JIDToDeliver | JIDsAcc], [{JIDToDeliver, NodeName, [SubID]} | RecipientsAcc]}; true -> %% - if the JIDs co-accumulator contains the Jid %% get the tuple containing the Jid from the Recipient list co-accumulator {_, {JIDToDeliver, NodeName1, SubIDs}} = lists:keysearch(JIDToDeliver, 1, RecipientsAcc), %% delete the tuple from the Recipients list % v1 : Recipients1 = lists:keydelete(LJID, 1, Recipients), % v2 : Recipients1 = lists:keyreplace(LJID, 1, Recipients, {LJID, NodeId1, [SubID | SubIDs]}), %% add the SubID to the SubIDs list in the tuple, %% and add the tuple back to the Recipients list co-accumulator % v1.1 : {JIDs, lists:append(Recipients1, [{LJID, NodeId1, lists:append(SubIDs, [SubID])}])} % v1.2 : {JIDs, [{LJID, NodeId1, [SubID | SubIDs]} | Recipients1]} % v2: {JIDs, Recipients1} {JIDsAcc, lists:keyreplace(JIDToDeliver, 1, RecipientsAcc, {JIDToDeliver, NodeName1, [SubID | SubIDs]})} end end, {JIDs, Recipients}, JIDsToDeliver) end; false -> {JIDs, Recipients} end end, Acc, Subs) end, DepthsToDeliver = fun({Depth, SubsByNode}, Acc1) -> lists:foldl(fun({Node, Subs}, Acc2) -> NodesToDeliver(Depth, Node, Subs, Acc2) end, Acc1, SubsByNode) end, {_, JIDSubs} = lists:foldl(DepthsToDeliver, {[], []}, SubsByDepth), JIDSubs. user_resources(User, Server) -> ejabberd_sm:get_user_resources(User, Server). %%%%%%% Configuration handling %%There are several reasons why the default node configuration options request might fail:
%%Return list of node owners.
node_owners(Host, Type, NodeId) -> case node_action(Host, Type, get_node_affiliations, [NodeId]) of {result, Affiliations} -> lists:foldl( fun({LJID, owner}, Acc) -> [LJID|Acc]; (_, Acc) -> Acc end, [], Affiliations); _ -> [] end. node_owners_call(Type, NodeId) -> case node_call(Type, get_node_affiliations, [NodeId]) of {result, Affiliations} -> lists:foldl( fun({LJID, owner}, Acc) -> [LJID|Acc]; (_, Acc) -> Acc end, [], Affiliations); _ -> [] end. %% @spec (Host, Options) -> MaxItems %% Host = host() %% Options = [Option] %% Option = {Key::atom(), Value::term()} %% MaxItems = integer() | unlimited %% @docReturn the maximum number of items for a given node.
%%Unlimited means that there is no limit in the number of items that can %% be stored.
%% @todo In practice, the current data structure means that we cannot manage %% millions of items on a given node. This should be addressed in a new %% version. max_items(Host, Options) -> case get_option(Options, persist_items) of true -> case get_option(Options, max_items) of false -> unlimited; Result when (Result < 0) -> 0; Result -> Result end; false -> case get_option(Options, send_last_published_item) of never -> 0; _ -> case is_last_item_cache_enabled(Host) of true -> 0; false -> 1 end end end. -define(BOOL_CONFIG_FIELD(Label, Var), ?BOOLXFIELD(Label, "pubsub#" ++ atom_to_list(Var), get_option(Options, Var))). -define(STRING_CONFIG_FIELD(Label, Var), ?STRINGXFIELD(Label, "pubsub#" ++ atom_to_list(Var), get_option(Options, Var, ""))). -define(INTEGER_CONFIG_FIELD(Label, Var), ?STRINGXFIELD(Label, "pubsub#" ++ atom_to_list(Var), integer_to_list(get_option(Options, Var)))). -define(JLIST_CONFIG_FIELD(Label, Var, Opts), ?LISTXFIELD(Label, "pubsub#" ++ atom_to_list(Var), jlib:jid_to_string(get_option(Options, Var)), [jlib:jid_to_string(O) || O <- Opts])). -define(ALIST_CONFIG_FIELD(Label, Var, Opts), ?LISTXFIELD(Label, "pubsub#" ++ atom_to_list(Var), atom_to_list(get_option(Options, Var)), [atom_to_list(O) || O <- Opts])). -define(LISTM_CONFIG_FIELD(Label, Var, Opts), ?LISTMXFIELD(Label, "pubsub#" ++ atom_to_list(Var), get_option(Options, Var), Opts)). -define(NLIST_CONFIG_FIELD(Label, Var), ?STRINGMXFIELD(Label, "pubsub#" ++ atom_to_list(Var), [node_to_string(N) || N <- get_option(Options, Var, [])])). get_configure_xfields(_Type, Options, Lang, Groups) -> [?XFIELD("hidden", "", "FORM_TYPE", ?NS_PUBSUB_NODE_CONFIG), ?BOOL_CONFIG_FIELD("Deliver payloads with event notifications", deliver_payloads), ?BOOL_CONFIG_FIELD("Deliver event notifications", deliver_notifications), ?BOOL_CONFIG_FIELD("Notify subscribers when the node configuration changes", notify_config), ?BOOL_CONFIG_FIELD("Notify subscribers when the node is deleted", notify_delete), ?BOOL_CONFIG_FIELD("Notify subscribers when items are removed from the node", notify_retract), ?BOOL_CONFIG_FIELD("Persist items to storage", persist_items), ?STRING_CONFIG_FIELD("A friendly name for the node", title), ?INTEGER_CONFIG_FIELD("Max # of items to persist", max_items), ?BOOL_CONFIG_FIELD("Whether to allow subscriptions", subscribe), ?ALIST_CONFIG_FIELD("Specify the access model", access_model, [open, authorize, presence, roster, whitelist]), %% XXX: change to list-multi, include current roster groups as options ?LISTM_CONFIG_FIELD("Roster groups allowed to subscribe", roster_groups_allowed, Groups), ?ALIST_CONFIG_FIELD("Specify the publisher model", publish_model, [publishers, subscribers, open]), ?BOOL_CONFIG_FIELD("Purge all items when the relevant publisher goes offline", purge_offline), ?ALIST_CONFIG_FIELD("Specify the event message type", notification_type, [headline, normal]), ?INTEGER_CONFIG_FIELD("Max payload size in bytes", max_payload_size), ?ALIST_CONFIG_FIELD("When to send the last published item", send_last_published_item, [never, on_sub, on_sub_and_presence]), ?BOOL_CONFIG_FIELD("Only deliver notifications to available users", presence_based_delivery), ?NLIST_CONFIG_FIELD("The collections with which a node is affiliated", collection) ]. %%There are several reasons why the node configuration request might fail:
%%node tree plugin call.
tree_call({_User, Server, _Resource}, Function, Args) -> tree_call(Server, Function, Args); tree_call(Host, Function, Args) -> ?DEBUG("tree_call ~p ~p ~p",[Host, Function, Args]), Module = case catch ets:lookup(gen_mod:get_module_proc(Host, config), nodetree) of [{nodetree, N}] -> N; _ -> list_to_atom(?TREE_PREFIX ++ ?STDTREE) end, catch apply(Module, Function, Args). tree_action(Host, Function, Args) -> ?DEBUG("tree_action ~p ~p ~p",[Host,Function,Args]), Fun = fun() -> tree_call(Host, Function, Args) end, case catch ejabberd_odbc:sql_bloc(odbc_conn(Host), Fun) of {atomic, Result} -> Result; {aborted, Reason} -> ?ERROR_MSG("transaction return internal error: ~p~n",[{aborted, Reason}]), {error, ?ERR_INTERNAL_SERVER_ERROR} end. %% @docnode plugin call.
node_call(Type, Function, Args) -> ?DEBUG("node_call ~p ~p ~p",[Type, Function, Args]), Module = list_to_atom(?PLUGIN_PREFIX++Type), case apply(Module, Function, Args) of {result, Result} -> {result, Result}; {error, Error} -> {error, Error}; {'EXIT', {undef, Undefined}} -> case Type of ?STDNODE -> {error, {undef, Undefined}}; _ -> node_call(?STDNODE, Function, Args) end; {'EXIT', Reason} -> {error, Reason}; Result -> {result, Result} %% any other return value is forced as result end. node_action(Host, Type, Function, Args) -> ?DEBUG("node_action ~p ~p ~p ~p",[Host,Type,Function,Args]), transaction(Host, fun() -> node_call(Type, Function, Args) end, sync_dirty). %% @docplugin transaction handling.
transaction(Host, Node, Action, Trans) -> transaction(Host, fun() -> case tree_call(Host, get_node, [Host, Node]) of N when is_record(N, pubsub_node) -> case Action(N) of {result, Result} -> {result, {N, Result}}; {atomic, {result, Result}} -> {result, {N, Result}}; Other -> Other end; Error -> Error end end, Trans). transaction_on_nodes(Host, Action, Trans) -> transaction(Host, fun() -> {result, lists:foldl(Action, [], tree_call(Host, get_nodes, [Host]))} end, Trans). transaction(Host, Fun, Trans) -> transaction_retry(Host, Fun, Trans, 2). transaction_retry(Host, Fun, Trans, Count) -> SqlFun = case Trans of transaction -> sql_transaction; _ -> sql_bloc end, case catch ejabberd_odbc:SqlFun(odbc_conn(Host), Fun) of {result, Result} -> {result, Result}; {error, Error} -> {error, Error}; {atomic, {result, Result}} -> {result, Result}; {atomic, {error, Error}} -> {error, Error}; {aborted, Reason} -> ?ERROR_MSG("transaction return internal error: ~p~n", [{aborted, Reason}]), {error, ?ERR_INTERNAL_SERVER_ERROR}; {'EXIT', {timeout, _} = Reason} -> case Count of 0 -> ?ERROR_MSG("transaction return internal error: ~p~n", [{'EXIT', Reason}]), {error, ?ERR_INTERNAL_SERVER_ERROR}; N -> erlang:yield(), transaction_retry(Host, Fun, Trans, N-1) end; {'EXIT', Reason} -> ?ERROR_MSG("transaction return internal error: ~p~n", [{'EXIT', Reason}]), {error, ?ERR_INTERNAL_SERVER_ERROR}; Other -> ?ERROR_MSG("transaction return internal error: ~p~n", [Other]), {error, ?ERR_INTERNAL_SERVER_ERROR} end. odbc_conn({_U, Host, _R})-> Host; odbc_conn(Host) -> lists:dropwhile(fun(A) -> A/=$. end, Host) -- ".". %% escape value for database storage escape({_U, _H, _R}=JID)-> ejabberd_odbc:escape(jlib:jid_to_string(JID)); escape(Value)-> ejabberd_odbc:escape(Value). %%%% helpers %% Add pubsub-specific error element extended_error(Error, Ext) -> extended_error(Error, Ext, [{"xmlns", ?NS_PUBSUB_ERRORS}]). extended_error(Error, unsupported, Feature) -> extended_error(Error, "unsupported", [{"xmlns", ?NS_PUBSUB_ERRORS}, {"feature", Feature}]); extended_error({xmlelement, Error, Attrs, SubEls}, Ext, ExtAttrs) -> {xmlelement, Error, Attrs, lists:reverse([{xmlelement, Ext, ExtAttrs, []} | SubEls])}. %% Give a uniq identifier uniqid() -> {T1, T2, T3} = now(), lists:flatten(io_lib:fwrite("~.16B~.16B~.16B", [T1, T2, T3])). % node attributes nodeAttr(Node) when is_list(Node) -> [{"node", Node}]; nodeAttr(Node) -> [{"node", node_to_string(Node)}]. % item attributes itemAttr([]) -> []; itemAttr(ItemId) -> [{"id", ItemId}]. % build item elements from item list itemsEls(Items) -> lists:map(fun(#pubsub_item{itemid = {ItemId, _}, payload = Payload}) -> {xmlelement, "item", itemAttr(ItemId), Payload} end, Items). add_message_type({xmlelement, "message", Attrs, Els}, Type) -> {xmlelement, "message", [{"type", Type}|Attrs], Els}; add_message_type(XmlEl, _Type) -> XmlEl. %% Place ofIt is used as a default for all unknown PubSub node type. It can serve %%% as a developer basis and reference to build its own custom pubsub node tree %%% types.
%%%PubSub node tree plugins are using the {@link gen_nodetree} behaviour.
%%%The API isn't stabilized yet. The pubsub plugin %%% development is still a work in progress. However, the system is already %%% useable and useful as is. Please, send us comments, feedback and %%% improvements.
-module(nodetree_tree). -author('christophe.romain@process-one.net'). -include_lib("stdlib/include/qlc.hrl"). -include("pubsub.hrl"). -include("jlib.hrl"). -behaviour(gen_pubsub_nodetree). -export([init/3, terminate/2, options/0, set_node/1, get_node/3, get_node/2, get_node/1, get_nodes/2, get_nodes/1, get_parentnodes/3, get_parentnodes_tree/3, get_subnodes/3, get_subnodes_tree/3, create_node/6, delete_node/2 ]). %% ================ %% API definition %% ================ %% @spec (Host, ServerHost, Options) -> ok %% Host = string() %% ServerHost = string() %% Options = [{atom(), term()}] %% @docCalled during pubsub modules initialisation. Any pubsub plugin must %% implement this function. It can return anything.
%%This function is mainly used to trigger the setup task necessary for the %% plugin. It can be used for example by the developer to create the specific %% module database schema if it does not exists yet.
init(_Host, _ServerHost, _Options) -> mnesia:create_table(pubsub_node, [{disc_copies, [node()]}, {attributes, record_info(fields, pubsub_node)}]), mnesia:add_table_index(pubsub_node, id), NodesFields = record_info(fields, pubsub_node), case mnesia:table_info(pubsub_node, attributes) of NodesFields -> ok; _ -> ok %% mnesia:transform_table(pubsub_state, ignore, StatesFields) end, ok. %% @spec (Host, ServerHost) -> ok %% Host = string() %% ServerHost = string() terminate(_Host, _ServerHost) -> ok. %% @spec () -> Options %% Options = [mod_pubsub:nodeOption()] %% @doc Returns the default pubsub node tree options. options() -> [{virtual_tree, false}]. %% @spec (Node) -> ok | {error, Reason} %% Node = mod_pubsub:pubsubNode() %% Reason = mod_pubsub:stanzaError() set_node(Node) when is_record(Node, pubsub_node) -> mnesia:write(Node); set_node(_) -> {error, ?ERR_INTERNAL_SERVER_ERROR}. get_node(Host, Node, _From) -> get_node(Host, Node). %% @spec (Host, NodeId) -> Node | {error, Reason} %% Host = mod_pubsub:host() %% NodeId = mod_pubsub:nodeId() %% Node = mod_pubsub:pubsubNode() %% Reason = mod_pubsub:stanzaError() get_node(Host, NodeId) -> case catch mnesia:read({pubsub_node, {Host, NodeId}}) of [Record] when is_record(Record, pubsub_node) -> Record; [] -> {error, ?ERR_ITEM_NOT_FOUND}; Error -> Error end. get_node(NodeId) -> case catch mnesia:index_read(pubsub_node, NodeId, #pubsub_node.id) of [Record] when is_record(Record, pubsub_node) -> Record; [] -> {error, ?ERR_ITEM_NOT_FOUND}; Error -> Error end. get_nodes(Host, _From) -> get_nodes(Host). %% @spec (Host) -> Nodes | {error, Reason} %% Host = mod_pubsub:host() %% Nodes = [mod_pubsub:pubsubNode()] %% Reason = {aborted, atom()} get_nodes(Host) -> mnesia:match_object(#pubsub_node{nodeid = {Host, '_'}, _ = '_'}). %% @spec (Host, Node, From) -> [] %% Host = mod_pubsub:host() %% NodeId = mod_pubsub:nodeId() %% From = mod_pubsub:jid() %% @docDefault node tree does not handle parents, return empty list.
get_parentnodes(_Host, _NodeId, _From) -> []. %% @spec (Host, NodeId, From) -> [{Depth, Node}] | [] %% Host = mod_pubsub:host() %% NodeId = mod_pubsub:nodeId() %% From = mod_pubsub:jid() %% Depth = integer() %% Node = mod_pubsub:pubsubNode() %% @docDefault node tree does not handle parents, return a list %% containing just this node.
get_parentnodes_tree(Host, NodeId, From) -> case get_node(Host, NodeId, From) of Node when is_record(Node, pubsub_node) -> [{0, [Node]}]; _Error -> [] end. %% @spec (Host, NodeId, From) -> Nodes %% Host = mod_pubsub:host() %% NodeId = mod_pubsub:nodeId() %% From = mod_pubsub:jid() %% Nodes = [mod_pubsub:pubsubNode()] get_subnodes(Host, NodeId, _From) -> get_subnodes(Host, NodeId). get_subnodes(Host, <<>>) -> Q = qlc:q([N || #pubsub_node{nodeid = {NHost, _}, parents = Parents} = N <- mnesia:table(pubsub_node), Host == NHost, Parents == []]), qlc:e(Q); get_subnodes(Host, Node) -> Q = qlc:q([N || #pubsub_node{nodeid = {NHost, _}, parents = Parents} = N <- mnesia:table(pubsub_node), Host == NHost, lists:member(Node, Parents)]), qlc:e(Q). get_subnodes_tree(Host, Node, _From) -> get_subnodes_tree(Host, Node). %% @spec (Host, NodeId) -> Nodes %% Host = mod_pubsub:host() %% NodeId = mod_pubsub:nodeId() %% Nodes = [] | [mod_pubsub:pubsubNode()] get_subnodes_tree(Host, NodeId) -> case get_node(Host, NodeId) of {error, _} -> []; Rec -> BasePlugin = list_to_atom("node_"++Rec#pubsub_node.type), BasePath = BasePlugin:node_to_path(NodeId), mnesia:foldl(fun(#pubsub_node{nodeid = {H, N}} = R, Acc) -> Plugin = list_to_atom("node_"++R#pubsub_node.type), Path = Plugin:node_to_path(N), case lists:prefix(BasePath, Path) and (H == Host) of true -> [R | Acc]; false -> Acc end end, [], pubsub_node) end. %% @spec (Host, NodeId, Type, Owner, Options, Parents) -> %% {ok, NodeIdx} | {error, Reason} %% Host = mod_pubsub:host() %% NodeId = mod_pubsub:nodeId() %% Type = mod_pubsub:nodeType() %% Owner = mod_pubsub:jid() %% Options = [mod_pubsub:nodeOption()] %% Parents = [] | [mod_pubsub:nodeId()] %% NodeIdx = mod_pubsub:nodeIdx() %% Reason = mod_pubsub:stanzaError() create_node(Host, NodeId, Type, Owner, Options, Parents) -> BJID = jlib:jid_tolower(jlib:jid_remove_resource(Owner)), case catch mnesia:read({pubsub_node, {Host, NodeId}}) of [] -> ParentExists = case Host of {_U, _S, _R} -> %% This is special case for PEP handling %% PEP does not uses hierarchy true; _ -> case Parents of [] -> true; [Parent|_] -> case catch mnesia:read({pubsub_node, {Host, Parent}}) of [#pubsub_node{owners = [{[], Host, []}]}] -> true; [#pubsub_node{owners = Owners}] -> lists:member(BJID, Owners); _ -> false end; _ -> false end end, case ParentExists of true -> NodeIdx = pubsub_index:new(node), mnesia:write(#pubsub_node{nodeid = {Host, NodeId}, id = NodeIdx, parents = Parents, type = Type, owners = [BJID], options = Options}), {ok, NodeIdx}; false -> %% Requesting entity is prohibited from creating nodes {error, ?ERR_FORBIDDEN} end; _ -> %% NodeID already exists {error, ?ERR_CONFLICT} end. %% @spec (Host, NodeId) -> Removed %% Host = mod_pubsub:host() %% NodeId = mod_pubsub:nodeId() %% Removed = [mod_pubsub:pubsubNode()] delete_node(Host, NodeId) -> Removed = get_subnodes_tree(Host, NodeId), lists:foreach(fun(#pubsub_node{nodeid = {_, SubNodeId}, id = SubNodeIdx}) -> pubsub_index:free(node, SubNodeIdx), mnesia:delete({pubsub_node, {Host, SubNodeId}}) end, Removed), Removed. ejabberd-2.1.11/src/mod_pubsub/mod_pubsub.erl 0000664 0000000 0000000 00000441314 12240230175 016016 0 ustar %%% ==================================================================== %%% ``The contents of this file are subject to the Erlang Public License, %%% Version 1.1, (the "License"); you may not use this file except in %%% compliance with the License. You should have received a copy of the %%% Erlang Public License along with this software. If not, it can be %%% retrieved via the world wide web at http://www.erlang.org/. %%% %%% Software distributed under the License is distributed on an "AS IS" %%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See %%% the License for the specific language governing rights and limitations %%% under the License. %%% %%% The Initial Developer of the Original Code is ProcessOne. %%% Portions created by ProcessOne are Copyright 2006-2012, ProcessOne %%% All Rights Reserved.'' %%% This software is copyright 2006-2012, ProcessOne. %%% %%% @copyright 2006-2012 ProcessOne %%% @author Christophe RomainThe Erlang code for the plugin is located in a module called %% node_plugin. The 'node_' prefix is mandatory.
%%The modules are initialized in alphetical order and the list is checked %% and sorted to ensure that each module is initialized only once.
%%See {@link node_hometree:init/1} for an example implementation.
init_plugins(Host, ServerHost, Opts) -> TreePlugin = list_to_atom(?TREE_PREFIX ++ gen_mod:get_opt(nodetree, Opts, ?STDTREE)), ?DEBUG("** tree plugin is ~p",[TreePlugin]), TreePlugin:init(Host, ServerHost, Opts), Plugins = gen_mod:get_opt(plugins, Opts, [?STDNODE]), PepMapping = gen_mod:get_opt(pep_mapping, Opts, []), ?DEBUG("** PEP Mapping : ~p~n",[PepMapping]), PluginsOK = lists:foldl(fun(Name, Acc) -> Plugin = list_to_atom(?PLUGIN_PREFIX ++ Name), case catch apply(Plugin, init, [Host, ServerHost, Opts]) of {'EXIT', _Error} -> Acc; _ -> ?DEBUG("** init ~s plugin",[Name]), [Name | Acc] end end, [], Plugins), {lists:reverse(PluginsOK), TreePlugin, PepMapping}. terminate_plugins(Host, ServerHost, Plugins, TreePlugin) -> lists:foreach(fun(Name) -> ?DEBUG("** terminate ~s plugin",[Name]), Plugin = list_to_atom(?PLUGIN_PREFIX++Name), Plugin:terminate(Host, ServerHost) end, Plugins), TreePlugin:terminate(Host, ServerHost), ok. init_nodes(Host, ServerHost, _NodeTree, Plugins) -> %% TODO, this call should be done plugin side case lists:member("hometree", Plugins) of true -> create_node(Host, ServerHost, string_to_node("/home"), service_jid(Host), "hometree"), create_node(Host, ServerHost, string_to_node("/home/"++ServerHost), service_jid(Host), "hometree"); false -> ok end. update_node_database(Host, ServerHost) -> mnesia:del_table_index(pubsub_node, type), mnesia:del_table_index(pubsub_node, parentid), case catch mnesia:table_info(pubsub_node, attributes) of [host_node, host_parent, info] -> ?INFO_MSG("upgrade node pubsub tables",[]), F = fun() -> {Result, LastIdx} = lists:foldl( fun({pubsub_node, NodeId, ParentId, {nodeinfo, Items, Options, Entities}}, {RecList, NodeIdx}) -> ItemsList = lists:foldl( fun({item, IID, Publisher, Payload}, Acc) -> C = {unknown, Publisher}, M = {now(), Publisher}, mnesia:write( #pubsub_item{itemid = {IID, NodeIdx}, creation = C, modification = M, payload = Payload}), [{Publisher, IID} | Acc] end, [], Items), Owners = dict:fold( fun(JID, {entity, Aff, Sub}, Acc) -> UsrItems = lists:foldl( fun({P, I}, IAcc) -> case P of JID -> [I | IAcc]; _ -> IAcc end end, [], ItemsList), mnesia:write({pubsub_state, {JID, NodeIdx}, UsrItems, Aff, Sub}), case Aff of owner -> [JID | Acc]; _ -> Acc end end, [], Entities), mnesia:delete({pubsub_node, NodeId}), {[#pubsub_node{nodeid = NodeId, id = NodeIdx, parents = [element(2, ParentId)], owners = Owners, options = Options} | RecList], NodeIdx + 1} end, {[], 1}, mnesia:match_object( {pubsub_node, {Host, '_'}, '_', '_'})), mnesia:write(#pubsub_index{index = node, last = LastIdx, free = []}), Result end, {atomic, NewRecords} = mnesia:transaction(F), {atomic, ok} = mnesia:delete_table(pubsub_node), {atomic, ok} = mnesia:create_table(pubsub_node, [{disc_copies, [node()]}, {attributes, record_info(fields, pubsub_node)}]), FNew = fun() -> lists:foreach(fun(Record) -> mnesia:write(Record) end, NewRecords) end, case mnesia:transaction(FNew) of {atomic, Result} -> ?INFO_MSG("Pubsub node tables updated correctly: ~p", [Result]); {aborted, Reason} -> ?ERROR_MSG("Problem updating Pubsub node tables:~n~p", [Reason]) end; [nodeid, parentid, type, owners, options] -> F = fun({pubsub_node, NodeId, {_, Parent}, Type, Owners, Options}) -> #pubsub_node{ nodeid = NodeId, id = 0, parents = [Parent], type = Type, owners = Owners, options = Options} end, mnesia:transform_table(pubsub_node, F, [nodeid, id, parents, type, owners, options]), FNew = fun() -> LastIdx = lists:foldl(fun(#pubsub_node{nodeid = NodeId} = PubsubNode, NodeIdx) -> mnesia:write(PubsubNode#pubsub_node{id = NodeIdx}), lists:foreach(fun(#pubsub_state{stateid = StateId} = State) -> {JID, _} = StateId, mnesia:delete({pubsub_state, StateId}), mnesia:write(State#pubsub_state{stateid = {JID, NodeIdx}}) end, mnesia:match_object(#pubsub_state{stateid = {'_', NodeId}, _ = '_'})), lists:foreach(fun(#pubsub_item{itemid = ItemId} = Item) -> {IID, _} = ItemId, {M1, M2} = Item#pubsub_item.modification, {C1, C2} = Item#pubsub_item.creation, mnesia:delete({pubsub_item, ItemId}), mnesia:write(Item#pubsub_item{itemid = {IID, NodeIdx}, modification = {M2, M1}, creation = {C2, C1}}) end, mnesia:match_object(#pubsub_item{itemid = {'_', NodeId}, _ = '_'})), NodeIdx + 1 end, 1, mnesia:match_object( {pubsub_node, {Host, '_'}, '_', '_', '_', '_', '_'}) ++ mnesia:match_object( {pubsub_node, {{'_', ServerHost, '_'}, '_'}, '_', '_', '_', '_', '_'})), mnesia:write(#pubsub_index{index = node, last = LastIdx, free = []}) end, case mnesia:transaction(FNew) of {atomic, Result} -> rename_default_nodeplugin(), ?INFO_MSG("Pubsub node tables updated correctly: ~p", [Result]); {aborted, Reason} -> ?ERROR_MSG("Problem updating Pubsub node tables:~n~p", [Reason]) end; [nodeid, id, parent, type, owners, options] -> F = fun({pubsub_node, NodeId, Id, Parent, Type, Owners, Options}) -> #pubsub_node{ nodeid = NodeId, id = Id, parents = [Parent], type = Type, owners = Owners, options = Options} end, mnesia:transform_table(pubsub_node, F, [nodeid, id, parents, type, owners, options]), rename_default_nodeplugin(); _ -> ok end, mnesia:transaction(fun() -> case catch mnesia:first(pubsub_node) of {_, L} when is_list(L) -> lists:foreach( fun({H, N}) when is_list(N) -> [Node] = mnesia:read({pubsub_node, {H, N}}), Type = Node#pubsub_node.type, BN = element(2, node_call(Type, path_to_node, [N])), BP = case [element(2, node_call(Type, path_to_node, [P])) || P <- Node#pubsub_node.parents] of [<<>>] -> []; Parents -> Parents end, mnesia:write(Node#pubsub_node{nodeid={H, BN}, parents=BP}), mnesia:delete({pubsub_node, {H, N}}); (_) -> ok end, mnesia:all_keys(pubsub_node)); _ -> ok end end). rename_default_nodeplugin() -> lists:foreach(fun(Node) -> mnesia:dirty_write(Node#pubsub_node{type = "hometree"}) end, mnesia:dirty_match_object(#pubsub_node{type = "default", _ = '_'})). update_state_database(_Host, _ServerHost) -> case catch mnesia:table_info(pubsub_state, attributes) of [stateid, items, affiliation, subscription] -> ?INFO_MSG("upgrade state pubsub tables", []), F = fun ({pubsub_state, {JID, NodeID}, Items, Aff, Sub}, Acc) -> Subs = case Sub of none -> []; _ -> {result, SubID} = pubsub_subscription:subscribe_node(JID, NodeID, []), [{Sub, SubID}] end, NewState = #pubsub_state{stateid = {JID, NodeID}, items = Items, affiliation = Aff, subscriptions = Subs}, [NewState | Acc] end, {atomic, NewRecs} = mnesia:transaction(fun mnesia:foldl/3, [F, [], pubsub_state]), {atomic, ok} = mnesia:delete_table(pubsub_state), {atomic, ok} = mnesia:create_table(pubsub_state, [{disc_copies, [node()]}, {attributes, record_info(fields, pubsub_state)}]), FNew = fun () -> lists:foreach(fun mnesia:write/1, NewRecs) end, case mnesia:transaction(FNew) of {atomic, Result} -> ?INFO_MSG("Pubsub state tables updated correctly: ~p", [Result]); {aborted, Reason} -> ?ERROR_MSG("Problem updating Pubsub state tables:~n~p", [Reason]) end; _ -> ok end. send_loop(State) -> receive {presence, JID, Pid} -> Host = State#state.host, ServerHost = State#state.server_host, LJID = jlib:jid_tolower(JID), BJID = jlib:jid_remove_resource(LJID), %% for each node From is subscribed to %% and if the node is so configured, send the last published item to From lists:foreach(fun(PType) -> {result, Subscriptions} = node_action(Host, PType, get_entity_subscriptions, [Host, JID]), lists:foreach( fun({Node, subscribed, _, SubJID}) -> if (SubJID == LJID) or (SubJID == BJID) -> #pubsub_node{nodeid = {H, N}, type = Type, id = NodeId, options = Options} = Node, case get_option(Options, send_last_published_item) of on_sub_and_presence -> send_items(H, N, NodeId, Type, LJID, last); _ -> ok end; true -> % resource not concerned about that subscription ok end; (_) -> ok end, Subscriptions) end, State#state.plugins), %% and force send the last PEP events published by its offline and local contacts %% only if pubsub is explicitely configured for that. %% this is a hack in a sense that PEP should only be based on presence %% and is not able to "store" events of remote users (via s2s) %% this makes that hack only work for local domain by now if not State#state.ignore_pep_from_offline -> {User, Server, Resource} = jlib:jid_tolower(JID), case catch ejabberd_c2s:get_subscribed(Pid) of Contacts when is_list(Contacts) -> lists:foreach( fun({U, S, R}) -> case S of ServerHost -> %% local contacts case user_resources(U, S) of [] -> %% offline PeerJID = jlib:make_jid(U, S, R), self() ! {presence, User, Server, [Resource], PeerJID}; _ -> %% online % this is already handled by presence probe ok end; _ -> %% remote contacts % we can not do anything in any cases ok end end, Contacts); _ -> ok end; true -> ok end, send_loop(State); {presence, User, Server, Resources, JID} -> %% get resources caps and check if processing is needed spawn(fun() -> Host = State#state.host, Owner = jlib:jid_remove_resource(jlib:jid_tolower(JID)), lists:foreach(fun(#pubsub_node{nodeid = {_, Node}, type = Type, id = NodeId, options = Options}) -> case get_option(Options, send_last_published_item) of on_sub_and_presence -> lists:foreach( fun(Resource) -> LJID = {User, Server, Resource}, Subscribed = case get_option(Options, access_model) of open -> true; presence -> true; whitelist -> false; % subscribers are added manually authorize -> false; % likewise roster -> Grps = get_option(Options, roster_groups_allowed, []), {OU, OS, _} = Owner, element(2, get_roster_info(OU, OS, LJID, Grps)) end, if Subscribed -> send_items(Owner, Node, NodeId, Type, LJID, last); true -> ok end end, Resources); _ -> ok end end, tree_action(Host, get_nodes, [Owner, JID])) end), send_loop(State); stop -> ok end. %% ------- %% disco hooks handling functions %% disco_local_identity(Acc, _From, To, [], _Lang) -> case lists:member(?PEPNODE, plugins(To#jid.lserver)) of true -> [{xmlelement, "identity", [{"category", "pubsub"}, {"type", "pep"}], []} | Acc]; false -> Acc end; disco_local_identity(Acc, _From, _To, _Node, _Lang) -> Acc. disco_local_features(Acc, _From, To, [], _Lang) -> Host = To#jid.lserver, Feats = case Acc of {result, I} -> I; _ -> [] end, {result, Feats ++ lists:map(fun(Feature) -> ?NS_PUBSUB++"#"++Feature end, features(Host, <<>>))}; disco_local_features(Acc, _From, _To, _Node, _Lang) -> Acc. disco_local_items(Acc, _From, _To, [], _Lang) -> Acc; disco_local_items(Acc, _From, _To, _Node, _Lang) -> Acc. disco_sm_identity(Acc, From, To, Node, Lang) when is_list(Node) -> disco_sm_identity(Acc, From, To, list_to_binary(Node), Lang); disco_sm_identity(empty, From, To, Node, Lang) -> disco_sm_identity([], From, To, Node, Lang); disco_sm_identity(Acc, From, To, Node, _Lang) -> disco_identity(jlib:jid_tolower(jlib:jid_remove_resource(To)), Node, From) ++ Acc. disco_identity(_Host, <<>>, _From) -> [{xmlelement, "identity", [{"category", "pubsub"}, {"type", "pep"}], []}]; disco_identity(Host, Node, From) -> Action = fun(#pubsub_node{id = Idx, type = Type, options = Options, owners = Owners}) -> case get_allowed_items_call(Host, Idx, From, Type, Options, Owners) of {result, _} -> {result, [{xmlelement, "identity", [{"category", "pubsub"}, {"type", "pep"}], []}, {xmlelement, "identity", [{"category", "pubsub"}, {"type", "leaf"} | case get_option(Options, title) of false -> []; [Title] -> [{"name", Title}] end], []}]}; _ -> {result, []} end end, case transaction(Host, Node, Action, sync_dirty) of {result, {_, Result}} -> Result; _ -> [] end. disco_sm_features(Acc, From, To, Node, Lang) when is_list(Node) -> disco_sm_features(Acc, From, To, list_to_binary(Node), Lang); disco_sm_features(empty, From, To, Node, Lang) -> disco_sm_features({result, []}, From, To, Node, Lang); disco_sm_features({result, OtherFeatures} = _Acc, From, To, Node, _Lang) -> {result, OtherFeatures ++ disco_features(jlib:jid_tolower(jlib:jid_remove_resource(To)), Node, From)}; disco_sm_features(Acc, _From, _To, _Node, _Lang) -> Acc. disco_features(_Host, <<>>, _From) -> [?NS_PUBSUB | [?NS_PUBSUB++"#"++Feature || Feature <- features("pep")]]; disco_features(Host, Node, From) -> Action = fun(#pubsub_node{id = Idx, type = Type, options = Options, owners = Owners}) -> case get_allowed_items_call(Host, Idx, From, Type, Options, Owners) of {result, _} -> {result, [?NS_PUBSUB | [?NS_PUBSUB ++ "#" ++ Feature || Feature <- features("pep")]]}; _ -> {result, []} end end, case transaction(Host, Node, Action, sync_dirty) of {result, {_, Result}} -> Result; _ -> [] end. disco_sm_items(Acc, From, To, Node, Lang) when is_list(Node) -> disco_sm_items(Acc, From, To, list_to_binary(Node), Lang); disco_sm_items(empty, From, To, Node, Lang) -> disco_sm_items({result, []}, From, To, Node, Lang); disco_sm_items({result, OtherItems}, From, To, Node, _Lang) -> {result, lists:usort(OtherItems ++ disco_items(jlib:jid_tolower(jlib:jid_remove_resource(To)), Node, From))}; disco_sm_items(Acc, _From, _To, _Node, _Lang) -> Acc. disco_items(Host, <<>>, From) -> Action = fun(#pubsub_node{nodeid ={_, NodeID}, options = Options, type = Type, id = Idx, owners = Owners}, Acc) -> case get_allowed_items_call(Host, Idx, From, Type, Options, Owners) of {result, _} -> [{xmlelement, "item", [{"node", binary_to_list(NodeID)}, {"jid", case Host of {_,_,_} -> jlib:jid_to_string(Host); _Host -> Host end} | case get_option(Options, title) of false -> []; [Title] -> [{"name", Title}] end], []} | Acc]; _ -> Acc end end, case transaction(Host, Action, sync_dirty) of {result, Items} -> Items; _ -> [] end; disco_items(Host, Node, From) -> Action = fun(#pubsub_node{id = Idx, type = Type, options = Options, owners = Owners}) -> case get_allowed_items_call(Host, Idx, From, Type, Options, Owners) of {result, Items} -> {result, [{xmlelement, "item", [{"jid", case Host of {_,_,_} -> jlib:jid_to_string(Host); _Host -> Host end}, {"name", ItemID}], []} || #pubsub_item{itemid = {ItemID,_}} <- Items]}; _ -> {result, []} end end, case transaction(Host, Node, Action, sync_dirty) of {result, {_, Result}} -> Result; _ -> [] end. %% ------- %% presence hooks handling functions %% caps_update(#jid{luser = U, lserver = S, lresource = R} = From, To, _Features) -> Pid = ejabberd_sm:get_session_pid(U, S, R), presence_probe(From, To, Pid). presence_probe(#jid{luser = User, lserver = Server, lresource = Resource} = JID, JID, Pid) -> %%?DEBUG("presence probe self ~s@~s/~s ~s@~s/~s",[User,Server,Resource,element(2,JID),element(3,JID),element(4,JID)]), presence(Server, {presence, JID, Pid}), presence(Server, {presence, User, Server, [Resource], JID}); presence_probe(#jid{luser = User, lserver = Server}, #jid{luser = User, lserver = Server}, _Pid) -> %% ignore presence_probe from other ressources for the current user %% this way, we do not send duplicated last items if user already connected with other clients ok; presence_probe(#jid{luser = User, lserver = Server, lresource = Resource}, #jid{lserver = Host} = JID, _Pid) -> %%?DEBUG("presence probe peer ~s@~s/~s ~s@~s/~s",[User,Server,Resource,element(2,JID),element(3,JID),element(4,JID)]), presence(Host, {presence, User, Server, [Resource], JID}). presence(ServerHost, Presence) -> SendLoop = case whereis(gen_mod:get_module_proc(ServerHost, ?LOOPNAME)) of undefined -> % in case send_loop process died, we rebuild a minimal State record and respawn it Host = host(ServerHost), Plugins = plugins(Host), PepOffline = case catch ets:lookup(gen_mod:get_module_proc(ServerHost, config), ignore_pep_from_offline) of [{ignore_pep_from_offline, PO}] -> PO; _ -> true end, State = #state{host = Host, server_host = ServerHost, ignore_pep_from_offline = PepOffline, plugins = Plugins}, init_send_loop(ServerHost, State); Pid -> Pid end, SendLoop ! Presence. %% ------- %% subscription hooks handling functions %% out_subscription(User, Server, JID, subscribed) -> Owner = jlib:make_jid(User, Server, ""), {PUser, PServer, PResource} = jlib:jid_tolower(JID), PResources = case PResource of [] -> user_resources(PUser, PServer); _ -> [PResource] end, presence(Server, {presence, PUser, PServer, PResources, Owner}), true; out_subscription(_,_,_,_) -> true. in_subscription(_, User, Server, Owner, unsubscribed, _) -> unsubscribe_user(jlib:make_jid(User, Server, ""), Owner), true; in_subscription(_, _, _, _, _, _) -> true. unsubscribe_user(Entity, Owner) -> BJID = jlib:jid_tolower(jlib:jid_remove_resource(Owner)), Host = host(element(2, BJID)), spawn(fun() -> lists:foreach(fun(PType) -> {result, Subscriptions} = node_action(Host, PType, get_entity_subscriptions, [Host, Entity]), lists:foreach(fun ({#pubsub_node{options = Options, owners = Owners, id = NodeId}, subscribed, _, JID}) -> case get_option(Options, access_model) of presence -> case lists:member(BJID, Owners) of true -> node_action(Host, PType, unsubscribe_node, [NodeId, Entity, JID, all]); false -> {result, ok} end; _ -> {result, ok} end; (_) -> ok end, Subscriptions) end, plugins(Host)) end). %% ------- %% user remove hook handling function %% remove_user(User, Server) -> LUser = jlib:nodeprep(User), LServer = jlib:nameprep(Server), Entity = jlib:make_jid(LUser, LServer, ""), Host = host(LServer), HomeTreeBase = string_to_node("/home/"++LServer++"/"++LUser), spawn(fun() -> lists:foreach(fun(PType) -> {result, Subscriptions} = node_action(Host, PType, get_entity_subscriptions, [Host, Entity]), lists:foreach(fun ({#pubsub_node{id = NodeId}, _, _, JID}) -> node_action(Host, PType, unsubscribe_node, [NodeId, Entity, JID, all]) end, Subscriptions), {result, Affiliations} = node_action(Host, PType, get_entity_affiliations, [Host, Entity]), lists:foreach(fun ({#pubsub_node{nodeid = {H, N}, parents = []}, owner}) -> delete_node(H, N, Entity); ({#pubsub_node{nodeid = {H, N}, type = "hometree"}, owner}) when N == HomeTreeBase -> delete_node(H, N, Entity); ({#pubsub_node{id = NodeId}, publisher}) -> node_action(Host, PType, set_affiliation, [NodeId, Entity, none]); (_) -> ok end, Affiliations) end, plugins(Host)) end). %%-------------------------------------------------------------------- %% Function: %% handle_call(Request, From, State) -> {reply, Reply, State} | %% {reply, Reply, State, Timeout} | %% {noreply, State} | %% {noreply, State, Timeout} | %% {stop, Reason, Reply, State} | %% {stop, Reason, State} %% Description: Handling call messages %%-------------------------------------------------------------------- %% @private handle_call(server_host, _From, State) -> {reply, State#state.server_host, State}; handle_call(plugins, _From, State) -> {reply, State#state.plugins, State}; handle_call(pep_mapping, _From, State) -> {reply, State#state.pep_mapping, State}; handle_call(nodetree, _From, State) -> {reply, State#state.nodetree, State}; handle_call(stop, _From, State) -> {stop, normal, ok, State}. %%-------------------------------------------------------------------- %% Function: handle_cast(Msg, State) -> {noreply, State} | %% {noreply, State, Timeout} | %% {stop, Reason, State} %% Description: Handling cast messages %%-------------------------------------------------------------------- %% @private handle_cast(_Msg, State) -> {noreply, State}. %%-------------------------------------------------------------------- %% Function: handle_info(Info, State) -> {noreply, State} | %% {noreply, State, Timeout} | %% {stop, Reason, State} %% Description: Handling all non call/cast messages %%-------------------------------------------------------------------- %% @private handle_info({route, From, To, Packet}, #state{server_host = ServerHost, access = Access, plugins = Plugins} = State) -> case catch do_route(ServerHost, Access, Plugins, To#jid.lserver, From, To, Packet) of {'EXIT', Reason} -> ?ERROR_MSG("~p", [Reason]); _ -> ok end, {noreply, State}; handle_info(_Info, State) -> {noreply, State}. %%-------------------------------------------------------------------- %% Function: terminate(Reason, State) -> void() %% Description: This function is called by a gen_server when it is about to %% terminate. It should be the opposite of Module:init/1 and do any necessary %% cleaning up. When it returns, the gen_server terminates with Reason. %% The return value is ignored. %%-------------------------------------------------------------------- %% @private terminate(_Reason, #state{host = Host, server_host = ServerHost, nodetree = TreePlugin, plugins = Plugins}) -> ejabberd_router:unregister_route(Host), case lists:member(?PEPNODE, Plugins) of true -> ejabberd_hooks:delete(caps_update, ServerHost, ?MODULE, caps_update, 80), ejabberd_hooks:delete(disco_sm_identity, ServerHost, ?MODULE, disco_sm_identity, 75), ejabberd_hooks:delete(disco_sm_features, ServerHost, ?MODULE, disco_sm_features, 75), ejabberd_hooks:delete(disco_sm_items, ServerHost, ?MODULE, disco_sm_items, 75), gen_iq_handler:remove_iq_handler(ejabberd_sm, ServerHost, ?NS_PUBSUB), gen_iq_handler:remove_iq_handler(ejabberd_sm, ServerHost, ?NS_PUBSUB_OWNER); false -> ok end, ejabberd_hooks:delete(sm_remove_connection_hook, ServerHost, ?MODULE, on_user_offline, 75), ejabberd_hooks:delete(disco_local_identity, ServerHost, ?MODULE, disco_local_identity, 75), ejabberd_hooks:delete(disco_local_features, ServerHost, ?MODULE, disco_local_features, 75), ejabberd_hooks:delete(disco_local_items, ServerHost, ?MODULE, disco_local_items, 75), ejabberd_hooks:delete(presence_probe_hook, ServerHost, ?MODULE, presence_probe, 80), ejabberd_hooks:delete(roster_in_subscription, ServerHost, ?MODULE, in_subscription, 50), ejabberd_hooks:delete(roster_out_subscription, ServerHost, ?MODULE, out_subscription, 50), ejabberd_hooks:delete(remove_user, ServerHost, ?MODULE, remove_user, 50), ejabberd_hooks:delete(anonymous_purge_hook, ServerHost, ?MODULE, remove_user, 50), mod_disco:unregister_feature(ServerHost, ?NS_PUBSUB), gen_mod:get_module_proc(ServerHost, ?LOOPNAME) ! stop, terminate_plugins(Host, ServerHost, Plugins, TreePlugin). %%-------------------------------------------------------------------- %% Func: code_change(OldVsn, State, Extra) -> {ok, NewState} %% Description: Convert process state when code is changed %%-------------------------------------------------------------------- %% @private code_change(_OldVsn, State, _Extra) -> {ok, State}. %%-------------------------------------------------------------------- %%% Internal functions %%-------------------------------------------------------------------- do_route(ServerHost, Access, Plugins, Host, From, To, Packet) -> {xmlelement, Name, Attrs, _Els} = Packet, case To of #jid{luser = "", lresource = ""} -> case Name of "iq" -> case jlib:iq_query_info(Packet) of #iq{type = get, xmlns = ?NS_DISCO_INFO, sub_el = SubEl, lang = Lang} = IQ -> {xmlelement, _, QAttrs, _} = SubEl, Node = xml:get_attr_s("node", QAttrs), Info = ejabberd_hooks:run_fold( disco_info, ServerHost, [], [ServerHost, ?MODULE, "", ""]), Res = case iq_disco_info(Host, Node, From, Lang) of {result, IQRes} -> jlib:iq_to_xml( IQ#iq{type = result, sub_el = [{xmlelement, "query", QAttrs, IQRes++Info}]}); {error, Error} -> jlib:make_error_reply(Packet, Error) end, ejabberd_router:route(To, From, Res); #iq{type = get, xmlns = ?NS_DISCO_ITEMS, sub_el = SubEl} = IQ -> {xmlelement, _, QAttrs, _} = SubEl, Node = xml:get_attr_s("node", QAttrs), Res = case iq_disco_items(Host, Node, From) of {result, IQRes} -> jlib:iq_to_xml( IQ#iq{type = result, sub_el = [{xmlelement, "query", QAttrs, IQRes}]}); {error, Error} -> jlib:make_error_reply(Packet, Error) end, ejabberd_router:route(To, From, Res); #iq{type = IQType, xmlns = ?NS_PUBSUB, lang = Lang, sub_el = SubEl} = IQ -> Res = case iq_pubsub(Host, ServerHost, From, IQType, SubEl, Lang, Access, Plugins) of {result, IQRes} -> jlib:iq_to_xml( IQ#iq{type = result, sub_el = IQRes}); {error, Error} -> jlib:make_error_reply(Packet, Error) end, ejabberd_router:route(To, From, Res); #iq{type = IQType, xmlns = ?NS_PUBSUB_OWNER, lang = Lang, sub_el = SubEl} = IQ -> Res = case iq_pubsub_owner(Host, ServerHost, From, IQType, SubEl, Lang) of {result, IQRes} -> jlib:iq_to_xml( IQ#iq{type = result, sub_el = IQRes}); {error, Error} -> jlib:make_error_reply(Packet, Error) end, ejabberd_router:route(To, From, Res); #iq{type = get, xmlns = ?NS_VCARD = XMLNS, lang = Lang, sub_el = _SubEl} = IQ -> Res = IQ#iq{type = result, sub_el = [{xmlelement, "vCard", [{"xmlns", XMLNS}], iq_get_vcard(Lang)}]}, ejabberd_router:route(To, From, jlib:iq_to_xml(Res)); #iq{type = set, xmlns = ?NS_COMMANDS} = IQ -> Res = case iq_command(Host, ServerHost, From, IQ, Access, Plugins) of {error, Error} -> jlib:make_error_reply(Packet, Error); {result, IQRes} -> jlib:iq_to_xml(IQ#iq{type = result, sub_el = IQRes}) end, ejabberd_router:route(To, From, Res); #iq{} -> Err = jlib:make_error_reply( Packet, ?ERR_FEATURE_NOT_IMPLEMENTED), ejabberd_router:route(To, From, Err); _ -> ok end; "message" -> case xml:get_attr_s("type", Attrs) of "error" -> ok; _ -> case find_authorization_response(Packet) of none -> ok; invalid -> ejabberd_router:route(To, From, jlib:make_error_reply(Packet, ?ERR_BAD_REQUEST)); XFields -> handle_authorization_response(Host, From, To, Packet, XFields) end end; _ -> ok end; _ -> case xml:get_attr_s("type", Attrs) of "error" -> ok; "result" -> ok; _ -> Err = jlib:make_error_reply(Packet, ?ERR_ITEM_NOT_FOUND), ejabberd_router:route(To, From, Err) end end. command_disco_info(_Host, <>, _From) -> IdentityEl = {xmlelement, "identity", [{"category", "automation"}, {"type", "command-list"}], []}, {result, [IdentityEl]}; command_disco_info(_Host, <>, _From) -> IdentityEl = {xmlelement, "identity", [{"category", "automation"}, {"type", "command-node"}], []}, FeaturesEl = {xmlelement, "feature", [{"var", ?NS_COMMANDS}], []}, {result, [IdentityEl, FeaturesEl]}. node_disco_info(Host, Node, From) -> node_disco_info(Host, Node, From, true, true). %node_disco_identity(Host, Node, From) -> % node_disco_info(Host, Node, From, true, false). %node_disco_features(Host, Node, From) -> % node_disco_info(Host, Node, From, false, true). node_disco_info(Host, Node, From, Identity, Features) -> Action = fun(#pubsub_node{type = Type, id = NodeId}) -> I = case Identity of false -> []; true -> Types = case tree_call(Host, get_subnodes, [Host, Node, From]) of [] -> ["leaf"]; %% No sub-nodes: it's a leaf node _ -> case node_call(Type, get_items, [NodeId, From]) of {result, []} -> ["collection"]; {result, _} -> ["leaf", "collection"]; _ -> [] end end, lists:map(fun(T) -> {xmlelement, "identity", [{"category", "pubsub"}, {"type", T}], []} end, Types) end, F = case Features of false -> []; true -> [{xmlelement, "feature", [{"var", ?NS_PUBSUB}], []} | lists:map(fun(T) -> {xmlelement, "feature", [{"var", ?NS_PUBSUB++"#"++T}], []} end, features(Type))] end, %% TODO: add meta-data info (spec section 5.4) {result, I ++ F} end, case transaction(Host, Node, Action, sync_dirty) of {result, {_, Result}} -> {result, Result}; Other -> Other end. iq_disco_info(Host, SNode, From, Lang) -> [RealSNode|_] = case SNode of [] -> [[]]; _ -> string:tokens(SNode, "!") end, Node = string_to_node(RealSNode), case Node of <<>> -> {result, [{xmlelement, "identity", [{"category", "pubsub"}, {"type", "service"}, {"name", translate:translate(Lang, "Publish-Subscribe")}], []}, {xmlelement, "feature", [{"var", ?NS_DISCO_INFO}], []}, {xmlelement, "feature", [{"var", ?NS_DISCO_ITEMS}], []}, {xmlelement, "feature", [{"var", ?NS_PUBSUB}], []}, {xmlelement, "feature", [{"var", ?NS_COMMANDS}], []}, {xmlelement, "feature", [{"var", ?NS_VCARD}], []}] ++ lists:map(fun(Feature) -> {xmlelement, "feature", [{"var", ?NS_PUBSUB++"#"++Feature}], []} end, features(Host, Node))}; <> -> command_disco_info(Host, Node, From); <> -> command_disco_info(Host, Node, From); _ -> node_disco_info(Host, Node, From) end. iq_disco_items(Host, [], From) -> case tree_action(Host, get_subnodes, [Host, <<>>, From]) of Nodes when is_list(Nodes) -> {result, lists:map( fun(#pubsub_node{nodeid = {_, SubNode}, options = Options}) -> Attrs = case get_option(Options, title) of false -> [{"jid", Host} |nodeAttr(SubNode)]; Title -> [{"jid", Host}, {"name", Title}|nodeAttr(SubNode)] end, {xmlelement, "item", Attrs, []} end, Nodes)}; Other -> Other end; iq_disco_items(Host, ?NS_COMMANDS, _From) -> %% TODO: support localization of this string CommandItems = [{xmlelement, "item", [{"jid", Host}, {"node", ?NS_PUBSUB_GET_PENDING}, {"name", "Get Pending"}], []}], {result, CommandItems}; iq_disco_items(_Host, ?NS_PUBSUB_GET_PENDING, _From) -> CommandItems = [], {result, CommandItems}; iq_disco_items(Host, Item, From) -> case string:tokens(Item, "!") of [_SNode, _ItemID] -> {result, []}; [SNode] -> Node = string_to_node(SNode), Action = fun(#pubsub_node{id = Idx, type = Type, options = Options, owners = Owners}) -> NodeItems = case get_allowed_items_call(Host, Idx, From, Type, Options, Owners) of {result, R} -> R; _ -> [] end, Nodes = lists:map( fun(#pubsub_node{nodeid = {_, SubNode}, options = SubOptions}) -> Attrs = case get_option(SubOptions, title) of false -> [{"jid", Host} |nodeAttr(SubNode)]; Title -> [{"jid", Host}, {"name", Title}|nodeAttr(SubNode)] end, {xmlelement, "item", Attrs, []} end, tree_call(Host, get_subnodes, [Host, Node, From])), Items = lists:map( fun(#pubsub_item{itemid = {RN, _}}) -> {result, Name} = node_call(Type, get_item_name, [Host, Node, RN]), {xmlelement, "item", [{"jid", Host}, {"name", Name}], []} end, NodeItems), {result, Nodes ++ Items} end, case transaction(Host, Node, Action, sync_dirty) of {result, {_, Result}} -> {result, Result}; Other -> Other end end. iq_sm(From, To, #iq{type = Type, sub_el = SubEl, xmlns = XMLNS, lang = Lang} = IQ) -> ServerHost = To#jid.lserver, LOwner = jlib:jid_tolower(jlib:jid_remove_resource(To)), Res = case XMLNS of ?NS_PUBSUB -> iq_pubsub(LOwner, ServerHost, From, Type, SubEl, Lang); ?NS_PUBSUB_OWNER -> iq_pubsub_owner(LOwner, ServerHost, From, Type, SubEl, Lang) end, case Res of {result, IQRes} -> IQ#iq{type = result, sub_el = IQRes}; {error, Error} -> IQ#iq{type = error, sub_el = [Error, SubEl]} end. iq_get_vcard(Lang) -> [{xmlelement, "FN", [], [{xmlcdata, "ejabberd/mod_pubsub"}]}, {xmlelement, "URL", [], [{xmlcdata, ?EJABBERD_URI}]}, {xmlelement, "DESC", [], [{xmlcdata, translate:translate(Lang, "ejabberd Publish-Subscribe module") ++ "\nCopyright (c) 2004-2012 ProcessOne"}]}]. iq_pubsub(Host, ServerHost, From, IQType, SubEl, Lang) -> iq_pubsub(Host, ServerHost, From, IQType, SubEl, Lang, all, plugins(ServerHost)). iq_pubsub(Host, ServerHost, From, IQType, SubEl, Lang, Access, Plugins) -> {xmlelement, _, _, SubEls} = SubEl, case xml:remove_cdata(SubEls) of [{xmlelement, Name, Attrs, Els} | Rest] -> Node = string_to_node(xml:get_attr_s("node", Attrs)), case {IQType, Name} of {set, "create"} -> Config = case Rest of [{xmlelement, "configure", _, C}] -> C; _ -> [] end, %% Get the type of the node Type = case xml:get_attr_s("type", Attrs) of [] -> hd(Plugins); T -> T end, %% we use Plugins list matching because we do not want to allocate %% atoms for non existing type, this prevent atom allocation overflow case lists:member(Type, Plugins) of false -> {error, extended_error( ?ERR_FEATURE_NOT_IMPLEMENTED, unsupported, "create-nodes")}; true -> create_node(Host, ServerHost, Node, From, Type, Access, Config) end; {set, "publish"} -> case xml:remove_cdata(Els) of [{xmlelement, "item", ItemAttrs, Payload}] -> ItemId = xml:get_attr_s("id", ItemAttrs), publish_item(Host, ServerHost, Node, From, ItemId, Payload); [] -> %% Publisher attempts to publish to persistent node with no item {error, extended_error(?ERR_BAD_REQUEST, "item-required")}; _ -> %% Entity attempts to publish item with multiple payload elements or namespace does not match {error, extended_error(?ERR_BAD_REQUEST, "invalid-payload")} end; {set, "retract"} -> ForceNotify = case xml:get_attr_s("notify", Attrs) of "1" -> true; "true" -> true; _ -> false end, case xml:remove_cdata(Els) of [{xmlelement, "item", ItemAttrs, _}] -> ItemId = xml:get_attr_s("id", ItemAttrs), delete_item(Host, Node, From, ItemId, ForceNotify); _ -> %% Request does not specify an item {error, extended_error(?ERR_BAD_REQUEST, "item-required")} end; {set, "subscribe"} -> Config = case Rest of [{xmlelement, "options", _, C}] -> C; _ -> [] end, JID = xml:get_attr_s("jid", Attrs), subscribe_node(Host, Node, From, JID, Config); {set, "unsubscribe"} -> JID = xml:get_attr_s("jid", Attrs), SubId = xml:get_attr_s("subid", Attrs), unsubscribe_node(Host, Node, From, JID, SubId); {get, "items"} -> MaxItems = xml:get_attr_s("max_items", Attrs), SubId = xml:get_attr_s("subid", Attrs), ItemIDs = lists:foldl(fun ({xmlelement, "item", ItemAttrs, _}, Acc) -> case xml:get_attr_s("id", ItemAttrs) of "" -> Acc; ItemID -> [ItemID|Acc] end; (_, Acc) -> Acc end, [], xml:remove_cdata(Els)), get_items(Host, Node, From, SubId, MaxItems, ItemIDs); {get, "subscriptions"} -> get_subscriptions(Host, Node, From, Plugins); {get, "affiliations"} -> get_affiliations(Host, Node, From, Plugins); {get, "options"} -> SubID = xml:get_attr_s("subid", Attrs), JID = xml:get_attr_s("jid", Attrs), get_options(Host, Node, JID, SubID, Lang); {set, "options"} -> SubID = xml:get_attr_s("subid", Attrs), JID = xml:get_attr_s("jid", Attrs), set_options(Host, Node, JID, SubID, Els); _ -> {error, ?ERR_FEATURE_NOT_IMPLEMENTED} end; Other -> ?INFO_MSG("Too many actions: ~p", [Other]), {error, ?ERR_BAD_REQUEST} end. iq_pubsub_owner(Host, ServerHost, From, IQType, SubEl, Lang) -> {xmlelement, _, _, SubEls} = SubEl, Action = xml:remove_cdata(SubEls), case Action of [{xmlelement, Name, Attrs, Els}] -> Node = string_to_node(xml:get_attr_s("node", Attrs)), case {IQType, Name} of {get, "configure"} -> get_configure(Host, ServerHost, Node, From, Lang); {set, "configure"} -> set_configure(Host, Node, From, Els, Lang); {get, "default"} -> get_default(Host, Node, From, Lang); {set, "delete"} -> delete_node(Host, Node, From); {set, "purge"} -> purge_node(Host, Node, From); {get, "subscriptions"} -> get_subscriptions(Host, Node, From); {set, "subscriptions"} -> set_subscriptions(Host, Node, From, xml:remove_cdata(Els)); {get, "affiliations"} -> get_affiliations(Host, Node, From); {set, "affiliations"} -> set_affiliations(Host, Node, From, xml:remove_cdata(Els)); _ -> {error, ?ERR_FEATURE_NOT_IMPLEMENTED} end; _ -> ?INFO_MSG("Too many actions: ~p", [Action]), {error, ?ERR_BAD_REQUEST} end. iq_command(Host, ServerHost, From, IQ, Access, Plugins) -> case adhoc:parse_request(IQ) of Req when is_record(Req, adhoc_request) -> case adhoc_request(Host, ServerHost, From, Req, Access, Plugins) of Resp when is_record(Resp, adhoc_response) -> {result, [adhoc:produce_response(Req, Resp)]}; Error -> Error end; Err -> Err end. %% @docProcesses an Ad Hoc Command.
adhoc_request(Host, _ServerHost, Owner, #adhoc_request{node = ?NS_PUBSUB_GET_PENDING, lang = Lang, action = "execute", xdata = false}, _Access, Plugins) -> send_pending_node_form(Host, Owner, Lang, Plugins); adhoc_request(Host, _ServerHost, Owner, #adhoc_request{node = ?NS_PUBSUB_GET_PENDING, action = "execute", xdata = XData}, _Access, _Plugins) -> ParseOptions = case XData of {xmlelement, "x", _Attrs, _SubEls} = XEl -> case jlib:parse_xdata_submit(XEl) of invalid -> {error, ?ERR_BAD_REQUEST}; XData2 -> case set_xoption(Host, XData2, []) of NewOpts when is_list(NewOpts) -> {result, NewOpts}; Err -> Err end end; _ -> ?INFO_MSG("Bad XForm: ~p", [XData]), {error, ?ERR_BAD_REQUEST} end, case ParseOptions of {result, XForm} -> case lists:keysearch(node, 1, XForm) of {value, {_, Node}} -> send_pending_auth_events(Host, Node, Owner); false -> {error, extended_error(?ERR_BAD_REQUEST, "bad-payload")} end; Error -> Error end; adhoc_request(_Host, _ServerHost, _Owner, #adhoc_request{action = "cancel"}, _Access, _Plugins) -> #adhoc_response{status = canceled}; adhoc_request(Host, ServerHost, Owner, #adhoc_request{action = []} = R, Access, Plugins) -> adhoc_request(Host, ServerHost, Owner, R#adhoc_request{action = "execute"}, Access, Plugins); adhoc_request(_Host, _ServerHost, _Owner, Other, _Access, _Plugins) -> ?DEBUG("Couldn't process ad hoc command:~n~p", [Other]), {error, ?ERR_ITEM_NOT_FOUND}. %% @spec (Host, Owner, Lang, Plugins) -> iqRes() %% @docSends the process pending subscriptions XForm for Host to %% Owner.
send_pending_node_form(Host, Owner, _Lang, Plugins) -> Filter = fun (Plugin) -> lists:member("get-pending", features(Plugin)) end, case lists:filter(Filter, Plugins) of [] -> {error, ?ERR_FEATURE_NOT_IMPLEMENTED}; Ps -> XOpts = lists:map(fun (Node) -> {xmlelement, "option", [], [{xmlelement, "value", [], [{xmlcdata, node_to_string(Node)}]}]} end, get_pending_nodes(Host, Owner, Ps)), XForm = {xmlelement, "x", [{"xmlns", ?NS_XDATA}, {"type", "form"}], [{xmlelement, "field", [{"type", "list-single"}, {"var", "pubsub#node"}], lists:usort(XOpts)}]}, #adhoc_response{status = executing, defaultaction = "execute", elements = [XForm]} end. get_pending_nodes(Host, Owner, Plugins) -> Tr = fun (Type) -> case node_call(Type, get_pending_nodes, [Host, Owner]) of {result, Nodes} -> Nodes; _ -> [] end end, case transaction(fun () -> {result, lists:flatmap(Tr, Plugins)} end, sync_dirty) of {result, Res} -> Res; Err -> Err end. %% @spec (Host, Node, Owner) -> iqRes() %% @docSend a subscription approval form to Owner for all pending %% subscriptions on Host and Node.
send_pending_auth_events(Host, Node, Owner) -> ?DEBUG("Sending pending auth events for ~s on ~s:~s", [jlib:jid_to_string(Owner), Host, node_to_string(Node)]), Action = fun (#pubsub_node{id = NodeID, type = Type}) -> case lists:member("get-pending", features(Type)) of true -> case node_call(Type, get_affiliation, [NodeID, Owner]) of {result, owner} -> node_call(Type, get_node_subscriptions, [NodeID]); _ -> {error, ?ERR_FORBIDDEN} end; false -> {error, ?ERR_FEATURE_NOT_IMPLEMENTED} end end, case transaction(Host, Node, Action, sync_dirty) of {result, {N, Subscriptions}} -> lists:foreach(fun({J, pending, _SubID}) -> send_authorization_request(N, jlib:make_jid(J)); ({J, pending}) -> send_authorization_request(N, jlib:make_jid(J)); (_) -> ok end, Subscriptions), #adhoc_response{}; Err -> Err end. %%% authorization handling send_authorization_request(#pubsub_node{owners = Owners, nodeid = {Host, Node}}, Subscriber) -> Lang = "en", %% TODO fix Stanza = {xmlelement, "message", [], [{xmlelement, "x", [{"xmlns", ?NS_XDATA}, {"type", "form"}], [{xmlelement, "title", [], [{xmlcdata, translate:translate(Lang, "PubSub subscriber request")}]}, {xmlelement, "instructions", [], [{xmlcdata, translate:translate(Lang, "Choose whether to approve this entity's subscription.")}]}, {xmlelement, "field", [{"var", "FORM_TYPE"}, {"type", "hidden"}], [{xmlelement, "value", [], [{xmlcdata, ?NS_PUBSUB_SUB_AUTH}]}]}, {xmlelement, "field", [{"var", "pubsub#node"}, {"type", "text-single"}, {"label", translate:translate(Lang, "Node ID")}], [{xmlelement, "value", [], [{xmlcdata, node_to_string(Node)}]}]}, {xmlelement, "field", [{"var", "pubsub#subscriber_jid"}, {"type", "jid-single"}, {"label", translate:translate(Lang, "Subscriber Address")}], [{xmlelement, "value", [], [{xmlcdata, jlib:jid_to_string(Subscriber)}]}]}, {xmlelement, "field", [{"var", "pubsub#allow"}, {"type", "boolean"}, {"label", translate:translate(Lang, "Allow this Jabber ID to subscribe to this pubsub node?")}], [{xmlelement, "value", [], [{xmlcdata, "false"}]}]}]}]}, lists:foreach(fun(Owner) -> ejabberd_router:route(service_jid(Host), jlib:make_jid(Owner), Stanza) end, Owners). find_authorization_response(Packet) -> {xmlelement, _Name, _Attrs, Els} = Packet, XData1 = lists:map(fun({xmlelement, "x", XAttrs, _} = XEl) -> case xml:get_attr_s("xmlns", XAttrs) of ?NS_XDATA -> case xml:get_attr_s("type", XAttrs) of "cancel" -> none; _ -> jlib:parse_xdata_submit(XEl) end; _ -> none end; (_) -> none end, xml:remove_cdata(Els)), XData = lists:filter(fun(E) -> E /= none end, XData1), case XData of [invalid] -> invalid; [] -> none; [XFields] when is_list(XFields) -> ?DEBUG("XFields: ~p", [XFields]), case lists:keysearch("FORM_TYPE", 1, XFields) of {value, {_, [?NS_PUBSUB_SUB_AUTH]}} -> XFields; _ -> invalid end end. %% @spec (Host, JID, Node, Subscription) -> void %% Host = mod_pubsub:host() %% JID = jlib:jid() %% SNode = string() %% Subscription = atom() | {atom(), mod_pubsub:subid()} %% @doc Send a message to JID with the supplied Subscription send_authorization_approval(Host, JID, SNode, Subscription) -> SubAttrs = case Subscription of {S, SID} -> [{"subscription", subscription_to_string(S)}, {"subid", SID}]; S -> [{"subscription", subscription_to_string(S)}] end, Stanza = event_stanza( [{xmlelement, "subscription", [{"jid", jlib:jid_to_string(JID)}|nodeAttr(SNode)] ++ SubAttrs, []}]), ejabberd_router:route(service_jid(Host), JID, Stanza). handle_authorization_response(Host, From, To, Packet, XFields) -> case {lists:keysearch("pubsub#node", 1, XFields), lists:keysearch("pubsub#subscriber_jid", 1, XFields), lists:keysearch("pubsub#allow", 1, XFields)} of {{value, {_, [SNode]}}, {value, {_, [SSubscriber]}}, {value, {_, [SAllow]}}} -> Node = string_to_node(SNode), Subscriber = jlib:string_to_jid(SSubscriber), Allow = case SAllow of "1" -> true; "true" -> true; _ -> false end, Action = fun(#pubsub_node{type = Type, owners = Owners, id = NodeId}) -> IsApprover = lists:member(jlib:jid_tolower(jlib:jid_remove_resource(From)), Owners), {result, Subscriptions} = node_call(Type, get_subscriptions, [NodeId, Subscriber]), if not IsApprover -> {error, ?ERR_FORBIDDEN}; true -> update_auth(Host, SNode, Type, NodeId, Subscriber, Allow, Subscriptions) end end, case transaction(Host, Node, Action, sync_dirty) of {error, Error} -> ejabberd_router:route( To, From, jlib:make_error_reply(Packet, Error)); {result, {_, _NewSubscription}} -> %% XXX: notify about subscription state change, section 12.11 ok; _ -> ejabberd_router:route( To, From, jlib:make_error_reply(Packet, ?ERR_INTERNAL_SERVER_ERROR)) end; _ -> ejabberd_router:route( To, From, jlib:make_error_reply(Packet, ?ERR_NOT_ACCEPTABLE)) end. update_auth(Host, Node, Type, NodeId, Subscriber, Allow, Subscriptions) -> Subscription = lists:filter(fun({pending, _}) -> true; (_) -> false end, Subscriptions), case Subscription of [{pending, SubID}] -> %% TODO does not work if several pending NewSubscription = case Allow of true -> subscribed; false -> none end, node_call(Type, set_subscriptions, [NodeId, Subscriber, NewSubscription, SubID]), send_authorization_approval(Host, Subscriber, Node, NewSubscription), {result, ok}; _ -> {error, ?ERR_UNEXPECTED_REQUEST} end. -define(XFIELD(Type, Label, Var, Val), {xmlelement, "field", [{"type", Type}, {"label", translate:translate(Lang, Label)}, {"var", Var}], [{xmlelement, "value", [], [{xmlcdata, Val}]}]}). -define(BOOLXFIELD(Label, Var, Val), ?XFIELD("boolean", Label, Var, case Val of true -> "1"; _ -> "0" end)). -define(STRINGXFIELD(Label, Var, Val), ?XFIELD("text-single", Label, Var, Val)). -define(STRINGMXFIELD(Label, Var, Vals), {xmlelement, "field", [{"type", "text-multi"}, {"label", translate:translate(Lang, Label)}, {"var", Var}], [{xmlelement, "value", [], [{xmlcdata, V}]} || V <- Vals]}). -define(XFIELDOPT(Type, Label, Var, Val, Opts), {xmlelement, "field", [{"type", Type}, {"label", translate:translate(Lang, Label)}, {"var", Var}], lists:map(fun(Opt) -> {xmlelement, "option", [], [{xmlelement, "value", [], [{xmlcdata, Opt}]}]} end, Opts) ++ [{xmlelement, "value", [], [{xmlcdata, Val}]}]}). -define(LISTXFIELD(Label, Var, Val, Opts), ?XFIELDOPT("list-single", Label, Var, Val, Opts)). -define(LISTMXFIELD(Label, Var, Vals, Opts), {xmlelement, "field", [{"type", "list-multi"}, {"label", translate:translate(Lang, Label)}, {"var", Var}], lists:map(fun(Opt) -> {xmlelement, "option", [], [{xmlelement, "value", [], [{xmlcdata, Opt}]}]} end, Opts) ++ lists:map(fun(Val) -> {xmlelement, "value", [], [{xmlcdata, Val}]} end, Vals)}). %% @spec (Host::host(), ServerHost::host(), Node::pubsubNode(), Owner::jid(), NodeType::nodeType()) -> %% {error, Reason::stanzaError()} | %% {result, []} %% @docCreate new pubsub nodes
%%In addition to method-specific error conditions, there are several general reasons why the node creation request might fail:
%%ote: node creation is a particular case, error return code is evaluated at many places:
%%Delete specified node and all childs.
%%There are several reasons why the node deletion request might fail:
%%Accepts or rejects subcription requests on a PubSub node.
%%There are several reasons why the subscription request might fail:
%%Unsubscribe JID from the Node.
%%There are several reasons why the unsubscribe request might fail:
%%Publish item to a PubSub node.
%%The permission to publish an item must be verified by the plugin implementation.
%%There are several reasons why the publish request might fail:
%%Delete item from a PubSub node.
%%The permission to delete an item must be verified by the plugin implementation.
%%There are several reasons why the item retraction request might fail:
%%Delete all items of specified node owned by JID.
%%There are several reasons why the node purge request might fail:
%%Return the items of a given node.
%%The number of items to return is limited by MaxItems.
%%The permission are not checked in this function.
%% @todo We probably need to check that the user doing the query has the right %% to read the items. get_items(Host, Node, From, SubId, SMaxItems, ItemIDs) -> MaxItems = if SMaxItems == "" -> get_max_items_node(Host); true -> case catch list_to_integer(SMaxItems) of {'EXIT', _} -> {error, ?ERR_BAD_REQUEST}; Val -> Val end end, case MaxItems of {error, Error} -> {error, Error}; _ -> Action = fun(#pubsub_node{options = Options, type = Type, id = NodeId, owners = Owners}) -> Features = features(Type), RetreiveFeature = lists:member("retrieve-items", Features), PersistentFeature = lists:member("persistent-items", Features), AccessModel = get_option(Options, access_model), AllowedGroups = get_option(Options, roster_groups_allowed, []), {PresenceSubscription, RosterGroup} = get_presence_and_roster_permissions(Host, From, Owners, AccessModel, AllowedGroups), if not RetreiveFeature -> %% Item Retrieval Not Supported {error, extended_error(?ERR_FEATURE_NOT_IMPLEMENTED, unsupported, "retrieve-items")}; not PersistentFeature -> %% Persistent Items Not Supported {error, extended_error(?ERR_FEATURE_NOT_IMPLEMENTED, unsupported, "persistent-items")}; true -> node_call(Type, get_items, [NodeId, From, AccessModel, PresenceSubscription, RosterGroup, SubId]) end end, case transaction(Host, Node, Action, sync_dirty) of {result, {_, Items}} -> SendItems = case ItemIDs of [] -> Items; _ -> lists:filter(fun(#pubsub_item{itemid = {ItemId, _}}) -> lists:member(ItemId, ItemIDs) end, Items) end, %% Generate the XML response (Item list), limiting the %% number of items sent to MaxItems: {result, [{xmlelement, "pubsub", [{"xmlns", ?NS_PUBSUB}], [{xmlelement, "items", nodeAttr(Node), itemsEls(lists:sublist(SendItems, MaxItems))}]}]}; Error -> Error end end. get_items(Host, Node) -> Action = fun(#pubsub_node{type = Type, id = NodeId}) -> node_call(Type, get_items, [NodeId, service_jid(Host)]) end, case transaction(Host, Node, Action, sync_dirty) of {result, {_, Items}} -> Items; Error -> Error end. get_item(Host, Node, ItemId) -> Action = fun(#pubsub_node{type = Type, id = NodeId}) -> node_call(Type, get_item, [NodeId, ItemId]) end, case transaction(Host, Node, Action, sync_dirty) of {result, {_, Items}} -> Items; Error -> Error end. get_allowed_items_call(Host, NodeIdx, From, Type, Options, Owners) -> AccessModel = get_option(Options, access_model), AllowedGroups = get_option(Options, roster_groups_allowed, []), {PresenceSubscription, RosterGroup} = get_presence_and_roster_permissions(Host, From, Owners, AccessModel, AllowedGroups), node_call(Type, get_items, [NodeIdx, From, AccessModel, PresenceSubscription, RosterGroup, undefined]). %% @spec (Host, Node, NodeId, Type, LJID, Number) -> any() %% Host = pubsubHost() %% Node = pubsubNode() %% NodeId = pubsubNodeId() %% Type = pubsubNodeType() %% LJID = {U, S, []} %% Number = last | integer() %% @docResend the items of a node to the user.
%% @todo use cache-last-item feature send_items(Host, Node, NodeId, Type, {U,S,R} = LJID, last) -> case get_cached_item(Host, NodeId) of undefined -> send_items(Host, Node, NodeId, Type, LJID, 1); LastItem -> {ModifNow, ModifUSR} = LastItem#pubsub_item.modification, Stanza = event_stanza_with_delay( [{xmlelement, "items", nodeAttr(Node), itemsEls([LastItem])}], ModifNow, ModifUSR), case is_tuple(Host) of false -> ejabberd_router:route(service_jid(Host), jlib:make_jid(LJID), Stanza); true -> case ejabberd_sm:get_session_pid(U,S,R) of C2SPid when is_pid(C2SPid) -> ejabberd_c2s:broadcast(C2SPid, {pep_message, binary_to_list(Node)++"+notify"}, _Sender = service_jid(Host), Stanza); _ -> ok end end end; send_items(Host, Node, NodeId, Type, {U,S,R} = LJID, Number) -> ToSend = case node_action(Host, Type, get_items, [NodeId, LJID]) of {result, []} -> []; {result, Items} -> case Number of N when N > 0 -> lists:sublist(Items, N); _ -> Items end; _ -> [] end, Stanza = case ToSend of [LastItem] -> {ModifNow, ModifUSR} = LastItem#pubsub_item.modification, event_stanza_with_delay( [{xmlelement, "items", nodeAttr(Node), itemsEls(ToSend)}], ModifNow, ModifUSR); _ -> event_stanza( [{xmlelement, "items", nodeAttr(Node), itemsEls(ToSend)}]) end, case is_tuple(Host) of false -> ejabberd_router:route(service_jid(Host), jlib:make_jid(LJID), Stanza); true -> case ejabberd_sm:get_session_pid(U,S,R) of C2SPid when is_pid(C2SPid) -> ejabberd_c2s:broadcast(C2SPid, {pep_message, binary_to_list(Node)++"+notify"}, _Sender = service_jid(Host), Stanza); _ -> ok end end. %% @spec (Host, JID, Plugins) -> {error, Reason} | {result, Response} %% Host = host() %% JID = jid() %% Plugins = [Plugin::string()] %% Reason = stanzaError() %% Response = [pubsubIQResponse()] %% @docReturn the list of affiliations as an XMPP response.
get_affiliations(Host, <<>>, JID, Plugins) when is_list(Plugins) -> Result = lists:foldl( fun(Type, {Status, Acc}) -> Features = features(Type), RetrieveFeature = lists:member("retrieve-affiliations", Features), if not RetrieveFeature -> %% Service does not support retreive affiliatons {{error, extended_error(?ERR_FEATURE_NOT_IMPLEMENTED, unsupported, "retrieve-affiliations")}, Acc}; true -> {result, Affiliations} = node_action(Host, Type, get_entity_affiliations, [Host, JID]), {Status, [Affiliations|Acc]} end end, {ok, []}, Plugins), case Result of {ok, Affiliations} -> Entities = lists:flatmap( fun({_, none}) -> []; ({#pubsub_node{nodeid = {_, Node}}, Affiliation}) -> [{xmlelement, "affiliation", [{"affiliation", affiliation_to_string(Affiliation)}|nodeAttr(Node)], []}] end, lists:usort(lists:flatten(Affiliations))), {result, [{xmlelement, "pubsub", [{"xmlns", ?NS_PUBSUB}], [{xmlelement, "affiliations", [], Entities}]}]}; {Error, _} -> Error end; get_affiliations(Host, NodeId, JID, Plugins) when is_list(Plugins) -> Result = lists:foldl( fun(Type, {Status, Acc}) -> Features = features(Type), RetrieveFeature = lists:member("retrieve-affiliations", Features), if not RetrieveFeature -> %% Service does not support retreive affiliatons {{error, extended_error(?ERR_FEATURE_NOT_IMPLEMENTED, unsupported, "retrieve-affiliations")}, Acc}; true -> {result, Affiliations} = node_action(Host, Type, get_entity_affiliations, [Host, JID]), {Status, [Affiliations|Acc]} end end, {ok, []}, Plugins), case Result of {ok, Affiliations} -> Entities = lists:flatmap( fun({_, none}) -> []; ({#pubsub_node{nodeid = {_, Node}}, Affiliation}) when NodeId == Node -> [{xmlelement, "affiliation", [{"affiliation", affiliation_to_string(Affiliation)}|nodeAttr(Node)], []}]; (_) -> [] end, lists:usort(lists:flatten(Affiliations))), {result, [{xmlelement, "pubsub", [{"xmlns", ?NS_PUBSUB}], [{xmlelement, "affiliations", [], Entities}]}]}; {Error, _} -> Error end. get_affiliations(Host, Node, JID) -> Action = fun(#pubsub_node{type = Type, id = NodeId}) -> Features = features(Type), RetrieveFeature = lists:member("modify-affiliations", Features), {result, Affiliation} = node_call(Type, get_affiliation, [NodeId, JID]), if not RetrieveFeature -> %% Service does not support modify affiliations {error, extended_error(?ERR_FEATURE_NOT_IMPLEMENTED, unsupported, "modify-affiliations")}; Affiliation /= owner -> %% Entity is not an owner {error, ?ERR_FORBIDDEN}; true -> node_call(Type, get_node_affiliations, [NodeId]) end end, case transaction(Host, Node, Action, sync_dirty) of {result, {_, []}} -> {error, ?ERR_ITEM_NOT_FOUND}; {result, {_, Affiliations}} -> Entities = lists:flatmap( fun({_, none}) -> []; ({AJID, Affiliation}) -> [{xmlelement, "affiliation", [{"jid", jlib:jid_to_string(AJID)}, {"affiliation", affiliation_to_string(Affiliation)}], []}] end, Affiliations), {result, [{xmlelement, "pubsub", [{"xmlns", ?NS_PUBSUB_OWNER}], [{xmlelement, "affiliations", nodeAttr(Node), Entities}]}]}; Error -> Error end. set_affiliations(Host, Node, From, EntitiesEls) -> Owner = jlib:jid_tolower(jlib:jid_remove_resource(From)), Entities = lists:foldl( fun(El, Acc) -> case Acc of error -> error; _ -> case El of {xmlelement, "affiliation", Attrs, _} -> JID = jlib:string_to_jid( xml:get_attr_s("jid", Attrs)), Affiliation = string_to_affiliation( xml:get_attr_s("affiliation", Attrs)), if (JID == error) or (Affiliation == false) -> error; true -> [{jlib:jid_tolower(JID), Affiliation} | Acc] end end end end, [], EntitiesEls), case Entities of error -> {error, ?ERR_BAD_REQUEST}; _ -> Action = fun(#pubsub_node{owners = Owners, type = Type, id = NodeId}=N) -> case lists:member(Owner, Owners) of true -> OwnerJID = jlib:make_jid(Owner), FilteredEntities = case Owners of [Owner] -> [E || E <- Entities, element(1, E) =/= OwnerJID]; _ -> Entities end, lists:foreach( fun({JID, Affiliation}) -> node_call(Type, set_affiliation, [NodeId, JID, Affiliation]), case Affiliation of owner -> NewOwner = jlib:jid_tolower(jlib:jid_remove_resource(JID)), NewOwners = [NewOwner|Owners], tree_call(Host, set_node, [N#pubsub_node{owners = NewOwners}]); none -> OldOwner = jlib:jid_tolower(jlib:jid_remove_resource(JID)), case lists:member(OldOwner, Owners) of true -> NewOwners = Owners--[OldOwner], tree_call(Host, set_node, [N#pubsub_node{owners = NewOwners}]); _ -> ok end; _ -> ok end end, FilteredEntities), {result, []}; _ -> {error, ?ERR_FORBIDDEN} end end, case transaction(Host, Node, Action, sync_dirty) of {result, {_, Result}} -> {result, Result}; Other -> Other end end. get_options(Host, Node, JID, SubID, Lang) -> Action = fun(#pubsub_node{type = Type, id = NodeID}) -> case lists:member("subscription-options", features(Type)) of true -> get_options_helper(JID, Lang, Node, NodeID, SubID, Type); false -> {error, extended_error( ?ERR_FEATURE_NOT_IMPLEMENTED, unsupported, "subscription-options")} end end, case transaction(Host, Node, Action, sync_dirty) of {result, {_Node, XForm}} -> {result, [XForm]}; Error -> Error end. get_options_helper(JID, Lang, Node, NodeID, SubID, Type) -> Subscriber = case jlib:string_to_jid(JID) of error -> {"", "", ""}; J -> jlib:jid_tolower(J) end, {result, Subs} = node_call(Type, get_subscriptions, [NodeID, Subscriber]), SubIDs = lists:foldl(fun({subscribed, SID}, Acc) -> [SID | Acc]; (_, Acc) -> Acc end, [], Subs), case {SubID, SubIDs} of {_, []} -> {error, extended_error(?ERR_NOT_ACCEPTABLE, "not-subscribed")}; {[], [SID]} -> read_sub(Subscriber, Node, NodeID, SID, Lang); {[], _} -> {error, extended_error(?ERR_NOT_ACCEPTABLE, "subid-required")}; {_, _} -> read_sub(Subscriber, Node, NodeID, SubID, Lang) end. read_sub(Subscriber, Node, NodeID, SubID, Lang) -> case pubsub_subscription:get_subscription(Subscriber, NodeID, SubID) of {error, notfound} -> {error, extended_error(?ERR_NOT_ACCEPTABLE, "invalid-subid")}; {result, #pubsub_subscription{options = Options}} -> {result, XdataEl} = pubsub_subscription:get_options_xform(Lang, Options), OptionsEl = {xmlelement, "options", [{"jid", jlib:jid_to_string(Subscriber)}, {"subid", SubID}|nodeAttr(Node)], [XdataEl]}, PubsubEl = {xmlelement, "pubsub", [{"xmlns", ?NS_PUBSUB}], [OptionsEl]}, {result, PubsubEl} end. set_options(Host, Node, JID, SubID, Configuration) -> Action = fun(#pubsub_node{type = Type, id = NodeID}) -> case lists:member("subscription-options", features(Type)) of true -> set_options_helper(Configuration, JID, NodeID, SubID, Type); false -> {error, extended_error( ?ERR_FEATURE_NOT_IMPLEMENTED, unsupported, "subscription-options")} end end, case transaction(Host, Node, Action, sync_dirty) of {result, {_Node, Result}} -> {result, Result}; Error -> Error end. set_options_helper(Configuration, JID, NodeID, SubID, Type) -> SubOpts = case pubsub_subscription:parse_options_xform(Configuration) of {result, GoodSubOpts} -> GoodSubOpts; _ -> invalid end, Subscriber = case jlib:string_to_jid(JID) of error -> {"", "", ""}; J -> jlib:jid_tolower(J) end, {result, Subs} = node_call(Type, get_subscriptions, [NodeID, Subscriber]), SubIDs = lists:foldl(fun({subscribed, SID}, Acc) -> [SID | Acc]; (_, Acc) -> Acc end, [], Subs), case {SubID, SubIDs} of {_, []} -> {error, extended_error(?ERR_NOT_ACCEPTABLE, "not-subscribed")}; {[], [SID]} -> write_sub(Subscriber, NodeID, SID, SubOpts); {[], _} -> {error, extended_error(?ERR_NOT_ACCEPTABLE, "subid-required")}; {_, _} -> write_sub(Subscriber, NodeID, SubID, SubOpts) end. write_sub(_Subscriber, _NodeID, _SubID, invalid) -> {error, extended_error(?ERR_BAD_REQUEST, "invalid-options")}; write_sub(Subscriber, NodeID, SubID, Options) -> case pubsub_subscription:set_subscription(Subscriber, NodeID, SubID, Options) of {error, notfound} -> {error, extended_error(?ERR_NOT_ACCEPTABLE, "invalid-subid")}; {result, _} -> {result, []} end. %% @spec (Host, Node, JID, Plugins) -> {error, Reason} | {result, Response} %% Host = host() %% Node = pubsubNode() %% JID = jid() %% Plugins = [Plugin::string()] %% Reason = stanzaError() %% Response = [pubsubIQResponse()] %% @docReturn the list of subscriptions as an XMPP response.
get_subscriptions(Host, Node, JID, Plugins) when is_list(Plugins) -> Result = lists:foldl( fun(Type, {Status, Acc}) -> Features = features(Type), RetrieveFeature = lists:member("retrieve-subscriptions", Features), if not RetrieveFeature -> %% Service does not support retreive subscriptions {{error, extended_error(?ERR_FEATURE_NOT_IMPLEMENTED, unsupported, "retrieve-subscriptions")}, Acc}; true -> Subscriber = jlib:jid_remove_resource(JID), {result, Subscriptions} = node_action(Host, Type, get_entity_subscriptions, [Host, Subscriber]), {Status, [Subscriptions|Acc]} end end, {ok, []}, Plugins), case Result of {ok, Subscriptions} -> Entities = lists:flatmap( fun({_, none}) -> []; ({#pubsub_node{nodeid = {_, SubsNode}}, Subscription}) -> case Node of <<>> -> [{xmlelement, "subscription", [{"subscription", subscription_to_string(Subscription)}|nodeAttr(SubsNode)], []}]; SubsNode -> [{xmlelement, "subscription", [{"subscription", subscription_to_string(Subscription)}], []}]; _ -> [] end; ({_, none, _}) -> []; ({#pubsub_node{nodeid = {_, SubsNode}}, Subscription, SubID, SubJID}) -> case Node of <<>> -> [{xmlelement, "subscription", [{"jid", jlib:jid_to_string(SubJID)}, {"subid", SubID}, {"subscription", subscription_to_string(Subscription)}|nodeAttr(SubsNode)], []}]; SubsNode -> [{xmlelement, "subscription", [{"jid", jlib:jid_to_string(SubJID)}, {"subid", SubID}, {"subscription", subscription_to_string(Subscription)}], []}]; _ -> [] end; ({#pubsub_node{nodeid = {_, SubsNode}}, Subscription, SubJID}) -> case Node of <<>> -> [{xmlelement, "subscription", [{"jid", jlib:jid_to_string(SubJID)}, {"subscription", subscription_to_string(Subscription)}|nodeAttr(SubsNode)], []}]; SubsNode -> [{xmlelement, "subscription", [{"jid", jlib:jid_to_string(SubJID)}, {"subscription", subscription_to_string(Subscription)}], []}]; _ -> [] end end, lists:usort(lists:flatten(Subscriptions))), {result, [{xmlelement, "pubsub", [{"xmlns", ?NS_PUBSUB}], [{xmlelement, "subscriptions", [], Entities}]}]}; {Error, _} -> Error end. get_subscriptions(Host, Node, JID) -> Action = fun(#pubsub_node{type = Type, id = NodeId}) -> Features = features(Type), RetrieveFeature = lists:member("manage-subscriptions", Features), {result, Affiliation} = node_call(Type, get_affiliation, [NodeId, JID]), if not RetrieveFeature -> %% Service does not support manage subscriptions {error, extended_error(?ERR_FEATURE_NOT_IMPLEMENTED, unsupported, "manage-subscriptions")}; Affiliation /= owner -> %% Entity is not an owner {error, ?ERR_FORBIDDEN}; true -> node_call(Type, get_node_subscriptions, [NodeId]) end end, case transaction(Host, Node, Action, sync_dirty) of {result, {_, Subscriptions}} -> Entities = lists:flatmap( fun({_, none}) -> []; ({_, pending, _}) -> []; ({AJID, Subscription}) -> [{xmlelement, "subscription", [{"jid", jlib:jid_to_string(AJID)}, {"subscription", subscription_to_string(Subscription)}], []}]; ({AJID, Subscription, SubId}) -> [{xmlelement, "subscription", [{"jid", jlib:jid_to_string(AJID)}, {"subscription", subscription_to_string(Subscription)}, {"subid", SubId}], []}] end, Subscriptions), {result, [{xmlelement, "pubsub", [{"xmlns", ?NS_PUBSUB_OWNER}], [{xmlelement, "subscriptions", nodeAttr(Node), Entities}]}]}; Error -> Error end. set_subscriptions(Host, Node, From, EntitiesEls) -> Owner = jlib:jid_tolower(jlib:jid_remove_resource(From)), Entities = lists:foldl( fun(El, Acc) -> case Acc of error -> error; _ -> case El of {xmlelement, "subscription", Attrs, _} -> JID = jlib:string_to_jid( xml:get_attr_s("jid", Attrs)), Subscription = string_to_subscription( xml:get_attr_s("subscription", Attrs)), SubId = xml:get_attr_s("subid", Attrs), if (JID == error) or (Subscription == false) -> error; true -> [{jlib:jid_tolower(JID), Subscription, SubId} | Acc] end end end end, [], EntitiesEls), case Entities of error -> {error, ?ERR_BAD_REQUEST}; _ -> Notify = fun(JID, Sub, _SubId) -> Stanza = {xmlelement, "message", [], [{xmlelement, "pubsub", [{"xmlns", ?NS_PUBSUB}], [{xmlelement, "subscription", [{"jid", jlib:jid_to_string(JID)}, %{"subid", SubId}, {"subscription", subscription_to_string(Sub)} | nodeAttr(Node)], []}]}]}, ejabberd_router:route(service_jid(Host), jlib:make_jid(JID), Stanza) end, Action = fun(#pubsub_node{owners = Owners, type = Type, id = NodeId}) -> case lists:member(Owner, Owners) of true -> Result = lists:foldl(fun({JID, Subscription, SubId}, Acc) -> case node_call(Type, set_subscriptions, [NodeId, JID, Subscription, SubId]) of {error, Err} -> [{error, Err} | Acc]; _ -> Notify(JID, Subscription, SubId), Acc end end, [], Entities), case Result of [] -> {result, []}; _ -> {error, ?ERR_NOT_ACCEPTABLE} end; _ -> {error, ?ERR_FORBIDDEN} end end, case transaction(Host, Node, Action, sync_dirty) of {result, {_, Result}} -> {result, Result}; Other -> Other end end. get_presence_and_roster_permissions(Host, From, Owners, AccessModel, AllowedGroups) -> if (AccessModel == presence) or (AccessModel == roster) -> case Host of {User, Server, _} -> get_roster_info(User, Server, From, AllowedGroups); _ -> [{OUser, OServer, _}|_] = Owners, get_roster_info(OUser, OServer, From, AllowedGroups) end; true -> {true, true} end. %% @spec (OwnerUser, OwnerServer, {SubscriberUser, SubscriberServer, SubscriberResource}, AllowedGroups) %% -> {PresenceSubscription, RosterGroup} get_roster_info(_, _, {"", "", _}, _) -> {false, false}; get_roster_info(OwnerUser, OwnerServer, {SubscriberUser, SubscriberServer, _}, AllowedGroups) -> {Subscription, Groups} = ejabberd_hooks:run_fold( roster_get_jid_info, OwnerServer, {none, []}, [OwnerUser, OwnerServer, {SubscriberUser, SubscriberServer, ""}]), PresenceSubscription = (Subscription == both) orelse (Subscription == from) orelse ({OwnerUser, OwnerServer} == {SubscriberUser, SubscriberServer}), RosterGroup = lists:any(fun(Group) -> lists:member(Group, AllowedGroups) end, Groups), {PresenceSubscription, RosterGroup}; get_roster_info(OwnerUser, OwnerServer, JID, AllowedGroups) -> get_roster_info(OwnerUser, OwnerServer, jlib:jid_tolower(JID), AllowedGroups). %% @spec (AffiliationStr) -> Affiliation %% AffiliationStr = string() %% Affiliation = atom() %% @docConvert an affiliation type from string to atom.
string_to_affiliation("owner") -> owner; string_to_affiliation("publisher") -> publisher; string_to_affiliation("member") -> member; string_to_affiliation("outcast") -> outcast; string_to_affiliation("none") -> none; string_to_affiliation(_) -> false. %% @spec (SubscriptionStr) -> Subscription %% SubscriptionStr = string() %% Subscription = atom() %% @docConvert a subscription type from string to atom.
string_to_subscription("subscribed") -> subscribed; string_to_subscription("pending") -> pending; string_to_subscription("unconfigured") -> unconfigured; string_to_subscription("none") -> none; string_to_subscription(_) -> false. %% @spec (Affiliation) -> AffiliationStr %% Affiliation = atom() %% AffiliationStr = string() %% @docConvert an affiliation type from atom to string.
affiliation_to_string(owner) -> "owner"; affiliation_to_string(publisher) -> "publisher"; affiliation_to_string(member) -> "member"; affiliation_to_string(outcast) -> "outcast"; affiliation_to_string(_) -> "none". %% @spec (Subscription) -> SubscriptionStr %% Subscription = atom() %% SubscriptionStr = string() %% @docConvert a subscription type from atom to string.
subscription_to_string(subscribed) -> "subscribed"; subscription_to_string(pending) -> "pending"; subscription_to_string(unconfigured) -> "unconfigured"; subscription_to_string(_) -> "none". %% @spec (Node) -> NodeStr %% Node = pubsubNode() %% NodeStr = string() %% @docConvert a node type from pubsubNode to string.
node_to_string(Node) -> binary_to_list(Node). string_to_node(SNode) -> list_to_binary(SNode). %% @spec (Host) -> jid() %% Host = host() %% @docGenerate pubsub service JID.
service_jid(Host) -> case Host of {U,S,_} -> {jid, U, S, "", U, S, ""}; _ -> {jid, "", Host, "", "", Host, ""} end. %% @spec (LJID, NotifyType, Depth, NodeOptions, SubOptions) -> boolean() %% LJID = jid() %% NotifyType = items | nodes %% Depth = integer() %% NodeOptions = [{atom(), term()}] %% SubOptions = [{atom(), term()}] %% @docCheck if a notification must be delivered or not based on %% node and subscription options.
is_to_deliver(LJID, NotifyType, Depth, NodeOptions, SubOptions) -> sub_to_deliver(LJID, NotifyType, Depth, SubOptions) andalso node_to_deliver(LJID, NodeOptions). sub_to_deliver(_LJID, NotifyType, Depth, SubOptions) -> lists:all(fun (Option) -> sub_option_can_deliver(NotifyType, Depth, Option) end, SubOptions). sub_option_can_deliver(items, _, {subscription_type, nodes}) -> false; sub_option_can_deliver(nodes, _, {subscription_type, items}) -> false; sub_option_can_deliver(_, _, {subscription_depth, all}) -> true; sub_option_can_deliver(_, Depth, {subscription_depth, D}) -> Depth =< D; sub_option_can_deliver(_, _, {deliver, false}) -> false; sub_option_can_deliver(_, _, {expire, When}) -> now() < When; sub_option_can_deliver(_, _, _) -> true. node_to_deliver(LJID, NodeOptions) -> PresenceDelivery = get_option(NodeOptions, presence_based_delivery), presence_can_deliver(LJID, PresenceDelivery). presence_can_deliver(_, false) -> true; presence_can_deliver({User, Server, Resource}, true) -> case mnesia:dirty_match_object({session, '_', '_', {User, Server}, '_', '_'}) of [] -> false; Ss -> lists:foldl(fun(_, true) -> true; ({session, _, _ , _, undefined, _}, _Acc) -> false; ({session, _, {_, _, R}, _, _Priority, _}, _Acc) -> case Resource of [] -> true; R -> true; _ -> false end end, false, Ss) end. state_can_deliver({U, S, R}, []) -> [{U, S, R}]; state_can_deliver({U, S, R}, SubOptions) -> %% Check SubOptions for 'show_values' case lists:keysearch('show_values', 1, SubOptions) of %% If not in suboptions, item can be delivered, case doesn't apply false -> [{U, S, R}]; %% If in a suboptions ... {_, {_, ShowValues}} -> %% Get subscriber resources Resources = case R of %% If the subscriber JID is a bare one, get all its resources [] -> user_resources(U, S); %% If the subscriber JID is a full one, use its resource R -> [R] end, %% For each resource, test if the item is allowed to be delivered %% based on resource state lists:foldl( fun(Resource, Acc) -> get_resource_state({U, S, Resource}, ShowValues, Acc) end, [], Resources) end. get_resource_state({U, S, R}, ShowValues, JIDs) -> %% Get user session PID case ejabberd_sm:get_session_pid(U, S, R) of %% If no PID, item can be delivered none -> lists:append([{U, S, R}], JIDs); %% If PID ... Pid -> %% Get user resource state %% TODO : add a catch clause Show = case ejabberd_c2s:get_presence(Pid) of {_, _, "available", _} -> "online"; {_, _, State, _} -> State end, %% Is current resource state listed in 'show-values' suboption ? case lists:member(Show, ShowValues) of %andalso Show =/= "online" of %% If yes, item can be delivered true -> lists:append([{U, S, R}], JIDs); %% If no, item can't be delivered false -> JIDs end end. %% @spec (Payload) -> int() %% Payload = term() %% @docCount occurence of XML elements in payload.
payload_xmlelements(Payload) -> payload_xmlelements(Payload, 0). payload_xmlelements([], Count) -> Count; payload_xmlelements([{xmlelement, _, _, _}|Tail], Count) -> payload_xmlelements(Tail, Count+1); payload_xmlelements([_|Tail], Count) -> payload_xmlelements(Tail, Count). %% @spec (Els) -> stanza() %% Els = [xmlelement()] %% @docBuild pubsub event stanza
event_stanza(Els) -> event_stanza_withmoreels(Els, []). event_stanza_with_delay(Els, ModifNow, ModifUSR) -> DateTime = calendar:now_to_datetime(ModifNow), MoreEls = [jlib:timestamp_to_xml(DateTime, utc, ModifUSR, "")], event_stanza_withmoreels(Els, MoreEls). event_stanza_withmoreels(Els, MoreEls) -> {xmlelement, "message", [], [{xmlelement, "event", [{"xmlns", ?NS_PUBSUB_EVENT}], Els} | MoreEls]}. %%%%%% broadcast functions broadcast_publish_item(Host, Node, NodeId, Type, NodeOptions, Removed, ItemId, From, Payload) -> case get_collection_subscriptions(Host, Node) of SubsByDepth when is_list(SubsByDepth) -> Content = case get_option(NodeOptions, deliver_payloads) of true -> Payload; false -> [] end, Stanza = event_stanza( [{xmlelement, "items", nodeAttr(Node), [{xmlelement, "item", itemAttr(ItemId), Content}]}]), broadcast_stanza(Host, From, Node, NodeId, Type, NodeOptions, SubsByDepth, items, Stanza, true), case Removed of [] -> ok; _ -> case get_option(NodeOptions, notify_retract) of true -> RetractStanza = event_stanza( [{xmlelement, "items", nodeAttr(Node), [{xmlelement, "retract", itemAttr(RId), []} || RId <- Removed]}]), broadcast_stanza(Host, Node, NodeId, Type, NodeOptions, SubsByDepth, items, RetractStanza, true); _ -> ok end end, {result, true}; _ -> {result, false} end. broadcast_retract_items(Host, Node, NodeId, Type, NodeOptions, ItemIds) -> broadcast_retract_items(Host, Node, NodeId, Type, NodeOptions, ItemIds, false). broadcast_retract_items(_Host, _Node, _NodeId, _Type, _NodeOptions, [], _ForceNotify) -> {result, false}; broadcast_retract_items(Host, Node, NodeId, Type, NodeOptions, ItemIds, ForceNotify) -> case (get_option(NodeOptions, notify_retract) or ForceNotify) of true -> case get_collection_subscriptions(Host, Node) of SubsByDepth when is_list(SubsByDepth) -> Stanza = event_stanza( [{xmlelement, "items", nodeAttr(Node), [{xmlelement, "retract", itemAttr(ItemId), []} || ItemId <- ItemIds]}]), broadcast_stanza(Host, Node, NodeId, Type, NodeOptions, SubsByDepth, items, Stanza, true), {result, true}; _ -> {result, false} end; _ -> {result, false} end. broadcast_purge_node(Host, Node, NodeId, Type, NodeOptions) -> case get_option(NodeOptions, notify_retract) of true -> case get_collection_subscriptions(Host, Node) of SubsByDepth when is_list(SubsByDepth) -> Stanza = event_stanza( [{xmlelement, "purge", nodeAttr(Node), []}]), broadcast_stanza(Host, Node, NodeId, Type, NodeOptions, SubsByDepth, nodes, Stanza, false), {result, true}; _ -> {result, false} end; _ -> {result, false} end. broadcast_removed_node(Host, Node, NodeId, Type, NodeOptions, SubsByDepth) -> case get_option(NodeOptions, notify_delete) of true -> case SubsByDepth of [] -> {result, false}; _ -> Stanza = event_stanza( [{xmlelement, "delete", nodeAttr(Node), []}]), broadcast_stanza(Host, Node, NodeId, Type, NodeOptions, SubsByDepth, nodes, Stanza, false), {result, true} end; _ -> {result, false} end. broadcast_created_node(_, _, _, _, _, []) -> {result, false}; broadcast_created_node(Host, Node, NodeId, Type, NodeOptions, SubsByDepth) -> Stanza = event_stanza([{xmlelement, "create", nodeAttr(Node), []}]), broadcast_stanza(Host, Node, NodeId, Type, NodeOptions, SubsByDepth, nodes, Stanza, true), {result, true}. broadcast_config_notification(Host, Node, NodeId, Type, NodeOptions, Lang) -> case get_option(NodeOptions, notify_config) of true -> case get_collection_subscriptions(Host, Node) of SubsByDepth when is_list(SubsByDepth) -> Content = case get_option(NodeOptions, deliver_payloads) of true -> [{xmlelement, "x", [{"xmlns", ?NS_XDATA}, {"type", "result"}], get_configure_xfields(Type, NodeOptions, Lang, [])}]; false -> [] end, Stanza = event_stanza( [{xmlelement, "configuration", nodeAttr(Node), Content}]), broadcast_stanza(Host, Node, NodeId, Type, NodeOptions, SubsByDepth, nodes, Stanza, false), {result, true}; _ -> {result, false} end; _ -> {result, false} end. get_collection_subscriptions(Host, Node) -> Action = fun() -> {result, lists:map(fun({Depth, Nodes}) -> {Depth, [{N, get_node_subs(N)} || N <- Nodes]} end, tree_call(Host, get_parentnodes_tree, [Host, Node, service_jid(Host)]))} end, case transaction(Action, sync_dirty) of {result, CollSubs} -> CollSubs; _ -> [] end. get_node_subs(#pubsub_node{type = Type, id = NodeID}) -> case node_call(Type, get_node_subscriptions, [NodeID]) of {result, Subs} -> get_options_for_subs(NodeID, Subs); Other -> Other end. get_options_for_subs(NodeID, Subs) -> lists:foldl(fun({JID, subscribed, SubID}, Acc) -> case pubsub_subscription:read_subscription(JID, NodeID, SubID) of {error, notfound} -> [{JID, SubID, []} | Acc]; #pubsub_subscription{options = Options} -> [{JID, SubID, Options} | Acc]; _ -> Acc end; (_, Acc) -> Acc end, [], Subs). broadcast_stanza(Host, _Node, _NodeId, _Type, NodeOptions, SubsByDepth, NotifyType, BaseStanza, SHIM) -> NotificationType = get_option(NodeOptions, notification_type, headline), BroadcastAll = get_option(NodeOptions, broadcast_all_resources), %% XXX this is not standard, but usefull From = service_jid(Host), Stanza = case NotificationType of normal -> BaseStanza; MsgType -> add_message_type(BaseStanza, atom_to_list(MsgType)) end, %% Handles explicit subscriptions SubIDsByJID = subscribed_nodes_by_jid(NotifyType, SubsByDepth), lists:foreach(fun ({LJID, NodeName, SubIDs}) -> LJIDs = case BroadcastAll of true -> {U, S, _} = LJID, [{U, S, R} || R <- user_resources(U, S)]; false -> [LJID] end, %% Determine if the stanza should have SHIM ('SubID' and 'name') headers StanzaToSend = case {SHIM, SubIDs} of {false, _} -> Stanza; %% If there's only one SubID, don't add it {true, [_]} -> add_shim_headers(Stanza, collection_shim(NodeName)); {true, SubIDs} -> add_shim_headers(Stanza, lists:append(collection_shim(NodeName), subid_shim(SubIDs))) end, lists:foreach(fun(To) -> ejabberd_router:route(From, jlib:make_jid(To), StanzaToSend) end, LJIDs) end, SubIDsByJID). broadcast_stanza({LUser, LServer, LResource}, Publisher, Node, NodeId, Type, NodeOptions, SubsByDepth, NotifyType, BaseStanza, SHIM) -> broadcast_stanza({LUser, LServer, LResource}, Node, NodeId, Type, NodeOptions, SubsByDepth, NotifyType, BaseStanza, SHIM), %% Handles implicit presence subscriptions SenderResource = case LResource of [] -> case user_resources(LUser, LServer) of [Resource|_] -> Resource; _ -> "" end; _ -> LResource end, case ejabberd_sm:get_session_pid(LUser, LServer, SenderResource) of C2SPid when is_pid(C2SPid) -> Stanza = case get_option(NodeOptions, notification_type, headline) of normal -> BaseStanza; MsgType -> add_message_type(BaseStanza, atom_to_list(MsgType)) end, %% set the from address on the notification to the bare JID of the account owner %% Also, add "replyto" if entity has presence subscription to the account owner %% See XEP-0163 1.1 section 4.3.1 ejabberd_c2s:broadcast(C2SPid, {pep_message, binary_to_list(Node)++"+notify"}, _Sender = jlib:make_jid(LUser, LServer, ""), _StanzaToSend = add_extended_headers(Stanza, _ReplyTo = extended_headers([jlib:jid_to_string(Publisher)]))); _ -> ?DEBUG("~p@~p has no session; can't deliver ~p to contacts", [LUser, LServer, BaseStanza]) end; broadcast_stanza(Host, _Publisher, Node, NodeId, Type, NodeOptions, SubsByDepth, NotifyType, BaseStanza, SHIM) -> broadcast_stanza(Host, Node, NodeId, Type, NodeOptions, SubsByDepth, NotifyType, BaseStanza, SHIM). subscribed_nodes_by_jid(NotifyType, SubsByDepth) -> NodesToDeliver = fun(Depth, Node, Subs, Acc) -> NodeName = case Node#pubsub_node.nodeid of {_, N} -> N; Other -> Other end, NodeOptions = Node#pubsub_node.options, lists:foldl(fun({LJID, SubID, SubOptions}, {JIDs, Recipients}) -> case is_to_deliver(LJID, NotifyType, Depth, NodeOptions, SubOptions) of true -> %% If is to deliver : case state_can_deliver(LJID, SubOptions) of [] -> {JIDs, Recipients}; JIDsToDeliver -> lists:foldl( fun(JIDToDeliver, {JIDsAcc, RecipientsAcc}) -> case lists:member(JIDToDeliver, JIDs) of %% check if the JIDs co-accumulator contains the Subscription Jid, false -> %% - if not, %% - add the Jid to JIDs list co-accumulator ; %% - create a tuple of the Jid, NodeId, and SubID (as list), %% and add the tuple to the Recipients list co-accumulator {[JIDToDeliver | JIDsAcc], [{JIDToDeliver, NodeName, [SubID]} | RecipientsAcc]}; true -> %% - if the JIDs co-accumulator contains the Jid %% get the tuple containing the Jid from the Recipient list co-accumulator {_, {JIDToDeliver, NodeName1, SubIDs}} = lists:keysearch(JIDToDeliver, 1, RecipientsAcc), %% delete the tuple from the Recipients list % v1 : Recipients1 = lists:keydelete(LJID, 1, Recipients), % v2 : Recipients1 = lists:keyreplace(LJID, 1, Recipients, {LJID, NodeId1, [SubID | SubIDs]}), %% add the SubID to the SubIDs list in the tuple, %% and add the tuple back to the Recipients list co-accumulator % v1.1 : {JIDs, lists:append(Recipients1, [{LJID, NodeId1, lists:append(SubIDs, [SubID])}])} % v1.2 : {JIDs, [{LJID, NodeId1, [SubID | SubIDs]} | Recipients1]} % v2: {JIDs, Recipients1} {JIDsAcc, lists:keyreplace(JIDToDeliver, 1, RecipientsAcc, {JIDToDeliver, NodeName1, [SubID | SubIDs]})} end end, {JIDs, Recipients}, JIDsToDeliver) end; false -> {JIDs, Recipients} end end, Acc, Subs) end, DepthsToDeliver = fun({Depth, SubsByNode}, Acc1) -> lists:foldl(fun({Node, Subs}, Acc2) -> NodesToDeliver(Depth, Node, Subs, Acc2) end, Acc1, SubsByNode) end, {_, JIDSubs} = lists:foldl(DepthsToDeliver, {[], []}, SubsByDepth), JIDSubs. user_resources(User, Server) -> ejabberd_sm:get_user_resources(User, Server). %%%%%%% Configuration handling %%There are several reasons why the default node configuration options request might fail:
%%Return the maximum number of items for a given node.
%%Unlimited means that there is no limit in the number of items that can %% be stored.
%% @todo In practice, the current data structure means that we cannot manage %% millions of items on a given node. This should be addressed in a new %% version. max_items(Host, Options) -> case get_option(Options, persist_items) of true -> case get_option(Options, max_items) of false -> unlimited; Result when (Result < 0) -> 0; Result -> Result end; false -> case get_option(Options, send_last_published_item) of never -> 0; _ -> case is_last_item_cache_enabled(Host) of true -> 0; false -> 1 end end end. -define(BOOL_CONFIG_FIELD(Label, Var), ?BOOLXFIELD(Label, "pubsub#" ++ atom_to_list(Var), get_option(Options, Var))). -define(STRING_CONFIG_FIELD(Label, Var), ?STRINGXFIELD(Label, "pubsub#" ++ atom_to_list(Var), get_option(Options, Var, ""))). -define(INTEGER_CONFIG_FIELD(Label, Var), ?STRINGXFIELD(Label, "pubsub#" ++ atom_to_list(Var), integer_to_list(get_option(Options, Var)))). -define(JLIST_CONFIG_FIELD(Label, Var, Opts), ?LISTXFIELD(Label, "pubsub#" ++ atom_to_list(Var), jlib:jid_to_string(get_option(Options, Var)), [jlib:jid_to_string(O) || O <- Opts])). -define(ALIST_CONFIG_FIELD(Label, Var, Opts), ?LISTXFIELD(Label, "pubsub#" ++ atom_to_list(Var), atom_to_list(get_option(Options, Var)), [atom_to_list(O) || O <- Opts])). -define(LISTM_CONFIG_FIELD(Label, Var, Opts), ?LISTMXFIELD(Label, "pubsub#" ++ atom_to_list(Var), get_option(Options, Var), Opts)). -define(NLIST_CONFIG_FIELD(Label, Var), ?STRINGMXFIELD(Label, "pubsub#" ++ atom_to_list(Var), [node_to_string(N) || N <- get_option(Options, Var, [])])). get_configure_xfields(_Type, Options, Lang, Groups) -> [?XFIELD("hidden", "", "FORM_TYPE", ?NS_PUBSUB_NODE_CONFIG), ?BOOL_CONFIG_FIELD("Deliver payloads with event notifications", deliver_payloads), ?BOOL_CONFIG_FIELD("Deliver event notifications", deliver_notifications), ?BOOL_CONFIG_FIELD("Notify subscribers when the node configuration changes", notify_config), ?BOOL_CONFIG_FIELD("Notify subscribers when the node is deleted", notify_delete), ?BOOL_CONFIG_FIELD("Notify subscribers when items are removed from the node", notify_retract), ?BOOL_CONFIG_FIELD("Persist items to storage", persist_items), ?STRING_CONFIG_FIELD("A friendly name for the node", title), ?INTEGER_CONFIG_FIELD("Max # of items to persist", max_items), ?BOOL_CONFIG_FIELD("Whether to allow subscriptions", subscribe), ?ALIST_CONFIG_FIELD("Specify the access model", access_model, [open, authorize, presence, roster, whitelist]), %% XXX: change to list-multi, include current roster groups as options ?LISTM_CONFIG_FIELD("Roster groups allowed to subscribe", roster_groups_allowed, Groups), ?ALIST_CONFIG_FIELD("Specify the publisher model", publish_model, [publishers, subscribers, open]), ?BOOL_CONFIG_FIELD("Purge all items when the relevant publisher goes offline", purge_offline), ?ALIST_CONFIG_FIELD("Specify the event message type", notification_type, [headline, normal]), ?INTEGER_CONFIG_FIELD("Max payload size in bytes", max_payload_size), ?ALIST_CONFIG_FIELD("When to send the last published item", send_last_published_item, [never, on_sub, on_sub_and_presence]), ?BOOL_CONFIG_FIELD("Only deliver notifications to available users", presence_based_delivery), ?NLIST_CONFIG_FIELD("The collections with which a node is affiliated", collection) ]. %%There are several reasons why the node configuration request might fail:
%%node tree plugin call.
tree_call({_User, Server, _Resource}, Function, Args) -> tree_call(Server, Function, Args); tree_call(Host, Function, Args) -> ?DEBUG("tree_call ~p ~p ~p",[Host, Function, Args]), Module = case catch ets:lookup(gen_mod:get_module_proc(Host, config), nodetree) of [{nodetree, N}] -> N; _ -> list_to_atom(?TREE_PREFIX ++ ?STDTREE) end, catch apply(Module, Function, Args). tree_action(Host, Function, Args) -> ?DEBUG("tree_action ~p ~p ~p",[Host,Function,Args]), Fun = fun() -> tree_call(Host, Function, Args) end, catch mnesia:sync_dirty(Fun). %% @docnode plugin call.
node_call(Type, Function, Args) -> ?DEBUG("node_call ~p ~p ~p",[Type, Function, Args]), Module = list_to_atom(?PLUGIN_PREFIX++Type), case apply(Module, Function, Args) of {result, Result} -> {result, Result}; {error, Error} -> {error, Error}; {'EXIT', {undef, Undefined}} -> case Type of ?STDNODE -> {error, {undef, Undefined}}; _ -> node_call(?STDNODE, Function, Args) end; {'EXIT', Reason} -> {error, Reason}; Result -> {result, Result} %% any other return value is forced as result end. node_action(Host, Type, Function, Args) -> ?DEBUG("node_action ~p ~p ~p ~p",[Host,Type,Function,Args]), transaction(fun() -> node_call(Type, Function, Args) end, sync_dirty). %% @docplugin transaction handling.
transaction(Host, Node, Action, Trans) -> transaction(fun() -> case tree_call(Host, get_node, [Host, Node]) of N when is_record(N, pubsub_node) -> case Action(N) of {result, Result} -> {result, {N, Result}}; {atomic, {result, Result}} -> {result, {N, Result}}; Other -> Other end; Error -> Error end end, Trans). transaction(Host, Action, Trans) -> transaction(fun() -> {result, lists:foldl(Action, [], tree_call(Host, get_nodes, [Host]))} end, Trans). transaction(Fun, Trans) -> case catch mnesia:Trans(Fun) of {result, Result} -> {result, Result}; {error, Error} -> {error, Error}; {atomic, {result, Result}} -> {result, Result}; {atomic, {error, Error}} -> {error, Error}; {aborted, Reason} -> ?ERROR_MSG("transaction return internal error: ~p~n", [{aborted, Reason}]), {error, ?ERR_INTERNAL_SERVER_ERROR}; {'EXIT', Reason} -> ?ERROR_MSG("transaction return internal error: ~p~n", [{'EXIT', Reason}]), {error, ?ERR_INTERNAL_SERVER_ERROR}; Other -> ?ERROR_MSG("transaction return internal error: ~p~n", [Other]), {error, ?ERR_INTERNAL_SERVER_ERROR} end. %%%% helpers %% Add pubsub-specific error element extended_error(Error, Ext) -> extended_error(Error, Ext, [{"xmlns", ?NS_PUBSUB_ERRORS}]). extended_error(Error, unsupported, Feature) -> extended_error(Error, "unsupported", [{"xmlns", ?NS_PUBSUB_ERRORS}, {"feature", Feature}]); extended_error({xmlelement, Error, Attrs, SubEls}, Ext, ExtAttrs) -> {xmlelement, Error, Attrs, lists:reverse([{xmlelement, Ext, ExtAttrs, []} | SubEls])}. %% Give a uniq identifier uniqid() -> {T1, T2, T3} = now(), lists:flatten(io_lib:fwrite("~.16B~.16B~.16B", [T1, T2, T3])). % node attributes nodeAttr(Node) when is_list(Node) -> [{"node", Node}]; nodeAttr(Node) -> [{"node", node_to_string(Node)}]. % item attributes itemAttr([]) -> []; itemAttr(ItemId) -> [{"id", ItemId}]. % build item elements from item list itemsEls(Items) -> lists:map(fun(#pubsub_item{itemid = {ItemId, _}, payload = Payload}) -> {xmlelement, "item", itemAttr(ItemId), Payload} end, Items). add_message_type({xmlelement, "message", Attrs, Els}, Type) -> {xmlelement, "message", [{"type", Type}|Attrs], Els}; add_message_type(XmlEl, _Type) -> XmlEl. %% Place ofGenerate pubsub service JID.
service_jid(Host) -> case Host of {U,S,_} -> {jid, U, S, "", U, S, ""}; _ -> {jid, "", Host, "", "", Host, ""} end. ejabberd-2.1.11/src/mod_pubsub/gen_pubsub_node.erl 0000664 0000000 0000000 00000004667 12240230175 017023 0 ustar %%% ==================================================================== %%% ``The contents of this file are subject to the Erlang Public License, %%% Version 1.1, (the "License"); you may not use this file except in %%% compliance with the License. You should have received a copy of the %%% Erlang Public License along with this software. If not, it can be %%% retrieved via the world wide web at http://www.erlang.org/. %%% %%% Software distributed under the License is distributed on an "AS IS" %%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See %%% the License for the specific language governing rights and limitations %%% under the License. %%% %%% The Initial Developer of the Original Code is ProcessOne. %%% Portions created by ProcessOne are Copyright 2006-2012, ProcessOne %%% All Rights Reserved.'' %%% This software is copyright 2006-2012, ProcessOne. %%% %%% %%% @copyright 2006-2012 ProcessOne %%% @author Christophe RomainThe module {@module} defines the PubSub node %%% plugin behaviour. This behaviour is used to check that a PubSub plugin %%% respects the current ejabberd PubSub plugin API.
-module(gen_pubsub_node). -export([behaviour_info/1]). %% @spec (Query::atom()) -> Callbacks | atom() %% Callbacks = [{Function,Arity}] %% Function = atom() %% Arity = integer() %% @doc Behaviour definition behaviour_info(callbacks) -> [{init, 3}, {terminate, 2}, {options, 0}, {features, 0}, {create_node_permission, 6}, {create_node, 2}, {delete_node, 1}, {purge_node, 2}, {subscribe_node, 8}, {unsubscribe_node, 4}, {publish_item, 6}, {delete_item, 4}, {remove_extra_items, 3}, {get_node_affiliations, 1}, {get_entity_affiliations, 2}, {get_affiliation, 2}, {set_affiliation, 3}, {get_node_subscriptions, 1}, {get_entity_subscriptions, 2}, {get_subscriptions, 2}, {set_subscriptions, 4}, {get_pending_nodes, 2}, {get_states, 1}, {get_state, 2}, {set_state, 1}, {get_items, 6}, {get_items, 2}, {get_item, 7}, {get_item, 2}, {set_item, 1}, {get_item_name, 3}, {node_to_path, 1}, {path_to_node, 1} ]; behaviour_info(_Other) -> undefined. ejabberd-2.1.11/src/mod_pubsub/node_dispatch.erl 0000664 0000000 0000000 00000013744 12240230175 016465 0 ustar %%% ==================================================================== %%% ``The contents of this file are subject to the Erlang Public License, %%% Version 1.1, (the "License"); you may not use this file except in %%% compliance with the License. You should have received a copy of the %%% Erlang Public License along with this software. If not, it can be %%% retrieved via the world wide web at http://www.erlang.org/. %%% %%% Software distributed under the License is distributed on an "AS IS" %%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See %%% the License for the specific language governing rights and limitations %%% under the License. %%% %%% The Initial Developer of the Original Code is ProcessOne. %%% Portions created by ProcessOne are Copyright 2006-2012, ProcessOne %%% All Rights Reserved.'' %%% This software is copyright 2006-2012, ProcessOne. %%% %%% %%% @copyright 2006-2012 ProcessOne %%% @author Christophe romainThe {@module} module is a PubSub plugin whose %%% goal is to republished each published item to all its children.
%%%Users cannot subscribe to this node, but are supposed to subscribe to %%% its children.
%%% This module can not work with virtual nodetree %% API definition -export([init/3, terminate/2, options/0, features/0, create_node_permission/6, create_node/2, delete_node/1, purge_node/2, subscribe_node/8, unsubscribe_node/4, publish_item/6, delete_item/4, remove_extra_items/3, get_entity_affiliations/2, get_node_affiliations/1, get_affiliation/2, set_affiliation/3, get_entity_subscriptions/2, get_node_subscriptions/1, get_subscriptions/2, set_subscriptions/4, get_pending_nodes/2, get_states/1, get_state/2, set_state/1, get_items/6, get_items/2, get_item/7, get_item/2, set_item/1, get_item_name/3, node_to_path/1, path_to_node/1 ]). init(Host, ServerHost, Opts) -> node_hometree:init(Host, ServerHost, Opts). terminate(Host, ServerHost) -> node_hometree:terminate(Host, ServerHost). options() -> [{deliver_payloads, true}, {notify_config, false}, {notify_delete, false}, {notify_retract, true}, {purge_offline, false}, {persist_items, true}, {max_items, ?MAXITEMS}, {subscribe, true}, {access_model, open}, {roster_groups_allowed, []}, {publish_model, publishers}, {notification_type, headline}, {max_payload_size, ?MAX_PAYLOAD_SIZE}, {send_last_published_item, never}, {deliver_notifications, true}, {presence_based_delivery, false}]. features() -> ["create-nodes", "delete-nodes", "instant-nodes", "outcast-affiliation", "persistent-items", "publish", %%"purge-nodes", %%"retract-items", %%"retrieve-affiliations", "retrieve-items" %%"retrieve-subscriptions", %%"subscribe", %%"subscription-notifications", ]. create_node_permission(Host, ServerHost, Node, ParentNode, Owner, Access) -> node_hometree:create_node_permission(Host, ServerHost, Node, ParentNode, Owner, Access). create_node(NodeId, Owner) -> node_hometree:create_node(NodeId, Owner). delete_node(Removed) -> node_hometree:delete_node(Removed). subscribe_node(_NodeId, _Sender, _Subscriber, _AccessModel, _SendLast, _PresenceSubscription, _RosterGroup, _Options) -> {error, ?ERR_FORBIDDEN}. unsubscribe_node(_NodeId, _Sender, _Subscriber, _SubID) -> {error, ?ERR_FORBIDDEN}. publish_item(NodeId, Publisher, Model, MaxItems, ItemId, Payload) -> lists:foreach(fun(SubNode) -> node_hometree:publish_item( SubNode#pubsub_node.id, Publisher, Model, MaxItems, ItemId, Payload) end, nodetree_tree:get_subnodes(NodeId, Publisher, Publisher)). remove_extra_items(_NodeId, _MaxItems, ItemIds) -> {result, {ItemIds, []}}. delete_item(_NodeId, _Publisher, _PublishModel, _ItemId) -> {error, ?ERR_ITEM_NOT_FOUND}. purge_node(_NodeId, _Owner) -> {error, ?ERR_FORBIDDEN}. get_entity_affiliations(_Host, _Owner) -> {result, []}. get_node_affiliations(_NodeId) -> {result, []}. get_affiliation(_NodeId, _Owner) -> {result, []}. set_affiliation(NodeId, Owner, Affiliation) -> node_hometree:set_affiliation(NodeId, Owner, Affiliation). get_entity_subscriptions(_Host, _Owner) -> {result, []}. get_node_subscriptions(NodeId) -> %% note: get_node_subscriptions is used for broadcasting %% DO NOT REMOVE node_hometree:get_node_subscriptions(NodeId). get_subscriptions(_NodeId, _Owner) -> {result, []}. set_subscriptions(NodeId, Owner, Subscription, SubId) -> node_hometree:set_subscriptions(NodeId, Owner, Subscription, SubId). get_pending_nodes(Host, Owner) -> node_hometree:get_pending_nodes(Host, Owner). get_states(NodeId) -> node_hometree:get_states(NodeId). get_state(NodeId, JID) -> node_hometree:get_state(NodeId, JID). set_state(State) -> node_hometree:set_state(State). get_items(NodeId, From) -> node_hometree:get_items(NodeId, From). get_items(NodeId, JID, AccessModel, PresenceSubscription, RosterGroup, SubId) -> node_hometree:get_items(NodeId, JID, AccessModel, PresenceSubscription, RosterGroup, SubId). get_item(NodeId, ItemId) -> node_hometree:get_item(NodeId, ItemId). get_item(NodeId, ItemId, JID, AccessModel, PresenceSubscription, RosterGroup, SubId) -> node_hometree:get_item(NodeId, ItemId, JID, AccessModel, PresenceSubscription, RosterGroup, SubId). set_item(Item) -> node_hometree:set_item(Item). get_item_name(Host, Node, Id) -> node_hometree:get_item_name(Host, Node, Id). node_to_path(Node) -> node_flat:node_to_path(Node). path_to_node(Path) -> node_flat:path_to_node(Path). ejabberd-2.1.11/src/mod_pubsub/node_flat_odbc.erl 0000664 0000000 0000000 00000015563 12240230175 016604 0 ustar %%% ==================================================================== %%% ``The contents of this file are subject to the Erlang Public License, %%% Version 1.1, (the "License"); you may not use this file except in %%% compliance with the License. You should have received a copy of the %%% Erlang Public License along with this software. If not, it can be %%% retrieved via the world wide web at http://www.erlang.org/. %%% %%% Software distributed under the License is distributed on an "AS IS" %%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See %%% the License for the specific language governing rights and limitations %%% under the License. %%% %%% The Initial Developer of the Original Code is ProcessOne. %%% Portions created by ProcessOne are Copyright 2006-2012, ProcessOne %%% All Rights Reserved.'' %%% This software is copyright 2006-2012, ProcessOne. %%% %%% @copyright 2006-2012 ProcessOne %%% @author Christophe RomainPubSub plugin nodes are using the {@link gen_pubsub_node} behaviour.
-module(node_pep_odbc). -author('christophe.romain@process-one.net'). -include("ejabberd.hrl"). -include("pubsub.hrl"). -include("jlib.hrl"). -define(PUBSUB, mod_pubsub_odbc). -behaviour(gen_pubsub_node). %% API definition -export([init/3, terminate/2, options/0, features/0, create_node_permission/6, create_node/2, delete_node/1, purge_node/2, subscribe_node/8, unsubscribe_node/4, publish_item/6, delete_item/4, remove_extra_items/3, get_entity_affiliations/2, get_node_affiliations/1, get_affiliation/2, set_affiliation/3, get_entity_subscriptions/2, get_entity_subscriptions_for_send_last/2, get_node_subscriptions/1, get_subscriptions/2, set_subscriptions/4, get_pending_nodes/2, get_states/1, get_state/2, set_state/1, get_items/7, get_items/6, get_items/3, get_items/2, get_item/7, get_item/2, set_item/1, get_item_name/3, get_last_items/3, node_to_path/1, path_to_node/1 ]). init(Host, ServerHost, Opts) -> node_hometree_odbc:init(Host, ServerHost, Opts), complain_if_modcaps_disabled(ServerHost), ok. terminate(Host, ServerHost) -> node_hometree_odbc:terminate(Host, ServerHost), ok. options() -> [{odbc, true}, {node_type, pep}, {deliver_payloads, true}, {notify_config, false}, {notify_delete, false}, {notify_retract, false}, {purge_offline, false}, {persist_items, false}, {max_items, ?MAXITEMS}, {subscribe, true}, {access_model, presence}, {roster_groups_allowed, []}, {publish_model, publishers}, {notification_type, headline}, {max_payload_size, ?MAX_PAYLOAD_SIZE}, {send_last_published_item, on_sub_and_presence}, {deliver_notifications, true}, {presence_based_delivery, true}]. features() -> ["create-nodes", %* "auto-create", %* "auto-subscribe", %* "delete-nodes", %* "delete-items", %* "filtered-notifications", %* "modify-affiliations", "outcast-affiliation", "persistent-items", "publish", %* "purge-nodes", "retract-items", "retrieve-affiliations", "retrieve-items", %* "retrieve-subscriptions", "subscribe" %* ]. create_node_permission(Host, ServerHost, _Node, _ParentNode, Owner, Access) -> LOwner = jlib:jid_tolower(Owner), {User, Server, _Resource} = LOwner, Allowed = case LOwner of {"", Host, ""} -> true; % pubsub service always allowed _ -> case acl:match_rule(ServerHost, Access, LOwner) of allow -> case Host of {User, Server, _} -> true; _ -> false end; E -> ?DEBUG("Create not allowed : ~p~n", [E]), false end end, {result, Allowed}. create_node(NodeId, Owner) -> case node_hometree_odbc:create_node(NodeId, Owner) of {result, _} -> {result, []}; Error -> Error end. delete_node(Removed) -> case node_hometree_odbc:delete_node(Removed) of {result, {_, _, Removed}} -> {result, {[], Removed}}; Error -> Error end. subscribe_node(NodeId, Sender, Subscriber, AccessModel, SendLast, PresenceSubscription, RosterGroup, Options) -> node_hometree_odbc:subscribe_node( NodeId, Sender, Subscriber, AccessModel, SendLast, PresenceSubscription, RosterGroup, Options). unsubscribe_node(NodeId, Sender, Subscriber, SubID) -> case node_hometree_odbc:unsubscribe_node(NodeId, Sender, Subscriber, SubID) of {error, Error} -> {error, Error}; {result, _} -> {result, []} end. publish_item(NodeId, Publisher, Model, MaxItems, ItemId, Payload) -> node_hometree_odbc:publish_item(NodeId, Publisher, Model, MaxItems, ItemId, Payload). remove_extra_items(NodeId, MaxItems, ItemIds) -> node_hometree_odbc:remove_extra_items(NodeId, MaxItems, ItemIds). delete_item(NodeId, Publisher, PublishModel, ItemId) -> node_hometree_odbc:delete_item(NodeId, Publisher, PublishModel, ItemId). purge_node(NodeId, Owner) -> node_hometree_odbc:purge_node(NodeId, Owner). get_entity_affiliations(_Host, Owner) -> OwnerKey = jlib:jid_tolower(jlib:jid_remove_resource(Owner)), node_hometree_odbc:get_entity_affiliations(OwnerKey, Owner). get_node_affiliations(NodeId) -> node_hometree_odbc:get_node_affiliations(NodeId). get_affiliation(NodeId, Owner) -> node_hometree_odbc:get_affiliation(NodeId, Owner). set_affiliation(NodeId, Owner, Affiliation) -> node_hometree_odbc:set_affiliation(NodeId, Owner, Affiliation). get_entity_subscriptions(_Host, Owner) -> SubKey = jlib:jid_tolower(Owner), GenKey = jlib:jid_remove_resource(SubKey), Host = ?PUBSUB:escape(element(2, SubKey)), SJ = node_hometree_odbc:encode_jid(SubKey), GJ = node_hometree_odbc:encode_jid(GenKey), Query = case SubKey of GenKey -> ["select host, node, type, i.nodeid, jid, subscriptions " "from pubsub_state i, pubsub_node n " "where i.nodeid = n.nodeid " "and jid like '", GJ, "%' " "and host like '%@", Host, "';"]; _ -> ["select host, node, type, i.nodeid, jid, subscriptions " "from pubsub_state i, pubsub_node n " "where i.nodeid = n.nodeid " "and jid in ('", SJ, "', '", GJ, "') " "and host like '%@", Host, "';"] end, Reply = case catch ejabberd_odbc:sql_query_t(Query) of {selected, ["host", "node", "type", "nodeid", "jid", "subscriptions"], RItems} -> lists:map(fun({H, N, T, I, J, S}) -> O = node_hometree_odbc:decode_jid(H), Node = nodetree_tree_odbc:raw_to_node(O, {N, "", T, I}), {Node, node_hometree_odbc:decode_subscriptions(S), node_hometree_odbc:decode_jid(J)} end, RItems); _ -> [] end, {result, Reply}. get_entity_subscriptions_for_send_last(_Host, Owner) -> SubKey = jlib:jid_tolower(Owner), GenKey = jlib:jid_remove_resource(SubKey), Host = ?PUBSUB:escape(element(2, SubKey)), SJ = node_hometree_odbc:encode_jid(SubKey), GJ = node_hometree_odbc:encode_jid(GenKey), Query = case SubKey of GenKey -> ["select host, node, type, i.nodeid, jid, subscriptions " "from pubsub_state i, pubsub_node n, pubsub_node_option o " "where i.nodeid = n.nodeid and n.nodeid = o.nodeid " "and name='send_last_published_item' and val='on_sub_and_presence' " "and jid like '", GJ, "%' " "and host like '%@", Host, "';"]; _ -> ["select host, node, type, i.nodeid, jid, subscriptions " "from pubsub_state i, pubsub_node n, pubsub_node_option o " "where i.nodeid = n.nodeid and n.nodeid = o.nodeid " "and name='send_last_published_item' and val='on_sub_and_presence' " "and jid in ('", SJ, "', '", GJ, "') " "and host like '%@", Host, "';"] end, Reply = case catch ejabberd_odbc:sql_query_t(Query) of {selected, ["host", "node", "type", "nodeid", "jid", "subscriptions"], RItems} -> lists:map(fun({H, N, T, I, J, S}) -> O = node_hometree_odbc:decode_jid(H), Node = nodetree_tree_odbc:raw_to_node(O, {N, "", T, I}), {Node, node_hometree_odbc:decode_subscriptions(S), node_hometree_odbc:decode_jid(J)} end, RItems); _ -> [] end, {result, Reply}. get_node_subscriptions(NodeId) -> %% note: get_node_subscriptions is used for broadcasting %% there should not have any subscriptions %% but that call returns also all subscription to none %% and this is required for broadcast to occurs %% DO NOT REMOVE node_hometree_odbc:get_node_subscriptions(NodeId). get_subscriptions(NodeId, Owner) -> node_hometree_odbc:get_subscriptions(NodeId, Owner). set_subscriptions(NodeId, Owner, Subscription, SubId) -> node_hometree_odbc:set_subscriptions(NodeId, Owner, Subscription, SubId). get_pending_nodes(Host, Owner) -> node_hometree_odbc:get_pending_nodes(Host, Owner). get_states(NodeId) -> node_hometree_odbc:get_states(NodeId). get_state(NodeId, JID) -> node_hometree_odbc:get_state(NodeId, JID). set_state(State) -> node_hometree_odbc:set_state(State). get_items(NodeId, From) -> node_hometree_odbc:get_items(NodeId, From). get_items(NodeId, From, RSM) -> node_hometree_odbc:get_items(NodeId, From, RSM). get_items(NodeId, JID, AccessModel, PresenceSubscription, RosterGroup, SubId) -> get_items(NodeId, JID, AccessModel, PresenceSubscription, RosterGroup, SubId, none). get_items(NodeId, JID, AccessModel, PresenceSubscription, RosterGroup, SubId, RSM) -> node_hometree_odbc:get_items(NodeId, JID, AccessModel, PresenceSubscription, RosterGroup, SubId, RSM). get_last_items(NodeId, JID, Count) -> node_hometree_odbc:get_last_items(NodeId, JID, Count). get_item(NodeId, ItemId) -> node_hometree_odbc:get_item(NodeId, ItemId). get_item(NodeId, ItemId, JID, AccessModel, PresenceSubscription, RosterGroup, SubId) -> node_hometree_odbc:get_item(NodeId, ItemId, JID, AccessModel, PresenceSubscription, RosterGroup, SubId). set_item(Item) -> node_hometree_odbc:set_item(Item). get_item_name(Host, Node, Id) -> node_hometree_odbc:get_item_name(Host, Node, Id). node_to_path(Node) -> node_flat_odbc:node_to_path(Node). path_to_node(Path) -> node_flat_odbc:path_to_node(Path). %%% %%% Internal %%% %% @doc Check mod_caps is enabled, otherwise show warning. %% The PEP plugin for mod_pubsub requires mod_caps to be enabled in the host. %% Check that the mod_caps module is enabled in that Jabber Host %% If not, show a warning message in the ejabberd log file. complain_if_modcaps_disabled(ServerHost) -> Modules = ejabberd_config:get_local_option({modules, ServerHost}), ModCaps = [mod_caps_enabled || {mod_caps, _Opts} <- Modules], case ModCaps of [] -> ?WARNING_MSG("The PEP plugin is enabled in mod_pubsub of host ~p. " "This plugin requires mod_caps to be enabled, " "but it isn't.", [ServerHost]); _ -> ok end. ejabberd-2.1.11/src/mod_pubsub/pubsub.hrl 0000664 0000000 0000000 00000013701 12240230175 015155 0 ustar %%% ==================================================================== %%% ``The contents of this file are subject to the Erlang Public License, %%% Version 1.1, (the "License"); you may not use this file except in %%% compliance with the License. You should have received a copy of the %%% Erlang Public License along with this software. If not, it can be %%% retrieved via the world wide web at http://www.erlang.org/. %%% %%% Software distributed under the License is distributed on an "AS IS" %%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See %%% the License for the specific language governing rights and limitations %%% under the License. %%% %%% The Initial Developer of the Original Code is ProcessOne. %%% Portions created by ProcessOne are Copyright 2006-2012, ProcessOne %%% All Rights Reserved.'' %%% This software is copyright 2006-2012, ProcessOne. %%% %%% %%% copyright 2006-2012 ProcessOne %%% %%% This file contains pubsub types definition. %%% ==================================================================== %% ------------------------------- %% Pubsub constants -define(ERR_EXTENDED(E,C), mod_pubsub:extended_error(E,C)). %% The actual limit can be configured with mod_pubsub's option max_items_node -define(MAXITEMS, 10). %% this is currently a hard limit. %% Would be nice to have it configurable. -define(MAX_PAYLOAD_SIZE, 60000). %% ------------------------------- %% Pubsub types %% @type hostPubsub() = string(). %%hostPubsub is the name of the PubSub service. For example, it can be %% "pubsub.localhost".
%% @type hostPEP() = {User, Server, Resource} %% User = string() %% Server = string() %% Resource = []. %%For example, it can be : %% ```{"bob", "example.org", []}'''.
%% @type host() = hostPubsub() | hostPEP(). %% @type nodeId() = binary(). %%A node is defined by a list of its ancestors. The last element is the name %% of the current node. For example: %% ```<<"/home/localhost/user">>'''
%% @type nodeIdx() = integer(). %% @type itemId() = string(). %% @type subId() = string(). %% @type payload() = [#xmlelement{} | #xmlcdata{}]. %% @type stanzaError() = #xmlelement{}. %% Example: %% ```{xmlelement, "error", %% [{"code", Code}, {"type", Type}], %% [{xmlelement, Condition, [{"xmlns", ?NS_STANZAS}], []}]}''' %% @type pubsubIQResponse() = #xmlelement{}. %% Example: %% ```{xmlelement, "pubsub", %% [{"xmlns", ?NS_PUBSUB_EVENT}], %% [{xmlelement, "affiliations", [], %% []}]}''' %% @type nodeOption() = {Option, Value} %% Option = atom() %% Value = term(). %% Example: %% ```{deliver_payloads, true}''' %% @type nodeType() = string(). %%The nodeType is a string containing the name of the PubSub %% plugin to use to manage a given node. For example, it can be %% "flat", "hometree" or "blog".
%% @type jid() = {jid, User, Server, Resource, LUser, LServer, LResource} %% User = string() %% Server = string() %% Resource = string() %% LUser = string() %% LServer = string() %% LResource = string(). %% @type ljid() = {User, Server, Resource} %% User = string() %% Server = string() %% Resource = string(). %% @type affiliation() = 'none' | 'owner' | 'publisher' | 'publish-only' | 'member' | 'outcast'. %% @type subscription() = 'none' | 'pending' | 'unconfigured' | 'subscribed'. %% @type accessModel() = 'open' | 'presence' | 'roster' | 'authorize' | 'whitelist'. %% @type pubsubIndex() = {pubsub_index, Index, Last, Free} %% Index = atom() %% Last = integer() %% Free = [integer()]. %% internal pubsub index table -record(pubsub_index, { index, last, free }). %% @type pubsubNode() = {pubsub_node, NodeId, Id, Parents, Type, Owners, Options} %% NodeId = {host() | ljid(), nodeId()} %% Id = nodeIdx() %% Parents = [nodeId()] %% Type = nodeType() %% Owners = [ljid()] %% Options = [nodeOption()]. %%This is the format of the nodes table. The type of the table %% is: set,ram/disc.
%%The Parents and type fields are indexed.
%% id can be anything you want. -record(pubsub_node, { nodeid, id, parents = [], type = "flat", owners = [], options = [] }). %% @type pubsubState() = {pubsub_state, StateId, Items, Affiliation, Subscriptions} %% StateId = {ljid(), nodeIdx()} %% Items = [itemId()] %% Affiliation = affiliation() %% Subscriptions = [{subscription(), subId()}]. %%This is the format of the affiliations table. The type of the %% table is: set,ram/disc.
-record(pubsub_state, { stateid, items = [], affiliation = 'none', subscriptions = [] }). %% @type pubsubItem() = {pubsub_item, ItemId, Creation, Modification, Payload} %% ItemId = {itemId(), nodeIdx()} %% Creation = {now(), ljid()} %% Modification = {now(), ljid()} %% Payload = payload(). %%This is the format of the published items table. The type of the %% table is: set,disc,fragmented.
-record(pubsub_item, { itemid, creation = {'unknown','unknown'}, modification = {'unknown','unknown'}, payload = [] }). %% @type pubsubSubscription() = {pubsub_subscription, SubId, Options} %% SubId = subId() %% Options = [nodeOption()]. %%This is the format of the subscriptions table. The type of the %% table is: set,ram/disc.
-record(pubsub_subscription, { subid, options }). %% @type pubsubLastItem() = {pubsub_last_item, NodeId, ItemId, Creation, Payload} %% NodeId = nodeIdx() %% ItemId = itemId() %% Creation = {now(),ljid()} %% Payload = payload(). %%This is the format of the last items table. it stores last item payload %% for every node
-record(pubsub_last_item, { nodeid, itemid, creation, payload }). ejabberd-2.1.11/src/mod_pubsub/pubsub_index.erl 0000664 0000000 0000000 00000004017 12240230175 016341 0 ustar %%% ==================================================================== %%% ``The contents of this file are subject to the Erlang Public License, %%% Version 1.1, (the "License"); you may not use this file except in %%% compliance with the License. You should have received a copy of the %%% Erlang Public License along with this software. If not, it can be %%% retrieved via the world wide web at http://www.erlang.org/. %%% %%% Software distributed under the License is distributed on an "AS IS" %%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See %%% the License for the specific language governing rights and limitations %%% under the License. %%% %%% The Initial Developer of the Original Code is ProcessOne. %%% Portions created by ProcessOne are Copyright 2006-2012, ProcessOne %%% All Rights Reserved.'' %%% This software is copyright 2006-2012, ProcessOne. %%% %%% %%% @copyright 2006-2012 ProcessOne %%% @author Christophe Romain\n"
#: ejabberd_c2s.erl:424 ejabberd_c2s.erl:727
msgid "Use of STARTTLS required"
msgstr "STARTTLS の使用が必要です"
#: ejabberd_c2s.erl:503
msgid "No resource provided"
msgstr "リソースが提供されませんでした"
#: ejabberd_c2s.erl:1197
msgid "Replaced by new connection"
msgstr "新しいコネクションによって置き換えられました"
#: ejabberd_c2s.erl:1885
msgid "Your active privacy list has denied the routing of this stanza."
msgstr "あなたのプライバシーリストはこのスタンザのルーティングを拒否しました。"
#: ejabberd_captcha.erl:96 ejabberd_captcha.erl:152 ejabberd_captcha.erl:178
msgid "Enter the text you see"
msgstr "見えているテキストを入力してください"
#: ejabberd_captcha.erl:101
msgid "Your messages to ~s are being blocked. To unblock them, visit ~s"
msgstr ""
"~s 宛のメッセージはブロックされています。解除するにはこちらを見てください ~s"
#: ejabberd_captcha.erl:134
msgid "If you don't see the CAPTCHA image here, visit the web page."
msgstr ""
"ここに CAPTCHA 画像が表示されない場合、ウェブページを参照してください。"
#: ejabberd_captcha.erl:146
msgid "CAPTCHA web page"
msgstr "CAPTCHA ウェブページ"
#: ejabberd_captcha.erl:307
msgid "The CAPTCHA is valid."
msgstr "CAPTCHA は有効です。"
#: mod_adhoc.erl:95 mod_adhoc.erl:125 mod_adhoc.erl:143 mod_adhoc.erl:161
msgid "Commands"
msgstr "コマンド"
#: mod_adhoc.erl:149 mod_adhoc.erl:243
msgid "Ping"
msgstr "Ping"
#: mod_adhoc.erl:260
msgid "Pong"
msgstr "Pong"
#: mod_announce.erl:507 mod_announce_odbc.erl:499
msgid "Really delete message of the day?"
msgstr "本当にお知らせメッセージを削除しますか ?"
#: mod_announce.erl:515 mod_announce_odbc.erl:507 mod_configure.erl:1083
#: mod_configure.erl:1128
msgid "Subject"
msgstr "題"
#: mod_announce.erl:520 mod_announce_odbc.erl:512 mod_configure.erl:1088
#: mod_configure.erl:1133
msgid "Message body"
msgstr "本文"
#: mod_announce.erl:600 mod_announce_odbc.erl:592
msgid "No body provided for announce message"
msgstr "アナウンスメッセージはありませんでした"
#: mod_announce.erl:635 mod_announce_odbc.erl:627
msgid "Announcements"
msgstr "アナウンス"
#: mod_announce.erl:637 mod_announce_odbc.erl:629
msgid "Send announcement to all users"
msgstr "すべてのユーザーにアナウンスを送信"
#: mod_announce.erl:639 mod_announce_odbc.erl:631
msgid "Send announcement to all users on all hosts"
msgstr "全ホストのユーザーにアナウンスを送信"
#: mod_announce.erl:641 mod_announce_odbc.erl:633
msgid "Send announcement to all online users"
msgstr "すべてのオンラインユーザーにアナウンスを送信"
#: mod_announce.erl:643 mod_announce_odbc.erl:635 mod_configure.erl:1078
#: mod_configure.erl:1123
msgid "Send announcement to all online users on all hosts"
msgstr "全ホストのオンラインユーザーにアナウンスを送信"
#: mod_announce.erl:645 mod_announce_odbc.erl:637
msgid "Set message of the day and send to online users"
msgstr "お知らせメッセージを設定し、オンラインユーザーに送信"
#: mod_announce.erl:647 mod_announce_odbc.erl:639
msgid "Set message of the day on all hosts and send to online users"
msgstr "全ホストのお知らせメッセージを設定し、オンラインユーザーに送信"
#: mod_announce.erl:649 mod_announce_odbc.erl:641
msgid "Update message of the day (don't send)"
msgstr "お知らせメッセージを更新 (送信しない)"
#: mod_announce.erl:651 mod_announce_odbc.erl:643
msgid "Update message of the day on all hosts (don't send)"
msgstr "全ホストのお知らせメッセージを更新 (送信しない)"
#: mod_announce.erl:653 mod_announce_odbc.erl:645
msgid "Delete message of the day"
msgstr "お知らせメッセージを削除"
#: mod_announce.erl:655 mod_announce_odbc.erl:647
msgid "Delete message of the day on all hosts"
msgstr "全ホストのお知らせメッセージを削除"
#: mod_configure.erl:114 mod_configure.erl:274 mod_configure.erl:296
#: mod_configure.erl:498
msgid "Configuration"
msgstr "設定"
#: mod_configure.erl:125 mod_configure.erl:576 web/ejabberd_web_admin.erl:1936
msgid "Database"
msgstr "データーベース"
#: mod_configure.erl:127 mod_configure.erl:595
msgid "Start Modules"
msgstr "モジュールを起動"
#: mod_configure.erl:129 mod_configure.erl:596
msgid "Stop Modules"
msgstr "モジュールを停止"
#: mod_configure.erl:131 mod_configure.erl:604 web/ejabberd_web_admin.erl:1937
msgid "Backup"
msgstr "バックアップ"
#: mod_configure.erl:133 mod_configure.erl:605
msgid "Restore"
msgstr "リストア"
#: mod_configure.erl:135 mod_configure.erl:606
msgid "Dump to Text File"
msgstr "テキストファイルに出力"
#: mod_configure.erl:137 mod_configure.erl:615
msgid "Import File"
msgstr "ファイルからインポート"
#: mod_configure.erl:139 mod_configure.erl:616
msgid "Import Directory"
msgstr "ディレクトリインポート"
#: mod_configure.erl:141 mod_configure.erl:581 mod_configure.erl:1057
msgid "Restart Service"
msgstr "サービスを再起動"
#: mod_configure.erl:143 mod_configure.erl:582 mod_configure.erl:1102
msgid "Shut Down Service"
msgstr "サービスを停止"
#: mod_configure.erl:145 mod_configure.erl:518 mod_configure.erl:1197
#: web/ejabberd_web_admin.erl:1527
msgid "Add User"
msgstr "ユーザーを追加"
#: mod_configure.erl:147 mod_configure.erl:519 mod_configure.erl:1219
msgid "Delete User"
msgstr "ユーザーを削除"
#: mod_configure.erl:149 mod_configure.erl:520 mod_configure.erl:1231
msgid "End User Session"
msgstr "エンドユーザーセッション"
#: mod_configure.erl:151 mod_configure.erl:521 mod_configure.erl:1243
#: mod_configure.erl:1255
msgid "Get User Password"
msgstr "パスワードを取得"
#: mod_configure.erl:153 mod_configure.erl:522
msgid "Change User Password"
msgstr "パスワードを変更"
#: mod_configure.erl:155 mod_configure.erl:523 mod_configure.erl:1272
msgid "Get User Last Login Time"
msgstr "最終ログイン時間を取得"
#: mod_configure.erl:157 mod_configure.erl:524 mod_configure.erl:1284
msgid "Get User Statistics"
msgstr "ユーザー統計を取得"
#: mod_configure.erl:159 mod_configure.erl:525
msgid "Get Number of Registered Users"
msgstr "登録ユーザー数を取得"
#: mod_configure.erl:161 mod_configure.erl:526
msgid "Get Number of Online Users"
msgstr "オンラインユーザー数を取得"
#: mod_configure.erl:163 mod_configure.erl:509 web/ejabberd_web_admin.erl:831
#: web/ejabberd_web_admin.erl:872
msgid "Access Control Lists"
msgstr "アクセスコントロールリスト"
#: mod_configure.erl:165 mod_configure.erl:510 web/ejabberd_web_admin.erl:940
#: web/ejabberd_web_admin.erl:976
msgid "Access Rules"
msgstr "アクセスルール"
#: mod_configure.erl:297 mod_configure.erl:499
msgid "User Management"
msgstr "ユーザー管理"
#: mod_configure.erl:500 web/ejabberd_web_admin.erl:1058
#: web/ejabberd_web_admin.erl:1462
msgid "Online Users"
msgstr "オンラインユーザー"
#: mod_configure.erl:501
msgid "All Users"
msgstr "全ユーザー"
#: mod_configure.erl:502
msgid "Outgoing s2s Connections"
msgstr "外向き s2s コネクション"
#: mod_configure.erl:503 web/ejabberd_web_admin.erl:1907
msgid "Running Nodes"
msgstr "起動ノード"
#: mod_configure.erl:504 web/ejabberd_web_admin.erl:1909
msgid "Stopped Nodes"
msgstr "停止ノード"
#: mod_configure.erl:577 mod_configure.erl:587 web/ejabberd_web_admin.erl:1953
msgid "Modules"
msgstr "モジュール"
#: mod_configure.erl:578
msgid "Backup Management"
msgstr "バックアップ管理"
#: mod_configure.erl:579
msgid "Import Users From jabberd14 Spool Files"
msgstr "jabberd14 Spool ファイルからユーザーをインポート"
#: mod_configure.erl:699
msgid "To ~s"
msgstr "宛先 ~s"
#: mod_configure.erl:717
msgid "From ~s"
msgstr "差出人 ~s"
#: mod_configure.erl:913
msgid "Database Tables Configuration at "
msgstr "データーベーステーブル設定 "
#: mod_configure.erl:918
msgid "Choose storage type of tables"
msgstr "テーブルのストレージタイプを選択"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "Disc only copy"
msgstr "ディスクだけのコピー"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "RAM and disc copy"
msgstr "RAM, ディスクコピー"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "RAM copy"
msgstr "RAM コピー"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "Remote copy"
msgstr "リモートコピー"
#: mod_configure.erl:950
msgid "Stop Modules at "
msgstr "モジュールを停止: "
#: mod_configure.erl:954
msgid "Choose modules to stop"
msgstr "停止するモジュールを選択"
#: mod_configure.erl:969
msgid "Start Modules at "
msgstr "モジュールを開始: "
#: mod_configure.erl:973
msgid "Enter list of {Module, [Options]}"
msgstr "{モジュール, [オプション]}のリストを入力してください"
#: mod_configure.erl:974
msgid "List of modules to start"
msgstr "起動モジュールの一覧"
#: mod_configure.erl:983
msgid "Backup to File at "
msgstr "ファイルにバックアップ: "
#: mod_configure.erl:987 mod_configure.erl:1001
msgid "Enter path to backup file"
msgstr "バックアップファイルのパスを入力してください"
#: mod_configure.erl:988 mod_configure.erl:1002 mod_configure.erl:1016
#: mod_configure.erl:1030
msgid "Path to File"
msgstr "ファイルのパス"
#: mod_configure.erl:997
msgid "Restore Backup from File at "
msgstr "ファイルからバックアップをリストア: "
#: mod_configure.erl:1011
msgid "Dump Backup to Text File at "
msgstr "テキストファイルにバックアップ: "
#: mod_configure.erl:1015
msgid "Enter path to text file"
msgstr "テキストファイルのパスを入力してください"
#: mod_configure.erl:1025
msgid "Import User from File at "
msgstr "ファイルからユーザーをインポート: "
#: mod_configure.erl:1029
msgid "Enter path to jabberd14 spool file"
msgstr "jabberd14 spool ファイルのパスを入力してください"
#: mod_configure.erl:1039
msgid "Import Users from Dir at "
msgstr "ディレクトリからユーザーをインポート: "
#: mod_configure.erl:1043
msgid "Enter path to jabberd14 spool dir"
msgstr "jabberd14 spool ディレクトリのディレクトリを入力してください"
#: mod_configure.erl:1044
msgid "Path to Dir"
msgstr "ディレクトリのパス"
#: mod_configure.erl:1060 mod_configure.erl:1105
msgid "Time delay"
msgstr "遅延時間"
#: mod_configure.erl:1143
msgid "Access Control List Configuration"
msgstr "アクセスコントロールリスト設定"
#: mod_configure.erl:1147
msgid "Access control lists"
msgstr "アクセスコントロールリスト"
#: mod_configure.erl:1171
msgid "Access Configuration"
msgstr "アクセス設定"
#: mod_configure.erl:1175
msgid "Access rules"
msgstr "アクセスルール"
#: mod_configure.erl:1200 mod_configure.erl:1222 mod_configure.erl:1234
#: mod_configure.erl:1246 mod_configure.erl:1258 mod_configure.erl:1275
#: mod_configure.erl:1287 mod_configure.erl:1650 mod_configure.erl:1700
#: mod_configure.erl:1721 mod_roster.erl:943 mod_roster_odbc.erl:1060
#: mod_vcard.erl:472 mod_vcard_ldap.erl:554 mod_vcard_odbc.erl:448
msgid "Jabber ID"
msgstr "Jabber ID"
#: mod_configure.erl:1205 mod_configure.erl:1263 mod_configure.erl:1651
#: mod_configure.erl:1863 mod_muc/mod_muc_room.erl:3224 mod_register.erl:235
#: web/ejabberd_web_admin.erl:1520
msgid "Password"
msgstr "パスワード"
#: mod_configure.erl:1210
msgid "Password Verification"
msgstr "パスワード (確認)"
#: mod_configure.erl:1301
msgid "Number of registered users"
msgstr "登録ユーザー数"
#: mod_configure.erl:1315
msgid "Number of online users"
msgstr "オンラインユーザー数"
#: mod_configure.erl:1682 web/ejabberd_web_admin.erl:1588
#: web/ejabberd_web_admin.erl:1743
msgid "Never"
msgstr "なし"
#: mod_configure.erl:1696 web/ejabberd_web_admin.erl:1601
#: web/ejabberd_web_admin.erl:1756
msgid "Online"
msgstr "オンライン"
#: mod_configure.erl:1701
msgid "Last login"
msgstr "最終ログイン"
#: mod_configure.erl:1722
msgid "Roster size"
msgstr "名簿サイズ"
#: mod_configure.erl:1723
msgid "IP addresses"
msgstr "IP アドレス"
#: mod_configure.erl:1724
msgid "Resources"
msgstr "リソース"
#: mod_configure.erl:1850
msgid "Administration of "
msgstr "管理: "
#: mod_configure.erl:1853
msgid "Action on user"
msgstr "ユーザー操作"
#: mod_configure.erl:1857
msgid "Edit Properties"
msgstr "プロパティを編集"
#: mod_configure.erl:1860 web/ejabberd_web_admin.erl:1769
msgid "Remove User"
msgstr "ユーザーを削除"
#: mod_irc/mod_irc.erl:201 mod_irc/mod_irc_odbc.erl:196
#: mod_muc/mod_muc.erl:336 mod_muc/mod_muc_odbc.erl:342
msgid "Access denied by service policy"
msgstr "サービスポリシーによってアクセスが禁止されました"
#: mod_irc/mod_irc.erl:401 mod_irc/mod_irc_odbc.erl:398
msgid "IRC Transport"
msgstr "IRC トランスポート"
#: mod_irc/mod_irc.erl:428 mod_irc/mod_irc_odbc.erl:425
msgid "ejabberd IRC module"
msgstr "ejabberd IRC module"
#: mod_irc/mod_irc.erl:559 mod_irc/mod_irc_odbc.erl:568
msgid "You need an x:data capable client to configure mod_irc settings"
msgstr "mod_irc の設定には x:data をサポートするクライアントが必要です"
#: mod_irc/mod_irc.erl:566 mod_irc/mod_irc_odbc.erl:575
msgid "Registration in mod_irc for "
msgstr "mod_irc での登録: "
#: mod_irc/mod_irc.erl:571 mod_irc/mod_irc_odbc.erl:580
msgid ""
"Enter username, encodings, ports and passwords you wish to use for "
"connecting to IRC servers"
msgstr ""
"IRC サーバーに接続先するために使用するユーザー名、文字エンコーディング、ポー"
"ト、パスワードを入力してください"
#: mod_irc/mod_irc.erl:576 mod_irc/mod_irc_odbc.erl:585
msgid "IRC Username"
msgstr "IRC ユーザー名"
#: mod_irc/mod_irc.erl:586 mod_irc/mod_irc_odbc.erl:595
msgid ""
"If you want to specify different ports, passwords, encodings for IRC "
"servers, fill this list with values in format '{\"irc server\", \"encoding"
"\", port, \"password\"}'. By default this service use \"~s\" encoding, port "
"~p, empty password."
msgstr ""
"別のポートやパスワード、文字エンコーディングを使用したい場合、'{\"irc server"
"\", \"encoding\", port, \"password\"}' という形式のリストを入力してください。"
"デフォルトでエンコーディングは \"~s\" を使用し、ポートは ~p、パスワードは空に"
"なっています。"
#: mod_irc/mod_irc.erl:598 mod_irc/mod_irc_odbc.erl:607
msgid ""
"Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef."
"net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."
msgstr ""
"例: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef.net"
"\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."
#: mod_irc/mod_irc.erl:603 mod_irc/mod_irc_odbc.erl:612
msgid "Connections parameters"
msgstr "接続パラメーター"
#: mod_irc/mod_irc.erl:728 mod_irc/mod_irc_odbc.erl:757
msgid "Join IRC channel"
msgstr "IRC チャンネルに参加"
#: mod_irc/mod_irc.erl:732 mod_irc/mod_irc_odbc.erl:761
msgid "IRC channel (don't put the first #)"
msgstr "IRC チャンネル (先頭に#は不要)"
#: mod_irc/mod_irc.erl:737 mod_irc/mod_irc_odbc.erl:766
msgid "IRC server"
msgstr "IRC サーバー"
#: mod_irc/mod_irc.erl:770 mod_irc/mod_irc.erl:774
#: mod_irc/mod_irc_odbc.erl:799 mod_irc/mod_irc_odbc.erl:803
msgid "Join the IRC channel here."
msgstr "この IRC チャンネルに参加します。"
#: mod_irc/mod_irc.erl:778 mod_irc/mod_irc_odbc.erl:807
msgid "Join the IRC channel in this Jabber ID: ~s"
msgstr "Jabber ID: ~s でこの IRC チャンネルに参加"
#: mod_irc/mod_irc.erl:863 mod_irc/mod_irc_odbc.erl:904
msgid "IRC settings"
msgstr "IRC 設定"
#: mod_irc/mod_irc.erl:868 mod_irc/mod_irc_odbc.erl:909
msgid ""
"Enter username and encodings you wish to use for connecting to IRC servers. "
"Press 'Next' to get more fields to fill in. Press 'Complete' to save "
"settings."
msgstr ""
"IRC サーバーに接続先するためのユーザー名と文字エンコーディングを入力してくだ"
"さい。'Next' を押して次の項目に進みます。'Complete' を押すと設定が保存されま"
"す。"
#: mod_irc/mod_irc.erl:874 mod_irc/mod_irc_odbc.erl:915
msgid "IRC username"
msgstr "IRC ユーザー名"
#: mod_irc/mod_irc.erl:923 mod_irc/mod_irc_odbc.erl:964
msgid "Password ~b"
msgstr "パスワード ~b"
#: mod_irc/mod_irc.erl:928 mod_irc/mod_irc_odbc.erl:969
msgid "Port ~b"
msgstr "ポート ~b"
#: mod_irc/mod_irc.erl:933 mod_irc/mod_irc_odbc.erl:974
msgid "Encoding for server ~b"
msgstr "サーバーのエンコーディング ~b"
#: mod_irc/mod_irc.erl:942 mod_irc/mod_irc_odbc.erl:983
msgid "Server ~b"
msgstr "サーバー ~b"
#: mod_muc/mod_muc.erl:449 mod_muc/mod_muc_odbc.erl:456
msgid "Only service administrators are allowed to send service messages"
msgstr "サービス管理者のみがサービスメッセージを送信できます"
#: mod_muc/mod_muc.erl:493 mod_muc/mod_muc_odbc.erl:500
msgid "Room creation is denied by service policy"
msgstr "サービスポリシーによって談話室の作成が禁止されています"
#: mod_muc/mod_muc.erl:500 mod_muc/mod_muc_odbc.erl:507
msgid "Conference room does not exist"
msgstr "会議室は存在しません"
#: mod_muc/mod_muc.erl:582 mod_muc/mod_muc_odbc.erl:595
msgid "Chatrooms"
msgstr "談話室"
#: mod_muc/mod_muc.erl:712 mod_muc/mod_muc_odbc.erl:729
msgid "You need a client that supports x:data to register the nickname"
msgstr "ニックネームを登録するには x:data をサポートするクライアントが必要です"
#: mod_muc/mod_muc.erl:718 mod_muc/mod_muc_odbc.erl:735
msgid "Nickname Registration at "
msgstr "ニックネーム登録: "
#: mod_muc/mod_muc.erl:722 mod_muc/mod_muc_odbc.erl:739
msgid "Enter nickname you want to register"
msgstr "登録するニックネームを入力してください"
#: mod_muc/mod_muc.erl:723 mod_muc/mod_muc_odbc.erl:740
#: mod_muc/mod_muc_room.erl:3810 mod_roster.erl:944 mod_roster_odbc.erl:1061
#: mod_vcard.erl:364 mod_vcard.erl:477 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:453
msgid "Nickname"
msgstr "ニックネーム"
#: mod_muc/mod_muc.erl:762 mod_muc/mod_muc_odbc.erl:784
#: mod_muc/mod_muc_room.erl:1064 mod_muc/mod_muc_room.erl:1787
msgid "That nickname is registered by another person"
msgstr "ニックネームはほかの人によって登録されています"
#: mod_muc/mod_muc.erl:788 mod_muc/mod_muc_odbc.erl:811
msgid "You must fill in field \"Nickname\" in the form"
msgstr "フォームの\"ニックネーム\"欄を入力する必要があります"
#: mod_muc/mod_muc.erl:808 mod_muc/mod_muc_odbc.erl:831
msgid "ejabberd MUC module"
msgstr "ejabberd MUC module"
#: mod_muc/mod_muc_log.erl:374 mod_muc/mod_muc_log.erl:381
msgid "Chatroom configuration modified"
msgstr "談話室の設定が変更されました"
#: mod_muc/mod_muc_log.erl:384
msgid "joins the room"
msgstr "が談話室に参加しました"
#: mod_muc/mod_muc_log.erl:387 mod_muc/mod_muc_log.erl:390
msgid "leaves the room"
msgstr "が談話室から退出しました"
#: mod_muc/mod_muc_log.erl:393 mod_muc/mod_muc_log.erl:396
msgid "has been banned"
msgstr "はバンされました"
#: mod_muc/mod_muc_log.erl:399 mod_muc/mod_muc_log.erl:402
msgid "has been kicked"
msgstr "はキックされました"
#: mod_muc/mod_muc_log.erl:405
msgid "has been kicked because of an affiliation change"
msgstr "は分掌が変更されたためキックされました"
#: mod_muc/mod_muc_log.erl:408
msgid "has been kicked because the room has been changed to members-only"
msgstr "は談話室がメンバー制に変更されたためキックされました"
#: mod_muc/mod_muc_log.erl:411
msgid "has been kicked because of a system shutdown"
msgstr "はシステムシャットダウンのためキックされました"
#: mod_muc/mod_muc_log.erl:414
msgid "is now known as"
msgstr "は名前を変更しました: "
#: mod_muc/mod_muc_log.erl:417 mod_muc/mod_muc_log.erl:688
#: mod_muc/mod_muc_room.erl:2393
msgid " has set the subject to: "
msgstr " は題を設定しました: "
#: mod_muc/mod_muc_log.erl:452
msgid "Chatroom is created"
msgstr "談話室を作りました"
#: mod_muc/mod_muc_log.erl:453
msgid "Chatroom is destroyed"
msgstr "談話室を削除しました"
#: mod_muc/mod_muc_log.erl:454
msgid "Chatroom is started"
msgstr "談話室を開始しました"
#: mod_muc/mod_muc_log.erl:455
msgid "Chatroom is stopped"
msgstr "談話室を停止しました"
#: mod_muc/mod_muc_log.erl:459
msgid "Monday"
msgstr "月曜日"
#: mod_muc/mod_muc_log.erl:460
msgid "Tuesday"
msgstr "火曜日"
#: mod_muc/mod_muc_log.erl:461
msgid "Wednesday"
msgstr "水曜日"
#: mod_muc/mod_muc_log.erl:462
msgid "Thursday"
msgstr "木曜日"
#: mod_muc/mod_muc_log.erl:463
msgid "Friday"
msgstr "金曜日"
#: mod_muc/mod_muc_log.erl:464
msgid "Saturday"
msgstr "土曜日"
#: mod_muc/mod_muc_log.erl:465
msgid "Sunday"
msgstr "日曜日"
#: mod_muc/mod_muc_log.erl:469
msgid "January"
msgstr "1月"
#: mod_muc/mod_muc_log.erl:470
msgid "February"
msgstr "2月"
#: mod_muc/mod_muc_log.erl:471
msgid "March"
msgstr "3月"
#: mod_muc/mod_muc_log.erl:472
msgid "April"
msgstr "4月"
#: mod_muc/mod_muc_log.erl:473
msgid "May"
msgstr "5月"
#: mod_muc/mod_muc_log.erl:474
msgid "June"
msgstr "6月"
#: mod_muc/mod_muc_log.erl:475
msgid "July"
msgstr "7月"
#: mod_muc/mod_muc_log.erl:476
msgid "August"
msgstr "8月"
#: mod_muc/mod_muc_log.erl:477
msgid "September"
msgstr "9月"
#: mod_muc/mod_muc_log.erl:478
msgid "October"
msgstr "10月"
#: mod_muc/mod_muc_log.erl:479
msgid "November"
msgstr "11月"
#: mod_muc/mod_muc_log.erl:480
msgid "December"
msgstr "12月"
#: mod_muc/mod_muc_log.erl:750
msgid "Room Configuration"
msgstr "談話室の設定"
#: mod_muc/mod_muc_log.erl:759
msgid "Room Occupants"
msgstr "在室者"
#: mod_muc/mod_muc_room.erl:174
msgid "Traffic rate limit is exceeded"
msgstr "トラフィックレートの制限を超えました"
#: mod_muc/mod_muc_room.erl:246
msgid ""
"This participant is kicked from the room because he sent an error message"
msgstr "エラーメッセージを送信したため、この参加者はキックされました"
#: mod_muc/mod_muc_room.erl:255
msgid "It is not allowed to send private messages to the conference"
msgstr "この会議にプライベートメッセージを送信することはできません"
#: mod_muc/mod_muc_room.erl:332
msgid "Please, wait for a while before sending new voice request"
msgstr "新しい発言権の要求を送るまで少し間をおいてください"
#: mod_muc/mod_muc_room.erl:347
msgid "Voice requests are disabled in this conference"
msgstr "この会議では、発言権の要求はできません"
#: mod_muc/mod_muc_room.erl:364
msgid "Failed to extract JID from your voice request approval"
msgstr "発言権要求の承認から JID を取り出すことに失敗しました"
#: mod_muc/mod_muc_room.erl:393
msgid "Only moderators can approve voice requests"
msgstr "モデレーターだけが発言権の要求を承認できます"
#: mod_muc/mod_muc_room.erl:408
msgid "Improper message type"
msgstr "誤ったメッセージタイプです"
#: mod_muc/mod_muc_room.erl:518
msgid ""
"This participant is kicked from the room because he sent an error message to "
"another participant"
msgstr ""
"他の参加者にエラーメッセージを送信したため、この参加者はキックされました"
#: mod_muc/mod_muc_room.erl:531
msgid "It is not allowed to send private messages of type \"groupchat\""
msgstr ""
"種別が\"groupchat\" であるプライベートメッセージを送信することはできません"
#: mod_muc/mod_muc_room.erl:543 mod_muc/mod_muc_room.erl:611
msgid "Recipient is not in the conference room"
msgstr "受信者はこの会議室にいません"
#: mod_muc/mod_muc_room.erl:564 mod_muc/mod_muc_room.erl:585
msgid "It is not allowed to send private messages"
msgstr "プライベートメッセージを送信することはできません"
#: mod_muc/mod_muc_room.erl:576 mod_muc/mod_muc_room.erl:956
#: mod_muc/mod_muc_room.erl:4040
msgid "Only occupants are allowed to send messages to the conference"
msgstr "在室者のみがこの会議にメッセージを送ることができます"
#: mod_muc/mod_muc_room.erl:634
msgid "Only occupants are allowed to send queries to the conference"
msgstr "在室者のみが会議にクエリーを送信することができます"
#: mod_muc/mod_muc_room.erl:646
msgid "Queries to the conference members are not allowed in this room"
msgstr "この談話室では、会議のメンバーへのクエリーは禁止されています"
#: mod_muc/mod_muc_room.erl:932
msgid ""
"Only moderators and participants are allowed to change the subject in this "
"room"
msgstr "モデレーターと参加者のみが談話室の題を変更できます"
#: mod_muc/mod_muc_room.erl:937
msgid "Only moderators are allowed to change the subject in this room"
msgstr "モデレーターのみが談話室の題を変更できます"
#: mod_muc/mod_muc_room.erl:947
msgid "Visitors are not allowed to send messages to all occupants"
msgstr "傍聴者はすべての在室者にメッセージを送信することはできません"
#: mod_muc/mod_muc_room.erl:1021
msgid ""
"This participant is kicked from the room because he sent an error presence"
msgstr "エラープレゼンスを送信したため、この参加者はキックされました"
#: mod_muc/mod_muc_room.erl:1040
msgid "Visitors are not allowed to change their nicknames in this room"
msgstr "傍聴者はこの談話室でニックネームを変更することはできません"
#: mod_muc/mod_muc_room.erl:1053 mod_muc/mod_muc_room.erl:1779
msgid "That nickname is already in use by another occupant"
msgstr "そのニックネームは既にほかの在室者によって使用されています"
#: mod_muc/mod_muc_room.erl:1768
msgid "You have been banned from this room"
msgstr "あなたはこの談話室からバンされています"
#: mod_muc/mod_muc_room.erl:1771
msgid "Membership is required to enter this room"
msgstr "この談話室に入るにはメンバーでなければなりません"
#: mod_muc/mod_muc_room.erl:1807
msgid "This room is not anonymous"
msgstr "この談話室は非匿名です"
#: mod_muc/mod_muc_room.erl:1833
msgid "A password is required to enter this room"
msgstr "この談話室に入るにはパスワードが必要です"
#: mod_muc/mod_muc_room.erl:1855 mod_register.erl:246
msgid "Too many CAPTCHA requests"
msgstr "CAPTCHA 要求が多すぎます"
#: mod_muc/mod_muc_room.erl:1864 mod_register.erl:251
msgid "Unable to generate a CAPTCHA"
msgstr "CAPTCHA を生成できません"
#: mod_muc/mod_muc_room.erl:1874
msgid "Incorrect password"
msgstr "パスワードが違います"
#: mod_muc/mod_muc_room.erl:2448
msgid "Administrator privileges required"
msgstr "管理者権限が必要です"
#: mod_muc/mod_muc_room.erl:2463
msgid "Moderator privileges required"
msgstr "モデレーター権限が必要です"
#: mod_muc/mod_muc_room.erl:2619
msgid "Jabber ID ~s is invalid"
msgstr "Jabber ID ~s は無効です"
#: mod_muc/mod_muc_room.erl:2633
msgid "Nickname ~s does not exist in the room"
msgstr "ニックネーム ~s はこの談話室にいません"
#: mod_muc/mod_muc_room.erl:2659 mod_muc/mod_muc_room.erl:3049
msgid "Invalid affiliation: ~s"
msgstr "無効な分掌です: ~s"
#: mod_muc/mod_muc_room.erl:2713
msgid "Invalid role: ~s"
msgstr "無効な役です: ~s"
#: mod_muc/mod_muc_room.erl:3026 mod_muc/mod_muc_room.erl:3062
msgid "Owner privileges required"
msgstr "主宰者の権限が必要です"
#: mod_muc/mod_muc_room.erl:3195
msgid "Configuration of room ~s"
msgstr "談話室 ~s の設定"
#: mod_muc/mod_muc_room.erl:3200
msgid "Room title"
msgstr "談話室のタイトル"
#: mod_muc/mod_muc_room.erl:3203 mod_muc/mod_muc_room.erl:3692
msgid "Room description"
msgstr "談話室の説明"
#: mod_muc/mod_muc_room.erl:3210
msgid "Make room persistent"
msgstr "談話室を永続化"
#: mod_muc/mod_muc_room.erl:3215
msgid "Make room public searchable"
msgstr "談話室を検索可"
#: mod_muc/mod_muc_room.erl:3218
msgid "Make participants list public"
msgstr "参加者一覧を公開"
#: mod_muc/mod_muc_room.erl:3221
msgid "Make room password protected"
msgstr "談話室をパスワードで保護"
#: mod_muc/mod_muc_room.erl:3232
msgid "Maximum Number of Occupants"
msgstr "最大在室者数"
#: mod_muc/mod_muc_room.erl:3239
msgid "No limit"
msgstr "制限なし"
#: mod_muc/mod_muc_room.erl:3250
msgid "Present real Jabber IDs to"
msgstr "本当の Jabber ID を公開"
#: mod_muc/mod_muc_room.erl:3258 mod_muc/mod_muc_room.erl:3292
msgid "moderators only"
msgstr "モデレーターにのみ"
#: mod_muc/mod_muc_room.erl:3260 mod_muc/mod_muc_room.erl:3294
msgid "anyone"
msgstr "誰にでも"
#: mod_muc/mod_muc_room.erl:3262
msgid "Make room members-only"
msgstr "談話室をメンバーのみに制限"
#: mod_muc/mod_muc_room.erl:3265
msgid "Make room moderated"
msgstr "談話室をモデレート化"
#: mod_muc/mod_muc_room.erl:3268
msgid "Default users as participants"
msgstr "デフォルトのユーザーは参加者"
#: mod_muc/mod_muc_room.erl:3271
msgid "Allow users to change the subject"
msgstr "ユーザーによる題の変更を許可"
#: mod_muc/mod_muc_room.erl:3274
msgid "Allow users to send private messages"
msgstr "ユーザーによるプライベートメッセージの送信を許可"
#: mod_muc/mod_muc_room.erl:3279
msgid "Allow visitors to send private messages to"
msgstr "傍聴者によるプライベートメッセージの送信を次の相手に許可"
#: mod_muc/mod_muc_room.erl:3290
msgid "nobody"
msgstr "誰にも許可しない"
#: mod_muc/mod_muc_room.erl:3296
msgid "Allow users to query other users"
msgstr "ユーザーによる他のユーザーへのクエリーを許可"
#: mod_muc/mod_muc_room.erl:3299
msgid "Allow users to send invites"
msgstr "ユーザーによる招待を許可"
#: mod_muc/mod_muc_room.erl:3302
msgid "Allow visitors to send status text in presence updates"
msgstr "傍聴者によるプレゼンス更新のステータス文の送信を許可"
#: mod_muc/mod_muc_room.erl:3305
msgid "Allow visitors to change nickname"
msgstr "傍聴者のニックネームの変更を許可"
#: mod_muc/mod_muc_room.erl:3308
msgid "Allow visitors to send voice requests"
msgstr "傍聴者による発言権の要求を許可"
#: mod_muc/mod_muc_room.erl:3311
msgid "Minimum interval between voice requests (in seconds)"
msgstr "発言権の要求の最小時間間隔 (秒)"
#: mod_muc/mod_muc_room.erl:3317
msgid "Make room CAPTCHA protected"
msgstr "談話室を CAPTCHA で保護"
#: mod_muc/mod_muc_room.erl:3322
msgid "Exclude Jabber IDs from CAPTCHA challenge"
msgstr "CAPTCHA 試験を免除する Jabber ID"
#: mod_muc/mod_muc_room.erl:3329
msgid "Enable logging"
msgstr "ロギングを有効"
#: mod_muc/mod_muc_room.erl:3337
msgid "You need an x:data capable client to configure room"
msgstr "談話室を設定するには x:data をサポートするクライアントが必要です"
#: mod_muc/mod_muc_room.erl:3694
msgid "Number of occupants"
msgstr "在室者の数"
#: mod_muc/mod_muc_room.erl:3750
msgid "private, "
msgstr "プライベート、"
#: mod_muc/mod_muc_room.erl:3799
msgid "Voice request"
msgstr "発言権を要求"
#: mod_muc/mod_muc_room.erl:3803
msgid "Either approve or decline the voice request."
msgstr "発言権の要求を承認または却下します。"
#: mod_muc/mod_muc_room.erl:3809
msgid "User JID"
msgstr "ユーザー JID"
#: mod_muc/mod_muc_room.erl:3811
msgid "Grant voice to this person?"
msgstr "この人に発言権を与えますか ?"
#: mod_muc/mod_muc_room.erl:3960
msgid "~s invites you to the room ~s"
msgstr "~s はあなたを談話室 ~s に招待しています"
#: mod_muc/mod_muc_room.erl:3969
msgid "the password is"
msgstr "パスワードは"
#: mod_offline.erl:510 mod_offline_odbc.erl:352
msgid ""
"Your contact offline message queue is full. The message has been discarded."
msgstr ""
"相手先のオフラインメッセージキューが一杯です。このメッセージは破棄されます。"
#: mod_offline.erl:560 mod_offline_odbc.erl:408
msgid "~s's Offline Messages Queue"
msgstr "~s' のオフラインメッセージキュー"
#: mod_offline.erl:563 mod_offline_odbc.erl:411 mod_roster.erl:987
#: mod_roster_odbc.erl:1104 mod_shared_roster.erl:901
#: mod_shared_roster.erl:1010 mod_shared_roster_odbc.erl:930
#: mod_shared_roster_odbc.erl:1039 web/ejabberd_web_admin.erl:833
#: web/ejabberd_web_admin.erl:874 web/ejabberd_web_admin.erl:942
#: web/ejabberd_web_admin.erl:978 web/ejabberd_web_admin.erl:1019
#: web/ejabberd_web_admin.erl:1508 web/ejabberd_web_admin.erl:1760
#: web/ejabberd_web_admin.erl:1931 web/ejabberd_web_admin.erl:1963
#: web/ejabberd_web_admin.erl:2031 web/ejabberd_web_admin.erl:2135
#: web/ejabberd_web_admin.erl:2160 web/ejabberd_web_admin.erl:2248
msgid "Submitted"
msgstr "送信完了"
#: mod_offline.erl:571
msgid "Time"
msgstr "時間"
#: mod_offline.erl:572
msgid "From"
msgstr "差出人"
#: mod_offline.erl:573
msgid "To"
msgstr "宛先"
#: mod_offline.erl:574 mod_offline_odbc.erl:419
msgid "Packet"
msgstr "パケット"
#: mod_offline.erl:587 mod_offline_odbc.erl:432 mod_shared_roster.erl:908
#: mod_shared_roster_odbc.erl:937 web/ejabberd_web_admin.erl:882
#: web/ejabberd_web_admin.erl:986
msgid "Delete Selected"
msgstr "選択した項目を削除"
#: mod_offline.erl:645 mod_offline_odbc.erl:519
msgid "Offline Messages:"
msgstr "オフラインメッセージ:"
#: mod_offline.erl:645 mod_offline_odbc.erl:519
msgid "Remove All Offline Messages"
msgstr "すべてのオフラインメッセージを削除"
#: mod_proxy65/mod_proxy65_service.erl:213
msgid "ejabberd SOCKS5 Bytestreams module"
msgstr "ejabberd SOCKS5 Bytestreams モジュール"
#: mod_pubsub/mod_pubsub.erl:1120 mod_pubsub/mod_pubsub_odbc.erl:929
msgid "Publish-Subscribe"
msgstr "Publish-Subscribe"
#: mod_pubsub/mod_pubsub.erl:1214 mod_pubsub/mod_pubsub_odbc.erl:1025
msgid "ejabberd Publish-Subscribe module"
msgstr "ejabberd Publish-Subscribe モジュール"
#: mod_pubsub/mod_pubsub.erl:1497 mod_pubsub/mod_pubsub_odbc.erl:1312
msgid "PubSub subscriber request"
msgstr "PubSub 購読者のリクエスト"
#: mod_pubsub/mod_pubsub.erl:1499 mod_pubsub/mod_pubsub_odbc.erl:1314
msgid "Choose whether to approve this entity's subscription."
msgstr "このエントリを承認するかどうかを選択してください"
#: mod_pubsub/mod_pubsub.erl:1505 mod_pubsub/mod_pubsub_odbc.erl:1320
msgid "Node ID"
msgstr "ノードID"
#: mod_pubsub/mod_pubsub.erl:1510 mod_pubsub/mod_pubsub_odbc.erl:1325
msgid "Subscriber Address"
msgstr "購読者のアドレス"
#: mod_pubsub/mod_pubsub.erl:1516 mod_pubsub/mod_pubsub_odbc.erl:1331
msgid "Allow this Jabber ID to subscribe to this pubsub node?"
msgstr "この Jabber ID に、この pubsubノードの購読を許可しますか ?"
#: mod_pubsub/mod_pubsub.erl:3474 mod_pubsub/mod_pubsub_odbc.erl:3287
msgid "Deliver payloads with event notifications"
msgstr "イベント通知と同時にペイロードを配送する"
#: mod_pubsub/mod_pubsub.erl:3475 mod_pubsub/mod_pubsub_odbc.erl:3288
msgid "Deliver event notifications"
msgstr "イベント通知を配送する"
#: mod_pubsub/mod_pubsub.erl:3476 mod_pubsub/mod_pubsub_odbc.erl:3289
msgid "Notify subscribers when the node configuration changes"
msgstr "ノード設定に変更があった時に購読者へ通知する"
#: mod_pubsub/mod_pubsub.erl:3477 mod_pubsub/mod_pubsub_odbc.erl:3290
msgid "Notify subscribers when the node is deleted"
msgstr "ノードが削除された時に購読者へ通知する"
#: mod_pubsub/mod_pubsub.erl:3478 mod_pubsub/mod_pubsub_odbc.erl:3291
msgid "Notify subscribers when items are removed from the node"
msgstr "アイテムがノードから消された時に購読者へ通知する"
#: mod_pubsub/mod_pubsub.erl:3479 mod_pubsub/mod_pubsub_odbc.erl:3292
msgid "Persist items to storage"
msgstr "アイテムをストレージに保存する"
#: mod_pubsub/mod_pubsub.erl:3480 mod_pubsub/mod_pubsub_odbc.erl:3293
msgid "A friendly name for the node"
msgstr "ノードのフレンドリネーム"
#: mod_pubsub/mod_pubsub.erl:3481 mod_pubsub/mod_pubsub_odbc.erl:3294
msgid "Max # of items to persist"
msgstr "アイテムの最大保存数"
#: mod_pubsub/mod_pubsub.erl:3482 mod_pubsub/mod_pubsub_odbc.erl:3295
msgid "Whether to allow subscriptions"
msgstr "購読を許可するかどうか"
#: mod_pubsub/mod_pubsub.erl:3483 mod_pubsub/mod_pubsub_odbc.erl:3296
msgid "Specify the access model"
msgstr "アクセスモデルを設定する"
#: mod_pubsub/mod_pubsub.erl:3486 mod_pubsub/mod_pubsub_odbc.erl:3299
msgid "Roster groups allowed to subscribe"
msgstr "名簿グループは購読を許可しました"
#: mod_pubsub/mod_pubsub.erl:3487 mod_pubsub/mod_pubsub_odbc.erl:3300
msgid "Specify the publisher model"
msgstr "公開モデルを指定する"
#: mod_pubsub/mod_pubsub.erl:3489 mod_pubsub/mod_pubsub_odbc.erl:3302
msgid "Purge all items when the relevant publisher goes offline"
msgstr "公開者がオフラインになるときに、すべてのアイテムを削除"
#: mod_pubsub/mod_pubsub.erl:3490 mod_pubsub/mod_pubsub_odbc.erl:3303
msgid "Specify the event message type"
msgstr "イベントメッセージ種別を設定"
#: mod_pubsub/mod_pubsub.erl:3492 mod_pubsub/mod_pubsub_odbc.erl:3305
msgid "Max payload size in bytes"
msgstr "最大ぺイロードサイズ (byte)"
#: mod_pubsub/mod_pubsub.erl:3493 mod_pubsub/mod_pubsub_odbc.erl:3306
msgid "When to send the last published item"
msgstr "最後の公開アイテムを送信するタイミングで"
#: mod_pubsub/mod_pubsub.erl:3495 mod_pubsub/mod_pubsub_odbc.erl:3308
msgid "Only deliver notifications to available users"
msgstr "有効なユーザーにのみ告知を送信する"
#: mod_pubsub/mod_pubsub.erl:3496 mod_pubsub/mod_pubsub_odbc.erl:3309
msgid "The collections with which a node is affiliated"
msgstr "提携されたノードの集合です"
#: mod_register.erl:193
msgid "The CAPTCHA verification has failed"
msgstr "CAPTCHA 検証は失敗しました"
#: mod_register.erl:220
msgid "You need a client that supports x:data and CAPTCHA to register"
msgstr "登録を行うには x:data と CAPTCHA をサポートするクライアントが必要です"
#: mod_register.erl:226 mod_register.erl:265
msgid "Choose a username and password to register with this server"
msgstr "サーバーに登録するユーザー名とパスワードを選択してください"
#: mod_register.erl:230 mod_vcard.erl:364 mod_vcard_odbc.erl:342
#: web/ejabberd_web_admin.erl:1515 web/ejabberd_web_admin.erl:1572
msgid "User"
msgstr "ユーザー"
#: mod_register.erl:316 mod_register.erl:361
msgid "The password is too weak"
msgstr "このパスワードは単純過ぎます"
#: mod_register.erl:365
msgid "Users are not allowed to register accounts so quickly"
msgstr "それほど速くアカウントを登録することはできません"
#: mod_roster.erl:938 mod_roster_odbc.erl:1055 web/ejabberd_web_admin.erl:1701
#: web/ejabberd_web_admin.erl:1886 web/ejabberd_web_admin.erl:1897
#: web/ejabberd_web_admin.erl:2219
msgid "None"
msgstr "なし"
#: mod_roster.erl:945 mod_roster_odbc.erl:1062
msgid "Subscription"
msgstr "認可"
#: mod_roster.erl:946 mod_roster_odbc.erl:1063
msgid "Pending"
msgstr "保留"
#: mod_roster.erl:947 mod_roster_odbc.erl:1064
msgid "Groups"
msgstr "グループ"
#: mod_roster.erl:974 mod_roster_odbc.erl:1091
msgid "Validate"
msgstr "検証"
#: mod_roster.erl:982 mod_roster_odbc.erl:1099
msgid "Remove"
msgstr "削除"
#: mod_roster.erl:985 mod_roster_odbc.erl:1102
msgid "Roster of "
msgstr "名簿: "
#: mod_roster.erl:988 mod_roster_odbc.erl:1105 mod_shared_roster.erl:902
#: mod_shared_roster.erl:1011 mod_shared_roster_odbc.erl:931
#: mod_shared_roster_odbc.erl:1040 web/ejabberd_web_admin.erl:834
#: web/ejabberd_web_admin.erl:875 web/ejabberd_web_admin.erl:943
#: web/ejabberd_web_admin.erl:979 web/ejabberd_web_admin.erl:1020
#: web/ejabberd_web_admin.erl:1509 web/ejabberd_web_admin.erl:1761
#: web/ejabberd_web_admin.erl:1932 web/ejabberd_web_admin.erl:2136
#: web/ejabberd_web_admin.erl:2161
msgid "Bad format"
msgstr "不正なフォーマット"
#: mod_roster.erl:995 mod_roster_odbc.erl:1112
msgid "Add Jabber ID"
msgstr "Jabber ID を追加"
#: mod_roster.erl:1094 mod_roster_odbc.erl:1211
msgid "Roster"
msgstr "名簿"
#: mod_shared_roster.erl:857 mod_shared_roster.erl:899
#: mod_shared_roster.erl:1007 mod_shared_roster_odbc.erl:886
#: mod_shared_roster_odbc.erl:928 mod_shared_roster_odbc.erl:1036
msgid "Shared Roster Groups"
msgstr "共有名簿グループ"
#: mod_shared_roster.erl:895 mod_shared_roster_odbc.erl:924
#: web/ejabberd_web_admin.erl:1365 web/ejabberd_web_admin.erl:2461
msgid "Add New"
msgstr "新規追加"
#: mod_shared_roster.erl:978 mod_shared_roster_odbc.erl:1007
msgid "Name:"
msgstr "名前:"
#: mod_shared_roster.erl:983 mod_shared_roster_odbc.erl:1012
msgid "Description:"
msgstr "説明:"
#: mod_shared_roster.erl:991 mod_shared_roster_odbc.erl:1020
msgid "Members:"
msgstr "メンバー:"
#: mod_shared_roster.erl:999 mod_shared_roster_odbc.erl:1028
msgid "Displayed Groups:"
msgstr "表示グループ"
#: mod_shared_roster.erl:1008 mod_shared_roster_odbc.erl:1037
msgid "Group "
msgstr "グループ"
#: mod_shared_roster.erl:1017 mod_shared_roster_odbc.erl:1046
#: web/ejabberd_web_admin.erl:840 web/ejabberd_web_admin.erl:884
#: web/ejabberd_web_admin.erl:949 web/ejabberd_web_admin.erl:1026
#: web/ejabberd_web_admin.erl:2017
msgid "Submit"
msgstr "送信"
#: mod_vcard.erl:165 mod_vcard_ldap.erl:238 mod_vcard_odbc.erl:129
msgid "Erlang Jabber Server"
msgstr "Erlang Jabber Server"
#: mod_vcard.erl:364 mod_vcard.erl:478 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:454
msgid "Birthday"
msgstr "誕生日"
#: mod_vcard.erl:364 mod_vcard.erl:480 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:456
msgid "City"
msgstr "都道府県"
#: mod_vcard.erl:364 mod_vcard.erl:479 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:455
msgid "Country"
msgstr "国"
#: mod_vcard.erl:364 mod_vcard.erl:481 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:457
msgid "Email"
msgstr "メールアドレス"
#: mod_vcard.erl:364 mod_vcard.erl:476 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:452
msgid "Family Name"
msgstr "姓"
#: mod_vcard.erl:364 mod_vcard_odbc.erl:342
msgid ""
"Fill in the form to search for any matching Jabber User (Add * to the end of "
"field to match substring)"
msgstr ""
"欄を埋めて Jabber User を検索してください (* を使用すると部分文字列にマッチし"
"ます)"
#: mod_vcard.erl:364 mod_vcard.erl:473 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:449
msgid "Full Name"
msgstr "氏名"
#: mod_vcard.erl:364 mod_vcard.erl:475 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:451
msgid "Middle Name"
msgstr "ミドルネーム"
#: mod_vcard.erl:364 mod_vcard.erl:474 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:450 web/ejabberd_web_admin.erl:2006
msgid "Name"
msgstr "名"
#: mod_vcard.erl:364 mod_vcard.erl:482 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:458
msgid "Organization Name"
msgstr "会社名"
#: mod_vcard.erl:364 mod_vcard.erl:483 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:459
msgid "Organization Unit"
msgstr "部署名"
#: mod_vcard.erl:364 mod_vcard_ldap.erl:462 mod_vcard_odbc.erl:342
msgid "Search users in "
msgstr "ユーザーの検索: "
#: mod_vcard.erl:364 mod_vcard_ldap.erl:462 mod_vcard_odbc.erl:342
msgid "You need an x:data capable client to search"
msgstr "検索を行うためには x:data をサポートするクライアントが必要です"
#: mod_vcard.erl:389 mod_vcard_ldap.erl:487 mod_vcard_odbc.erl:367
msgid "vCard User Search"
msgstr "vCard ユーザー検索"
#: mod_vcard.erl:445 mod_vcard_ldap.erl:541 mod_vcard_odbc.erl:421
msgid "ejabberd vCard module"
msgstr "ejabberd vCard モジュール"
#: mod_vcard.erl:469 mod_vcard_ldap.erl:551 mod_vcard_odbc.erl:445
msgid "Search Results for "
msgstr "検索結果: "
#: mod_vcard_ldap.erl:462
msgid "Fill in fields to search for any matching Jabber User"
msgstr "欄を埋めて Jabber User を検索してください"
#: web/ejabberd_web_admin.erl:193 web/ejabberd_web_admin.erl:203
#: web/ejabberd_web_admin.erl:219 web/ejabberd_web_admin.erl:229
msgid "Unauthorized"
msgstr "認証されていません"
#: web/ejabberd_web_admin.erl:286 web/ejabberd_web_admin.erl:303
msgid "ejabberd Web Admin"
msgstr "ejabberd ウェブ管理"
#: web/ejabberd_web_admin.erl:769 web/ejabberd_web_admin.erl:780
msgid "Administration"
msgstr "管理"
#: web/ejabberd_web_admin.erl:878 web/ejabberd_web_admin.erl:982
msgid "Raw"
msgstr "Raw"
#: web/ejabberd_web_admin.erl:1017
msgid "~s access rule configuration"
msgstr "~s アクセスルール設定"
#: web/ejabberd_web_admin.erl:1035
msgid "Virtual Hosts"
msgstr "ヴァーチャルホスト"
#: web/ejabberd_web_admin.erl:1043 web/ejabberd_web_admin.erl:1050
msgid "Users"
msgstr "ユーザー"
#: web/ejabberd_web_admin.erl:1078
msgid "Users Last Activity"
msgstr "ユーザーの活動履歴"
#: web/ejabberd_web_admin.erl:1080
msgid "Period: "
msgstr "期間: "
#: web/ejabberd_web_admin.erl:1090
msgid "Last month"
msgstr "先月"
#: web/ejabberd_web_admin.erl:1091
msgid "Last year"
msgstr "去年"
#: web/ejabberd_web_admin.erl:1092
msgid "All activity"
msgstr "すべて"
#: web/ejabberd_web_admin.erl:1094
msgid "Show Ordinary Table"
msgstr "通常の表を表示"
#: web/ejabberd_web_admin.erl:1096
msgid "Show Integral Table"
msgstr "累積の表を表示"
#: web/ejabberd_web_admin.erl:1105 web/ejabberd_web_admin.erl:1939
msgid "Statistics"
msgstr "統計"
#: web/ejabberd_web_admin.erl:1117
msgid "Not Found"
msgstr "見つかりません"
#: web/ejabberd_web_admin.erl:1134
msgid "Node not found"
msgstr "ノードが見つかりません"
#: web/ejabberd_web_admin.erl:1460
msgid "Host"
msgstr "ホスト"
#: web/ejabberd_web_admin.erl:1461
msgid "Registered Users"
msgstr "登録ユーザー"
#: web/ejabberd_web_admin.erl:1573
msgid "Offline Messages"
msgstr "オフラインメッセージ"
#: web/ejabberd_web_admin.erl:1574 web/ejabberd_web_admin.erl:1767
msgid "Last Activity"
msgstr "活動履歴"
#: web/ejabberd_web_admin.erl:1659 web/ejabberd_web_admin.erl:1675
msgid "Registered Users:"
msgstr "登録ユーザー:"
#: web/ejabberd_web_admin.erl:1661 web/ejabberd_web_admin.erl:1677
#: web/ejabberd_web_admin.erl:2192
msgid "Online Users:"
msgstr "オンラインユーザー:"
#: web/ejabberd_web_admin.erl:1663
msgid "Outgoing s2s Connections:"
msgstr "外向き s2s コネクション:"
#: web/ejabberd_web_admin.erl:1665
msgid "Outgoing s2s Servers:"
msgstr "外向き s2s サービス:"
#: web/ejabberd_web_admin.erl:1734 web/mod_register_web.erl:175
#: web/mod_register_web.erl:372 web/mod_register_web.erl:381
#: web/mod_register_web.erl:411
msgid "Change Password"
msgstr "パスワードを変更"
#: web/ejabberd_web_admin.erl:1758
msgid "User "
msgstr "ユーザー "
#: web/ejabberd_web_admin.erl:1765
msgid "Connected Resources:"
msgstr "接続リソース:"
#: web/ejabberd_web_admin.erl:1766 web/mod_register_web.erl:227
#: web/mod_register_web.erl:519
msgid "Password:"
msgstr "パスワード"
#: web/ejabberd_web_admin.erl:1828
msgid "No Data"
msgstr "データなし"
#: web/ejabberd_web_admin.erl:1906
msgid "Nodes"
msgstr "ノード"
#: web/ejabberd_web_admin.erl:1929 web/ejabberd_web_admin.erl:1951
msgid "Node "
msgstr "ノード "
#: web/ejabberd_web_admin.erl:1938
msgid "Listened Ports"
msgstr "Listen ポート"
#: web/ejabberd_web_admin.erl:1940 web/ejabberd_web_admin.erl:2260
#: web/ejabberd_web_admin.erl:2448
msgid "Update"
msgstr "更新"
#: web/ejabberd_web_admin.erl:1943 web/ejabberd_web_admin.erl:2569
msgid "Restart"
msgstr "再起動"
#: web/ejabberd_web_admin.erl:1945 web/ejabberd_web_admin.erl:2571
msgid "Stop"
msgstr "停止"
#: web/ejabberd_web_admin.erl:1959
msgid "RPC Call Error"
msgstr "RPC 呼び出しエラー"
#: web/ejabberd_web_admin.erl:2000
msgid "Database Tables at "
msgstr "データーベーステーブル: "
#: web/ejabberd_web_admin.erl:2007
msgid "Storage Type"
msgstr "ストレージタイプ"
#: web/ejabberd_web_admin.erl:2008
msgid "Elements"
msgstr "要素"
#: web/ejabberd_web_admin.erl:2009
msgid "Memory"
msgstr "メモリ"
#: web/ejabberd_web_admin.erl:2032 web/ejabberd_web_admin.erl:2137
msgid "Error"
msgstr "エラー"
#: web/ejabberd_web_admin.erl:2034
msgid "Backup of "
msgstr "バックアップ: "
#: web/ejabberd_web_admin.erl:2036
msgid ""
"Please note that these options will only backup the builtin Mnesia database. "
"If you are using the ODBC module, you also need to backup your SQL database "
"separately."
msgstr ""
"これらのオプションは組み込みの Mnesia データーベースのバックアップのみを行う"
"ことに注意してください。もし ODBC モジュールを使用している場合は、SQL デー"
"ターベースのバックアップを別に行う必要があります。"
#: web/ejabberd_web_admin.erl:2041
msgid "Store binary backup:"
msgstr "バイナリバックアップを保存:"
#: web/ejabberd_web_admin.erl:2045 web/ejabberd_web_admin.erl:2052
#: web/ejabberd_web_admin.erl:2060 web/ejabberd_web_admin.erl:2067
#: web/ejabberd_web_admin.erl:2074 web/ejabberd_web_admin.erl:2081
#: web/ejabberd_web_admin.erl:2088 web/ejabberd_web_admin.erl:2096
#: web/ejabberd_web_admin.erl:2103 web/ejabberd_web_admin.erl:2110
msgid "OK"
msgstr "OK"
#: web/ejabberd_web_admin.erl:2048
msgid "Restore binary backup immediately:"
msgstr "直ちにバイナリバックアップからリストア:"
#: web/ejabberd_web_admin.erl:2056
msgid ""
"Restore binary backup after next ejabberd restart (requires less memory):"
msgstr "ejabberd の再起動時にバイナリバックアップからリストア (メモリ少):"
#: web/ejabberd_web_admin.erl:2063
msgid "Store plain text backup:"
msgstr "プレーンテキストバックアップを保存:"
#: web/ejabberd_web_admin.erl:2070
msgid "Restore plain text backup immediately:"
msgstr "直ちにプレーンテキストバックアップからリストア:"
#: web/ejabberd_web_admin.erl:2077
msgid "Import users data from a PIEFXIS file (XEP-0227):"
msgstr "ユーザーデータを PIEFXIS ファイルからインポート (XEP-0227):"
#: web/ejabberd_web_admin.erl:2084
msgid "Export data of all users in the server to PIEFXIS files (XEP-0227):"
msgstr ""
"サーバーにあるすべてのユーザーデータを PIEFXIS ファイルにエクスポート "
"(XEP-0227):"
#: web/ejabberd_web_admin.erl:2091
msgid "Export data of users in a host to PIEFXIS files (XEP-0227):"
msgstr "ホストのユーザーデータを PIEFXIS ファイルにエクスポート (XEP-0227):"
#: web/ejabberd_web_admin.erl:2099
msgid "Import user data from jabberd14 spool file:"
msgstr "ユーザーデータを jabberd14 Spool ファイルからインポート:"
#: web/ejabberd_web_admin.erl:2106
msgid "Import users data from jabberd14 spool directory:"
msgstr "ユーザーデータを jabberd14 Spool ディレクトリからインポート:"
#: web/ejabberd_web_admin.erl:2132
msgid "Listened Ports at "
msgstr "Listen ポート "
#: web/ejabberd_web_admin.erl:2157
msgid "Modules at "
msgstr "モジュール "
#: web/ejabberd_web_admin.erl:2183
msgid "Statistics of ~p"
msgstr "~p の統計"
#: web/ejabberd_web_admin.erl:2186
msgid "Uptime:"
msgstr "起動時間:"
#: web/ejabberd_web_admin.erl:2189
msgid "CPU Time:"
msgstr "CPU時間:"
#: web/ejabberd_web_admin.erl:2195
msgid "Transactions Committed:"
msgstr "トランザクションのコミット:"
#: web/ejabberd_web_admin.erl:2198
msgid "Transactions Aborted:"
msgstr "トランザクションの失敗:"
#: web/ejabberd_web_admin.erl:2201
msgid "Transactions Restarted:"
msgstr "トランザクションの再起動:"
#: web/ejabberd_web_admin.erl:2204
msgid "Transactions Logged:"
msgstr "トランザクションのログ: "
#: web/ejabberd_web_admin.erl:2246
msgid "Update "
msgstr "更新 "
#: web/ejabberd_web_admin.erl:2254
msgid "Update plan"
msgstr "更新計画"
#: web/ejabberd_web_admin.erl:2255
msgid "Modified modules"
msgstr "変更されたモジュール"
#: web/ejabberd_web_admin.erl:2256
msgid "Update script"
msgstr "スクリプトの更新"
#: web/ejabberd_web_admin.erl:2257
msgid "Low level update script"
msgstr "低レベル更新スクリプト"
#: web/ejabberd_web_admin.erl:2258
msgid "Script check"
msgstr "スクリプトチェック"
#: web/ejabberd_web_admin.erl:2426
msgid "Port"
msgstr "ポート"
#: web/ejabberd_web_admin.erl:2427
msgid "IP"
msgstr "IP"
#: web/ejabberd_web_admin.erl:2428
msgid "Protocol"
msgstr "プロトコル"
#: web/ejabberd_web_admin.erl:2429 web/ejabberd_web_admin.erl:2556
msgid "Module"
msgstr "モジュール"
#: web/ejabberd_web_admin.erl:2430 web/ejabberd_web_admin.erl:2557
msgid "Options"
msgstr "オプション"
#: web/ejabberd_web_admin.erl:2450
msgid "Delete"
msgstr "削除"
#: web/ejabberd_web_admin.erl:2579
msgid "Start"
msgstr "開始"
#: web/mod_register_web.erl:104
msgid "Your Jabber account was successfully created."
msgstr "Jabber アカウントの作成に成功しました。"
#: web/mod_register_web.erl:107
msgid "There was an error creating the account: "
msgstr "アカウントの作成中にエラーが発生しました: "
#: web/mod_register_web.erl:115
msgid "Your Jabber account was successfully deleted."
msgstr "Jabber アカウントの削除に成功しました。"
#: web/mod_register_web.erl:118
msgid "There was an error deleting the account: "
msgstr "アカウントの削除中にエラーが発生しました: "
#: web/mod_register_web.erl:128
msgid "The password of your Jabber account was successfully changed."
msgstr "Jabber アカウントのパスワード変更に成功しました。"
#: web/mod_register_web.erl:131
msgid "There was an error changing the password: "
msgstr "パスワードの変更中にエラーが発生しました: "
#: web/mod_register_web.erl:163 web/mod_register_web.erl:172
msgid "Jabber Account Registration"
msgstr "Jabber アカウント登録"
#: web/mod_register_web.erl:174 web/mod_register_web.erl:192
#: web/mod_register_web.erl:201
msgid "Register a Jabber account"
msgstr "Jabber アカウントを登録"
#: web/mod_register_web.erl:176 web/mod_register_web.erl:493
#: web/mod_register_web.erl:502
msgid "Unregister a Jabber account"
msgstr "Jabber アカウントを削除"
#: web/mod_register_web.erl:203
msgid ""
"This page allows to create a Jabber account in this Jabber server. Your JID "
"(Jabber IDentifier) will be of the form: username@server. Please read "
"carefully the instructions to fill correctly the fields."
msgstr ""
"ここはこの Jabber サーバーにアカウントを作成するページです。あなたの JID "
"(JabberID) は username@server のような形式になります。注意事項どおり、正しく"
"項目を記入してください。"
#: web/mod_register_web.erl:212 web/mod_register_web.erl:386
#: web/mod_register_web.erl:509
msgid "Username:"
msgstr "ユーザー名:"
#: web/mod_register_web.erl:217
msgid "This is case insensitive: macbeth is the same that MacBeth and Macbeth."
msgstr ""
"大文字と小文字は区別しません: macbeth は MacBeth や Macbeth と同じです。"
#: web/mod_register_web.erl:218
msgid "Characters not allowed:"
msgstr "使用できない文字:"
#: web/mod_register_web.erl:222 web/mod_register_web.erl:391
#: web/mod_register_web.erl:514
msgid "Server:"
msgstr "サーバー:"
#: web/mod_register_web.erl:232
msgid ""
"Don't tell your password to anybody, not even the administrators of the "
"Jabber server."
msgstr ""
"パスワードは誰にも教えないようにしてください。Jabber サーバーの管理者があなた"
"にパスワードを尋ねることはありません。"
#: web/mod_register_web.erl:234
msgid "You can later change your password using a Jabber client."
msgstr "あなたは後で Jabber クライアントを使用してパスワードを変更できます。"
#: web/mod_register_web.erl:235
msgid ""
"Some Jabber clients can store your password in your computer. Use that "
"feature only if you trust your computer is safe."
msgstr ""
"Jabber クライアントはコンピューターにパスワードを記憶できます。コンピューター"
"が安全であると信頼できる場合にのみ、この機能を使用してください。"
#: web/mod_register_web.erl:237
msgid ""
"Memorize your password, or write it in a paper placed in a safe place. In "
"Jabber there isn't an automated way to recover your password if you forget "
"it."
msgstr ""
"パスワードは記憶するか、紙に書いて安全な場所に保管してください。もしあなたが"
"パスワードを忘れてしまった場合、Jabber ではパスワードのリカバリを自動的に行う"
"ことはできません。"
#: web/mod_register_web.erl:242 web/mod_register_web.erl:406
msgid "Password Verification:"
msgstr "パスワード (確認):"
#: web/mod_register_web.erl:250
msgid "Register"
msgstr "登録"
#: web/mod_register_web.erl:396
msgid "Old Password:"
msgstr "古いパスワード:"
#: web/mod_register_web.erl:401
msgid "New Password:"
msgstr "新しいパスワード:"
#: web/mod_register_web.erl:504
msgid "This page allows to unregister a Jabber account in this Jabber server."
msgstr "ここはこの Jabber サーバーのアカウントを削除するページです。"
#: web/mod_register_web.erl:524
msgid "Unregister"
msgstr "削除"
#~ msgid "ejabberd virtual hosts"
#~ msgstr "ejabberd ヴァーチャルホスト"
#~ msgid "Captcha test failed"
#~ msgstr "キャプチャのテストに失敗しました"
#~ msgid "Encodings"
#~ msgstr "エンコーディング"
#~ msgid "(Raw)"
#~ msgstr "(Raw)"
#~ msgid "Specified nickname is already registered"
#~ msgstr "指定されたニックネームは既に登録されています"
#~ msgid "Size"
#~ msgstr "サイズ"
ejabberd-2.1.11/src/msgs/uk.po 0000664 0000000 0000000 00000200046 12240230175 012737 0 ustar msgid ""
msgstr ""
"Project-Id-Version: 2.1.0-alpha\n"
"POT-Creation-Date: \n"
"PO-Revision-Date: \n"
"Last-Translator: Konstantin Khomoutov \n"
"Language-Team: \n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Language: Ukrainian (українська)\n"
"X-Additional-Translator: Ruslan Rakhmanin\n"
"X-Additional-Translator: Stoune\n"
"X-Additional-Translator: Sergei Golovan\n"
#: ejabberd_c2s.erl:424 ejabberd_c2s.erl:727
msgid "Use of STARTTLS required"
msgstr "Ви мусите використовувати STARTTLS"
#: ejabberd_c2s.erl:503
msgid "No resource provided"
msgstr "Не вказаний ресурс"
#: ejabberd_c2s.erl:1197
msgid "Replaced by new connection"
msgstr "Замінено новим з'єднанням"
#: ejabberd_c2s.erl:1885
msgid "Your active privacy list has denied the routing of this stanza."
msgstr "Маршрутизація цієї строфи була відмінена активним списком приватності."
#: ejabberd_captcha.erl:96 ejabberd_captcha.erl:152 ejabberd_captcha.erl:178
msgid "Enter the text you see"
msgstr "Введіть текст, що ви бачите"
#: ejabberd_captcha.erl:101
msgid "Your messages to ~s are being blocked. To unblock them, visit ~s"
msgstr "Ваші повідомлення до ~s блокуються. Для розблокування відвідайте ~s"
#: ejabberd_captcha.erl:134
msgid "If you don't see the CAPTCHA image here, visit the web page."
msgstr "Якщо ви не бачите зображення капчі, перейдіть за за цією адресою."
#: ejabberd_captcha.erl:146
msgid "CAPTCHA web page"
msgstr "Адреса капчі"
#: ejabberd_captcha.erl:307
msgid "The CAPTCHA is valid."
msgstr "Перевірку капчею закінчено успішно"
#: mod_adhoc.erl:95 mod_adhoc.erl:125 mod_adhoc.erl:143 mod_adhoc.erl:161
msgid "Commands"
msgstr "Команди"
#: mod_adhoc.erl:149 mod_adhoc.erl:243
msgid "Ping"
msgstr "Пінг"
#: mod_adhoc.erl:260
msgid "Pong"
msgstr "Понг"
#: mod_announce.erl:507 mod_announce_odbc.erl:499
msgid "Really delete message of the day?"
msgstr "Насправді видалити повідомлення дня?"
#: mod_announce.erl:515 mod_announce_odbc.erl:507 mod_configure.erl:1083
#: mod_configure.erl:1128
msgid "Subject"
msgstr "Тема"
#: mod_announce.erl:520 mod_announce_odbc.erl:512 mod_configure.erl:1088
#: mod_configure.erl:1133
msgid "Message body"
msgstr "Тіло повідомлення"
#: mod_announce.erl:600 mod_announce_odbc.erl:592
msgid "No body provided for announce message"
msgstr "Тіло оголошення має бути непустим"
#: mod_announce.erl:635 mod_announce_odbc.erl:627
msgid "Announcements"
msgstr "Сповіщення"
#: mod_announce.erl:637 mod_announce_odbc.erl:629
msgid "Send announcement to all users"
msgstr "Надіслати сповіщення всім користувачам"
#: mod_announce.erl:639 mod_announce_odbc.erl:631
msgid "Send announcement to all users on all hosts"
msgstr "Надіслати сповіщення до усіх користувачів на усіх хостах"
#: mod_announce.erl:641 mod_announce_odbc.erl:633
msgid "Send announcement to all online users"
msgstr "Надіслати сповіщення всім підключеним користувачам"
#: mod_announce.erl:643 mod_announce_odbc.erl:635 mod_configure.erl:1078
#: mod_configure.erl:1123
msgid "Send announcement to all online users on all hosts"
msgstr ""
"Надіслати сповіщення всім підключеним користувачам на всіх віртуальних "
"серверах"
#: mod_announce.erl:645 mod_announce_odbc.erl:637
msgid "Set message of the day and send to online users"
msgstr "Встановити повідомлення дня та надіслати його підключеним користувачам"
#: mod_announce.erl:647 mod_announce_odbc.erl:639
msgid "Set message of the day on all hosts and send to online users"
msgstr ""
"Встановити повідомлення дня на всіх хостах та надійслати його підключеним "
"користувачам"
#: mod_announce.erl:649 mod_announce_odbc.erl:641
msgid "Update message of the day (don't send)"
msgstr "Оновити повідомлення дня (не надсилати)"
#: mod_announce.erl:651 mod_announce_odbc.erl:643
msgid "Update message of the day on all hosts (don't send)"
msgstr "Оновити повідомлення дня на всіх хостах (не надсилати)"
#: mod_announce.erl:653 mod_announce_odbc.erl:645
msgid "Delete message of the day"
msgstr "Видалити повідомлення дня"
#: mod_announce.erl:655 mod_announce_odbc.erl:647
msgid "Delete message of the day on all hosts"
msgstr "Видалити повідомлення дня на усіх хостах"
#: mod_configure.erl:114 mod_configure.erl:274 mod_configure.erl:296
#: mod_configure.erl:498
msgid "Configuration"
msgstr "Конфігурація"
#: mod_configure.erl:125 mod_configure.erl:576 web/ejabberd_web_admin.erl:1936
msgid "Database"
msgstr "База даних"
#: mod_configure.erl:127 mod_configure.erl:595
msgid "Start Modules"
msgstr "Запуск модулів"
#: mod_configure.erl:129 mod_configure.erl:596
msgid "Stop Modules"
msgstr "Зупинка модулів"
#: mod_configure.erl:131 mod_configure.erl:604 web/ejabberd_web_admin.erl:1937
msgid "Backup"
msgstr "Резервне копіювання"
#: mod_configure.erl:133 mod_configure.erl:605
msgid "Restore"
msgstr "Відновлення з резервної копії"
#: mod_configure.erl:135 mod_configure.erl:606
msgid "Dump to Text File"
msgstr "Копіювання в текстовий файл"
#: mod_configure.erl:137 mod_configure.erl:615
msgid "Import File"
msgstr "Імпорт з файла"
#: mod_configure.erl:139 mod_configure.erl:616
msgid "Import Directory"
msgstr "Імпорт з директорії"
#: mod_configure.erl:141 mod_configure.erl:581 mod_configure.erl:1057
msgid "Restart Service"
msgstr "Перезапустити Сервіс"
#: mod_configure.erl:143 mod_configure.erl:582 mod_configure.erl:1102
msgid "Shut Down Service"
msgstr "Вимкнути Сервіс"
#: mod_configure.erl:145 mod_configure.erl:518 mod_configure.erl:1197
#: web/ejabberd_web_admin.erl:1527
msgid "Add User"
msgstr "Додати користувача"
#: mod_configure.erl:147 mod_configure.erl:519 mod_configure.erl:1219
msgid "Delete User"
msgstr "Видалити Користувача"
#: mod_configure.erl:149 mod_configure.erl:520 mod_configure.erl:1231
msgid "End User Session"
msgstr "Закінчити Сеанс Користувача"
#: mod_configure.erl:151 mod_configure.erl:521 mod_configure.erl:1243
#: mod_configure.erl:1255
msgid "Get User Password"
msgstr "Отримати Пароль Користувача"
#: mod_configure.erl:153 mod_configure.erl:522
msgid "Change User Password"
msgstr "Змінити Пароль Користувача"
#: mod_configure.erl:155 mod_configure.erl:523 mod_configure.erl:1272
msgid "Get User Last Login Time"
msgstr "Отримати Час Останнього Підключення Користувача"
#: mod_configure.erl:157 mod_configure.erl:524 mod_configure.erl:1284
msgid "Get User Statistics"
msgstr "Отримати Статистику по Користувачу"
#: mod_configure.erl:159 mod_configure.erl:525
msgid "Get Number of Registered Users"
msgstr "Отримати Кількість Зареєстрованих Користувачів"
#: mod_configure.erl:161 mod_configure.erl:526
msgid "Get Number of Online Users"
msgstr "Отримати Кількість Підключених Користувачів"
#: mod_configure.erl:163 mod_configure.erl:509 web/ejabberd_web_admin.erl:831
#: web/ejabberd_web_admin.erl:872
msgid "Access Control Lists"
msgstr "Списки керування доступом"
#: mod_configure.erl:165 mod_configure.erl:510 web/ejabberd_web_admin.erl:940
#: web/ejabberd_web_admin.erl:976
msgid "Access Rules"
msgstr "Правила доступу"
#: mod_configure.erl:297 mod_configure.erl:499
msgid "User Management"
msgstr "Управління Користувачами"
#: mod_configure.erl:500 web/ejabberd_web_admin.erl:1058
#: web/ejabberd_web_admin.erl:1462
msgid "Online Users"
msgstr "Підключені користувачі"
#: mod_configure.erl:501
msgid "All Users"
msgstr "Всі користувачі"
#: mod_configure.erl:502
msgid "Outgoing s2s Connections"
msgstr "Вихідні s2s-з'єднання"
#: mod_configure.erl:503 web/ejabberd_web_admin.erl:1907
msgid "Running Nodes"
msgstr "Працюючі вузли"
#: mod_configure.erl:504 web/ejabberd_web_admin.erl:1909
msgid "Stopped Nodes"
msgstr "Зупинені вузли"
#: mod_configure.erl:577 mod_configure.erl:587 web/ejabberd_web_admin.erl:1953
msgid "Modules"
msgstr "Модулі"
#: mod_configure.erl:578
msgid "Backup Management"
msgstr "Керування резервним копіюванням"
#: mod_configure.erl:579
msgid "Import Users From jabberd14 Spool Files"
msgstr "Імпорт користувачів зі спулу jabberd14"
#: mod_configure.erl:699
msgid "To ~s"
msgstr "До ~s"
#: mod_configure.erl:717
msgid "From ~s"
msgstr "Від ~s"
#: mod_configure.erl:913
msgid "Database Tables Configuration at "
msgstr "Конфігурація таблиць бази даних на "
#: mod_configure.erl:918
msgid "Choose storage type of tables"
msgstr "Оберіть тип збереження таблиць"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "Disc only copy"
msgstr "Тільки диск"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "RAM and disc copy"
msgstr "ОЗП та диск"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "RAM copy"
msgstr "ОЗП"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "Remote copy"
msgstr "не зберігаеться локально"
#: mod_configure.erl:950
msgid "Stop Modules at "
msgstr "Зупинка модулів на "
#: mod_configure.erl:954
msgid "Choose modules to stop"
msgstr "Виберіть модулі, які необхідно зупинити"
#: mod_configure.erl:969
msgid "Start Modules at "
msgstr "Запуск модулів на "
#: mod_configure.erl:973
msgid "Enter list of {Module, [Options]}"
msgstr "Введіть перелік такого виду {Module, [Options]}"
#: mod_configure.erl:974
msgid "List of modules to start"
msgstr "Список завантажуваних модулів"
#: mod_configure.erl:983
msgid "Backup to File at "
msgstr "Резервне копіювання в файл на "
#: mod_configure.erl:987 mod_configure.erl:1001
msgid "Enter path to backup file"
msgstr "Введіть шлях до резервного файла"
#: mod_configure.erl:988 mod_configure.erl:1002 mod_configure.erl:1016
#: mod_configure.erl:1030
msgid "Path to File"
msgstr "Шлях до файла"
#: mod_configure.erl:997
msgid "Restore Backup from File at "
msgstr "Відновлення з резервної копії на "
#: mod_configure.erl:1011
msgid "Dump Backup to Text File at "
msgstr "Копіювання в текстовий файл на "
#: mod_configure.erl:1015
msgid "Enter path to text file"
msgstr "Введіть шлях до текстового файла"
#: mod_configure.erl:1025
msgid "Import User from File at "
msgstr "Імпортування користувача з файла на "
#: mod_configure.erl:1029
msgid "Enter path to jabberd14 spool file"
msgstr "Введіть шлях до файла зі спула jabberd14"
#: mod_configure.erl:1039
msgid "Import Users from Dir at "
msgstr "Імпортування користувача з директорії на "
#: mod_configure.erl:1043
msgid "Enter path to jabberd14 spool dir"
msgstr "Введіть шлях до директорії спула jabberd14"
#: mod_configure.erl:1044
msgid "Path to Dir"
msgstr "Шлях до директорії"
#: mod_configure.erl:1060 mod_configure.erl:1105
msgid "Time delay"
msgstr "Час затримки"
#: mod_configure.erl:1143
msgid "Access Control List Configuration"
msgstr "Конфігурація списків керування доступом"
#: mod_configure.erl:1147
msgid "Access control lists"
msgstr "Списки керування доступом"
#: mod_configure.erl:1171
msgid "Access Configuration"
msgstr "Конфігурація доступу"
#: mod_configure.erl:1175
msgid "Access rules"
msgstr "Правила доступу"
#: mod_configure.erl:1200 mod_configure.erl:1222 mod_configure.erl:1234
#: mod_configure.erl:1246 mod_configure.erl:1258 mod_configure.erl:1275
#: mod_configure.erl:1287 mod_configure.erl:1650 mod_configure.erl:1700
#: mod_configure.erl:1721 mod_roster.erl:943 mod_roster_odbc.erl:1060
#: mod_vcard.erl:472 mod_vcard_ldap.erl:554 mod_vcard_odbc.erl:448
msgid "Jabber ID"
msgstr "Jabber ID"
#: mod_configure.erl:1205 mod_configure.erl:1263 mod_configure.erl:1651
#: mod_configure.erl:1863 mod_muc/mod_muc_room.erl:3224 mod_register.erl:235
#: web/ejabberd_web_admin.erl:1520
msgid "Password"
msgstr "Пароль"
#: mod_configure.erl:1210
msgid "Password Verification"
msgstr "Перевірка Пароля"
#: mod_configure.erl:1301
msgid "Number of registered users"
msgstr "Кількість зареєстрованих користувачів"
#: mod_configure.erl:1315
msgid "Number of online users"
msgstr "Кількість підключених користувачів"
#: mod_configure.erl:1682 web/ejabberd_web_admin.erl:1588
#: web/ejabberd_web_admin.erl:1743
msgid "Never"
msgstr "Ніколи"
#: mod_configure.erl:1696 web/ejabberd_web_admin.erl:1601
#: web/ejabberd_web_admin.erl:1756
msgid "Online"
msgstr "Підключений"
#: mod_configure.erl:1701
msgid "Last login"
msgstr "Останнє підключення"
#: mod_configure.erl:1722
msgid "Roster size"
msgstr "Кількість контактів"
#: mod_configure.erl:1723
msgid "IP addresses"
msgstr "IP адреси"
#: mod_configure.erl:1724
msgid "Resources"
msgstr "Ресурси"
#: mod_configure.erl:1850
msgid "Administration of "
msgstr "Адміністрування "
#: mod_configure.erl:1853
msgid "Action on user"
msgstr "Дія над користувачем"
#: mod_configure.erl:1857
msgid "Edit Properties"
msgstr "Змінити параметри"
#: mod_configure.erl:1860 web/ejabberd_web_admin.erl:1769
msgid "Remove User"
msgstr "Видалити користувача"
#: mod_irc/mod_irc.erl:201 mod_irc/mod_irc_odbc.erl:196
#: mod_muc/mod_muc.erl:336 mod_muc/mod_muc_odbc.erl:342
msgid "Access denied by service policy"
msgstr "Доступ заборонений політикою служби"
#: mod_irc/mod_irc.erl:401 mod_irc/mod_irc_odbc.erl:398
msgid "IRC Transport"
msgstr "IRC Транспорт"
#: mod_irc/mod_irc.erl:428 mod_irc/mod_irc_odbc.erl:425
msgid "ejabberd IRC module"
msgstr "ejabberd IRC модуль"
#: mod_irc/mod_irc.erl:559 mod_irc/mod_irc_odbc.erl:568
msgid "You need an x:data capable client to configure mod_irc settings"
msgstr ""
"Для налагодження параметрів mod_irc необхідно використовувати клієнт, що має "
"підтримку x:data"
#: mod_irc/mod_irc.erl:566 mod_irc/mod_irc_odbc.erl:575
msgid "Registration in mod_irc for "
msgstr "Реєстрація в mod_irc для "
#: mod_irc/mod_irc.erl:571 mod_irc/mod_irc_odbc.erl:580
msgid ""
"Enter username, encodings, ports and passwords you wish to use for "
"connecting to IRC servers"
msgstr ""
"Введіть ім'я користувача, кодування, порти та паролі, що будуть "
"використовуватися при підключенні до IRC-серверів"
#: mod_irc/mod_irc.erl:576 mod_irc/mod_irc_odbc.erl:585
msgid "IRC Username"
msgstr "Ім'я користувача IRC"
#: mod_irc/mod_irc.erl:586 mod_irc/mod_irc_odbc.erl:595
msgid ""
"If you want to specify different ports, passwords, encodings for IRC "
"servers, fill this list with values in format '{\"irc server\", \"encoding"
"\", port, \"password\"}'. By default this service use \"~s\" encoding, port "
"~p, empty password."
msgstr ""
"Щоб вказати різні порти, паролі та кодування для різних серверів IRC, "
"заповніть список значеннями в форматі '{\"irc server\", \"encoding\", port, "
"\"password\"}'. За замовчуванням ця служба використовує \"~s\" кодування, "
"порт ~p, пустий пароль."
#: mod_irc/mod_irc.erl:598 mod_irc/mod_irc_odbc.erl:607
msgid ""
"Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef."
"net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."
msgstr ""
"Приклад: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta."
"fef.net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."
#: mod_irc/mod_irc.erl:603 mod_irc/mod_irc_odbc.erl:612
msgid "Connections parameters"
msgstr "Параметри з'єднання"
#: mod_irc/mod_irc.erl:728 mod_irc/mod_irc_odbc.erl:757
msgid "Join IRC channel"
msgstr "Приєднатися до каналу IRC"
#: mod_irc/mod_irc.erl:732 mod_irc/mod_irc_odbc.erl:761
msgid "IRC channel (don't put the first #)"
msgstr "Канал IRC (не включаючи #)"
#: mod_irc/mod_irc.erl:737 mod_irc/mod_irc_odbc.erl:766
msgid "IRC server"
msgstr "IRC-сервер"
#: mod_irc/mod_irc.erl:770 mod_irc/mod_irc.erl:774
#: mod_irc/mod_irc_odbc.erl:799 mod_irc/mod_irc_odbc.erl:803
msgid "Join the IRC channel here."
msgstr "Приєднатися до каналу IRC"
#: mod_irc/mod_irc.erl:778 mod_irc/mod_irc_odbc.erl:807
msgid "Join the IRC channel in this Jabber ID: ~s"
msgstr "Приєднатися до каналу IRC з Jabber ID: ~s"
#: mod_irc/mod_irc.erl:863 mod_irc/mod_irc_odbc.erl:904
msgid "IRC settings"
msgstr "Парметри IRC"
#: mod_irc/mod_irc.erl:868 mod_irc/mod_irc_odbc.erl:909
msgid ""
"Enter username and encodings you wish to use for connecting to IRC servers. "
"Press 'Next' to get more fields to fill in. Press 'Complete' to save "
"settings."
msgstr ""
"Введіть ім'я користувача та кодування, які будуть використовуватися при "
"підключенні до IRC-серверів Натисніть 'Далі' для заповнення додаткових "
"полів. Натисніть 'Завершити' для збереження параметрів."
#: mod_irc/mod_irc.erl:874 mod_irc/mod_irc_odbc.erl:915
msgid "IRC username"
msgstr "Ім'я користувача IRC"
#: mod_irc/mod_irc.erl:923 mod_irc/mod_irc_odbc.erl:964
msgid "Password ~b"
msgstr "Пароль ~b"
#: mod_irc/mod_irc.erl:928 mod_irc/mod_irc_odbc.erl:969
msgid "Port ~b"
msgstr "Порт ~b"
#: mod_irc/mod_irc.erl:933 mod_irc/mod_irc_odbc.erl:974
msgid "Encoding for server ~b"
msgstr "Кодування для сервера ~b"
#: mod_irc/mod_irc.erl:942 mod_irc/mod_irc_odbc.erl:983
msgid "Server ~b"
msgstr "Сервер ~b"
#: mod_muc/mod_muc.erl:449 mod_muc/mod_muc_odbc.erl:456
msgid "Only service administrators are allowed to send service messages"
msgstr "Тільки адміністратор сервісу може надсилати службові повідомлення"
#: mod_muc/mod_muc.erl:493 mod_muc/mod_muc_odbc.erl:500
msgid "Room creation is denied by service policy"
msgstr "Створювати конференцію заборонено політикою служби"
#: mod_muc/mod_muc.erl:500 mod_muc/mod_muc_odbc.erl:507
msgid "Conference room does not exist"
msgstr "Конференція не існує"
#: mod_muc/mod_muc.erl:582 mod_muc/mod_muc_odbc.erl:595
msgid "Chatrooms"
msgstr "Кімнати"
#: mod_muc/mod_muc.erl:712 mod_muc/mod_muc_odbc.erl:729
msgid "You need a client that supports x:data to register the nickname"
msgstr ""
"Для реєстрації псевдоніму необхідно використовувати клієнт з підтримкою x:"
"data"
#: mod_muc/mod_muc.erl:718 mod_muc/mod_muc_odbc.erl:735
msgid "Nickname Registration at "
msgstr "Реєстрація псевдоніма на "
#: mod_muc/mod_muc.erl:722 mod_muc/mod_muc_odbc.erl:739
msgid "Enter nickname you want to register"
msgstr "Введіть псевдонім, який ви хочете зареєструвати"
#: mod_muc/mod_muc.erl:723 mod_muc/mod_muc_odbc.erl:740
#: mod_muc/mod_muc_room.erl:3810 mod_roster.erl:944 mod_roster_odbc.erl:1061
#: mod_vcard.erl:364 mod_vcard.erl:477 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:453
msgid "Nickname"
msgstr "Псевдонім"
#: mod_muc/mod_muc.erl:762 mod_muc/mod_muc_odbc.erl:784
#: mod_muc/mod_muc_room.erl:1064 mod_muc/mod_muc_room.erl:1787
msgid "That nickname is registered by another person"
msgstr "Псевдонім зареєстровано кимось іншим"
#: mod_muc/mod_muc.erl:788 mod_muc/mod_muc_odbc.erl:811
msgid "You must fill in field \"Nickname\" in the form"
msgstr "Вам необхідно заповнити поле \"Псевдонім\" у формі"
#: mod_muc/mod_muc.erl:808 mod_muc/mod_muc_odbc.erl:831
msgid "ejabberd MUC module"
msgstr "ejabberd MUC модуль"
#: mod_muc/mod_muc_log.erl:374 mod_muc/mod_muc_log.erl:381
msgid "Chatroom configuration modified"
msgstr "Конфігурація кімнати змінилась"
#: mod_muc/mod_muc_log.erl:384
msgid "joins the room"
msgstr "увійшов(ла) в кімнату"
#: mod_muc/mod_muc_log.erl:387 mod_muc/mod_muc_log.erl:390
msgid "leaves the room"
msgstr "вийшов(ла) з кімнати"
#: mod_muc/mod_muc_log.erl:393 mod_muc/mod_muc_log.erl:396
msgid "has been banned"
msgstr "заборонили вхід в кімнату"
#: mod_muc/mod_muc_log.erl:399 mod_muc/mod_muc_log.erl:402
msgid "has been kicked"
msgstr "вигнали з кімнати"
#: mod_muc/mod_muc_log.erl:405
msgid "has been kicked because of an affiliation change"
msgstr "вигнано з кімнати внаслідок зміни рангу"
#: mod_muc/mod_muc_log.erl:408
msgid "has been kicked because the room has been changed to members-only"
msgstr "вигнано з кімнати тому, що вона стала тільки для учасників"
#: mod_muc/mod_muc_log.erl:411
msgid "has been kicked because of a system shutdown"
msgstr "вигнано з кімнати внаслідок зупинки системи"
#: mod_muc/mod_muc_log.erl:414
msgid "is now known as"
msgstr "змінив(ла) псевдонім на"
#: mod_muc/mod_muc_log.erl:417 mod_muc/mod_muc_log.erl:688
#: mod_muc/mod_muc_room.erl:2393
msgid " has set the subject to: "
msgstr " встановив(ла) тему: "
#: mod_muc/mod_muc_log.erl:452
msgid "Chatroom is created"
msgstr "Створено кімнату"
#: mod_muc/mod_muc_log.erl:453
msgid "Chatroom is destroyed"
msgstr "Знищено кімнату"
#: mod_muc/mod_muc_log.erl:454
msgid "Chatroom is started"
msgstr "Запущено кімнату"
#: mod_muc/mod_muc_log.erl:455
msgid "Chatroom is stopped"
msgstr "Зупинено кімнату"
#: mod_muc/mod_muc_log.erl:459
msgid "Monday"
msgstr "Понеділок"
#: mod_muc/mod_muc_log.erl:460
msgid "Tuesday"
msgstr "Вівторок"
#: mod_muc/mod_muc_log.erl:461
msgid "Wednesday"
msgstr "Середа"
#: mod_muc/mod_muc_log.erl:462
msgid "Thursday"
msgstr "Четвер"
#: mod_muc/mod_muc_log.erl:463
msgid "Friday"
msgstr "П'ятниця"
#: mod_muc/mod_muc_log.erl:464
msgid "Saturday"
msgstr "Субота"
#: mod_muc/mod_muc_log.erl:465
msgid "Sunday"
msgstr "Неділя"
#: mod_muc/mod_muc_log.erl:469
msgid "January"
msgstr "січня"
#: mod_muc/mod_muc_log.erl:470
msgid "February"
msgstr "лютого"
#: mod_muc/mod_muc_log.erl:471
msgid "March"
msgstr "березня"
#: mod_muc/mod_muc_log.erl:472
msgid "April"
msgstr "квітня"
#: mod_muc/mod_muc_log.erl:473
msgid "May"
msgstr "травня"
#: mod_muc/mod_muc_log.erl:474
msgid "June"
msgstr "червня"
#: mod_muc/mod_muc_log.erl:475
msgid "July"
msgstr "липня"
#: mod_muc/mod_muc_log.erl:476
msgid "August"
msgstr "серпня"
#: mod_muc/mod_muc_log.erl:477
msgid "September"
msgstr "вересня"
#: mod_muc/mod_muc_log.erl:478
msgid "October"
msgstr "грудня"
#: mod_muc/mod_muc_log.erl:479
msgid "November"
msgstr "листопада"
#: mod_muc/mod_muc_log.erl:480
msgid "December"
msgstr "грудня"
#: mod_muc/mod_muc_log.erl:750
msgid "Room Configuration"
msgstr "Конфігурація кімнати"
#: mod_muc/mod_muc_log.erl:759
msgid "Room Occupants"
msgstr "Учасники кімнати"
#: mod_muc/mod_muc_room.erl:174
msgid "Traffic rate limit is exceeded"
msgstr "Швидкість передачі інформації було перевищено"
#: mod_muc/mod_muc_room.erl:246
msgid ""
"This participant is kicked from the room because he sent an error message"
msgstr ""
"Цього учасника було відключено від кімнати через те, що він надіслав "
"помилкове повідомлення"
#: mod_muc/mod_muc_room.erl:255
msgid "It is not allowed to send private messages to the conference"
msgstr "Не дозволяється надсилати приватні повідомлення в конференцію"
#: mod_muc/mod_muc_room.erl:332
msgid "Please, wait for a while before sending new voice request"
msgstr ""
#: mod_muc/mod_muc_room.erl:347
msgid "Voice requests are disabled in this conference"
msgstr ""
#: mod_muc/mod_muc_room.erl:364
msgid "Failed to extract JID from your voice request approval"
msgstr ""
#: mod_muc/mod_muc_room.erl:393
msgid "Only moderators can approve voice requests"
msgstr ""
#: mod_muc/mod_muc_room.erl:408
msgid "Improper message type"
msgstr "Неправильний тип повідомлення"
#: mod_muc/mod_muc_room.erl:518
msgid ""
"This participant is kicked from the room because he sent an error message to "
"another participant"
msgstr ""
"Цього учасника було відключено від кімнати через те, що він надіслав "
"помилкове повідомлення іншому учаснику"
#: mod_muc/mod_muc_room.erl:531
msgid "It is not allowed to send private messages of type \"groupchat\""
msgstr "Не дозволяється надсилати приватні повідомлення типу \"groupchat\""
#: mod_muc/mod_muc_room.erl:543 mod_muc/mod_muc_room.erl:611
msgid "Recipient is not in the conference room"
msgstr "Адресата немає в конференції"
#: mod_muc/mod_muc_room.erl:564 mod_muc/mod_muc_room.erl:585
msgid "It is not allowed to send private messages"
msgstr "Приватні повідомлення не дозволені"
#: mod_muc/mod_muc_room.erl:576 mod_muc/mod_muc_room.erl:956
#: mod_muc/mod_muc_room.erl:4040
msgid "Only occupants are allowed to send messages to the conference"
msgstr "Тільки присутнім дозволяється надсилати повідомленняя в конференцію"
#: mod_muc/mod_muc_room.erl:634
msgid "Only occupants are allowed to send queries to the conference"
msgstr "Тільки присутнім дозволяється відправляти запити в конференцію"
#: mod_muc/mod_muc_room.erl:646
msgid "Queries to the conference members are not allowed in this room"
msgstr "Запити до користувачів в цій конференції заборонені"
#: mod_muc/mod_muc_room.erl:932
msgid ""
"Only moderators and participants are allowed to change the subject in this "
"room"
msgstr "Тільки модератори та учасники можуть змінювати тему в цій кімнаті"
#: mod_muc/mod_muc_room.erl:937
msgid "Only moderators are allowed to change the subject in this room"
msgstr "Тільки модератори можуть змінювати тему в цій кімнаті"
#: mod_muc/mod_muc_room.erl:947
msgid "Visitors are not allowed to send messages to all occupants"
msgstr "Відвідувачам не дозволяється надсилати повідомлення всім присутнім"
#: mod_muc/mod_muc_room.erl:1021
msgid ""
"This participant is kicked from the room because he sent an error presence"
msgstr ""
"Цього учасника було відключено від кімнати через те, що він надіслав "
"помилковий статус присутності"
#: mod_muc/mod_muc_room.erl:1040
msgid "Visitors are not allowed to change their nicknames in this room"
msgstr "Відвідувачам не дозволяється змінювати псевдонім в цій кімнаті"
#: mod_muc/mod_muc_room.erl:1053 mod_muc/mod_muc_room.erl:1779
msgid "That nickname is already in use by another occupant"
msgstr "Псевдонім зайнято кимось з присутніх"
#: mod_muc/mod_muc_room.erl:1768
msgid "You have been banned from this room"
msgstr "Вам заборонено входити в цю конференцію"
#: mod_muc/mod_muc_room.erl:1771
msgid "Membership is required to enter this room"
msgstr "В цю конференцію можуть входити тільки її члени"
#: mod_muc/mod_muc_room.erl:1807
msgid "This room is not anonymous"
msgstr "Ця кімната не анонімна"
#: mod_muc/mod_muc_room.erl:1833
msgid "A password is required to enter this room"
msgstr "Щоб зайти в цю конференцію, необхідно ввести пароль"
#: mod_muc/mod_muc_room.erl:1855 mod_register.erl:246
msgid "Too many CAPTCHA requests"
msgstr "Надто багато CAPTCHA-запитів"
#: mod_muc/mod_muc_room.erl:1864 mod_register.erl:251
msgid "Unable to generate a CAPTCHA"
msgstr "Нема можливості згенерувати капчу"
#: mod_muc/mod_muc_room.erl:1874
msgid "Incorrect password"
msgstr "Неправильний пароль"
#: mod_muc/mod_muc_room.erl:2448
msgid "Administrator privileges required"
msgstr "Необхідні права адміністратора"
#: mod_muc/mod_muc_room.erl:2463
msgid "Moderator privileges required"
msgstr "Необхідні права модератора"
#: mod_muc/mod_muc_room.erl:2619
msgid "Jabber ID ~s is invalid"
msgstr "Jabber ID ~s недопустимий"
#: mod_muc/mod_muc_room.erl:2633
msgid "Nickname ~s does not exist in the room"
msgstr "Псевдонім ~s в кімнаті відсутній"
#: mod_muc/mod_muc_room.erl:2659 mod_muc/mod_muc_room.erl:3049
msgid "Invalid affiliation: ~s"
msgstr "Недопустимий ранг: ~s"
#: mod_muc/mod_muc_room.erl:2713
msgid "Invalid role: ~s"
msgstr "Недопустима роль: ~s"
#: mod_muc/mod_muc_room.erl:3026 mod_muc/mod_muc_room.erl:3062
msgid "Owner privileges required"
msgstr "Необхідні права власника"
#: mod_muc/mod_muc_room.erl:3195
msgid "Configuration of room ~s"
msgstr "Конфігурація кімнати ~s"
#: mod_muc/mod_muc_room.erl:3200
msgid "Room title"
msgstr "Назва кімнати"
#: mod_muc/mod_muc_room.erl:3203 mod_muc/mod_muc_room.erl:3692
msgid "Room description"
msgstr "Опис кімнати"
#: mod_muc/mod_muc_room.erl:3210
msgid "Make room persistent"
msgstr "Зробити кімнату постійною"
#: mod_muc/mod_muc_room.erl:3215
msgid "Make room public searchable"
msgstr "Зробити кімнату видимою всім"
#: mod_muc/mod_muc_room.erl:3218
msgid "Make participants list public"
msgstr "Зробити список учасників видимим всім"
#: mod_muc/mod_muc_room.erl:3221
msgid "Make room password protected"
msgstr "Зробити кімнату захищеною паролем"
#: mod_muc/mod_muc_room.erl:3232
msgid "Maximum Number of Occupants"
msgstr "Максимальна кількість учасників"
#: mod_muc/mod_muc_room.erl:3239
msgid "No limit"
msgstr "Без обмежень"
#: mod_muc/mod_muc_room.erl:3250
msgid "Present real Jabber IDs to"
msgstr "Зробити реальні Jabber ID учасників видимими"
#: mod_muc/mod_muc_room.erl:3258 mod_muc/mod_muc_room.erl:3292
msgid "moderators only"
msgstr "тільки модераторам"
#: mod_muc/mod_muc_room.erl:3260 mod_muc/mod_muc_room.erl:3294
msgid "anyone"
msgstr "всім учасникам"
#: mod_muc/mod_muc_room.erl:3262
msgid "Make room members-only"
msgstr "Кімната тільки для зареєтрованых учасників"
#: mod_muc/mod_muc_room.erl:3265
msgid "Make room moderated"
msgstr "Зробити кімнату модерованою"
#: mod_muc/mod_muc_room.erl:3268
msgid "Default users as participants"
msgstr "Зробити користувачів учасниками за замовчуванням"
#: mod_muc/mod_muc_room.erl:3271
msgid "Allow users to change the subject"
msgstr "Дозволити користувачам змінювати тему"
#: mod_muc/mod_muc_room.erl:3274
msgid "Allow users to send private messages"
msgstr "Дозволити приватні повідомлення"
#: mod_muc/mod_muc_room.erl:3279
#, fuzzy
msgid "Allow visitors to send private messages to"
msgstr "Дозволити приватні повідомлення"
#: mod_muc/mod_muc_room.erl:3290
msgid "nobody"
msgstr ""
#: mod_muc/mod_muc_room.erl:3296
msgid "Allow users to query other users"
msgstr "Дозволити iq-запити до користувачів"
#: mod_muc/mod_muc_room.erl:3299
msgid "Allow users to send invites"
msgstr "Дозволити користувачам надсилати запрошення"
#: mod_muc/mod_muc_room.erl:3302
msgid "Allow visitors to send status text in presence updates"
msgstr ""
"Дозволити відвідувачам відсилати текст статусу в оновленнях присутності"
#: mod_muc/mod_muc_room.erl:3305
msgid "Allow visitors to change nickname"
msgstr "Дозволити відвідувачам змінювати псевдонім"
#: mod_muc/mod_muc_room.erl:3308
#, fuzzy
msgid "Allow visitors to send voice requests"
msgstr "Дозволити користувачам надсилати запрошення"
#: mod_muc/mod_muc_room.erl:3311
msgid "Minimum interval between voice requests (in seconds)"
msgstr ""
#: mod_muc/mod_muc_room.erl:3317
msgid "Make room CAPTCHA protected"
msgstr "Зробити кімнату захищеною капчею"
#: mod_muc/mod_muc_room.erl:3322
msgid "Exclude Jabber IDs from CAPTCHA challenge"
msgstr "Пропускати ці Jabber ID без CAPTCHA-запиту"
#: mod_muc/mod_muc_room.erl:3329
msgid "Enable logging"
msgstr "Включити журнал роботи"
#: mod_muc/mod_muc_room.erl:3337
msgid "You need an x:data capable client to configure room"
msgstr ""
"Для конфігурування кімнати потрібно використовувати клієнт з підтримкою x:"
"data"
#: mod_muc/mod_muc_room.erl:3694
msgid "Number of occupants"
msgstr "Кількість присутніх"
#: mod_muc/mod_muc_room.erl:3750
msgid "private, "
msgstr "приватна, "
#: mod_muc/mod_muc_room.erl:3799
msgid "Voice request"
msgstr ""
#: mod_muc/mod_muc_room.erl:3803
msgid "Either approve or decline the voice request."
msgstr ""
#: mod_muc/mod_muc_room.erl:3809
#, fuzzy
msgid "User JID"
msgstr "Користувач "
#: mod_muc/mod_muc_room.erl:3811
msgid "Grant voice to this person?"
msgstr ""
#: mod_muc/mod_muc_room.erl:3960
msgid "~s invites you to the room ~s"
msgstr "~s запрошує вас до кімнати ~s"
#: mod_muc/mod_muc_room.erl:3969
msgid "the password is"
msgstr "пароль:"
#: mod_offline.erl:510 mod_offline_odbc.erl:352
msgid ""
"Your contact offline message queue is full. The message has been discarded."
msgstr ""
"Черга повідомлень, що не були доставлені, переповнена. Повідомлення не було "
"збережено."
#: mod_offline.erl:560 mod_offline_odbc.erl:408
msgid "~s's Offline Messages Queue"
msgstr "Черга офлайнових повідомлень ~s"
#: mod_offline.erl:563 mod_offline_odbc.erl:411 mod_roster.erl:987
#: mod_roster_odbc.erl:1104 mod_shared_roster.erl:901
#: mod_shared_roster.erl:1010 mod_shared_roster_odbc.erl:930
#: mod_shared_roster_odbc.erl:1039 web/ejabberd_web_admin.erl:833
#: web/ejabberd_web_admin.erl:874 web/ejabberd_web_admin.erl:942
#: web/ejabberd_web_admin.erl:978 web/ejabberd_web_admin.erl:1019
#: web/ejabberd_web_admin.erl:1508 web/ejabberd_web_admin.erl:1760
#: web/ejabberd_web_admin.erl:1931 web/ejabberd_web_admin.erl:1963
#: web/ejabberd_web_admin.erl:2031 web/ejabberd_web_admin.erl:2135
#: web/ejabberd_web_admin.erl:2160 web/ejabberd_web_admin.erl:2248
msgid "Submitted"
msgstr "Відправлено"
#: mod_offline.erl:571
msgid "Time"
msgstr "Час"
#: mod_offline.erl:572
msgid "From"
msgstr "Від кого"
#: mod_offline.erl:573
msgid "To"
msgstr "Кому"
#: mod_offline.erl:574 mod_offline_odbc.erl:419
msgid "Packet"
msgstr "Пакет"
#: mod_offline.erl:587 mod_offline_odbc.erl:432 mod_shared_roster.erl:908
#: mod_shared_roster_odbc.erl:937 web/ejabberd_web_admin.erl:882
#: web/ejabberd_web_admin.erl:986
msgid "Delete Selected"
msgstr "Видалити виділені"
#: mod_offline.erl:645 mod_offline_odbc.erl:519
msgid "Offline Messages:"
msgstr "Офлайнові повідомлення:"
#: mod_offline.erl:645 mod_offline_odbc.erl:519
msgid "Remove All Offline Messages"
msgstr "Видалити всі офлайнові повідомлення"
#: mod_proxy65/mod_proxy65_service.erl:213
msgid "ejabberd SOCKS5 Bytestreams module"
msgstr "ejabberd SOCKS5 Bytestreams модуль"
#: mod_pubsub/mod_pubsub.erl:1120 mod_pubsub/mod_pubsub_odbc.erl:929
msgid "Publish-Subscribe"
msgstr "Публікація-Підписка"
#: mod_pubsub/mod_pubsub.erl:1214 mod_pubsub/mod_pubsub_odbc.erl:1025
msgid "ejabberd Publish-Subscribe module"
msgstr "Модуль ejabberd Публікації-Підписки"
#: mod_pubsub/mod_pubsub.erl:1497 mod_pubsub/mod_pubsub_odbc.erl:1312
msgid "PubSub subscriber request"
msgstr "Запит на підписку PubSub"
#: mod_pubsub/mod_pubsub.erl:1499 mod_pubsub/mod_pubsub_odbc.erl:1314
msgid "Choose whether to approve this entity's subscription."
msgstr "Вирішіть, чи задовольнити запит цього об'єкту на підписку"
#: mod_pubsub/mod_pubsub.erl:1505 mod_pubsub/mod_pubsub_odbc.erl:1320
msgid "Node ID"
msgstr "ID вузла"
#: mod_pubsub/mod_pubsub.erl:1510 mod_pubsub/mod_pubsub_odbc.erl:1325
msgid "Subscriber Address"
msgstr "Адреса абонента"
#: mod_pubsub/mod_pubsub.erl:1516 mod_pubsub/mod_pubsub_odbc.erl:1331
msgid "Allow this Jabber ID to subscribe to this pubsub node?"
msgstr "Чи дозволити цьому Jabber ID підписатись новини наданого вузла"
#: mod_pubsub/mod_pubsub.erl:3474 mod_pubsub/mod_pubsub_odbc.erl:3287
msgid "Deliver payloads with event notifications"
msgstr "Доставляти разом з повідомленнями про публікації самі публікації"
#: mod_pubsub/mod_pubsub.erl:3475 mod_pubsub/mod_pubsub_odbc.erl:3288
msgid "Deliver event notifications"
msgstr "Доставляти сповіщення про події"
#: mod_pubsub/mod_pubsub.erl:3476 mod_pubsub/mod_pubsub_odbc.erl:3289
msgid "Notify subscribers when the node configuration changes"
msgstr "Повідомляти абонентів про зміни в конфігурації збірника"
#: mod_pubsub/mod_pubsub.erl:3477 mod_pubsub/mod_pubsub_odbc.erl:3290
msgid "Notify subscribers when the node is deleted"
msgstr "Повідомляти абонентів про видалення збірника"
#: mod_pubsub/mod_pubsub.erl:3478 mod_pubsub/mod_pubsub_odbc.erl:3291
msgid "Notify subscribers when items are removed from the node"
msgstr "Повідомляти абонентів про видалення публікацій із збірника"
#: mod_pubsub/mod_pubsub.erl:3479 mod_pubsub/mod_pubsub_odbc.erl:3292
msgid "Persist items to storage"
msgstr "Зберегати публікації до сховища"
#: mod_pubsub/mod_pubsub.erl:3480 mod_pubsub/mod_pubsub_odbc.erl:3293
msgid "A friendly name for the node"
msgstr "Псевдонім для вузла"
#: mod_pubsub/mod_pubsub.erl:3481 mod_pubsub/mod_pubsub_odbc.erl:3294
msgid "Max # of items to persist"
msgstr "Максимальне число збережених публікацій"
#: mod_pubsub/mod_pubsub.erl:3482 mod_pubsub/mod_pubsub_odbc.erl:3295
msgid "Whether to allow subscriptions"
msgstr "Дозволяти підписку"
#: mod_pubsub/mod_pubsub.erl:3483 mod_pubsub/mod_pubsub_odbc.erl:3296
msgid "Specify the access model"
msgstr "Визначити модель доступу"
#: mod_pubsub/mod_pubsub.erl:3486 mod_pubsub/mod_pubsub_odbc.erl:3299
msgid "Roster groups allowed to subscribe"
msgstr "Дозволені для підписки групи ростера"
#: mod_pubsub/mod_pubsub.erl:3487 mod_pubsub/mod_pubsub_odbc.erl:3300
msgid "Specify the publisher model"
msgstr "Умови публікації"
#: mod_pubsub/mod_pubsub.erl:3489 mod_pubsub/mod_pubsub_odbc.erl:3302
msgid "Purge all items when the relevant publisher goes offline"
msgstr ""
"Видалити всі елементи, коли особа, що їх опублікувала, вимикається від мережі"
#: mod_pubsub/mod_pubsub.erl:3490 mod_pubsub/mod_pubsub_odbc.erl:3303
msgid "Specify the event message type"
msgstr "Вкажіть тип повідомлень зі сповіщеннями про події"
#: mod_pubsub/mod_pubsub.erl:3492 mod_pubsub/mod_pubsub_odbc.erl:3305
msgid "Max payload size in bytes"
msgstr "Максимальний розмір корисного навантаження в байтах"
#: mod_pubsub/mod_pubsub.erl:3493 mod_pubsub/mod_pubsub_odbc.erl:3306
msgid "When to send the last published item"
msgstr "Коли надсилати останній опублікований елемент"
#: mod_pubsub/mod_pubsub.erl:3495 mod_pubsub/mod_pubsub_odbc.erl:3308
msgid "Only deliver notifications to available users"
msgstr "Доставляти повідомленнями тільки доступним користувачам"
#: mod_pubsub/mod_pubsub.erl:3496 mod_pubsub/mod_pubsub_odbc.erl:3309
msgid "The collections with which a node is affiliated"
msgstr "Колекція, до якої входить вузол"
#: mod_register.erl:193
msgid "The CAPTCHA verification has failed"
msgstr "Перевірку капчею не пройдено"
#: mod_register.erl:220
msgid "You need a client that supports x:data and CAPTCHA to register"
msgstr ""
"Для реєстрації псевдоніму необхідно використовувати клієнт з підтримкою x:"
"data"
#: mod_register.erl:226 mod_register.erl:265
msgid "Choose a username and password to register with this server"
msgstr "Виберіть назву користувача та пароль для реєстрації на цьому сервері"
#: mod_register.erl:230 mod_vcard.erl:364 mod_vcard_odbc.erl:342
#: web/ejabberd_web_admin.erl:1515 web/ejabberd_web_admin.erl:1572
msgid "User"
msgstr "Користувач"
#: mod_register.erl:316 mod_register.erl:361
msgid "The password is too weak"
msgstr "Пароль надто простий"
#: mod_register.erl:365
msgid "Users are not allowed to register accounts so quickly"
msgstr "Користувачам не дозволено так часто реєструвати облікові записи"
#: mod_roster.erl:938 mod_roster_odbc.erl:1055 web/ejabberd_web_admin.erl:1701
#: web/ejabberd_web_admin.erl:1886 web/ejabberd_web_admin.erl:1897
#: web/ejabberd_web_admin.erl:2219
msgid "None"
msgstr "Немає"
#: mod_roster.erl:945 mod_roster_odbc.erl:1062
msgid "Subscription"
msgstr "Підписка"
#: mod_roster.erl:946 mod_roster_odbc.erl:1063
msgid "Pending"
msgstr "Очікування"
#: mod_roster.erl:947 mod_roster_odbc.erl:1064
msgid "Groups"
msgstr "Групи"
#: mod_roster.erl:974 mod_roster_odbc.erl:1091
msgid "Validate"
msgstr "Затвердити"
#: mod_roster.erl:982 mod_roster_odbc.erl:1099
msgid "Remove"
msgstr "Видалити"
#: mod_roster.erl:985 mod_roster_odbc.erl:1102
msgid "Roster of "
msgstr "Ростер користувача "
#: mod_roster.erl:988 mod_roster_odbc.erl:1105 mod_shared_roster.erl:902
#: mod_shared_roster.erl:1011 mod_shared_roster_odbc.erl:931
#: mod_shared_roster_odbc.erl:1040 web/ejabberd_web_admin.erl:834
#: web/ejabberd_web_admin.erl:875 web/ejabberd_web_admin.erl:943
#: web/ejabberd_web_admin.erl:979 web/ejabberd_web_admin.erl:1020
#: web/ejabberd_web_admin.erl:1509 web/ejabberd_web_admin.erl:1761
#: web/ejabberd_web_admin.erl:1932 web/ejabberd_web_admin.erl:2136
#: web/ejabberd_web_admin.erl:2161
msgid "Bad format"
msgstr "Неправильний формат"
#: mod_roster.erl:995 mod_roster_odbc.erl:1112
msgid "Add Jabber ID"
msgstr "Додати Jabber ID"
#: mod_roster.erl:1094 mod_roster_odbc.erl:1211
msgid "Roster"
msgstr "Ростер"
#: mod_shared_roster.erl:857 mod_shared_roster.erl:899
#: mod_shared_roster.erl:1007 mod_shared_roster_odbc.erl:886
#: mod_shared_roster_odbc.erl:928 mod_shared_roster_odbc.erl:1036
msgid "Shared Roster Groups"
msgstr "Спільні групи контактів"
#: mod_shared_roster.erl:895 mod_shared_roster_odbc.erl:924
#: web/ejabberd_web_admin.erl:1365 web/ejabberd_web_admin.erl:2461
msgid "Add New"
msgstr "Додати"
#: mod_shared_roster.erl:978 mod_shared_roster_odbc.erl:1007
msgid "Name:"
msgstr "Назва:"
#: mod_shared_roster.erl:983 mod_shared_roster_odbc.erl:1012
msgid "Description:"
msgstr "Опис:"
#: mod_shared_roster.erl:991 mod_shared_roster_odbc.erl:1020
msgid "Members:"
msgstr "Члени:"
#: mod_shared_roster.erl:999 mod_shared_roster_odbc.erl:1028
msgid "Displayed Groups:"
msgstr "Видимі групи:"
#: mod_shared_roster.erl:1008 mod_shared_roster_odbc.erl:1037
msgid "Group "
msgstr "Група "
#: mod_shared_roster.erl:1017 mod_shared_roster_odbc.erl:1046
#: web/ejabberd_web_admin.erl:840 web/ejabberd_web_admin.erl:884
#: web/ejabberd_web_admin.erl:949 web/ejabberd_web_admin.erl:1026
#: web/ejabberd_web_admin.erl:2017
msgid "Submit"
msgstr "Відправити"
#: mod_vcard.erl:165 mod_vcard_ldap.erl:238 mod_vcard_odbc.erl:129
msgid "Erlang Jabber Server"
msgstr "Erlang Jabber Server"
#: mod_vcard.erl:364 mod_vcard.erl:478 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:454
msgid "Birthday"
msgstr "День народження"
#: mod_vcard.erl:364 mod_vcard.erl:480 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:456
msgid "City"
msgstr "Місто"
#: mod_vcard.erl:364 mod_vcard.erl:479 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:455
msgid "Country"
msgstr "Країна"
#: mod_vcard.erl:364 mod_vcard.erl:481 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:457
msgid "Email"
msgstr "Електронна пошта"
#: mod_vcard.erl:364 mod_vcard.erl:476 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:452
msgid "Family Name"
msgstr "Прізвище"
#: mod_vcard.erl:364 mod_vcard_odbc.erl:342
msgid ""
"Fill in the form to search for any matching Jabber User (Add * to the end of "
"field to match substring)"
msgstr ""
"Заповніть поля для пошуку користувача Jabber (Додайте * в кінець поля для "
"пошуку підрядка)"
#: mod_vcard.erl:364 mod_vcard.erl:473 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:449
msgid "Full Name"
msgstr "Повне ім'я"
#: mod_vcard.erl:364 mod_vcard.erl:475 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:451
msgid "Middle Name"
msgstr "По-батькові"
#: mod_vcard.erl:364 mod_vcard.erl:474 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:450 web/ejabberd_web_admin.erl:2006
msgid "Name"
msgstr "Назва"
#: mod_vcard.erl:364 mod_vcard.erl:482 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:458
msgid "Organization Name"
msgstr "Назва організації"
#: mod_vcard.erl:364 mod_vcard.erl:483 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:459
msgid "Organization Unit"
msgstr "Відділ організації"
#: mod_vcard.erl:364 mod_vcard_ldap.erl:462 mod_vcard_odbc.erl:342
msgid "Search users in "
msgstr "Пошук користувачів в "
#: mod_vcard.erl:364 mod_vcard_ldap.erl:462 mod_vcard_odbc.erl:342
msgid "You need an x:data capable client to search"
msgstr "Для пошуку необхідний клієнт із підтримкою x:data"
#: mod_vcard.erl:389 mod_vcard_ldap.erl:487 mod_vcard_odbc.erl:367
msgid "vCard User Search"
msgstr "Пошук користувачів по vCard"
#: mod_vcard.erl:445 mod_vcard_ldap.erl:541 mod_vcard_odbc.erl:421
msgid "ejabberd vCard module"
msgstr "ejabberd vCard модуль"
#: mod_vcard.erl:469 mod_vcard_ldap.erl:551 mod_vcard_odbc.erl:445
msgid "Search Results for "
msgstr "Результати пошуку в "
#: mod_vcard_ldap.erl:462
msgid "Fill in fields to search for any matching Jabber User"
msgstr "Заповніть поля для пошуку користувача Jabber"
#: web/ejabberd_web_admin.erl:193 web/ejabberd_web_admin.erl:203
#: web/ejabberd_web_admin.erl:219 web/ejabberd_web_admin.erl:229
msgid "Unauthorized"
msgstr "Не авторизовано"
#: web/ejabberd_web_admin.erl:286 web/ejabberd_web_admin.erl:303
msgid "ejabberd Web Admin"
msgstr "Веб-інтерфейс Адміністрування ejabberd"
#: web/ejabberd_web_admin.erl:769 web/ejabberd_web_admin.erl:780
msgid "Administration"
msgstr "Адміністрування"
#: web/ejabberd_web_admin.erl:878 web/ejabberd_web_admin.erl:982
msgid "Raw"
msgstr "необроблений формат"
#: web/ejabberd_web_admin.erl:1017
msgid "~s access rule configuration"
msgstr "Конфігурація правила доступу ~s"
#: web/ejabberd_web_admin.erl:1035
msgid "Virtual Hosts"
msgstr "віртуальні хости"
#: web/ejabberd_web_admin.erl:1043 web/ejabberd_web_admin.erl:1050
msgid "Users"
msgstr "Користувачі"
#: web/ejabberd_web_admin.erl:1078
msgid "Users Last Activity"
msgstr "Статистика останнього підключення користувачів"
#: web/ejabberd_web_admin.erl:1080
msgid "Period: "
msgstr "Період"
#: web/ejabberd_web_admin.erl:1090
msgid "Last month"
msgstr "За останній місяць"
#: web/ejabberd_web_admin.erl:1091
msgid "Last year"
msgstr "За останній рік"
#: web/ejabberd_web_admin.erl:1092
msgid "All activity"
msgstr "Вся статистика"
#: web/ejabberd_web_admin.erl:1094
msgid "Show Ordinary Table"
msgstr "Показати звичайну таблицю"
#: web/ejabberd_web_admin.erl:1096
msgid "Show Integral Table"
msgstr "Показати інтегральну таблицю"
#: web/ejabberd_web_admin.erl:1105 web/ejabberd_web_admin.erl:1939
msgid "Statistics"
msgstr "Статистика"
#: web/ejabberd_web_admin.erl:1117
msgid "Not Found"
msgstr "не знайдено"
#: web/ejabberd_web_admin.erl:1134
msgid "Node not found"
msgstr "Вузол не знайдено"
#: web/ejabberd_web_admin.erl:1460
msgid "Host"
msgstr "Хост"
#: web/ejabberd_web_admin.erl:1461
msgid "Registered Users"
msgstr "Зареєстровані користувачі"
#: web/ejabberd_web_admin.erl:1573
msgid "Offline Messages"
msgstr "Офлайнові повідомлення"
#: web/ejabberd_web_admin.erl:1574 web/ejabberd_web_admin.erl:1767
msgid "Last Activity"
msgstr "Останнє підключення"
#: web/ejabberd_web_admin.erl:1659 web/ejabberd_web_admin.erl:1675
msgid "Registered Users:"
msgstr "Зареєстровані користувачі:"
#: web/ejabberd_web_admin.erl:1661 web/ejabberd_web_admin.erl:1677
#: web/ejabberd_web_admin.erl:2192
msgid "Online Users:"
msgstr "Підключені користувачі:"
#: web/ejabberd_web_admin.erl:1663
msgid "Outgoing s2s Connections:"
msgstr "Вихідні s2s-з'єднання:"
#: web/ejabberd_web_admin.erl:1665
msgid "Outgoing s2s Servers:"
msgstr "Вихідні s2s-сервери:"
#: web/ejabberd_web_admin.erl:1734 web/mod_register_web.erl:175
#: web/mod_register_web.erl:372 web/mod_register_web.erl:381
#: web/mod_register_web.erl:411
msgid "Change Password"
msgstr "Змінити пароль"
#: web/ejabberd_web_admin.erl:1758
msgid "User "
msgstr "Користувач "
#: web/ejabberd_web_admin.erl:1765
msgid "Connected Resources:"
msgstr "Підключені ресурси:"
#: web/ejabberd_web_admin.erl:1766 web/mod_register_web.erl:227
#: web/mod_register_web.erl:519
msgid "Password:"
msgstr "Пароль:"
#: web/ejabberd_web_admin.erl:1828
msgid "No Data"
msgstr "Немає даних"
#: web/ejabberd_web_admin.erl:1906
msgid "Nodes"
msgstr "Вузли"
#: web/ejabberd_web_admin.erl:1929 web/ejabberd_web_admin.erl:1951
msgid "Node "
msgstr "Вузол "
#: web/ejabberd_web_admin.erl:1938
msgid "Listened Ports"
msgstr "Відкриті порти"
#: web/ejabberd_web_admin.erl:1940 web/ejabberd_web_admin.erl:2260
#: web/ejabberd_web_admin.erl:2448
msgid "Update"
msgstr "Обновити"
#: web/ejabberd_web_admin.erl:1943 web/ejabberd_web_admin.erl:2569
msgid "Restart"
msgstr "Перезапустити"
#: web/ejabberd_web_admin.erl:1945 web/ejabberd_web_admin.erl:2571
msgid "Stop"
msgstr "Зупинити"
#: web/ejabberd_web_admin.erl:1959
msgid "RPC Call Error"
msgstr "Помилка виклику RPC"
#: web/ejabberd_web_admin.erl:2000
msgid "Database Tables at "
msgstr "Таблиці бази даних на "
#: web/ejabberd_web_admin.erl:2007
msgid "Storage Type"
msgstr "Тип таблиці"
#: web/ejabberd_web_admin.erl:2008
msgid "Elements"
msgstr "Елементи"
#: web/ejabberd_web_admin.erl:2009
msgid "Memory"
msgstr "Пам'ять"
#: web/ejabberd_web_admin.erl:2032 web/ejabberd_web_admin.erl:2137
msgid "Error"
msgstr "Помилка"
#: web/ejabberd_web_admin.erl:2034
msgid "Backup of "
msgstr "Резервне копіювання "
#: web/ejabberd_web_admin.erl:2036
msgid ""
"Please note that these options will only backup the builtin Mnesia database. "
"If you are using the ODBC module, you also need to backup your SQL database "
"separately."
msgstr ""
"Зауважте, що ця опція відповідає за резервне копіювання тільки вбудованної "
"бази даних Mnesia. Якщо Ви також використовуєте інше сховище для даних "
"(наприклад за допомогою модуля ODBC), то його резервне копіювання потрібно "
"робити окремо."
#: web/ejabberd_web_admin.erl:2041
msgid "Store binary backup:"
msgstr "Зберегти бінарну резервну копію:"
#: web/ejabberd_web_admin.erl:2045 web/ejabberd_web_admin.erl:2052
#: web/ejabberd_web_admin.erl:2060 web/ejabberd_web_admin.erl:2067
#: web/ejabberd_web_admin.erl:2074 web/ejabberd_web_admin.erl:2081
#: web/ejabberd_web_admin.erl:2088 web/ejabberd_web_admin.erl:2096
#: web/ejabberd_web_admin.erl:2103 web/ejabberd_web_admin.erl:2110
msgid "OK"
msgstr "Продовжити"
#: web/ejabberd_web_admin.erl:2048
msgid "Restore binary backup immediately:"
msgstr "Відновити з бінарної резервної копії негайно:"
#: web/ejabberd_web_admin.erl:2056
msgid ""
"Restore binary backup after next ejabberd restart (requires less memory):"
msgstr ""
"Відновити з бінарної резервної копії при наступному запуску (потребує менше "
"пам'яті):"
#: web/ejabberd_web_admin.erl:2063
msgid "Store plain text backup:"
msgstr "Зберегти текстову резервну копію:"
#: web/ejabberd_web_admin.erl:2070
msgid "Restore plain text backup immediately:"
msgstr "Відновити з текстової резервної копії негайно:"
#: web/ejabberd_web_admin.erl:2077
msgid "Import users data from a PIEFXIS file (XEP-0227):"
msgstr "Імпорт даних користовучів з файлу PIEFXIS (XEP-0227):"
#: web/ejabberd_web_admin.erl:2084
msgid "Export data of all users in the server to PIEFXIS files (XEP-0227):"
msgstr "Експорт даних всіх користувачів сервера до файлу PIEFXIS (XEP-0227):"
#: web/ejabberd_web_admin.erl:2091
msgid "Export data of users in a host to PIEFXIS files (XEP-0227):"
msgstr "Експорт даних користувачів домена до файлу PIEFXIS (XEP-0227):"
#: web/ejabberd_web_admin.erl:2099
msgid "Import user data from jabberd14 spool file:"
msgstr "Імпорт користувачів з файла спула jabberd14:"
#: web/ejabberd_web_admin.erl:2106
msgid "Import users data from jabberd14 spool directory:"
msgstr "Імпорт користувачів з діректорії спула jabberd14:"
#: web/ejabberd_web_admin.erl:2132
msgid "Listened Ports at "
msgstr "Відкриті порти на "
#: web/ejabberd_web_admin.erl:2157
msgid "Modules at "
msgstr "Модулі на "
#: web/ejabberd_web_admin.erl:2183
msgid "Statistics of ~p"
msgstr "Статистика вузла ~p"
#: web/ejabberd_web_admin.erl:2186
msgid "Uptime:"
msgstr "Час роботи:"
#: web/ejabberd_web_admin.erl:2189
msgid "CPU Time:"
msgstr "Процесорний час:"
#: web/ejabberd_web_admin.erl:2195
msgid "Transactions Committed:"
msgstr "Транзакції завершені:"
#: web/ejabberd_web_admin.erl:2198
msgid "Transactions Aborted:"
msgstr "Транзакції відмінені:"
#: web/ejabberd_web_admin.erl:2201
msgid "Transactions Restarted:"
msgstr "Транзакції перезапущені:"
#: web/ejabberd_web_admin.erl:2204
msgid "Transactions Logged:"
msgstr "Транзакції запротокольовані:"
#: web/ejabberd_web_admin.erl:2246
msgid "Update "
msgstr "Поновлення "
#: web/ejabberd_web_admin.erl:2254
msgid "Update plan"
msgstr "План поновлення"
#: web/ejabberd_web_admin.erl:2255
msgid "Modified modules"
msgstr "Змінені модулі"
#: web/ejabberd_web_admin.erl:2256
msgid "Update script"
msgstr "Сценарій поновлення"
#: web/ejabberd_web_admin.erl:2257
msgid "Low level update script"
msgstr "Низькорівневий сценарій поновлення"
#: web/ejabberd_web_admin.erl:2258
msgid "Script check"
msgstr "Перевірка сценарію"
#: web/ejabberd_web_admin.erl:2426
msgid "Port"
msgstr "Порт"
#: web/ejabberd_web_admin.erl:2427
msgid "IP"
msgstr "IP"
#: web/ejabberd_web_admin.erl:2428
msgid "Protocol"
msgstr "Протокол"
#: web/ejabberd_web_admin.erl:2429 web/ejabberd_web_admin.erl:2556
msgid "Module"
msgstr "Модуль"
#: web/ejabberd_web_admin.erl:2430 web/ejabberd_web_admin.erl:2557
msgid "Options"
msgstr "Параметри"
#: web/ejabberd_web_admin.erl:2450
msgid "Delete"
msgstr "Видалити"
#: web/ejabberd_web_admin.erl:2579
msgid "Start"
msgstr "Запустити"
#: web/mod_register_web.erl:104
msgid "Your Jabber account was successfully created."
msgstr "Ваш Jabber-акаунт було успішно створено."
#: web/mod_register_web.erl:107
msgid "There was an error creating the account: "
msgstr "Помилка при створенні акаунту:"
#: web/mod_register_web.erl:115
msgid "Your Jabber account was successfully deleted."
msgstr "Ваш Jabber-акаунт було успішно видалено."
#: web/mod_register_web.erl:118
msgid "There was an error deleting the account: "
msgstr "Помилка при видаленні акаунту: "
#: web/mod_register_web.erl:128
msgid "The password of your Jabber account was successfully changed."
msgstr "Пароль вашого Jabber-акаунту був успішно змінений."
#: web/mod_register_web.erl:131
msgid "There was an error changing the password: "
msgstr "Помилка при зміні пароля: "
#: web/mod_register_web.erl:163 web/mod_register_web.erl:172
msgid "Jabber Account Registration"
msgstr "Реєстрація Jabber-акаунту"
#: web/mod_register_web.erl:174 web/mod_register_web.erl:192
#: web/mod_register_web.erl:201
msgid "Register a Jabber account"
msgstr "Зареєструвати Jabber-акаунт"
#: web/mod_register_web.erl:176 web/mod_register_web.erl:493
#: web/mod_register_web.erl:502
msgid "Unregister a Jabber account"
msgstr "Видалити Jabber-акаунт"
#: web/mod_register_web.erl:203
msgid ""
"This page allows to create a Jabber account in this Jabber server. Your JID "
"(Jabber IDentifier) will be of the form: username@server. Please read "
"carefully the instructions to fill correctly the fields."
msgstr ""
"Тут ви можете зареєструвати обліковий запис Jabber на цьому сервері. Ваш JID "
"(ідентифікатор Jabber) матиме вигляд \"користувач@сервер\". Щоб вірно "
"заповнити поля нижче, будь ласка, уважно читайте інструкції до них."
#: web/mod_register_web.erl:212 web/mod_register_web.erl:386
#: web/mod_register_web.erl:509
msgid "Username:"
msgstr "Ім'я користувача:"
#: web/mod_register_web.erl:217
msgid "This is case insensitive: macbeth is the same that MacBeth and Macbeth."
msgstr ""
"Регістр не має значення: \"МАША\" та \"маша\" буде сприйматися як одне й те "
"саме ім'я."
#: web/mod_register_web.erl:218
msgid "Characters not allowed:"
msgstr "Заборонені символи:"
#: web/mod_register_web.erl:222 web/mod_register_web.erl:391
#: web/mod_register_web.erl:514
msgid "Server:"
msgstr "Сервер:"
#: web/mod_register_web.erl:232
msgid ""
"Don't tell your password to anybody, not even the administrators of the "
"Jabber server."
msgstr "Нікому не кажіть свій пароль, навіть адміністраторам сервера."
#: web/mod_register_web.erl:234
msgid "You can later change your password using a Jabber client."
msgstr "Пізніше можна змінити пароль через Jabber-клієнт."
#: web/mod_register_web.erl:235
msgid ""
"Some Jabber clients can store your password in your computer. Use that "
"feature only if you trust your computer is safe."
msgstr ""
"Деякі Jabber-клієнти можуть зберігати пароль на вашому комп'ютері. "
"Користуйтесь цією функцією тільки у тому випадку, якщо вважаєте її безпечною."
#: web/mod_register_web.erl:237
msgid ""
"Memorize your password, or write it in a paper placed in a safe place. In "
"Jabber there isn't an automated way to recover your password if you forget "
"it."
msgstr ""
"Запам'ятайте пароль, або запишіть його на папері, який треба зберегти у "
"безпечному місці. У Jabber'і немає автоматизованих засобів відновлення "
"пароля на той випадок, якщо ви його забудете."
#: web/mod_register_web.erl:242 web/mod_register_web.erl:406
msgid "Password Verification:"
msgstr "Перевірка Пароля:"
#: web/mod_register_web.erl:250
msgid "Register"
msgstr "Реєстрація"
#: web/mod_register_web.erl:396
msgid "Old Password:"
msgstr "Старий пароль:"
#: web/mod_register_web.erl:401
msgid "New Password:"
msgstr "Новий Пароль:"
#: web/mod_register_web.erl:504
msgid "This page allows to unregister a Jabber account in this Jabber server."
msgstr "Ця сторінка дозволяє видалити свій акаунт з Jabber-сервера."
#: web/mod_register_web.erl:524
msgid "Unregister"
msgstr "Видалити"
#~ msgid "Captcha test failed"
#~ msgstr "Перевірка капчею закінчилась невдало"
ejabberd-2.1.11/src/msgs/no.po 0000664 0000000 0000000 00000152767 12240230175 012754 0 ustar msgid ""
msgstr ""
"Project-Id-Version: 2.1.0-alpha\n"
"POT-Creation-Date: \n"
"PO-Revision-Date: \n"
"Last-Translator: Stian B. Barmen \n"
"Language-Team: \n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Language: Norwegian (bokmål)\n"
#: ejabberd_c2s.erl:424 ejabberd_c2s.erl:727
msgid "Use of STARTTLS required"
msgstr "Bruk av STARTTLS kreves"
#: ejabberd_c2s.erl:503
msgid "No resource provided"
msgstr "Ingen ressurs angitt"
#: ejabberd_c2s.erl:1197
msgid "Replaced by new connection"
msgstr "Erstattet av en ny tilkobling"
#: ejabberd_c2s.erl:1885
msgid "Your active privacy list has denied the routing of this stanza."
msgstr "Din aktive privat liste har blokkert rutingen av denne strofen."
#: ejabberd_captcha.erl:96 ejabberd_captcha.erl:152 ejabberd_captcha.erl:178
msgid "Enter the text you see"
msgstr "Skriv inn teksten du ser"
#: ejabberd_captcha.erl:101
msgid "Your messages to ~s are being blocked. To unblock them, visit ~s"
msgstr "Dine meldinger til ~s blir blokkert. For å åpne igjen, besøk ~s"
#: ejabberd_captcha.erl:134
msgid "If you don't see the CAPTCHA image here, visit the web page."
msgstr "Dersom du ikke ser CAPTCHA bilde her, besøk web siden. "
#: ejabberd_captcha.erl:146
msgid "CAPTCHA web page"
msgstr "CAPTCHA web side"
#: ejabberd_captcha.erl:307
msgid "The CAPTCHA is valid."
msgstr "Captchaen er ikke gyldig"
#: mod_adhoc.erl:95 mod_adhoc.erl:125 mod_adhoc.erl:143 mod_adhoc.erl:161
msgid "Commands"
msgstr "Kommandoer"
#: mod_adhoc.erl:149 mod_adhoc.erl:243
msgid "Ping"
msgstr "Ping"
#: mod_adhoc.erl:260
msgid "Pong"
msgstr "Pong"
#: mod_announce.erl:507 mod_announce_odbc.erl:499
msgid "Really delete message of the day?"
msgstr "Virkelig slette melding for dagen?"
#: mod_announce.erl:515 mod_announce_odbc.erl:507 mod_configure.erl:1083
#: mod_configure.erl:1128
msgid "Subject"
msgstr "Tittel"
#: mod_announce.erl:520 mod_announce_odbc.erl:512 mod_configure.erl:1088
#: mod_configure.erl:1133
msgid "Message body"
msgstr "Meldingskropp"
#: mod_announce.erl:600 mod_announce_odbc.erl:592
msgid "No body provided for announce message"
msgstr "Ingen meldingskropp gitt for kunngjørings melding"
#: mod_announce.erl:635 mod_announce_odbc.erl:627
msgid "Announcements"
msgstr "Kunngjøringer"
#: mod_announce.erl:637 mod_announce_odbc.erl:629
msgid "Send announcement to all users"
msgstr "Send kunngjøring til alle brukere"
#: mod_announce.erl:639 mod_announce_odbc.erl:631
msgid "Send announcement to all users on all hosts"
msgstr "Send kunngjøring til alle brukere på alle maskiner"
#: mod_announce.erl:641 mod_announce_odbc.erl:633
msgid "Send announcement to all online users"
msgstr "Send kunngjøring alle tilkoblede brukere"
#: mod_announce.erl:643 mod_announce_odbc.erl:635 mod_configure.erl:1078
#: mod_configure.erl:1123
msgid "Send announcement to all online users on all hosts"
msgstr "Send kunngjøring til alle tilkoblede brukere på alle "
#: mod_announce.erl:645 mod_announce_odbc.erl:637
msgid "Set message of the day and send to online users"
msgstr "Angi melding for dagen og send til tilkoblede brukere"
#: mod_announce.erl:647 mod_announce_odbc.erl:639
msgid "Set message of the day on all hosts and send to online users"
msgstr "Angi melding for dagen på alle maskiner og send til "
#: mod_announce.erl:649 mod_announce_odbc.erl:641
msgid "Update message of the day (don't send)"
msgstr "Oppdater melding for dagen (ikke send)"
#: mod_announce.erl:651 mod_announce_odbc.erl:643
msgid "Update message of the day on all hosts (don't send)"
msgstr "Oppdater melding for dagen på alle maskiner (ikke send)"
#: mod_announce.erl:653 mod_announce_odbc.erl:645
msgid "Delete message of the day"
msgstr "Slett melding for dagen"
#: mod_announce.erl:655 mod_announce_odbc.erl:647
msgid "Delete message of the day on all hosts"
msgstr "Slett melding for dagen på alle maskiner"
#: mod_configure.erl:114 mod_configure.erl:274 mod_configure.erl:296
#: mod_configure.erl:498
msgid "Configuration"
msgstr "Konfigurasjon"
#: mod_configure.erl:125 mod_configure.erl:576 web/ejabberd_web_admin.erl:1936
msgid "Database"
msgstr "Database"
#: mod_configure.erl:127 mod_configure.erl:595
msgid "Start Modules"
msgstr "Start Moduler"
#: mod_configure.erl:129 mod_configure.erl:596
msgid "Stop Modules"
msgstr "Stop Moduler"
#: mod_configure.erl:131 mod_configure.erl:604 web/ejabberd_web_admin.erl:1937
msgid "Backup"
msgstr "Sikkerhetskopier"
#: mod_configure.erl:133 mod_configure.erl:605
msgid "Restore"
msgstr "Gjenopprett"
#: mod_configure.erl:135 mod_configure.erl:606
msgid "Dump to Text File"
msgstr "Dump til Tekstfil"
#: mod_configure.erl:137 mod_configure.erl:615
msgid "Import File"
msgstr "Importer File"
#: mod_configure.erl:139 mod_configure.erl:616
msgid "Import Directory"
msgstr "Importer Katalog"
#: mod_configure.erl:141 mod_configure.erl:581 mod_configure.erl:1057
msgid "Restart Service"
msgstr "Start Tjeneste på Nytt"
#: mod_configure.erl:143 mod_configure.erl:582 mod_configure.erl:1102
msgid "Shut Down Service"
msgstr "Avslutt Tjeneste"
#: mod_configure.erl:145 mod_configure.erl:518 mod_configure.erl:1197
#: web/ejabberd_web_admin.erl:1527
msgid "Add User"
msgstr "Legg til Bruker"
#: mod_configure.erl:147 mod_configure.erl:519 mod_configure.erl:1219
msgid "Delete User"
msgstr "Slett Bruker"
#: mod_configure.erl:149 mod_configure.erl:520 mod_configure.erl:1231
msgid "End User Session"
msgstr "Avslutt Bruker Sesjon"
#: mod_configure.erl:151 mod_configure.erl:521 mod_configure.erl:1243
#: mod_configure.erl:1255
msgid "Get User Password"
msgstr "Hent Brukers Passord"
#: mod_configure.erl:153 mod_configure.erl:522
msgid "Change User Password"
msgstr "Endre Brukers Passord"
#: mod_configure.erl:155 mod_configure.erl:523 mod_configure.erl:1272
msgid "Get User Last Login Time"
msgstr "Vis Brukers Siste Påloggings Tidspunkt"
#: mod_configure.erl:157 mod_configure.erl:524 mod_configure.erl:1284
msgid "Get User Statistics"
msgstr "Vis Bruker Statistikk"
#: mod_configure.erl:159 mod_configure.erl:525
msgid "Get Number of Registered Users"
msgstr "Vis Antall Registrerte Brukere"
#: mod_configure.erl:161 mod_configure.erl:526
msgid "Get Number of Online Users"
msgstr "Vis Antall Tilkoblede Brukere"
#: mod_configure.erl:163 mod_configure.erl:509 web/ejabberd_web_admin.erl:831
#: web/ejabberd_web_admin.erl:872
msgid "Access Control Lists"
msgstr "Tilgangskontrollister"
#: mod_configure.erl:165 mod_configure.erl:510 web/ejabberd_web_admin.erl:940
#: web/ejabberd_web_admin.erl:976
msgid "Access Rules"
msgstr "Tilgangsregler"
#: mod_configure.erl:297 mod_configure.erl:499
msgid "User Management"
msgstr "Bruker Behandling"
#: mod_configure.erl:500 web/ejabberd_web_admin.erl:1058
#: web/ejabberd_web_admin.erl:1462
msgid "Online Users"
msgstr "Tilkoblede Brukere"
#: mod_configure.erl:501
msgid "All Users"
msgstr "Alle Brukere"
#: mod_configure.erl:502
msgid "Outgoing s2s Connections"
msgstr "Utgående s2s Koblinger"
#: mod_configure.erl:503 web/ejabberd_web_admin.erl:1907
msgid "Running Nodes"
msgstr "Kjørende Noder"
#: mod_configure.erl:504 web/ejabberd_web_admin.erl:1909
msgid "Stopped Nodes"
msgstr "Stoppede Noder"
#: mod_configure.erl:577 mod_configure.erl:587 web/ejabberd_web_admin.erl:1953
msgid "Modules"
msgstr "Moduler"
#: mod_configure.erl:578
msgid "Backup Management"
msgstr "Håndtere Sikkerehetskopiering"
#: mod_configure.erl:579
msgid "Import Users From jabberd14 Spool Files"
msgstr "Importer Brukere Fra jabberd14 Spoolfiler"
#: mod_configure.erl:699
msgid "To ~s"
msgstr "Til ~s"
#: mod_configure.erl:717
msgid "From ~s"
msgstr "Fra ~s"
#: mod_configure.erl:913
msgid "Database Tables Configuration at "
msgstr "Database Tabell Konfigurasjon på "
#: mod_configure.erl:918
msgid "Choose storage type of tables"
msgstr "Velg lagringstype for tabeller"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "Disc only copy"
msgstr "Kun diskkopi"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "RAM and disc copy"
msgstr "RAM og diskkopi"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "RAM copy"
msgstr "RAM kopi"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "Remote copy"
msgstr "Lagres ikke lokalt"
#: mod_configure.erl:950
msgid "Stop Modules at "
msgstr "Stopp Moduler på "
#: mod_configure.erl:954
msgid "Choose modules to stop"
msgstr "Velg hvilke moduler som skal stoppes"
#: mod_configure.erl:969
msgid "Start Modules at "
msgstr "Start Moduler på "
#: mod_configure.erl:973
msgid "Enter list of {Module, [Options]}"
msgstr "Skriv inn en liste av {Module, [Options]}"
#: mod_configure.erl:974
msgid "List of modules to start"
msgstr "Liste over moduler som skal startes"
#: mod_configure.erl:983
msgid "Backup to File at "
msgstr "Sikkerhetskopiere til Fil på "
#: mod_configure.erl:987 mod_configure.erl:1001
msgid "Enter path to backup file"
msgstr "Skriv inn sti til sikkerhetskopi filen"
#: mod_configure.erl:988 mod_configure.erl:1002 mod_configure.erl:1016
#: mod_configure.erl:1030
msgid "Path to File"
msgstr "Sti til Fil"
#: mod_configure.erl:997
msgid "Restore Backup from File at "
msgstr "Gjenopprett fra Sikkerhetsopifil på "
#: mod_configure.erl:1011
msgid "Dump Backup to Text File at "
msgstr "Dump Sikkerhetskopi til Tekstfil på "
#: mod_configure.erl:1015
msgid "Enter path to text file"
msgstr "Skriv inn sti til tekstfil"
#: mod_configure.erl:1025
msgid "Import User from File at "
msgstr "Importer Bruker fra Fil på "
#: mod_configure.erl:1029
msgid "Enter path to jabberd14 spool file"
msgstr "Skriv inn sti til jabberd14 spoolfil"
#: mod_configure.erl:1039
msgid "Import Users from Dir at "
msgstr "Importer Brukere fra Katalog på "
#: mod_configure.erl:1043
msgid "Enter path to jabberd14 spool dir"
msgstr "Skriv inn sti til jabberd14 spoolkatalog"
#: mod_configure.erl:1044
msgid "Path to Dir"
msgstr "Sti til Katalog"
#: mod_configure.erl:1060 mod_configure.erl:1105
msgid "Time delay"
msgstr "Tids forsinkelse"
#: mod_configure.erl:1143
msgid "Access Control List Configuration"
msgstr "Konfigurasjon for Tilgangskontroll lister"
#: mod_configure.erl:1147
msgid "Access control lists"
msgstr "Tilgangskontroll lister"
#: mod_configure.erl:1171
msgid "Access Configuration"
msgstr "Tilgangskonfigurasjon"
#: mod_configure.erl:1175
msgid "Access rules"
msgstr "Tilgangsregler"
#: mod_configure.erl:1200 mod_configure.erl:1222 mod_configure.erl:1234
#: mod_configure.erl:1246 mod_configure.erl:1258 mod_configure.erl:1275
#: mod_configure.erl:1287 mod_configure.erl:1650 mod_configure.erl:1700
#: mod_configure.erl:1721 mod_roster.erl:943 mod_roster_odbc.erl:1060
#: mod_vcard.erl:472 mod_vcard_ldap.erl:554 mod_vcard_odbc.erl:448
msgid "Jabber ID"
msgstr "Jabber ID"
#: mod_configure.erl:1205 mod_configure.erl:1263 mod_configure.erl:1651
#: mod_configure.erl:1863 mod_muc/mod_muc_room.erl:3224 mod_register.erl:235
#: web/ejabberd_web_admin.erl:1520
msgid "Password"
msgstr "Passord"
#: mod_configure.erl:1210
msgid "Password Verification"
msgstr "Passord Bekreftelse"
#: mod_configure.erl:1301
msgid "Number of registered users"
msgstr "Antall registrerte brukere"
#: mod_configure.erl:1315
msgid "Number of online users"
msgstr "Antall tilkoblede brukere"
#: mod_configure.erl:1682 web/ejabberd_web_admin.erl:1588
#: web/ejabberd_web_admin.erl:1743
msgid "Never"
msgstr "Aldri"
#: mod_configure.erl:1696 web/ejabberd_web_admin.erl:1601
#: web/ejabberd_web_admin.erl:1756
msgid "Online"
msgstr "Tilkoblet"
#: mod_configure.erl:1701
msgid "Last login"
msgstr "Siste pålogging"
#: mod_configure.erl:1722
msgid "Roster size"
msgstr "Kontaktliste størrelse"
#: mod_configure.erl:1723
msgid "IP addresses"
msgstr "IP adresser"
#: mod_configure.erl:1724
msgid "Resources"
msgstr "Ressurser"
#: mod_configure.erl:1850
msgid "Administration of "
msgstr "Administrasjon av "
#: mod_configure.erl:1853
msgid "Action on user"
msgstr "Handling på bruker"
#: mod_configure.erl:1857
msgid "Edit Properties"
msgstr "Redigere Egenskaper"
#: mod_configure.erl:1860 web/ejabberd_web_admin.erl:1769
msgid "Remove User"
msgstr "Fjern Bruker"
#: mod_irc/mod_irc.erl:201 mod_irc/mod_irc_odbc.erl:196
#: mod_muc/mod_muc.erl:336 mod_muc/mod_muc_odbc.erl:342
msgid "Access denied by service policy"
msgstr "Tilgang nektes på grunn av en tjeneste regel"
#: mod_irc/mod_irc.erl:401 mod_irc/mod_irc_odbc.erl:398
msgid "IRC Transport"
msgstr "IRC Transport"
#: mod_irc/mod_irc.erl:428 mod_irc/mod_irc_odbc.erl:425
msgid "ejabberd IRC module"
msgstr "ejabberd IRC modul"
#: mod_irc/mod_irc.erl:559 mod_irc/mod_irc_odbc.erl:568
msgid "You need an x:data capable client to configure mod_irc settings"
msgstr ""
"Du trenger en x:data kompatibel klient for å konfigurere mod_irc instillinger"
#: mod_irc/mod_irc.erl:566 mod_irc/mod_irc_odbc.erl:575
msgid "Registration in mod_irc for "
msgstr "Registrering i mod_irc for "
#: mod_irc/mod_irc.erl:571 mod_irc/mod_irc_odbc.erl:580
msgid ""
"Enter username, encodings, ports and passwords you wish to use for "
"connecting to IRC servers"
msgstr ""
"Skriv brukernavn, tekstkoding, porter og passord du ønsker å bruke for "
"tilkobling til IRC servere"
#: mod_irc/mod_irc.erl:576 mod_irc/mod_irc_odbc.erl:585
msgid "IRC Username"
msgstr "IRC Brukernavn"
#: mod_irc/mod_irc.erl:586 mod_irc/mod_irc_odbc.erl:595
msgid ""
"If you want to specify different ports, passwords, encodings for IRC "
"servers, fill this list with values in format '{\"irc server\", \"encoding"
"\", port, \"password\"}'. By default this service use \"~s\" encoding, port "
"~p, empty password."
msgstr ""
"Om du ønsker å spesifisere tekstkoding for IRC tjenere, fyller du ut en "
"liste med verdier i formatet '{\"irc server\", \"encoding\", port, \"password"
"\"}'. Denne tjenesten bruker \"~s\" som standard, port ~p, empty password."
#: mod_irc/mod_irc.erl:598 mod_irc/mod_irc_odbc.erl:607
msgid ""
"Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef."
"net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."
msgstr ""
"Eksempel: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta."
"fef.net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."
#: mod_irc/mod_irc.erl:603 mod_irc/mod_irc_odbc.erl:612
msgid "Connections parameters"
msgstr "Tilkoblings parametere"
#: mod_irc/mod_irc.erl:728 mod_irc/mod_irc_odbc.erl:757
msgid "Join IRC channel"
msgstr "Bli med i IRC kanal"
#: mod_irc/mod_irc.erl:732 mod_irc/mod_irc_odbc.erl:761
msgid "IRC channel (don't put the first #)"
msgstr "IRC kanal (ikke skriv den første #)"
#: mod_irc/mod_irc.erl:737 mod_irc/mod_irc_odbc.erl:766
msgid "IRC server"
msgstr "IRC server"
#: mod_irc/mod_irc.erl:770 mod_irc/mod_irc.erl:774
#: mod_irc/mod_irc_odbc.erl:799 mod_irc/mod_irc_odbc.erl:803
msgid "Join the IRC channel here."
msgstr "Bli med i IRC kanalen her. "
#: mod_irc/mod_irc.erl:778 mod_irc/mod_irc_odbc.erl:807
msgid "Join the IRC channel in this Jabber ID: ~s"
msgstr "Bli med i IRC kanalen med denne Jabber ID: ~s"
#: mod_irc/mod_irc.erl:863 mod_irc/mod_irc_odbc.erl:904
msgid "IRC settings"
msgstr "IRC instillinger"
#: mod_irc/mod_irc.erl:868 mod_irc/mod_irc_odbc.erl:909
msgid ""
"Enter username and encodings you wish to use for connecting to IRC servers. "
"Press 'Next' to get more fields to fill in. Press 'Complete' to save "
"settings."
msgstr ""
"Angi brukernavn og kodinger du ønsker å bruke for å koble til IRC servere. "
"Trykk 'Neste' for å få flere felt for å fylle i. Trykk 'Fullfør' for å lagre "
"innstillingene."
#: mod_irc/mod_irc.erl:874 mod_irc/mod_irc_odbc.erl:915
msgid "IRC username"
msgstr "IRC brukernavn"
#: mod_irc/mod_irc.erl:923 mod_irc/mod_irc_odbc.erl:964
msgid "Password ~b"
msgstr "Passord ~b"
#: mod_irc/mod_irc.erl:928 mod_irc/mod_irc_odbc.erl:969
msgid "Port ~b"
msgstr "Port ~b"
#: mod_irc/mod_irc.erl:933 mod_irc/mod_irc_odbc.erl:974
msgid "Encoding for server ~b"
msgstr "Tekstkoding for server ~b"
#: mod_irc/mod_irc.erl:942 mod_irc/mod_irc_odbc.erl:983
msgid "Server ~b"
msgstr "Server ~b"
#: mod_muc/mod_muc.erl:449 mod_muc/mod_muc_odbc.erl:456
msgid "Only service administrators are allowed to send service messages"
msgstr "Bare tjeneste administratorer er tilatt å sende tjeneste "
#: mod_muc/mod_muc.erl:493 mod_muc/mod_muc_odbc.erl:500
msgid "Room creation is denied by service policy"
msgstr "Oppretting av rom nektes av en tjenste regel"
#: mod_muc/mod_muc.erl:500 mod_muc/mod_muc_odbc.erl:507
msgid "Conference room does not exist"
msgstr "Konferanserommet finnes ikke"
#: mod_muc/mod_muc.erl:582 mod_muc/mod_muc_odbc.erl:595
msgid "Chatrooms"
msgstr "Samtalerom"
#: mod_muc/mod_muc.erl:712 mod_muc/mod_muc_odbc.erl:729
msgid "You need a client that supports x:data to register the nickname"
msgstr "Du trenger en klient som støtter x:data for å registrere kallenavnet"
#: mod_muc/mod_muc.erl:718 mod_muc/mod_muc_odbc.erl:735
msgid "Nickname Registration at "
msgstr "Registrer Kallenavn på "
#: mod_muc/mod_muc.erl:722 mod_muc/mod_muc_odbc.erl:739
msgid "Enter nickname you want to register"
msgstr "Skriv inn kallenavnet du ønsker å registrere"
#: mod_muc/mod_muc.erl:723 mod_muc/mod_muc_odbc.erl:740
#: mod_muc/mod_muc_room.erl:3810 mod_roster.erl:944 mod_roster_odbc.erl:1061
#: mod_vcard.erl:364 mod_vcard.erl:477 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:453
msgid "Nickname"
msgstr "Kallenavn"
#: mod_muc/mod_muc.erl:762 mod_muc/mod_muc_odbc.erl:784
#: mod_muc/mod_muc_room.erl:1064 mod_muc/mod_muc_room.erl:1787
msgid "That nickname is registered by another person"
msgstr "Det kallenavnet er registrert av en annen person"
#: mod_muc/mod_muc.erl:788 mod_muc/mod_muc_odbc.erl:811
msgid "You must fill in field \"Nickname\" in the form"
msgstr "Du må fylle inn feltet \"Nickname\" i skjemaet"
#: mod_muc/mod_muc.erl:808 mod_muc/mod_muc_odbc.erl:831
msgid "ejabberd MUC module"
msgstr "ejabberd MUC modul"
#: mod_muc/mod_muc_log.erl:374 mod_muc/mod_muc_log.erl:381
msgid "Chatroom configuration modified"
msgstr "Samtalerommets konfigurasjon er endret"
#: mod_muc/mod_muc_log.erl:384
msgid "joins the room"
msgstr "kommer inn i rommet"
#: mod_muc/mod_muc_log.erl:387 mod_muc/mod_muc_log.erl:390
msgid "leaves the room"
msgstr "forlater rommet"
#: mod_muc/mod_muc_log.erl:393 mod_muc/mod_muc_log.erl:396
msgid "has been banned"
msgstr "har blitt bannlyst"
#: mod_muc/mod_muc_log.erl:399 mod_muc/mod_muc_log.erl:402
msgid "has been kicked"
msgstr "har blitt kastet ut"
#: mod_muc/mod_muc_log.erl:405
msgid "has been kicked because of an affiliation change"
msgstr "har blitt kastet ut på grunn av en tilknytnings endring"
#: mod_muc/mod_muc_log.erl:408
msgid "has been kicked because the room has been changed to members-only"
msgstr ""
"har blitt kastet ut på grunn av at rommet er endret til kun-for-medlemmer"
#: mod_muc/mod_muc_log.erl:411
msgid "has been kicked because of a system shutdown"
msgstr "har blitt kastet ut på grunn av at systemet avslutter"
#: mod_muc/mod_muc_log.erl:414
msgid "is now known as"
msgstr "er nå kjent som"
#: mod_muc/mod_muc_log.erl:417 mod_muc/mod_muc_log.erl:688
#: mod_muc/mod_muc_room.erl:2393
msgid " has set the subject to: "
msgstr " har satt emnet til: "
#: mod_muc/mod_muc_log.erl:452
msgid "Chatroom is created"
msgstr "Samtalerom er opprettet"
#: mod_muc/mod_muc_log.erl:453
msgid "Chatroom is destroyed"
msgstr "Samtalerom er fjernet"
#: mod_muc/mod_muc_log.erl:454
msgid "Chatroom is started"
msgstr "Samtalerom er startet"
#: mod_muc/mod_muc_log.erl:455
msgid "Chatroom is stopped"
msgstr "Samtalerom er stoppet"
#: mod_muc/mod_muc_log.erl:459
msgid "Monday"
msgstr "mandag"
#: mod_muc/mod_muc_log.erl:460
msgid "Tuesday"
msgstr "tirsdag"
#: mod_muc/mod_muc_log.erl:461
msgid "Wednesday"
msgstr "onsdag"
#: mod_muc/mod_muc_log.erl:462
msgid "Thursday"
msgstr "torsdag"
#: mod_muc/mod_muc_log.erl:463
msgid "Friday"
msgstr "fredag"
#: mod_muc/mod_muc_log.erl:464
msgid "Saturday"
msgstr "lørdag"
#: mod_muc/mod_muc_log.erl:465
msgid "Sunday"
msgstr "søndag"
#: mod_muc/mod_muc_log.erl:469
msgid "January"
msgstr "januar"
#: mod_muc/mod_muc_log.erl:470
msgid "February"
msgstr "februar"
#: mod_muc/mod_muc_log.erl:471
msgid "March"
msgstr "mars"
#: mod_muc/mod_muc_log.erl:472
msgid "April"
msgstr "april"
#: mod_muc/mod_muc_log.erl:473
msgid "May"
msgstr "mai"
#: mod_muc/mod_muc_log.erl:474
msgid "June"
msgstr "juni"
#: mod_muc/mod_muc_log.erl:475
msgid "July"
msgstr "juli"
#: mod_muc/mod_muc_log.erl:476
msgid "August"
msgstr "august"
#: mod_muc/mod_muc_log.erl:477
msgid "September"
msgstr "september"
#: mod_muc/mod_muc_log.erl:478
msgid "October"
msgstr "oktober"
#: mod_muc/mod_muc_log.erl:479
msgid "November"
msgstr "november"
#: mod_muc/mod_muc_log.erl:480
msgid "December"
msgstr "desember"
#: mod_muc/mod_muc_log.erl:750
msgid "Room Configuration"
msgstr "Rom Konfigurasjon"
#: mod_muc/mod_muc_log.erl:759
msgid "Room Occupants"
msgstr "Samtalerom Deltakere"
#: mod_muc/mod_muc_room.erl:174
msgid "Traffic rate limit is exceeded"
msgstr "Trafikkmengde grense overskredet"
#: mod_muc/mod_muc_room.erl:246
msgid ""
"This participant is kicked from the room because he sent an error message"
msgstr ""
"Denne deltakeren er kastet ut av rommet fordi han sendte en feilmelding"
#: mod_muc/mod_muc_room.erl:255
msgid "It is not allowed to send private messages to the conference"
msgstr "Det er ikke tillatt å sende private meldinger til "
#: mod_muc/mod_muc_room.erl:332
msgid "Please, wait for a while before sending new voice request"
msgstr "Vennligst vent en stund før du sender en ny lyd forespørsel"
#: mod_muc/mod_muc_room.erl:347
msgid "Voice requests are disabled in this conference"
msgstr "Lyd forespørsler er blokkert i denne konferansen"
#: mod_muc/mod_muc_room.erl:364
msgid "Failed to extract JID from your voice request approval"
msgstr "Feilet i forsøk på å hente JID fra din lyd forespørsel godkjenning"
#: mod_muc/mod_muc_room.erl:393
msgid "Only moderators can approve voice requests"
msgstr "Bare ordstyrer kan godkjenne lyd forespørsler"
#: mod_muc/mod_muc_room.erl:408
msgid "Improper message type"
msgstr "Feilaktig meldingstype"
#: mod_muc/mod_muc_room.erl:518
msgid ""
"This participant is kicked from the room because he sent an error message to "
"another participant"
msgstr ""
"Denne deltakeren er kastet ut av rommet fordi han sendte en feilmelding til "
"en annen deltaker"
#: mod_muc/mod_muc_room.erl:531
msgid "It is not allowed to send private messages of type \"groupchat\""
msgstr "Det er ikke tillatt å sende private meldinger med typen "
#: mod_muc/mod_muc_room.erl:543 mod_muc/mod_muc_room.erl:611
msgid "Recipient is not in the conference room"
msgstr "Mottakeren er ikke i konferanserommet"
#: mod_muc/mod_muc_room.erl:564 mod_muc/mod_muc_room.erl:585
msgid "It is not allowed to send private messages"
msgstr "Det er ikke tillatt å sende private meldinger"
#: mod_muc/mod_muc_room.erl:576 mod_muc/mod_muc_room.erl:956
#: mod_muc/mod_muc_room.erl:4040
msgid "Only occupants are allowed to send messages to the conference"
msgstr "Bare deltakere får sende normale meldinger til konferansen"
#: mod_muc/mod_muc_room.erl:634
msgid "Only occupants are allowed to send queries to the conference"
msgstr "Bare deltakere er tillatt å sende forespørsler til "
#: mod_muc/mod_muc_room.erl:646
msgid "Queries to the conference members are not allowed in this room"
msgstr "Forespørsler til konferanse medlemmene er ikke tillat i dette rommet"
#: mod_muc/mod_muc_room.erl:932
msgid ""
"Only moderators and participants are allowed to change the subject in this "
"room"
msgstr "Bare redaktører og deltakere kan endre emnet i dette rommet"
#: mod_muc/mod_muc_room.erl:937
msgid "Only moderators are allowed to change the subject in this room"
msgstr "Bare ordstyrer tillates å endre emnet i dette rommet"
#: mod_muc/mod_muc_room.erl:947
msgid "Visitors are not allowed to send messages to all occupants"
msgstr "Besøkende får ikke sende meldinger til alle deltakere"
#: mod_muc/mod_muc_room.erl:1021
msgid ""
"This participant is kicked from the room because he sent an error presence"
msgstr ""
"Denne deltakeren er kastet ut av rommet fordi han sendte feil "
"tilstederværelse"
#: mod_muc/mod_muc_room.erl:1040
msgid "Visitors are not allowed to change their nicknames in this room"
msgstr "Besøkende får ikke lov å endre kallenavn i dette "
#: mod_muc/mod_muc_room.erl:1053 mod_muc/mod_muc_room.erl:1779
msgid "That nickname is already in use by another occupant"
msgstr "Det kallenavnet er allerede i bruk av en annen deltaker"
#: mod_muc/mod_muc_room.erl:1768
msgid "You have been banned from this room"
msgstr "Du har blitt bannlyst i dette rommet."
#: mod_muc/mod_muc_room.erl:1771
msgid "Membership is required to enter this room"
msgstr "Medlemskap kreves for tilgang til samtalerommet"
#: mod_muc/mod_muc_room.erl:1807
msgid "This room is not anonymous"
msgstr "Dette rommet er ikke anonymt"
#: mod_muc/mod_muc_room.erl:1833
msgid "A password is required to enter this room"
msgstr "Et passord kreves for tilgang til samtalerommet"
#: mod_muc/mod_muc_room.erl:1855 mod_register.erl:246
msgid "Too many CAPTCHA requests"
msgstr "For mange CAPTCHA forespørsler"
#: mod_muc/mod_muc_room.erl:1864 mod_register.erl:251
msgid "Unable to generate a CAPTCHA"
msgstr "Umulig å generere en CAPTCHA"
#: mod_muc/mod_muc_room.erl:1874
msgid "Incorrect password"
msgstr "Feil passord"
#: mod_muc/mod_muc_room.erl:2448
msgid "Administrator privileges required"
msgstr "Administratorprivilegier kreves"
#: mod_muc/mod_muc_room.erl:2463
msgid "Moderator privileges required"
msgstr "Redaktørprivilegier kreves"
#: mod_muc/mod_muc_room.erl:2619
msgid "Jabber ID ~s is invalid"
msgstr "Ugyldig Jabber ID ~s"
#: mod_muc/mod_muc_room.erl:2633
msgid "Nickname ~s does not exist in the room"
msgstr "Kallenavn ~s eksisterer ikke i dette rommet"
#: mod_muc/mod_muc_room.erl:2659 mod_muc/mod_muc_room.erl:3049
msgid "Invalid affiliation: ~s"
msgstr "Ugyldig rang: ~s"
#: mod_muc/mod_muc_room.erl:2713
msgid "Invalid role: ~s"
msgstr "Ugyldig rolle: ~s"
#: mod_muc/mod_muc_room.erl:3026 mod_muc/mod_muc_room.erl:3062
msgid "Owner privileges required"
msgstr "Eierprivilegier kreves"
#: mod_muc/mod_muc_room.erl:3195
msgid "Configuration of room ~s"
msgstr "Konfigurasjon for rom ~s"
#: mod_muc/mod_muc_room.erl:3200
msgid "Room title"
msgstr "Romtittel"
#: mod_muc/mod_muc_room.erl:3203 mod_muc/mod_muc_room.erl:3692
msgid "Room description"
msgstr "Rom beskrivelse"
#: mod_muc/mod_muc_room.erl:3210
msgid "Make room persistent"
msgstr "Gjør rommet permanent"
#: mod_muc/mod_muc_room.erl:3215
msgid "Make room public searchable"
msgstr "Gjør rommet offentlig søkbart"
#: mod_muc/mod_muc_room.erl:3218
msgid "Make participants list public"
msgstr "Gjør deltakerlisten offentlig"
#: mod_muc/mod_muc_room.erl:3221
msgid "Make room password protected"
msgstr "Passordbeskytt rommet"
#: mod_muc/mod_muc_room.erl:3232
msgid "Maximum Number of Occupants"
msgstr "Maksimum Antall Deltakere"
#: mod_muc/mod_muc_room.erl:3239
msgid "No limit"
msgstr "Ingen grense"
#: mod_muc/mod_muc_room.erl:3250
msgid "Present real Jabber IDs to"
msgstr "Presenter ekte Jabber IDer til"
#: mod_muc/mod_muc_room.erl:3258 mod_muc/mod_muc_room.erl:3292
msgid "moderators only"
msgstr "kun for redaktører"
#: mod_muc/mod_muc_room.erl:3260 mod_muc/mod_muc_room.erl:3294
msgid "anyone"
msgstr "hvem som helst"
#: mod_muc/mod_muc_room.erl:3262
msgid "Make room members-only"
msgstr "Gjør rommet tilgjengelig kun for medlemmer"
#: mod_muc/mod_muc_room.erl:3265
msgid "Make room moderated"
msgstr "Gjør rommet redaktørstyrt"
#: mod_muc/mod_muc_room.erl:3268
msgid "Default users as participants"
msgstr "Standard brukere som deltakere"
#: mod_muc/mod_muc_room.erl:3271
msgid "Allow users to change the subject"
msgstr "Tillat brukere å endre emne"
#: mod_muc/mod_muc_room.erl:3274
msgid "Allow users to send private messages"
msgstr "Tillat brukere å sende private meldinger"
#: mod_muc/mod_muc_room.erl:3279
msgid "Allow visitors to send private messages to"
msgstr "Tillat brukere å sende private meldinger til"
#: mod_muc/mod_muc_room.erl:3290
msgid "nobody"
msgstr "ingen"
#: mod_muc/mod_muc_room.erl:3296
msgid "Allow users to query other users"
msgstr "Tillat brukere å sende forespørsel til andre brukere"
#: mod_muc/mod_muc_room.erl:3299
msgid "Allow users to send invites"
msgstr "Tillat brukere å sende invitasjoner"
#: mod_muc/mod_muc_room.erl:3302
msgid "Allow visitors to send status text in presence updates"
msgstr "Tillat besøkende å sende status tekst i "
#: mod_muc/mod_muc_room.erl:3305
msgid "Allow visitors to change nickname"
msgstr "Tillat besøkende å endre kallenavn"
#: mod_muc/mod_muc_room.erl:3308
msgid "Allow visitors to send voice requests"
msgstr "Tillat brukere å sende lyd forespørsler"
#: mod_muc/mod_muc_room.erl:3311
msgid "Minimum interval between voice requests (in seconds)"
msgstr "Minimums interval mellom lyd forespørsler (i sekunder)"
#: mod_muc/mod_muc_room.erl:3317
msgid "Make room CAPTCHA protected"
msgstr "Gjør rommet CAPTCHA beskyttet"
#: mod_muc/mod_muc_room.erl:3322
msgid "Exclude Jabber IDs from CAPTCHA challenge"
msgstr "Ekskluder Jabber IDer fra CAPTCHA utfordring"
#: mod_muc/mod_muc_room.erl:3329
msgid "Enable logging"
msgstr "Slå på logging"
#: mod_muc/mod_muc_room.erl:3337
msgid "You need an x:data capable client to configure room"
msgstr "Du trenger en klient som støtter x:data for å "
#: mod_muc/mod_muc_room.erl:3694
msgid "Number of occupants"
msgstr "Antall deltakere"
#: mod_muc/mod_muc_room.erl:3750
msgid "private, "
msgstr "privat, "
#: mod_muc/mod_muc_room.erl:3799
msgid "Voice request"
msgstr "Lyd forespørsel"
#: mod_muc/mod_muc_room.erl:3803
msgid "Either approve or decline the voice request."
msgstr "Enten godkjenn eller forby lyd forespørselen"
#: mod_muc/mod_muc_room.erl:3809
msgid "User JID"
msgstr "Bruker JID"
#: mod_muc/mod_muc_room.erl:3811
msgid "Grant voice to this person?"
msgstr "Gi lyd til denne personen?"
#: mod_muc/mod_muc_room.erl:3960
msgid "~s invites you to the room ~s"
msgstr "~s inviterer deg til rommet ~s"
#: mod_muc/mod_muc_room.erl:3969
msgid "the password is"
msgstr "passordet er"
#: mod_offline.erl:510 mod_offline_odbc.erl:352
msgid ""
"Your contact offline message queue is full. The message has been discarded."
msgstr "Kontaktens frakoblede meldingskø er full. Meldingen har blitt kassert."
#: mod_offline.erl:560 mod_offline_odbc.erl:408
msgid "~s's Offline Messages Queue"
msgstr "~ss kø for Frakoblede Meldinger"
#: mod_offline.erl:563 mod_offline_odbc.erl:411 mod_roster.erl:987
#: mod_roster_odbc.erl:1104 mod_shared_roster.erl:901
#: mod_shared_roster.erl:1010 mod_shared_roster_odbc.erl:930
#: mod_shared_roster_odbc.erl:1039 web/ejabberd_web_admin.erl:833
#: web/ejabberd_web_admin.erl:874 web/ejabberd_web_admin.erl:942
#: web/ejabberd_web_admin.erl:978 web/ejabberd_web_admin.erl:1019
#: web/ejabberd_web_admin.erl:1508 web/ejabberd_web_admin.erl:1760
#: web/ejabberd_web_admin.erl:1931 web/ejabberd_web_admin.erl:1963
#: web/ejabberd_web_admin.erl:2031 web/ejabberd_web_admin.erl:2135
#: web/ejabberd_web_admin.erl:2160 web/ejabberd_web_admin.erl:2248
msgid "Submitted"
msgstr "Innsendt"
#: mod_offline.erl:571
msgid "Time"
msgstr "Tid"
#: mod_offline.erl:572
msgid "From"
msgstr "Fra"
#: mod_offline.erl:573
msgid "To"
msgstr "Til"
#: mod_offline.erl:574 mod_offline_odbc.erl:419
msgid "Packet"
msgstr "Pakke"
#: mod_offline.erl:587 mod_offline_odbc.erl:432 mod_shared_roster.erl:908
#: mod_shared_roster_odbc.erl:937 web/ejabberd_web_admin.erl:882
#: web/ejabberd_web_admin.erl:986
msgid "Delete Selected"
msgstr "Slett valgte"
#: mod_offline.erl:645 mod_offline_odbc.erl:519
msgid "Offline Messages:"
msgstr "Frakoblede Meldinger:"
#: mod_offline.erl:645 mod_offline_odbc.erl:519
msgid "Remove All Offline Messages"
msgstr "Fjern Alle Frakoblede Meldinger"
#: mod_proxy65/mod_proxy65_service.erl:213
msgid "ejabberd SOCKS5 Bytestreams module"
msgstr "ejabberd SOCKS5 Bytestreams modul"
#: mod_pubsub/mod_pubsub.erl:1120 mod_pubsub/mod_pubsub_odbc.erl:929
msgid "Publish-Subscribe"
msgstr "Publish-Subscribe"
#: mod_pubsub/mod_pubsub.erl:1214 mod_pubsub/mod_pubsub_odbc.erl:1025
msgid "ejabberd Publish-Subscribe module"
msgstr "ejabberd Publish-Subscribe modul"
#: mod_pubsub/mod_pubsub.erl:1497 mod_pubsub/mod_pubsub_odbc.erl:1312
msgid "PubSub subscriber request"
msgstr "PubSub abonements forespørsel"
#: mod_pubsub/mod_pubsub.erl:1499 mod_pubsub/mod_pubsub_odbc.erl:1314
msgid "Choose whether to approve this entity's subscription."
msgstr "Velg om du vil godkjenne denne eksistensens abonement"
#: mod_pubsub/mod_pubsub.erl:1505 mod_pubsub/mod_pubsub_odbc.erl:1320
msgid "Node ID"
msgstr "Node ID"
#: mod_pubsub/mod_pubsub.erl:1510 mod_pubsub/mod_pubsub_odbc.erl:1325
msgid "Subscriber Address"
msgstr "Abonnements Adresse"
#: mod_pubsub/mod_pubsub.erl:1516 mod_pubsub/mod_pubsub_odbc.erl:1331
msgid "Allow this Jabber ID to subscribe to this pubsub node?"
msgstr "Tillat denne Jabber ID å abonnere på denne pubsub "
#: mod_pubsub/mod_pubsub.erl:3474 mod_pubsub/mod_pubsub_odbc.erl:3287
msgid "Deliver payloads with event notifications"
msgstr "Send innhold sammen med kunngjøringer"
#: mod_pubsub/mod_pubsub.erl:3475 mod_pubsub/mod_pubsub_odbc.erl:3288
msgid "Deliver event notifications"
msgstr "Lever begivenhets kunngjøringer"
#: mod_pubsub/mod_pubsub.erl:3476 mod_pubsub/mod_pubsub_odbc.erl:3289
msgid "Notify subscribers when the node configuration changes"
msgstr "Informer abonnenter når node konfigurasjonen endres"
#: mod_pubsub/mod_pubsub.erl:3477 mod_pubsub/mod_pubsub_odbc.erl:3290
msgid "Notify subscribers when the node is deleted"
msgstr "Informer abonnenter når noden slettes"
#: mod_pubsub/mod_pubsub.erl:3478 mod_pubsub/mod_pubsub_odbc.erl:3291
msgid "Notify subscribers when items are removed from the node"
msgstr "Informer abonnenter når elementer fjernes fra noden"
#: mod_pubsub/mod_pubsub.erl:3479 mod_pubsub/mod_pubsub_odbc.erl:3292
msgid "Persist items to storage"
msgstr "Vedvarende elementer til lagring"
#: mod_pubsub/mod_pubsub.erl:3480 mod_pubsub/mod_pubsub_odbc.erl:3293
msgid "A friendly name for the node"
msgstr "Et vennlig navn for noden"
#: mod_pubsub/mod_pubsub.erl:3481 mod_pubsub/mod_pubsub_odbc.erl:3294
msgid "Max # of items to persist"
msgstr "Høyeste # elementer som skal lagres"
#: mod_pubsub/mod_pubsub.erl:3482 mod_pubsub/mod_pubsub_odbc.erl:3295
msgid "Whether to allow subscriptions"
msgstr "Om man skal tillate abonnenter"
#: mod_pubsub/mod_pubsub.erl:3483 mod_pubsub/mod_pubsub_odbc.erl:3296
msgid "Specify the access model"
msgstr "Spesifiser aksess modellen"
#: mod_pubsub/mod_pubsub.erl:3486 mod_pubsub/mod_pubsub_odbc.erl:3299
msgid "Roster groups allowed to subscribe"
msgstr "Kontaktliste grupper som tillates å abonnere"
#: mod_pubsub/mod_pubsub.erl:3487 mod_pubsub/mod_pubsub_odbc.erl:3300
msgid "Specify the publisher model"
msgstr "Angi publiserings modell"
#: mod_pubsub/mod_pubsub.erl:3489 mod_pubsub/mod_pubsub_odbc.erl:3302
msgid "Purge all items when the relevant publisher goes offline"
msgstr "Rydd alle elementer når den aktuelle utgiveren logger av"
#: mod_pubsub/mod_pubsub.erl:3490 mod_pubsub/mod_pubsub_odbc.erl:3303
msgid "Specify the event message type"
msgstr "Spesifiser hendelsesbeskjed type"
#: mod_pubsub/mod_pubsub.erl:3492 mod_pubsub/mod_pubsub_odbc.erl:3305
msgid "Max payload size in bytes"
msgstr "Største innholdsstørrelse i byte"
#: mod_pubsub/mod_pubsub.erl:3493 mod_pubsub/mod_pubsub_odbc.erl:3306
msgid "When to send the last published item"
msgstr "Når skal siste publiserte artikkel sendes"
#: mod_pubsub/mod_pubsub.erl:3495 mod_pubsub/mod_pubsub_odbc.erl:3308
msgid "Only deliver notifications to available users"
msgstr "Send kunngjøringer bare til tilgjengelige brukere"
#: mod_pubsub/mod_pubsub.erl:3496 mod_pubsub/mod_pubsub_odbc.erl:3309
msgid "The collections with which a node is affiliated"
msgstr "Samlingene som en node er assosiert med"
#: mod_register.erl:193
msgid "The CAPTCHA verification has failed"
msgstr "CAPTCHA godkjenningen har feilet"
#: mod_register.erl:220
msgid "You need a client that supports x:data and CAPTCHA to register"
msgstr "Du trenger en klient som støtter x:data og CAPTCHA for registrering "
#: mod_register.erl:226 mod_register.erl:265
msgid "Choose a username and password to register with this server"
msgstr "Velg et brukernavn og passord for å registrere på "
#: mod_register.erl:230 mod_vcard.erl:364 mod_vcard_odbc.erl:342
#: web/ejabberd_web_admin.erl:1515 web/ejabberd_web_admin.erl:1572
msgid "User"
msgstr "Bruker"
#: mod_register.erl:316 mod_register.erl:361
msgid "The password is too weak"
msgstr "Passordet er for svakt"
#: mod_register.erl:365
msgid "Users are not allowed to register accounts so quickly"
msgstr "Brukere får ikke lov til registrere kontoer så fort"
#: mod_roster.erl:938 mod_roster_odbc.erl:1055 web/ejabberd_web_admin.erl:1701
#: web/ejabberd_web_admin.erl:1886 web/ejabberd_web_admin.erl:1897
#: web/ejabberd_web_admin.erl:2219
msgid "None"
msgstr "Ingen"
#: mod_roster.erl:945 mod_roster_odbc.erl:1062
msgid "Subscription"
msgstr "Abonnement"
#: mod_roster.erl:946 mod_roster_odbc.erl:1063
msgid "Pending"
msgstr "Ventende"
#: mod_roster.erl:947 mod_roster_odbc.erl:1064
msgid "Groups"
msgstr "Grupper"
#: mod_roster.erl:974 mod_roster_odbc.erl:1091
msgid "Validate"
msgstr "Bekrefte gyldighet"
#: mod_roster.erl:982 mod_roster_odbc.erl:1099
msgid "Remove"
msgstr "Fjern"
#: mod_roster.erl:985 mod_roster_odbc.erl:1102
msgid "Roster of "
msgstr "Kontaktliste for "
#: mod_roster.erl:988 mod_roster_odbc.erl:1105 mod_shared_roster.erl:902
#: mod_shared_roster.erl:1011 mod_shared_roster_odbc.erl:931
#: mod_shared_roster_odbc.erl:1040 web/ejabberd_web_admin.erl:834
#: web/ejabberd_web_admin.erl:875 web/ejabberd_web_admin.erl:943
#: web/ejabberd_web_admin.erl:979 web/ejabberd_web_admin.erl:1020
#: web/ejabberd_web_admin.erl:1509 web/ejabberd_web_admin.erl:1761
#: web/ejabberd_web_admin.erl:1932 web/ejabberd_web_admin.erl:2136
#: web/ejabberd_web_admin.erl:2161
msgid "Bad format"
msgstr "Feil format"
#: mod_roster.erl:995 mod_roster_odbc.erl:1112
msgid "Add Jabber ID"
msgstr "Legg til Jabber ID"
#: mod_roster.erl:1094 mod_roster_odbc.erl:1211
msgid "Roster"
msgstr "Kontaktliste"
#: mod_shared_roster.erl:857 mod_shared_roster.erl:899
#: mod_shared_roster.erl:1007 mod_shared_roster_odbc.erl:886
#: mod_shared_roster_odbc.erl:928 mod_shared_roster_odbc.erl:1036
msgid "Shared Roster Groups"
msgstr "Delte Kontaktgrupper"
#: mod_shared_roster.erl:895 mod_shared_roster_odbc.erl:924
#: web/ejabberd_web_admin.erl:1365 web/ejabberd_web_admin.erl:2461
msgid "Add New"
msgstr "Legg til ny"
#: mod_shared_roster.erl:978 mod_shared_roster_odbc.erl:1007
msgid "Name:"
msgstr "Navn:"
#: mod_shared_roster.erl:983 mod_shared_roster_odbc.erl:1012
msgid "Description:"
msgstr "Beskrivelse:"
#: mod_shared_roster.erl:991 mod_shared_roster_odbc.erl:1020
msgid "Members:"
msgstr "Medlemmer:"
#: mod_shared_roster.erl:999 mod_shared_roster_odbc.erl:1028
msgid "Displayed Groups:"
msgstr "Viste grupper:"
#: mod_shared_roster.erl:1008 mod_shared_roster_odbc.erl:1037
msgid "Group "
msgstr "Gruppe "
#: mod_shared_roster.erl:1017 mod_shared_roster_odbc.erl:1046
#: web/ejabberd_web_admin.erl:840 web/ejabberd_web_admin.erl:884
#: web/ejabberd_web_admin.erl:949 web/ejabberd_web_admin.erl:1026
#: web/ejabberd_web_admin.erl:2017
msgid "Submit"
msgstr "Send"
#: mod_vcard.erl:165 mod_vcard_ldap.erl:238 mod_vcard_odbc.erl:129
msgid "Erlang Jabber Server"
msgstr "Erlang Jabber Server"
#: mod_vcard.erl:364 mod_vcard.erl:478 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:454
msgid "Birthday"
msgstr "Fødselsdag"
#: mod_vcard.erl:364 mod_vcard.erl:480 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:456
msgid "City"
msgstr "By"
#: mod_vcard.erl:364 mod_vcard.erl:479 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:455
msgid "Country"
msgstr "Land"
#: mod_vcard.erl:364 mod_vcard.erl:481 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:457
msgid "Email"
msgstr "Epost"
#: mod_vcard.erl:364 mod_vcard.erl:476 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:452
msgid "Family Name"
msgstr "Etternavn"
#: mod_vcard.erl:364 mod_vcard_odbc.erl:342
msgid ""
"Fill in the form to search for any matching Jabber User (Add * to the end of "
"field to match substring)"
msgstr ""
"Fyll inn skjemaet for å søke etter Jabber bruker (Legg til * på slutten av "
"feltet for å treffe alle som starter slik)"
#: mod_vcard.erl:364 mod_vcard.erl:473 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:449
msgid "Full Name"
msgstr "Fullstendig Navn"
#: mod_vcard.erl:364 mod_vcard.erl:475 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:451
msgid "Middle Name"
msgstr "Mellomnavn"
#: mod_vcard.erl:364 mod_vcard.erl:474 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:450 web/ejabberd_web_admin.erl:2006
msgid "Name"
msgstr "Navn"
#: mod_vcard.erl:364 mod_vcard.erl:482 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:458
msgid "Organization Name"
msgstr "Organisasjonsnavn"
#: mod_vcard.erl:364 mod_vcard.erl:483 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:459
msgid "Organization Unit"
msgstr "Organisasjonsenhet"
#: mod_vcard.erl:364 mod_vcard_ldap.erl:462 mod_vcard_odbc.erl:342
msgid "Search users in "
msgstr "Søk etter brukere i "
#: mod_vcard.erl:364 mod_vcard_ldap.erl:462 mod_vcard_odbc.erl:342
msgid "You need an x:data capable client to search"
msgstr "Du tregner en klient som støtter x:data for å kunne "
#: mod_vcard.erl:389 mod_vcard_ldap.erl:487 mod_vcard_odbc.erl:367
msgid "vCard User Search"
msgstr "vCard Bruker Søk"
#: mod_vcard.erl:445 mod_vcard_ldap.erl:541 mod_vcard_odbc.erl:421
msgid "ejabberd vCard module"
msgstr "ejabberd vCard modul"
#: mod_vcard.erl:469 mod_vcard_ldap.erl:551 mod_vcard_odbc.erl:445
msgid "Search Results for "
msgstr "Søke Resultater for "
#: mod_vcard_ldap.erl:462
msgid "Fill in fields to search for any matching Jabber User"
msgstr "Fyll inn felt for å søke etter Jabber brukere"
#: web/ejabberd_web_admin.erl:193 web/ejabberd_web_admin.erl:203
#: web/ejabberd_web_admin.erl:219 web/ejabberd_web_admin.erl:229
msgid "Unauthorized"
msgstr "Uautorisert"
#: web/ejabberd_web_admin.erl:286 web/ejabberd_web_admin.erl:303
msgid "ejabberd Web Admin"
msgstr "ejabberd Web Admin"
#: web/ejabberd_web_admin.erl:769 web/ejabberd_web_admin.erl:780
msgid "Administration"
msgstr "Administrasjon"
#: web/ejabberd_web_admin.erl:878 web/ejabberd_web_admin.erl:982
msgid "Raw"
msgstr "Rå"
#: web/ejabberd_web_admin.erl:1017
msgid "~s access rule configuration"
msgstr "tilgangsregel konfigurasjon for ~s"
#: web/ejabberd_web_admin.erl:1035
msgid "Virtual Hosts"
msgstr "Virtuella Maskiner"
#: web/ejabberd_web_admin.erl:1043 web/ejabberd_web_admin.erl:1050
msgid "Users"
msgstr "Brukere"
#: web/ejabberd_web_admin.erl:1078
msgid "Users Last Activity"
msgstr "Brukers Siste Aktivitet"
#: web/ejabberd_web_admin.erl:1080
msgid "Period: "
msgstr "Periode: "
#: web/ejabberd_web_admin.erl:1090
msgid "Last month"
msgstr "Siste måned"
#: web/ejabberd_web_admin.erl:1091
msgid "Last year"
msgstr "Siste året"
#: web/ejabberd_web_admin.erl:1092
msgid "All activity"
msgstr "All aktivitet"
#: web/ejabberd_web_admin.erl:1094
msgid "Show Ordinary Table"
msgstr "Vis Ordinær Tabell"
#: web/ejabberd_web_admin.erl:1096
msgid "Show Integral Table"
msgstr "Vis Integral Tabell"
#: web/ejabberd_web_admin.erl:1105 web/ejabberd_web_admin.erl:1939
msgid "Statistics"
msgstr "Statistikk"
#: web/ejabberd_web_admin.erl:1117
msgid "Not Found"
msgstr "Finnes Ikke"
#: web/ejabberd_web_admin.erl:1134
msgid "Node not found"
msgstr "Noden finnes ikke"
#: web/ejabberd_web_admin.erl:1460
msgid "Host"
msgstr "Maskin"
#: web/ejabberd_web_admin.erl:1461
msgid "Registered Users"
msgstr "Registrerte Brukere"
#: web/ejabberd_web_admin.erl:1573
msgid "Offline Messages"
msgstr "Frakoblede Meldinger"
#: web/ejabberd_web_admin.erl:1574 web/ejabberd_web_admin.erl:1767
msgid "Last Activity"
msgstr "Siste Aktivitet"
#: web/ejabberd_web_admin.erl:1659 web/ejabberd_web_admin.erl:1675
msgid "Registered Users:"
msgstr "Registrerte Brukere:"
#: web/ejabberd_web_admin.erl:1661 web/ejabberd_web_admin.erl:1677
#: web/ejabberd_web_admin.erl:2192
msgid "Online Users:"
msgstr "Tilkoblede Brukere:"
#: web/ejabberd_web_admin.erl:1663
msgid "Outgoing s2s Connections:"
msgstr "Utgående s2s Koblinger"
#: web/ejabberd_web_admin.erl:1665
msgid "Outgoing s2s Servers:"
msgstr "Utgående s2s Tjenere"
#: web/ejabberd_web_admin.erl:1734 web/mod_register_web.erl:175
#: web/mod_register_web.erl:372 web/mod_register_web.erl:381
#: web/mod_register_web.erl:411
msgid "Change Password"
msgstr "Endre Passord"
#: web/ejabberd_web_admin.erl:1758
msgid "User "
msgstr "Bruker "
#: web/ejabberd_web_admin.erl:1765
msgid "Connected Resources:"
msgstr "Tilkoblede Ressurser:"
#: web/ejabberd_web_admin.erl:1766 web/mod_register_web.erl:227
#: web/mod_register_web.erl:519
msgid "Password:"
msgstr "Passord:"
#: web/ejabberd_web_admin.erl:1828
msgid "No Data"
msgstr "Ingen Data"
#: web/ejabberd_web_admin.erl:1906
msgid "Nodes"
msgstr "Noder"
#: web/ejabberd_web_admin.erl:1929 web/ejabberd_web_admin.erl:1951
msgid "Node "
msgstr "Node "
#: web/ejabberd_web_admin.erl:1938
msgid "Listened Ports"
msgstr "Lyttende Porter"
#: web/ejabberd_web_admin.erl:1940 web/ejabberd_web_admin.erl:2260
#: web/ejabberd_web_admin.erl:2448
msgid "Update"
msgstr "Oppdatere"
#: web/ejabberd_web_admin.erl:1943 web/ejabberd_web_admin.erl:2569
msgid "Restart"
msgstr "Starte på nytt"
#: web/ejabberd_web_admin.erl:1945 web/ejabberd_web_admin.erl:2571
msgid "Stop"
msgstr "Stoppe"
#: web/ejabberd_web_admin.erl:1959
msgid "RPC Call Error"
msgstr "RPC Kall Feil"
#: web/ejabberd_web_admin.erl:2000
msgid "Database Tables at "
msgstr "Database Tabeller på "
#: web/ejabberd_web_admin.erl:2007
msgid "Storage Type"
msgstr "Lagringstype"
#: web/ejabberd_web_admin.erl:2008
msgid "Elements"
msgstr "Elementer"
#: web/ejabberd_web_admin.erl:2009
msgid "Memory"
msgstr "Minne"
#: web/ejabberd_web_admin.erl:2032 web/ejabberd_web_admin.erl:2137
msgid "Error"
msgstr "Feil"
#: web/ejabberd_web_admin.erl:2034
msgid "Backup of "
msgstr "Sikkerhetskopi av "
#: web/ejabberd_web_admin.erl:2036
msgid ""
"Please note that these options will only backup the builtin Mnesia database. "
"If you are using the ODBC module, you also need to backup your SQL database "
"separately."
msgstr ""
"Merk at disse valgene vil bare sikkerhetskopiere den innebygde Mnesia "
"databasen. Dersom du bruker ODBC modulen må du også ta backup av din SQL "
"database."
#: web/ejabberd_web_admin.erl:2041
msgid "Store binary backup:"
msgstr "Lagre binær sikkerhetskopi:"
#: web/ejabberd_web_admin.erl:2045 web/ejabberd_web_admin.erl:2052
#: web/ejabberd_web_admin.erl:2060 web/ejabberd_web_admin.erl:2067
#: web/ejabberd_web_admin.erl:2074 web/ejabberd_web_admin.erl:2081
#: web/ejabberd_web_admin.erl:2088 web/ejabberd_web_admin.erl:2096
#: web/ejabberd_web_admin.erl:2103 web/ejabberd_web_admin.erl:2110
msgid "OK"
msgstr "OK"
#: web/ejabberd_web_admin.erl:2048
msgid "Restore binary backup immediately:"
msgstr "Gjenopprette binær backup umiddelbart:"
#: web/ejabberd_web_admin.erl:2056
msgid ""
"Restore binary backup after next ejabberd restart (requires less memory):"
msgstr ""
"Gjenopprette binær backup etter neste ejabberd omstart (krever mindre minne):"
#: web/ejabberd_web_admin.erl:2063
msgid "Store plain text backup:"
msgstr "Lagre rentekst sikkerhetskopi:"
#: web/ejabberd_web_admin.erl:2070
msgid "Restore plain text backup immediately:"
msgstr "Gjenopprette rentekst sikkerhetskopi umiddelbart:"
#: web/ejabberd_web_admin.erl:2077
msgid "Import users data from a PIEFXIS file (XEP-0227):"
msgstr "Importer brukeres data fra en PIEFXIS fil (XEP-0227):"
#: web/ejabberd_web_admin.erl:2084
msgid "Export data of all users in the server to PIEFXIS files (XEP-0227):"
msgstr "Eksporter data om alle brukere i en server til PIEFXIS filer"
#: web/ejabberd_web_admin.erl:2091
msgid "Export data of users in a host to PIEFXIS files (XEP-0227):"
msgstr "Eksporter data om alle brukere i en host til PIEFXIS filer (XEP-0227):"
#: web/ejabberd_web_admin.erl:2099
msgid "Import user data from jabberd14 spool file:"
msgstr "Importer bruker data fra jabberd14 spoolfiler:"
#: web/ejabberd_web_admin.erl:2106
msgid "Import users data from jabberd14 spool directory:"
msgstr "Importer brukeres data fra jabberd14 spoolfil katalog:"
#: web/ejabberd_web_admin.erl:2132
msgid "Listened Ports at "
msgstr "Lyttende Porter på "
#: web/ejabberd_web_admin.erl:2157
msgid "Modules at "
msgstr "Moduler på "
#: web/ejabberd_web_admin.erl:2183
msgid "Statistics of ~p"
msgstr "Statistikk for ~p"
#: web/ejabberd_web_admin.erl:2186
msgid "Uptime:"
msgstr "Oppetid:"
#: web/ejabberd_web_admin.erl:2189
msgid "CPU Time:"
msgstr "CPU Tid:"
#: web/ejabberd_web_admin.erl:2195
msgid "Transactions Committed:"
msgstr "Sendte Transaksjoner:"
#: web/ejabberd_web_admin.erl:2198
msgid "Transactions Aborted:"
msgstr "Avbrutte Transasksjoner:"
#: web/ejabberd_web_admin.erl:2201
msgid "Transactions Restarted:"
msgstr "Omstartede Transasksjoner:"
#: web/ejabberd_web_admin.erl:2204
msgid "Transactions Logged:"
msgstr "Loggede Transasksjoner:"
#: web/ejabberd_web_admin.erl:2246
msgid "Update "
msgstr "Oppdater "
#: web/ejabberd_web_admin.erl:2254
msgid "Update plan"
msgstr "Oppdaterings plan"
#: web/ejabberd_web_admin.erl:2255
msgid "Modified modules"
msgstr "Endrede moduler"
#: web/ejabberd_web_admin.erl:2256
msgid "Update script"
msgstr "Oppdaterings skript"
#: web/ejabberd_web_admin.erl:2257
msgid "Low level update script"
msgstr "Lavnivå oppdaterings skript"
#: web/ejabberd_web_admin.erl:2258
msgid "Script check"
msgstr "Skript sjekk"
#: web/ejabberd_web_admin.erl:2426
msgid "Port"
msgstr "Port"
#: web/ejabberd_web_admin.erl:2427
msgid "IP"
msgstr "IP"
#: web/ejabberd_web_admin.erl:2428
msgid "Protocol"
msgstr "Protokoll"
#: web/ejabberd_web_admin.erl:2429 web/ejabberd_web_admin.erl:2556
msgid "Module"
msgstr "Modul"
#: web/ejabberd_web_admin.erl:2430 web/ejabberd_web_admin.erl:2557
msgid "Options"
msgstr "Alternativer"
#: web/ejabberd_web_admin.erl:2450
msgid "Delete"
msgstr "Slett"
#: web/ejabberd_web_admin.erl:2579
msgid "Start"
msgstr "Start"
#: web/mod_register_web.erl:104
msgid "Your Jabber account was successfully created."
msgstr "Din Jabber konto ble opprettet"
#: web/mod_register_web.erl:107
msgid "There was an error creating the account: "
msgstr "En feil skjedde under oppretting av kontoen:"
#: web/mod_register_web.erl:115
msgid "Your Jabber account was successfully deleted."
msgstr "Dni Jabber konto er blitt sltettet."
#: web/mod_register_web.erl:118
msgid "There was an error deleting the account: "
msgstr "En feil skjedde under sletting av kontoen: "
#: web/mod_register_web.erl:128
msgid "The password of your Jabber account was successfully changed."
msgstr "Passordet for din Jabber konto ble endret."
#: web/mod_register_web.erl:131
msgid "There was an error changing the password: "
msgstr "En feil skjedde under endring av passordet:"
#: web/mod_register_web.erl:163 web/mod_register_web.erl:172
msgid "Jabber Account Registration"
msgstr "Jabber Konto Registrering"
#: web/mod_register_web.erl:174 web/mod_register_web.erl:192
#: web/mod_register_web.erl:201
msgid "Register a Jabber account"
msgstr "Registrer en Jabber konto"
#: web/mod_register_web.erl:176 web/mod_register_web.erl:493
#: web/mod_register_web.erl:502
msgid "Unregister a Jabber account"
msgstr "Avregistrer en Jabber konto"
#: web/mod_register_web.erl:203
msgid ""
"This page allows to create a Jabber account in this Jabber server. Your JID "
"(Jabber IDentifier) will be of the form: username@server. Please read "
"carefully the instructions to fill correctly the fields."
msgstr ""
"Denne siden lar deg lage en Jabber konto på denne Jabber serveren. Din JID "
"(Jabber ID) vil være i formatet: brukernavn@server. Vennligst les "
"instruksjonene nøye slik at du fyller ut skjemaet riktig."
#: web/mod_register_web.erl:212 web/mod_register_web.erl:386
#: web/mod_register_web.erl:509
msgid "Username:"
msgstr "Brukernavn:"
#: web/mod_register_web.erl:217
msgid "This is case insensitive: macbeth is the same that MacBeth and Macbeth."
msgstr ""
"Denne er ufølsom for små og store bokstaver: macbeth er det samme som "
"MacBeth og Macbeth. "
#: web/mod_register_web.erl:218
msgid "Characters not allowed:"
msgstr "Ikke godtatte tegn:"
#: web/mod_register_web.erl:222 web/mod_register_web.erl:391
#: web/mod_register_web.erl:514
msgid "Server:"
msgstr "Server:"
#: web/mod_register_web.erl:232
msgid ""
"Don't tell your password to anybody, not even the administrators of the "
"Jabber server."
msgstr ""
"Ikke fortell passordet til noen, ikke en gang til administratoren av Jabber "
"serveren."
#: web/mod_register_web.erl:234
msgid "You can later change your password using a Jabber client."
msgstr "Du kan når som helst endre passordet via en Jabber klient."
#: web/mod_register_web.erl:235
msgid ""
"Some Jabber clients can store your password in your computer. Use that "
"feature only if you trust your computer is safe."
msgstr ""
"Noen Jabber klienter kan lagre passordet på datamaskinen. Bruk bare den "
"funksjonen dersom du er sikker på at maskinen er trygg."
#: web/mod_register_web.erl:237
msgid ""
"Memorize your password, or write it in a paper placed in a safe place. In "
"Jabber there isn't an automated way to recover your password if you forget "
"it."
msgstr ""
"Husk passordet, eller skriv det ned på et papir lagret på et trygt sted. I "
"Jabber er det ingen automatisert måte å gjenskape passordet om du glemmer "
"det. "
#: web/mod_register_web.erl:242 web/mod_register_web.erl:406
msgid "Password Verification:"
msgstr "Passord Bekreftelse:"
#: web/mod_register_web.erl:250
msgid "Register"
msgstr "Registrer"
#: web/mod_register_web.erl:396
msgid "Old Password:"
msgstr "Gammelt Passord:"
#: web/mod_register_web.erl:401
msgid "New Password:"
msgstr "Nytt Passord:"
#: web/mod_register_web.erl:504
msgid "This page allows to unregister a Jabber account in this Jabber server."
msgstr ""
"Denne siden lar deg avregistrere en Jabber konto på denne Jabber serveren."
#: web/mod_register_web.erl:524
msgid "Unregister"
msgstr "Avregistrer"
#, fuzzy
#~ msgid "Captcha test failed"
#~ msgstr "Captchaen er ikke gyldig"
ejabberd-2.1.11/src/msgs/de.po 0000664 0000000 0000000 00000156570 12240230175 012724 0 ustar msgid ""
msgstr ""
"Project-Id-Version: 2.1.0-alpha\n"
"POT-Creation-Date: \n"
"PO-Revision-Date: \n"
"Last-Translator: Nikolaus Polak \n"
"Language-Team: \n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Language: German (deutsch)\n"
"X-Additional-Translator: Florian Zumbiehl\n"
"X-Additional-Translator: Cord Beermann\n"
"X-Additional-Translator: Marvin Preuss\n"
"X-Additional-Translator: Patrick Dreker\n"
"X-Additional-Translator: Torsten Werner\n"
"X-Additional-Translator: Marina Hahn\n"
#: ejabberd_c2s.erl:424 ejabberd_c2s.erl:727
msgid "Use of STARTTLS required"
msgstr "Verwendung von STARTTLS erforderlich"
#: ejabberd_c2s.erl:503
msgid "No resource provided"
msgstr "Keine Ressource angegeben"
#: ejabberd_c2s.erl:1197
msgid "Replaced by new connection"
msgstr "Durch neue Verbindung ersetzt"
#: ejabberd_c2s.erl:1885
msgid "Your active privacy list has denied the routing of this stanza."
msgstr ""
"Ihre aktive Privacy Liste hat die Weiterleitung des Stanzas unterbunden."
#: ejabberd_captcha.erl:96 ejabberd_captcha.erl:152 ejabberd_captcha.erl:178
msgid "Enter the text you see"
msgstr "Geben sie den Text den sie sehen ein"
#: ejabberd_captcha.erl:101
msgid "Your messages to ~s are being blocked. To unblock them, visit ~s"
msgstr ""
"Ihre Nachrichten an ~s werden blockiert. Um dies zu ändern, besuchen sie ~s"
#: ejabberd_captcha.erl:134
msgid "If you don't see the CAPTCHA image here, visit the web page."
msgstr ""
"Wenn sie das CAPTCHA Bild nicht sehen, besuchen sie bitte die Webseite."
#: ejabberd_captcha.erl:146
msgid "CAPTCHA web page"
msgstr "CAPTCHA Webseite"
#: ejabberd_captcha.erl:307
msgid "The CAPTCHA is valid."
msgstr "Die Verifizierung ist gültig."
#: mod_adhoc.erl:95 mod_adhoc.erl:125 mod_adhoc.erl:143 mod_adhoc.erl:161
msgid "Commands"
msgstr "Befehle"
#: mod_adhoc.erl:149 mod_adhoc.erl:243
msgid "Ping"
msgstr "Ping"
#: mod_adhoc.erl:260
msgid "Pong"
msgstr "Pong"
#: mod_announce.erl:507 mod_announce_odbc.erl:499
msgid "Really delete message of the day?"
msgstr "Die Nachricht des Tages wirklich löschen?"
#: mod_announce.erl:515 mod_announce_odbc.erl:507 mod_configure.erl:1083
#: mod_configure.erl:1128
msgid "Subject"
msgstr "Betreff"
#: mod_announce.erl:520 mod_announce_odbc.erl:512 mod_configure.erl:1088
#: mod_configure.erl:1133
msgid "Message body"
msgstr "Nachrichtentext"
#: mod_announce.erl:600 mod_announce_odbc.erl:592
msgid "No body provided for announce message"
msgstr "Kein Text für die Ankündigung angegeben"
#: mod_announce.erl:635 mod_announce_odbc.erl:627
msgid "Announcements"
msgstr "Ankündigungen"
#: mod_announce.erl:637 mod_announce_odbc.erl:629
msgid "Send announcement to all users"
msgstr "Sende Ankündigung an alle Benutzer"
#: mod_announce.erl:639 mod_announce_odbc.erl:631
msgid "Send announcement to all users on all hosts"
msgstr "Sende Ankündigung an alle Benutzer auf allen Hosts"
#: mod_announce.erl:641 mod_announce_odbc.erl:633
msgid "Send announcement to all online users"
msgstr "Sende Ankündigung an alle angemeldeten Benutzer"
#: mod_announce.erl:643 mod_announce_odbc.erl:635 mod_configure.erl:1078
#: mod_configure.erl:1123
msgid "Send announcement to all online users on all hosts"
msgstr "Sende Ankündigung an alle angemeldeten Benutzer auf allen Hosts"
#: mod_announce.erl:645 mod_announce_odbc.erl:637
msgid "Set message of the day and send to online users"
msgstr "Setze Nachricht des Tages und sende sie an alle angemeldeten Benutzer"
#: mod_announce.erl:647 mod_announce_odbc.erl:639
msgid "Set message of the day on all hosts and send to online users"
msgstr ""
"Setze Nachricht des Tages auf allen Hosts und sende sie an alle angemeldeten "
"Benutzer"
#: mod_announce.erl:649 mod_announce_odbc.erl:641
msgid "Update message of the day (don't send)"
msgstr "Aktualisiere Nachricht des Tages (nicht senden)"
#: mod_announce.erl:651 mod_announce_odbc.erl:643
msgid "Update message of the day on all hosts (don't send)"
msgstr "Aktualisiere Nachricht des Tages auf allen Hosts (nicht senden)"
#: mod_announce.erl:653 mod_announce_odbc.erl:645
msgid "Delete message of the day"
msgstr "Lösche Nachricht des Tages"
#: mod_announce.erl:655 mod_announce_odbc.erl:647
msgid "Delete message of the day on all hosts"
msgstr "Lösche Nachricht des Tages auf allen Hosts"
#: mod_configure.erl:114 mod_configure.erl:274 mod_configure.erl:296
#: mod_configure.erl:498
msgid "Configuration"
msgstr "Konfiguration"
#: mod_configure.erl:125 mod_configure.erl:576 web/ejabberd_web_admin.erl:1936
msgid "Database"
msgstr "Datenbank"
#: mod_configure.erl:127 mod_configure.erl:595
msgid "Start Modules"
msgstr "Module starten"
#: mod_configure.erl:129 mod_configure.erl:596
msgid "Stop Modules"
msgstr "Module stoppen"
#: mod_configure.erl:131 mod_configure.erl:604 web/ejabberd_web_admin.erl:1937
msgid "Backup"
msgstr "Datensicherung"
#: mod_configure.erl:133 mod_configure.erl:605
msgid "Restore"
msgstr "Wiederherstellung"
#: mod_configure.erl:135 mod_configure.erl:606
msgid "Dump to Text File"
msgstr "Ausgabe in Textdatei"
#: mod_configure.erl:137 mod_configure.erl:615
msgid "Import File"
msgstr "Datei importieren"
#: mod_configure.erl:139 mod_configure.erl:616
msgid "Import Directory"
msgstr "Verzeichnis importieren"
#: mod_configure.erl:141 mod_configure.erl:581 mod_configure.erl:1057
msgid "Restart Service"
msgstr "Dienst neustarten"
#: mod_configure.erl:143 mod_configure.erl:582 mod_configure.erl:1102
msgid "Shut Down Service"
msgstr "Dienst herunterfahren"
#: mod_configure.erl:145 mod_configure.erl:518 mod_configure.erl:1197
#: web/ejabberd_web_admin.erl:1527
msgid "Add User"
msgstr "Benutzer hinzufügen"
#: mod_configure.erl:147 mod_configure.erl:519 mod_configure.erl:1219
msgid "Delete User"
msgstr "Benutzer löschen"
#: mod_configure.erl:149 mod_configure.erl:520 mod_configure.erl:1231
msgid "End User Session"
msgstr "Benutzer-Sitzung beenden"
#: mod_configure.erl:151 mod_configure.erl:521 mod_configure.erl:1243
#: mod_configure.erl:1255
msgid "Get User Password"
msgstr "Benutzer-Passwort abrufen"
#: mod_configure.erl:153 mod_configure.erl:522
msgid "Change User Password"
msgstr "Benutzer-Passwort ändern"
#: mod_configure.erl:155 mod_configure.erl:523 mod_configure.erl:1272
msgid "Get User Last Login Time"
msgstr "letzte Anmeldezeit abrufen"
#: mod_configure.erl:157 mod_configure.erl:524 mod_configure.erl:1284
msgid "Get User Statistics"
msgstr "Benutzer-Statistiken abrufen"
#: mod_configure.erl:159 mod_configure.erl:525
msgid "Get Number of Registered Users"
msgstr "Anzahl der registrierten Benutzer abrufen"
#: mod_configure.erl:161 mod_configure.erl:526
msgid "Get Number of Online Users"
msgstr "Anzahl der angemeldeten Benutzer abrufen"
#: mod_configure.erl:163 mod_configure.erl:509 web/ejabberd_web_admin.erl:831
#: web/ejabberd_web_admin.erl:872
msgid "Access Control Lists"
msgstr "Zugangskontroll-Listen (ACL)"
#: mod_configure.erl:165 mod_configure.erl:510 web/ejabberd_web_admin.erl:940
#: web/ejabberd_web_admin.erl:976
msgid "Access Rules"
msgstr "Zugangsregeln"
#: mod_configure.erl:297 mod_configure.erl:499
msgid "User Management"
msgstr "Benutzerverwaltung"
#: mod_configure.erl:500 web/ejabberd_web_admin.erl:1058
#: web/ejabberd_web_admin.erl:1462
msgid "Online Users"
msgstr "Angemeldete Benutzer"
#: mod_configure.erl:501
msgid "All Users"
msgstr "Alle Benutzer"
#: mod_configure.erl:502
msgid "Outgoing s2s Connections"
msgstr "Ausgehende s2s-Verbindungen"
#: mod_configure.erl:503 web/ejabberd_web_admin.erl:1907
msgid "Running Nodes"
msgstr "Aktive Knoten"
#: mod_configure.erl:504 web/ejabberd_web_admin.erl:1909
msgid "Stopped Nodes"
msgstr "Inaktive Knoten"
#: mod_configure.erl:577 mod_configure.erl:587 web/ejabberd_web_admin.erl:1953
msgid "Modules"
msgstr "Module"
#: mod_configure.erl:578
msgid "Backup Management"
msgstr "Datensicherungsverwaltung"
#: mod_configure.erl:579
msgid "Import Users From jabberd14 Spool Files"
msgstr "Importiere Benutzer aus jabberd14-Spool-Dateien"
#: mod_configure.erl:699
msgid "To ~s"
msgstr "An ~s"
#: mod_configure.erl:717
msgid "From ~s"
msgstr "Von ~s"
#: mod_configure.erl:913
msgid "Database Tables Configuration at "
msgstr "Datenbanktabellen-Konfiguration auf "
#: mod_configure.erl:918
msgid "Choose storage type of tables"
msgstr "Wähle Speichertyp der Tabellen"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "Disc only copy"
msgstr "Nur auf Festplatte"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "RAM and disc copy"
msgstr "RAM und Festplatte"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "RAM copy"
msgstr "Nur RAM"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "Remote copy"
msgstr "Fernkopie"
#: mod_configure.erl:950
msgid "Stop Modules at "
msgstr "Stoppe Module auf "
#: mod_configure.erl:954
msgid "Choose modules to stop"
msgstr "Wähle zu stoppende Module"
#: mod_configure.erl:969
msgid "Start Modules at "
msgstr "Starte Module auf "
#: mod_configure.erl:973
msgid "Enter list of {Module, [Options]}"
msgstr "Geben sie eine Liste bestehend aus {Modul, [Optionen]} ein"
#: mod_configure.erl:974
msgid "List of modules to start"
msgstr "Liste der zu startenden Module"
#: mod_configure.erl:983
msgid "Backup to File at "
msgstr "Datensicherung in die Datei "
#: mod_configure.erl:987 mod_configure.erl:1001
msgid "Enter path to backup file"
msgstr "Geben sie den Pfad zur Datensicherung ein"
#: mod_configure.erl:988 mod_configure.erl:1002 mod_configure.erl:1016
#: mod_configure.erl:1030
msgid "Path to File"
msgstr "Pfad zur Datei"
#: mod_configure.erl:997
msgid "Restore Backup from File at "
msgstr "Datenwiederherstellung aus der Datei "
#: mod_configure.erl:1011
msgid "Dump Backup to Text File at "
msgstr "Ausgabe der Sicherung in diese Textdatei "
#: mod_configure.erl:1015
msgid "Enter path to text file"
msgstr "Geben sie den Pfad zur Textdatei ein"
#: mod_configure.erl:1025
msgid "Import User from File at "
msgstr "Benutzer aus dieser Datei importieren "
#: mod_configure.erl:1029
msgid "Enter path to jabberd14 spool file"
msgstr "Geben Sie den Pfad zur jabberd14-Spool-Datei ein"
#: mod_configure.erl:1039
msgid "Import Users from Dir at "
msgstr "Benutzer importieren aus dem Verzeichnis "
#: mod_configure.erl:1043
msgid "Enter path to jabberd14 spool dir"
msgstr "Geben Sie den Pfad zum jabberd14-Spool-Verzeichnis ein"
#: mod_configure.erl:1044
msgid "Path to Dir"
msgstr "Pfad zum Verzeichnis"
#: mod_configure.erl:1060 mod_configure.erl:1105
msgid "Time delay"
msgstr "Zeitverzögerung"
#: mod_configure.erl:1143
msgid "Access Control List Configuration"
msgstr "Konfiguration der Zugangskontrolllisten"
#: mod_configure.erl:1147
msgid "Access control lists"
msgstr "Zugangskontroll-Listen (ACL)"
#: mod_configure.erl:1171
msgid "Access Configuration"
msgstr "Zugangskonfiguration"
#: mod_configure.erl:1175
msgid "Access rules"
msgstr "Zugangsregeln"
#: mod_configure.erl:1200 mod_configure.erl:1222 mod_configure.erl:1234
#: mod_configure.erl:1246 mod_configure.erl:1258 mod_configure.erl:1275
#: mod_configure.erl:1287 mod_configure.erl:1650 mod_configure.erl:1700
#: mod_configure.erl:1721 mod_roster.erl:943 mod_roster_odbc.erl:1060
#: mod_vcard.erl:472 mod_vcard_ldap.erl:554 mod_vcard_odbc.erl:448
msgid "Jabber ID"
msgstr "Jabber ID"
#: mod_configure.erl:1205 mod_configure.erl:1263 mod_configure.erl:1651
#: mod_configure.erl:1863 mod_muc/mod_muc_room.erl:3224 mod_register.erl:235
#: web/ejabberd_web_admin.erl:1520
msgid "Password"
msgstr "Passwort"
#: mod_configure.erl:1210
msgid "Password Verification"
msgstr "Passwort bestätigen"
#: mod_configure.erl:1301
msgid "Number of registered users"
msgstr "Anzahl der registrierten Benutzer"
#: mod_configure.erl:1315
msgid "Number of online users"
msgstr "Anzahl der angemeldeten Benutzer"
#: mod_configure.erl:1682 web/ejabberd_web_admin.erl:1588
#: web/ejabberd_web_admin.erl:1743
msgid "Never"
msgstr "Nie"
#: mod_configure.erl:1696 web/ejabberd_web_admin.erl:1601
#: web/ejabberd_web_admin.erl:1756
msgid "Online"
msgstr "Angemeldet"
#: mod_configure.erl:1701
msgid "Last login"
msgstr "Letzte Anmeldung"
#: mod_configure.erl:1722
msgid "Roster size"
msgstr "Kontaktlistengröße"
#: mod_configure.erl:1723
msgid "IP addresses"
msgstr "IP Adressen"
#: mod_configure.erl:1724
msgid "Resources"
msgstr "Ressourcen"
#: mod_configure.erl:1850
msgid "Administration of "
msgstr "Administration von "
#: mod_configure.erl:1853
msgid "Action on user"
msgstr "Aktion auf Benutzer"
#: mod_configure.erl:1857
msgid "Edit Properties"
msgstr "Einstellungen ändern"
#: mod_configure.erl:1860 web/ejabberd_web_admin.erl:1769
msgid "Remove User"
msgstr "Benutzer löschen"
#: mod_irc/mod_irc.erl:201 mod_irc/mod_irc_odbc.erl:196
#: mod_muc/mod_muc.erl:336 mod_muc/mod_muc_odbc.erl:342
msgid "Access denied by service policy"
msgstr "Zugang aufgrund der Dienstrichtlinien verweigert"
#: mod_irc/mod_irc.erl:401 mod_irc/mod_irc_odbc.erl:398
msgid "IRC Transport"
msgstr "IRC Transport"
#: mod_irc/mod_irc.erl:428 mod_irc/mod_irc_odbc.erl:425
msgid "ejabberd IRC module"
msgstr "ejabberd IRC-Modul"
#: mod_irc/mod_irc.erl:559 mod_irc/mod_irc_odbc.erl:568
msgid "You need an x:data capable client to configure mod_irc settings"
msgstr ""
"Sie benötigen einen Client, der x:data unterstützt, um die mod_irc-"
"Einstellungen zu konfigurieren"
#: mod_irc/mod_irc.erl:566 mod_irc/mod_irc_odbc.erl:575
msgid "Registration in mod_irc for "
msgstr "Registrierung in mod_irc für "
#: mod_irc/mod_irc.erl:571 mod_irc/mod_irc_odbc.erl:580
msgid ""
"Enter username, encodings, ports and passwords you wish to use for "
"connecting to IRC servers"
msgstr ""
"Geben Sie Benutzernamen und Zeichenkodierung für die Verbindung zum IRC-"
"Server an"
#: mod_irc/mod_irc.erl:576 mod_irc/mod_irc_odbc.erl:585
msgid "IRC Username"
msgstr "IRC-Benutzername"
#: mod_irc/mod_irc.erl:586 mod_irc/mod_irc_odbc.erl:595
msgid ""
"If you want to specify different ports, passwords, encodings for IRC "
"servers, fill this list with values in format '{\"irc server\", \"encoding"
"\", port, \"password\"}'. By default this service use \"~s\" encoding, port "
"~p, empty password."
msgstr ""
"Wenn sie verschiedene Ports, Passwörter und Kodierungen für IRC Server "
"angeben wollen, erstellen sie die Liste mit folgendem Format '{\"IRC Server"
"\", \"Kodierung\", Port, \"Passwort\"}'. Standardmäßig benutzt dieser "
"Dienst die \"~s\" Kodierung, den Port ~p und kein Passwort."
#: mod_irc/mod_irc.erl:598 mod_irc/mod_irc_odbc.erl:607
msgid ""
"Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef."
"net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."
msgstr ""
"Beispiel: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta."
"fef.net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."
#: mod_irc/mod_irc.erl:603 mod_irc/mod_irc_odbc.erl:612
msgid "Connections parameters"
msgstr "Verbindungsparameter"
#: mod_irc/mod_irc.erl:728 mod_irc/mod_irc_odbc.erl:757
msgid "Join IRC channel"
msgstr "IRC Channel beitreten"
#: mod_irc/mod_irc.erl:732 mod_irc/mod_irc_odbc.erl:761
msgid "IRC channel (don't put the first #)"
msgstr "IRC Channel (ohne dem ersten #)"
#: mod_irc/mod_irc.erl:737 mod_irc/mod_irc_odbc.erl:766
msgid "IRC server"
msgstr "IRC Server"
#: mod_irc/mod_irc.erl:770 mod_irc/mod_irc.erl:774
#: mod_irc/mod_irc_odbc.erl:799 mod_irc/mod_irc_odbc.erl:803
msgid "Join the IRC channel here."
msgstr "Hier den IRC Channel beitreten."
#: mod_irc/mod_irc.erl:778 mod_irc/mod_irc_odbc.erl:807
msgid "Join the IRC channel in this Jabber ID: ~s"
msgstr "Den IRC Channel mit dieser Jabber ID beitreten: ~s"
#: mod_irc/mod_irc.erl:863 mod_irc/mod_irc_odbc.erl:904
msgid "IRC settings"
msgstr "IRC Einstellungen"
#: mod_irc/mod_irc.erl:868 mod_irc/mod_irc_odbc.erl:909
msgid ""
"Enter username and encodings you wish to use for connecting to IRC servers. "
"Press 'Next' to get more fields to fill in. Press 'Complete' to save "
"settings."
msgstr ""
"Geben sie Benutzernamen und Kodierung für Verbindungen zu IRC Servern an. "
"Drücken sie 'Mehr' um leere Felder hinzuzufügen. Drücken sie 'Beenden' um "
"die Einstellungen zu speichern."
#: mod_irc/mod_irc.erl:874 mod_irc/mod_irc_odbc.erl:915
msgid "IRC username"
msgstr "IRC Benutzername"
#: mod_irc/mod_irc.erl:923 mod_irc/mod_irc_odbc.erl:964
msgid "Password ~b"
msgstr "Passwort ~b"
#: mod_irc/mod_irc.erl:928 mod_irc/mod_irc_odbc.erl:969
msgid "Port ~b"
msgstr "Port ~b"
#: mod_irc/mod_irc.erl:933 mod_irc/mod_irc_odbc.erl:974
msgid "Encoding for server ~b"
msgstr "Kodierung für Server ~b"
#: mod_irc/mod_irc.erl:942 mod_irc/mod_irc_odbc.erl:983
msgid "Server ~b"
msgstr "Server ~b"
#: mod_muc/mod_muc.erl:449 mod_muc/mod_muc_odbc.erl:456
msgid "Only service administrators are allowed to send service messages"
msgstr ""
"Nur Service-Administratoren sind berechtigt, Servicenachrichten zu versenden"
#: mod_muc/mod_muc.erl:493 mod_muc/mod_muc_odbc.erl:500
msgid "Room creation is denied by service policy"
msgstr "Anlegen des Raumes aufgrund der Dienstrichtlinien verweigert"
#: mod_muc/mod_muc.erl:500 mod_muc/mod_muc_odbc.erl:507
msgid "Conference room does not exist"
msgstr "Konferenzraum existiert nicht"
#: mod_muc/mod_muc.erl:582 mod_muc/mod_muc_odbc.erl:595
msgid "Chatrooms"
msgstr "Chaträume"
#: mod_muc/mod_muc.erl:712 mod_muc/mod_muc_odbc.erl:729
msgid "You need a client that supports x:data to register the nickname"
msgstr ""
"Sie benötigen einen Client, der x:data unterstützt, um Ihren Benutzernamen "
"zu registrieren"
#: mod_muc/mod_muc.erl:718 mod_muc/mod_muc_odbc.erl:735
msgid "Nickname Registration at "
msgstr "Registrieren des Benutzernames auf"
#: mod_muc/mod_muc.erl:722 mod_muc/mod_muc_odbc.erl:739
msgid "Enter nickname you want to register"
msgstr "Geben sie den zu registrierenden Benutzernamen ein"
#: mod_muc/mod_muc.erl:723 mod_muc/mod_muc_odbc.erl:740
#: mod_muc/mod_muc_room.erl:3810 mod_roster.erl:944 mod_roster_odbc.erl:1061
#: mod_vcard.erl:364 mod_vcard.erl:477 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:453
msgid "Nickname"
msgstr "Benutzername"
#: mod_muc/mod_muc.erl:762 mod_muc/mod_muc_odbc.erl:784
#: mod_muc/mod_muc_room.erl:1064 mod_muc/mod_muc_room.erl:1787
msgid "That nickname is registered by another person"
msgstr "Dieser Benutzername wurde bereits von jemand anderem registriert"
#: mod_muc/mod_muc.erl:788 mod_muc/mod_muc_odbc.erl:811
msgid "You must fill in field \"Nickname\" in the form"
msgstr "Sie müssen das Feld \"Benutzername\" ausfüllen"
#: mod_muc/mod_muc.erl:808 mod_muc/mod_muc_odbc.erl:831
msgid "ejabberd MUC module"
msgstr "ejabberd MUC-Modul"
#: mod_muc/mod_muc_log.erl:374 mod_muc/mod_muc_log.erl:381
msgid "Chatroom configuration modified"
msgstr "Chatraum-Konfiguration geändert"
#: mod_muc/mod_muc_log.erl:384
msgid "joins the room"
msgstr "betretet den Raum"
#: mod_muc/mod_muc_log.erl:387 mod_muc/mod_muc_log.erl:390
msgid "leaves the room"
msgstr "verlässt den Raum"
#: mod_muc/mod_muc_log.erl:393 mod_muc/mod_muc_log.erl:396
msgid "has been banned"
msgstr "wurde gebannt"
#: mod_muc/mod_muc_log.erl:399 mod_muc/mod_muc_log.erl:402
msgid "has been kicked"
msgstr "wurde gekickt"
#: mod_muc/mod_muc_log.erl:405
msgid "has been kicked because of an affiliation change"
msgstr "wurde wegen Änderung des Mitgliederstatus gekickt"
#: mod_muc/mod_muc_log.erl:408
msgid "has been kicked because the room has been changed to members-only"
msgstr "wurde gekickt weil der Raum auf Nur-Mitglieder umgestellt wurde"
#: mod_muc/mod_muc_log.erl:411
msgid "has been kicked because of a system shutdown"
msgstr "wurde wegen Systemabschaltung gekickt"
#: mod_muc/mod_muc_log.erl:414
msgid "is now known as"
msgstr "ist nun bekannt als"
#: mod_muc/mod_muc_log.erl:417 mod_muc/mod_muc_log.erl:688
#: mod_muc/mod_muc_room.erl:2393
msgid " has set the subject to: "
msgstr " hat das Thema geändert auf: "
#: mod_muc/mod_muc_log.erl:452
msgid "Chatroom is created"
msgstr "Chatraum wurde erstellt"
#: mod_muc/mod_muc_log.erl:453
msgid "Chatroom is destroyed"
msgstr "Chatraum wurde entfernt"
#: mod_muc/mod_muc_log.erl:454
msgid "Chatroom is started"
msgstr "Chatraum wurde gestartet"
#: mod_muc/mod_muc_log.erl:455
msgid "Chatroom is stopped"
msgstr "Chatraum wurde beendet"
#: mod_muc/mod_muc_log.erl:459
msgid "Monday"
msgstr "Montag"
#: mod_muc/mod_muc_log.erl:460
msgid "Tuesday"
msgstr "Dienstag"
#: mod_muc/mod_muc_log.erl:461
msgid "Wednesday"
msgstr "Mittwoch"
#: mod_muc/mod_muc_log.erl:462
msgid "Thursday"
msgstr "Donnerstag"
#: mod_muc/mod_muc_log.erl:463
msgid "Friday"
msgstr "Freitag"
#: mod_muc/mod_muc_log.erl:464
msgid "Saturday"
msgstr "Samstag"
#: mod_muc/mod_muc_log.erl:465
msgid "Sunday"
msgstr "Sonntag"
#: mod_muc/mod_muc_log.erl:469
msgid "January"
msgstr "Januar"
#: mod_muc/mod_muc_log.erl:470
msgid "February"
msgstr "Februar"
#: mod_muc/mod_muc_log.erl:471
msgid "March"
msgstr "März"
#: mod_muc/mod_muc_log.erl:472
msgid "April"
msgstr "April"
#: mod_muc/mod_muc_log.erl:473
msgid "May"
msgstr "Mai"
#: mod_muc/mod_muc_log.erl:474
msgid "June"
msgstr "Juni"
#: mod_muc/mod_muc_log.erl:475
msgid "July"
msgstr "Juli"
#: mod_muc/mod_muc_log.erl:476
msgid "August"
msgstr "August"
#: mod_muc/mod_muc_log.erl:477
msgid "September"
msgstr "September"
#: mod_muc/mod_muc_log.erl:478
msgid "October"
msgstr "Oktober"
#: mod_muc/mod_muc_log.erl:479
msgid "November"
msgstr "November"
#: mod_muc/mod_muc_log.erl:480
msgid "December"
msgstr "Dezember"
#: mod_muc/mod_muc_log.erl:750
msgid "Room Configuration"
msgstr "Raum-Konfiguration"
#: mod_muc/mod_muc_log.erl:759
msgid "Room Occupants"
msgstr "Teilnehmer in diesem Raum"
#: mod_muc/mod_muc_room.erl:174
msgid "Traffic rate limit is exceeded"
msgstr "Datenratenlimit wurde überschritten"
#: mod_muc/mod_muc_room.erl:246
msgid ""
"This participant is kicked from the room because he sent an error message"
msgstr ""
"Dieser Teilnehmer wurde aus dem Raum geworfen, da er eine fehlerhafte "
"Nachricht gesendet hat"
#: mod_muc/mod_muc_room.erl:255
msgid "It is not allowed to send private messages to the conference"
msgstr "Es ist nicht erlaubt private Nachrichten an den Raum zu schicken"
#: mod_muc/mod_muc_room.erl:332
msgid "Please, wait for a while before sending new voice request"
msgstr ""
"Bitte warten sie ein wenig, bevor sie eine weitere Anfrage für Sprachrechte "
"senden"
#: mod_muc/mod_muc_room.erl:347
msgid "Voice requests are disabled in this conference"
msgstr "Anfragen für Sprachrechte sind in diesem Raum deaktiviert"
#: mod_muc/mod_muc_room.erl:364
msgid "Failed to extract JID from your voice request approval"
msgstr ""
"Fehler beim Auslesen der JID aus der Anfragenbestätigung für Sprachrechte"
#: mod_muc/mod_muc_room.erl:393
msgid "Only moderators can approve voice requests"
msgstr "Nur Moderatoren können Anfragen für Sprachrechte bestätigen"
#: mod_muc/mod_muc_room.erl:408
msgid "Improper message type"
msgstr "Unzulässiger Nachrichtentyp"
#: mod_muc/mod_muc_room.erl:518
msgid ""
"This participant is kicked from the room because he sent an error message to "
"another participant"
msgstr ""
"Dieser Teilnehmer wurde aus dem Raum geworfen, da er eine fehlerhafte "
"Nachricht an einen anderen Teilnehmer gesendet hat"
#: mod_muc/mod_muc_room.erl:531
msgid "It is not allowed to send private messages of type \"groupchat\""
msgstr ""
"Es ist nicht erlaubt private Nachrichten des Typs \"Gruppenchat\" zu senden"
#: mod_muc/mod_muc_room.erl:543 mod_muc/mod_muc_room.erl:611
msgid "Recipient is not in the conference room"
msgstr "Der Empfänger ist nicht im Raum"
#: mod_muc/mod_muc_room.erl:564 mod_muc/mod_muc_room.erl:585
msgid "It is not allowed to send private messages"
msgstr "Es ist nicht erlaubt private Nachrichten zu senden"
#: mod_muc/mod_muc_room.erl:576 mod_muc/mod_muc_room.erl:956
#: mod_muc/mod_muc_room.erl:4040
msgid "Only occupants are allowed to send messages to the conference"
msgstr "Nur Teilnehmer dürfen Nachrichten an den Raum schicken"
#: mod_muc/mod_muc_room.erl:634
msgid "Only occupants are allowed to send queries to the conference"
msgstr "Nur Teilnehmer sind berechtigt Anfragen an die Konferenz zu senden"
#: mod_muc/mod_muc_room.erl:646
msgid "Queries to the conference members are not allowed in this room"
msgstr "Anfragen an die Teilnehmer sind in diesem Raum nicht erlaubt"
#: mod_muc/mod_muc_room.erl:932
msgid ""
"Only moderators and participants are allowed to change the subject in this "
"room"
msgstr "Nur Moderatoren und Mitglieder dürfen das Thema in diesem Raum ändern"
#: mod_muc/mod_muc_room.erl:937
msgid "Only moderators are allowed to change the subject in this room"
msgstr "Nur Moderatoren dürfen das Thema in diesem Raum ändern"
#: mod_muc/mod_muc_room.erl:947
msgid "Visitors are not allowed to send messages to all occupants"
msgstr "Besucher dürfen nicht an alle Teilnehmer Nachrichten verschicken"
#: mod_muc/mod_muc_room.erl:1021
msgid ""
"This participant is kicked from the room because he sent an error presence"
msgstr ""
"Dieser Teilnehmer wurde aus dem Raum gekickt, da er einen fehlerhaften "
"Status gesendet hat"
#: mod_muc/mod_muc_room.erl:1040
msgid "Visitors are not allowed to change their nicknames in this room"
msgstr "Besucher dürfen in diesem Raum ihren Benutzernamen nicht ändern"
#: mod_muc/mod_muc_room.erl:1053 mod_muc/mod_muc_room.erl:1779
msgid "That nickname is already in use by another occupant"
msgstr "Dieser Benutzername wird bereits von einem Teilnehmer genutzt"
#: mod_muc/mod_muc_room.erl:1768
msgid "You have been banned from this room"
msgstr "Sie wurden aus diesem Raum verbannt"
#: mod_muc/mod_muc_room.erl:1771
msgid "Membership is required to enter this room"
msgstr "Um diesen Raum zu betreten müssen sie Mitglied sein"
#: mod_muc/mod_muc_room.erl:1807
msgid "This room is not anonymous"
msgstr "Dieser Raum ist nicht anonym"
#: mod_muc/mod_muc_room.erl:1833
msgid "A password is required to enter this room"
msgstr "Sie brauchen ein Passwort um diesen Raum zu betreten"
#: mod_muc/mod_muc_room.erl:1855 mod_register.erl:246
msgid "Too many CAPTCHA requests"
msgstr "Zu viele CAPTCHA Anfragen"
#: mod_muc/mod_muc_room.erl:1864 mod_register.erl:251
msgid "Unable to generate a CAPTCHA"
msgstr "Konnte CAPTCHA nicht erstellen"
#: mod_muc/mod_muc_room.erl:1874
msgid "Incorrect password"
msgstr "Falsches Passwort"
#: mod_muc/mod_muc_room.erl:2448
msgid "Administrator privileges required"
msgstr "Administratorenrechte benötigt"
#: mod_muc/mod_muc_room.erl:2463
msgid "Moderator privileges required"
msgstr "Moderatorrechte benötigt"
#: mod_muc/mod_muc_room.erl:2619
msgid "Jabber ID ~s is invalid"
msgstr "Die Jabber-ID ~s ist ungültig"
#: mod_muc/mod_muc_room.erl:2633
msgid "Nickname ~s does not exist in the room"
msgstr "Der Benutzername ~s existiert im Raum nicht"
#: mod_muc/mod_muc_room.erl:2659 mod_muc/mod_muc_room.erl:3049
msgid "Invalid affiliation: ~s"
msgstr "Ungültige Mitgliedschaft: ~s"
#: mod_muc/mod_muc_room.erl:2713
msgid "Invalid role: ~s"
msgstr "Ungültige Rolle: ~s"
#: mod_muc/mod_muc_room.erl:3026 mod_muc/mod_muc_room.erl:3062
msgid "Owner privileges required"
msgstr "Besitzerrechte benötigt"
#: mod_muc/mod_muc_room.erl:3195
msgid "Configuration of room ~s"
msgstr "Konfiguration für Raum ~s"
#: mod_muc/mod_muc_room.erl:3200
msgid "Room title"
msgstr "Raumname"
#: mod_muc/mod_muc_room.erl:3203 mod_muc/mod_muc_room.erl:3692
msgid "Room description"
msgstr "Raum Beschreibung"
#: mod_muc/mod_muc_room.erl:3210
msgid "Make room persistent"
msgstr "Raum persistent machen"
#: mod_muc/mod_muc_room.erl:3215
msgid "Make room public searchable"
msgstr "Raum öffentlich suchbar machen"
#: mod_muc/mod_muc_room.erl:3218
msgid "Make participants list public"
msgstr "Teilnehmerliste öffentlich machen"
#: mod_muc/mod_muc_room.erl:3221
msgid "Make room password protected"
msgstr "Raum mit Passwort schützen"
#: mod_muc/mod_muc_room.erl:3232
msgid "Maximum Number of Occupants"
msgstr "Maximale Anzahl von Teilnehmern"
#: mod_muc/mod_muc_room.erl:3239
msgid "No limit"
msgstr "Keine Begrenzung"
#: mod_muc/mod_muc_room.erl:3250
msgid "Present real Jabber IDs to"
msgstr "Echte Jabber-IDs anzeigen für"
#: mod_muc/mod_muc_room.erl:3258 mod_muc/mod_muc_room.erl:3292
msgid "moderators only"
msgstr "ausschliesslich Moderatoren"
#: mod_muc/mod_muc_room.erl:3260 mod_muc/mod_muc_room.erl:3294
msgid "anyone"
msgstr "jeden"
#: mod_muc/mod_muc_room.erl:3262
msgid "Make room members-only"
msgstr "Raum nur für Mitglieder zugänglich machen"
#: mod_muc/mod_muc_room.erl:3265
msgid "Make room moderated"
msgstr "Raum moderiert machen"
#: mod_muc/mod_muc_room.erl:3268
msgid "Default users as participants"
msgstr "Standardbenutzer als Teilnehmer"
#: mod_muc/mod_muc_room.erl:3271
msgid "Allow users to change the subject"
msgstr "Erlaube Benutzern das Thema zu ändern"
#: mod_muc/mod_muc_room.erl:3274
msgid "Allow users to send private messages"
msgstr "Erlaube Benutzern private Nachrichten zu senden"
#: mod_muc/mod_muc_room.erl:3279
msgid "Allow visitors to send private messages to"
msgstr "Erlaube Besuchern das Senden von privaten Nachrichten an"
#: mod_muc/mod_muc_room.erl:3290
msgid "nobody"
msgstr "niemanden"
#: mod_muc/mod_muc_room.erl:3296
msgid "Allow users to query other users"
msgstr "Erlaube Benutzern Informationen über andere Benutzer abzufragen"
#: mod_muc/mod_muc_room.erl:3299
msgid "Allow users to send invites"
msgstr "Erlaube Benutzern Einladungen zu senden"
#: mod_muc/mod_muc_room.erl:3302
msgid "Allow visitors to send status text in presence updates"
msgstr "Erlaube Besuchern einen Text bei Statusänderung zu senden"
#: mod_muc/mod_muc_room.erl:3305
msgid "Allow visitors to change nickname"
msgstr "Erlaube Besuchern ihren Spitznamen zu ändern"
#: mod_muc/mod_muc_room.erl:3308
msgid "Allow visitors to send voice requests"
msgstr "Anfragen von Sprachrechten für Benutzer erlauben"
#: mod_muc/mod_muc_room.erl:3311
msgid "Minimum interval between voice requests (in seconds)"
msgstr "Mindestdauer zwischen Anfragen für Sprachrechte (in Sekunden)"
#: mod_muc/mod_muc_room.erl:3317
msgid "Make room CAPTCHA protected"
msgstr "Raum mit Verifizierung (Captcha) versehen"
#: mod_muc/mod_muc_room.erl:3322
msgid "Exclude Jabber IDs from CAPTCHA challenge"
msgstr "Von CAPTCHA Überprüfung ausgeschlossene Jabber IDs"
#: mod_muc/mod_muc_room.erl:3329
msgid "Enable logging"
msgstr "Protokollierung aktivieren"
#: mod_muc/mod_muc_room.erl:3337
msgid "You need an x:data capable client to configure room"
msgstr ""
"Sie benötigen einen Client, der x:data unterstützt, um den Raum zu "
"konfigurieren"
#: mod_muc/mod_muc_room.erl:3694
msgid "Number of occupants"
msgstr "Anzahl der Teilnehmer"
#: mod_muc/mod_muc_room.erl:3750
msgid "private, "
msgstr "privat, "
#: mod_muc/mod_muc_room.erl:3799
msgid "Voice request"
msgstr "Anfrage für Sprachrechte"
#: mod_muc/mod_muc_room.erl:3803
msgid "Either approve or decline the voice request."
msgstr "Diese Anfrage für Sprachrechte bestätigen oder ablehnen."
#: mod_muc/mod_muc_room.erl:3809
msgid "User JID"
msgstr "Benutzer JID"
#: mod_muc/mod_muc_room.erl:3811
msgid "Grant voice to this person?"
msgstr "Sprachrechte dieser Person erteilen?"
#: mod_muc/mod_muc_room.erl:3960
msgid "~s invites you to the room ~s"
msgstr "~s lädt Sie in den Raum ~s ein"
#: mod_muc/mod_muc_room.erl:3969
msgid "the password is"
msgstr "das Passwort lautet"
#: mod_offline.erl:510 mod_offline_odbc.erl:352
msgid ""
"Your contact offline message queue is full. The message has been discarded."
msgstr ""
"Ihre Offline-Nachrichten-Warteschlange ist voll. Die Nachricht wurde "
"verworfen."
#: mod_offline.erl:560 mod_offline_odbc.erl:408
msgid "~s's Offline Messages Queue"
msgstr "~s's Offline-Nachrichten-Warteschlange"
#: mod_offline.erl:563 mod_offline_odbc.erl:411 mod_roster.erl:987
#: mod_roster_odbc.erl:1104 mod_shared_roster.erl:901
#: mod_shared_roster.erl:1010 mod_shared_roster_odbc.erl:930
#: mod_shared_roster_odbc.erl:1039 web/ejabberd_web_admin.erl:833
#: web/ejabberd_web_admin.erl:874 web/ejabberd_web_admin.erl:942
#: web/ejabberd_web_admin.erl:978 web/ejabberd_web_admin.erl:1019
#: web/ejabberd_web_admin.erl:1508 web/ejabberd_web_admin.erl:1760
#: web/ejabberd_web_admin.erl:1931 web/ejabberd_web_admin.erl:1963
#: web/ejabberd_web_admin.erl:2031 web/ejabberd_web_admin.erl:2135
#: web/ejabberd_web_admin.erl:2160 web/ejabberd_web_admin.erl:2248
msgid "Submitted"
msgstr "Gesendet"
#: mod_offline.erl:571
msgid "Time"
msgstr "Zeit"
#: mod_offline.erl:572
msgid "From"
msgstr "Von"
#: mod_offline.erl:573
msgid "To"
msgstr "An"
#: mod_offline.erl:574 mod_offline_odbc.erl:419
msgid "Packet"
msgstr "Paket"
#: mod_offline.erl:587 mod_offline_odbc.erl:432 mod_shared_roster.erl:908
#: mod_shared_roster_odbc.erl:937 web/ejabberd_web_admin.erl:882
#: web/ejabberd_web_admin.erl:986
msgid "Delete Selected"
msgstr "Markierte löschen"
#: mod_offline.erl:645 mod_offline_odbc.erl:519
msgid "Offline Messages:"
msgstr "Offline-Nachrichten:"
#: mod_offline.erl:645 mod_offline_odbc.erl:519
msgid "Remove All Offline Messages"
msgstr "Alle Offline Nachrichten löschen"
#: mod_proxy65/mod_proxy65_service.erl:213
msgid "ejabberd SOCKS5 Bytestreams module"
msgstr "ejabberd SOCKS5-Bytestreams-Modul"
#: mod_pubsub/mod_pubsub.erl:1120 mod_pubsub/mod_pubsub_odbc.erl:929
msgid "Publish-Subscribe"
msgstr "Publish-Subscribe"
#: mod_pubsub/mod_pubsub.erl:1214 mod_pubsub/mod_pubsub_odbc.erl:1025
msgid "ejabberd Publish-Subscribe module"
msgstr "ejabberd Publish-Subscribe-Modul"
#: mod_pubsub/mod_pubsub.erl:1497 mod_pubsub/mod_pubsub_odbc.erl:1312
msgid "PubSub subscriber request"
msgstr "PubSub-Abonnenten-Anfrage"
#: mod_pubsub/mod_pubsub.erl:1499 mod_pubsub/mod_pubsub_odbc.erl:1314
msgid "Choose whether to approve this entity's subscription."
msgstr "Wähle Sie, ob dieses Abonnement akzeptiert werden soll."
#: mod_pubsub/mod_pubsub.erl:1505 mod_pubsub/mod_pubsub_odbc.erl:1320
msgid "Node ID"
msgstr "Knoten-ID"
#: mod_pubsub/mod_pubsub.erl:1510 mod_pubsub/mod_pubsub_odbc.erl:1325
msgid "Subscriber Address"
msgstr "Abonnenten-Adresse"
#: mod_pubsub/mod_pubsub.erl:1516 mod_pubsub/mod_pubsub_odbc.erl:1331
msgid "Allow this Jabber ID to subscribe to this pubsub node?"
msgstr "Dieser Jabber-ID das Abonnement dieses pubsub-Knotens erlauben?"
#: mod_pubsub/mod_pubsub.erl:3474 mod_pubsub/mod_pubsub_odbc.erl:3287
msgid "Deliver payloads with event notifications"
msgstr "Nachrichten mit Ereignis-Benachrichtigungen zustellen"
#: mod_pubsub/mod_pubsub.erl:3475 mod_pubsub/mod_pubsub_odbc.erl:3288
msgid "Deliver event notifications"
msgstr "Ereignisbenachrichtigung zustellen"
#: mod_pubsub/mod_pubsub.erl:3476 mod_pubsub/mod_pubsub_odbc.erl:3289
msgid "Notify subscribers when the node configuration changes"
msgstr "Abonnenten benachrichtigen, wenn sich die Knotenkonfiguration ändert"
#: mod_pubsub/mod_pubsub.erl:3477 mod_pubsub/mod_pubsub_odbc.erl:3290
msgid "Notify subscribers when the node is deleted"
msgstr "Abonnenten benachrichtigen, wenn der Knoten gelöscht wird"
#: mod_pubsub/mod_pubsub.erl:3478 mod_pubsub/mod_pubsub_odbc.erl:3291
msgid "Notify subscribers when items are removed from the node"
msgstr "Abonnenten benachrichtigen, wenn Einträge vom Knoten entfernt werden"
#: mod_pubsub/mod_pubsub.erl:3479 mod_pubsub/mod_pubsub_odbc.erl:3292
msgid "Persist items to storage"
msgstr "Einträge dauerhaft speichern"
#: mod_pubsub/mod_pubsub.erl:3480 mod_pubsub/mod_pubsub_odbc.erl:3293
msgid "A friendly name for the node"
msgstr "Ein merkbarer Name für den Knoten"
#: mod_pubsub/mod_pubsub.erl:3481 mod_pubsub/mod_pubsub_odbc.erl:3294
msgid "Max # of items to persist"
msgstr "Maximale Anzahl dauerhaft zu speichernder Einträge"
#: mod_pubsub/mod_pubsub.erl:3482 mod_pubsub/mod_pubsub_odbc.erl:3295
msgid "Whether to allow subscriptions"
msgstr "Ob Abonnements erlaubt sind"
#: mod_pubsub/mod_pubsub.erl:3483 mod_pubsub/mod_pubsub_odbc.erl:3296
msgid "Specify the access model"
msgstr "Geben sie das Zugangsmodell an"
#: mod_pubsub/mod_pubsub.erl:3486 mod_pubsub/mod_pubsub_odbc.erl:3299
msgid "Roster groups allowed to subscribe"
msgstr "Kontaktlisten-Gruppen die abonnieren dürfen"
#: mod_pubsub/mod_pubsub.erl:3487 mod_pubsub/mod_pubsub_odbc.erl:3300
msgid "Specify the publisher model"
msgstr "Geben sie das Publikationsmodell an"
#: mod_pubsub/mod_pubsub.erl:3489 mod_pubsub/mod_pubsub_odbc.erl:3302
msgid "Purge all items when the relevant publisher goes offline"
msgstr ""
"Alle Einträge entfernen, wenn der relevante Veröffentlicher offline geht"
#: mod_pubsub/mod_pubsub.erl:3490 mod_pubsub/mod_pubsub_odbc.erl:3303
msgid "Specify the event message type"
msgstr "Geben sie den Ereignis-Nachrichtentyp an"
#: mod_pubsub/mod_pubsub.erl:3492 mod_pubsub/mod_pubsub_odbc.erl:3305
msgid "Max payload size in bytes"
msgstr "Maximale Nutzlastgrösse in Bytes"
#: mod_pubsub/mod_pubsub.erl:3493 mod_pubsub/mod_pubsub_odbc.erl:3306
msgid "When to send the last published item"
msgstr "Wann soll das letzte veröffentlichte Objekt gesendet werden"
#: mod_pubsub/mod_pubsub.erl:3495 mod_pubsub/mod_pubsub_odbc.erl:3308
msgid "Only deliver notifications to available users"
msgstr "Benachrichtigungen nur an verfügbare Benutzer schicken"
#: mod_pubsub/mod_pubsub.erl:3496 mod_pubsub/mod_pubsub_odbc.erl:3309
msgid "The collections with which a node is affiliated"
msgstr "Sammlungen, mit denen ein Knoten verknüpft ist"
#: mod_register.erl:193
msgid "The CAPTCHA verification has failed"
msgstr "Die CAPTCHA Verifizierung schlug fehl"
#: mod_register.erl:220
msgid "You need a client that supports x:data and CAPTCHA to register"
msgstr ""
"Sie benötigen einen Client, der x:data und CAPTCHA unterstützt, um Ihren "
"Benutzernamen zu registrieren"
#: mod_register.erl:226 mod_register.erl:265
msgid "Choose a username and password to register with this server"
msgstr "Wählen sie zum Registrieren einen Benutzernamen und ein Passwort"
#: mod_register.erl:230 mod_vcard.erl:364 mod_vcard_odbc.erl:342
#: web/ejabberd_web_admin.erl:1515 web/ejabberd_web_admin.erl:1572
msgid "User"
msgstr "Benutzer"
#: mod_register.erl:316 mod_register.erl:361
msgid "The password is too weak"
msgstr "Das Passwort ist zu einfach"
#: mod_register.erl:365
msgid "Users are not allowed to register accounts so quickly"
msgstr "Benutzer dürfen Konten nicht so schnell registrieren"
#: mod_roster.erl:938 mod_roster_odbc.erl:1055 web/ejabberd_web_admin.erl:1701
#: web/ejabberd_web_admin.erl:1886 web/ejabberd_web_admin.erl:1897
#: web/ejabberd_web_admin.erl:2219
msgid "None"
msgstr "Keine"
#: mod_roster.erl:945 mod_roster_odbc.erl:1062
msgid "Subscription"
msgstr "Abonnement"
#: mod_roster.erl:946 mod_roster_odbc.erl:1063
msgid "Pending"
msgstr "anhängig"
#: mod_roster.erl:947 mod_roster_odbc.erl:1064
msgid "Groups"
msgstr "Gruppen"
#: mod_roster.erl:974 mod_roster_odbc.erl:1091
msgid "Validate"
msgstr "Validieren"
#: mod_roster.erl:982 mod_roster_odbc.erl:1099
msgid "Remove"
msgstr "Entfernen"
#: mod_roster.erl:985 mod_roster_odbc.erl:1102
msgid "Roster of "
msgstr "Kontaktliste von "
#: mod_roster.erl:988 mod_roster_odbc.erl:1105 mod_shared_roster.erl:902
#: mod_shared_roster.erl:1011 mod_shared_roster_odbc.erl:931
#: mod_shared_roster_odbc.erl:1040 web/ejabberd_web_admin.erl:834
#: web/ejabberd_web_admin.erl:875 web/ejabberd_web_admin.erl:943
#: web/ejabberd_web_admin.erl:979 web/ejabberd_web_admin.erl:1020
#: web/ejabberd_web_admin.erl:1509 web/ejabberd_web_admin.erl:1761
#: web/ejabberd_web_admin.erl:1932 web/ejabberd_web_admin.erl:2136
#: web/ejabberd_web_admin.erl:2161
msgid "Bad format"
msgstr "Ungültiges Format"
#: mod_roster.erl:995 mod_roster_odbc.erl:1112
msgid "Add Jabber ID"
msgstr "Jabber-ID hinzufügen"
#: mod_roster.erl:1094 mod_roster_odbc.erl:1211
msgid "Roster"
msgstr "Kontaktliste"
#: mod_shared_roster.erl:857 mod_shared_roster.erl:899
#: mod_shared_roster.erl:1007 mod_shared_roster_odbc.erl:886
#: mod_shared_roster_odbc.erl:928 mod_shared_roster_odbc.erl:1036
msgid "Shared Roster Groups"
msgstr "Gruppen der gemeinsamen Kontaktliste"
#: mod_shared_roster.erl:895 mod_shared_roster_odbc.erl:924
#: web/ejabberd_web_admin.erl:1365 web/ejabberd_web_admin.erl:2461
msgid "Add New"
msgstr "Neue hinzufügen"
#: mod_shared_roster.erl:978 mod_shared_roster_odbc.erl:1007
msgid "Name:"
msgstr "Name:"
#: mod_shared_roster.erl:983 mod_shared_roster_odbc.erl:1012
msgid "Description:"
msgstr "Beschreibung:"
#: mod_shared_roster.erl:991 mod_shared_roster_odbc.erl:1020
msgid "Members:"
msgstr "Mitglieder:"
#: mod_shared_roster.erl:999 mod_shared_roster_odbc.erl:1028
msgid "Displayed Groups:"
msgstr "Angezeigte Gruppen:"
#: mod_shared_roster.erl:1008 mod_shared_roster_odbc.erl:1037
msgid "Group "
msgstr "Gruppe "
#: mod_shared_roster.erl:1017 mod_shared_roster_odbc.erl:1046
#: web/ejabberd_web_admin.erl:840 web/ejabberd_web_admin.erl:884
#: web/ejabberd_web_admin.erl:949 web/ejabberd_web_admin.erl:1026
#: web/ejabberd_web_admin.erl:2017
msgid "Submit"
msgstr "Senden"
#: mod_vcard.erl:165 mod_vcard_ldap.erl:238 mod_vcard_odbc.erl:129
msgid "Erlang Jabber Server"
msgstr "Erlang Jabber Server"
#: mod_vcard.erl:364 mod_vcard.erl:478 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:454
msgid "Birthday"
msgstr "Geburtsdatum"
#: mod_vcard.erl:364 mod_vcard.erl:480 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:456
msgid "City"
msgstr "Stadt"
#: mod_vcard.erl:364 mod_vcard.erl:479 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:455
msgid "Country"
msgstr "Land"
#: mod_vcard.erl:364 mod_vcard.erl:481 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:457
msgid "Email"
msgstr "E-Mail"
#: mod_vcard.erl:364 mod_vcard.erl:476 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:452
msgid "Family Name"
msgstr "Nachname"
#: mod_vcard.erl:364 mod_vcard_odbc.erl:342
msgid ""
"Fill in the form to search for any matching Jabber User (Add * to the end of "
"field to match substring)"
msgstr ""
"Füllen Sie die Felder aus, um nach passenden Jabber-Benutzern zu suchen "
"(beenden Sie ein Feld mit *, um auch nach Teilzeichenketten zu suchen)"
#: mod_vcard.erl:364 mod_vcard.erl:473 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:449
msgid "Full Name"
msgstr "Vollständiger Name"
#: mod_vcard.erl:364 mod_vcard.erl:475 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:451
msgid "Middle Name"
msgstr "Zweiter Vorname"
#: mod_vcard.erl:364 mod_vcard.erl:474 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:450 web/ejabberd_web_admin.erl:2006
msgid "Name"
msgstr "Vorname"
#: mod_vcard.erl:364 mod_vcard.erl:482 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:458
msgid "Organization Name"
msgstr "Organisation"
#: mod_vcard.erl:364 mod_vcard.erl:483 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:459
msgid "Organization Unit"
msgstr "Abteilung"
#: mod_vcard.erl:364 mod_vcard_ldap.erl:462 mod_vcard_odbc.erl:342
msgid "Search users in "
msgstr "Benutzer suchen in "
#: mod_vcard.erl:364 mod_vcard_ldap.erl:462 mod_vcard_odbc.erl:342
msgid "You need an x:data capable client to search"
msgstr ""
"Sie benötigen einen Client, der x:data unterstützt, um die Suche verwenden "
"zu können"
#: mod_vcard.erl:389 mod_vcard_ldap.erl:487 mod_vcard_odbc.erl:367
msgid "vCard User Search"
msgstr "vCard-Benutzer-Suche"
#: mod_vcard.erl:445 mod_vcard_ldap.erl:541 mod_vcard_odbc.erl:421
msgid "ejabberd vCard module"
msgstr "ejabberd vCard-Modul"
#: mod_vcard.erl:469 mod_vcard_ldap.erl:551 mod_vcard_odbc.erl:445
msgid "Search Results for "
msgstr "Suchergebnisse für "
#: mod_vcard_ldap.erl:462
msgid "Fill in fields to search for any matching Jabber User"
msgstr ""
"Füllen Sie die Felder aus, um nach passenden Jabber-Benutzern zu suchen"
#: web/ejabberd_web_admin.erl:193 web/ejabberd_web_admin.erl:203
#: web/ejabberd_web_admin.erl:219 web/ejabberd_web_admin.erl:229
msgid "Unauthorized"
msgstr "Nicht berechtigt"
#: web/ejabberd_web_admin.erl:286 web/ejabberd_web_admin.erl:303
msgid "ejabberd Web Admin"
msgstr "ejabberd Web-Admin"
#: web/ejabberd_web_admin.erl:769 web/ejabberd_web_admin.erl:780
msgid "Administration"
msgstr "Verwaltung"
#: web/ejabberd_web_admin.erl:878 web/ejabberd_web_admin.erl:982
msgid "Raw"
msgstr "Unformatiert"
#: web/ejabberd_web_admin.erl:1017
msgid "~s access rule configuration"
msgstr "~s Zugangsregel-Konfiguration"
#: web/ejabberd_web_admin.erl:1035
msgid "Virtual Hosts"
msgstr "Virtuelle Hosts"
#: web/ejabberd_web_admin.erl:1043 web/ejabberd_web_admin.erl:1050
msgid "Users"
msgstr "Benutzer"
#: web/ejabberd_web_admin.erl:1078
msgid "Users Last Activity"
msgstr "Letzte Benutzeraktivität"
#: web/ejabberd_web_admin.erl:1080
msgid "Period: "
msgstr "Zeitraum: "
#: web/ejabberd_web_admin.erl:1090
msgid "Last month"
msgstr "Letzter Monat"
#: web/ejabberd_web_admin.erl:1091
msgid "Last year"
msgstr "Letztes Jahr"
#: web/ejabberd_web_admin.erl:1092
msgid "All activity"
msgstr "Alle Aktivitäten"
#: web/ejabberd_web_admin.erl:1094
msgid "Show Ordinary Table"
msgstr "Normale Tabelle anzeigen"
#: web/ejabberd_web_admin.erl:1096
msgid "Show Integral Table"
msgstr "Vollständige Tabelle anzeigen"
#: web/ejabberd_web_admin.erl:1105 web/ejabberd_web_admin.erl:1939
msgid "Statistics"
msgstr "Statistik"
#: web/ejabberd_web_admin.erl:1117
msgid "Not Found"
msgstr "Nicht gefunden"
#: web/ejabberd_web_admin.erl:1134
msgid "Node not found"
msgstr "Knoten nicht gefunden"
#: web/ejabberd_web_admin.erl:1460
msgid "Host"
msgstr "Host"
#: web/ejabberd_web_admin.erl:1461
msgid "Registered Users"
msgstr "Registrierte Benutzer"
#: web/ejabberd_web_admin.erl:1573
msgid "Offline Messages"
msgstr "Offline-Nachrichten"
#: web/ejabberd_web_admin.erl:1574 web/ejabberd_web_admin.erl:1767
msgid "Last Activity"
msgstr "Letzte Aktivität"
#: web/ejabberd_web_admin.erl:1659 web/ejabberd_web_admin.erl:1675
msgid "Registered Users:"
msgstr "Registrierte Benutzer:"
#: web/ejabberd_web_admin.erl:1661 web/ejabberd_web_admin.erl:1677
#: web/ejabberd_web_admin.erl:2192
msgid "Online Users:"
msgstr "Angemeldete Benutzer:"
#: web/ejabberd_web_admin.erl:1663
msgid "Outgoing s2s Connections:"
msgstr "Ausgehende s2s-Verbindungen:"
#: web/ejabberd_web_admin.erl:1665
msgid "Outgoing s2s Servers:"
msgstr "Ausgehende s2s-Server:"
#: web/ejabberd_web_admin.erl:1734 web/mod_register_web.erl:175
#: web/mod_register_web.erl:372 web/mod_register_web.erl:381
#: web/mod_register_web.erl:411
msgid "Change Password"
msgstr "Passwort ändern"
#: web/ejabberd_web_admin.erl:1758
msgid "User "
msgstr "Benutzer "
#: web/ejabberd_web_admin.erl:1765
msgid "Connected Resources:"
msgstr "Verbundene Ressourcen:"
#: web/ejabberd_web_admin.erl:1766 web/mod_register_web.erl:227
#: web/mod_register_web.erl:519
msgid "Password:"
msgstr "Passwort:"
#: web/ejabberd_web_admin.erl:1828
msgid "No Data"
msgstr "Keine Daten"
#: web/ejabberd_web_admin.erl:1906
msgid "Nodes"
msgstr "Knoten"
#: web/ejabberd_web_admin.erl:1929 web/ejabberd_web_admin.erl:1951
msgid "Node "
msgstr "Knoten "
#: web/ejabberd_web_admin.erl:1938
msgid "Listened Ports"
msgstr "Aktive Ports"
#: web/ejabberd_web_admin.erl:1940 web/ejabberd_web_admin.erl:2260
#: web/ejabberd_web_admin.erl:2448
msgid "Update"
msgstr "Aktualisieren"
#: web/ejabberd_web_admin.erl:1943 web/ejabberd_web_admin.erl:2569
msgid "Restart"
msgstr "Neustart"
#: web/ejabberd_web_admin.erl:1945 web/ejabberd_web_admin.erl:2571
msgid "Stop"
msgstr "Stoppen"
#: web/ejabberd_web_admin.erl:1959
msgid "RPC Call Error"
msgstr "Fehler bei RPC-Aufruf"
#: web/ejabberd_web_admin.erl:2000
msgid "Database Tables at "
msgstr "Datenbanktabellen auf "
#: web/ejabberd_web_admin.erl:2007
msgid "Storage Type"
msgstr "Speichertyp"
#: web/ejabberd_web_admin.erl:2008
msgid "Elements"
msgstr "Elemente"
#: web/ejabberd_web_admin.erl:2009
msgid "Memory"
msgstr "Speicher"
#: web/ejabberd_web_admin.erl:2032 web/ejabberd_web_admin.erl:2137
msgid "Error"
msgstr "Fehler"
#: web/ejabberd_web_admin.erl:2034
msgid "Backup of "
msgstr "Sicherung von "
#: web/ejabberd_web_admin.erl:2036
msgid ""
"Please note that these options will only backup the builtin Mnesia database. "
"If you are using the ODBC module, you also need to backup your SQL database "
"separately."
msgstr ""
"Beachten sie, das diese Optionen nur die eingebaute Mnesia-Datenbank "
"sichern. Wenn sie das ODBC-Modul verwenden, müssen sie die SQL-Datenbank "
"manuell sichern."
#: web/ejabberd_web_admin.erl:2041
msgid "Store binary backup:"
msgstr "Speichere binäre Sicherung:"
#: web/ejabberd_web_admin.erl:2045 web/ejabberd_web_admin.erl:2052
#: web/ejabberd_web_admin.erl:2060 web/ejabberd_web_admin.erl:2067
#: web/ejabberd_web_admin.erl:2074 web/ejabberd_web_admin.erl:2081
#: web/ejabberd_web_admin.erl:2088 web/ejabberd_web_admin.erl:2096
#: web/ejabberd_web_admin.erl:2103 web/ejabberd_web_admin.erl:2110
msgid "OK"
msgstr "OK"
#: web/ejabberd_web_admin.erl:2048
msgid "Restore binary backup immediately:"
msgstr "Stelle binäre Sicherung sofort wieder her:"
#: web/ejabberd_web_admin.erl:2056
msgid ""
"Restore binary backup after next ejabberd restart (requires less memory):"
msgstr ""
"Stelle binäre Sicherung beim nächsten ejabberd-Neustart wieder her (benötigt "
"weniger Speicher):"
#: web/ejabberd_web_admin.erl:2063
msgid "Store plain text backup:"
msgstr "Speichere Klartext-Sicherung:"
#: web/ejabberd_web_admin.erl:2070
msgid "Restore plain text backup immediately:"
msgstr "Stelle Klartext-Sicherung sofort wieder her:"
#: web/ejabberd_web_admin.erl:2077
msgid "Import users data from a PIEFXIS file (XEP-0227):"
msgstr "Benutzerdaten von einer PIEFXIS Datei (XEP-0227) importieren:"
#: web/ejabberd_web_admin.erl:2084
msgid "Export data of all users in the server to PIEFXIS files (XEP-0227):"
msgstr ""
"Alle Benutzerdaten des Servers in PIEFXIS Dateien (XEP-0227) exportieren:"
#: web/ejabberd_web_admin.erl:2091
msgid "Export data of users in a host to PIEFXIS files (XEP-0227):"
msgstr ""
"Alle Benutzerdaten des Hosts in PIEFXIS Dateien (XEP-0227) exportieren:"
#: web/ejabberd_web_admin.erl:2099
msgid "Import user data from jabberd14 spool file:"
msgstr "Importiere Benutzer von jabberd14 Spool Datei:"
#: web/ejabberd_web_admin.erl:2106
msgid "Import users data from jabberd14 spool directory:"
msgstr "Importiere Benutzer von jabberd14 Spool Verzeichnis:"
#: web/ejabberd_web_admin.erl:2132
msgid "Listened Ports at "
msgstr "Aktive Ports bei"
#: web/ejabberd_web_admin.erl:2157
msgid "Modules at "
msgstr "Module bei "
#: web/ejabberd_web_admin.erl:2183
msgid "Statistics of ~p"
msgstr "Statistiken von ~p"
#: web/ejabberd_web_admin.erl:2186
msgid "Uptime:"
msgstr "Betriebszeit:"
#: web/ejabberd_web_admin.erl:2189
msgid "CPU Time:"
msgstr "CPU-Zeit:"
#: web/ejabberd_web_admin.erl:2195
msgid "Transactions Committed:"
msgstr "Durchgeführte Transaktionen:"
#: web/ejabberd_web_admin.erl:2198
msgid "Transactions Aborted:"
msgstr "Abgebrochene Transaktionen:"
#: web/ejabberd_web_admin.erl:2201
msgid "Transactions Restarted:"
msgstr "Neu gestartete Transaktionen:"
#: web/ejabberd_web_admin.erl:2204
msgid "Transactions Logged:"
msgstr "Protokollierte Transaktionen:"
#: web/ejabberd_web_admin.erl:2246
msgid "Update "
msgstr "Aktualisierung "
#: web/ejabberd_web_admin.erl:2254
msgid "Update plan"
msgstr "Aktualisierungsplan"
#: web/ejabberd_web_admin.erl:2255
msgid "Modified modules"
msgstr "Geänderte Module"
#: web/ejabberd_web_admin.erl:2256
msgid "Update script"
msgstr "Aktualisierungsscript"
#: web/ejabberd_web_admin.erl:2257
msgid "Low level update script"
msgstr "Low level Aktualisierungsscript"
#: web/ejabberd_web_admin.erl:2258
msgid "Script check"
msgstr "Script-Überprüfung"
#: web/ejabberd_web_admin.erl:2426
msgid "Port"
msgstr "Port"
#: web/ejabberd_web_admin.erl:2427
msgid "IP"
msgstr "IP"
#: web/ejabberd_web_admin.erl:2428
msgid "Protocol"
msgstr "Protokoll"
#: web/ejabberd_web_admin.erl:2429 web/ejabberd_web_admin.erl:2556
msgid "Module"
msgstr "Modul"
#: web/ejabberd_web_admin.erl:2430 web/ejabberd_web_admin.erl:2557
msgid "Options"
msgstr "Optionen"
#: web/ejabberd_web_admin.erl:2450
msgid "Delete"
msgstr "Löschen"
#: web/ejabberd_web_admin.erl:2579
msgid "Start"
msgstr "Starten"
#: web/mod_register_web.erl:104
msgid "Your Jabber account was successfully created."
msgstr "Ihr Jabber Konto wurde erfolgreich erstellt."
#: web/mod_register_web.erl:107
msgid "There was an error creating the account: "
msgstr "Es trat ein Fehler beim erstellen des Kontos auf:"
#: web/mod_register_web.erl:115
msgid "Your Jabber account was successfully deleted."
msgstr "Ihr Jabber Konto wurde erfolgreich gelöscht."
#: web/mod_register_web.erl:118
msgid "There was an error deleting the account: "
msgstr "Es trat ein Fehler beim Löschen des Kontos auf:"
#: web/mod_register_web.erl:128
msgid "The password of your Jabber account was successfully changed."
msgstr "Das Passwort von ihrem Jabber Konto wurde geändert."
#: web/mod_register_web.erl:131
msgid "There was an error changing the password: "
msgstr "Es trat ein Fehler beim Ändern des Passworts auf:"
#: web/mod_register_web.erl:163 web/mod_register_web.erl:172
msgid "Jabber Account Registration"
msgstr "Jabber Konto Anmeldung"
#: web/mod_register_web.erl:174 web/mod_register_web.erl:192
#: web/mod_register_web.erl:201
msgid "Register a Jabber account"
msgstr "Jabber Konto registrieren"
#: web/mod_register_web.erl:176 web/mod_register_web.erl:493
#: web/mod_register_web.erl:502
msgid "Unregister a Jabber account"
msgstr "Jabber Konto entfernen"
#: web/mod_register_web.erl:203
msgid ""
"This page allows to create a Jabber account in this Jabber server. Your JID "
"(Jabber IDentifier) will be of the form: username@server. Please read "
"carefully the instructions to fill correctly the fields."
msgstr ""
"Diese Seite erlaubt das anlegen eines Jabber Kontos auf diesem Jabber "
"Server. Ihre JID (Jabber IDentifier) setzt sich folgend zusammen: "
"benutzername@server. Bitte lesen sie die Hinweise genau durch, um die Felder "
"korrekt auszufüllen."
#: web/mod_register_web.erl:212 web/mod_register_web.erl:386
#: web/mod_register_web.erl:509
msgid "Username:"
msgstr "Benutzername:"
#: web/mod_register_web.erl:217
msgid "This is case insensitive: macbeth is the same that MacBeth and Macbeth."
msgstr ""
"Groß/Klein-Schreibung spielt hierbei keine Rolle: macbeth ist gleich MacBeth "
"und Macbeth."
#: web/mod_register_web.erl:218
msgid "Characters not allowed:"
msgstr "Nicht erlaubte Zeichen:"
#: web/mod_register_web.erl:222 web/mod_register_web.erl:391
#: web/mod_register_web.erl:514
msgid "Server:"
msgstr "Server:"
#: web/mod_register_web.erl:232
msgid ""
"Don't tell your password to anybody, not even the administrators of the "
"Jabber server."
msgstr ""
"Geben sie niemandem ihr Passwort, auch nicht den Administratoren des Jabber "
"Servers."
#: web/mod_register_web.erl:234
msgid "You can later change your password using a Jabber client."
msgstr ""
"Sie können das Passwort später mit einem Jabber Client Programm ändern."
#: web/mod_register_web.erl:235
msgid ""
"Some Jabber clients can store your password in your computer. Use that "
"feature only if you trust your computer is safe."
msgstr ""
"Einige Jabber Client Programme speichern ihr Passwort auf ihrem Computer. "
"Verwenden sie diese Möglichkeit nur auf Computern, die sie als sicher "
"einstufen."
#: web/mod_register_web.erl:237
msgid ""
"Memorize your password, or write it in a paper placed in a safe place. In "
"Jabber there isn't an automated way to recover your password if you forget "
"it."
msgstr ""
"Merken sie sich ihr Passwort, oder schreiben sie es auf einen Zettel den sie "
"sicher verwahren. Bei Jabber gibt es keine automatische Möglichkeit, das "
"Passwort wiederherzustellen."
#: web/mod_register_web.erl:242 web/mod_register_web.erl:406
msgid "Password Verification:"
msgstr "Passwort bestätigen:"
#: web/mod_register_web.erl:250
msgid "Register"
msgstr "Anmelden"
#: web/mod_register_web.erl:396
msgid "Old Password:"
msgstr "Aktuelles Passwort:"
#: web/mod_register_web.erl:401
msgid "New Password:"
msgstr "Neues Passwort:"
#: web/mod_register_web.erl:504
msgid "This page allows to unregister a Jabber account in this Jabber server."
msgstr ""
"Diese Seite erlaubt es, ein Jabber Konto von diesem Server zu entfernen."
#: web/mod_register_web.erl:524
msgid "Unregister"
msgstr "Abmelden"
#, fuzzy
#~ msgid "Captcha test failed"
#~ msgstr "Die Verifizierung ist gültig."
ejabberd-2.1.11/src/msgs/uk.msg 0000664 0000000 0000000 00000107306 12240230175 013114 0 ustar {"Access Configuration","Конфігурація доступу"}.
{"Access Control List Configuration","Конфігурація списків керування доступом"}.
{"Access control lists","Списки керування доступом"}.
{"Access Control Lists","Списки керування доступом"}.
{"Access denied by service policy","Доступ заборонений політикою служби"}.
{"Access rules","Правила доступу"}.
{"Access Rules","Правила доступу"}.
{"Action on user","Дія над користувачем"}.
{"Add Jabber ID","Додати Jabber ID"}.
{"Add New","Додати"}.
{"Add User","Додати користувача"}.
{"Administration of ","Адміністрування "}.
{"Administration","Адміністрування"}.
{"Administrator privileges required","Необхідні права адміністратора"}.
{"A friendly name for the node","Псевдонім для вузла"}.
{"All activity","Вся статистика"}.
{"Allow this Jabber ID to subscribe to this pubsub node?","Чи дозволити цьому Jabber ID підписатись новини наданого вузла"}.
{"Allow users to change the subject","Дозволити користувачам змінювати тему"}.
{"Allow users to query other users","Дозволити iq-запити до користувачів"}.
{"Allow users to send invites","Дозволити користувачам надсилати запрошення"}.
{"Allow users to send private messages","Дозволити приватні повідомлення"}.
{"Allow visitors to change nickname","Дозволити відвідувачам змінювати псевдонім"}.
{"Allow visitors to send status text in presence updates","Дозволити відвідувачам відсилати текст статусу в оновленнях присутності"}.
{"All Users","Всі користувачі"}.
{"Announcements","Сповіщення"}.
{"anyone","всім учасникам"}.
{"A password is required to enter this room","Щоб зайти в цю конференцію, необхідно ввести пароль"}.
{"April","квітня"}.
{"August","серпня"}.
{"Backup Management","Керування резервним копіюванням"}.
{"Backup of ","Резервне копіювання "}.
{"Backup to File at ","Резервне копіювання в файл на "}.
{"Backup","Резервне копіювання"}.
{"Bad format","Неправильний формат"}.
{"Birthday","День народження"}.
{"CAPTCHA web page","Адреса капчі"}.
{"Change Password","Змінити пароль"}.
{"Change User Password","Змінити Пароль Користувача"}.
{"Characters not allowed:","Заборонені символи:"}.
{"Chatroom configuration modified","Конфігурація кімнати змінилась"}.
{"Chatroom is created","Створено кімнату"}.
{"Chatroom is destroyed","Знищено кімнату"}.
{"Chatroom is started","Запущено кімнату"}.
{"Chatroom is stopped","Зупинено кімнату"}.
{"Chatrooms","Кімнати"}.
{"Choose a username and password to register with this server","Виберіть назву користувача та пароль для реєстрації на цьому сервері"}.
{"Choose modules to stop","Виберіть модулі, які необхідно зупинити"}.
{"Choose storage type of tables","Оберіть тип збереження таблиць"}.
{"Choose whether to approve this entity's subscription.","Вирішіть, чи задовольнити запит цього об'єкту на підписку"}.
{"City","Місто"}.
{"Commands","Команди"}.
{"Conference room does not exist","Конференція не існує"}.
{"Configuration of room ~s","Конфігурація кімнати ~s"}.
{"Configuration","Конфігурація"}.
{"Connected Resources:","Підключені ресурси:"}.
{"Connections parameters","Параметри з'єднання"}.
{"Country","Країна"}.
{"CPU Time:","Процесорний час:"}.
{"Database Tables at ","Таблиці бази даних на "}.
{"Database Tables Configuration at ","Конфігурація таблиць бази даних на "}.
{"Database","База даних"}.
{"December","грудня"}.
{"Default users as participants","Зробити користувачів учасниками за замовчуванням"}.
{"Delete message of the day on all hosts","Видалити повідомлення дня на усіх хостах"}.
{"Delete message of the day","Видалити повідомлення дня"}.
{"Delete Selected","Видалити виділені"}.
{"Delete User","Видалити Користувача"}.
{"Delete","Видалити"}.
{"Deliver event notifications","Доставляти сповіщення про події"}.
{"Deliver payloads with event notifications","Доставляти разом з повідомленнями про публікації самі публікації"}.
{"Description:","Опис:"}.
{"Disc only copy","Тільки диск"}.
{"Displayed Groups:","Видимі групи:"}.
{"Don't tell your password to anybody, not even the administrators of the Jabber server.","Нікому не кажіть свій пароль, навіть адміністраторам сервера."}.
{"Dump Backup to Text File at ","Копіювання в текстовий файл на "}.
{"Dump to Text File","Копіювання в текстовий файл"}.
{"Edit Properties","Змінити параметри"}.
{"ejabberd IRC module","ejabberd IRC модуль"}.
{"ejabberd MUC module","ejabberd MUC модуль"}.
{"ejabberd Publish-Subscribe module","Модуль ejabberd Публікації-Підписки"}.
{"ejabberd SOCKS5 Bytestreams module","ejabberd SOCKS5 Bytestreams модуль"}.
{"ejabberd vCard module","ejabberd vCard модуль"}.
{"ejabberd Web Admin","Веб-інтерфейс Адміністрування ejabberd"}.
{"Elements","Елементи"}.
{"Email","Електронна пошта"}.
{"Enable logging","Включити журнал роботи"}.
{"Encoding for server ~b","Кодування для сервера ~b"}.
{"End User Session","Закінчити Сеанс Користувача"}.
{"Enter list of {Module, [Options]}","Введіть перелік такого виду {Module, [Options]}"}.
{"Enter nickname you want to register","Введіть псевдонім, який ви хочете зареєструвати"}.
{"Enter path to backup file","Введіть шлях до резервного файла"}.
{"Enter path to jabberd14 spool dir","Введіть шлях до директорії спула jabberd14"}.
{"Enter path to jabberd14 spool file","Введіть шлях до файла зі спула jabberd14"}.
{"Enter path to text file","Введіть шлях до текстового файла"}.
{"Enter the text you see","Введіть текст, що ви бачите"}.
{"Enter username and encodings you wish to use for connecting to IRC servers. Press 'Next' to get more fields to fill in. Press 'Complete' to save settings.","Введіть ім'я користувача та кодування, які будуть використовуватися при підключенні до IRC-серверів Натисніть 'Далі' для заповнення додаткових полів. Натисніть 'Завершити' для збереження параметрів."}.
{"Enter username, encodings, ports and passwords you wish to use for connecting to IRC servers","Введіть ім'я користувача, кодування, порти та паролі, що будуть використовуватися при підключенні до IRC-серверів"}.
{"Erlang Jabber Server","Erlang Jabber Server"}.
{"Error","Помилка"}.
{"Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef.net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}].","Приклад: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef.net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."}.
{"Exclude Jabber IDs from CAPTCHA challenge","Пропускати ці Jabber ID без CAPTCHA-запиту"}.
{"Export data of all users in the server to PIEFXIS files (XEP-0227):","Експорт даних всіх користувачів сервера до файлу PIEFXIS (XEP-0227):"}.
{"Export data of users in a host to PIEFXIS files (XEP-0227):","Експорт даних користувачів домена до файлу PIEFXIS (XEP-0227):"}.
{"Family Name","Прізвище"}.
{"February","лютого"}.
{"Fill in fields to search for any matching Jabber User","Заповніть поля для пошуку користувача Jabber"}.
{"Fill in the form to search for any matching Jabber User (Add * to the end of field to match substring)","Заповніть поля для пошуку користувача Jabber (Додайте * в кінець поля для пошуку підрядка)"}.
{"Friday","П'ятниця"}.
{"From ~s","Від ~s"}.
{"From","Від кого"}.
{"Full Name","Повне ім'я"}.
{"Get Number of Online Users","Отримати Кількість Підключених Користувачів"}.
{"Get Number of Registered Users","Отримати Кількість Зареєстрованих Користувачів"}.
{"Get User Last Login Time","Отримати Час Останнього Підключення Користувача"}.
{"Get User Password","Отримати Пароль Користувача"}.
{"Get User Statistics","Отримати Статистику по Користувачу"}.
{"Groups","Групи"}.
{"Group ","Група "}.
{"has been banned","заборонили вхід в кімнату"}.
{"has been kicked because of an affiliation change","вигнано з кімнати внаслідок зміни рангу"}.
{"has been kicked because of a system shutdown","вигнано з кімнати внаслідок зупинки системи"}.
{"has been kicked because the room has been changed to members-only","вигнано з кімнати тому, що вона стала тільки для учасників"}.
{"has been kicked","вигнали з кімнати"}.
{" has set the subject to: "," встановив(ла) тему: "}.
{"Host","Хост"}.
{"If you don't see the CAPTCHA image here, visit the web page.","Якщо ви не бачите зображення капчі, перейдіть за за цією адресою."}.
{"If you want to specify different ports, passwords, encodings for IRC servers, fill this list with values in format '{\"irc server\", \"encoding\", port, \"password\"}'. By default this service use \"~s\" encoding, port ~p, empty password.","Щоб вказати різні порти, паролі та кодування для різних серверів IRC, заповніть список значеннями в форматі '{\"irc server\", \"encoding\", port, \"password\"}'. За замовчуванням ця служба використовує \"~s\" кодування, порт ~p, пустий пароль."}.
{"Import Directory","Імпорт з директорії"}.
{"Import File","Імпорт з файла"}.
{"Import user data from jabberd14 spool file:","Імпорт користувачів з файла спула jabberd14:"}.
{"Import User from File at ","Імпортування користувача з файла на "}.
{"Import users data from a PIEFXIS file (XEP-0227):","Імпорт даних користовучів з файлу PIEFXIS (XEP-0227):"}.
{"Import users data from jabberd14 spool directory:","Імпорт користувачів з діректорії спула jabberd14:"}.
{"Import Users from Dir at ","Імпортування користувача з директорії на "}.
{"Import Users From jabberd14 Spool Files","Імпорт користувачів зі спулу jabberd14"}.
{"Improper message type","Неправильний тип повідомлення"}.
{"Incorrect password","Неправильний пароль"}.
{"Invalid affiliation: ~s","Недопустимий ранг: ~s"}.
{"Invalid role: ~s","Недопустима роль: ~s"}.
{"IP addresses","IP адреси"}.
{"IP","IP"}.
{"IRC channel (don't put the first #)","Канал IRC (не включаючи #)"}.
{"IRC server","IRC-сервер"}.
{"IRC settings","Парметри IRC"}.
{"IRC Transport","IRC Транспорт"}.
{"IRC username","Ім'я користувача IRC"}.
{"IRC Username","Ім'я користувача IRC"}.
{"is now known as","змінив(ла) псевдонім на"}.
{"It is not allowed to send private messages of type \"groupchat\"","Не дозволяється надсилати приватні повідомлення типу \"groupchat\""}.
{"It is not allowed to send private messages to the conference","Не дозволяється надсилати приватні повідомлення в конференцію"}.
{"It is not allowed to send private messages","Приватні повідомлення не дозволені"}.
{"Jabber Account Registration","Реєстрація Jabber-акаунту"}.
{"Jabber ID","Jabber ID"}.
{"Jabber ID ~s is invalid","Jabber ID ~s недопустимий"}.
{"January","січня"}.
{"Join IRC channel","Приєднатися до каналу IRC"}.
{"joins the room","увійшов(ла) в кімнату"}.
{"Join the IRC channel here.","Приєднатися до каналу IRC"}.
{"Join the IRC channel in this Jabber ID: ~s","Приєднатися до каналу IRC з Jabber ID: ~s"}.
{"July","липня"}.
{"June","червня"}.
{"Last Activity","Останнє підключення"}.
{"Last login","Останнє підключення"}.
{"Last month","За останній місяць"}.
{"Last year","За останній рік"}.
{"leaves the room","вийшов(ла) з кімнати"}.
{"Listened Ports at ","Відкриті порти на "}.
{"Listened Ports","Відкриті порти"}.
{"List of modules to start","Список завантажуваних модулів"}.
{"Low level update script","Низькорівневий сценарій поновлення"}.
{"Make participants list public","Зробити список учасників видимим всім"}.
{"Make room CAPTCHA protected","Зробити кімнату захищеною капчею"}.
{"Make room members-only","Кімната тільки для зареєтрованых учасників"}.
{"Make room moderated","Зробити кімнату модерованою"}.
{"Make room password protected","Зробити кімнату захищеною паролем"}.
{"Make room persistent","Зробити кімнату постійною"}.
{"Make room public searchable","Зробити кімнату видимою всім"}.
{"March","березня"}.
{"Maximum Number of Occupants","Максимальна кількість учасників"}.
{"Max # of items to persist","Максимальне число збережених публікацій"}.
{"Max payload size in bytes","Максимальний розмір корисного навантаження в байтах"}.
{"May","травня"}.
{"Membership is required to enter this room","В цю конференцію можуть входити тільки її члени"}.
{"Members:","Члени:"}.
{"Memorize your password, or write it in a paper placed in a safe place. In Jabber there isn't an automated way to recover your password if you forget it.","Запам'ятайте пароль, або запишіть його на папері, який треба зберегти у безпечному місці. У Jabber'і немає автоматизованих засобів відновлення пароля на той випадок, якщо ви його забудете."}.
{"Memory","Пам'ять"}.
{"Message body","Тіло повідомлення"}.
{"Middle Name","По-батькові"}.
{"Moderator privileges required","Необхідні права модератора"}.
{"moderators only","тільки модераторам"}.
{"Modified modules","Змінені модулі"}.
{"Modules at ","Модулі на "}.
{"Modules","Модулі"}.
{"Module","Модуль"}.
{"Monday","Понеділок"}.
{"Name:","Назва:"}.
{"Name","Назва"}.
{"Never","Ніколи"}.
{"New Password:","Новий Пароль:"}.
{"Nickname Registration at ","Реєстрація псевдоніма на "}.
{"Nickname ~s does not exist in the room","Псевдонім ~s в кімнаті відсутній"}.
{"Nickname","Псевдонім"}.
{"No body provided for announce message","Тіло оголошення має бути непустим"}.
{"No Data","Немає даних"}.
{"Node ID","ID вузла"}.
{"Node not found","Вузол не знайдено"}.
{"Nodes","Вузли"}.
{"Node ","Вузол "}.
{"No limit","Без обмежень"}.
{"None","Немає"}.
{"No resource provided","Не вказаний ресурс"}.
{"Not Found","не знайдено"}.
{"Notify subscribers when items are removed from the node","Повідомляти абонентів про видалення публікацій із збірника"}.
{"Notify subscribers when the node configuration changes","Повідомляти абонентів про зміни в конфігурації збірника"}.
{"Notify subscribers when the node is deleted","Повідомляти абонентів про видалення збірника"}.
{"November","листопада"}.
{"Number of occupants","Кількість присутніх"}.
{"Number of online users","Кількість підключених користувачів"}.
{"Number of registered users","Кількість зареєстрованих користувачів"}.
{"October","грудня"}.
{"Offline Messages:","Офлайнові повідомлення:"}.
{"Offline Messages","Офлайнові повідомлення"}.
{"OK","Продовжити"}.
{"Old Password:","Старий пароль:"}.
{"Online Users:","Підключені користувачі:"}.
{"Online Users","Підключені користувачі"}.
{"Online","Підключений"}.
{"Only deliver notifications to available users","Доставляти повідомленнями тільки доступним користувачам"}.
{"Only moderators and participants are allowed to change the subject in this room","Тільки модератори та учасники можуть змінювати тему в цій кімнаті"}.
{"Only moderators are allowed to change the subject in this room","Тільки модератори можуть змінювати тему в цій кімнаті"}.
{"Only occupants are allowed to send messages to the conference","Тільки присутнім дозволяється надсилати повідомленняя в конференцію"}.
{"Only occupants are allowed to send queries to the conference","Тільки присутнім дозволяється відправляти запити в конференцію"}.
{"Only service administrators are allowed to send service messages","Тільки адміністратор сервісу може надсилати службові повідомлення"}.
{"Options","Параметри"}.
{"Organization Name","Назва організації"}.
{"Organization Unit","Відділ організації"}.
{"Outgoing s2s Connections:","Вихідні s2s-з'єднання:"}.
{"Outgoing s2s Connections","Вихідні s2s-з'єднання"}.
{"Outgoing s2s Servers:","Вихідні s2s-сервери:"}.
{"Owner privileges required","Необхідні права власника"}.
{"Packet","Пакет"}.
{"Password ~b","Пароль ~b"}.
{"Password Verification:","Перевірка Пароля:"}.
{"Password Verification","Перевірка Пароля"}.
{"Password:","Пароль:"}.
{"Password","Пароль"}.
{"Path to Dir","Шлях до директорії"}.
{"Path to File","Шлях до файла"}.
{"Pending","Очікування"}.
{"Period: ","Період"}.
{"Persist items to storage","Зберегати публікації до сховища"}.
{"Ping","Пінг"}.
{"Please note that these options will only backup the builtin Mnesia database. If you are using the ODBC module, you also need to backup your SQL database separately.","Зауважте, що ця опція відповідає за резервне копіювання тільки вбудованної бази даних Mnesia. Якщо Ви також використовуєте інше сховище для даних (наприклад за допомогою модуля ODBC), то його резервне копіювання потрібно робити окремо."}.
{"Pong","Понг"}.
{"Port ~b","Порт ~b"}.
{"Port","Порт"}.
{"Present real Jabber IDs to","Зробити реальні Jabber ID учасників видимими"}.
{"private, ","приватна, "}.
{"Protocol","Протокол"}.
{"Publish-Subscribe","Публікація-Підписка"}.
{"PubSub subscriber request","Запит на підписку PubSub"}.
{"Purge all items when the relevant publisher goes offline","Видалити всі елементи, коли особа, що їх опублікувала, вимикається від мережі"}.
{"Queries to the conference members are not allowed in this room","Запити до користувачів в цій конференції заборонені"}.
{"RAM and disc copy","ОЗП та диск"}.
{"RAM copy","ОЗП"}.
{"Raw","необроблений формат"}.
{"Really delete message of the day?","Насправді видалити повідомлення дня?"}.
{"Recipient is not in the conference room","Адресата немає в конференції"}.
{"Register a Jabber account","Зареєструвати Jabber-акаунт"}.
{"Registered Users:","Зареєстровані користувачі:"}.
{"Registered Users","Зареєстровані користувачі"}.
{"Register","Реєстрація"}.
{"Registration in mod_irc for ","Реєстрація в mod_irc для "}.
{"Remote copy","не зберігаеться локально"}.
{"Remove All Offline Messages","Видалити всі офлайнові повідомлення"}.
{"Remove User","Видалити користувача"}.
{"Remove","Видалити"}.
{"Replaced by new connection","Замінено новим з'єднанням"}.
{"Resources","Ресурси"}.
{"Restart Service","Перезапустити Сервіс"}.
{"Restart","Перезапустити"}.
{"Restore Backup from File at ","Відновлення з резервної копії на "}.
{"Restore binary backup after next ejabberd restart (requires less memory):","Відновити з бінарної резервної копії при наступному запуску (потребує менше пам'яті):"}.
{"Restore binary backup immediately:","Відновити з бінарної резервної копії негайно:"}.
{"Restore plain text backup immediately:","Відновити з текстової резервної копії негайно:"}.
{"Restore","Відновлення з резервної копії"}.
{"Room Configuration","Конфігурація кімнати"}.
{"Room creation is denied by service policy","Створювати конференцію заборонено політикою служби"}.
{"Room description","Опис кімнати"}.
{"Room Occupants","Учасники кімнати"}.
{"Room title","Назва кімнати"}.
{"Roster groups allowed to subscribe","Дозволені для підписки групи ростера"}.
{"Roster of ","Ростер користувача "}.
{"Roster size","Кількість контактів"}.
{"Roster","Ростер"}.
{"RPC Call Error","Помилка виклику RPC"}.
{"Running Nodes","Працюючі вузли"}.
{"~s access rule configuration","Конфігурація правила доступу ~s"}.
{"Saturday","Субота"}.
{"Script check","Перевірка сценарію"}.
{"Search Results for ","Результати пошуку в "}.
{"Search users in ","Пошук користувачів в "}.
{"Send announcement to all online users on all hosts","Надіслати сповіщення всім підключеним користувачам на всіх віртуальних серверах"}.
{"Send announcement to all online users","Надіслати сповіщення всім підключеним користувачам"}.
{"Send announcement to all users on all hosts","Надіслати сповіщення до усіх користувачів на усіх хостах"}.
{"Send announcement to all users","Надіслати сповіщення всім користувачам"}.
{"September","вересня"}.
{"Server ~b","Сервер ~b"}.
{"Server:","Сервер:"}.
{"Set message of the day and send to online users","Встановити повідомлення дня та надіслати його підключеним користувачам"}.
{"Set message of the day on all hosts and send to online users","Встановити повідомлення дня на всіх хостах та надійслати його підключеним користувачам"}.
{"Shared Roster Groups","Спільні групи контактів"}.
{"Show Integral Table","Показати інтегральну таблицю"}.
{"Show Ordinary Table","Показати звичайну таблицю"}.
{"Shut Down Service","Вимкнути Сервіс"}.
{"~s invites you to the room ~s","~s запрошує вас до кімнати ~s"}.
{"Some Jabber clients can store your password in your computer. Use that feature only if you trust your computer is safe.","Деякі Jabber-клієнти можуть зберігати пароль на вашому комп'ютері. Користуйтесь цією функцією тільки у тому випадку, якщо вважаєте її безпечною."}.
{"Specify the access model","Визначити модель доступу"}.
{"Specify the event message type","Вкажіть тип повідомлень зі сповіщеннями про події"}.
{"Specify the publisher model","Умови публікації"}.
{"~s's Offline Messages Queue","Черга офлайнових повідомлень ~s"}.
{"Start Modules at ","Запуск модулів на "}.
{"Start Modules","Запуск модулів"}.
{"Start","Запустити"}.
{"Statistics of ~p","Статистика вузла ~p"}.
{"Statistics","Статистика"}.
{"Stop Modules at ","Зупинка модулів на "}.
{"Stop Modules","Зупинка модулів"}.
{"Stopped Nodes","Зупинені вузли"}.
{"Stop","Зупинити"}.
{"Storage Type","Тип таблиці"}.
{"Store binary backup:","Зберегти бінарну резервну копію:"}.
{"Store plain text backup:","Зберегти текстову резервну копію:"}.
{"Subject","Тема"}.
{"Submitted","Відправлено"}.
{"Submit","Відправити"}.
{"Subscriber Address","Адреса абонента"}.
{"Subscription","Підписка"}.
{"Sunday","Неділя"}.
{"That nickname is already in use by another occupant","Псевдонім зайнято кимось з присутніх"}.
{"That nickname is registered by another person","Псевдонім зареєстровано кимось іншим"}.
{"The CAPTCHA is valid.","Перевірку капчею закінчено успішно"}.
{"The CAPTCHA verification has failed","Перевірку капчею не пройдено"}.
{"The collections with which a node is affiliated","Колекція, до якої входить вузол"}.
{"The password is too weak","Пароль надто простий"}.
{"the password is","пароль:"}.
{"The password of your Jabber account was successfully changed.","Пароль вашого Jabber-акаунту був успішно змінений."}.
{"There was an error changing the password: ","Помилка при зміні пароля: "}.
{"There was an error creating the account: ","Помилка при створенні акаунту:"}.
{"There was an error deleting the account: ","Помилка при видаленні акаунту: "}.
{"This is case insensitive: macbeth is the same that MacBeth and Macbeth.","Регістр не має значення: \"МАША\" та \"маша\" буде сприйматися як одне й те саме ім'я."}.
{"This page allows to create a Jabber account in this Jabber server. Your JID (Jabber IDentifier) will be of the form: username@server. Please read carefully the instructions to fill correctly the fields.","Тут ви можете зареєструвати обліковий запис Jabber на цьому сервері. Ваш JID (ідентифікатор Jabber) матиме вигляд \"користувач@сервер\". Щоб вірно заповнити поля нижче, будь ласка, уважно читайте інструкції до них."}.
{"This page allows to unregister a Jabber account in this Jabber server.","Ця сторінка дозволяє видалити свій акаунт з Jabber-сервера."}.
{"This participant is kicked from the room because he sent an error message to another participant","Цього учасника було відключено від кімнати через те, що він надіслав помилкове повідомлення іншому учаснику"}.
{"This participant is kicked from the room because he sent an error message","Цього учасника було відключено від кімнати через те, що він надіслав помилкове повідомлення"}.
{"This participant is kicked from the room because he sent an error presence","Цього учасника було відключено від кімнати через те, що він надіслав помилковий статус присутності"}.
{"This room is not anonymous","Ця кімната не анонімна"}.
{"Thursday","Четвер"}.
{"Time delay","Час затримки"}.
{"Time","Час"}.
{"Too many CAPTCHA requests","Надто багато CAPTCHA-запитів"}.
{"To ~s","До ~s"}.
{"To","Кому"}.
{"Traffic rate limit is exceeded","Швидкість передачі інформації було перевищено"}.
{"Transactions Aborted:","Транзакції відмінені:"}.
{"Transactions Committed:","Транзакції завершені:"}.
{"Transactions Logged:","Транзакції запротокольовані:"}.
{"Transactions Restarted:","Транзакції перезапущені:"}.
{"Tuesday","Вівторок"}.
{"Unable to generate a CAPTCHA","Нема можливості згенерувати капчу"}.
{"Unauthorized","Не авторизовано"}.
{"Unregister a Jabber account","Видалити Jabber-акаунт"}.
{"Unregister","Видалити"}.
{"Update message of the day (don't send)","Оновити повідомлення дня (не надсилати)"}.
{"Update message of the day on all hosts (don't send)","Оновити повідомлення дня на всіх хостах (не надсилати)"}.
{"Update plan","План поновлення"}.
{"Update script","Сценарій поновлення"}.
{"Update","Обновити"}.
{"Update ","Поновлення "}.
{"Uptime:","Час роботи:"}.
{"Use of STARTTLS required","Ви мусите використовувати STARTTLS"}.
{"User Management","Управління Користувачами"}.
{"Username:","Ім'я користувача:"}.
{"Users are not allowed to register accounts so quickly","Користувачам не дозволено так часто реєструвати облікові записи"}.
{"Users Last Activity","Статистика останнього підключення користувачів"}.
{"Users","Користувачі"}.
{"User ","Користувач "}.
{"User","Користувач"}.
{"Validate","Затвердити"}.
{"vCard User Search","Пошук користувачів по vCard"}.
{"Virtual Hosts","віртуальні хости"}.
{"Visitors are not allowed to change their nicknames in this room","Відвідувачам не дозволяється змінювати псевдонім в цій кімнаті"}.
{"Visitors are not allowed to send messages to all occupants","Відвідувачам не дозволяється надсилати повідомлення всім присутнім"}.
{"Wednesday","Середа"}.
{"When to send the last published item","Коли надсилати останній опублікований елемент"}.
{"Whether to allow subscriptions","Дозволяти підписку"}.
{"You can later change your password using a Jabber client.","Пізніше можна змінити пароль через Jabber-клієнт."}.
{"You have been banned from this room","Вам заборонено входити в цю конференцію"}.
{"You must fill in field \"Nickname\" in the form","Вам необхідно заповнити поле \"Псевдонім\" у формі"}.
{"You need a client that supports x:data and CAPTCHA to register","Для реєстрації псевдоніму необхідно використовувати клієнт з підтримкою x:data"}.
{"You need a client that supports x:data to register the nickname","Для реєстрації псевдоніму необхідно використовувати клієнт з підтримкою x:data"}.
{"You need an x:data capable client to configure mod_irc settings","Для налагодження параметрів mod_irc необхідно використовувати клієнт, що має підтримку x:data"}.
{"You need an x:data capable client to configure room","Для конфігурування кімнати потрібно використовувати клієнт з підтримкою x:data"}.
{"You need an x:data capable client to search","Для пошуку необхідний клієнт із підтримкою x:data"}.
{"Your active privacy list has denied the routing of this stanza.","Маршрутизація цієї строфи була відмінена активним списком приватності."}.
{"Your contact offline message queue is full. The message has been discarded.","Черга повідомлень, що не були доставлені, переповнена. Повідомлення не було збережено."}.
{"Your Jabber account was successfully created.","Ваш Jabber-акаунт було успішно створено."}.
{"Your Jabber account was successfully deleted.","Ваш Jabber-акаунт було успішно видалено."}.
{"Your messages to ~s are being blocked. To unblock them, visit ~s","Ваші повідомлення до ~s блокуються. Для розблокування відвідайте ~s"}.
ejabberd-2.1.11/src/msgs/th.msg 0000664 0000000 0000000 00000064770 12240230175 013117 0 ustar {"Access Configuration","การกำหนดค่าการเข้าถึง"}.
{"Access Control List Configuration","การกำหนดค่ารายการควบคุมการเข้าถึง"}.
{"Access control lists","รายการควบคุมการเข้าถึง"}.
{"Access Control Lists","รายการควบคุมการเข้าถึง"}.
{"Access denied by service policy","การเข้าถึงถูกปฏิเสธโดยนโยบายการบริการ"}.
{"Access rules","กฎการเข้าถึง"}.
{"Access Rules","กฎการเข้าถึง"}.
{"Action on user","การดำเนินการกับผู้ใช้"}.
{"Add Jabber ID","เพิ่ม Jabber ID"}.
{"Add New","เพิ่มผู้ใช้ใหม่"}.
{"Add User","เพิ่มผู้ใช้"}.
{"Administration","การดูแล"}.
{"Administration of ","การดูแล "}.
{"Administrator privileges required","ต้องมีสิทธิพิเศษของผู้ดูแลระบบ"}.
{"All activity","กิจกรรมทั้งหมด"}.
{"Allow this Jabber ID to subscribe to this pubsub node?","อนุญาตให้ Jabber ID นี้เข้าร่วมเป็นสมาชิกของโหนด pubsub หรือไม่"}.
{"Allow users to query other users","อนุญาตให้ผู้ใช้ถามคำถามกับผู้ใช้คนอื่นๆ ได้"}.
{"Allow users to send invites","อนุญาตให้ผู้ใช้ส่งคำเชิญถึงกันได้"}.
{"Allow users to send private messages","อนุญาตให้ผู้ใช้ส่งข้อความส่วนตัว"}.
{"All Users","ผู้ใช้ทั้งหมด"}.
{"Announcements","ประกาศ"}.
{"anyone","ทุกคน"}.
{"April","เมษายน"}.
{"August","สิงหาคม"}.
{"Backup","การสำรองข้อมูล "}.
{"Backup Management","การจัดการข้อมูลสำรอง"}.
{"Backup of ","การสำรองข้อมูล"}.
{"Backup to File at ","สำรองไฟล์ข้อมูลที่"}.
{"Bad format","รูปแบบที่ไม่ถูกต้อง"}.
{"Birthday","วันเกิด"}.
{"Change Password","เปลี่ยนรหัสผ่าน"}.
{"Change User Password","เปลี่ยนรหัสผ่านของผู้ใช้"}.
{"Chatroom configuration modified","มีการปรับเปลี่ยนการกำหนดค่าของห้องสนทนา"}.
{"Chatrooms","ห้องสนทนา"}.
{"Choose a username and password to register with this server","เลือกชื่อผู้ใช้และรหัสผ่านเพื่อลงทะเบียนกับเซิร์ฟเวอร์นี้"}.
{"Choose modules to stop","เลือกโมดูลเพื่อหยุดการทำงาน"}.
{"Choose storage type of tables","เลือกชนิดการจัดเก็บของตาราง"}.
{"Choose whether to approve this entity's subscription.","เลือกว่าจะอนุมัติการสมัครเข้าใช้งานของเอนทิตี้นี้หรือไม่"}.
{"City","เมือง"}.
{"Commands","คำสั่ง"}.
{"Conference room does not exist","ไม่มีห้องประชุม"}.
{"Configuration","การกำหนดค่า"}.
{"Connected Resources:","ทรัพยากรที่เชื่อมต่อ:"}.
{"Country","ประเทศ"}.
{"CPU Time:","เวลาการทำงานของ CPU:"}.
{"Database","ฐานข้อมูล"}.
{"Database Tables at ","ตารางฐานข้อมูลที่"}.
{"Database Tables Configuration at ","การกำหนดค่าตารางฐานข้อมูลที่"}.
{"December","ธันวาคม"}.
{"Default users as participants","ผู้ใช้เริ่มต้นเป็นผู้เข้าร่วม"}.
{"Delete","ลบ"}.
{"Delete message of the day","ลบข้อความของวัน"}.
{"Delete message of the day on all hosts","ลบข้อความของวันบนโฮสต์ทั้งหมด"}.
{"Delete Selected","ลบข้อความที่เลือก"}.
{"Delete User","ลบผู้ใช้"}.
{"Deliver event notifications","ส่งการแจ้งเตือนเหตุการณ์"}.
{"Deliver payloads with event notifications","ส่งส่วนของข้อมูล (payload) พร้อมกับการแจ้งเตือนเหตุการณ์"}.
{"Description:","รายละเอียด:"}.
{"Disc only copy","คัดลอกเฉพาะดิสก์"}.
{"Displayed Groups:","กลุ่มที่แสดง:"}.
{"Dump Backup to Text File at ","ถ่ายโอนการสำรองข้อมูลไปยังไฟล์ข้อความที่"}.
{"Dump to Text File","ถ่ายโอนข้อมูลไปยังไฟล์ข้อความ"}.
{"Edit Properties","แก้ไขคุณสมบัติ"}.
{"ejabberd IRC module","ejabberd IRC module"}.
{"ejabberd MUC module","ejabberd MUC module"}.
{"ejabberd Publish-Subscribe module","ejabberd Publish-Subscribe module"}.
{"ejabberd SOCKS5 Bytestreams module","ejabberd SOCKS5 Bytestreams module"}.
{"ejabberd vCard module","ejabberd vCard module"}.
{"Email","อีเมล"}.
{"Enable logging","เปิดใช้งานการบันทึก"}.
{"End User Session","สิ้นสุดเซสชันของผู้ใช้"}.
{"Enter list of {Module, [Options]}","ป้อนรายการของ {โมดูล, [ตัวเลือก]}"}.
{"Enter nickname you want to register","ป้อนชื่อเล่นที่คุณต้องการลงทะเบียน"}.
{"Enter path to backup file","ป้อนพาธเพื่อสำรองไฟล์ข้อมูล"}.
{"Enter path to jabberd14 spool dir","ป้อนพาธไปยัง jabberd14 spool dir"}.
{"Enter path to jabberd14 spool file","ป้อนพาธไปยังไฟล์เก็บพักข้อมูล jabberd14"}.
{"Enter path to text file","ป้อนพาธของไฟล์ข้อความ"}.
{"Erlang Jabber Server","Erlang Jabber Server"}.
{"Family Name","นามสกุล"}.
{"February","กุมภาพันธ์"}.
{"Fill in fields to search for any matching Jabber User","กรอกข้อมูลลงในฟิลด์เพื่อค้นหาผู้ใช้ Jabber ที่ตรงกัน"}.
{"Fill in the form to search for any matching Jabber User (Add * to the end of field to match substring)","กรอกข้อมูลในแบบฟอร์มเพื่อค้นหาผู้ใช้ Jabber ที่ตรงกัน (ใส่เครื่องหมาย * ที่ท้ายสุดของฟิลด์เพื่อจับคู่กับสตริงย่อย)"}.
{"Friday","วันศุกร์"}.
{"From","จาก"}.
{"From ~s","จาก ~s"}.
{"Full Name","ชื่อเต็ม"}.
{"Get Number of Online Users","แสดงจำนวนผู้ใช้ออนไลน์"}.
{"Get Number of Registered Users","แสดงจำนวนผู้ใช้ที่ลงทะเบียน"}.
{"Get User Last Login Time","แสดงเวลาเข้าสู่ระบบครั้งล่าสุดของผู้ใช้"}.
{"Get User Password","ขอรับรหัสผ่านของผู้ใช้"}.
{"Get User Statistics","แสดงสถิติของผู้ใช้"}.
{"Group ","กลุ่ม"}.
{"Groups","กลุ่ม"}.
{"has been banned","ถูกสั่งห้าม"}.
{"has been kicked","ถูกไล่ออก"}.
{" has set the subject to: "," ตั้งหัวข้อว่า: "}.
{"Host","โฮสต์"}.
{"Import Directory","อิมพอร์ตไดเร็กทอรี"}.
{"Import File","อิมพอร์ตไฟล์"}.
{"Import User from File at ","อิมพอร์ตผู้ใช้จากไฟล์ที่"}.
{"Import Users from Dir at ","อิมพอร์ตผู้ใช้จาก Dir ที่"}.
{"Import Users From jabberd14 Spool Files","อิมพอร์ตผู้ใช้จากไฟล์เก็บพักข้อมูล jabberd14"}.
{"Improper message type","ประเภทข้อความไม่เหมาะสม"}.
{"Incorrect password","รหัสผ่านไม่ถูกต้อง"}.
{"Invalid affiliation: ~s","การเข้าร่วมที่ไม่ถูกต้อง: ~s"}.
{"Invalid role: ~s","บทบาทไม่ถูกต้อง: ~s"}.
{"IP addresses","ที่อยู่ IP"}.
{"IRC Transport","การส่ง IRC"}.
{"IRC Username","ชื่อผู้ใช้ IRC"}.
{"is now known as","ซึ่งรู้จักกันในชื่อ"}.
{"It is not allowed to send private messages of type \"groupchat\"","ไม่อนุญาตให้ส่งข้อความส่วนตัวไปยัง \"กลุ่มสนทนา\""}.
{"It is not allowed to send private messages to the conference","ไม่อนุญาตให้ส่งข้อความส่วนตัวไปยังห้องประชุม"}.
{"Jabber ID","Jabber ID"}.
{"Jabber ID ~s is invalid","Jabber ID ~s ไม่ถูกต้อง"}.
{"January","มกราคม"}.
{"joins the room","เข้าห้องสนทนานี้"}.
{"July","กรกฎาคม"}.
{"June","มิถุนายน"}.
{"Last Activity","กิจกรรมล่าสุด"}.
{"Last login","การเข้าสู่ระบบครั้งล่าสุด"}.
{"Last month","เดือนที่แล้ว"}.
{"Last year","ปีที่แล้ว"}.
{"leaves the room","ออกจากห้อง"}.
{"Listened Ports","พอร์ทฟัง"}.
{"Listened Ports at ","พอร์ทฟังที่"}.
{"List of modules to start","รายการของโมดูลที่จะเริ่มการทำงาน"}.
{"Low level update script","อัพเดตสคริปต์ระดับต่ำ"}.
{"Make participants list public","สร้างรายการผู้เข้าร่วมสำหรับใช้งานโดยบุคคลทั่วไป"}.
{"Make room members-only","สร้างห้องสำหรับสมาชิกเท่านั้น"}.
{"Make room password protected","สร้างห้องที่มีการป้องกันด้วยรหัสผ่าน"}.
{"Make room persistent","สร้างเป็นห้องถาวร"}.
{"Make room public searchable","สร้างเป็นห้องที่บุคคลทั่วไปสามารถค้นหาได้"}.
{"March","มีนาคม"}.
{"Maximum Number of Occupants","จำนวนผู้ครอบครองห้องสูงสุด"}.
{"Max # of items to persist","จำนวนสูงสุดของรายการที่ยืนยัน"}.
{"Max payload size in bytes","ขนาดสูงสุดของส่วนของข้อมูล (payload) มีหน่วยเป็นไบต์"}.
{"May","พฤษภาคม"}.
{"Members:","สมาชิก:"}.
{"Memory","หน่วยความจำ"}.
{"Message body","เนื้อหาของข้อความ"}.
{"Middle Name","ชื่อกลาง"}.
{"Moderator privileges required","ต้องมีสิทธิพิเศษของผู้ดูแลการสนทนา"}.
{"moderators only","สำหรับผู้ดูแลการสนทนาเท่านั้น"}.
{"Module","โมดูล"}.
{"Modules","โมดูล"}.
{"Modules at ","โมดูลที่ "}.
{"Monday","วันจันทร์"}.
{"Name:","ชื่อ:"}.
{"Name","ชื่อ"}.
{"Never","ไม่เคย"}.
{"Nickname","ชื่อเล่น"}.
{"Nickname Registration at ","การลงทะเบียนชื่อเล่นที่ "}.
{"Nickname ~s does not exist in the room","ไม่มีชื่อเล่น ~s อยู่ในห้องนี้"}.
{"No body provided for announce message","ไม่ได้ป้อนเนื้อหาสำหรับข้อความที่ประกาศ"}.
{"No Data","ไม่มีข้อมูล"}.
{"Node ","โหนด "}.
{"Node ID","ID โหนด"}.
{"Node not found","ไม่พบโหนด"}.
{"Nodes","โหนด"}.
{"No limit","ไม่จำกัด"}.
{"None","ไม่มี"}.
{"No resource provided","ไม่ได้ระบุข้อมูล"}.
{"Notify subscribers when items are removed from the node","แจ้งเตือนผู้สมัครสมาชิกเมื่อรายการถูกลบออกจากโหนด"}.
{"Notify subscribers when the node configuration changes","แจ้งเตือนผู้สมัครสมาชิกเมื่อการกำหนดค่าโหนดเปลี่ยนแปลง"}.
{"Notify subscribers when the node is deleted","แจ้งเตือนผู้สมัครสมาชิกเมื่อโหนดถูกลบ"}.
{"November","พฤศจิกายน"}.
{"Number of occupants","จำนวนผู้ครอบครองห้อง"}.
{"Number of online users","จำนวนผู้ใช้ออนไลน์"}.
{"Number of registered users","จำนวนผู้ใช้ที่ลงทะเบียน"}.
{"October","ตุลาคม"}.
{"Offline Messages:","ข้อความออฟไลน์:"}.
{"Offline Messages","ข้อความออฟไลน์"}.
{"OK","ตกลง"}.
{"Online","ออนไลน์"}.
{"Online Users:","ผู้ใช้ออนไลน์:"}.
{"Online Users","ผู้ใช้ออนไลน์"}.
{"Only deliver notifications to available users","ส่งการแจ้งเตือนถึงผู้ใช้ที่สามารถติดต่อได้เท่านั้น"}.
{"Only occupants are allowed to send messages to the conference","ผู้ครอบครองห้องเท่านั้นที่ได้รับอนุญาตให้ส่งข้อความไปยังห้องประชุม"}.
{"Only occupants are allowed to send queries to the conference","ผู้ครอบครองห้องเท่านั้นที่ได้รับอนุญาตให้ส่งกระทู้ถามไปยังห้องประชุม"}.
{"Only service administrators are allowed to send service messages","ผู้ดูแลด้านการบริการเท่านั้นที่ได้รับอนุญาตให้ส่งข้อความการบริการ"}.
{"Options","ตัวเลือก"}.
{"Organization Name","ชื่อองค์กร"}.
{"Organization Unit","หน่วยขององค์กร"}.
{"Outgoing s2s Connections:","การเชื่อมต่อ s2s ขาออก:"}.
{"Outgoing s2s Connections","การเชื่อมต่อ s2s ขาออก"}.
{"Outgoing s2s Servers:","เซิร์ฟเวอร์ s2s ขาออก:"}.
{"Owner privileges required","ต้องมีสิทธิพิเศษของเจ้าของ"}.
{"Packet","แพ็กเก็ต"}.
{"Password:","รหัสผ่าน:"}.
{"Password","รหัสผ่าน"}.
{"Password Verification","การตรวจสอบรหัสผ่าน"}.
{"Path to Dir","พาธไปยัง Dir"}.
{"Path to File","พาธของไฟล์ข้อมูล"}.
{"Pending","ค้างอยู่"}.
{"Period: ","ระยะเวลา:"}.
{"Persist items to storage","ยืนยันรายการที่จะจัดเก็บ"}.
{"Ping","Ping"}.
{"Pong","Pong"}.
{"Port","พอร์ท"}.
{"Present real Jabber IDs to","แสดง Jabber IDs ที่ถูกต้องแก่"}.
{"private, ","ส่วนตัว, "}.
{"Publish-Subscribe","เผยแพร่-สมัครเข้าใช้งาน"}.
{"PubSub subscriber request","คำร้องขอของผู้สมัครเข้าใช้งาน PubSub"}.
{"Queries to the conference members are not allowed in this room","ห้องนี้ไม่อนุญาตให้ส่งกระทู้ถามถึงสมาชิกในห้องประชุม"}.
{"RAM and disc copy","คัดลอก RAM และดิสก์"}.
{"RAM copy","คัดลอก RAM"}.
{"Raw","ข้อมูลดิบ"}.
{"Really delete message of the day?","แน่ใจว่าต้องการลบข้อความของวันหรือไม่"}.
{"Recipient is not in the conference room","ผู้รับไม่ได้อยู่ในห้องประชุม"}.
{"Registered Users:","ผู้ใช้ที่ลงทะเบียน:"}.
{"Registered Users","ผู้ใช้ที่ลงทะเบียน"}.
{"Registration in mod_irc for ","การลงทะเบียนใน mod_irc สำหรับ"}.
{"Remote copy","คัดลอกระยะไกล"}.
{"Remove","ลบ"}.
{"Remove User","ลบผู้ใช้"}.
{"Replaced by new connection","แทนที่ด้วยการเชื่อมต่อใหม่"}.
{"Resources","ทรัพยากร"}.
{"Restart","เริ่มต้นใหม่"}.
{"Restart Service","เริ่มต้นการบริการใหม่อีกครั้ง"}.
{"Restore","การคืนค่า"}.
{"Restore Backup from File at ","คืนค่าการสำรองข้อมูลจากไฟล์ที่"}.
{"Restore binary backup after next ejabberd restart (requires less memory):","คืนค่าข้อมูลสำรองแบบไบนารีหลังจากที่ ejabberd ถัดไปเริ่มการทำงานใหม่ (ใช้หน่วยความจำน้อยลง):"}.
{"Restore binary backup immediately:","คืนค่าข้อมูลสำรองแบบไบนารีโดยทันที:"}.
{"Restore plain text backup immediately:","คืนค่าข้อมูลสำรองที่เป็นข้อความธรรมดาโดยทันที:"}.
{"Room Configuration","การกำหนดค่าห้องสนทนา"}.
{"Room creation is denied by service policy","การสร้างห้องสนทนาถูกปฏิเสธโดยนโยบายการบริการ"}.
{"Room title","ชื่อห้อง"}.
{"Roster","บัญชีรายชื่อ"}.
{"Roster of ","บัญชีรายชื่อของ "}.
{"Roster size","ขนาดของบัญชีรายชื่อ"}.
{"RPC Call Error","ข้อผิดพลาดจากการเรียกใช้ RPC"}.
{"Running Nodes","โหนดที่ทำงาน"}.
{"~s access rule configuration","~s การกำหนดค่ากฎการเข้าถึง"}.
{"Saturday","วันเสาร์"}.
{"Script check","ตรวจสอบคริปต์"}.
{"Search Results for ","ผลการค้นหาสำหรับ "}.
{"Search users in ","ค้นหาผู้ใช้ใน "}.
{"Send announcement to all online users","ส่งประกาศถึงผู้ใช้ออนไลน์ทั้งหมด"}.
{"Send announcement to all online users on all hosts","ส่งประกาศถึงผู้ใช้ออนไลน์ทั้งหมดบนโฮสต์ทั้งหมด"}.
{"Send announcement to all users","ส่งประกาศถึงผู้ใช้ทั้งหมด"}.
{"Send announcement to all users on all hosts","ส่งประกาศถึงผู้ใช้ทั้งหมดบนโฮสต์ทั้งหมด"}.
{"September","กันยายน"}.
{"Set message of the day and send to online users","ตั้งค่าข้อความของวันและส่งถึงผู้ใช้ออนไลน์"}.
{"Set message of the day on all hosts and send to online users","ตั้งค่าข้อความของวันบนโฮสต์ทั้งหมดและส่งถึงผู้ใช้ออนไลน์"}.
{"Shared Roster Groups","กลุ่มบัญชีรายชื่อที่ใช้งานร่วมกัน"}.
{"Show Integral Table","แสดงตารางรวม"}.
{"Show Ordinary Table","แสดงตารางทั่วไป"}.
{"Shut Down Service","ปิดการบริการ"}.
{"~s invites you to the room ~s","~s เชิญคุณเข้าร่วมสนทนาในห้อง ~s"}.
{"Specify the access model","ระบุโมเดลการเข้าถึง"}.
{"Specify the publisher model","ระบุโมเดลผู้เผยแพร่"}.
{"~s's Offline Messages Queue","~s's ลำดับข้อความออฟไลน์"}.
{"Start","เริ่ม"}.
{"Start Modules","เริ่มโมดูล"}.
{"Start Modules at ","เริ่มโมดูลที่"}.
{"Statistics","สถิติ"}.
{"Statistics of ~p","สถิติของ ~p"}.
{"Stop","หยุด"}.
{"Stop Modules","หยุดโมดูล"}.
{"Stop Modules at ","หยุดโมดูลที่"}.
{"Stopped Nodes","โหนดที่หยุด"}.
{"Storage Type","ชนิดที่เก็บข้อมูล"}.
{"Store binary backup:","จัดเก็บข้อมูลสำรองแบบไบนารี:"}.
{"Store plain text backup:","จัดเก็บข้อมูลสำรองที่เป็นข้อความธรรมดา:"}.
{"Subject","หัวเรื่อง"}.
{"Submit","ส่ง"}.
{"Submitted","ส่งแล้ว"}.
{"Subscriber Address","ที่อยู่ของผู้สมัคร"}.
{"Subscription","การสมัครสมาชิก"}.
{"Sunday","วันอาทิตย์"}.
{"the password is","รหัสผ่านคือ"}.
{"This room is not anonymous","ห้องนี้ไม่ปิดบังชื่อ"}.
{"Thursday","วันพฤหัสบดี"}.
{"Time","เวลา"}.
{"Time delay","การหน่วงเวลา"}.
{"To","ถึง"}.
{"To ~s","ถึง ~s"}.
{"Traffic rate limit is exceeded","อัตราของปริมาณการเข้าใช้เกินขีดจำกัด"}.
{"Transactions Aborted:","ทรานแซกชันที่ถูกยกเลิก:"}.
{"Transactions Committed:","ทรานแซกชันที่ได้รับมอบหมาย:"}.
{"Transactions Logged:","ทรานแซกชันที่บันทึก:"}.
{"Transactions Restarted:","ทรานแซกชันที่เริ่มทำงานใหม่อีกครั้ง:"}.
{"Tuesday","วันอังคาร"}.
{"Update ","อัพเดต "}.
{"Update","อัพเดต"}.
{"Update message of the day (don't send)","อัพเดตข้อความของวัน (ไม่ต้องส่ง)"}.
{"Update message of the day on all hosts (don't send)","อัพเดตข้อความของวันบนโฮสต์ทั้งหมด (ไม่ต้องส่ง) "}.
{"Update plan","แผนการอัพเดต"}.
{"Update script","อัพเดตสคริปต์"}.
{"Uptime:","เวลาการทำงานต่อเนื่อง:"}.
{"Use of STARTTLS required","ต้องใช้ STARTTLS"}.
{"User ","ผู้ใช้"}.
{"User","ผู้ใช้"}.
{"User Management","การจัดการผู้ใช้"}.
{"Users","ผู้ใช้"}.
{"Users Last Activity","กิจกรรมล่าสุดของผู้ใช้"}.
{"Validate","ตรวจสอบ"}.
{"vCard User Search","ค้นหาผู้ใช้ vCard "}.
{"Virtual Hosts","โฮสต์เสมือน"}.
{"Visitors are not allowed to send messages to all occupants","ผู้เยี่ยมเยือนไม่ได้รับอนุญาตให้ส่งข้อความถึงผู้ครอบครองห้องทั้งหมด"}.
{"Wednesday","วันพุธ"}.
{"When to send the last published item","เวลาที่ส่งรายการที่เผยแพร่ครั้งล่าสุด"}.
{"Whether to allow subscriptions","อนุญาตให้เข้าร่วมเป็นสมาชิกหรือไม่"}.
{"You have been banned from this room","คุณถูกสั่งห้ามไมให้เข้าห้องนี้"}.
{"You must fill in field \"Nickname\" in the form","คุณต้องกรอกฟิลด์ \"Nickname\" ในแบบฟอร์ม"}.
{"You need an x:data capable client to configure mod_irc settings","คุณต้องใช้ไคลเอ็นต์ที่รองรับ x:data เพื่อกำหนดการตั้งค่า mod_irc"}.
{"You need an x:data capable client to configure room","คุณต้องใช้ไคลเอ็นต์ที่รองรับ x:data เพื่อกำหนดค่าห้องสนทนา "}.
{"You need an x:data capable client to search","คุณต้องใช้ไคลเอ็นต์ที่รองรับ x:data เพื่อค้นหา"}.
{"Your contact offline message queue is full. The message has been discarded.","ลำดับข้อความออฟไลน์ของผู้ที่ติดต่อของคุณเต็มแล้ว ข้อความถูกลบทิ้งแล้ว"}.
ejabberd-2.1.11/src/msgs/es.po 0000664 0000000 0000000 00000156325 12240230175 012741 0 ustar # translation of es.po to
# Badlop , 2009.
msgid ""
msgstr ""
"Project-Id-Version: es\n"
"POT-Creation-Date: \n"
"PO-Revision-Date: 2012-04-15 00:10+0100\n"
"Last-Translator: Badlop \n"
"Language-Team: \n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Language: Spanish (castellano)\n"
"X-Generator: KBabel 1.11.4\n"
#: ejabberd_c2s.erl:424 ejabberd_c2s.erl:727
msgid "Use of STARTTLS required"
msgstr "Es obligatorio usar STARTTLS"
#: ejabberd_c2s.erl:503
msgid "No resource provided"
msgstr "No se ha proporcionado recurso"
#: ejabberd_c2s.erl:1197
msgid "Replaced by new connection"
msgstr "Reemplazado por una nueva conexión"
#: ejabberd_c2s.erl:1885
msgid "Your active privacy list has denied the routing of this stanza."
msgstr "Tu lista de privacidad activa ha denegado el encío de este paquete."
#: ejabberd_captcha.erl:96 ejabberd_captcha.erl:152 ejabberd_captcha.erl:178
msgid "Enter the text you see"
msgstr "Teclea el texto que ves"
#: ejabberd_captcha.erl:101
msgid "Your messages to ~s are being blocked. To unblock them, visit ~s"
msgstr ""
"Tus mensajes a ~s están siendo bloqueados. Para desbloquearlos, visita ~s"
#: ejabberd_captcha.erl:134
msgid "If you don't see the CAPTCHA image here, visit the web page."
msgstr "Si no ves la imagen CAPTCHA aquí, visita la página web."
#: ejabberd_captcha.erl:146
msgid "CAPTCHA web page"
msgstr "Página web de CAPTCHA"
#: ejabberd_captcha.erl:307
msgid "The CAPTCHA is valid."
msgstr "El CAPTCHA es válido."
#: mod_adhoc.erl:95 mod_adhoc.erl:125 mod_adhoc.erl:143 mod_adhoc.erl:161
msgid "Commands"
msgstr "Comandos"
#: mod_adhoc.erl:149 mod_adhoc.erl:243
msgid "Ping"
msgstr "Ping"
#: mod_adhoc.erl:260
msgid "Pong"
msgstr "Pong"
#: mod_announce.erl:507 mod_announce_odbc.erl:499
msgid "Really delete message of the day?"
msgstr "¿Está seguro de quere borrar el mensaje del dia?"
#: mod_announce.erl:515 mod_announce_odbc.erl:507 mod_configure.erl:1083
#: mod_configure.erl:1128
msgid "Subject"
msgstr "Asunto"
#: mod_announce.erl:520 mod_announce_odbc.erl:512 mod_configure.erl:1088
#: mod_configure.erl:1133
msgid "Message body"
msgstr "Cuerpo del mensaje"
#: mod_announce.erl:600 mod_announce_odbc.erl:592
msgid "No body provided for announce message"
msgstr "No se ha proporcionado cuerpo de mensaje para el anuncio"
#: mod_announce.erl:635 mod_announce_odbc.erl:627
msgid "Announcements"
msgstr "Anuncios"
#: mod_announce.erl:637 mod_announce_odbc.erl:629
msgid "Send announcement to all users"
msgstr "Enviar anuncio a todos los usuarios"
#: mod_announce.erl:639 mod_announce_odbc.erl:631
msgid "Send announcement to all users on all hosts"
msgstr "Enviar anuncio a todos los usuarios en todos los dominios"
#: mod_announce.erl:641 mod_announce_odbc.erl:633
msgid "Send announcement to all online users"
msgstr "Enviar anuncio a todos los usuarios conectados"
#: mod_announce.erl:643 mod_announce_odbc.erl:635 mod_configure.erl:1078
#: mod_configure.erl:1123
msgid "Send announcement to all online users on all hosts"
msgstr "Enviar anuncio a todos los usuarios conectados en todos los dominios"
#: mod_announce.erl:645 mod_announce_odbc.erl:637
msgid "Set message of the day and send to online users"
msgstr "Poner mensaje del dia y enviar a todos los usuarios conectados"
#: mod_announce.erl:647 mod_announce_odbc.erl:639
msgid "Set message of the day on all hosts and send to online users"
msgstr ""
"Poner mensaje del día en todos los dominios y enviar a los usuarios "
"conectados"
#: mod_announce.erl:649 mod_announce_odbc.erl:641
msgid "Update message of the day (don't send)"
msgstr "Actualizar mensaje del dia, pero no enviarlo"
#: mod_announce.erl:651 mod_announce_odbc.erl:643
msgid "Update message of the day on all hosts (don't send)"
msgstr "Actualizar el mensaje del día en todos los dominos (pero no enviarlo)"
#: mod_announce.erl:653 mod_announce_odbc.erl:645
msgid "Delete message of the day"
msgstr "Borrar mensaje del dia"
#: mod_announce.erl:655 mod_announce_odbc.erl:647
msgid "Delete message of the day on all hosts"
msgstr "Borrar el mensaje del día en todos los dominios"
#: mod_configure.erl:114 mod_configure.erl:274 mod_configure.erl:296
#: mod_configure.erl:498
msgid "Configuration"
msgstr "Configuración"
#: mod_configure.erl:125 mod_configure.erl:576 web/ejabberd_web_admin.erl:1936
msgid "Database"
msgstr "Base de datos"
#: mod_configure.erl:127 mod_configure.erl:595
msgid "Start Modules"
msgstr "Iniciar módulos"
#: mod_configure.erl:129 mod_configure.erl:596
msgid "Stop Modules"
msgstr "Detener módulos"
#: mod_configure.erl:131 mod_configure.erl:604 web/ejabberd_web_admin.erl:1937
msgid "Backup"
msgstr "Guardar copia de seguridad"
#: mod_configure.erl:133 mod_configure.erl:605
msgid "Restore"
msgstr "Restaurar"
#: mod_configure.erl:135 mod_configure.erl:606
msgid "Dump to Text File"
msgstr "Exportar a fichero de texto"
#: mod_configure.erl:137 mod_configure.erl:615
msgid "Import File"
msgstr "Importar fichero"
#: mod_configure.erl:139 mod_configure.erl:616
msgid "Import Directory"
msgstr "Importar directorio"
#: mod_configure.erl:141 mod_configure.erl:581 mod_configure.erl:1057
msgid "Restart Service"
msgstr "Reiniciar el servicio"
#: mod_configure.erl:143 mod_configure.erl:582 mod_configure.erl:1102
msgid "Shut Down Service"
msgstr "Detener el servicio"
#: mod_configure.erl:145 mod_configure.erl:518 mod_configure.erl:1197
#: web/ejabberd_web_admin.erl:1527
msgid "Add User"
msgstr "Añadir usuario"
#: mod_configure.erl:147 mod_configure.erl:519 mod_configure.erl:1219
msgid "Delete User"
msgstr "Borrar usuario"
#: mod_configure.erl:149 mod_configure.erl:520 mod_configure.erl:1231
msgid "End User Session"
msgstr "Cerrar sesión de usuario"
#: mod_configure.erl:151 mod_configure.erl:521 mod_configure.erl:1243
#: mod_configure.erl:1255
msgid "Get User Password"
msgstr "Ver contraseña de usuario"
#: mod_configure.erl:153 mod_configure.erl:522
msgid "Change User Password"
msgstr "Cambiar contraseña de usuario"
#: mod_configure.erl:155 mod_configure.erl:523 mod_configure.erl:1272
msgid "Get User Last Login Time"
msgstr "Ver fecha de la última conexión de usuario"
#: mod_configure.erl:157 mod_configure.erl:524 mod_configure.erl:1284
msgid "Get User Statistics"
msgstr "Ver estadísticas de usuario"
#: mod_configure.erl:159 mod_configure.erl:525
msgid "Get Number of Registered Users"
msgstr "Ver número de usuarios registrados"
#: mod_configure.erl:161 mod_configure.erl:526
msgid "Get Number of Online Users"
msgstr "Ver número de usuarios conectados"
#: mod_configure.erl:163 mod_configure.erl:509 web/ejabberd_web_admin.erl:831
#: web/ejabberd_web_admin.erl:872
msgid "Access Control Lists"
msgstr "Listas de Control de Acceso"
#: mod_configure.erl:165 mod_configure.erl:510 web/ejabberd_web_admin.erl:940
#: web/ejabberd_web_admin.erl:976
msgid "Access Rules"
msgstr "Reglas de Acceso"
#: mod_configure.erl:297 mod_configure.erl:499
msgid "User Management"
msgstr "Administración de usuarios"
#: mod_configure.erl:500 web/ejabberd_web_admin.erl:1058
#: web/ejabberd_web_admin.erl:1462
msgid "Online Users"
msgstr "Usuarios conectados"
#: mod_configure.erl:501
msgid "All Users"
msgstr "Todos los usuarios"
#: mod_configure.erl:502
msgid "Outgoing s2s Connections"
msgstr "Conexiones S2S salientes"
#: mod_configure.erl:503 web/ejabberd_web_admin.erl:1907
msgid "Running Nodes"
msgstr "Nodos funcionando"
#: mod_configure.erl:504 web/ejabberd_web_admin.erl:1909
msgid "Stopped Nodes"
msgstr "Nodos detenidos"
#: mod_configure.erl:577 mod_configure.erl:587 web/ejabberd_web_admin.erl:1953
msgid "Modules"
msgstr "Módulos"
#: mod_configure.erl:578
msgid "Backup Management"
msgstr "Gestión de copia de seguridad"
#: mod_configure.erl:579
msgid "Import Users From jabberd14 Spool Files"
msgstr "Importar usuarios de ficheros spool de jabberd-1.4"
#: mod_configure.erl:699
msgid "To ~s"
msgstr "A ~s"
#: mod_configure.erl:717
msgid "From ~s"
msgstr "De ~s"
#: mod_configure.erl:913
msgid "Database Tables Configuration at "
msgstr "Configuración de tablas de la base de datos en "
#: mod_configure.erl:918
msgid "Choose storage type of tables"
msgstr "Selecciona tipo de almacenamiento de las tablas"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "Disc only copy"
msgstr "Copia en disco solamente"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "RAM and disc copy"
msgstr "Copia en RAM y disco"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "RAM copy"
msgstr "Copia en RAM"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "Remote copy"
msgstr "Copia remota"
#: mod_configure.erl:950
msgid "Stop Modules at "
msgstr "Detener módulos en "
#: mod_configure.erl:954
msgid "Choose modules to stop"
msgstr "Selecciona módulos a detener"
#: mod_configure.erl:969
msgid "Start Modules at "
msgstr "Iniciar módulos en "
#: mod_configure.erl:973
msgid "Enter list of {Module, [Options]}"
msgstr "Introduce lista de {módulo, [opciones]}"
#: mod_configure.erl:974
msgid "List of modules to start"
msgstr "Lista de módulos a iniciar"
#: mod_configure.erl:983
msgid "Backup to File at "
msgstr "Guardar copia de seguridad en fichero en "
#: mod_configure.erl:987 mod_configure.erl:1001
msgid "Enter path to backup file"
msgstr "Introduce ruta al fichero de copia de seguridad"
#: mod_configure.erl:988 mod_configure.erl:1002 mod_configure.erl:1016
#: mod_configure.erl:1030
msgid "Path to File"
msgstr "Ruta al fichero"
#: mod_configure.erl:997
msgid "Restore Backup from File at "
msgstr "Restaura copia de seguridad desde el fichero en "
#: mod_configure.erl:1011
msgid "Dump Backup to Text File at "
msgstr "Exporta copia de seguridad a fichero de texto en "
#: mod_configure.erl:1015
msgid "Enter path to text file"
msgstr "Introduce ruta al fichero de texto"
#: mod_configure.erl:1025
msgid "Import User from File at "
msgstr "Importa usuario desde fichero en "
#: mod_configure.erl:1029
msgid "Enter path to jabberd14 spool file"
msgstr "Introduce ruta al fichero jabberd14 spool"
#: mod_configure.erl:1039
msgid "Import Users from Dir at "
msgstr "Importar usuarios desde el directorio en "
#: mod_configure.erl:1043
msgid "Enter path to jabberd14 spool dir"
msgstr "Introduce la ruta al directorio de jabberd14 spools"
#: mod_configure.erl:1044
msgid "Path to Dir"
msgstr "Ruta al directorio"
#: mod_configure.erl:1060 mod_configure.erl:1105
msgid "Time delay"
msgstr "Retraso temporal"
#: mod_configure.erl:1143
msgid "Access Control List Configuration"
msgstr "Configuración de la Lista de Control de Acceso"
#: mod_configure.erl:1147
msgid "Access control lists"
msgstr "Listas de Control de Acceso"
#: mod_configure.erl:1171
msgid "Access Configuration"
msgstr "Configuración de accesos"
#: mod_configure.erl:1175
msgid "Access rules"
msgstr "Reglas de acceso"
#: mod_configure.erl:1200 mod_configure.erl:1222 mod_configure.erl:1234
#: mod_configure.erl:1246 mod_configure.erl:1258 mod_configure.erl:1275
#: mod_configure.erl:1287 mod_configure.erl:1650 mod_configure.erl:1700
#: mod_configure.erl:1721 mod_roster.erl:943 mod_roster_odbc.erl:1060
#: mod_vcard.erl:472 mod_vcard_ldap.erl:554 mod_vcard_odbc.erl:448
msgid "Jabber ID"
msgstr "Jabber ID"
#: mod_configure.erl:1205 mod_configure.erl:1263 mod_configure.erl:1651
#: mod_configure.erl:1863 mod_muc/mod_muc_room.erl:3224 mod_register.erl:235
#: web/ejabberd_web_admin.erl:1520
msgid "Password"
msgstr "Contraseña"
#: mod_configure.erl:1210
msgid "Password Verification"
msgstr "Verificación de la contraseña"
#: mod_configure.erl:1301
msgid "Number of registered users"
msgstr "Número de usuarios registrados"
#: mod_configure.erl:1315
msgid "Number of online users"
msgstr "Número de usuarios conectados"
#: mod_configure.erl:1682 web/ejabberd_web_admin.erl:1588
#: web/ejabberd_web_admin.erl:1743
msgid "Never"
msgstr "Nunca"
#: mod_configure.erl:1696 web/ejabberd_web_admin.erl:1601
#: web/ejabberd_web_admin.erl:1756
msgid "Online"
msgstr "Conectado"
#: mod_configure.erl:1701
msgid "Last login"
msgstr "Última conexión"
#: mod_configure.erl:1722
msgid "Roster size"
msgstr "Tamaño de la lista de contactos"
#: mod_configure.erl:1723
msgid "IP addresses"
msgstr "Direcciones IP"
#: mod_configure.erl:1724
msgid "Resources"
msgstr "Recursos"
#: mod_configure.erl:1850
msgid "Administration of "
msgstr "Administración de "
#: mod_configure.erl:1853
msgid "Action on user"
msgstr "Acción en el usuario"
#: mod_configure.erl:1857
msgid "Edit Properties"
msgstr "Editar propiedades"
#: mod_configure.erl:1860 web/ejabberd_web_admin.erl:1769
msgid "Remove User"
msgstr "Eliminar usuario"
#: mod_irc/mod_irc.erl:201 mod_irc/mod_irc_odbc.erl:196
#: mod_muc/mod_muc.erl:336 mod_muc/mod_muc_odbc.erl:342
msgid "Access denied by service policy"
msgstr "Acceso denegado por la política del servicio"
#: mod_irc/mod_irc.erl:401 mod_irc/mod_irc_odbc.erl:398
msgid "IRC Transport"
msgstr "Transporte de IRC"
#: mod_irc/mod_irc.erl:428 mod_irc/mod_irc_odbc.erl:425
msgid "ejabberd IRC module"
msgstr "Módulo de IRC para ejabberd"
#: mod_irc/mod_irc.erl:559 mod_irc/mod_irc_odbc.erl:568
msgid "You need an x:data capable client to configure mod_irc settings"
msgstr ""
"Necesitas un cliente con soporte de x:data para configurar las opciones de "
"mod_irc"
#: mod_irc/mod_irc.erl:566 mod_irc/mod_irc_odbc.erl:575
msgid "Registration in mod_irc for "
msgstr "Registro en mod_irc para"
#: mod_irc/mod_irc.erl:571 mod_irc/mod_irc_odbc.erl:580
msgid ""
"Enter username, encodings, ports and passwords you wish to use for "
"connecting to IRC servers"
msgstr ""
"Introduce el nombre de usuario, codificaciones de carácteres, puertos y "
"contraseñas que quieras usar al conectar en los servidores de IRC"
#: mod_irc/mod_irc.erl:576 mod_irc/mod_irc_odbc.erl:585
msgid "IRC Username"
msgstr "Nombre de usuario en IRC"
#: mod_irc/mod_irc.erl:586 mod_irc/mod_irc_odbc.erl:595
msgid ""
"If you want to specify different ports, passwords, encodings for IRC "
"servers, fill this list with values in format '{\"irc server\", \"encoding"
"\", port, \"password\"}'. By default this service use \"~s\" encoding, port "
"~p, empty password."
msgstr ""
"Si quieres especificar distintos codificaciones de carácteres, contraseñas o "
"puertos para cada servidor IRC rellena esta lista con valores en el formato "
"'{\"servidor irc\", \"codificación\", \"puerto\", \"contrasela\"}'. Este "
"servicio usa por defecto la codificación \"~s\", puerto ~p, sin contraseña."
#: mod_irc/mod_irc.erl:598 mod_irc/mod_irc_odbc.erl:607
msgid ""
"Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef."
"net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."
msgstr ""
"Ejemplo: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef."
"net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."
#: mod_irc/mod_irc.erl:603 mod_irc/mod_irc_odbc.erl:612
msgid "Connections parameters"
msgstr "Parámetros de conexiones"
#: mod_irc/mod_irc.erl:728 mod_irc/mod_irc_odbc.erl:757
msgid "Join IRC channel"
msgstr "Entrar en canal IRC"
#: mod_irc/mod_irc.erl:732 mod_irc/mod_irc_odbc.erl:761
msgid "IRC channel (don't put the first #)"
msgstr "Canal IRC (no pongas el # del principio)"
#: mod_irc/mod_irc.erl:737 mod_irc/mod_irc_odbc.erl:766
msgid "IRC server"
msgstr "Servidor IRC"
#: mod_irc/mod_irc.erl:770 mod_irc/mod_irc.erl:774
#: mod_irc/mod_irc_odbc.erl:799 mod_irc/mod_irc_odbc.erl:803
msgid "Join the IRC channel here."
msgstr "Entrar en el canal de IRC aquí"
#: mod_irc/mod_irc.erl:778 mod_irc/mod_irc_odbc.erl:807
msgid "Join the IRC channel in this Jabber ID: ~s"
msgstr "Entra en el canal de IRC en esta dirección Jabber: ~s"
#: mod_irc/mod_irc.erl:863 mod_irc/mod_irc_odbc.erl:904
msgid "IRC settings"
msgstr "Opciones de IRC"
#: mod_irc/mod_irc.erl:868 mod_irc/mod_irc_odbc.erl:909
msgid ""
"Enter username and encodings you wish to use for connecting to IRC servers. "
"Press 'Next' to get more fields to fill in. Press 'Complete' to save "
"settings."
msgstr ""
"Introduce el nombre de usuario y codificaciones de carácteres que quieras "
"usar al conectar en los servidores de IRC. Pulsa Siguiente para conseguir "
"más campos en el formulario. Pulsa Completar para guardar las opciones."
#: mod_irc/mod_irc.erl:874 mod_irc/mod_irc_odbc.erl:915
msgid "IRC username"
msgstr "Nombre de usuario en IRC"
#: mod_irc/mod_irc.erl:923 mod_irc/mod_irc_odbc.erl:964
msgid "Password ~b"
msgstr "Contraseña ~b"
#: mod_irc/mod_irc.erl:928 mod_irc/mod_irc_odbc.erl:969
msgid "Port ~b"
msgstr "Puerto ~b"
#: mod_irc/mod_irc.erl:933 mod_irc/mod_irc_odbc.erl:974
msgid "Encoding for server ~b"
msgstr "Codificación del servidor ~b"
#: mod_irc/mod_irc.erl:942 mod_irc/mod_irc_odbc.erl:983
msgid "Server ~b"
msgstr "Servidor ~b"
#: mod_muc/mod_muc.erl:449 mod_muc/mod_muc_odbc.erl:456
msgid "Only service administrators are allowed to send service messages"
msgstr ""
"Solo los administradores del servicio tienen permiso para enviar mensajes de "
"servicio"
#: mod_muc/mod_muc.erl:493 mod_muc/mod_muc_odbc.erl:500
msgid "Room creation is denied by service policy"
msgstr "Se te ha denegado crear la sala por política del servicio"
#: mod_muc/mod_muc.erl:500 mod_muc/mod_muc_odbc.erl:507
msgid "Conference room does not exist"
msgstr "La sala de conferencias no existe"
#: mod_muc/mod_muc.erl:582 mod_muc/mod_muc_odbc.erl:595
msgid "Chatrooms"
msgstr "Salas de charla"
#: mod_muc/mod_muc.erl:712 mod_muc/mod_muc_odbc.erl:729
msgid "You need a client that supports x:data to register the nickname"
msgstr ""
"Necesitas un cliente con soporte de x:data para poder registrar el apodo"
#: mod_muc/mod_muc.erl:718 mod_muc/mod_muc_odbc.erl:735
msgid "Nickname Registration at "
msgstr "Registro del apodo en "
#: mod_muc/mod_muc.erl:722 mod_muc/mod_muc_odbc.erl:739
msgid "Enter nickname you want to register"
msgstr "Introduce el apodo que quieras registrar"
#: mod_muc/mod_muc.erl:723 mod_muc/mod_muc_odbc.erl:740
#: mod_muc/mod_muc_room.erl:3810 mod_roster.erl:944 mod_roster_odbc.erl:1061
#: mod_vcard.erl:364 mod_vcard.erl:477 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:453
msgid "Nickname"
msgstr "Apodo"
#: mod_muc/mod_muc.erl:762 mod_muc/mod_muc_odbc.erl:784
#: mod_muc/mod_muc_room.erl:1064 mod_muc/mod_muc_room.erl:1787
msgid "That nickname is registered by another person"
msgstr "El apodo ya está registrado por otra persona"
#: mod_muc/mod_muc.erl:788 mod_muc/mod_muc_odbc.erl:811
msgid "You must fill in field \"Nickname\" in the form"
msgstr "Debes rellenar el campo \"Apodo\" en el formulario"
#: mod_muc/mod_muc.erl:808 mod_muc/mod_muc_odbc.erl:831
msgid "ejabberd MUC module"
msgstr "Módulo de MUC para ejabberd"
#: mod_muc/mod_muc_log.erl:374 mod_muc/mod_muc_log.erl:381
msgid "Chatroom configuration modified"
msgstr "Configuración de la sala modificada"
#: mod_muc/mod_muc_log.erl:384
msgid "joins the room"
msgstr "entra en la sala"
#: mod_muc/mod_muc_log.erl:387 mod_muc/mod_muc_log.erl:390
msgid "leaves the room"
msgstr "sale de la sala"
#: mod_muc/mod_muc_log.erl:393 mod_muc/mod_muc_log.erl:396
msgid "has been banned"
msgstr "ha sido bloqueado"
#: mod_muc/mod_muc_log.erl:399 mod_muc/mod_muc_log.erl:402
msgid "has been kicked"
msgstr "ha sido expulsado"
#: mod_muc/mod_muc_log.erl:405
msgid "has been kicked because of an affiliation change"
msgstr "ha sido expulsado por un cambio de su afiliación"
#: mod_muc/mod_muc_log.erl:408
msgid "has been kicked because the room has been changed to members-only"
msgstr "ha sido expulsado porque la sala es ahora solo para miembros"
#: mod_muc/mod_muc_log.erl:411
msgid "has been kicked because of a system shutdown"
msgstr "ha sido expulsado porque el sistema se va a detener"
#: mod_muc/mod_muc_log.erl:414
msgid "is now known as"
msgstr "se cambia el nombre a"
#: mod_muc/mod_muc_log.erl:417 mod_muc/mod_muc_log.erl:688
#: mod_muc/mod_muc_room.erl:2393
msgid " has set the subject to: "
msgstr " ha puesto el asunto: "
#: mod_muc/mod_muc_log.erl:452
msgid "Chatroom is created"
msgstr "Se ha creado la sala"
#: mod_muc/mod_muc_log.erl:453
msgid "Chatroom is destroyed"
msgstr "Se ha destruido la sala"
#: mod_muc/mod_muc_log.erl:454
msgid "Chatroom is started"
msgstr "Se ha iniciado la sala"
#: mod_muc/mod_muc_log.erl:455
msgid "Chatroom is stopped"
msgstr "Se ha detenido la sala"
#: mod_muc/mod_muc_log.erl:459
msgid "Monday"
msgstr "lunes"
#: mod_muc/mod_muc_log.erl:460
msgid "Tuesday"
msgstr "martes"
#: mod_muc/mod_muc_log.erl:461
msgid "Wednesday"
msgstr "miércoles"
#: mod_muc/mod_muc_log.erl:462
msgid "Thursday"
msgstr "jueves"
#: mod_muc/mod_muc_log.erl:463
msgid "Friday"
msgstr "viernes"
#: mod_muc/mod_muc_log.erl:464
msgid "Saturday"
msgstr "sábado"
#: mod_muc/mod_muc_log.erl:465
msgid "Sunday"
msgstr "domingo"
#: mod_muc/mod_muc_log.erl:469
msgid "January"
msgstr "enero"
#: mod_muc/mod_muc_log.erl:470
msgid "February"
msgstr "febrero"
#: mod_muc/mod_muc_log.erl:471
msgid "March"
msgstr "marzo"
#: mod_muc/mod_muc_log.erl:472
msgid "April"
msgstr "abril"
#: mod_muc/mod_muc_log.erl:473
msgid "May"
msgstr "mayo"
#: mod_muc/mod_muc_log.erl:474
msgid "June"
msgstr "junio"
#: mod_muc/mod_muc_log.erl:475
msgid "July"
msgstr "julio"
#: mod_muc/mod_muc_log.erl:476
msgid "August"
msgstr "agosto"
#: mod_muc/mod_muc_log.erl:477
msgid "September"
msgstr "septiembre"
#: mod_muc/mod_muc_log.erl:478
msgid "October"
msgstr "octubre"
#: mod_muc/mod_muc_log.erl:479
msgid "November"
msgstr "noviembre"
#: mod_muc/mod_muc_log.erl:480
msgid "December"
msgstr "diciembre"
#: mod_muc/mod_muc_log.erl:750
msgid "Room Configuration"
msgstr "Configuración de la sala"
#: mod_muc/mod_muc_log.erl:759
msgid "Room Occupants"
msgstr "Ocupantes de la sala"
#: mod_muc/mod_muc_room.erl:174
msgid "Traffic rate limit is exceeded"
msgstr "Se ha exedido el límite de tráfico"
#: mod_muc/mod_muc_room.erl:246
msgid ""
"This participant is kicked from the room because he sent an error message"
msgstr ""
"Este participante ha sido expulsado de la sala porque envió un mensaje de "
"error"
#: mod_muc/mod_muc_room.erl:255
msgid "It is not allowed to send private messages to the conference"
msgstr "Impedir el envio de mensajes privados a la sala"
#: mod_muc/mod_muc_room.erl:332
msgid "Please, wait for a while before sending new voice request"
msgstr "Por favor, espera un poco antes de enviar otra petición de voz"
#: mod_muc/mod_muc_room.erl:347
msgid "Voice requests are disabled in this conference"
msgstr "Las peticiones de voz están desactivadas en esta sala"
#: mod_muc/mod_muc_room.erl:364
msgid "Failed to extract JID from your voice request approval"
msgstr "Fallo al extraer el Jabber ID de tu aprobación de petición de voz"
#: mod_muc/mod_muc_room.erl:393
msgid "Only moderators can approve voice requests"
msgstr "Solo los moderadores pueden aprobar peticiones de voz"
#: mod_muc/mod_muc_room.erl:408
msgid "Improper message type"
msgstr "Tipo de mensaje incorrecto"
#: mod_muc/mod_muc_room.erl:518
msgid ""
"This participant is kicked from the room because he sent an error message to "
"another participant"
msgstr ""
"Este participante ha sido expulsado de la sala porque envió un mensaje de "
"error a otro participante"
#: mod_muc/mod_muc_room.erl:531
msgid "It is not allowed to send private messages of type \"groupchat\""
msgstr "No está permitido enviar mensajes privados del tipo \"groupchat\""
#: mod_muc/mod_muc_room.erl:543 mod_muc/mod_muc_room.erl:611
msgid "Recipient is not in the conference room"
msgstr "El receptor no está en la sala de conferencia"
#: mod_muc/mod_muc_room.erl:564 mod_muc/mod_muc_room.erl:585
msgid "It is not allowed to send private messages"
msgstr "No está permitido enviar mensajes privados"
#: mod_muc/mod_muc_room.erl:576 mod_muc/mod_muc_room.erl:956
#: mod_muc/mod_muc_room.erl:4040
msgid "Only occupants are allowed to send messages to the conference"
msgstr "Solo los ocupantes pueden enviar mensajes a la sala"
#: mod_muc/mod_muc_room.erl:634
msgid "Only occupants are allowed to send queries to the conference"
msgstr "Solo los ocupantes pueden enviar solicitudes a la sala"
#: mod_muc/mod_muc_room.erl:646
msgid "Queries to the conference members are not allowed in this room"
msgstr "En esta sala no se permiten solicitudes a los miembros de la sala"
#: mod_muc/mod_muc_room.erl:932
msgid ""
"Only moderators and participants are allowed to change the subject in this "
"room"
msgstr ""
"Solo los moderadores y participantes pueden cambiar el asunto de esta sala"
#: mod_muc/mod_muc_room.erl:937
msgid "Only moderators are allowed to change the subject in this room"
msgstr "Solo los moderadores pueden cambiar el asunto de esta sala"
#: mod_muc/mod_muc_room.erl:947
msgid "Visitors are not allowed to send messages to all occupants"
msgstr "Los visitantes no pueden enviar mensajes a todos los ocupantes"
#: mod_muc/mod_muc_room.erl:1021
msgid ""
"This participant is kicked from the room because he sent an error presence"
msgstr ""
"Este participante ha sido expulsado de la sala porque envió una presencia de "
"error"
#: mod_muc/mod_muc_room.erl:1040
msgid "Visitors are not allowed to change their nicknames in this room"
msgstr "Los visitantes no tienen permitido cambiar sus apodos en esta sala"
#: mod_muc/mod_muc_room.erl:1053 mod_muc/mod_muc_room.erl:1779
msgid "That nickname is already in use by another occupant"
msgstr "Ese apodo ya está siendo usado por otro ocupante"
#: mod_muc/mod_muc_room.erl:1768
msgid "You have been banned from this room"
msgstr "Has sido bloqueado en esta sala"
#: mod_muc/mod_muc_room.erl:1771
msgid "Membership is required to enter this room"
msgstr "Necesitas ser miembro de esta sala para poder entrar"
#: mod_muc/mod_muc_room.erl:1807
msgid "This room is not anonymous"
msgstr "Sala no anónima"
#: mod_muc/mod_muc_room.erl:1833
msgid "A password is required to enter this room"
msgstr "Se necesita contraseña para entrar en esta sala"
#: mod_muc/mod_muc_room.erl:1855 mod_register.erl:246
msgid "Too many CAPTCHA requests"
msgstr "Demasiadas peticiones de CAPTCHA"
#: mod_muc/mod_muc_room.erl:1864 mod_register.erl:251
msgid "Unable to generate a CAPTCHA"
msgstr "No se pudo generar un CAPTCHA"
#: mod_muc/mod_muc_room.erl:1874
msgid "Incorrect password"
msgstr "Contraseña incorrecta"
#: mod_muc/mod_muc_room.erl:2448
msgid "Administrator privileges required"
msgstr "Se necesita privilegios de administrador"
#: mod_muc/mod_muc_room.erl:2463
msgid "Moderator privileges required"
msgstr "Se necesita privilegios de moderador"
#: mod_muc/mod_muc_room.erl:2619
msgid "Jabber ID ~s is invalid"
msgstr "El Jabber ID ~s no es válido"
#: mod_muc/mod_muc_room.erl:2633
msgid "Nickname ~s does not exist in the room"
msgstr "El apodo ~s no existe en la sala"
#: mod_muc/mod_muc_room.erl:2659 mod_muc/mod_muc_room.erl:3049
msgid "Invalid affiliation: ~s"
msgstr "Afiliación no válida: ~s"
#: mod_muc/mod_muc_room.erl:2713
msgid "Invalid role: ~s"
msgstr "Rol no válido: ~s"
#: mod_muc/mod_muc_room.erl:3026 mod_muc/mod_muc_room.erl:3062
msgid "Owner privileges required"
msgstr "Se requieren privilegios de propietario de la sala"
#: mod_muc/mod_muc_room.erl:3195
msgid "Configuration of room ~s"
msgstr "Configuración para la sala ~s"
#: mod_muc/mod_muc_room.erl:3200
msgid "Room title"
msgstr "Título de la sala"
#: mod_muc/mod_muc_room.erl:3203 mod_muc/mod_muc_room.erl:3692
msgid "Room description"
msgstr "Descripción de la sala"
#: mod_muc/mod_muc_room.erl:3210
msgid "Make room persistent"
msgstr "Sala permanente"
#: mod_muc/mod_muc_room.erl:3215
msgid "Make room public searchable"
msgstr "Sala públicamente visible"
#: mod_muc/mod_muc_room.erl:3218
msgid "Make participants list public"
msgstr "La lista de participantes es pública"
#: mod_muc/mod_muc_room.erl:3221
msgid "Make room password protected"
msgstr "Proteger la sala con contraseña"
#: mod_muc/mod_muc_room.erl:3232
msgid "Maximum Number of Occupants"
msgstr "Número máximo de ocupantes"
#: mod_muc/mod_muc_room.erl:3239
msgid "No limit"
msgstr "Sin límite"
#: mod_muc/mod_muc_room.erl:3250
msgid "Present real Jabber IDs to"
msgstr "Los Jabber ID reales pueden verlos"
#: mod_muc/mod_muc_room.erl:3258 mod_muc/mod_muc_room.erl:3292
msgid "moderators only"
msgstr "solo moderadores"
#: mod_muc/mod_muc_room.erl:3260 mod_muc/mod_muc_room.erl:3294
msgid "anyone"
msgstr "cualquiera"
#: mod_muc/mod_muc_room.erl:3262
msgid "Make room members-only"
msgstr "Sala sólo para miembros"
#: mod_muc/mod_muc_room.erl:3265
msgid "Make room moderated"
msgstr "Sala moderada"
#: mod_muc/mod_muc_room.erl:3268
msgid "Default users as participants"
msgstr "Los usuarios son participantes por defecto"
#: mod_muc/mod_muc_room.erl:3271
msgid "Allow users to change the subject"
msgstr "Permitir a los usuarios cambiar el asunto"
#: mod_muc/mod_muc_room.erl:3274
msgid "Allow users to send private messages"
msgstr "Permitir a los usuarios enviar mensajes privados"
#: mod_muc/mod_muc_room.erl:3279
msgid "Allow visitors to send private messages to"
msgstr "Permitir a los visitantes enviar mensajes privados a"
#: mod_muc/mod_muc_room.erl:3290
msgid "nobody"
msgstr "nadie"
#: mod_muc/mod_muc_room.erl:3296
msgid "Allow users to query other users"
msgstr "Permitir a los usuarios consultar a otros usuarios"
#: mod_muc/mod_muc_room.erl:3299
msgid "Allow users to send invites"
msgstr "Permitir a los usuarios enviar invitaciones"
#: mod_muc/mod_muc_room.erl:3302
msgid "Allow visitors to send status text in presence updates"
msgstr ""
"Permitir a los visitantes enviar texto de estado en las actualizaciones de "
"presencia"
#: mod_muc/mod_muc_room.erl:3305
msgid "Allow visitors to change nickname"
msgstr "Permitir a los visitantes cambiarse el apodo"
#: mod_muc/mod_muc_room.erl:3308
msgid "Allow visitors to send voice requests"
msgstr "Permitir a los visitantes enviar peticiones de voz"
#: mod_muc/mod_muc_room.erl:3311
msgid "Minimum interval between voice requests (in seconds)"
msgstr "Intervalo mínimo entre peticiones de voz (en segundos)"
#: mod_muc/mod_muc_room.erl:3317
msgid "Make room CAPTCHA protected"
msgstr "Proteger la sala con CAPTCHA"
#: mod_muc/mod_muc_room.erl:3322
msgid "Exclude Jabber IDs from CAPTCHA challenge"
msgstr "Excluir Jabber IDs de las pruebas de CAPTCHA"
#: mod_muc/mod_muc_room.erl:3329
msgid "Enable logging"
msgstr "Guardar históricos"
#: mod_muc/mod_muc_room.erl:3337
msgid "You need an x:data capable client to configure room"
msgstr "Necesitas un cliente con soporte de x:data para configurar la sala"
#: mod_muc/mod_muc_room.erl:3694
msgid "Number of occupants"
msgstr "Número de ocupantes"
#: mod_muc/mod_muc_room.erl:3750
msgid "private, "
msgstr "privado"
#: mod_muc/mod_muc_room.erl:3799
msgid "Voice request"
msgstr "Petición de voz"
#: mod_muc/mod_muc_room.erl:3803
msgid "Either approve or decline the voice request."
msgstr "Aprueba o rechaza la petición de voz."
#: mod_muc/mod_muc_room.erl:3809
msgid "User JID"
msgstr "Jabber ID del usuario"
#: mod_muc/mod_muc_room.erl:3811
msgid "Grant voice to this person?"
msgstr "¿Conceder voz a esta persona?"
#: mod_muc/mod_muc_room.erl:3960
msgid "~s invites you to the room ~s"
msgstr "~s te invita a la sala ~s"
#: mod_muc/mod_muc_room.erl:3969
msgid "the password is"
msgstr "la contraseña es"
#: mod_offline.erl:510 mod_offline_odbc.erl:352
msgid ""
"Your contact offline message queue is full. The message has been discarded."
msgstr ""
"Tu cola de mensajes diferidos de contactos está llena. El mensaje se ha "
"descartado."
#: mod_offline.erl:560 mod_offline_odbc.erl:408
msgid "~s's Offline Messages Queue"
msgstr "Cola de mensajes diferidos de ~s"
#: mod_offline.erl:563 mod_offline_odbc.erl:411 mod_roster.erl:987
#: mod_roster_odbc.erl:1104 mod_shared_roster.erl:901
#: mod_shared_roster.erl:1010 mod_shared_roster_odbc.erl:930
#: mod_shared_roster_odbc.erl:1039 web/ejabberd_web_admin.erl:833
#: web/ejabberd_web_admin.erl:874 web/ejabberd_web_admin.erl:942
#: web/ejabberd_web_admin.erl:978 web/ejabberd_web_admin.erl:1019
#: web/ejabberd_web_admin.erl:1508 web/ejabberd_web_admin.erl:1760
#: web/ejabberd_web_admin.erl:1931 web/ejabberd_web_admin.erl:1963
#: web/ejabberd_web_admin.erl:2031 web/ejabberd_web_admin.erl:2135
#: web/ejabberd_web_admin.erl:2160 web/ejabberd_web_admin.erl:2248
msgid "Submitted"
msgstr "Enviado"
#: mod_offline.erl:571
msgid "Time"
msgstr "Fecha"
#: mod_offline.erl:572
msgid "From"
msgstr "De"
#: mod_offline.erl:573
msgid "To"
msgstr "Para"
#: mod_offline.erl:574 mod_offline_odbc.erl:419
msgid "Packet"
msgstr "Paquete"
#: mod_offline.erl:587 mod_offline_odbc.erl:432 mod_shared_roster.erl:908
#: mod_shared_roster_odbc.erl:937 web/ejabberd_web_admin.erl:882
#: web/ejabberd_web_admin.erl:986
msgid "Delete Selected"
msgstr "Eliminar los seleccionados"
#: mod_offline.erl:645 mod_offline_odbc.erl:519
msgid "Offline Messages:"
msgstr "Mensajes diferidos:"
#: mod_offline.erl:645 mod_offline_odbc.erl:519
msgid "Remove All Offline Messages"
msgstr "Borrar todos los mensajes diferidos"
#: mod_proxy65/mod_proxy65_service.erl:213
msgid "ejabberd SOCKS5 Bytestreams module"
msgstr "Módulo SOCKS5 Bytestreams para ejabberd"
#: mod_pubsub/mod_pubsub.erl:1120 mod_pubsub/mod_pubsub_odbc.erl:929
msgid "Publish-Subscribe"
msgstr "Servicio de Publicar-Subscribir"
#: mod_pubsub/mod_pubsub.erl:1214 mod_pubsub/mod_pubsub_odbc.erl:1025
msgid "ejabberd Publish-Subscribe module"
msgstr "Módulo de Publicar-Subscribir de ejabberd"
#: mod_pubsub/mod_pubsub.erl:1497 mod_pubsub/mod_pubsub_odbc.erl:1312
msgid "PubSub subscriber request"
msgstr "Petición de subscriptor de PubSub"
#: mod_pubsub/mod_pubsub.erl:1499 mod_pubsub/mod_pubsub_odbc.erl:1314
msgid "Choose whether to approve this entity's subscription."
msgstr "Decidir si aprobar la subscripción de esta entidad."
#: mod_pubsub/mod_pubsub.erl:1505 mod_pubsub/mod_pubsub_odbc.erl:1320
msgid "Node ID"
msgstr "Nodo ID"
#: mod_pubsub/mod_pubsub.erl:1510 mod_pubsub/mod_pubsub_odbc.erl:1325
msgid "Subscriber Address"
msgstr "Dirección del subscriptor"
#: mod_pubsub/mod_pubsub.erl:1516 mod_pubsub/mod_pubsub_odbc.erl:1331
msgid "Allow this Jabber ID to subscribe to this pubsub node?"
msgstr "¿Deseas permitir a este Jabber ID que se subscriba a este nodo PubSub?"
#: mod_pubsub/mod_pubsub.erl:3474 mod_pubsub/mod_pubsub_odbc.erl:3287
msgid "Deliver payloads with event notifications"
msgstr "Enviar contenidos junto con las notificaciones de eventos"
#: mod_pubsub/mod_pubsub.erl:3475 mod_pubsub/mod_pubsub_odbc.erl:3288
msgid "Deliver event notifications"
msgstr "Entregar notificaciones de eventos"
#: mod_pubsub/mod_pubsub.erl:3476 mod_pubsub/mod_pubsub_odbc.erl:3289
msgid "Notify subscribers when the node configuration changes"
msgstr "Notificar subscriptores cuando cambia la configuración del nodo"
#: mod_pubsub/mod_pubsub.erl:3477 mod_pubsub/mod_pubsub_odbc.erl:3290
msgid "Notify subscribers when the node is deleted"
msgstr "Notificar subscriptores cuando el nodo se borra"
#: mod_pubsub/mod_pubsub.erl:3478 mod_pubsub/mod_pubsub_odbc.erl:3291
msgid "Notify subscribers when items are removed from the node"
msgstr "Notificar subscriptores cuando los elementos se borran del nodo"
#: mod_pubsub/mod_pubsub.erl:3479 mod_pubsub/mod_pubsub_odbc.erl:3292
msgid "Persist items to storage"
msgstr "Persistir elementos al almacenar"
#: mod_pubsub/mod_pubsub.erl:3480 mod_pubsub/mod_pubsub_odbc.erl:3293
msgid "A friendly name for the node"
msgstr "Un nombre sencillo para el nodo"
#: mod_pubsub/mod_pubsub.erl:3481 mod_pubsub/mod_pubsub_odbc.erl:3294
msgid "Max # of items to persist"
msgstr "Máximo # de elementos que persisten"
#: mod_pubsub/mod_pubsub.erl:3482 mod_pubsub/mod_pubsub_odbc.erl:3295
msgid "Whether to allow subscriptions"
msgstr "Permitir subscripciones"
#: mod_pubsub/mod_pubsub.erl:3483 mod_pubsub/mod_pubsub_odbc.erl:3296
msgid "Specify the access model"
msgstr "Especifica el modelo de acceso"
#: mod_pubsub/mod_pubsub.erl:3486 mod_pubsub/mod_pubsub_odbc.erl:3299
msgid "Roster groups allowed to subscribe"
msgstr "Grupos de contactos que pueden suscribirse"
#: mod_pubsub/mod_pubsub.erl:3487 mod_pubsub/mod_pubsub_odbc.erl:3300
msgid "Specify the publisher model"
msgstr "Especificar el modelo del publicante"
#: mod_pubsub/mod_pubsub.erl:3489 mod_pubsub/mod_pubsub_odbc.erl:3302
msgid "Purge all items when the relevant publisher goes offline"
msgstr "Borra todos los elementos cuando el publicador relevante se desconecta"
#: mod_pubsub/mod_pubsub.erl:3490 mod_pubsub/mod_pubsub_odbc.erl:3303
msgid "Specify the event message type"
msgstr "Especifica el tipo del mensaje de evento"
#: mod_pubsub/mod_pubsub.erl:3492 mod_pubsub/mod_pubsub_odbc.erl:3305
msgid "Max payload size in bytes"
msgstr "Máximo tamaño del contenido en bytes"
#: mod_pubsub/mod_pubsub.erl:3493 mod_pubsub/mod_pubsub_odbc.erl:3306
msgid "When to send the last published item"
msgstr "Cuando enviar el último elemento publicado"
#: mod_pubsub/mod_pubsub.erl:3495 mod_pubsub/mod_pubsub_odbc.erl:3308
msgid "Only deliver notifications to available users"
msgstr "Solo enviar notificaciones a los usuarios disponibles"
#: mod_pubsub/mod_pubsub.erl:3496 mod_pubsub/mod_pubsub_odbc.erl:3309
msgid "The collections with which a node is affiliated"
msgstr "Las colecciones a las que un nodo está afiliado"
#: mod_register.erl:193
msgid "The CAPTCHA verification has failed"
msgstr "La verificación de CAPTCHA ha fallado"
#: mod_register.erl:220
msgid "You need a client that supports x:data and CAPTCHA to register"
msgstr "Necesitas un cliente con soporte de x:data y CAPTCHA para registrarte"
#: mod_register.erl:226 mod_register.erl:265
msgid "Choose a username and password to register with this server"
msgstr ""
"Escoge un nombre de usuario y contraseña para registrarte en este servidor"
#: mod_register.erl:230 mod_vcard.erl:364 mod_vcard_odbc.erl:342
#: web/ejabberd_web_admin.erl:1515 web/ejabberd_web_admin.erl:1572
msgid "User"
msgstr "Usuario"
#: mod_register.erl:316 mod_register.erl:361
msgid "The password is too weak"
msgstr "La contraseña es demasiado débil"
#: mod_register.erl:365
msgid "Users are not allowed to register accounts so quickly"
msgstr "Los usuarios no tienen permitido crear cuentas con tanta rapidez"
#: mod_roster.erl:938 mod_roster_odbc.erl:1055 web/ejabberd_web_admin.erl:1701
#: web/ejabberd_web_admin.erl:1886 web/ejabberd_web_admin.erl:1897
#: web/ejabberd_web_admin.erl:2219
msgid "None"
msgstr "Ninguno"
#: mod_roster.erl:945 mod_roster_odbc.erl:1062
msgid "Subscription"
msgstr "Subscripción"
#: mod_roster.erl:946 mod_roster_odbc.erl:1063
msgid "Pending"
msgstr "Pendiente"
#: mod_roster.erl:947 mod_roster_odbc.erl:1064
msgid "Groups"
msgstr "Grupos"
#: mod_roster.erl:974 mod_roster_odbc.erl:1091
msgid "Validate"
msgstr "Validar"
#: mod_roster.erl:982 mod_roster_odbc.erl:1099
msgid "Remove"
msgstr "Borrar"
#: mod_roster.erl:985 mod_roster_odbc.erl:1102
msgid "Roster of "
msgstr "Lista de contactos de "
#: mod_roster.erl:988 mod_roster_odbc.erl:1105 mod_shared_roster.erl:902
#: mod_shared_roster.erl:1011 mod_shared_roster_odbc.erl:931
#: mod_shared_roster_odbc.erl:1040 web/ejabberd_web_admin.erl:834
#: web/ejabberd_web_admin.erl:875 web/ejabberd_web_admin.erl:943
#: web/ejabberd_web_admin.erl:979 web/ejabberd_web_admin.erl:1020
#: web/ejabberd_web_admin.erl:1509 web/ejabberd_web_admin.erl:1761
#: web/ejabberd_web_admin.erl:1932 web/ejabberd_web_admin.erl:2136
#: web/ejabberd_web_admin.erl:2161
msgid "Bad format"
msgstr "Mal formato"
#: mod_roster.erl:995 mod_roster_odbc.erl:1112
msgid "Add Jabber ID"
msgstr "Añadir Jabber ID"
#: mod_roster.erl:1094 mod_roster_odbc.erl:1211
msgid "Roster"
msgstr "Lista de contactos"
#: mod_shared_roster.erl:857 mod_shared_roster.erl:899
#: mod_shared_roster.erl:1007 mod_shared_roster_odbc.erl:886
#: mod_shared_roster_odbc.erl:928 mod_shared_roster_odbc.erl:1036
msgid "Shared Roster Groups"
msgstr "Grupos Compartidos"
#: mod_shared_roster.erl:895 mod_shared_roster_odbc.erl:924
#: web/ejabberd_web_admin.erl:1365 web/ejabberd_web_admin.erl:2461
msgid "Add New"
msgstr "Añadir nuevo"
#: mod_shared_roster.erl:978 mod_shared_roster_odbc.erl:1007
msgid "Name:"
msgstr "Nombre:"
#: mod_shared_roster.erl:983 mod_shared_roster_odbc.erl:1012
msgid "Description:"
msgstr "Descripción:"
#: mod_shared_roster.erl:991 mod_shared_roster_odbc.erl:1020
msgid "Members:"
msgstr "Miembros:"
#: mod_shared_roster.erl:999 mod_shared_roster_odbc.erl:1028
msgid "Displayed Groups:"
msgstr "Mostrar grupos:"
#: mod_shared_roster.erl:1008 mod_shared_roster_odbc.erl:1037
msgid "Group "
msgstr "Grupo "
#: mod_shared_roster.erl:1017 mod_shared_roster_odbc.erl:1046
#: web/ejabberd_web_admin.erl:840 web/ejabberd_web_admin.erl:884
#: web/ejabberd_web_admin.erl:949 web/ejabberd_web_admin.erl:1026
#: web/ejabberd_web_admin.erl:2017
msgid "Submit"
msgstr "Enviar"
#: mod_vcard.erl:165 mod_vcard_ldap.erl:238 mod_vcard_odbc.erl:129
msgid "Erlang Jabber Server"
msgstr "Servidor Jabber en Erlang"
#: mod_vcard.erl:364 mod_vcard.erl:478 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:454
msgid "Birthday"
msgstr "Cumpleaños"
#: mod_vcard.erl:364 mod_vcard.erl:480 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:456
msgid "City"
msgstr "Ciudad"
#: mod_vcard.erl:364 mod_vcard.erl:479 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:455
msgid "Country"
msgstr "País"
#: mod_vcard.erl:364 mod_vcard.erl:481 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:457
msgid "Email"
msgstr "correo"
#: mod_vcard.erl:364 mod_vcard.erl:476 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:452
msgid "Family Name"
msgstr "Apellido"
#: mod_vcard.erl:364 mod_vcard_odbc.erl:342
msgid ""
"Fill in the form to search for any matching Jabber User (Add * to the end of "
"field to match substring)"
msgstr ""
"Rellena el formulario para buscar usuarios Jabber. Añade * al final de un "
"campo para buscar subcadenas."
#: mod_vcard.erl:364 mod_vcard.erl:473 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:449
msgid "Full Name"
msgstr "Nombre completo"
#: mod_vcard.erl:364 mod_vcard.erl:475 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:451
msgid "Middle Name"
msgstr "Segundo nombre"
#: mod_vcard.erl:364 mod_vcard.erl:474 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:450 web/ejabberd_web_admin.erl:2006
msgid "Name"
msgstr "Nombre"
#: mod_vcard.erl:364 mod_vcard.erl:482 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:458
msgid "Organization Name"
msgstr "Nombre de la organización"
#: mod_vcard.erl:364 mod_vcard.erl:483 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:459
msgid "Organization Unit"
msgstr "Unidad de la organización"
#: mod_vcard.erl:364 mod_vcard_ldap.erl:462 mod_vcard_odbc.erl:342
msgid "Search users in "
msgstr "Buscar usuarios en "
#: mod_vcard.erl:364 mod_vcard_ldap.erl:462 mod_vcard_odbc.erl:342
msgid "You need an x:data capable client to search"
msgstr "Necesitas un cliente con soporte de x:data para poder buscar"
#: mod_vcard.erl:389 mod_vcard_ldap.erl:487 mod_vcard_odbc.erl:367
msgid "vCard User Search"
msgstr "Buscar vCard de usuario"
#: mod_vcard.erl:445 mod_vcard_ldap.erl:541 mod_vcard_odbc.erl:421
msgid "ejabberd vCard module"
msgstr "Módulo vCard para ejabberd"
#: mod_vcard.erl:469 mod_vcard_ldap.erl:551 mod_vcard_odbc.erl:445
msgid "Search Results for "
msgstr "Buscar resultados por "
#: mod_vcard_ldap.erl:462
msgid "Fill in fields to search for any matching Jabber User"
msgstr "Rellena campos para buscar usuarios Jabber que concuerden"
#: web/ejabberd_web_admin.erl:193 web/ejabberd_web_admin.erl:203
#: web/ejabberd_web_admin.erl:219 web/ejabberd_web_admin.erl:229
msgid "Unauthorized"
msgstr "No autorizado"
#: web/ejabberd_web_admin.erl:286 web/ejabberd_web_admin.erl:303
msgid "ejabberd Web Admin"
msgstr "ejabberd Web Admin"
#: web/ejabberd_web_admin.erl:769 web/ejabberd_web_admin.erl:780
msgid "Administration"
msgstr "Administración"
#: web/ejabberd_web_admin.erl:878 web/ejabberd_web_admin.erl:982
msgid "Raw"
msgstr "Crudo"
#: web/ejabberd_web_admin.erl:1017
msgid "~s access rule configuration"
msgstr "Configuración de las Regla de Acceso ~s"
#: web/ejabberd_web_admin.erl:1035
msgid "Virtual Hosts"
msgstr "Dominios Virtuales"
#: web/ejabberd_web_admin.erl:1043 web/ejabberd_web_admin.erl:1050
msgid "Users"
msgstr "Usuarios"
#: web/ejabberd_web_admin.erl:1078
msgid "Users Last Activity"
msgstr "Última actividad de los usuarios"
#: web/ejabberd_web_admin.erl:1080
msgid "Period: "
msgstr "Periodo: "
#: web/ejabberd_web_admin.erl:1090
msgid "Last month"
msgstr "Último mes"
#: web/ejabberd_web_admin.erl:1091
msgid "Last year"
msgstr "Último año"
#: web/ejabberd_web_admin.erl:1092
msgid "All activity"
msgstr "Toda la actividad"
#: web/ejabberd_web_admin.erl:1094
msgid "Show Ordinary Table"
msgstr "Mostrar Tabla Ordinaria"
#: web/ejabberd_web_admin.erl:1096
msgid "Show Integral Table"
msgstr "Mostrar Tabla Integral"
#: web/ejabberd_web_admin.erl:1105 web/ejabberd_web_admin.erl:1939
msgid "Statistics"
msgstr "Estadísticas"
#: web/ejabberd_web_admin.erl:1117
msgid "Not Found"
msgstr "No encontrado"
#: web/ejabberd_web_admin.erl:1134
msgid "Node not found"
msgstr "Nodo no encontrado"
#: web/ejabberd_web_admin.erl:1460
msgid "Host"
msgstr "Dominio"
#: web/ejabberd_web_admin.erl:1461
msgid "Registered Users"
msgstr "Usuarios registrados"
#: web/ejabberd_web_admin.erl:1573
msgid "Offline Messages"
msgstr "Mensajes diferidos"
#: web/ejabberd_web_admin.erl:1574 web/ejabberd_web_admin.erl:1767
msgid "Last Activity"
msgstr "Última actividad"
#: web/ejabberd_web_admin.erl:1659 web/ejabberd_web_admin.erl:1675
msgid "Registered Users:"
msgstr "Usuarios registrados:"
#: web/ejabberd_web_admin.erl:1661 web/ejabberd_web_admin.erl:1677
#: web/ejabberd_web_admin.erl:2192
msgid "Online Users:"
msgstr "Usuarios conectados:"
#: web/ejabberd_web_admin.erl:1663
msgid "Outgoing s2s Connections:"
msgstr "Conexiones S2S salientes:"
#: web/ejabberd_web_admin.erl:1665
msgid "Outgoing s2s Servers:"
msgstr "Servidores S2S salientes:"
#: web/ejabberd_web_admin.erl:1734 web/mod_register_web.erl:175
#: web/mod_register_web.erl:372 web/mod_register_web.erl:381
#: web/mod_register_web.erl:411
msgid "Change Password"
msgstr "Cambiar contraseña"
#: web/ejabberd_web_admin.erl:1758
msgid "User "
msgstr "Usuario "
#: web/ejabberd_web_admin.erl:1765
msgid "Connected Resources:"
msgstr "Recursos conectados:"
#: web/ejabberd_web_admin.erl:1766 web/mod_register_web.erl:227
#: web/mod_register_web.erl:519
msgid "Password:"
msgstr "Contraseña:"
#: web/ejabberd_web_admin.erl:1828
msgid "No Data"
msgstr "Sin datos"
#: web/ejabberd_web_admin.erl:1906
msgid "Nodes"
msgstr "Nodos"
#: web/ejabberd_web_admin.erl:1929 web/ejabberd_web_admin.erl:1951
msgid "Node "
msgstr "Nodo "
#: web/ejabberd_web_admin.erl:1938
msgid "Listened Ports"
msgstr "Puertos de escucha"
#: web/ejabberd_web_admin.erl:1940 web/ejabberd_web_admin.erl:2260
#: web/ejabberd_web_admin.erl:2448
msgid "Update"
msgstr "Actualizar"
#: web/ejabberd_web_admin.erl:1943 web/ejabberd_web_admin.erl:2569
msgid "Restart"
msgstr "Reiniciar"
#: web/ejabberd_web_admin.erl:1945 web/ejabberd_web_admin.erl:2571
msgid "Stop"
msgstr "Detener"
#: web/ejabberd_web_admin.erl:1959
msgid "RPC Call Error"
msgstr "Error en la llamada RPC"
#: web/ejabberd_web_admin.erl:2000
msgid "Database Tables at "
msgstr "Tablas de la base de datos en "
#: web/ejabberd_web_admin.erl:2007
msgid "Storage Type"
msgstr "Tipo de almacenamiento"
#: web/ejabberd_web_admin.erl:2008
msgid "Elements"
msgstr "Elementos"
#: web/ejabberd_web_admin.erl:2009
msgid "Memory"
msgstr "Memoria"
#: web/ejabberd_web_admin.erl:2032 web/ejabberd_web_admin.erl:2137
msgid "Error"
msgstr "Error"
#: web/ejabberd_web_admin.erl:2034
msgid "Backup of "
msgstr "Copia de seguridad de "
#: web/ejabberd_web_admin.erl:2036
msgid ""
"Please note that these options will only backup the builtin Mnesia database. "
"If you are using the ODBC module, you also need to backup your SQL database "
"separately."
msgstr ""
"Ten en cuenta que estas opciones solo harán copia de seguridad de la base de "
"datos Mnesia embebida. Si estás usando ODBC tendrás que hacer también copia "
"de seguridad de tu base de datos SQL."
#: web/ejabberd_web_admin.erl:2041
msgid "Store binary backup:"
msgstr "Guardar copia de seguridad binaria:"
#: web/ejabberd_web_admin.erl:2045 web/ejabberd_web_admin.erl:2052
#: web/ejabberd_web_admin.erl:2060 web/ejabberd_web_admin.erl:2067
#: web/ejabberd_web_admin.erl:2074 web/ejabberd_web_admin.erl:2081
#: web/ejabberd_web_admin.erl:2088 web/ejabberd_web_admin.erl:2096
#: web/ejabberd_web_admin.erl:2103 web/ejabberd_web_admin.erl:2110
msgid "OK"
msgstr "Aceptar"
#: web/ejabberd_web_admin.erl:2048
msgid "Restore binary backup immediately:"
msgstr "Restaurar inmediatamente copia de seguridad binaria:"
#: web/ejabberd_web_admin.erl:2056
msgid ""
"Restore binary backup after next ejabberd restart (requires less memory):"
msgstr ""
"Restaurar copia de seguridad binaria en el siguiente reinicio de ejabberd "
"(requiere menos memoria que si instantánea):"
#: web/ejabberd_web_admin.erl:2063
msgid "Store plain text backup:"
msgstr "Guardar copia de seguridad en texto plano:"
#: web/ejabberd_web_admin.erl:2070
msgid "Restore plain text backup immediately:"
msgstr "Restaurar copias de seguridad de texto plano inmediatamente:"
#: web/ejabberd_web_admin.erl:2077
msgid "Import users data from a PIEFXIS file (XEP-0227):"
msgstr "Importar usuarios desde un fichero PIEFXIS (XEP-0227):"
#: web/ejabberd_web_admin.erl:2084
msgid "Export data of all users in the server to PIEFXIS files (XEP-0227):"
msgstr ""
"Exportar datos de todos los usuarios del servidor a ficheros PIEFXIS "
"(XEP-0227):"
#: web/ejabberd_web_admin.erl:2091
msgid "Export data of users in a host to PIEFXIS files (XEP-0227):"
msgstr ""
"Exportar datos de los usuarios de un dominio a ficheros PIEFXIS (XEP-0227):"
#: web/ejabberd_web_admin.erl:2099
msgid "Import user data from jabberd14 spool file:"
msgstr "Importar usuario de fichero spool de jabberd14:"
#: web/ejabberd_web_admin.erl:2106
msgid "Import users data from jabberd14 spool directory:"
msgstr "Importar usuarios del directorio spool de jabberd14:"
#: web/ejabberd_web_admin.erl:2132
msgid "Listened Ports at "
msgstr "Puertos de escucha en "
#: web/ejabberd_web_admin.erl:2157
msgid "Modules at "
msgstr "Módulos en "
#: web/ejabberd_web_admin.erl:2183
msgid "Statistics of ~p"
msgstr "Estadísticas de ~p"
#: web/ejabberd_web_admin.erl:2186
msgid "Uptime:"
msgstr "Tiempo desde el inicio:"
#: web/ejabberd_web_admin.erl:2189
msgid "CPU Time:"
msgstr "Tiempo consumido de CPU:"
#: web/ejabberd_web_admin.erl:2195
msgid "Transactions Committed:"
msgstr "Transacciones finalizadas:"
#: web/ejabberd_web_admin.erl:2198
msgid "Transactions Aborted:"
msgstr "Transacciones abortadas:"
#: web/ejabberd_web_admin.erl:2201
msgid "Transactions Restarted:"
msgstr "Transacciones reiniciadas:"
#: web/ejabberd_web_admin.erl:2204
msgid "Transactions Logged:"
msgstr "Transacciones registradas:"
#: web/ejabberd_web_admin.erl:2246
msgid "Update "
msgstr "Actualizar "
#: web/ejabberd_web_admin.erl:2254
msgid "Update plan"
msgstr "Plan de actualización"
#: web/ejabberd_web_admin.erl:2255
msgid "Modified modules"
msgstr "Módulos modificados"
#: web/ejabberd_web_admin.erl:2256
msgid "Update script"
msgstr "Script de actualización"
#: web/ejabberd_web_admin.erl:2257
msgid "Low level update script"
msgstr "Script de actualización a bajo nivel"
#: web/ejabberd_web_admin.erl:2258
msgid "Script check"
msgstr "Comprobación de script"
#: web/ejabberd_web_admin.erl:2426
msgid "Port"
msgstr "Puerto"
#: web/ejabberd_web_admin.erl:2427
msgid "IP"
msgstr "IP"
#: web/ejabberd_web_admin.erl:2428
msgid "Protocol"
msgstr "Protocolo"
#: web/ejabberd_web_admin.erl:2429 web/ejabberd_web_admin.erl:2556
msgid "Module"
msgstr "Módulo"
#: web/ejabberd_web_admin.erl:2430 web/ejabberd_web_admin.erl:2557
msgid "Options"
msgstr "Opciones"
#: web/ejabberd_web_admin.erl:2450
msgid "Delete"
msgstr "Eliminar"
#: web/ejabberd_web_admin.erl:2579
msgid "Start"
msgstr "Iniciar"
#: web/mod_register_web.erl:104
msgid "Your Jabber account was successfully created."
msgstr "Tu cuenta Jabber se ha creado correctamente."
#: web/mod_register_web.erl:107
msgid "There was an error creating the account: "
msgstr "Hubo uno error al crear la cuenta:"
#: web/mod_register_web.erl:115
msgid "Your Jabber account was successfully deleted."
msgstr "Tu cuenta Jabber se ha borrado correctamente."
#: web/mod_register_web.erl:118
msgid "There was an error deleting the account: "
msgstr "Hubo un error borrando la cuenta."
#: web/mod_register_web.erl:128
msgid "The password of your Jabber account was successfully changed."
msgstr "La contraseña de tu cuenta Jabber se ha cambiado correctamente."
#: web/mod_register_web.erl:131
msgid "There was an error changing the password: "
msgstr "Hubo un error cambiando la contraseña."
#: web/mod_register_web.erl:163 web/mod_register_web.erl:172
msgid "Jabber Account Registration"
msgstr "Registro de Cuenta Jabber"
#: web/mod_register_web.erl:174 web/mod_register_web.erl:192
#: web/mod_register_web.erl:201
msgid "Register a Jabber account"
msgstr "Registrar una cuenta Jabber"
#: web/mod_register_web.erl:176 web/mod_register_web.erl:493
#: web/mod_register_web.erl:502
msgid "Unregister a Jabber account"
msgstr "Borrar una cuenta Jabber"
#: web/mod_register_web.erl:203
msgid ""
"This page allows to create a Jabber account in this Jabber server. Your JID "
"(Jabber IDentifier) will be of the form: username@server. Please read "
"carefully the instructions to fill correctly the fields."
msgstr ""
"Esta página te permite crear una cuenta Jabber este servidor Jabber. Tu JID "
"(Jabber IDentificador) será de la forma: nombredeusuario@servidor. Por favor "
"lee detenidamente las instrucciones para rellenar correctamente los campos."
#: web/mod_register_web.erl:212 web/mod_register_web.erl:386
#: web/mod_register_web.erl:509
msgid "Username:"
msgstr "Nombre de usuario:"
#: web/mod_register_web.erl:217
msgid "This is case insensitive: macbeth is the same that MacBeth and Macbeth."
msgstr ""
"No importa si usas mayúsculas: macbeth es lo mismo que MacBeth y Macbeth."
#: web/mod_register_web.erl:218
msgid "Characters not allowed:"
msgstr "Caracteres no permitidos:"
#: web/mod_register_web.erl:222 web/mod_register_web.erl:391
#: web/mod_register_web.erl:514
msgid "Server:"
msgstr "Servidor:"
#: web/mod_register_web.erl:232
msgid ""
"Don't tell your password to anybody, not even the administrators of the "
"Jabber server."
msgstr ""
"No le digas tu contraseña a nadie, ni siquiera a los administradores del "
"servidor Jabber."
#: web/mod_register_web.erl:234
msgid "You can later change your password using a Jabber client."
msgstr "Puedes cambiar tu contraseña después, usando un cliente Jabber."
#: web/mod_register_web.erl:235
msgid ""
"Some Jabber clients can store your password in your computer. Use that "
"feature only if you trust your computer is safe."
msgstr ""
"Algunos clientes Jabber pueden recordar tu contraseña en la máquina. Usa esa "
"opción solo si confías en que la máquina que usas es segura."
#: web/mod_register_web.erl:237
msgid ""
"Memorize your password, or write it in a paper placed in a safe place. In "
"Jabber there isn't an automated way to recover your password if you forget "
"it."
msgstr ""
"Memoriza tu contraseña, o apúntala en un papel en un lugar seguro. En Jabber "
"no hay un método automatizado para recuperar la contraseña si la olvidas."
#: web/mod_register_web.erl:242 web/mod_register_web.erl:406
msgid "Password Verification:"
msgstr "Verificación de la contraseña:"
#: web/mod_register_web.erl:250
msgid "Register"
msgstr "Registrar"
#: web/mod_register_web.erl:396
msgid "Old Password:"
msgstr "Contraseña antigua:"
#: web/mod_register_web.erl:401
msgid "New Password:"
msgstr "Nueva contraseña:"
#: web/mod_register_web.erl:504
msgid "This page allows to unregister a Jabber account in this Jabber server."
msgstr ""
"Esta página te permite borrar tu cuenta Jabber en este servidor Jabber."
#: web/mod_register_web.erl:524
msgid "Unregister"
msgstr "Borrar"
ejabberd-2.1.11/src/msgs/fr.msg 0000664 0000000 0000000 00000066462 12240230175 013113 0 ustar {"Access Configuration","Configuration d'accès"}.
{"Access Control List Configuration","Configuration des droits (ACL)"}.
{"Access control lists","Droits (ACL)"}.
{"Access Control Lists","Droits (ACL)"}.
{"Access denied by service policy","L'accès au service est refusé"}.
{"Access rules","Règles d'accès"}.
{"Access Rules","Règles d'accès"}.
{"Action on user","Action sur l'utilisateur"}.
{"Add Jabber ID","Ajouter un Jabber ID"}.
{"Add New","Ajouter"}.
{"Add User","Ajouter un utilisateur"}.
{"Administration","Administration"}.
{"Administration of ","Administration de "}.
{"Administrator privileges required","Les droits d'administrateur sont nécessaires"}.
{"A friendly name for the node","Un nom convivial pour le noeud"}.
{"All activity","Toute activité"}.
{"Allow this Jabber ID to subscribe to this pubsub node?","Autoriser ce Jabber ID à s'abonner à ce nœud PubSub"}.
{"Allow users to change the subject","Autoriser les utilisateurs à changer le sujet"}.
{"Allow users to query other users","Permettre aux utilisateurs d'envoyer des requêtes aux autres utilisateurs"}.
{"Allow users to send invites","Permettre aux utilisateurs d'envoyer des invitations"}.
{"Allow users to send private messages","Autoriser les utilisateurs à envoyer des messages privés"}.
{"Allow visitors to change nickname","Autoriser les visiteurs à changer de pseudo"}.
{"Allow visitors to send status text in presence updates","Autoriser les visiteurs à envoyer un message d'état avec leur présence"}.
{"All Users","Tous les utilisateurs"}.
{"Announcements","Annonces"}.
{"anyone","tout le monde"}.
{"A password is required to enter this room","Un mot de passe est nécessaire pour accèder à ce salon"}.
{"April","Avril"}.
{"August","Août"}.
{"Backup Management","Gestion des sauvegardes"}.
{"Backup of ","Sauvegarde de "}.
{"Backup","Sauvegarde"}.
{"Backup to File at ","Sauvegarde sur fichier sur "}.
{"Bad format","Mauvais format"}.
{"Birthday","Date d'anniversaire"}.
{"CAPTCHA web page","Page web de CAPTCHA"}.
{"Change Password","Modifier le mot de passe"}.
{"Change User Password","Changer le mot de passe de l'utilisateur"}.
{"Characters not allowed:","Caractères non-autorisés :"}.
{"Chatroom configuration modified","Configuration du salon modifiée"}.
{"Chatroom is created","Le salon de discussion est créé"}.
{"Chatroom is destroyed","Le salon de discussion est détruit"}.
{"Chatroom is started","Le salon de discussion a démarré"}.
{"Chatroom is stopped","Le salon de discussion est stoppé"}.
{"Chatrooms","Salons de discussion"}.
{"Choose a username and password to register with this server","Choisissez un nom d'utilisateur et un mot de passe pour s'enregistrer sur ce serveur"}.
{"Choose modules to stop","Sélectionnez les modules à arrêter"}.
{"Choose storage type of tables","Choisissez un type de stockage pour les tables"}.
{"Choose whether to approve this entity's subscription.","Accepter cet abonnement ?"}.
{"City","Ville"}.
{"Commands","Commandes"}.
{"Conference room does not exist","La salle de conférence n'existe pas"}.
{"Configuration","Configuration"}.
{"Configuration of room ~s","Configuration pour le salon ~s"}.
{"Connected Resources:","Ressources connectées:"}.
{"Connections parameters","Paramètres de connexion"}.
{"Country","Pays"}.
{"CPU Time:","Temps CPU :"}.
{"Database","Base de données"}.
{"Database Tables at ","Tables de base de données sur "}.
{"Database Tables Configuration at ","Configuration des tables de base de données sur "}.
{"December","Décembre"}.
{"Default users as participants","Les utilisateurs sont par défaut participant"}.
{"Delete message of the day on all hosts","Supprimer le message du jour sur tous les domaines"}.
{"Delete message of the day","Supprimer le message du jour"}.
{"Delete Selected","Suppression des éléments sélectionnés"}.
{"Delete","Supprimer"}.
{"Delete User","Supprimer l'utilisateur"}.
{"Deliver event notifications","Envoyer les notifications d'événement"}.
{"Deliver payloads with event notifications","Inclure le contenu du message avec la notification"}.
{"Description:","Description :"}.
{"Disc only copy","Copie sur disque uniquement"}.
{"Displayed Groups:","Groupes affichés :"}.
{"Don't tell your password to anybody, not even the administrators of the Jabber server.","Ne révélez votre mot de passe à personne, pas même l'administrateur de ce serveur."}.
{"Dump Backup to Text File at ","Enregistrer la sauvegarde dans un fichier texte sur "}.
{"Dump to Text File","Sauvegarder dans un fichier texte"}.
{"Edit Properties","Modifier les propriétés"}.
{"ejabberd IRC module","Module IRC ejabberd"}.
{"ejabberd MUC module","Module MUC ejabberd"}.
{"ejabberd Publish-Subscribe module","Module Publish-Subscribe d'ejabberd"}.
{"ejabberd SOCKS5 Bytestreams module","ejabberd SOCKS5 Bytestreams module"}.
{"ejabberd vCard module","Module vCard ejabberd"}.
{"ejabberd Web Admin","Console Web d'administration de ejabberd"}.
{"Elements","Éléments"}.
{"Email","Email"}.
{"Enable logging","Activer l'archivage"}.
{"Encoding for server ~b","Codage pour le serveur ~b"}.
{"End User Session","Terminer la session de l'utilisateur"}.
{"Enter list of {Module, [Options]}","Entrez une liste de {Module, [Options]}"}.
{"Enter nickname you want to register","Entrez le pseudo que vous souhaitez enregistrer"}.
{"Enter path to backup file","Entrez le chemin vers le fichier de sauvegarde"}.
{"Enter path to jabberd14 spool dir","Entrez le chemin vers le répertoire de spool jabberd14"}.
{"Enter path to jabberd14 spool file","Entrez le chemin vers le fichier spool jabberd14"}.
{"Enter path to text file","Entrez le chemin vers le fichier texte"}.
{"Enter the text you see","Tapez le texte que vous voyez"}.
{"Enter username and encodings you wish to use for connecting to IRC servers. Press 'Next' to get more fields to fill in. Press 'Complete' to save settings.","Entrez le nom d'utilisateur et les encodages que vous souhaitez utiliser pour vous connecter aux serveurs IRC. Appuyez sur 'Suivant' pour pour avoir d'autres champs à remplir. Appuyez sur 'Terminer' pour sauver les paramètres."}.
{"Enter username, encodings, ports and passwords you wish to use for connecting to IRC servers","Entrez le nom d'utilisateur, les encodages, les ports et mots de passe que vous souhaitez utiliser pour vous connecter aux serveurs IRC"}.
{"Erlang Jabber Server","Serveur Jabber Erlang"}.
{"Error","Erreur"}.
{"Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef.net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}].","Exemple: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef.net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."}.
{"Export data of all users in the server to PIEFXIS files (XEP-0227):","Exporter les données de tous les utilisateurs du serveur vers un fichier PIEFXIS (XEP-0227):"}.
{"Export data of users in a host to PIEFXIS files (XEP-0227):","Exporter les données utilisateurs d'un hôte vers un fichier PIEFXIS (XEP-0227):"}.
{"Family Name","Nom de famille"}.
{"February","Février"}.
{"Fill in fields to search for any matching Jabber User","Remplissez les champs pour rechercher un utilisateur Jabber"}.
{"Fill in the form to search for any matching Jabber User (Add * to the end of field to match substring)","Remplissez le formulaire pour recherche un utilisateur Jabber (Ajouter * à la fin du champ pour chercher n'importe quelle fin de chaîne"}.
{"Friday","Vendredi"}.
{"From","De"}.
{"From ~s","De ~s"}.
{"Full Name","Nom complet"}.
{"Get Number of Online Users","Récupérer le nombre d'utilisateurs en ligne"}.
{"Get Number of Registered Users","Récupérer le nombre d'utilisateurs enregistrés"}.
{"Get User Last Login Time","Récupérer la dernière date de connexion de l'utilisateur"}.
{"Get User Password","Récupérer le mot de passe de l'utilisateur"}.
{"Get User Statistics","Récupérer les statistiques de l'utilisateur"}.
{"Group ","Groupe "}.
{"Groups","Groupes"}.
{"has been banned","a été banni"}.
{"has been kicked","a été expulsé"}.
{"has been kicked because of an affiliation change","a été éjecté à cause d'un changement d'autorisation"}.
{"has been kicked because of a system shutdown","a été éjecté en raison de l'arrêt du système"}.
{"has been kicked because the room has been changed to members-only","a été éjecté car la salle est désormais réservée aux membres"}.
{" has set the subject to: "," a changé le sujet pour: "}.
{"Host","Serveur"}.
{"If you don't see the CAPTCHA image here, visit the web page.","SI vous ne voyez pas l'image CAPTCHA ici, visitez la page web."}.
{"If you want to specify different ports, passwords, encodings for IRC servers, fill this list with values in format '{\"irc server\", \"encoding\", port, \"password\"}'. By default this service use \"~s\" encoding, port ~p, empty password.","Si vous voulez préciser différents ports, mots de passe, et encodages pour les serveurs IRC, remplissez cette liste avec des valeurs dans le format '{\"serveur irc\", \"encodage\", port, \"mot de passe\"}'. Par défaut ce service utilise l'encodage \"~s\", port ~p, mot de passe vide."}.
{"Import Directory","Importer une répertoire"}.
{"Import File","Importer un fichier"}.
{"Import user data from jabberd14 spool file:","Importer des utilisateurs depuis un fichier spool Jabberd 1.4:"}.
{"Import User from File at ","Importer un utilisateur depuis le fichier sur "}.
{"Import users data from a PIEFXIS file (XEP-0227):","Importer les données utilisateurs à partir d'un fichier PIEFXIS (XEP-0227):"}.
{"Import users data from jabberd14 spool directory:","Importer des utilisateurs depuis un fichier spool Jabberd 1.4:"}.
{"Import Users from Dir at ","Importer des utilisateurs depuis le répertoire sur "}.
{"Import Users From jabberd14 Spool Files","Importer des utilisateurs depuis un fichier spool Jabberd 1.4"}.
{"Improper message type","Mauvais type de message"}.
{"Incorrect password","Mot de passe incorrect"}.
{"Invalid affiliation: ~s","Affiliation invalide : ~s"}.
{"Invalid role: ~s","Role invalide : ~s"}.
{"IP addresses","Adresses IP"}.
{"IP","IP"}.
{"IRC channel (don't put the first #)","Canal IRC (ne pas insérer le premier caractère #)"}.
{"IRC server","Serveur IRC"}.
{"IRC settings","Configuration IRC"}.
{"IRC Transport","Passerelle IRC"}.
{"IRC username","Nom d'utilisateur IRC"}.
{"IRC Username","Nom d'utilisateur IRC"}.
{"is now known as","est maintenant connu comme"}.
{"It is not allowed to send private messages","L'envoi de messages privés n'est pas autorisé"}.
{"It is not allowed to send private messages of type \"groupchat\"","Il n'est pas permis d'envoyer des messages privés de type \"groupchat\""}.
{"It is not allowed to send private messages to the conference","Il n'est pas permis d'envoyer des messages \"normaux\" à la conférence"}.
{"Jabber Account Registration","Enregistrement du Compte Jabber"}.
{"Jabber ID","Jabber ID"}.
{"Jabber ID ~s is invalid","Le Jabber ID ~s n'est pas valide"}.
{"January","Janvier"}.
{"Join IRC channel","Rejoindre un canal IRC"}.
{"joins the room","rejoint le salon"}.
{"Join the IRC channel here.","Rejoindre un canal IRC ici"}.
{"Join the IRC channel in this Jabber ID: ~s","Rejoindre un canal IRC avec ce Jabber ID: ~s"}.
{"July","Juillet"}.
{"June","Juin"}.
{"Last Activity","Dernière Activité"}.
{"Last login","Dernière connexion"}.
{"Last month","Dernier mois"}.
{"Last year","Dernière année"}.
{"leaves the room","quitte le salon"}.
{"Listened Ports at ","Ports ouverts sur "}.
{"Listened Ports","Ports ouverts"}.
{"List of modules to start","Liste des modules à démarrer"}.
{"Low level update script","Script de mise à jour de bas-niveau"}.
{"Make participants list public","Rendre la liste des participants publique"}.
{"Make room CAPTCHA protected","Protéger le salon par un CAPTCHA"}.
{"Make room members-only","Réserver le salon aux membres uniquement"}.
{"Make room moderated","Rendre le salon modéré"}.
{"Make room password protected","Protéger le salon par mot de passe"}.
{"Make room persistent","Rendre le salon persistant"}.
{"Make room public searchable","Rendre le salon public"}.
{"March","Mars"}.
{"Maximum Number of Occupants","Nombre maximum d'occupants"}.
{"Max # of items to persist","Nombre maximum d'éléments à stocker"}.
{"Max payload size in bytes","Taille maximum pour le contenu du message en octet"}.
{"May","Mai"}.
{"Membership is required to enter this room","Vous devez être membre pour accèder à ce salon"}.
{"Members:","Membres :"}.
{"Memorize your password, or write it in a paper placed in a safe place. In Jabber there isn't an automated way to recover your password if you forget it.","Mémorisez votre mot de passe, ou écrivez-le sur un papier conservé dans un endroit secret. Dans Jabber il n'y a pas de mécanisme pour retrouver votre mot de passe si vous l'avez oublié."}.
{"Memory","Mémoire"}.
{"Message body","Corps du message"}.
{"Middle Name","Autre nom"}.
{"Moderator privileges required","Les droits de modérateur sont nécessaires"}.
{"moderators only","modérateurs seulement"}.
{"Modified modules","Modules mis à jour"}.
{"Module","Module"}.
{"Modules at ","Modules sur "}.
{"Modules","Modules"}.
{"Monday","Lundi"}.
{"Name:","Nom :"}.
{"Name","Nom"}.
{"Never","Jamais"}.
{"New Password:","Nouveau mot de passe:"}.
{"Nickname","Pseudo"}.
{"Nickname Registration at ","Enregistrement d'un pseudo sur "}.
{"Nickname ~s does not exist in the room","Le pseudo ~s n'existe pas dans ce salon"}.
{"No body provided for announce message","Pas de corps de message pour l'annonce"}.
{"No Data","Aucune information disponible"}.
{"Node ID","Identifiant du nœud"}.
{"Node ","Noeud "}.
{"Node not found","Noeud non trouvé"}.
{"Nodes","Noeuds"}.
{"No limit","Pas de limite"}.
{"None","Aucun"}.
{"No resource provided","Aucune ressource fournie"}.
{"Not Found","Nœud non trouvé"}.
{"Notify subscribers when items are removed from the node","Avertir les abonnés lorsque des éléments sont supprimés sur le nœud"}.
{"Notify subscribers when the node configuration changes","Avertir les abonnés lorsque la configuration du nœud change"}.
{"Notify subscribers when the node is deleted","Avertir les abonnés lorsque le nœud est supprimé"}.
{"November","Novembre"}.
{"Number of occupants","Nombre d'occupants"}.
{"Number of online users","Nombre d'utilisateurs en ligne"}.
{"Number of registered users","Nombre d'utilisateurs enregistrés"}.
{"October","Octobre"}.
{"Offline Messages:","Messages en attente :"}.
{"Offline Messages","Messages en attente"}.
{"OK","OK"}.
{"Old Password:","Ancien mot de passe:"}.
{"Online","En ligne"}.
{"Online Users:","Utilisateurs connectés:"}.
{"Online Users","Utilisateurs en ligne"}.
{"Only deliver notifications to available users","Envoyer les notifications uniquement aux utilisateurs disponibles"}.
{"Only moderators and participants are allowed to change the subject in this room","Seuls les modérateurs et les participants peuvent changer le sujet dans ce salon"}.
{"Only moderators are allowed to change the subject in this room","Seuls les modérateurs peuvent changer le sujet dans ce salon"}.
{"Only occupants are allowed to send messages to the conference","Seuls les occupants peuvent envoyer des messages à la conférence"}.
{"Only occupants are allowed to send queries to the conference","Seuls les occupants sont autorisés à envoyer des requêtes à la conférence"}.
{"Only service administrators are allowed to send service messages","Seuls les administrateurs du service sont autoriser à envoyer des messages de service"}.
{"Options","Options"}.
{"Organization Name","Nom de l'organisation"}.
{"Organization Unit","Unité de l'organisation"}.
{"Outgoing s2s Connections:","Connexions s2s sortantes:"}.
{"Outgoing s2s Connections","Connexions s2s sortantes"}.
{"Outgoing s2s Servers:","Serveurs s2s sortants"}.
{"Owner privileges required","Les droits de propriétaire sont nécessaires"}.
{"Packet","Paquet"}.
{"Password ~b","Mot de passe ~b"}.
{"Password:","Mot de passe:"}.
{"Password","Mot de passe"}.
{"Password Verification:","Vérification du mot de passe :"}.
{"Password Verification","Vérification du mot de passe"}.
{"Path to Dir","Chemin vers le répertoire"}.
{"Path to File","Chemin vers le fichier"}.
{"Pending","En suspens"}.
{"Period: ","Période :"}.
{"Persist items to storage","Stockage persistant des éléments"}.
{"Ping","Ping"}.
{"Please note that these options will only backup the builtin Mnesia database. If you are using the ODBC module, you also need to backup your SQL database separately.","Ces options sauvegardent uniquement la base de données interne Mnesia. Si vous utilisez le module ODBC vous devez sauvegarde votre base SQL séparément."}.
{"Pong","Pong"}.
{"Port ~b","Port ~b"}.
{"Port","Port"}.
{"Present real Jabber IDs to","Rendre le Jabber ID réel visible pour"}.
{"private, ","privé"}.
{"Protocol","Protocole"}.
{"Publish-Subscribe","Publication-Abonnement"}.
{"PubSub subscriber request","Demande d'abonnement PubSub"}.
{"Purge all items when the relevant publisher goes offline","Purger tous les items lorsque publieur est hors-ligne"}.
{"Queries to the conference members are not allowed in this room","Les requêtes sur les membres de la conférence ne sont pas autorisé dans ce salon"}.
{"RAM and disc copy","Copie en mémoire vive (RAM) et sur disque"}.
{"RAM copy","Copie en mémoire vive (RAM)"}.
{"Raw","Brut"}.
{"Really delete message of the day?","Confirmer la suppression du message du jour ?"}.
{"Recipient is not in the conference room","Le destinataire n'est pas dans la conférence"}.
{"Register a Jabber account","Enregistrer un compte Jabber"}.
{"Registered Users:","Utilisateurs enregistrés:"}.
{"Registered Users","Utilisateurs enregistrés"}.
{"Register","Enregistrer"}.
{"Registration in mod_irc for ","Enregistrement du mod_irc pour "}.
{"Remote copy","Copie distante"}.
{"Remove All Offline Messages","Effacer tous les messages hors ligne"}.
{"Remove","Enlever"}.
{"Remove User","Supprimer l'utilisateur"}.
{"Replaced by new connection","Remplacé par une nouvelle connexion"}.
{"Resources","Ressources"}.
{"Restart","Redémarrer"}.
{"Restart Service","Redémarrer le service"}.
{"Restore Backup from File at ","Restaurer la sauvegarde depuis le fichier sur "}.
{"Restore binary backup after next ejabberd restart (requires less memory):","Restauration de la sauvegarde binaire après redémarrage (nécessite moins de mémoire):"}.
{"Restore binary backup immediately:","Restauration immédiate d'une sauvegarde binaire:"}.
{"Restore plain text backup immediately:","Restauration immédiate d'une sauvegarde texte:"}.
{"Restore","Restauration"}.
{"Room Configuration","Configuration du salon"}.
{"Room creation is denied by service policy","La création de salons est interdite par le service"}.
{"Room description","Description :"}.
{"Room Occupants","Occupants du salon"}.
{"Room title","Titre du salon"}.
{"Roster groups allowed to subscribe","Groupes de liste de contact autorisés à s'abonner"}.
{"Roster","Liste de contacts"}.
{"Roster of ","Liste de contact de "}.
{"Roster size","Taille de la liste de contacts"}.
{"RPC Call Error","Erreur d'appel RPC"}.
{"Running Nodes","Noeuds actifs"}.
{"~s access rule configuration","Configuration des règles d'accès ~s"}.
{"Saturday","Samedi"}.
{"Script check","Validation du script"}.
{"Search Results for ","Résultats de recherche pour "}.
{"Search users in ","Rechercher des utilisateurs "}.
{"Send announcement to all online users","Envoyer l'annonce à tous les utilisateurs en ligne"}.
{"Send announcement to all online users on all hosts","Envoyer l'annonce à tous les utilisateurs en ligne sur tous les serveurs"}.
{"Send announcement to all users","Envoyer l'annonce à tous les utilisateurs"}.
{"Send announcement to all users on all hosts","Envoyer une annonce à tous les utilisateurs de tous les domaines"}.
{"September","Septembre"}.
{"Server ~b","Serveur ~b"}.
{"Server:","Serveur :"}.
{"Set message of the day and send to online users","Définir le message du jour et l'envoyer aux utilisateurs en ligne"}.
{"Set message of the day on all hosts and send to online users","Définir le message du jour pour tous domaines et l'envoyer aux utilisateurs en ligne"}.
{"Shared Roster Groups","Groupes de liste de contacts partagée"}.
{"Show Integral Table","Montrer la table intégralement"}.
{"Show Ordinary Table","Montrer la table ordinaire"}.
{"Shut Down Service","Arrêter le service"}.
{"~s invites you to the room ~s","~s vous a invité dans la salle de discussion ~s"}.
{"Some Jabber clients can store your password in your computer. Use that feature only if you trust your computer is safe.","Certains clients Jabber peuvent stocker votre mot de passe sur votre ordinateur. N'utilisez cette fonctionnalité que si vous avez confiance en la sécurité de votre ordinateur."}.
{"Specify the access model","Définir le modèle d'accès"}.
{"Specify the event message type","Définir le type de message d'événement"}.
{"Specify the publisher model","Définir le modèle de publication"}.
{"~s's Offline Messages Queue","~s messages en file d'attente"}.
{"Start","Démarrer"}.
{"Start Modules at ","Démarrer les modules sur "}.
{"Start Modules","Modules de démarrage"}.
{"Statistics of ~p","Statistiques de ~p"}.
{"Statistics","Statistiques"}.
{"Stop","Arrêter"}.
{"Stop Modules at ","Arrêter les modules sur "}.
{"Stop Modules","Modules d'arrêt"}.
{"Stopped Nodes","Noeuds arrêtés"}.
{"Storage Type","Type de stockage"}.
{"Store binary backup:","Sauvegarde binaire:"}.
{"Store plain text backup:","Sauvegarde texte:"}.
{"Subject","Sujet"}.
{"Submit","Soumettre"}.
{"Submitted","Soumis"}.
{"Subscriber Address","Adresse de l'abonné"}.
{"Subscription","Abonnement"}.
{"Sunday","Dimanche"}.
{"That nickname is already in use by another occupant","Le pseudo est déjà utilisé par un autre occupant"}.
{"That nickname is registered by another person","Le pseudo est enregistré par une autre personne"}.
{"The CAPTCHA is valid.","Le CAPTCHA est valide"}.
{"The CAPTCHA verification has failed","La vérification du CAPTCHA a échoué"}.
{"The collections with which a node is affiliated","Les collections avec lesquelle un nœud est affilié"}.
{"the password is","le mot de passe est"}.
{"The password is too weak","Le mot de passe est trop faible"}.
{"The password of your Jabber account was successfully changed.","Le mot de passe de votre compte Jabber a été changé avec succès."}.
{"There was an error changing the password: ","Il y a eu une erreur en changeant le mot de passe :"}.
{"There was an error creating the account: ","Il y a eu une erreur en créant le compte :"}.
{"There was an error deleting the account: ","Il y a eu une erreur en effaçant le compte :"}.
{"This is case insensitive: macbeth is the same that MacBeth and Macbeth.","C'est insensible à la casse : macbeth est identique à MacBeth et Macbeth."}.
{"This page allows to create a Jabber account in this Jabber server. Your JID (Jabber IDentifier) will be of the form: username@server. Please read carefully the instructions to fill correctly the fields.","Cette page permet de créer un compte Jabber sur ce serveur Jabber. Votre JID (Jabber IDentifier, identifiant Jabber) sera de la forme : nom@serveur. Prière de lire avec attention les instructions pour remplir correctement ces champs."}.
{"This page allows to unregister a Jabber account in this Jabber server.","Cette page permet d'effacer un compte Jabber sur ce serveur Jabber."}.
{"This participant is kicked from the room because he sent an error message","Ce participant est expulsé du salon pour avoir envoyé un message erronée"}.
{"This participant is kicked from the room because he sent an error message to another participant","Ce participant est expulsé du salon pour avoir envoyé un message erronée à un autre participant"}.
{"This participant is kicked from the room because he sent an error presence","Ce participant est expulsé du salon pour avoir envoyé une présence erronée"}.
{"This room is not anonymous","Ce salon n'est pas anonyme"}.
{"Thursday","Jeudi"}.
{"Time delay","Délais"}.
{"Time","Heure"}.
{"To","A"}.
{"To ~s","A ~s"}.
{"Traffic rate limit is exceeded","La limite de trafic a été dépassée"}.
{"Transactions Aborted:","Transactions annulées :"}.
{"Transactions Committed:","Transactions commitées :"}.
{"Transactions Logged:","Transactions journalisées :"}.
{"Transactions Restarted:","Transactions redémarrées :"}.
{"Tuesday","Mardi"}.
{"Unable to generate a CAPTCHA","Impossible de générer le CAPTCHA"}.
{"Unauthorized","Non autorisé"}.
{"Unregister a Jabber account","Effacer un compte Jabber"}.
{"Unregister","Effacer"}.
{"Update message of the day (don't send)","Mise à jour du message du jour (pas d'envoi)"}.
{"Update message of the day on all hosts (don't send)","Mettre à jour le message du jour sur tous les domaines (ne pas envoyer)"}.
{"Update","Mettre à jour"}.
{"Update ","Mise à jour "}.
{"Update plan","Plan de mise à jour"}.
{"Update script","Script de mise à jour"}.
{"Uptime:","Temps depuis le démarrage :"}.
{"Use of STARTTLS required","L'utilisation de STARTTLS est impérative"}.
{"User Management","Gestion des utilisateurs"}.
{"Username:","Nom d'utilisateur :"}.
{"Users are not allowed to register accounts so quickly","Les utilisateurs ne sont pas autorisés à enregistrer des comptes si rapidement"}.
{"Users Last Activity","Dernière activité des utilisateurs"}.
{"Users","Utilisateurs"}.
{"User ","Utilisateur "}.
{"User","Utilisateur"}.
{"Validate","Valider"}.
{"vCard User Search","Recherche dans l'annnuaire"}.
{"Virtual Hosts","Serveurs virtuels"}.
{"Visitors are not allowed to change their nicknames in this room","Les visiteurs ne sont pas autorisés à changer de pseudo dans ce salon"}.
{"Visitors are not allowed to send messages to all occupants","Les visiteurs ne sont pas autorisés à envoyer des messages à tout les occupants"}.
{"Wednesday","Mercredi"}.
{"When to send the last published item","A quel moment envoyer le dernier élément publié"}.
{"Whether to allow subscriptions","Autoriser l'abonnement ?"}.
{"You can later change your password using a Jabber client.","Vous pouvez changer votre mot de passe plus tard en utilisant un client Jabber."}.
{"You have been banned from this room","Vous avez été exclus de ce salon"}.
{"You must fill in field \"Nickname\" in the form","Vous devez préciser le champ \"pseudo\" dans le formulaire"}.
{"You need a client that supports x:data and CAPTCHA to register","Vous avez besoin d'un client prenant en charge x:data et CAPTCHA pour enregistrer un pseudo"}.
{"You need a client that supports x:data to register the nickname","Vous avez besoin d'un client prenant en charge x:data pour enregistrer un pseudo"}.
{"You need an x:data capable client to configure mod_irc settings","Vous avez besoin d'un client supportant x:data pour configurer le module IRC"}.
{"You need an x:data capable client to configure room","Vous avez besoin d'un client supportant x:data pour configurer le salon"}.
{"You need an x:data capable client to search","Vous avez besoin d'un client supportant x:data pour faire une recherche"}.
{"Your active privacy list has denied the routing of this stanza.","Votre règle de flitrage active a empêché le routage de ce stanza."}.
{"Your contact offline message queue is full. The message has been discarded.","La file d'attente de message de votre contact est pleine. Votre message a été détruit."}.
{"Your Jabber account was successfully created.","Votre compte Jabber a été créé avec succès."}.
{"Your Jabber account was successfully deleted.","Votre compte Jabber a été effacé avec succès."}.
{"Your messages to ~s are being blocked. To unblock them, visit ~s","Vos messages pour ~s sont bloqués. Pour les débloquer, veuillez visiter ~s"}.
ejabberd-2.1.11/src/msgs/gl.po 0000664 0000000 0000000 00000152260 12240230175 012726 0 ustar msgid ""
msgstr ""
"Project-Id-Version: 2.1.0-alpha\n"
"Last-Translator: Carlos E. Lopez - suso AT jabber-hispano.org\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Language: Galician (galego)\n"
#: ejabberd_c2s.erl:424 ejabberd_c2s.erl:727
msgid "Use of STARTTLS required"
msgstr "É obrigatorio usar STARTTLS"
#: ejabberd_c2s.erl:503
msgid "No resource provided"
msgstr "Non se proporcionou recurso"
#: ejabberd_c2s.erl:1197
msgid "Replaced by new connection"
msgstr "Substituído por unha nova conexión"
#: ejabberd_c2s.erl:1885
msgid "Your active privacy list has denied the routing of this stanza."
msgstr ""
#: ejabberd_captcha.erl:96 ejabberd_captcha.erl:152 ejabberd_captcha.erl:178
msgid "Enter the text you see"
msgstr "Introduza o texto que ves"
#: ejabberd_captcha.erl:101
msgid "Your messages to ~s are being blocked. To unblock them, visit ~s"
msgstr ""
"As súas mensaxes a ~s encóntranse bloqueadas. Para desbloquear, visite ~s"
#: ejabberd_captcha.erl:134
msgid "If you don't see the CAPTCHA image here, visit the web page."
msgstr ""
#: ejabberd_captcha.erl:146
msgid "CAPTCHA web page"
msgstr ""
#: ejabberd_captcha.erl:307
msgid "The CAPTCHA is valid."
msgstr "O CAPTCHA é válido."
#: mod_adhoc.erl:95 mod_adhoc.erl:125 mod_adhoc.erl:143 mod_adhoc.erl:161
msgid "Commands"
msgstr "Comandos"
#: mod_adhoc.erl:149 mod_adhoc.erl:243
msgid "Ping"
msgstr "Ping"
#: mod_adhoc.erl:260
msgid "Pong"
msgstr "Pong"
#: mod_announce.erl:507 mod_announce_odbc.erl:499
msgid "Really delete message of the day?"
msgstr "Está seguro de quere borrar a mensaxe do dia?"
#: mod_announce.erl:515 mod_announce_odbc.erl:507 mod_configure.erl:1083
#: mod_configure.erl:1128
msgid "Subject"
msgstr "Asunto"
#: mod_announce.erl:520 mod_announce_odbc.erl:512 mod_configure.erl:1088
#: mod_configure.erl:1133
msgid "Message body"
msgstr "Corpo da mensaxe"
#: mod_announce.erl:600 mod_announce_odbc.erl:592
msgid "No body provided for announce message"
msgstr "Non se proporcionou corpo de mensaxe para o anuncio"
#: mod_announce.erl:635 mod_announce_odbc.erl:627
msgid "Announcements"
msgstr "Anuncios"
#: mod_announce.erl:637 mod_announce_odbc.erl:629
msgid "Send announcement to all users"
msgstr "Enviar anuncio a todos os usuarios"
#: mod_announce.erl:639 mod_announce_odbc.erl:631
msgid "Send announcement to all users on all hosts"
msgstr "Enviar anuncio a todos os usuarios en todos os dominios"
#: mod_announce.erl:641 mod_announce_odbc.erl:633
msgid "Send announcement to all online users"
msgstr "Enviar anuncio a todos los usuarios conectados"
#: mod_announce.erl:643 mod_announce_odbc.erl:635 mod_configure.erl:1078
#: mod_configure.erl:1123
msgid "Send announcement to all online users on all hosts"
msgstr "Enviar anuncio a todos os usuarios conectados en todos os dominios"
#: mod_announce.erl:645 mod_announce_odbc.erl:637
msgid "Set message of the day and send to online users"
msgstr "Pór mensaxe do dia e enviar a todos os usuarios conectados"
#: mod_announce.erl:647 mod_announce_odbc.erl:639
msgid "Set message of the day on all hosts and send to online users"
msgstr ""
"Pór mensaxe do día en todos os dominios e enviar aos usuarios conectados"
#: mod_announce.erl:649 mod_announce_odbc.erl:641
msgid "Update message of the day (don't send)"
msgstr "Actualizar mensaxe do dia, pero non envialo"
#: mod_announce.erl:651 mod_announce_odbc.erl:643
msgid "Update message of the day on all hosts (don't send)"
msgstr "Actualizar a mensaxe do día en todos os dominos (pero non envialo)"
#: mod_announce.erl:653 mod_announce_odbc.erl:645
msgid "Delete message of the day"
msgstr "Borrar mensaxe do dia"
#: mod_announce.erl:655 mod_announce_odbc.erl:647
msgid "Delete message of the day on all hosts"
msgstr "Borrar a mensaxe do día en todos os dominios"
#: mod_configure.erl:114 mod_configure.erl:274 mod_configure.erl:296
#: mod_configure.erl:498
msgid "Configuration"
msgstr "Configuración"
#: mod_configure.erl:125 mod_configure.erl:576 web/ejabberd_web_admin.erl:1936
msgid "Database"
msgstr "Base de datos"
#: mod_configure.erl:127 mod_configure.erl:595
msgid "Start Modules"
msgstr "Iniciar módulos"
#: mod_configure.erl:129 mod_configure.erl:596
msgid "Stop Modules"
msgstr "Detener módulos"
#: mod_configure.erl:131 mod_configure.erl:604 web/ejabberd_web_admin.erl:1937
msgid "Backup"
msgstr "Gardar copia de seguridade"
#: mod_configure.erl:133 mod_configure.erl:605
msgid "Restore"
msgstr "Restaurar"
#: mod_configure.erl:135 mod_configure.erl:606
msgid "Dump to Text File"
msgstr "Exportar a ficheiro de texto"
#: mod_configure.erl:137 mod_configure.erl:615
msgid "Import File"
msgstr "Importar ficheiro"
#: mod_configure.erl:139 mod_configure.erl:616
msgid "Import Directory"
msgstr "Importar directorio"
#: mod_configure.erl:141 mod_configure.erl:581 mod_configure.erl:1057
msgid "Restart Service"
msgstr "Reiniciar o servizo"
#: mod_configure.erl:143 mod_configure.erl:582 mod_configure.erl:1102
msgid "Shut Down Service"
msgstr "Deter o servizo"
#: mod_configure.erl:145 mod_configure.erl:518 mod_configure.erl:1197
#: web/ejabberd_web_admin.erl:1527
msgid "Add User"
msgstr "Engadir usuario"
#: mod_configure.erl:147 mod_configure.erl:519 mod_configure.erl:1219
msgid "Delete User"
msgstr "Borrar usuario"
#: mod_configure.erl:149 mod_configure.erl:520 mod_configure.erl:1231
msgid "End User Session"
msgstr "Pechar sesión de usuario"
#: mod_configure.erl:151 mod_configure.erl:521 mod_configure.erl:1243
#: mod_configure.erl:1255
msgid "Get User Password"
msgstr "Ver contrasinal de usuario"
#: mod_configure.erl:153 mod_configure.erl:522
msgid "Change User Password"
msgstr "Cambiar contrasinal de usuario"
#: mod_configure.erl:155 mod_configure.erl:523 mod_configure.erl:1272
msgid "Get User Last Login Time"
msgstr "Ver data da última conexión de usuario"
#: mod_configure.erl:157 mod_configure.erl:524 mod_configure.erl:1284
msgid "Get User Statistics"
msgstr "Ver estatísticas de usuario"
#: mod_configure.erl:159 mod_configure.erl:525
msgid "Get Number of Registered Users"
msgstr "Ver número de usuarios rexistrados"
#: mod_configure.erl:161 mod_configure.erl:526
msgid "Get Number of Online Users"
msgstr "Ver número de usuarios conectados"
#: mod_configure.erl:163 mod_configure.erl:509 web/ejabberd_web_admin.erl:831
#: web/ejabberd_web_admin.erl:872
msgid "Access Control Lists"
msgstr "Listas de Control de Acceso"
#: mod_configure.erl:165 mod_configure.erl:510 web/ejabberd_web_admin.erl:940
#: web/ejabberd_web_admin.erl:976
msgid "Access Rules"
msgstr "Regras de Acceso"
#: mod_configure.erl:297 mod_configure.erl:499
msgid "User Management"
msgstr "Administración de usuarios"
#: mod_configure.erl:500 web/ejabberd_web_admin.erl:1058
#: web/ejabberd_web_admin.erl:1462
msgid "Online Users"
msgstr "Usuarios conectados"
#: mod_configure.erl:501
msgid "All Users"
msgstr "Todos os usuarios"
#: mod_configure.erl:502
msgid "Outgoing s2s Connections"
msgstr "Conexións S2S saíntes"
#: mod_configure.erl:503 web/ejabberd_web_admin.erl:1907
msgid "Running Nodes"
msgstr "Nodos funcionando"
#: mod_configure.erl:504 web/ejabberd_web_admin.erl:1909
msgid "Stopped Nodes"
msgstr "Nodos detidos"
#: mod_configure.erl:577 mod_configure.erl:587 web/ejabberd_web_admin.erl:1953
msgid "Modules"
msgstr "Módulos"
#: mod_configure.erl:578
msgid "Backup Management"
msgstr "Xestión de copia de seguridade"
#: mod_configure.erl:579
msgid "Import Users From jabberd14 Spool Files"
msgstr "Importar usuarios de ficheiros spool de jabberd-1.4"
#: mod_configure.erl:699
msgid "To ~s"
msgstr "A ~s"
#: mod_configure.erl:717
msgid "From ~s"
msgstr "De ~s"
#: mod_configure.erl:913
msgid "Database Tables Configuration at "
msgstr "Configuración de táboas da base de datos en "
#: mod_configure.erl:918
msgid "Choose storage type of tables"
msgstr "Selecciona tipo de almacenamento das táboas"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "Disc only copy"
msgstr "Copia en disco soamente"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "RAM and disc copy"
msgstr "Copia en RAM e disco"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "RAM copy"
msgstr "Copia en RAM"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "Remote copy"
msgstr "Copia remota"
#: mod_configure.erl:950
msgid "Stop Modules at "
msgstr "Deter módulos en "
#: mod_configure.erl:954
msgid "Choose modules to stop"
msgstr "Selecciona módulos a deter"
#: mod_configure.erl:969
msgid "Start Modules at "
msgstr "Iniciar módulos en "
#: mod_configure.erl:973
msgid "Enter list of {Module, [Options]}"
msgstr "Introduce lista de {Módulo, [Opcións]}"
#: mod_configure.erl:974
msgid "List of modules to start"
msgstr "Lista de módulos a iniciar"
#: mod_configure.erl:983
msgid "Backup to File at "
msgstr "Copia de seguridade de arquivos en "
#: mod_configure.erl:987 mod_configure.erl:1001
msgid "Enter path to backup file"
msgstr "Introduce ruta ao ficheiro de copia de seguridade"
#: mod_configure.erl:988 mod_configure.erl:1002 mod_configure.erl:1016
#: mod_configure.erl:1030
msgid "Path to File"
msgstr "Ruta ao ficheiro"
#: mod_configure.erl:997
msgid "Restore Backup from File at "
msgstr "Restaura copia de seguridade desde o ficheiro en "
#: mod_configure.erl:1011
msgid "Dump Backup to Text File at "
msgstr "Exporta copia de seguridade a ficheiro de texto en "
#: mod_configure.erl:1015
msgid "Enter path to text file"
msgstr "Introduce ruta ao ficheiro de texto"
#: mod_configure.erl:1025
msgid "Import User from File at "
msgstr "Importa usuario desde ficheiro en "
#: mod_configure.erl:1029
msgid "Enter path to jabberd14 spool file"
msgstr "Introduce ruta ao ficheiro jabberd14 spool"
#: mod_configure.erl:1039
msgid "Import Users from Dir at "
msgstr "Importar usuarios desde o directorio en "
#: mod_configure.erl:1043
msgid "Enter path to jabberd14 spool dir"
msgstr "Introduce a ruta ao directorio de jabberd14 spools"
#: mod_configure.erl:1044
msgid "Path to Dir"
msgstr "Ruta ao directorio"
#: mod_configure.erl:1060 mod_configure.erl:1105
msgid "Time delay"
msgstr "Atraso temporal"
#: mod_configure.erl:1143
msgid "Access Control List Configuration"
msgstr "Configuración da Lista de Control de Acceso"
#: mod_configure.erl:1147
msgid "Access control lists"
msgstr "Listas de Control de Acceso"
#: mod_configure.erl:1171
msgid "Access Configuration"
msgstr "Configuración de accesos"
#: mod_configure.erl:1175
msgid "Access rules"
msgstr "Regras de acceso"
#: mod_configure.erl:1200 mod_configure.erl:1222 mod_configure.erl:1234
#: mod_configure.erl:1246 mod_configure.erl:1258 mod_configure.erl:1275
#: mod_configure.erl:1287 mod_configure.erl:1650 mod_configure.erl:1700
#: mod_configure.erl:1721 mod_roster.erl:943 mod_roster_odbc.erl:1060
#: mod_vcard.erl:472 mod_vcard_ldap.erl:554 mod_vcard_odbc.erl:448
msgid "Jabber ID"
msgstr "Jabber ID"
#: mod_configure.erl:1205 mod_configure.erl:1263 mod_configure.erl:1651
#: mod_configure.erl:1863 mod_muc/mod_muc_room.erl:3224 mod_register.erl:235
#: web/ejabberd_web_admin.erl:1520
msgid "Password"
msgstr "Contrasinal"
#: mod_configure.erl:1210
msgid "Password Verification"
msgstr "Verificación da contrasinal"
#: mod_configure.erl:1301
msgid "Number of registered users"
msgstr "Número de usuarios rexistrados"
#: mod_configure.erl:1315
msgid "Number of online users"
msgstr "Número de usuarios conectados"
#: mod_configure.erl:1682 web/ejabberd_web_admin.erl:1588
#: web/ejabberd_web_admin.erl:1743
msgid "Never"
msgstr "Nunca"
#: mod_configure.erl:1696 web/ejabberd_web_admin.erl:1601
#: web/ejabberd_web_admin.erl:1756
msgid "Online"
msgstr "Conectado"
#: mod_configure.erl:1701
msgid "Last login"
msgstr "Última conexión"
#: mod_configure.erl:1722
msgid "Roster size"
msgstr "Tamaño da lista de contactos"
#: mod_configure.erl:1723
msgid "IP addresses"
msgstr "Direccións IP"
#: mod_configure.erl:1724
msgid "Resources"
msgstr "Recursos"
#: mod_configure.erl:1850
msgid "Administration of "
msgstr "Administración de "
#: mod_configure.erl:1853
msgid "Action on user"
msgstr "Acción no usuario"
#: mod_configure.erl:1857
msgid "Edit Properties"
msgstr "Editar propiedades"
#: mod_configure.erl:1860 web/ejabberd_web_admin.erl:1769
msgid "Remove User"
msgstr "Eliminar usuario"
#: mod_irc/mod_irc.erl:201 mod_irc/mod_irc_odbc.erl:196
#: mod_muc/mod_muc.erl:336 mod_muc/mod_muc_odbc.erl:342
msgid "Access denied by service policy"
msgstr "Acceso denegado pola política do servizo"
#: mod_irc/mod_irc.erl:401 mod_irc/mod_irc_odbc.erl:398
msgid "IRC Transport"
msgstr "Transporte IRC"
#: mod_irc/mod_irc.erl:428 mod_irc/mod_irc_odbc.erl:425
msgid "ejabberd IRC module"
msgstr "Módulo de IRC para ejabberd"
#: mod_irc/mod_irc.erl:559 mod_irc/mod_irc_odbc.erl:568
msgid "You need an x:data capable client to configure mod_irc settings"
msgstr ""
"Necesitas un cliente con soporte de x:data para configurar as opcións de "
"mod_irc"
#: mod_irc/mod_irc.erl:566 mod_irc/mod_irc_odbc.erl:575
msgid "Registration in mod_irc for "
msgstr "Rexistro en mod_irc para"
#: mod_irc/mod_irc.erl:571 mod_irc/mod_irc_odbc.erl:580
msgid ""
"Enter username, encodings, ports and passwords you wish to use for "
"connecting to IRC servers"
msgstr ""
"Introduza o nome de usuario, codificaciones de carácter, portos e "
"contrasinal que pretende utilizar a conectar a servidores de IRC"
#: mod_irc/mod_irc.erl:576 mod_irc/mod_irc_odbc.erl:585
msgid "IRC Username"
msgstr "Nome de usuario en IRC"
#: mod_irc/mod_irc.erl:586 mod_irc/mod_irc_odbc.erl:595
msgid ""
"If you want to specify different ports, passwords, encodings for IRC "
"servers, fill this list with values in format '{\"irc server\", \"encoding"
"\", port, \"password\"}'. By default this service use \"~s\" encoding, port "
"~p, empty password."
msgstr ""
"Se quere especificar codificaciones de caracteres diferentes, contrasinal ou "
"servidor IRC rechea esta lista con valores no formato '{\"servidor irc\", "
"\"codificación\", \"porto\", \"contrasinal\"}'. Este servizo utiliza por "
"defecto a codificación \"~s\", porto ~p, sen contrasinal."
#: mod_irc/mod_irc.erl:598 mod_irc/mod_irc_odbc.erl:607
msgid ""
"Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef."
"net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."
msgstr ""
"Exemplo: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef."
"net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."
#: mod_irc/mod_irc.erl:603 mod_irc/mod_irc_odbc.erl:612
msgid "Connections parameters"
msgstr "Parámetros de conexiones"
#: mod_irc/mod_irc.erl:728 mod_irc/mod_irc_odbc.erl:757
msgid "Join IRC channel"
msgstr "Entrar en canle IRC"
#: mod_irc/mod_irc.erl:732 mod_irc/mod_irc_odbc.erl:761
msgid "IRC channel (don't put the first #)"
msgstr "Canle de IRC (non poñer o primeiro #)"
#: mod_irc/mod_irc.erl:737 mod_irc/mod_irc_odbc.erl:766
msgid "IRC server"
msgstr "Servidor IRC"
#: mod_irc/mod_irc.erl:770 mod_irc/mod_irc.erl:774
#: mod_irc/mod_irc_odbc.erl:799 mod_irc/mod_irc_odbc.erl:803
msgid "Join the IRC channel here."
msgstr "Únete á canle de IRC aquí."
#: mod_irc/mod_irc.erl:778 mod_irc/mod_irc_odbc.erl:807
msgid "Join the IRC channel in this Jabber ID: ~s"
msgstr "Únete á canle de IRC con este IDE de Jabber: ~s"
#: mod_irc/mod_irc.erl:863 mod_irc/mod_irc_odbc.erl:904
msgid "IRC settings"
msgstr "IRC axustes"
#: mod_irc/mod_irc.erl:868 mod_irc/mod_irc_odbc.erl:909
msgid ""
"Enter username and encodings you wish to use for connecting to IRC servers. "
"Press 'Next' to get more fields to fill in. Press 'Complete' to save "
"settings."
msgstr ""
"Introduce o nome de usuario e codificaciones de carácteres que queiras usar "
"ao conectar nos servidores de IRC. Presione 'Siguiente' para obtener más "
"campos para rellenar Presione 'completo' para guardar axustes."
#: mod_irc/mod_irc.erl:874 mod_irc/mod_irc_odbc.erl:915
msgid "IRC username"
msgstr "Nome de usuario en IRC"
#: mod_irc/mod_irc.erl:923 mod_irc/mod_irc_odbc.erl:964
msgid "Password ~b"
msgstr "Contrasinal ~b"
#: mod_irc/mod_irc.erl:928 mod_irc/mod_irc_odbc.erl:969
msgid "Port ~b"
msgstr "Porto ~b"
#: mod_irc/mod_irc.erl:933 mod_irc/mod_irc_odbc.erl:974
msgid "Encoding for server ~b"
msgstr "Codificación de servidor ~b"
#: mod_irc/mod_irc.erl:942 mod_irc/mod_irc_odbc.erl:983
msgid "Server ~b"
msgstr "Servidor ~b"
#: mod_muc/mod_muc.erl:449 mod_muc/mod_muc_odbc.erl:456
msgid "Only service administrators are allowed to send service messages"
msgstr ""
"Só os administradores do servizo teñen permiso para enviar mensaxes de "
"servizo"
#: mod_muc/mod_muc.erl:493 mod_muc/mod_muc_odbc.erl:500
msgid "Room creation is denied by service policy"
msgstr "Denegar crear a sala por política do servizo"
#: mod_muc/mod_muc.erl:500 mod_muc/mod_muc_odbc.erl:507
msgid "Conference room does not exist"
msgstr "A sala de conferencias non existe"
#: mod_muc/mod_muc.erl:582 mod_muc/mod_muc_odbc.erl:595
msgid "Chatrooms"
msgstr "Salas de charla"
#: mod_muc/mod_muc.erl:712 mod_muc/mod_muc_odbc.erl:729
#, fuzzy
msgid "You need a client that supports x:data to register the nickname"
msgstr ""
"Necesitas un cliente con soporte de x:data para poder rexistrar o alcume"
#: mod_muc/mod_muc.erl:718 mod_muc/mod_muc_odbc.erl:735
msgid "Nickname Registration at "
msgstr "Rexistro do alcume en "
#: mod_muc/mod_muc.erl:722 mod_muc/mod_muc_odbc.erl:739
msgid "Enter nickname you want to register"
msgstr "Introduce o alcume que queiras rexistrar"
#: mod_muc/mod_muc.erl:723 mod_muc/mod_muc_odbc.erl:740
#: mod_muc/mod_muc_room.erl:3810 mod_roster.erl:944 mod_roster_odbc.erl:1061
#: mod_vcard.erl:364 mod_vcard.erl:477 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:453
msgid "Nickname"
msgstr "Alcume"
#: mod_muc/mod_muc.erl:762 mod_muc/mod_muc_odbc.erl:784
#: mod_muc/mod_muc_room.erl:1064 mod_muc/mod_muc_room.erl:1787
msgid "That nickname is registered by another person"
msgstr "O alcume xa está rexistrado por outra persoa"
#: mod_muc/mod_muc.erl:788 mod_muc/mod_muc_odbc.erl:811
msgid "You must fill in field \"Nickname\" in the form"
msgstr "Debes encher o campo \"Alcumo\" no formulario"
#: mod_muc/mod_muc.erl:808 mod_muc/mod_muc_odbc.erl:831
msgid "ejabberd MUC module"
msgstr "Módulo de MUC para ejabberd"
#: mod_muc/mod_muc_log.erl:374 mod_muc/mod_muc_log.erl:381
msgid "Chatroom configuration modified"
msgstr "Configuración de la sala modificada"
#: mod_muc/mod_muc_log.erl:384
msgid "joins the room"
msgstr "entra en la sala"
#: mod_muc/mod_muc_log.erl:387 mod_muc/mod_muc_log.erl:390
msgid "leaves the room"
msgstr "sae da sala"
#: mod_muc/mod_muc_log.erl:393 mod_muc/mod_muc_log.erl:396
msgid "has been banned"
msgstr "foi bloqueado"
#: mod_muc/mod_muc_log.erl:399 mod_muc/mod_muc_log.erl:402
msgid "has been kicked"
msgstr "foi expulsado"
#: mod_muc/mod_muc_log.erl:405
msgid "has been kicked because of an affiliation change"
msgstr "foi expulsado debido a un cambio de afiliación"
#: mod_muc/mod_muc_log.erl:408
msgid "has been kicked because the room has been changed to members-only"
msgstr "foi expulsado, porque a sala cambiouse a só-membros"
#: mod_muc/mod_muc_log.erl:411
msgid "has been kicked because of a system shutdown"
msgstr "foi expulsado por mor dun sistema de peche"
#: mod_muc/mod_muc_log.erl:414
msgid "is now known as"
msgstr "cámbiase o nome a"
#: mod_muc/mod_muc_log.erl:417 mod_muc/mod_muc_log.erl:688
#: mod_muc/mod_muc_room.erl:2393
msgid " has set the subject to: "
msgstr " puxo o asunto: "
#: mod_muc/mod_muc_log.erl:452
#, fuzzy
msgid "Chatroom is created"
msgstr "Salas de charla"
#: mod_muc/mod_muc_log.erl:453
#, fuzzy
msgid "Chatroom is destroyed"
msgstr "Salas de charla"
#: mod_muc/mod_muc_log.erl:454
#, fuzzy
msgid "Chatroom is started"
msgstr "Salas de charla"
#: mod_muc/mod_muc_log.erl:455
#, fuzzy
msgid "Chatroom is stopped"
msgstr "Salas de charla"
#: mod_muc/mod_muc_log.erl:459
msgid "Monday"
msgstr "Luns"
#: mod_muc/mod_muc_log.erl:460
msgid "Tuesday"
msgstr "Martes"
#: mod_muc/mod_muc_log.erl:461
msgid "Wednesday"
msgstr "Mércores"
#: mod_muc/mod_muc_log.erl:462
msgid "Thursday"
msgstr "Xoves"
#: mod_muc/mod_muc_log.erl:463
msgid "Friday"
msgstr "Venres"
#: mod_muc/mod_muc_log.erl:464
msgid "Saturday"
msgstr "Sábado"
#: mod_muc/mod_muc_log.erl:465
msgid "Sunday"
msgstr "Domingo"
#: mod_muc/mod_muc_log.erl:469
msgid "January"
msgstr "Xaneiro"
#: mod_muc/mod_muc_log.erl:470
msgid "February"
msgstr "Febreiro"
#: mod_muc/mod_muc_log.erl:471
msgid "March"
msgstr "Marzo"
#: mod_muc/mod_muc_log.erl:472
msgid "April"
msgstr "Abril"
#: mod_muc/mod_muc_log.erl:473
msgid "May"
msgstr "Maio"
#: mod_muc/mod_muc_log.erl:474
msgid "June"
msgstr "Xuño"
#: mod_muc/mod_muc_log.erl:475
msgid "July"
msgstr "Xullo"
#: mod_muc/mod_muc_log.erl:476
msgid "August"
msgstr "Agosto"
#: mod_muc/mod_muc_log.erl:477
msgid "September"
msgstr "Setembro"
#: mod_muc/mod_muc_log.erl:478
msgid "October"
msgstr "Outubro"
#: mod_muc/mod_muc_log.erl:479
msgid "November"
msgstr "Novembro"
#: mod_muc/mod_muc_log.erl:480
msgid "December"
msgstr "Decembro"
#: mod_muc/mod_muc_log.erl:750
msgid "Room Configuration"
msgstr "Configuración da Sala"
#: mod_muc/mod_muc_log.erl:759
msgid "Room Occupants"
msgstr "Ocupantes da sala"
#: mod_muc/mod_muc_room.erl:174
msgid "Traffic rate limit is exceeded"
msgstr "Hase exedido o límite de tráfico"
#: mod_muc/mod_muc_room.erl:246
msgid ""
"This participant is kicked from the room because he sent an error message"
msgstr ""
"Este participante é expulsado da sala, xa que enviou unha mensaxe de erro"
#: mod_muc/mod_muc_room.erl:255
msgid "It is not allowed to send private messages to the conference"
msgstr "Impedir o envio de mensaxes privadas á sala"
#: mod_muc/mod_muc_room.erl:332
msgid "Please, wait for a while before sending new voice request"
msgstr ""
#: mod_muc/mod_muc_room.erl:347
msgid "Voice requests are disabled in this conference"
msgstr ""
#: mod_muc/mod_muc_room.erl:364
msgid "Failed to extract JID from your voice request approval"
msgstr ""
#: mod_muc/mod_muc_room.erl:393
msgid "Only moderators can approve voice requests"
msgstr ""
#: mod_muc/mod_muc_room.erl:408
msgid "Improper message type"
msgstr "Tipo de mensaxe incorrecta"
#: mod_muc/mod_muc_room.erl:518
msgid ""
"This participant is kicked from the room because he sent an error message to "
"another participant"
msgstr ""
"Este participante é expulsado da sala, porque el enviou unha mensaxe de erro "
"a outro participante"
#: mod_muc/mod_muc_room.erl:531
msgid "It is not allowed to send private messages of type \"groupchat\""
msgstr "Non está permitido enviar mensaxes privadas do tipo \"groupchat\""
#: mod_muc/mod_muc_room.erl:543 mod_muc/mod_muc_room.erl:611
msgid "Recipient is not in the conference room"
msgstr "O receptor non está na sala de conferencia"
#: mod_muc/mod_muc_room.erl:564 mod_muc/mod_muc_room.erl:585
msgid "It is not allowed to send private messages"
msgstr "Non está permitido enviar mensaxes privadas"
#: mod_muc/mod_muc_room.erl:576 mod_muc/mod_muc_room.erl:956
#: mod_muc/mod_muc_room.erl:4040
msgid "Only occupants are allowed to send messages to the conference"
msgstr "Só os ocupantes poden enviar mensaxes á sala"
#: mod_muc/mod_muc_room.erl:634
msgid "Only occupants are allowed to send queries to the conference"
msgstr "Só os ocupantes poden enviar solicitudes á sala"
#: mod_muc/mod_muc_room.erl:646
msgid "Queries to the conference members are not allowed in this room"
msgstr "Nesta sala non se permiten solicitudes aos membros da sala"
#: mod_muc/mod_muc_room.erl:932
msgid ""
"Only moderators and participants are allowed to change the subject in this "
"room"
msgstr ""
"Só os moderadores e os participantes se lles permite cambiar o tema nesta "
"sala"
#: mod_muc/mod_muc_room.erl:937
msgid "Only moderators are allowed to change the subject in this room"
msgstr "Só os moderadores están autorizados a cambiar o tema nesta sala"
#: mod_muc/mod_muc_room.erl:947
msgid "Visitors are not allowed to send messages to all occupants"
msgstr "Os visitantes non poden enviar mensaxes a todos os ocupantes"
#: mod_muc/mod_muc_room.erl:1021
msgid ""
"This participant is kicked from the room because he sent an error presence"
msgstr ""
"Este participante é expulsado da sala, porque el enviou un erro de presenza"
#: mod_muc/mod_muc_room.erl:1040
msgid "Visitors are not allowed to change their nicknames in this room"
msgstr ""
"Os visitantes non están autorizados a cambiar os seus That alcumes nesta sala"
#: mod_muc/mod_muc_room.erl:1053 mod_muc/mod_muc_room.erl:1779
msgid "That nickname is already in use by another occupant"
msgstr "Ese alcume que xa está en uso por outro ocupante"
#: mod_muc/mod_muc_room.erl:1768
msgid "You have been banned from this room"
msgstr "fuches bloqueado nesta sala"
#: mod_muc/mod_muc_room.erl:1771
msgid "Membership is required to enter this room"
msgstr "Necesitas ser membro desta sala para poder entrar"
#: mod_muc/mod_muc_room.erl:1807
msgid "This room is not anonymous"
msgstr "Sala non anónima"
#: mod_muc/mod_muc_room.erl:1833
msgid "A password is required to enter this room"
msgstr "Necesítase contrasinal para entrar nesta sala"
#: mod_muc/mod_muc_room.erl:1855 mod_register.erl:246
msgid "Too many CAPTCHA requests"
msgstr ""
#: mod_muc/mod_muc_room.erl:1864 mod_register.erl:251
#, fuzzy
msgid "Unable to generate a CAPTCHA"
msgstr "Non se pode xerar un CAPTCHA"
#: mod_muc/mod_muc_room.erl:1874
msgid "Incorrect password"
msgstr "Contrasinal incorrecta"
#: mod_muc/mod_muc_room.erl:2448
msgid "Administrator privileges required"
msgstr "Necesítase privilexios de administrador"
#: mod_muc/mod_muc_room.erl:2463
msgid "Moderator privileges required"
msgstr "Necesítase privilexios de moderador"
#: mod_muc/mod_muc_room.erl:2619
msgid "Jabber ID ~s is invalid"
msgstr "O Jabber ID ~s non é válido"
#: mod_muc/mod_muc_room.erl:2633
msgid "Nickname ~s does not exist in the room"
msgstr "O alcume ~s non existe na sala"
#: mod_muc/mod_muc_room.erl:2659 mod_muc/mod_muc_room.erl:3049
msgid "Invalid affiliation: ~s"
msgstr "Afiliación non válida: ~s"
#: mod_muc/mod_muc_room.erl:2713
msgid "Invalid role: ~s"
msgstr "Rol non válido: ~s"
#: mod_muc/mod_muc_room.erl:3026 mod_muc/mod_muc_room.erl:3062
msgid "Owner privileges required"
msgstr "Requírense privilexios de propietario da sala"
#: mod_muc/mod_muc_room.erl:3195
msgid "Configuration of room ~s"
msgstr "Configuración para a sala ~s"
#: mod_muc/mod_muc_room.erl:3200
msgid "Room title"
msgstr "Título da sala"
#: mod_muc/mod_muc_room.erl:3203 mod_muc/mod_muc_room.erl:3692
msgid "Room description"
msgstr "Descrición da sala"
#: mod_muc/mod_muc_room.erl:3210
msgid "Make room persistent"
msgstr "Sala permanente"
#: mod_muc/mod_muc_room.erl:3215
msgid "Make room public searchable"
msgstr "Sala publicamente visible"
#: mod_muc/mod_muc_room.erl:3218
msgid "Make participants list public"
msgstr "A lista de participantes é pública"
#: mod_muc/mod_muc_room.erl:3221
msgid "Make room password protected"
msgstr "Protexer a sala con contrasinal"
#: mod_muc/mod_muc_room.erl:3232
msgid "Maximum Number of Occupants"
msgstr "Número máximo de ocupantes"
#: mod_muc/mod_muc_room.erl:3239
msgid "No limit"
msgstr "Sen límite"
#: mod_muc/mod_muc_room.erl:3250
msgid "Present real Jabber IDs to"
msgstr "Os Jabber ID reais poden velos"
#: mod_muc/mod_muc_room.erl:3258 mod_muc/mod_muc_room.erl:3292
msgid "moderators only"
msgstr "só moderadores"
#: mod_muc/mod_muc_room.erl:3260 mod_muc/mod_muc_room.erl:3294
msgid "anyone"
msgstr "calquera"
#: mod_muc/mod_muc_room.erl:3262
msgid "Make room members-only"
msgstr "Sala só para membros"
#: mod_muc/mod_muc_room.erl:3265
msgid "Make room moderated"
msgstr "Facer sala moderada"
#: mod_muc/mod_muc_room.erl:3268
msgid "Default users as participants"
msgstr "Os usuarios son participantes por defecto"
#: mod_muc/mod_muc_room.erl:3271
msgid "Allow users to change the subject"
msgstr "Permitir aos usuarios cambiar o asunto"
#: mod_muc/mod_muc_room.erl:3274
msgid "Allow users to send private messages"
msgstr "Permitir aos usuarios enviar mensaxes privadas"
#: mod_muc/mod_muc_room.erl:3279
#, fuzzy
msgid "Allow visitors to send private messages to"
msgstr "Permitir aos usuarios enviar mensaxes privadas"
#: mod_muc/mod_muc_room.erl:3290
msgid "nobody"
msgstr ""
#: mod_muc/mod_muc_room.erl:3296
msgid "Allow users to query other users"
msgstr "Permitir aos usuarios consultar a outros usuarios"
#: mod_muc/mod_muc_room.erl:3299
msgid "Allow users to send invites"
msgstr "Permitir aos usuarios enviar invitacións"
#: mod_muc/mod_muc_room.erl:3302
msgid "Allow visitors to send status text in presence updates"
msgstr ""
"Permitir aos visitantes enviar texto de estado nas actualizacións depresenza"
#: mod_muc/mod_muc_room.erl:3305
msgid "Allow visitors to change nickname"
msgstr "Permitir aos visitantes cambiarse o alcume"
#: mod_muc/mod_muc_room.erl:3308
#, fuzzy
msgid "Allow visitors to send voice requests"
msgstr "Permitir aos usuarios enviar invitacións"
#: mod_muc/mod_muc_room.erl:3311
msgid "Minimum interval between voice requests (in seconds)"
msgstr ""
#: mod_muc/mod_muc_room.erl:3317
msgid "Make room CAPTCHA protected"
msgstr "Protexer a sala con CAPTCHA"
#: mod_muc/mod_muc_room.erl:3322
msgid "Exclude Jabber IDs from CAPTCHA challenge"
msgstr ""
#: mod_muc/mod_muc_room.erl:3329
msgid "Enable logging"
msgstr "Gardar históricos"
#: mod_muc/mod_muc_room.erl:3337
msgid "You need an x:data capable client to configure room"
msgstr "Necesitas un cliente con soporte de x:data para configurar a sala"
#: mod_muc/mod_muc_room.erl:3694
msgid "Number of occupants"
msgstr "Número de ocupantes"
#: mod_muc/mod_muc_room.erl:3750
msgid "private, "
msgstr "privado"
#: mod_muc/mod_muc_room.erl:3799
msgid "Voice request"
msgstr ""
#: mod_muc/mod_muc_room.erl:3803
msgid "Either approve or decline the voice request."
msgstr ""
#: mod_muc/mod_muc_room.erl:3809
#, fuzzy
msgid "User JID"
msgstr "Usuario "
#: mod_muc/mod_muc_room.erl:3811
msgid "Grant voice to this person?"
msgstr ""
#: mod_muc/mod_muc_room.erl:3960
msgid "~s invites you to the room ~s"
msgstr "~s invítache á sala ~s"
#: mod_muc/mod_muc_room.erl:3969
msgid "the password is"
msgstr "a contrasinal é"
#: mod_offline.erl:510 mod_offline_odbc.erl:352
msgid ""
"Your contact offline message queue is full. The message has been discarded."
msgstr ""
"A túa cola de mensaxes diferidas de contactos está chea. A mensaxe "
"descartouse."
#: mod_offline.erl:560 mod_offline_odbc.erl:408
msgid "~s's Offline Messages Queue"
msgstr "Cola de mensaxes diferidas de ~s"
#: mod_offline.erl:563 mod_offline_odbc.erl:411 mod_roster.erl:987
#: mod_roster_odbc.erl:1104 mod_shared_roster.erl:901
#: mod_shared_roster.erl:1010 mod_shared_roster_odbc.erl:930
#: mod_shared_roster_odbc.erl:1039 web/ejabberd_web_admin.erl:833
#: web/ejabberd_web_admin.erl:874 web/ejabberd_web_admin.erl:942
#: web/ejabberd_web_admin.erl:978 web/ejabberd_web_admin.erl:1019
#: web/ejabberd_web_admin.erl:1508 web/ejabberd_web_admin.erl:1760
#: web/ejabberd_web_admin.erl:1931 web/ejabberd_web_admin.erl:1963
#: web/ejabberd_web_admin.erl:2031 web/ejabberd_web_admin.erl:2135
#: web/ejabberd_web_admin.erl:2160 web/ejabberd_web_admin.erl:2248
msgid "Submitted"
msgstr "Enviado"
#: mod_offline.erl:571
msgid "Time"
msgstr "Data"
#: mod_offline.erl:572
msgid "From"
msgstr "De"
#: mod_offline.erl:573
msgid "To"
msgstr "Para"
#: mod_offline.erl:574 mod_offline_odbc.erl:419
msgid "Packet"
msgstr "Paquete"
#: mod_offline.erl:587 mod_offline_odbc.erl:432 mod_shared_roster.erl:908
#: mod_shared_roster_odbc.erl:937 web/ejabberd_web_admin.erl:882
#: web/ejabberd_web_admin.erl:986
msgid "Delete Selected"
msgstr "Eliminar os seleccionados"
#: mod_offline.erl:645 mod_offline_odbc.erl:519
msgid "Offline Messages:"
msgstr "Mensaxes sen conexión:"
#: mod_offline.erl:645 mod_offline_odbc.erl:519
msgid "Remove All Offline Messages"
msgstr "Borrar Todas as Mensaxes Sen conexión"
#: mod_proxy65/mod_proxy65_service.erl:213
msgid "ejabberd SOCKS5 Bytestreams module"
msgstr "ejabberd SOCKS5 Bytestreams module"
#: mod_pubsub/mod_pubsub.erl:1120 mod_pubsub/mod_pubsub_odbc.erl:929
msgid "Publish-Subscribe"
msgstr "Publicar-Subscribir"
#: mod_pubsub/mod_pubsub.erl:1214 mod_pubsub/mod_pubsub_odbc.erl:1025
msgid "ejabberd Publish-Subscribe module"
msgstr "Módulo de Publicar-Subscribir de ejabberd"
#: mod_pubsub/mod_pubsub.erl:1497 mod_pubsub/mod_pubsub_odbc.erl:1312
msgid "PubSub subscriber request"
msgstr "Petición de subscriptor de PubSub"
#: mod_pubsub/mod_pubsub.erl:1499 mod_pubsub/mod_pubsub_odbc.erl:1314
msgid "Choose whether to approve this entity's subscription."
msgstr "Decidir se aprobar a subscripción desta entidade."
#: mod_pubsub/mod_pubsub.erl:1505 mod_pubsub/mod_pubsub_odbc.erl:1320
msgid "Node ID"
msgstr "Nodo IDE"
#: mod_pubsub/mod_pubsub.erl:1510 mod_pubsub/mod_pubsub_odbc.erl:1325
msgid "Subscriber Address"
msgstr "Dirección do subscriptor"
#: mod_pubsub/mod_pubsub.erl:1516 mod_pubsub/mod_pubsub_odbc.erl:1331
msgid "Allow this Jabber ID to subscribe to this pubsub node?"
msgstr "Desexas permitir a este JabberID que se subscriba a este nodo PubSub?"
#: mod_pubsub/mod_pubsub.erl:3474 mod_pubsub/mod_pubsub_odbc.erl:3287
msgid "Deliver payloads with event notifications"
msgstr "Enviar payloads xunto coas notificacións de eventos"
#: mod_pubsub/mod_pubsub.erl:3475 mod_pubsub/mod_pubsub_odbc.erl:3288
msgid "Deliver event notifications"
msgstr "Entregar notificacións de eventos"
#: mod_pubsub/mod_pubsub.erl:3476 mod_pubsub/mod_pubsub_odbc.erl:3289
msgid "Notify subscribers when the node configuration changes"
msgstr "Notificar subscriptores cando cambia a configuración do nodo"
#: mod_pubsub/mod_pubsub.erl:3477 mod_pubsub/mod_pubsub_odbc.erl:3290
msgid "Notify subscribers when the node is deleted"
msgstr "Notificar subscriptores cando o nodo bórrase"
#: mod_pubsub/mod_pubsub.erl:3478 mod_pubsub/mod_pubsub_odbc.erl:3291
msgid "Notify subscribers when items are removed from the node"
msgstr "Notificar subscriptores cando os elementos bórranse do nodo"
#: mod_pubsub/mod_pubsub.erl:3479 mod_pubsub/mod_pubsub_odbc.erl:3292
msgid "Persist items to storage"
msgstr "Persistir elementos ao almacenar"
#: mod_pubsub/mod_pubsub.erl:3480 mod_pubsub/mod_pubsub_odbc.erl:3293
msgid "A friendly name for the node"
msgstr "Un nome para o nodo"
#: mod_pubsub/mod_pubsub.erl:3481 mod_pubsub/mod_pubsub_odbc.erl:3294
msgid "Max # of items to persist"
msgstr "Máximo # de elementos que persisten"
#: mod_pubsub/mod_pubsub.erl:3482 mod_pubsub/mod_pubsub_odbc.erl:3295
msgid "Whether to allow subscriptions"
msgstr "Permitir subscripciones"
#: mod_pubsub/mod_pubsub.erl:3483 mod_pubsub/mod_pubsub_odbc.erl:3296
msgid "Specify the access model"
msgstr "Especifica o modelo de acceso"
#: mod_pubsub/mod_pubsub.erl:3486 mod_pubsub/mod_pubsub_odbc.erl:3299
msgid "Roster groups allowed to subscribe"
msgstr "Lista de grupos autorizados a subscribir"
#: mod_pubsub/mod_pubsub.erl:3487 mod_pubsub/mod_pubsub_odbc.erl:3300
msgid "Specify the publisher model"
msgstr "Especificar o modelo do publicante"
#: mod_pubsub/mod_pubsub.erl:3489 mod_pubsub/mod_pubsub_odbc.erl:3302
msgid "Purge all items when the relevant publisher goes offline"
msgstr ""
#: mod_pubsub/mod_pubsub.erl:3490 mod_pubsub/mod_pubsub_odbc.erl:3303
#, fuzzy
msgid "Specify the event message type"
msgstr "Especifica o modelo de acceso"
#: mod_pubsub/mod_pubsub.erl:3492 mod_pubsub/mod_pubsub_odbc.erl:3305
msgid "Max payload size in bytes"
msgstr "Máximo tamaño do payload en bytes"
#: mod_pubsub/mod_pubsub.erl:3493 mod_pubsub/mod_pubsub_odbc.erl:3306
msgid "When to send the last published item"
msgstr "Cando enviar o último elemento publicado"
#: mod_pubsub/mod_pubsub.erl:3495 mod_pubsub/mod_pubsub_odbc.erl:3308
msgid "Only deliver notifications to available users"
msgstr "Só enviar notificacións aos usuarios dispoñibles"
#: mod_pubsub/mod_pubsub.erl:3496 mod_pubsub/mod_pubsub_odbc.erl:3309
msgid "The collections with which a node is affiliated"
msgstr "As coleccións coas que un nodo está afiliado"
#: mod_register.erl:193
msgid "The CAPTCHA verification has failed"
msgstr ""
#: mod_register.erl:220
#, fuzzy
msgid "You need a client that supports x:data and CAPTCHA to register"
msgstr ""
"Necesitas un cliente con soporte de x:data para poder rexistrar o alcume"
#: mod_register.erl:226 mod_register.erl:265
msgid "Choose a username and password to register with this server"
msgstr ""
"Escolle un nome de usuario e contrasinal para rexistrarche neste servidor"
#: mod_register.erl:230 mod_vcard.erl:364 mod_vcard_odbc.erl:342
#: web/ejabberd_web_admin.erl:1515 web/ejabberd_web_admin.erl:1572
msgid "User"
msgstr "Usuario"
#: mod_register.erl:316 mod_register.erl:361
#, fuzzy
msgid "The password is too weak"
msgstr "a contrasinal é"
#: mod_register.erl:365
msgid "Users are not allowed to register accounts so quickly"
msgstr "Os usuarios non están autorizados a rexistrar contas con tanta rapidez"
#: mod_roster.erl:938 mod_roster_odbc.erl:1055 web/ejabberd_web_admin.erl:1701
#: web/ejabberd_web_admin.erl:1886 web/ejabberd_web_admin.erl:1897
#: web/ejabberd_web_admin.erl:2219
msgid "None"
msgstr "Ningún"
#: mod_roster.erl:945 mod_roster_odbc.erl:1062
msgid "Subscription"
msgstr "Subscripción"
#: mod_roster.erl:946 mod_roster_odbc.erl:1063
msgid "Pending"
msgstr "Pendente"
#: mod_roster.erl:947 mod_roster_odbc.erl:1064
msgid "Groups"
msgstr "Grupos"
#: mod_roster.erl:974 mod_roster_odbc.erl:1091
msgid "Validate"
msgstr "Validar"
#: mod_roster.erl:982 mod_roster_odbc.erl:1099
msgid "Remove"
msgstr "Borrar"
#: mod_roster.erl:985 mod_roster_odbc.erl:1102
msgid "Roster of "
msgstr "Lista de contactos de "
#: mod_roster.erl:988 mod_roster_odbc.erl:1105 mod_shared_roster.erl:902
#: mod_shared_roster.erl:1011 mod_shared_roster_odbc.erl:931
#: mod_shared_roster_odbc.erl:1040 web/ejabberd_web_admin.erl:834
#: web/ejabberd_web_admin.erl:875 web/ejabberd_web_admin.erl:943
#: web/ejabberd_web_admin.erl:979 web/ejabberd_web_admin.erl:1020
#: web/ejabberd_web_admin.erl:1509 web/ejabberd_web_admin.erl:1761
#: web/ejabberd_web_admin.erl:1932 web/ejabberd_web_admin.erl:2136
#: web/ejabberd_web_admin.erl:2161
msgid "Bad format"
msgstr "Mal formato"
#: mod_roster.erl:995 mod_roster_odbc.erl:1112
msgid "Add Jabber ID"
msgstr "Engadir ID Jabber"
#: mod_roster.erl:1094 mod_roster_odbc.erl:1211
msgid "Roster"
msgstr "Lista de contactos"
#: mod_shared_roster.erl:857 mod_shared_roster.erl:899
#: mod_shared_roster.erl:1007 mod_shared_roster_odbc.erl:886
#: mod_shared_roster_odbc.erl:928 mod_shared_roster_odbc.erl:1036
msgid "Shared Roster Groups"
msgstr "Grupos Compartidos"
#: mod_shared_roster.erl:895 mod_shared_roster_odbc.erl:924
#: web/ejabberd_web_admin.erl:1365 web/ejabberd_web_admin.erl:2461
msgid "Add New"
msgstr "Engadir novo"
#: mod_shared_roster.erl:978 mod_shared_roster_odbc.erl:1007
msgid "Name:"
msgstr "Nome:"
#: mod_shared_roster.erl:983 mod_shared_roster_odbc.erl:1012
msgid "Description:"
msgstr "Descrición:"
#: mod_shared_roster.erl:991 mod_shared_roster_odbc.erl:1020
msgid "Members:"
msgstr "Membros:"
#: mod_shared_roster.erl:999 mod_shared_roster_odbc.erl:1028
msgid "Displayed Groups:"
msgstr "Mostrar grupos:"
#: mod_shared_roster.erl:1008 mod_shared_roster_odbc.erl:1037
msgid "Group "
msgstr "Grupo "
#: mod_shared_roster.erl:1017 mod_shared_roster_odbc.erl:1046
#: web/ejabberd_web_admin.erl:840 web/ejabberd_web_admin.erl:884
#: web/ejabberd_web_admin.erl:949 web/ejabberd_web_admin.erl:1026
#: web/ejabberd_web_admin.erl:2017
msgid "Submit"
msgstr "Enviar"
#: mod_vcard.erl:165 mod_vcard_ldap.erl:238 mod_vcard_odbc.erl:129
msgid "Erlang Jabber Server"
msgstr "Servidor Jabber en Erlang"
#: mod_vcard.erl:364 mod_vcard.erl:478 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:454
msgid "Birthday"
msgstr "Aniversario"
#: mod_vcard.erl:364 mod_vcard.erl:480 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:456
msgid "City"
msgstr "Cidade"
#: mod_vcard.erl:364 mod_vcard.erl:479 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:455
msgid "Country"
msgstr "País"
#: mod_vcard.erl:364 mod_vcard.erl:481 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:457
msgid "Email"
msgstr "Email"
#: mod_vcard.erl:364 mod_vcard.erl:476 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:452
msgid "Family Name"
msgstr "Apelido"
#: mod_vcard.erl:364 mod_vcard_odbc.erl:342
msgid ""
"Fill in the form to search for any matching Jabber User (Add * to the end of "
"field to match substring)"
msgstr ""
"Enche o formulario para buscar usuarios Jabber. Engade * ao final dun campo "
"para buscar subcadenas."
#: mod_vcard.erl:364 mod_vcard.erl:473 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:449
msgid "Full Name"
msgstr "Nome completo"
#: mod_vcard.erl:364 mod_vcard.erl:475 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:451
msgid "Middle Name"
msgstr "Segundo nome"
#: mod_vcard.erl:364 mod_vcard.erl:474 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:450 web/ejabberd_web_admin.erl:2006
msgid "Name"
msgstr "Nome"
#: mod_vcard.erl:364 mod_vcard.erl:482 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:458
msgid "Organization Name"
msgstr "Nome da organización"
#: mod_vcard.erl:364 mod_vcard.erl:483 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:459
msgid "Organization Unit"
msgstr "Unidade da organización"
#: mod_vcard.erl:364 mod_vcard_ldap.erl:462 mod_vcard_odbc.erl:342
msgid "Search users in "
msgstr "Buscar usuarios en "
#: mod_vcard.erl:364 mod_vcard_ldap.erl:462 mod_vcard_odbc.erl:342
msgid "You need an x:data capable client to search"
msgstr "Necesitas un cliente con soporte de x:data para poder buscar"
#: mod_vcard.erl:389 mod_vcard_ldap.erl:487 mod_vcard_odbc.erl:367
msgid "vCard User Search"
msgstr "Procura de usuario en vCard"
#: mod_vcard.erl:445 mod_vcard_ldap.erl:541 mod_vcard_odbc.erl:421
msgid "ejabberd vCard module"
msgstr "Módulo vCard para ejabberd"
#: mod_vcard.erl:469 mod_vcard_ldap.erl:551 mod_vcard_odbc.erl:445
msgid "Search Results for "
msgstr "Buscar resultados por "
#: mod_vcard_ldap.erl:462
msgid "Fill in fields to search for any matching Jabber User"
msgstr "Rechea campos para buscar usuarios Jabber que concuerden"
#: web/ejabberd_web_admin.erl:193 web/ejabberd_web_admin.erl:203
#: web/ejabberd_web_admin.erl:219 web/ejabberd_web_admin.erl:229
msgid "Unauthorized"
msgstr "Non autorizado"
#: web/ejabberd_web_admin.erl:286 web/ejabberd_web_admin.erl:303
msgid "ejabberd Web Admin"
msgstr "Ejabberd Administrador Web"
#: web/ejabberd_web_admin.erl:769 web/ejabberd_web_admin.erl:780
msgid "Administration"
msgstr "Administración"
#: web/ejabberd_web_admin.erl:878 web/ejabberd_web_admin.erl:982
msgid "Raw"
msgstr "Cru"
#: web/ejabberd_web_admin.erl:1017
msgid "~s access rule configuration"
msgstr "Configuración das Regra de Acceso ~s"
#: web/ejabberd_web_admin.erl:1035
msgid "Virtual Hosts"
msgstr "Hosts Virtuais"
#: web/ejabberd_web_admin.erl:1043 web/ejabberd_web_admin.erl:1050
msgid "Users"
msgstr "Usuarios"
#: web/ejabberd_web_admin.erl:1078
msgid "Users Last Activity"
msgstr "Última actividade dos usuarios"
#: web/ejabberd_web_admin.erl:1080
msgid "Period: "
msgstr "Periodo: "
#: web/ejabberd_web_admin.erl:1090
msgid "Last month"
msgstr "Último mes"
#: web/ejabberd_web_admin.erl:1091
msgid "Last year"
msgstr "Último ano"
#: web/ejabberd_web_admin.erl:1092
msgid "All activity"
msgstr "Toda a actividade"
#: web/ejabberd_web_admin.erl:1094
msgid "Show Ordinary Table"
msgstr "Mostrar Táboa Ordinaria"
#: web/ejabberd_web_admin.erl:1096
msgid "Show Integral Table"
msgstr "Mostrar Táboa Integral"
#: web/ejabberd_web_admin.erl:1105 web/ejabberd_web_admin.erl:1939
msgid "Statistics"
msgstr "Estatísticas"
#: web/ejabberd_web_admin.erl:1117
msgid "Not Found"
msgstr "Non atopado"
#: web/ejabberd_web_admin.erl:1134
msgid "Node not found"
msgstr "Nodo non atopado"
#: web/ejabberd_web_admin.erl:1460
msgid "Host"
msgstr "Host"
#: web/ejabberd_web_admin.erl:1461
msgid "Registered Users"
msgstr "Usuarios rexistrados"
#: web/ejabberd_web_admin.erl:1573
msgid "Offline Messages"
msgstr "Mensaxes diferidas"
#: web/ejabberd_web_admin.erl:1574 web/ejabberd_web_admin.erl:1767
msgid "Last Activity"
msgstr "Última actividade"
#: web/ejabberd_web_admin.erl:1659 web/ejabberd_web_admin.erl:1675
msgid "Registered Users:"
msgstr "Usuarios rexistrados:"
#: web/ejabberd_web_admin.erl:1661 web/ejabberd_web_admin.erl:1677
#: web/ejabberd_web_admin.erl:2192
msgid "Online Users:"
msgstr "Usuarios conectados:"
#: web/ejabberd_web_admin.erl:1663
msgid "Outgoing s2s Connections:"
msgstr "Conexións S2S saíntes:"
#: web/ejabberd_web_admin.erl:1665
msgid "Outgoing s2s Servers:"
msgstr "Servidores S2S saíntes:"
#: web/ejabberd_web_admin.erl:1734 web/mod_register_web.erl:175
#: web/mod_register_web.erl:372 web/mod_register_web.erl:381
#: web/mod_register_web.erl:411
msgid "Change Password"
msgstr "Cambiar contrasinal"
#: web/ejabberd_web_admin.erl:1758
msgid "User "
msgstr "Usuario "
#: web/ejabberd_web_admin.erl:1765
msgid "Connected Resources:"
msgstr "Recursos conectados:"
#: web/ejabberd_web_admin.erl:1766 web/mod_register_web.erl:227
#: web/mod_register_web.erl:519
msgid "Password:"
msgstr "Contrasinal:"
#: web/ejabberd_web_admin.erl:1828
msgid "No Data"
msgstr "Sen datos"
#: web/ejabberd_web_admin.erl:1906
msgid "Nodes"
msgstr "Nodos"
#: web/ejabberd_web_admin.erl:1929 web/ejabberd_web_admin.erl:1951
msgid "Node "
msgstr "Nodo "
#: web/ejabberd_web_admin.erl:1938
msgid "Listened Ports"
msgstr "Portos de escoita"
#: web/ejabberd_web_admin.erl:1940 web/ejabberd_web_admin.erl:2260
#: web/ejabberd_web_admin.erl:2448
msgid "Update"
msgstr "Actualizar"
#: web/ejabberd_web_admin.erl:1943 web/ejabberd_web_admin.erl:2569
msgid "Restart"
msgstr "Reiniciar"
#: web/ejabberd_web_admin.erl:1945 web/ejabberd_web_admin.erl:2571
msgid "Stop"
msgstr "Deter"
#: web/ejabberd_web_admin.erl:1959
msgid "RPC Call Error"
msgstr "Erro na chamada RPC"
#: web/ejabberd_web_admin.erl:2000
msgid "Database Tables at "
msgstr "Táboas da base de datos en "
#: web/ejabberd_web_admin.erl:2007
msgid "Storage Type"
msgstr "Tipo de almacenamiento"
#: web/ejabberd_web_admin.erl:2008
msgid "Elements"
msgstr "Elementos"
#: web/ejabberd_web_admin.erl:2009
msgid "Memory"
msgstr "Memoria"
#: web/ejabberd_web_admin.erl:2032 web/ejabberd_web_admin.erl:2137
msgid "Error"
msgstr "Erro"
#: web/ejabberd_web_admin.erl:2034
msgid "Backup of "
msgstr "Copia de seguridade de "
#: web/ejabberd_web_admin.erl:2036
msgid ""
"Please note that these options will only backup the builtin Mnesia database. "
"If you are using the ODBC module, you also need to backup your SQL database "
"separately."
msgstr ""
"Ten en conta que estas opcións só farán copia de seguridade da base de datos "
"Mnesia. Se está a utilizar o módulo de ODBC, tamén necesita unha copia de "
"seguridade da súa base de datos SQL por separado."
#: web/ejabberd_web_admin.erl:2041
msgid "Store binary backup:"
msgstr "Gardar copia de seguridade binaria:"
#: web/ejabberd_web_admin.erl:2045 web/ejabberd_web_admin.erl:2052
#: web/ejabberd_web_admin.erl:2060 web/ejabberd_web_admin.erl:2067
#: web/ejabberd_web_admin.erl:2074 web/ejabberd_web_admin.erl:2081
#: web/ejabberd_web_admin.erl:2088 web/ejabberd_web_admin.erl:2096
#: web/ejabberd_web_admin.erl:2103 web/ejabberd_web_admin.erl:2110
msgid "OK"
msgstr "Aceptar"
#: web/ejabberd_web_admin.erl:2048
msgid "Restore binary backup immediately:"
msgstr "Restaurar inmediatamente copia de seguridade binaria:"
#: web/ejabberd_web_admin.erl:2056
msgid ""
"Restore binary backup after next ejabberd restart (requires less memory):"
msgstr ""
"Restaurar copia de seguridade binaria no seguinte reinicio de ejabberd "
"(require menos memoria que se instantánea):"
#: web/ejabberd_web_admin.erl:2063
msgid "Store plain text backup:"
msgstr "Gardar copia de seguridade en texto plano:"
#: web/ejabberd_web_admin.erl:2070
msgid "Restore plain text backup immediately:"
msgstr "Restaurar copias de seguridade de texto plano inmediatamente:"
#: web/ejabberd_web_admin.erl:2077
msgid "Import users data from a PIEFXIS file (XEP-0227):"
msgstr "Importar usuarios desde un fichero PIEFXIS"
#: web/ejabberd_web_admin.erl:2084
msgid "Export data of all users in the server to PIEFXIS files (XEP-0227):"
msgstr ""
"Exportar datos de todos os usuarios do servidor a ficheros PIEFXIS "
"(XEP-0227):"
#: web/ejabberd_web_admin.erl:2091
msgid "Export data of users in a host to PIEFXIS files (XEP-0227):"
msgstr ""
"Exportar datos de todos os usuarios do servidor a ficheros PIEFXIS "
"(XEP-0227):"
#: web/ejabberd_web_admin.erl:2099
msgid "Import user data from jabberd14 spool file:"
msgstr "Importar usuario de fichero spool de jabberd14:"
#: web/ejabberd_web_admin.erl:2106
msgid "Import users data from jabberd14 spool directory:"
msgstr "Importar usuarios do directorio spool de jabberd14:"
#: web/ejabberd_web_admin.erl:2132
msgid "Listened Ports at "
msgstr "Portos de escoita en "
#: web/ejabberd_web_admin.erl:2157
msgid "Modules at "
msgstr "Módulos en "
#: web/ejabberd_web_admin.erl:2183
msgid "Statistics of ~p"
msgstr "Estatísticas de ~p"
#: web/ejabberd_web_admin.erl:2186
msgid "Uptime:"
msgstr "Tempo desde o inicio:"
#: web/ejabberd_web_admin.erl:2189
msgid "CPU Time:"
msgstr "Tempo consumido de CPU:"
#: web/ejabberd_web_admin.erl:2195
msgid "Transactions Committed:"
msgstr "Transaccións finalizadas:"
#: web/ejabberd_web_admin.erl:2198
msgid "Transactions Aborted:"
msgstr "Transaccións abortadas:"
#: web/ejabberd_web_admin.erl:2201
msgid "Transactions Restarted:"
msgstr "Transaccións reiniciadas:"
#: web/ejabberd_web_admin.erl:2204
msgid "Transactions Logged:"
msgstr "Transaccións rexistradas:"
#: web/ejabberd_web_admin.erl:2246
msgid "Update "
msgstr "Actualizar"
#: web/ejabberd_web_admin.erl:2254
msgid "Update plan"
msgstr "Plan de actualización"
#: web/ejabberd_web_admin.erl:2255
msgid "Modified modules"
msgstr "Módulos Modificados"
#: web/ejabberd_web_admin.erl:2256
msgid "Update script"
msgstr "Script de actualización"
#: web/ejabberd_web_admin.erl:2257
msgid "Low level update script"
msgstr "Script de actualización a baixo nivel"
#: web/ejabberd_web_admin.erl:2258
msgid "Script check"
msgstr "Comprobación de script"
#: web/ejabberd_web_admin.erl:2426
msgid "Port"
msgstr "Porto"
#: web/ejabberd_web_admin.erl:2427
msgid "IP"
msgstr "IP"
#: web/ejabberd_web_admin.erl:2428
msgid "Protocol"
msgstr "Protocolo"
#: web/ejabberd_web_admin.erl:2429 web/ejabberd_web_admin.erl:2556
msgid "Module"
msgstr "Módulo"
#: web/ejabberd_web_admin.erl:2430 web/ejabberd_web_admin.erl:2557
msgid "Options"
msgstr "Opcións"
#: web/ejabberd_web_admin.erl:2450
msgid "Delete"
msgstr "Eliminar"
#: web/ejabberd_web_admin.erl:2579
msgid "Start"
msgstr "Iniciar"
#: web/mod_register_web.erl:104
msgid "Your Jabber account was successfully created."
msgstr ""
#: web/mod_register_web.erl:107
msgid "There was an error creating the account: "
msgstr ""
#: web/mod_register_web.erl:115
msgid "Your Jabber account was successfully deleted."
msgstr ""
#: web/mod_register_web.erl:118
msgid "There was an error deleting the account: "
msgstr ""
#: web/mod_register_web.erl:128
msgid "The password of your Jabber account was successfully changed."
msgstr ""
#: web/mod_register_web.erl:131
msgid "There was an error changing the password: "
msgstr ""
#: web/mod_register_web.erl:163 web/mod_register_web.erl:172
msgid "Jabber Account Registration"
msgstr ""
#: web/mod_register_web.erl:174 web/mod_register_web.erl:192
#: web/mod_register_web.erl:201
msgid "Register a Jabber account"
msgstr ""
#: web/mod_register_web.erl:176 web/mod_register_web.erl:493
#: web/mod_register_web.erl:502
msgid "Unregister a Jabber account"
msgstr ""
#: web/mod_register_web.erl:203
msgid ""
"This page allows to create a Jabber account in this Jabber server. Your JID "
"(Jabber IDentifier) will be of the form: username@server. Please read "
"carefully the instructions to fill correctly the fields."
msgstr ""
#: web/mod_register_web.erl:212 web/mod_register_web.erl:386
#: web/mod_register_web.erl:509
#, fuzzy
msgid "Username:"
msgstr "Nome de usuario en IRC"
#: web/mod_register_web.erl:217
msgid "This is case insensitive: macbeth is the same that MacBeth and Macbeth."
msgstr ""
#: web/mod_register_web.erl:218
msgid "Characters not allowed:"
msgstr ""
#: web/mod_register_web.erl:222 web/mod_register_web.erl:391
#: web/mod_register_web.erl:514
#, fuzzy
msgid "Server:"
msgstr "Servidor ~b"
#: web/mod_register_web.erl:232
msgid ""
"Don't tell your password to anybody, not even the administrators of the "
"Jabber server."
msgstr ""
#: web/mod_register_web.erl:234
msgid "You can later change your password using a Jabber client."
msgstr ""
#: web/mod_register_web.erl:235
msgid ""
"Some Jabber clients can store your password in your computer. Use that "
"feature only if you trust your computer is safe."
msgstr ""
#: web/mod_register_web.erl:237
msgid ""
"Memorize your password, or write it in a paper placed in a safe place. In "
"Jabber there isn't an automated way to recover your password if you forget "
"it."
msgstr ""
#: web/mod_register_web.erl:242 web/mod_register_web.erl:406
#, fuzzy
msgid "Password Verification:"
msgstr "Verificación da contrasinal"
#: web/mod_register_web.erl:250
#, fuzzy
msgid "Register"
msgstr "Lista de contactos"
#: web/mod_register_web.erl:396
#, fuzzy
msgid "Old Password:"
msgstr "Contrasinal:"
#: web/mod_register_web.erl:401
#, fuzzy
msgid "New Password:"
msgstr "Contrasinal:"
#: web/mod_register_web.erl:504
msgid "This page allows to unregister a Jabber account in this Jabber server."
msgstr ""
#: web/mod_register_web.erl:524
msgid "Unregister"
msgstr ""
#, fuzzy
#~ msgid "CAPTCHA test failed"
#~ msgstr "O CAPTCHA é válido."
#~ msgid "Encodings"
#~ msgstr "Codificaciones"
#~ msgid "(Raw)"
#~ msgstr "(Cru)"
#~ msgid "Specified nickname is already registered"
#~ msgstr "O alcume especificado xa está rexistrado, terás que buscar outro"
#~ msgid "Size"
#~ msgstr "Tamaño"
ejabberd-2.1.11/src/msgs/cs.msg 0000664 0000000 0000000 00000066011 12240230175 013077 0 ustar {"Access Configuration","Konfigurace přístupů"}.
{"Access Control List Configuration","Konfigurace seznamu přístupových práv (ACL)"}.
{"Access control lists","Seznamy přístupových práv (ACL)"}.
{"Access Control Lists","Seznamy přístupových práv (ACL)"}.
{"Access denied by service policy","Přístup byl zamítnut nastavením služby"}.
{"Access rules","Pravidla přístupů"}.
{"Access Rules","Pravidla přístupů"}.
{"Action on user","Akce aplikovaná na uživatele"}.
{"Add Jabber ID","Přidat Jabber ID"}.
{"Add New","Přidat nový"}.
{"Add User","Přidat uživatele"}.
{"Administration","Administrace"}.
{"Administration of ","Administrace "}.
{"Administrator privileges required","Potřebujete práva administrátora"}.
{"A friendly name for the node","Přívětivé jméno pro uzel"}.
{"All activity","Všechny aktivity"}.
{"Allow this Jabber ID to subscribe to this pubsub node?","Povolit tomuto Jabber ID odebírat tento pubsub uzel?"}.
{"Allow users to change the subject","Povolit uživatelům měnit téma místnosti"}.
{"Allow users to query other users","Povolit uživatelům odesílat požadavky (query) ostatním uživatelům"}.
{"Allow users to send invites","Povolit uživatelům posílání pozvánek"}.
{"Allow users to send private messages","Povolit uživatelům odesílat soukromé zprávy"}.
{"Allow visitors to change nickname","Povolit návštěvníkům měnit přezdívku"}.
{"Allow visitors to send private messages to","Povolit návštěvníkům odesílat soukromé zprávy"}.
{"Allow visitors to send status text in presence updates","Povolit návštěvníkům posílat stavové zprávy ve statusu"}.
{"Allow visitors to send voice requests","Povolit uživatelům posílat žádosti o voice práva"}.
{"All Users","Všichni uživatelé"}.
{"Announcements","Oznámení"}.
{"anyone","každému"}.
{"A password is required to enter this room","Pro vstup do místnosti musíte zadat heslo"}.
{"April",". dubna"}.
{"August",". srpna"}.
{"Backup Management","Správa zálohování"}.
{"Backup of ","Záloha na "}.
{"Backup to File at ","Záloha do souboru na "}.
{"Backup","Zálohovat"}.
{"Bad format","Nesprávný formát"}.
{"Birthday","Datum narození"}.
{"CAPTCHA web page","Webová stránka CAPTCHA"}.
{"Change Password","Změnit heslo"}.
{"Change User Password","Změnit heslo uživatele"}.
{"Characters not allowed:","Nepřípustné znaky:"}.
{"Chatroom configuration modified","Nastavení diskuzní místnosti bylo změněno"}.
{"Chatroom is created","Konference vytvořena"}.
{"Chatroom is destroyed","Konference zrušena"}.
{"Chatroom is started","Konference spuštěna"}.
{"Chatroom is stopped","Konference zastavena"}.
{"Chatrooms","Konference"}.
{"Choose a username and password to register with this server","Zadejte jméno uživatele a heslo pro registraci na tomto serveru"}.
{"Choose modules to stop","Vyberte moduly, které mají být zastaveny"}.
{"Choose storage type of tables","Vyberte typ úložiště pro tabulky"}.
{"Choose whether to approve this entity's subscription.","Zvolte, zda chcete schválit odebírání touto entitou"}.
{"City","Město"}.
{"Commands","Příkazy"}.
{"Conference room does not exist","Konferenční místnost neexistuje"}.
{"Configuration","Konfigurace"}.
{"Configuration of room ~s","Konfigurace místnosti ~s"}.
{"Connected Resources:","Připojené zdroje:"}.
{"Connections parameters","Parametry spojení"}.
{"Country","Země"}.
{"CPU Time:","Čas procesoru"}.
{"Database","Databáze"}.
{"Database Tables at ","Databázové tabulky na "}.
{"Database Tables Configuration at ","Konfigurace databázových tabulek "}.
{"December",". prosince"}.
{"Default users as participants","Uživatelé jsou implicitně členy"}.
{"Delete message of the day on all hosts","Smazat zprávu dne na všech hostitelích"}.
{"Delete message of the day","Smazat zprávu dne"}.
{"Delete Selected","Smazat vybrané"}.
{"Delete","Smazat"}.
{"Delete User","Smazat uživatele"}.
{"Deliver event notifications","Doručovat upozornění na události"}.
{"Deliver payloads with event notifications","Doručovat náklad s upozorněním na událost"}.
{"Description:","Popis:"}.
{"Disc only copy","Jen kopie disku"}.
{"Displayed Groups:","Zobrazené skupiny:"}.
{"Don't tell your password to anybody, not even the administrators of the Jabber server.","Nikdy nikomu nesdělujte své heslo, ani administrátorovi serveru Jabberu."}.
{"Dump Backup to Text File at ","Uložit zálohu do textového souboru na "}.
{"Dump to Text File","Uložit do textového souboru"}.
{"Edit Properties","Upravit vlastnosti"}.
{"Either approve or decline the voice request.","Povolit nebo odmítnout voice žádost."}.
{"ejabberd IRC module","ejabberd IRC modul"}.
{"ejabberd MUC module","ejabberd MUC modul"}.
{"ejabberd Publish-Subscribe module","ejabberd Publish-Subscribe modul"}.
{"ejabberd SOCKS5 Bytestreams module","ejabberd SOCKS5 Bytestreams modul"}.
{"ejabberd vCard module","ejabberd vCard modul"}.
{"ejabberd Web Admin","Webová administrace ejabberd"}.
{"Elements","Položek"}.
{"Email","E-mail"}.
{"Enable logging","Zaznamenávat konverzace"}.
{"Encoding for server ~b","Kódování pro server ~b"}.
{"End User Session","Ukončit sezení uživatele"}.
{"Enter list of {Module, [Options]}","Vložte seznam modulů {Modul, [Parametry]}"}.
{"Enter nickname you want to register","Zadejte přezdívku, kterou chcete zaregistrovat"}.
{"Enter path to backup file","Zadajte cestu k souboru se zálohou"}.
{"Enter path to jabberd14 spool dir","Zadejte cestu k jabberd14 spool adresáři"}.
{"Enter path to jabberd14 spool file","Zadejte cestu k spool souboru jabberd14"}.
{"Enter path to text file","Zadajte cestu k textovému souboru"}.
{"Enter the text you see","Zadejte text, který vidíte"}.
{"Enter username and encodings you wish to use for connecting to IRC servers. Press 'Next' to get more fields to fill in. Press 'Complete' to save settings.","Zadejte přezdívku a kódování, které chcete používat pro připojení k serverům IRC. Stiskněte 'Další' pro více políček k vyplnění. Stiskněte 'Dokončit' pro uložení nastavení."}.
{"Enter username, encodings, ports and passwords you wish to use for connecting to IRC servers","Zadejte přezdívku, kódování, porty a hesla, které chcete používat pro připojení k serverům IRC"}.
{"Erlang Jabber Server","Erlang Jabber Server"}.
{"Error","Chyba"}.
{"Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef.net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}].","Příklad: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef.net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}].2\"}]."}.
{"Exclude Jabber IDs from CAPTCHA challenge","Vyloučit Jabber ID z procesu CAPTCHA ověřování"}.
{"Export data of all users in the server to PIEFXIS files (XEP-0227):","Exportovat všechny uživatele do souboru ve formátu PIEFXIS (XEP-0227):"}.
{"Export data of users in a host to PIEFXIS files (XEP-0227):","Exportovat uživatele na hostiteli do souboru ve formátu PIEFXIS (XEP-0227):"}.
{"Failed to extract JID from your voice request approval","Došlo k chybě při získávání Jabber ID z vaší žádosti o voice práva"}.
{"Family Name","Příjmení"}.
{"February",". února"}.
{"Fill in fields to search for any matching Jabber User","Vyplňte políčka pro vyhledání uživatele Jabberu"}.
{"Fill in the form to search for any matching Jabber User (Add * to the end of field to match substring)","Pro vyhledání uživatele Jabberu vyplňte formulář (na konec přidejte znak * pro vyhledání podřetězce)"}.
{"Friday","Pátek"}.
{"From","Od"}.
{"From ~s","Od ~s"}.
{"Full Name","Celé jméno"}.
{"Get Number of Online Users","Získat počet online uživatelů"}.
{"Get Number of Registered Users","Získat počet registrovaných uživatelů"}.
{"Get User Last Login Time","Získat čas podleního přihlášení uživatele"}.
{"Get User Password","Získat heslo uživatele"}.
{"Get User Statistics","Získat statistiky uživatele"}.
{"Grant voice to this person?","Udělit voice práva této osobě?"}.
{"Group ","Skupina "}.
{"Groups","Skupiny"}.
{"has been banned","byl(a) zablokován(a)"}.
{"has been kicked because of an affiliation change","byl(a) vyhozen(a) kvůli změně přiřazení"}.
{"has been kicked because of a system shutdown","byl(a) vyhozen(a), protože dojde k vypnutí systému"}.
{"has been kicked because the room has been changed to members-only","byl(a) vyhozen(a), protože mísnost je nyní pouze pro členy"}.
{"has been kicked","byl(a) vyhozen(a) z místnosti"}.
{" has set the subject to: "," změnil(a) téma na: "}.
{"Host","Hostitel"}.
{"If you don't see the CAPTCHA image here, visit the web page.","Pokud zde nevidíte obrázek CAPTCHA, přejděte na webovou stránku."}.
{"If you want to specify different ports, passwords, encodings for IRC servers, fill this list with values in format '{\"irc server\", \"encoding\", port, \"password\"}'. By default this service use \"~s\" encoding, port ~p, empty password.","Pokud chcete zadat jiné kódování pro IRC servery, vyplňte seznam s hodnotami ve formátu '{\"irc server\",\"encoding\", port, \"password\"}'. Výchozí kódování pro tuto službu je \"~s\", port ~p, empty password."}.
{"Import Directory","Import adresáře"}.
{"Import File","Import souboru"}.
{"Import user data from jabberd14 spool file:","Importovat uživatele z jabberd14 spool souborů:"}.
{"Import User from File at ","Importovat uživatele ze souboru na "}.
{"Import users data from a PIEFXIS file (XEP-0227):","Importovat uživatele ze souboru ve formátu PIEFXIS (XEP-0227):"}.
{"Import users data from jabberd14 spool directory:","Importovat uživatele z jabberd14 spool souborů:"}.
{"Import Users from Dir at ","Importovat uživatele z adresáře na "}.
{"Import Users From jabberd14 Spool Files","Importovat uživatele z jabberd14 spool souborů"}.
{"Improper message type","Nesprávný typ zprávy"}.
{"Incorrect password","Nesprávné heslo"}.
{"Invalid affiliation: ~s","Neplatné přiřazení: ~s"}.
{"Invalid role: ~s","Neplatná role: ~s"}.
{"IP addresses","IP adresy"}.
{"IP","IP"}.
{"IRC channel (don't put the first #)","IRC kanál (bez počátečního #)"}.
{"IRC server","IRC přezdívka"}.
{"IRC settings","Nastavení IRC"}.
{"IRC Transport","IRC transport"}.
{"IRC username","IRC přezdívka"}.
{"IRC Username","IRC přezdívka"}.
{"is now known as","se přejmenoval(a) na"}.
{"It is not allowed to send private messages","Je zakázáno posílat soukromé zprávy"}.
{"It is not allowed to send private messages of type \"groupchat\"","Není dovoleno odeslání soukromé zprávy typu \"skupinová zpráva\" "}.
{"It is not allowed to send private messages to the conference","Není povoleno odesílat soukromé zprávy do konference"}.
{"Jabber Account Registration","Registrace účtu Jabberu"}.
{"Jabber ID","Jabber ID"}.
{"Jabber ID ~s is invalid","Jabber ID ~s je neplatné"}.
{"January",". ledna"}.
{"Join IRC channel","Vstoupit do IRC kanálu"}.
{"joins the room","vstoupil(a) do místnosti"}.
{"Join the IRC channel here.","Vstoupit do tohoto IRC kanálu."}.
{"Join the IRC channel in this Jabber ID: ~s","Vstupte do IRC kanálu s tímto Jabber ID: ~s"}.
{"July",". července"}.
{"June",". června"}.
{"Last Activity","Poslední aktivita"}.
{"Last login","Poslední přihlášení"}.
{"Last month","Poslední měsíc"}.
{"Last year","Poslední rok"}.
{"leaves the room","opustil(a) místnost"}.
{"Listened Ports at ","Otevřené porty na "}.
{"Listened Ports","Otevřené porty"}.
{"List of modules to start","Seznam modulů, které mají být spuštěné"}.
{"Low level update script","Nízkoúrovňový aktualizační skript"}.
{"Make participants list public","Nastavit seznam účastníků jako veřejný"}.
{"Make room CAPTCHA protected","Chránit místnost pomocí CAPTCHA"}.
{"Make room members-only","Zpřístupnit místnost jen členům"}.
{"Make room moderated","Nastavit místnost jako moderovanou"}.
{"Make room password protected","Chránit místnost heslem"}.
{"Make room persistent","Nastavit místnost jako stálou"}.
{"Make room public searchable","Nastavit místnost jako veřejnou"}.
{"March",". března"}.
{"Maximum Number of Occupants","Počet účastníků"}.
{"Max # of items to persist","Maximální počet položek, které je možné natrvalo uložit"}.
{"Max payload size in bytes","Maximální náklad v bajtech"}.
{"May",". května"}.
{"Members:","Členové:"}.
{"Membership is required to enter this room","Pro vstup do místnosti musíte být členem"}.
{"Memorize your password, or write it in a paper placed in a safe place. In Jabber there isn't an automated way to recover your password if you forget it.","Svoje heslo si zapamatujte, nebo si jej poznamenejte na papírek a ten uschovejte v bezpečí. Jabber nemá žádný automatizovaný způsob obnovy hesla."}.
{"Memory","Paměť"}.
{"Message body","Tělo zprávy"}.
{"Middle Name","Druhé jméno"}.
{"Minimum interval between voice requests (in seconds)","Minimální interval mezi žádostmi o voice práva (v sekundách)"}.
{"Moderator privileges required","Potřebujete práva moderátora"}.
{"moderators only","moderátorům"}.
{"Modified modules","Aktualizované moduly"}.
{"Module","Modul"}.
{"Modules at ","Moduly na "}.
{"Modules","Moduly"}.
{"Monday","Pondělí"}.
{"Name:","Jméno:"}.
{"Name","Jméno"}.
{"Never","Nikdy"}.
{"New Password:","Nové heslo:"}.
{"Nickname","Přezdívka"}.
{"Nickname Registration at ","Registrace přezdívky na "}.
{"Nickname ~s does not exist in the room","Přezdívka ~s v místnosti neexistuje"}.
{"nobody","nikdo"}.
{"No body provided for announce message","Zpráva neobsahuje text"}.
{"No Data","Žádná data"}.
{"Node ID","ID uzlu"}.
{"Node not found","Uzel nenalezen"}.
{"Nodes","Uzly"}.
{"Node ","Uzel "}.
{"No limit","Bez limitu"}.
{"None","Nic"}.
{"No resource provided","Nebyl poskytnut žádný zdroj"}.
{"Not Found","Nenalezeno"}.
{"Notify subscribers when items are removed from the node","Upozornit odběratele na odstranění položek z uzlu"}.
{"Notify subscribers when the node configuration changes","Upozornit odběratele na změnu nastavení uzlu"}.
{"Notify subscribers when the node is deleted","Upozornit odběratele na smazání uzlu"}.
{"November",". listopadu"}.
{"Number of occupants","Počet účastníků"}.
{"Number of online users","Počet online uživatelů"}.
{"Number of registered users","Počet registrovaných uživatelů"}.
{"October",". října"}.
{"Offline Messages:","Offline zprávy:"}.
{"Offline Messages","Offline zprávy"}.
{"OK","OK"}.
{"Old Password:","Současné heslo:"}.
{"Online","Online"}.
{"Online Users:","Online uživatelé:"}.
{"Online Users","Online uživatelé"}.
{"Only deliver notifications to available users","Doručovat upozornění jen právě přihlášeným uživatelům"}.
{"Only moderators and participants are allowed to change the subject in this room","Jen moderátoři a účastníci mají povoleno měnit téma této místnosti"}.
{"Only moderators are allowed to change the subject in this room","Jen moderátoři mají povoleno měnit téma místnosti"}.
{"Only moderators can approve voice requests","Pouze moderátoři mohou schválit žádosti o voice práva"}.
{"Only occupants are allowed to send messages to the conference","Jen členové mají povolené zasílat zprávy do konference"}.
{"Only occupants are allowed to send queries to the conference","Jen členové mohou odesílat požadavky (query) do konference"}.
{"Only service administrators are allowed to send service messages","Pouze správci služby smí odesílat servisní zprávy"}.
{"Options","Nastavení"}.
{"Organization Name","Název firmy"}.
{"Organization Unit","Oddělení"}.
{"Outgoing s2s Connections:","Odchozí s2s spojení:"}.
{"Outgoing s2s Connections","Odchozí s2s spojení"}.
{"Outgoing s2s Servers:","Odchozí s2s servery:"}.
{"Owner privileges required","Jsou vyžadována práva vlastníka"}.
{"Packet","Paket"}.
{"Password ~b","Heslo ~b"}.
{"Password:","Heslo:"}.
{"Password","Heslo"}.
{"Password Verification:","Ověření hesla:"}.
{"Password Verification","Ověření hesla"}.
{"Path to Dir","Cesta k adresáři"}.
{"Path to File","Cesta k souboru"}.
{"Pending","Čekající"}.
{"Period: ","Čas: "}.
{"Persist items to storage","Uložit položky natrvalo do úložiště"}.
{"Ping","Ping"}.
{"Please note that these options will only backup the builtin Mnesia database. If you are using the ODBC module, you also need to backup your SQL database separately.","Podotýkáme, že tato nastavení budou zálohována do zabudované databáze Mnesia. Pokud používáte ODBC modul, musíte zálohovat svoji SQL databázi samostatně."}.
{"Please, wait for a while before sending new voice request","Prosím, počkejte chvíli před posláním nové žádosti o voice práva"}.
{"Pong","Pong"}.
{"Port ~b","Port ~b"}.
{"Port","Port"}.
{"Present real Jabber IDs to","Odhalovat skutečná Jabber ID"}.
{"private, ","soukromá, "}.
{"Protocol","Protokol"}.
{"Publish-Subscribe","Publish-Subscribe"}.
{"PubSub subscriber request","Žádost odběratele PubSub"}.
{"Purge all items when the relevant publisher goes offline","Smazat všechny položky, pokud se příslušný poskytovatel odpojí"}.
{"Queries to the conference members are not allowed in this room","Požadavky (queries) na členy konference nejsou v této místnosti povolené"}.
{"RAM and disc copy","Kopie RAM a disku"}.
{"RAM copy","Kopie RAM"}.
{"Raw","Zdroj"}.
{"Really delete message of the day?","Skutečně smazat zprávu dne?"}.
{"Recipient is not in the conference room","Příjemce se nenachází v konferenční místnosti"}.
{"Register a Jabber account","Zaregistrujte si účet Jabberu"}.
{"Registered Users","Registrovaní uživatelé"}.
{"Registered Users:","Registrovaní živatelé:"}.
{"Register","Zaregistrovat se"}.
{"Registration in mod_irc for ","Registrace do mod_irc na "}.
{"Remote copy","Vzdálená kopie"}.
{"Remove All Offline Messages","Odstranit všechny offline zprávy"}.
{"Remove","Odstranit"}.
{"Remove User","Odstranit uživatele"}.
{"Replaced by new connection","Nahrazeno novým spojením"}.
{"Resources","Zdroje"}.
{"Restart","Restart"}.
{"Restart Service","Restartovat službu"}.
{"Restore Backup from File at ","Obnovit zálohu ze souboru na "}.
{"Restore binary backup after next ejabberd restart (requires less memory):","Obnovit binární zálohu při následujícím restartu ejabberd (vyžaduje méně paměti)"}.
{"Restore binary backup immediately:","Okamžitě obnovit binární zálohu:"}.
{"Restore","Obnovit"}.
{"Restore plain text backup immediately:","Okamžitě obnovit zálohu z textového souboru:"}.
{"Room Configuration","Nastavení místnosti"}.
{"Room creation is denied by service policy","Pravidla služby nepovolují vytvořit místnost"}.
{"Room description","Popis místnosti"}.
{"Room Occupants","Počet účastníků"}.
{"Room title","Název místnosti"}.
{"Roster groups allowed to subscribe","Skupiny kontaktů, které mohou odebírat"}.
{"Roster of ","Seznam kontaktů "}.
{"Roster","Seznam kontaktů"}.
{"Roster size","Velikost seznamu kontaktů"}.
{"RPC Call Error","Chyba RPC volání"}.
{"Running Nodes","Běžící uzly"}.
{"~s access rule configuration","~s konfigurace pravidla přístupu"}.
{"Saturday","Sobota"}.
{"Script check","Kontrola skriptu"}.
{"Search Results for ","Výsledky hledání pro "}.
{"Search users in ","Hledat uživatele v "}.
{"Send announcement to all online users","Odeslat oznámení všem online uživatelům"}.
{"Send announcement to all online users on all hosts","Odeslat oznámení všem online uživatelům na všech hostitelích"}.
{"Send announcement to all users","Odeslat oznámení všem uživatelům"}.
{"Send announcement to all users on all hosts","Odeslat oznámení všem uživatelům na všech hostitelích"}.
{"September",". září"}.
{"Server ~b","Server ~b"}.
{"Server:","Server:"}.
{"Set message of the day and send to online users","Nastavit zprávu dne a odeslat ji online uživatelům"}.
{"Set message of the day on all hosts and send to online users","Nastavit zprávu dne a odeslat ji online uživatelům"}.
{"Shared Roster Groups","Skupiny pro sdílený seznam kontaktů"}.
{"Show Integral Table","Zobrazit kompletní tabulku"}.
{"Show Ordinary Table","Zobrazit běžnou tabulku"}.
{"Shut Down Service","Vypnout službu"}.
{"~s invites you to the room ~s","~s vás zve do místnosti ~s"}.
{"Some Jabber clients can store your password in your computer. Use that feature only if you trust your computer is safe.","Někteří klienti umí uložit vaše heslo na disk počítače. Tuto funkci používejte, pouze pokud věříte zabezpečení svého počítače."}.
{"Specify the access model","Uveďte přístupový model"}.
{"Specify the event message type","Zvolte typ zpráv pro události"}.
{"Specify the publisher model","Specifikovat model pro publikování"}.
{"~s's Offline Messages Queue","Fronta offline zpráv uživatele ~s"}.
{"Start Modules at ","Spustit moduly na "}.
{"Start Modules","Spustit moduly"}.
{"Start","Start"}.
{"Statistics of ~p","Statistiky ~p"}.
{"Statistics","Statistiky"}.
{"Stop Modules at ","Zastavit moduly na "}.
{"Stop Modules","Zastavit moduly"}.
{"Stopped Nodes","Zastavené uzly"}.
{"Stop","Stop"}.
{"Storage Type","Typ úložiště"}.
{"Store binary backup:","Uložit binární zálohu:"}.
{"Store plain text backup:","Uložit zálohu do textového souboru:"}.
{"Subject","Předmět"}.
{"Submit","Odeslat"}.
{"Submitted","Odeslané"}.
{"Subscriber Address","Adresa odběratele"}.
{"Subscription","Přihlášení"}.
{"Sunday","Neděle"}.
{"That nickname is already in use by another occupant","Přezdívka je již používána jiným členem"}.
{"That nickname is registered by another person","Přezdívka je zaregistrována jinou osobou"}.
{"The CAPTCHA is valid.","CAPTCHA souhlasí."}.
{"The CAPTCHA verification has failed","Ověření CAPTCHA se nezdařilo"}.
{"The collections with which a node is affiliated","Kolekce, se kterými je uzel spřízněn"}.
{"the password is","heslo je"}.
{"The password is too weak","Heslo je příliš slabé"}.
{"The password of your Jabber account was successfully changed.","Heslo vašeho účtu Jabberu bylo úspěšně změněno."}.
{"There was an error changing the password: ","Při změně hesla došlo k chybě: "}.
{"There was an error creating the account: ","Při vytváření účtu došlo k chybě."}.
{"There was an error deleting the account: ","Při mazání účtu došlo k chybě: "}.
{"This is case insensitive: macbeth is the same that MacBeth and Macbeth.","Zde nezáleží na velikosti písmen: macbeth je stejný jako MacBeth a Macbeth."}.
{"This page allows to create a Jabber account in this Jabber server. Your JID (Jabber IDentifier) will be of the form: username@server. Please read carefully the instructions to fill correctly the fields.","Na této stránce si můžete vytvořit účet na tomto serveru Jabberu. Vaše JID (Jabber IDentifikátor) bude mít tvar: uživatelskéjméno@server. Přečtěte si prosím pozorně instrukce pro vyplnění údajů."}.
{"This page allows to unregister a Jabber account in this Jabber server.","Zde můžete zrušit registraci účtu na tomto serveru Jabberu."}.
{"This participant is kicked from the room because he sent an error message","Tento účastník byl vyhozen, protože odeslal chybovou zprávu"}.
{"This participant is kicked from the room because he sent an error message to another participant","Tento účastník byl vyhozen, protože odeslal chybovou zprávu jinému účastníkovi"}.
{"This participant is kicked from the room because he sent an error presence","Tento účastník byl vyhozen, protože odeslal chybový status"}.
{"This room is not anonymous","Tato místnost není anonymní"}.
{"Thursday","Čtvrtek"}.
{"Time","Čas"}.
{"Time delay","Časový posun"}.
{"Too many CAPTCHA requests","Přiliš mnoho CAPTCHA žádostí"}.
{"To","Pro"}.
{"To ~s","Pro ~s"}.
{"Traffic rate limit is exceeded","Byl překročen limit"}.
{"Transactions Aborted:","Transakce zrušena"}.
{"Transactions Committed:","Transakce potvrzena"}.
{"Transactions Logged:","Transakce zaznamenána"}.
{"Transactions Restarted:","Transakce restartována"}.
{"Tuesday","Úterý"}.
{"Unable to generate a CAPTCHA","Nebylo možné vygenerovat CAPTCHA"}.
{"Unauthorized","Nemáte oprávnění"}.
{"Unregister a Jabber account","Zrušte registraci účtu Jabberu"}.
{"Unregister","Zrušit registraci"}.
{"Update ","Aktualizovat "}.
{"Update","Aktualizovat"}.
{"Update message of the day (don't send)","Aktualizovat zprávu dne (neodesílat)"}.
{"Update message of the day on all hosts (don't send)","Aktualizovat zprávu dne pro všechny hostitele (neodesílat)"}.
{"Update plan","Aktualizovat plán"}.
{"Update script","Aktualizované skripty"}.
{"Uptime:","Čas běhu:"}.
{"Use of STARTTLS required","Je vyžadováno STARTTLS"}.
{"User JID","Jabber ID uživatele"}.
{"User Management","Správa uživatelů"}.
{"Username:","Uživatelské jméno:"}.
{"Users are not allowed to register accounts so quickly","Je zakázáno registrovat účty v tak rychlém sledu"}.
{"Users Last Activity","Poslední aktivita uživatele"}.
{"Users","Uživatelé"}.
{"User ","Uživatel "}.
{"User","Uživatel"}.
{"Validate","Ověřit"}.
{"vCard User Search","Hledání uživatelů podle vizitek"}.
{"Virtual Hosts","Virtuální hostitelé"}.
{"Visitors are not allowed to change their nicknames in this room","Návštěvníkům této místnosti je zakázáno měnit přezdívku"}.
{"Visitors are not allowed to send messages to all occupants","Návštevníci nemají povoleno zasílat zprávy všem účastníkům konference"}.
{"Voice requests are disabled in this conference","Voice žádosti jsou v této konferenci zakázány"}.
{"Voice request","Žádost o voice práva"}.
{"Wednesday","Středa"}.
{"When to send the last published item","Kdy odeslat poslední publikovanou položku"}.
{"Whether to allow subscriptions","Povolit odebírání"}.
{"You can later change your password using a Jabber client.","Později můžete své heslo změnit pomocí klienta Jabberu."}.
{"You have been banned from this room","Byl jste vyloučen z této místnosti"}.
{"You must fill in field \"Nickname\" in the form","Musíte vyplnit políčko \"Přezdívka\" ve formuláři"}.
{"You need a client that supports x:data and CAPTCHA to register","Pro registraci potřebujete klienta s podporou x:data a CAPTCHA"}.
{"You need a client that supports x:data to register the nickname","Pro registraci přezdívky potřebujete klienta s podporou x:data"}.
{"You need an x:data capable client to configure mod_irc settings","Pro konfiguraci mod_irc potřebujete klienta s podporou x:data"}.
{"You need an x:data capable client to configure room","Ke konfiguraci místnosti potřebujete klienta podporujícího x:data"}.
{"You need an x:data capable client to search","K vyhledávání potřebujete klienta podporujícího x:data"}.
{"Your active privacy list has denied the routing of this stanza.","Vaše nastavení soukromí znemožnilo směrování této stance."}.
{"Your contact offline message queue is full. The message has been discarded.","Fronta offline zpráv pro váš kontakt je plná. Zpráva byla zahozena."}.
{"Your Jabber account was successfully created.","Váš účet Jabberu byl úspěšně vytvořen."}.
{"Your Jabber account was successfully deleted.","Váš účet Jabberu byl úspěšně smazán."}.
{"Your messages to ~s are being blocked. To unblock them, visit ~s","Nesmíte posílat zprávy na ~s. Pro povolení navštivte ~s"}.
ejabberd-2.1.11/src/msgs/gl.msg 0000664 0000000 0000000 00000054524 12240230175 013102 0 ustar {"Access Configuration","Configuración de accesos"}.
{"Access Control List Configuration","Configuración da Lista de Control de Acceso"}.
{"Access control lists","Listas de Control de Acceso"}.
{"Access Control Lists","Listas de Control de Acceso"}.
{"Access denied by service policy","Acceso denegado pola política do servizo"}.
{"Access rules","Regras de acceso"}.
{"Access Rules","Regras de Acceso"}.
{"Action on user","Acción no usuario"}.
{"Add Jabber ID","Engadir ID Jabber"}.
{"Add New","Engadir novo"}.
{"Add User","Engadir usuario"}.
{"Administration","Administración"}.
{"Administration of ","Administración de "}.
{"Administrator privileges required","Necesítase privilexios de administrador"}.
{"A friendly name for the node","Un nome para o nodo"}.
{"All activity","Toda a actividade"}.
{"Allow this Jabber ID to subscribe to this pubsub node?","Desexas permitir a este JabberID que se subscriba a este nodo PubSub?"}.
{"Allow users to change the subject","Permitir aos usuarios cambiar o asunto"}.
{"Allow users to query other users","Permitir aos usuarios consultar a outros usuarios"}.
{"Allow users to send invites","Permitir aos usuarios enviar invitacións"}.
{"Allow users to send private messages","Permitir aos usuarios enviar mensaxes privadas"}.
{"Allow visitors to change nickname","Permitir aos visitantes cambiarse o alcume"}.
{"Allow visitors to send status text in presence updates","Permitir aos visitantes enviar texto de estado nas actualizacións depresenza"}.
{"All Users","Todos os usuarios"}.
{"Announcements","Anuncios"}.
{"anyone","calquera"}.
{"A password is required to enter this room","Necesítase contrasinal para entrar nesta sala"}.
{"April","Abril"}.
{"August","Agosto"}.
{"Backup","Gardar copia de seguridade"}.
{"Backup Management","Xestión de copia de seguridade"}.
{"Backup of ","Copia de seguridade de "}.
{"Backup to File at ","Copia de seguridade de arquivos en "}.
{"Bad format","Mal formato"}.
{"Birthday","Aniversario"}.
{"Change Password","Cambiar contrasinal"}.
{"Change User Password","Cambiar contrasinal de usuario"}.
{"Chatroom configuration modified","Configuración de la sala modificada"}.
{"Chatrooms","Salas de charla"}.
{"Choose a username and password to register with this server","Escolle un nome de usuario e contrasinal para rexistrarche neste servidor"}.
{"Choose modules to stop","Selecciona módulos a deter"}.
{"Choose storage type of tables","Selecciona tipo de almacenamento das táboas"}.
{"Choose whether to approve this entity's subscription.","Decidir se aprobar a subscripción desta entidade."}.
{"City","Cidade"}.
{"Commands","Comandos"}.
{"Conference room does not exist","A sala de conferencias non existe"}.
{"Configuration","Configuración"}.
{"Configuration of room ~s","Configuración para a sala ~s"}.
{"Connected Resources:","Recursos conectados:"}.
{"Connections parameters","Parámetros de conexiones"}.
{"Country","País"}.
{"CPU Time:","Tempo consumido de CPU:"}.
{"Database","Base de datos"}.
{"Database Tables at ","Táboas da base de datos en "}.
{"Database Tables Configuration at ","Configuración de táboas da base de datos en "}.
{"December","Decembro"}.
{"Default users as participants","Os usuarios son participantes por defecto"}.
{"Delete","Eliminar"}.
{"Delete message of the day","Borrar mensaxe do dia"}.
{"Delete message of the day on all hosts","Borrar a mensaxe do día en todos os dominios"}.
{"Delete Selected","Eliminar os seleccionados"}.
{"Delete User","Borrar usuario"}.
{"Deliver event notifications","Entregar notificacións de eventos"}.
{"Deliver payloads with event notifications","Enviar payloads xunto coas notificacións de eventos"}.
{"Description:","Descrición:"}.
{"Disc only copy","Copia en disco soamente"}.
{"Displayed Groups:","Mostrar grupos:"}.
{"Dump Backup to Text File at ","Exporta copia de seguridade a ficheiro de texto en "}.
{"Dump to Text File","Exportar a ficheiro de texto"}.
{"Edit Properties","Editar propiedades"}.
{"ejabberd IRC module","Módulo de IRC para ejabberd"}.
{"ejabberd MUC module","Módulo de MUC para ejabberd"}.
{"ejabberd Publish-Subscribe module","Módulo de Publicar-Subscribir de ejabberd"}.
{"ejabberd SOCKS5 Bytestreams module","ejabberd SOCKS5 Bytestreams module"}.
{"ejabberd vCard module","Módulo vCard para ejabberd"}.
{"ejabberd Web Admin","Ejabberd Administrador Web"}.
{"Elements","Elementos"}.
{"Email","Email"}.
{"Enable logging","Gardar históricos"}.
{"Encoding for server ~b","Codificación de servidor ~b"}.
{"End User Session","Pechar sesión de usuario"}.
{"Enter list of {Module, [Options]}","Introduce lista de {Módulo, [Opcións]}"}.
{"Enter nickname you want to register","Introduce o alcume que queiras rexistrar"}.
{"Enter path to backup file","Introduce ruta ao ficheiro de copia de seguridade"}.
{"Enter path to jabberd14 spool dir","Introduce a ruta ao directorio de jabberd14 spools"}.
{"Enter path to jabberd14 spool file","Introduce ruta ao ficheiro jabberd14 spool"}.
{"Enter path to text file","Introduce ruta ao ficheiro de texto"}.
{"Enter the text you see","Introduza o texto que ves"}.
{"Enter username and encodings you wish to use for connecting to IRC servers. Press 'Next' to get more fields to fill in. Press 'Complete' to save settings.","Introduce o nome de usuario e codificaciones de carácteres que queiras usar ao conectar nos servidores de IRC. Presione 'Siguiente' para obtener más campos para rellenar Presione 'completo' para guardar axustes."}.
{"Enter username, encodings, ports and passwords you wish to use for connecting to IRC servers","Introduza o nome de usuario, codificaciones de carácter, portos e contrasinal que pretende utilizar a conectar a servidores de IRC"}.
{"Erlang Jabber Server","Servidor Jabber en Erlang"}.
{"Error","Erro"}.
{"Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef.net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}].","Exemplo: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef.net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."}.
{"Export data of all users in the server to PIEFXIS files (XEP-0227):","Exportar datos de todos os usuarios do servidor a ficheros PIEFXIS (XEP-0227):"}.
{"Export data of users in a host to PIEFXIS files (XEP-0227):","Exportar datos de todos os usuarios do servidor a ficheros PIEFXIS (XEP-0227):"}.
{"Family Name","Apelido"}.
{"February","Febreiro"}.
{"Fill in fields to search for any matching Jabber User","Rechea campos para buscar usuarios Jabber que concuerden"}.
{"Fill in the form to search for any matching Jabber User (Add * to the end of field to match substring)","Enche o formulario para buscar usuarios Jabber. Engade * ao final dun campo para buscar subcadenas."}.
{"Friday","Venres"}.
{"From","De"}.
{"From ~s","De ~s"}.
{"Full Name","Nome completo"}.
{"Get Number of Online Users","Ver número de usuarios conectados"}.
{"Get Number of Registered Users","Ver número de usuarios rexistrados"}.
{"Get User Last Login Time","Ver data da última conexión de usuario"}.
{"Get User Password","Ver contrasinal de usuario"}.
{"Get User Statistics","Ver estatísticas de usuario"}.
{"Group ","Grupo "}.
{"Groups","Grupos"}.
{"has been banned","foi bloqueado"}.
{"has been kicked because of an affiliation change","foi expulsado debido a un cambio de afiliación"}.
{"has been kicked because of a system shutdown","foi expulsado por mor dun sistema de peche"}.
{"has been kicked because the room has been changed to members-only","foi expulsado, porque a sala cambiouse a só-membros"}.
{"has been kicked","foi expulsado"}.
{" has set the subject to: "," puxo o asunto: "}.
{"Host","Host"}.
{"If you want to specify different ports, passwords, encodings for IRC servers, fill this list with values in format '{\"irc server\", \"encoding\", port, \"password\"}'. By default this service use \"~s\" encoding, port ~p, empty password.","Se quere especificar codificaciones de caracteres diferentes, contrasinal ou servidor IRC rechea esta lista con valores no formato '{\"servidor irc\", \"codificación\", \"porto\", \"contrasinal\"}'. Este servizo utiliza por defecto a codificación \"~s\", porto ~p, sen contrasinal."}.
{"Import Directory","Importar directorio"}.
{"Import File","Importar ficheiro"}.
{"Import user data from jabberd14 spool file:","Importar usuario de fichero spool de jabberd14:"}.
{"Import User from File at ","Importa usuario desde ficheiro en "}.
{"Import users data from a PIEFXIS file (XEP-0227):","Importar usuarios desde un fichero PIEFXIS"}.
{"Import users data from jabberd14 spool directory:","Importar usuarios do directorio spool de jabberd14:"}.
{"Import Users from Dir at ","Importar usuarios desde o directorio en "}.
{"Import Users From jabberd14 Spool Files","Importar usuarios de ficheiros spool de jabberd-1.4"}.
{"Improper message type","Tipo de mensaxe incorrecta"}.
{"Incorrect password","Contrasinal incorrecta"}.
{"Invalid affiliation: ~s","Afiliación non válida: ~s"}.
{"Invalid role: ~s","Rol non válido: ~s"}.
{"IP addresses","Direccións IP"}.
{"IP","IP"}.
{"IRC channel (don't put the first #)","Canle de IRC (non poñer o primeiro #)"}.
{"IRC server","Servidor IRC"}.
{"IRC settings","IRC axustes"}.
{"IRC Transport","Transporte IRC"}.
{"IRC username","Nome de usuario en IRC"}.
{"IRC Username","Nome de usuario en IRC"}.
{"is now known as","cámbiase o nome a"}.
{"It is not allowed to send private messages","Non está permitido enviar mensaxes privadas"}.
{"It is not allowed to send private messages of type \"groupchat\"","Non está permitido enviar mensaxes privadas do tipo \"groupchat\""}.
{"It is not allowed to send private messages to the conference","Impedir o envio de mensaxes privadas á sala"}.
{"Jabber ID","Jabber ID"}.
{"Jabber ID ~s is invalid","O Jabber ID ~s non é válido"}.
{"January","Xaneiro"}.
{"Join IRC channel","Entrar en canle IRC"}.
{"joins the room","entra en la sala"}.
{"Join the IRC channel here.","Únete á canle de IRC aquí."}.
{"Join the IRC channel in this Jabber ID: ~s","Únete á canle de IRC con este IDE de Jabber: ~s"}.
{"July","Xullo"}.
{"June","Xuño"}.
{"Last Activity","Última actividade"}.
{"Last login","Última conexión"}.
{"Last month","Último mes"}.
{"Last year","Último ano"}.
{"leaves the room","sae da sala"}.
{"Listened Ports at ","Portos de escoita en "}.
{"Listened Ports","Portos de escoita"}.
{"List of modules to start","Lista de módulos a iniciar"}.
{"Low level update script","Script de actualización a baixo nivel"}.
{"Make participants list public","A lista de participantes é pública"}.
{"Make room CAPTCHA protected","Protexer a sala con CAPTCHA"}.
{"Make room members-only","Sala só para membros"}.
{"Make room moderated","Facer sala moderada"}.
{"Make room password protected","Protexer a sala con contrasinal"}.
{"Make room persistent","Sala permanente"}.
{"Make room public searchable","Sala publicamente visible"}.
{"March","Marzo"}.
{"Maximum Number of Occupants","Número máximo de ocupantes"}.
{"Max # of items to persist","Máximo # de elementos que persisten"}.
{"Max payload size in bytes","Máximo tamaño do payload en bytes"}.
{"May","Maio"}.
{"Membership is required to enter this room","Necesitas ser membro desta sala para poder entrar"}.
{"Members:","Membros:"}.
{"Memory","Memoria"}.
{"Message body","Corpo da mensaxe"}.
{"Middle Name","Segundo nome"}.
{"Moderator privileges required","Necesítase privilexios de moderador"}.
{"moderators only","só moderadores"}.
{"Modified modules","Módulos Modificados"}.
{"Module","Módulo"}.
{"Modules at ","Módulos en "}.
{"Modules","Módulos"}.
{"Monday","Luns"}.
{"Name:","Nome:"}.
{"Name","Nome"}.
{"Never","Nunca"}.
{"Nickname","Alcume"}.
{"Nickname Registration at ","Rexistro do alcume en "}.
{"Nickname ~s does not exist in the room","O alcume ~s non existe na sala"}.
{"No body provided for announce message","Non se proporcionou corpo de mensaxe para o anuncio"}.
{"No Data","Sen datos"}.
{"Node ID","Nodo IDE"}.
{"Node ","Nodo "}.
{"Node not found","Nodo non atopado"}.
{"Nodes","Nodos"}.
{"No limit","Sen límite"}.
{"None","Ningún"}.
{"No resource provided","Non se proporcionou recurso"}.
{"Not Found","Non atopado"}.
{"Notify subscribers when items are removed from the node","Notificar subscriptores cando os elementos bórranse do nodo"}.
{"Notify subscribers when the node configuration changes","Notificar subscriptores cando cambia a configuración do nodo"}.
{"Notify subscribers when the node is deleted","Notificar subscriptores cando o nodo bórrase"}.
{"November","Novembro"}.
{"Number of occupants","Número de ocupantes"}.
{"Number of online users","Número de usuarios conectados"}.
{"Number of registered users","Número de usuarios rexistrados"}.
{"October","Outubro"}.
{"Offline Messages","Mensaxes diferidas"}.
{"Offline Messages:","Mensaxes sen conexión:"}.
{"OK","Aceptar"}.
{"Online","Conectado"}.
{"Online Users:","Usuarios conectados:"}.
{"Online Users","Usuarios conectados"}.
{"Only deliver notifications to available users","Só enviar notificacións aos usuarios dispoñibles"}.
{"Only moderators and participants are allowed to change the subject in this room","Só os moderadores e os participantes se lles permite cambiar o tema nesta sala"}.
{"Only moderators are allowed to change the subject in this room","Só os moderadores están autorizados a cambiar o tema nesta sala"}.
{"Only occupants are allowed to send messages to the conference","Só os ocupantes poden enviar mensaxes á sala"}.
{"Only occupants are allowed to send queries to the conference","Só os ocupantes poden enviar solicitudes á sala"}.
{"Only service administrators are allowed to send service messages","Só os administradores do servizo teñen permiso para enviar mensaxes de servizo"}.
{"Options","Opcións"}.
{"Organization Name","Nome da organización"}.
{"Organization Unit","Unidade da organización"}.
{"Outgoing s2s Connections:","Conexións S2S saíntes:"}.
{"Outgoing s2s Connections","Conexións S2S saíntes"}.
{"Outgoing s2s Servers:","Servidores S2S saíntes:"}.
{"Owner privileges required","Requírense privilexios de propietario da sala"}.
{"Packet","Paquete"}.
{"Password ~b","Contrasinal ~b"}.
{"Password:","Contrasinal:"}.
{"Password","Contrasinal"}.
{"Password Verification","Verificación da contrasinal"}.
{"Path to Dir","Ruta ao directorio"}.
{"Path to File","Ruta ao ficheiro"}.
{"Pending","Pendente"}.
{"Period: ","Periodo: "}.
{"Persist items to storage","Persistir elementos ao almacenar"}.
{"Ping","Ping"}.
{"Please note that these options will only backup the builtin Mnesia database. If you are using the ODBC module, you also need to backup your SQL database separately.","Ten en conta que estas opcións só farán copia de seguridade da base de datos Mnesia. Se está a utilizar o módulo de ODBC, tamén necesita unha copia de seguridade da súa base de datos SQL por separado."}.
{"Pong","Pong"}.
{"Port ~b","Porto ~b"}.
{"Port","Porto"}.
{"Present real Jabber IDs to","Os Jabber ID reais poden velos"}.
{"private, ","privado"}.
{"Protocol","Protocolo"}.
{"Publish-Subscribe","Publicar-Subscribir"}.
{"PubSub subscriber request","Petición de subscriptor de PubSub"}.
{"Queries to the conference members are not allowed in this room","Nesta sala non se permiten solicitudes aos membros da sala"}.
{"RAM and disc copy","Copia en RAM e disco"}.
{"RAM copy","Copia en RAM"}.
{"Raw","Cru"}.
{"Really delete message of the day?","Está seguro de quere borrar a mensaxe do dia?"}.
{"Recipient is not in the conference room","O receptor non está na sala de conferencia"}.
{"Registered Users:","Usuarios rexistrados:"}.
{"Registered Users","Usuarios rexistrados"}.
{"Registration in mod_irc for ","Rexistro en mod_irc para"}.
{"Remote copy","Copia remota"}.
{"Remove All Offline Messages","Borrar Todas as Mensaxes Sen conexión"}.
{"Remove","Borrar"}.
{"Remove User","Eliminar usuario"}.
{"Replaced by new connection","Substituído por unha nova conexión"}.
{"Resources","Recursos"}.
{"Restart","Reiniciar"}.
{"Restart Service","Reiniciar o servizo"}.
{"Restore Backup from File at ","Restaura copia de seguridade desde o ficheiro en "}.
{"Restore binary backup after next ejabberd restart (requires less memory):","Restaurar copia de seguridade binaria no seguinte reinicio de ejabberd (require menos memoria que se instantánea):"}.
{"Restore binary backup immediately:","Restaurar inmediatamente copia de seguridade binaria:"}.
{"Restore plain text backup immediately:","Restaurar copias de seguridade de texto plano inmediatamente:"}.
{"Restore","Restaurar"}.
{"Room Configuration","Configuración da Sala"}.
{"Room creation is denied by service policy","Denegar crear a sala por política do servizo"}.
{"Room description","Descrición da sala"}.
{"Room Occupants","Ocupantes da sala"}.
{"Room title","Título da sala"}.
{"Roster groups allowed to subscribe","Lista de grupos autorizados a subscribir"}.
{"Roster","Lista de contactos"}.
{"Roster of ","Lista de contactos de "}.
{"Roster size","Tamaño da lista de contactos"}.
{"RPC Call Error","Erro na chamada RPC"}.
{"Running Nodes","Nodos funcionando"}.
{"~s access rule configuration","Configuración das Regra de Acceso ~s"}.
{"Saturday","Sábado"}.
{"Script check","Comprobación de script"}.
{"Search Results for ","Buscar resultados por "}.
{"Search users in ","Buscar usuarios en "}.
{"Send announcement to all online users","Enviar anuncio a todos los usuarios conectados"}.
{"Send announcement to all online users on all hosts","Enviar anuncio a todos os usuarios conectados en todos os dominios"}.
{"Send announcement to all users","Enviar anuncio a todos os usuarios"}.
{"Send announcement to all users on all hosts","Enviar anuncio a todos os usuarios en todos os dominios"}.
{"September","Setembro"}.
{"Server ~b","Servidor ~b"}.
{"Set message of the day and send to online users","Pór mensaxe do dia e enviar a todos os usuarios conectados"}.
{"Set message of the day on all hosts and send to online users","Pór mensaxe do día en todos os dominios e enviar aos usuarios conectados"}.
{"Shared Roster Groups","Grupos Compartidos"}.
{"Show Integral Table","Mostrar Táboa Integral"}.
{"Show Ordinary Table","Mostrar Táboa Ordinaria"}.
{"Shut Down Service","Deter o servizo"}.
{"~s invites you to the room ~s","~s invítache á sala ~s"}.
{"Specify the access model","Especifica o modelo de acceso"}.
{"Specify the publisher model","Especificar o modelo do publicante"}.
{"~s's Offline Messages Queue","Cola de mensaxes diferidas de ~s"}.
{"Start","Iniciar"}.
{"Start Modules at ","Iniciar módulos en "}.
{"Start Modules","Iniciar módulos"}.
{"Statistics","Estatísticas"}.
{"Statistics of ~p","Estatísticas de ~p"}.
{"Stop","Deter"}.
{"Stop Modules at ","Deter módulos en "}.
{"Stop Modules","Detener módulos"}.
{"Stopped Nodes","Nodos detidos"}.
{"Storage Type","Tipo de almacenamiento"}.
{"Store binary backup:","Gardar copia de seguridade binaria:"}.
{"Store plain text backup:","Gardar copia de seguridade en texto plano:"}.
{"Subject","Asunto"}.
{"Submit","Enviar"}.
{"Submitted","Enviado"}.
{"Subscriber Address","Dirección do subscriptor"}.
{"Subscription","Subscripción"}.
{"Sunday","Domingo"}.
{"That nickname is already in use by another occupant","Ese alcume que xa está en uso por outro ocupante"}.
{"That nickname is registered by another person","O alcume xa está rexistrado por outra persoa"}.
{"The CAPTCHA is valid.","O CAPTCHA é válido."}.
{"The collections with which a node is affiliated","As coleccións coas que un nodo está afiliado"}.
{"the password is","a contrasinal é"}.
{"This participant is kicked from the room because he sent an error message","Este participante é expulsado da sala, xa que enviou unha mensaxe de erro"}.
{"This participant is kicked from the room because he sent an error message to another participant","Este participante é expulsado da sala, porque el enviou unha mensaxe de erro a outro participante"}.
{"This participant is kicked from the room because he sent an error presence","Este participante é expulsado da sala, porque el enviou un erro de presenza"}.
{"This room is not anonymous","Sala non anónima"}.
{"Thursday","Xoves"}.
{"Time","Data"}.
{"Time delay","Atraso temporal"}.
{"To","Para"}.
{"To ~s","A ~s"}.
{"Traffic rate limit is exceeded","Hase exedido o límite de tráfico"}.
{"Transactions Aborted:","Transaccións abortadas:"}.
{"Transactions Committed:","Transaccións finalizadas:"}.
{"Transactions Logged:","Transaccións rexistradas:"}.
{"Transactions Restarted:","Transaccións reiniciadas:"}.
{"Tuesday","Martes"}.
{"Unauthorized","Non autorizado"}.
{"Update ","Actualizar"}.
{"Update","Actualizar"}.
{"Update message of the day (don't send)","Actualizar mensaxe do dia, pero non envialo"}.
{"Update message of the day on all hosts (don't send)","Actualizar a mensaxe do día en todos os dominos (pero non envialo)"}.
{"Update plan","Plan de actualización"}.
{"Update script","Script de actualización"}.
{"Uptime:","Tempo desde o inicio:"}.
{"Use of STARTTLS required","É obrigatorio usar STARTTLS"}.
{"User Management","Administración de usuarios"}.
{"Users are not allowed to register accounts so quickly","Os usuarios non están autorizados a rexistrar contas con tanta rapidez"}.
{"Users Last Activity","Última actividade dos usuarios"}.
{"Users","Usuarios"}.
{"User ","Usuario "}.
{"User","Usuario"}.
{"Validate","Validar"}.
{"vCard User Search","Procura de usuario en vCard"}.
{"Virtual Hosts","Hosts Virtuais"}.
{"Visitors are not allowed to change their nicknames in this room","Os visitantes non están autorizados a cambiar os seus That alcumes nesta sala"}.
{"Visitors are not allowed to send messages to all occupants","Os visitantes non poden enviar mensaxes a todos os ocupantes"}.
{"Wednesday","Mércores"}.
{"When to send the last published item","Cando enviar o último elemento publicado"}.
{"Whether to allow subscriptions","Permitir subscripciones"}.
{"You have been banned from this room","fuches bloqueado nesta sala"}.
{"You must fill in field \"Nickname\" in the form","Debes encher o campo \"Alcumo\" no formulario"}.
{"You need an x:data capable client to configure mod_irc settings","Necesitas un cliente con soporte de x:data para configurar as opcións de mod_irc"}.
{"You need an x:data capable client to configure room","Necesitas un cliente con soporte de x:data para configurar a sala"}.
{"You need an x:data capable client to search","Necesitas un cliente con soporte de x:data para poder buscar"}.
{"Your contact offline message queue is full. The message has been discarded.","A túa cola de mensaxes diferidas de contactos está chea. A mensaxe descartouse."}.
{"Your messages to ~s are being blocked. To unblock them, visit ~s","As súas mensaxes a ~s encóntranse bloqueadas. Para desbloquear, visite ~s"}.
ejabberd-2.1.11/src/msgs/el.po 0000664 0000000 0000000 00000207364 12240230175 012732 0 ustar msgid ""
msgstr ""
"Project-Id-Version: el\n"
"POT-Creation-Date: \n"
"PO-Revision-Date: 2012-04-18 12:50-0000\n"
"Last-Translator: James Iakovos Mandelis \n"
"Language-Team: \n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Language: Greek (ελληνικά)\n"
#: ejabberd_c2s.erl:424 ejabberd_c2s.erl:727
msgid "Use of STARTTLS required"
msgstr "Απαιτείται χρήση STARTTLS "
#: ejabberd_c2s.erl:503
msgid "No resource provided"
msgstr "Δεν προμηθεύτικε πόρος"
#: ejabberd_c2s.erl:1197
msgid "Replaced by new connection"
msgstr "Αντικαταστάθικε από νέα σύνδεση"
#: ejabberd_c2s.erl:1885
msgid "Your active privacy list has denied the routing of this stanza."
msgstr ""
"Ο ενεργός κατάλογος απορρήτου, έχει αρνηθεί τη δρομολόγηση αυτής της στροφής "
"(stanza)."
#: ejabberd_captcha.erl:96 ejabberd_captcha.erl:152 ejabberd_captcha.erl:178
msgid "Enter the text you see"
msgstr "Πληκτρολογήστε το κείμενο που βλέπετε"
#: ejabberd_captcha.erl:101
msgid "Your messages to ~s are being blocked. To unblock them, visit ~s"
msgstr ""
"Τα μηνύματά σας πρως ~s είναι αποκλεισμένα. Για αποδεσμεύση, επισκεφθείτε ~s"
#: ejabberd_captcha.erl:134
msgid "If you don't see the CAPTCHA image here, visit the web page."
msgstr "Εάν δεν βλέπετε την εικόνα CAPTCHA εδώ, επισκεφθείτε την ιστοσελίδα."
#: ejabberd_captcha.erl:146
msgid "CAPTCHA web page"
msgstr "Ιστοσελίδα CAPTCHA "
#: ejabberd_captcha.erl:307
msgid "The CAPTCHA is valid."
msgstr "Το CAPTCHA είναι έγκυρο."
#: mod_adhoc.erl:95 mod_adhoc.erl:125 mod_adhoc.erl:143 mod_adhoc.erl:161
msgid "Commands"
msgstr "Εντολές"
#: mod_adhoc.erl:149 mod_adhoc.erl:243
msgid "Ping"
msgstr "Πινγκ"
#: mod_adhoc.erl:260
msgid "Pong"
msgstr "Πονγκ"
#: mod_announce.erl:507 mod_announce_odbc.erl:499
msgid "Really delete message of the day?"
msgstr "Πραγματικά να διαγράψετε το μήνυμα της ημέρας;"
#: mod_announce.erl:515 mod_announce_odbc.erl:507 mod_configure.erl:1083
#: mod_configure.erl:1128
msgid "Subject"
msgstr "Θέμα"
#: mod_announce.erl:520 mod_announce_odbc.erl:512 mod_configure.erl:1088
#: mod_configure.erl:1133
msgid "Message body"
msgstr "Περιεχόμενο μηνυμάτως"
#: mod_announce.erl:600 mod_announce_odbc.erl:592
msgid "No body provided for announce message"
msgstr "Δεν προμηθεύτικε περιεχόμενο ανακοινώσης"
#: mod_announce.erl:635 mod_announce_odbc.erl:627
msgid "Announcements"
msgstr "Ανακοινώσεις"
#: mod_announce.erl:637 mod_announce_odbc.erl:629
msgid "Send announcement to all users"
msgstr "Αποστολή ανακοίνωσης σε όλους τους χρήστες"
#: mod_announce.erl:639 mod_announce_odbc.erl:631
msgid "Send announcement to all users on all hosts"
msgstr ""
"Αποστολή ανακοίνωσης σε όλους τους χρήστες σε όλους τους κεντρικούς "
"υπολογιστές"
#: mod_announce.erl:641 mod_announce_odbc.erl:633
msgid "Send announcement to all online users"
msgstr "Αποστολή ανακοίνωσης σε όλους τους συνδεδεμένους χρήστες"
#: mod_announce.erl:643 mod_announce_odbc.erl:635 mod_configure.erl:1078
#: mod_configure.erl:1123
msgid "Send announcement to all online users on all hosts"
msgstr ""
"Αποστολή ανακοίνωσης σε όλους τους συνδεδεμένους χρήστες σε όλους τους "
"κεντρικούς υπολογιστές"
#: mod_announce.erl:645 mod_announce_odbc.erl:637
msgid "Set message of the day and send to online users"
msgstr "Ορίστε μήνυμα ημέρας και αποστολή στους συνδεδεμένους χρήστες"
#: mod_announce.erl:647 mod_announce_odbc.erl:639
msgid "Set message of the day on all hosts and send to online users"
msgstr ""
"Ορίστε μήνυμα ημέρας και άμεση αποστολή στους συνδεδεμένους χρήστες σε όλους "
"τους κεντρικούς υπολογιστές"
#: mod_announce.erl:649 mod_announce_odbc.erl:641
msgid "Update message of the day (don't send)"
msgstr "Ενημέρωση μηνύματως ημέρας (χωρίς άμεση αποστολή)"
#: mod_announce.erl:651 mod_announce_odbc.erl:643
msgid "Update message of the day on all hosts (don't send)"
msgstr ""
"Ενημέρωση μηνύματως ημέρας σε όλους τους κεντρικούς υπολογιστές (χωρίς άμεση "
"αποστολή)"
#: mod_announce.erl:653 mod_announce_odbc.erl:645
msgid "Delete message of the day"
msgstr "Διαγράψτε το μήνυμα της ημέρας"
#: mod_announce.erl:655 mod_announce_odbc.erl:647
msgid "Delete message of the day on all hosts"
msgstr "Διαγράψτε το μήνυμα της ημέρας σε όλους τους κεντρικούς υπολογιστές"
#: mod_configure.erl:114 mod_configure.erl:274 mod_configure.erl:296
#: mod_configure.erl:498
msgid "Configuration"
msgstr "Διαμόρφωση"
#: mod_configure.erl:125 mod_configure.erl:576 web/ejabberd_web_admin.erl:1936
msgid "Database"
msgstr "Βάση δεδομένων"
#: mod_configure.erl:127 mod_configure.erl:595
msgid "Start Modules"
msgstr "Εκκίνηση Modules"
#: mod_configure.erl:129 mod_configure.erl:596
msgid "Stop Modules"
msgstr "ΠαύσηModules"
#: mod_configure.erl:131 mod_configure.erl:604 web/ejabberd_web_admin.erl:1937
msgid "Backup"
msgstr "Αποθήκευση Αντιγράφου Ασφαλείας"
#: mod_configure.erl:133 mod_configure.erl:605
msgid "Restore"
msgstr "Επαναφορά Αντιγράφου Ασφαλείας"
#: mod_configure.erl:135 mod_configure.erl:606
msgid "Dump to Text File"
msgstr "Αποθήκευση σε αρχείο κειμένου"
#: mod_configure.erl:137 mod_configure.erl:615
msgid "Import File"
msgstr "Εισαγωγή αρχείων"
#: mod_configure.erl:139 mod_configure.erl:616
msgid "Import Directory"
msgstr "Εισαγωγή κατάλογου αρχείων"
#: mod_configure.erl:141 mod_configure.erl:581 mod_configure.erl:1057
msgid "Restart Service"
msgstr "Επανεκκίνηση Υπηρεσίας"
#: mod_configure.erl:143 mod_configure.erl:582 mod_configure.erl:1102
msgid "Shut Down Service"
msgstr "Κλείσιμο Υπηρεσίας"
#: mod_configure.erl:145 mod_configure.erl:518 mod_configure.erl:1197
#: web/ejabberd_web_admin.erl:1527
msgid "Add User"
msgstr "Προσθήκη Χρήστη"
#: mod_configure.erl:147 mod_configure.erl:519 mod_configure.erl:1219
msgid "Delete User"
msgstr "Διαγραφή Χρήστη"
#: mod_configure.erl:149 mod_configure.erl:520 mod_configure.erl:1231
msgid "End User Session"
msgstr "Τερματισμός Συνεδρίας Χρήστη"
#: mod_configure.erl:151 mod_configure.erl:521 mod_configure.erl:1243
#: mod_configure.erl:1255
msgid "Get User Password"
msgstr "Έκθεση Κωδικού Πρόσβασης Χρήστη"
#: mod_configure.erl:153 mod_configure.erl:522
msgid "Change User Password"
msgstr "Αλλαγή Κωδικού Πρόσβασης Χρήστη"
#: mod_configure.erl:155 mod_configure.erl:523 mod_configure.erl:1272
msgid "Get User Last Login Time"
msgstr "Έκθεση Τελευταίας Ώρας Σύνδεσης Χρήστη"
#: mod_configure.erl:157 mod_configure.erl:524 mod_configure.erl:1284
msgid "Get User Statistics"
msgstr "Έκθεση Στατιστικών Χρήστη"
#: mod_configure.erl:159 mod_configure.erl:525
msgid "Get Number of Registered Users"
msgstr "Έκθεση αριθμού εγγεγραμμένων χρηστών"
#: mod_configure.erl:161 mod_configure.erl:526
msgid "Get Number of Online Users"
msgstr "Έκθεση αριθμού συνδεδεμένων χρηστών"
#: mod_configure.erl:163 mod_configure.erl:509 web/ejabberd_web_admin.erl:831
#: web/ejabberd_web_admin.erl:872
msgid "Access Control Lists"
msgstr "Λίστες Ελέγχου Πρόσβασης"
#: mod_configure.erl:165 mod_configure.erl:510 web/ejabberd_web_admin.erl:940
#: web/ejabberd_web_admin.erl:976
msgid "Access Rules"
msgstr "Κανόνες Πρόσβασης"
#: mod_configure.erl:297 mod_configure.erl:499
msgid "User Management"
msgstr "Διαχείριση χρηστών"
#: mod_configure.erl:500 web/ejabberd_web_admin.erl:1058
#: web/ejabberd_web_admin.erl:1462
msgid "Online Users"
msgstr "Συνδεμένοι χρήστες"
#: mod_configure.erl:501
msgid "All Users"
msgstr "Όλοι οι χρήστες"
#: mod_configure.erl:502
msgid "Outgoing s2s Connections"
msgstr "Εξερχόμενες S2S Συνδέσεις"
#: mod_configure.erl:503 web/ejabberd_web_admin.erl:1907
msgid "Running Nodes"
msgstr "Ενεργοί Κόμβοι"
#: mod_configure.erl:504 web/ejabberd_web_admin.erl:1909
msgid "Stopped Nodes"
msgstr "Σταματημένοι Κόμβοι"
#: mod_configure.erl:577 mod_configure.erl:587 web/ejabberd_web_admin.erl:1953
msgid "Modules"
msgstr "Modules"
#: mod_configure.erl:578
msgid "Backup Management"
msgstr "Διαχείριση Αντιγράφου Ασφαλείας"
#: mod_configure.erl:579
msgid "Import Users From jabberd14 Spool Files"
msgstr "Εισαγωγή Χρηστών από αρχεία σειράς jabberd14"
#: mod_configure.erl:699
msgid "To ~s"
msgstr "Πρώς ~s"
#: mod_configure.erl:717
msgid "From ~s"
msgstr "Από ~s"
#: mod_configure.erl:913
msgid "Database Tables Configuration at "
msgstr "Διαμόρφωση Πίνακων βάσης δεδομένων στο "
#: mod_configure.erl:918
msgid "Choose storage type of tables"
msgstr "Επιλέξτε τύπο αποθήκευσης των πινάκων"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "Disc only copy"
msgstr "Αντίγραφο μόνο σε δίσκο"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "RAM and disc copy"
msgstr "Αντίγραφο μόνο σε RAM καί δίσκο"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "RAM copy"
msgstr "Αντίγραφο σε RAM"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "Remote copy"
msgstr "Απομεμακρυσμένο αντίγραφο"
#: mod_configure.erl:950
msgid "Stop Modules at "
msgstr "Παύση Modules στο "
#: mod_configure.erl:954
msgid "Choose modules to stop"
msgstr "Επιλέξτε modules για να σταματήσουν"
#: mod_configure.erl:969
msgid "Start Modules at "
msgstr "Εκκίνηση Modules στο "
#: mod_configure.erl:973
msgid "Enter list of {Module, [Options]}"
msgstr "Εισάγετε κατάλογο των (Module, [Επιλογές])"
#: mod_configure.erl:974
msgid "List of modules to start"
msgstr "Λίστα των Module για Εκκίνηση"
#: mod_configure.erl:983
msgid "Backup to File at "
msgstr "Αποθήκευση Αντιγράφου Ασφαλείας σε Αρχείο στο "
#: mod_configure.erl:987 mod_configure.erl:1001
msgid "Enter path to backup file"
msgstr "Εισάγετε τοποθεσία αρχείου αντιγράφου ασφαλείας"
#: mod_configure.erl:988 mod_configure.erl:1002 mod_configure.erl:1016
#: mod_configure.erl:1030
msgid "Path to File"
msgstr "Τοποθεσία Αρχείου"
#: mod_configure.erl:997
msgid "Restore Backup from File at "
msgstr "Επαναφορά Αντιγράφου Ασφαλείας από αρχείο στο "
#: mod_configure.erl:1011
msgid "Dump Backup to Text File at "
msgstr "Αποθήκευση Αντιγράφου Ασφαλείας σε αρχείο κειμένου στο "
#: mod_configure.erl:1015
msgid "Enter path to text file"
msgstr "Εισάγετε Τοποθεσία Αρχείου Κειμένου"
#: mod_configure.erl:1025
msgid "Import User from File at "
msgstr "Εισαγωγή χρηστών από αρχείο στο "
#: mod_configure.erl:1029
msgid "Enter path to jabberd14 spool file"
msgstr "Εισάγετε τοποθεσία αρχείου σειράς jabberd14"
#: mod_configure.erl:1039
msgid "Import Users from Dir at "
msgstr "Εισαγωγή χρηστών από κατάλογο αρχείων στο "
#: mod_configure.erl:1043
msgid "Enter path to jabberd14 spool dir"
msgstr "Εισάγετε κατάλογο αρχείων σειράς jabberd14"
#: mod_configure.erl:1044
msgid "Path to Dir"
msgstr "Τοποθεσία κατάλογου αρχείων"
#: mod_configure.erl:1060 mod_configure.erl:1105
msgid "Time delay"
msgstr "Χρόνος καθυστέρησης"
#: mod_configure.erl:1143
msgid "Access Control List Configuration"
msgstr "Διαχείριση στις Λίστες Ελέγχου Πρόσβασης"
#: mod_configure.erl:1147
msgid "Access control lists"
msgstr "Λίστες Ελέγχου Πρόσβασης"
#: mod_configure.erl:1171
msgid "Access Configuration"
msgstr "Διαμόρφωση Πρόσβασης"
#: mod_configure.erl:1175
msgid "Access rules"
msgstr "Κανόνες Πρόσβασης"
#: mod_configure.erl:1200 mod_configure.erl:1222 mod_configure.erl:1234
#: mod_configure.erl:1246 mod_configure.erl:1258 mod_configure.erl:1275
#: mod_configure.erl:1287 mod_configure.erl:1650 mod_configure.erl:1700
#: mod_configure.erl:1721 mod_roster.erl:943 mod_roster_odbc.erl:1060
#: mod_vcard.erl:472 mod_vcard_ldap.erl:554 mod_vcard_odbc.erl:448
msgid "Jabber ID"
msgstr "Ταυτότητα Jabber"
#: mod_configure.erl:1205 mod_configure.erl:1263 mod_configure.erl:1651
#: mod_configure.erl:1863 mod_muc/mod_muc_room.erl:3224 mod_register.erl:235
#: web/ejabberd_web_admin.erl:1520
msgid "Password"
msgstr "Κωδικός Πρόσβασης"
#: mod_configure.erl:1210
msgid "Password Verification"
msgstr "Επαλήθευση κωδικού πρόσβασης"
#: mod_configure.erl:1301
msgid "Number of registered users"
msgstr "Αριθμός εγγεγραμμένων χρηστών"
#: mod_configure.erl:1315
msgid "Number of online users"
msgstr "Αριθμός συνδεδεμένων χρηστών"
#: mod_configure.erl:1682 web/ejabberd_web_admin.erl:1588
#: web/ejabberd_web_admin.erl:1743
msgid "Never"
msgstr "Ποτέ"
#: mod_configure.erl:1696 web/ejabberd_web_admin.erl:1601
#: web/ejabberd_web_admin.erl:1756
msgid "Online"
msgstr "Συνδεδεμένο"
#: mod_configure.erl:1701
msgid "Last login"
msgstr "Τελευταία σύνδεση"
#: mod_configure.erl:1722
msgid "Roster size"
msgstr "Μέγεθος Καταλόγου Επαφών"
#: mod_configure.erl:1723
msgid "IP addresses"
msgstr "Διευθύνσεις IP"
#: mod_configure.erl:1724
msgid "Resources"
msgstr "Πόροι"
#: mod_configure.erl:1850
msgid "Administration of "
msgstr "Διαχείριση του"
#: mod_configure.erl:1853
msgid "Action on user"
msgstr "Eνέργεια για το χρήστη"
#: mod_configure.erl:1857
msgid "Edit Properties"
msgstr "Επεξεργασία ιδιοτήτων"
#: mod_configure.erl:1860 web/ejabberd_web_admin.erl:1769
msgid "Remove User"
msgstr "Αφαίρεση χρήστη"
#: mod_irc/mod_irc.erl:201 mod_irc/mod_irc_odbc.erl:196
#: mod_muc/mod_muc.erl:336 mod_muc/mod_muc_odbc.erl:342
msgid "Access denied by service policy"
msgstr "Άρνηση πρόσβασης, λόγω τακτικής παροχής υπηρεσιών"
#: mod_irc/mod_irc.erl:401 mod_irc/mod_irc_odbc.erl:398
msgid "IRC Transport"
msgstr "IRC Διαβιβάσεις"
#: mod_irc/mod_irc.erl:428 mod_irc/mod_irc_odbc.erl:425
msgid "ejabberd IRC module"
msgstr "ejabberd IRC module"
#: mod_irc/mod_irc.erl:559 mod_irc/mod_irc_odbc.erl:568
msgid "You need an x:data capable client to configure mod_irc settings"
msgstr "Χρειάζεστε ένα x:data ικανό πελάτη για να ρυθμίσετε το mod_irc"
#: mod_irc/mod_irc.erl:566 mod_irc/mod_irc_odbc.erl:575
msgid "Registration in mod_irc for "
msgstr "Εγγραφή στο mod_irc για "
#: mod_irc/mod_irc.erl:571 mod_irc/mod_irc_odbc.erl:580
msgid ""
"Enter username, encodings, ports and passwords you wish to use for "
"connecting to IRC servers"
msgstr ""
"Εισάγετε το όνομα χρήστη, κωδικοποιήσεις, τις θύρες και τους κωδικούς "
"πρόσβασης που θέλετε να χρησιμοποιήσετε για σύνδεση με IRC διακομιστή"
#: mod_irc/mod_irc.erl:576 mod_irc/mod_irc_odbc.erl:585
msgid "IRC Username"
msgstr "IRC Όνομα χρήστη"
#: mod_irc/mod_irc.erl:586 mod_irc/mod_irc_odbc.erl:595
msgid ""
"If you want to specify different ports, passwords, encodings for IRC "
"servers, fill this list with values in format '{\"irc server\", \"encoding"
"\", port, \"password\"}'. By default this service use \"~s\" encoding, port "
"~p, empty password."
msgstr ""
"Εάν θέλετε να καθορίσετε διαφορετικές θύρες, κωδικούς πρόσβασης, "
"κωδικοποιήσεις για IRC διακομιστές, εισάγετε πληροφορίες στη μορφή '{\"irc "
"διακομιστής\", \"κωδικοποιήσεις\", θύρα, \"κωδικός πρόσβασης\"}'. "
"Προεπιλεγμενα αυτή η υπηρεσία χρησιμοποιεί \"~s\" κωδικοποιήση, θύρα ~p, "
"κενό κωδικό πρόσβασης."
#: mod_irc/mod_irc.erl:598 mod_irc/mod_irc_odbc.erl:607
msgid ""
"Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef."
"net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."
msgstr ""
"Παράδειγμα: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta."
"fef.net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."
#: mod_irc/mod_irc.erl:603 mod_irc/mod_irc_odbc.erl:612
msgid "Connections parameters"
msgstr "Παράμετροι Συνδέσης"
#: mod_irc/mod_irc.erl:728 mod_irc/mod_irc_odbc.erl:757
msgid "Join IRC channel"
msgstr "Είσοδος στο IRC κανάλι"
#: mod_irc/mod_irc.erl:732 mod_irc/mod_irc_odbc.erl:761
msgid "IRC channel (don't put the first #)"
msgstr "IRC κανάλι (μην τεθεί το πρώτο #)"
#: mod_irc/mod_irc.erl:737 mod_irc/mod_irc_odbc.erl:766
msgid "IRC server"
msgstr "Διακομιστής IRC"
#: mod_irc/mod_irc.erl:770 mod_irc/mod_irc.erl:774
#: mod_irc/mod_irc_odbc.erl:799 mod_irc/mod_irc_odbc.erl:803
msgid "Join the IRC channel here."
msgstr "Είσοδος στο κανάλι IRC εδώ."
#: mod_irc/mod_irc.erl:778 mod_irc/mod_irc_odbc.erl:807
msgid "Join the IRC channel in this Jabber ID: ~s"
msgstr "Είσοδος στο κανάλι IRC αυτής της Jabber Ταυτότητας: ~s"
#: mod_irc/mod_irc.erl:863 mod_irc/mod_irc_odbc.erl:904
msgid "IRC settings"
msgstr "IRC Ρυθμίσεις"
#: mod_irc/mod_irc.erl:868 mod_irc/mod_irc_odbc.erl:909
msgid ""
"Enter username and encodings you wish to use for connecting to IRC servers. "
"Press 'Next' to get more fields to fill in. Press 'Complete' to save "
"settings."
msgstr ""
"Πληκτρολογήστε το όνομα χρήστη και κωδικοποιήσεις που θέλετε να "
"χρησιμοποιήσετε για τη σύνδεση με διακομιστές IRC. Πατήστε 'Next' για να "
"πάρετε περισσότερα πεδία να συμπληρώσετε. Πατήστε 'Complete' για να "
"αποθηκεύσετε ρυθμίσεις."
#: mod_irc/mod_irc.erl:874 mod_irc/mod_irc_odbc.erl:915
msgid "IRC username"
msgstr "IRC όνομα χρήστη"
#: mod_irc/mod_irc.erl:923 mod_irc/mod_irc_odbc.erl:964
msgid "Password ~b"
msgstr "Κωδικός πρόσβασης ~b"
#: mod_irc/mod_irc.erl:928 mod_irc/mod_irc_odbc.erl:969
msgid "Port ~b"
msgstr "Θύρα ~b"
#: mod_irc/mod_irc.erl:933 mod_irc/mod_irc_odbc.erl:974
msgid "Encoding for server ~b"
msgstr "Κωδικοποίηση για διακομιστή ~b"
#: mod_irc/mod_irc.erl:942 mod_irc/mod_irc_odbc.erl:983
msgid "Server ~b"
msgstr "Διακομιστής ~b"
#: mod_muc/mod_muc.erl:449 mod_muc/mod_muc_odbc.erl:456
msgid "Only service administrators are allowed to send service messages"
msgstr ""
"Μόνο οι διαχειριστές των υπηρεσιών επιτρέπεται να στείλουν υπηρεσιακά "
"μηνύματα"
#: mod_muc/mod_muc.erl:493 mod_muc/mod_muc_odbc.erl:500
msgid "Room creation is denied by service policy"
msgstr "Άρνηση δημιουργίας αίθουσας , λόγω τακτικής παροχής υπηρεσιών"
#: mod_muc/mod_muc.erl:500 mod_muc/mod_muc_odbc.erl:507
msgid "Conference room does not exist"
msgstr "Αίθουσα σύνεδριασης δεν υπάρχει"
#: mod_muc/mod_muc.erl:582 mod_muc/mod_muc_odbc.erl:595
msgid "Chatrooms"
msgstr "Αίθουσες σύνεδριασης"
#: mod_muc/mod_muc.erl:712 mod_muc/mod_muc_odbc.erl:729
msgid "You need a client that supports x:data to register the nickname"
msgstr "Χρειάζεστε ένα x:data ικανό πελάτη για εγγραφή με ψευδώνυμο"
#: mod_muc/mod_muc.erl:718 mod_muc/mod_muc_odbc.erl:735
msgid "Nickname Registration at "
msgstr "Εγγραφή με Ψευδώνυμο στο "
#: mod_muc/mod_muc.erl:722 mod_muc/mod_muc_odbc.erl:739
msgid "Enter nickname you want to register"
msgstr "Πληκτρολογήστε το ψευδώνυμο που θέλετε να εγγραφείτε"
#: mod_muc/mod_muc.erl:723 mod_muc/mod_muc_odbc.erl:740
#: mod_muc/mod_muc_room.erl:3810 mod_roster.erl:944 mod_roster_odbc.erl:1061
#: mod_vcard.erl:364 mod_vcard.erl:477 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:453
msgid "Nickname"
msgstr "Ψευδώνυμο"
#: mod_muc/mod_muc.erl:762 mod_muc/mod_muc_odbc.erl:784
#: mod_muc/mod_muc_room.erl:1064 mod_muc/mod_muc_room.erl:1787
msgid "That nickname is registered by another person"
msgstr "Αυτό το ψευδώνυμο είναι καταχωρημένο από άλλο πρόσωπο"
#: mod_muc/mod_muc.erl:788 mod_muc/mod_muc_odbc.erl:811
msgid "You must fill in field \"Nickname\" in the form"
msgstr "Θα πρέπει να συμπληρώσετε το πεδίο \"Ψευδώνυμο\" στη φόρμα"
#: mod_muc/mod_muc.erl:808 mod_muc/mod_muc_odbc.erl:831
msgid "ejabberd MUC module"
msgstr "ejabberd MUC module"
#: mod_muc/mod_muc_log.erl:374 mod_muc/mod_muc_log.erl:381
msgid "Chatroom configuration modified"
msgstr "Διαμόρφωση Αίθουσaς σύνεδριασης τροποποιηθηκε"
#: mod_muc/mod_muc_log.erl:384
msgid "joins the room"
msgstr "συνδέετε στην αίθουσα"
#: mod_muc/mod_muc_log.erl:387 mod_muc/mod_muc_log.erl:390
msgid "leaves the room"
msgstr "εγκαταλείπει την αίθουσα"
#: mod_muc/mod_muc_log.erl:393 mod_muc/mod_muc_log.erl:396
msgid "has been banned"
msgstr "έχει απαγορευθεί"
#: mod_muc/mod_muc_log.erl:399 mod_muc/mod_muc_log.erl:402
msgid "has been kicked"
msgstr "αποβλήθηκε "
#: mod_muc/mod_muc_log.erl:405
msgid "has been kicked because of an affiliation change"
msgstr "Έχει αποβληθεί λόγω αλλαγής υπαγωγής"
#: mod_muc/mod_muc_log.erl:408
msgid "has been kicked because the room has been changed to members-only"
msgstr "αποβλήθηκε επειδή η αίθουσα αλλάξε γιά μέλη μόνο"
#: mod_muc/mod_muc_log.erl:411
msgid "has been kicked because of a system shutdown"
msgstr "αποβλήθηκε λόγω τερματισμού συστήματος"
#: mod_muc/mod_muc_log.erl:414
msgid "is now known as"
msgstr "είναι τώρα γνωστή ως"
#: mod_muc/mod_muc_log.erl:417 mod_muc/mod_muc_log.erl:688
#: mod_muc/mod_muc_room.erl:2393
msgid " has set the subject to: "
msgstr " έχει θέσει το θέμα σε: "
#: mod_muc/mod_muc_log.erl:452
msgid "Chatroom is created"
msgstr "Η αίθουσα σύνεδριασης δημιουργήθηκε"
#: mod_muc/mod_muc_log.erl:453
msgid "Chatroom is destroyed"
msgstr "Η αίθουσα σύνεδριασης διαγράφηκε"
#: mod_muc/mod_muc_log.erl:454
msgid "Chatroom is started"
msgstr "Η αίθουσα σύνεδριασης έχει ξεκινήσει"
#: mod_muc/mod_muc_log.erl:455
msgid "Chatroom is stopped"
msgstr "Η αίθουσα σύνεδριασης έχει σταματήσει"
#: mod_muc/mod_muc_log.erl:459
msgid "Monday"
msgstr "Δευτέρα"
#: mod_muc/mod_muc_log.erl:460
msgid "Tuesday"
msgstr "Τρίτη"
#: mod_muc/mod_muc_log.erl:461
msgid "Wednesday"
msgstr "Τετάρτη"
#: mod_muc/mod_muc_log.erl:462
msgid "Thursday"
msgstr "Πέμπτη"
#: mod_muc/mod_muc_log.erl:463
msgid "Friday"
msgstr "Παρασκευή"
#: mod_muc/mod_muc_log.erl:464
msgid "Saturday"
msgstr "Σάββατο"
#: mod_muc/mod_muc_log.erl:465
msgid "Sunday"
msgstr "Κυριακή"
#: mod_muc/mod_muc_log.erl:469
msgid "January"
msgstr "Ιανουάριος"
#: mod_muc/mod_muc_log.erl:470
msgid "February"
msgstr "Φεβρουάριος"
#: mod_muc/mod_muc_log.erl:471
msgid "March"
msgstr "Μάρτιος"
#: mod_muc/mod_muc_log.erl:472
msgid "April"
msgstr "Απρίλιος"
#: mod_muc/mod_muc_log.erl:473
msgid "May"
msgstr "Μάιος"
#: mod_muc/mod_muc_log.erl:474
msgid "June"
msgstr "Ιούνιος"
#: mod_muc/mod_muc_log.erl:475
msgid "July"
msgstr "Ιούλιος"
#: mod_muc/mod_muc_log.erl:476
msgid "August"
msgstr "Αύγουστος"
#: mod_muc/mod_muc_log.erl:477
msgid "September"
msgstr "Σεπτέμβριος"
#: mod_muc/mod_muc_log.erl:478
msgid "October"
msgstr "Οκτώβριος"
#: mod_muc/mod_muc_log.erl:479
msgid "November"
msgstr "Νοέμβριος"
#: mod_muc/mod_muc_log.erl:480
msgid "December"
msgstr "Δεκέμβριος"
#: mod_muc/mod_muc_log.erl:750
msgid "Room Configuration"
msgstr "Διαμόρφωση Αίθουσας σύνεδριασης"
#: mod_muc/mod_muc_log.erl:759
msgid "Room Occupants"
msgstr "Συμετεχόντες Αίθουσας σύνεδριασης"
#: mod_muc/mod_muc_room.erl:174
msgid "Traffic rate limit is exceeded"
msgstr "Υπέρφορτωση"
#: mod_muc/mod_muc_room.erl:246
msgid ""
"This participant is kicked from the room because he sent an error message"
msgstr ""
"Αυτός ο συμμετέχων αποβλήθηκε από την αίθουσα, επειδή έστειλε ένα μήνυμα "
"σφάλματος"
#: mod_muc/mod_muc_room.erl:255
msgid "It is not allowed to send private messages to the conference"
msgstr "Δεν επιτρέπεται να στείλει προσωπικά μηνύματα για τη διάσκεψη"
#: mod_muc/mod_muc_room.erl:332
msgid "Please, wait for a while before sending new voice request"
msgstr "Παρακαλώ, περιμένετε για λίγο πριν την αποστολή νέου αιτήματος φωνής"
#: mod_muc/mod_muc_room.erl:347
msgid "Voice requests are disabled in this conference"
msgstr "Τα αιτήματα φωνής είναι απενεργοποιημένα, σε αυτό το συνέδριο"
#: mod_muc/mod_muc_room.erl:364
msgid "Failed to extract JID from your voice request approval"
msgstr "Απέτυχε η εξαγωγή JID από την έγκριση του αιτήματος φωνής σας"
#: mod_muc/mod_muc_room.erl:393
msgid "Only moderators can approve voice requests"
msgstr "Μόνο οι συντονιστές μπορούν να εγκρίνουν τις αιτήσεις φωνής"
#: mod_muc/mod_muc_room.erl:408
msgid "Improper message type"
msgstr "Ακατάλληλο είδος μηνύματος"
#: mod_muc/mod_muc_room.erl:518
msgid ""
"This participant is kicked from the room because he sent an error message to "
"another participant"
msgstr ""
"Αυτός ο συμμετέχων αποβλήθηκε από την αίθουσα, επειδή έστειλε ένα μήνυμα "
"σφάλματος σε άλλον συμμετέχων"
#: mod_muc/mod_muc_room.erl:531
msgid "It is not allowed to send private messages of type \"groupchat\""
msgstr "Δεν επιτρέπεται να στείλει προσωπικά μηνύματα του τύπου \"groupchat\""
#: mod_muc/mod_muc_room.erl:543 mod_muc/mod_muc_room.erl:611
msgid "Recipient is not in the conference room"
msgstr "Παραλήπτης δεν είναι στην αίθουσα συνεδριάσεων"
#: mod_muc/mod_muc_room.erl:564 mod_muc/mod_muc_room.erl:585
msgid "It is not allowed to send private messages"
msgstr "Δεν επιτρέπεται η αποστολή προσωπικών μηνυμάτων"
#: mod_muc/mod_muc_room.erl:576 mod_muc/mod_muc_room.erl:956
#: mod_muc/mod_muc_room.erl:4040
msgid "Only occupants are allowed to send messages to the conference"
msgstr "Μόνο οι συμμετέχωντες μπορούν να στέλνουν μηνύματα στο συνέδριο"
#: mod_muc/mod_muc_room.erl:634
msgid "Only occupants are allowed to send queries to the conference"
msgstr "Μόνο οι συμετεχόντες μπορούν να στείλουν ερωτήματα στη διάσκεψη"
#: mod_muc/mod_muc_room.erl:646
msgid "Queries to the conference members are not allowed in this room"
msgstr ""
"Ερωτήματα πρώς τα μέλη της διασκέψεως δεν επιτρέπονται σε αυτήν την αίθουσα"
#: mod_muc/mod_muc_room.erl:932
msgid ""
"Only moderators and participants are allowed to change the subject in this "
"room"
msgstr ""
"Μόνο οι συντονιστές και οι συμμετέχοντες μπορούν να αλλάξουν το θέμα αυτής "
"της αίθουσας"
#: mod_muc/mod_muc_room.erl:937
msgid "Only moderators are allowed to change the subject in this room"
msgstr "Μόνο οι συντονιστές μπορούν να αλλάξουν το θέμα αυτής της αίθουσας"
#: mod_muc/mod_muc_room.erl:947
msgid "Visitors are not allowed to send messages to all occupants"
msgstr ""
"Οι επισκέπτες δεν επιτρέπεται να στείλουν μηνύματα σε όλους τους "
"συμμετέχωντες"
#: mod_muc/mod_muc_room.erl:1021
msgid ""
"This participant is kicked from the room because he sent an error presence"
msgstr ""
"Αυτός ο συμμετέχων αποβλήθηκε από την αίθουσα, επειδή έστειλε σφάλμα "
"παρουσίας "
#: mod_muc/mod_muc_room.erl:1040
msgid "Visitors are not allowed to change their nicknames in this room"
msgstr ""
"Οι επισκέπτες δεν επιτρέπεται να αλλάξουν τα ψευδώνυμα τους σε αυτή την "
"αίθουσα"
#: mod_muc/mod_muc_room.erl:1053 mod_muc/mod_muc_room.erl:1779
msgid "That nickname is already in use by another occupant"
msgstr "Αυτό το ψευδώνυμο είναι ήδη σε χρήση από άλλον συμμετέχων"
#: mod_muc/mod_muc_room.erl:1768
msgid "You have been banned from this room"
msgstr "Σας έχει απαγορευθεί η είσοδος σε αυτή την αίθουσα"
#: mod_muc/mod_muc_room.erl:1771
msgid "Membership is required to enter this room"
msgstr "Απαιτείται αίτηση συμετοχής για είσοδο σε αυτή την αίθουσα"
#: mod_muc/mod_muc_room.erl:1807
msgid "This room is not anonymous"
msgstr "Η αίθουσα αυτή δεν είναι ανώνυμη"
#: mod_muc/mod_muc_room.erl:1833
msgid "A password is required to enter this room"
msgstr "Απαιτείται κωδικός πρόσβασης για είσοδο σε αυτή την αίθουσα"
#: mod_muc/mod_muc_room.erl:1855 mod_register.erl:246
msgid "Too many CAPTCHA requests"
msgstr "Πάρα πολλά αιτήματα CAPTCHA"
#: mod_muc/mod_muc_room.erl:1864 mod_register.erl:251
msgid "Unable to generate a CAPTCHA"
msgstr "Αδήνατο να δημιουργηθεί CAPTCHA"
#: mod_muc/mod_muc_room.erl:1874
msgid "Incorrect password"
msgstr "Εσφαλμένος κωδικός πρόσβασης"
#: mod_muc/mod_muc_room.erl:2448
msgid "Administrator privileges required"
msgstr "Aπαιτούνται προνόμια διαχειριστή"
#: mod_muc/mod_muc_room.erl:2463
msgid "Moderator privileges required"
msgstr "Aπαιτούνται προνόμια συντονιστή"
#: mod_muc/mod_muc_room.erl:2619
msgid "Jabber ID ~s is invalid"
msgstr "Η Jabber Ταυτότητα ~s είναι άκυρη"
#: mod_muc/mod_muc_room.erl:2633
msgid "Nickname ~s does not exist in the room"
msgstr "Ψευδώνυμο ~s δεν υπάρχει σε αυτή την αίθουσα"
#: mod_muc/mod_muc_room.erl:2659 mod_muc/mod_muc_room.erl:3049
msgid "Invalid affiliation: ~s"
msgstr "Άκυρη υπαγωγή: ~s"
#: mod_muc/mod_muc_room.erl:2713
msgid "Invalid role: ~s"
msgstr "Άκυρος ρόλο: ~s"
#: mod_muc/mod_muc_room.erl:3026 mod_muc/mod_muc_room.erl:3062
msgid "Owner privileges required"
msgstr "Aπαιτούνται προνόμια ιδιοκτήτη"
#: mod_muc/mod_muc_room.erl:3195
msgid "Configuration of room ~s"
msgstr "Διαμόρφωση Αίθουσας σύνεδριασης ~s"
#: mod_muc/mod_muc_room.erl:3200
msgid "Room title"
msgstr "Τίτλος Αίθουσας "
#: mod_muc/mod_muc_room.erl:3203 mod_muc/mod_muc_room.erl:3692
msgid "Room description"
msgstr "Περιγραφή Αίθουσας"
#: mod_muc/mod_muc_room.erl:3210
msgid "Make room persistent"
msgstr "Κάντε αίθουσα μόνιμη"
#: mod_muc/mod_muc_room.erl:3215
msgid "Make room public searchable"
msgstr "Κάντε την δημόσια αναζήτηση δυνατή για αυτή την αίθουσα"
#: mod_muc/mod_muc_room.erl:3218
msgid "Make participants list public"
msgstr "Κάντε κοινό τον κατάλογο συμμετεχόντων"
#: mod_muc/mod_muc_room.erl:3221
msgid "Make room password protected"
msgstr "Κάντε την αίθουσα προστατεύομενη με κωδικό πρόσβασης"
#: mod_muc/mod_muc_room.erl:3232
msgid "Maximum Number of Occupants"
msgstr "Μέγιστος αριθμός συμετεχόντων"
#: mod_muc/mod_muc_room.erl:3239
msgid "No limit"
msgstr "Χωρίς όριο"
#: mod_muc/mod_muc_room.erl:3250
msgid "Present real Jabber IDs to"
msgstr "Παρούσιαση πραγματικών ταυτοτήτων Jabber σε"
#: mod_muc/mod_muc_room.erl:3258 mod_muc/mod_muc_room.erl:3292
msgid "moderators only"
msgstr "συντονιστές μόνο"
#: mod_muc/mod_muc_room.erl:3260 mod_muc/mod_muc_room.erl:3294
msgid "anyone"
msgstr "οποιοσδήποτε"
#: mod_muc/mod_muc_room.erl:3262
msgid "Make room members-only"
msgstr "Κάντε την αίθουσα μόνο για μέλη"
#: mod_muc/mod_muc_room.erl:3265
msgid "Make room moderated"
msgstr "Κάντε την αίθουσα εποπτεύονομενη"
#: mod_muc/mod_muc_room.erl:3268
msgid "Default users as participants"
msgstr "Προεπιλογη χρήστων ως συμμετέχοντες"
#: mod_muc/mod_muc_room.erl:3271
msgid "Allow users to change the subject"
msgstr "Επιτρέψετε στους χρήστες να αλλάζουν το θέμα"
#: mod_muc/mod_muc_room.erl:3274
msgid "Allow users to send private messages"
msgstr "Επιτρέψετε στους χρήστες να αποστέλλουν ιδιωτικά μηνύματα"
#: mod_muc/mod_muc_room.erl:3279
msgid "Allow visitors to send private messages to"
msgstr "Επιτρέψετε στους χρήστες να αποστέλλουν ιδιωτικά μηνύματα σε"
#: mod_muc/mod_muc_room.erl:3290
msgid "nobody"
msgstr "κανείς"
#: mod_muc/mod_muc_room.erl:3296
msgid "Allow users to query other users"
msgstr "Επιτρέπστε στους χρήστες να ερωτούν άλλους χρήστες"
#: mod_muc/mod_muc_room.erl:3299
msgid "Allow users to send invites"
msgstr "Επιτρέψετε στους χρήστες να αποστέλλουν προσκλήσεις"
#: mod_muc/mod_muc_room.erl:3302
msgid "Allow visitors to send status text in presence updates"
msgstr ""
"Επιτρέψτε στους επισκέπτες να αποστέλλουν κατάσταση στις ενημερώσεις "
"παρουσίας"
#: mod_muc/mod_muc_room.erl:3305
msgid "Allow visitors to change nickname"
msgstr "Επιτρέψετε στους επισκέπτες να αλλάζου ψευδώνυμο"
#: mod_muc/mod_muc_room.erl:3308
msgid "Allow visitors to send voice requests"
msgstr "Επιτρέψτε στους επισκέπτες να στέλνουν αιτήματα φωνής"
#: mod_muc/mod_muc_room.erl:3311
msgid "Minimum interval between voice requests (in seconds)"
msgstr "Ελάχιστο χρονικό διάστημα μεταξύ αιτημάτων φωνής (σε δευτερόλεπτα)"
#: mod_muc/mod_muc_room.erl:3317
msgid "Make room CAPTCHA protected"
msgstr "Κάντε την αίθουσα CAPTCHA προστατεύονομενη"
#: mod_muc/mod_muc_room.erl:3322
msgid "Exclude Jabber IDs from CAPTCHA challenge"
msgstr "Εξαίρεση από τις ταυτότητες Jabber, ή CAPTCHA πρόκληση"
#: mod_muc/mod_muc_room.erl:3329
msgid "Enable logging"
msgstr "Ενεργοποίηση καταγραφής"
#: mod_muc/mod_muc_room.erl:3337
msgid "You need an x:data capable client to configure room"
msgstr "Χρειάζεστε ένα x:data ικανό πελάτη για να ρυθμίσετε την αίθουσα "
#: mod_muc/mod_muc_room.erl:3694
msgid "Number of occupants"
msgstr "Αριθμός συμετεχόντων"
#: mod_muc/mod_muc_room.erl:3750
msgid "private, "
msgstr "ιδιωτικό,"
#: mod_muc/mod_muc_room.erl:3799
msgid "Voice request"
msgstr "Αίτημα φωνής"
#: mod_muc/mod_muc_room.erl:3803
msgid "Either approve or decline the voice request."
msgstr "Είτε εγκρίνετε ή απορρίψτε το αίτημα φωνής."
#: mod_muc/mod_muc_room.erl:3809
msgid "User JID"
msgstr "JID Χρήστη"
#: mod_muc/mod_muc_room.erl:3811
msgid "Grant voice to this person?"
msgstr "Παραχώρηση φωνής σε αυτό το άτομο;"
#: mod_muc/mod_muc_room.erl:3960
msgid "~s invites you to the room ~s"
msgstr "~s σας προσκαλεί στην αίθουσα ~s"
#: mod_muc/mod_muc_room.erl:3969
msgid "the password is"
msgstr "ο κωδικός πρόσβασης είναι"
#: mod_offline.erl:510 mod_offline_odbc.erl:352
msgid ""
"Your contact offline message queue is full. The message has been discarded."
msgstr ""
"Η μνήμη χωρίς σύνδεση μήνυματών είναι πλήρης. Το μήνυμα έχει απορριφθεί."
#: mod_offline.erl:560 mod_offline_odbc.erl:408
msgid "~s's Offline Messages Queue"
msgstr "Η Σειρά Χωρίς Σύνδεση Μηνύματων τού ~s"
#: mod_offline.erl:563 mod_offline_odbc.erl:411 mod_roster.erl:987
#: mod_roster_odbc.erl:1104 mod_shared_roster.erl:901
#: mod_shared_roster.erl:1010 mod_shared_roster_odbc.erl:930
#: mod_shared_roster_odbc.erl:1039 web/ejabberd_web_admin.erl:833
#: web/ejabberd_web_admin.erl:874 web/ejabberd_web_admin.erl:942
#: web/ejabberd_web_admin.erl:978 web/ejabberd_web_admin.erl:1019
#: web/ejabberd_web_admin.erl:1508 web/ejabberd_web_admin.erl:1760
#: web/ejabberd_web_admin.erl:1931 web/ejabberd_web_admin.erl:1963
#: web/ejabberd_web_admin.erl:2031 web/ejabberd_web_admin.erl:2135
#: web/ejabberd_web_admin.erl:2160 web/ejabberd_web_admin.erl:2248
msgid "Submitted"
msgstr "Υποβλήθηκε"
#: mod_offline.erl:571
msgid "Time"
msgstr "Χρόνος"
#: mod_offline.erl:572
msgid "From"
msgstr "Από"
#: mod_offline.erl:573
msgid "To"
msgstr "Πρώς"
#: mod_offline.erl:574 mod_offline_odbc.erl:419
msgid "Packet"
msgstr "Πακέτο"
#: mod_offline.erl:587 mod_offline_odbc.erl:432 mod_shared_roster.erl:908
#: mod_shared_roster_odbc.erl:937 web/ejabberd_web_admin.erl:882
#: web/ejabberd_web_admin.erl:986
msgid "Delete Selected"
msgstr "Διαγραφή επιλεγμένων"
#: mod_offline.erl:645 mod_offline_odbc.erl:519
msgid "Offline Messages:"
msgstr "Χωρίς Σύνδεση Μηνύματα:"
#: mod_offline.erl:645 mod_offline_odbc.erl:519
msgid "Remove All Offline Messages"
msgstr "Αφαίρεση Όλων των Χωρίς Σύνδεση Μηνύματων"
#: mod_proxy65/mod_proxy65_service.erl:213
msgid "ejabberd SOCKS5 Bytestreams module"
msgstr "ejabberd SOCKS5 Bytestreams module"
#: mod_pubsub/mod_pubsub.erl:1120 mod_pubsub/mod_pubsub_odbc.erl:929
msgid "Publish-Subscribe"
msgstr "Δημοσίευση-Εγγραφή"
#: mod_pubsub/mod_pubsub.erl:1214 mod_pubsub/mod_pubsub_odbc.erl:1025
msgid "ejabberd Publish-Subscribe module"
msgstr "ejabberd module Δημοσίευσης-Εγγραφής"
#: mod_pubsub/mod_pubsub.erl:1497 mod_pubsub/mod_pubsub_odbc.erl:1312
msgid "PubSub subscriber request"
msgstr "Αίτηση συνδρομητή Δημοσίευσης-Εγγραφής"
#: mod_pubsub/mod_pubsub.erl:1499 mod_pubsub/mod_pubsub_odbc.erl:1314
msgid "Choose whether to approve this entity's subscription."
msgstr "Επιλέξτε αν θα εγκρίθεί η εγγραφή αυτής της οντότητας."
#: mod_pubsub/mod_pubsub.erl:1505 mod_pubsub/mod_pubsub_odbc.erl:1320
msgid "Node ID"
msgstr "Ταυτότητα Κόμβου"
#: mod_pubsub/mod_pubsub.erl:1510 mod_pubsub/mod_pubsub_odbc.erl:1325
msgid "Subscriber Address"
msgstr "Διεύθυνση Συνδρομητή"
#: mod_pubsub/mod_pubsub.erl:1516 mod_pubsub/mod_pubsub_odbc.erl:1331
msgid "Allow this Jabber ID to subscribe to this pubsub node?"
msgstr ""
"Επιτρέπετε σε αυτή την Jabber Ταυτότητα να εγγραφεί σε αυτό τον κόμβο "
"Δημοσίευσης-Εγγραφής;"
#: mod_pubsub/mod_pubsub.erl:3474 mod_pubsub/mod_pubsub_odbc.erl:3287
msgid "Deliver payloads with event notifications"
msgstr "Κοινοποιήσεις με την παράδοση φορτίων"
#: mod_pubsub/mod_pubsub.erl:3475 mod_pubsub/mod_pubsub_odbc.erl:3288
msgid "Deliver event notifications"
msgstr "Κοινοποιήσεις παράδοσης"
#: mod_pubsub/mod_pubsub.erl:3476 mod_pubsub/mod_pubsub_odbc.erl:3289
msgid "Notify subscribers when the node configuration changes"
msgstr "Ειδοποιηση στους συνδρομητές όταν αλλάζει η διαμόρφωση κόμβου"
#: mod_pubsub/mod_pubsub.erl:3477 mod_pubsub/mod_pubsub_odbc.erl:3290
msgid "Notify subscribers when the node is deleted"
msgstr "Ειδοποιηση στους συνδρομητές όταν ο κόμβος διαγράφεται"
#: mod_pubsub/mod_pubsub.erl:3478 mod_pubsub/mod_pubsub_odbc.erl:3291
msgid "Notify subscribers when items are removed from the node"
msgstr "Ειδοποιηση στους συνδρομητές όταν αφαίρούντε στοιχεία από τον κόμβο"
#: mod_pubsub/mod_pubsub.erl:3479 mod_pubsub/mod_pubsub_odbc.erl:3292
msgid "Persist items to storage"
msgstr "Μονιμη αποθήκευση στοιχείων"
#: mod_pubsub/mod_pubsub.erl:3480 mod_pubsub/mod_pubsub_odbc.erl:3293
msgid "A friendly name for the node"
msgstr "Ένα φιλικό όνομα για τον κόμβο"
#: mod_pubsub/mod_pubsub.erl:3481 mod_pubsub/mod_pubsub_odbc.erl:3294
msgid "Max # of items to persist"
msgstr "Μέγιστος αριθμός μόνιμων στοιχείων"
#: mod_pubsub/mod_pubsub.erl:3482 mod_pubsub/mod_pubsub_odbc.erl:3295
msgid "Whether to allow subscriptions"
msgstr "Εάν επιτρέποντε συνδρομές"
#: mod_pubsub/mod_pubsub.erl:3483 mod_pubsub/mod_pubsub_odbc.erl:3296
msgid "Specify the access model"
msgstr "Καθορίστε το μοντέλο πρόσβασης"
#: mod_pubsub/mod_pubsub.erl:3486 mod_pubsub/mod_pubsub_odbc.erl:3299
msgid "Roster groups allowed to subscribe"
msgstr "Ομάδες Καταλόγου Επαφών μπορούν να εγγραφούν"
#: mod_pubsub/mod_pubsub.erl:3487 mod_pubsub/mod_pubsub_odbc.erl:3300
msgid "Specify the publisher model"
msgstr "Καθορίστε το μοντέλο εκδότη"
#: mod_pubsub/mod_pubsub.erl:3489 mod_pubsub/mod_pubsub_odbc.erl:3302
msgid "Purge all items when the relevant publisher goes offline"
msgstr "Διαγραφή όλων των στοιχείων όταν ο σχετικός εκδότης αποσυνδέεται"
#: mod_pubsub/mod_pubsub.erl:3490 mod_pubsub/mod_pubsub_odbc.erl:3303
msgid "Specify the event message type"
msgstr "Καθορίστε τον τύπο μηνύματος συμβάντος"
#: mod_pubsub/mod_pubsub.erl:3492 mod_pubsub/mod_pubsub_odbc.erl:3305
msgid "Max payload size in bytes"
msgstr "Μέγιστο μέγεθος φορτίου σε bytes"
#: mod_pubsub/mod_pubsub.erl:3493 mod_pubsub/mod_pubsub_odbc.erl:3306
msgid "When to send the last published item"
msgstr "Πότε να αποσταλθεί το τελευταίο στοιχείο που δημοσιεύθηκε"
#: mod_pubsub/mod_pubsub.erl:3495 mod_pubsub/mod_pubsub_odbc.erl:3308
msgid "Only deliver notifications to available users"
msgstr "Παράδωση κοινοποιήσεων μόνο σε διαθέσιμους χρήστες"
#: mod_pubsub/mod_pubsub.erl:3496 mod_pubsub/mod_pubsub_odbc.erl:3309
msgid "The collections with which a node is affiliated"
msgstr "Οι συλλογές με την οποία είναι ένας κόμβος συνδέεται"
#: mod_register.erl:193
msgid "The CAPTCHA verification has failed"
msgstr "Η επαλήθευση της εικόνας CAPTCHA απέτυχε"
#: mod_register.erl:220
msgid "You need a client that supports x:data and CAPTCHA to register"
msgstr "Χρειάζεστε ένα x:data και CAPTCHA ικανό πελάτη για εγγραφή"
#: mod_register.erl:226 mod_register.erl:265
msgid "Choose a username and password to register with this server"
msgstr ""
"Επιλέξτε ένα όνομα χρήστη και κωδικό πρόσβασης για να εγγραφείτε σε αυτό τον "
"διακομιστή"
#: mod_register.erl:230 mod_vcard.erl:364 mod_vcard_odbc.erl:342
#: web/ejabberd_web_admin.erl:1515 web/ejabberd_web_admin.erl:1572
msgid "User"
msgstr "Χρήστης"
#: mod_register.erl:316 mod_register.erl:361
msgid "The password is too weak"
msgstr "Ο κωδικός πρόσβασης είναι πολύ ασθενές"
#: mod_register.erl:365
msgid "Users are not allowed to register accounts so quickly"
msgstr "Οι χρήστες δεν επιτρέπεται να εγγραφούν λογαριασμούς τόσο γρήγορα"
#: mod_roster.erl:938 mod_roster_odbc.erl:1055 web/ejabberd_web_admin.erl:1701
#: web/ejabberd_web_admin.erl:1886 web/ejabberd_web_admin.erl:1897
#: web/ejabberd_web_admin.erl:2219
msgid "None"
msgstr "Κανένα"
#: mod_roster.erl:945 mod_roster_odbc.erl:1062
msgid "Subscription"
msgstr "Συνδρομή"
#: mod_roster.erl:946 mod_roster_odbc.erl:1063
msgid "Pending"
msgstr "Εκκρεμεί"
#: mod_roster.erl:947 mod_roster_odbc.erl:1064
msgid "Groups"
msgstr "Ομάδες"
#: mod_roster.erl:974 mod_roster_odbc.erl:1091
msgid "Validate"
msgstr "Επαληθεύστε"
#: mod_roster.erl:982 mod_roster_odbc.erl:1099
msgid "Remove"
msgstr "Αφαίρεστε"
#: mod_roster.erl:985 mod_roster_odbc.erl:1102
msgid "Roster of "
msgstr "Καταλόγος Επαφών τού"
#: mod_roster.erl:988 mod_roster_odbc.erl:1105 mod_shared_roster.erl:902
#: mod_shared_roster.erl:1011 mod_shared_roster_odbc.erl:931
#: mod_shared_roster_odbc.erl:1040 web/ejabberd_web_admin.erl:834
#: web/ejabberd_web_admin.erl:875 web/ejabberd_web_admin.erl:943
#: web/ejabberd_web_admin.erl:979 web/ejabberd_web_admin.erl:1020
#: web/ejabberd_web_admin.erl:1509 web/ejabberd_web_admin.erl:1761
#: web/ejabberd_web_admin.erl:1932 web/ejabberd_web_admin.erl:2136
#: web/ejabberd_web_admin.erl:2161
msgid "Bad format"
msgstr "Ακατάλληλη μορφή"
#: mod_roster.erl:995 mod_roster_odbc.erl:1112
msgid "Add Jabber ID"
msgstr "Προσθήκη Jabber Ταυτότητας"
#: mod_roster.erl:1094 mod_roster_odbc.erl:1211
msgid "Roster"
msgstr "Καταλόγος Επαφών"
#: mod_shared_roster.erl:857 mod_shared_roster.erl:899
#: mod_shared_roster.erl:1007 mod_shared_roster_odbc.erl:886
#: mod_shared_roster_odbc.erl:928 mod_shared_roster_odbc.erl:1036
msgid "Shared Roster Groups"
msgstr "Κοινές Ομάδες Καταλόγων Επαφών"
#: mod_shared_roster.erl:895 mod_shared_roster_odbc.erl:924
#: web/ejabberd_web_admin.erl:1365 web/ejabberd_web_admin.erl:2461
msgid "Add New"
msgstr "Προσθήκη νέου"
#: mod_shared_roster.erl:978 mod_shared_roster_odbc.erl:1007
msgid "Name:"
msgstr "Όνομα:"
#: mod_shared_roster.erl:983 mod_shared_roster_odbc.erl:1012
msgid "Description:"
msgstr "Περιγραφή:"
#: mod_shared_roster.erl:991 mod_shared_roster_odbc.erl:1020
msgid "Members:"
msgstr "Μέλη:"
#: mod_shared_roster.erl:999 mod_shared_roster_odbc.erl:1028
msgid "Displayed Groups:"
msgstr "Εμφανίσμενες Ομάδες:"
#: mod_shared_roster.erl:1008 mod_shared_roster_odbc.erl:1037
msgid "Group "
msgstr "Ομάδα"
#: mod_shared_roster.erl:1017 mod_shared_roster_odbc.erl:1046
#: web/ejabberd_web_admin.erl:840 web/ejabberd_web_admin.erl:884
#: web/ejabberd_web_admin.erl:949 web/ejabberd_web_admin.erl:1026
#: web/ejabberd_web_admin.erl:2017
msgid "Submit"
msgstr "Υποβοβολή"
#: mod_vcard.erl:165 mod_vcard_ldap.erl:238 mod_vcard_odbc.erl:129
msgid "Erlang Jabber Server"
msgstr "Erlang Jabber Διακομιστής"
#: mod_vcard.erl:364 mod_vcard.erl:478 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:454
msgid "Birthday"
msgstr "Γενέθλια"
#: mod_vcard.erl:364 mod_vcard.erl:480 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:456
msgid "City"
msgstr "Πόλη"
#: mod_vcard.erl:364 mod_vcard.erl:479 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:455
msgid "Country"
msgstr "Χώρα"
#: mod_vcard.erl:364 mod_vcard.erl:481 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:457
msgid "Email"
msgstr "Email"
#: mod_vcard.erl:364 mod_vcard.erl:476 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:452
msgid "Family Name"
msgstr "Επώνυμο"
#: mod_vcard.erl:364 mod_vcard_odbc.erl:342
msgid ""
"Fill in the form to search for any matching Jabber User (Add * to the end of "
"field to match substring)"
msgstr ""
"Συμπληρώστε τη φόρμα για να αναζητήσετε οποιαδήποτε Jabber χρήστη που "
"ταιριάζει (Προσθέστε * στο τέλος τού πεδίου για να ταιριάξει σε μεγαλύτερες "
"γραμματοσηρές)"
#: mod_vcard.erl:364 mod_vcard.erl:473 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:449
msgid "Full Name"
msgstr "Ονοματεπώνυμο"
#: mod_vcard.erl:364 mod_vcard.erl:475 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:451
msgid "Middle Name"
msgstr "Πατρώνυμο"
#: mod_vcard.erl:364 mod_vcard.erl:474 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:450 web/ejabberd_web_admin.erl:2006
msgid "Name"
msgstr "Όνομα"
#: mod_vcard.erl:364 mod_vcard.erl:482 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:458
msgid "Organization Name"
msgstr "Όνομα Οργανισμού"
#: mod_vcard.erl:364 mod_vcard.erl:483 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:459
msgid "Organization Unit"
msgstr "Μονάδα Οργανισμού"
#: mod_vcard.erl:364 mod_vcard_ldap.erl:462 mod_vcard_odbc.erl:342
msgid "Search users in "
msgstr "Αναζήτηση χρηστών στο"
#: mod_vcard.erl:364 mod_vcard_ldap.erl:462 mod_vcard_odbc.erl:342
msgid "You need an x:data capable client to search"
msgstr "Χρειάζεστε ένα x:data ικανό πελάτη για αναζήτηση"
#: mod_vcard.erl:389 mod_vcard_ldap.erl:487 mod_vcard_odbc.erl:367
msgid "vCard User Search"
msgstr "vCard Αναζήτηση χρηστών"
#: mod_vcard.erl:445 mod_vcard_ldap.erl:541 mod_vcard_odbc.erl:421
msgid "ejabberd vCard module"
msgstr "ejabberd vCard module"
#: mod_vcard.erl:469 mod_vcard_ldap.erl:551 mod_vcard_odbc.erl:445
msgid "Search Results for "
msgstr "Αποτελέσματα αναζήτησης για "
#: mod_vcard_ldap.erl:462
msgid "Fill in fields to search for any matching Jabber User"
msgstr ""
"Συμπληρώστε τα πεδία για να αναζητήσετε οποιαδήποτε ταιριάζοντα Jabber χρήστη"
#: web/ejabberd_web_admin.erl:193 web/ejabberd_web_admin.erl:203
#: web/ejabberd_web_admin.erl:219 web/ejabberd_web_admin.erl:229
msgid "Unauthorized"
msgstr "Χορίς Εξουσιοδότηση"
#: web/ejabberd_web_admin.erl:286 web/ejabberd_web_admin.erl:303
msgid "ejabberd Web Admin"
msgstr "ejabberd Web Admin"
#: web/ejabberd_web_admin.erl:769 web/ejabberd_web_admin.erl:780
msgid "Administration"
msgstr "Διαχείριση"
#: web/ejabberd_web_admin.erl:878 web/ejabberd_web_admin.erl:982
msgid "Raw"
msgstr "Ακατέργαστο"
#: web/ejabberd_web_admin.erl:1017
msgid "~s access rule configuration"
msgstr "~s διαμόρφωση κανόνα πρόσβασης"
#: web/ejabberd_web_admin.erl:1035
msgid "Virtual Hosts"
msgstr "εικονικοί κεντρικοί υπολογιστές"
#: web/ejabberd_web_admin.erl:1043 web/ejabberd_web_admin.erl:1050
msgid "Users"
msgstr "Χρήστες"
#: web/ejabberd_web_admin.erl:1078
msgid "Users Last Activity"
msgstr "Τελευταία Δραστηριότητα Χρήστη"
#: web/ejabberd_web_admin.erl:1080
msgid "Period: "
msgstr "Περίοδος: "
#: web/ejabberd_web_admin.erl:1090
msgid "Last month"
msgstr "Περασμένο μήνα"
#: web/ejabberd_web_admin.erl:1091
msgid "Last year"
msgstr "Πέρυσι"
#: web/ejabberd_web_admin.erl:1092
msgid "All activity"
msgstr "Όλες οι δραστηριότητες"
#: web/ejabberd_web_admin.erl:1094
msgid "Show Ordinary Table"
msgstr "Δείτε Κοινό Πίνακα"
#: web/ejabberd_web_admin.erl:1096
msgid "Show Integral Table"
msgstr "Δείτε Ολοκληρωτικό Πίνακα"
#: web/ejabberd_web_admin.erl:1105 web/ejabberd_web_admin.erl:1939
msgid "Statistics"
msgstr "Στατιστικές"
#: web/ejabberd_web_admin.erl:1117
msgid "Not Found"
msgstr "Δεν Βρέθηκε"
#: web/ejabberd_web_admin.erl:1134
msgid "Node not found"
msgstr "Κόμβος δεν βρέθηκε"
#: web/ejabberd_web_admin.erl:1460
msgid "Host"
msgstr "Κεντρικός Υπολογιστής"
#: web/ejabberd_web_admin.erl:1461
msgid "Registered Users"
msgstr "Εγγεγραμμένοι Χρήστες"
#: web/ejabberd_web_admin.erl:1573
msgid "Offline Messages"
msgstr "Χωρίς Σύνδεση Μηνύματα"
#: web/ejabberd_web_admin.erl:1574 web/ejabberd_web_admin.erl:1767
msgid "Last Activity"
msgstr "Τελευταία Δραστηριότητα"
#: web/ejabberd_web_admin.erl:1659 web/ejabberd_web_admin.erl:1675
msgid "Registered Users:"
msgstr "Εγγεγραμμένοι Χρήστες:"
#: web/ejabberd_web_admin.erl:1661 web/ejabberd_web_admin.erl:1677
#: web/ejabberd_web_admin.erl:2192
msgid "Online Users:"
msgstr "Online Χρήστες:"
#: web/ejabberd_web_admin.erl:1663
msgid "Outgoing s2s Connections:"
msgstr "Εξερχόμενες S2S Συνδέσεις:"
#: web/ejabberd_web_admin.erl:1665
msgid "Outgoing s2s Servers:"
msgstr "Εξερχόμενοι S2S διακομιστές:"
#: web/ejabberd_web_admin.erl:1734 web/mod_register_web.erl:175
#: web/mod_register_web.erl:372 web/mod_register_web.erl:381
#: web/mod_register_web.erl:411
msgid "Change Password"
msgstr "Αλλαγή κωδικού"
#: web/ejabberd_web_admin.erl:1758
msgid "User "
msgstr "Χρήστης"
#: web/ejabberd_web_admin.erl:1765
msgid "Connected Resources:"
msgstr "Συνδεδεμένοι Πόροι:"
#: web/ejabberd_web_admin.erl:1766 web/mod_register_web.erl:227
#: web/mod_register_web.erl:519
msgid "Password:"
msgstr "Κωδικός πρόσβασης:"
#: web/ejabberd_web_admin.erl:1828
msgid "No Data"
msgstr "Κανένα στοιχείο"
#: web/ejabberd_web_admin.erl:1906
msgid "Nodes"
msgstr "Κόμβοι"
#: web/ejabberd_web_admin.erl:1929 web/ejabberd_web_admin.erl:1951
msgid "Node "
msgstr "Κόμβος"
#: web/ejabberd_web_admin.erl:1938
msgid "Listened Ports"
msgstr "Παρακολουθούμενες Θύρες"
#: web/ejabberd_web_admin.erl:1940 web/ejabberd_web_admin.erl:2260
#: web/ejabberd_web_admin.erl:2448
msgid "Update"
msgstr "Ενημέρωση"
#: web/ejabberd_web_admin.erl:1943 web/ejabberd_web_admin.erl:2569
msgid "Restart"
msgstr "Επανεκκίνηση"
#: web/ejabberd_web_admin.erl:1945 web/ejabberd_web_admin.erl:2571
msgid "Stop"
msgstr "Σταμάτημα"
#: web/ejabberd_web_admin.erl:1959
msgid "RPC Call Error"
msgstr "Σφάλμα RPC Κλήσης"
#: web/ejabberd_web_admin.erl:2000
msgid "Database Tables at "
msgstr "Πίνακες βάσης δεδομένων στο "
#: web/ejabberd_web_admin.erl:2007
msgid "Storage Type"
msgstr "Τύπος Αποθήκευσης"
#: web/ejabberd_web_admin.erl:2008
msgid "Elements"
msgstr "Στοιχεία"
#: web/ejabberd_web_admin.erl:2009
msgid "Memory"
msgstr "Μνήμη"
#: web/ejabberd_web_admin.erl:2032 web/ejabberd_web_admin.erl:2137
msgid "Error"
msgstr "Σφάλμα"
#: web/ejabberd_web_admin.erl:2034
msgid "Backup of "
msgstr "Αντιγράφο Ασφαλείας του "
#: web/ejabberd_web_admin.erl:2036
msgid ""
"Please note that these options will only backup the builtin Mnesia database. "
"If you are using the ODBC module, you also need to backup your SQL database "
"separately."
msgstr ""
"Παρακαλώ σημειώστε ότι οι επιλογές αυτές θα αποθήκευσουν Αντιγράφο Ασφαλείας "
"μόνο της ενσωματωμένης βάσης δεδομένων Mnesia. Εάν χρησιμοποιείτε το module "
"ODBC, θα πρέπει επίσης να κάνετε χωριστά Αντιγράφο Ασφαλείας της SQL βάση "
"δεδομένων σας ."
#: web/ejabberd_web_admin.erl:2041
msgid "Store binary backup:"
msgstr "Αποθηκεύση δυαδικού αντιγράφου ασφαλείας:"
#: web/ejabberd_web_admin.erl:2045 web/ejabberd_web_admin.erl:2052
#: web/ejabberd_web_admin.erl:2060 web/ejabberd_web_admin.erl:2067
#: web/ejabberd_web_admin.erl:2074 web/ejabberd_web_admin.erl:2081
#: web/ejabberd_web_admin.erl:2088 web/ejabberd_web_admin.erl:2096
#: web/ejabberd_web_admin.erl:2103 web/ejabberd_web_admin.erl:2110
msgid "OK"
msgstr "Όλλα Καλά"
#: web/ejabberd_web_admin.erl:2048
msgid "Restore binary backup immediately:"
msgstr "Επαναφορά δυαδικού αντιγράφου ασφαλείας αμέσως:"
#: web/ejabberd_web_admin.erl:2056
msgid ""
"Restore binary backup after next ejabberd restart (requires less memory):"
msgstr ""
"Επαναφορά δυαδικού αντιγράφου ασφαλείας μετά την επόμενη επανεκκίνηση του "
"ejabberd (απαιτεί λιγότερη μνήμη):"
#: web/ejabberd_web_admin.erl:2063
msgid "Store plain text backup:"
msgstr "Αποθηκεύση αντιγράφου ασφαλείας σε αρχείο κειμένου:"
#: web/ejabberd_web_admin.erl:2070
msgid "Restore plain text backup immediately:"
msgstr "Επαναφορά αντιγράφου ασφαλείας από αρχείο κειμένου αμέσως:"
#: web/ejabberd_web_admin.erl:2077
msgid "Import users data from a PIEFXIS file (XEP-0227):"
msgstr "Εισαγωγή δεδομένων χρηστών από ένα αρχείο PIEFXIS (XEP-0227):"
#: web/ejabberd_web_admin.erl:2084
msgid "Export data of all users in the server to PIEFXIS files (XEP-0227):"
msgstr ""
"Εξαγωγή δεδομένων όλων των χρηστών του διακομιστή σε PIEFXIS αρχεία "
"(XEP-0227):"
#: web/ejabberd_web_admin.erl:2091
msgid "Export data of users in a host to PIEFXIS files (XEP-0227):"
msgstr ""
"Εξαγωγή δεδομένων των χρηστών κεντρικού υπολογιστή σε PIEFXIS αρχεία "
"(XEP-0227):"
#: web/ejabberd_web_admin.erl:2099
msgid "Import user data from jabberd14 spool file:"
msgstr "Εισαγωγή δεδομένων χρήστη από το αρχείο σειράς jabberd14:"
#: web/ejabberd_web_admin.erl:2106
msgid "Import users data from jabberd14 spool directory:"
msgstr "Εισαγωγή δεδομένων χρηστών από κατάλογο αρχείων σειράς jabberd14:"
#: web/ejabberd_web_admin.erl:2132
msgid "Listened Ports at "
msgstr "Παρακολουθούμενες Θύρες στο "
#: web/ejabberd_web_admin.erl:2157
msgid "Modules at "
msgstr "Modules στο "
#: web/ejabberd_web_admin.erl:2183
msgid "Statistics of ~p"
msgstr "Στατιστικές του ~p"
#: web/ejabberd_web_admin.erl:2186
msgid "Uptime:"
msgstr "Uptime:"
#: web/ejabberd_web_admin.erl:2189
msgid "CPU Time:"
msgstr "Ώρα CPU:"
#: web/ejabberd_web_admin.erl:2195
msgid "Transactions Committed:"
msgstr "Παραδοθείς συναλλαγές:"
#: web/ejabberd_web_admin.erl:2198
msgid "Transactions Aborted:"
msgstr "Αποτυχημένες συναλλαγές:"
#: web/ejabberd_web_admin.erl:2201
msgid "Transactions Restarted:"
msgstr "Επανειλημμένες συναλλαγές:"
#: web/ejabberd_web_admin.erl:2204
msgid "Transactions Logged:"
msgstr "Καταγραμμένες συναλλαγές:"
#: web/ejabberd_web_admin.erl:2246
msgid "Update "
msgstr "Ενημέρωση"
#: web/ejabberd_web_admin.erl:2254
msgid "Update plan"
msgstr "Σχέδιο ενημέρωσης"
#: web/ejabberd_web_admin.erl:2255
msgid "Modified modules"
msgstr "Τροποποιημένα modules"
#: web/ejabberd_web_admin.erl:2256
msgid "Update script"
msgstr "Προγράμα ενημέρωσης"
#: web/ejabberd_web_admin.erl:2257
msgid "Low level update script"
msgstr "Προγράμα ενημέρωσης χαμηλού επίπεδου "
#: web/ejabberd_web_admin.erl:2258
msgid "Script check"
msgstr "Script ελέγχου"
#: web/ejabberd_web_admin.erl:2426
msgid "Port"
msgstr "Θύρα"
#: web/ejabberd_web_admin.erl:2427
msgid "IP"
msgstr "IP"
#: web/ejabberd_web_admin.erl:2428
msgid "Protocol"
msgstr "Πρωτόκολλο"
#: web/ejabberd_web_admin.erl:2429 web/ejabberd_web_admin.erl:2556
msgid "Module"
msgstr "Module"
#: web/ejabberd_web_admin.erl:2430 web/ejabberd_web_admin.erl:2557
msgid "Options"
msgstr "Επιλογές"
#: web/ejabberd_web_admin.erl:2450
msgid "Delete"
msgstr "Διαγραφή"
#: web/ejabberd_web_admin.erl:2579
msgid "Start"
msgstr "Εκκίνηση"
#: web/mod_register_web.erl:104
msgid "Your Jabber account was successfully created."
msgstr "Ο Jabber λογαριασμός σας δημιουργήθηκε με επιτυχία."
#: web/mod_register_web.erl:107
msgid "There was an error creating the account: "
msgstr "Υπήρξε ένα σφάλμα κατά τη δημιουργία του λογαριασμού:"
#: web/mod_register_web.erl:115
msgid "Your Jabber account was successfully deleted."
msgstr "Ο Jabber λογαριασμός σας διαγράφηκε με επιτυχία."
#: web/mod_register_web.erl:118
msgid "There was an error deleting the account: "
msgstr "Υπήρξε ένα σφάλμα κατά τη διαγραφή του λογαριασμού:"
#: web/mod_register_web.erl:128
msgid "The password of your Jabber account was successfully changed."
msgstr "Ο κωδικός πρόσβασης του Jabber λογαριασμού σας έχει αλλάξει επιτυχώς."
#: web/mod_register_web.erl:131
msgid "There was an error changing the password: "
msgstr "Υπήρξε ένα σφάλμα κατά την αλλαγή του κωδικού πρόσβασης:"
#: web/mod_register_web.erl:163 web/mod_register_web.erl:172
msgid "Jabber Account Registration"
msgstr "Εγγραφή λογαριασμού Jabber"
#: web/mod_register_web.erl:174 web/mod_register_web.erl:192
#: web/mod_register_web.erl:201
msgid "Register a Jabber account"
msgstr "Καταχωρήστε έναν λογαριασμό Jabber"
#: web/mod_register_web.erl:176 web/mod_register_web.erl:493
#: web/mod_register_web.erl:502
msgid "Unregister a Jabber account"
msgstr "Καταργήστε την εγγραφή ενός λογαριασμού Jabber"
#: web/mod_register_web.erl:203
msgid ""
"This page allows to create a Jabber account in this Jabber server. Your JID "
"(Jabber IDentifier) will be of the form: username@server. Please read "
"carefully the instructions to fill correctly the fields."
msgstr ""
"Αυτή η σελίδα σας επιτρέπει να δημιουργήσετε ένα λογαριασμό Jabber σε αυτόν "
"το διακομιστή Jabber. JID σας (Jabber Identifier) θα είναι της μορφής: "
"όνομα_χρήστη@διακομιστής_Jabber. Παρακαλώ διαβάστε προσεκτικά τις οδηγίες "
"για να συμπληρώσετε σωστά τα πεδία."
#: web/mod_register_web.erl:212 web/mod_register_web.erl:386
#: web/mod_register_web.erl:509
msgid "Username:"
msgstr "Όνομα χρήστη"
#: web/mod_register_web.erl:217
msgid "This is case insensitive: macbeth is the same that MacBeth and Macbeth."
msgstr ""
"Ανεξαρτήτως με πεζά ή κεφαλαία: 'μιαλεξη' είναι το ίδιο με 'ΜιαΛέξη' και "
"'Μιαλέξη'."
#: web/mod_register_web.erl:218
msgid "Characters not allowed:"
msgstr "Χαρακτήρες δεν επιτρέπονται:"
#: web/mod_register_web.erl:222 web/mod_register_web.erl:391
#: web/mod_register_web.erl:514
msgid "Server:"
msgstr "Διακομιστής:"
#: web/mod_register_web.erl:232
msgid ""
"Don't tell your password to anybody, not even the administrators of the "
"Jabber server."
msgstr ""
"Μην πείτε τον κωδικό πρόσβασής σας σε κανέναν, ακόμη και στους διαχειριστές "
"του διακομιστή Jabber."
#: web/mod_register_web.erl:234
msgid "You can later change your password using a Jabber client."
msgstr ""
"Μπορείτε αργότερα να αλλάξετε τον κωδικό πρόσβασής σας χρησιμοποιώντας έναν "
"πελάτη Jabber."
#: web/mod_register_web.erl:235
msgid ""
"Some Jabber clients can store your password in your computer. Use that "
"feature only if you trust your computer is safe."
msgstr ""
"Μερικοί πελάτες Jabber μπορεί να αποθηκεύσουν τον κωδικό πρόσβασής σας στον "
"υπολογιστή σας. Χρησιμοποιήστε αυτό το χαρακτηριστικό μόνο εάν εμπιστεύεστε "
"την ασφάλεια του υπολογιστή σας."
#: web/mod_register_web.erl:237
msgid ""
"Memorize your password, or write it in a paper placed in a safe place. In "
"Jabber there isn't an automated way to recover your password if you forget "
"it."
msgstr ""
"Απομνημονεύστε τον κωδικό πρόσβασής σας, ή γράψετε τον σε ένα χαρτί που είχε "
"τοποθετηθεί σε ασφαλές μέρος. Στο Jabber δεν υπάρχει αυτοματοποιημένος "
"τρόπος για να ανακτήσετε τον κωδικό σας αν τον ξεχάσετε."
#: web/mod_register_web.erl:242 web/mod_register_web.erl:406
msgid "Password Verification:"
msgstr "Επαλήθευση κωδικού πρόσβασης:"
#: web/mod_register_web.erl:250
msgid "Register"
msgstr "Καταχωρήστε"
#: web/mod_register_web.erl:396
msgid "Old Password:"
msgstr "Παλαιός κωδικός πρόσβασης:"
#: web/mod_register_web.erl:401
msgid "New Password:"
msgstr "Νέος κωδικός πρόσβασης:"
#: web/mod_register_web.erl:504
msgid "This page allows to unregister a Jabber account in this Jabber server."
msgstr ""
"Η σελίδα αυτή δίνει τη δυνατότητα να καταργήσετε την καταχώρηση ενός "
"λογαριασμό Jabber σε αυτόν το διακομιστή Jabber."
#: web/mod_register_web.erl:524
msgid "Unregister"
msgstr "Καταργήση εγγραφής"
#, fuzzy
#~ msgid "Captcha test failed"
#~ msgstr "Το CAPTCHA είναι έγκυρο."
ejabberd-2.1.11/src/msgs/ca.po 0000664 0000000 0000000 00000156317 12240230175 012716 0 ustar # Jan, 2012.
msgid ""
msgstr ""
"Project-Id-Version: 2.1.0-alpha\n"
"POT-Creation-Date: \n"
"PO-Revision-Date: 2012-04-22 00:19+0200\n"
"Last-Translator: JanKusanagi\n"
"Language-Team: American English \n"
"Language: en_US\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Language: Catalan (català)\n"
"X-Additional-Translator: Vicent Alberola Canet\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Lokalize 1.4\n"
#: ejabberd_c2s.erl:424 ejabberd_c2s.erl:727
msgid "Use of STARTTLS required"
msgstr "És obligatori utilitzar STARTTLS"
#: ejabberd_c2s.erl:503
msgid "No resource provided"
msgstr "Recurs no disponible"
#: ejabberd_c2s.erl:1197
msgid "Replaced by new connection"
msgstr "Reemplaçat per una nova connexió"
#: ejabberd_c2s.erl:1885
msgid "Your active privacy list has denied the routing of this stanza."
msgstr ""
"La teva llista de privacitat activa ha denegat l'encaminament d'aquesta "
"stanza."
#: ejabberd_captcha.erl:96 ejabberd_captcha.erl:152 ejabberd_captcha.erl:178
msgid "Enter the text you see"
msgstr "Introdueix el text que veus"
#: ejabberd_captcha.erl:101
msgid "Your messages to ~s are being blocked. To unblock them, visit ~s"
msgstr ""
"Els teus missatges per ~s s'estan bloquejant. Per desbloquejar-los, visita ~s"
#: ejabberd_captcha.erl:134
msgid "If you don't see the CAPTCHA image here, visit the web page."
msgstr "Si no veus la imatge CAPTCHA açí, visita la pàgina web."
#: ejabberd_captcha.erl:146
msgid "CAPTCHA web page"
msgstr "Pàgina web del CAPTCHA"
#: ejabberd_captcha.erl:307
msgid "The CAPTCHA is valid."
msgstr "El CAPTCHA es vàlid."
#: mod_adhoc.erl:95 mod_adhoc.erl:125 mod_adhoc.erl:143 mod_adhoc.erl:161
msgid "Commands"
msgstr "Comandaments"
#: mod_adhoc.erl:149 mod_adhoc.erl:243
msgid "Ping"
msgstr "Ping"
#: mod_adhoc.erl:260
msgid "Pong"
msgstr "Pong"
#: mod_announce.erl:507 mod_announce_odbc.erl:499
msgid "Really delete message of the day?"
msgstr "Segur que vols eliminar el missatge del dia?"
#: mod_announce.erl:515 mod_announce_odbc.erl:507 mod_configure.erl:1083
#: mod_configure.erl:1128
msgid "Subject"
msgstr "Assumpte"
#: mod_announce.erl:520 mod_announce_odbc.erl:512 mod_configure.erl:1088
#: mod_configure.erl:1133
msgid "Message body"
msgstr "Missatge"
#: mod_announce.erl:600 mod_announce_odbc.erl:592
msgid "No body provided for announce message"
msgstr "No hi ha proveedor per al missatge anunci"
#: mod_announce.erl:635 mod_announce_odbc.erl:627
msgid "Announcements"
msgstr "Anuncis"
#: mod_announce.erl:637 mod_announce_odbc.erl:629
msgid "Send announcement to all users"
msgstr "Enviar anunci a tots els usuaris"
#: mod_announce.erl:639 mod_announce_odbc.erl:631
msgid "Send announcement to all users on all hosts"
msgstr "Enviar anunci a tots els usuaris de tots els hosts"
#: mod_announce.erl:641 mod_announce_odbc.erl:633
msgid "Send announcement to all online users"
msgstr "Enviar anunci a tots els usuaris connectats"
#: mod_announce.erl:643 mod_announce_odbc.erl:635 mod_configure.erl:1078
#: mod_configure.erl:1123
msgid "Send announcement to all online users on all hosts"
msgstr "Enviar anunci a tots els usuaris connectats a tots els hosts"
#: mod_announce.erl:645 mod_announce_odbc.erl:637
msgid "Set message of the day and send to online users"
msgstr "Configurar el missatge del dia i enviar a tots els usuaris"
#: mod_announce.erl:647 mod_announce_odbc.erl:639
msgid "Set message of the day on all hosts and send to online users"
msgstr ""
"Escriure missatge del dia en tots els hosts i enviar-ho als usuaris "
"connectats"
#: mod_announce.erl:649 mod_announce_odbc.erl:641
msgid "Update message of the day (don't send)"
msgstr "Actualitzar el missatge del dia (no enviar)"
#: mod_announce.erl:651 mod_announce_odbc.erl:643
msgid "Update message of the day on all hosts (don't send)"
msgstr "Actualitza el missatge del dia en tots els hosts (no enviar)"
#: mod_announce.erl:653 mod_announce_odbc.erl:645
msgid "Delete message of the day"
msgstr "Eliminar el missatge del dia"
#: mod_announce.erl:655 mod_announce_odbc.erl:647
msgid "Delete message of the day on all hosts"
msgstr "Elimina el missatge del dis de tots els hosts"
#: mod_configure.erl:114 mod_configure.erl:274 mod_configure.erl:296
#: mod_configure.erl:498
msgid "Configuration"
msgstr "Configuració"
#: mod_configure.erl:125 mod_configure.erl:576 web/ejabberd_web_admin.erl:1936
msgid "Database"
msgstr "Base de dades"
#: mod_configure.erl:127 mod_configure.erl:595
msgid "Start Modules"
msgstr "Iniciar mòduls"
#: mod_configure.erl:129 mod_configure.erl:596
msgid "Stop Modules"
msgstr "Parar mòduls"
#: mod_configure.erl:131 mod_configure.erl:604 web/ejabberd_web_admin.erl:1937
msgid "Backup"
msgstr "Guardar còpia de seguretat"
#: mod_configure.erl:133 mod_configure.erl:605
msgid "Restore"
msgstr "Restaurar"
#: mod_configure.erl:135 mod_configure.erl:606
msgid "Dump to Text File"
msgstr "Exportar a fitxer de text"
#: mod_configure.erl:137 mod_configure.erl:615
msgid "Import File"
msgstr "Importar fitxer"
#: mod_configure.erl:139 mod_configure.erl:616
msgid "Import Directory"
msgstr "Importar directori"
#: mod_configure.erl:141 mod_configure.erl:581 mod_configure.erl:1057
msgid "Restart Service"
msgstr "Reiniciar el Servei"
#: mod_configure.erl:143 mod_configure.erl:582 mod_configure.erl:1102
msgid "Shut Down Service"
msgstr "Apager el Servei"
#: mod_configure.erl:145 mod_configure.erl:518 mod_configure.erl:1197
#: web/ejabberd_web_admin.erl:1527
msgid "Add User"
msgstr "Afegir usuari"
#: mod_configure.erl:147 mod_configure.erl:519 mod_configure.erl:1219
msgid "Delete User"
msgstr "Eliminar Usuari"
#: mod_configure.erl:149 mod_configure.erl:520 mod_configure.erl:1231
msgid "End User Session"
msgstr "Finalitzar Sesió d'Usuari"
#: mod_configure.erl:151 mod_configure.erl:521 mod_configure.erl:1243
#: mod_configure.erl:1255
msgid "Get User Password"
msgstr "Obtenir Contrasenya d'usuari"
#: mod_configure.erl:153 mod_configure.erl:522
msgid "Change User Password"
msgstr "Canviar Contrasenya d'Usuari"
#: mod_configure.erl:155 mod_configure.erl:523 mod_configure.erl:1272
msgid "Get User Last Login Time"
msgstr "Obtenir la última connexió d'Usuari"
#: mod_configure.erl:157 mod_configure.erl:524 mod_configure.erl:1284
msgid "Get User Statistics"
msgstr "Obtenir Estadístiques d'Usuari"
#: mod_configure.erl:159 mod_configure.erl:525
msgid "Get Number of Registered Users"
msgstr "Obtenir Número d'Usuaris Registrats"
#: mod_configure.erl:161 mod_configure.erl:526
msgid "Get Number of Online Users"
msgstr "Obtenir Número d'Usuaris Connectats"
#: mod_configure.erl:163 mod_configure.erl:509 web/ejabberd_web_admin.erl:831
#: web/ejabberd_web_admin.erl:872
msgid "Access Control Lists"
msgstr "Llista de Control d'Accés"
#: mod_configure.erl:165 mod_configure.erl:510 web/ejabberd_web_admin.erl:940
#: web/ejabberd_web_admin.erl:976
msgid "Access Rules"
msgstr "Regles d'Accés"
#: mod_configure.erl:297 mod_configure.erl:499
msgid "User Management"
msgstr "Gestió d'Usuaris"
#: mod_configure.erl:500 web/ejabberd_web_admin.erl:1058
#: web/ejabberd_web_admin.erl:1462
msgid "Online Users"
msgstr "Usuaris conectats"
#: mod_configure.erl:501
msgid "All Users"
msgstr "Tots els usuaris"
#: mod_configure.erl:502
msgid "Outgoing s2s Connections"
msgstr "Connexions s2s d'eixida"
#: mod_configure.erl:503 web/ejabberd_web_admin.erl:1907
msgid "Running Nodes"
msgstr "Nodes funcionant"
#: mod_configure.erl:504 web/ejabberd_web_admin.erl:1909
msgid "Stopped Nodes"
msgstr "Nodes parats"
#: mod_configure.erl:577 mod_configure.erl:587 web/ejabberd_web_admin.erl:1953
msgid "Modules"
msgstr "Mòduls"
#: mod_configure.erl:578
msgid "Backup Management"
msgstr "Gestió de còpia de seguretat"
#: mod_configure.erl:579
msgid "Import Users From jabberd14 Spool Files"
msgstr "Importar usuaris de jabberd14"
#: mod_configure.erl:699
msgid "To ~s"
msgstr "A ~s"
#: mod_configure.erl:717
msgid "From ~s"
msgstr "De ~s"
#: mod_configure.erl:913
msgid "Database Tables Configuration at "
msgstr "Configuració de la base de dades en "
#: mod_configure.erl:918
msgid "Choose storage type of tables"
msgstr "Selecciona el tipus d'almacenament de les taules"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "Disc only copy"
msgstr "Còpia sols en disc"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "RAM and disc copy"
msgstr "Còpia en RAM i disc"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "RAM copy"
msgstr "Còpia en RAM"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "Remote copy"
msgstr "Còpia remota"
#: mod_configure.erl:950
msgid "Stop Modules at "
msgstr "Detindre mòduls en "
#: mod_configure.erl:954
msgid "Choose modules to stop"
msgstr "Selecciona mòduls a detindre"
#: mod_configure.erl:969
msgid "Start Modules at "
msgstr "Iniciar mòduls en "
#: mod_configure.erl:973
msgid "Enter list of {Module, [Options]}"
msgstr "Introdueix llista de {mòdul, [opcions]}"
#: mod_configure.erl:974
msgid "List of modules to start"
msgstr "Llista de mòduls a iniciar"
#: mod_configure.erl:983
msgid "Backup to File at "
msgstr "Desar còpia de seguretat a fitxer en "
#: mod_configure.erl:987 mod_configure.erl:1001
msgid "Enter path to backup file"
msgstr "Introdueix ruta al fitxer de còpia de seguretat"
#: mod_configure.erl:988 mod_configure.erl:1002 mod_configure.erl:1016
#: mod_configure.erl:1030
msgid "Path to File"
msgstr "Ruta al fitxer"
#: mod_configure.erl:997
msgid "Restore Backup from File at "
msgstr "Restaura còpia de seguretat des del fitxer en "
#: mod_configure.erl:1011
msgid "Dump Backup to Text File at "
msgstr "Exporta còpia de seguretat a fitxer de text en "
#: mod_configure.erl:1015
msgid "Enter path to text file"
msgstr "Introdueix ruta al fitxer de text"
#: mod_configure.erl:1025
msgid "Import User from File at "
msgstr "Importa usuari des de fitxer en "
#: mod_configure.erl:1029
msgid "Enter path to jabberd14 spool file"
msgstr "Introdueix ruta al fitxer jabberd14 spool"
#: mod_configure.erl:1039
msgid "Import Users from Dir at "
msgstr "Importar usuaris des del directori en "
#: mod_configure.erl:1043
msgid "Enter path to jabberd14 spool dir"
msgstr "Introdueix la ruta al directori de jabberd14 spools"
#: mod_configure.erl:1044
msgid "Path to Dir"
msgstr "Ruta al directori"
#: mod_configure.erl:1060 mod_configure.erl:1105
msgid "Time delay"
msgstr "Temps de retard"
#: mod_configure.erl:1143
msgid "Access Control List Configuration"
msgstr "Configuració de la Llista de Control d'Accés"
#: mod_configure.erl:1147
msgid "Access control lists"
msgstr "Llistes de Control de Accés"
#: mod_configure.erl:1171
msgid "Access Configuration"
msgstr "Configuració d'accesos"
#: mod_configure.erl:1175
msgid "Access rules"
msgstr "Regles d'accés"
#: mod_configure.erl:1200 mod_configure.erl:1222 mod_configure.erl:1234
#: mod_configure.erl:1246 mod_configure.erl:1258 mod_configure.erl:1275
#: mod_configure.erl:1287 mod_configure.erl:1650 mod_configure.erl:1700
#: mod_configure.erl:1721 mod_roster.erl:943 mod_roster_odbc.erl:1060
#: mod_vcard.erl:472 mod_vcard_ldap.erl:554 mod_vcard_odbc.erl:448
msgid "Jabber ID"
msgstr "ID Jabber"
#: mod_configure.erl:1205 mod_configure.erl:1263 mod_configure.erl:1651
#: mod_configure.erl:1863 mod_muc/mod_muc_room.erl:3224 mod_register.erl:235
#: web/ejabberd_web_admin.erl:1520
msgid "Password"
msgstr "Contrasenya"
#: mod_configure.erl:1210
msgid "Password Verification"
msgstr "Verificació de la Contrasenya"
#: mod_configure.erl:1301
msgid "Number of registered users"
msgstr "Número d'Usuaris Registrats"
#: mod_configure.erl:1315
msgid "Number of online users"
msgstr "Número d'usuaris connectats"
#: mod_configure.erl:1682 web/ejabberd_web_admin.erl:1588
#: web/ejabberd_web_admin.erl:1743
msgid "Never"
msgstr "Mai"
#: mod_configure.erl:1696 web/ejabberd_web_admin.erl:1601
#: web/ejabberd_web_admin.erl:1756
msgid "Online"
msgstr "Connectat"
#: mod_configure.erl:1701
msgid "Last login"
msgstr "Últim login"
#: mod_configure.erl:1722
msgid "Roster size"
msgstr "Tamany de la llista"
#: mod_configure.erl:1723
msgid "IP addresses"
msgstr "Adreça IP"
#: mod_configure.erl:1724
msgid "Resources"
msgstr "Recursos"
#: mod_configure.erl:1850
msgid "Administration of "
msgstr "Administració de "
#: mod_configure.erl:1853
msgid "Action on user"
msgstr "Acció en l'usuari"
#: mod_configure.erl:1857
msgid "Edit Properties"
msgstr "Editar propietats"
#: mod_configure.erl:1860 web/ejabberd_web_admin.erl:1769
msgid "Remove User"
msgstr "Eliminar usuari"
#: mod_irc/mod_irc.erl:201 mod_irc/mod_irc_odbc.erl:196
#: mod_muc/mod_muc.erl:336 mod_muc/mod_muc_odbc.erl:342
msgid "Access denied by service policy"
msgstr "Accés denegat per la política del servei"
#: mod_irc/mod_irc.erl:401 mod_irc/mod_irc_odbc.erl:398
msgid "IRC Transport"
msgstr "Transport a IRC"
#: mod_irc/mod_irc.erl:428 mod_irc/mod_irc_odbc.erl:425
msgid "ejabberd IRC module"
msgstr "mòdul ejabberd IRC"
#: mod_irc/mod_irc.erl:559 mod_irc/mod_irc_odbc.erl:568
msgid "You need an x:data capable client to configure mod_irc settings"
msgstr ""
"Necessites un client amb suport x:data per a configurar les opcions de "
"mod_irc"
#: mod_irc/mod_irc.erl:566 mod_irc/mod_irc_odbc.erl:575
msgid "Registration in mod_irc for "
msgstr "Registre en mod_irc per a"
#: mod_irc/mod_irc.erl:571 mod_irc/mod_irc_odbc.erl:580
msgid ""
"Enter username, encodings, ports and passwords you wish to use for "
"connecting to IRC servers"
msgstr ""
"Introdueix el nom d'usuari, les codificacions de caràcters, els ports i "
"contrasenyes per a utilitzar al connectar als servidors de IRC"
#: mod_irc/mod_irc.erl:576 mod_irc/mod_irc_odbc.erl:585
msgid "IRC Username"
msgstr "Nom d'usuari al IRC"
#: mod_irc/mod_irc.erl:586 mod_irc/mod_irc_odbc.erl:595
msgid ""
"If you want to specify different ports, passwords, encodings for IRC "
"servers, fill this list with values in format '{\"irc server\", \"encoding"
"\", port, \"password\"}'. By default this service use \"~s\" encoding, port "
"~p, empty password."
msgstr ""
"Si vols especificar codificacions de caràcters diferents per a cada servidor "
"IRC emplena aquesta llista amb els valors amb el format '{\"servidor irc\", "
"\"codificació\", port, \"contrasenya\"}'. Aquest servei utilitza per "
"defecte la codificació \"~s\", port ~p, no contrasenya."
#: mod_irc/mod_irc.erl:598 mod_irc/mod_irc_odbc.erl:607
msgid ""
"Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef."
"net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."
msgstr ""
"Exemple: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef."
"net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."
#: mod_irc/mod_irc.erl:603 mod_irc/mod_irc_odbc.erl:612
msgid "Connections parameters"
msgstr "Paràmetres de connexió"
#: mod_irc/mod_irc.erl:728 mod_irc/mod_irc_odbc.erl:757
msgid "Join IRC channel"
msgstr "Entra a canal d'IRC"
#: mod_irc/mod_irc.erl:732 mod_irc/mod_irc_odbc.erl:761
msgid "IRC channel (don't put the first #)"
msgstr "Canal d'IRC (no posis la primera #)"
#: mod_irc/mod_irc.erl:737 mod_irc/mod_irc_odbc.erl:766
msgid "IRC server"
msgstr "Servidor d'IRC"
#: mod_irc/mod_irc.erl:770 mod_irc/mod_irc.erl:774
#: mod_irc/mod_irc_odbc.erl:799 mod_irc/mod_irc_odbc.erl:803
msgid "Join the IRC channel here."
msgstr "Entra al canal d'IRC aquí."
#: mod_irc/mod_irc.erl:778 mod_irc/mod_irc_odbc.erl:807
msgid "Join the IRC channel in this Jabber ID: ~s"
msgstr "Entra al canal d'IRC en aquesta Jabber ID: ~s"
#: mod_irc/mod_irc.erl:863 mod_irc/mod_irc_odbc.erl:904
msgid "IRC settings"
msgstr "Configuració d'IRC."
#: mod_irc/mod_irc.erl:868 mod_irc/mod_irc_odbc.erl:909
msgid ""
"Enter username and encodings you wish to use for connecting to IRC servers. "
"Press 'Next' to get more fields to fill in. Press 'Complete' to save "
"settings."
msgstr ""
"Introdueix el nom d'usuari i les codificacions de caràcters per a utilitzar "
"als servidors de IRC. Apreta \"Seguent\" per veure més caps per omplir. "
"Apreta \"Completar\" per guardar la configuració. "
#: mod_irc/mod_irc.erl:874 mod_irc/mod_irc_odbc.erl:915
msgid "IRC username"
msgstr "Nom d'usuari al IRC"
#: mod_irc/mod_irc.erl:923 mod_irc/mod_irc_odbc.erl:964
msgid "Password ~b"
msgstr "Contrasenya ~b"
#: mod_irc/mod_irc.erl:928 mod_irc/mod_irc_odbc.erl:969
msgid "Port ~b"
msgstr "Port ~b"
#: mod_irc/mod_irc.erl:933 mod_irc/mod_irc_odbc.erl:974
msgid "Encoding for server ~b"
msgstr "Codificació pel servidor ~b"
#: mod_irc/mod_irc.erl:942 mod_irc/mod_irc_odbc.erl:983
msgid "Server ~b"
msgstr "Servidor ~b"
#: mod_muc/mod_muc.erl:449 mod_muc/mod_muc_odbc.erl:456
msgid "Only service administrators are allowed to send service messages"
msgstr ""
"Sols els administradors del servei tenen permís per a enviar missatges de "
"servei"
#: mod_muc/mod_muc.erl:493 mod_muc/mod_muc_odbc.erl:500
msgid "Room creation is denied by service policy"
msgstr "Se t'ha denegat el crear la sala per política del servei"
#: mod_muc/mod_muc.erl:500 mod_muc/mod_muc_odbc.erl:507
msgid "Conference room does not exist"
msgstr "La sala de conferències no existeix"
#: mod_muc/mod_muc.erl:582 mod_muc/mod_muc_odbc.erl:595
msgid "Chatrooms"
msgstr "Sales de xat"
#: mod_muc/mod_muc.erl:712 mod_muc/mod_muc_odbc.erl:729
msgid "You need a client that supports x:data to register the nickname"
msgstr ""
"Necessites un client amb suport x:data per a poder registrar el Nickname"
#: mod_muc/mod_muc.erl:718 mod_muc/mod_muc_odbc.erl:735
msgid "Nickname Registration at "
msgstr "Registre del Nickname en "
#: mod_muc/mod_muc.erl:722 mod_muc/mod_muc_odbc.erl:739
msgid "Enter nickname you want to register"
msgstr "Introdueix el nickname que vols registrar"
#: mod_muc/mod_muc.erl:723 mod_muc/mod_muc_odbc.erl:740
#: mod_muc/mod_muc_room.erl:3810 mod_roster.erl:944 mod_roster_odbc.erl:1061
#: mod_vcard.erl:364 mod_vcard.erl:477 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:453
msgid "Nickname"
msgstr "Nickname"
#: mod_muc/mod_muc.erl:762 mod_muc/mod_muc_odbc.erl:784
#: mod_muc/mod_muc_room.erl:1064 mod_muc/mod_muc_room.erl:1787
msgid "That nickname is registered by another person"
msgstr "El nickname ja està registrat per una altra persona"
#: mod_muc/mod_muc.erl:788 mod_muc/mod_muc_odbc.erl:811
msgid "You must fill in field \"Nickname\" in the form"
msgstr "Deus d'omplir el camp \"Nickname\" al formulari"
#: mod_muc/mod_muc.erl:808 mod_muc/mod_muc_odbc.erl:831
msgid "ejabberd MUC module"
msgstr "mòdul ejabberd MUC"
#: mod_muc/mod_muc_log.erl:374 mod_muc/mod_muc_log.erl:381
msgid "Chatroom configuration modified"
msgstr "Configuració de la sala de xat modificada"
#: mod_muc/mod_muc_log.erl:384
msgid "joins the room"
msgstr "Entrar a la sala"
#: mod_muc/mod_muc_log.erl:387 mod_muc/mod_muc_log.erl:390
msgid "leaves the room"
msgstr "Deixar la sala"
#: mod_muc/mod_muc_log.erl:393 mod_muc/mod_muc_log.erl:396
msgid "has been banned"
msgstr "Has sigut banejat"
#: mod_muc/mod_muc_log.erl:399 mod_muc/mod_muc_log.erl:402
msgid "has been kicked"
msgstr "Has sigut expulsat"
#: mod_muc/mod_muc_log.erl:405
msgid "has been kicked because of an affiliation change"
msgstr "Has sigut expulsat a causa d'un canvi d'afiliació"
#: mod_muc/mod_muc_log.erl:408
msgid "has been kicked because the room has been changed to members-only"
msgstr "Has sigut expulsat perquè la sala ha canviat a sols membres"
#: mod_muc/mod_muc_log.erl:411
msgid "has been kicked because of a system shutdown"
msgstr "Has sigut expulsat perquè el sistema s'ha apagat"
#: mod_muc/mod_muc_log.erl:414
msgid "is now known as"
msgstr "ara es conegut com"
#: mod_muc/mod_muc_log.erl:417 mod_muc/mod_muc_log.erl:688
#: mod_muc/mod_muc_room.erl:2393
msgid " has set the subject to: "
msgstr " ha posat l'assumpte: "
#: mod_muc/mod_muc_log.erl:452
msgid "Chatroom is created"
msgstr "La sala s'ha creat"
#: mod_muc/mod_muc_log.erl:453
msgid "Chatroom is destroyed"
msgstr "La sala s'ha destruït"
#: mod_muc/mod_muc_log.erl:454
msgid "Chatroom is started"
msgstr "La sala s'ha iniciat"
#: mod_muc/mod_muc_log.erl:455
msgid "Chatroom is stopped"
msgstr "La sala s'ha aturat"
#: mod_muc/mod_muc_log.erl:459
msgid "Monday"
msgstr "Dilluns"
#: mod_muc/mod_muc_log.erl:460
msgid "Tuesday"
msgstr "Dimarts"
#: mod_muc/mod_muc_log.erl:461
msgid "Wednesday"
msgstr "Dimecres"
#: mod_muc/mod_muc_log.erl:462
msgid "Thursday"
msgstr "Dijous"
#: mod_muc/mod_muc_log.erl:463
msgid "Friday"
msgstr "Divendres"
#: mod_muc/mod_muc_log.erl:464
msgid "Saturday"
msgstr "Dissabte"
#: mod_muc/mod_muc_log.erl:465
msgid "Sunday"
msgstr "Diumenge"
#: mod_muc/mod_muc_log.erl:469
msgid "January"
msgstr "Gener"
#: mod_muc/mod_muc_log.erl:470
msgid "February"
msgstr "Febrer"
#: mod_muc/mod_muc_log.erl:471
msgid "March"
msgstr "Març"
#: mod_muc/mod_muc_log.erl:472
msgid "April"
msgstr "Abril"
#: mod_muc/mod_muc_log.erl:473
msgid "May"
msgstr "Maig"
#: mod_muc/mod_muc_log.erl:474
msgid "June"
msgstr "Juny"
#: mod_muc/mod_muc_log.erl:475
msgid "July"
msgstr "Juliol"
#: mod_muc/mod_muc_log.erl:476
msgid "August"
msgstr "Agost"
#: mod_muc/mod_muc_log.erl:477
msgid "September"
msgstr "Setembre"
#: mod_muc/mod_muc_log.erl:478
msgid "October"
msgstr "Octubre"
#: mod_muc/mod_muc_log.erl:479
msgid "November"
msgstr "Novembre"
#: mod_muc/mod_muc_log.erl:480
msgid "December"
msgstr "Decembre"
#: mod_muc/mod_muc_log.erl:750
msgid "Room Configuration"
msgstr "Configuració de la sala"
#: mod_muc/mod_muc_log.erl:759
msgid "Room Occupants"
msgstr "Nombre d'ocupants"
#: mod_muc/mod_muc_room.erl:174
msgid "Traffic rate limit is exceeded"
msgstr "El llímit de tràfic ha sigut sobrepassat"
#: mod_muc/mod_muc_room.erl:246
msgid ""
"This participant is kicked from the room because he sent an error message"
msgstr ""
"Aquest participant ha sigut expulsat de la sala perque ha enviat un missatge "
"d'error"
#: mod_muc/mod_muc_room.erl:255
msgid "It is not allowed to send private messages to the conference"
msgstr "No està permès l'enviament de missatges privats a la sala"
#: mod_muc/mod_muc_room.erl:332
msgid "Please, wait for a while before sending new voice request"
msgstr "Si us plau, espera una mica abans d'enviar una nova petició de veu"
#: mod_muc/mod_muc_room.erl:347
msgid "Voice requests are disabled in this conference"
msgstr "Les peticions de veu es troben desactivades en aquesta conferència"
#: mod_muc/mod_muc_room.erl:364
msgid "Failed to extract JID from your voice request approval"
msgstr "No s'ha pogut extraure el JID de la teva aprovació de petició de veu"
#: mod_muc/mod_muc_room.erl:393
msgid "Only moderators can approve voice requests"
msgstr "Només els moderadors poden aprovar les peticions de veu"
#: mod_muc/mod_muc_room.erl:408
msgid "Improper message type"
msgstr "Tipus de missatge incorrecte"
#: mod_muc/mod_muc_room.erl:518
msgid ""
"This participant is kicked from the room because he sent an error message to "
"another participant"
msgstr ""
"Aquest participant ha sigut expulsat de la sala perque ha enviat un missatge "
"erroni a un altre participant"
#: mod_muc/mod_muc_room.erl:531
msgid "It is not allowed to send private messages of type \"groupchat\""
msgstr "No està permés enviar missatges del tipus \"groupchat\""
#: mod_muc/mod_muc_room.erl:543 mod_muc/mod_muc_room.erl:611
msgid "Recipient is not in the conference room"
msgstr "El receptor no està en la sala de conferència"
#: mod_muc/mod_muc_room.erl:564 mod_muc/mod_muc_room.erl:585
msgid "It is not allowed to send private messages"
msgstr "No està permés enviar missatges privats"
#: mod_muc/mod_muc_room.erl:576 mod_muc/mod_muc_room.erl:956
#: mod_muc/mod_muc_room.erl:4040
msgid "Only occupants are allowed to send messages to the conference"
msgstr "Sols els ocupants poden enviar missatges a la sala"
#: mod_muc/mod_muc_room.erl:634
msgid "Only occupants are allowed to send queries to the conference"
msgstr "Sols els ocupants poden enviar sol·licituds a la sala"
#: mod_muc/mod_muc_room.erl:646
msgid "Queries to the conference members are not allowed in this room"
msgstr ""
" En aquesta sala no es permeten sol·licituds als membres de la conferència"
#: mod_muc/mod_muc_room.erl:932
msgid ""
"Only moderators and participants are allowed to change the subject in this "
"room"
msgstr ""
"Només els moderadors i participants poden canviar l'assumpte d'aquesta sala"
#: mod_muc/mod_muc_room.erl:937
msgid "Only moderators are allowed to change the subject in this room"
msgstr "Només els moderadors poden canviar l'assumpte d'aquesta sala"
#: mod_muc/mod_muc_room.erl:947
msgid "Visitors are not allowed to send messages to all occupants"
msgstr "Els visitants no poden enviar missatges a tots els ocupants"
#: mod_muc/mod_muc_room.erl:1021
msgid ""
"This participant is kicked from the room because he sent an error presence"
msgstr ""
"Aquest participant ha sigut expulsat de la sala perque ha enviat un error de "
"presencia"
#: mod_muc/mod_muc_room.erl:1040
msgid "Visitors are not allowed to change their nicknames in this room"
msgstr "Els visitants no tenen permés canviar el seus Nicknames en esta sala"
#: mod_muc/mod_muc_room.erl:1053 mod_muc/mod_muc_room.erl:1779
msgid "That nickname is already in use by another occupant"
msgstr "El Nickname està siguent utilitzat per una altra persona"
#: mod_muc/mod_muc_room.erl:1768
msgid "You have been banned from this room"
msgstr "Has sigut bloquejat en aquesta sala"
#: mod_muc/mod_muc_room.erl:1771
msgid "Membership is required to enter this room"
msgstr "Necessites ser membre d'aquesta sala per a poder entrar"
#: mod_muc/mod_muc_room.erl:1807
msgid "This room is not anonymous"
msgstr "Aquesta sala no és anònima"
#: mod_muc/mod_muc_room.erl:1833
msgid "A password is required to enter this room"
msgstr "Es necessita contrasenya per a entrar en aquesta sala"
#: mod_muc/mod_muc_room.erl:1855 mod_register.erl:246
msgid "Too many CAPTCHA requests"
msgstr "Massa peticions de CAPTCHA"
#: mod_muc/mod_muc_room.erl:1864 mod_register.erl:251
msgid "Unable to generate a CAPTCHA"
msgstr "No s'ha pogut generar un CAPTCHA"
#: mod_muc/mod_muc_room.erl:1874
msgid "Incorrect password"
msgstr "Contrasenya incorrecta"
#: mod_muc/mod_muc_room.erl:2448
msgid "Administrator privileges required"
msgstr "Es necessita tenir privilegis d'administrador"
#: mod_muc/mod_muc_room.erl:2463
msgid "Moderator privileges required"
msgstr "Es necessita tenir privilegis de moderador"
#: mod_muc/mod_muc_room.erl:2619
msgid "Jabber ID ~s is invalid"
msgstr "El Jabber ID ~s no és vàlid"
#: mod_muc/mod_muc_room.erl:2633
msgid "Nickname ~s does not exist in the room"
msgstr "El Nickname ~s no existeix a la sala"
#: mod_muc/mod_muc_room.erl:2659 mod_muc/mod_muc_room.erl:3049
msgid "Invalid affiliation: ~s"
msgstr "Afiliació invàlida: ~s"
#: mod_muc/mod_muc_room.erl:2713
msgid "Invalid role: ~s"
msgstr "Rol invàlid: ~s"
#: mod_muc/mod_muc_room.erl:3026 mod_muc/mod_muc_room.erl:3062
msgid "Owner privileges required"
msgstr "Es requerixen privilegis de propietari de la sala"
#: mod_muc/mod_muc_room.erl:3195
msgid "Configuration of room ~s"
msgstr "Configuració de la sala ~s"
#: mod_muc/mod_muc_room.erl:3200
msgid "Room title"
msgstr "Títol de la sala"
#: mod_muc/mod_muc_room.erl:3203 mod_muc/mod_muc_room.erl:3692
msgid "Room description"
msgstr "Descripció de la sala:"
#: mod_muc/mod_muc_room.erl:3210
msgid "Make room persistent"
msgstr "Crear una sala persistent"
#: mod_muc/mod_muc_room.erl:3215
msgid "Make room public searchable"
msgstr "Crear una sala pública"
#: mod_muc/mod_muc_room.erl:3218
msgid "Make participants list public"
msgstr "Crear una llista de participants pública"
#: mod_muc/mod_muc_room.erl:3221
msgid "Make room password protected"
msgstr "Crear una sala amb contrasenya"
#: mod_muc/mod_muc_room.erl:3232
msgid "Maximum Number of Occupants"
msgstr "Número màxim d'ocupants"
#: mod_muc/mod_muc_room.erl:3239
msgid "No limit"
msgstr "Sense Llímit"
#: mod_muc/mod_muc_room.erl:3250
msgid "Present real Jabber IDs to"
msgstr "Presentar Jabber ID's reals a"
#: mod_muc/mod_muc_room.erl:3258 mod_muc/mod_muc_room.erl:3292
msgid "moderators only"
msgstr "només moderadors"
#: mod_muc/mod_muc_room.erl:3260 mod_muc/mod_muc_room.erl:3294
msgid "anyone"
msgstr "qualsevol"
#: mod_muc/mod_muc_room.erl:3262
msgid "Make room members-only"
msgstr "Crear una sala de \"només membres\""
#: mod_muc/mod_muc_room.erl:3265
msgid "Make room moderated"
msgstr "Crear una sala moderada"
#: mod_muc/mod_muc_room.erl:3268
msgid "Default users as participants"
msgstr "Els usuaris són participants per defecte"
#: mod_muc/mod_muc_room.erl:3271
msgid "Allow users to change the subject"
msgstr "Permetre que els usuaris canviin el tema"
#: mod_muc/mod_muc_room.erl:3274
msgid "Allow users to send private messages"
msgstr "Permetre que els usuaris envien missatges privats"
#: mod_muc/mod_muc_room.erl:3279
msgid "Allow visitors to send private messages to"
msgstr "Permetre als visitants enviar missatges privats a"
#: mod_muc/mod_muc_room.erl:3290
msgid "nobody"
msgstr "ningú"
#: mod_muc/mod_muc_room.erl:3296
msgid "Allow users to query other users"
msgstr "Permetre que els usuaris fagen peticions a altres usuaris"
#: mod_muc/mod_muc_room.erl:3299
msgid "Allow users to send invites"
msgstr "Permetre que els usuaris envien invitacions"
#: mod_muc/mod_muc_room.erl:3302
msgid "Allow visitors to send status text in presence updates"
msgstr ""
"Permetre als visitants enviar text d'estat en les actualitzacions de "
"presència"
#: mod_muc/mod_muc_room.erl:3305
msgid "Allow visitors to change nickname"
msgstr "Permetre als visitants canviar el Nickname"
#: mod_muc/mod_muc_room.erl:3308
msgid "Allow visitors to send voice requests"
msgstr "Permetre als visitants enviar peticions de veu"
#: mod_muc/mod_muc_room.erl:3311
msgid "Minimum interval between voice requests (in seconds)"
msgstr "Interval mínim entre peticions de veu (en segons)"
#: mod_muc/mod_muc_room.erl:3317
msgid "Make room CAPTCHA protected"
msgstr "Crear una sala protegida per CAPTCHA"
#: mod_muc/mod_muc_room.erl:3322
msgid "Exclude Jabber IDs from CAPTCHA challenge"
msgstr "Excloure Jabber IDs de la comprovació CAPTCHA"
#: mod_muc/mod_muc_room.erl:3329
msgid "Enable logging"
msgstr "Habilitar el registre de la conversa"
#: mod_muc/mod_muc_room.erl:3337
msgid "You need an x:data capable client to configure room"
msgstr "Necessites un client amb suport x:data per a configurar la sala"
#: mod_muc/mod_muc_room.erl:3694
msgid "Number of occupants"
msgstr "Número d'ocupants"
#: mod_muc/mod_muc_room.erl:3750
msgid "private, "
msgstr "privat"
#: mod_muc/mod_muc_room.erl:3799
msgid "Voice request"
msgstr "Petició de veu"
#: mod_muc/mod_muc_room.erl:3803
msgid "Either approve or decline the voice request."
msgstr "Aprova o denega la petició de veu"
#: mod_muc/mod_muc_room.erl:3809
msgid "User JID"
msgstr "JID del usuari "
#: mod_muc/mod_muc_room.erl:3811
msgid "Grant voice to this person?"
msgstr "Concedir veu a aquesta persona?"
#: mod_muc/mod_muc_room.erl:3960
msgid "~s invites you to the room ~s"
msgstr "~s et convida a la sala ~s"
#: mod_muc/mod_muc_room.erl:3969
msgid "the password is"
msgstr "la contrasenya és"
#: mod_offline.erl:510 mod_offline_odbc.erl:352
msgid ""
"Your contact offline message queue is full. The message has been discarded."
msgstr "La cua de missatges offline és plena. El missatge ha sigut descartat"
#: mod_offline.erl:560 mod_offline_odbc.erl:408
msgid "~s's Offline Messages Queue"
msgstr "~s's cua de missatges offline"
#: mod_offline.erl:563 mod_offline_odbc.erl:411 mod_roster.erl:987
#: mod_roster_odbc.erl:1104 mod_shared_roster.erl:901
#: mod_shared_roster.erl:1010 mod_shared_roster_odbc.erl:930
#: mod_shared_roster_odbc.erl:1039 web/ejabberd_web_admin.erl:833
#: web/ejabberd_web_admin.erl:874 web/ejabberd_web_admin.erl:942
#: web/ejabberd_web_admin.erl:978 web/ejabberd_web_admin.erl:1019
#: web/ejabberd_web_admin.erl:1508 web/ejabberd_web_admin.erl:1760
#: web/ejabberd_web_admin.erl:1931 web/ejabberd_web_admin.erl:1963
#: web/ejabberd_web_admin.erl:2031 web/ejabberd_web_admin.erl:2135
#: web/ejabberd_web_admin.erl:2160 web/ejabberd_web_admin.erl:2248
msgid "Submitted"
msgstr "Enviat"
#: mod_offline.erl:571
msgid "Time"
msgstr "Data"
#: mod_offline.erl:572
msgid "From"
msgstr "De"
#: mod_offline.erl:573
msgid "To"
msgstr "Per a"
#: mod_offline.erl:574 mod_offline_odbc.erl:419
msgid "Packet"
msgstr "Paquet"
#: mod_offline.erl:587 mod_offline_odbc.erl:432 mod_shared_roster.erl:908
#: mod_shared_roster_odbc.erl:937 web/ejabberd_web_admin.erl:882
#: web/ejabberd_web_admin.erl:986
msgid "Delete Selected"
msgstr "Eliminar els seleccionats"
#: mod_offline.erl:645 mod_offline_odbc.erl:519
msgid "Offline Messages:"
msgstr "Missatges fora de línia:"
#: mod_offline.erl:645 mod_offline_odbc.erl:519
msgid "Remove All Offline Messages"
msgstr "Eliminar tots els missatges offline"
#: mod_proxy65/mod_proxy65_service.erl:213
msgid "ejabberd SOCKS5 Bytestreams module"
msgstr "mòdul ejabberd SOCKS5 Bytestreams"
#: mod_pubsub/mod_pubsub.erl:1120 mod_pubsub/mod_pubsub_odbc.erl:929
msgid "Publish-Subscribe"
msgstr "Publicar-subscriure't"
#: mod_pubsub/mod_pubsub.erl:1214 mod_pubsub/mod_pubsub_odbc.erl:1025
msgid "ejabberd Publish-Subscribe module"
msgstr "Mòdul ejabberd Publicar-Subscriure"
#: mod_pubsub/mod_pubsub.erl:1497 mod_pubsub/mod_pubsub_odbc.erl:1312
msgid "PubSub subscriber request"
msgstr "Petició de subscriptor PubSub"
#: mod_pubsub/mod_pubsub.erl:1499 mod_pubsub/mod_pubsub_odbc.erl:1314
msgid "Choose whether to approve this entity's subscription."
msgstr "Tria si aprova aquesta entitat de subscripció"
#: mod_pubsub/mod_pubsub.erl:1505 mod_pubsub/mod_pubsub_odbc.erl:1320
msgid "Node ID"
msgstr "ID del Node"
#: mod_pubsub/mod_pubsub.erl:1510 mod_pubsub/mod_pubsub_odbc.erl:1325
msgid "Subscriber Address"
msgstr "Adreça del Subscriptor"
#: mod_pubsub/mod_pubsub.erl:1516 mod_pubsub/mod_pubsub_odbc.erl:1331
msgid "Allow this Jabber ID to subscribe to this pubsub node?"
msgstr "Permetre que aquesta Jabber ID es puga subscriure a aquest node pubsub"
#: mod_pubsub/mod_pubsub.erl:3474 mod_pubsub/mod_pubsub_odbc.erl:3287
msgid "Deliver payloads with event notifications"
msgstr "Enviar payloads junt a les notificacions d'events"
#: mod_pubsub/mod_pubsub.erl:3475 mod_pubsub/mod_pubsub_odbc.erl:3288
msgid "Deliver event notifications"
msgstr "Entrega de notificacions d'events"
#: mod_pubsub/mod_pubsub.erl:3476 mod_pubsub/mod_pubsub_odbc.erl:3289
msgid "Notify subscribers when the node configuration changes"
msgstr "Notificar subscriptors quan canvia la configuració del node"
#: mod_pubsub/mod_pubsub.erl:3477 mod_pubsub/mod_pubsub_odbc.erl:3290
msgid "Notify subscribers when the node is deleted"
msgstr "Notificar subscriptors quan el node és eliminat"
#: mod_pubsub/mod_pubsub.erl:3478 mod_pubsub/mod_pubsub_odbc.erl:3291
msgid "Notify subscribers when items are removed from the node"
msgstr "Notificar subscriptors quan els elements són eliminats del node"
#: mod_pubsub/mod_pubsub.erl:3479 mod_pubsub/mod_pubsub_odbc.erl:3292
msgid "Persist items to storage"
msgstr "Persistir elements al guardar"
#: mod_pubsub/mod_pubsub.erl:3480 mod_pubsub/mod_pubsub_odbc.erl:3293
msgid "A friendly name for the node"
msgstr "Un nom per al node"
#: mod_pubsub/mod_pubsub.erl:3481 mod_pubsub/mod_pubsub_odbc.erl:3294
msgid "Max # of items to persist"
msgstr "Màxim # d'elements que persistixen"
#: mod_pubsub/mod_pubsub.erl:3482 mod_pubsub/mod_pubsub_odbc.erl:3295
msgid "Whether to allow subscriptions"
msgstr "Permetre subscripcions"
#: mod_pubsub/mod_pubsub.erl:3483 mod_pubsub/mod_pubsub_odbc.erl:3296
msgid "Specify the access model"
msgstr "Especificar el model d'accés"
#: mod_pubsub/mod_pubsub.erl:3486 mod_pubsub/mod_pubsub_odbc.erl:3299
msgid "Roster groups allowed to subscribe"
msgstr "Llista de grups que tenen permés subscriures"
#: mod_pubsub/mod_pubsub.erl:3487 mod_pubsub/mod_pubsub_odbc.erl:3300
msgid "Specify the publisher model"
msgstr "Especificar el model del publicant"
#: mod_pubsub/mod_pubsub.erl:3489 mod_pubsub/mod_pubsub_odbc.erl:3302
msgid "Purge all items when the relevant publisher goes offline"
msgstr "Eliminar tots els elements quan el publicant relevant es desconnecti"
#: mod_pubsub/mod_pubsub.erl:3490 mod_pubsub/mod_pubsub_odbc.erl:3303
msgid "Specify the event message type"
msgstr "Especifica el tipus de missatge d'event"
#: mod_pubsub/mod_pubsub.erl:3492 mod_pubsub/mod_pubsub_odbc.erl:3305
msgid "Max payload size in bytes"
msgstr "Màxim tamany del payload en bytes"
#: mod_pubsub/mod_pubsub.erl:3493 mod_pubsub/mod_pubsub_odbc.erl:3306
msgid "When to send the last published item"
msgstr "Quan s'ha enviat l'última publicació"
#: mod_pubsub/mod_pubsub.erl:3495 mod_pubsub/mod_pubsub_odbc.erl:3308
msgid "Only deliver notifications to available users"
msgstr "Sols enviar notificacions als usuaris disponibles"
#: mod_pubsub/mod_pubsub.erl:3496 mod_pubsub/mod_pubsub_odbc.erl:3309
msgid "The collections with which a node is affiliated"
msgstr "Les col.leccions amb les que un node està afiliat"
#: mod_register.erl:193
msgid "The CAPTCHA verification has failed"
msgstr "La verificació CAPTCHA ha fallat"
#: mod_register.erl:220
msgid "You need a client that supports x:data and CAPTCHA to register"
msgstr ""
"Necessites un client amb suport x:data i de CAPTCHA para poder registrar-te"
#: mod_register.erl:226 mod_register.erl:265
msgid "Choose a username and password to register with this server"
msgstr "Tria nom d'usuari i contrasenya per a registrar-te en aquest servidor"
#: mod_register.erl:230 mod_vcard.erl:364 mod_vcard_odbc.erl:342
#: web/ejabberd_web_admin.erl:1515 web/ejabberd_web_admin.erl:1572
msgid "User"
msgstr "Usuari"
#: mod_register.erl:316 mod_register.erl:361
msgid "The password is too weak"
msgstr "La contrasenya és massa simple"
#: mod_register.erl:365
msgid "Users are not allowed to register accounts so quickly"
msgstr "Els usuaris no tenen permís per a crear comptes tan depresa"
#: mod_roster.erl:938 mod_roster_odbc.erl:1055 web/ejabberd_web_admin.erl:1701
#: web/ejabberd_web_admin.erl:1886 web/ejabberd_web_admin.erl:1897
#: web/ejabberd_web_admin.erl:2219
msgid "None"
msgstr "Cap"
#: mod_roster.erl:945 mod_roster_odbc.erl:1062
msgid "Subscription"
msgstr "Subscripció"
#: mod_roster.erl:946 mod_roster_odbc.erl:1063
msgid "Pending"
msgstr "Pendent"
#: mod_roster.erl:947 mod_roster_odbc.erl:1064
msgid "Groups"
msgstr "Grups"
#: mod_roster.erl:974 mod_roster_odbc.erl:1091
msgid "Validate"
msgstr "Validar"
#: mod_roster.erl:982 mod_roster_odbc.erl:1099
msgid "Remove"
msgstr "Borrar"
#: mod_roster.erl:985 mod_roster_odbc.erl:1102
msgid "Roster of "
msgstr "Llista de contactes de "
#: mod_roster.erl:988 mod_roster_odbc.erl:1105 mod_shared_roster.erl:902
#: mod_shared_roster.erl:1011 mod_shared_roster_odbc.erl:931
#: mod_shared_roster_odbc.erl:1040 web/ejabberd_web_admin.erl:834
#: web/ejabberd_web_admin.erl:875 web/ejabberd_web_admin.erl:943
#: web/ejabberd_web_admin.erl:979 web/ejabberd_web_admin.erl:1020
#: web/ejabberd_web_admin.erl:1509 web/ejabberd_web_admin.erl:1761
#: web/ejabberd_web_admin.erl:1932 web/ejabberd_web_admin.erl:2136
#: web/ejabberd_web_admin.erl:2161
msgid "Bad format"
msgstr "Format erroni"
#: mod_roster.erl:995 mod_roster_odbc.erl:1112
msgid "Add Jabber ID"
msgstr "Afegir Jabber ID"
#: mod_roster.erl:1094 mod_roster_odbc.erl:1211
msgid "Roster"
msgstr "Llista de contactes"
#: mod_shared_roster.erl:857 mod_shared_roster.erl:899
#: mod_shared_roster.erl:1007 mod_shared_roster_odbc.erl:886
#: mod_shared_roster_odbc.erl:928 mod_shared_roster_odbc.erl:1036
msgid "Shared Roster Groups"
msgstr "Grups de contactes compartits"
#: mod_shared_roster.erl:895 mod_shared_roster_odbc.erl:924
#: web/ejabberd_web_admin.erl:1365 web/ejabberd_web_admin.erl:2461
msgid "Add New"
msgstr "Afegir nou"
#: mod_shared_roster.erl:978 mod_shared_roster_odbc.erl:1007
msgid "Name:"
msgstr "Nom:"
#: mod_shared_roster.erl:983 mod_shared_roster_odbc.erl:1012
msgid "Description:"
msgstr "Descripció:"
#: mod_shared_roster.erl:991 mod_shared_roster_odbc.erl:1020
msgid "Members:"
msgstr "Membre:"
#: mod_shared_roster.erl:999 mod_shared_roster_odbc.erl:1028
msgid "Displayed Groups:"
msgstr "Mostrar grups:"
#: mod_shared_roster.erl:1008 mod_shared_roster_odbc.erl:1037
msgid "Group "
msgstr "Grup "
#: mod_shared_roster.erl:1017 mod_shared_roster_odbc.erl:1046
#: web/ejabberd_web_admin.erl:840 web/ejabberd_web_admin.erl:884
#: web/ejabberd_web_admin.erl:949 web/ejabberd_web_admin.erl:1026
#: web/ejabberd_web_admin.erl:2017
msgid "Submit"
msgstr "Enviar"
#: mod_vcard.erl:165 mod_vcard_ldap.erl:238 mod_vcard_odbc.erl:129
msgid "Erlang Jabber Server"
msgstr "Servidor Erlang Jabber"
#: mod_vcard.erl:364 mod_vcard.erl:478 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:454
msgid "Birthday"
msgstr "Aniversari"
#: mod_vcard.erl:364 mod_vcard.erl:480 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:456
msgid "City"
msgstr "Ciutat"
#: mod_vcard.erl:364 mod_vcard.erl:479 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:455
msgid "Country"
msgstr "Pais"
#: mod_vcard.erl:364 mod_vcard.erl:481 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:457
msgid "Email"
msgstr "Email"
#: mod_vcard.erl:364 mod_vcard.erl:476 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:452
msgid "Family Name"
msgstr "Cognom"
#: mod_vcard.erl:364 mod_vcard_odbc.erl:342
msgid ""
"Fill in the form to search for any matching Jabber User (Add * to the end of "
"field to match substring)"
msgstr ""
"Emplena el formulari per a buscar usuaris Jabber. Afegix * al final d'un "
"camp per a buscar subcadenes."
#: mod_vcard.erl:364 mod_vcard.erl:473 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:449
msgid "Full Name"
msgstr "Nom complet"
#: mod_vcard.erl:364 mod_vcard.erl:475 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:451
msgid "Middle Name"
msgstr "Segon nom"
#: mod_vcard.erl:364 mod_vcard.erl:474 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:450 web/ejabberd_web_admin.erl:2006
msgid "Name"
msgstr "Nom"
#: mod_vcard.erl:364 mod_vcard.erl:482 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:458
msgid "Organization Name"
msgstr "Nom de la organizació"
#: mod_vcard.erl:364 mod_vcard.erl:483 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:459
msgid "Organization Unit"
msgstr "Unitat de la organizació"
#: mod_vcard.erl:364 mod_vcard_ldap.erl:462 mod_vcard_odbc.erl:342
msgid "Search users in "
msgstr "Cerca usuaris en "
#: mod_vcard.erl:364 mod_vcard_ldap.erl:462 mod_vcard_odbc.erl:342
msgid "You need an x:data capable client to search"
msgstr "Necessites un client amb suport x:data per a poder buscar"
#: mod_vcard.erl:389 mod_vcard_ldap.erl:487 mod_vcard_odbc.erl:367
msgid "vCard User Search"
msgstr "Recerca de vCard d'usuari"
#: mod_vcard.erl:445 mod_vcard_ldap.erl:541 mod_vcard_odbc.erl:421
msgid "ejabberd vCard module"
msgstr "Mòdul ejabberd vCard"
#: mod_vcard.erl:469 mod_vcard_ldap.erl:551 mod_vcard_odbc.erl:445
msgid "Search Results for "
msgstr "Resultat de la búsqueda"
#: mod_vcard_ldap.erl:462
msgid "Fill in fields to search for any matching Jabber User"
msgstr "Emplena camps per a buscar usuaris Jabber que concorden"
#: web/ejabberd_web_admin.erl:193 web/ejabberd_web_admin.erl:203
#: web/ejabberd_web_admin.erl:219 web/ejabberd_web_admin.erl:229
msgid "Unauthorized"
msgstr "No autoritzat"
#: web/ejabberd_web_admin.erl:286 web/ejabberd_web_admin.erl:303
msgid "ejabberd Web Admin"
msgstr "Web d'administració del ejabberd"
#: web/ejabberd_web_admin.erl:769 web/ejabberd_web_admin.erl:780
msgid "Administration"
msgstr "Administració"
#: web/ejabberd_web_admin.erl:878 web/ejabberd_web_admin.erl:982
msgid "Raw"
msgstr "en format text"
#: web/ejabberd_web_admin.erl:1017
msgid "~s access rule configuration"
msgstr "Configuració de les Regles d'Accés ~s"
#: web/ejabberd_web_admin.erl:1035
msgid "Virtual Hosts"
msgstr "Hosts virtuals"
#: web/ejabberd_web_admin.erl:1043 web/ejabberd_web_admin.erl:1050
msgid "Users"
msgstr "Usuaris"
#: web/ejabberd_web_admin.erl:1078
msgid "Users Last Activity"
msgstr "Última activitat d'usuari"
#: web/ejabberd_web_admin.erl:1080
msgid "Period: "
msgstr "Període: "
#: web/ejabberd_web_admin.erl:1090
msgid "Last month"
msgstr "Últim mes"
#: web/ejabberd_web_admin.erl:1091
msgid "Last year"
msgstr "Últim any"
#: web/ejabberd_web_admin.erl:1092
msgid "All activity"
msgstr "Tota l'activitat"
#: web/ejabberd_web_admin.erl:1094
msgid "Show Ordinary Table"
msgstr "Mostrar Taula Ordinaria"
#: web/ejabberd_web_admin.erl:1096
msgid "Show Integral Table"
msgstr "Mostrar Taula Integral"
#: web/ejabberd_web_admin.erl:1105 web/ejabberd_web_admin.erl:1939
msgid "Statistics"
msgstr "Estadístiques"
#: web/ejabberd_web_admin.erl:1117
msgid "Not Found"
msgstr "No Trobat"
#: web/ejabberd_web_admin.erl:1134
msgid "Node not found"
msgstr "Node no trobat"
#: web/ejabberd_web_admin.erl:1460
msgid "Host"
msgstr "Host"
#: web/ejabberd_web_admin.erl:1461
msgid "Registered Users"
msgstr "Usuaris registrats"
#: web/ejabberd_web_admin.erl:1573
msgid "Offline Messages"
msgstr "Missatges offline"
#: web/ejabberd_web_admin.erl:1574 web/ejabberd_web_admin.erl:1767
msgid "Last Activity"
msgstr "Última activitat"
#: web/ejabberd_web_admin.erl:1659 web/ejabberd_web_admin.erl:1675
msgid "Registered Users:"
msgstr "Usuaris registrats:"
#: web/ejabberd_web_admin.erl:1661 web/ejabberd_web_admin.erl:1677
#: web/ejabberd_web_admin.erl:2192
msgid "Online Users:"
msgstr "Usuaris en línia:"
#: web/ejabberd_web_admin.erl:1663
msgid "Outgoing s2s Connections:"
msgstr "Connexions d'eixida s2s"
#: web/ejabberd_web_admin.erl:1665
msgid "Outgoing s2s Servers:"
msgstr "Servidors d'eixida de s2s"
#: web/ejabberd_web_admin.erl:1734 web/mod_register_web.erl:175
#: web/mod_register_web.erl:372 web/mod_register_web.erl:381
#: web/mod_register_web.erl:411
msgid "Change Password"
msgstr "Canviar Contrasenya"
#: web/ejabberd_web_admin.erl:1758
msgid "User "
msgstr "Usuari "
#: web/ejabberd_web_admin.erl:1765
msgid "Connected Resources:"
msgstr "Recursos connectats:"
#: web/ejabberd_web_admin.erl:1766 web/mod_register_web.erl:227
#: web/mod_register_web.erl:519
msgid "Password:"
msgstr "Contrasenya:"
#: web/ejabberd_web_admin.erl:1828
msgid "No Data"
msgstr "No hi ha dades"
#: web/ejabberd_web_admin.erl:1906
msgid "Nodes"
msgstr "Nodes"
#: web/ejabberd_web_admin.erl:1929 web/ejabberd_web_admin.erl:1951
msgid "Node "
msgstr "Node "
#: web/ejabberd_web_admin.erl:1938
msgid "Listened Ports"
msgstr "Ports a l'escolta"
#: web/ejabberd_web_admin.erl:1940 web/ejabberd_web_admin.erl:2260
#: web/ejabberd_web_admin.erl:2448
msgid "Update"
msgstr "Actualitzar"
#: web/ejabberd_web_admin.erl:1943 web/ejabberd_web_admin.erl:2569
msgid "Restart"
msgstr "Reiniciar"
#: web/ejabberd_web_admin.erl:1945 web/ejabberd_web_admin.erl:2571
msgid "Stop"
msgstr "Detindre"
#: web/ejabberd_web_admin.erl:1959
msgid "RPC Call Error"
msgstr "Error de cridada RPC"
#: web/ejabberd_web_admin.erl:2000
msgid "Database Tables at "
msgstr "Taules de la base de dades en "
#: web/ejabberd_web_admin.erl:2007
msgid "Storage Type"
msgstr "Tipus d'emmagatzematge"
#: web/ejabberd_web_admin.erl:2008
msgid "Elements"
msgstr "Elements"
#: web/ejabberd_web_admin.erl:2009
msgid "Memory"
msgstr "Memòria"
#: web/ejabberd_web_admin.erl:2032 web/ejabberd_web_admin.erl:2137
msgid "Error"
msgstr "Error"
#: web/ejabberd_web_admin.erl:2034
msgid "Backup of "
msgstr "Còpia de seguretat de "
#: web/ejabberd_web_admin.erl:2036
msgid ""
"Please note that these options will only backup the builtin Mnesia database. "
"If you are using the ODBC module, you also need to backup your SQL database "
"separately."
msgstr ""
"Recorda que aquestes opcions només fan còpia de seguretat de la base de "
"dades Mnesia. Si estàs utilitzant el mòdul d'ODBC també deus de fer una "
"còpia de seguretat de la base de dades de SQL a part."
#: web/ejabberd_web_admin.erl:2041
msgid "Store binary backup:"
msgstr "Guardar una còpia de seguretat binària:"
#: web/ejabberd_web_admin.erl:2045 web/ejabberd_web_admin.erl:2052
#: web/ejabberd_web_admin.erl:2060 web/ejabberd_web_admin.erl:2067
#: web/ejabberd_web_admin.erl:2074 web/ejabberd_web_admin.erl:2081
#: web/ejabberd_web_admin.erl:2088 web/ejabberd_web_admin.erl:2096
#: web/ejabberd_web_admin.erl:2103 web/ejabberd_web_admin.erl:2110
msgid "OK"
msgstr "Acceptar"
#: web/ejabberd_web_admin.erl:2048
msgid "Restore binary backup immediately:"
msgstr "Restaurar una còpia de seguretat binària ara mateix."
#: web/ejabberd_web_admin.erl:2056
msgid ""
"Restore binary backup after next ejabberd restart (requires less memory):"
msgstr ""
"Restaurar una còpia de seguretat binària després de reiniciar el ejabberd "
"(requereix menys memòria:"
#: web/ejabberd_web_admin.erl:2063
msgid "Store plain text backup:"
msgstr "Guardar una còpia de seguretat en format de text pla:"
#: web/ejabberd_web_admin.erl:2070
msgid "Restore plain text backup immediately:"
msgstr "Restaurar una còpia de seguretat en format de text pla ara mateix:"
#: web/ejabberd_web_admin.erl:2077
msgid "Import users data from a PIEFXIS file (XEP-0227):"
msgstr "Importar dades d'usuaris des d'un arxiu PIEFXIS (XEP-0227):"
#: web/ejabberd_web_admin.erl:2084
msgid "Export data of all users in the server to PIEFXIS files (XEP-0227):"
msgstr ""
"Exportar dades de tots els usuaris del servidor a arxius PIEFXIS (XEP-0227):"
#: web/ejabberd_web_admin.erl:2091
msgid "Export data of users in a host to PIEFXIS files (XEP-0227):"
msgstr "Exportar dades d'usuaris d'un host a arxius PIEFXIS (XEP-0227):"
#: web/ejabberd_web_admin.erl:2099
msgid "Import user data from jabberd14 spool file:"
msgstr "Importar dades d'usuaris de l'arxiu de spool de jabberd14"
#: web/ejabberd_web_admin.erl:2106
msgid "Import users data from jabberd14 spool directory:"
msgstr "Importar dades d'usuaris del directori de spool de jabberd14:"
#: web/ejabberd_web_admin.erl:2132
msgid "Listened Ports at "
msgstr "Ports a la escolta en "
#: web/ejabberd_web_admin.erl:2157
msgid "Modules at "
msgstr "Mòduls en "
#: web/ejabberd_web_admin.erl:2183
msgid "Statistics of ~p"
msgstr "Estadístiques de ~p"
#: web/ejabberd_web_admin.erl:2186
msgid "Uptime:"
msgstr "Temps en marxa"
#: web/ejabberd_web_admin.erl:2189
msgid "CPU Time:"
msgstr "Temps de CPU"
#: web/ejabberd_web_admin.erl:2195
msgid "Transactions Committed:"
msgstr "Transaccions Realitzades:"
#: web/ejabberd_web_admin.erl:2198
msgid "Transactions Aborted:"
msgstr "Transaccions Avortades"
#: web/ejabberd_web_admin.erl:2201
msgid "Transactions Restarted:"
msgstr "Transaccions reiniciades"
#: web/ejabberd_web_admin.erl:2204
msgid "Transactions Logged:"
msgstr "Transaccions registrades"
#: web/ejabberd_web_admin.erl:2246
msgid "Update "
msgstr "Actualitzar"
#: web/ejabberd_web_admin.erl:2254
msgid "Update plan"
msgstr "Pla d'actualització"
#: web/ejabberd_web_admin.erl:2255
msgid "Modified modules"
msgstr "Mòduls modificats"
#: web/ejabberd_web_admin.erl:2256
msgid "Update script"
msgstr "Script d'actualització"
#: web/ejabberd_web_admin.erl:2257
msgid "Low level update script"
msgstr "Script d'actualització de baix nivell"
#: web/ejabberd_web_admin.erl:2258
msgid "Script check"
msgstr "Comprovar script"
#: web/ejabberd_web_admin.erl:2426
msgid "Port"
msgstr "Port"
#: web/ejabberd_web_admin.erl:2427
msgid "IP"
msgstr "IP"
#: web/ejabberd_web_admin.erl:2428
msgid "Protocol"
msgstr "Protocol"
#: web/ejabberd_web_admin.erl:2429 web/ejabberd_web_admin.erl:2556
msgid "Module"
msgstr "Mòdul"
#: web/ejabberd_web_admin.erl:2430 web/ejabberd_web_admin.erl:2557
msgid "Options"
msgstr "Opcions"
#: web/ejabberd_web_admin.erl:2450
msgid "Delete"
msgstr "Eliminar"
#: web/ejabberd_web_admin.erl:2579
msgid "Start"
msgstr "Iniciar"
#: web/mod_register_web.erl:104
msgid "Your Jabber account was successfully created."
msgstr "El teu compte Jabber ha sigut creat correctament."
#: web/mod_register_web.erl:107
msgid "There was an error creating the account: "
msgstr "Hi ha hagut un error creant el compte: "
#: web/mod_register_web.erl:115
msgid "Your Jabber account was successfully deleted."
msgstr "El teu compte Jabber ha sigut esborrat correctament."
#: web/mod_register_web.erl:118
msgid "There was an error deleting the account: "
msgstr "Hi ha hagut un error esborrant el compte: "
#: web/mod_register_web.erl:128
msgid "The password of your Jabber account was successfully changed."
msgstr "La contrasenya del teu compte Jabber s'ha canviat correctament."
#: web/mod_register_web.erl:131
msgid "There was an error changing the password: "
msgstr "Hi ha hagut un error canviant la contrasenya: "
#: web/mod_register_web.erl:163 web/mod_register_web.erl:172
msgid "Jabber Account Registration"
msgstr "Registre de compte Jabber"
#: web/mod_register_web.erl:174 web/mod_register_web.erl:192
#: web/mod_register_web.erl:201
msgid "Register a Jabber account"
msgstr "Registrar un compte Jabber"
#: web/mod_register_web.erl:176 web/mod_register_web.erl:493
#: web/mod_register_web.erl:502
msgid "Unregister a Jabber account"
msgstr "Anul·lar el registre d'un compte Jabber"
#: web/mod_register_web.erl:203
msgid ""
"This page allows to create a Jabber account in this Jabber server. Your JID "
"(Jabber IDentifier) will be of the form: username@server. Please read "
"carefully the instructions to fill correctly the fields."
msgstr ""
"Aquesta pàgina permet crear un compte Jabber en aquest servidor Jabber. El "
"teu JID (Jabber IDentifier; Identificador Jabber) tindrà aquesta forma: "
"usuari@servidor. Si us plau, llegeix amb cura les instruccions per emplenar "
"correctament els camps."
#: web/mod_register_web.erl:212 web/mod_register_web.erl:386
#: web/mod_register_web.erl:509
msgid "Username:"
msgstr "Nom d'usuari:"
#: web/mod_register_web.erl:217
msgid "This is case insensitive: macbeth is the same that MacBeth and Macbeth."
msgstr ""
"Això no distingeix majúscules de minúscules: macbeth es el mateix que "
"MacBeth i Macbeth."
#: web/mod_register_web.erl:218
msgid "Characters not allowed:"
msgstr "Caràcters no permesos:"
#: web/mod_register_web.erl:222 web/mod_register_web.erl:391
#: web/mod_register_web.erl:514
msgid "Server:"
msgstr "Servidor:"
#: web/mod_register_web.erl:232
msgid ""
"Don't tell your password to anybody, not even the administrators of the "
"Jabber server."
msgstr ""
"No li donis la teva contrasenya a ningú, ni tan sols als administradors del "
"servidor Jabber."
#: web/mod_register_web.erl:234
msgid "You can later change your password using a Jabber client."
msgstr ""
"Podràs canviar la teva contrasenya més endavant utilitzant un client Jabber."
#: web/mod_register_web.erl:235
msgid ""
"Some Jabber clients can store your password in your computer. Use that "
"feature only if you trust your computer is safe."
msgstr ""
"Alguns clients Jabber poden emmagatzemar la teva contrasenya al teu "
"ordinador. Fes servir aquesta característica només si saps que el teu "
"ordinador és segur."
#: web/mod_register_web.erl:237
msgid ""
"Memorize your password, or write it in a paper placed in a safe place. In "
"Jabber there isn't an automated way to recover your password if you forget "
"it."
msgstr ""
"Memoritza la teva contrasenya, o escriu-la en un paper guardat a un lloc "
"segur.A Jabber no hi ha una forma automatitzada de recuperar la teva "
"contrasenya si la oblides."
#: web/mod_register_web.erl:242 web/mod_register_web.erl:406
msgid "Password Verification:"
msgstr "Verificació de la Contrasenya:"
#: web/mod_register_web.erl:250
msgid "Register"
msgstr "Registrar"
#: web/mod_register_web.erl:396
msgid "Old Password:"
msgstr "Antiga contrasenya:"
#: web/mod_register_web.erl:401
msgid "New Password:"
msgstr "Nova Contrasenya:"
#: web/mod_register_web.erl:504
msgid "This page allows to unregister a Jabber account in this Jabber server."
msgstr ""
"Aquesta pàgina permet anul·lar el registre d'un compte Jabber en aquest "
"servidor Jabber."
#: web/mod_register_web.erl:524
msgid "Unregister"
msgstr "Anul·lar el registre"
#, fuzzy
#~ msgid "Captcha test failed"
#~ msgstr "El CAPTCHA es vàlid."
ejabberd-2.1.11/src/msgs/id.msg 0000664 0000000 0000000 00000063420 12240230175 013067 0 ustar {"Access Configuration","Akses Konfigurasi"}.
{"Access Control List Configuration","Konfigurasi Daftar Akses Pengendalian"}.
{"Access Control Lists","Akses Daftar Pengendalian"}.
{"Access control lists","Daftar Pengendalian Akses"}.
{"Access denied by service policy","Akses ditolak oleh kebijakan layanan"}.
{"Access rules","Akses peraturan"}.
{"Access Rules","Aturan Akses"}.
{"Action on user","Tindakan pada pengguna"}.
{"Add Jabber ID","Tambah Jabber ID"}.
{"Add New","Tambah Baru"}.
{"Add User","Tambah Pengguna"}.
{"Administration","Administrasi"}.
{"Administration of ","Administrasi"}.
{"Administrator privileges required","Hak istimewa Administrator dibutuhkan"}.
{"A friendly name for the node","Nama yang dikenal untuk node"}.
{"All activity","Semua aktifitas"}.
{"Allow this Jabber ID to subscribe to this pubsub node?","Izinkan ID Jabber ini untuk berlangganan pada node pubsub ini?"}.
{"Allow users to change the subject","Perbolehkan pengguna untuk mengganti topik"}.
{"Allow users to query other users","Perbolehkan pengguna untuk mengetahui pengguna lain"}.
{"Allow users to send invites","Perbolehkan pengguna mengirimkan undangan"}.
{"Allow users to send private messages","perbolehkan pengguna mengirimkan pesan ke pengguna lain secara pribadi"}.
{"Allow visitors to change nickname","Perbolehkan visitor mengganti nama julukan"}.
{"Allow visitors to send status text in presence updates","Izinkan pengunjung untuk mengirim teks status terbaru"}.
{"All Users","Semua Pengguna"}.
{"Announcements","Pengumuman"}.
{"anyone","Siapapun"}.
{"A password is required to enter this room","Diperlukan kata sandi untuk masuk ruangan ini"}.
{"April","April"}.
{"August","Agustus"}.
{"Backup","Backup"}.
{"Backup Management","Manajemen Backup"}.
{"Backup of ","Cadangan dari"}.
{"Backup to File at ","Backup ke File pada"}.
{"Bad format","Format yang buruk"}.
{"Birthday","Hari Lahir"}.
{"CAPTCHA web page","CAPTCHA laman web"}.
{"Change Password","Ubah Kata Sandi"}.
{"Change User Password","Ubah User Password"}.
{"Characters not allowed:","Karakter tidak diperbolehkan:"}.
{"Chatroom configuration modified","Konfigurasi ruang chat diubah"}.
{"Chatroom is created","Ruang chat telah dibuat"}.
{"Chatroom is destroyed","Ruang chat dilenyapkan"}.
{"Chatroom is started","Ruang chat dimulai"}.
{"Chatroom is stopped","Ruang chat dihentikan"}.
{"Chatrooms","Ruangan Chat"}.
{"Choose a username and password to register with this server","Pilih nama pengguna dan kata sandi untuk mendaftar dengan layanan ini"}.
{"Choose modules to stop","Pilih Modul untuk berhenti"}.
{"Choose storage type of tables","Pilih jenis penyimpanan tabel"}.
{"Choose whether to approve this entity's subscription.","Pilih apakah akan menyetujui hubungan pertemanan ini."}.
{"City","Kota"}.
{"Commands","Perintah"}.
{"Conference room does not exist","Ruang Konferensi tidak ada"}.
{"Configuration of room ~s","Pengaturan ruangan ~s"}.
{"Configuration","Pengaturan"}.
{"Connected Resources:","Sumber Daya Terhubung:"}.
{"Connections parameters","Parameter Koneksi"}.
{"Country","Negara"}.
{"CPU Time:","Waktu CPU:"}.
{"Database","Database"}.
{"Database Tables at ","Tabel Database pada"}.
{"Database Tables Configuration at ","Database Tabel Konfigurasi pada"}.
{"December","Desember"}.
{"Default users as participants","pengguna pertama kali masuk sebagai participant"}.
{"Delete","Hapus"}.
{"Delete message of the day","Hapus pesan harian"}.
{"Delete message of the day on all hosts","Hapus pesan harian pada semua host"}.
{"Delete Selected","Hapus Yang Terpilih"}.
{"Delete User","Hapus Pengguna"}.
{"Deliver event notifications","Memberikan pemberitahuan acara"}.
{"Deliver payloads with event notifications","Memberikan muatan dengan pemberitahuan acara"}.
{"Description:","Keterangan:"}.
{"Disc only copy","Hanya salinan dari disc"}.
{"Displayed Groups:","Tampilkan Grup:"}.
{"Don't tell your password to anybody, not even the administrators of the Jabber server.","Jangan memberitahukan kata sandi Anda ke siapapun, bahkan para administrator dari layanan Jabber."}.
{"Dump Backup to Text File at ","Dump Backup ke File Teks di"}.
{"Dump to Text File","Dump menjadi File Teks"}.
{"Edit Properties","Ganti Properti"}.
{"ejabberd IRC module","ejabberd IRC modul"}.
{"ejabberd MUC module","ejabberd MUC Module"}.
{"ejabberd Publish-Subscribe module","Modul ejabberd Setujui-Pertemanan"}.
{"ejabberd SOCKS5 Bytestreams module","modul ejabberd SOCKS5 Bytestreams"}.
{"ejabberd vCard module","Modul ejabberd vCard"}.
{"ejabberd Web Admin","Admin Web ejabberd"}.
{"Elements","Elemen-elemen"}.
{"Email","Email"}.
{"Enable logging","Aktifkan catatan"}.
{"Encoding for server ~b","Pengkodean untuk layanan ~b"}.
{"End User Session","Akhir Sesi Pengguna"}.
{"Enter list of {Module, [Options]}","Masukkan daftar {Modul, [Options]}"}.
{"Enter nickname you want to register","Masukkan nama julukan Anda jika ingin mendaftar"}.
{"Enter path to backup file","Masukkan path untuk file cadangan"}.
{"Enter path to jabberd14 spool dir","Masukkan path ke direktori spool jabberd14"}.
{"Enter path to jabberd14 spool file","Masukkan path ke file jabberd14 spool"}.
{"Enter path to text file","Masukkan path ke file teks"}.
{"Enter the text you see","Masukkan teks yang Anda lihat"}.
{"Enter username and encodings you wish to use for connecting to IRC servers. Press 'Next' to get more fields to fill in. Press 'Complete' to save settings.","Masukkan username dan pengkodean yang ingin Anda gunakan untuk menghubungkan ke layanan IRC. Tekan 'Selanjutnya' untuk mendapatkan lagi formulir kemudian Tekan 'Lengkap' untuk menyimpan pengaturan."}.
{"Enter username, encodings, ports and passwords you wish to use for connecting to IRC servers","Masukkan username, pengkodean, port dan sandi yang ingin Anda gunakan untuk menghubungkan ke layanan IRC"}.
{"Erlang Jabber Server","Layanan Erlang Jabber"}.
{"Error","Kesalahan"}.
{"Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef.net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}].","Contoh: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef.net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."}.
{"Export data of all users in the server to PIEFXIS files (XEP-0227):","Ekspor data dari semua pengguna pada layanan ke berkas PIEFXIS (XEP-0227):"}.
{"Export data of users in a host to PIEFXIS files (XEP-0227):","Ekspor data pengguna pada sebuah host ke berkas PIEFXIS (XEP-0227):"}.
{"Family Name","Nama Keluarga (marga)"}.
{"February","Februari"}.
{"Fill in fields to search for any matching Jabber User","Isi kolom untuk mencari pengguna Jabber yang sama"}.
{"Fill in the form to search for any matching Jabber User (Add * to the end of field to match substring)","Isi formulir untuk pencarian pengguna Jabber yang cocok (Tambahkan * ke mengakhiri pengisian untuk menyamakan kata)"}.
{"Friday","Jumat"}.
{"From","Dari"}.
{"From ~s","Dari ~s"}.
{"Full Name","Nama Lengkap"}.
{"Get Number of Online Users","Dapatkan Jumlah User Yang Online"}.
{"Get Number of Registered Users","Dapatkan Jumlah Pengguna Yang Terdaftar"}.
{"Get User Last Login Time","Dapatkan Waktu Login Terakhir Pengguna "}.
{"Get User Password","Dapatkan User Password"}.
{"Get User Statistics","Dapatkan Statistik Pengguna"}.
{"Group ","Grup"}.
{"Groups","Grup"}.
{"has been banned","telah dibanned"}.
{"has been kicked because of an affiliation change","telah dikick karena perubahan afiliasi"}.
{"has been kicked because of a system shutdown","telah dikick karena sistem shutdown"}.
{"has been kicked because the room has been changed to members-only","telah dikick karena ruangan telah diubah menjadi hanya untuk member"}.
{"has been kicked","telah dikick"}.
{" has set the subject to: ","telah menetapkan topik yaitu:"}.
{"Host","Host"}.
{"If you don't see the CAPTCHA image here, visit the web page.","Jika Anda tidak melihat gambar CAPTCHA disini, silahkan kunjungi halaman web."}.
{"If you want to specify different ports, passwords, encodings for IRC servers, fill this list with values in format '{\"irc server\", \"encoding\", port, \"password\"}'. By default this service use \"~s\" encoding, port ~p, empty password.","Jika Anda ingin menentukan port yang berbeda, sandi, pengkodean untuk layanan IRC, isi daftar ini dengan nilai-nilai dalam format '{\"server irc \", \"encoding \", port, \"sandi \"}'. Secara default ini menggunakan layanan \"~s \" pengkodean, port ~p, kata sandi kosong."}.
{"Import Directory","Impor Direktori"}.
{"Import File","Impor File"}.
{"Import user data from jabberd14 spool file:","Impor data pengguna dari sekumpulan berkas jabberd14:"}.
{"Import User from File at ","Impor Pengguna dari File pada"}.
{"Import users data from a PIEFXIS file (XEP-0227):","impor data-data pengguna dari sebuah PIEFXIS (XEP-0227):"}.
{"Import users data from jabberd14 spool directory:","Импорт пользовательских данных из буферной директории jabberd14:"}.
{"Import Users from Dir at ","Impor Pengguna dari Dir di"}.
{"Import Users From jabberd14 Spool Files","Impor Pengguna Dari jabberd14 Spool File"}.
{"Improper message type","Jenis pesan yang tidak benar"}.
{"Incorrect password","Kata sandi salah"}.
{"Invalid affiliation: ~s","Afiliasi tidak valid: ~s"}.
{"Invalid role: ~s","Peran tidak valid: ~s"}.
{"IP addresses","Alamat IP"}.
{"IP","IP"}.
{"IRC channel (don't put the first #)","Channel IRC (tidak perlu menempatkan # sebelumnya)"}.
{"IRC server","Layanan IRC"}.
{"IRC settings","Pengaturan IRC"}.
{"IRC Transport","IRC Transport"}.
{"IRC username","Nama Pengguna IRC"}.
{"IRC Username","Nama Pengguna IRC"}.
{"is now known as","sekarang dikenal sebagai"}.
{"It is not allowed to send private messages","Hal ini tidak diperbolehkan untuk mengirim pesan pribadi"}.
{"It is not allowed to send private messages of type \"groupchat\"","Hal ini tidak diperbolehkan untuk mengirim pesan pribadi jenis \"groupchat \""}.
{"It is not allowed to send private messages to the conference","Hal ini tidak diperbolehkan untuk mengirim pesan pribadi ke konferensi"}.
{"Jabber Account Registration","Pendaftaran Akun Jabber"}.
{"Jabber ID","Jabber ID"}.
{"Jabber ID ~s is invalid","Jabber ID ~s tidak valid"}.
{"January","Januari"}.
{"Join IRC channel","Gabung channel IRC"}.
{"joins the room","bergabung ke ruangan"}.
{"Join the IRC channel here.","Gabung ke channel IRC disini"}.
{"Join the IRC channel in this Jabber ID: ~s","Gabung ke channel IRC dengan Jabber ID: ~s"}.
{"July","Juli"}.
{"June","Juni"}.
{"Last Activity","Aktifitas Terakhir"}.
{"Last login","Terakhir Login"}.
{"Last month","Akhir bulan"}.
{"Last year","Akhir tahun"}.
{"leaves the room","meninggalkan ruangan"}.
{"Listened Ports at ","Mendeteksi Port-port di"}.
{"Listened Ports","Port Terdeteksi"}.
{"List of modules to start","Daftar modul untuk memulai"}.
{"Low level update script","Perbaruan naskah tingkat rendah"}.
{"Make participants list public","Buat daftar participant diketahui oleh public"}.
{"Make room CAPTCHA protected","Buat ruangan dilindungi dengan CAPTCHA"}.
{"Make room members-only","Buat ruangan hanya untuk member saja"}.
{"Make room moderated","Buat ruangan hanya untuk moderator saja"}.
{"Make room password protected","Buat ruangan yang dilindungi dengan kata sandi"}.
{"Make room persistent","Buat ruangan menjadi permanent"}.
{"Make room public searchable","Buat ruangan dapat dicari"}.
{"March","Maret"}.
{"Maximum Number of Occupants","Maksimum Jumlah Penghuni"}.
{"Max # of items to persist","Max item untuk bertahan"}.
{"Max payload size in bytes","Max kapasitas ukuran dalam bytes"}.
{"May","Mei"}.
{"Members:","Anggota:"}.
{"Membership is required to enter this room","Hanya Member yang dapat masuk ruangan ini"}.
{"Memorize your password, or write it in a paper placed in a safe place. In Jabber there isn't an automated way to recover your password if you forget it.","Hafalkan kata sandi Anda, atau dicatat dan letakkan di tempat yang aman. Didalam Jabber tidak ada cara otomatis untuk mendapatkan kembali password Anda jika Anda lupa."}.
{"Memory","Memori"}.
{"Message body","Isi Pesan"}.
{"Middle Name","Nama Tengah"}.
{"Moderator privileges required","Hak istimewa moderator dibutuhkan"}.
{"moderators only","Hanya moderator"}.
{"Modified modules","Modifikasi modul-modul"}.
{"Module","Modul"}.
{"Modules at ","modul-modul di"}.
{"Modules","Modul"}.
{"Monday","Senin"}.
{"Name:","Nama:"}.
{"Name","Nama"}.
{"Never","Tidak Pernah"}.
{"New Password:","Password Baru:"}.
{"Nickname","Nama Julukan"}.
{"Nickname Registration at ","Pendaftaran Julukan pada"}.
{"Nickname ~s does not exist in the room","Nama Julukan ~s tidak berada di dalam ruangan"}.
{"No body provided for announce message","Tidak ada isi pesan yang disediakan untuk mengirimkan pesan"}.
{"No Data","Tidak Ada Data"}.
{"Node ID","ID Node"}.
{"Node ","Node"}.
{"Node not found","Node tidak ditemukan"}.
{"Nodes","Node-node"}.
{"No limit","Tidak terbatas"}.
{"None","Tak satupun"}.
{"No resource provided","Tidak ada sumber daya yang disediakan"}.
{"Not Found","Tidak Ditemukan"}.
{"Notify subscribers when items are removed from the node","Beritahu pelanggan ketika item tersebut dikeluarkan dari node"}.
{"Notify subscribers when the node configuration changes","Beritahu pelanggan ketika ada perubahan konfigurasi node"}.
{"Notify subscribers when the node is deleted","Beritahu pelanggan ketika node dihapus"}.
{"November","Nopember"}.
{"Number of occupants","Jumlah Penghuni"}.
{"Number of online users","Jumlah pengguna online"}.
{"Number of registered users","Jumlah pengguna terdaftar"}.
{"October","Oktober"}.
{"Offline Messages:","Pesan Offline:"}.
{"Offline Messages","Pesan Offline"}.
{"OK","YA"}.
{"Old Password:","Password Lama:"}.
{"Online","Online"}.
{"Online Users:","Pengguna Online:"}.
{"Online Users","Pengguna Yang Online"}.
{"Only deliver notifications to available users","Hanya mengirimkan pemberitahuan kepada pengguna yang tersedia"}.
{"Only moderators and participants are allowed to change the subject in this room","Hanya moderator dan peserta yang diizinkan untuk mengganti topik pembicaraan di ruangan ini"}.
{"Only moderators are allowed to change the subject in this room","Hanya moderator yang diperbolehkan untuk mengubah topik dalam ruangan ini"}.
{"Only occupants are allowed to send messages to the conference","Hanya penghuni yang diizinkan untuk mengirim pesan ke konferensi"}.
{"Only occupants are allowed to send queries to the conference","Hanya penghuni diizinkan untuk mengirim permintaan ke konferensi"}.
{"Only service administrators are allowed to send service messages","Layanan hanya diperuntukan kepada administrator yang diizinkan untuk mengirim layanan pesan"}.
{"Options","Pilihan-pilihan"}.
{"Organization Name","Nama Organisasi"}.
{"Organization Unit","Unit Organisasi"}.
{"Outgoing s2s Connections","Koneksi Keluar s2s"}.
{"Outgoing s2s Connections:","Koneksi s2s yang keluar:"}.
{"Outgoing s2s Servers:","Layanan s2s yang keluar:"}.
{"Owner privileges required","Hak istimewa owner dibutuhkan"}.
{"Packet","Paket"}.
{"Password ~b","Kata Sandi ~b"}.
{"Password:","Kata Sandi:"}.
{"Password","Sandi"}.
{"Password Verification:","Verifikasi Kata Sandi:"}.
{"Password Verification","Verifikasi Sandi"}.
{"Path to Dir","Jalur ke Dir"}.
{"Path to File","Jalur ke File"}.
{"Pending","Tertunda"}.
{"Period: ","Periode:"}.
{"Persist items to storage","Pertahankan item ke penyimpanan"}.
{"Ping","Ping"}.
{"Please note that these options will only backup the builtin Mnesia database. If you are using the ODBC module, you also need to backup your SQL database separately.","Harap dicatat bahwa pilihan ini hanya akan membuat cadangan builtin Mnesia database. Jika Anda menggunakan modul ODBC, anda juga perlu untuk membuat cadangan database SQL Anda secara terpisah."}.
{"Pong","Pong"}.
{"Port ~b","Port ~b"}.
{"Port","Port"}.
{"Present real Jabber IDs to","Tampilkan Jabber ID secara lengkap"}.
{"private, ","pribadi, "}.
{"Protocol","Protocol"}.
{"Publish-Subscribe","Setujui-Pertemanan"}.
{"PubSub subscriber request","Permintaan pertemanan PubSub"}.
{"Purge all items when the relevant publisher goes offline","Bersihkan semua item ketika penerbit yang relevan telah offline"}.
{"Queries to the conference members are not allowed in this room","Permintaan untuk para anggota konferensi tidak diperbolehkan di ruangan ini"}.
{"RAM and disc copy","RAM dan disc salinan"}.
{"RAM copy","Salinan RAM"}.
{"Raw","mentah"}.
{"Really delete message of the day?","Benar-benar ingin menghapus pesan harian?"}.
{"Recipient is not in the conference room","Penerima tidak berada di ruangan konferensi"}.
{"Register a Jabber account","Daftarkan sebuah akun jabber"}.
{"Registered Users:","Pengguna Terdaftar:"}.
{"Registered Users","Pengguna Terdaftar"}.
{"Register","Mendaftar"}.
{"Registration in mod_irc for ","Pendaftaran di mod_irc untuk"}.
{"Remote copy","Salinan Remote"}.
{"Remove All Offline Messages","Hapus Semua Pesan Offline"}.
{"Remove","Menghapus"}.
{"Remove User","Hapus Pengguna"}.
{"Replaced by new connection","Diganti dengan koneksi baru"}.
{"Resources","Sumber daya"}.
{"Restart","Jalankan Ulang"}.
{"Restart Service","Restart Layanan"}.
{"Restore Backup from File at ","Kembalikan Backup dari File pada"}.
{"Restore binary backup after next ejabberd restart (requires less memory):","Mengembalikan cadangan yang berpasanagn setelah ejabberd berikutnya dijalankan ulang (memerlukan memori lebih sedikit):"}.
{"Restore binary backup immediately:","Segera mengembalikan cadangan yang berpasangan:"}.
{"Restore","Mengembalikan"}.
{"Restore plain text backup immediately:","Segera mengembalikan cadangan teks biasa:"}.
{"Room Configuration","Konfigurasi Ruangan"}.
{"Room creation is denied by service policy","Pembuatan Ruangan ditolak oleh kebijakan layanan"}.
{"Room description","Keterangan ruangan"}.
{"Room Occupants","Penghuni Ruangan"}.
{"Room title","Nama Ruangan"}.
{"Roster groups allowed to subscribe","Kelompok kontak yang diizinkan untuk berlangganan"}.
{"Roster","Kontak"}.
{"Roster of ","Kontak dari"}.
{"Roster size","Ukuran Daftar Kontak"}.
{"RPC Call Error","Panggilan Kesalahan RPC"}.
{"Running Nodes","Menjalankan Node"}.
{"~s access rule configuration","~s aturan akses konfigurasi"}.
{"Saturday","Sabtu"}.
{"Script check","Periksa naskah"}.
{"Search Results for ","Hasil Pencarian untuk"}.
{"Search users in ","Pencarian pengguna dalam"}.
{"Send announcement to all online users","Kirim pengumuman untuk semua pengguna yang online"}.
{"Send announcement to all online users on all hosts","Kirim pengumuman untuk semua pengguna yang online pada semua host"}.
{"Send announcement to all users","Kirim pengumuman untuk semua pengguna"}.
{"Send announcement to all users on all hosts","Kirim pengumuman untuk semua pengguna pada semua host"}.
{"September","September"}.
{"Server ~b","Layanan ~b"}.
{"Server:","Layanan:"}.
{"Set message of the day and send to online users","Mengatur pesan harian dan mengirimkan ke pengguna yang online"}.
{"Set message of the day on all hosts and send to online users","Mengatur pesan harian pada semua host dan kirimkan ke pengguna yang online"}.
{"Shared Roster Groups","Berbagi grup kontak"}.
{"Show Integral Table","Tampilkan Tabel Terpisah"}.
{"Show Ordinary Table","Tampilkan Tabel Normal"}.
{"Shut Down Service","Shut Down Layanan"}.
{"~s invites you to the room ~s","~s mengundang anda ke ruangan ~s"}.
{"Some Jabber clients can store your password in your computer. Use that feature only if you trust your computer is safe.","Beberapa klien Jabber dapat menyimpan password di komputer Anda. Gunakan fitur itu hanya jika Anda mempercayai komputer Anda aman."}.
{"Specify the access model","Tentukan model akses"}.
{"Specify the event message type","Tentukan jenis acara pesan"}.
{"Specify the publisher model","Tentukan model penerbitan"}.
{"~s's Offline Messages Queue","Antrian Pesan Offline ~s"}.
{"Start Modules at ","Mulai Modul pada"}.
{"Start Modules","Memulai Modul"}.
{"Start","Mulai"}.
{"Statistics of ~p","statistik dari ~p"}.
{"Statistics","Statistik"}.
{"Stop","Hentikan"}.
{"Stop Modules at ","Hentikan Modul pada"}.
{"Stop Modules","Hentikan Modul"}.
{"Stopped Nodes","Menghentikan node"}.
{"Storage Type","Jenis Penyimpanan"}.
{"Store binary backup:","Penyimpanan cadangan yang berpasangan:"}.
{"Store plain text backup:","Simpan cadangan teks biasa:"}.
{"Subject","Subyek"}.
{"Submit","Serahkan"}.
{"Submitted","Ulangi masukan"}.
{"Subscriber Address","Alamat Pertemanan"}.
{"Subscription","Berlangganan"}.
{"Sunday","Minggu"}.
{"That nickname is already in use by another occupant","Julukan itu sudah digunakan oleh penghuni lain"}.
{"That nickname is registered by another person","Julukan tersebut telah didaftarkan oleh orang lain"}.
{"The CAPTCHA is valid.","Captcha ini benar."}.
{"The CAPTCHA verification has failed","Verifikasi CAPTCHA telah gagal"}.
{"The collections with which a node is affiliated","Koleksi dengan yang berafiliasi dengan sebuah node"}.
{"the password is","kata sandi yaitu:"}.
{"The password is too weak","Kata sandi terlalu lemah"}.
{"The password of your Jabber account was successfully changed.","Kata sandi pada akun Jabber Anda telah berhasil diubah."}.
{"There was an error changing the password: ","Ada kesalahan dalam mengubah password:"}.
{"There was an error creating the account: ","Ada kesalahan saat membuat akun:"}.
{"There was an error deleting the account: ","Ada kesalahan saat menghapus akun:"}.
{"This is case insensitive: macbeth is the same that MacBeth and Macbeth.","Pada bagian ini huruf besar dan kecil tidak dibedakan: Misalnya macbeth adalah sama dengan MacBeth juga Macbeth."}.
{"This page allows to create a Jabber account in this Jabber server. Your JID (Jabber IDentifier) will be of the form: username@server. Please read carefully the instructions to fill correctly the fields.","Halaman ini memungkinkan untuk membuat akun Jabber di layanan Jabber ini. JID Anda (Jabber Pengenal) akan berbentuk: namapengguna@layanan. Harap baca dengan seksama petunjuk-petunjuk untuk mengisi kolom dengan benar."}.
{"This page allows to unregister a Jabber account in this Jabber server.","Pada bagian ini memungkinkan Anda untuk membatalkan pendaftaran akun Jabber pada layanan Jabber ini."}.
{"This participant is kicked from the room because he sent an error message","Peserta ini dikick dari ruangan karena dia mengirim pesan kesalahan"}.
{"This participant is kicked from the room because he sent an error message to another participant","Participant ini dikick dari ruangan karena ia mengirim pesan kesalahan ke participant lain"}.
{"This participant is kicked from the room because he sent an error presence","Participant ini dikick dari ruangan karena ia mengirim kehadiran kesalahan"}.
{"This room is not anonymous","Ruangan ini tidak dikenal"}.
{"Thursday","Kamis"}.
{"Time delay","Waktu tunda"}.
{"Time","Waktu"}.
{"To","Kepada"}.
{"To ~s","Kepada ~s"}.
{"Traffic rate limit is exceeded","Lalu lintas melebihi batas"}.
{"Transactions Aborted:","Transaksi yang dibatalkan:"}.
{"Transactions Committed:","Transaksi yang dilakukan:"}.
{"Transactions Logged:","Transaksi yang ditempuh:"}.
{"Transactions Restarted:","Transaksi yang dijalankan ulang:"}.
{"Tuesday","Selasa"}.
{"Unable to generate a CAPTCHA","Tidak dapat menghasilkan CAPTCHA"}.
{"Unauthorized","Ditolak"}.
{"Unregister a Jabber account","Nonaktifkan akun jabber"}.
{"Unregister","Nonaktifkan"}.
{"Update ","Memperbarui "}.
{"Update","Memperbarui"}.
{"Update message of the day (don't send)","Rubah pesan harian (tidak dikirim)"}.
{"Update message of the day on all hosts (don't send)","Rubah pesan harian pada semua host (tidak dikirim)"}.
{"Update plan","Rencana Perubahan"}.
{"Update script","Perbarui naskah"}.
{"Uptime:","Sampai saat:"}.
{"Use of STARTTLS required","Penggunaan STARTTLS diperlukan"}.
{"User Management","Manajemen Pengguna"}.
{"Username:","Nama Pengguna:"}.
{"User ","Pengguna"}.
{"User","Pengguna"}.
{"Users are not allowed to register accounts so quickly","Pengguna tidak diperkenankan untuk mendaftar akun begitu cepat"}.
{"Users Last Activity","Aktifitas terakhir para pengguna"}.
{"Users","Pengguna"}.
{"Validate","Mengesahkan"}.
{"vCard User Search","vCard Pencarian Pengguna"}.
{"Virtual Hosts","Virtual Hosts"}.
{"Visitors are not allowed to change their nicknames in this room","Visitor tidak diperbolehkan untuk mengubah nama julukan di ruangan ini"}.
{"Visitors are not allowed to send messages to all occupants","Visitor tidak diperbolehkan untuk mengirim pesan ke semua penghuni"}.
{"Wednesday","Rabu"}.
{"When to send the last published item","Ketika untuk mengirim item terakhir yang dipublikasikan"}.
{"Whether to allow subscriptions","Apakah diperbolehkan untuk berlangganan"}.
{"You can later change your password using a Jabber client.","Anda dapat mengubah kata sandi anda dilain waktu dengan menggunakan klien Jabber."}.
{"You have been banned from this room","Anda telah diblokir dari ruangan ini"}.
{"You must fill in field \"Nickname\" in the form","Anda harus mengisi kolom \"Julukan\" dalam formulir"}.
{"You need a client that supports x:data and CAPTCHA to register","Anda memerlukan klien yang mendukung x:data dan CAPTCHA untuk mendaftar"}.
{"You need a client that supports x:data to register the nickname","Anda memerlukan klien yang mendukung x:data untuk mendaftar julukan"}.
{"You need an x:data capable client to configure mod_irc settings","Anda memerlukan x:data klien untuk mampu mengkonfigurasi pengaturan mod_irc"}.
{"You need an x:data capable client to configure room","Anda memerlukan x:data klien untuk dapat mengkonfigurasi ruangan"}.
{"You need an x:data capable client to search","Anda memerlukan x:data klien untuk melakukan pencarian"}.
{"Your active privacy list has denied the routing of this stanza.","Daftar privasi aktif Anda telah menolak routing ztanza ini"}.
{"Your contact offline message queue is full. The message has been discarded.","Kontak offline Anda pada antrian pesan sudah penuh. Pesan telah dibuang."}.
{"Your Jabber account was successfully created.","Jabber akun Anda telah sukses dibuat"}.
{"Your Jabber account was successfully deleted.","Jabber akun Anda berhasil dihapus."}.
{"Your messages to ~s are being blocked. To unblock them, visit ~s","Pesan Anda untuk ~s sedang diblokir. Untuk membuka blokir tersebut, kunjungi ~s"}.
ejabberd-2.1.11/src/msgs/th.po 0000664 0000000 0000000 00000202510 12240230175 012731 0 ustar msgid ""
msgstr ""
"Project-Id-Version: 2.1.0-alpha\n"
"Last-Translator: EQHO Communications (Thailand) Ltd. - http://www.eqho.com\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Language: Thai (ภาษาไทย)\n"
#: ejabberd_c2s.erl:424 ejabberd_c2s.erl:727
msgid "Use of STARTTLS required"
msgstr "ต้องใช้ STARTTLS"
#: ejabberd_c2s.erl:503
msgid "No resource provided"
msgstr "ไม่ได้ระบุข้อมูล"
#: ejabberd_c2s.erl:1197
msgid "Replaced by new connection"
msgstr "แทนที่ด้วยการเชื่อมต่อใหม่"
#: ejabberd_c2s.erl:1885
msgid "Your active privacy list has denied the routing of this stanza."
msgstr ""
#: ejabberd_captcha.erl:96 ejabberd_captcha.erl:152 ejabberd_captcha.erl:178
#, fuzzy
msgid "Enter the text you see"
msgstr "ป้อนพาธของไฟล์ข้อความ"
#: ejabberd_captcha.erl:101
msgid "Your messages to ~s are being blocked. To unblock them, visit ~s"
msgstr ""
#: ejabberd_captcha.erl:134
msgid "If you don't see the CAPTCHA image here, visit the web page."
msgstr ""
#: ejabberd_captcha.erl:146
msgid "CAPTCHA web page"
msgstr ""
#: ejabberd_captcha.erl:307
msgid "The CAPTCHA is valid."
msgstr ""
#: mod_adhoc.erl:95 mod_adhoc.erl:125 mod_adhoc.erl:143 mod_adhoc.erl:161
msgid "Commands"
msgstr "คำสั่ง"
#: mod_adhoc.erl:149 mod_adhoc.erl:243
msgid "Ping"
msgstr "Ping"
#: mod_adhoc.erl:260
msgid "Pong"
msgstr "Pong"
#: mod_announce.erl:507 mod_announce_odbc.erl:499
msgid "Really delete message of the day?"
msgstr "แน่ใจว่าต้องการลบข้อความของวันหรือไม่"
#: mod_announce.erl:515 mod_announce_odbc.erl:507 mod_configure.erl:1083
#: mod_configure.erl:1128
msgid "Subject"
msgstr "หัวเรื่อง"
#: mod_announce.erl:520 mod_announce_odbc.erl:512 mod_configure.erl:1088
#: mod_configure.erl:1133
msgid "Message body"
msgstr "เนื้อหาของข้อความ"
#: mod_announce.erl:600 mod_announce_odbc.erl:592
msgid "No body provided for announce message"
msgstr "ไม่ได้ป้อนเนื้อหาสำหรับข้อความที่ประกาศ"
#: mod_announce.erl:635 mod_announce_odbc.erl:627
msgid "Announcements"
msgstr "ประกาศ"
#: mod_announce.erl:637 mod_announce_odbc.erl:629
msgid "Send announcement to all users"
msgstr "ส่งประกาศถึงผู้ใช้ทั้งหมด"
#: mod_announce.erl:639 mod_announce_odbc.erl:631
msgid "Send announcement to all users on all hosts"
msgstr "ส่งประกาศถึงผู้ใช้ทั้งหมดบนโฮสต์ทั้งหมด"
#: mod_announce.erl:641 mod_announce_odbc.erl:633
msgid "Send announcement to all online users"
msgstr "ส่งประกาศถึงผู้ใช้ออนไลน์ทั้งหมด"
#: mod_announce.erl:643 mod_announce_odbc.erl:635 mod_configure.erl:1078
#: mod_configure.erl:1123
msgid "Send announcement to all online users on all hosts"
msgstr "ส่งประกาศถึงผู้ใช้ออนไลน์ทั้งหมดบนโฮสต์ทั้งหมด"
#: mod_announce.erl:645 mod_announce_odbc.erl:637
msgid "Set message of the day and send to online users"
msgstr "ตั้งค่าข้อความของวันและส่งถึงผู้ใช้ออนไลน์"
#: mod_announce.erl:647 mod_announce_odbc.erl:639
msgid "Set message of the day on all hosts and send to online users"
msgstr "ตั้งค่าข้อความของวันบนโฮสต์ทั้งหมดและส่งถึงผู้ใช้ออนไลน์"
#: mod_announce.erl:649 mod_announce_odbc.erl:641
msgid "Update message of the day (don't send)"
msgstr "อัพเดตข้อความของวัน (ไม่ต้องส่ง)"
#: mod_announce.erl:651 mod_announce_odbc.erl:643
msgid "Update message of the day on all hosts (don't send)"
msgstr "อัพเดตข้อความของวันบนโฮสต์ทั้งหมด (ไม่ต้องส่ง) "
#: mod_announce.erl:653 mod_announce_odbc.erl:645
msgid "Delete message of the day"
msgstr "ลบข้อความของวัน"
#: mod_announce.erl:655 mod_announce_odbc.erl:647
msgid "Delete message of the day on all hosts"
msgstr "ลบข้อความของวันบนโฮสต์ทั้งหมด"
#: mod_configure.erl:114 mod_configure.erl:274 mod_configure.erl:296
#: mod_configure.erl:498
msgid "Configuration"
msgstr "การกำหนดค่า"
#: mod_configure.erl:125 mod_configure.erl:576 web/ejabberd_web_admin.erl:1936
msgid "Database"
msgstr "ฐานข้อมูล"
#: mod_configure.erl:127 mod_configure.erl:595
msgid "Start Modules"
msgstr "เริ่มโมดูล"
#: mod_configure.erl:129 mod_configure.erl:596
msgid "Stop Modules"
msgstr "หยุดโมดูล"
#: mod_configure.erl:131 mod_configure.erl:604 web/ejabberd_web_admin.erl:1937
msgid "Backup"
msgstr "การสำรองข้อมูล "
#: mod_configure.erl:133 mod_configure.erl:605
msgid "Restore"
msgstr "การคืนค่า"
#: mod_configure.erl:135 mod_configure.erl:606
msgid "Dump to Text File"
msgstr "ถ่ายโอนข้อมูลไปยังไฟล์ข้อความ"
#: mod_configure.erl:137 mod_configure.erl:615
msgid "Import File"
msgstr "อิมพอร์ตไฟล์"
#: mod_configure.erl:139 mod_configure.erl:616
msgid "Import Directory"
msgstr "อิมพอร์ตไดเร็กทอรี"
#: mod_configure.erl:141 mod_configure.erl:581 mod_configure.erl:1057
msgid "Restart Service"
msgstr "เริ่มต้นการบริการใหม่อีกครั้ง"
#: mod_configure.erl:143 mod_configure.erl:582 mod_configure.erl:1102
msgid "Shut Down Service"
msgstr "ปิดการบริการ"
#: mod_configure.erl:145 mod_configure.erl:518 mod_configure.erl:1197
#: web/ejabberd_web_admin.erl:1527
msgid "Add User"
msgstr "เพิ่มผู้ใช้"
#: mod_configure.erl:147 mod_configure.erl:519 mod_configure.erl:1219
msgid "Delete User"
msgstr "ลบผู้ใช้"
#: mod_configure.erl:149 mod_configure.erl:520 mod_configure.erl:1231
msgid "End User Session"
msgstr "สิ้นสุดเซสชันของผู้ใช้"
#: mod_configure.erl:151 mod_configure.erl:521 mod_configure.erl:1243
#: mod_configure.erl:1255
msgid "Get User Password"
msgstr "ขอรับรหัสผ่านของผู้ใช้"
#: mod_configure.erl:153 mod_configure.erl:522
msgid "Change User Password"
msgstr "เปลี่ยนรหัสผ่านของผู้ใช้"
#: mod_configure.erl:155 mod_configure.erl:523 mod_configure.erl:1272
msgid "Get User Last Login Time"
msgstr "แสดงเวลาเข้าสู่ระบบครั้งล่าสุดของผู้ใช้"
#: mod_configure.erl:157 mod_configure.erl:524 mod_configure.erl:1284
msgid "Get User Statistics"
msgstr "แสดงสถิติของผู้ใช้"
#: mod_configure.erl:159 mod_configure.erl:525
msgid "Get Number of Registered Users"
msgstr "แสดงจำนวนผู้ใช้ที่ลงทะเบียน"
#: mod_configure.erl:161 mod_configure.erl:526
msgid "Get Number of Online Users"
msgstr "แสดงจำนวนผู้ใช้ออนไลน์"
#: mod_configure.erl:163 mod_configure.erl:509 web/ejabberd_web_admin.erl:831
#: web/ejabberd_web_admin.erl:872
msgid "Access Control Lists"
msgstr "รายการควบคุมการเข้าถึง"
#: mod_configure.erl:165 mod_configure.erl:510 web/ejabberd_web_admin.erl:940
#: web/ejabberd_web_admin.erl:976
msgid "Access Rules"
msgstr "กฎการเข้าถึง"
#: mod_configure.erl:297 mod_configure.erl:499
msgid "User Management"
msgstr "การจัดการผู้ใช้"
#: mod_configure.erl:500 web/ejabberd_web_admin.erl:1058
#: web/ejabberd_web_admin.erl:1462
msgid "Online Users"
msgstr "ผู้ใช้ออนไลน์"
#: mod_configure.erl:501
msgid "All Users"
msgstr "ผู้ใช้ทั้งหมด"
#: mod_configure.erl:502
msgid "Outgoing s2s Connections"
msgstr "การเชื่อมต่อ s2s ขาออก"
#: mod_configure.erl:503 web/ejabberd_web_admin.erl:1907
msgid "Running Nodes"
msgstr "โหนดที่ทำงาน"
#: mod_configure.erl:504 web/ejabberd_web_admin.erl:1909
msgid "Stopped Nodes"
msgstr "โหนดที่หยุด"
#: mod_configure.erl:577 mod_configure.erl:587 web/ejabberd_web_admin.erl:1953
msgid "Modules"
msgstr "โมดูล"
#: mod_configure.erl:578
msgid "Backup Management"
msgstr "การจัดการข้อมูลสำรอง"
#: mod_configure.erl:579
msgid "Import Users From jabberd14 Spool Files"
msgstr "อิมพอร์ตผู้ใช้จากไฟล์เก็บพักข้อมูล jabberd14"
#: mod_configure.erl:699
msgid "To ~s"
msgstr "ถึง ~s"
#: mod_configure.erl:717
msgid "From ~s"
msgstr "จาก ~s"
#: mod_configure.erl:913
msgid "Database Tables Configuration at "
msgstr "การกำหนดค่าตารางฐานข้อมูลที่"
#: mod_configure.erl:918
msgid "Choose storage type of tables"
msgstr "เลือกชนิดการจัดเก็บของตาราง"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "Disc only copy"
msgstr "คัดลอกเฉพาะดิสก์"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "RAM and disc copy"
msgstr "คัดลอก RAM และดิสก์"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "RAM copy"
msgstr "คัดลอก RAM"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "Remote copy"
msgstr "คัดลอกระยะไกล"
#: mod_configure.erl:950
msgid "Stop Modules at "
msgstr "หยุดโมดูลที่"
#: mod_configure.erl:954
msgid "Choose modules to stop"
msgstr "เลือกโมดูลเพื่อหยุดการทำงาน"
#: mod_configure.erl:969
msgid "Start Modules at "
msgstr "เริ่มโมดูลที่"
#: mod_configure.erl:973
msgid "Enter list of {Module, [Options]}"
msgstr "ป้อนรายการของ {โมดูล, [ตัวเลือก]}"
#: mod_configure.erl:974
msgid "List of modules to start"
msgstr "รายการของโมดูลที่จะเริ่มการทำงาน"
#: mod_configure.erl:983
msgid "Backup to File at "
msgstr "สำรองไฟล์ข้อมูลที่"
#: mod_configure.erl:987 mod_configure.erl:1001
msgid "Enter path to backup file"
msgstr "ป้อนพาธเพื่อสำรองไฟล์ข้อมูล"
#: mod_configure.erl:988 mod_configure.erl:1002 mod_configure.erl:1016
#: mod_configure.erl:1030
msgid "Path to File"
msgstr "พาธของไฟล์ข้อมูล"
#: mod_configure.erl:997
msgid "Restore Backup from File at "
msgstr "คืนค่าการสำรองข้อมูลจากไฟล์ที่"
#: mod_configure.erl:1011
msgid "Dump Backup to Text File at "
msgstr "ถ่ายโอนการสำรองข้อมูลไปยังไฟล์ข้อความที่"
#: mod_configure.erl:1015
msgid "Enter path to text file"
msgstr "ป้อนพาธของไฟล์ข้อความ"
#: mod_configure.erl:1025
msgid "Import User from File at "
msgstr "อิมพอร์ตผู้ใช้จากไฟล์ที่"
#: mod_configure.erl:1029
msgid "Enter path to jabberd14 spool file"
msgstr "ป้อนพาธไปยังไฟล์เก็บพักข้อมูล jabberd14"
#: mod_configure.erl:1039
msgid "Import Users from Dir at "
msgstr "อิมพอร์ตผู้ใช้จาก Dir ที่"
#: mod_configure.erl:1043
msgid "Enter path to jabberd14 spool dir"
msgstr "ป้อนพาธไปยัง jabberd14 spool dir"
#: mod_configure.erl:1044
msgid "Path to Dir"
msgstr "พาธไปยัง Dir"
#: mod_configure.erl:1060 mod_configure.erl:1105
msgid "Time delay"
msgstr "การหน่วงเวลา"
#: mod_configure.erl:1143
msgid "Access Control List Configuration"
msgstr "การกำหนดค่ารายการควบคุมการเข้าถึง"
#: mod_configure.erl:1147
msgid "Access control lists"
msgstr "รายการควบคุมการเข้าถึง"
#: mod_configure.erl:1171
msgid "Access Configuration"
msgstr "การกำหนดค่าการเข้าถึง"
#: mod_configure.erl:1175
msgid "Access rules"
msgstr "กฎการเข้าถึง"
#: mod_configure.erl:1200 mod_configure.erl:1222 mod_configure.erl:1234
#: mod_configure.erl:1246 mod_configure.erl:1258 mod_configure.erl:1275
#: mod_configure.erl:1287 mod_configure.erl:1650 mod_configure.erl:1700
#: mod_configure.erl:1721 mod_roster.erl:943 mod_roster_odbc.erl:1060
#: mod_vcard.erl:472 mod_vcard_ldap.erl:554 mod_vcard_odbc.erl:448
msgid "Jabber ID"
msgstr "Jabber ID"
#: mod_configure.erl:1205 mod_configure.erl:1263 mod_configure.erl:1651
#: mod_configure.erl:1863 mod_muc/mod_muc_room.erl:3224 mod_register.erl:235
#: web/ejabberd_web_admin.erl:1520
msgid "Password"
msgstr "รหัสผ่าน"
#: mod_configure.erl:1210
msgid "Password Verification"
msgstr "การตรวจสอบรหัสผ่าน"
#: mod_configure.erl:1301
msgid "Number of registered users"
msgstr "จำนวนผู้ใช้ที่ลงทะเบียน"
#: mod_configure.erl:1315
msgid "Number of online users"
msgstr "จำนวนผู้ใช้ออนไลน์"
#: mod_configure.erl:1682 web/ejabberd_web_admin.erl:1588
#: web/ejabberd_web_admin.erl:1743
msgid "Never"
msgstr "ไม่เคย"
#: mod_configure.erl:1696 web/ejabberd_web_admin.erl:1601
#: web/ejabberd_web_admin.erl:1756
msgid "Online"
msgstr "ออนไลน์"
#: mod_configure.erl:1701
msgid "Last login"
msgstr "การเข้าสู่ระบบครั้งล่าสุด"
#: mod_configure.erl:1722
msgid "Roster size"
msgstr "ขนาดของบัญชีรายชื่อ"
#: mod_configure.erl:1723
msgid "IP addresses"
msgstr "ที่อยู่ IP"
#: mod_configure.erl:1724
msgid "Resources"
msgstr "ทรัพยากร"
#: mod_configure.erl:1850
msgid "Administration of "
msgstr "การดูแล "
#: mod_configure.erl:1853
msgid "Action on user"
msgstr "การดำเนินการกับผู้ใช้"
#: mod_configure.erl:1857
msgid "Edit Properties"
msgstr "แก้ไขคุณสมบัติ"
#: mod_configure.erl:1860 web/ejabberd_web_admin.erl:1769
msgid "Remove User"
msgstr "ลบผู้ใช้"
#: mod_irc/mod_irc.erl:201 mod_irc/mod_irc_odbc.erl:196
#: mod_muc/mod_muc.erl:336 mod_muc/mod_muc_odbc.erl:342
msgid "Access denied by service policy"
msgstr "การเข้าถึงถูกปฏิเสธโดยนโยบายการบริการ"
#: mod_irc/mod_irc.erl:401 mod_irc/mod_irc_odbc.erl:398
msgid "IRC Transport"
msgstr "การส่ง IRC"
#: mod_irc/mod_irc.erl:428 mod_irc/mod_irc_odbc.erl:425
msgid "ejabberd IRC module"
msgstr "ejabberd IRC module"
#: mod_irc/mod_irc.erl:559 mod_irc/mod_irc_odbc.erl:568
msgid "You need an x:data capable client to configure mod_irc settings"
msgstr "คุณต้องใช้ไคลเอ็นต์ที่รองรับ x:data เพื่อกำหนดการตั้งค่า mod_irc"
#: mod_irc/mod_irc.erl:566 mod_irc/mod_irc_odbc.erl:575
msgid "Registration in mod_irc for "
msgstr "การลงทะเบียนใน mod_irc สำหรับ"
#: mod_irc/mod_irc.erl:571 mod_irc/mod_irc_odbc.erl:580
#, fuzzy
msgid ""
"Enter username, encodings, ports and passwords you wish to use for "
"connecting to IRC servers"
msgstr "ป้อนชื่อผู้ใช้และการเข้ารหัสที่คุณต้องการใช้สำหรับเชื่อมต่อกับเซิร์ฟเวอร์ IRC"
#: mod_irc/mod_irc.erl:576 mod_irc/mod_irc_odbc.erl:585
msgid "IRC Username"
msgstr "ชื่อผู้ใช้ IRC"
#: mod_irc/mod_irc.erl:586 mod_irc/mod_irc_odbc.erl:595
#, fuzzy
msgid ""
"If you want to specify different ports, passwords, encodings for IRC "
"servers, fill this list with values in format '{\"irc server\", \"encoding"
"\", port, \"password\"}'. By default this service use \"~s\" encoding, port "
"~p, empty password."
msgstr ""
"ถ้าคุณต้องการระบุการเข้ารหัสที่ต่างกันสำหรับเซิร์ฟเวอร์ IRC ให้กรอกค่าโดยใช้รูปแบบ '{\"irc "
"server\", \"encoding\"}' ลงในรายการ การบริการนี้ใช้การเข้ารหัสในรูปแบบ \"~s\" "
"โดยค่าดีฟอลต์ "
#: mod_irc/mod_irc.erl:598 mod_irc/mod_irc_odbc.erl:607
#, fuzzy
msgid ""
"Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef."
"net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."
msgstr ""
"ตัวอย่าง: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", "
"\"iso8859-1\"}]."
#: mod_irc/mod_irc.erl:603 mod_irc/mod_irc_odbc.erl:612
msgid "Connections parameters"
msgstr ""
#: mod_irc/mod_irc.erl:728 mod_irc/mod_irc_odbc.erl:757
msgid "Join IRC channel"
msgstr ""
#: mod_irc/mod_irc.erl:732 mod_irc/mod_irc_odbc.erl:761
msgid "IRC channel (don't put the first #)"
msgstr ""
#: mod_irc/mod_irc.erl:737 mod_irc/mod_irc_odbc.erl:766
#, fuzzy
msgid "IRC server"
msgstr "ชื่อผู้ใช้ IRC"
#: mod_irc/mod_irc.erl:770 mod_irc/mod_irc.erl:774
#: mod_irc/mod_irc_odbc.erl:799 mod_irc/mod_irc_odbc.erl:803
msgid "Join the IRC channel here."
msgstr ""
#: mod_irc/mod_irc.erl:778 mod_irc/mod_irc_odbc.erl:807
msgid "Join the IRC channel in this Jabber ID: ~s"
msgstr ""
#: mod_irc/mod_irc.erl:863 mod_irc/mod_irc_odbc.erl:904
msgid "IRC settings"
msgstr ""
#: mod_irc/mod_irc.erl:868 mod_irc/mod_irc_odbc.erl:909
#, fuzzy
msgid ""
"Enter username and encodings you wish to use for connecting to IRC servers. "
"Press 'Next' to get more fields to fill in. Press 'Complete' to save "
"settings."
msgstr "ป้อนชื่อผู้ใช้และการเข้ารหัสที่คุณต้องการใช้สำหรับเชื่อมต่อกับเซิร์ฟเวอร์ IRC"
#: mod_irc/mod_irc.erl:874 mod_irc/mod_irc_odbc.erl:915
#, fuzzy
msgid "IRC username"
msgstr "ชื่อผู้ใช้ IRC"
#: mod_irc/mod_irc.erl:923 mod_irc/mod_irc_odbc.erl:964
#, fuzzy
msgid "Password ~b"
msgstr "รหัสผ่าน"
#: mod_irc/mod_irc.erl:928 mod_irc/mod_irc_odbc.erl:969
#, fuzzy
msgid "Port ~b"
msgstr "พอร์ท"
#: mod_irc/mod_irc.erl:933 mod_irc/mod_irc_odbc.erl:974
msgid "Encoding for server ~b"
msgstr ""
#: mod_irc/mod_irc.erl:942 mod_irc/mod_irc_odbc.erl:983
msgid "Server ~b"
msgstr ""
#: mod_muc/mod_muc.erl:449 mod_muc/mod_muc_odbc.erl:456
msgid "Only service administrators are allowed to send service messages"
msgstr "ผู้ดูแลด้านการบริการเท่านั้นที่ได้รับอนุญาตให้ส่งข้อความการบริการ"
#: mod_muc/mod_muc.erl:493 mod_muc/mod_muc_odbc.erl:500
msgid "Room creation is denied by service policy"
msgstr "การสร้างห้องสนทนาถูกปฏิเสธโดยนโยบายการบริการ"
#: mod_muc/mod_muc.erl:500 mod_muc/mod_muc_odbc.erl:507
msgid "Conference room does not exist"
msgstr "ไม่มีห้องประชุม"
#: mod_muc/mod_muc.erl:582 mod_muc/mod_muc_odbc.erl:595
msgid "Chatrooms"
msgstr "ห้องสนทนา"
#: mod_muc/mod_muc.erl:712 mod_muc/mod_muc_odbc.erl:729
#, fuzzy
msgid "You need a client that supports x:data to register the nickname"
msgstr "คุณต้องใช้ไคลเอ็นต์ที่รองรับ x:data เพื่อลงทะเบียนชื่อเล่น"
#: mod_muc/mod_muc.erl:718 mod_muc/mod_muc_odbc.erl:735
msgid "Nickname Registration at "
msgstr "การลงทะเบียนชื่อเล่นที่ "
#: mod_muc/mod_muc.erl:722 mod_muc/mod_muc_odbc.erl:739
msgid "Enter nickname you want to register"
msgstr "ป้อนชื่อเล่นที่คุณต้องการลงทะเบียน"
#: mod_muc/mod_muc.erl:723 mod_muc/mod_muc_odbc.erl:740
#: mod_muc/mod_muc_room.erl:3810 mod_roster.erl:944 mod_roster_odbc.erl:1061
#: mod_vcard.erl:364 mod_vcard.erl:477 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:453
msgid "Nickname"
msgstr "ชื่อเล่น"
#: mod_muc/mod_muc.erl:762 mod_muc/mod_muc_odbc.erl:784
#: mod_muc/mod_muc_room.erl:1064 mod_muc/mod_muc_room.erl:1787
#, fuzzy
msgid "That nickname is registered by another person"
msgstr "ชื่อเล่นถูกลงทะเบียนใช้งานโดยบุคคลอื่น"
#: mod_muc/mod_muc.erl:788 mod_muc/mod_muc_odbc.erl:811
msgid "You must fill in field \"Nickname\" in the form"
msgstr "คุณต้องกรอกฟิลด์ \"Nickname\" ในแบบฟอร์ม"
#: mod_muc/mod_muc.erl:808 mod_muc/mod_muc_odbc.erl:831
msgid "ejabberd MUC module"
msgstr "ejabberd MUC module"
#: mod_muc/mod_muc_log.erl:374 mod_muc/mod_muc_log.erl:381
msgid "Chatroom configuration modified"
msgstr "มีการปรับเปลี่ยนการกำหนดค่าของห้องสนทนา"
#: mod_muc/mod_muc_log.erl:384
msgid "joins the room"
msgstr "เข้าห้องสนทนานี้"
#: mod_muc/mod_muc_log.erl:387 mod_muc/mod_muc_log.erl:390
msgid "leaves the room"
msgstr "ออกจากห้อง"
#: mod_muc/mod_muc_log.erl:393 mod_muc/mod_muc_log.erl:396
msgid "has been banned"
msgstr "ถูกสั่งห้าม"
#: mod_muc/mod_muc_log.erl:399 mod_muc/mod_muc_log.erl:402
msgid "has been kicked"
msgstr "ถูกไล่ออก"
#: mod_muc/mod_muc_log.erl:405
msgid "has been kicked because of an affiliation change"
msgstr ""
#: mod_muc/mod_muc_log.erl:408
msgid "has been kicked because the room has been changed to members-only"
msgstr ""
#: mod_muc/mod_muc_log.erl:411
msgid "has been kicked because of a system shutdown"
msgstr ""
#: mod_muc/mod_muc_log.erl:414
msgid "is now known as"
msgstr "ซึ่งรู้จักกันในชื่อ"
#: mod_muc/mod_muc_log.erl:417 mod_muc/mod_muc_log.erl:688
#: mod_muc/mod_muc_room.erl:2393
msgid " has set the subject to: "
msgstr " ตั้งหัวข้อว่า: "
#: mod_muc/mod_muc_log.erl:452
#, fuzzy
msgid "Chatroom is created"
msgstr "ห้องสนทนา"
#: mod_muc/mod_muc_log.erl:453
#, fuzzy
msgid "Chatroom is destroyed"
msgstr "ห้องสนทนา"
#: mod_muc/mod_muc_log.erl:454
#, fuzzy
msgid "Chatroom is started"
msgstr "ห้องสนทนา"
#: mod_muc/mod_muc_log.erl:455
#, fuzzy
msgid "Chatroom is stopped"
msgstr "ห้องสนทนา"
#: mod_muc/mod_muc_log.erl:459
msgid "Monday"
msgstr "วันจันทร์"
#: mod_muc/mod_muc_log.erl:460
msgid "Tuesday"
msgstr "วันอังคาร"
#: mod_muc/mod_muc_log.erl:461
msgid "Wednesday"
msgstr "วันพุธ"
#: mod_muc/mod_muc_log.erl:462
msgid "Thursday"
msgstr "วันพฤหัสบดี"
#: mod_muc/mod_muc_log.erl:463
msgid "Friday"
msgstr "วันศุกร์"
#: mod_muc/mod_muc_log.erl:464
msgid "Saturday"
msgstr "วันเสาร์"
#: mod_muc/mod_muc_log.erl:465
msgid "Sunday"
msgstr "วันอาทิตย์"
#: mod_muc/mod_muc_log.erl:469
msgid "January"
msgstr "มกราคม"
#: mod_muc/mod_muc_log.erl:470
msgid "February"
msgstr "กุมภาพันธ์"
#: mod_muc/mod_muc_log.erl:471
msgid "March"
msgstr "มีนาคม"
#: mod_muc/mod_muc_log.erl:472
msgid "April"
msgstr "เมษายน"
#: mod_muc/mod_muc_log.erl:473
msgid "May"
msgstr "พฤษภาคม"
#: mod_muc/mod_muc_log.erl:474
msgid "June"
msgstr "มิถุนายน"
#: mod_muc/mod_muc_log.erl:475
msgid "July"
msgstr "กรกฎาคม"
#: mod_muc/mod_muc_log.erl:476
msgid "August"
msgstr "สิงหาคม"
#: mod_muc/mod_muc_log.erl:477
msgid "September"
msgstr "กันยายน"
#: mod_muc/mod_muc_log.erl:478
msgid "October"
msgstr "ตุลาคม"
#: mod_muc/mod_muc_log.erl:479
msgid "November"
msgstr "พฤศจิกายน"
#: mod_muc/mod_muc_log.erl:480
msgid "December"
msgstr "ธันวาคม"
#: mod_muc/mod_muc_log.erl:750
msgid "Room Configuration"
msgstr "การกำหนดค่าห้องสนทนา"
#: mod_muc/mod_muc_log.erl:759
#, fuzzy
msgid "Room Occupants"
msgstr "จำนวนผู้ครอบครองห้อง"
#: mod_muc/mod_muc_room.erl:174
msgid "Traffic rate limit is exceeded"
msgstr "อัตราของปริมาณการเข้าใช้เกินขีดจำกัด"
#: mod_muc/mod_muc_room.erl:246
msgid ""
"This participant is kicked from the room because he sent an error message"
msgstr ""
#: mod_muc/mod_muc_room.erl:255
msgid "It is not allowed to send private messages to the conference"
msgstr "ไม่อนุญาตให้ส่งข้อความส่วนตัวไปยังห้องประชุม"
#: mod_muc/mod_muc_room.erl:332
msgid "Please, wait for a while before sending new voice request"
msgstr ""
#: mod_muc/mod_muc_room.erl:347
msgid "Voice requests are disabled in this conference"
msgstr ""
#: mod_muc/mod_muc_room.erl:364
msgid "Failed to extract JID from your voice request approval"
msgstr ""
#: mod_muc/mod_muc_room.erl:393
msgid "Only moderators can approve voice requests"
msgstr ""
#: mod_muc/mod_muc_room.erl:408
msgid "Improper message type"
msgstr "ประเภทข้อความไม่เหมาะสม"
#: mod_muc/mod_muc_room.erl:518
msgid ""
"This participant is kicked from the room because he sent an error message to "
"another participant"
msgstr ""
#: mod_muc/mod_muc_room.erl:531
msgid "It is not allowed to send private messages of type \"groupchat\""
msgstr "ไม่อนุญาตให้ส่งข้อความส่วนตัวไปยัง \"กลุ่มสนทนา\""
#: mod_muc/mod_muc_room.erl:543 mod_muc/mod_muc_room.erl:611
msgid "Recipient is not in the conference room"
msgstr "ผู้รับไม่ได้อยู่ในห้องประชุม"
#: mod_muc/mod_muc_room.erl:564 mod_muc/mod_muc_room.erl:585
#, fuzzy
msgid "It is not allowed to send private messages"
msgstr "ไม่อนุญาตให้ส่งข้อความส่วนตัวไปยังห้องประชุม"
#: mod_muc/mod_muc_room.erl:576 mod_muc/mod_muc_room.erl:956
#: mod_muc/mod_muc_room.erl:4040
msgid "Only occupants are allowed to send messages to the conference"
msgstr "ผู้ครอบครองห้องเท่านั้นที่ได้รับอนุญาตให้ส่งข้อความไปยังห้องประชุม"
#: mod_muc/mod_muc_room.erl:634
msgid "Only occupants are allowed to send queries to the conference"
msgstr "ผู้ครอบครองห้องเท่านั้นที่ได้รับอนุญาตให้ส่งกระทู้ถามไปยังห้องประชุม"
#: mod_muc/mod_muc_room.erl:646
msgid "Queries to the conference members are not allowed in this room"
msgstr "ห้องนี้ไม่อนุญาตให้ส่งกระทู้ถามถึงสมาชิกในห้องประชุม"
#: mod_muc/mod_muc_room.erl:932
#, fuzzy
msgid ""
"Only moderators and participants are allowed to change the subject in this "
"room"
msgstr "ผู้ดูแลการสนทนาและผู้เข้าร่วมเท่านั้นที่ได้รับอนุญาตให้เปลี่ยนหัวข้อในห้องนี้"
#: mod_muc/mod_muc_room.erl:937
#, fuzzy
msgid "Only moderators are allowed to change the subject in this room"
msgstr "ผู้ดูแลการสนทนาเท่านั้นที่ได้รับอนุญาตให้เปลี่ยนหัวข้อในห้องนี้"
#: mod_muc/mod_muc_room.erl:947
msgid "Visitors are not allowed to send messages to all occupants"
msgstr "ผู้เยี่ยมเยือนไม่ได้รับอนุญาตให้ส่งข้อความถึงผู้ครอบครองห้องทั้งหมด"
#: mod_muc/mod_muc_room.erl:1021
msgid ""
"This participant is kicked from the room because he sent an error presence"
msgstr ""
#: mod_muc/mod_muc_room.erl:1040
#, fuzzy
msgid "Visitors are not allowed to change their nicknames in this room"
msgstr "ผู้ดูแลการสนทนาเท่านั้นที่ได้รับอนุญาตให้เปลี่ยนหัวข้อในห้องนี้"
#: mod_muc/mod_muc_room.erl:1053 mod_muc/mod_muc_room.erl:1779
#, fuzzy
msgid "That nickname is already in use by another occupant"
msgstr "ชื่อเล่นถูกใช้งานอยู่โดยผู้ครอบครองห้อง"
#: mod_muc/mod_muc_room.erl:1768
msgid "You have been banned from this room"
msgstr "คุณถูกสั่งห้ามไมให้เข้าห้องนี้"
#: mod_muc/mod_muc_room.erl:1771
#, fuzzy
msgid "Membership is required to enter this room"
msgstr "ต้องเป็นสมาชิกจึงจะสามารถเข้าห้องนี้ได้"
#: mod_muc/mod_muc_room.erl:1807
msgid "This room is not anonymous"
msgstr "ห้องนี้ไม่ปิดบังชื่อ"
#: mod_muc/mod_muc_room.erl:1833
#, fuzzy
msgid "A password is required to enter this room"
msgstr "ต้องใส่รหัสผ่านเพื่อเข้าห้องนี้"
#: mod_muc/mod_muc_room.erl:1855 mod_register.erl:246
msgid "Too many CAPTCHA requests"
msgstr ""
#: mod_muc/mod_muc_room.erl:1864 mod_register.erl:251
msgid "Unable to generate a CAPTCHA"
msgstr ""
#: mod_muc/mod_muc_room.erl:1874
msgid "Incorrect password"
msgstr "รหัสผ่านไม่ถูกต้อง"
#: mod_muc/mod_muc_room.erl:2448
msgid "Administrator privileges required"
msgstr "ต้องมีสิทธิพิเศษของผู้ดูแลระบบ"
#: mod_muc/mod_muc_room.erl:2463
msgid "Moderator privileges required"
msgstr "ต้องมีสิทธิพิเศษของผู้ดูแลการสนทนา"
#: mod_muc/mod_muc_room.erl:2619
msgid "Jabber ID ~s is invalid"
msgstr "Jabber ID ~s ไม่ถูกต้อง"
#: mod_muc/mod_muc_room.erl:2633
msgid "Nickname ~s does not exist in the room"
msgstr "ไม่มีชื่อเล่น ~s อยู่ในห้องนี้"
#: mod_muc/mod_muc_room.erl:2659 mod_muc/mod_muc_room.erl:3049
msgid "Invalid affiliation: ~s"
msgstr "การเข้าร่วมที่ไม่ถูกต้อง: ~s"
#: mod_muc/mod_muc_room.erl:2713
msgid "Invalid role: ~s"
msgstr "บทบาทไม่ถูกต้อง: ~s"
#: mod_muc/mod_muc_room.erl:3026 mod_muc/mod_muc_room.erl:3062
msgid "Owner privileges required"
msgstr "ต้องมีสิทธิพิเศษของเจ้าของ"
#: mod_muc/mod_muc_room.erl:3195
#, fuzzy
msgid "Configuration of room ~s"
msgstr "การกำหนดค่าสำหรับ "
#: mod_muc/mod_muc_room.erl:3200
msgid "Room title"
msgstr "ชื่อห้อง"
#: mod_muc/mod_muc_room.erl:3203 mod_muc/mod_muc_room.erl:3692
#, fuzzy
msgid "Room description"
msgstr "รายละเอียด:"
#: mod_muc/mod_muc_room.erl:3210
msgid "Make room persistent"
msgstr "สร้างเป็นห้องถาวร"
#: mod_muc/mod_muc_room.erl:3215
msgid "Make room public searchable"
msgstr "สร้างเป็นห้องที่บุคคลทั่วไปสามารถค้นหาได้"
#: mod_muc/mod_muc_room.erl:3218
msgid "Make participants list public"
msgstr "สร้างรายการผู้เข้าร่วมสำหรับใช้งานโดยบุคคลทั่วไป"
#: mod_muc/mod_muc_room.erl:3221
msgid "Make room password protected"
msgstr "สร้างห้องที่มีการป้องกันด้วยรหัสผ่าน"
#: mod_muc/mod_muc_room.erl:3232
msgid "Maximum Number of Occupants"
msgstr "จำนวนผู้ครอบครองห้องสูงสุด"
#: mod_muc/mod_muc_room.erl:3239
msgid "No limit"
msgstr "ไม่จำกัด"
#: mod_muc/mod_muc_room.erl:3250
msgid "Present real Jabber IDs to"
msgstr "แสดง Jabber IDs ที่ถูกต้องแก่"
#: mod_muc/mod_muc_room.erl:3258 mod_muc/mod_muc_room.erl:3292
msgid "moderators only"
msgstr "สำหรับผู้ดูแลการสนทนาเท่านั้น"
#: mod_muc/mod_muc_room.erl:3260 mod_muc/mod_muc_room.erl:3294
msgid "anyone"
msgstr "ทุกคน"
#: mod_muc/mod_muc_room.erl:3262
msgid "Make room members-only"
msgstr "สร้างห้องสำหรับสมาชิกเท่านั้น"
#: mod_muc/mod_muc_room.erl:3265
#, fuzzy
msgid "Make room moderated"
msgstr "สร้างเป็นห้องถาวร"
#: mod_muc/mod_muc_room.erl:3268
msgid "Default users as participants"
msgstr "ผู้ใช้เริ่มต้นเป็นผู้เข้าร่วม"
#: mod_muc/mod_muc_room.erl:3271
#, fuzzy
msgid "Allow users to change the subject"
msgstr "อนุญาตให้ผู้ใช้เปลี่ยนหัวข้อได้"
#: mod_muc/mod_muc_room.erl:3274
msgid "Allow users to send private messages"
msgstr "อนุญาตให้ผู้ใช้ส่งข้อความส่วนตัว"
#: mod_muc/mod_muc_room.erl:3279
#, fuzzy
msgid "Allow visitors to send private messages to"
msgstr "อนุญาตให้ผู้ใช้ส่งข้อความส่วนตัว"
#: mod_muc/mod_muc_room.erl:3290
msgid "nobody"
msgstr ""
#: mod_muc/mod_muc_room.erl:3296
msgid "Allow users to query other users"
msgstr "อนุญาตให้ผู้ใช้ถามคำถามกับผู้ใช้คนอื่นๆ ได้"
#: mod_muc/mod_muc_room.erl:3299
msgid "Allow users to send invites"
msgstr "อนุญาตให้ผู้ใช้ส่งคำเชิญถึงกันได้"
#: mod_muc/mod_muc_room.erl:3302
#, fuzzy
msgid "Allow visitors to send status text in presence updates"
msgstr "อนุญาตให้ผู้ใช้ส่งข้อความส่วนตัว"
#: mod_muc/mod_muc_room.erl:3305
#, fuzzy
msgid "Allow visitors to change nickname"
msgstr "อนุญาตให้ผู้ใช้เปลี่ยนหัวข้อได้"
#: mod_muc/mod_muc_room.erl:3308
#, fuzzy
msgid "Allow visitors to send voice requests"
msgstr "อนุญาตให้ผู้ใช้ส่งคำเชิญถึงกันได้"
#: mod_muc/mod_muc_room.erl:3311
msgid "Minimum interval between voice requests (in seconds)"
msgstr ""
#: mod_muc/mod_muc_room.erl:3317
#, fuzzy
msgid "Make room CAPTCHA protected"
msgstr "สร้างห้องที่มีการป้องกันด้วยรหัสผ่าน"
#: mod_muc/mod_muc_room.erl:3322
msgid "Exclude Jabber IDs from CAPTCHA challenge"
msgstr ""
#: mod_muc/mod_muc_room.erl:3329
msgid "Enable logging"
msgstr "เปิดใช้งานการบันทึก"
#: mod_muc/mod_muc_room.erl:3337
msgid "You need an x:data capable client to configure room"
msgstr "คุณต้องใช้ไคลเอ็นต์ที่รองรับ x:data เพื่อกำหนดค่าห้องสนทนา "
#: mod_muc/mod_muc_room.erl:3694
msgid "Number of occupants"
msgstr "จำนวนผู้ครอบครองห้อง"
#: mod_muc/mod_muc_room.erl:3750
msgid "private, "
msgstr "ส่วนตัว, "
#: mod_muc/mod_muc_room.erl:3799
msgid "Voice request"
msgstr ""
#: mod_muc/mod_muc_room.erl:3803
msgid "Either approve or decline the voice request."
msgstr ""
#: mod_muc/mod_muc_room.erl:3809
#, fuzzy
msgid "User JID"
msgstr "ผู้ใช้"
#: mod_muc/mod_muc_room.erl:3811
msgid "Grant voice to this person?"
msgstr ""
#: mod_muc/mod_muc_room.erl:3960
msgid "~s invites you to the room ~s"
msgstr "~s เชิญคุณเข้าร่วมสนทนาในห้อง ~s"
#: mod_muc/mod_muc_room.erl:3969
msgid "the password is"
msgstr "รหัสผ่านคือ"
#: mod_offline.erl:510 mod_offline_odbc.erl:352
msgid ""
"Your contact offline message queue is full. The message has been discarded."
msgstr "ลำดับข้อความออฟไลน์ของผู้ที่ติดต่อของคุณเต็มแล้ว ข้อความถูกลบทิ้งแล้ว"
#: mod_offline.erl:560 mod_offline_odbc.erl:408
msgid "~s's Offline Messages Queue"
msgstr "~s's ลำดับข้อความออฟไลน์"
#: mod_offline.erl:563 mod_offline_odbc.erl:411 mod_roster.erl:987
#: mod_roster_odbc.erl:1104 mod_shared_roster.erl:901
#: mod_shared_roster.erl:1010 mod_shared_roster_odbc.erl:930
#: mod_shared_roster_odbc.erl:1039 web/ejabberd_web_admin.erl:833
#: web/ejabberd_web_admin.erl:874 web/ejabberd_web_admin.erl:942
#: web/ejabberd_web_admin.erl:978 web/ejabberd_web_admin.erl:1019
#: web/ejabberd_web_admin.erl:1508 web/ejabberd_web_admin.erl:1760
#: web/ejabberd_web_admin.erl:1931 web/ejabberd_web_admin.erl:1963
#: web/ejabberd_web_admin.erl:2031 web/ejabberd_web_admin.erl:2135
#: web/ejabberd_web_admin.erl:2160 web/ejabberd_web_admin.erl:2248
msgid "Submitted"
msgstr "ส่งแล้ว"
#: mod_offline.erl:571
msgid "Time"
msgstr "เวลา"
#: mod_offline.erl:572
msgid "From"
msgstr "จาก"
#: mod_offline.erl:573
msgid "To"
msgstr "ถึง"
#: mod_offline.erl:574 mod_offline_odbc.erl:419
msgid "Packet"
msgstr "แพ็กเก็ต"
#: mod_offline.erl:587 mod_offline_odbc.erl:432 mod_shared_roster.erl:908
#: mod_shared_roster_odbc.erl:937 web/ejabberd_web_admin.erl:882
#: web/ejabberd_web_admin.erl:986
msgid "Delete Selected"
msgstr "ลบข้อความที่เลือก"
#: mod_offline.erl:645 mod_offline_odbc.erl:519
msgid "Offline Messages:"
msgstr "ข้อความออฟไลน์:"
#: mod_offline.erl:645 mod_offline_odbc.erl:519
#, fuzzy
msgid "Remove All Offline Messages"
msgstr "ข้อความออฟไลน์"
#: mod_proxy65/mod_proxy65_service.erl:213
msgid "ejabberd SOCKS5 Bytestreams module"
msgstr "ejabberd SOCKS5 Bytestreams module"
#: mod_pubsub/mod_pubsub.erl:1120 mod_pubsub/mod_pubsub_odbc.erl:929
msgid "Publish-Subscribe"
msgstr "เผยแพร่-สมัครเข้าใช้งาน"
#: mod_pubsub/mod_pubsub.erl:1214 mod_pubsub/mod_pubsub_odbc.erl:1025
msgid "ejabberd Publish-Subscribe module"
msgstr "ejabberd Publish-Subscribe module"
#: mod_pubsub/mod_pubsub.erl:1497 mod_pubsub/mod_pubsub_odbc.erl:1312
msgid "PubSub subscriber request"
msgstr "คำร้องขอของผู้สมัครเข้าใช้งาน PubSub"
#: mod_pubsub/mod_pubsub.erl:1499 mod_pubsub/mod_pubsub_odbc.erl:1314
msgid "Choose whether to approve this entity's subscription."
msgstr "เลือกว่าจะอนุมัติการสมัครเข้าใช้งานของเอนทิตี้นี้หรือไม่"
#: mod_pubsub/mod_pubsub.erl:1505 mod_pubsub/mod_pubsub_odbc.erl:1320
msgid "Node ID"
msgstr "ID โหนด"
#: mod_pubsub/mod_pubsub.erl:1510 mod_pubsub/mod_pubsub_odbc.erl:1325
msgid "Subscriber Address"
msgstr "ที่อยู่ของผู้สมัคร"
#: mod_pubsub/mod_pubsub.erl:1516 mod_pubsub/mod_pubsub_odbc.erl:1331
msgid "Allow this Jabber ID to subscribe to this pubsub node?"
msgstr "อนุญาตให้ Jabber ID นี้เข้าร่วมเป็นสมาชิกของโหนด pubsub หรือไม่"
#: mod_pubsub/mod_pubsub.erl:3474 mod_pubsub/mod_pubsub_odbc.erl:3287
msgid "Deliver payloads with event notifications"
msgstr "ส่งส่วนของข้อมูล (payload) พร้อมกับการแจ้งเตือนเหตุการณ์"
#: mod_pubsub/mod_pubsub.erl:3475 mod_pubsub/mod_pubsub_odbc.erl:3288
msgid "Deliver event notifications"
msgstr "ส่งการแจ้งเตือนเหตุการณ์"
#: mod_pubsub/mod_pubsub.erl:3476 mod_pubsub/mod_pubsub_odbc.erl:3289
msgid "Notify subscribers when the node configuration changes"
msgstr "แจ้งเตือนผู้สมัครสมาชิกเมื่อการกำหนดค่าโหนดเปลี่ยนแปลง"
#: mod_pubsub/mod_pubsub.erl:3477 mod_pubsub/mod_pubsub_odbc.erl:3290
msgid "Notify subscribers when the node is deleted"
msgstr "แจ้งเตือนผู้สมัครสมาชิกเมื่อโหนดถูกลบ"
#: mod_pubsub/mod_pubsub.erl:3478 mod_pubsub/mod_pubsub_odbc.erl:3291
msgid "Notify subscribers when items are removed from the node"
msgstr "แจ้งเตือนผู้สมัครสมาชิกเมื่อรายการถูกลบออกจากโหนด"
#: mod_pubsub/mod_pubsub.erl:3479 mod_pubsub/mod_pubsub_odbc.erl:3292
msgid "Persist items to storage"
msgstr "ยืนยันรายการที่จะจัดเก็บ"
#: mod_pubsub/mod_pubsub.erl:3480 mod_pubsub/mod_pubsub_odbc.erl:3293
msgid "A friendly name for the node"
msgstr ""
#: mod_pubsub/mod_pubsub.erl:3481 mod_pubsub/mod_pubsub_odbc.erl:3294
msgid "Max # of items to persist"
msgstr "จำนวนสูงสุดของรายการที่ยืนยัน"
#: mod_pubsub/mod_pubsub.erl:3482 mod_pubsub/mod_pubsub_odbc.erl:3295
msgid "Whether to allow subscriptions"
msgstr "อนุญาตให้เข้าร่วมเป็นสมาชิกหรือไม่"
#: mod_pubsub/mod_pubsub.erl:3483 mod_pubsub/mod_pubsub_odbc.erl:3296
msgid "Specify the access model"
msgstr "ระบุโมเดลการเข้าถึง"
#: mod_pubsub/mod_pubsub.erl:3486 mod_pubsub/mod_pubsub_odbc.erl:3299
msgid "Roster groups allowed to subscribe"
msgstr ""
#: mod_pubsub/mod_pubsub.erl:3487 mod_pubsub/mod_pubsub_odbc.erl:3300
msgid "Specify the publisher model"
msgstr "ระบุโมเดลผู้เผยแพร่"
#: mod_pubsub/mod_pubsub.erl:3489 mod_pubsub/mod_pubsub_odbc.erl:3302
msgid "Purge all items when the relevant publisher goes offline"
msgstr ""
#: mod_pubsub/mod_pubsub.erl:3490 mod_pubsub/mod_pubsub_odbc.erl:3303
#, fuzzy
msgid "Specify the event message type"
msgstr "ระบุโมเดลการเข้าถึง"
#: mod_pubsub/mod_pubsub.erl:3492 mod_pubsub/mod_pubsub_odbc.erl:3305
msgid "Max payload size in bytes"
msgstr "ขนาดสูงสุดของส่วนของข้อมูล (payload) มีหน่วยเป็นไบต์"
#: mod_pubsub/mod_pubsub.erl:3493 mod_pubsub/mod_pubsub_odbc.erl:3306
msgid "When to send the last published item"
msgstr "เวลาที่ส่งรายการที่เผยแพร่ครั้งล่าสุด"
#: mod_pubsub/mod_pubsub.erl:3495 mod_pubsub/mod_pubsub_odbc.erl:3308
msgid "Only deliver notifications to available users"
msgstr "ส่งการแจ้งเตือนถึงผู้ใช้ที่สามารถติดต่อได้เท่านั้น"
#: mod_pubsub/mod_pubsub.erl:3496 mod_pubsub/mod_pubsub_odbc.erl:3309
msgid "The collections with which a node is affiliated"
msgstr ""
#: mod_register.erl:193
msgid "The CAPTCHA verification has failed"
msgstr ""
#: mod_register.erl:220
#, fuzzy
msgid "You need a client that supports x:data and CAPTCHA to register"
msgstr "คุณต้องใช้ไคลเอ็นต์ที่รองรับ x:data เพื่อลงทะเบียนชื่อเล่น"
#: mod_register.erl:226 mod_register.erl:265
msgid "Choose a username and password to register with this server"
msgstr "เลือกชื่อผู้ใช้และรหัสผ่านเพื่อลงทะเบียนกับเซิร์ฟเวอร์นี้"
#: mod_register.erl:230 mod_vcard.erl:364 mod_vcard_odbc.erl:342
#: web/ejabberd_web_admin.erl:1515 web/ejabberd_web_admin.erl:1572
msgid "User"
msgstr "ผู้ใช้"
#: mod_register.erl:316 mod_register.erl:361
#, fuzzy
msgid "The password is too weak"
msgstr "รหัสผ่านคือ"
#: mod_register.erl:365
#, fuzzy
msgid "Users are not allowed to register accounts so quickly"
msgstr "ผู้เยี่ยมเยือนไม่ได้รับอนุญาตให้ส่งข้อความถึงผู้ครอบครองห้องทั้งหมด"
#: mod_roster.erl:938 mod_roster_odbc.erl:1055 web/ejabberd_web_admin.erl:1701
#: web/ejabberd_web_admin.erl:1886 web/ejabberd_web_admin.erl:1897
#: web/ejabberd_web_admin.erl:2219
msgid "None"
msgstr "ไม่มี"
#: mod_roster.erl:945 mod_roster_odbc.erl:1062
msgid "Subscription"
msgstr "การสมัครสมาชิก"
#: mod_roster.erl:946 mod_roster_odbc.erl:1063
msgid "Pending"
msgstr "ค้างอยู่"
#: mod_roster.erl:947 mod_roster_odbc.erl:1064
msgid "Groups"
msgstr "กลุ่ม"
#: mod_roster.erl:974 mod_roster_odbc.erl:1091
msgid "Validate"
msgstr "ตรวจสอบ"
#: mod_roster.erl:982 mod_roster_odbc.erl:1099
msgid "Remove"
msgstr "ลบ"
#: mod_roster.erl:985 mod_roster_odbc.erl:1102
msgid "Roster of "
msgstr "บัญชีรายชื่อของ "
#: mod_roster.erl:988 mod_roster_odbc.erl:1105 mod_shared_roster.erl:902
#: mod_shared_roster.erl:1011 mod_shared_roster_odbc.erl:931
#: mod_shared_roster_odbc.erl:1040 web/ejabberd_web_admin.erl:834
#: web/ejabberd_web_admin.erl:875 web/ejabberd_web_admin.erl:943
#: web/ejabberd_web_admin.erl:979 web/ejabberd_web_admin.erl:1020
#: web/ejabberd_web_admin.erl:1509 web/ejabberd_web_admin.erl:1761
#: web/ejabberd_web_admin.erl:1932 web/ejabberd_web_admin.erl:2136
#: web/ejabberd_web_admin.erl:2161
msgid "Bad format"
msgstr "รูปแบบที่ไม่ถูกต้อง"
#: mod_roster.erl:995 mod_roster_odbc.erl:1112
msgid "Add Jabber ID"
msgstr "เพิ่ม Jabber ID"
#: mod_roster.erl:1094 mod_roster_odbc.erl:1211
msgid "Roster"
msgstr "บัญชีรายชื่อ"
#: mod_shared_roster.erl:857 mod_shared_roster.erl:899
#: mod_shared_roster.erl:1007 mod_shared_roster_odbc.erl:886
#: mod_shared_roster_odbc.erl:928 mod_shared_roster_odbc.erl:1036
msgid "Shared Roster Groups"
msgstr "กลุ่มบัญชีรายชื่อที่ใช้งานร่วมกัน"
#: mod_shared_roster.erl:895 mod_shared_roster_odbc.erl:924
#: web/ejabberd_web_admin.erl:1365 web/ejabberd_web_admin.erl:2461
msgid "Add New"
msgstr "เพิ่มผู้ใช้ใหม่"
#: mod_shared_roster.erl:978 mod_shared_roster_odbc.erl:1007
msgid "Name:"
msgstr "ชื่อ:"
#: mod_shared_roster.erl:983 mod_shared_roster_odbc.erl:1012
msgid "Description:"
msgstr "รายละเอียด:"
#: mod_shared_roster.erl:991 mod_shared_roster_odbc.erl:1020
msgid "Members:"
msgstr "สมาชิก:"
#: mod_shared_roster.erl:999 mod_shared_roster_odbc.erl:1028
msgid "Displayed Groups:"
msgstr "กลุ่มที่แสดง:"
#: mod_shared_roster.erl:1008 mod_shared_roster_odbc.erl:1037
msgid "Group "
msgstr "กลุ่ม"
#: mod_shared_roster.erl:1017 mod_shared_roster_odbc.erl:1046
#: web/ejabberd_web_admin.erl:840 web/ejabberd_web_admin.erl:884
#: web/ejabberd_web_admin.erl:949 web/ejabberd_web_admin.erl:1026
#: web/ejabberd_web_admin.erl:2017
msgid "Submit"
msgstr "ส่ง"
#: mod_vcard.erl:165 mod_vcard_ldap.erl:238 mod_vcard_odbc.erl:129
msgid "Erlang Jabber Server"
msgstr "Erlang Jabber Server"
#: mod_vcard.erl:364 mod_vcard.erl:478 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:454
msgid "Birthday"
msgstr "วันเกิด"
#: mod_vcard.erl:364 mod_vcard.erl:480 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:456
msgid "City"
msgstr "เมือง"
#: mod_vcard.erl:364 mod_vcard.erl:479 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:455
msgid "Country"
msgstr "ประเทศ"
#: mod_vcard.erl:364 mod_vcard.erl:481 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:457
msgid "Email"
msgstr "อีเมล"
#: mod_vcard.erl:364 mod_vcard.erl:476 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:452
msgid "Family Name"
msgstr "นามสกุล"
#: mod_vcard.erl:364 mod_vcard_odbc.erl:342
msgid ""
"Fill in the form to search for any matching Jabber User (Add * to the end of "
"field to match substring)"
msgstr ""
"กรอกข้อมูลในแบบฟอร์มเพื่อค้นหาผู้ใช้ Jabber ที่ตรงกัน (ใส่เครื่องหมาย * "
"ที่ท้ายสุดของฟิลด์เพื่อจับคู่กับสตริงย่อย)"
#: mod_vcard.erl:364 mod_vcard.erl:473 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:449
msgid "Full Name"
msgstr "ชื่อเต็ม"
#: mod_vcard.erl:364 mod_vcard.erl:475 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:451
msgid "Middle Name"
msgstr "ชื่อกลาง"
#: mod_vcard.erl:364 mod_vcard.erl:474 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:450 web/ejabberd_web_admin.erl:2006
msgid "Name"
msgstr "ชื่อ"
#: mod_vcard.erl:364 mod_vcard.erl:482 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:458
msgid "Organization Name"
msgstr "ชื่อองค์กร"
#: mod_vcard.erl:364 mod_vcard.erl:483 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:459
msgid "Organization Unit"
msgstr "หน่วยขององค์กร"
#: mod_vcard.erl:364 mod_vcard_ldap.erl:462 mod_vcard_odbc.erl:342
msgid "Search users in "
msgstr "ค้นหาผู้ใช้ใน "
#: mod_vcard.erl:364 mod_vcard_ldap.erl:462 mod_vcard_odbc.erl:342
msgid "You need an x:data capable client to search"
msgstr "คุณต้องใช้ไคลเอ็นต์ที่รองรับ x:data เพื่อค้นหา"
#: mod_vcard.erl:389 mod_vcard_ldap.erl:487 mod_vcard_odbc.erl:367
msgid "vCard User Search"
msgstr "ค้นหาผู้ใช้ vCard "
#: mod_vcard.erl:445 mod_vcard_ldap.erl:541 mod_vcard_odbc.erl:421
msgid "ejabberd vCard module"
msgstr "ejabberd vCard module"
#: mod_vcard.erl:469 mod_vcard_ldap.erl:551 mod_vcard_odbc.erl:445
msgid "Search Results for "
msgstr "ผลการค้นหาสำหรับ "
#: mod_vcard_ldap.erl:462
msgid "Fill in fields to search for any matching Jabber User"
msgstr "กรอกข้อมูลลงในฟิลด์เพื่อค้นหาผู้ใช้ Jabber ที่ตรงกัน"
#: web/ejabberd_web_admin.erl:193 web/ejabberd_web_admin.erl:203
#: web/ejabberd_web_admin.erl:219 web/ejabberd_web_admin.erl:229
msgid "Unauthorized"
msgstr ""
#: web/ejabberd_web_admin.erl:286 web/ejabberd_web_admin.erl:303
#, fuzzy
msgid "ejabberd Web Admin"
msgstr "เว็บอินเทอร์เฟซของ ejabberd"
#: web/ejabberd_web_admin.erl:769 web/ejabberd_web_admin.erl:780
msgid "Administration"
msgstr "การดูแล"
#: web/ejabberd_web_admin.erl:878 web/ejabberd_web_admin.erl:982
msgid "Raw"
msgstr "ข้อมูลดิบ"
#: web/ejabberd_web_admin.erl:1017
msgid "~s access rule configuration"
msgstr "~s การกำหนดค่ากฎการเข้าถึง"
#: web/ejabberd_web_admin.erl:1035
msgid "Virtual Hosts"
msgstr "โฮสต์เสมือน"
#: web/ejabberd_web_admin.erl:1043 web/ejabberd_web_admin.erl:1050
msgid "Users"
msgstr "ผู้ใช้"
#: web/ejabberd_web_admin.erl:1078
msgid "Users Last Activity"
msgstr "กิจกรรมล่าสุดของผู้ใช้"
#: web/ejabberd_web_admin.erl:1080
msgid "Period: "
msgstr "ระยะเวลา:"
#: web/ejabberd_web_admin.erl:1090
msgid "Last month"
msgstr "เดือนที่แล้ว"
#: web/ejabberd_web_admin.erl:1091
msgid "Last year"
msgstr "ปีที่แล้ว"
#: web/ejabberd_web_admin.erl:1092
msgid "All activity"
msgstr "กิจกรรมทั้งหมด"
#: web/ejabberd_web_admin.erl:1094
msgid "Show Ordinary Table"
msgstr "แสดงตารางทั่วไป"
#: web/ejabberd_web_admin.erl:1096
msgid "Show Integral Table"
msgstr "แสดงตารางรวม"
#: web/ejabberd_web_admin.erl:1105 web/ejabberd_web_admin.erl:1939
msgid "Statistics"
msgstr "สถิติ"
#: web/ejabberd_web_admin.erl:1117
#, fuzzy
msgid "Not Found"
msgstr "ไม่พบโหนด"
#: web/ejabberd_web_admin.erl:1134
msgid "Node not found"
msgstr "ไม่พบโหนด"
#: web/ejabberd_web_admin.erl:1460
msgid "Host"
msgstr "โฮสต์"
#: web/ejabberd_web_admin.erl:1461
msgid "Registered Users"
msgstr "ผู้ใช้ที่ลงทะเบียน"
#: web/ejabberd_web_admin.erl:1573
msgid "Offline Messages"
msgstr "ข้อความออฟไลน์"
#: web/ejabberd_web_admin.erl:1574 web/ejabberd_web_admin.erl:1767
msgid "Last Activity"
msgstr "กิจกรรมล่าสุด"
#: web/ejabberd_web_admin.erl:1659 web/ejabberd_web_admin.erl:1675
msgid "Registered Users:"
msgstr "ผู้ใช้ที่ลงทะเบียน:"
#: web/ejabberd_web_admin.erl:1661 web/ejabberd_web_admin.erl:1677
#: web/ejabberd_web_admin.erl:2192
msgid "Online Users:"
msgstr "ผู้ใช้ออนไลน์:"
#: web/ejabberd_web_admin.erl:1663
msgid "Outgoing s2s Connections:"
msgstr "การเชื่อมต่อ s2s ขาออก:"
#: web/ejabberd_web_admin.erl:1665
msgid "Outgoing s2s Servers:"
msgstr "เซิร์ฟเวอร์ s2s ขาออก:"
#: web/ejabberd_web_admin.erl:1734 web/mod_register_web.erl:175
#: web/mod_register_web.erl:372 web/mod_register_web.erl:381
#: web/mod_register_web.erl:411
msgid "Change Password"
msgstr "เปลี่ยนรหัสผ่าน"
#: web/ejabberd_web_admin.erl:1758
msgid "User "
msgstr "ผู้ใช้"
#: web/ejabberd_web_admin.erl:1765
msgid "Connected Resources:"
msgstr "ทรัพยากรที่เชื่อมต่อ:"
#: web/ejabberd_web_admin.erl:1766 web/mod_register_web.erl:227
#: web/mod_register_web.erl:519
msgid "Password:"
msgstr "รหัสผ่าน:"
#: web/ejabberd_web_admin.erl:1828
msgid "No Data"
msgstr "ไม่มีข้อมูล"
#: web/ejabberd_web_admin.erl:1906
msgid "Nodes"
msgstr "โหนด"
#: web/ejabberd_web_admin.erl:1929 web/ejabberd_web_admin.erl:1951
msgid "Node "
msgstr "โหนด "
#: web/ejabberd_web_admin.erl:1938
msgid "Listened Ports"
msgstr "พอร์ทฟัง"
#: web/ejabberd_web_admin.erl:1940 web/ejabberd_web_admin.erl:2260
#: web/ejabberd_web_admin.erl:2448
msgid "Update"
msgstr "อัพเดต"
#: web/ejabberd_web_admin.erl:1943 web/ejabberd_web_admin.erl:2569
msgid "Restart"
msgstr "เริ่มต้นใหม่"
#: web/ejabberd_web_admin.erl:1945 web/ejabberd_web_admin.erl:2571
msgid "Stop"
msgstr "หยุด"
#: web/ejabberd_web_admin.erl:1959
msgid "RPC Call Error"
msgstr "ข้อผิดพลาดจากการเรียกใช้ RPC"
#: web/ejabberd_web_admin.erl:2000
msgid "Database Tables at "
msgstr "ตารางฐานข้อมูลที่"
#: web/ejabberd_web_admin.erl:2007
msgid "Storage Type"
msgstr "ชนิดที่เก็บข้อมูล"
#: web/ejabberd_web_admin.erl:2008
msgid "Elements"
msgstr ""
#: web/ejabberd_web_admin.erl:2009
msgid "Memory"
msgstr "หน่วยความจำ"
#: web/ejabberd_web_admin.erl:2032 web/ejabberd_web_admin.erl:2137
msgid "Error"
msgstr ""
#: web/ejabberd_web_admin.erl:2034
msgid "Backup of "
msgstr "การสำรองข้อมูล"
#: web/ejabberd_web_admin.erl:2036
#, fuzzy
msgid ""
"Please note that these options will only backup the builtin Mnesia database. "
"If you are using the ODBC module, you also need to backup your SQL database "
"separately."
msgstr ""
"โปรดทราบว่าตัวเลือกเหล่านี้จะสำรองข้อมูลในฐานข้อมูล builtin Mnesia เท่านั้น หากคุณใช้โมดูล "
"ODBC คุณต้องสำรองข้อมูลของฐานข้อมูล SQL แยกต่างหากด้วย"
#: web/ejabberd_web_admin.erl:2041
msgid "Store binary backup:"
msgstr "จัดเก็บข้อมูลสำรองแบบไบนารี:"
#: web/ejabberd_web_admin.erl:2045 web/ejabberd_web_admin.erl:2052
#: web/ejabberd_web_admin.erl:2060 web/ejabberd_web_admin.erl:2067
#: web/ejabberd_web_admin.erl:2074 web/ejabberd_web_admin.erl:2081
#: web/ejabberd_web_admin.erl:2088 web/ejabberd_web_admin.erl:2096
#: web/ejabberd_web_admin.erl:2103 web/ejabberd_web_admin.erl:2110
msgid "OK"
msgstr "ตกลง"
#: web/ejabberd_web_admin.erl:2048
msgid "Restore binary backup immediately:"
msgstr "คืนค่าข้อมูลสำรองแบบไบนารีโดยทันที:"
#: web/ejabberd_web_admin.erl:2056
msgid ""
"Restore binary backup after next ejabberd restart (requires less memory):"
msgstr ""
"คืนค่าข้อมูลสำรองแบบไบนารีหลังจากที่ ejabberd ถัดไปเริ่มการทำงานใหม่ (ใช้หน่วยความจำน้อยลง):"
#: web/ejabberd_web_admin.erl:2063
msgid "Store plain text backup:"
msgstr "จัดเก็บข้อมูลสำรองที่เป็นข้อความธรรมดา:"
#: web/ejabberd_web_admin.erl:2070
msgid "Restore plain text backup immediately:"
msgstr "คืนค่าข้อมูลสำรองที่เป็นข้อความธรรมดาโดยทันที:"
#: web/ejabberd_web_admin.erl:2077
msgid "Import users data from a PIEFXIS file (XEP-0227):"
msgstr ""
#: web/ejabberd_web_admin.erl:2084
msgid "Export data of all users in the server to PIEFXIS files (XEP-0227):"
msgstr ""
#: web/ejabberd_web_admin.erl:2091
msgid "Export data of users in a host to PIEFXIS files (XEP-0227):"
msgstr ""
#: web/ejabberd_web_admin.erl:2099
#, fuzzy
msgid "Import user data from jabberd14 spool file:"
msgstr "อิมพอร์ตผู้ใช้จากไฟล์เก็บพักข้อมูล jabberd14"
#: web/ejabberd_web_admin.erl:2106
#, fuzzy
msgid "Import users data from jabberd14 spool directory:"
msgstr "อิมพอร์ตผู้ใช้จากไฟล์เก็บพักข้อมูล jabberd14"
#: web/ejabberd_web_admin.erl:2132
msgid "Listened Ports at "
msgstr "พอร์ทฟังที่"
#: web/ejabberd_web_admin.erl:2157
msgid "Modules at "
msgstr "โมดูลที่ "
#: web/ejabberd_web_admin.erl:2183
msgid "Statistics of ~p"
msgstr "สถิติของ ~p"
#: web/ejabberd_web_admin.erl:2186
msgid "Uptime:"
msgstr "เวลาการทำงานต่อเนื่อง:"
#: web/ejabberd_web_admin.erl:2189
msgid "CPU Time:"
msgstr "เวลาการทำงานของ CPU:"
#: web/ejabberd_web_admin.erl:2195
msgid "Transactions Committed:"
msgstr "ทรานแซกชันที่ได้รับมอบหมาย:"
#: web/ejabberd_web_admin.erl:2198
msgid "Transactions Aborted:"
msgstr "ทรานแซกชันที่ถูกยกเลิก:"
#: web/ejabberd_web_admin.erl:2201
msgid "Transactions Restarted:"
msgstr "ทรานแซกชันที่เริ่มทำงานใหม่อีกครั้ง:"
#: web/ejabberd_web_admin.erl:2204
msgid "Transactions Logged:"
msgstr "ทรานแซกชันที่บันทึก:"
#: web/ejabberd_web_admin.erl:2246
msgid "Update "
msgstr "อัพเดต "
#: web/ejabberd_web_admin.erl:2254
msgid "Update plan"
msgstr "แผนการอัพเดต"
#: web/ejabberd_web_admin.erl:2255
#, fuzzy
msgid "Modified modules"
msgstr "โมดูลที่อัพเดต"
#: web/ejabberd_web_admin.erl:2256
msgid "Update script"
msgstr "อัพเดตสคริปต์"
#: web/ejabberd_web_admin.erl:2257
msgid "Low level update script"
msgstr "อัพเดตสคริปต์ระดับต่ำ"
#: web/ejabberd_web_admin.erl:2258
msgid "Script check"
msgstr "ตรวจสอบคริปต์"
#: web/ejabberd_web_admin.erl:2426
msgid "Port"
msgstr "พอร์ท"
#: web/ejabberd_web_admin.erl:2427
msgid "IP"
msgstr ""
#: web/ejabberd_web_admin.erl:2428
#, fuzzy
msgid "Protocol"
msgstr "พอร์ท"
#: web/ejabberd_web_admin.erl:2429 web/ejabberd_web_admin.erl:2556
msgid "Module"
msgstr "โมดูล"
#: web/ejabberd_web_admin.erl:2430 web/ejabberd_web_admin.erl:2557
msgid "Options"
msgstr "ตัวเลือก"
#: web/ejabberd_web_admin.erl:2450
msgid "Delete"
msgstr "ลบ"
#: web/ejabberd_web_admin.erl:2579
msgid "Start"
msgstr "เริ่ม"
#: web/mod_register_web.erl:104
msgid "Your Jabber account was successfully created."
msgstr ""
#: web/mod_register_web.erl:107
msgid "There was an error creating the account: "
msgstr ""
#: web/mod_register_web.erl:115
msgid "Your Jabber account was successfully deleted."
msgstr ""
#: web/mod_register_web.erl:118
msgid "There was an error deleting the account: "
msgstr ""
#: web/mod_register_web.erl:128
msgid "The password of your Jabber account was successfully changed."
msgstr ""
#: web/mod_register_web.erl:131
msgid "There was an error changing the password: "
msgstr ""
#: web/mod_register_web.erl:163 web/mod_register_web.erl:172
msgid "Jabber Account Registration"
msgstr ""
#: web/mod_register_web.erl:174 web/mod_register_web.erl:192
#: web/mod_register_web.erl:201
msgid "Register a Jabber account"
msgstr ""
#: web/mod_register_web.erl:176 web/mod_register_web.erl:493
#: web/mod_register_web.erl:502
msgid "Unregister a Jabber account"
msgstr ""
#: web/mod_register_web.erl:203
msgid ""
"This page allows to create a Jabber account in this Jabber server. Your JID "
"(Jabber IDentifier) will be of the form: username@server. Please read "
"carefully the instructions to fill correctly the fields."
msgstr ""
#: web/mod_register_web.erl:212 web/mod_register_web.erl:386
#: web/mod_register_web.erl:509
#, fuzzy
msgid "Username:"
msgstr "ชื่อผู้ใช้ IRC"
#: web/mod_register_web.erl:217
msgid "This is case insensitive: macbeth is the same that MacBeth and Macbeth."
msgstr ""
#: web/mod_register_web.erl:218
msgid "Characters not allowed:"
msgstr ""
#: web/mod_register_web.erl:222 web/mod_register_web.erl:391
#: web/mod_register_web.erl:514
#, fuzzy
msgid "Server:"
msgstr "ไม่เคย"
#: web/mod_register_web.erl:232
msgid ""
"Don't tell your password to anybody, not even the administrators of the "
"Jabber server."
msgstr ""
#: web/mod_register_web.erl:234
msgid "You can later change your password using a Jabber client."
msgstr ""
#: web/mod_register_web.erl:235
msgid ""
"Some Jabber clients can store your password in your computer. Use that "
"feature only if you trust your computer is safe."
msgstr ""
#: web/mod_register_web.erl:237
msgid ""
"Memorize your password, or write it in a paper placed in a safe place. In "
"Jabber there isn't an automated way to recover your password if you forget "
"it."
msgstr ""
#: web/mod_register_web.erl:242 web/mod_register_web.erl:406
#, fuzzy
msgid "Password Verification:"
msgstr "การตรวจสอบรหัสผ่าน"
#: web/mod_register_web.erl:250
#, fuzzy
msgid "Register"
msgstr "บัญชีรายชื่อ"
#: web/mod_register_web.erl:396
#, fuzzy
msgid "Old Password:"
msgstr "รหัสผ่าน:"
#: web/mod_register_web.erl:401
#, fuzzy
msgid "New Password:"
msgstr "รหัสผ่าน:"
#: web/mod_register_web.erl:504
msgid "This page allows to unregister a Jabber account in this Jabber server."
msgstr ""
#: web/mod_register_web.erl:524
msgid "Unregister"
msgstr ""
#~ msgid "Encodings"
#~ msgstr "การเข้ารหัส"
#~ msgid "(Raw)"
#~ msgstr "(ข้อมูลดิบ)"
#~ msgid "Specified nickname is already registered"
#~ msgstr "ชื่อเล่นที่ระบุได้รับการลงได้ทะเบียนแล้ว"
#~ msgid "Size"
#~ msgstr "ขนาด"
#~ msgid "Roster groups that may subscribe (if access model is roster)"
#~ msgstr "กลุ่มบัญชีรายชื่อที่อาจจะสมัครเป็นสมาชิก (ถ้าโมเดลการเข้าถึงคือบัญชีรายชื่อ)"
ejabberd-2.1.11/src/msgs/ejabberd.pot 0000664 0000000 0000000 00000123250 12240230175 014243 0 ustar msgid ""
msgstr ""
"Project-Id-Version: 2.1.x\n"
"X-Language: Language Name\n"
"Last-Translator: Translator name and contact method\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: ejabberd_c2s.erl:424 ejabberd_c2s.erl:727
msgid "Use of STARTTLS required"
msgstr ""
#: ejabberd_c2s.erl:503
msgid "No resource provided"
msgstr ""
#: ejabberd_c2s.erl:1197
msgid "Replaced by new connection"
msgstr ""
#: ejabberd_c2s.erl:1885
msgid "Your active privacy list has denied the routing of this stanza."
msgstr ""
#: ejabberd_captcha.erl:96 ejabberd_captcha.erl:152 ejabberd_captcha.erl:178
msgid "Enter the text you see"
msgstr ""
#: ejabberd_captcha.erl:101
msgid "Your messages to ~s are being blocked. To unblock them, visit ~s"
msgstr ""
#: ejabberd_captcha.erl:134
msgid "If you don't see the CAPTCHA image here, visit the web page."
msgstr ""
#: ejabberd_captcha.erl:146
msgid "CAPTCHA web page"
msgstr ""
#: ejabberd_captcha.erl:307
msgid "The CAPTCHA is valid."
msgstr ""
#: mod_adhoc.erl:95 mod_adhoc.erl:125 mod_adhoc.erl:143 mod_adhoc.erl:161
msgid "Commands"
msgstr ""
#: mod_adhoc.erl:149 mod_adhoc.erl:243
msgid "Ping"
msgstr ""
#: mod_adhoc.erl:260
msgid "Pong"
msgstr ""
#: mod_announce.erl:507 mod_announce_odbc.erl:499
msgid "Really delete message of the day?"
msgstr ""
#: mod_announce.erl:515 mod_announce_odbc.erl:507 mod_configure.erl:1083
#: mod_configure.erl:1128
msgid "Subject"
msgstr ""
#: mod_announce.erl:520 mod_announce_odbc.erl:512 mod_configure.erl:1088
#: mod_configure.erl:1133
msgid "Message body"
msgstr ""
#: mod_announce.erl:600 mod_announce_odbc.erl:592
msgid "No body provided for announce message"
msgstr ""
#: mod_announce.erl:635 mod_announce_odbc.erl:627
msgid "Announcements"
msgstr ""
#: mod_announce.erl:637 mod_announce_odbc.erl:629
msgid "Send announcement to all users"
msgstr ""
#: mod_announce.erl:639 mod_announce_odbc.erl:631
msgid "Send announcement to all users on all hosts"
msgstr ""
#: mod_announce.erl:641 mod_announce_odbc.erl:633
msgid "Send announcement to all online users"
msgstr ""
#: mod_announce.erl:643 mod_announce_odbc.erl:635 mod_configure.erl:1078
#: mod_configure.erl:1123
msgid "Send announcement to all online users on all hosts"
msgstr ""
#: mod_announce.erl:645 mod_announce_odbc.erl:637
msgid "Set message of the day and send to online users"
msgstr ""
#: mod_announce.erl:647 mod_announce_odbc.erl:639
msgid "Set message of the day on all hosts and send to online users"
msgstr ""
#: mod_announce.erl:649 mod_announce_odbc.erl:641
msgid "Update message of the day (don't send)"
msgstr ""
#: mod_announce.erl:651 mod_announce_odbc.erl:643
msgid "Update message of the day on all hosts (don't send)"
msgstr ""
#: mod_announce.erl:653 mod_announce_odbc.erl:645
msgid "Delete message of the day"
msgstr ""
#: mod_announce.erl:655 mod_announce_odbc.erl:647
msgid "Delete message of the day on all hosts"
msgstr ""
#: mod_configure.erl:114 mod_configure.erl:274 mod_configure.erl:296
#: mod_configure.erl:498
msgid "Configuration"
msgstr ""
#: mod_configure.erl:125 mod_configure.erl:576 web/ejabberd_web_admin.erl:1936
msgid "Database"
msgstr ""
#: mod_configure.erl:127 mod_configure.erl:595
msgid "Start Modules"
msgstr ""
#: mod_configure.erl:129 mod_configure.erl:596
msgid "Stop Modules"
msgstr ""
#: mod_configure.erl:131 mod_configure.erl:604 web/ejabberd_web_admin.erl:1937
msgid "Backup"
msgstr ""
#: mod_configure.erl:133 mod_configure.erl:605
msgid "Restore"
msgstr ""
#: mod_configure.erl:135 mod_configure.erl:606
msgid "Dump to Text File"
msgstr ""
#: mod_configure.erl:137 mod_configure.erl:615
msgid "Import File"
msgstr ""
#: mod_configure.erl:139 mod_configure.erl:616
msgid "Import Directory"
msgstr ""
#: mod_configure.erl:141 mod_configure.erl:581 mod_configure.erl:1057
msgid "Restart Service"
msgstr ""
#: mod_configure.erl:143 mod_configure.erl:582 mod_configure.erl:1102
msgid "Shut Down Service"
msgstr ""
#: mod_configure.erl:145 mod_configure.erl:518 mod_configure.erl:1197
#: web/ejabberd_web_admin.erl:1527
msgid "Add User"
msgstr ""
#: mod_configure.erl:147 mod_configure.erl:519 mod_configure.erl:1219
msgid "Delete User"
msgstr ""
#: mod_configure.erl:149 mod_configure.erl:520 mod_configure.erl:1231
msgid "End User Session"
msgstr ""
#: mod_configure.erl:151 mod_configure.erl:521 mod_configure.erl:1243
#: mod_configure.erl:1255
msgid "Get User Password"
msgstr ""
#: mod_configure.erl:153 mod_configure.erl:522
msgid "Change User Password"
msgstr ""
#: mod_configure.erl:155 mod_configure.erl:523 mod_configure.erl:1272
msgid "Get User Last Login Time"
msgstr ""
#: mod_configure.erl:157 mod_configure.erl:524 mod_configure.erl:1284
msgid "Get User Statistics"
msgstr ""
#: mod_configure.erl:159 mod_configure.erl:525
msgid "Get Number of Registered Users"
msgstr ""
#: mod_configure.erl:161 mod_configure.erl:526
msgid "Get Number of Online Users"
msgstr ""
#: mod_configure.erl:163 mod_configure.erl:509 web/ejabberd_web_admin.erl:831
#: web/ejabberd_web_admin.erl:872
msgid "Access Control Lists"
msgstr ""
#: mod_configure.erl:165 mod_configure.erl:510 web/ejabberd_web_admin.erl:940
#: web/ejabberd_web_admin.erl:976
msgid "Access Rules"
msgstr ""
#: mod_configure.erl:297 mod_configure.erl:499
msgid "User Management"
msgstr ""
#: mod_configure.erl:500 web/ejabberd_web_admin.erl:1058
#: web/ejabberd_web_admin.erl:1462
msgid "Online Users"
msgstr ""
#: mod_configure.erl:501
msgid "All Users"
msgstr ""
#: mod_configure.erl:502
msgid "Outgoing s2s Connections"
msgstr ""
#: mod_configure.erl:503 web/ejabberd_web_admin.erl:1907
msgid "Running Nodes"
msgstr ""
#: mod_configure.erl:504 web/ejabberd_web_admin.erl:1909
msgid "Stopped Nodes"
msgstr ""
#: mod_configure.erl:577 mod_configure.erl:587 web/ejabberd_web_admin.erl:1953
msgid "Modules"
msgstr ""
#: mod_configure.erl:578
msgid "Backup Management"
msgstr ""
#: mod_configure.erl:579
msgid "Import Users From jabberd14 Spool Files"
msgstr ""
#: mod_configure.erl:699
msgid "To ~s"
msgstr ""
#: mod_configure.erl:717
msgid "From ~s"
msgstr ""
#: mod_configure.erl:913
msgid "Database Tables Configuration at "
msgstr ""
#: mod_configure.erl:918
msgid "Choose storage type of tables"
msgstr ""
#: mod_configure.erl:926 mod_configure.erl:928
msgid "Disc only copy"
msgstr ""
#: mod_configure.erl:926 mod_configure.erl:928
msgid "RAM and disc copy"
msgstr ""
#: mod_configure.erl:926 mod_configure.erl:928
msgid "RAM copy"
msgstr ""
#: mod_configure.erl:926 mod_configure.erl:928
msgid "Remote copy"
msgstr ""
#: mod_configure.erl:950
msgid "Stop Modules at "
msgstr ""
#: mod_configure.erl:954
msgid "Choose modules to stop"
msgstr ""
#: mod_configure.erl:969
msgid "Start Modules at "
msgstr ""
#: mod_configure.erl:973
msgid "Enter list of {Module, [Options]}"
msgstr ""
#: mod_configure.erl:974
msgid "List of modules to start"
msgstr ""
#: mod_configure.erl:983
msgid "Backup to File at "
msgstr ""
#: mod_configure.erl:987 mod_configure.erl:1001
msgid "Enter path to backup file"
msgstr ""
#: mod_configure.erl:988 mod_configure.erl:1002 mod_configure.erl:1016
#: mod_configure.erl:1030
msgid "Path to File"
msgstr ""
#: mod_configure.erl:997
msgid "Restore Backup from File at "
msgstr ""
#: mod_configure.erl:1011
msgid "Dump Backup to Text File at "
msgstr ""
#: mod_configure.erl:1015
msgid "Enter path to text file"
msgstr ""
#: mod_configure.erl:1025
msgid "Import User from File at "
msgstr ""
#: mod_configure.erl:1029
msgid "Enter path to jabberd14 spool file"
msgstr ""
#: mod_configure.erl:1039
msgid "Import Users from Dir at "
msgstr ""
#: mod_configure.erl:1043
msgid "Enter path to jabberd14 spool dir"
msgstr ""
#: mod_configure.erl:1044
msgid "Path to Dir"
msgstr ""
#: mod_configure.erl:1060 mod_configure.erl:1105
msgid "Time delay"
msgstr ""
#: mod_configure.erl:1143
msgid "Access Control List Configuration"
msgstr ""
#: mod_configure.erl:1147
msgid "Access control lists"
msgstr ""
#: mod_configure.erl:1171
msgid "Access Configuration"
msgstr ""
#: mod_configure.erl:1175
msgid "Access rules"
msgstr ""
#: mod_configure.erl:1200 mod_configure.erl:1222 mod_configure.erl:1234
#: mod_configure.erl:1246 mod_configure.erl:1258 mod_configure.erl:1275
#: mod_configure.erl:1287 mod_configure.erl:1650 mod_configure.erl:1700
#: mod_configure.erl:1721 mod_roster.erl:943 mod_roster_odbc.erl:1060
#: mod_vcard.erl:472 mod_vcard_ldap.erl:554 mod_vcard_odbc.erl:448
msgid "Jabber ID"
msgstr ""
#: mod_configure.erl:1205 mod_configure.erl:1263 mod_configure.erl:1651
#: mod_configure.erl:1863 mod_muc/mod_muc_room.erl:3224 mod_register.erl:235
#: web/ejabberd_web_admin.erl:1520
msgid "Password"
msgstr ""
#: mod_configure.erl:1210
msgid "Password Verification"
msgstr ""
#: mod_configure.erl:1301
msgid "Number of registered users"
msgstr ""
#: mod_configure.erl:1315
msgid "Number of online users"
msgstr ""
#: mod_configure.erl:1682 web/ejabberd_web_admin.erl:1588
#: web/ejabberd_web_admin.erl:1743
msgid "Never"
msgstr ""
#: mod_configure.erl:1696 web/ejabberd_web_admin.erl:1601
#: web/ejabberd_web_admin.erl:1756
msgid "Online"
msgstr ""
#: mod_configure.erl:1701
msgid "Last login"
msgstr ""
#: mod_configure.erl:1722
msgid "Roster size"
msgstr ""
#: mod_configure.erl:1723
msgid "IP addresses"
msgstr ""
#: mod_configure.erl:1724
msgid "Resources"
msgstr ""
#: mod_configure.erl:1850
msgid "Administration of "
msgstr ""
#: mod_configure.erl:1853
msgid "Action on user"
msgstr ""
#: mod_configure.erl:1857
msgid "Edit Properties"
msgstr ""
#: mod_configure.erl:1860 web/ejabberd_web_admin.erl:1769
msgid "Remove User"
msgstr ""
#: mod_irc/mod_irc.erl:201 mod_irc/mod_irc_odbc.erl:196
#: mod_muc/mod_muc.erl:336 mod_muc/mod_muc_odbc.erl:342
msgid "Access denied by service policy"
msgstr ""
#: mod_irc/mod_irc.erl:401 mod_irc/mod_irc_odbc.erl:398
msgid "IRC Transport"
msgstr ""
#: mod_irc/mod_irc.erl:428 mod_irc/mod_irc_odbc.erl:425
msgid "ejabberd IRC module"
msgstr ""
#: mod_irc/mod_irc.erl:559 mod_irc/mod_irc_odbc.erl:568
msgid "You need an x:data capable client to configure mod_irc settings"
msgstr ""
#: mod_irc/mod_irc.erl:566 mod_irc/mod_irc_odbc.erl:575
msgid "Registration in mod_irc for "
msgstr ""
#: mod_irc/mod_irc.erl:571 mod_irc/mod_irc_odbc.erl:580
msgid ""
"Enter username, encodings, ports and passwords you wish to use for "
"connecting to IRC servers"
msgstr ""
#: mod_irc/mod_irc.erl:576 mod_irc/mod_irc_odbc.erl:585
msgid "IRC Username"
msgstr ""
#: mod_irc/mod_irc.erl:586 mod_irc/mod_irc_odbc.erl:595
msgid ""
"If you want to specify different ports, passwords, encodings for IRC "
"servers, fill this list with values in format '{\"irc server\", \"encoding"
"\", port, \"password\"}'. By default this service use \"~s\" encoding, port "
"~p, empty password."
msgstr ""
#: mod_irc/mod_irc.erl:598 mod_irc/mod_irc_odbc.erl:607
msgid ""
"Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef."
"net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."
msgstr ""
#: mod_irc/mod_irc.erl:603 mod_irc/mod_irc_odbc.erl:612
msgid "Connections parameters"
msgstr ""
#: mod_irc/mod_irc.erl:728 mod_irc/mod_irc_odbc.erl:757
msgid "Join IRC channel"
msgstr ""
#: mod_irc/mod_irc.erl:732 mod_irc/mod_irc_odbc.erl:761
msgid "IRC channel (don't put the first #)"
msgstr ""
#: mod_irc/mod_irc.erl:737 mod_irc/mod_irc_odbc.erl:766
msgid "IRC server"
msgstr ""
#: mod_irc/mod_irc.erl:770 mod_irc/mod_irc.erl:774
#: mod_irc/mod_irc_odbc.erl:799 mod_irc/mod_irc_odbc.erl:803
msgid "Join the IRC channel here."
msgstr ""
#: mod_irc/mod_irc.erl:778 mod_irc/mod_irc_odbc.erl:807
msgid "Join the IRC channel in this Jabber ID: ~s"
msgstr ""
#: mod_irc/mod_irc.erl:863 mod_irc/mod_irc_odbc.erl:904
msgid "IRC settings"
msgstr ""
#: mod_irc/mod_irc.erl:868 mod_irc/mod_irc_odbc.erl:909
msgid ""
"Enter username and encodings you wish to use for connecting to IRC servers. "
"Press 'Next' to get more fields to fill in. Press 'Complete' to save "
"settings."
msgstr ""
#: mod_irc/mod_irc.erl:874 mod_irc/mod_irc_odbc.erl:915
msgid "IRC username"
msgstr ""
#: mod_irc/mod_irc.erl:923 mod_irc/mod_irc_odbc.erl:964
msgid "Password ~b"
msgstr ""
#: mod_irc/mod_irc.erl:928 mod_irc/mod_irc_odbc.erl:969
msgid "Port ~b"
msgstr ""
#: mod_irc/mod_irc.erl:933 mod_irc/mod_irc_odbc.erl:974
msgid "Encoding for server ~b"
msgstr ""
#: mod_irc/mod_irc.erl:942 mod_irc/mod_irc_odbc.erl:983
msgid "Server ~b"
msgstr ""
#: mod_muc/mod_muc.erl:449 mod_muc/mod_muc_odbc.erl:456
msgid "Only service administrators are allowed to send service messages"
msgstr ""
#: mod_muc/mod_muc.erl:493 mod_muc/mod_muc_odbc.erl:500
msgid "Room creation is denied by service policy"
msgstr ""
#: mod_muc/mod_muc.erl:500 mod_muc/mod_muc_odbc.erl:507
msgid "Conference room does not exist"
msgstr ""
#: mod_muc/mod_muc.erl:582 mod_muc/mod_muc_odbc.erl:595
msgid "Chatrooms"
msgstr ""
#: mod_muc/mod_muc.erl:712 mod_muc/mod_muc_odbc.erl:729
msgid "You need a client that supports x:data to register the nickname"
msgstr ""
#: mod_muc/mod_muc.erl:718 mod_muc/mod_muc_odbc.erl:735
msgid "Nickname Registration at "
msgstr ""
#: mod_muc/mod_muc.erl:722 mod_muc/mod_muc_odbc.erl:739
msgid "Enter nickname you want to register"
msgstr ""
#: mod_muc/mod_muc.erl:723 mod_muc/mod_muc_odbc.erl:740
#: mod_muc/mod_muc_room.erl:3810 mod_roster.erl:944 mod_roster_odbc.erl:1061
#: mod_vcard.erl:364 mod_vcard.erl:477 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:453
msgid "Nickname"
msgstr ""
#: mod_muc/mod_muc.erl:762 mod_muc/mod_muc_odbc.erl:784
#: mod_muc/mod_muc_room.erl:1064 mod_muc/mod_muc_room.erl:1787
msgid "That nickname is registered by another person"
msgstr ""
#: mod_muc/mod_muc.erl:788 mod_muc/mod_muc_odbc.erl:811
msgid "You must fill in field \"Nickname\" in the form"
msgstr ""
#: mod_muc/mod_muc.erl:808 mod_muc/mod_muc_odbc.erl:831
msgid "ejabberd MUC module"
msgstr ""
#: mod_muc/mod_muc_log.erl:374 mod_muc/mod_muc_log.erl:381
msgid "Chatroom configuration modified"
msgstr ""
#: mod_muc/mod_muc_log.erl:384
msgid "joins the room"
msgstr ""
#: mod_muc/mod_muc_log.erl:387 mod_muc/mod_muc_log.erl:390
msgid "leaves the room"
msgstr ""
#: mod_muc/mod_muc_log.erl:393 mod_muc/mod_muc_log.erl:396
msgid "has been banned"
msgstr ""
#: mod_muc/mod_muc_log.erl:399 mod_muc/mod_muc_log.erl:402
msgid "has been kicked"
msgstr ""
#: mod_muc/mod_muc_log.erl:405
msgid "has been kicked because of an affiliation change"
msgstr ""
#: mod_muc/mod_muc_log.erl:408
msgid "has been kicked because the room has been changed to members-only"
msgstr ""
#: mod_muc/mod_muc_log.erl:411
msgid "has been kicked because of a system shutdown"
msgstr ""
#: mod_muc/mod_muc_log.erl:414
msgid "is now known as"
msgstr ""
#: mod_muc/mod_muc_log.erl:417 mod_muc/mod_muc_log.erl:688
#: mod_muc/mod_muc_room.erl:2393
msgid " has set the subject to: "
msgstr ""
#: mod_muc/mod_muc_log.erl:452
msgid "Chatroom is created"
msgstr ""
#: mod_muc/mod_muc_log.erl:453
msgid "Chatroom is destroyed"
msgstr ""
#: mod_muc/mod_muc_log.erl:454
msgid "Chatroom is started"
msgstr ""
#: mod_muc/mod_muc_log.erl:455
msgid "Chatroom is stopped"
msgstr ""
#: mod_muc/mod_muc_log.erl:459
msgid "Monday"
msgstr ""
#: mod_muc/mod_muc_log.erl:460
msgid "Tuesday"
msgstr ""
#: mod_muc/mod_muc_log.erl:461
msgid "Wednesday"
msgstr ""
#: mod_muc/mod_muc_log.erl:462
msgid "Thursday"
msgstr ""
#: mod_muc/mod_muc_log.erl:463
msgid "Friday"
msgstr ""
#: mod_muc/mod_muc_log.erl:464
msgid "Saturday"
msgstr ""
#: mod_muc/mod_muc_log.erl:465
msgid "Sunday"
msgstr ""
#: mod_muc/mod_muc_log.erl:469
msgid "January"
msgstr ""
#: mod_muc/mod_muc_log.erl:470
msgid "February"
msgstr ""
#: mod_muc/mod_muc_log.erl:471
msgid "March"
msgstr ""
#: mod_muc/mod_muc_log.erl:472
msgid "April"
msgstr ""
#: mod_muc/mod_muc_log.erl:473
msgid "May"
msgstr ""
#: mod_muc/mod_muc_log.erl:474
msgid "June"
msgstr ""
#: mod_muc/mod_muc_log.erl:475
msgid "July"
msgstr ""
#: mod_muc/mod_muc_log.erl:476
msgid "August"
msgstr ""
#: mod_muc/mod_muc_log.erl:477
msgid "September"
msgstr ""
#: mod_muc/mod_muc_log.erl:478
msgid "October"
msgstr ""
#: mod_muc/mod_muc_log.erl:479
msgid "November"
msgstr ""
#: mod_muc/mod_muc_log.erl:480
msgid "December"
msgstr ""
#: mod_muc/mod_muc_log.erl:750
msgid "Room Configuration"
msgstr ""
#: mod_muc/mod_muc_log.erl:759
msgid "Room Occupants"
msgstr ""
#: mod_muc/mod_muc_room.erl:174
msgid "Traffic rate limit is exceeded"
msgstr ""
#: mod_muc/mod_muc_room.erl:246
msgid ""
"This participant is kicked from the room because he sent an error message"
msgstr ""
#: mod_muc/mod_muc_room.erl:255
msgid "It is not allowed to send private messages to the conference"
msgstr ""
#: mod_muc/mod_muc_room.erl:332
msgid "Please, wait for a while before sending new voice request"
msgstr ""
#: mod_muc/mod_muc_room.erl:347
msgid "Voice requests are disabled in this conference"
msgstr ""
#: mod_muc/mod_muc_room.erl:364
msgid "Failed to extract JID from your voice request approval"
msgstr ""
#: mod_muc/mod_muc_room.erl:393
msgid "Only moderators can approve voice requests"
msgstr ""
#: mod_muc/mod_muc_room.erl:408
msgid "Improper message type"
msgstr ""
#: mod_muc/mod_muc_room.erl:518
msgid ""
"This participant is kicked from the room because he sent an error message to "
"another participant"
msgstr ""
#: mod_muc/mod_muc_room.erl:531
msgid "It is not allowed to send private messages of type \"groupchat\""
msgstr ""
#: mod_muc/mod_muc_room.erl:543 mod_muc/mod_muc_room.erl:611
msgid "Recipient is not in the conference room"
msgstr ""
#: mod_muc/mod_muc_room.erl:564 mod_muc/mod_muc_room.erl:585
msgid "It is not allowed to send private messages"
msgstr ""
#: mod_muc/mod_muc_room.erl:576 mod_muc/mod_muc_room.erl:956
#: mod_muc/mod_muc_room.erl:4040
msgid "Only occupants are allowed to send messages to the conference"
msgstr ""
#: mod_muc/mod_muc_room.erl:634
msgid "Only occupants are allowed to send queries to the conference"
msgstr ""
#: mod_muc/mod_muc_room.erl:646
msgid "Queries to the conference members are not allowed in this room"
msgstr ""
#: mod_muc/mod_muc_room.erl:932
msgid ""
"Only moderators and participants are allowed to change the subject in this "
"room"
msgstr ""
#: mod_muc/mod_muc_room.erl:937
msgid "Only moderators are allowed to change the subject in this room"
msgstr ""
#: mod_muc/mod_muc_room.erl:947
msgid "Visitors are not allowed to send messages to all occupants"
msgstr ""
#: mod_muc/mod_muc_room.erl:1021
msgid ""
"This participant is kicked from the room because he sent an error presence"
msgstr ""
#: mod_muc/mod_muc_room.erl:1040
msgid "Visitors are not allowed to change their nicknames in this room"
msgstr ""
#: mod_muc/mod_muc_room.erl:1053 mod_muc/mod_muc_room.erl:1779
msgid "That nickname is already in use by another occupant"
msgstr ""
#: mod_muc/mod_muc_room.erl:1768
msgid "You have been banned from this room"
msgstr ""
#: mod_muc/mod_muc_room.erl:1771
msgid "Membership is required to enter this room"
msgstr ""
#: mod_muc/mod_muc_room.erl:1807
msgid "This room is not anonymous"
msgstr ""
#: mod_muc/mod_muc_room.erl:1833
msgid "A password is required to enter this room"
msgstr ""
#: mod_muc/mod_muc_room.erl:1855 mod_register.erl:246
msgid "Too many CAPTCHA requests"
msgstr ""
#: mod_muc/mod_muc_room.erl:1864 mod_register.erl:251
msgid "Unable to generate a CAPTCHA"
msgstr ""
#: mod_muc/mod_muc_room.erl:1874
msgid "Incorrect password"
msgstr ""
#: mod_muc/mod_muc_room.erl:2448
msgid "Administrator privileges required"
msgstr ""
#: mod_muc/mod_muc_room.erl:2463
msgid "Moderator privileges required"
msgstr ""
#: mod_muc/mod_muc_room.erl:2619
msgid "Jabber ID ~s is invalid"
msgstr ""
#: mod_muc/mod_muc_room.erl:2633
msgid "Nickname ~s does not exist in the room"
msgstr ""
#: mod_muc/mod_muc_room.erl:2659 mod_muc/mod_muc_room.erl:3049
msgid "Invalid affiliation: ~s"
msgstr ""
#: mod_muc/mod_muc_room.erl:2713
msgid "Invalid role: ~s"
msgstr ""
#: mod_muc/mod_muc_room.erl:3026 mod_muc/mod_muc_room.erl:3062
msgid "Owner privileges required"
msgstr ""
#: mod_muc/mod_muc_room.erl:3195
msgid "Configuration of room ~s"
msgstr ""
#: mod_muc/mod_muc_room.erl:3200
msgid "Room title"
msgstr ""
#: mod_muc/mod_muc_room.erl:3203 mod_muc/mod_muc_room.erl:3692
msgid "Room description"
msgstr ""
#: mod_muc/mod_muc_room.erl:3210
msgid "Make room persistent"
msgstr ""
#: mod_muc/mod_muc_room.erl:3215
msgid "Make room public searchable"
msgstr ""
#: mod_muc/mod_muc_room.erl:3218
msgid "Make participants list public"
msgstr ""
#: mod_muc/mod_muc_room.erl:3221
msgid "Make room password protected"
msgstr ""
#: mod_muc/mod_muc_room.erl:3232
msgid "Maximum Number of Occupants"
msgstr ""
#: mod_muc/mod_muc_room.erl:3239
msgid "No limit"
msgstr ""
#: mod_muc/mod_muc_room.erl:3250
msgid "Present real Jabber IDs to"
msgstr ""
#: mod_muc/mod_muc_room.erl:3258 mod_muc/mod_muc_room.erl:3292
msgid "moderators only"
msgstr ""
#: mod_muc/mod_muc_room.erl:3260 mod_muc/mod_muc_room.erl:3294
msgid "anyone"
msgstr ""
#: mod_muc/mod_muc_room.erl:3262
msgid "Make room members-only"
msgstr ""
#: mod_muc/mod_muc_room.erl:3265
msgid "Make room moderated"
msgstr ""
#: mod_muc/mod_muc_room.erl:3268
msgid "Default users as participants"
msgstr ""
#: mod_muc/mod_muc_room.erl:3271
msgid "Allow users to change the subject"
msgstr ""
#: mod_muc/mod_muc_room.erl:3274
msgid "Allow users to send private messages"
msgstr ""
#: mod_muc/mod_muc_room.erl:3279
msgid "Allow visitors to send private messages to"
msgstr ""
#: mod_muc/mod_muc_room.erl:3290
msgid "nobody"
msgstr ""
#: mod_muc/mod_muc_room.erl:3296
msgid "Allow users to query other users"
msgstr ""
#: mod_muc/mod_muc_room.erl:3299
msgid "Allow users to send invites"
msgstr ""
#: mod_muc/mod_muc_room.erl:3302
msgid "Allow visitors to send status text in presence updates"
msgstr ""
#: mod_muc/mod_muc_room.erl:3305
msgid "Allow visitors to change nickname"
msgstr ""
#: mod_muc/mod_muc_room.erl:3308
msgid "Allow visitors to send voice requests"
msgstr ""
#: mod_muc/mod_muc_room.erl:3311
msgid "Minimum interval between voice requests (in seconds)"
msgstr ""
#: mod_muc/mod_muc_room.erl:3317
msgid "Make room CAPTCHA protected"
msgstr ""
#: mod_muc/mod_muc_room.erl:3322
msgid "Exclude Jabber IDs from CAPTCHA challenge"
msgstr ""
#: mod_muc/mod_muc_room.erl:3329
msgid "Enable logging"
msgstr ""
#: mod_muc/mod_muc_room.erl:3337
msgid "You need an x:data capable client to configure room"
msgstr ""
#: mod_muc/mod_muc_room.erl:3694
msgid "Number of occupants"
msgstr ""
#: mod_muc/mod_muc_room.erl:3750
msgid "private, "
msgstr ""
#: mod_muc/mod_muc_room.erl:3799
msgid "Voice request"
msgstr ""
#: mod_muc/mod_muc_room.erl:3803
msgid "Either approve or decline the voice request."
msgstr ""
#: mod_muc/mod_muc_room.erl:3809
msgid "User JID"
msgstr ""
#: mod_muc/mod_muc_room.erl:3811
msgid "Grant voice to this person?"
msgstr ""
#: mod_muc/mod_muc_room.erl:3960
msgid "~s invites you to the room ~s"
msgstr ""
#: mod_muc/mod_muc_room.erl:3969
msgid "the password is"
msgstr ""
#: mod_offline.erl:510 mod_offline_odbc.erl:352
msgid ""
"Your contact offline message queue is full. The message has been discarded."
msgstr ""
#: mod_offline.erl:560 mod_offline_odbc.erl:408
msgid "~s's Offline Messages Queue"
msgstr ""
#: mod_offline.erl:563 mod_offline_odbc.erl:411 mod_roster.erl:987
#: mod_roster_odbc.erl:1104 mod_shared_roster.erl:901
#: mod_shared_roster.erl:1010 mod_shared_roster_odbc.erl:930
#: mod_shared_roster_odbc.erl:1039 web/ejabberd_web_admin.erl:833
#: web/ejabberd_web_admin.erl:874 web/ejabberd_web_admin.erl:942
#: web/ejabberd_web_admin.erl:978 web/ejabberd_web_admin.erl:1019
#: web/ejabberd_web_admin.erl:1508 web/ejabberd_web_admin.erl:1760
#: web/ejabberd_web_admin.erl:1931 web/ejabberd_web_admin.erl:1963
#: web/ejabberd_web_admin.erl:2031 web/ejabberd_web_admin.erl:2135
#: web/ejabberd_web_admin.erl:2160 web/ejabberd_web_admin.erl:2248
msgid "Submitted"
msgstr ""
#: mod_offline.erl:571
msgid "Time"
msgstr ""
#: mod_offline.erl:572
msgid "From"
msgstr ""
#: mod_offline.erl:573
msgid "To"
msgstr ""
#: mod_offline.erl:574 mod_offline_odbc.erl:419
msgid "Packet"
msgstr ""
#: mod_offline.erl:587 mod_offline_odbc.erl:432 mod_shared_roster.erl:908
#: mod_shared_roster_odbc.erl:937 web/ejabberd_web_admin.erl:882
#: web/ejabberd_web_admin.erl:986
msgid "Delete Selected"
msgstr ""
#: mod_offline.erl:645 mod_offline_odbc.erl:519
msgid "Offline Messages:"
msgstr ""
#: mod_offline.erl:645 mod_offline_odbc.erl:519
msgid "Remove All Offline Messages"
msgstr ""
#: mod_proxy65/mod_proxy65_service.erl:213
msgid "ejabberd SOCKS5 Bytestreams module"
msgstr ""
#: mod_pubsub/mod_pubsub.erl:1120 mod_pubsub/mod_pubsub_odbc.erl:929
msgid "Publish-Subscribe"
msgstr ""
#: mod_pubsub/mod_pubsub.erl:1214 mod_pubsub/mod_pubsub_odbc.erl:1025
msgid "ejabberd Publish-Subscribe module"
msgstr ""
#: mod_pubsub/mod_pubsub.erl:1497 mod_pubsub/mod_pubsub_odbc.erl:1312
msgid "PubSub subscriber request"
msgstr ""
#: mod_pubsub/mod_pubsub.erl:1499 mod_pubsub/mod_pubsub_odbc.erl:1314
msgid "Choose whether to approve this entity's subscription."
msgstr ""
#: mod_pubsub/mod_pubsub.erl:1505 mod_pubsub/mod_pubsub_odbc.erl:1320
msgid "Node ID"
msgstr ""
#: mod_pubsub/mod_pubsub.erl:1510 mod_pubsub/mod_pubsub_odbc.erl:1325
msgid "Subscriber Address"
msgstr ""
#: mod_pubsub/mod_pubsub.erl:1516 mod_pubsub/mod_pubsub_odbc.erl:1331
msgid "Allow this Jabber ID to subscribe to this pubsub node?"
msgstr ""
#: mod_pubsub/mod_pubsub.erl:3474 mod_pubsub/mod_pubsub_odbc.erl:3287
msgid "Deliver payloads with event notifications"
msgstr ""
#: mod_pubsub/mod_pubsub.erl:3475 mod_pubsub/mod_pubsub_odbc.erl:3288
msgid "Deliver event notifications"
msgstr ""
#: mod_pubsub/mod_pubsub.erl:3476 mod_pubsub/mod_pubsub_odbc.erl:3289
msgid "Notify subscribers when the node configuration changes"
msgstr ""
#: mod_pubsub/mod_pubsub.erl:3477 mod_pubsub/mod_pubsub_odbc.erl:3290
msgid "Notify subscribers when the node is deleted"
msgstr ""
#: mod_pubsub/mod_pubsub.erl:3478 mod_pubsub/mod_pubsub_odbc.erl:3291
msgid "Notify subscribers when items are removed from the node"
msgstr ""
#: mod_pubsub/mod_pubsub.erl:3479 mod_pubsub/mod_pubsub_odbc.erl:3292
msgid "Persist items to storage"
msgstr ""
#: mod_pubsub/mod_pubsub.erl:3480 mod_pubsub/mod_pubsub_odbc.erl:3293
msgid "A friendly name for the node"
msgstr ""
#: mod_pubsub/mod_pubsub.erl:3481 mod_pubsub/mod_pubsub_odbc.erl:3294
msgid "Max # of items to persist"
msgstr ""
#: mod_pubsub/mod_pubsub.erl:3482 mod_pubsub/mod_pubsub_odbc.erl:3295
msgid "Whether to allow subscriptions"
msgstr ""
#: mod_pubsub/mod_pubsub.erl:3483 mod_pubsub/mod_pubsub_odbc.erl:3296
msgid "Specify the access model"
msgstr ""
#: mod_pubsub/mod_pubsub.erl:3486 mod_pubsub/mod_pubsub_odbc.erl:3299
msgid "Roster groups allowed to subscribe"
msgstr ""
#: mod_pubsub/mod_pubsub.erl:3487 mod_pubsub/mod_pubsub_odbc.erl:3300
msgid "Specify the publisher model"
msgstr ""
#: mod_pubsub/mod_pubsub.erl:3489 mod_pubsub/mod_pubsub_odbc.erl:3302
msgid "Purge all items when the relevant publisher goes offline"
msgstr ""
#: mod_pubsub/mod_pubsub.erl:3490 mod_pubsub/mod_pubsub_odbc.erl:3303
msgid "Specify the event message type"
msgstr ""
#: mod_pubsub/mod_pubsub.erl:3492 mod_pubsub/mod_pubsub_odbc.erl:3305
msgid "Max payload size in bytes"
msgstr ""
#: mod_pubsub/mod_pubsub.erl:3493 mod_pubsub/mod_pubsub_odbc.erl:3306
msgid "When to send the last published item"
msgstr ""
#: mod_pubsub/mod_pubsub.erl:3495 mod_pubsub/mod_pubsub_odbc.erl:3308
msgid "Only deliver notifications to available users"
msgstr ""
#: mod_pubsub/mod_pubsub.erl:3496 mod_pubsub/mod_pubsub_odbc.erl:3309
msgid "The collections with which a node is affiliated"
msgstr ""
#: mod_register.erl:193
msgid "The CAPTCHA verification has failed"
msgstr ""
#: mod_register.erl:220
msgid "You need a client that supports x:data and CAPTCHA to register"
msgstr ""
#: mod_register.erl:226 mod_register.erl:265
msgid "Choose a username and password to register with this server"
msgstr ""
#: mod_register.erl:230 mod_vcard.erl:364 mod_vcard_odbc.erl:342
#: web/ejabberd_web_admin.erl:1515 web/ejabberd_web_admin.erl:1572
msgid "User"
msgstr ""
#: mod_register.erl:316 mod_register.erl:361
msgid "The password is too weak"
msgstr ""
#: mod_register.erl:365
msgid "Users are not allowed to register accounts so quickly"
msgstr ""
#: mod_roster.erl:938 mod_roster_odbc.erl:1055 web/ejabberd_web_admin.erl:1701
#: web/ejabberd_web_admin.erl:1886 web/ejabberd_web_admin.erl:1897
#: web/ejabberd_web_admin.erl:2219
msgid "None"
msgstr ""
#: mod_roster.erl:945 mod_roster_odbc.erl:1062
msgid "Subscription"
msgstr ""
#: mod_roster.erl:946 mod_roster_odbc.erl:1063
msgid "Pending"
msgstr ""
#: mod_roster.erl:947 mod_roster_odbc.erl:1064
msgid "Groups"
msgstr ""
#: mod_roster.erl:974 mod_roster_odbc.erl:1091
msgid "Validate"
msgstr ""
#: mod_roster.erl:982 mod_roster_odbc.erl:1099
msgid "Remove"
msgstr ""
#: mod_roster.erl:985 mod_roster_odbc.erl:1102
msgid "Roster of "
msgstr ""
#: mod_roster.erl:988 mod_roster_odbc.erl:1105 mod_shared_roster.erl:902
#: mod_shared_roster.erl:1011 mod_shared_roster_odbc.erl:931
#: mod_shared_roster_odbc.erl:1040 web/ejabberd_web_admin.erl:834
#: web/ejabberd_web_admin.erl:875 web/ejabberd_web_admin.erl:943
#: web/ejabberd_web_admin.erl:979 web/ejabberd_web_admin.erl:1020
#: web/ejabberd_web_admin.erl:1509 web/ejabberd_web_admin.erl:1761
#: web/ejabberd_web_admin.erl:1932 web/ejabberd_web_admin.erl:2136
#: web/ejabberd_web_admin.erl:2161
msgid "Bad format"
msgstr ""
#: mod_roster.erl:995 mod_roster_odbc.erl:1112
msgid "Add Jabber ID"
msgstr ""
#: mod_roster.erl:1094 mod_roster_odbc.erl:1211
msgid "Roster"
msgstr ""
#: mod_shared_roster.erl:857 mod_shared_roster.erl:899
#: mod_shared_roster.erl:1007 mod_shared_roster_odbc.erl:886
#: mod_shared_roster_odbc.erl:928 mod_shared_roster_odbc.erl:1036
msgid "Shared Roster Groups"
msgstr ""
#: mod_shared_roster.erl:895 mod_shared_roster_odbc.erl:924
#: web/ejabberd_web_admin.erl:1365 web/ejabberd_web_admin.erl:2461
msgid "Add New"
msgstr ""
#: mod_shared_roster.erl:978 mod_shared_roster_odbc.erl:1007
msgid "Name:"
msgstr ""
#: mod_shared_roster.erl:983 mod_shared_roster_odbc.erl:1012
msgid "Description:"
msgstr ""
#: mod_shared_roster.erl:991 mod_shared_roster_odbc.erl:1020
msgid "Members:"
msgstr ""
#: mod_shared_roster.erl:999 mod_shared_roster_odbc.erl:1028
msgid "Displayed Groups:"
msgstr ""
#: mod_shared_roster.erl:1008 mod_shared_roster_odbc.erl:1037
msgid "Group "
msgstr ""
#: mod_shared_roster.erl:1017 mod_shared_roster_odbc.erl:1046
#: web/ejabberd_web_admin.erl:840 web/ejabberd_web_admin.erl:884
#: web/ejabberd_web_admin.erl:949 web/ejabberd_web_admin.erl:1026
#: web/ejabberd_web_admin.erl:2017
msgid "Submit"
msgstr ""
#: mod_vcard.erl:165 mod_vcard_ldap.erl:238 mod_vcard_odbc.erl:129
msgid "Erlang Jabber Server"
msgstr ""
#: mod_vcard.erl:364 mod_vcard.erl:478 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:454
msgid "Birthday"
msgstr ""
#: mod_vcard.erl:364 mod_vcard.erl:480 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:456
msgid "City"
msgstr ""
#: mod_vcard.erl:364 mod_vcard.erl:479 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:455
msgid "Country"
msgstr ""
#: mod_vcard.erl:364 mod_vcard.erl:481 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:457
msgid "Email"
msgstr ""
#: mod_vcard.erl:364 mod_vcard.erl:476 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:452
msgid "Family Name"
msgstr ""
#: mod_vcard.erl:364 mod_vcard_odbc.erl:342
msgid ""
"Fill in the form to search for any matching Jabber User (Add * to the end of "
"field to match substring)"
msgstr ""
#: mod_vcard.erl:364 mod_vcard.erl:473 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:449
msgid "Full Name"
msgstr ""
#: mod_vcard.erl:364 mod_vcard.erl:475 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:451
msgid "Middle Name"
msgstr ""
#: mod_vcard.erl:364 mod_vcard.erl:474 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:450 web/ejabberd_web_admin.erl:2006
msgid "Name"
msgstr ""
#: mod_vcard.erl:364 mod_vcard.erl:482 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:458
msgid "Organization Name"
msgstr ""
#: mod_vcard.erl:364 mod_vcard.erl:483 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:459
msgid "Organization Unit"
msgstr ""
#: mod_vcard.erl:364 mod_vcard_ldap.erl:462 mod_vcard_odbc.erl:342
msgid "Search users in "
msgstr ""
#: mod_vcard.erl:364 mod_vcard_ldap.erl:462 mod_vcard_odbc.erl:342
msgid "You need an x:data capable client to search"
msgstr ""
#: mod_vcard.erl:389 mod_vcard_ldap.erl:487 mod_vcard_odbc.erl:367
msgid "vCard User Search"
msgstr ""
#: mod_vcard.erl:445 mod_vcard_ldap.erl:541 mod_vcard_odbc.erl:421
msgid "ejabberd vCard module"
msgstr ""
#: mod_vcard.erl:469 mod_vcard_ldap.erl:551 mod_vcard_odbc.erl:445
msgid "Search Results for "
msgstr ""
#: mod_vcard_ldap.erl:462
msgid "Fill in fields to search for any matching Jabber User"
msgstr ""
#: web/ejabberd_web_admin.erl:193 web/ejabberd_web_admin.erl:203
#: web/ejabberd_web_admin.erl:219 web/ejabberd_web_admin.erl:229
msgid "Unauthorized"
msgstr ""
#: web/ejabberd_web_admin.erl:286 web/ejabberd_web_admin.erl:303
msgid "ejabberd Web Admin"
msgstr ""
#: web/ejabberd_web_admin.erl:769 web/ejabberd_web_admin.erl:780
msgid "Administration"
msgstr ""
#: web/ejabberd_web_admin.erl:878 web/ejabberd_web_admin.erl:982
msgid "Raw"
msgstr ""
#: web/ejabberd_web_admin.erl:1017
msgid "~s access rule configuration"
msgstr ""
#: web/ejabberd_web_admin.erl:1035
msgid "Virtual Hosts"
msgstr ""
#: web/ejabberd_web_admin.erl:1043 web/ejabberd_web_admin.erl:1050
msgid "Users"
msgstr ""
#: web/ejabberd_web_admin.erl:1078
msgid "Users Last Activity"
msgstr ""
#: web/ejabberd_web_admin.erl:1080
msgid "Period: "
msgstr ""
#: web/ejabberd_web_admin.erl:1090
msgid "Last month"
msgstr ""
#: web/ejabberd_web_admin.erl:1091
msgid "Last year"
msgstr ""
#: web/ejabberd_web_admin.erl:1092
msgid "All activity"
msgstr ""
#: web/ejabberd_web_admin.erl:1094
msgid "Show Ordinary Table"
msgstr ""
#: web/ejabberd_web_admin.erl:1096
msgid "Show Integral Table"
msgstr ""
#: web/ejabberd_web_admin.erl:1105 web/ejabberd_web_admin.erl:1939
msgid "Statistics"
msgstr ""
#: web/ejabberd_web_admin.erl:1117
msgid "Not Found"
msgstr ""
#: web/ejabberd_web_admin.erl:1134
msgid "Node not found"
msgstr ""
#: web/ejabberd_web_admin.erl:1460
msgid "Host"
msgstr ""
#: web/ejabberd_web_admin.erl:1461
msgid "Registered Users"
msgstr ""
#: web/ejabberd_web_admin.erl:1573
msgid "Offline Messages"
msgstr ""
#: web/ejabberd_web_admin.erl:1574 web/ejabberd_web_admin.erl:1767
msgid "Last Activity"
msgstr ""
#: web/ejabberd_web_admin.erl:1659 web/ejabberd_web_admin.erl:1675
msgid "Registered Users:"
msgstr ""
#: web/ejabberd_web_admin.erl:1661 web/ejabberd_web_admin.erl:1677
#: web/ejabberd_web_admin.erl:2192
msgid "Online Users:"
msgstr ""
#: web/ejabberd_web_admin.erl:1663
msgid "Outgoing s2s Connections:"
msgstr ""
#: web/ejabberd_web_admin.erl:1665
msgid "Outgoing s2s Servers:"
msgstr ""
#: web/ejabberd_web_admin.erl:1734 web/mod_register_web.erl:175
#: web/mod_register_web.erl:372 web/mod_register_web.erl:381
#: web/mod_register_web.erl:411
msgid "Change Password"
msgstr ""
#: web/ejabberd_web_admin.erl:1758
msgid "User "
msgstr ""
#: web/ejabberd_web_admin.erl:1765
msgid "Connected Resources:"
msgstr ""
#: web/ejabberd_web_admin.erl:1766 web/mod_register_web.erl:227
#: web/mod_register_web.erl:519
msgid "Password:"
msgstr ""
#: web/ejabberd_web_admin.erl:1828
msgid "No Data"
msgstr ""
#: web/ejabberd_web_admin.erl:1906
msgid "Nodes"
msgstr ""
#: web/ejabberd_web_admin.erl:1929 web/ejabberd_web_admin.erl:1951
msgid "Node "
msgstr ""
#: web/ejabberd_web_admin.erl:1938
msgid "Listened Ports"
msgstr ""
#: web/ejabberd_web_admin.erl:1940 web/ejabberd_web_admin.erl:2260
#: web/ejabberd_web_admin.erl:2448
msgid "Update"
msgstr ""
#: web/ejabberd_web_admin.erl:1943 web/ejabberd_web_admin.erl:2569
msgid "Restart"
msgstr ""
#: web/ejabberd_web_admin.erl:1945 web/ejabberd_web_admin.erl:2571
msgid "Stop"
msgstr ""
#: web/ejabberd_web_admin.erl:1959
msgid "RPC Call Error"
msgstr ""
#: web/ejabberd_web_admin.erl:2000
msgid "Database Tables at "
msgstr ""
#: web/ejabberd_web_admin.erl:2007
msgid "Storage Type"
msgstr ""
#: web/ejabberd_web_admin.erl:2008
msgid "Elements"
msgstr ""
#: web/ejabberd_web_admin.erl:2009
msgid "Memory"
msgstr ""
#: web/ejabberd_web_admin.erl:2032 web/ejabberd_web_admin.erl:2137
msgid "Error"
msgstr ""
#: web/ejabberd_web_admin.erl:2034
msgid "Backup of "
msgstr ""
#: web/ejabberd_web_admin.erl:2036
msgid ""
"Please note that these options will only backup the builtin Mnesia database. "
"If you are using the ODBC module, you also need to backup your SQL database "
"separately."
msgstr ""
#: web/ejabberd_web_admin.erl:2041
msgid "Store binary backup:"
msgstr ""
#: web/ejabberd_web_admin.erl:2045 web/ejabberd_web_admin.erl:2052
#: web/ejabberd_web_admin.erl:2060 web/ejabberd_web_admin.erl:2067
#: web/ejabberd_web_admin.erl:2074 web/ejabberd_web_admin.erl:2081
#: web/ejabberd_web_admin.erl:2088 web/ejabberd_web_admin.erl:2096
#: web/ejabberd_web_admin.erl:2103 web/ejabberd_web_admin.erl:2110
msgid "OK"
msgstr ""
#: web/ejabberd_web_admin.erl:2048
msgid "Restore binary backup immediately:"
msgstr ""
#: web/ejabberd_web_admin.erl:2056
msgid ""
"Restore binary backup after next ejabberd restart (requires less memory):"
msgstr ""
#: web/ejabberd_web_admin.erl:2063
msgid "Store plain text backup:"
msgstr ""
#: web/ejabberd_web_admin.erl:2070
msgid "Restore plain text backup immediately:"
msgstr ""
#: web/ejabberd_web_admin.erl:2077
msgid "Import users data from a PIEFXIS file (XEP-0227):"
msgstr ""
#: web/ejabberd_web_admin.erl:2084
msgid "Export data of all users in the server to PIEFXIS files (XEP-0227):"
msgstr ""
#: web/ejabberd_web_admin.erl:2091
msgid "Export data of users in a host to PIEFXIS files (XEP-0227):"
msgstr ""
#: web/ejabberd_web_admin.erl:2099
msgid "Import user data from jabberd14 spool file:"
msgstr ""
#: web/ejabberd_web_admin.erl:2106
msgid "Import users data from jabberd14 spool directory:"
msgstr ""
#: web/ejabberd_web_admin.erl:2132
msgid "Listened Ports at "
msgstr ""
#: web/ejabberd_web_admin.erl:2157
msgid "Modules at "
msgstr ""
#: web/ejabberd_web_admin.erl:2183
msgid "Statistics of ~p"
msgstr ""
#: web/ejabberd_web_admin.erl:2186
msgid "Uptime:"
msgstr ""
#: web/ejabberd_web_admin.erl:2189
msgid "CPU Time:"
msgstr ""
#: web/ejabberd_web_admin.erl:2195
msgid "Transactions Committed:"
msgstr ""
#: web/ejabberd_web_admin.erl:2198
msgid "Transactions Aborted:"
msgstr ""
#: web/ejabberd_web_admin.erl:2201
msgid "Transactions Restarted:"
msgstr ""
#: web/ejabberd_web_admin.erl:2204
msgid "Transactions Logged:"
msgstr ""
#: web/ejabberd_web_admin.erl:2246
msgid "Update "
msgstr ""
#: web/ejabberd_web_admin.erl:2254
msgid "Update plan"
msgstr ""
#: web/ejabberd_web_admin.erl:2255
msgid "Modified modules"
msgstr ""
#: web/ejabberd_web_admin.erl:2256
msgid "Update script"
msgstr ""
#: web/ejabberd_web_admin.erl:2257
msgid "Low level update script"
msgstr ""
#: web/ejabberd_web_admin.erl:2258
msgid "Script check"
msgstr ""
#: web/ejabberd_web_admin.erl:2426
msgid "Port"
msgstr ""
#: web/ejabberd_web_admin.erl:2427
msgid "IP"
msgstr ""
#: web/ejabberd_web_admin.erl:2428
msgid "Protocol"
msgstr ""
#: web/ejabberd_web_admin.erl:2429 web/ejabberd_web_admin.erl:2556
msgid "Module"
msgstr ""
#: web/ejabberd_web_admin.erl:2430 web/ejabberd_web_admin.erl:2557
msgid "Options"
msgstr ""
#: web/ejabberd_web_admin.erl:2450
msgid "Delete"
msgstr ""
#: web/ejabberd_web_admin.erl:2579
msgid "Start"
msgstr ""
#: web/mod_register_web.erl:104
msgid "Your Jabber account was successfully created."
msgstr ""
#: web/mod_register_web.erl:107
msgid "There was an error creating the account: "
msgstr ""
#: web/mod_register_web.erl:115
msgid "Your Jabber account was successfully deleted."
msgstr ""
#: web/mod_register_web.erl:118
msgid "There was an error deleting the account: "
msgstr ""
#: web/mod_register_web.erl:128
msgid "The password of your Jabber account was successfully changed."
msgstr ""
#: web/mod_register_web.erl:131
msgid "There was an error changing the password: "
msgstr ""
#: web/mod_register_web.erl:163 web/mod_register_web.erl:172
msgid "Jabber Account Registration"
msgstr ""
#: web/mod_register_web.erl:174 web/mod_register_web.erl:192
#: web/mod_register_web.erl:201
msgid "Register a Jabber account"
msgstr ""
#: web/mod_register_web.erl:176 web/mod_register_web.erl:493
#: web/mod_register_web.erl:502
msgid "Unregister a Jabber account"
msgstr ""
#: web/mod_register_web.erl:203
msgid ""
"This page allows to create a Jabber account in this Jabber server. Your JID "
"(Jabber IDentifier) will be of the form: username@server. Please read "
"carefully the instructions to fill correctly the fields."
msgstr ""
#: web/mod_register_web.erl:212 web/mod_register_web.erl:386
#: web/mod_register_web.erl:509
msgid "Username:"
msgstr ""
#: web/mod_register_web.erl:217
msgid "This is case insensitive: macbeth is the same that MacBeth and Macbeth."
msgstr ""
#: web/mod_register_web.erl:218
msgid "Characters not allowed:"
msgstr ""
#: web/mod_register_web.erl:222 web/mod_register_web.erl:391
#: web/mod_register_web.erl:514
msgid "Server:"
msgstr ""
#: web/mod_register_web.erl:232
msgid ""
"Don't tell your password to anybody, not even the administrators of the "
"Jabber server."
msgstr ""
#: web/mod_register_web.erl:234
msgid "You can later change your password using a Jabber client."
msgstr ""
#: web/mod_register_web.erl:235
msgid ""
"Some Jabber clients can store your password in your computer. Use that "
"feature only if you trust your computer is safe."
msgstr ""
#: web/mod_register_web.erl:237
msgid ""
"Memorize your password, or write it in a paper placed in a safe place. In "
"Jabber there isn't an automated way to recover your password if you forget "
"it."
msgstr ""
#: web/mod_register_web.erl:242 web/mod_register_web.erl:406
msgid "Password Verification:"
msgstr ""
#: web/mod_register_web.erl:250
msgid "Register"
msgstr ""
#: web/mod_register_web.erl:396
msgid "Old Password:"
msgstr ""
#: web/mod_register_web.erl:401
msgid "New Password:"
msgstr ""
#: web/mod_register_web.erl:504
msgid "This page allows to unregister a Jabber account in this Jabber server."
msgstr ""
#: web/mod_register_web.erl:524
msgid "Unregister"
msgstr ""
ejabberd-2.1.11/src/msgs/nl.po 0000664 0000000 0000000 00000155610 12240230175 012737 0 ustar msgid ""
msgstr ""
"Project-Id-Version: 2.1.0-alpha\n"
"POT-Creation-Date: \n"
"PO-Revision-Date: \n"
"Last-Translator: Andreas van Cranenburgh \n"
"Language-Team: \n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Language: Dutch (nederlands)\n"
"X-Additional-Translator: Sander Devrieze\n"
#: ejabberd_c2s.erl:424 ejabberd_c2s.erl:727
msgid "Use of STARTTLS required"
msgstr "Gebruik van STARTTLS is vereist"
#: ejabberd_c2s.erl:503
msgid "No resource provided"
msgstr "Geen bron opgegeven"
#: ejabberd_c2s.erl:1197
msgid "Replaced by new connection"
msgstr "Vervangen door een nieuwe verbinding"
#: ejabberd_c2s.erl:1885
msgid "Your active privacy list has denied the routing of this stanza."
msgstr "Uw actieve privacy-lijst verbied het routeren van dit stanza."
#: ejabberd_captcha.erl:96 ejabberd_captcha.erl:152 ejabberd_captcha.erl:178
msgid "Enter the text you see"
msgstr "Voer de getoonde tekst in"
#: ejabberd_captcha.erl:101
msgid "Your messages to ~s are being blocked. To unblock them, visit ~s"
msgstr ""
"Uw berichten aan ~s worden geblokkeerd. Om ze te deblokkeren, ga naar ~s"
#: ejabberd_captcha.erl:134
msgid "If you don't see the CAPTCHA image here, visit the web page."
msgstr "Als U het CAPTCHA-plaatje niet ziet, bezoek dan de webpagina."
#: ejabberd_captcha.erl:146
msgid "CAPTCHA web page"
msgstr "CAPTCHA webpagina."
#: ejabberd_captcha.erl:307
msgid "The CAPTCHA is valid."
msgstr "De geautomatiseerde Turing-test is geslaagd."
#: mod_adhoc.erl:95 mod_adhoc.erl:125 mod_adhoc.erl:143 mod_adhoc.erl:161
msgid "Commands"
msgstr "Commando's"
#: mod_adhoc.erl:149 mod_adhoc.erl:243
msgid "Ping"
msgstr "Ping"
#: mod_adhoc.erl:260
msgid "Pong"
msgstr "Pong"
#: mod_announce.erl:507 mod_announce_odbc.erl:499
msgid "Really delete message of the day?"
msgstr "Wilt u het bericht van de dag verwijderen?"
#: mod_announce.erl:515 mod_announce_odbc.erl:507 mod_configure.erl:1083
#: mod_configure.erl:1128
msgid "Subject"
msgstr "Onderwerp"
#: mod_announce.erl:520 mod_announce_odbc.erl:512 mod_configure.erl:1088
#: mod_configure.erl:1133
msgid "Message body"
msgstr "Bericht"
#: mod_announce.erl:600 mod_announce_odbc.erl:592
msgid "No body provided for announce message"
msgstr "De mededeling bevat geen bericht"
#: mod_announce.erl:635 mod_announce_odbc.erl:627
msgid "Announcements"
msgstr "Mededelingen"
#: mod_announce.erl:637 mod_announce_odbc.erl:629
msgid "Send announcement to all users"
msgstr "Mededeling verzenden naar alle gebruikers"
#: mod_announce.erl:639 mod_announce_odbc.erl:631
msgid "Send announcement to all users on all hosts"
msgstr "Stuur aankondiging aan alle gebruikers op alle hosts"
#: mod_announce.erl:641 mod_announce_odbc.erl:633
msgid "Send announcement to all online users"
msgstr "Mededeling verzenden naar alle online gebruikers"
#: mod_announce.erl:643 mod_announce_odbc.erl:635 mod_configure.erl:1078
#: mod_configure.erl:1123
msgid "Send announcement to all online users on all hosts"
msgstr ""
"Mededeling verzenden naar alle online gebruikers op alle virtuele hosts"
#: mod_announce.erl:645 mod_announce_odbc.erl:637
msgid "Set message of the day and send to online users"
msgstr "Bericht van de dag instellen en verzenden naar online gebruikers"
#: mod_announce.erl:647 mod_announce_odbc.erl:639
msgid "Set message of the day on all hosts and send to online users"
msgstr ""
"Stel bericht-van-de-dag in op alle hosts en stuur naar aanwezige gebruikers"
#: mod_announce.erl:649 mod_announce_odbc.erl:641
msgid "Update message of the day (don't send)"
msgstr "Bericht van de dag bijwerken (niet verzenden)"
#: mod_announce.erl:651 mod_announce_odbc.erl:643
msgid "Update message of the day on all hosts (don't send)"
msgstr "Verander bericht-van-de-dag op alle hosts (niet versturen)"
#: mod_announce.erl:653 mod_announce_odbc.erl:645
msgid "Delete message of the day"
msgstr "Bericht van de dag verwijderen"
#: mod_announce.erl:655 mod_announce_odbc.erl:647
msgid "Delete message of the day on all hosts"
msgstr "Verwijder bericht-van-de-dag op alle hosts"
#: mod_configure.erl:114 mod_configure.erl:274 mod_configure.erl:296
#: mod_configure.erl:498
msgid "Configuration"
msgstr "Instellingen"
#: mod_configure.erl:125 mod_configure.erl:576 web/ejabberd_web_admin.erl:1936
msgid "Database"
msgstr "Database"
#: mod_configure.erl:127 mod_configure.erl:595
msgid "Start Modules"
msgstr "Modules starten"
#: mod_configure.erl:129 mod_configure.erl:596
msgid "Stop Modules"
msgstr "Modules stoppen"
#: mod_configure.erl:131 mod_configure.erl:604 web/ejabberd_web_admin.erl:1937
msgid "Backup"
msgstr "Backup"
#: mod_configure.erl:133 mod_configure.erl:605
msgid "Restore"
msgstr "Binaire backup direct herstellen"
#: mod_configure.erl:135 mod_configure.erl:606
msgid "Dump to Text File"
msgstr "Backup naar een tekstbestand schrijven"
#: mod_configure.erl:137 mod_configure.erl:615
msgid "Import File"
msgstr "Bestand importeren"
#: mod_configure.erl:139 mod_configure.erl:616
msgid "Import Directory"
msgstr "Directory importeren"
#: mod_configure.erl:141 mod_configure.erl:581 mod_configure.erl:1057
msgid "Restart Service"
msgstr "Herstart Service"
#: mod_configure.erl:143 mod_configure.erl:582 mod_configure.erl:1102
msgid "Shut Down Service"
msgstr "Stop Service"
#: mod_configure.erl:145 mod_configure.erl:518 mod_configure.erl:1197
#: web/ejabberd_web_admin.erl:1527
msgid "Add User"
msgstr "Gebruiker toevoegen"
#: mod_configure.erl:147 mod_configure.erl:519 mod_configure.erl:1219
msgid "Delete User"
msgstr "Verwijder Gebruiker"
#: mod_configure.erl:149 mod_configure.erl:520 mod_configure.erl:1231
msgid "End User Session"
msgstr "Verwijder Gebruikers-sessie"
#: mod_configure.erl:151 mod_configure.erl:521 mod_configure.erl:1243
#: mod_configure.erl:1255
msgid "Get User Password"
msgstr "Gebruikerswachtwoord Opvragen"
#: mod_configure.erl:153 mod_configure.erl:522
msgid "Change User Password"
msgstr "Verander Gebruikerswachtwoord"
#: mod_configure.erl:155 mod_configure.erl:523 mod_configure.erl:1272
msgid "Get User Last Login Time"
msgstr "Tijd van Laatste Aanmelding Opvragen"
#: mod_configure.erl:157 mod_configure.erl:524 mod_configure.erl:1284
msgid "Get User Statistics"
msgstr "Gebruikers-statistieken Opvragen"
#: mod_configure.erl:159 mod_configure.erl:525
msgid "Get Number of Registered Users"
msgstr "Aantal Geregistreerde Gebruikers Opvragen"
#: mod_configure.erl:161 mod_configure.erl:526
msgid "Get Number of Online Users"
msgstr "Aantal Aanwezige Gebruikers Opvragen"
#: mod_configure.erl:163 mod_configure.erl:509 web/ejabberd_web_admin.erl:831
#: web/ejabberd_web_admin.erl:872
msgid "Access Control Lists"
msgstr "Access control lists"
#: mod_configure.erl:165 mod_configure.erl:510 web/ejabberd_web_admin.erl:940
#: web/ejabberd_web_admin.erl:976
msgid "Access Rules"
msgstr "Access rules"
#: mod_configure.erl:297 mod_configure.erl:499
msgid "User Management"
msgstr "Gebruikersbeheer"
#: mod_configure.erl:500 web/ejabberd_web_admin.erl:1058
#: web/ejabberd_web_admin.erl:1462
msgid "Online Users"
msgstr "Online gebruikers"
#: mod_configure.erl:501
msgid "All Users"
msgstr "Alle gebruikers"
#: mod_configure.erl:502
msgid "Outgoing s2s Connections"
msgstr "Uitgaande s2s-verbindingen"
#: mod_configure.erl:503 web/ejabberd_web_admin.erl:1907
msgid "Running Nodes"
msgstr "Draaiende nodes"
#: mod_configure.erl:504 web/ejabberd_web_admin.erl:1909
msgid "Stopped Nodes"
msgstr "Gestopte nodes"
#: mod_configure.erl:577 mod_configure.erl:587 web/ejabberd_web_admin.erl:1953
msgid "Modules"
msgstr "Modules"
#: mod_configure.erl:578
msgid "Backup Management"
msgstr "Backup"
#: mod_configure.erl:579
msgid "Import Users From jabberd14 Spool Files"
msgstr "Importeer gebruikers via spool-bestanden van jabberd14"
#: mod_configure.erl:699
msgid "To ~s"
msgstr "Naar ~s"
#: mod_configure.erl:717
msgid "From ~s"
msgstr "Van ~s"
#: mod_configure.erl:913
msgid "Database Tables Configuration at "
msgstr "Instellingen van databasetabellen op "
#: mod_configure.erl:918
msgid "Choose storage type of tables"
msgstr "Opslagmethode voor tabellen kiezen"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "Disc only copy"
msgstr "Harde schijf"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "RAM and disc copy"
msgstr "RAM en harde schijf"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "RAM copy"
msgstr "RAM"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "Remote copy"
msgstr "Op andere nodes in de cluster"
#: mod_configure.erl:950
msgid "Stop Modules at "
msgstr "Modules stoppen op "
#: mod_configure.erl:954
msgid "Choose modules to stop"
msgstr "Selecteer de modules die u wilt stoppen"
#: mod_configure.erl:969
msgid "Start Modules at "
msgstr "Modules starten op "
#: mod_configure.erl:973
msgid "Enter list of {Module, [Options]}"
msgstr "Voer lijst met op te starten modules als volgt in: {Module, [Opties]}"
#: mod_configure.erl:974
msgid "List of modules to start"
msgstr "Lijst met op te starten modules"
#: mod_configure.erl:983
msgid "Backup to File at "
msgstr "Binaire backup maken op "
#: mod_configure.erl:987 mod_configure.erl:1001
msgid "Enter path to backup file"
msgstr "Voer pad naar backupbestand in"
#: mod_configure.erl:988 mod_configure.erl:1002 mod_configure.erl:1016
#: mod_configure.erl:1030
msgid "Path to File"
msgstr "Pad naar bestand"
#: mod_configure.erl:997
msgid "Restore Backup from File at "
msgstr "Binaire backup direct herstellen op "
#: mod_configure.erl:1011
msgid "Dump Backup to Text File at "
msgstr "Backup naar een tekstbestand schrijven op "
#: mod_configure.erl:1015
msgid "Enter path to text file"
msgstr "Voer pad naar backupbestand in"
#: mod_configure.erl:1025
msgid "Import User from File at "
msgstr "Importeer gebruiker via bestand op "
#: mod_configure.erl:1029
msgid "Enter path to jabberd14 spool file"
msgstr "Voer pad naar jabberd14-spool-bestand in"
#: mod_configure.erl:1039
msgid "Import Users from Dir at "
msgstr "Gebruikers importeren vanaf directory op "
#: mod_configure.erl:1043
msgid "Enter path to jabberd14 spool dir"
msgstr "Voer pad naar jabberd14-spool-directory in"
#: mod_configure.erl:1044
msgid "Path to Dir"
msgstr "Pad naar directory"
#: mod_configure.erl:1060 mod_configure.erl:1105
msgid "Time delay"
msgstr "Vertraging"
#: mod_configure.erl:1143
msgid "Access Control List Configuration"
msgstr "Instellingen van access control lists"
#: mod_configure.erl:1147
msgid "Access control lists"
msgstr "Access control lists"
#: mod_configure.erl:1171
msgid "Access Configuration"
msgstr "Toegangsinstellingen"
#: mod_configure.erl:1175
msgid "Access rules"
msgstr "Access rules"
#: mod_configure.erl:1200 mod_configure.erl:1222 mod_configure.erl:1234
#: mod_configure.erl:1246 mod_configure.erl:1258 mod_configure.erl:1275
#: mod_configure.erl:1287 mod_configure.erl:1650 mod_configure.erl:1700
#: mod_configure.erl:1721 mod_roster.erl:943 mod_roster_odbc.erl:1060
#: mod_vcard.erl:472 mod_vcard_ldap.erl:554 mod_vcard_odbc.erl:448
msgid "Jabber ID"
msgstr "Jabber ID"
#: mod_configure.erl:1205 mod_configure.erl:1263 mod_configure.erl:1651
#: mod_configure.erl:1863 mod_muc/mod_muc_room.erl:3224 mod_register.erl:235
#: web/ejabberd_web_admin.erl:1520
msgid "Password"
msgstr "Wachtwoord"
#: mod_configure.erl:1210
msgid "Password Verification"
msgstr "Wachtwoord Bevestiging"
#: mod_configure.erl:1301
msgid "Number of registered users"
msgstr "Aantal Geregistreerde Gebruikers"
#: mod_configure.erl:1315
msgid "Number of online users"
msgstr "Aantal Aanwezige Gebruikers"
#: mod_configure.erl:1682 web/ejabberd_web_admin.erl:1588
#: web/ejabberd_web_admin.erl:1743
msgid "Never"
msgstr "Nooit"
#: mod_configure.erl:1696 web/ejabberd_web_admin.erl:1601
#: web/ejabberd_web_admin.erl:1756
msgid "Online"
msgstr "Online"
#: mod_configure.erl:1701
msgid "Last login"
msgstr "Laatste Aanmelding"
#: mod_configure.erl:1722
msgid "Roster size"
msgstr "Contactlijst Groote"
#: mod_configure.erl:1723
msgid "IP addresses"
msgstr "IP-adres"
#: mod_configure.erl:1724
msgid "Resources"
msgstr "Bronnen"
#: mod_configure.erl:1850
msgid "Administration of "
msgstr "Beheer van "
#: mod_configure.erl:1853
msgid "Action on user"
msgstr "Actie op gebruiker"
#: mod_configure.erl:1857
msgid "Edit Properties"
msgstr "Eigenschappen bewerken"
#: mod_configure.erl:1860 web/ejabberd_web_admin.erl:1769
msgid "Remove User"
msgstr "Gebruiker verwijderen"
#: mod_irc/mod_irc.erl:201 mod_irc/mod_irc_odbc.erl:196
#: mod_muc/mod_muc.erl:336 mod_muc/mod_muc_odbc.erl:342
msgid "Access denied by service policy"
msgstr "De toegang werd geweigerd door het beleid van deze dienst"
#: mod_irc/mod_irc.erl:401 mod_irc/mod_irc_odbc.erl:398
msgid "IRC Transport"
msgstr "IRC Transport"
#: mod_irc/mod_irc.erl:428 mod_irc/mod_irc_odbc.erl:425
msgid "ejabberd IRC module"
msgstr "ejabberd's IRC-module"
#: mod_irc/mod_irc.erl:559 mod_irc/mod_irc_odbc.erl:568
msgid "You need an x:data capable client to configure mod_irc settings"
msgstr ""
"U hebt een client nodig die x:data ondersteunt om dit IRC-transport in te "
"stellen"
#: mod_irc/mod_irc.erl:566 mod_irc/mod_irc_odbc.erl:575
msgid "Registration in mod_irc for "
msgstr "Registratie van "
#: mod_irc/mod_irc.erl:571 mod_irc/mod_irc_odbc.erl:580
msgid ""
"Enter username, encodings, ports and passwords you wish to use for "
"connecting to IRC servers"
msgstr ""
"Voer de gebruikersnaam, coderingen, poorten en wachtwoorden in die U wilt "
"gebruiken voor het verbinden met IRC-servers"
#: mod_irc/mod_irc.erl:576 mod_irc/mod_irc_odbc.erl:585
msgid "IRC Username"
msgstr "Gebruikersnaam voor IRC:"
#: mod_irc/mod_irc.erl:586 mod_irc/mod_irc_odbc.erl:595
msgid ""
"If you want to specify different ports, passwords, encodings for IRC "
"servers, fill this list with values in format '{\"irc server\", \"encoding"
"\", port, \"password\"}'. By default this service use \"~s\" encoding, port "
"~p, empty password."
msgstr ""
"Als u verschillende poorten, wachtwoorden en coderingen wilt opgeven voor "
"elke IRC-server, vul dan deze lijst met het volgende formaat: '{\"IRC-server"
"\", \"codering\", poort, \"wachtwoord\"}'. Standaard gebruikt deze service "
"de codering \"~s\", poort ~p, leeg wachtwoord."
#: mod_irc/mod_irc.erl:598 mod_irc/mod_irc_odbc.erl:607
msgid ""
"Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef."
"net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."
msgstr ""
"Voorbeeld: [{\"irc.example.org\", \"koi8-r\", 6667, \"geheim\"}, {\"vendetta."
"example.net\", \"iso8859-1\", 7000}, {irc,testserver.nl\", \"utf-8\"}]."
#: mod_irc/mod_irc.erl:603 mod_irc/mod_irc_odbc.erl:612
msgid "Connections parameters"
msgstr "Verbindingsparameters"
#: mod_irc/mod_irc.erl:728 mod_irc/mod_irc_odbc.erl:757
msgid "Join IRC channel"
msgstr "Ga IRC kanaal binnen"
#: mod_irc/mod_irc.erl:732 mod_irc/mod_irc_odbc.erl:761
msgid "IRC channel (don't put the first #)"
msgstr "IRC kanaal (zonder eerste #)"
#: mod_irc/mod_irc.erl:737 mod_irc/mod_irc_odbc.erl:766
msgid "IRC server"
msgstr "IRC-server"
#: mod_irc/mod_irc.erl:770 mod_irc/mod_irc.erl:774
#: mod_irc/mod_irc_odbc.erl:799 mod_irc/mod_irc_odbc.erl:803
msgid "Join the IRC channel here."
msgstr "Ga het IRC kanaal binnen"
#: mod_irc/mod_irc.erl:778 mod_irc/mod_irc_odbc.erl:807
msgid "Join the IRC channel in this Jabber ID: ~s"
msgstr "Ga het IRC kanaal van deze Jabber ID binnen: ~s"
#: mod_irc/mod_irc.erl:863 mod_irc/mod_irc_odbc.erl:904
msgid "IRC settings"
msgstr "IRC instellingen"
#: mod_irc/mod_irc.erl:868 mod_irc/mod_irc_odbc.erl:909
msgid ""
"Enter username and encodings you wish to use for connecting to IRC servers. "
"Press 'Next' to get more fields to fill in. Press 'Complete' to save "
"settings."
msgstr ""
"Voer de gebruikersnaam en de coderingen in die u wilt gebruiken voor "
"verbindingen met IRC-servers. Klik op 'Volgende' om meer velden aan te "
"maken. Klik op \"Voltooi' om de instellingen op te slaan."
#: mod_irc/mod_irc.erl:874 mod_irc/mod_irc_odbc.erl:915
msgid "IRC username"
msgstr "Gebruikersnaam voor IRC"
#: mod_irc/mod_irc.erl:923 mod_irc/mod_irc_odbc.erl:964
msgid "Password ~b"
msgstr "Wachtwoord ~b"
#: mod_irc/mod_irc.erl:928 mod_irc/mod_irc_odbc.erl:969
msgid "Port ~b"
msgstr "Poort ~b"
#: mod_irc/mod_irc.erl:933 mod_irc/mod_irc_odbc.erl:974
msgid "Encoding for server ~b"
msgstr "Karakterset voor server ~b"
#: mod_irc/mod_irc.erl:942 mod_irc/mod_irc_odbc.erl:983
msgid "Server ~b"
msgstr "Server ~b"
#: mod_muc/mod_muc.erl:449 mod_muc/mod_muc_odbc.erl:456
msgid "Only service administrators are allowed to send service messages"
msgstr ""
"Alleen beheerders van deze dienst mogen mededelingen verzenden naar alle "
"chatruimtes"
#: mod_muc/mod_muc.erl:493 mod_muc/mod_muc_odbc.erl:500
msgid "Room creation is denied by service policy"
msgstr ""
"De aanmaak van de chatruimte is verhinderd door de instellingen van deze "
"server"
#: mod_muc/mod_muc.erl:500 mod_muc/mod_muc_odbc.erl:507
msgid "Conference room does not exist"
msgstr "De chatruimte bestaat niet"
#: mod_muc/mod_muc.erl:582 mod_muc/mod_muc_odbc.erl:595
msgid "Chatrooms"
msgstr "Groepsgesprekken"
#: mod_muc/mod_muc.erl:712 mod_muc/mod_muc_odbc.erl:729
msgid "You need a client that supports x:data to register the nickname"
msgstr ""
"U hebt een client nodig die x:data ondersteunt om een bijnaam te registreren"
#: mod_muc/mod_muc.erl:718 mod_muc/mod_muc_odbc.erl:735
msgid "Nickname Registration at "
msgstr "Registratie van een bijnaam op "
#: mod_muc/mod_muc.erl:722 mod_muc/mod_muc_odbc.erl:739
msgid "Enter nickname you want to register"
msgstr "Voer de bijnaam in die u wilt registreren"
#: mod_muc/mod_muc.erl:723 mod_muc/mod_muc_odbc.erl:740
#: mod_muc/mod_muc_room.erl:3810 mod_roster.erl:944 mod_roster_odbc.erl:1061
#: mod_vcard.erl:364 mod_vcard.erl:477 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:453
msgid "Nickname"
msgstr "Bijnaam"
#: mod_muc/mod_muc.erl:762 mod_muc/mod_muc_odbc.erl:784
#: mod_muc/mod_muc_room.erl:1064 mod_muc/mod_muc_room.erl:1787
msgid "That nickname is registered by another person"
msgstr "Deze bijnaam is al geregistreerd door iemand anders"
#: mod_muc/mod_muc.erl:788 mod_muc/mod_muc_odbc.erl:811
msgid "You must fill in field \"Nickname\" in the form"
msgstr "U moet het veld \"bijnaam\" invullen"
#: mod_muc/mod_muc.erl:808 mod_muc/mod_muc_odbc.erl:831
msgid "ejabberd MUC module"
msgstr "ejabberd's MUC module"
#: mod_muc/mod_muc_log.erl:374 mod_muc/mod_muc_log.erl:381
msgid "Chatroom configuration modified"
msgstr "De instellingen van de chatruimte werden veranderd"
#: mod_muc/mod_muc_log.erl:384
msgid "joins the room"
msgstr "betrad de chatruimte"
#: mod_muc/mod_muc_log.erl:387 mod_muc/mod_muc_log.erl:390
msgid "leaves the room"
msgstr "verliet de chatruimte"
#: mod_muc/mod_muc_log.erl:393 mod_muc/mod_muc_log.erl:396
msgid "has been banned"
msgstr "werd verbannen"
#: mod_muc/mod_muc_log.erl:399 mod_muc/mod_muc_log.erl:402
msgid "has been kicked"
msgstr "werd gekicked"
#: mod_muc/mod_muc_log.erl:405
msgid "has been kicked because of an affiliation change"
msgstr "is weggestuurd vanwege een affiliatieverandering"
#: mod_muc/mod_muc_log.erl:408
msgid "has been kicked because the room has been changed to members-only"
msgstr ""
"is weggestuurd omdat de chatruimte vanaf heden alleen toegankelijk is voor "
"leden"
#: mod_muc/mod_muc_log.erl:411
msgid "has been kicked because of a system shutdown"
msgstr "is weggestuurd omdat het systeem gestopt wordt"
#: mod_muc/mod_muc_log.erl:414
msgid "is now known as"
msgstr "heet nu"
#: mod_muc/mod_muc_log.erl:417 mod_muc/mod_muc_log.erl:688
#: mod_muc/mod_muc_room.erl:2393
msgid " has set the subject to: "
msgstr " veranderde het onderwerp in: "
#: mod_muc/mod_muc_log.erl:452
msgid "Chatroom is created"
msgstr "Gespreksruimte gecreëerd"
#: mod_muc/mod_muc_log.erl:453
msgid "Chatroom is destroyed"
msgstr "Gespreksruimte vernietigd"
#: mod_muc/mod_muc_log.erl:454
msgid "Chatroom is started"
msgstr "Gespreksruimte gestart"
#: mod_muc/mod_muc_log.erl:455
msgid "Chatroom is stopped"
msgstr "Gespreksruimte gestopt"
#: mod_muc/mod_muc_log.erl:459
msgid "Monday"
msgstr "Maandag"
#: mod_muc/mod_muc_log.erl:460
msgid "Tuesday"
msgstr "Dinsdag"
#: mod_muc/mod_muc_log.erl:461
msgid "Wednesday"
msgstr "Woensdag"
#: mod_muc/mod_muc_log.erl:462
msgid "Thursday"
msgstr "Donderdag"
#: mod_muc/mod_muc_log.erl:463
msgid "Friday"
msgstr "Vrijdag"
#: mod_muc/mod_muc_log.erl:464
msgid "Saturday"
msgstr "Zaterdag"
#: mod_muc/mod_muc_log.erl:465
msgid "Sunday"
msgstr "Zondag"
#: mod_muc/mod_muc_log.erl:469
msgid "January"
msgstr "Januari"
#: mod_muc/mod_muc_log.erl:470
msgid "February"
msgstr "Februari"
#: mod_muc/mod_muc_log.erl:471
msgid "March"
msgstr "Maart"
#: mod_muc/mod_muc_log.erl:472
msgid "April"
msgstr "April"
#: mod_muc/mod_muc_log.erl:473
msgid "May"
msgstr "Mei"
#: mod_muc/mod_muc_log.erl:474
msgid "June"
msgstr "Juni"
#: mod_muc/mod_muc_log.erl:475
msgid "July"
msgstr "Juli"
#: mod_muc/mod_muc_log.erl:476
msgid "August"
msgstr "Augustus"
#: mod_muc/mod_muc_log.erl:477
msgid "September"
msgstr "September"
#: mod_muc/mod_muc_log.erl:478
msgid "October"
msgstr "Oktober"
#: mod_muc/mod_muc_log.erl:479
msgid "November"
msgstr "November"
#: mod_muc/mod_muc_log.erl:480
msgid "December"
msgstr "December"
#: mod_muc/mod_muc_log.erl:750
msgid "Room Configuration"
msgstr "Instellingen van de chatruimte"
#: mod_muc/mod_muc_log.erl:759
msgid "Room Occupants"
msgstr "Aantal aanwezigen"
#: mod_muc/mod_muc_room.erl:174
msgid "Traffic rate limit is exceeded"
msgstr "Dataverkeerslimiet overschreden"
#: mod_muc/mod_muc_room.erl:246
msgid ""
"This participant is kicked from the room because he sent an error message"
msgstr ""
"Deze deelnemer wordt weggestuurd vanwege het sturen van een "
"foutmeldingsbericht"
#: mod_muc/mod_muc_room.erl:255
msgid "It is not allowed to send private messages to the conference"
msgstr "Er mogen geen privéberichten naar de chatruimte worden verzonden"
#: mod_muc/mod_muc_room.erl:332
msgid "Please, wait for a while before sending new voice request"
msgstr "Wacht s.v.p. met het maken van een nieuwe stemaanvraag."
#: mod_muc/mod_muc_room.erl:347
msgid "Voice requests are disabled in this conference"
msgstr "Stemaanvragen zijn uitgeschakeld voor deze chatruimte"
#: mod_muc/mod_muc_room.erl:364
msgid "Failed to extract JID from your voice request approval"
msgstr "Er kon geen JID worden ontleend uit deze stemaanvraag"
#: mod_muc/mod_muc_room.erl:393
msgid "Only moderators can approve voice requests"
msgstr "Alleen moderators kunnen stemaanvragen goedkeuren"
#: mod_muc/mod_muc_room.erl:408
msgid "Improper message type"
msgstr "Onjuist berichttype"
#: mod_muc/mod_muc_room.erl:518
msgid ""
"This participant is kicked from the room because he sent an error message to "
"another participant"
msgstr ""
"Deze deelnemer wordt weggestuurd vanwege het sturen van een "
"foutmeldingsbericht aan een andere deelnemer"
#: mod_muc/mod_muc_room.erl:531
msgid "It is not allowed to send private messages of type \"groupchat\""
msgstr ""
"Er mogen geen privéberichten van het type \"groupchat\" worden verzonden"
#: mod_muc/mod_muc_room.erl:543 mod_muc/mod_muc_room.erl:611
msgid "Recipient is not in the conference room"
msgstr "De ontvanger is niet in de chatruimte"
#: mod_muc/mod_muc_room.erl:564 mod_muc/mod_muc_room.erl:585
msgid "It is not allowed to send private messages"
msgstr "Het is niet toegestaan priveberichten te sturen"
#: mod_muc/mod_muc_room.erl:576 mod_muc/mod_muc_room.erl:956
#: mod_muc/mod_muc_room.erl:4040
msgid "Only occupants are allowed to send messages to the conference"
msgstr "Alleen aanwezigen mogen berichten naar de chatruimte verzenden"
#: mod_muc/mod_muc_room.erl:634
msgid "Only occupants are allowed to send queries to the conference"
msgstr "Alleen aanwezigen mogen verzoeken verzenden naar de chatruimte"
#: mod_muc/mod_muc_room.erl:646
msgid "Queries to the conference members are not allowed in this room"
msgstr ""
"Er mogen geen verzoeken verzenden worden naar deelnemers in deze chatruimte"
#: mod_muc/mod_muc_room.erl:932
msgid ""
"Only moderators and participants are allowed to change the subject in this "
"room"
msgstr ""
"Alleen moderators en deelnemers mogen het onderwerp van deze chatruimte "
"veranderen"
#: mod_muc/mod_muc_room.erl:937
msgid "Only moderators are allowed to change the subject in this room"
msgstr "Alleen moderators mogen het onderwerp van deze chatruimte veranderen"
#: mod_muc/mod_muc_room.erl:947
msgid "Visitors are not allowed to send messages to all occupants"
msgstr "Bezoekers mogen geen berichten verzenden naar alle aanwezigen"
#: mod_muc/mod_muc_room.erl:1021
msgid ""
"This participant is kicked from the room because he sent an error presence"
msgstr ""
"Deze deelnemer wordt weggestuurd vanwege het sturen van een foutmelding-"
"aanwezigheid"
#: mod_muc/mod_muc_room.erl:1040
msgid "Visitors are not allowed to change their nicknames in this room"
msgstr "Het is bezoekers niet toegestaan hun naam te veranderen in dit kanaal"
#: mod_muc/mod_muc_room.erl:1053 mod_muc/mod_muc_room.erl:1779
msgid "That nickname is already in use by another occupant"
msgstr "Deze bijnaam is al in gebruik door een andere aanwezige"
#: mod_muc/mod_muc_room.erl:1768
msgid "You have been banned from this room"
msgstr "U werd verbannen uit deze chatruimte"
#: mod_muc/mod_muc_room.erl:1771
msgid "Membership is required to enter this room"
msgstr "U moet lid zijn om deze chatruimte te kunnen betreden"
#: mod_muc/mod_muc_room.erl:1807
msgid "This room is not anonymous"
msgstr "Deze chatruimte is niet anoniem"
#: mod_muc/mod_muc_room.erl:1833
msgid "A password is required to enter this room"
msgstr "U hebt een wachtwoord nodig om deze chatruimte te kunnen betreden"
#: mod_muc/mod_muc_room.erl:1855 mod_register.erl:246
msgid "Too many CAPTCHA requests"
msgstr "Te veel CAPTCHA-aanvragen"
#: mod_muc/mod_muc_room.erl:1864 mod_register.erl:251
msgid "Unable to generate a CAPTCHA"
msgstr "Het generen van een CAPTCHA is mislukt"
#: mod_muc/mod_muc_room.erl:1874
msgid "Incorrect password"
msgstr "Foutief wachtwoord"
#: mod_muc/mod_muc_room.erl:2448
msgid "Administrator privileges required"
msgstr "U hebt beheerdersprivileges nodig"
#: mod_muc/mod_muc_room.erl:2463
msgid "Moderator privileges required"
msgstr "U hebt moderatorprivileges nodig"
#: mod_muc/mod_muc_room.erl:2619
msgid "Jabber ID ~s is invalid"
msgstr "De Jabber ID ~s is ongeldig"
#: mod_muc/mod_muc_room.erl:2633
msgid "Nickname ~s does not exist in the room"
msgstr "De bijnaam ~s bestaat niet in deze chatruimte"
#: mod_muc/mod_muc_room.erl:2659 mod_muc/mod_muc_room.erl:3049
msgid "Invalid affiliation: ~s"
msgstr "Ongeldige affiliatie: ~s"
#: mod_muc/mod_muc_room.erl:2713
msgid "Invalid role: ~s"
msgstr "Ongeldige rol: ~s"
#: mod_muc/mod_muc_room.erl:3026 mod_muc/mod_muc_room.erl:3062
msgid "Owner privileges required"
msgstr "U hebt eigenaarsprivileges nodig"
#: mod_muc/mod_muc_room.erl:3195
msgid "Configuration of room ~s"
msgstr "Instellingen van chatruimte ~s"
#: mod_muc/mod_muc_room.erl:3200
msgid "Room title"
msgstr "Naam van de chatruimte"
#: mod_muc/mod_muc_room.erl:3203 mod_muc/mod_muc_room.erl:3692
msgid "Room description"
msgstr "Beschrijving"
#: mod_muc/mod_muc_room.erl:3210
msgid "Make room persistent"
msgstr "Chatruimte blijvend maken"
#: mod_muc/mod_muc_room.erl:3215
msgid "Make room public searchable"
msgstr "Chatruimte doorzoekbaar maken"
#: mod_muc/mod_muc_room.erl:3218
msgid "Make participants list public"
msgstr "Deelnemerslijst publiek maken"
#: mod_muc/mod_muc_room.erl:3221
msgid "Make room password protected"
msgstr "Chatruimte beveiligen met een wachtwoord"
#: mod_muc/mod_muc_room.erl:3232
msgid "Maximum Number of Occupants"
msgstr "Maximum aantal aanwezigen"
#: mod_muc/mod_muc_room.erl:3239
msgid "No limit"
msgstr "Geen limiet"
#: mod_muc/mod_muc_room.erl:3250
msgid "Present real Jabber IDs to"
msgstr "Jabber ID's kunnen achterhaald worden door"
#: mod_muc/mod_muc_room.erl:3258 mod_muc/mod_muc_room.erl:3292
msgid "moderators only"
msgstr "moderators"
#: mod_muc/mod_muc_room.erl:3260 mod_muc/mod_muc_room.erl:3294
msgid "anyone"
msgstr "iedereen"
#: mod_muc/mod_muc_room.erl:3262
msgid "Make room members-only"
msgstr "Chatruimte enkel toegankelijk maken voor leden"
#: mod_muc/mod_muc_room.erl:3265
msgid "Make room moderated"
msgstr "Chatruimte gemodereerd maken"
#: mod_muc/mod_muc_room.erl:3268
msgid "Default users as participants"
msgstr "Gebruikers standaard instellen als deelnemers"
#: mod_muc/mod_muc_room.erl:3271
msgid "Allow users to change the subject"
msgstr "Sta gebruikers toe het onderwerp te veranderen"
#: mod_muc/mod_muc_room.erl:3274
msgid "Allow users to send private messages"
msgstr "Gebruikers mogen privéberichten verzenden"
#: mod_muc/mod_muc_room.erl:3279
msgid "Allow visitors to send private messages to"
msgstr "Gebruikers mogen privéberichten verzenden aan"
#: mod_muc/mod_muc_room.erl:3290
msgid "nobody"
msgstr "niemand"
#: mod_muc/mod_muc_room.erl:3296
msgid "Allow users to query other users"
msgstr "Gebruikers mogen naar andere gebruikers verzoeken verzenden"
#: mod_muc/mod_muc_room.erl:3299
msgid "Allow users to send invites"
msgstr "Gebruikers mogen uitnodigingen verzenden"
#: mod_muc/mod_muc_room.erl:3302
msgid "Allow visitors to send status text in presence updates"
msgstr "Sta bezoekers toe hun statusbericht in te stellen"
#: mod_muc/mod_muc_room.erl:3305
msgid "Allow visitors to change nickname"
msgstr "Sta bezoekers toe hun naam te veranderen"
#: mod_muc/mod_muc_room.erl:3308
msgid "Allow visitors to send voice requests"
msgstr "Gebruikers mogen stemaanvragen verzenden"
#: mod_muc/mod_muc_room.erl:3311
msgid "Minimum interval between voice requests (in seconds)"
msgstr "Minimale interval tussen stemaanvragen (in seconden)"
#: mod_muc/mod_muc_room.erl:3317
msgid "Make room CAPTCHA protected"
msgstr "Chatruimte beveiligen met een geautomatiseerde Turing test"
#: mod_muc/mod_muc_room.erl:3322
msgid "Exclude Jabber IDs from CAPTCHA challenge"
msgstr "Geen CAPTCHA test voor Jabber IDs"
#: mod_muc/mod_muc_room.erl:3329
msgid "Enable logging"
msgstr "Logs aanzetten"
#: mod_muc/mod_muc_room.erl:3337
msgid "You need an x:data capable client to configure room"
msgstr ""
"U hebt een client nodig die x:data ondersteunt om deze chatruimte in te "
"stellen"
#: mod_muc/mod_muc_room.erl:3694
msgid "Number of occupants"
msgstr "Aantal aanwezigen"
#: mod_muc/mod_muc_room.erl:3750
msgid "private, "
msgstr "privé, "
#: mod_muc/mod_muc_room.erl:3799
msgid "Voice request"
msgstr "Stemaanvraag"
#: mod_muc/mod_muc_room.erl:3803
msgid "Either approve or decline the voice request."
msgstr "Keur stemaanvraag goed of af."
#: mod_muc/mod_muc_room.erl:3809
msgid "User JID"
msgstr "JID Gebruiker"
#: mod_muc/mod_muc_room.erl:3811
msgid "Grant voice to this person?"
msgstr "Stemaanvraag honoreren voor deze persoon?"
#: mod_muc/mod_muc_room.erl:3960
msgid "~s invites you to the room ~s"
msgstr "~s nodigt je uit voor het groepsgesprek ~s"
#: mod_muc/mod_muc_room.erl:3969
msgid "the password is"
msgstr "het wachtwoord is"
#: mod_offline.erl:510 mod_offline_odbc.erl:352
msgid ""
"Your contact offline message queue is full. The message has been discarded."
msgstr ""
"Te veel offline berichten voor dit contactpersoon. Het bericht is niet "
"opgeslagen."
#: mod_offline.erl:560 mod_offline_odbc.erl:408
msgid "~s's Offline Messages Queue"
msgstr "offline berichten van ~s"
#: mod_offline.erl:563 mod_offline_odbc.erl:411 mod_roster.erl:987
#: mod_roster_odbc.erl:1104 mod_shared_roster.erl:901
#: mod_shared_roster.erl:1010 mod_shared_roster_odbc.erl:930
#: mod_shared_roster_odbc.erl:1039 web/ejabberd_web_admin.erl:833
#: web/ejabberd_web_admin.erl:874 web/ejabberd_web_admin.erl:942
#: web/ejabberd_web_admin.erl:978 web/ejabberd_web_admin.erl:1019
#: web/ejabberd_web_admin.erl:1508 web/ejabberd_web_admin.erl:1760
#: web/ejabberd_web_admin.erl:1931 web/ejabberd_web_admin.erl:1963
#: web/ejabberd_web_admin.erl:2031 web/ejabberd_web_admin.erl:2135
#: web/ejabberd_web_admin.erl:2160 web/ejabberd_web_admin.erl:2248
msgid "Submitted"
msgstr "Verzonden"
#: mod_offline.erl:571
msgid "Time"
msgstr "Tijd"
#: mod_offline.erl:572
msgid "From"
msgstr "Van"
#: mod_offline.erl:573
msgid "To"
msgstr "Aan"
#: mod_offline.erl:574 mod_offline_odbc.erl:419
msgid "Packet"
msgstr "Pakket"
#: mod_offline.erl:587 mod_offline_odbc.erl:432 mod_shared_roster.erl:908
#: mod_shared_roster_odbc.erl:937 web/ejabberd_web_admin.erl:882
#: web/ejabberd_web_admin.erl:986
msgid "Delete Selected"
msgstr "Geselecteerde verwijderen"
#: mod_offline.erl:645 mod_offline_odbc.erl:519
msgid "Offline Messages:"
msgstr "Offline berichten:"
#: mod_offline.erl:645 mod_offline_odbc.erl:519
msgid "Remove All Offline Messages"
msgstr "Verwijder alle offline berichten"
#: mod_proxy65/mod_proxy65_service.erl:213
msgid "ejabberd SOCKS5 Bytestreams module"
msgstr "ejabberd SOCKS5 Bytestreams module"
#: mod_pubsub/mod_pubsub.erl:1120 mod_pubsub/mod_pubsub_odbc.erl:929
msgid "Publish-Subscribe"
msgstr "Publish-Subscribe"
#: mod_pubsub/mod_pubsub.erl:1214 mod_pubsub/mod_pubsub_odbc.erl:1025
msgid "ejabberd Publish-Subscribe module"
msgstr "ejabberd Publish-Subscribe module"
#: mod_pubsub/mod_pubsub.erl:1497 mod_pubsub/mod_pubsub_odbc.erl:1312
msgid "PubSub subscriber request"
msgstr "PubSub abonnee verzoek"
#: mod_pubsub/mod_pubsub.erl:1499 mod_pubsub/mod_pubsub_odbc.erl:1314
msgid "Choose whether to approve this entity's subscription."
msgstr "Beslis of dit verzoek tot abonneren zal worden goedgekeurd"
#: mod_pubsub/mod_pubsub.erl:1505 mod_pubsub/mod_pubsub_odbc.erl:1320
msgid "Node ID"
msgstr "Node ID"
#: mod_pubsub/mod_pubsub.erl:1510 mod_pubsub/mod_pubsub_odbc.erl:1325
msgid "Subscriber Address"
msgstr "Abonnee Adres"
#: mod_pubsub/mod_pubsub.erl:1516 mod_pubsub/mod_pubsub_odbc.erl:1331
msgid "Allow this Jabber ID to subscribe to this pubsub node?"
msgstr "Deze gebruiker toestaan te abonneren op deze pubsub node?"
#: mod_pubsub/mod_pubsub.erl:3474 mod_pubsub/mod_pubsub_odbc.erl:3287
msgid "Deliver payloads with event notifications"
msgstr "Berichten bezorgen samen met gebeurtenisnotificaties"
#: mod_pubsub/mod_pubsub.erl:3475 mod_pubsub/mod_pubsub_odbc.erl:3288
msgid "Deliver event notifications"
msgstr "Gebeurtenisbevestigingen Sturen"
#: mod_pubsub/mod_pubsub.erl:3476 mod_pubsub/mod_pubsub_odbc.erl:3289
msgid "Notify subscribers when the node configuration changes"
msgstr "Abonnees informeren wanneer de instellingen van de node veranderen"
#: mod_pubsub/mod_pubsub.erl:3477 mod_pubsub/mod_pubsub_odbc.erl:3290
msgid "Notify subscribers when the node is deleted"
msgstr "Abonnees informeren wanneer de node verwijderd word"
#: mod_pubsub/mod_pubsub.erl:3478 mod_pubsub/mod_pubsub_odbc.erl:3291
msgid "Notify subscribers when items are removed from the node"
msgstr "Abonnees informeren wanneer items verwijderd worden uit de node"
#: mod_pubsub/mod_pubsub.erl:3479 mod_pubsub/mod_pubsub_odbc.erl:3292
msgid "Persist items to storage"
msgstr "Items in het geheugen bewaren"
#: mod_pubsub/mod_pubsub.erl:3480 mod_pubsub/mod_pubsub_odbc.erl:3293
msgid "A friendly name for the node"
msgstr "Bijnaam voor deze knoop"
#: mod_pubsub/mod_pubsub.erl:3481 mod_pubsub/mod_pubsub_odbc.erl:3294
msgid "Max # of items to persist"
msgstr "Maximum aantal in het geheugen te bewaren items"
#: mod_pubsub/mod_pubsub.erl:3482 mod_pubsub/mod_pubsub_odbc.erl:3295
msgid "Whether to allow subscriptions"
msgstr "Abonnementsaanvraag toestaan"
#: mod_pubsub/mod_pubsub.erl:3483 mod_pubsub/mod_pubsub_odbc.erl:3296
msgid "Specify the access model"
msgstr "Geef toegangsmodel"
#: mod_pubsub/mod_pubsub.erl:3486 mod_pubsub/mod_pubsub_odbc.erl:3299
msgid "Roster groups allowed to subscribe"
msgstr "Contactlijst-groepen die mogen abonneren"
#: mod_pubsub/mod_pubsub.erl:3487 mod_pubsub/mod_pubsub_odbc.erl:3300
msgid "Specify the publisher model"
msgstr "Publicatietype opgeven"
#: mod_pubsub/mod_pubsub.erl:3489 mod_pubsub/mod_pubsub_odbc.erl:3302
msgid "Purge all items when the relevant publisher goes offline"
msgstr "Verwijder alle items wanneer de gerelateerde publiceerder offline gaat"
#: mod_pubsub/mod_pubsub.erl:3490 mod_pubsub/mod_pubsub_odbc.erl:3303
msgid "Specify the event message type"
msgstr "Geef type van eventbericht"
#: mod_pubsub/mod_pubsub.erl:3492 mod_pubsub/mod_pubsub_odbc.erl:3305
msgid "Max payload size in bytes"
msgstr "Maximumgrootte van bericht in bytes"
#: mod_pubsub/mod_pubsub.erl:3493 mod_pubsub/mod_pubsub_odbc.erl:3306
msgid "When to send the last published item"
msgstr "Wanneer het laatst gepubliceerde item verzonden moet worden"
#: mod_pubsub/mod_pubsub.erl:3495 mod_pubsub/mod_pubsub_odbc.erl:3308
msgid "Only deliver notifications to available users"
msgstr "Notificaties alleen verzenden naar online gebruikers"
#: mod_pubsub/mod_pubsub.erl:3496 mod_pubsub/mod_pubsub_odbc.erl:3309
msgid "The collections with which a node is affiliated"
msgstr "De collecties waar een node mee is gerelateerd"
#: mod_register.erl:193
msgid "The CAPTCHA verification has failed"
msgstr "De CAPTCHA-verificatie is mislukt"
#: mod_register.erl:220
msgid "You need a client that supports x:data and CAPTCHA to register"
msgstr ""
"U hebt een client nodig die x:data en CAPTCHA ondersteunt om een bijnaam te "
"registreren"
#: mod_register.erl:226 mod_register.erl:265
msgid "Choose a username and password to register with this server"
msgstr ""
"Kies een gebruikersnaam en een wachtwoord om u te registreren op deze server"
#: mod_register.erl:230 mod_vcard.erl:364 mod_vcard_odbc.erl:342
#: web/ejabberd_web_admin.erl:1515 web/ejabberd_web_admin.erl:1572
msgid "User"
msgstr "Gebruiker"
#: mod_register.erl:316 mod_register.erl:361
msgid "The password is too weak"
msgstr "Het wachtwoord is te zwak"
#: mod_register.erl:365
msgid "Users are not allowed to register accounts so quickly"
msgstr "Het is gebruikers niet toegestaan zo snel achter elkaar te registreren"
#: mod_roster.erl:938 mod_roster_odbc.erl:1055 web/ejabberd_web_admin.erl:1701
#: web/ejabberd_web_admin.erl:1886 web/ejabberd_web_admin.erl:1897
#: web/ejabberd_web_admin.erl:2219
msgid "None"
msgstr "Geen"
#: mod_roster.erl:945 mod_roster_odbc.erl:1062
msgid "Subscription"
msgstr "Inschrijving"
#: mod_roster.erl:946 mod_roster_odbc.erl:1063
msgid "Pending"
msgstr "Bezig"
#: mod_roster.erl:947 mod_roster_odbc.erl:1064
msgid "Groups"
msgstr "Groepen"
#: mod_roster.erl:974 mod_roster_odbc.erl:1091
msgid "Validate"
msgstr "Bevestigen"
#: mod_roster.erl:982 mod_roster_odbc.erl:1099
msgid "Remove"
msgstr "Verwijderen"
#: mod_roster.erl:985 mod_roster_odbc.erl:1102
msgid "Roster of "
msgstr "Roster van "
#: mod_roster.erl:988 mod_roster_odbc.erl:1105 mod_shared_roster.erl:902
#: mod_shared_roster.erl:1011 mod_shared_roster_odbc.erl:931
#: mod_shared_roster_odbc.erl:1040 web/ejabberd_web_admin.erl:834
#: web/ejabberd_web_admin.erl:875 web/ejabberd_web_admin.erl:943
#: web/ejabberd_web_admin.erl:979 web/ejabberd_web_admin.erl:1020
#: web/ejabberd_web_admin.erl:1509 web/ejabberd_web_admin.erl:1761
#: web/ejabberd_web_admin.erl:1932 web/ejabberd_web_admin.erl:2136
#: web/ejabberd_web_admin.erl:2161
msgid "Bad format"
msgstr "Slecht formaat"
#: mod_roster.erl:995 mod_roster_odbc.erl:1112
msgid "Add Jabber ID"
msgstr "Jabber ID toevoegen"
#: mod_roster.erl:1094 mod_roster_odbc.erl:1211
msgid "Roster"
msgstr "Roster"
#: mod_shared_roster.erl:857 mod_shared_roster.erl:899
#: mod_shared_roster.erl:1007 mod_shared_roster_odbc.erl:886
#: mod_shared_roster_odbc.erl:928 mod_shared_roster_odbc.erl:1036
msgid "Shared Roster Groups"
msgstr "Gedeelde rostergroepen"
#: mod_shared_roster.erl:895 mod_shared_roster_odbc.erl:924
#: web/ejabberd_web_admin.erl:1365 web/ejabberd_web_admin.erl:2461
msgid "Add New"
msgstr "Toevoegen"
#: mod_shared_roster.erl:978 mod_shared_roster_odbc.erl:1007
msgid "Name:"
msgstr "Naam:"
#: mod_shared_roster.erl:983 mod_shared_roster_odbc.erl:1012
msgid "Description:"
msgstr "Beschrijving:"
#: mod_shared_roster.erl:991 mod_shared_roster_odbc.erl:1020
msgid "Members:"
msgstr "Groepsleden:"
#: mod_shared_roster.erl:999 mod_shared_roster_odbc.erl:1028
msgid "Displayed Groups:"
msgstr "Weergegeven groepen:"
#: mod_shared_roster.erl:1008 mod_shared_roster_odbc.erl:1037
msgid "Group "
msgstr "Groep "
#: mod_shared_roster.erl:1017 mod_shared_roster_odbc.erl:1046
#: web/ejabberd_web_admin.erl:840 web/ejabberd_web_admin.erl:884
#: web/ejabberd_web_admin.erl:949 web/ejabberd_web_admin.erl:1026
#: web/ejabberd_web_admin.erl:2017
msgid "Submit"
msgstr "Verzenden"
#: mod_vcard.erl:165 mod_vcard_ldap.erl:238 mod_vcard_odbc.erl:129
msgid "Erlang Jabber Server"
msgstr "Erlang Jabber Server"
#: mod_vcard.erl:364 mod_vcard.erl:478 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:454
msgid "Birthday"
msgstr "Geboortedatum"
#: mod_vcard.erl:364 mod_vcard.erl:480 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:456
msgid "City"
msgstr "Plaats"
#: mod_vcard.erl:364 mod_vcard.erl:479 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:455
msgid "Country"
msgstr "Land"
#: mod_vcard.erl:364 mod_vcard.erl:481 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:457
msgid "Email"
msgstr "E-mail"
#: mod_vcard.erl:364 mod_vcard.erl:476 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:452
msgid "Family Name"
msgstr "Achternaam"
#: mod_vcard.erl:364 mod_vcard_odbc.erl:342
msgid ""
"Fill in the form to search for any matching Jabber User (Add * to the end of "
"field to match substring)"
msgstr ""
"Gebruik de velden om te zoeken (Voeg achteraan het teken * toe om te zoeken "
"naar alles wat met het eerste deel begint.)."
#: mod_vcard.erl:364 mod_vcard.erl:473 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:449
msgid "Full Name"
msgstr "Volledige naam"
#: mod_vcard.erl:364 mod_vcard.erl:475 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:451
msgid "Middle Name"
msgstr "Tussennaam"
#: mod_vcard.erl:364 mod_vcard.erl:474 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:450 web/ejabberd_web_admin.erl:2006
msgid "Name"
msgstr "Naam"
#: mod_vcard.erl:364 mod_vcard.erl:482 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:458
msgid "Organization Name"
msgstr "Organisatie"
#: mod_vcard.erl:364 mod_vcard.erl:483 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:459
msgid "Organization Unit"
msgstr "Afdeling"
#: mod_vcard.erl:364 mod_vcard_ldap.erl:462 mod_vcard_odbc.erl:342
msgid "Search users in "
msgstr "Gebruikers zoeken in "
#: mod_vcard.erl:364 mod_vcard_ldap.erl:462 mod_vcard_odbc.erl:342
msgid "You need an x:data capable client to search"
msgstr "U hebt een client nodig die x:data ondersteunt om te zoeken"
#: mod_vcard.erl:389 mod_vcard_ldap.erl:487 mod_vcard_odbc.erl:367
msgid "vCard User Search"
msgstr "Gebruikers zoeken"
#: mod_vcard.erl:445 mod_vcard_ldap.erl:541 mod_vcard_odbc.erl:421
msgid "ejabberd vCard module"
msgstr "ejabberd's vCard-module"
#: mod_vcard.erl:469 mod_vcard_ldap.erl:551 mod_vcard_odbc.erl:445
msgid "Search Results for "
msgstr "Zoekresultaten voor "
#: mod_vcard_ldap.erl:462
msgid "Fill in fields to search for any matching Jabber User"
msgstr "Vul de velden in om te zoeken naar Jabber-gebruikers op deze server"
#: web/ejabberd_web_admin.erl:193 web/ejabberd_web_admin.erl:203
#: web/ejabberd_web_admin.erl:219 web/ejabberd_web_admin.erl:229
msgid "Unauthorized"
msgstr "Niet geautoriseerd"
#: web/ejabberd_web_admin.erl:286 web/ejabberd_web_admin.erl:303
msgid "ejabberd Web Admin"
msgstr "ejabberd Webbeheer"
#: web/ejabberd_web_admin.erl:769 web/ejabberd_web_admin.erl:780
msgid "Administration"
msgstr "Beheer"
#: web/ejabberd_web_admin.erl:878 web/ejabberd_web_admin.erl:982
msgid "Raw"
msgstr "Ruw"
#: web/ejabberd_web_admin.erl:1017
msgid "~s access rule configuration"
msgstr "Access rules op ~s"
#: web/ejabberd_web_admin.erl:1035
msgid "Virtual Hosts"
msgstr "Virtuele hosts"
#: web/ejabberd_web_admin.erl:1043 web/ejabberd_web_admin.erl:1050
msgid "Users"
msgstr "Gebruikers"
#: web/ejabberd_web_admin.erl:1078
msgid "Users Last Activity"
msgstr "Laatste activiteit van gebruikers"
#: web/ejabberd_web_admin.erl:1080
msgid "Period: "
msgstr "Periode: "
#: web/ejabberd_web_admin.erl:1090
msgid "Last month"
msgstr "Afgelopen maand"
#: web/ejabberd_web_admin.erl:1091
msgid "Last year"
msgstr "Afgelopen jaar"
#: web/ejabberd_web_admin.erl:1092
msgid "All activity"
msgstr "Alle activiteit"
#: web/ejabberd_web_admin.erl:1094
msgid "Show Ordinary Table"
msgstr "Deel van tabel laten zien"
#: web/ejabberd_web_admin.erl:1096
msgid "Show Integral Table"
msgstr "Volledige tabel laten zien"
#: web/ejabberd_web_admin.erl:1105 web/ejabberd_web_admin.erl:1939
msgid "Statistics"
msgstr "Statistieken"
#: web/ejabberd_web_admin.erl:1117
msgid "Not Found"
msgstr "Niet gevonden"
#: web/ejabberd_web_admin.erl:1134
msgid "Node not found"
msgstr "Node niet gevonden"
#: web/ejabberd_web_admin.erl:1460
msgid "Host"
msgstr "Host"
#: web/ejabberd_web_admin.erl:1461
msgid "Registered Users"
msgstr "Geregistreerde gebruikers"
#: web/ejabberd_web_admin.erl:1573
msgid "Offline Messages"
msgstr "Offline berichten"
#: web/ejabberd_web_admin.erl:1574 web/ejabberd_web_admin.erl:1767
msgid "Last Activity"
msgstr "Laatste activiteit"
#: web/ejabberd_web_admin.erl:1659 web/ejabberd_web_admin.erl:1675
msgid "Registered Users:"
msgstr "Geregistreerde gebruikers:"
#: web/ejabberd_web_admin.erl:1661 web/ejabberd_web_admin.erl:1677
#: web/ejabberd_web_admin.erl:2192
msgid "Online Users:"
msgstr "Online gebruikers:"
#: web/ejabberd_web_admin.erl:1663
msgid "Outgoing s2s Connections:"
msgstr "Uitgaande s2s-verbindingen:"
#: web/ejabberd_web_admin.erl:1665
msgid "Outgoing s2s Servers:"
msgstr "Uitgaande s2s-verbindingen:"
#: web/ejabberd_web_admin.erl:1734 web/mod_register_web.erl:175
#: web/mod_register_web.erl:372 web/mod_register_web.erl:381
#: web/mod_register_web.erl:411
msgid "Change Password"
msgstr "Wachtwoord wijzigen"
#: web/ejabberd_web_admin.erl:1758
msgid "User "
msgstr "Gebruiker "
#: web/ejabberd_web_admin.erl:1765
msgid "Connected Resources:"
msgstr "Verbonden bronnen:"
#: web/ejabberd_web_admin.erl:1766 web/mod_register_web.erl:227
#: web/mod_register_web.erl:519
msgid "Password:"
msgstr "Wachtwoord:"
#: web/ejabberd_web_admin.erl:1828
msgid "No Data"
msgstr "Geen gegevens"
#: web/ejabberd_web_admin.erl:1906
msgid "Nodes"
msgstr "Nodes"
#: web/ejabberd_web_admin.erl:1929 web/ejabberd_web_admin.erl:1951
msgid "Node "
msgstr "Node "
#: web/ejabberd_web_admin.erl:1938
msgid "Listened Ports"
msgstr "Openstaande poorten"
#: web/ejabberd_web_admin.erl:1940 web/ejabberd_web_admin.erl:2260
#: web/ejabberd_web_admin.erl:2448
msgid "Update"
msgstr "Bijwerken"
#: web/ejabberd_web_admin.erl:1943 web/ejabberd_web_admin.erl:2569
msgid "Restart"
msgstr "Herstarten"
#: web/ejabberd_web_admin.erl:1945 web/ejabberd_web_admin.erl:2571
msgid "Stop"
msgstr "Stoppen"
#: web/ejabberd_web_admin.erl:1959
msgid "RPC Call Error"
msgstr "RPC-oproepfout"
#: web/ejabberd_web_admin.erl:2000
msgid "Database Tables at "
msgstr "Databasetabellen van "
#: web/ejabberd_web_admin.erl:2007
msgid "Storage Type"
msgstr "Opslagmethode"
#: web/ejabberd_web_admin.erl:2008
msgid "Elements"
msgstr "Elementen"
#: web/ejabberd_web_admin.erl:2009
msgid "Memory"
msgstr "Geheugen"
#: web/ejabberd_web_admin.erl:2032 web/ejabberd_web_admin.erl:2137
msgid "Error"
msgstr "Fout"
#: web/ejabberd_web_admin.erl:2034
msgid "Backup of "
msgstr "Backup maken van "
#: web/ejabberd_web_admin.erl:2036
msgid ""
"Please note that these options will only backup the builtin Mnesia database. "
"If you are using the ODBC module, you also need to backup your SQL database "
"separately."
msgstr ""
"Merk op dat volgende opties enkel backups maken van de ingebouwde database "
"Mnesia. Als U de ODBC module gebruikt dan moeten daarvan afzonderlijke "
"backups gemaakt worden."
#: web/ejabberd_web_admin.erl:2041
msgid "Store binary backup:"
msgstr "Binaire backup maken:"
#: web/ejabberd_web_admin.erl:2045 web/ejabberd_web_admin.erl:2052
#: web/ejabberd_web_admin.erl:2060 web/ejabberd_web_admin.erl:2067
#: web/ejabberd_web_admin.erl:2074 web/ejabberd_web_admin.erl:2081
#: web/ejabberd_web_admin.erl:2088 web/ejabberd_web_admin.erl:2096
#: web/ejabberd_web_admin.erl:2103 web/ejabberd_web_admin.erl:2110
msgid "OK"
msgstr "OK"
#: web/ejabberd_web_admin.erl:2048
msgid "Restore binary backup immediately:"
msgstr "Binaire backup direct herstellen:"
#: web/ejabberd_web_admin.erl:2056
msgid ""
"Restore binary backup after next ejabberd restart (requires less memory):"
msgstr ""
"Binaire backup herstellen na herstart van ejabberd (vereist minder geheugen):"
#: web/ejabberd_web_admin.erl:2063
msgid "Store plain text backup:"
msgstr "Backup naar een tekstbestand schrijven:"
#: web/ejabberd_web_admin.erl:2070
msgid "Restore plain text backup immediately:"
msgstr "Backup in een tekstbestand direct herstellen:"
#: web/ejabberd_web_admin.erl:2077
msgid "Import users data from a PIEFXIS file (XEP-0227):"
msgstr "Importeer gebruikersdata van een PIEFXIS-bestand (XEP-0227):"
#: web/ejabberd_web_admin.erl:2084
msgid "Export data of all users in the server to PIEFXIS files (XEP-0227):"
msgstr ""
"Exporteer data van alle gebruikers in de server naar PIEFXIS-bestanden "
"(XEP-0227):"
#: web/ejabberd_web_admin.erl:2091
msgid "Export data of users in a host to PIEFXIS files (XEP-0227):"
msgstr ""
"Exporteer data van alle gebruikers van een host naar PIEXFIS-bestanden "
"(XEP-0227):"
#: web/ejabberd_web_admin.erl:2099
msgid "Import user data from jabberd14 spool file:"
msgstr "Importeer gebruikersdata via spool-bestanden van jabberd14"
#: web/ejabberd_web_admin.erl:2106
msgid "Import users data from jabberd14 spool directory:"
msgstr "Importeer gebruikersdata via spool-bestanden van jabberd14"
#: web/ejabberd_web_admin.erl:2132
msgid "Listened Ports at "
msgstr "Openstaande poorten op "
#: web/ejabberd_web_admin.erl:2157
msgid "Modules at "
msgstr "Modules op "
#: web/ejabberd_web_admin.erl:2183
msgid "Statistics of ~p"
msgstr "Statistieken van ~p"
#: web/ejabberd_web_admin.erl:2186
msgid "Uptime:"
msgstr "Uptime:"
#: web/ejabberd_web_admin.erl:2189
msgid "CPU Time:"
msgstr "Processortijd:"
#: web/ejabberd_web_admin.erl:2195
msgid "Transactions Committed:"
msgstr "Bevestigde transacties:"
#: web/ejabberd_web_admin.erl:2198
msgid "Transactions Aborted:"
msgstr "Afgebroken transacties:"
#: web/ejabberd_web_admin.erl:2201
msgid "Transactions Restarted:"
msgstr "Herstarte transacties:"
#: web/ejabberd_web_admin.erl:2204
msgid "Transactions Logged:"
msgstr "Gelogde transacties:"
#: web/ejabberd_web_admin.erl:2246
msgid "Update "
msgstr "Opwaarderen van "
#: web/ejabberd_web_admin.erl:2254
msgid "Update plan"
msgstr "Plan voor de opwaardering"
#: web/ejabberd_web_admin.erl:2255
msgid "Modified modules"
msgstr "Gewijzigde modules"
#: web/ejabberd_web_admin.erl:2256
msgid "Update script"
msgstr "Script voor de opwaardering"
#: web/ejabberd_web_admin.erl:2257
msgid "Low level update script"
msgstr "Lowlevel script voor de opwaardering"
#: web/ejabberd_web_admin.erl:2258
msgid "Script check"
msgstr "Controle van script"
#: web/ejabberd_web_admin.erl:2426
msgid "Port"
msgstr "Poort"
#: web/ejabberd_web_admin.erl:2427
msgid "IP"
msgstr "IP"
#: web/ejabberd_web_admin.erl:2428
msgid "Protocol"
msgstr "Protocol"
#: web/ejabberd_web_admin.erl:2429 web/ejabberd_web_admin.erl:2556
msgid "Module"
msgstr "Module"
#: web/ejabberd_web_admin.erl:2430 web/ejabberd_web_admin.erl:2557
msgid "Options"
msgstr "Opties"
#: web/ejabberd_web_admin.erl:2450
msgid "Delete"
msgstr "Verwijderen"
#: web/ejabberd_web_admin.erl:2579
msgid "Start"
msgstr "Starten"
#: web/mod_register_web.erl:104
msgid "Your Jabber account was successfully created."
msgstr "Uw Jabber-account is succesvol gecreeerd."
#: web/mod_register_web.erl:107
msgid "There was an error creating the account: "
msgstr "Er was een fout bij het creeern van de account:"
#: web/mod_register_web.erl:115
msgid "Your Jabber account was successfully deleted."
msgstr "Uw Jabber-account is succesvol verwijderd."
#: web/mod_register_web.erl:118
msgid "There was an error deleting the account: "
msgstr "Er was een fout bij het verwijderen van de account."
#: web/mod_register_web.erl:128
msgid "The password of your Jabber account was successfully changed."
msgstr "Het wachtwoord van Uw Jabber-account is succesvol veranderd."
#: web/mod_register_web.erl:131
msgid "There was an error changing the password: "
msgstr "Er was een fout bij het veranderen van het wachtwoord:"
#: web/mod_register_web.erl:163 web/mod_register_web.erl:172
msgid "Jabber Account Registration"
msgstr "Jabber-account registratie"
#: web/mod_register_web.erl:174 web/mod_register_web.erl:192
#: web/mod_register_web.erl:201
msgid "Register a Jabber account"
msgstr "Registreer een Jabber-account"
#: web/mod_register_web.erl:176 web/mod_register_web.erl:493
#: web/mod_register_web.erl:502
msgid "Unregister a Jabber account"
msgstr "Opheffen van Jabber-account"
#: web/mod_register_web.erl:203
msgid ""
"This page allows to create a Jabber account in this Jabber server. Your JID "
"(Jabber IDentifier) will be of the form: username@server. Please read "
"carefully the instructions to fill correctly the fields."
msgstr ""
"Deze pagina maakt het mogelijk een Jabber-account te registreren op deze "
"server. Uw JID (Jabber IDentiteit) zal er als volg uit zien: "
"gebruikersnaam@server. Lees de instructies zorgvuldig teneinde de velden "
"correct in te vullen."
#: web/mod_register_web.erl:212 web/mod_register_web.erl:386
#: web/mod_register_web.erl:509
msgid "Username:"
msgstr "Gebruikersnaam:"
#: web/mod_register_web.erl:217
msgid "This is case insensitive: macbeth is the same that MacBeth and Macbeth."
msgstr ""
"Dit is niet hoofdlettergevoelig: macbeth is hetzelfde als MacBeth en Macbeth."
#: web/mod_register_web.erl:218
msgid "Characters not allowed:"
msgstr "Niet-toegestane karakters:"
#: web/mod_register_web.erl:222 web/mod_register_web.erl:391
#: web/mod_register_web.erl:514
msgid "Server:"
msgstr "Server:"
#: web/mod_register_web.erl:232
msgid ""
"Don't tell your password to anybody, not even the administrators of the "
"Jabber server."
msgstr ""
"Geef Uw wachtwoord aan niemand, zelfs niet aan de beheerders van deze Jabber-"
"server."
#: web/mod_register_web.erl:234
msgid "You can later change your password using a Jabber client."
msgstr "U can het wachtwoord later veranderen met een Jabber-client."
#: web/mod_register_web.erl:235
msgid ""
"Some Jabber clients can store your password in your computer. Use that "
"feature only if you trust your computer is safe."
msgstr ""
"Sommige Jabber-clienten kunnen het wachtwoord opslaan op Uw computer. "
"Gebruik deze mogelijkheid alleen als U vertrouwd dat Uw computer afdoende "
"beveiligd is."
#: web/mod_register_web.erl:237
msgid ""
"Memorize your password, or write it in a paper placed in a safe place. In "
"Jabber there isn't an automated way to recover your password if you forget "
"it."
msgstr ""
"Onthou het wachtwoord, of schrijf het op en bewaar het op een veilige "
"plaats. Met Jabber is er geen geautomatiseerde manier om het wachtwoord "
"terug te halen als U het vergeet."
#: web/mod_register_web.erl:242 web/mod_register_web.erl:406
msgid "Password Verification:"
msgstr "Wachtwoord Bevestiging:"
#: web/mod_register_web.erl:250
msgid "Register"
msgstr "Registreer"
#: web/mod_register_web.erl:396
msgid "Old Password:"
msgstr "Oud Wachtwoord:"
#: web/mod_register_web.erl:401
msgid "New Password:"
msgstr "Nieuw Wachtwoord:"
#: web/mod_register_web.erl:504
msgid "This page allows to unregister a Jabber account in this Jabber server."
msgstr ""
"Deze pagina maakt het mogelijk een Jabber-account op deze server op te "
"heffen."
#: web/mod_register_web.erl:524
msgid "Unregister"
msgstr "Opheffen"
#, fuzzy
#~ msgid "Captcha test failed"
#~ msgstr "De geautomatiseerde Turing-test is geslaagd."
ejabberd-2.1.11/src/msgs/ja.msg 0000664 0000000 0000000 00000074350 12240230175 013071 0 ustar {"Access Configuration","アクセス設定"}.
{"Access Control List Configuration","アクセスコントロールリスト設定"}.
{"Access control lists","アクセスコントロールリスト"}.
{"Access Control Lists","アクセスコントロールリスト"}.
{"Access denied by service policy","サービスポリシーによってアクセスが禁止されました"}.
{"Access rules","アクセスルール"}.
{"Access Rules","アクセスルール"}.
{"Action on user","ユーザー操作"}.
{"Add Jabber ID","Jabber ID を追加"}.
{"Add New","新規追加"}.
{"Add User","ユーザーを追加"}.
{"Administration of ","管理: "}.
{"Administration","管理"}.
{"Administrator privileges required","管理者権限が必要です"}.
{"A friendly name for the node","ノードのフレンドリネーム"}.
{"All activity","すべて"}.
{"Allow this Jabber ID to subscribe to this pubsub node?","この Jabber ID に、この pubsubノードの購読を許可しますか ?"}.
{"Allow users to change the subject","ユーザーによる題の変更を許可"}.
{"Allow users to query other users","ユーザーによる他のユーザーへのクエリーを許可"}.
{"Allow users to send invites","ユーザーによる招待を許可"}.
{"Allow users to send private messages","ユーザーによるプライベートメッセージの送信を許可"}.
{"Allow visitors to change nickname","傍聴者のニックネームの変更を許可"}.
{"Allow visitors to send private messages to","傍聴者によるプライベートメッセージの送信を次の相手に許可"}.
{"Allow visitors to send status text in presence updates","傍聴者によるプレゼンス更新のステータス文の送信を許可"}.
{"Allow visitors to send voice requests","傍聴者による発言権の要求を許可"}.
{"All Users","全ユーザー"}.
{"Announcements","アナウンス"}.
{"anyone","誰にでも"}.
{"A password is required to enter this room","この談話室に入るにはパスワードが必要です"}.
{"April","4月"}.
{"August","8月"}.
{"Backup","バックアップ"}.
{"Backup Management","バックアップ管理"}.
{"Backup of ","バックアップ: "}.
{"Backup to File at ","ファイルにバックアップ: "}.
{"Bad format","不正なフォーマット"}.
{"Birthday","誕生日"}.
{"CAPTCHA web page","CAPTCHA ウェブページ"}.
{"Change Password","パスワードを変更"}.
{"Change User Password","パスワードを変更"}.
{"Characters not allowed:","使用できない文字:"}.
{"Chatroom configuration modified","談話室の設定が変更されました"}.
{"Chatroom is created","談話室を作りました"}.
{"Chatroom is destroyed","談話室を削除しました"}.
{"Chatroom is started","談話室を開始しました"}.
{"Chatroom is stopped","談話室を停止しました"}.
{"Chatrooms","談話室"}.
{"Choose a username and password to register with this server","サーバーに登録するユーザー名とパスワードを選択してください"}.
{"Choose modules to stop","停止するモジュールを選択"}.
{"Choose storage type of tables","テーブルのストレージタイプを選択"}.
{"Choose whether to approve this entity's subscription.","このエントリを承認するかどうかを選択してください"}.
{"City","都道府県"}.
{"Commands","コマンド"}.
{"Conference room does not exist","会議室は存在しません"}.
{"Configuration of room ~s","談話室 ~s の設定"}.
{"Configuration","設定"}.
{"Connected Resources:","接続リソース:"}.
{"Connections parameters","接続パラメーター"}.
{"Country","国"}.
{"CPU Time:","CPU時間:"}.
{"Database","データーベース"}.
{"Database Tables at ","データーベーステーブル: "}.
{"Database Tables Configuration at ","データーベーステーブル設定 "}.
{"December","12月"}.
{"Default users as participants","デフォルトのユーザーは参加者"}.
{"Delete message of the day on all hosts","全ホストのお知らせメッセージを削除"}.
{"Delete message of the day","お知らせメッセージを削除"}.
{"Delete Selected","選択した項目を削除"}.
{"Delete User","ユーザーを削除"}.
{"Delete","削除"}.
{"Deliver event notifications","イベント通知を配送する"}.
{"Deliver payloads with event notifications","イベント通知と同時にペイロードを配送する"}.
{"Description:","説明:"}.
{"Disc only copy","ディスクだけのコピー"}.
{"Displayed Groups:","表示グループ"}.
{"Don't tell your password to anybody, not even the administrators of the Jabber server.","パスワードは誰にも教えないようにしてください。Jabber サーバーの管理者があなたにパスワードを尋ねることはありません。"}.
{"Dump Backup to Text File at ","テキストファイルにバックアップ: "}.
{"Dump to Text File","テキストファイルに出力"}.
{"Edit Properties","プロパティを編集"}.
{"Either approve or decline the voice request.","発言権の要求を承認または却下します。"}.
{"ejabberd IRC module","ejabberd IRC module"}.
{"ejabberd MUC module","ejabberd MUC module"}.
{"ejabberd Publish-Subscribe module","ejabberd Publish-Subscribe モジュール"}.
{"ejabberd SOCKS5 Bytestreams module","ejabberd SOCKS5 Bytestreams モジュール"}.
{"ejabberd vCard module","ejabberd vCard モジュール"}.
{"ejabberd Web Admin","ejabberd ウェブ管理"}.
{"Elements","要素"}.
{"Email","メールアドレス"}.
{"Enable logging","ロギングを有効"}.
{"Encoding for server ~b","サーバーのエンコーディング ~b"}.
{"End User Session","エンドユーザーセッション"}.
{"Enter list of {Module, [Options]}","{モジュール, [オプション]}のリストを入力してください"}.
{"Enter nickname you want to register","登録するニックネームを入力してください"}.
{"Enter path to backup file","バックアップファイルのパスを入力してください"}.
{"Enter path to jabberd14 spool dir","jabberd14 spool ディレクトリのディレクトリを入力してください"}.
{"Enter path to jabberd14 spool file","jabberd14 spool ファイルのパスを入力してください"}.
{"Enter path to text file","テキストファイルのパスを入力してください"}.
{"Enter the text you see","見えているテキストを入力してください"}.
{"Enter username and encodings you wish to use for connecting to IRC servers. Press 'Next' to get more fields to fill in. Press 'Complete' to save settings.","IRC サーバーに接続先するためのユーザー名と文字エンコーディングを入力してください。'Next' を押して次の項目に進みます。'Complete' を押すと設定が保存されます。"}.
{"Enter username, encodings, ports and passwords you wish to use for connecting to IRC servers","IRC サーバーに接続先するために使用するユーザー名、文字エンコーディング、ポート、パスワードを入力してください"}.
{"Erlang Jabber Server","Erlang Jabber Server"}.
{"Error","エラー"}.
{"Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef.net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}].","例: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef.net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."}.
{"Exclude Jabber IDs from CAPTCHA challenge","CAPTCHA 試験を免除する Jabber ID"}.
{"Export data of all users in the server to PIEFXIS files (XEP-0227):","サーバーにあるすべてのユーザーデータを PIEFXIS ファイルにエクスポート (XEP-0227):"}.
{"Export data of users in a host to PIEFXIS files (XEP-0227):","ホストのユーザーデータを PIEFXIS ファイルにエクスポート (XEP-0227):"}.
{"Failed to extract JID from your voice request approval","発言権要求の承認から JID を取り出すことに失敗しました"}.
{"Family Name","姓"}.
{"February","2月"}.
{"Fill in fields to search for any matching Jabber User","欄を埋めて Jabber User を検索してください"}.
{"Fill in the form to search for any matching Jabber User (Add * to the end of field to match substring)","欄を埋めて Jabber User を検索してください (* を使用すると部分文字列にマッチします)"}.
{"Friday","金曜日"}.
{"From ~s","差出人 ~s"}.
{"From","差出人"}.
{"Full Name","氏名"}.
{"Get Number of Online Users","オンラインユーザー数を取得"}.
{"Get Number of Registered Users","登録ユーザー数を取得"}.
{"Get User Last Login Time","最終ログイン時間を取得"}.
{"Get User Password","パスワードを取得"}.
{"Get User Statistics","ユーザー統計を取得"}.
{"Grant voice to this person?","この人に発言権を与えますか ?"}.
{"Group ","グループ"}.
{"Groups","グループ"}.
{"has been banned","はバンされました"}.
{"has been kicked","はキックされました"}.
{"has been kicked because of an affiliation change","は分掌が変更されたためキックされました"}.
{"has been kicked because of a system shutdown","はシステムシャットダウンのためキックされました"}.
{"has been kicked because the room has been changed to members-only","は談話室がメンバー制に変更されたためキックされました"}.
{" has set the subject to: "," は題を設定しました: "}.
{"Host","ホスト"}.
{"If you don't see the CAPTCHA image here, visit the web page.","ここに CAPTCHA 画像が表示されない場合、ウェブページを参照してください。"}.
{"If you want to specify different ports, passwords, encodings for IRC servers, fill this list with values in format '{\"irc server\", \"encoding\", port, \"password\"}'. By default this service use \"~s\" encoding, port ~p, empty password.","別のポートやパスワード、文字エンコーディングを使用したい場合、'{\"irc server\", \"encoding\", port, \"password\"}' という形式のリストを入力してください。デフォルトでエンコーディングは \"~s\" を使用し、ポートは ~p、パスワードは空になっています。"}.
{"Import Directory","ディレクトリインポート"}.
{"Import File","ファイルからインポート"}.
{"Import user data from jabberd14 spool file:","ユーザーデータを jabberd14 Spool ファイルからインポート:"}.
{"Import User from File at ","ファイルからユーザーをインポート: "}.
{"Import users data from a PIEFXIS file (XEP-0227):","ユーザーデータを PIEFXIS ファイルからインポート (XEP-0227):"}.
{"Import users data from jabberd14 spool directory:","ユーザーデータを jabberd14 Spool ディレクトリからインポート:"}.
{"Import Users from Dir at ","ディレクトリからユーザーをインポート: "}.
{"Import Users From jabberd14 Spool Files","jabberd14 Spool ファイルからユーザーをインポート"}.
{"Improper message type","誤ったメッセージタイプです"}.
{"Incorrect password","パスワードが違います"}.
{"Invalid affiliation: ~s","無効な分掌です: ~s"}.
{"Invalid role: ~s","無効な役です: ~s"}.
{"IP addresses","IP アドレス"}.
{"IP","IP"}.
{"IRC channel (don't put the first #)","IRC チャンネル (先頭に#は不要)"}.
{"IRC server","IRC サーバー"}.
{"IRC settings","IRC 設定"}.
{"IRC Transport","IRC トランスポート"}.
{"IRC username","IRC ユーザー名"}.
{"IRC Username","IRC ユーザー名"}.
{"is now known as","は名前を変更しました: "}.
{"It is not allowed to send private messages of type \"groupchat\"","種別が\"groupchat\" であるプライベートメッセージを送信することはできません"}.
{"It is not allowed to send private messages to the conference","この会議にプライベートメッセージを送信することはできません"}.
{"It is not allowed to send private messages","プライベートメッセージを送信することはできません"}.
{"Jabber Account Registration","Jabber アカウント登録"}.
{"Jabber ID","Jabber ID"}.
{"Jabber ID ~s is invalid","Jabber ID ~s は無効です"}.
{"January","1月"}.
{"Join IRC channel","IRC チャンネルに参加"}.
{"joins the room","が談話室に参加しました"}.
{"Join the IRC channel here.","この IRC チャンネルに参加します。"}.
{"Join the IRC channel in this Jabber ID: ~s","Jabber ID: ~s でこの IRC チャンネルに参加"}.
{"July","7月"}.
{"June","6月"}.
{"Last Activity","活動履歴"}.
{"Last login","最終ログイン"}.
{"Last month","先月"}.
{"Last year","去年"}.
{"leaves the room","が談話室から退出しました"}.
{"Listened Ports at ","Listen ポート "}.
{"Listened Ports","Listen ポート"}.
{"List of modules to start","起動モジュールの一覧"}.
{"Low level update script","低レベル更新スクリプト"}.
{"Make participants list public","参加者一覧を公開"}.
{"Make room CAPTCHA protected","談話室を CAPTCHA で保護"}.
{"Make room members-only","談話室をメンバーのみに制限"}.
{"Make room moderated","談話室をモデレート化"}.
{"Make room password protected","談話室をパスワードで保護"}.
{"Make room persistent","談話室を永続化"}.
{"Make room public searchable","談話室を検索可"}.
{"March","3月"}.
{"Maximum Number of Occupants","最大在室者数"}.
{"Max # of items to persist","アイテムの最大保存数"}.
{"Max payload size in bytes","最大ぺイロードサイズ (byte)"}.
{"May","5月"}.
{"Members:","メンバー:"}.
{"Membership is required to enter this room","この談話室に入るにはメンバーでなければなりません"}.
{"Memorize your password, or write it in a paper placed in a safe place. In Jabber there isn't an automated way to recover your password if you forget it.","パスワードは記憶するか、紙に書いて安全な場所に保管してください。もしあなたがパスワードを忘れてしまった場合、Jabber ではパスワードのリカバリを自動的に行うことはできません。"}.
{"Memory","メモリ"}.
{"Message body","本文"}.
{"Middle Name","ミドルネーム"}.
{"Minimum interval between voice requests (in seconds)","発言権の要求の最小時間間隔 (秒)"}.
{"Moderator privileges required","モデレーター権限が必要です"}.
{"moderators only","モデレーターにのみ"}.
{"Modified modules","変更されたモジュール"}.
{"Module","モジュール"}.
{"Modules","モジュール"}.
{"Modules at ","モジュール "}.
{"Monday","月曜日"}.
{"Name","名"}.
{"Name:","名前:"}.
{"Never","なし"}.
{"New Password:","新しいパスワード:"}.
{"Nickname","ニックネーム"}.
{"Nickname Registration at ","ニックネーム登録: "}.
{"Nickname ~s does not exist in the room","ニックネーム ~s はこの談話室にいません"}.
{"No body provided for announce message","アナウンスメッセージはありませんでした"}.
{"nobody","誰にも許可しない"}.
{"No Data","データなし"}.
{"Node ","ノード "}.
{"Node ID","ノードID"}.
{"Node not found","ノードが見つかりません"}.
{"Nodes","ノード"}.
{"No limit","制限なし"}.
{"None","なし"}.
{"No resource provided","リソースが提供されませんでした"}.
{"Not Found","見つかりません"}.
{"Notify subscribers when items are removed from the node","アイテムがノードから消された時に購読者へ通知する"}.
{"Notify subscribers when the node configuration changes","ノード設定に変更があった時に購読者へ通知する"}.
{"Notify subscribers when the node is deleted","ノードが削除された時に購読者へ通知する"}.
{"November","11月"}.
{"Number of occupants","在室者の数"}.
{"Number of online users","オンラインユーザー数"}.
{"Number of registered users","登録ユーザー数"}.
{"October","10月"}.
{"Offline Messages:","オフラインメッセージ:"}.
{"Offline Messages","オフラインメッセージ"}.
{"OK","OK"}.
{"Old Password:","古いパスワード:"}.
{"Online","オンライン"}.
{"Online Users:","オンラインユーザー:"}.
{"Online Users","オンラインユーザー"}.
{"Only deliver notifications to available users","有効なユーザーにのみ告知を送信する"}.
{"Only moderators and participants are allowed to change the subject in this room","モデレーターと参加者のみが談話室の題を変更できます"}.
{"Only moderators are allowed to change the subject in this room","モデレーターのみが談話室の題を変更できます"}.
{"Only moderators can approve voice requests","モデレーターだけが発言権の要求を承認できます"}.
{"Only occupants are allowed to send messages to the conference","在室者のみがこの会議にメッセージを送ることができます"}.
{"Only occupants are allowed to send queries to the conference","在室者のみが会議にクエリーを送信することができます"}.
{"Only service administrators are allowed to send service messages","サービス管理者のみがサービスメッセージを送信できます"}.
{"Options","オプション"}.
{"Organization Name","会社名"}.
{"Organization Unit","部署名"}.
{"Outgoing s2s Connections:","外向き s2s コネクション:"}.
{"Outgoing s2s Connections","外向き s2s コネクション"}.
{"Outgoing s2s Servers:","外向き s2s サービス:"}.
{"Owner privileges required","主宰者の権限が必要です"}.
{"Packet","パケット"}.
{"Password:","パスワード"}.
{"Password","パスワード"}.
{"Password ~b","パスワード ~b"}.
{"Password Verification:","パスワード (確認):"}.
{"Password Verification","パスワード (確認)"}.
{"Path to Dir","ディレクトリのパス"}.
{"Path to File","ファイルのパス"}.
{"Pending","保留"}.
{"Period: ","期間: "}.
{"Persist items to storage","アイテムをストレージに保存する"}.
{"Ping","Ping"}.
{"Please note that these options will only backup the builtin Mnesia database. If you are using the ODBC module, you also need to backup your SQL database separately.","これらのオプションは組み込みの Mnesia データーベースのバックアップのみを行うことに注意してください。もし ODBC モジュールを使用している場合は、SQL データーベースのバックアップを別に行う必要があります。"}.
{"Please, wait for a while before sending new voice request","新しい発言権の要求を送るまで少し間をおいてください"}.
{"Pong","Pong"}.
{"Port","ポート"}.
{"Port ~b","ポート ~b"}.
{"Present real Jabber IDs to","本当の Jabber ID を公開"}.
{"private, ","プライベート、"}.
{"Protocol","プロトコル"}.
{"Publish-Subscribe","Publish-Subscribe"}.
{"PubSub subscriber request","PubSub 購読者のリクエスト"}.
{"Purge all items when the relevant publisher goes offline","公開者がオフラインになるときに、すべてのアイテムを削除"}.
{"Queries to the conference members are not allowed in this room","この談話室では、会議のメンバーへのクエリーは禁止されています"}.
{"RAM and disc copy","RAM, ディスクコピー"}.
{"RAM copy","RAM コピー"}.
{"Raw","Raw"}.
{"Really delete message of the day?","本当にお知らせメッセージを削除しますか ?"}.
{"Recipient is not in the conference room","受信者はこの会議室にいません"}.
{"Register a Jabber account","Jabber アカウントを登録"}.
{"Registered Users:","登録ユーザー:"}.
{"Registered Users","登録ユーザー"}.
{"Register","登録"}.
{"Registration in mod_irc for ","mod_irc での登録: "}.
{"Remote copy","リモートコピー"}.
{"Remove All Offline Messages","すべてのオフラインメッセージを削除"}.
{"Remove User","ユーザーを削除"}.
{"Remove","削除"}.
{"Replaced by new connection","新しいコネクションによって置き換えられました"}.
{"Resources","リソース"}.
{"Restart Service","サービスを再起動"}.
{"Restart","再起動"}.
{"Restore","リストア"}.
{"Restore Backup from File at ","ファイルからバックアップをリストア: "}.
{"Restore binary backup after next ejabberd restart (requires less memory):","ejabberd の再起動時にバイナリバックアップからリストア (メモリ少):"}.
{"Restore binary backup immediately:","直ちにバイナリバックアップからリストア:"}.
{"Restore plain text backup immediately:","直ちにプレーンテキストバックアップからリストア:"}.
{"Room Configuration","談話室の設定"}.
{"Room creation is denied by service policy","サービスポリシーによって談話室の作成が禁止されています"}.
{"Room description","談話室の説明"}.
{"Room Occupants","在室者"}.
{"Room title","談話室のタイトル"}.
{"Roster groups allowed to subscribe","名簿グループは購読を許可しました"}.
{"Roster of ","名簿: "}.
{"Roster size","名簿サイズ"}.
{"Roster","名簿"}.
{"RPC Call Error","RPC 呼び出しエラー"}.
{"Running Nodes","起動ノード"}.
{"~s access rule configuration","~s アクセスルール設定"}.
{"Saturday","土曜日"}.
{"Script check","スクリプトチェック"}.
{"Search Results for ","検索結果: "}.
{"Search users in ","ユーザーの検索: "}.
{"Send announcement to all online users on all hosts","全ホストのオンラインユーザーにアナウンスを送信"}.
{"Send announcement to all online users","すべてのオンラインユーザーにアナウンスを送信"}.
{"Send announcement to all users on all hosts","全ホストのユーザーにアナウンスを送信"}.
{"Send announcement to all users","すべてのユーザーにアナウンスを送信"}.
{"September","9月"}.
{"Server:","サーバー:"}.
{"Server ~b","サーバー ~b"}.
{"Set message of the day and send to online users","お知らせメッセージを設定し、オンラインユーザーに送信"}.
{"Set message of the day on all hosts and send to online users","全ホストのお知らせメッセージを設定し、オンラインユーザーに送信"}.
{"Shared Roster Groups","共有名簿グループ"}.
{"Show Integral Table","累積の表を表示"}.
{"Show Ordinary Table","通常の表を表示"}.
{"Shut Down Service","サービスを停止"}.
{"~s invites you to the room ~s","~s はあなたを談話室 ~s に招待しています"}.
{"Some Jabber clients can store your password in your computer. Use that feature only if you trust your computer is safe.","Jabber クライアントはコンピューターにパスワードを記憶できます。コンピューターが安全であると信頼できる場合にのみ、この機能を使用してください。"}.
{"Specify the access model","アクセスモデルを設定する"}.
{"Specify the event message type","イベントメッセージ種別を設定"}.
{"Specify the publisher model","公開モデルを指定する"}.
{"~s's Offline Messages Queue","~s' のオフラインメッセージキュー"}.
{"Start Modules at ","モジュールを開始: "}.
{"Start Modules","モジュールを起動"}.
{"Start","開始"}.
{"Statistics of ~p","~p の統計"}.
{"Statistics","統計"}.
{"Stop Modules at ","モジュールを停止: "}.
{"Stop Modules","モジュールを停止"}.
{"Stopped Nodes","停止ノード"}.
{"Stop","停止"}.
{"Storage Type","ストレージタイプ"}.
{"Store binary backup:","バイナリバックアップを保存:"}.
{"Store plain text backup:","プレーンテキストバックアップを保存:"}.
{"Subject","題"}.
{"Submitted","送信完了"}.
{"Submit","送信"}.
{"Subscriber Address","購読者のアドレス"}.
{"Subscription","認可"}.
{"Sunday","日曜日"}.
{"That nickname is already in use by another occupant","そのニックネームは既にほかの在室者によって使用されています"}.
{"That nickname is registered by another person","ニックネームはほかの人によって登録されています"}.
{"The CAPTCHA is valid.","CAPTCHA は有効です。"}.
{"The CAPTCHA verification has failed","CAPTCHA 検証は失敗しました"}.
{"The collections with which a node is affiliated","提携されたノードの集合です"}.
{"the password is","パスワードは"}.
{"The password is too weak","このパスワードは単純過ぎます"}.
{"The password of your Jabber account was successfully changed.","Jabber アカウントのパスワード変更に成功しました。"}.
{"There was an error changing the password: ","パスワードの変更中にエラーが発生しました: "}.
{"There was an error creating the account: ","アカウントの作成中にエラーが発生しました: "}.
{"There was an error deleting the account: ","アカウントの削除中にエラーが発生しました: "}.
{"This is case insensitive: macbeth is the same that MacBeth and Macbeth.","大文字と小文字は区別しません: macbeth は MacBeth や Macbeth と同じです。"}.
{"This page allows to create a Jabber account in this Jabber server. Your JID (Jabber IDentifier) will be of the form: username@server. Please read carefully the instructions to fill correctly the fields.","ここはこの Jabber サーバーにアカウントを作成するページです。あなたの JID (JabberID) は username@server のような形式になります。注意事項どおり、正しく項目を記入してください。"}.
{"This page allows to unregister a Jabber account in this Jabber server.","ここはこの Jabber サーバーのアカウントを削除するページです。"}.
{"This participant is kicked from the room because he sent an error message to another participant","他の参加者にエラーメッセージを送信したため、この参加者はキックされました"}.
{"This participant is kicked from the room because he sent an error message","エラーメッセージを送信したため、この参加者はキックされました"}.
{"This participant is kicked from the room because he sent an error presence","エラープレゼンスを送信したため、この参加者はキックされました"}.
{"This room is not anonymous","この談話室は非匿名です"}.
{"Thursday","木曜日"}.
{"Time delay","遅延時間"}.
{"Time","時間"}.
{"Too many CAPTCHA requests","CAPTCHA 要求が多すぎます"}.
{"To ~s","宛先 ~s"}.
{"To","宛先"}.
{"Traffic rate limit is exceeded","トラフィックレートの制限を超えました"}.
{"Transactions Aborted:","トランザクションの失敗:"}.
{"Transactions Committed:","トランザクションのコミット:"}.
{"Transactions Logged:","トランザクションのログ: "}.
{"Transactions Restarted:","トランザクションの再起動:"}.
{"Tuesday","火曜日"}.
{"Unable to generate a CAPTCHA","CAPTCHA を生成できません"}.
{"Unauthorized","認証されていません"}.
{"Unregister a Jabber account","Jabber アカウントを削除"}.
{"Unregister","削除"}.
{"Update message of the day (don't send)","お知らせメッセージを更新 (送信しない)"}.
{"Update message of the day on all hosts (don't send)","全ホストのお知らせメッセージを更新 (送信しない)"}.
{"Update plan","更新計画"}.
{"Update script","スクリプトの更新"}.
{"Update ","更新 "}.
{"Update","更新"}.
{"Uptime:","起動時間:"}.
{"Use of STARTTLS required","STARTTLS の使用が必要です"}.
{"User ","ユーザー "}.
{"User","ユーザー"}.
{"User JID","ユーザー JID"}.
{"User Management","ユーザー管理"}.
{"Username:","ユーザー名:"}.
{"Users","ユーザー"}.
{"Users are not allowed to register accounts so quickly","それほど速くアカウントを登録することはできません"}.
{"Users Last Activity","ユーザーの活動履歴"}.
{"Validate","検証"}.
{"vCard User Search","vCard ユーザー検索"}.
{"Virtual Hosts","ヴァーチャルホスト"}.
{"Visitors are not allowed to change their nicknames in this room","傍聴者はこの談話室でニックネームを変更することはできません"}.
{"Visitors are not allowed to send messages to all occupants","傍聴者はすべての在室者にメッセージを送信することはできません"}.
{"Voice requests are disabled in this conference","この会議では、発言権の要求はできません"}.
{"Voice request","発言権を要求"}.
{"Wednesday","水曜日"}.
{"When to send the last published item","最後の公開アイテムを送信するタイミングで"}.
{"Whether to allow subscriptions","購読を許可するかどうか"}.
{"You can later change your password using a Jabber client.","あなたは後で Jabber クライアントを使用してパスワードを変更できます。"}.
{"You have been banned from this room","あなたはこの談話室からバンされています"}.
{"You must fill in field \"Nickname\" in the form","フォームの\"ニックネーム\"欄を入力する必要があります"}.
{"You need a client that supports x:data and CAPTCHA to register","登録を行うには x:data と CAPTCHA をサポートするクライアントが必要です"}.
{"You need a client that supports x:data to register the nickname","ニックネームを登録するには x:data をサポートするクライアントが必要です"}.
{"You need an x:data capable client to configure mod_irc settings","mod_irc の設定には x:data をサポートするクライアントが必要です"}.
{"You need an x:data capable client to configure room","談話室を設定するには x:data をサポートするクライアントが必要です"}.
{"You need an x:data capable client to search","検索を行うためには x:data をサポートするクライアントが必要です"}.
{"Your active privacy list has denied the routing of this stanza.","あなたのプライバシーリストはこのスタンザのルーティングを拒否しました。"}.
{"Your contact offline message queue is full. The message has been discarded.","相手先のオフラインメッセージキューが一杯です。このメッセージは破棄されます。"}.
{"Your Jabber account was successfully created.","Jabber アカウントの作成に成功しました。"}.
{"Your Jabber account was successfully deleted.","Jabber アカウントの削除に成功しました。"}.
{"Your messages to ~s are being blocked. To unblock them, visit ~s","~s 宛のメッセージはブロックされています。解除するにはこちらを見てください ~s"}.
ejabberd-2.1.11/src/msgs/ru.po 0000664 0000000 0000000 00000202420 12240230175 012744 0 ustar # , 2010.
msgid ""
msgstr ""
"Project-Id-Version: 2.1.0-alpha\n"
"POT-Creation-Date: \n"
"PO-Revision-Date: 2012-04-15 13:38+0900\n"
"Last-Translator: Evgeniy Khramtsov \n"
"Language-Team: Russian \n"
"Language: ru\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Language: Russian (русский)\n"
"X-Additional-Translator: Konstantin Khomoutov\n"
"X-Additional-Translator: Sergei Golovan\n"
"X-Generator: Lokalize 1.0\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
#: ejabberd_c2s.erl:424 ejabberd_c2s.erl:727
msgid "Use of STARTTLS required"
msgstr "Вы обязаны использовать STARTTLS"
#: ejabberd_c2s.erl:503
msgid "No resource provided"
msgstr "Не указан ресурс"
#: ejabberd_c2s.erl:1197
msgid "Replaced by new connection"
msgstr "Заменено новым соединением"
#: ejabberd_c2s.erl:1885
msgid "Your active privacy list has denied the routing of this stanza."
msgstr ""
"Маршрутизация этой строфы запрещена вашим активным списком приватности."
#: ejabberd_captcha.erl:96 ejabberd_captcha.erl:152 ejabberd_captcha.erl:178
msgid "Enter the text you see"
msgstr "Введите увиденный текст"
#: ejabberd_captcha.erl:101
msgid "Your messages to ~s are being blocked. To unblock them, visit ~s"
msgstr ""
"Ваши сообщения к ~s блокируются. Для снятия блокировки перейдите по ссылке ~s"
#: ejabberd_captcha.erl:134
msgid "If you don't see the CAPTCHA image here, visit the web page."
msgstr "Если вы не видите изображение капчи, перейдите по ссылке."
#: ejabberd_captcha.erl:146
msgid "CAPTCHA web page"
msgstr "Ссылка на капчу"
#: ejabberd_captcha.erl:307
msgid "The CAPTCHA is valid."
msgstr "Проверка капчи прошла успешно."
#: mod_adhoc.erl:95 mod_adhoc.erl:125 mod_adhoc.erl:143 mod_adhoc.erl:161
msgid "Commands"
msgstr "Команды"
#: mod_adhoc.erl:149 mod_adhoc.erl:243
msgid "Ping"
msgstr "Пинг"
#: mod_adhoc.erl:260
msgid "Pong"
msgstr "Понг"
#: mod_announce.erl:507 mod_announce_odbc.erl:499
msgid "Really delete message of the day?"
msgstr "Действительно удалить сообщение дня?"
#: mod_announce.erl:515 mod_announce_odbc.erl:507 mod_configure.erl:1083
#: mod_configure.erl:1128
msgid "Subject"
msgstr "Тема"
#: mod_announce.erl:520 mod_announce_odbc.erl:512 mod_configure.erl:1088
#: mod_configure.erl:1133
msgid "Message body"
msgstr "Тело сообщения"
#: mod_announce.erl:600 mod_announce_odbc.erl:592
msgid "No body provided for announce message"
msgstr "Тело объявления не должно быть пустым"
#: mod_announce.erl:635 mod_announce_odbc.erl:627
msgid "Announcements"
msgstr "Объявления"
#: mod_announce.erl:637 mod_announce_odbc.erl:629
msgid "Send announcement to all users"
msgstr "Разослать объявление всем пользователям"
#: mod_announce.erl:639 mod_announce_odbc.erl:631
msgid "Send announcement to all users on all hosts"
msgstr "Разослать объявление всем пользователям на всех виртуальных серверах"
#: mod_announce.erl:641 mod_announce_odbc.erl:633
msgid "Send announcement to all online users"
msgstr "Разослать объявление всем подключённым пользователям"
#: mod_announce.erl:643 mod_announce_odbc.erl:635 mod_configure.erl:1078
#: mod_configure.erl:1123
msgid "Send announcement to all online users on all hosts"
msgstr ""
"Разослать объявление всем подключённым пользователям на всех виртуальных "
"серверах"
#: mod_announce.erl:645 mod_announce_odbc.erl:637
msgid "Set message of the day and send to online users"
msgstr "Установить сообщение дня и разослать его подключённым пользователям"
#: mod_announce.erl:647 mod_announce_odbc.erl:639
msgid "Set message of the day on all hosts and send to online users"
msgstr ""
"Установить сообщение дня на всех виртуальных серверах и разослать его "
"подключённым пользователям"
#: mod_announce.erl:649 mod_announce_odbc.erl:641
msgid "Update message of the day (don't send)"
msgstr "Обновить сообщение дня (не рассылать)"
#: mod_announce.erl:651 mod_announce_odbc.erl:643
msgid "Update message of the day on all hosts (don't send)"
msgstr "Обновить сообщение дня на всех виртуальных серверах (не рассылать)"
#: mod_announce.erl:653 mod_announce_odbc.erl:645
msgid "Delete message of the day"
msgstr "Удалить сообщение дня"
#: mod_announce.erl:655 mod_announce_odbc.erl:647
msgid "Delete message of the day on all hosts"
msgstr "Удалить сообщение дня со всех виртуальных серверов"
#: mod_configure.erl:114 mod_configure.erl:274 mod_configure.erl:296
#: mod_configure.erl:498
msgid "Configuration"
msgstr "Конфигурация"
#: mod_configure.erl:125 mod_configure.erl:576 web/ejabberd_web_admin.erl:1936
msgid "Database"
msgstr "База данных"
#: mod_configure.erl:127 mod_configure.erl:595
msgid "Start Modules"
msgstr "Запуск модулей"
#: mod_configure.erl:129 mod_configure.erl:596
msgid "Stop Modules"
msgstr "Остановка модулей"
#: mod_configure.erl:131 mod_configure.erl:604 web/ejabberd_web_admin.erl:1937
msgid "Backup"
msgstr "Резервное копирование"
#: mod_configure.erl:133 mod_configure.erl:605
msgid "Restore"
msgstr "Восстановление из резервной копии"
#: mod_configure.erl:135 mod_configure.erl:606
msgid "Dump to Text File"
msgstr "Копирование в текстовый файл"
#: mod_configure.erl:137 mod_configure.erl:615
msgid "Import File"
msgstr "Импорт из файла"
#: mod_configure.erl:139 mod_configure.erl:616
msgid "Import Directory"
msgstr "Импорт из директории"
#: mod_configure.erl:141 mod_configure.erl:581 mod_configure.erl:1057
msgid "Restart Service"
msgstr "Перезапустить службу"
#: mod_configure.erl:143 mod_configure.erl:582 mod_configure.erl:1102
msgid "Shut Down Service"
msgstr "Остановить службу"
#: mod_configure.erl:145 mod_configure.erl:518 mod_configure.erl:1197
#: web/ejabberd_web_admin.erl:1527
msgid "Add User"
msgstr "Добавить пользователя"
#: mod_configure.erl:147 mod_configure.erl:519 mod_configure.erl:1219
msgid "Delete User"
msgstr "Удалить пользователя"
#: mod_configure.erl:149 mod_configure.erl:520 mod_configure.erl:1231
msgid "End User Session"
msgstr "Завершить сеанс пользователя"
#: mod_configure.erl:151 mod_configure.erl:521 mod_configure.erl:1243
#: mod_configure.erl:1255
msgid "Get User Password"
msgstr "Получить пароль пользователя"
#: mod_configure.erl:153 mod_configure.erl:522
msgid "Change User Password"
msgstr "Изменить пароль пользователя"
#: mod_configure.erl:155 mod_configure.erl:523 mod_configure.erl:1272
msgid "Get User Last Login Time"
msgstr "Получить время последнего подключения пользователя"
#: mod_configure.erl:157 mod_configure.erl:524 mod_configure.erl:1284
msgid "Get User Statistics"
msgstr "Получить статистику по пользователю"
#: mod_configure.erl:159 mod_configure.erl:525
msgid "Get Number of Registered Users"
msgstr "Получить количество зарегистрированных пользователей"
#: mod_configure.erl:161 mod_configure.erl:526
msgid "Get Number of Online Users"
msgstr "Получить количество подключённых пользователей"
#: mod_configure.erl:163 mod_configure.erl:509 web/ejabberd_web_admin.erl:831
#: web/ejabberd_web_admin.erl:872
msgid "Access Control Lists"
msgstr "Списки управления доступом"
#: mod_configure.erl:165 mod_configure.erl:510 web/ejabberd_web_admin.erl:940
#: web/ejabberd_web_admin.erl:976
msgid "Access Rules"
msgstr "Правила доступа"
#: mod_configure.erl:297 mod_configure.erl:499
msgid "User Management"
msgstr "Управление пользователями"
#: mod_configure.erl:500 web/ejabberd_web_admin.erl:1058
#: web/ejabberd_web_admin.erl:1462
msgid "Online Users"
msgstr "Подключённые пользователи"
#: mod_configure.erl:501
msgid "All Users"
msgstr "Все пользователи"
#: mod_configure.erl:502
msgid "Outgoing s2s Connections"
msgstr "Исходящие s2s-соединения"
#: mod_configure.erl:503 web/ejabberd_web_admin.erl:1907
msgid "Running Nodes"
msgstr "Работающие узлы"
#: mod_configure.erl:504 web/ejabberd_web_admin.erl:1909
msgid "Stopped Nodes"
msgstr "Остановленные узлы"
#: mod_configure.erl:577 mod_configure.erl:587 web/ejabberd_web_admin.erl:1953
msgid "Modules"
msgstr "Модули"
#: mod_configure.erl:578
msgid "Backup Management"
msgstr "Управление резервным копированием"
#: mod_configure.erl:579
msgid "Import Users From jabberd14 Spool Files"
msgstr "Импорт пользователей из спула jabberd14"
#: mod_configure.erl:699
msgid "To ~s"
msgstr "К ~s"
#: mod_configure.erl:717
msgid "From ~s"
msgstr "От ~s"
#: mod_configure.erl:913
msgid "Database Tables Configuration at "
msgstr "Конфигурация таблиц базы данных на "
#: mod_configure.erl:918
msgid "Choose storage type of tables"
msgstr "Выберите тип хранения таблиц"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "Disc only copy"
msgstr "только диск"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "RAM and disc copy"
msgstr "ОЗУ и диск"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "RAM copy"
msgstr "ОЗУ"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "Remote copy"
msgstr "не хранится локально"
#: mod_configure.erl:950
msgid "Stop Modules at "
msgstr "Остановка модулей на "
#: mod_configure.erl:954
msgid "Choose modules to stop"
msgstr "Выберите модули, которые следует остановить"
#: mod_configure.erl:969
msgid "Start Modules at "
msgstr "Запуск модулей на "
#: mod_configure.erl:973
msgid "Enter list of {Module, [Options]}"
msgstr "Введите список вида {Module, [Options]}"
#: mod_configure.erl:974
msgid "List of modules to start"
msgstr "Список запускаемых модулей"
#: mod_configure.erl:983
msgid "Backup to File at "
msgstr "Резервное копирование в файл на "
#: mod_configure.erl:987 mod_configure.erl:1001
msgid "Enter path to backup file"
msgstr "Введите путь к резервному файлу"
#: mod_configure.erl:988 mod_configure.erl:1002 mod_configure.erl:1016
#: mod_configure.erl:1030
msgid "Path to File"
msgstr "Путь к файлу"
#: mod_configure.erl:997
msgid "Restore Backup from File at "
msgstr "Восстановление из резервной копии на "
#: mod_configure.erl:1011
msgid "Dump Backup to Text File at "
msgstr "Копирование в текстовый файл на "
#: mod_configure.erl:1015
msgid "Enter path to text file"
msgstr "Введите путь к текстовому файлу"
#: mod_configure.erl:1025
msgid "Import User from File at "
msgstr "Импорт пользователя из файла на "
#: mod_configure.erl:1029
msgid "Enter path to jabberd14 spool file"
msgstr "Введите путь к файлу из спула jabberd14"
#: mod_configure.erl:1039
msgid "Import Users from Dir at "
msgstr "Импорт пользователей из директории на "
#: mod_configure.erl:1043
msgid "Enter path to jabberd14 spool dir"
msgstr "Введите путь к директории спула jabberd14"
#: mod_configure.erl:1044
msgid "Path to Dir"
msgstr "Путь к директории"
#: mod_configure.erl:1060 mod_configure.erl:1105
msgid "Time delay"
msgstr "По истечение"
#: mod_configure.erl:1143
msgid "Access Control List Configuration"
msgstr "Конфигурация списков управления доступом"
#: mod_configure.erl:1147
msgid "Access control lists"
msgstr "Списки управления доступом"
#: mod_configure.erl:1171
msgid "Access Configuration"
msgstr "Конфигурация доступа"
#: mod_configure.erl:1175
msgid "Access rules"
msgstr "Правила доступа"
#: mod_configure.erl:1200 mod_configure.erl:1222 mod_configure.erl:1234
#: mod_configure.erl:1246 mod_configure.erl:1258 mod_configure.erl:1275
#: mod_configure.erl:1287 mod_configure.erl:1650 mod_configure.erl:1700
#: mod_configure.erl:1721 mod_roster.erl:943 mod_roster_odbc.erl:1060
#: mod_vcard.erl:472 mod_vcard_ldap.erl:554 mod_vcard_odbc.erl:448
msgid "Jabber ID"
msgstr "Jabber ID"
#: mod_configure.erl:1205 mod_configure.erl:1263 mod_configure.erl:1651
#: mod_configure.erl:1863 mod_muc/mod_muc_room.erl:3224 mod_register.erl:235
#: web/ejabberd_web_admin.erl:1520
msgid "Password"
msgstr "Пароль"
#: mod_configure.erl:1210
msgid "Password Verification"
msgstr "Проверка пароля"
#: mod_configure.erl:1301
msgid "Number of registered users"
msgstr "Количество зарегистрированных пользователей"
#: mod_configure.erl:1315
msgid "Number of online users"
msgstr "Количество подключённых пользователей"
#: mod_configure.erl:1682 web/ejabberd_web_admin.erl:1588
#: web/ejabberd_web_admin.erl:1743
msgid "Never"
msgstr "Никогда"
#: mod_configure.erl:1696 web/ejabberd_web_admin.erl:1601
#: web/ejabberd_web_admin.erl:1756
msgid "Online"
msgstr "Подключён"
#: mod_configure.erl:1701
msgid "Last login"
msgstr "Время последнего подключения"
#: mod_configure.erl:1722
msgid "Roster size"
msgstr "Размер списка контактов"
#: mod_configure.erl:1723
msgid "IP addresses"
msgstr "IP адреса"
#: mod_configure.erl:1724
msgid "Resources"
msgstr "Ресурсы"
#: mod_configure.erl:1850
msgid "Administration of "
msgstr "Администрирование "
#: mod_configure.erl:1853
msgid "Action on user"
msgstr "Действие над пользователем"
#: mod_configure.erl:1857
msgid "Edit Properties"
msgstr "Изменить параметры"
#: mod_configure.erl:1860 web/ejabberd_web_admin.erl:1769
msgid "Remove User"
msgstr "Удалить пользователя"
#: mod_irc/mod_irc.erl:201 mod_irc/mod_irc_odbc.erl:196
#: mod_muc/mod_muc.erl:336 mod_muc/mod_muc_odbc.erl:342
msgid "Access denied by service policy"
msgstr "Доступ запрещён политикой службы"
#: mod_irc/mod_irc.erl:401 mod_irc/mod_irc_odbc.erl:398
msgid "IRC Transport"
msgstr "IRC Транспорт"
#: mod_irc/mod_irc.erl:428 mod_irc/mod_irc_odbc.erl:425
msgid "ejabberd IRC module"
msgstr "ejabberd IRC модуль"
#: mod_irc/mod_irc.erl:559 mod_irc/mod_irc_odbc.erl:568
msgid "You need an x:data capable client to configure mod_irc settings"
msgstr "Чтобы настроить параметры mod_irc, требуется x:data-совместимый клиент"
#: mod_irc/mod_irc.erl:566 mod_irc/mod_irc_odbc.erl:575
msgid "Registration in mod_irc for "
msgstr "Регистрация в mod_irc для "
#: mod_irc/mod_irc.erl:571 mod_irc/mod_irc_odbc.erl:580
msgid ""
"Enter username, encodings, ports and passwords you wish to use for "
"connecting to IRC servers"
msgstr ""
"Введите имя пользователя, кодировки, порты и пароли, которые будут "
"использоваться при подключении к IRC-серверам"
#: mod_irc/mod_irc.erl:576 mod_irc/mod_irc_odbc.erl:585
msgid "IRC Username"
msgstr "Имя пользователя IRC"
#: mod_irc/mod_irc.erl:586 mod_irc/mod_irc_odbc.erl:595
msgid ""
"If you want to specify different ports, passwords, encodings for IRC "
"servers, fill this list with values in format '{\"irc server\", \"encoding"
"\", port, \"password\"}'. By default this service use \"~s\" encoding, port "
"~p, empty password."
msgstr ""
"Чтобы указать различные порты, пароли, кодировки для разных серверов IRC, "
"заполните список значениями в формате '{\"сервер IRC\", \"кодировка\", порт, "
"\"пароль\"}'. По умолчанию сервис использует кодировку \"~s\", порт ~p, "
"пустой пароль."
#: mod_irc/mod_irc.erl:598 mod_irc/mod_irc_odbc.erl:607
msgid ""
"Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef."
"net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."
msgstr ""
"Пример: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef."
"net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."
#: mod_irc/mod_irc.erl:603 mod_irc/mod_irc_odbc.erl:612
msgid "Connections parameters"
msgstr "Параметры соединения"
#: mod_irc/mod_irc.erl:728 mod_irc/mod_irc_odbc.erl:757
msgid "Join IRC channel"
msgstr "Присоединиться к каналу IRC"
#: mod_irc/mod_irc.erl:732 mod_irc/mod_irc_odbc.erl:761
msgid "IRC channel (don't put the first #)"
msgstr "Канал IRC (без символа #)"
#: mod_irc/mod_irc.erl:737 mod_irc/mod_irc_odbc.erl:766
msgid "IRC server"
msgstr "Сервер IRC"
#: mod_irc/mod_irc.erl:770 mod_irc/mod_irc.erl:774
#: mod_irc/mod_irc_odbc.erl:799 mod_irc/mod_irc_odbc.erl:803
msgid "Join the IRC channel here."
msgstr "Присоединяйтесь к каналу IRC"
#: mod_irc/mod_irc.erl:778 mod_irc/mod_irc_odbc.erl:807
msgid "Join the IRC channel in this Jabber ID: ~s"
msgstr "Присоединиться к каналу IRC с Jabber ID: ~s"
#: mod_irc/mod_irc.erl:863 mod_irc/mod_irc_odbc.erl:904
msgid "IRC settings"
msgstr "Настройки IRC"
#: mod_irc/mod_irc.erl:868 mod_irc/mod_irc_odbc.erl:909
msgid ""
"Enter username and encodings you wish to use for connecting to IRC servers. "
"Press 'Next' to get more fields to fill in. Press 'Complete' to save "
"settings."
msgstr ""
"Введите имя пользователя и кодировки, которые будут использоваться при "
"подключении к IRC-серверам. Нажмите 'Далее' для получения дополнительных "
"полей для заполнения. Нажмите 'Завершить' для сохранения настроек."
#: mod_irc/mod_irc.erl:874 mod_irc/mod_irc_odbc.erl:915
msgid "IRC username"
msgstr "Имя пользователя IRC"
#: mod_irc/mod_irc.erl:923 mod_irc/mod_irc_odbc.erl:964
msgid "Password ~b"
msgstr "Пароль ~b"
#: mod_irc/mod_irc.erl:928 mod_irc/mod_irc_odbc.erl:969
msgid "Port ~b"
msgstr "Порт ~b"
#: mod_irc/mod_irc.erl:933 mod_irc/mod_irc_odbc.erl:974
msgid "Encoding for server ~b"
msgstr "Кодировка сервера ~b"
#: mod_irc/mod_irc.erl:942 mod_irc/mod_irc_odbc.erl:983
msgid "Server ~b"
msgstr "Сервер ~b"
#: mod_muc/mod_muc.erl:449 mod_muc/mod_muc_odbc.erl:456
msgid "Only service administrators are allowed to send service messages"
msgstr "Только администратор службы может посылать служебные сообщения"
#: mod_muc/mod_muc.erl:493 mod_muc/mod_muc_odbc.erl:500
msgid "Room creation is denied by service policy"
msgstr "Cоздавать конференцию запрещено политикой службы"
#: mod_muc/mod_muc.erl:500 mod_muc/mod_muc_odbc.erl:507
msgid "Conference room does not exist"
msgstr "Конференция не существует"
#: mod_muc/mod_muc.erl:582 mod_muc/mod_muc_odbc.erl:595
msgid "Chatrooms"
msgstr "Комнаты"
#: mod_muc/mod_muc.erl:712 mod_muc/mod_muc_odbc.erl:729
msgid "You need a client that supports x:data to register the nickname"
msgstr "Чтобы зарегистрировать псевдоним, требуется x:data-совместимый клиент"
#: mod_muc/mod_muc.erl:718 mod_muc/mod_muc_odbc.erl:735
msgid "Nickname Registration at "
msgstr "Регистрация псевдонима на "
#: mod_muc/mod_muc.erl:722 mod_muc/mod_muc_odbc.erl:739
msgid "Enter nickname you want to register"
msgstr "Введите псевдоним, который Вы хотели бы зарегистрировать"
#: mod_muc/mod_muc.erl:723 mod_muc/mod_muc_odbc.erl:740
#: mod_muc/mod_muc_room.erl:3810 mod_roster.erl:944 mod_roster_odbc.erl:1061
#: mod_vcard.erl:364 mod_vcard.erl:477 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:453
msgid "Nickname"
msgstr "Псевдоним"
#: mod_muc/mod_muc.erl:762 mod_muc/mod_muc_odbc.erl:784
#: mod_muc/mod_muc_room.erl:1064 mod_muc/mod_muc_room.erl:1787
msgid "That nickname is registered by another person"
msgstr "Этот псевдоним зарегистрирован кем-то другим"
#: mod_muc/mod_muc.erl:788 mod_muc/mod_muc_odbc.erl:811
msgid "You must fill in field \"Nickname\" in the form"
msgstr "Вы должны заполнить поле \"Псевдоним\" в форме"
#: mod_muc/mod_muc.erl:808 mod_muc/mod_muc_odbc.erl:831
msgid "ejabberd MUC module"
msgstr "ejabberd MUC модуль"
#: mod_muc/mod_muc_log.erl:374 mod_muc/mod_muc_log.erl:381
msgid "Chatroom configuration modified"
msgstr "Конфигурация комнаты изменилась"
#: mod_muc/mod_muc_log.erl:384
msgid "joins the room"
msgstr "вошёл(а) в комнату"
#: mod_muc/mod_muc_log.erl:387 mod_muc/mod_muc_log.erl:390
msgid "leaves the room"
msgstr "вышел(а) из комнаты"
#: mod_muc/mod_muc_log.erl:393 mod_muc/mod_muc_log.erl:396
msgid "has been banned"
msgstr "запретили входить в комнату"
#: mod_muc/mod_muc_log.erl:399 mod_muc/mod_muc_log.erl:402
msgid "has been kicked"
msgstr "выгнали из комнаты"
#: mod_muc/mod_muc_log.erl:405
msgid "has been kicked because of an affiliation change"
msgstr "выгнали из комнаты вследствие смены ранга"
#: mod_muc/mod_muc_log.erl:408
msgid "has been kicked because the room has been changed to members-only"
msgstr "выгнали из комнаты потому что она стала только для членов"
#: mod_muc/mod_muc_log.erl:411
msgid "has been kicked because of a system shutdown"
msgstr "выгнали из комнаты из-за останова системы"
#: mod_muc/mod_muc_log.erl:414
msgid "is now known as"
msgstr "изменил(а) имя на"
#: mod_muc/mod_muc_log.erl:417 mod_muc/mod_muc_log.erl:688
#: mod_muc/mod_muc_room.erl:2393
msgid " has set the subject to: "
msgstr " установил(а) тему: "
#: mod_muc/mod_muc_log.erl:452
msgid "Chatroom is created"
msgstr "Комната создана"
#: mod_muc/mod_muc_log.erl:453
msgid "Chatroom is destroyed"
msgstr "Комната уничтожена"
#: mod_muc/mod_muc_log.erl:454
msgid "Chatroom is started"
msgstr "Комната запущена"
#: mod_muc/mod_muc_log.erl:455
msgid "Chatroom is stopped"
msgstr "Комната остановлена"
#: mod_muc/mod_muc_log.erl:459
msgid "Monday"
msgstr "Понедельник"
#: mod_muc/mod_muc_log.erl:460
msgid "Tuesday"
msgstr "Вторник"
#: mod_muc/mod_muc_log.erl:461
msgid "Wednesday"
msgstr "Среда"
#: mod_muc/mod_muc_log.erl:462
msgid "Thursday"
msgstr "Четверг"
#: mod_muc/mod_muc_log.erl:463
msgid "Friday"
msgstr "Пятница"
#: mod_muc/mod_muc_log.erl:464
msgid "Saturday"
msgstr "Суббота"
#: mod_muc/mod_muc_log.erl:465
msgid "Sunday"
msgstr "Воскресенье"
#: mod_muc/mod_muc_log.erl:469
msgid "January"
msgstr "января"
#: mod_muc/mod_muc_log.erl:470
msgid "February"
msgstr "февраля"
#: mod_muc/mod_muc_log.erl:471
msgid "March"
msgstr "марта"
#: mod_muc/mod_muc_log.erl:472
msgid "April"
msgstr "апреля"
#: mod_muc/mod_muc_log.erl:473
msgid "May"
msgstr "мая"
#: mod_muc/mod_muc_log.erl:474
msgid "June"
msgstr "июня"
#: mod_muc/mod_muc_log.erl:475
msgid "July"
msgstr "июля"
#: mod_muc/mod_muc_log.erl:476
msgid "August"
msgstr "августа"
#: mod_muc/mod_muc_log.erl:477
msgid "September"
msgstr "сентября"
#: mod_muc/mod_muc_log.erl:478
msgid "October"
msgstr "октября"
#: mod_muc/mod_muc_log.erl:479
msgid "November"
msgstr "ноября"
#: mod_muc/mod_muc_log.erl:480
msgid "December"
msgstr "декабря"
#: mod_muc/mod_muc_log.erl:750
msgid "Room Configuration"
msgstr "Конфигурация комнаты"
#: mod_muc/mod_muc_log.erl:759
msgid "Room Occupants"
msgstr "Участники комнаты"
#: mod_muc/mod_muc_room.erl:174
msgid "Traffic rate limit is exceeded"
msgstr "Превышен лимит скорости посылки информации"
#: mod_muc/mod_muc_room.erl:246
msgid ""
"This participant is kicked from the room because he sent an error message"
msgstr ""
"Этого участника выгнали из комнаты за то, что он послал сообщение об ошибке"
#: mod_muc/mod_muc_room.erl:255
msgid "It is not allowed to send private messages to the conference"
msgstr "Не разрешается посылать частные сообщения прямо в конференцию"
#: mod_muc/mod_muc_room.erl:332
msgid "Please, wait for a while before sending new voice request"
msgstr ""
"Пожалуйста, подождите перед тем как подать новый запрос на право голоса"
#: mod_muc/mod_muc_room.erl:347
msgid "Voice requests are disabled in this conference"
msgstr "Запросы на право голоса отключены в этой конференции"
#: mod_muc/mod_muc_room.erl:364
msgid "Failed to extract JID from your voice request approval"
msgstr "Ошибка обработки JID из вашего запроса на право голоса"
#: mod_muc/mod_muc_room.erl:393
msgid "Only moderators can approve voice requests"
msgstr "Только модераторы могут утверждать запросы на право голоса"
#: mod_muc/mod_muc_room.erl:408
msgid "Improper message type"
msgstr "Неправильный тип сообщения"
#: mod_muc/mod_muc_room.erl:518
msgid ""
"This participant is kicked from the room because he sent an error message to "
"another participant"
msgstr ""
"Этого участника выгнали из комнаты за то, что он послал сообщение об ошибке "
"другому участнику"
#: mod_muc/mod_muc_room.erl:531
msgid "It is not allowed to send private messages of type \"groupchat\""
msgstr "Нельзя посылать частные сообщения типа \"groupchat\""
#: mod_muc/mod_muc_room.erl:543 mod_muc/mod_muc_room.erl:611
msgid "Recipient is not in the conference room"
msgstr "Адресата нет в конференции"
#: mod_muc/mod_muc_room.erl:564 mod_muc/mod_muc_room.erl:585
msgid "It is not allowed to send private messages"
msgstr "Запрещено посылать приватные сообщения"
#: mod_muc/mod_muc_room.erl:576 mod_muc/mod_muc_room.erl:956
#: mod_muc/mod_muc_room.erl:4040
msgid "Only occupants are allowed to send messages to the conference"
msgstr "Только присутствующим разрешается посылать сообщения в конференцию"
#: mod_muc/mod_muc_room.erl:634
msgid "Only occupants are allowed to send queries to the conference"
msgstr "Только присутствующим разрешается посылать запросы в конференцию"
#: mod_muc/mod_muc_room.erl:646
msgid "Queries to the conference members are not allowed in this room"
msgstr "Запросы к пользователям в этой конференции запрещены"
#: mod_muc/mod_muc_room.erl:932
msgid ""
"Only moderators and participants are allowed to change the subject in this "
"room"
msgstr "Только модераторы и участники могут изменять тему в этой комнате"
#: mod_muc/mod_muc_room.erl:937
msgid "Only moderators are allowed to change the subject in this room"
msgstr "Только модераторы могут изменять тему в этой комнате"
#: mod_muc/mod_muc_room.erl:947
msgid "Visitors are not allowed to send messages to all occupants"
msgstr "Посетителям не разрешается посылать сообщения всем присутствующим"
#: mod_muc/mod_muc_room.erl:1021
msgid ""
"This participant is kicked from the room because he sent an error presence"
msgstr ""
"Этого участника выгнали из комнаты за то, что он послал присутствие с ошибкой"
#: mod_muc/mod_muc_room.erl:1040
msgid "Visitors are not allowed to change their nicknames in this room"
msgstr "Посетителям запрещено изменять свои псевдонимы в этой комнате"
#: mod_muc/mod_muc_room.erl:1053 mod_muc/mod_muc_room.erl:1779
msgid "That nickname is already in use by another occupant"
msgstr "Этот псевдоним уже занят другим участником"
#: mod_muc/mod_muc_room.erl:1768
msgid "You have been banned from this room"
msgstr "Вам запрещено входить в эту конференцию"
#: mod_muc/mod_muc_room.erl:1771
msgid "Membership is required to enter this room"
msgstr "В эту конференцию могут входить только её члены"
#: mod_muc/mod_muc_room.erl:1807
msgid "This room is not anonymous"
msgstr "Эта комната не анонимная"
#: mod_muc/mod_muc_room.erl:1833
msgid "A password is required to enter this room"
msgstr "Чтобы войти в эту конференцию, нужен пароль"
#: mod_muc/mod_muc_room.erl:1855 mod_register.erl:246
msgid "Too many CAPTCHA requests"
msgstr "Слишком много запросов капчи"
#: mod_muc/mod_muc_room.erl:1864 mod_register.erl:251
msgid "Unable to generate a CAPTCHA"
msgstr "Не получилось создать капчу"
#: mod_muc/mod_muc_room.erl:1874
msgid "Incorrect password"
msgstr "Неправильный пароль"
#: mod_muc/mod_muc_room.erl:2448
msgid "Administrator privileges required"
msgstr "Требуются права администратора"
#: mod_muc/mod_muc_room.erl:2463
msgid "Moderator privileges required"
msgstr "Требуются права модератора"
#: mod_muc/mod_muc_room.erl:2619
msgid "Jabber ID ~s is invalid"
msgstr "Jabber ID ~s недопустимый"
#: mod_muc/mod_muc_room.erl:2633
msgid "Nickname ~s does not exist in the room"
msgstr "Псевдоним ~s в комнате отсутствует"
#: mod_muc/mod_muc_room.erl:2659 mod_muc/mod_muc_room.erl:3049
msgid "Invalid affiliation: ~s"
msgstr "Недопустимый ранг: ~s"
#: mod_muc/mod_muc_room.erl:2713
msgid "Invalid role: ~s"
msgstr "Недопустимая роль: ~s"
#: mod_muc/mod_muc_room.erl:3026 mod_muc/mod_muc_room.erl:3062
msgid "Owner privileges required"
msgstr "Требуются права владельца"
#: mod_muc/mod_muc_room.erl:3195
msgid "Configuration of room ~s"
msgstr "Конфигурация комнаты ~s"
#: mod_muc/mod_muc_room.erl:3200
msgid "Room title"
msgstr "Название комнаты"
#: mod_muc/mod_muc_room.erl:3203 mod_muc/mod_muc_room.erl:3692
msgid "Room description"
msgstr "Описание комнаты"
#: mod_muc/mod_muc_room.erl:3210
msgid "Make room persistent"
msgstr "Сделать комнату постоянной"
#: mod_muc/mod_muc_room.erl:3215
msgid "Make room public searchable"
msgstr "Сделать комнату видимой всем"
#: mod_muc/mod_muc_room.erl:3218
msgid "Make participants list public"
msgstr "Сделать список участников видимым всем"
#: mod_muc/mod_muc_room.erl:3221
msgid "Make room password protected"
msgstr "Сделать комнату защищённой паролем"
#: mod_muc/mod_muc_room.erl:3232
msgid "Maximum Number of Occupants"
msgstr "Максимальное количество участников"
#: mod_muc/mod_muc_room.erl:3239
msgid "No limit"
msgstr "Не ограничено"
#: mod_muc/mod_muc_room.erl:3250
msgid "Present real Jabber IDs to"
msgstr "Сделать реальные Jabber ID участников видимыми"
#: mod_muc/mod_muc_room.erl:3258 mod_muc/mod_muc_room.erl:3292
msgid "moderators only"
msgstr "только модераторам"
#: mod_muc/mod_muc_room.erl:3260 mod_muc/mod_muc_room.erl:3294
msgid "anyone"
msgstr "всем участникам"
#: mod_muc/mod_muc_room.erl:3262
msgid "Make room members-only"
msgstr "Комната только для зарегистрированных участников"
#: mod_muc/mod_muc_room.erl:3265
msgid "Make room moderated"
msgstr "Сделать комнату модерируемой"
#: mod_muc/mod_muc_room.erl:3268
msgid "Default users as participants"
msgstr "Сделать пользователей участниками по умолчанию"
#: mod_muc/mod_muc_room.erl:3271
msgid "Allow users to change the subject"
msgstr "Разрешить пользователям изменять тему"
#: mod_muc/mod_muc_room.erl:3274
msgid "Allow users to send private messages"
msgstr "Разрешить приватные сообщения"
#: mod_muc/mod_muc_room.erl:3279
msgid "Allow visitors to send private messages to"
msgstr "Разрешить посетителям посылать приватные сообщения"
#: mod_muc/mod_muc_room.erl:3290
msgid "nobody"
msgstr "никто"
#: mod_muc/mod_muc_room.erl:3296
msgid "Allow users to query other users"
msgstr "Разрешить iq-запросы к пользователям"
#: mod_muc/mod_muc_room.erl:3299
msgid "Allow users to send invites"
msgstr "Разрешить пользователям посылать приглашения"
#: mod_muc/mod_muc_room.erl:3302
msgid "Allow visitors to send status text in presence updates"
msgstr ""
"Разрешить посетителям вставлять текcт статуса в сообщения о присутствии"
#: mod_muc/mod_muc_room.erl:3305
msgid "Allow visitors to change nickname"
msgstr "Разрешить посетителям изменять псевдоним"
#: mod_muc/mod_muc_room.erl:3308
msgid "Allow visitors to send voice requests"
msgstr "Разрешить посетителям запрашивать право голоса"
#: mod_muc/mod_muc_room.erl:3311
msgid "Minimum interval between voice requests (in seconds)"
msgstr "Минимальный интервал между запросами на право голоса"
#: mod_muc/mod_muc_room.erl:3317
msgid "Make room CAPTCHA protected"
msgstr "Сделать комнату защищённой капчей"
#: mod_muc/mod_muc_room.erl:3322
msgid "Exclude Jabber IDs from CAPTCHA challenge"
msgstr "Исключить показ капчи для списка Jabber ID"
#: mod_muc/mod_muc_room.erl:3329
msgid "Enable logging"
msgstr "Включить журналирование"
#: mod_muc/mod_muc_room.erl:3337
msgid "You need an x:data capable client to configure room"
msgstr "Чтобы сконфигурировать комнату, требуется x:data-совместимый клиент"
#: mod_muc/mod_muc_room.erl:3694
msgid "Number of occupants"
msgstr "Число присутствующих"
#: mod_muc/mod_muc_room.erl:3750
msgid "private, "
msgstr "приватная, "
#: mod_muc/mod_muc_room.erl:3799
msgid "Voice request"
msgstr "Запрос на право голоса"
#: mod_muc/mod_muc_room.erl:3803
msgid "Either approve or decline the voice request."
msgstr "Подтвердите или отклоните право голоса."
#: mod_muc/mod_muc_room.erl:3809
msgid "User JID"
msgstr "JID пользователя"
#: mod_muc/mod_muc_room.erl:3811
msgid "Grant voice to this person?"
msgstr "Предоставить голос?"
#: mod_muc/mod_muc_room.erl:3960
msgid "~s invites you to the room ~s"
msgstr "~s приглашает вас в комнату ~s"
#: mod_muc/mod_muc_room.erl:3969
msgid "the password is"
msgstr "пароль:"
#: mod_offline.erl:510 mod_offline_odbc.erl:352
msgid ""
"Your contact offline message queue is full. The message has been discarded."
msgstr ""
"Очередь недоставленных сообщений Вашего адресата переполнена. Сообщение не "
"было сохранено."
#: mod_offline.erl:560 mod_offline_odbc.erl:408
msgid "~s's Offline Messages Queue"
msgstr "Oчередь офлайновых сообщений ~s"
#: mod_offline.erl:563 mod_offline_odbc.erl:411 mod_roster.erl:987
#: mod_roster_odbc.erl:1104 mod_shared_roster.erl:901
#: mod_shared_roster.erl:1010 mod_shared_roster_odbc.erl:930
#: mod_shared_roster_odbc.erl:1039 web/ejabberd_web_admin.erl:833
#: web/ejabberd_web_admin.erl:874 web/ejabberd_web_admin.erl:942
#: web/ejabberd_web_admin.erl:978 web/ejabberd_web_admin.erl:1019
#: web/ejabberd_web_admin.erl:1508 web/ejabberd_web_admin.erl:1760
#: web/ejabberd_web_admin.erl:1931 web/ejabberd_web_admin.erl:1963
#: web/ejabberd_web_admin.erl:2031 web/ejabberd_web_admin.erl:2135
#: web/ejabberd_web_admin.erl:2160 web/ejabberd_web_admin.erl:2248
msgid "Submitted"
msgstr "Отправлено"
#: mod_offline.erl:571
msgid "Time"
msgstr "Время"
#: mod_offline.erl:572
msgid "From"
msgstr "От кого"
#: mod_offline.erl:573
msgid "To"
msgstr "Кому"
#: mod_offline.erl:574 mod_offline_odbc.erl:419
msgid "Packet"
msgstr "Пакет"
#: mod_offline.erl:587 mod_offline_odbc.erl:432 mod_shared_roster.erl:908
#: mod_shared_roster_odbc.erl:937 web/ejabberd_web_admin.erl:882
#: web/ejabberd_web_admin.erl:986
msgid "Delete Selected"
msgstr "Удалить выделенные"
#: mod_offline.erl:645 mod_offline_odbc.erl:519
msgid "Offline Messages:"
msgstr "Офлайновые сообщения:"
#: mod_offline.erl:645 mod_offline_odbc.erl:519
msgid "Remove All Offline Messages"
msgstr "Удалить все офлайновые сообщения"
#: mod_proxy65/mod_proxy65_service.erl:213
msgid "ejabberd SOCKS5 Bytestreams module"
msgstr "ejabberd SOCKS5 Bytestreams модуль"
#: mod_pubsub/mod_pubsub.erl:1120 mod_pubsub/mod_pubsub_odbc.erl:929
msgid "Publish-Subscribe"
msgstr "Публикация-Подписка"
#: mod_pubsub/mod_pubsub.erl:1214 mod_pubsub/mod_pubsub_odbc.erl:1025
msgid "ejabberd Publish-Subscribe module"
msgstr "Модуль ejabberd Публикации-Подписки"
#: mod_pubsub/mod_pubsub.erl:1497 mod_pubsub/mod_pubsub_odbc.erl:1312
msgid "PubSub subscriber request"
msgstr "Запрос подписчика PubSub"
#: mod_pubsub/mod_pubsub.erl:1499 mod_pubsub/mod_pubsub_odbc.erl:1314
msgid "Choose whether to approve this entity's subscription."
msgstr "Решите: предоставить ли подписку этому объекту."
#: mod_pubsub/mod_pubsub.erl:1505 mod_pubsub/mod_pubsub_odbc.erl:1320
msgid "Node ID"
msgstr "ID узла"
#: mod_pubsub/mod_pubsub.erl:1510 mod_pubsub/mod_pubsub_odbc.erl:1325
msgid "Subscriber Address"
msgstr "Адрес подписчика"
#: mod_pubsub/mod_pubsub.erl:1516 mod_pubsub/mod_pubsub_odbc.erl:1331
msgid "Allow this Jabber ID to subscribe to this pubsub node?"
msgstr "Разрешить этому Jabber ID подписаться на данный узел?"
#: mod_pubsub/mod_pubsub.erl:3474 mod_pubsub/mod_pubsub_odbc.erl:3287
msgid "Deliver payloads with event notifications"
msgstr "Доставлять вместе с уведомлениями o публикациях сами публикации"
#: mod_pubsub/mod_pubsub.erl:3475 mod_pubsub/mod_pubsub_odbc.erl:3288
msgid "Deliver event notifications"
msgstr "Доставлять уведомления о событиях"
#: mod_pubsub/mod_pubsub.erl:3476 mod_pubsub/mod_pubsub_odbc.erl:3289
msgid "Notify subscribers when the node configuration changes"
msgstr "Уведомлять подписчиков об изменении конфигурации сборника"
#: mod_pubsub/mod_pubsub.erl:3477 mod_pubsub/mod_pubsub_odbc.erl:3290
msgid "Notify subscribers when the node is deleted"
msgstr "Уведомлять подписчиков об удалении сборника"
#: mod_pubsub/mod_pubsub.erl:3478 mod_pubsub/mod_pubsub_odbc.erl:3291
msgid "Notify subscribers when items are removed from the node"
msgstr "Уведомлять подписчиков об удалении публикаций из сборника"
#: mod_pubsub/mod_pubsub.erl:3479 mod_pubsub/mod_pubsub_odbc.erl:3292
msgid "Persist items to storage"
msgstr "Сохранять публикации в хранилище"
#: mod_pubsub/mod_pubsub.erl:3480 mod_pubsub/mod_pubsub_odbc.erl:3293
msgid "A friendly name for the node"
msgstr "Легко запоминаемое имя для узла"
#: mod_pubsub/mod_pubsub.erl:3481 mod_pubsub/mod_pubsub_odbc.erl:3294
msgid "Max # of items to persist"
msgstr "Максимальное число сохраняемых публикаций"
#: mod_pubsub/mod_pubsub.erl:3482 mod_pubsub/mod_pubsub_odbc.erl:3295
msgid "Whether to allow subscriptions"
msgstr "Разрешить подписку"
#: mod_pubsub/mod_pubsub.erl:3483 mod_pubsub/mod_pubsub_odbc.erl:3296
msgid "Specify the access model"
msgstr "Укажите механизм управления доступом"
#: mod_pubsub/mod_pubsub.erl:3486 mod_pubsub/mod_pubsub_odbc.erl:3299
msgid "Roster groups allowed to subscribe"
msgstr "Группы списка контактов, которым разрешена подписка"
#: mod_pubsub/mod_pubsub.erl:3487 mod_pubsub/mod_pubsub_odbc.erl:3300
msgid "Specify the publisher model"
msgstr "Условия публикации"
#: mod_pubsub/mod_pubsub.erl:3489 mod_pubsub/mod_pubsub_odbc.erl:3302
msgid "Purge all items when the relevant publisher goes offline"
msgstr "Очищать все записи автора публикации когда он отключается"
#: mod_pubsub/mod_pubsub.erl:3490 mod_pubsub/mod_pubsub_odbc.erl:3303
msgid "Specify the event message type"
msgstr "Укажите тип сообщения о событии"
#: mod_pubsub/mod_pubsub.erl:3492 mod_pubsub/mod_pubsub_odbc.erl:3305
msgid "Max payload size in bytes"
msgstr "Максимальный размер полезной нагрузки в байтах"
#: mod_pubsub/mod_pubsub.erl:3493 mod_pubsub/mod_pubsub_odbc.erl:3306
msgid "When to send the last published item"
msgstr "Когда посылать последний опубликованный элемент"
#: mod_pubsub/mod_pubsub.erl:3495 mod_pubsub/mod_pubsub_odbc.erl:3308
msgid "Only deliver notifications to available users"
msgstr "Доставлять уведомления только доступным пользователям"
#: mod_pubsub/mod_pubsub.erl:3496 mod_pubsub/mod_pubsub_odbc.erl:3309
msgid "The collections with which a node is affiliated"
msgstr "Имя коллекции, в которую входит узел"
#: mod_register.erl:193
msgid "The CAPTCHA verification has failed"
msgstr "Проверка капчи не пройдена"
#: mod_register.erl:220
msgid "You need a client that supports x:data and CAPTCHA to register"
msgstr "Чтобы зарегистрироваться, требуется x:data-совместимый клиент"
#: mod_register.erl:226 mod_register.erl:265
msgid "Choose a username and password to register with this server"
msgstr "Выберите имя пользователя и пароль для регистрации на этом сервере"
#: mod_register.erl:230 mod_vcard.erl:364 mod_vcard_odbc.erl:342
#: web/ejabberd_web_admin.erl:1515 web/ejabberd_web_admin.erl:1572
msgid "User"
msgstr "Пользователь"
#: mod_register.erl:316 mod_register.erl:361
msgid "The password is too weak"
msgstr "Слишком слабый пароль"
#: mod_register.erl:365
msgid "Users are not allowed to register accounts so quickly"
msgstr "Пользователи не могут регистрировать учётные записи так быстро"
#: mod_roster.erl:938 mod_roster_odbc.erl:1055 web/ejabberd_web_admin.erl:1701
#: web/ejabberd_web_admin.erl:1886 web/ejabberd_web_admin.erl:1897
#: web/ejabberd_web_admin.erl:2219
msgid "None"
msgstr "Нет"
#: mod_roster.erl:945 mod_roster_odbc.erl:1062
msgid "Subscription"
msgstr "Подписка"
#: mod_roster.erl:946 mod_roster_odbc.erl:1063
msgid "Pending"
msgstr "Ожидание"
#: mod_roster.erl:947 mod_roster_odbc.erl:1064
msgid "Groups"
msgstr "Группы"
#: mod_roster.erl:974 mod_roster_odbc.erl:1091
msgid "Validate"
msgstr "Утвердить"
#: mod_roster.erl:982 mod_roster_odbc.erl:1099
msgid "Remove"
msgstr "Удалить"
#: mod_roster.erl:985 mod_roster_odbc.erl:1102
msgid "Roster of "
msgstr "Ростер пользователя "
#: mod_roster.erl:988 mod_roster_odbc.erl:1105 mod_shared_roster.erl:902
#: mod_shared_roster.erl:1011 mod_shared_roster_odbc.erl:931
#: mod_shared_roster_odbc.erl:1040 web/ejabberd_web_admin.erl:834
#: web/ejabberd_web_admin.erl:875 web/ejabberd_web_admin.erl:943
#: web/ejabberd_web_admin.erl:979 web/ejabberd_web_admin.erl:1020
#: web/ejabberd_web_admin.erl:1509 web/ejabberd_web_admin.erl:1761
#: web/ejabberd_web_admin.erl:1932 web/ejabberd_web_admin.erl:2136
#: web/ejabberd_web_admin.erl:2161
msgid "Bad format"
msgstr "Неправильный формат"
#: mod_roster.erl:995 mod_roster_odbc.erl:1112
msgid "Add Jabber ID"
msgstr "Добавить Jabber ID"
#: mod_roster.erl:1094 mod_roster_odbc.erl:1211
msgid "Roster"
msgstr "Ростер"
#: mod_shared_roster.erl:857 mod_shared_roster.erl:899
#: mod_shared_roster.erl:1007 mod_shared_roster_odbc.erl:886
#: mod_shared_roster_odbc.erl:928 mod_shared_roster_odbc.erl:1036
msgid "Shared Roster Groups"
msgstr "Группы общих контактов"
#: mod_shared_roster.erl:895 mod_shared_roster_odbc.erl:924
#: web/ejabberd_web_admin.erl:1365 web/ejabberd_web_admin.erl:2461
msgid "Add New"
msgstr "Добавить"
#: mod_shared_roster.erl:978 mod_shared_roster_odbc.erl:1007
msgid "Name:"
msgstr "Название:"
#: mod_shared_roster.erl:983 mod_shared_roster_odbc.erl:1012
msgid "Description:"
msgstr "Описание:"
#: mod_shared_roster.erl:991 mod_shared_roster_odbc.erl:1020
msgid "Members:"
msgstr "Члены:"
#: mod_shared_roster.erl:999 mod_shared_roster_odbc.erl:1028
msgid "Displayed Groups:"
msgstr "Видимые группы:"
#: mod_shared_roster.erl:1008 mod_shared_roster_odbc.erl:1037
msgid "Group "
msgstr "Группа "
#: mod_shared_roster.erl:1017 mod_shared_roster_odbc.erl:1046
#: web/ejabberd_web_admin.erl:840 web/ejabberd_web_admin.erl:884
#: web/ejabberd_web_admin.erl:949 web/ejabberd_web_admin.erl:1026
#: web/ejabberd_web_admin.erl:2017
msgid "Submit"
msgstr "Отправить"
#: mod_vcard.erl:165 mod_vcard_ldap.erl:238 mod_vcard_odbc.erl:129
msgid "Erlang Jabber Server"
msgstr "Erlang Jabber Server"
#: mod_vcard.erl:364 mod_vcard.erl:478 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:454
msgid "Birthday"
msgstr "День рождения"
#: mod_vcard.erl:364 mod_vcard.erl:480 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:456
msgid "City"
msgstr "Город"
#: mod_vcard.erl:364 mod_vcard.erl:479 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:455
msgid "Country"
msgstr "Страна"
#: mod_vcard.erl:364 mod_vcard.erl:481 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:457
msgid "Email"
msgstr "Электронная почта"
#: mod_vcard.erl:364 mod_vcard.erl:476 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:452
msgid "Family Name"
msgstr "Фамилия"
#: mod_vcard.erl:364 mod_vcard_odbc.erl:342
msgid ""
"Fill in the form to search for any matching Jabber User (Add * to the end of "
"field to match substring)"
msgstr ""
"Заполните форму для поиска пользователя Jabber (Если добавить * в конец "
"поля, то происходит поиск подстроки)"
#: mod_vcard.erl:364 mod_vcard.erl:473 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:449
msgid "Full Name"
msgstr "Полное имя"
#: mod_vcard.erl:364 mod_vcard.erl:475 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:451
msgid "Middle Name"
msgstr "Отчество"
#: mod_vcard.erl:364 mod_vcard.erl:474 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:450 web/ejabberd_web_admin.erl:2006
msgid "Name"
msgstr "Название"
#: mod_vcard.erl:364 mod_vcard.erl:482 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:458
msgid "Organization Name"
msgstr "Название организации"
#: mod_vcard.erl:364 mod_vcard.erl:483 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:459
msgid "Organization Unit"
msgstr "Отдел организации"
#: mod_vcard.erl:364 mod_vcard_ldap.erl:462 mod_vcard_odbc.erl:342
msgid "Search users in "
msgstr "Поиск пользователей в "
#: mod_vcard.erl:364 mod_vcard_ldap.erl:462 mod_vcard_odbc.erl:342
msgid "You need an x:data capable client to search"
msgstr "Чтобы воспользоваться поиском, требуется x:data-совместимый клиент"
#: mod_vcard.erl:389 mod_vcard_ldap.erl:487 mod_vcard_odbc.erl:367
msgid "vCard User Search"
msgstr "Поиск пользователей по vCard"
#: mod_vcard.erl:445 mod_vcard_ldap.erl:541 mod_vcard_odbc.erl:421
msgid "ejabberd vCard module"
msgstr "ejabberd vCard модуль"
#: mod_vcard.erl:469 mod_vcard_ldap.erl:551 mod_vcard_odbc.erl:445
msgid "Search Results for "
msgstr "Результаты поиска в "
#: mod_vcard_ldap.erl:462
msgid "Fill in fields to search for any matching Jabber User"
msgstr "Заполните форму для поиска пользователя Jabber"
#: web/ejabberd_web_admin.erl:193 web/ejabberd_web_admin.erl:203
#: web/ejabberd_web_admin.erl:219 web/ejabberd_web_admin.erl:229
msgid "Unauthorized"
msgstr "Не авторизован"
#: web/ejabberd_web_admin.erl:286 web/ejabberd_web_admin.erl:303
msgid "ejabberd Web Admin"
msgstr "Web-интерфейс администрирования ejabberd"
#: web/ejabberd_web_admin.erl:769 web/ejabberd_web_admin.erl:780
msgid "Administration"
msgstr "Администрирование"
#: web/ejabberd_web_admin.erl:878 web/ejabberd_web_admin.erl:982
msgid "Raw"
msgstr "Необработанный формат"
#: web/ejabberd_web_admin.erl:1017
msgid "~s access rule configuration"
msgstr "Конфигурация правила доступа ~s"
#: web/ejabberd_web_admin.erl:1035
msgid "Virtual Hosts"
msgstr "Виртуальные хосты"
#: web/ejabberd_web_admin.erl:1043 web/ejabberd_web_admin.erl:1050
msgid "Users"
msgstr "Пользователи"
#: web/ejabberd_web_admin.erl:1078
msgid "Users Last Activity"
msgstr "Статистика последнего подключения пользователей"
#: web/ejabberd_web_admin.erl:1080
msgid "Period: "
msgstr "Период"
#: web/ejabberd_web_admin.erl:1090
msgid "Last month"
msgstr "За последний месяц"
#: web/ejabberd_web_admin.erl:1091
msgid "Last year"
msgstr "За последний год"
#: web/ejabberd_web_admin.erl:1092
msgid "All activity"
msgstr "Вся статистика"
#: web/ejabberd_web_admin.erl:1094
msgid "Show Ordinary Table"
msgstr "Показать обычную таблицу"
#: web/ejabberd_web_admin.erl:1096
msgid "Show Integral Table"
msgstr "Показать интегральную таблицу"
#: web/ejabberd_web_admin.erl:1105 web/ejabberd_web_admin.erl:1939
msgid "Statistics"
msgstr "Статистика"
#: web/ejabberd_web_admin.erl:1117
msgid "Not Found"
msgstr "Не Найдено"
#: web/ejabberd_web_admin.erl:1134
msgid "Node not found"
msgstr "Узел не найден"
#: web/ejabberd_web_admin.erl:1460
msgid "Host"
msgstr "Хост"
#: web/ejabberd_web_admin.erl:1461
msgid "Registered Users"
msgstr "Зарегистрированные пользователи"
#: web/ejabberd_web_admin.erl:1573
msgid "Offline Messages"
msgstr "Офлайновые сообщения"
#: web/ejabberd_web_admin.erl:1574 web/ejabberd_web_admin.erl:1767
msgid "Last Activity"
msgstr "Последнее подключение"
#: web/ejabberd_web_admin.erl:1659 web/ejabberd_web_admin.erl:1675
msgid "Registered Users:"
msgstr "Зарегистрированные пользователи:"
#: web/ejabberd_web_admin.erl:1661 web/ejabberd_web_admin.erl:1677
#: web/ejabberd_web_admin.erl:2192
msgid "Online Users:"
msgstr "Подключённые пользователи:"
#: web/ejabberd_web_admin.erl:1663
msgid "Outgoing s2s Connections:"
msgstr "Исходящие s2s-серверы:"
#: web/ejabberd_web_admin.erl:1665
msgid "Outgoing s2s Servers:"
msgstr "Исходящие s2s-серверы:"
#: web/ejabberd_web_admin.erl:1734 web/mod_register_web.erl:175
#: web/mod_register_web.erl:372 web/mod_register_web.erl:381
#: web/mod_register_web.erl:411
msgid "Change Password"
msgstr "Сменить пароль"
#: web/ejabberd_web_admin.erl:1758
msgid "User "
msgstr "Пользователь "
#: web/ejabberd_web_admin.erl:1765
msgid "Connected Resources:"
msgstr "Подключённые ресурсы:"
#: web/ejabberd_web_admin.erl:1766 web/mod_register_web.erl:227
#: web/mod_register_web.erl:519
msgid "Password:"
msgstr "Пароль:"
#: web/ejabberd_web_admin.erl:1828
msgid "No Data"
msgstr "Нет данных"
#: web/ejabberd_web_admin.erl:1906
msgid "Nodes"
msgstr "Узлы"
#: web/ejabberd_web_admin.erl:1929 web/ejabberd_web_admin.erl:1951
msgid "Node "
msgstr "Узел "
#: web/ejabberd_web_admin.erl:1938
msgid "Listened Ports"
msgstr "Прослушиваемые порты"
#: web/ejabberd_web_admin.erl:1940 web/ejabberd_web_admin.erl:2260
#: web/ejabberd_web_admin.erl:2448
msgid "Update"
msgstr "Обновить"
#: web/ejabberd_web_admin.erl:1943 web/ejabberd_web_admin.erl:2569
msgid "Restart"
msgstr "Перезапустить"
#: web/ejabberd_web_admin.erl:1945 web/ejabberd_web_admin.erl:2571
msgid "Stop"
msgstr "Остановить"
#: web/ejabberd_web_admin.erl:1959
msgid "RPC Call Error"
msgstr "Ошибка вызова RPC"
#: web/ejabberd_web_admin.erl:2000
msgid "Database Tables at "
msgstr "Таблицы базы данных на "
#: web/ejabberd_web_admin.erl:2007
msgid "Storage Type"
msgstr "Тип таблицы"
#: web/ejabberd_web_admin.erl:2008
msgid "Elements"
msgstr "Элементы"
#: web/ejabberd_web_admin.erl:2009
msgid "Memory"
msgstr "Память"
#: web/ejabberd_web_admin.erl:2032 web/ejabberd_web_admin.erl:2137
msgid "Error"
msgstr "Ошибка"
#: web/ejabberd_web_admin.erl:2034
msgid "Backup of "
msgstr "Резервное копирование "
#: web/ejabberd_web_admin.erl:2036
msgid ""
"Please note that these options will only backup the builtin Mnesia database. "
"If you are using the ODBC module, you also need to backup your SQL database "
"separately."
msgstr ""
"Заметьте, что здесь производится резервное копирование только встроенной "
"базы данных Mnesia. Если Вы также используете другое хранилище данных "
"(например с помощью модуля ODBC), то его резервное копирование следует "
"осуществлять отдельно."
#: web/ejabberd_web_admin.erl:2041
msgid "Store binary backup:"
msgstr "Сохранить бинарную резервную копию:"
#: web/ejabberd_web_admin.erl:2045 web/ejabberd_web_admin.erl:2052
#: web/ejabberd_web_admin.erl:2060 web/ejabberd_web_admin.erl:2067
#: web/ejabberd_web_admin.erl:2074 web/ejabberd_web_admin.erl:2081
#: web/ejabberd_web_admin.erl:2088 web/ejabberd_web_admin.erl:2096
#: web/ejabberd_web_admin.erl:2103 web/ejabberd_web_admin.erl:2110
msgid "OK"
msgstr "Продолжить"
#: web/ejabberd_web_admin.erl:2048
msgid "Restore binary backup immediately:"
msgstr "Восстановить из бинарной резервной копии немедленно:"
#: web/ejabberd_web_admin.erl:2056
msgid ""
"Restore binary backup after next ejabberd restart (requires less memory):"
msgstr ""
"Восстановить из бинарной резервной копии при следующем запуске (требует "
"меньше памяти):"
#: web/ejabberd_web_admin.erl:2063
msgid "Store plain text backup:"
msgstr "Сохранить текстовую резервную копию:"
#: web/ejabberd_web_admin.erl:2070
msgid "Restore plain text backup immediately:"
msgstr "Восстановить из текстовой резервной копии немедленно:"
#: web/ejabberd_web_admin.erl:2077
msgid "Import users data from a PIEFXIS file (XEP-0227):"
msgstr "Импорт пользовательских данных из файла формата PIEFXIS (XEP-0227):"
#: web/ejabberd_web_admin.erl:2084
msgid "Export data of all users in the server to PIEFXIS files (XEP-0227):"
msgstr ""
"Экспорт данных всех пользователей сервера в файлы формата PIEFXIS (XEP-0227):"
#: web/ejabberd_web_admin.erl:2091
msgid "Export data of users in a host to PIEFXIS files (XEP-0227):"
msgstr ""
"Экспорт пользовательских данных домена в файлы формата PIEFXIS (XEP-0227):"
#: web/ejabberd_web_admin.erl:2099
msgid "Import user data from jabberd14 spool file:"
msgstr "Импорт пользовательских данных из буферного файла jabberd14:"
#: web/ejabberd_web_admin.erl:2106
msgid "Import users data from jabberd14 spool directory:"
msgstr "Импорт пользовательских данных из буферной директории jabberd14:"
#: web/ejabberd_web_admin.erl:2132
msgid "Listened Ports at "
msgstr "Прослушиваемые порты на "
#: web/ejabberd_web_admin.erl:2157
msgid "Modules at "
msgstr "Модули на "
#: web/ejabberd_web_admin.erl:2183
msgid "Statistics of ~p"
msgstr "статистика узла ~p"
#: web/ejabberd_web_admin.erl:2186
msgid "Uptime:"
msgstr "Время работы:"
#: web/ejabberd_web_admin.erl:2189
msgid "CPU Time:"
msgstr "Процессорное время:"
#: web/ejabberd_web_admin.erl:2195
msgid "Transactions Committed:"
msgstr "Транзакции завершенные:"
#: web/ejabberd_web_admin.erl:2198
msgid "Transactions Aborted:"
msgstr "Транзакции отмененные:"
#: web/ejabberd_web_admin.erl:2201
msgid "Transactions Restarted:"
msgstr "Транзакции перезапущенные:"
#: web/ejabberd_web_admin.erl:2204
msgid "Transactions Logged:"
msgstr "Транзакции запротоколированные:"
#: web/ejabberd_web_admin.erl:2246
msgid "Update "
msgstr "Обновление "
#: web/ejabberd_web_admin.erl:2254
msgid "Update plan"
msgstr "План обновления"
#: web/ejabberd_web_admin.erl:2255
msgid "Modified modules"
msgstr "Изменённые модули"
#: web/ejabberd_web_admin.erl:2256
msgid "Update script"
msgstr "Сценарий обновления"
#: web/ejabberd_web_admin.erl:2257
msgid "Low level update script"
msgstr "Низкоуровневый сценарий обновления"
#: web/ejabberd_web_admin.erl:2258
msgid "Script check"
msgstr "Проверка сценария"
#: web/ejabberd_web_admin.erl:2426
msgid "Port"
msgstr "Порт"
#: web/ejabberd_web_admin.erl:2427
msgid "IP"
msgstr "IP"
#: web/ejabberd_web_admin.erl:2428
msgid "Protocol"
msgstr "Протокол"
#: web/ejabberd_web_admin.erl:2429 web/ejabberd_web_admin.erl:2556
msgid "Module"
msgstr "Модуль"
#: web/ejabberd_web_admin.erl:2430 web/ejabberd_web_admin.erl:2557
msgid "Options"
msgstr "Параметры"
#: web/ejabberd_web_admin.erl:2450
msgid "Delete"
msgstr "Удалить"
#: web/ejabberd_web_admin.erl:2579
msgid "Start"
msgstr "Запустить"
#: web/mod_register_web.erl:104
msgid "Your Jabber account was successfully created."
msgstr "Ваш Jabber-аккаунт был успешно создан."
#: web/mod_register_web.erl:107
msgid "There was an error creating the account: "
msgstr "Ошибка при создании аккаунта:"
#: web/mod_register_web.erl:115
msgid "Your Jabber account was successfully deleted."
msgstr "Ваш Jabber-аккаунт был успешно удален."
#: web/mod_register_web.erl:118
msgid "There was an error deleting the account: "
msgstr "Ошибка при удалении аккаунта:"
#: web/mod_register_web.erl:128
msgid "The password of your Jabber account was successfully changed."
msgstr "Пароль Вашего Jabber-аккаунта был успешно изменен."
#: web/mod_register_web.erl:131
msgid "There was an error changing the password: "
msgstr "Ошибка при смене пароля:"
#: web/mod_register_web.erl:163 web/mod_register_web.erl:172
msgid "Jabber Account Registration"
msgstr "Регистрация Jabber-аккаунта"
#: web/mod_register_web.erl:174 web/mod_register_web.erl:192
#: web/mod_register_web.erl:201
msgid "Register a Jabber account"
msgstr "Зарегистрировать Jabber-аккаунт"
#: web/mod_register_web.erl:176 web/mod_register_web.erl:493
#: web/mod_register_web.erl:502
msgid "Unregister a Jabber account"
msgstr "Удалить Jabber-аккаунт"
#: web/mod_register_web.erl:203
msgid ""
"This page allows to create a Jabber account in this Jabber server. Your JID "
"(Jabber IDentifier) will be of the form: username@server. Please read "
"carefully the instructions to fill correctly the fields."
msgstr ""
"Здесь Вы можете создать Jabber-аккаунт на этом Jabber-сервере. Ваш JID "
"(Jabber-идентификатор) будет в виде: \"пользователь@сервер\". Пожалуйста, "
"внимательно читайте инструкции для правильного заполнения полей."
#: web/mod_register_web.erl:212 web/mod_register_web.erl:386
#: web/mod_register_web.erl:509
msgid "Username:"
msgstr "Имя пользователя:"
#: web/mod_register_web.erl:217
msgid "This is case insensitive: macbeth is the same that MacBeth and Macbeth."
msgstr ""
"Регистр не имеет значения: \"маша\" и \"МАША\" будет считаться одним и тем "
"же именем."
#: web/mod_register_web.erl:218
msgid "Characters not allowed:"
msgstr "Недопустимые символы:"
#: web/mod_register_web.erl:222 web/mod_register_web.erl:391
#: web/mod_register_web.erl:514
msgid "Server:"
msgstr "Сервер:"
#: web/mod_register_web.erl:232
msgid ""
"Don't tell your password to anybody, not even the administrators of the "
"Jabber server."
msgstr "Не говорите никому свой пароль, даже администраторам сервера."
#: web/mod_register_web.erl:234
msgid "You can later change your password using a Jabber client."
msgstr "Позже Вы можете изменить пароль через Jabber-клиент."
#: web/mod_register_web.erl:235
msgid ""
"Some Jabber clients can store your password in your computer. Use that "
"feature only if you trust your computer is safe."
msgstr ""
"Некоторые Jabber-клиенты могут сохранять пароль на Вашем компьютере. "
"Используйте эту функцию только в том случае, если считаете это безопасным."
#: web/mod_register_web.erl:237
msgid ""
"Memorize your password, or write it in a paper placed in a safe place. In "
"Jabber there isn't an automated way to recover your password if you forget "
"it."
msgstr ""
"Запомните пароль или запишите его на бумаге, которую сохраните в безопасном "
"месте. В Jabber'е нет автоматизированного средства восстановления пароля в "
"том случае, если Вы его забудете."
#: web/mod_register_web.erl:242 web/mod_register_web.erl:406
msgid "Password Verification:"
msgstr "Проверка пароля:"
#: web/mod_register_web.erl:250
msgid "Register"
msgstr "Зарегистрировать"
#: web/mod_register_web.erl:396
msgid "Old Password:"
msgstr "Старый пароль:"
#: web/mod_register_web.erl:401
msgid "New Password:"
msgstr "Новый пароль:"
#: web/mod_register_web.erl:504
msgid "This page allows to unregister a Jabber account in this Jabber server."
msgstr "Здесь Вы можете удалить Jabber-аккаунт с этого сервера."
#: web/mod_register_web.erl:524
msgid "Unregister"
msgstr "Удалить"
#, fuzzy
#~ msgid "Captcha test failed"
#~ msgstr "Проверка капчи прошла успешно."
ejabberd-2.1.11/src/msgs/eo.msg 0000664 0000000 0000000 00000063213 12240230175 013076 0 ustar {"Access Configuration","Agordo de atingo"}.
{"Access Control List Configuration","Agordo de atingokontrolo"}.
{"Access control lists","Atingokontrol-listoj"}.
{"Access Control Lists","Atingokontrol-listoj"}.
{"Access denied by service policy","Atingo rifuzita de serv-politiko"}.
{"Access rules","Atingo-reguloj"}.
{"Access Rules","Atingo-reguloj"}.
{"Action on user","Ago je uzanto"}.
{"Add Jabber ID","Aldonu Jabber ID"}.
{"Add New","Aldonu novan"}.
{"Add User","Aldonu Uzanton"}.
{"Administration","Administro"}.
{"Administration of ","Mastrumado de "}.
{"Administrator privileges required","Administrantaj rajtoj bezonata"}.
{"A friendly name for the node","Kromnomo por ĉi tiu nodo"}.
{"All activity","Ĉiu aktiveco"}.
{"Allow this Jabber ID to subscribe to this pubsub node?","Ĉu permesi ĉi tiun Jabber ID aboni al la jena PubAbo-nodo"}.
{"Allow users to change the subject","Permesu uzantojn ŝanĝi la temon"}.
{"Allow users to query other users","Permesu uzantojn informpeti aliajn uzantojn"}.
{"Allow users to send invites","Permesu uzantojn sendi invitojn"}.
{"Allow users to send private messages","Permesu uzantojn sendi privatajn mesaĝojn"}.
{"Allow visitors to change nickname","Permesu al vizitantoj ŝanĝi siajn kaŝnomojn"}.
{"Allow visitors to send private messages to","Permesu uzantojn sendi privatajn mesaĝojn al"}.
{"Allow visitors to send status text in presence updates","Permesu al vizitantoj sendi statmesaĝon en ĉeest-sciigoj"}.
{"Allow visitors to send voice requests","Permesu uzantojn sendi voĉ-petojn"}.
{"All Users","Ĉiuj Uzantoj"}.
{"Announcements","Anoncoj"}.
{"anyone","iu ajn"}.
{"A password is required to enter this room","Pasvorto estas bezonata por eniri ĉi tiun babilejon"}.
{"April","Aprilo"}.
{"August","Aŭgusto"}.
{"Backup","Faru Sekurkopion"}.
{"Backup Management","Mastrumado de sekurkopioj"}.
{"Backup of ","Sekurkopio de "}.
{"Backup to File at ","Faru sekurkopion je "}.
{"Bad format","Malĝusta formo"}.
{"Birthday","Naskiĝtago"}.
{"CAPTCHA web page","CAPTCHA teksaĵ-paĝo"}.
{"Change Password","Ŝanĝu pasvorton"}.
{"Change User Password","Ŝanĝu pasvorton de uzanto"}.
{"Characters not allowed:","Karaktroj ne permesata:"}.
{"Chatroom configuration modified","Agordo de babilejo ŝanĝita"}.
{"Chatroom is created","Babilejo kreita"}.
{"Chatroom is destroyed","Babilejo neniigita"}.
{"Chatroom is started","Babilejo lanĉita"}.
{"Chatroom is stopped","Babilejo haltita"}.
{"Chatrooms","Babilejoj"}.
{"Choose a username and password to register with this server","Elektu uzantnomon kaj pasvorton por registri je ĉi tiu servilo"}.
{"Choose modules to stop","Elektu modulojn por fini"}.
{"Choose storage type of tables","Elektu konserv-tipon de tabeloj"}.
{"Choose whether to approve this entity's subscription.","Elektu ĉu permesi la abonon de ĉi tiu ento"}.
{"City","Urbo"}.
{"Commands","Ordonoj"}.
{"Conference room does not exist","Babilejo ne ekzistas"}.
{"Configuration","Agordo"}.
{"Configuration of room ~s","Agordo de babilejo ~s"}.
{"Connected Resources:","Konektataj risurcoj:"}.
{"Connections parameters","Konekto-parametroj"}.
{"Country","Lando"}.
{"CPU Time:","CPU-tempo"}.
{"Database","Datumbazo"}.
{"Database Tables at ","Datumbaz-tabeloj je "}.
{"Database Tables Configuration at ","Agordo de datumbaz-tabeloj je "}.
{"December","Decembro"}.
{"Default users as participants","Kutime farigu uzantojn kiel partpoprenantoj"}.
{"Delete","Forigu"}.
{"Delete message of the day","Forigu mesaĝo de la tago"}.
{"Delete message of the day on all hosts","Forigu mesaĝo de la tago je ĉiu gastigo"}.
{"Delete Selected","Forigu elektata(j)n"}.
{"Delete User","Forigu Uzanton"}.
{"Deliver event notifications","Liveru event-sciigojn"}.
{"Deliver payloads with event notifications","Liveru aĵojn de event-sciigoj"}.
{"Description:","Priskribo:"}.
{"Disc only copy","Nur disk-kopio"}.
{"Displayed Groups:","Montrataj grupoj:"}.
{"Don't tell your password to anybody, not even the administrators of the Jabber server.","Ne donu vian pasvorton al iun ajn, eĉ ne al la administrantoj de la Ĵabber-servilo."}.
{"Dump Backup to Text File at ","Skribu sekurkopion en plata teksto al "}.
{"Dump to Text File","Skribu en plata tekst-dosiero"}.
{"Edit Properties","Redaktu atributojn"}.
{"Either approve or decline the voice request.","Ĉu aprobu, aŭ malaprobu la voĉ-peton."}.
{"ejabberd IRC module","ejabberd IRC-modulo"}.
{"ejabberd MUC module","ejabberd MUC-modulo"}.
{"ejabberd Publish-Subscribe module","ejabberd Public-Abonada modulo"}.
{"ejabberd SOCKS5 Bytestreams module","ejabberd SOCKS5 Bajtfluo modulo"}.
{"ejabberd vCard module","ejabberd vCard-modulo"}.
{"ejabberd Web Admin","ejabberd Teksaĵa Administro"}.
{"Elements","Eroj"}.
{"Email","Retpoŝto"}.
{"Enable logging","Ŝaltu protokoladon"}.
{"Encoding for server ~b","Enkodigo por servilo ~b"}.
{"End User Session","Haltigu Uzant-seancon"}.
{"Enter list of {Module, [Options]}","Enmetu liston de {Modulo, [Elektebloj]}"}.
{"Enter nickname you want to register","Enmetu kaŝnomon kiun vi volas registri"}.
{"Enter path to backup file","Enmetu vojon por sekurkopio"}.
{"Enter path to jabberd14 spool dir","Enmetu vojon al jabberd14-uzantdosierujo"}.
{"Enter path to jabberd14 spool file","Enmetu vojon al jabberd14-uzantdosiero"}.
{"Enter path to text file","Enmetu vojon al plata teksto"}.
{"Enter the text you see","Enmetu montrita teksto"}.
{"Enter username, encodings, ports and passwords you wish to use for connecting to IRC servers","Enmetu uzantnomon,j enkodigojn, pordojn kaj pasvortojn kiujn vi volas uzi por konektoj al IRC-serviloj"}.
{"Erlang Jabber Server","Erlang-a Jabber-Servilo"}.
{"Error","Eraro"}.
{"Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef.net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}].","Ekzemplo: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"sekreto\"}, {\"vendetta.fef.net\", \"iso8859-1\", 7000}, {\"irc.iutestservilo.net\", \"utf-8\"}]."}.
{"Exclude Jabber IDs from CAPTCHA challenge","Esceptu Ĵabber-identigilojn je CAPTCHA-defio"}.
{"Export data of all users in the server to PIEFXIS files (XEP-0227):","Eksportu datumojn de ĉiuj uzantoj en servilo al PIEFXIS dosieroj (XEP-0227):"}.
{"Export data of users in a host to PIEFXIS files (XEP-0227):","Eksportu datumoj de uzantoj en gastigo al PIEFXIS dosieroj (XEP-0227):"}.
{"Failed to extract JID from your voice request approval","Malsukcesis ekstrakti JID-on de via voĉ-pet-aprobo"}.
{"Family Name","Lasta Nomo"}.
{"February","Februaro"}.
{"Fill in fields to search for any matching Jabber User","Kompletigu la formon por serĉi rekonata Jabber-uzanto"}.
{"Fill in the form to search for any matching Jabber User (Add * to the end of field to match substring)","Kompletigu la formon por serĉi rekonata Jabber-uzanto (Aldonu * je la fino de la kampo por rekoni subĉenon"}.
{"Friday","Vendredo"}.
{"From","De"}.
{"From ~s","De ~s"}.
{"Full Name","Plena Nomo"}.
{"Get Number of Online Users","Montru nombron de konektataj uzantoj"}.
{"Get Number of Registered Users","Montru nombron de registritaj uzantoj"}.
{"Get User Last Login Time","Montru tempon de lasta ensaluto"}.
{"Get User Password","Montru pasvorton de uzanto"}.
{"Get User Statistics","Montru statistikojn de uzanto"}.
{"Grant voice to this person?","Koncedu voĉon al ĉi-persono?"}.
{"Group ","Grupo "}.
{"Groups","Grupoj"}.
{"has been banned","estas forbarita"}.
{"has been kicked because of an affiliation change","estas forpelita pro aparteneca ŝanĝo"}.
{"has been kicked because of a system shutdown","estas forpelita pro sistem-haltigo"}.
{"has been kicked because the room has been changed to members-only","estas forpelita ĉar la babilejo fariĝis sole por membroj"}.
{"has been kicked","estas forpelita"}.
{" has set the subject to: "," ŝanĝis la temon al: "}.
{"Host","Gastigo"}.
{"If you don't see the CAPTCHA image here, visit the web page.","Se vi ne vidas la CAPTCHA-imagon jene, vizitu la teksaĵ-paĝon."}.
{"If you want to specify different ports, passwords, encodings for IRC servers, fill this list with values in format '{\"irc server\", \"encoding\", port, \"password\"}'. By default this service use \"~s\" encoding, port ~p, empty password.","Se vi volas specifi diversajn pordojn, pasvortojn, enkodigojn por IRC-serviloj, kompletigu la jenan liston kun la formo '{\"irc-servilo\", \"enkodigo\", porto, \"pasvorto\"}'. Se ne specifita, ĉi tiu servilo uzas la enkodigo \"~s\", porto ~p, malplena pasvorto."}.
{"Import Directory","Importu dosierujo"}.
{"Import File","Importu dosieron"}.
{"Import user data from jabberd14 spool file:","Importu uzantojn de jabberd14-uzantdosieroj"}.
{"Import User from File at ","Importu uzanton de dosiero el "}.
{"Import users data from a PIEFXIS file (XEP-0227):","Importu uzanto-datumojn de PIEFXIS dosiero (XEP-0227):"}.
{"Import users data from jabberd14 spool directory:","Importu uzantojn de jabberd14-uzantdosieroj"}.
{"Import Users from Dir at ","Importu uzantojn de dosierujo ĉe "}.
{"Import Users From jabberd14 Spool Files","Importu uzantojn de jabberd14-uzantdosieroj"}.
{"Improper message type","Malĝusta mesaĝo-tipo"}.
{"Incorrect password","Nekorekta pasvorto"}.
{"Invalid affiliation: ~s","Nevalida aparteneco: ~s"}.
{"Invalid role: ~s","Nevalida rolo: ~s"}.
{"IP addresses","IP-adresoj"}.
{"IP","IP"}.
{"IRC channel (don't put the first #)","IRC-babilejo (ne aldonu #-prefikson)"}.
{"IRC server","IRC-servilo"}.
{"IRC settings","IRC agordoj"}.
{"IRC Transport","IRC-transportilo"}.
{"IRC Username","IRC-kaŝnomo"}.
{"IRC username","IRC-uzantnomo"}.
{"is now known as","nun nomiĝas"}.
{"It is not allowed to send private messages","Ne estas permesata sendi privatajn mesaĝojn"}.
{"It is not allowed to send private messages of type \"groupchat\"","Malpermesas sendi mesaĝojn de tipo \"groupchat\""}.
{"It is not allowed to send private messages to the conference","Nur partoprenantoj rajtas sendi privatajn mesaĝojn al la babilejo"}.
{"Jabber Account Registration","Ĵabber-konto registrado"}.
{"Jabber ID","Jabber ID"}.
{"Jabber ID ~s is invalid","Jabber ID ~s estas nevalida"}.
{"January","Januaro"}.
{"Join IRC channel","Eniras IRC-babilejon"}.
{"joins the room","eniras la babilejo"}.
{"Join the IRC channel here.","Eniru IRC-babilejon jen"}.
{"Join the IRC channel in this Jabber ID: ~s","Eniru IRC-babilejon en ĉi Jabber-ID: ~s"}.
{"July","Julio"}.
{"June","Junio"}.
{"Last Activity","Lasta aktiveco"}.
{"Last login","Lasta ensaluto"}.
{"Last month","Lasta monato"}.
{"Last year","Lasta jaro"}.
{"leaves the room","eliras la babilejo"}.
{"Listened Ports at ","Atentataj pordoj je "}.
{"Listened Ports","Atentataj pordoj"}.
{"List of modules to start","Listo de moduloj por starti"}.
{"Low level update script","Bazanivela ĝisdatigo-skripto"}.
{"Make participants list public","Farigu partoprento-liston publika"}.
{"Make room CAPTCHA protected","Farigu babilejon protektata per CAPTCHA"}.
{"Make room members-only","Farigu babilejon sole por membroj"}.
{"Make room moderated","Farigu babilejon moderigata"}.
{"Make room password protected","Farigu babilejon protektata per pasvorto"}.
{"Make room persistent","Farigu babilejon daŭra"}.
{"Make room public searchable","Farigu babilejon publike trovebla"}.
{"March","Marĉo"}.
{"Maximum Number of Occupants","Limigo de nombro de partoprenantoj"}.
{"Max # of items to persist","Maksimuma kiomo de eroj en konservado"}.
{"Max payload size in bytes","Maksimuma aĵo-grando je bajtoj"}.
{"May","Majo"}.
{"Membership is required to enter this room","Membreco estas bezonata por eniri ĉi tiun babilejon"}.
{"Members:","Membroj:"}.
{"Memorize your password, or write it in a paper placed in a safe place. In Jabber there isn't an automated way to recover your password if you forget it.","Memoru vian pasvorton, aŭ skribu ĝin sur papero formetata je sekura loko. Je Ĵabber ne ekzistas aŭtomata metodo por reakiri vian pasvorton se vi forgesas ĝin."}.
{"Memory","Memoro"}.
{"Message body","Teksto de mesaĝo"}.
{"Middle Name","Meza Nomo"}.
{"Minimum interval between voice requests (in seconds)","Minimuma intervalo inter voĉ-petoj (je sekundoj)"}.
{"Moderator privileges required","Moderantaj rajtoj bezonata"}.
{"moderators only","moderantoj sole"}.
{"Modified modules","Ĝisdatigitaj moduloj"}.
{"Module","Modulo"}.
{"Modules at ","Moduloj je "}.
{"Modules","Moduloj"}.
{"Monday","Lundo"}.
{"Name:","Nomo:"}.
{"Name","Nomo"}.
{"Never","Neniam"}.
{"New Password:","Nova Pasvorto:"}.
{"Nickname","Kaŝnomo"}.
{"Nickname Registration at ","Kaŝnomo-registrado je "}.
{"Nickname ~s does not exist in the room","Kaŝnomo ~s ne ekzistas en la babilejo"}.
{"nobody","neniu"}.
{"No body provided for announce message","Neniu teksto donita por anonc-mesaĝo"}.
{"No Data","Neniu datumo"}.
{"Node ID","Nodo ID"}.
{"Node ","Nodo "}.
{"Node not found","Nodo ne trovita"}.
{"Nodes","Nodoj"}.
{"No limit","Neniu limigo"}.
{"None","Nenio"}.
{"No resource provided","Neniu risurco donita"}.
{"Not Found","Ne trovita"}.
{"Notify subscribers when items are removed from the node","Sciigu abonantoj kiam eroj estas forigita de la nodo"}.
{"Notify subscribers when the node configuration changes","Sciigu abonantoj kiam la agordo de la nodo ŝanĝas"}.
{"Notify subscribers when the node is deleted","Sciigu abonantoj kiam la nodo estas forigita"}.
{"November","Novembro"}.
{"Number of occupants","Nombro de ĉeestantoj"}.
{"Number of online users","Nombro de konektataj uzantoj"}.
{"Number of registered users","Nombro de registritaj uzantoj"}.
{"October","Oktobro"}.
{"Offline Messages:","Liverontaj mesaĝoj"}.
{"Offline Messages","Liverontaj mesaĝoj"}.
{"OK","Bone"}.
{"Old Password:","Malnova Pasvorto:"}.
{"Online","Konektata"}.
{"Online Users:","Konektataj uzantoj:"}.
{"Online Users","Konektataj Uzantoj"}.
{"Only deliver notifications to available users","Nur liveru sciigojn al konektataj uzantoj"}.
{"Only moderators and participants are allowed to change the subject in this room","Nur moderigantoj kaj partoprenantoj rajtas ŝanĝi la temon en ĉi tiu babilejo"}.
{"Only moderators are allowed to change the subject in this room","Nur moderigantoj rajtas ŝanĝi la temon en ĉi tiu babilejo"}.
{"Only moderators can approve voice requests","Nur moderigantoj povas aprobi voĉ-petojn"}.
{"Only occupants are allowed to send messages to the conference","Nur partoprenantoj rajtas sendi mesaĝojn al la babilejo"}.
{"Only occupants are allowed to send queries to the conference","Nur partoprenantoj rajtas sendi informmendojn al la babilejoj"}.
{"Only service administrators are allowed to send service messages","Nur servo-administrantoj rajtas sendi serv-mesaĝojn"}.
{"Options","Elektebloj"}.
{"Organization Name","Organiz-nomo"}.
{"Organization Unit","Organiz-parto"}.
{"Outgoing s2s Connections:","Elirantaj s-al-s-konektoj:"}.
{"Outgoing s2s Connections","Elirantaj s-al-s-konektoj"}.
{"Outgoing s2s Servers:","Elirantaj s-al-s-serviloj"}.
{"Owner privileges required","Mastraj rajtoj bezonata"}.
{"Packet","Pakaĵo"}.
{"Password ~b","Pasvorto ~b"}.
{"Password:","Pasvorto:"}.
{"Password","Pasvorto"}.
{"Password Verification:","Pasvortkontrolo:"}.
{"Password Verification","Pasvortkontrolo"}.
{"Path to Dir","Vojo al dosierujo"}.
{"Path to File","Voje de dosiero"}.
{"Pending","Atendanta"}.
{"Period: ","Periodo: "}.
{"Persist items to storage","Savu erojn en konservado"}.
{"Ping","Sondaĵo"}.
{"Please note that these options will only backup the builtin Mnesia database. If you are using the ODBC module, you also need to backup your SQL database separately.","Rimarku ke ĉi tiuj elektebloj nur sekurkopias la propran Mnesia-datumbazon. Se vi uzas la ODBC-modulon, vi ankaŭ devas sekurkopii tiujn SQL-datumbazoj aparte."}.
{"Please, wait for a while before sending new voice request","Bonvolu atendi iomete antaŭ ol sendi plian voĉ-peton"}.
{"Pong","Resondaĵo"}.
{"Port ~b","Pordo ~b"}.
{"Port","Pordo"}.
{"Present real Jabber IDs to","Montru verajn Jabber ID-ojn al"}.
{"private, ","privata, "}.
{"Protocol","Protokolo"}.
{"Publish-Subscribe","Public-Abonado"}.
{"PubSub subscriber request","PubAbo abonpeto"}.
{"Purge all items when the relevant publisher goes offline","Forigu ĉiujn erojn kiam la rilata publikanto malkonektiĝas"}.
{"Queries to the conference members are not allowed in this room","Malpermesas informmendoj al partoprenantoj en ĉi tiu babilejo"}.
{"RAM and disc copy","RAM- kaj disk-kopio"}.
{"RAM copy","RAM-kopio"}.
{"Raw","Kruda"}.
{"Really delete message of the day?","Ĉu vere forigi mesaĝon de la tago?"}.
{"Recipient is not in the conference room","Ricevanto ne ĉeestas en la babilejo "}.
{"Register a Jabber account","Registru Ĵabber-konton"}.
{"Registered Users:","Registritaj uzantoj:"}.
{"Registered Users","Registritaj uzantoj"}.
{"Register","Registru"}.
{"Registration in mod_irc for ","Registraĵo en mod_irc de "}.
{"Remote copy","Fora kopio"}.
{"Remove All Offline Messages","Forigu ĉiujn liverontajn mesaĝojn"}.
{"Remove","Forigu"}.
{"Remove User","Forigu uzanton"}.
{"Replaced by new connection","Anstataŭigita je nova konekto"}.
{"Resources","Risurcoj"}.
{"Restart","Restartu"}.
{"Restart Service","Restartu Servon"}.
{"Restore Backup from File at ","Restaŭrigu de dosiero el "}.
{"Restore binary backup after next ejabberd restart (requires less memory):","Restaŭrigu duuman sekurkopion post sekvonta ejabberd-restarto"}.
{"Restore binary backup immediately:","Restaŭrigu duuman sekurkopion tuj:"}.
{"Restore plain text backup immediately:","Restaŭrigu sekurkopion el plata tekstdosiero tuj"}.
{"Restore","Restaŭru"}.
{"Room Configuration","Babilejo-agordo"}.
{"Room creation is denied by service policy","Ĉi tiu serv-politiko ne permesas babilejo-kreadon"}.
{"Room description","Babilejo-priskribo"}.
{"Room Occupants","Nombro de ĉeestantoj"}.
{"Room title","Babilejo-nomo"}.
{"Roster groups allowed to subscribe","Kontaktlist-grupoj kiuj rajtas aboni"}.
{"Roster","Kontaktlisto"}.
{"Roster of ","Kontaktlisto de "}.
{"Roster size","Kontaktlist-grando"}.
{"RPC Call Error","Eraro de RPC-alvoko"}.
{"Running Nodes","Funkciantaj Nodoj"}.
{"~s access rule configuration","Agordo de atingo-reguloj de ~s"}.
{"Saturday","Sabato"}.
{"Script check","Skript-kontrolo"}.
{"Search Results for ","Serĉ-rezultoj de "}.
{"Search users in ","Serĉu uzantojn en "}.
{"Send announcement to all online users on all hosts","Sendu anoncon al ĉiu konektata uzanto de ĉiu gastigo"}.
{"Send announcement to all online users","Sendu anoncon al ĉiu konektata uzanto"}.
{"Send announcement to all users on all hosts","Sendu anoncon al ĉiu uzanto de ĉiu gastigo"}.
{"Send announcement to all users","Sendu anoncon al ĉiu uzanto"}.
{"September","Septembro"}.
{"Server ~b","Servilo ~b"}.
{"Server:","Servilo:"}.
{"Set message of the day and send to online users","Enmetu mesaĝon de la tago kaj sendu al konektataj uzantoj"}.
{"Set message of the day on all hosts and send to online users","Enmetu mesaĝon de la tago je ĉiu gastigo kaj sendu al konektataj uzantoj"}.
{"Shared Roster Groups","Komuna Kontaktlist-grupo"}.
{"Show Integral Table","Montru integran tabelon"}.
{"Show Ordinary Table","Montru ordinaran tabelon"}.
{"Shut Down Service","Haltigu Servon"}.
{"~s invites you to the room ~s","~s invitas vin al la babilejo ~s"}.
{"Some Jabber clients can store your password in your computer. Use that feature only if you trust your computer is safe.","Kelkaj Ĵabber-klientoj povas memori vian pasvorton je via komputilo. Nur uzu tiun eblon se vi fidas ke via komputilo estas sekura."}.
{"Specify the access model","Specifu atingo-modelon"}.
{"Specify the event message type","Specifu tipo de event-mesaĝo"}.
{"Specify the publisher model","Enmetu publikadan modelon"}.
{"~s's Offline Messages Queue","Mesaĝo-atendovico de ~s"}.
{"Start Modules at ","Startu modulojn je "}.
{"Start Modules","Startu Modulojn"}.
{"Start","Startu"}.
{"Statistics of ~p","Statistikoj de ~p"}.
{"Statistics","Statistikoj"}.
{"Stop","Haltigu"}.
{"Stop Modules at ","Haltigu modulojn je "}.
{"Stop Modules","Haltigu Modulojn"}.
{"Stopped Nodes","Neaktivaj Nodoj"}.
{"Storage Type","Konserv-tipo"}.
{"Store binary backup:","Konservu duuman sekurkopion:"}.
{"Store plain text backup:","Skribu sekurkopion en plata tekstdosiero"}.
{"Subject","Temo"}.
{"Submit","Sendu"}.
{"Submitted","Sendita"}.
{"Subscriber Address","Abonanta adreso"}.
{"Subscription","Abono"}.
{"Sunday","Dimanĉo"}.
{"That nickname is already in use by another occupant","Tiu kaŝnomo jam estas uzata de alia partoprenanto"}.
{"That nickname is registered by another person","Kaŝnomo estas registrita de alia persono"}.
{"The CAPTCHA is valid.","La CAPTCHA ĝustas"}.
{"The CAPTCHA verification has failed","La CAPTCHA-kontrolado malsukcesis"}.
{"The collections with which a node is affiliated","Aro kun kiu nodo estas filigita"}.
{"the password is","la pasvorto estas"}.
{"The password is too weak","La pasvorto estas ne sufiĉe forta"}.
{"The password of your Jabber account was successfully changed.","La pasvorto de via Ĵabber-konto estas sukcese ŝanĝata."}.
{"There was an error changing the password: ","Estis eraro dum ŝanĝi de la pasvortro:"}.
{"There was an error creating the account: ","Estis eraro dum kreado de la konto:"}.
{"There was an error deleting the account: ","Estis eraro dum forigado de la konto:"}.
{"This is case insensitive: macbeth is the same that MacBeth and Macbeth.","Uskleco ne signifas: macbeth estas la sama ol MacBeth kaj Macbeth."}.
{"This page allows to create a Jabber account in this Jabber server. Your JID (Jabber IDentifier) will be of the form: username@server. Please read carefully the instructions to fill correctly the fields.","Jena paĝo ebligas kreadon de Ĵabber-konto je ĉi-Ĵabber-servilo. Via JID (Ĵabber-IDentigilo) estos ĉi-tiel: uzantnomo@servilo. Bonvolu legu bone la instrukciojn por korekta enmetigo de la kampoj. "}.
{"This page allows to unregister a Jabber account in this Jabber server.","Jena pagxo ebligas malregistri Jxabber-konton je ĉi-servilo."}.
{"This participant is kicked from the room because he sent an error message","Ĉi tiu partoprenanta estas forpelata de la babilejo pro sendado de erar-mesaĝo"}.
{"This participant is kicked from the room because he sent an error message to another participant","Ĉi tiu partoprenanto estas forpelata de la babilejo pro sendo de erar-mesaĝo al alia partoprenanto"}.
{"This participant is kicked from the room because he sent an error presence","Ĉi tiu partoprenanto estas forpelata de la babilejo pro sendo de erar-ĉeesto"}.
{"This room is not anonymous","Ĉi tiu babilejo ne estas anonima"}.
{"Thursday","Ĵaŭdo"}.
{"Time delay","Prokrasto"}.
{"Time","Tempo"}.
{"To","Ĝis"}.
{"Too many CAPTCHA requests","Tro multaj CAPTCHA-petoj"}.
{"To ~s","Al ~s"}.
{"Traffic rate limit is exceeded","Trafikrapida limigo superita"}.
{"Transactions Aborted:","Transakcioj nuligitaj"}.
{"Transactions Committed:","Transakcioj enmetitaj"}.
{"Transactions Logged:","Transakcioj protokolitaj"}.
{"Transactions Restarted:","Transakcioj restartitaj"}.
{"Tuesday","Mardo"}.
{"Unable to generate a CAPTCHA","Ne eblis krei CAPTCHA"}.
{"Unauthorized","Nepermesita"}.
{"Unregister a Jabber account","Malregistru Ĵabber-konton"}.
{"Unregister","Malregistru"}.
{"Update ","Ĝisdatigu "}.
{"Update","Ĝisdatigu"}.
{"Update message of the day (don't send)","Ŝanĝu mesaĝon de la tago (ne sendu)"}.
{"Update message of the day on all hosts (don't send)","Ŝanĝu mesaĝon de la tago je ĉiu gastigo (ne sendu)"}.
{"Update plan","Ĝisdatigo-plano"}.
{"Update script","Ĝisdatigo-skripto"}.
{"Uptime:","Daŭro de funkciado"}.
{"Use of STARTTLS required","Uzo de STARTTLS bezonata"}.
{"User JID","Uzant-JID"}.
{"User Management","Uzanto-administrado"}.
{"Username:","Uzantnomo"}.
{"Users are not allowed to register accounts so quickly","Ne estas permesata al uzantoj registri tiel rapide"}.
{"Users Last Activity","Lasta aktiveco de uzanto"}.
{"Users","Uzantoj"}.
{"User ","Uzanto "}.
{"User","Uzanto"}.
{"Validate","Validigu"}.
{"vCard User Search","Serĉado de vizitkartoj"}.
{"Virtual Hosts","Virtual-gastigoj"}.
{"Visitors are not allowed to change their nicknames in this room","Ne estas permesata al vizitantoj ŝanĝi siajn kaŝnomojn en ĉi tiu ĉambro"}.
{"Visitors are not allowed to send messages to all occupants","Vizitantoj ne rajtas sendi mesaĝojn al ĉiuj partoprenantoj"}.
{"Voice requests are disabled in this conference","Voĉ-petoj estas malebligita en jena babilejo"}.
{"Voice request","Voĉ-peto"}.
{"Wednesday","Merkredo"}.
{"When to send the last published item","Kiam sendi la laste publicitan eron"}.
{"Whether to allow subscriptions","Ĉu permesi aboni"}.
{"You can later change your password using a Jabber client.","Poste vi povas ŝanĝi vian pasvorton per Ĵabber-kliento."}.
{"You have been banned from this room","Vi estas malpermesata en ĉi tiu babilejo"}.
{"You must fill in field \"Nickname\" in the form","Vi devas kompletigi la \"Kaŝnomo\" kampon"}.
{"You need a client that supports x:data and CAPTCHA to register","Vi bezonas klienton subtenante x:data-funkcio kaj CAPTCHA por registri kaŝnomon"}.
{"You need a client that supports x:data to register the nickname","Vi bezonas klienton subtenante x:data-funkcio por registri kaŝnomon"}.
{"You need an x:data capable client to configure mod_irc settings","Vi bezonas klienton kun x:data-funkcio por agordi mod_irc"}.
{"You need an x:data capable client to configure room","Vi bezonas klienton kun x:data-funkcio por agordi la babilejon"}.
{"You need an x:data capable client to search","Vi bezonas klienton kun x:data-funkcio por serĉado"}.
{"Your active privacy list has denied the routing of this stanza.","Via aktiva privatec-listo malpermesas enkursigi ĉi-tiun pakaĵon"}.
{"Your contact offline message queue is full. The message has been discarded.","Mesaĝo-atendovico de la senkonekta kontakto estas plena. La mesaĝo estas forĵetita"}.
{"Your Jabber account was successfully created.","Via Ĵabber-konto estis sukcese kreata."}.
{"Your Jabber account was successfully deleted.","Via Ĵabber-konto estas sukcese forigita."}.
{"Your messages to ~s are being blocked. To unblock them, visit ~s","Viaj mesaĝoj al ~s estas blokata. Por malbloki ilin, iru al ~s"}.
ejabberd-2.1.11/src/msgs/zh.msg 0000664 0000000 0000000 00000060466 12240230175 013123 0 ustar {"Access Configuration","访问配置"}.
{"Access Control List Configuration","访问控制列表(ACL)配置"}.
{"Access control lists","访问控制列表(ACL)"}.
{"Access Control Lists","访问控制列表(ACL)"}.
{"Access denied by service policy","访问被服务策略拒绝"}.
{"Access rules","访问规则"}.
{"Access Rules","访问规则"}.
{"Action on user","对用户的动作"}.
{"Add Jabber ID","添加 Jabber ID"}.
{"Add New","添加新用户"}.
{"Add User","添加用户"}.
{"Administration of ","管理"}.
{"Administration","管理"}.
{"Administrator privileges required","需要管理员权限"}.
{"A friendly name for the node","该节点的友好名称"}.
{"All activity","所有活动"}.
{"Allow this Jabber ID to subscribe to this pubsub node?","允许该 Jabber ID 订阅该 pubsub 节点?"}.
{"Allow users to change the subject","允许用户更改主题"}.
{"Allow users to query other users","允许用户查询其它用户"}.
{"Allow users to send invites","允许用户发送邀请"}.
{"Allow users to send private messages","允许用户发送私聊消息"}.
{"Allow visitors to change nickname","允许用户更改昵称"}.
{"Allow visitors to send private messages to","允许访客发送私聊消息至"}.
{"Allow visitors to send status text in presence updates","更新在线状态时允许用户发送状态文本"}.
{"Allow visitors to send voice requests","允许访客发送声音请求"}.
{"All Users","所有用户"}.
{"Announcements","通知"}.
{"anyone","任何人"}.
{"A password is required to enter this room","进入此房间需要密码"}.
{"April","四月"}.
{"August","八月"}.
{"Backup Management","备份管理"}.
{"Backup of ","备份来源 "}.
{"Backup to File at ","备份文件位于"}.
{"Backup","备份"}.
{"Bad format","格式错误"}.
{"Birthday","出生日期"}.
{"CAPTCHA web page","验证码网页"}.
{"Change Password","更改密码"}.
{"Change User Password","更改用户密码"}.
{"Characters not allowed:","禁用字符:"}.
{"Chatroom configuration modified","聊天室配置已修改"}.
{"Chatroom is created","聊天室已被创建"}.
{"Chatroom is destroyed","聊天室已被销毁"}.
{"Chatroom is started","聊天室已被启动"}.
{"Chatroom is stopped","聊天室已被停用"}.
{"Chatrooms","聊天室"}.
{"Choose a username and password to register with this server","请选择在此服务器上注册所需的用户名和密码"}.
{"Choose modules to stop","请选择要停止的模块"}.
{"Choose storage type of tables","请选择表格的存储类型"}.
{"Choose whether to approve this entity's subscription.","选择是否允许该实体的订阅"}.
{"City","城市"}.
{"Commands","命令"}.
{"Conference room does not exist","会议室不存在"}.
{"Configuration of room ~s","房间 ~s 的配置 "}.
{"Configuration","配置"}.
{"Connected Resources:","已连接资源:"}.
{"Connections parameters","连接参数"}.
{"Country","国家"}.
{"CPU Time:","CPU 时间:"}.
{"Database Tables at ","数据库列表位于 "}.
{"Database Tables Configuration at ","数据库表格配置位于"}.
{"Database","数据库"}.
{"December","十二月"}.
{"Default users as participants","用户默认被视为参与人"}.
{"Delete message of the day on all hosts","删除所有主机上的每日消息"}.
{"Delete message of the day","删除每日消息"}.
{"Delete Selected","删除已选内容"}.
{"Delete User","删除用户"}.
{"Delete","删除"}.
{"Deliver event notifications","传递事件通知"}.
{"Deliver payloads with event notifications","用事件通告传输有效负载"}.
{"Description:","描述:"}.
{"Disc only copy","仅磁盘复制"}.
{"Displayed Groups:","已显示的组:"}.
{"Don't tell your password to anybody, not even the administrators of the Jabber server.","不要将密码告诉任何人, 就算是 Jabber 服务器的管理员也不可以."}.
{"Dump Backup to Text File at ","转储备份到文本文件于"}.
{"Dump to Text File","转储到文本文件"}.
{"Edit Properties","编辑属性"}.
{"Either approve or decline the voice request.","接受或拒绝声音请求"}.
{"ejabberd IRC module","ejabberd IRC 模块"}.
{"ejabberd MUC module","ejabberd MUC 模块"}.
{"ejabberd Publish-Subscribe module","ejabberd 发行-订阅模块"}.
{"ejabberd SOCKS5 Bytestreams module","ejabberd SOCKS5 字节流模块"}.
{"ejabberd vCard module","ejabberd vCard 模块"}.
{"ejabberd Web Admin","ejabberd 网页管理"}.
{"Elements","元素"}.
{"Email","电子邮件"}.
{"Enable logging","启用服务器端聊天记录"}.
{"Encoding for server ~b","服务器 ~b 的编码"}.
{"End User Session","结束用户会话"}.
{"Enter list of {Module, [Options]}","请输入{模块, [选项]}列表"}.
{"Enter nickname you want to register","请输入您想要注册的昵称"}.
{"Enter path to backup file","请输入备份文件的路径"}.
{"Enter path to jabberd14 spool dir","请输入 jabberd14 spool 目录的路径"}.
{"Enter path to jabberd14 spool file","请输入 jabberd14 spool 文件的路径"}.
{"Enter path to text file","请输入文本文件的路径"}.
{"Enter the text you see","请输入您所看到的文本"}.
{"Enter username and encodings you wish to use for connecting to IRC servers. Press 'Next' to get more fields to fill in. Press 'Complete' to save settings.","请输入您想使用的用来连接到 IRC 服务器的用户名和编码. 按 '下一步' 获取更多待填字段. 按 '完成' 保存设置."}.
{"Enter username, encodings, ports and passwords you wish to use for connecting to IRC servers","请输入您想使用的用来连接到IRC服务器的用户名, 编码, 端口和密码."}.
{"Erlang Jabber Server","Erlang Jabber 服务器"}.
{"Error","错误"}.
{"Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef.net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}].","例如: [{\"irc.lucky.net\", \"koi8-r\"}, 6667, \"secret\"}, {\"vendetta.fef.net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."}.
{"Exclude Jabber IDs from CAPTCHA challenge","从验证码挑战中排除 Jabber ID"}.
{"Export data of all users in the server to PIEFXIS files (XEP-0227):","将服务器上所有用户的数据导出到 PIEFXIS 文件 (XEP-0227):"}.
{"Export data of users in a host to PIEFXIS files (XEP-0227):","将某主机的用户数据导出到 PIEFXIS 文件 (XEP-0227):"}.
{"Failed to extract JID from your voice request approval","无法从你的声音请求确认信息中提取JID"}.
{"Family Name","姓氏"}.
{"February","二月"}.
{"Fill in fields to search for any matching Jabber User","填充字段以搜索任何匹配的 Jabber 用户"}.
{"Fill in the form to search for any matching Jabber User (Add * to the end of field to match substring)","填充表单以搜索任何匹配的 Jabber 用户(在字段末添加*来匹配子串)"}.
{"Friday","星期五"}.
{"From ~s","来自~s"}.
{"From","从"}.
{"Full Name","全名"}.
{"Get Number of Online Users","获取在线用户数"}.
{"Get Number of Registered Users","获取注册用户数"}.
{"Get User Last Login Time","获取用户上次登陆时间"}.
{"Get User Password","获取用户密码"}.
{"Get User Statistics","获取用户统计"}.
{"Grant voice to this person?","为此人授权声音?"}.
{"Groups","组"}.
{"Group ","组"}.
{"has been banned","已被禁止"}.
{"has been kicked because of an affiliation change","因联属关系改变而被踢出"}.
{"has been kicked because of a system shutdown","因系统关机而被踢出"}.
{"has been kicked because the room has been changed to members-only","因该房间改为只对会员开放而被踢出"}.
{"has been kicked","已被踢出"}.
{" has set the subject to: ","已将标题设置为: "}.
{"Host","主机"}.
{"If you don't see the CAPTCHA image here, visit the web page.","如果您在这里没有看到验证码图片, 请访问网页."}.
{"If you want to specify different ports, passwords, encodings for IRC servers, fill this list with values in format '{\"irc server\", \"encoding\", port, \"password\"}'. By default this service use \"~s\" encoding, port ~p, empty password.","如果您想为 IRC 服务器指定不同的端口, 密码, 编码, 请用 '{\"irc 服务器\", \"编码\", 端口, \"密码\"}' 格式的值填充此表单. 默认情况下此服务使用\"~s\"编码, ~p 端口, 密码为空."}.
{"Import Directory","导入目录"}.
{"Import File","导入文件"}.
{"Import user data from jabberd14 spool file:","从 jabberd14 Spool 文件导入用户数据:"}.
{"Import User from File at ","导入用户的文件位于 "}.
{"Import users data from a PIEFXIS file (XEP-0227):","从 PIEFXIS 文件 (XEP-0227) 导入用户数据:"}.
{"Import users data from jabberd14 spool directory:","从 jabberd14 Spool 目录导入用户数据:"}.
{"Import Users from Dir at ","导入用户的目录位于 "}.
{"Import Users From jabberd14 Spool Files","从 jabberd14 Spool 文件导入用户"}.
{"Improper message type","不恰当的消息类型"}.
{"Incorrect password","密码不正确"}.
{"Invalid affiliation: ~s","无效加入: ~s"}.
{"Invalid role: ~s","无效角色: ~s"}.
{"IP addresses","IP 地址"}.
{"IP","IP"}.
{"IRC channel (don't put the first #)","IRC 频道 (不要输入第一个#号)"}.
{"IRC server","IRC 服务器"}.
{"IRC settings","IRC 设置"}.
{"IRC Transport","IRC 传输"}.
{"IRC username","IRC 用户名"}.
{"IRC Username","IRC 用户名"}.
{"is now known as","现在称呼为"}.
{"It is not allowed to send private messages of type \"groupchat\"","\"群组聊天\"类型不允许发送私聊消息"}.
{"It is not allowed to send private messages to the conference","不允许向会议发送私聊消息"}.
{"It is not allowed to send private messages","不可以发送私聊消息"}.
{"Jabber Account Registration","Jabber 帐户注册"}.
{"Jabber ID","Jabber ID"}.
{"Jabber ID ~s is invalid","Jabber ID ~s 无效"}.
{"January","一月"}.
{"Join IRC channel","加入 IRC 频道"}.
{"joins the room","加入房间"}.
{"Join the IRC channel here.","在这里加入 IRC 频道."}.
{"Join the IRC channel in this Jabber ID: ~s","用此 Jabber ID: ~s 加入 IRC 频道"}.
{"July","七月"}.
{"June","六月"}.
{"Last Activity","上次活动"}.
{"Last login","上次登陆"}.
{"Last month","上个月"}.
{"Last year","上一年"}.
{"leaves the room","离开房间"}.
{"Listened Ports at ","监听的端口位于 "}.
{"Listened Ports","被监听的端口"}.
{"List of modules to start","要启动的模块列表"}.
{"Low level update script","低级别更新脚本"}.
{"Make participants list public","公开参与人列表"}.
{"Make room CAPTCHA protected","保护房间验证码"}.
{"Make room members-only","设置房间只接收会员"}.
{"Make room moderated","设置房间只接收主持人"}.
{"Make room password protected","进入此房间需要密码"}.
{"Make room persistent","永久保存该房间"}.
{"Make room public searchable","使房间可被公开搜索"}.
{"March","三月"}.
{"Maximum Number of Occupants","允许的与会人最大数"}.
{"Max # of items to persist","允许持久化的最大内容条目数"}.
{"Max payload size in bytes","最大有效负载字节数"}.
{"May","五月"}.
{"Membership is required to enter this room","进入此房间需要会员身份"}.
{"Members:","会员:"}.
{"Memorize your password, or write it in a paper placed in a safe place. In Jabber there isn't an automated way to recover your password if you forget it.","记住你的密码, 或将其记到纸上并放于安全位置. 如果你忘记了密码, Jabber 也没有自动恢复密码的方式."}.
{"Memory","内存"}.
{"Message body","消息主体"}.
{"Middle Name","中间名"}.
{"Minimum interval between voice requests (in seconds)","声音请求的最小间隔(以秒为单位)"}.
{"Moderator privileges required","需要主持人权限"}.
{"moderators only","仅主持人"}.
{"Modified modules","被修改模块"}.
{"Modules at ","模块位于 "}.
{"Modules","模块"}.
{"Module","模块"}.
{"Monday","星期一"}.
{"Name:","姓名:"}.
{"Name","姓名"}.
{"Never","从未"}.
{"New Password:","新密码: "}.
{"Nickname Registration at ","昵称注册于 "}.
{"Nickname ~s does not exist in the room","昵称 ~s 不在该房间"}.
{"Nickname","昵称"}.
{"No body provided for announce message","通知消息无正文内容"}.
{"nobody","没有人"}.
{"No Data","没有数据"}.
{"Node ID","节点 ID"}.
{"Node not found","没有找到节点"}.
{"Nodes","节点"}.
{"Node ","节点 "}.
{"No limit","不限"}.
{"None","无"}.
{"No resource provided","无资源提供"}.
{"Not Found","没有找到"}.
{"Notify subscribers when items are removed from the node","当从节点删除内容条目时通知订阅人"}.
{"Notify subscribers when the node configuration changes","当节点设置改变时通知订阅人"}.
{"Notify subscribers when the node is deleted","当节点被删除时通知订阅人"}.
{"November","十一月"}.
{"Number of occupants","驻留人数"}.
{"Number of online users","在线用户数"}.
{"Number of registered users","注册用户数"}.
{"October","十月"}.
{"Offline Messages:","离线消息:"}.
{"Offline Messages","离线消息"}.
{"OK","确定"}.
{"Old Password:","旧密码: "}.
{"Online Users:","在线用户:"}.
{"Online Users","在线用户"}.
{"Online","在线"}.
{"Only deliver notifications to available users","仅将通知发送给可发送的用户"}.
{"Only moderators and participants are allowed to change the subject in this room","只有主持人和参与人可以在此房间里更改主题"}.
{"Only moderators are allowed to change the subject in this room","只有主持人可以在此房间里更改主题"}.
{"Only moderators can approve voice requests","仅主持人能确认声音请求"}.
{"Only occupants are allowed to send messages to the conference","只有与会人可以向大会发送消息"}.
{"Only occupants are allowed to send queries to the conference","只有与会人可以向大会发出查询请求"}.
{"Only service administrators are allowed to send service messages","只有服务管理员可以发送服务消息"}.
{"Options","选项"}.
{"Organization Name","组织名称"}.
{"Organization Unit","组织单位"}.
{"Outgoing s2s Connections:","出站 s2s 连接:"}.
{"Outgoing s2s Connections","出站 s2s 连接"}.
{"Outgoing s2s Servers:","出站 s2s 服务器"}.
{"Owner privileges required","需要持有人权限"}.
{"Packet","数据包"}.
{"Password ~b","~b 的密码"}.
{"Password Verification:","密码确认:"}.
{"Password Verification","确认密码"}.
{"Password:","密码:"}.
{"Password","密码"}.
{"Path to Dir","目录的路径"}.
{"Path to File","文件路径"}.
{"Pending","挂起"}.
{"Period: ","持续时间: "}.
{"Persist items to storage","持久化内容条目"}.
{"Ping","Ping"}.
{"Please note that these options will only backup the builtin Mnesia database. If you are using the ODBC module, you also need to backup your SQL database separately.","注意:这些选项仅将备份内置的 Mnesia 数据库. 如果您正在使用 ODBC 模块, 您还需要分别备份您的数据库."}.
{"Please, wait for a while before sending new voice request","请稍后再发送新的声音请求"}.
{"Pong","Pong"}.
{"Port ~b","~b 的端口"}.
{"Port","端口"}.
{"Present real Jabber IDs to","将真实 Jabber ID 显示给"}.
{"private, ","保密, "}.
{"Protocol","协议"}.
{"Publish-Subscribe","发行-订阅"}.
{"PubSub subscriber request","PubSub 订阅人请求"}.
{"Purge all items when the relevant publisher goes offline","相关发布人离线后清除所有选项"}.
{"Queries to the conference members are not allowed in this room","本房间不可以查询会议成员信息"}.
{"RAM and disc copy","内存与磁盘复制"}.
{"RAM copy","内存(RAM)复制"}.
{"Raw","原始格式"}.
{"Really delete message of the day?","确实要删除每日消息吗?"}.
{"Recipient is not in the conference room","接收人不在会议室"}.
{"Register a Jabber account","注册 Jabber 帐户"}.
{"Registered Users:","注册用户:"}.
{"Registered Users","注册用户"}.
{"Register","注册"}.
{"Registration in mod_irc for ","mod_irc 中的注册是为 "}.
{"Remote copy","远程复制"}.
{"Remove All Offline Messages","移除所有离线消息"}.
{"Remove User","删除用户"}.
{"Remove","移除"}.
{"Replaced by new connection","被新的连接替换"}.
{"Resources","资源"}.
{"Restart Service","重启服务"}.
{"Restart","重启"}.
{"Restore Backup from File at ","要恢复的备份文件位于"}.
{"Restore binary backup after next ejabberd restart (requires less memory):","在下次 ejabberd 重启后恢复二进制备份(需要的内存更少):"}.
{"Restore binary backup immediately:","立即恢复二进制备份:"}.
{"Restore plain text backup immediately:","立即恢复普通文本备份:"}.
{"Restore","恢复"}.
{"Room Configuration","房间配置"}.
{"Room creation is denied by service policy","创建房间被服务策略拒绝"}.
{"Room description","房间描述"}.
{"Room Occupants","房间人数"}.
{"Room title","房间标题"}.
{"Roster groups allowed to subscribe","允许订阅的花名册组"}.
{"Roster of ","花名册属于 "}.
{"Roster size","花名册大小"}.
{"Roster","花名册"}.
{"RPC Call Error","RPC 调用错误"}.
{"Running Nodes","运行中的节点"}.
{"~s access rule configuration","~s 访问规则配置"}.
{"Saturday","星期六"}.
{"Script check","脚本检查"}.
{"Search Results for ","搜索结果属于关键词 "}.
{"Search users in ","搜索用户于 "}.
{"Send announcement to all online users on all hosts","发送通知给所有主机的在线用户"}.
{"Send announcement to all online users","发送通知给所有在线用户"}.
{"Send announcement to all users on all hosts","发送通知给所有主机上的所有用户"}.
{"Send announcement to all users","发送通知给所有用户"}.
{"September","九月"}.
{"Server ~b","服务器 ~b"}.
{"Server:","服务器:"}.
{"Set message of the day and send to online users","设定每日消息并发送给所有在线用户"}.
{"Set message of the day on all hosts and send to online users","设置所有主机上的每日消息并发送给在线用户"}.
{"Shared Roster Groups","共享的花名册组群"}.
{"Show Integral Table","显示完整列表"}.
{"Show Ordinary Table","显示普通列表"}.
{"Shut Down Service","关闭服务"}.
{"~s invites you to the room ~s","~s 邀请你到 ~s 房间"}.
{"Some Jabber clients can store your password in your computer. Use that feature only if you trust your computer is safe.","某些 Jabber 客户端可以在你的计算机里存储密码. 请仅在你确认你的计算机安全的情况下使用该功能."}.
{"Specify the access model","指定访问范例"}.
{"Specify the event message type","指定事件消息类型"}.
{"Specify the publisher model","指定发布人范例"}.
{"~s's Offline Messages Queue","~s 的离线消息队列"}.
{"Start Modules at ","要启动的模块位于 "}.
{"Start Modules","启动模块"}.
{"Start","开始"}.
{"Statistics of ~p","~p 的统计"}.
{"Statistics","统计"}.
{"Stop Modules at ","要停止的模块位于 "}.
{"Stop Modules","停止模块"}.
{"Stopped Nodes","已经停止的节点"}.
{"Stop","停止"}.
{"Storage Type","存储类型"}.
{"Store binary backup:","存储为二进制备份:"}.
{"Store plain text backup:","存储为普通文本备份:"}.
{"Subject","标题"}.
{"Submitted","已提交"}.
{"Submit","提交"}.
{"Subscriber Address","订阅人地址"}.
{"Subscription","订阅"}.
{"Sunday","星期天"}.
{"That nickname is already in use by another occupant","该昵称已被另一用户使用"}.
{"That nickname is registered by another person","该昵称已被另一个人注册了"}.
{"The CAPTCHA is valid.","验证码有效."}.
{"The CAPTCHA verification has failed","验证码检查失败"}.
{"The collections with which a node is affiliated","加入结点的集合"}.
{"The password is too weak","密码强度太弱"}.
{"the password is","密码是"}.
{"The password of your Jabber account was successfully changed.","你的 Jabber 帐户密码已成功更新."}.
{"There was an error changing the password: ","修改密码出错: "}.
{"There was an error creating the account: ","帐户创建出错: "}.
{"There was an error deleting the account: ","帐户删除失败: "}.
{"This is case insensitive: macbeth is the same that MacBeth and Macbeth.","此处不区分大小写: macbeth 与 MacBeth 和 Macbeth 是一样的."}.
{"This page allows to create a Jabber account in this Jabber server. Your JID (Jabber IDentifier) will be of the form: username@server. Please read carefully the instructions to fill correctly the fields.","本页面允许在此服务器上创建 Jabber 帐户. 你的 JID (Jabber ID) 的形式如下: 用户名@服务器. 请仔细阅读说明并正确填写相应字段."}.
{"This page allows to unregister a Jabber account in this Jabber server.","此页面允许在此 Jabber 服务器上注销 Jabber 帐户"}.
{"This participant is kicked from the room because he sent an error message to another participant","该参与人由于给其他人发送了出错消息而被踢出了聊天室"}.
{"This participant is kicked from the room because he sent an error message","该参与人由于发送了错误消息而被踢出了聊天室"}.
{"This participant is kicked from the room because he sent an error presence","该用户由于发送了错误状态而被踢出了聊天室"}.
{"This room is not anonymous","此房间不是匿名房间"}.
{"Thursday","星期四"}.
{"Time delay","时间延迟"}.
{"Time","时间"}.
{"Too many CAPTCHA requests","验证码请求太多"}.
{"To ~s","发送给~s"}.
{"To","到"}.
{"Traffic rate limit is exceeded","已经超过传输率限制"}.
{"Transactions Aborted:","取消的事务:"}.
{"Transactions Committed:","提交的事务:"}.
{"Transactions Logged:","记入日志的事务:"}.
{"Transactions Restarted:","重启的事务:"}.
{"Tuesday","星期二"}.
{"Unable to generate a CAPTCHA","无法生成验证码"}.
{"Unauthorized","未认证的"}.
{"Unregister a Jabber account","注销 Jabber 帐户"}.
{"Unregister","取消注册"}.
{"Update message of the day (don't send)","更新每日消息(不发送)"}.
{"Update message of the day on all hosts (don't send)","更新所有主机上的每日消息(不发送)"}.
{"Update plan","更新计划"}.
{"Update script","更新脚本"}.
{"Update ","更新 "}.
{"Update","更新"}.
{"Uptime:","正常运行时间:"}.
{"Use of STARTTLS required","要求使用 STARTTLS"}.
{"User JID","用户 JID"}.
{"User Management","用户管理"}.
{"Username:","用户名:"}.
{"Users are not allowed to register accounts so quickly","不允许用户太频繁地注册帐户"}.
{"Users Last Activity","用户上次活动"}.
{"Users","用户"}.
{"User ","用户 "}.
{"User","用户"}.
{"Validate","确认"}.
{"vCard User Search","vCard 用户搜索"}.
{"Virtual Hosts","虚拟主机"}.
{"Visitors are not allowed to change their nicknames in this room","此房间不允许用户更改昵称"}.
{"Visitors are not allowed to send messages to all occupants","不允许访客给所有占有者发送消息"}.
{"Voice requests are disabled in this conference","该会议的声音请求以被禁用"}.
{"Voice request","声音请求"}.
{"Wednesday","星期三"}.
{"When to send the last published item","何时发送最新发布的内容条目"}.
{"Whether to allow subscriptions","是否允许订阅"}.
{"You can later change your password using a Jabber client.","你可以稍后用 Jabber 客户端修改你的密码."}.
{"You have been banned from this room","您已被禁止进入该房间"}.
{"You must fill in field \"Nickname\" in the form","您必须填充表单中\"昵称\"项"}.
{"You need a client that supports x:data and CAPTCHA to register","您需要一个支持 x:data 和验证码的客户端进行注册"}.
{"You need a client that supports x:data to register the nickname","您需要一个支持 x:data 的客户端来注册昵称"}.
{"You need an x:data capable client to configure mod_irc settings","您需要一个兼容 x:data 的客户端来配置 mod_irc 设置"}.
{"You need an x:data capable client to configure room","您需要一个兼容 x:data 的客户端来配置房间"}.
{"You need an x:data capable client to search","您需要一个兼容 x:data 的客户端来搜索"}.
{"Your active privacy list has denied the routing of this stanza.","你的活跃私聊列表拒绝了在此房间进行路由分发."}.
{"Your contact offline message queue is full. The message has been discarded.","您的联系人离线消息队列已满. 消息已被丢弃"}.
{"Your Jabber account was successfully created.","你的 Jabber 帐户已成功创建."}.
{"Your Jabber account was successfully deleted.","你的 Jabber 帐户已成功删除."}.
{"Your messages to ~s are being blocked. To unblock them, visit ~s","您发送给 ~s 的消息已被阻止. 要解除阻止, 请访问 ~s"}.
ejabberd-2.1.11/src/msgs/it.po 0000664 0000000 0000000 00000157454 12240230175 012752 0 ustar # Luca Brivio , 2012.
msgid ""
msgstr ""
"Project-Id-Version: 2.1.0-alpha\n"
"PO-Revision-Date: 2012-04-24 16:48+0200\n"
"Last-Translator: Luca Brivio \n"
"Language-Team: Italian \n"
"Language: it\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Language: Italian (italiano)\n"
"X-Additional-Translator: Gabriele Stilli \n"
"X-Additional-Translator: Smart2128\n"
"X-Generator: Lokalize 1.2\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: ejabberd_c2s.erl:424 ejabberd_c2s.erl:727
msgid "Use of STARTTLS required"
msgstr "Utilizzo di STARTTLS obbligatorio"
#: ejabberd_c2s.erl:503
msgid "No resource provided"
msgstr "Nessuna risorsa fornita"
#: ejabberd_c2s.erl:1197
msgid "Replaced by new connection"
msgstr "Sostituito da una nuova connessione"
#: ejabberd_c2s.erl:1885
msgid "Your active privacy list has denied the routing of this stanza."
msgstr ""
"In base alla tua attuale lista privacy questa stanza è stata esclusa dalla "
"navigazione."
#: ejabberd_captcha.erl:96 ejabberd_captcha.erl:152 ejabberd_captcha.erl:178
msgid "Enter the text you see"
msgstr "Immettere il testo visibile"
#: ejabberd_captcha.erl:101
msgid "Your messages to ~s are being blocked. To unblock them, visit ~s"
msgstr "I messaggi verso ~s sono bloccati. Per sbloccarli, visitare ~s"
#: ejabberd_captcha.erl:134
msgid "If you don't see the CAPTCHA image here, visit the web page."
msgstr "Se qui non vedi l'immagine CAPTCHA, visita la pagina web."
#: ejabberd_captcha.erl:146
msgid "CAPTCHA web page"
msgstr "Pagina web CAPTCHA"
#: ejabberd_captcha.erl:307
msgid "The CAPTCHA is valid."
msgstr "Il CAPTCHA è valido."
#: mod_adhoc.erl:95 mod_adhoc.erl:125 mod_adhoc.erl:143 mod_adhoc.erl:161
msgid "Commands"
msgstr "Comandi"
#: mod_adhoc.erl:149 mod_adhoc.erl:243
msgid "Ping"
msgstr "Ping"
#: mod_adhoc.erl:260
msgid "Pong"
msgstr "Pong"
#: mod_announce.erl:507 mod_announce_odbc.erl:499
msgid "Really delete message of the day?"
msgstr "Si conferma l'eliminazione del messaggio del giorno (MOTD)?"
#: mod_announce.erl:515 mod_announce_odbc.erl:507 mod_configure.erl:1083
#: mod_configure.erl:1128
msgid "Subject"
msgstr "Oggetto"
#: mod_announce.erl:520 mod_announce_odbc.erl:512 mod_configure.erl:1088
#: mod_configure.erl:1133
msgid "Message body"
msgstr "Corpo del messaggio"
#: mod_announce.erl:600 mod_announce_odbc.erl:592
msgid "No body provided for announce message"
msgstr "Nessun corpo fornito per il messaggio di annuncio"
#: mod_announce.erl:635 mod_announce_odbc.erl:627
msgid "Announcements"
msgstr "Annunci"
#: mod_announce.erl:637 mod_announce_odbc.erl:629
msgid "Send announcement to all users"
msgstr "Inviare l'annuncio a tutti gli utenti"
#: mod_announce.erl:639 mod_announce_odbc.erl:631
msgid "Send announcement to all users on all hosts"
msgstr "Inviare l'annuncio a tutti gli utenti su tutti gli host"
#: mod_announce.erl:641 mod_announce_odbc.erl:633
msgid "Send announcement to all online users"
msgstr "Inviare l'annuncio a tutti gli utenti online"
#: mod_announce.erl:643 mod_announce_odbc.erl:635 mod_configure.erl:1078
#: mod_configure.erl:1123
msgid "Send announcement to all online users on all hosts"
msgstr "Inviare l'annuncio a tutti gli utenti online su tutti gli host"
#: mod_announce.erl:645 mod_announce_odbc.erl:637
msgid "Set message of the day and send to online users"
msgstr ""
"Impostare il messaggio del giorno (MOTD) ed inviarlo agli utenti online"
#: mod_announce.erl:647 mod_announce_odbc.erl:639
msgid "Set message of the day on all hosts and send to online users"
msgstr ""
"Impostare il messaggio del giorno (MOTD) su tutti gli host e inviarlo agli "
"utenti online"
#: mod_announce.erl:649 mod_announce_odbc.erl:641
msgid "Update message of the day (don't send)"
msgstr "Aggiornare il messaggio del giorno (MOTD) (non inviarlo)"
#: mod_announce.erl:651 mod_announce_odbc.erl:643
msgid "Update message of the day on all hosts (don't send)"
msgstr ""
"Aggiornare il messaggio del giorno (MOTD) su tutti gli host (non inviarlo)"
#: mod_announce.erl:653 mod_announce_odbc.erl:645
msgid "Delete message of the day"
msgstr "Eliminare il messaggio del giorno (MOTD)"
#: mod_announce.erl:655 mod_announce_odbc.erl:647
msgid "Delete message of the day on all hosts"
msgstr "Eliminare il messaggio del giorno (MOTD) su tutti gli host"
#: mod_configure.erl:114 mod_configure.erl:274 mod_configure.erl:296
#: mod_configure.erl:498
msgid "Configuration"
msgstr "Configurazione"
#: mod_configure.erl:125 mod_configure.erl:576 web/ejabberd_web_admin.erl:1936
msgid "Database"
msgstr "Database"
#: mod_configure.erl:127 mod_configure.erl:595
msgid "Start Modules"
msgstr "Avviare moduli"
#: mod_configure.erl:129 mod_configure.erl:596
msgid "Stop Modules"
msgstr "Arrestare moduli"
#: mod_configure.erl:131 mod_configure.erl:604 web/ejabberd_web_admin.erl:1937
msgid "Backup"
msgstr "Salvare"
#: mod_configure.erl:133 mod_configure.erl:605
msgid "Restore"
msgstr "Recuperare"
#: mod_configure.erl:135 mod_configure.erl:606
msgid "Dump to Text File"
msgstr "Trascrivere su file di testo"
#: mod_configure.erl:137 mod_configure.erl:615
msgid "Import File"
msgstr "Importare un file"
#: mod_configure.erl:139 mod_configure.erl:616
msgid "Import Directory"
msgstr "Importare una directory"
#: mod_configure.erl:141 mod_configure.erl:581 mod_configure.erl:1057
msgid "Restart Service"
msgstr "Riavviare il servizio"
#: mod_configure.erl:143 mod_configure.erl:582 mod_configure.erl:1102
msgid "Shut Down Service"
msgstr "Terminare il servizio"
#: mod_configure.erl:145 mod_configure.erl:518 mod_configure.erl:1197
#: web/ejabberd_web_admin.erl:1527
msgid "Add User"
msgstr "Aggiungere un utente"
#: mod_configure.erl:147 mod_configure.erl:519 mod_configure.erl:1219
msgid "Delete User"
msgstr "Eliminare l'utente"
#: mod_configure.erl:149 mod_configure.erl:520 mod_configure.erl:1231
msgid "End User Session"
msgstr "Terminare la sessione dell'utente"
#: mod_configure.erl:151 mod_configure.erl:521 mod_configure.erl:1243
#: mod_configure.erl:1255
msgid "Get User Password"
msgstr "Ottenere la password dell'utente"
#: mod_configure.erl:153 mod_configure.erl:522
msgid "Change User Password"
msgstr "Cambiare la password dell'utente"
#: mod_configure.erl:155 mod_configure.erl:523 mod_configure.erl:1272
msgid "Get User Last Login Time"
msgstr "Ottenere la data di ultimo accesso dell'utente"
#: mod_configure.erl:157 mod_configure.erl:524 mod_configure.erl:1284
msgid "Get User Statistics"
msgstr "Ottenere le statistiche dell'utente"
#: mod_configure.erl:159 mod_configure.erl:525
msgid "Get Number of Registered Users"
msgstr "Ottenere il numero di utenti registrati"
#: mod_configure.erl:161 mod_configure.erl:526
msgid "Get Number of Online Users"
msgstr "Ottenere il numero di utenti online"
#: mod_configure.erl:163 mod_configure.erl:509 web/ejabberd_web_admin.erl:831
#: web/ejabberd_web_admin.erl:872
msgid "Access Control Lists"
msgstr "Diritti di accesso (ACL)"
#: mod_configure.erl:165 mod_configure.erl:510 web/ejabberd_web_admin.erl:940
#: web/ejabberd_web_admin.erl:976
msgid "Access Rules"
msgstr "Regole di accesso"
#: mod_configure.erl:297 mod_configure.erl:499
msgid "User Management"
msgstr "Gestione degli utenti"
#: mod_configure.erl:500 web/ejabberd_web_admin.erl:1058
#: web/ejabberd_web_admin.erl:1462
msgid "Online Users"
msgstr "Utenti online"
#: mod_configure.erl:501
msgid "All Users"
msgstr "Tutti gli utenti"
#: mod_configure.erl:502
msgid "Outgoing s2s Connections"
msgstr "Connessioni s2s in uscita"
#: mod_configure.erl:503 web/ejabberd_web_admin.erl:1907
msgid "Running Nodes"
msgstr "Nodi attivi"
#: mod_configure.erl:504 web/ejabberd_web_admin.erl:1909
msgid "Stopped Nodes"
msgstr "Nodi arrestati"
#: mod_configure.erl:577 mod_configure.erl:587 web/ejabberd_web_admin.erl:1953
msgid "Modules"
msgstr "Moduli"
#: mod_configure.erl:578
msgid "Backup Management"
msgstr "Gestione dei salvataggi"
#: mod_configure.erl:579
msgid "Import Users From jabberd14 Spool Files"
msgstr "Importare utenti da file di spool di jabberd14"
#: mod_configure.erl:699
msgid "To ~s"
msgstr "A ~s"
#: mod_configure.erl:717
msgid "From ~s"
msgstr "Da ~s"
#: mod_configure.erl:913
msgid "Database Tables Configuration at "
msgstr "Configurazione delle tabelle del database su "
#: mod_configure.erl:918
msgid "Choose storage type of tables"
msgstr "Selezionare una modalità di conservazione delle tabelle"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "Disc only copy"
msgstr "Copia su disco soltanto"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "RAM and disc copy"
msgstr "Copia in memoria (RAM) e su disco"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "RAM copy"
msgstr "Copia in memoria (RAM)"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "Remote copy"
msgstr "Copia remota"
#: mod_configure.erl:950
msgid "Stop Modules at "
msgstr "Arrestare moduli su "
#: mod_configure.erl:954
msgid "Choose modules to stop"
msgstr "Selezionare i moduli da arrestare"
#: mod_configure.erl:969
msgid "Start Modules at "
msgstr "Avviare moduli su "
#: mod_configure.erl:973
msgid "Enter list of {Module, [Options]}"
msgstr "Immettere un elenco di {Modulo, [Opzioni]}"
#: mod_configure.erl:974
msgid "List of modules to start"
msgstr "Elenco dei moduli da avviare"
#: mod_configure.erl:983
msgid "Backup to File at "
msgstr "Salvataggio sul file "
#: mod_configure.erl:987 mod_configure.erl:1001
msgid "Enter path to backup file"
msgstr "Immettere il percorso del file di salvataggio"
#: mod_configure.erl:988 mod_configure.erl:1002 mod_configure.erl:1016
#: mod_configure.erl:1030
msgid "Path to File"
msgstr "Percorso del file"
#: mod_configure.erl:997
msgid "Restore Backup from File at "
msgstr "Recuperare il salvataggio dal file "
#: mod_configure.erl:1011
msgid "Dump Backup to Text File at "
msgstr "Trascrivere il salvataggio sul file di testo "
#: mod_configure.erl:1015
msgid "Enter path to text file"
msgstr "Immettere il percorso del file di testo"
#: mod_configure.erl:1025
msgid "Import User from File at "
msgstr "Importare un utente dal file "
#: mod_configure.erl:1029
msgid "Enter path to jabberd14 spool file"
msgstr "Immettere il percorso del file di spool di jabberd14"
#: mod_configure.erl:1039
msgid "Import Users from Dir at "
msgstr "Importare utenti dalla directory "
#: mod_configure.erl:1043
msgid "Enter path to jabberd14 spool dir"
msgstr "Immettere il percorso della directory di spool di jabberd14"
#: mod_configure.erl:1044
msgid "Path to Dir"
msgstr "Percorso della directory"
#: mod_configure.erl:1060 mod_configure.erl:1105
msgid "Time delay"
msgstr "Ritardo"
#: mod_configure.erl:1143
msgid "Access Control List Configuration"
msgstr "Configurazione dei diritti di accesso (ACL)"
#: mod_configure.erl:1147
msgid "Access control lists"
msgstr "Diritti di accesso (ACL)"
#: mod_configure.erl:1171
msgid "Access Configuration"
msgstr "Configurazione dell'accesso"
#: mod_configure.erl:1175
msgid "Access rules"
msgstr "Regole di accesso"
#: mod_configure.erl:1200 mod_configure.erl:1222 mod_configure.erl:1234
#: mod_configure.erl:1246 mod_configure.erl:1258 mod_configure.erl:1275
#: mod_configure.erl:1287 mod_configure.erl:1650 mod_configure.erl:1700
#: mod_configure.erl:1721 mod_roster.erl:943 mod_roster_odbc.erl:1060
#: mod_vcard.erl:472 mod_vcard_ldap.erl:554 mod_vcard_odbc.erl:448
msgid "Jabber ID"
msgstr "Jabber ID (Jabber ID)"
#: mod_configure.erl:1205 mod_configure.erl:1263 mod_configure.erl:1651
#: mod_configure.erl:1863 mod_muc/mod_muc_room.erl:3224 mod_register.erl:235
#: web/ejabberd_web_admin.erl:1520
msgid "Password"
msgstr "Password"
#: mod_configure.erl:1210
msgid "Password Verification"
msgstr "Verifica della password"
#: mod_configure.erl:1301
msgid "Number of registered users"
msgstr "Numero di utenti registrati"
#: mod_configure.erl:1315
msgid "Number of online users"
msgstr "Numero di utenti online"
#: mod_configure.erl:1682 web/ejabberd_web_admin.erl:1588
#: web/ejabberd_web_admin.erl:1743
msgid "Never"
msgstr "Mai"
#: mod_configure.erl:1696 web/ejabberd_web_admin.erl:1601
#: web/ejabberd_web_admin.erl:1756
msgid "Online"
msgstr "Online"
#: mod_configure.erl:1701
msgid "Last login"
msgstr "Ultimo accesso"
#: mod_configure.erl:1722
msgid "Roster size"
msgstr "Dimensione della lista dei contatti"
#: mod_configure.erl:1723
msgid "IP addresses"
msgstr "Indirizzi IP"
#: mod_configure.erl:1724
msgid "Resources"
msgstr "Risorse"
#: mod_configure.erl:1850
msgid "Administration of "
msgstr "Amministrazione di "
#: mod_configure.erl:1853
msgid "Action on user"
msgstr "Azione sull'utente"
#: mod_configure.erl:1857
msgid "Edit Properties"
msgstr "Modificare le proprietà"
#: mod_configure.erl:1860 web/ejabberd_web_admin.erl:1769
msgid "Remove User"
msgstr "Eliminare l'utente"
#: mod_irc/mod_irc.erl:201 mod_irc/mod_irc_odbc.erl:196
#: mod_muc/mod_muc.erl:336 mod_muc/mod_muc_odbc.erl:342
msgid "Access denied by service policy"
msgstr "Accesso impedito dalle politiche del servizio"
#: mod_irc/mod_irc.erl:401 mod_irc/mod_irc_odbc.erl:398
msgid "IRC Transport"
msgstr "Transport IRC"
#: mod_irc/mod_irc.erl:428 mod_irc/mod_irc_odbc.erl:425
msgid "ejabberd IRC module"
msgstr "Modulo IRC per ejabberd"
#: mod_irc/mod_irc.erl:559 mod_irc/mod_irc_odbc.erl:568
msgid "You need an x:data capable client to configure mod_irc settings"
msgstr ""
"Per la configurazione del modulo IRC è necessario un client che supporti x:"
"data"
#: mod_irc/mod_irc.erl:566 mod_irc/mod_irc_odbc.erl:575
msgid "Registration in mod_irc for "
msgstr "Registrazione in mod_irc per "
#: mod_irc/mod_irc.erl:571 mod_irc/mod_irc_odbc.erl:580
msgid ""
"Enter username, encodings, ports and passwords you wish to use for "
"connecting to IRC servers"
msgstr ""
"Immettere il nome utente, le codifiche, le porte e le password che si "
"desidera utilizzare per la connessione ai server IRC"
#: mod_irc/mod_irc.erl:576 mod_irc/mod_irc_odbc.erl:585
msgid "IRC Username"
msgstr "Nome utente IRC"
#: mod_irc/mod_irc.erl:586 mod_irc/mod_irc_odbc.erl:595
msgid ""
"If you want to specify different ports, passwords, encodings for IRC "
"servers, fill this list with values in format '{\"irc server\", \"encoding"
"\", port, \"password\"}'. By default this service use \"~s\" encoding, port "
"~p, empty password."
msgstr ""
"Se si vogliono specificare differenti porte, password, codifiche per i "
"server IRC, si riempia questo elenco con valori nel formato '{\"server IRC"
"\", \"codifica\", porta, \"password\"}'. Per default questo servizio "
"utilizza la codifica \"~s\", la porta ~p, la password vuota."
#: mod_irc/mod_irc.erl:598 mod_irc/mod_irc_odbc.erl:607
msgid ""
"Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef."
"net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."
msgstr ""
"Esempio: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"segreto\"}, {\"vendetta."
"fef.net\", \"iso8859-1\", 7000}, {\"irc.serverdiprova.net\", \"utf-8\"}]."
#: mod_irc/mod_irc.erl:603 mod_irc/mod_irc_odbc.erl:612
msgid "Connections parameters"
msgstr "Parametri delle connessioni"
#: mod_irc/mod_irc.erl:728 mod_irc/mod_irc_odbc.erl:757
msgid "Join IRC channel"
msgstr "Entra nel canale IRC"
#: mod_irc/mod_irc.erl:732 mod_irc/mod_irc_odbc.erl:761
msgid "IRC channel (don't put the first #)"
msgstr "Canale IRC (senza il # iniziale)"
#: mod_irc/mod_irc.erl:737 mod_irc/mod_irc_odbc.erl:766
msgid "IRC server"
msgstr "Server IRC"
#: mod_irc/mod_irc.erl:770 mod_irc/mod_irc.erl:774
#: mod_irc/mod_irc_odbc.erl:799 mod_irc/mod_irc_odbc.erl:803
msgid "Join the IRC channel here."
msgstr "Entra nel canale IRC qui."
#: mod_irc/mod_irc.erl:778 mod_irc/mod_irc_odbc.erl:807
msgid "Join the IRC channel in this Jabber ID: ~s"
msgstr "Entra nel canale IRC in questo ID Jabber: ~s"
#: mod_irc/mod_irc.erl:863 mod_irc/mod_irc_odbc.erl:904
msgid "IRC settings"
msgstr "Impostazioni IRC"
#: mod_irc/mod_irc.erl:868 mod_irc/mod_irc_odbc.erl:909
msgid ""
"Enter username and encodings you wish to use for connecting to IRC servers. "
"Press 'Next' to get more fields to fill in. Press 'Complete' to save "
"settings."
msgstr ""
"Immettere il nome utente e le codifiche che si desidera utilizzare per la "
"connessione ai server IRC. Premere \"Avanti\" per vedere i successivi campi "
"da compilare. Premere \"Fatto\" per salvare le impostazioni."
#: mod_irc/mod_irc.erl:874 mod_irc/mod_irc_odbc.erl:915
msgid "IRC username"
msgstr "Nome utente IRC"
#: mod_irc/mod_irc.erl:923 mod_irc/mod_irc_odbc.erl:964
msgid "Password ~b"
msgstr "Password ~b"
#: mod_irc/mod_irc.erl:928 mod_irc/mod_irc_odbc.erl:969
msgid "Port ~b"
msgstr "Porta ~b"
#: mod_irc/mod_irc.erl:933 mod_irc/mod_irc_odbc.erl:974
msgid "Encoding for server ~b"
msgstr "Codifica per il server ~b"
#: mod_irc/mod_irc.erl:942 mod_irc/mod_irc_odbc.erl:983
msgid "Server ~b"
msgstr "Server ~b"
#: mod_muc/mod_muc.erl:449 mod_muc/mod_muc_odbc.erl:456
msgid "Only service administrators are allowed to send service messages"
msgstr ""
"L'invio di messaggi di servizio è consentito solamente agli amministratori "
"del servizio"
#: mod_muc/mod_muc.erl:493 mod_muc/mod_muc_odbc.erl:500
msgid "Room creation is denied by service policy"
msgstr "La creazione di stanze è impedita dalle politiche del servizio"
#: mod_muc/mod_muc.erl:500 mod_muc/mod_muc_odbc.erl:507
msgid "Conference room does not exist"
msgstr "La stanza per conferenze non esiste"
#: mod_muc/mod_muc.erl:582 mod_muc/mod_muc_odbc.erl:595
msgid "Chatrooms"
msgstr "Stanze"
#: mod_muc/mod_muc.erl:712 mod_muc/mod_muc_odbc.erl:729
msgid "You need a client that supports x:data to register the nickname"
msgstr "Per registrare il nickname è necessario un client che supporti x:data"
#: mod_muc/mod_muc.erl:718 mod_muc/mod_muc_odbc.erl:735
msgid "Nickname Registration at "
msgstr "Registrazione di un nickname su "
#: mod_muc/mod_muc.erl:722 mod_muc/mod_muc_odbc.erl:739
msgid "Enter nickname you want to register"
msgstr "Immettere il nickname che si vuole registrare"
#: mod_muc/mod_muc.erl:723 mod_muc/mod_muc_odbc.erl:740
#: mod_muc/mod_muc_room.erl:3810 mod_roster.erl:944 mod_roster_odbc.erl:1061
#: mod_vcard.erl:364 mod_vcard.erl:477 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:453
msgid "Nickname"
msgstr "Nickname"
#: mod_muc/mod_muc.erl:762 mod_muc/mod_muc_odbc.erl:784
#: mod_muc/mod_muc_room.erl:1064 mod_muc/mod_muc_room.erl:1787
msgid "That nickname is registered by another person"
msgstr "Questo nickname è registrato da un'altra persona"
#: mod_muc/mod_muc.erl:788 mod_muc/mod_muc_odbc.erl:811
msgid "You must fill in field \"Nickname\" in the form"
msgstr "Si deve riempire il campo \"Nickname\" nel modulo"
#: mod_muc/mod_muc.erl:808 mod_muc/mod_muc_odbc.erl:831
msgid "ejabberd MUC module"
msgstr "Modulo MUC per ejabberd"
#: mod_muc/mod_muc_log.erl:374 mod_muc/mod_muc_log.erl:381
msgid "Chatroom configuration modified"
msgstr "Configurazione della stanza modificata"
#: mod_muc/mod_muc_log.erl:384
msgid "joins the room"
msgstr "entra nella stanza"
#: mod_muc/mod_muc_log.erl:387 mod_muc/mod_muc_log.erl:390
msgid "leaves the room"
msgstr "esce dalla stanza"
#: mod_muc/mod_muc_log.erl:393 mod_muc/mod_muc_log.erl:396
msgid "has been banned"
msgstr "è stata/o bandita/o"
#: mod_muc/mod_muc_log.erl:399 mod_muc/mod_muc_log.erl:402
msgid "has been kicked"
msgstr "è stata/o espulsa/o"
#: mod_muc/mod_muc_log.erl:405
msgid "has been kicked because of an affiliation change"
msgstr "è stato espulso a causa di un cambiamento di appartenenza"
#: mod_muc/mod_muc_log.erl:408
msgid "has been kicked because the room has been changed to members-only"
msgstr "è stato espulso per la limitazione della stanza ai soli membri"
#: mod_muc/mod_muc_log.erl:411
msgid "has been kicked because of a system shutdown"
msgstr "è stato espulso a causa dello spegnimento del sistema"
#: mod_muc/mod_muc_log.erl:414
msgid "is now known as"
msgstr "è ora conosciuta/o come"
#: mod_muc/mod_muc_log.erl:417 mod_muc/mod_muc_log.erl:688
#: mod_muc/mod_muc_room.erl:2393
msgid " has set the subject to: "
msgstr " ha modificato l'oggetto in: "
#: mod_muc/mod_muc_log.erl:452
msgid "Chatroom is created"
msgstr "La stanza è creata"
#: mod_muc/mod_muc_log.erl:453
msgid "Chatroom is destroyed"
msgstr "La stanza è eliminata"
#: mod_muc/mod_muc_log.erl:454
msgid "Chatroom is started"
msgstr "La stanza è avviata"
#: mod_muc/mod_muc_log.erl:455
msgid "Chatroom is stopped"
msgstr "La stanza è arrestata"
#: mod_muc/mod_muc_log.erl:459
msgid "Monday"
msgstr "Lunedì"
#: mod_muc/mod_muc_log.erl:460
msgid "Tuesday"
msgstr "Martedì"
#: mod_muc/mod_muc_log.erl:461
msgid "Wednesday"
msgstr "Mercoledì"
#: mod_muc/mod_muc_log.erl:462
msgid "Thursday"
msgstr "Giovedì"
#: mod_muc/mod_muc_log.erl:463
msgid "Friday"
msgstr "Venerdì"
#: mod_muc/mod_muc_log.erl:464
msgid "Saturday"
msgstr "Sabato"
#: mod_muc/mod_muc_log.erl:465
msgid "Sunday"
msgstr "Domenica"
#: mod_muc/mod_muc_log.erl:469
msgid "January"
msgstr "Gennaio"
#: mod_muc/mod_muc_log.erl:470
msgid "February"
msgstr "Febbraio"
#: mod_muc/mod_muc_log.erl:471
msgid "March"
msgstr "Marzo"
#: mod_muc/mod_muc_log.erl:472
msgid "April"
msgstr "Aprile"
#: mod_muc/mod_muc_log.erl:473
msgid "May"
msgstr "Maggio"
#: mod_muc/mod_muc_log.erl:474
msgid "June"
msgstr "Giugno"
#: mod_muc/mod_muc_log.erl:475
msgid "July"
msgstr "Luglio"
#: mod_muc/mod_muc_log.erl:476
msgid "August"
msgstr "Agosto"
#: mod_muc/mod_muc_log.erl:477
msgid "September"
msgstr "Settembre"
#: mod_muc/mod_muc_log.erl:478
msgid "October"
msgstr "Ottobre"
#: mod_muc/mod_muc_log.erl:479
msgid "November"
msgstr "Novembre"
#: mod_muc/mod_muc_log.erl:480
msgid "December"
msgstr "Dicembre"
#: mod_muc/mod_muc_log.erl:750
msgid "Room Configuration"
msgstr "Configurazione della stanza"
#: mod_muc/mod_muc_log.erl:759
msgid "Room Occupants"
msgstr "Presenti nella stanza"
#: mod_muc/mod_muc_room.erl:174
msgid "Traffic rate limit is exceeded"
msgstr "Limite di traffico superato"
#: mod_muc/mod_muc_room.erl:246
msgid ""
"This participant is kicked from the room because he sent an error message"
msgstr ""
"Partecipante espulso dalla stanza perché ha inviato un messaggio non valido"
#: mod_muc/mod_muc_room.erl:255
msgid "It is not allowed to send private messages to the conference"
msgstr "Non è consentito l'invio di messaggi privati alla conferenza"
#: mod_muc/mod_muc_room.erl:332
msgid "Please, wait for a while before sending new voice request"
msgstr "Attendi qualche istante prima di inviare una nuova richiesta di parola"
#: mod_muc/mod_muc_room.erl:347
msgid "Voice requests are disabled in this conference"
msgstr "In questa conferenza le richieste di parola sono escluse"
#: mod_muc/mod_muc_room.erl:364
msgid "Failed to extract JID from your voice request approval"
msgstr ""
"Impossibile estrarre il JID dall'approvazione della richiesta di parola"
#: mod_muc/mod_muc_room.erl:393
msgid "Only moderators can approve voice requests"
msgstr "Soltanto i moderatori possono approvare richieste di parola"
#: mod_muc/mod_muc_room.erl:408
msgid "Improper message type"
msgstr "Tipo di messaggio non corretto"
#: mod_muc/mod_muc_room.erl:518
msgid ""
"This participant is kicked from the room because he sent an error message to "
"another participant"
msgstr ""
"Partecipante espulso dalla stanza perché ha inviato un messaggio non valido "
"a un altro partecipante"
#: mod_muc/mod_muc_room.erl:531
msgid "It is not allowed to send private messages of type \"groupchat\""
msgstr "Non è consentito l'invio di messaggi privati di tipo \"groupchat\""
#: mod_muc/mod_muc_room.erl:543 mod_muc/mod_muc_room.erl:611
msgid "Recipient is not in the conference room"
msgstr "Il destinatario non è nella stanza per conferenze"
#: mod_muc/mod_muc_room.erl:564 mod_muc/mod_muc_room.erl:585
msgid "It is not allowed to send private messages"
msgstr "Non è consentito l'invio di messaggi privati"
#: mod_muc/mod_muc_room.erl:576 mod_muc/mod_muc_room.erl:956
#: mod_muc/mod_muc_room.erl:4040
msgid "Only occupants are allowed to send messages to the conference"
msgstr "L'invio di messaggi alla conferenza è consentito soltanto ai presenti"
#: mod_muc/mod_muc_room.erl:634
msgid "Only occupants are allowed to send queries to the conference"
msgstr "L'invio di query alla conferenza è consentito ai soli presenti"
#: mod_muc/mod_muc_room.erl:646
msgid "Queries to the conference members are not allowed in this room"
msgstr "In questa stanza non sono consentite query ai membri della conferenza"
#: mod_muc/mod_muc_room.erl:932
msgid ""
"Only moderators and participants are allowed to change the subject in this "
"room"
msgstr ""
"La modifica dell'oggetto di questa stanza è consentita soltanto ai "
"moderatori e ai partecipanti"
#: mod_muc/mod_muc_room.erl:937
msgid "Only moderators are allowed to change the subject in this room"
msgstr ""
"La modifica dell'oggetto di questa stanza è consentita soltanto ai moderatori"
#: mod_muc/mod_muc_room.erl:947
msgid "Visitors are not allowed to send messages to all occupants"
msgstr "Non è consentito ai visitatori l'invio di messaggi a tutti i presenti"
#: mod_muc/mod_muc_room.erl:1021
msgid ""
"This participant is kicked from the room because he sent an error presence"
msgstr ""
"Partecipante espulso dalla stanza perché ha inviato una presenza non valido"
#: mod_muc/mod_muc_room.erl:1040
msgid "Visitors are not allowed to change their nicknames in this room"
msgstr "Non è consentito ai visitatori cambiare il nickname in questa stanza"
#: mod_muc/mod_muc_room.erl:1053 mod_muc/mod_muc_room.erl:1779
msgid "That nickname is already in use by another occupant"
msgstr "Il nickname è già in uso all'interno della conferenza"
#: mod_muc/mod_muc_room.erl:1768
msgid "You have been banned from this room"
msgstr "Sei stata/o bandita/o da questa stanza"
#: mod_muc/mod_muc_room.erl:1771
msgid "Membership is required to enter this room"
msgstr "Per entrare in questa stanza è necessario essere membro"
#: mod_muc/mod_muc_room.erl:1807
msgid "This room is not anonymous"
msgstr "Questa stanza non è anonima"
#: mod_muc/mod_muc_room.erl:1833
msgid "A password is required to enter this room"
msgstr "Per entrare in questa stanza è prevista una password"
#: mod_muc/mod_muc_room.erl:1855 mod_register.erl:246
msgid "Too many CAPTCHA requests"
msgstr "Troppe richieste CAPTCHA"
#: mod_muc/mod_muc_room.erl:1864 mod_register.erl:251
msgid "Unable to generate a CAPTCHA"
msgstr "Impossibile generare un CAPTCHA"
#: mod_muc/mod_muc_room.erl:1874
msgid "Incorrect password"
msgstr "Password non esatta"
#: mod_muc/mod_muc_room.erl:2448
msgid "Administrator privileges required"
msgstr "Necessari i privilegi di amministratore"
#: mod_muc/mod_muc_room.erl:2463
msgid "Moderator privileges required"
msgstr "Necessari i privilegi di moderatore"
#: mod_muc/mod_muc_room.erl:2619
msgid "Jabber ID ~s is invalid"
msgstr "Il Jabber ID ~s non è valido"
#: mod_muc/mod_muc_room.erl:2633
msgid "Nickname ~s does not exist in the room"
msgstr "Il nickname ~s non esiste nella stanza"
#: mod_muc/mod_muc_room.erl:2659 mod_muc/mod_muc_room.erl:3049
msgid "Invalid affiliation: ~s"
msgstr "Affiliazione non valida: ~s"
#: mod_muc/mod_muc_room.erl:2713
msgid "Invalid role: ~s"
msgstr "Ruolo non valido: ~s"
#: mod_muc/mod_muc_room.erl:3026 mod_muc/mod_muc_room.erl:3062
msgid "Owner privileges required"
msgstr "Necessari i privilegi di proprietario"
#: mod_muc/mod_muc_room.erl:3195
msgid "Configuration of room ~s"
msgstr "Configurazione per la stanza ~s"
#: mod_muc/mod_muc_room.erl:3200
msgid "Room title"
msgstr "Titolo della stanza"
#: mod_muc/mod_muc_room.erl:3203 mod_muc/mod_muc_room.erl:3692
msgid "Room description"
msgstr "Descrizione della stanza"
#: mod_muc/mod_muc_room.erl:3210
msgid "Make room persistent"
msgstr "Rendere la stanza persistente"
#: mod_muc/mod_muc_room.erl:3215
msgid "Make room public searchable"
msgstr "Rendere la sala visibile al pubblico"
#: mod_muc/mod_muc_room.erl:3218
msgid "Make participants list public"
msgstr "Rendere pubblica la lista dei partecipanti"
#: mod_muc/mod_muc_room.erl:3221
msgid "Make room password protected"
msgstr "Rendere la stanza protetta da password"
#: mod_muc/mod_muc_room.erl:3232
msgid "Maximum Number of Occupants"
msgstr "Numero massimo di occupanti"
#: mod_muc/mod_muc_room.erl:3239
msgid "No limit"
msgstr "Nessun limite"
#: mod_muc/mod_muc_room.erl:3250
msgid "Present real Jabber IDs to"
msgstr "Rendere visibile il Jabber ID reale a"
#: mod_muc/mod_muc_room.erl:3258 mod_muc/mod_muc_room.erl:3292
msgid "moderators only"
msgstr "moderatori soltanto"
#: mod_muc/mod_muc_room.erl:3260 mod_muc/mod_muc_room.erl:3294
msgid "anyone"
msgstr "tutti"
#: mod_muc/mod_muc_room.erl:3262
msgid "Make room members-only"
msgstr "Rendere la stanza riservata ai membri"
#: mod_muc/mod_muc_room.erl:3265
msgid "Make room moderated"
msgstr "Rendere la stanza moderata"
#: mod_muc/mod_muc_room.erl:3268
msgid "Default users as participants"
msgstr "Definire per default gli utenti come partecipanti"
#: mod_muc/mod_muc_room.erl:3271
msgid "Allow users to change the subject"
msgstr "Consentire agli utenti di cambiare l'oggetto"
#: mod_muc/mod_muc_room.erl:3274
msgid "Allow users to send private messages"
msgstr "Consentire agli utenti l'invio di messaggi privati"
#: mod_muc/mod_muc_room.erl:3279
msgid "Allow visitors to send private messages to"
msgstr "Consentire agli ospiti l'invio di messaggi privati a"
#: mod_muc/mod_muc_room.erl:3290
msgid "nobody"
msgstr "nessuno"
#: mod_muc/mod_muc_room.erl:3296
msgid "Allow users to query other users"
msgstr "Consentire agli utenti query verso altri utenti"
#: mod_muc/mod_muc_room.erl:3299
msgid "Allow users to send invites"
msgstr "Consentire agli utenti l'invio di inviti"
#: mod_muc/mod_muc_room.erl:3302
msgid "Allow visitors to send status text in presence updates"
msgstr ""
"Consentire ai visitatori l'invio di testo sullo stato in aggiornamenti sulla "
"presenza"
#: mod_muc/mod_muc_room.erl:3305
msgid "Allow visitors to change nickname"
msgstr "Consentire ai visitatori di cambiare il nickname"
#: mod_muc/mod_muc_room.erl:3308
msgid "Allow visitors to send voice requests"
msgstr "Consentire agli ospiti l'invio di richieste di parola"
#: mod_muc/mod_muc_room.erl:3311
msgid "Minimum interval between voice requests (in seconds)"
msgstr "Intervallo minimo fra due richieste di parola (in secondi)"
#: mod_muc/mod_muc_room.erl:3317
msgid "Make room CAPTCHA protected"
msgstr "Rendere la stanza protetta da CAPTCHA"
#: mod_muc/mod_muc_room.erl:3322
msgid "Exclude Jabber IDs from CAPTCHA challenge"
msgstr "Escludi degli ID Jabber dal passaggio CAPTCHA"
#: mod_muc/mod_muc_room.erl:3329
msgid "Enable logging"
msgstr "Abilitare i log"
#: mod_muc/mod_muc_room.erl:3337
msgid "You need an x:data capable client to configure room"
msgstr ""
"Per la configurazione della stanza è necessario un client che supporti x:data"
#: mod_muc/mod_muc_room.erl:3694
msgid "Number of occupants"
msgstr "Numero di presenti"
#: mod_muc/mod_muc_room.erl:3750
msgid "private, "
msgstr "privato, "
#: mod_muc/mod_muc_room.erl:3799
msgid "Voice request"
msgstr "Richiesta di parola"
#: mod_muc/mod_muc_room.erl:3803
msgid "Either approve or decline the voice request."
msgstr "Approva oppure respingi la richiesta di parola."
#: mod_muc/mod_muc_room.erl:3809
msgid "User JID"
msgstr "JID utente"
#: mod_muc/mod_muc_room.erl:3811
msgid "Grant voice to this person?"
msgstr "Dare parola a questa persona?"
#: mod_muc/mod_muc_room.erl:3960
msgid "~s invites you to the room ~s"
msgstr "~s ti invita nella stanza ~s"
#: mod_muc/mod_muc_room.erl:3969
msgid "the password is"
msgstr "la password è"
#: mod_offline.erl:510 mod_offline_odbc.erl:352
msgid ""
"Your contact offline message queue is full. The message has been discarded."
msgstr ""
"La coda dei messaggi offline del contatto è piena. Il messaggio è stato "
"scartato"
#: mod_offline.erl:560 mod_offline_odbc.erl:408
msgid "~s's Offline Messages Queue"
msgstr "Coda di ~s messaggi offline"
#: mod_offline.erl:563 mod_offline_odbc.erl:411 mod_roster.erl:987
#: mod_roster_odbc.erl:1104 mod_shared_roster.erl:901
#: mod_shared_roster.erl:1010 mod_shared_roster_odbc.erl:930
#: mod_shared_roster_odbc.erl:1039 web/ejabberd_web_admin.erl:833
#: web/ejabberd_web_admin.erl:874 web/ejabberd_web_admin.erl:942
#: web/ejabberd_web_admin.erl:978 web/ejabberd_web_admin.erl:1019
#: web/ejabberd_web_admin.erl:1508 web/ejabberd_web_admin.erl:1760
#: web/ejabberd_web_admin.erl:1931 web/ejabberd_web_admin.erl:1963
#: web/ejabberd_web_admin.erl:2031 web/ejabberd_web_admin.erl:2135
#: web/ejabberd_web_admin.erl:2160 web/ejabberd_web_admin.erl:2248
msgid "Submitted"
msgstr "Inviato"
#: mod_offline.erl:571
msgid "Time"
msgstr "Ora"
#: mod_offline.erl:572
msgid "From"
msgstr "Da"
#: mod_offline.erl:573
msgid "To"
msgstr "A"
#: mod_offline.erl:574 mod_offline_odbc.erl:419
msgid "Packet"
msgstr "Pacchetto"
#: mod_offline.erl:587 mod_offline_odbc.erl:432 mod_shared_roster.erl:908
#: mod_shared_roster_odbc.erl:937 web/ejabberd_web_admin.erl:882
#: web/ejabberd_web_admin.erl:986
msgid "Delete Selected"
msgstr "Eliminare gli elementi selezionati"
#: mod_offline.erl:645 mod_offline_odbc.erl:519
msgid "Offline Messages:"
msgstr "Messaggi offline:"
#: mod_offline.erl:645 mod_offline_odbc.erl:519
msgid "Remove All Offline Messages"
msgstr "Eliminare tutti i messaggi offline"
#: mod_proxy65/mod_proxy65_service.erl:213
msgid "ejabberd SOCKS5 Bytestreams module"
msgstr "Modulo SOCKS5 Bytestreams per ejabberd"
#: mod_pubsub/mod_pubsub.erl:1120 mod_pubsub/mod_pubsub_odbc.erl:929
msgid "Publish-Subscribe"
msgstr "Pubblicazione-Iscrizione"
#: mod_pubsub/mod_pubsub.erl:1214 mod_pubsub/mod_pubsub_odbc.erl:1025
msgid "ejabberd Publish-Subscribe module"
msgstr "Modulo Pubblicazione/Iscrizione (PubSub) per ejabberd"
#: mod_pubsub/mod_pubsub.erl:1497 mod_pubsub/mod_pubsub_odbc.erl:1312
msgid "PubSub subscriber request"
msgstr "Richiesta di iscrizione per PubSub"
#: mod_pubsub/mod_pubsub.erl:1499 mod_pubsub/mod_pubsub_odbc.erl:1314
msgid "Choose whether to approve this entity's subscription."
msgstr "Scegliere se approvare l'iscrizione per questa entità"
#: mod_pubsub/mod_pubsub.erl:1505 mod_pubsub/mod_pubsub_odbc.erl:1320
msgid "Node ID"
msgstr "ID del nodo"
#: mod_pubsub/mod_pubsub.erl:1510 mod_pubsub/mod_pubsub_odbc.erl:1325
msgid "Subscriber Address"
msgstr "Indirizzo dell'iscritta/o"
#: mod_pubsub/mod_pubsub.erl:1516 mod_pubsub/mod_pubsub_odbc.erl:1331
msgid "Allow this Jabber ID to subscribe to this pubsub node?"
msgstr "Consentire a questo Jabber ID l'iscrizione a questo nodo pubsub?"
#: mod_pubsub/mod_pubsub.erl:3474 mod_pubsub/mod_pubsub_odbc.erl:3287
msgid "Deliver payloads with event notifications"
msgstr "Inviare il contenuto del messaggio con la notifica dell'evento"
#: mod_pubsub/mod_pubsub.erl:3475 mod_pubsub/mod_pubsub_odbc.erl:3288
msgid "Deliver event notifications"
msgstr "Inviare notifiche degli eventi"
#: mod_pubsub/mod_pubsub.erl:3476 mod_pubsub/mod_pubsub_odbc.erl:3289
msgid "Notify subscribers when the node configuration changes"
msgstr "Notificare gli iscritti quando la configurazione del nodo cambia"
#: mod_pubsub/mod_pubsub.erl:3477 mod_pubsub/mod_pubsub_odbc.erl:3290
msgid "Notify subscribers when the node is deleted"
msgstr "Notificare gli iscritti quando il nodo è cancellato"
#: mod_pubsub/mod_pubsub.erl:3478 mod_pubsub/mod_pubsub_odbc.erl:3291
msgid "Notify subscribers when items are removed from the node"
msgstr "Notificare gli iscritti quando sono eliminati degli elementi dal nodo"
#: mod_pubsub/mod_pubsub.erl:3479 mod_pubsub/mod_pubsub_odbc.erl:3292
msgid "Persist items to storage"
msgstr "Conservazione persistente degli elementi"
#: mod_pubsub/mod_pubsub.erl:3480 mod_pubsub/mod_pubsub_odbc.erl:3293
msgid "A friendly name for the node"
msgstr "Un nome comodo per il nodo"
#: mod_pubsub/mod_pubsub.erl:3481 mod_pubsub/mod_pubsub_odbc.erl:3294
msgid "Max # of items to persist"
msgstr "Numero massimo di elementi da conservare persistentemente"
#: mod_pubsub/mod_pubsub.erl:3482 mod_pubsub/mod_pubsub_odbc.erl:3295
msgid "Whether to allow subscriptions"
msgstr "Consentire iscrizioni?"
#: mod_pubsub/mod_pubsub.erl:3483 mod_pubsub/mod_pubsub_odbc.erl:3296
msgid "Specify the access model"
msgstr "Specificare il modello di accesso"
#: mod_pubsub/mod_pubsub.erl:3486 mod_pubsub/mod_pubsub_odbc.erl:3299
msgid "Roster groups allowed to subscribe"
msgstr "Gruppi roster abilitati alla registrazione"
#: mod_pubsub/mod_pubsub.erl:3487 mod_pubsub/mod_pubsub_odbc.erl:3300
msgid "Specify the publisher model"
msgstr "Definire il modello di pubblicazione"
#: mod_pubsub/mod_pubsub.erl:3489 mod_pubsub/mod_pubsub_odbc.erl:3302
msgid "Purge all items when the relevant publisher goes offline"
msgstr ""
"Cancella tutti gli elementi quando chi li ha pubblicati non è più online"
#: mod_pubsub/mod_pubsub.erl:3490 mod_pubsub/mod_pubsub_odbc.erl:3303
msgid "Specify the event message type"
msgstr "Specificare il tipo di messaggio di evento"
#: mod_pubsub/mod_pubsub.erl:3492 mod_pubsub/mod_pubsub_odbc.erl:3305
msgid "Max payload size in bytes"
msgstr "Dimensione massima del contenuto del messaggio in byte"
#: mod_pubsub/mod_pubsub.erl:3493 mod_pubsub/mod_pubsub_odbc.erl:3306
msgid "When to send the last published item"
msgstr "Quando inviare l'ultimo elemento pubblicato"
#: mod_pubsub/mod_pubsub.erl:3495 mod_pubsub/mod_pubsub_odbc.erl:3308
msgid "Only deliver notifications to available users"
msgstr "Inviare le notifiche solamente agli utenti disponibili"
#: mod_pubsub/mod_pubsub.erl:3496 mod_pubsub/mod_pubsub_odbc.erl:3309
msgid "The collections with which a node is affiliated"
msgstr "Le collezioni a cui è affiliato un nodo"
#: mod_register.erl:193
msgid "The CAPTCHA verification has failed"
msgstr "La verifica del CAPTCHA ha avuto esito negativo"
#: mod_register.erl:220
msgid "You need a client that supports x:data and CAPTCHA to register"
msgstr "La registrazione richiede un client che supporti x:data e CAPTCHA"
#: mod_register.erl:226 mod_register.erl:265
msgid "Choose a username and password to register with this server"
msgstr ""
"Scegliere un nome utente e una password per la registrazione con questo "
"server"
#: mod_register.erl:230 mod_vcard.erl:364 mod_vcard_odbc.erl:342
#: web/ejabberd_web_admin.erl:1515 web/ejabberd_web_admin.erl:1572
msgid "User"
msgstr "Utente"
#: mod_register.erl:316 mod_register.erl:361
msgid "The password is too weak"
msgstr "La password è troppo debole"
#: mod_register.erl:365
msgid "Users are not allowed to register accounts so quickly"
msgstr "Non è consentito agli utenti registrare account così rapidamente"
#: mod_roster.erl:938 mod_roster_odbc.erl:1055 web/ejabberd_web_admin.erl:1701
#: web/ejabberd_web_admin.erl:1886 web/ejabberd_web_admin.erl:1897
#: web/ejabberd_web_admin.erl:2219
msgid "None"
msgstr "Nessuno"
#: mod_roster.erl:945 mod_roster_odbc.erl:1062
msgid "Subscription"
msgstr "Iscrizione"
#: mod_roster.erl:946 mod_roster_odbc.erl:1063
msgid "Pending"
msgstr "Pendente"
#: mod_roster.erl:947 mod_roster_odbc.erl:1064
msgid "Groups"
msgstr "Gruppi"
#: mod_roster.erl:974 mod_roster_odbc.erl:1091
msgid "Validate"
msgstr "Validare"
#: mod_roster.erl:982 mod_roster_odbc.erl:1099
msgid "Remove"
msgstr "Eliminare"
#: mod_roster.erl:985 mod_roster_odbc.erl:1102
msgid "Roster of "
msgstr "Lista dei contatti di "
#: mod_roster.erl:988 mod_roster_odbc.erl:1105 mod_shared_roster.erl:902
#: mod_shared_roster.erl:1011 mod_shared_roster_odbc.erl:931
#: mod_shared_roster_odbc.erl:1040 web/ejabberd_web_admin.erl:834
#: web/ejabberd_web_admin.erl:875 web/ejabberd_web_admin.erl:943
#: web/ejabberd_web_admin.erl:979 web/ejabberd_web_admin.erl:1020
#: web/ejabberd_web_admin.erl:1509 web/ejabberd_web_admin.erl:1761
#: web/ejabberd_web_admin.erl:1932 web/ejabberd_web_admin.erl:2136
#: web/ejabberd_web_admin.erl:2161
msgid "Bad format"
msgstr "Formato non valido"
#: mod_roster.erl:995 mod_roster_odbc.erl:1112
msgid "Add Jabber ID"
msgstr "Aggiungere un Jabber ID (Jabber ID)"
#: mod_roster.erl:1094 mod_roster_odbc.erl:1211
msgid "Roster"
msgstr "Lista dei contatti"
#: mod_shared_roster.erl:857 mod_shared_roster.erl:899
#: mod_shared_roster.erl:1007 mod_shared_roster_odbc.erl:886
#: mod_shared_roster_odbc.erl:928 mod_shared_roster_odbc.erl:1036
msgid "Shared Roster Groups"
msgstr "Gruppi di liste di contatti comuni"
#: mod_shared_roster.erl:895 mod_shared_roster_odbc.erl:924
#: web/ejabberd_web_admin.erl:1365 web/ejabberd_web_admin.erl:2461
msgid "Add New"
msgstr "Aggiungere nuovo"
#: mod_shared_roster.erl:978 mod_shared_roster_odbc.erl:1007
msgid "Name:"
msgstr "Nome:"
#: mod_shared_roster.erl:983 mod_shared_roster_odbc.erl:1012
msgid "Description:"
msgstr "Descrizione:"
#: mod_shared_roster.erl:991 mod_shared_roster_odbc.erl:1020
msgid "Members:"
msgstr "Membri:"
#: mod_shared_roster.erl:999 mod_shared_roster_odbc.erl:1028
msgid "Displayed Groups:"
msgstr "Gruppi visualizzati:"
#: mod_shared_roster.erl:1008 mod_shared_roster_odbc.erl:1037
msgid "Group "
msgstr "Gruppo "
#: mod_shared_roster.erl:1017 mod_shared_roster_odbc.erl:1046
#: web/ejabberd_web_admin.erl:840 web/ejabberd_web_admin.erl:884
#: web/ejabberd_web_admin.erl:949 web/ejabberd_web_admin.erl:1026
#: web/ejabberd_web_admin.erl:2017
msgid "Submit"
msgstr "Inviare"
#: mod_vcard.erl:165 mod_vcard_ldap.erl:238 mod_vcard_odbc.erl:129
msgid "Erlang Jabber Server"
msgstr "Erlang Jabber Server"
#: mod_vcard.erl:364 mod_vcard.erl:478 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:454
msgid "Birthday"
msgstr "Compleanno"
#: mod_vcard.erl:364 mod_vcard.erl:480 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:456
msgid "City"
msgstr "Città"
#: mod_vcard.erl:364 mod_vcard.erl:479 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:455
msgid "Country"
msgstr "Paese"
#: mod_vcard.erl:364 mod_vcard.erl:481 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:457
msgid "Email"
msgstr "E-mail"
#: mod_vcard.erl:364 mod_vcard.erl:476 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:452
msgid "Family Name"
msgstr "Cognome"
#: mod_vcard.erl:364 mod_vcard_odbc.erl:342
msgid ""
"Fill in the form to search for any matching Jabber User (Add * to the end of "
"field to match substring)"
msgstr ""
"Riempire il modulo per la ricerca di utenti Jabber corrispondenti ai criteri "
"(Aggiungere * alla fine del campo per la ricerca di una sottostringa"
#: mod_vcard.erl:364 mod_vcard.erl:473 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:449
msgid "Full Name"
msgstr "Nome completo"
#: mod_vcard.erl:364 mod_vcard.erl:475 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:451
msgid "Middle Name"
msgstr "Altro nome"
#: mod_vcard.erl:364 mod_vcard.erl:474 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:450 web/ejabberd_web_admin.erl:2006
msgid "Name"
msgstr "Nome"
#: mod_vcard.erl:364 mod_vcard.erl:482 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:458
msgid "Organization Name"
msgstr "Nome dell'organizzazione"
#: mod_vcard.erl:364 mod_vcard.erl:483 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:459
msgid "Organization Unit"
msgstr "Unità dell'organizzazione"
#: mod_vcard.erl:364 mod_vcard_ldap.erl:462 mod_vcard_odbc.erl:342
msgid "Search users in "
msgstr "Cercare utenti in "
#: mod_vcard.erl:364 mod_vcard_ldap.erl:462 mod_vcard_odbc.erl:342
msgid "You need an x:data capable client to search"
msgstr "Per effettuare ricerche è necessario un client che supporti x:data"
#: mod_vcard.erl:389 mod_vcard_ldap.erl:487 mod_vcard_odbc.erl:367
msgid "vCard User Search"
msgstr "Ricerca di utenti per vCard"
#: mod_vcard.erl:445 mod_vcard_ldap.erl:541 mod_vcard_odbc.erl:421
msgid "ejabberd vCard module"
msgstr "Modulo vCard per ejabberd"
#: mod_vcard.erl:469 mod_vcard_ldap.erl:551 mod_vcard_odbc.erl:445
msgid "Search Results for "
msgstr "Risultati della ricerca per "
#: mod_vcard_ldap.erl:462
msgid "Fill in fields to search for any matching Jabber User"
msgstr ""
"Riempire i campi per la ricerca di utenti Jabber corrispondenti ai criteri"
#: web/ejabberd_web_admin.erl:193 web/ejabberd_web_admin.erl:203
#: web/ejabberd_web_admin.erl:219 web/ejabberd_web_admin.erl:229
msgid "Unauthorized"
msgstr "Non autorizzato"
#: web/ejabberd_web_admin.erl:286 web/ejabberd_web_admin.erl:303
msgid "ejabberd Web Admin"
msgstr "Amministrazione web ejabberd"
#: web/ejabberd_web_admin.erl:769 web/ejabberd_web_admin.erl:780
msgid "Administration"
msgstr "Amministrazione"
#: web/ejabberd_web_admin.erl:878 web/ejabberd_web_admin.erl:982
msgid "Raw"
msgstr "Grezzo"
#: web/ejabberd_web_admin.erl:1017
msgid "~s access rule configuration"
msgstr "Configurazione delle regole di accesso per ~s"
#: web/ejabberd_web_admin.erl:1035
msgid "Virtual Hosts"
msgstr "Host Virtuali"
#: web/ejabberd_web_admin.erl:1043 web/ejabberd_web_admin.erl:1050
msgid "Users"
msgstr "Utenti"
#: web/ejabberd_web_admin.erl:1078
msgid "Users Last Activity"
msgstr "Ultima attività degli utenti"
#: web/ejabberd_web_admin.erl:1080
msgid "Period: "
msgstr "Periodo:"
#: web/ejabberd_web_admin.erl:1090
msgid "Last month"
msgstr "Ultimo mese"
#: web/ejabberd_web_admin.erl:1091
msgid "Last year"
msgstr "Ultimo anno"
#: web/ejabberd_web_admin.erl:1092
msgid "All activity"
msgstr "Tutta l'attività"
#: web/ejabberd_web_admin.erl:1094
msgid "Show Ordinary Table"
msgstr "Mostrare la tabella normale"
#: web/ejabberd_web_admin.erl:1096
msgid "Show Integral Table"
msgstr "Mostrare la tabella integrale"
#: web/ejabberd_web_admin.erl:1105 web/ejabberd_web_admin.erl:1939
msgid "Statistics"
msgstr "Statistiche"
#: web/ejabberd_web_admin.erl:1117
msgid "Not Found"
msgstr "Non trovato"
#: web/ejabberd_web_admin.erl:1134
msgid "Node not found"
msgstr "Nodo non trovato"
#: web/ejabberd_web_admin.erl:1460
msgid "Host"
msgstr "Host"
#: web/ejabberd_web_admin.erl:1461
msgid "Registered Users"
msgstr "Utenti registrati"
#: web/ejabberd_web_admin.erl:1573
msgid "Offline Messages"
msgstr "Messaggi offline"
#: web/ejabberd_web_admin.erl:1574 web/ejabberd_web_admin.erl:1767
msgid "Last Activity"
msgstr "Ultima attività"
#: web/ejabberd_web_admin.erl:1659 web/ejabberd_web_admin.erl:1675
msgid "Registered Users:"
msgstr "Utenti registrati:"
#: web/ejabberd_web_admin.erl:1661 web/ejabberd_web_admin.erl:1677
#: web/ejabberd_web_admin.erl:2192
msgid "Online Users:"
msgstr "Utenti connessi:"
#: web/ejabberd_web_admin.erl:1663
msgid "Outgoing s2s Connections:"
msgstr "Connessioni s2s in uscita:"
#: web/ejabberd_web_admin.erl:1665
msgid "Outgoing s2s Servers:"
msgstr "Server s2s in uscita"
#: web/ejabberd_web_admin.erl:1734 web/mod_register_web.erl:175
#: web/mod_register_web.erl:372 web/mod_register_web.erl:381
#: web/mod_register_web.erl:411
msgid "Change Password"
msgstr "Modificare la password"
#: web/ejabberd_web_admin.erl:1758
msgid "User "
msgstr "Utente "
#: web/ejabberd_web_admin.erl:1765
msgid "Connected Resources:"
msgstr "Risorse connesse:"
#: web/ejabberd_web_admin.erl:1766 web/mod_register_web.erl:227
#: web/mod_register_web.erl:519
msgid "Password:"
msgstr "Password:"
#: web/ejabberd_web_admin.erl:1828
msgid "No Data"
msgstr "Nessuna informazione"
#: web/ejabberd_web_admin.erl:1906
msgid "Nodes"
msgstr "Nodi"
#: web/ejabberd_web_admin.erl:1929 web/ejabberd_web_admin.erl:1951
msgid "Node "
msgstr "Nodo "
#: web/ejabberd_web_admin.erl:1938
msgid "Listened Ports"
msgstr "Porte in ascolto"
#: web/ejabberd_web_admin.erl:1940 web/ejabberd_web_admin.erl:2260
#: web/ejabberd_web_admin.erl:2448
msgid "Update"
msgstr "Aggiornare"
#: web/ejabberd_web_admin.erl:1943 web/ejabberd_web_admin.erl:2569
msgid "Restart"
msgstr "Riavviare"
#: web/ejabberd_web_admin.erl:1945 web/ejabberd_web_admin.erl:2571
msgid "Stop"
msgstr "Arrestare"
#: web/ejabberd_web_admin.erl:1959
msgid "RPC Call Error"
msgstr "Errore di chiamata RPC"
#: web/ejabberd_web_admin.erl:2000
msgid "Database Tables at "
msgstr "Tabelle del database su "
#: web/ejabberd_web_admin.erl:2007
msgid "Storage Type"
msgstr "Tipo di conservazione"
#: web/ejabberd_web_admin.erl:2008
msgid "Elements"
msgstr "Elementi"
#: web/ejabberd_web_admin.erl:2009
msgid "Memory"
msgstr "Memoria"
#: web/ejabberd_web_admin.erl:2032 web/ejabberd_web_admin.erl:2137
msgid "Error"
msgstr "Errore"
#: web/ejabberd_web_admin.erl:2034
msgid "Backup of "
msgstr "Salvataggio di "
#: web/ejabberd_web_admin.erl:2036
msgid ""
"Please note that these options will only backup the builtin Mnesia database. "
"If you are using the ODBC module, you also need to backup your SQL database "
"separately."
msgstr ""
"N.B.: Queste opzioni comportano il salvataggio solamente del database "
"interno Mnesia. Se si sta utilizzando il modulo ODBC, è necessario salvare "
"anche il proprio database SQL separatamente."
#: web/ejabberd_web_admin.erl:2041
msgid "Store binary backup:"
msgstr "Conservare un salvataggio binario:"
#: web/ejabberd_web_admin.erl:2045 web/ejabberd_web_admin.erl:2052
#: web/ejabberd_web_admin.erl:2060 web/ejabberd_web_admin.erl:2067
#: web/ejabberd_web_admin.erl:2074 web/ejabberd_web_admin.erl:2081
#: web/ejabberd_web_admin.erl:2088 web/ejabberd_web_admin.erl:2096
#: web/ejabberd_web_admin.erl:2103 web/ejabberd_web_admin.erl:2110
msgid "OK"
msgstr "OK"
#: web/ejabberd_web_admin.erl:2048
msgid "Restore binary backup immediately:"
msgstr "Recuperare un salvataggio binario adesso:"
#: web/ejabberd_web_admin.erl:2056
msgid ""
"Restore binary backup after next ejabberd restart (requires less memory):"
msgstr ""
"Recuperare un salvataggio binario dopo il prossimo riavvio di ejabberd "
"(necessita di meno memoria):"
#: web/ejabberd_web_admin.erl:2063
msgid "Store plain text backup:"
msgstr "Conservare un salvataggio come semplice testo:"
#: web/ejabberd_web_admin.erl:2070
msgid "Restore plain text backup immediately:"
msgstr "Recuperare un salvataggio come semplice testo adesso:"
#: web/ejabberd_web_admin.erl:2077
msgid "Import users data from a PIEFXIS file (XEP-0227):"
msgstr "Importare i dati utenti da un file PIEFXIS (XEP-0227):"
#: web/ejabberd_web_admin.erl:2084
msgid "Export data of all users in the server to PIEFXIS files (XEP-0227):"
msgstr ""
"Esportare i dati di tutti gli utenti nel server in file PIEFXIS (XEP-0227):"
#: web/ejabberd_web_admin.erl:2091
msgid "Export data of users in a host to PIEFXIS files (XEP-0227):"
msgstr "Esportare i dati degli utenti di un host in file PIEFXIS (XEP-0227):"
#: web/ejabberd_web_admin.erl:2099
msgid "Import user data from jabberd14 spool file:"
msgstr "Importare i dati utente da file di spool di jabberd14:"
#: web/ejabberd_web_admin.erl:2106
msgid "Import users data from jabberd14 spool directory:"
msgstr "Importare i dati utenti da directory di spool di jabberd14:"
#: web/ejabberd_web_admin.erl:2132
msgid "Listened Ports at "
msgstr "Porte in ascolto su "
#: web/ejabberd_web_admin.erl:2157
msgid "Modules at "
msgstr "Moduli su "
#: web/ejabberd_web_admin.erl:2183
msgid "Statistics of ~p"
msgstr "Statistiche di ~p"
#: web/ejabberd_web_admin.erl:2186
msgid "Uptime:"
msgstr "Tempo dall'avvio:"
#: web/ejabberd_web_admin.erl:2189
msgid "CPU Time:"
msgstr "Tempo CPU:"
#: web/ejabberd_web_admin.erl:2195
msgid "Transactions Committed:"
msgstr "Transazioni avvenute:"
#: web/ejabberd_web_admin.erl:2198
msgid "Transactions Aborted:"
msgstr "Transazioni abortite:"
#: web/ejabberd_web_admin.erl:2201
msgid "Transactions Restarted:"
msgstr "Transazioni riavviate:"
#: web/ejabberd_web_admin.erl:2204
msgid "Transactions Logged:"
msgstr "Transazioni con log:"
#: web/ejabberd_web_admin.erl:2246
msgid "Update "
msgstr "Aggiornare "
#: web/ejabberd_web_admin.erl:2254
msgid "Update plan"
msgstr "Piano di aggiornamento"
#: web/ejabberd_web_admin.erl:2255
msgid "Modified modules"
msgstr "Moduli modificati"
#: web/ejabberd_web_admin.erl:2256
msgid "Update script"
msgstr "Script di aggiornamento"
#: web/ejabberd_web_admin.erl:2257
msgid "Low level update script"
msgstr "Script di aggiornamento di basso livello"
#: web/ejabberd_web_admin.erl:2258
msgid "Script check"
msgstr "Verifica dello script"
#: web/ejabberd_web_admin.erl:2426
msgid "Port"
msgstr "Porta"
#: web/ejabberd_web_admin.erl:2427
msgid "IP"
msgstr "IP"
#: web/ejabberd_web_admin.erl:2428
msgid "Protocol"
msgstr "Protocollo"
#: web/ejabberd_web_admin.erl:2429 web/ejabberd_web_admin.erl:2556
msgid "Module"
msgstr "Modulo"
#: web/ejabberd_web_admin.erl:2430 web/ejabberd_web_admin.erl:2557
msgid "Options"
msgstr "Opzioni"
#: web/ejabberd_web_admin.erl:2450
msgid "Delete"
msgstr "Eliminare"
#: web/ejabberd_web_admin.erl:2579
msgid "Start"
msgstr "Avviare"
#: web/mod_register_web.erl:104
msgid "Your Jabber account was successfully created."
msgstr "La creazione del tuo account Jabber è andata a buon fine."
#: web/mod_register_web.erl:107
msgid "There was an error creating the account: "
msgstr "Si è verificato un errore nella creazione dell'account: "
#: web/mod_register_web.erl:115
msgid "Your Jabber account was successfully deleted."
msgstr "La cancellazione del tuo account Jabber è andata a buon fine."
#: web/mod_register_web.erl:118
msgid "There was an error deleting the account: "
msgstr "Si è verificato un errore nella cancellazione dell'account: "
#: web/mod_register_web.erl:128
msgid "The password of your Jabber account was successfully changed."
msgstr "Il cambio di password del tuo account Jabber è andato a buon fine."
#: web/mod_register_web.erl:131
msgid "There was an error changing the password: "
msgstr "Si è verificato un errore nel cambio di password: "
#: web/mod_register_web.erl:163 web/mod_register_web.erl:172
msgid "Jabber Account Registration"
msgstr "Registrazione account Jabber"
#: web/mod_register_web.erl:174 web/mod_register_web.erl:192
#: web/mod_register_web.erl:201
msgid "Register a Jabber account"
msgstr "Registra un account Jabber"
#: web/mod_register_web.erl:176 web/mod_register_web.erl:493
#: web/mod_register_web.erl:502
msgid "Unregister a Jabber account"
msgstr "Elimina un account Jabber"
#: web/mod_register_web.erl:203
msgid ""
"This page allows to create a Jabber account in this Jabber server. Your JID "
"(Jabber IDentifier) will be of the form: username@server. Please read "
"carefully the instructions to fill correctly the fields."
msgstr ""
"Questa pagina consente di creare un account Jabber in questo server Jabber. "
"Il tuo JID (Jabber IDentifier) avrà la forma: nome_utente@server. Leggi "
"attentamente le istruzioni per compilare i campi correttamente."
#: web/mod_register_web.erl:212 web/mod_register_web.erl:386
#: web/mod_register_web.erl:509
msgid "Username:"
msgstr "Nome utente:"
#: web/mod_register_web.erl:217
msgid "This is case insensitive: macbeth is the same that MacBeth and Macbeth."
msgstr ""
"Non fa differenza fra minuscolo e maiuscolo: macbeth, MacBeth e Macbeth si "
"equivalgono."
#: web/mod_register_web.erl:218
msgid "Characters not allowed:"
msgstr "Caratteri non consentiti:"
#: web/mod_register_web.erl:222 web/mod_register_web.erl:391
#: web/mod_register_web.erl:514
msgid "Server:"
msgstr "Server:"
#: web/mod_register_web.erl:232
msgid ""
"Don't tell your password to anybody, not even the administrators of the "
"Jabber server."
msgstr ""
"Non comunicare la tua password a nessuno, neppure agli amministratori del "
"server Jabber."
#: web/mod_register_web.erl:234
msgid "You can later change your password using a Jabber client."
msgstr "Potrai in seguito cambiare la password utilizzando un client Jabber."
#: web/mod_register_web.erl:235
msgid ""
"Some Jabber clients can store your password in your computer. Use that "
"feature only if you trust your computer is safe."
msgstr ""
"Alcuni client Jabber possono conservare la password nel tuo computer. "
"Utilizza tale funzione soltanto se ritieni che il tuo computer sia sicuro."
#: web/mod_register_web.erl:237
msgid ""
"Memorize your password, or write it in a paper placed in a safe place. In "
"Jabber there isn't an automated way to recover your password if you forget "
"it."
msgstr ""
"Memorizza la password, o scrivila su un foglio di carta da conservare in un "
"luogo sicuro. Jabber non prevede una modalità automatica per il recupero di "
"una password dimenticata."
#: web/mod_register_web.erl:242 web/mod_register_web.erl:406
msgid "Password Verification:"
msgstr "Verifica della password:"
#: web/mod_register_web.erl:250
msgid "Register"
msgstr "Registra"
#: web/mod_register_web.erl:396
msgid "Old Password:"
msgstr "Vecchia password:"
#: web/mod_register_web.erl:401
msgid "New Password:"
msgstr "Nuova password:"
#: web/mod_register_web.erl:504
msgid "This page allows to unregister a Jabber account in this Jabber server."
msgstr ""
"Questa pagina consente di eliminare un account Jabber da questo server "
"Jabber."
#: web/mod_register_web.erl:524
msgid "Unregister"
msgstr "Elimina"
#, fuzzy
#~ msgid "CAPTCHA test failed"
#~ msgstr "Il CAPTCHA è valido."
ejabberd-2.1.11/src/msgs/el.msg 0000664 0000000 0000000 00000120257 12240230175 013075 0 ustar {"Access Configuration","Διαμόρφωση Πρόσβασης"}.
{"Access Control List Configuration","Διαχείριση στις Λίστες Ελέγχου Πρόσβασης"}.
{"Access control lists","Λίστες Ελέγχου Πρόσβασης"}.
{"Access Control Lists","Λίστες Ελέγχου Πρόσβασης"}.
{"Access denied by service policy","Άρνηση πρόσβασης, λόγω τακτικής παροχής υπηρεσιών"}.
{"Access rules","Κανόνες Πρόσβασης"}.
{"Access Rules","Κανόνες Πρόσβασης"}.
{"Action on user","Eνέργεια για το χρήστη"}.
{"Add Jabber ID","Προσθήκη Jabber Ταυτότητας"}.
{"Add New","Προσθήκη νέου"}.
{"Add User","Προσθήκη Χρήστη"}.
{"Administration of ","Διαχείριση του"}.
{"Administration","Διαχείριση"}.
{"Administrator privileges required","Aπαιτούνται προνόμια διαχειριστή"}.
{"A friendly name for the node","Ένα φιλικό όνομα για τον κόμβο"}.
{"All activity","Όλες οι δραστηριότητες"}.
{"Allow this Jabber ID to subscribe to this pubsub node?","Επιτρέπετε σε αυτή την Jabber Ταυτότητα να εγγραφεί σε αυτό τον κόμβο Δημοσίευσης-Εγγραφής;"}.
{"Allow users to change the subject","Επιτρέψετε στους χρήστες να αλλάζουν το θέμα"}.
{"Allow users to query other users","Επιτρέπστε στους χρήστες να ερωτούν άλλους χρήστες"}.
{"Allow users to send invites","Επιτρέψετε στους χρήστες να αποστέλλουν προσκλήσεις"}.
{"Allow users to send private messages","Επιτρέψετε στους χρήστες να αποστέλλουν ιδιωτικά μηνύματα"}.
{"Allow visitors to change nickname","Επιτρέψετε στους επισκέπτες να αλλάζου ψευδώνυμο"}.
{"Allow visitors to send private messages to","Επιτρέψετε στους χρήστες να αποστέλλουν ιδιωτικά μηνύματα σε"}.
{"Allow visitors to send status text in presence updates","Επιτρέψτε στους επισκέπτες να αποστέλλουν κατάσταση στις ενημερώσεις παρουσίας"}.
{"Allow visitors to send voice requests","Επιτρέψτε στους επισκέπτες να στέλνουν αιτήματα φωνής"}.
{"All Users","Όλοι οι χρήστες"}.
{"Announcements","Ανακοινώσεις"}.
{"anyone","οποιοσδήποτε"}.
{"A password is required to enter this room","Απαιτείται κωδικός πρόσβασης για είσοδο σε αυτή την αίθουσα"}.
{"April","Απρίλιος"}.
{"August","Αύγουστος"}.
{"Backup Management","Διαχείριση Αντιγράφου Ασφαλείας"}.
{"Backup of ","Αντιγράφο Ασφαλείας του "}.
{"Backup to File at ","Αποθήκευση Αντιγράφου Ασφαλείας σε Αρχείο στο "}.
{"Backup","Αποθήκευση Αντιγράφου Ασφαλείας"}.
{"Bad format","Ακατάλληλη μορφή"}.
{"Birthday","Γενέθλια"}.
{"CAPTCHA web page","Ιστοσελίδα CAPTCHA "}.
{"Change Password","Αλλαγή κωδικού"}.
{"Change User Password","Αλλαγή Κωδικού Πρόσβασης Χρήστη"}.
{"Characters not allowed:","Χαρακτήρες δεν επιτρέπονται:"}.
{"Chatroom configuration modified","Διαμόρφωση Αίθουσaς σύνεδριασης τροποποιηθηκε"}.
{"Chatroom is created","Η αίθουσα σύνεδριασης δημιουργήθηκε"}.
{"Chatroom is destroyed","Η αίθουσα σύνεδριασης διαγράφηκε"}.
{"Chatroom is started","Η αίθουσα σύνεδριασης έχει ξεκινήσει"}.
{"Chatroom is stopped","Η αίθουσα σύνεδριασης έχει σταματήσει"}.
{"Chatrooms","Αίθουσες σύνεδριασης"}.
{"Choose a username and password to register with this server","Επιλέξτε ένα όνομα χρήστη και κωδικό πρόσβασης για να εγγραφείτε σε αυτό τον διακομιστή"}.
{"Choose modules to stop","Επιλέξτε modules για να σταματήσουν"}.
{"Choose storage type of tables","Επιλέξτε τύπο αποθήκευσης των πινάκων"}.
{"Choose whether to approve this entity's subscription.","Επιλέξτε αν θα εγκρίθεί η εγγραφή αυτής της οντότητας."}.
{"City","Πόλη"}.
{"Commands","Εντολές"}.
{"Conference room does not exist","Αίθουσα σύνεδριασης δεν υπάρχει"}.
{"Configuration of room ~s","Διαμόρφωση Αίθουσας σύνεδριασης ~s"}.
{"Configuration","Διαμόρφωση"}.
{"Connected Resources:","Συνδεδεμένοι Πόροι:"}.
{"Connections parameters","Παράμετροι Συνδέσης"}.
{"Country","Χώρα"}.
{"CPU Time:","Ώρα CPU:"}.
{"Database Tables at ","Πίνακες βάσης δεδομένων στο "}.
{"Database Tables Configuration at ","Διαμόρφωση Πίνακων βάσης δεδομένων στο "}.
{"Database","Βάση δεδομένων"}.
{"December","Δεκέμβριος"}.
{"Default users as participants","Προεπιλογη χρήστων ως συμμετέχοντες"}.
{"Delete message of the day on all hosts","Διαγράψτε το μήνυμα της ημέρας σε όλους τους κεντρικούς υπολογιστές"}.
{"Delete message of the day","Διαγράψτε το μήνυμα της ημέρας"}.
{"Delete Selected","Διαγραφή επιλεγμένων"}.
{"Delete User","Διαγραφή Χρήστη"}.
{"Delete","Διαγραφή"}.
{"Deliver event notifications","Κοινοποιήσεις παράδοσης"}.
{"Deliver payloads with event notifications","Κοινοποιήσεις με την παράδοση φορτίων"}.
{"Description:","Περιγραφή:"}.
{"Disc only copy","Αντίγραφο μόνο σε δίσκο"}.
{"Displayed Groups:","Εμφανίσμενες Ομάδες:"}.
{"Don't tell your password to anybody, not even the administrators of the Jabber server.","Μην πείτε τον κωδικό πρόσβασής σας σε κανέναν, ακόμη και στους διαχειριστές του διακομιστή Jabber."}.
{"Dump Backup to Text File at ","Αποθήκευση Αντιγράφου Ασφαλείας σε αρχείο κειμένου στο "}.
{"Dump to Text File","Αποθήκευση σε αρχείο κειμένου"}.
{"Edit Properties","Επεξεργασία ιδιοτήτων"}.
{"Either approve or decline the voice request.","Είτε εγκρίνετε ή απορρίψτε το αίτημα φωνής."}.
{"ejabberd IRC module","ejabberd IRC module"}.
{"ejabberd MUC module","ejabberd MUC module"}.
{"ejabberd Publish-Subscribe module","ejabberd module Δημοσίευσης-Εγγραφής"}.
{"ejabberd SOCKS5 Bytestreams module","ejabberd SOCKS5 Bytestreams module"}.
{"ejabberd vCard module","ejabberd vCard module"}.
{"ejabberd Web Admin","ejabberd Web Admin"}.
{"Elements","Στοιχεία"}.
{"Email","Email"}.
{"Enable logging","Ενεργοποίηση καταγραφής"}.
{"Encoding for server ~b","Κωδικοποίηση για διακομιστή ~b"}.
{"End User Session","Τερματισμός Συνεδρίας Χρήστη"}.
{"Enter list of {Module, [Options]}","Εισάγετε κατάλογο των (Module, [Επιλογές])"}.
{"Enter nickname you want to register","Πληκτρολογήστε το ψευδώνυμο που θέλετε να εγγραφείτε"}.
{"Enter path to backup file","Εισάγετε τοποθεσία αρχείου αντιγράφου ασφαλείας"}.
{"Enter path to jabberd14 spool dir","Εισάγετε κατάλογο αρχείων σειράς jabberd14"}.
{"Enter path to jabberd14 spool file","Εισάγετε τοποθεσία αρχείου σειράς jabberd14"}.
{"Enter path to text file","Εισάγετε Τοποθεσία Αρχείου Κειμένου"}.
{"Enter the text you see","Πληκτρολογήστε το κείμενο που βλέπετε"}.
{"Enter username and encodings you wish to use for connecting to IRC servers. Press 'Next' to get more fields to fill in. Press 'Complete' to save settings.","Πληκτρολογήστε το όνομα χρήστη και κωδικοποιήσεις που θέλετε να χρησιμοποιήσετε για τη σύνδεση με διακομιστές IRC. Πατήστε 'Next' για να πάρετε περισσότερα πεδία να συμπληρώσετε. Πατήστε 'Complete' για να αποθηκεύσετε ρυθμίσεις."}.
{"Enter username, encodings, ports and passwords you wish to use for connecting to IRC servers","Εισάγετε το όνομα χρήστη, κωδικοποιήσεις, τις θύρες και τους κωδικούς πρόσβασης που θέλετε να χρησιμοποιήσετε για σύνδεση με IRC διακομιστή"}.
{"Erlang Jabber Server","Erlang Jabber Διακομιστής"}.
{"Error","Σφάλμα"}.
{"Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef.net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}].","Παράδειγμα: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef.net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."}.
{"Exclude Jabber IDs from CAPTCHA challenge","Εξαίρεση από τις ταυτότητες Jabber, ή CAPTCHA πρόκληση"}.
{"Export data of all users in the server to PIEFXIS files (XEP-0227):","Εξαγωγή δεδομένων όλων των χρηστών του διακομιστή σε PIEFXIS αρχεία (XEP-0227):"}.
{"Export data of users in a host to PIEFXIS files (XEP-0227):","Εξαγωγή δεδομένων των χρηστών κεντρικού υπολογιστή σε PIEFXIS αρχεία (XEP-0227):"}.
{"Failed to extract JID from your voice request approval","Απέτυχε η εξαγωγή JID από την έγκριση του αιτήματος φωνής σας"}.
{"Family Name","Επώνυμο"}.
{"February","Φεβρουάριος"}.
{"Fill in fields to search for any matching Jabber User","Συμπληρώστε τα πεδία για να αναζητήσετε οποιαδήποτε ταιριάζοντα Jabber χρήστη"}.
{"Fill in the form to search for any matching Jabber User (Add * to the end of field to match substring)","Συμπληρώστε τη φόρμα για να αναζητήσετε οποιαδήποτε Jabber χρήστη που ταιριάζει (Προσθέστε * στο τέλος τού πεδίου για να ταιριάξει σε μεγαλύτερες γραμματοσηρές)"}.
{"Friday","Παρασκευή"}.
{"From ~s","Από ~s"}.
{"From","Από"}.
{"Full Name","Ονοματεπώνυμο"}.
{"Get Number of Online Users","Έκθεση αριθμού συνδεδεμένων χρηστών"}.
{"Get Number of Registered Users","Έκθεση αριθμού εγγεγραμμένων χρηστών"}.
{"Get User Last Login Time","Έκθεση Τελευταίας Ώρας Σύνδεσης Χρήστη"}.
{"Get User Password","Έκθεση Κωδικού Πρόσβασης Χρήστη"}.
{"Get User Statistics","Έκθεση Στατιστικών Χρήστη"}.
{"Grant voice to this person?","Παραχώρηση φωνής σε αυτό το άτομο;"}.
{"Groups","Ομάδες"}.
{"Group ","Ομάδα"}.
{"has been banned","έχει απαγορευθεί"}.
{"has been kicked because of an affiliation change","Έχει αποβληθεί λόγω αλλαγής υπαγωγής"}.
{"has been kicked because of a system shutdown","αποβλήθηκε λόγω τερματισμού συστήματος"}.
{"has been kicked because the room has been changed to members-only","αποβλήθηκε επειδή η αίθουσα αλλάξε γιά μέλη μόνο"}.
{"has been kicked","αποβλήθηκε "}.
{" has set the subject to: "," έχει θέσει το θέμα σε: "}.
{"Host","Κεντρικός Υπολογιστής"}.
{"If you don't see the CAPTCHA image here, visit the web page.","Εάν δεν βλέπετε την εικόνα CAPTCHA εδώ, επισκεφθείτε την ιστοσελίδα."}.
{"If you want to specify different ports, passwords, encodings for IRC servers, fill this list with values in format '{\"irc server\", \"encoding\", port, \"password\"}'. By default this service use \"~s\" encoding, port ~p, empty password.","Εάν θέλετε να καθορίσετε διαφορετικές θύρες, κωδικούς πρόσβασης, κωδικοποιήσεις για IRC διακομιστές, εισάγετε πληροφορίες στη μορφή '{\"irc διακομιστής\", \"κωδικοποιήσεις\", θύρα, \"κωδικός πρόσβασης\"}'. Προεπιλεγμενα αυτή η υπηρεσία χρησιμοποιεί \"~s\" κωδικοποιήση, θύρα ~p, κενό κωδικό πρόσβασης."}.
{"Import Directory","Εισαγωγή κατάλογου αρχείων"}.
{"Import File","Εισαγωγή αρχείων"}.
{"Import user data from jabberd14 spool file:","Εισαγωγή δεδομένων χρήστη από το αρχείο σειράς jabberd14:"}.
{"Import User from File at ","Εισαγωγή χρηστών από αρχείο στο "}.
{"Import users data from a PIEFXIS file (XEP-0227):","Εισαγωγή δεδομένων χρηστών από ένα αρχείο PIEFXIS (XEP-0227):"}.
{"Import users data from jabberd14 spool directory:","Εισαγωγή δεδομένων χρηστών από κατάλογο αρχείων σειράς jabberd14:"}.
{"Import Users from Dir at ","Εισαγωγή χρηστών από κατάλογο αρχείων στο "}.
{"Import Users From jabberd14 Spool Files","Εισαγωγή Χρηστών από αρχεία σειράς jabberd14"}.
{"Improper message type","Ακατάλληλο είδος μηνύματος"}.
{"Incorrect password","Εσφαλμένος κωδικός πρόσβασης"}.
{"Invalid affiliation: ~s","Άκυρη υπαγωγή: ~s"}.
{"Invalid role: ~s","Άκυρος ρόλο: ~s"}.
{"IP addresses","Διευθύνσεις IP"}.
{"IP","IP"}.
{"IRC channel (don't put the first #)","IRC κανάλι (μην τεθεί το πρώτο #)"}.
{"IRC server","Διακομιστής IRC"}.
{"IRC settings","IRC Ρυθμίσεις"}.
{"IRC Transport","IRC Διαβιβάσεις"}.
{"IRC username","IRC όνομα χρήστη"}.
{"IRC Username","IRC Όνομα χρήστη"}.
{"is now known as","είναι τώρα γνωστή ως"}.
{"It is not allowed to send private messages of type \"groupchat\"","Δεν επιτρέπεται να στείλει προσωπικά μηνύματα του τύπου \"groupchat\""}.
{"It is not allowed to send private messages to the conference","Δεν επιτρέπεται να στείλει προσωπικά μηνύματα για τη διάσκεψη"}.
{"It is not allowed to send private messages","Δεν επιτρέπεται η αποστολή προσωπικών μηνυμάτων"}.
{"Jabber Account Registration","Εγγραφή λογαριασμού Jabber"}.
{"Jabber ID ~s is invalid","Η Jabber Ταυτότητα ~s είναι άκυρη"}.
{"Jabber ID","Ταυτότητα Jabber"}.
{"January","Ιανουάριος"}.
{"Join IRC channel","Είσοδος στο IRC κανάλι"}.
{"joins the room","συνδέετε στην αίθουσα"}.
{"Join the IRC channel here.","Είσοδος στο κανάλι IRC εδώ."}.
{"Join the IRC channel in this Jabber ID: ~s","Είσοδος στο κανάλι IRC αυτής της Jabber Ταυτότητας: ~s"}.
{"July","Ιούλιος"}.
{"June","Ιούνιος"}.
{"Last Activity","Τελευταία Δραστηριότητα"}.
{"Last login","Τελευταία σύνδεση"}.
{"Last month","Περασμένο μήνα"}.
{"Last year","Πέρυσι"}.
{"leaves the room","εγκαταλείπει την αίθουσα"}.
{"Listened Ports at ","Παρακολουθούμενες Θύρες στο "}.
{"Listened Ports","Παρακολουθούμενες Θύρες"}.
{"List of modules to start","Λίστα των Module για Εκκίνηση"}.
{"Low level update script","Προγράμα ενημέρωσης χαμηλού επίπεδου "}.
{"Make participants list public","Κάντε κοινό τον κατάλογο συμμετεχόντων"}.
{"Make room CAPTCHA protected","Κάντε την αίθουσα CAPTCHA προστατεύονομενη"}.
{"Make room members-only","Κάντε την αίθουσα μόνο για μέλη"}.
{"Make room moderated","Κάντε την αίθουσα εποπτεύονομενη"}.
{"Make room password protected","Κάντε την αίθουσα προστατεύομενη με κωδικό πρόσβασης"}.
{"Make room persistent","Κάντε αίθουσα μόνιμη"}.
{"Make room public searchable","Κάντε την δημόσια αναζήτηση δυνατή για αυτή την αίθουσα"}.
{"March","Μάρτιος"}.
{"Maximum Number of Occupants","Μέγιστος αριθμός συμετεχόντων"}.
{"Max # of items to persist","Μέγιστος αριθμός μόνιμων στοιχείων"}.
{"Max payload size in bytes","Μέγιστο μέγεθος φορτίου σε bytes"}.
{"May","Μάιος"}.
{"Membership is required to enter this room","Απαιτείται αίτηση συμετοχής για είσοδο σε αυτή την αίθουσα"}.
{"Members:","Μέλη:"}.
{"Memorize your password, or write it in a paper placed in a safe place. In Jabber there isn't an automated way to recover your password if you forget it.","Απομνημονεύστε τον κωδικό πρόσβασής σας, ή γράψετε τον σε ένα χαρτί που είχε τοποθετηθεί σε ασφαλές μέρος. Στο Jabber δεν υπάρχει αυτοματοποιημένος τρόπος για να ανακτήσετε τον κωδικό σας αν τον ξεχάσετε."}.
{"Memory","Μνήμη"}.
{"Message body","Περιεχόμενο μηνυμάτως"}.
{"Middle Name","Πατρώνυμο"}.
{"Minimum interval between voice requests (in seconds)","Ελάχιστο χρονικό διάστημα μεταξύ αιτημάτων φωνής (σε δευτερόλεπτα)"}.
{"Moderator privileges required","Aπαιτούνται προνόμια συντονιστή"}.
{"moderators only","συντονιστές μόνο"}.
{"Modified modules","Τροποποιημένα modules"}.
{"Module","Module"}.
{"Modules at ","Modules στο "}.
{"Modules","Modules"}.
{"Monday","Δευτέρα"}.
{"Name:","Όνομα:"}.
{"Name","Όνομα"}.
{"Never","Ποτέ"}.
{"New Password:","Νέος κωδικός πρόσβασης:"}.
{"Nickname Registration at ","Εγγραφή με Ψευδώνυμο στο "}.
{"Nickname ~s does not exist in the room","Ψευδώνυμο ~s δεν υπάρχει σε αυτή την αίθουσα"}.
{"Nickname","Ψευδώνυμο"}.
{"No body provided for announce message","Δεν προμηθεύτικε περιεχόμενο ανακοινώσης"}.
{"nobody","κανείς"}.
{"No Data","Κανένα στοιχείο"}.
{"Node ID","Ταυτότητα Κόμβου"}.
{"Node not found","Κόμβος δεν βρέθηκε"}.
{"Nodes","Κόμβοι"}.
{"Node ","Κόμβος"}.
{"No limit","Χωρίς όριο"}.
{"None","Κανένα"}.
{"No resource provided","Δεν προμηθεύτικε πόρος"}.
{"Not Found","Δεν Βρέθηκε"}.
{"Notify subscribers when items are removed from the node","Ειδοποιηση στους συνδρομητές όταν αφαίρούντε στοιχεία από τον κόμβο"}.
{"Notify subscribers when the node configuration changes","Ειδοποιηση στους συνδρομητές όταν αλλάζει η διαμόρφωση κόμβου"}.
{"Notify subscribers when the node is deleted","Ειδοποιηση στους συνδρομητές όταν ο κόμβος διαγράφεται"}.
{"November","Νοέμβριος"}.
{"Number of occupants","Αριθμός συμετεχόντων"}.
{"Number of online users","Αριθμός συνδεδεμένων χρηστών"}.
{"Number of registered users","Αριθμός εγγεγραμμένων χρηστών"}.
{"October","Οκτώβριος"}.
{"Offline Messages:","Χωρίς Σύνδεση Μηνύματα:"}.
{"Offline Messages","Χωρίς Σύνδεση Μηνύματα"}.
{"OK","Όλλα Καλά"}.
{"Old Password:","Παλαιός κωδικός πρόσβασης:"}.
{"Online Users:","Online Χρήστες:"}.
{"Online Users","Συνδεμένοι χρήστες"}.
{"Online","Συνδεδεμένο"}.
{"Only deliver notifications to available users","Παράδωση κοινοποιήσεων μόνο σε διαθέσιμους χρήστες"}.
{"Only moderators and participants are allowed to change the subject in this room","Μόνο οι συντονιστές και οι συμμετέχοντες μπορούν να αλλάξουν το θέμα αυτής της αίθουσας"}.
{"Only moderators are allowed to change the subject in this room","Μόνο οι συντονιστές μπορούν να αλλάξουν το θέμα αυτής της αίθουσας"}.
{"Only moderators can approve voice requests","Μόνο οι συντονιστές μπορούν να εγκρίνουν τις αιτήσεις φωνής"}.
{"Only occupants are allowed to send messages to the conference","Μόνο οι συμμετέχωντες μπορούν να στέλνουν μηνύματα στο συνέδριο"}.
{"Only occupants are allowed to send queries to the conference","Μόνο οι συμετεχόντες μπορούν να στείλουν ερωτήματα στη διάσκεψη"}.
{"Only service administrators are allowed to send service messages","Μόνο οι διαχειριστές των υπηρεσιών επιτρέπεται να στείλουν υπηρεσιακά μηνύματα"}.
{"Options","Επιλογές"}.
{"Organization Name","Όνομα Οργανισμού"}.
{"Organization Unit","Μονάδα Οργανισμού"}.
{"Outgoing s2s Connections:","Εξερχόμενες S2S Συνδέσεις:"}.
{"Outgoing s2s Connections","Εξερχόμενες S2S Συνδέσεις"}.
{"Outgoing s2s Servers:","Εξερχόμενοι S2S διακομιστές:"}.
{"Owner privileges required","Aπαιτούνται προνόμια ιδιοκτήτη"}.
{"Packet","Πακέτο"}.
{"Password ~b","Κωδικός πρόσβασης ~b"}.
{"Password Verification:","Επαλήθευση κωδικού πρόσβασης:"}.
{"Password Verification","Επαλήθευση κωδικού πρόσβασης"}.
{"Password","Κωδικός Πρόσβασης"}.
{"Password:","Κωδικός πρόσβασης:"}.
{"Path to Dir","Τοποθεσία κατάλογου αρχείων"}.
{"Path to File","Τοποθεσία Αρχείου"}.
{"Pending","Εκκρεμεί"}.
{"Period: ","Περίοδος: "}.
{"Persist items to storage","Μονιμη αποθήκευση στοιχείων"}.
{"Ping","Πινγκ"}.
{"Please note that these options will only backup the builtin Mnesia database. If you are using the ODBC module, you also need to backup your SQL database separately.","Παρακαλώ σημειώστε ότι οι επιλογές αυτές θα αποθήκευσουν Αντιγράφο Ασφαλείας μόνο της ενσωματωμένης βάσης δεδομένων Mnesia. Εάν χρησιμοποιείτε το module ODBC, θα πρέπει επίσης να κάνετε χωριστά Αντιγράφο Ασφαλείας της SQL βάση δεδομένων σας ."}.
{"Please, wait for a while before sending new voice request","Παρακαλώ, περιμένετε για λίγο πριν την αποστολή νέου αιτήματος φωνής"}.
{"Pong","Πονγκ"}.
{"Port ~b","Θύρα ~b"}.
{"Port","Θύρα"}.
{"Present real Jabber IDs to","Παρούσιαση πραγματικών ταυτοτήτων Jabber σε"}.
{"private, ","ιδιωτικό,"}.
{"Protocol","Πρωτόκολλο"}.
{"Publish-Subscribe","Δημοσίευση-Εγγραφή"}.
{"PubSub subscriber request","Αίτηση συνδρομητή Δημοσίευσης-Εγγραφής"}.
{"Purge all items when the relevant publisher goes offline","Διαγραφή όλων των στοιχείων όταν ο σχετικός εκδότης αποσυνδέεται"}.
{"Queries to the conference members are not allowed in this room","Ερωτήματα πρώς τα μέλη της διασκέψεως δεν επιτρέπονται σε αυτήν την αίθουσα"}.
{"RAM and disc copy","Αντίγραφο μόνο σε RAM καί δίσκο"}.
{"RAM copy","Αντίγραφο σε RAM"}.
{"Raw","Ακατέργαστο"}.
{"Really delete message of the day?","Πραγματικά να διαγράψετε το μήνυμα της ημέρας;"}.
{"Recipient is not in the conference room","Παραλήπτης δεν είναι στην αίθουσα συνεδριάσεων"}.
{"Register a Jabber account","Καταχωρήστε έναν λογαριασμό Jabber"}.
{"Registered Users:","Εγγεγραμμένοι Χρήστες:"}.
{"Registered Users","Εγγεγραμμένοι Χρήστες"}.
{"Register","Καταχωρήστε"}.
{"Registration in mod_irc for ","Εγγραφή στο mod_irc για "}.
{"Remote copy","Απομεμακρυσμένο αντίγραφο"}.
{"Remove All Offline Messages","Αφαίρεση Όλων των Χωρίς Σύνδεση Μηνύματων"}.
{"Remove User","Αφαίρεση χρήστη"}.
{"Remove","Αφαίρεστε"}.
{"Replaced by new connection","Αντικαταστάθικε από νέα σύνδεση"}.
{"Resources","Πόροι"}.
{"Restart Service","Επανεκκίνηση Υπηρεσίας"}.
{"Restart","Επανεκκίνηση"}.
{"Restore Backup from File at ","Επαναφορά Αντιγράφου Ασφαλείας από αρχείο στο "}.
{"Restore binary backup after next ejabberd restart (requires less memory):","Επαναφορά δυαδικού αντιγράφου ασφαλείας μετά την επόμενη επανεκκίνηση του ejabberd (απαιτεί λιγότερη μνήμη):"}.
{"Restore binary backup immediately:","Επαναφορά δυαδικού αντιγράφου ασφαλείας αμέσως:"}.
{"Restore plain text backup immediately:","Επαναφορά αντιγράφου ασφαλείας από αρχείο κειμένου αμέσως:"}.
{"Restore","Επαναφορά Αντιγράφου Ασφαλείας"}.
{"Room Configuration","Διαμόρφωση Αίθουσας σύνεδριασης"}.
{"Room creation is denied by service policy","Άρνηση δημιουργίας αίθουσας , λόγω τακτικής παροχής υπηρεσιών"}.
{"Room description","Περιγραφή Αίθουσας"}.
{"Room Occupants","Συμετεχόντες Αίθουσας σύνεδριασης"}.
{"Room title","Τίτλος Αίθουσας "}.
{"Roster groups allowed to subscribe","Ομάδες Καταλόγου Επαφών μπορούν να εγγραφούν"}.
{"Roster of ","Καταλόγος Επαφών τού"}.
{"Roster size","Μέγεθος Καταλόγου Επαφών"}.
{"Roster","Καταλόγος Επαφών"}.
{"RPC Call Error","Σφάλμα RPC Κλήσης"}.
{"Running Nodes","Ενεργοί Κόμβοι"}.
{"~s access rule configuration","~s διαμόρφωση κανόνα πρόσβασης"}.
{"Saturday","Σάββατο"}.
{"Script check","Script ελέγχου"}.
{"Search Results for ","Αποτελέσματα αναζήτησης για "}.
{"Search users in ","Αναζήτηση χρηστών στο"}.
{"Send announcement to all online users on all hosts","Αποστολή ανακοίνωσης σε όλους τους συνδεδεμένους χρήστες σε όλους τους κεντρικούς υπολογιστές"}.
{"Send announcement to all online users","Αποστολή ανακοίνωσης σε όλους τους συνδεδεμένους χρήστες"}.
{"Send announcement to all users on all hosts","Αποστολή ανακοίνωσης σε όλους τους χρήστες σε όλους τους κεντρικούς υπολογιστές"}.
{"Send announcement to all users","Αποστολή ανακοίνωσης σε όλους τους χρήστες"}.
{"September","Σεπτέμβριος"}.
{"Server ~b","Διακομιστής ~b"}.
{"Server:","Διακομιστής:"}.
{"Set message of the day and send to online users","Ορίστε μήνυμα ημέρας και αποστολή στους συνδεδεμένους χρήστες"}.
{"Set message of the day on all hosts and send to online users","Ορίστε μήνυμα ημέρας και άμεση αποστολή στους συνδεδεμένους χρήστες σε όλους τους κεντρικούς υπολογιστές"}.
{"Shared Roster Groups","Κοινές Ομάδες Καταλόγων Επαφών"}.
{"Show Integral Table","Δείτε Ολοκληρωτικό Πίνακα"}.
{"Show Ordinary Table","Δείτε Κοινό Πίνακα"}.
{"Shut Down Service","Κλείσιμο Υπηρεσίας"}.
{"~s invites you to the room ~s","~s σας προσκαλεί στην αίθουσα ~s"}.
{"Some Jabber clients can store your password in your computer. Use that feature only if you trust your computer is safe.","Μερικοί πελάτες Jabber μπορεί να αποθηκεύσουν τον κωδικό πρόσβασής σας στον υπολογιστή σας. Χρησιμοποιήστε αυτό το χαρακτηριστικό μόνο εάν εμπιστεύεστε την ασφάλεια του υπολογιστή σας."}.
{"Specify the access model","Καθορίστε το μοντέλο πρόσβασης"}.
{"Specify the event message type","Καθορίστε τον τύπο μηνύματος συμβάντος"}.
{"Specify the publisher model","Καθορίστε το μοντέλο εκδότη"}.
{"~s's Offline Messages Queue","Η Σειρά Χωρίς Σύνδεση Μηνύματων τού ~s"}.
{"Start Modules at ","Εκκίνηση Modules στο "}.
{"Start Modules","Εκκίνηση Modules"}.
{"Start","Εκκίνηση"}.
{"Statistics of ~p","Στατιστικές του ~p"}.
{"Statistics","Στατιστικές"}.
{"Stop Modules at ","Παύση Modules στο "}.
{"Stop Modules","ΠαύσηModules"}.
{"Stopped Nodes","Σταματημένοι Κόμβοι"}.
{"Stop","Σταμάτημα"}.
{"Storage Type","Τύπος Αποθήκευσης"}.
{"Store binary backup:","Αποθηκεύση δυαδικού αντιγράφου ασφαλείας:"}.
{"Store plain text backup:","Αποθηκεύση αντιγράφου ασφαλείας σε αρχείο κειμένου:"}.
{"Subject","Θέμα"}.
{"Submitted","Υποβλήθηκε"}.
{"Submit","Υποβοβολή"}.
{"Subscriber Address","Διεύθυνση Συνδρομητή"}.
{"Subscription","Συνδρομή"}.
{"Sunday","Κυριακή"}.
{"That nickname is already in use by another occupant","Αυτό το ψευδώνυμο είναι ήδη σε χρήση από άλλον συμμετέχων"}.
{"That nickname is registered by another person","Αυτό το ψευδώνυμο είναι καταχωρημένο από άλλο πρόσωπο"}.
{"The CAPTCHA is valid.","Το CAPTCHA είναι έγκυρο."}.
{"The CAPTCHA verification has failed","Η επαλήθευση της εικόνας CAPTCHA απέτυχε"}.
{"The collections with which a node is affiliated","Οι συλλογές με την οποία είναι ένας κόμβος συνδέεται"}.
{"The password is too weak","Ο κωδικός πρόσβασης είναι πολύ ασθενές"}.
{"the password is","ο κωδικός πρόσβασης είναι"}.
{"The password of your Jabber account was successfully changed.","Ο κωδικός πρόσβασης του Jabber λογαριασμού σας έχει αλλάξει επιτυχώς."}.
{"There was an error changing the password: ","Υπήρξε ένα σφάλμα κατά την αλλαγή του κωδικού πρόσβασης:"}.
{"There was an error creating the account: ","Υπήρξε ένα σφάλμα κατά τη δημιουργία του λογαριασμού:"}.
{"There was an error deleting the account: ","Υπήρξε ένα σφάλμα κατά τη διαγραφή του λογαριασμού:"}.
{"This is case insensitive: macbeth is the same that MacBeth and Macbeth.","Ανεξαρτήτως με πεζά ή κεφαλαία: 'μιαλεξη' είναι το ίδιο με 'ΜιαΛέξη' και 'Μιαλέξη'."}.
{"This page allows to create a Jabber account in this Jabber server. Your JID (Jabber IDentifier) will be of the form: username@server. Please read carefully the instructions to fill correctly the fields.","Αυτή η σελίδα σας επιτρέπει να δημιουργήσετε ένα λογαριασμό Jabber σε αυτόν το διακομιστή Jabber. JID σας (Jabber Identifier) θα είναι της μορφής: όνομα_χρήστη@διακομιστής_Jabber. Παρακαλώ διαβάστε προσεκτικά τις οδηγίες για να συμπληρώσετε σωστά τα πεδία."}.
{"This page allows to unregister a Jabber account in this Jabber server.","Η σελίδα αυτή δίνει τη δυνατότητα να καταργήσετε την καταχώρηση ενός λογαριασμό Jabber σε αυτόν το διακομιστή Jabber."}.
{"This participant is kicked from the room because he sent an error message to another participant","Αυτός ο συμμετέχων αποβλήθηκε από την αίθουσα, επειδή έστειλε ένα μήνυμα σφάλματος σε άλλον συμμετέχων"}.
{"This participant is kicked from the room because he sent an error message","Αυτός ο συμμετέχων αποβλήθηκε από την αίθουσα, επειδή έστειλε ένα μήνυμα σφάλματος"}.
{"This participant is kicked from the room because he sent an error presence","Αυτός ο συμμετέχων αποβλήθηκε από την αίθουσα, επειδή έστειλε σφάλμα παρουσίας "}.
{"This room is not anonymous","Η αίθουσα αυτή δεν είναι ανώνυμη"}.
{"Thursday","Πέμπτη"}.
{"Time delay","Χρόνος καθυστέρησης"}.
{"Time","Χρόνος"}.
{"Too many CAPTCHA requests","Πάρα πολλά αιτήματα CAPTCHA"}.
{"To ~s","Πρώς ~s"}.
{"To","Πρώς"}.
{"Traffic rate limit is exceeded","Υπέρφορτωση"}.
{"Transactions Aborted:","Αποτυχημένες συναλλαγές:"}.
{"Transactions Committed:","Παραδοθείς συναλλαγές:"}.
{"Transactions Logged:","Καταγραμμένες συναλλαγές:"}.
{"Transactions Restarted:","Επανειλημμένες συναλλαγές:"}.
{"Tuesday","Τρίτη"}.
{"Unable to generate a CAPTCHA","Αδήνατο να δημιουργηθεί CAPTCHA"}.
{"Unauthorized","Χορίς Εξουσιοδότηση"}.
{"Unregister a Jabber account","Καταργήστε την εγγραφή ενός λογαριασμού Jabber"}.
{"Unregister","Καταργήση εγγραφής"}.
{"Update message of the day (don't send)","Ενημέρωση μηνύματως ημέρας (χωρίς άμεση αποστολή)"}.
{"Update message of the day on all hosts (don't send)","Ενημέρωση μηνύματως ημέρας σε όλους τους κεντρικούς υπολογιστές (χωρίς άμεση αποστολή)"}.
{"Update plan","Σχέδιο ενημέρωσης"}.
{"Update script","Προγράμα ενημέρωσης"}.
{"Update ","Ενημέρωση"}.
{"Update","Ενημέρωση"}.
{"Uptime:","Uptime:"}.
{"Use of STARTTLS required","Απαιτείται χρήση STARTTLS "}.
{"User JID","JID Χρήστη"}.
{"User Management","Διαχείριση χρηστών"}.
{"Username:","Όνομα χρήστη"}.
{"Users are not allowed to register accounts so quickly","Οι χρήστες δεν επιτρέπεται να εγγραφούν λογαριασμούς τόσο γρήγορα"}.
{"Users Last Activity","Τελευταία Δραστηριότητα Χρήστη"}.
{"Users","Χρήστες"}.
{"User ","Χρήστης"}.
{"User","Χρήστης"}.
{"Validate","Επαληθεύστε"}.
{"vCard User Search","vCard Αναζήτηση χρηστών"}.
{"Virtual Hosts","εικονικοί κεντρικοί υπολογιστές"}.
{"Visitors are not allowed to change their nicknames in this room","Οι επισκέπτες δεν επιτρέπεται να αλλάξουν τα ψευδώνυμα τους σε αυτή την αίθουσα"}.
{"Visitors are not allowed to send messages to all occupants","Οι επισκέπτες δεν επιτρέπεται να στείλουν μηνύματα σε όλους τους συμμετέχωντες"}.
{"Voice requests are disabled in this conference","Τα αιτήματα φωνής είναι απενεργοποιημένα, σε αυτό το συνέδριο"}.
{"Voice request","Αίτημα φωνής"}.
{"Wednesday","Τετάρτη"}.
{"When to send the last published item","Πότε να αποσταλθεί το τελευταίο στοιχείο που δημοσιεύθηκε"}.
{"Whether to allow subscriptions","Εάν επιτρέποντε συνδρομές"}.
{"You can later change your password using a Jabber client.","Μπορείτε αργότερα να αλλάξετε τον κωδικό πρόσβασής σας χρησιμοποιώντας έναν πελάτη Jabber."}.
{"You have been banned from this room","Σας έχει απαγορευθεί η είσοδος σε αυτή την αίθουσα"}.
{"You must fill in field \"Nickname\" in the form","Θα πρέπει να συμπληρώσετε το πεδίο \"Ψευδώνυμο\" στη φόρμα"}.
{"You need a client that supports x:data and CAPTCHA to register","Χρειάζεστε ένα x:data και CAPTCHA ικανό πελάτη για εγγραφή"}.
{"You need a client that supports x:data to register the nickname","Χρειάζεστε ένα x:data ικανό πελάτη για εγγραφή με ψευδώνυμο"}.
{"You need an x:data capable client to configure mod_irc settings","Χρειάζεστε ένα x:data ικανό πελάτη για να ρυθμίσετε το mod_irc"}.
{"You need an x:data capable client to configure room","Χρειάζεστε ένα x:data ικανό πελάτη για να ρυθμίσετε την αίθουσα "}.
{"You need an x:data capable client to search","Χρειάζεστε ένα x:data ικανό πελάτη για αναζήτηση"}.
{"Your active privacy list has denied the routing of this stanza.","Ο ενεργός κατάλογος απορρήτου, έχει αρνηθεί τη δρομολόγηση αυτής της στροφής (stanza)."}.
{"Your contact offline message queue is full. The message has been discarded.","Η μνήμη χωρίς σύνδεση μήνυματών είναι πλήρης. Το μήνυμα έχει απορριφθεί."}.
{"Your Jabber account was successfully created.","Ο Jabber λογαριασμός σας δημιουργήθηκε με επιτυχία."}.
{"Your Jabber account was successfully deleted.","Ο Jabber λογαριασμός σας διαγράφηκε με επιτυχία."}.
{"Your messages to ~s are being blocked. To unblock them, visit ~s","Τα μηνύματά σας πρως ~s είναι αποκλεισμένα. Για αποδεσμεύση, επισκεφθείτε ~s"}.
ejabberd-2.1.11/src/msgs/no.msg 0000664 0000000 0000000 00000064136 12240230175 013114 0 ustar {"Access Configuration","Tilgangskonfigurasjon"}.
{"Access Control List Configuration","Konfigurasjon for Tilgangskontroll lister"}.
{"Access Control Lists","Tilgangskontrollister"}.
{"Access control lists","Tilgangskontroll lister"}.
{"Access denied by service policy","Tilgang nektes på grunn av en tjeneste regel"}.
{"Access rules","Tilgangsregler"}.
{"Access Rules","Tilgangsregler"}.
{"Action on user","Handling på bruker"}.
{"Add Jabber ID","Legg til Jabber ID"}.
{"Add New","Legg til ny"}.
{"Add User","Legg til Bruker"}.
{"Administration","Administrasjon"}.
{"Administration of ","Administrasjon av "}.
{"Administrator privileges required","Administratorprivilegier kreves"}.
{"A friendly name for the node","Et vennlig navn for noden"}.
{"All activity","All aktivitet"}.
{"Allow this Jabber ID to subscribe to this pubsub node?","Tillat denne Jabber ID å abonnere på denne pubsub "}.
{"Allow users to change the subject","Tillat brukere å endre emne"}.
{"Allow users to query other users","Tillat brukere å sende forespørsel til andre brukere"}.
{"Allow users to send invites","Tillat brukere å sende invitasjoner"}.
{"Allow users to send private messages","Tillat brukere å sende private meldinger"}.
{"Allow visitors to change nickname","Tillat besøkende å endre kallenavn"}.
{"Allow visitors to send private messages to","Tillat brukere å sende private meldinger til"}.
{"Allow visitors to send status text in presence updates","Tillat besøkende å sende status tekst i "}.
{"Allow visitors to send voice requests","Tillat brukere å sende lyd forespørsler"}.
{"All Users","Alle Brukere"}.
{"Announcements","Kunngjøringer"}.
{"anyone","hvem som helst"}.
{"A password is required to enter this room","Et passord kreves for tilgang til samtalerommet"}.
{"April","april"}.
{"August","august"}.
{"Backup Management","Håndtere Sikkerehetskopiering"}.
{"Backup of ","Sikkerhetskopi av "}.
{"Backup","Sikkerhetskopier"}.
{"Backup to File at ","Sikkerhetskopiere til Fil på "}.
{"Bad format","Feil format"}.
{"Birthday","Fødselsdag"}.
{"CAPTCHA web page","CAPTCHA web side"}.
{"Change Password","Endre Passord"}.
{"Change User Password","Endre Brukers Passord"}.
{"Characters not allowed:","Ikke godtatte tegn:"}.
{"Chatroom configuration modified","Samtalerommets konfigurasjon er endret"}.
{"Chatroom is created","Samtalerom er opprettet"}.
{"Chatroom is destroyed","Samtalerom er fjernet"}.
{"Chatroom is started","Samtalerom er startet"}.
{"Chatroom is stopped","Samtalerom er stoppet"}.
{"Chatrooms","Samtalerom"}.
{"Choose a username and password to register with this server","Velg et brukernavn og passord for å registrere på "}.
{"Choose modules to stop","Velg hvilke moduler som skal stoppes"}.
{"Choose storage type of tables","Velg lagringstype for tabeller"}.
{"Choose whether to approve this entity's subscription.","Velg om du vil godkjenne denne eksistensens abonement"}.
{"City","By"}.
{"Commands","Kommandoer"}.
{"Conference room does not exist","Konferanserommet finnes ikke"}.
{"Configuration","Konfigurasjon"}.
{"Configuration of room ~s","Konfigurasjon for rom ~s"}.
{"Connected Resources:","Tilkoblede Ressurser:"}.
{"Connections parameters","Tilkoblings parametere"}.
{"Country","Land"}.
{"CPU Time:","CPU Tid:"}.
{"Database","Database"}.
{"Database Tables at ","Database Tabeller på "}.
{"Database Tables Configuration at ","Database Tabell Konfigurasjon på "}.
{"December","desember"}.
{"Default users as participants","Standard brukere som deltakere"}.
{"Delete message of the day on all hosts","Slett melding for dagen på alle maskiner"}.
{"Delete message of the day","Slett melding for dagen"}.
{"Delete Selected","Slett valgte"}.
{"Delete","Slett"}.
{"Delete User","Slett Bruker"}.
{"Deliver event notifications","Lever begivenhets kunngjøringer"}.
{"Deliver payloads with event notifications","Send innhold sammen med kunngjøringer"}.
{"Description:","Beskrivelse:"}.
{"Disc only copy","Kun diskkopi"}.
{"Displayed Groups:","Viste grupper:"}.
{"Don't tell your password to anybody, not even the administrators of the Jabber server.","Ikke fortell passordet til noen, ikke en gang til administratoren av Jabber serveren."}.
{"Dump Backup to Text File at ","Dump Sikkerhetskopi til Tekstfil på "}.
{"Dump to Text File","Dump til Tekstfil"}.
{"Edit Properties","Redigere Egenskaper"}.
{"Either approve or decline the voice request.","Enten godkjenn eller forby lyd forespørselen"}.
{"ejabberd IRC module","ejabberd IRC modul"}.
{"ejabberd MUC module","ejabberd MUC modul"}.
{"ejabberd Publish-Subscribe module","ejabberd Publish-Subscribe modul"}.
{"ejabberd SOCKS5 Bytestreams module","ejabberd SOCKS5 Bytestreams modul"}.
{"ejabberd vCard module","ejabberd vCard modul"}.
{"ejabberd Web Admin","ejabberd Web Admin"}.
{"Elements","Elementer"}.
{"Email","Epost"}.
{"Enable logging","Slå på logging"}.
{"Encoding for server ~b","Tekstkoding for server ~b"}.
{"End User Session","Avslutt Bruker Sesjon"}.
{"Enter list of {Module, [Options]}","Skriv inn en liste av {Module, [Options]}"}.
{"Enter nickname you want to register","Skriv inn kallenavnet du ønsker å registrere"}.
{"Enter path to backup file","Skriv inn sti til sikkerhetskopi filen"}.
{"Enter path to jabberd14 spool dir","Skriv inn sti til jabberd14 spoolkatalog"}.
{"Enter path to jabberd14 spool file","Skriv inn sti til jabberd14 spoolfil"}.
{"Enter path to text file","Skriv inn sti til tekstfil"}.
{"Enter the text you see","Skriv inn teksten du ser"}.
{"Enter username and encodings you wish to use for connecting to IRC servers. Press 'Next' to get more fields to fill in. Press 'Complete' to save settings.","Angi brukernavn og kodinger du ønsker å bruke for å koble til IRC servere. Trykk 'Neste' for å få flere felt for å fylle i. Trykk 'Fullfør' for å lagre innstillingene."}.
{"Enter username, encodings, ports and passwords you wish to use for connecting to IRC servers","Skriv brukernavn, tekstkoding, porter og passord du ønsker å bruke for tilkobling til IRC servere"}.
{"Erlang Jabber Server","Erlang Jabber Server"}.
{"Error","Feil"}.
{"Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef.net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}].","Eksempel: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef.net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."}.
{"Exclude Jabber IDs from CAPTCHA challenge","Ekskluder Jabber IDer fra CAPTCHA utfordring"}.
{"Export data of all users in the server to PIEFXIS files (XEP-0227):","Eksporter data om alle brukere i en server til PIEFXIS filer"}.
{"Export data of users in a host to PIEFXIS files (XEP-0227):","Eksporter data om alle brukere i en host til PIEFXIS filer (XEP-0227):"}.
{"Failed to extract JID from your voice request approval","Feilet i forsøk på å hente JID fra din lyd forespørsel godkjenning"}.
{"Family Name","Etternavn"}.
{"February","februar"}.
{"Fill in fields to search for any matching Jabber User","Fyll inn felt for å søke etter Jabber brukere"}.
{"Fill in the form to search for any matching Jabber User (Add * to the end of field to match substring)","Fyll inn skjemaet for å søke etter Jabber bruker (Legg til * på slutten av feltet for å treffe alle som starter slik)"}.
{"Friday","fredag"}.
{"From","Fra"}.
{"From ~s","Fra ~s"}.
{"Full Name","Fullstendig Navn"}.
{"Get Number of Online Users","Vis Antall Tilkoblede Brukere"}.
{"Get Number of Registered Users","Vis Antall Registrerte Brukere"}.
{"Get User Last Login Time","Vis Brukers Siste Påloggings Tidspunkt"}.
{"Get User Password","Hent Brukers Passord"}.
{"Get User Statistics","Vis Bruker Statistikk"}.
{"Grant voice to this person?","Gi lyd til denne personen?"}.
{"Group ","Gruppe "}.
{"Groups","Grupper"}.
{"has been banned","har blitt bannlyst"}.
{"has been kicked because of an affiliation change","har blitt kastet ut på grunn av en tilknytnings endring"}.
{"has been kicked because of a system shutdown","har blitt kastet ut på grunn av at systemet avslutter"}.
{"has been kicked because the room has been changed to members-only","har blitt kastet ut på grunn av at rommet er endret til kun-for-medlemmer"}.
{"has been kicked","har blitt kastet ut"}.
{" has set the subject to: "," har satt emnet til: "}.
{"Host","Maskin"}.
{"If you don't see the CAPTCHA image here, visit the web page.","Dersom du ikke ser CAPTCHA bilde her, besøk web siden. "}.
{"If you want to specify different ports, passwords, encodings for IRC servers, fill this list with values in format '{\"irc server\", \"encoding\", port, \"password\"}'. By default this service use \"~s\" encoding, port ~p, empty password.","Om du ønsker å spesifisere tekstkoding for IRC tjenere, fyller du ut en liste med verdier i formatet '{\"irc server\", \"encoding\", port, \"password\"}'. Denne tjenesten bruker \"~s\" som standard, port ~p, empty password."}.
{"Import Directory","Importer Katalog"}.
{"Import File","Importer File"}.
{"Import user data from jabberd14 spool file:","Importer bruker data fra jabberd14 spoolfiler:"}.
{"Import User from File at ","Importer Bruker fra Fil på "}.
{"Import users data from a PIEFXIS file (XEP-0227):","Importer brukeres data fra en PIEFXIS fil (XEP-0227):"}.
{"Import users data from jabberd14 spool directory:","Importer brukeres data fra jabberd14 spoolfil katalog:"}.
{"Import Users from Dir at ","Importer Brukere fra Katalog på "}.
{"Import Users From jabberd14 Spool Files","Importer Brukere Fra jabberd14 Spoolfiler"}.
{"Improper message type","Feilaktig meldingstype"}.
{"Incorrect password","Feil passord"}.
{"Invalid affiliation: ~s","Ugyldig rang: ~s"}.
{"Invalid role: ~s","Ugyldig rolle: ~s"}.
{"IP addresses","IP adresser"}.
{"IP","IP"}.
{"IRC channel (don't put the first #)","IRC kanal (ikke skriv den første #)"}.
{"IRC server","IRC server"}.
{"IRC settings","IRC instillinger"}.
{"IRC Transport","IRC Transport"}.
{"IRC username","IRC brukernavn"}.
{"IRC Username","IRC Brukernavn"}.
{"is now known as","er nå kjent som"}.
{"It is not allowed to send private messages","Det er ikke tillatt å sende private meldinger"}.
{"It is not allowed to send private messages of type \"groupchat\"","Det er ikke tillatt å sende private meldinger med typen "}.
{"It is not allowed to send private messages to the conference","Det er ikke tillatt å sende private meldinger til "}.
{"Jabber Account Registration","Jabber Konto Registrering"}.
{"Jabber ID","Jabber ID"}.
{"Jabber ID ~s is invalid","Ugyldig Jabber ID ~s"}.
{"January","januar"}.
{"Join IRC channel","Bli med i IRC kanal"}.
{"joins the room","kommer inn i rommet"}.
{"Join the IRC channel here.","Bli med i IRC kanalen her. "}.
{"Join the IRC channel in this Jabber ID: ~s","Bli med i IRC kanalen med denne Jabber ID: ~s"}.
{"July","juli"}.
{"June","juni"}.
{"Last Activity","Siste Aktivitet"}.
{"Last login","Siste pålogging"}.
{"Last month","Siste måned"}.
{"Last year","Siste året"}.
{"leaves the room","forlater rommet"}.
{"Listened Ports at ","Lyttende Porter på "}.
{"Listened Ports","Lyttende Porter"}.
{"List of modules to start","Liste over moduler som skal startes"}.
{"Low level update script","Lavnivå oppdaterings skript"}.
{"Make participants list public","Gjør deltakerlisten offentlig"}.
{"Make room CAPTCHA protected","Gjør rommet CAPTCHA beskyttet"}.
{"Make room members-only","Gjør rommet tilgjengelig kun for medlemmer"}.
{"Make room moderated","Gjør rommet redaktørstyrt"}.
{"Make room password protected","Passordbeskytt rommet"}.
{"Make room persistent","Gjør rommet permanent"}.
{"Make room public searchable","Gjør rommet offentlig søkbart"}.
{"March","mars"}.
{"Maximum Number of Occupants","Maksimum Antall Deltakere"}.
{"Max # of items to persist","Høyeste # elementer som skal lagres"}.
{"Max payload size in bytes","Største innholdsstørrelse i byte"}.
{"May","mai"}.
{"Membership is required to enter this room","Medlemskap kreves for tilgang til samtalerommet"}.
{"Members:","Medlemmer:"}.
{"Memorize your password, or write it in a paper placed in a safe place. In Jabber there isn't an automated way to recover your password if you forget it.","Husk passordet, eller skriv det ned på et papir lagret på et trygt sted. I Jabber er det ingen automatisert måte å gjenskape passordet om du glemmer det. "}.
{"Memory","Minne"}.
{"Message body","Meldingskropp"}.
{"Middle Name","Mellomnavn"}.
{"Minimum interval between voice requests (in seconds)","Minimums interval mellom lyd forespørsler (i sekunder)"}.
{"Moderator privileges required","Redaktørprivilegier kreves"}.
{"moderators only","kun for redaktører"}.
{"Modified modules","Endrede moduler"}.
{"Module","Modul"}.
{"Modules at ","Moduler på "}.
{"Modules","Moduler"}.
{"Monday","mandag"}.
{"Name:","Navn:"}.
{"Name","Navn"}.
{"Never","Aldri"}.
{"New Password:","Nytt Passord:"}.
{"Nickname","Kallenavn"}.
{"Nickname Registration at ","Registrer Kallenavn på "}.
{"Nickname ~s does not exist in the room","Kallenavn ~s eksisterer ikke i dette rommet"}.
{"nobody","ingen"}.
{"No body provided for announce message","Ingen meldingskropp gitt for kunngjørings melding"}.
{"No Data","Ingen Data"}.
{"Node ID","Node ID"}.
{"Node ","Node "}.
{"Node not found","Noden finnes ikke"}.
{"Nodes","Noder"}.
{"No limit","Ingen grense"}.
{"None","Ingen"}.
{"No resource provided","Ingen ressurs angitt"}.
{"Not Found","Finnes Ikke"}.
{"Notify subscribers when items are removed from the node","Informer abonnenter når elementer fjernes fra noden"}.
{"Notify subscribers when the node configuration changes","Informer abonnenter når node konfigurasjonen endres"}.
{"Notify subscribers when the node is deleted","Informer abonnenter når noden slettes"}.
{"November","november"}.
{"Number of occupants","Antall deltakere"}.
{"Number of online users","Antall tilkoblede brukere"}.
{"Number of registered users","Antall registrerte brukere"}.
{"October","oktober"}.
{"Offline Messages:","Frakoblede Meldinger:"}.
{"Offline Messages","Frakoblede Meldinger"}.
{"OK","OK"}.
{"Old Password:","Gammelt Passord:"}.
{"Online","Tilkoblet"}.
{"Online Users:","Tilkoblede Brukere:"}.
{"Online Users","Tilkoblede Brukere"}.
{"Only deliver notifications to available users","Send kunngjøringer bare til tilgjengelige brukere"}.
{"Only moderators and participants are allowed to change the subject in this room","Bare redaktører og deltakere kan endre emnet i dette rommet"}.
{"Only moderators are allowed to change the subject in this room","Bare ordstyrer tillates å endre emnet i dette rommet"}.
{"Only moderators can approve voice requests","Bare ordstyrer kan godkjenne lyd forespørsler"}.
{"Only occupants are allowed to send messages to the conference","Bare deltakere får sende normale meldinger til konferansen"}.
{"Only occupants are allowed to send queries to the conference","Bare deltakere er tillatt å sende forespørsler til "}.
{"Only service administrators are allowed to send service messages","Bare tjeneste administratorer er tilatt å sende tjeneste "}.
{"Options","Alternativer"}.
{"Organization Name","Organisasjonsnavn"}.
{"Organization Unit","Organisasjonsenhet"}.
{"Outgoing s2s Connections:","Utgående s2s Koblinger"}.
{"Outgoing s2s Connections","Utgående s2s Koblinger"}.
{"Outgoing s2s Servers:","Utgående s2s Tjenere"}.
{"Owner privileges required","Eierprivilegier kreves"}.
{"Packet","Pakke"}.
{"Password ~b","Passord ~b"}.
{"Password:","Passord:"}.
{"Password","Passord"}.
{"Password Verification:","Passord Bekreftelse:"}.
{"Password Verification","Passord Bekreftelse"}.
{"Path to Dir","Sti til Katalog"}.
{"Path to File","Sti til Fil"}.
{"Pending","Ventende"}.
{"Period: ","Periode: "}.
{"Persist items to storage","Vedvarende elementer til lagring"}.
{"Ping","Ping"}.
{"Please note that these options will only backup the builtin Mnesia database. If you are using the ODBC module, you also need to backup your SQL database separately.","Merk at disse valgene vil bare sikkerhetskopiere den innebygde Mnesia databasen. Dersom du bruker ODBC modulen må du også ta backup av din SQL database."}.
{"Please, wait for a while before sending new voice request","Vennligst vent en stund før du sender en ny lyd forespørsel"}.
{"Pong","Pong"}.
{"Port ~b","Port ~b"}.
{"Port","Port"}.
{"Present real Jabber IDs to","Presenter ekte Jabber IDer til"}.
{"private, ","privat, "}.
{"Protocol","Protokoll"}.
{"Publish-Subscribe","Publish-Subscribe"}.
{"PubSub subscriber request","PubSub abonements forespørsel"}.
{"Purge all items when the relevant publisher goes offline","Rydd alle elementer når den aktuelle utgiveren logger av"}.
{"Queries to the conference members are not allowed in this room","Forespørsler til konferanse medlemmene er ikke tillat i dette rommet"}.
{"RAM and disc copy","RAM og diskkopi"}.
{"RAM copy","RAM kopi"}.
{"Raw","Rå"}.
{"Really delete message of the day?","Virkelig slette melding for dagen?"}.
{"Recipient is not in the conference room","Mottakeren er ikke i konferanserommet"}.
{"Register a Jabber account","Registrer en Jabber konto"}.
{"Registered Users:","Registrerte Brukere:"}.
{"Registered Users","Registrerte Brukere"}.
{"Register","Registrer"}.
{"Registration in mod_irc for ","Registrering i mod_irc for "}.
{"Remote copy","Lagres ikke lokalt"}.
{"Remove All Offline Messages","Fjern Alle Frakoblede Meldinger"}.
{"Remove","Fjern"}.
{"Remove User","Fjern Bruker"}.
{"Replaced by new connection","Erstattet av en ny tilkobling"}.
{"Resources","Ressurser"}.
{"Restart Service","Start Tjeneste på Nytt"}.
{"Restart","Starte på nytt"}.
{"Restore Backup from File at ","Gjenopprett fra Sikkerhetsopifil på "}.
{"Restore binary backup after next ejabberd restart (requires less memory):","Gjenopprette binær backup etter neste ejabberd omstart (krever mindre minne):"}.
{"Restore binary backup immediately:","Gjenopprette binær backup umiddelbart:"}.
{"Restore","Gjenopprett"}.
{"Restore plain text backup immediately:","Gjenopprette rentekst sikkerhetskopi umiddelbart:"}.
{"Room Configuration","Rom Konfigurasjon"}.
{"Room creation is denied by service policy","Oppretting av rom nektes av en tjenste regel"}.
{"Room description","Rom beskrivelse"}.
{"Room Occupants","Samtalerom Deltakere"}.
{"Room title","Romtittel"}.
{"Roster groups allowed to subscribe","Kontaktliste grupper som tillates å abonnere"}.
{"Roster","Kontaktliste"}.
{"Roster of ","Kontaktliste for "}.
{"Roster size","Kontaktliste størrelse"}.
{"RPC Call Error","RPC Kall Feil"}.
{"Running Nodes","Kjørende Noder"}.
{"~s access rule configuration","tilgangsregel konfigurasjon for ~s"}.
{"Saturday","lørdag"}.
{"Script check","Skript sjekk"}.
{"Search Results for ","Søke Resultater for "}.
{"Search users in ","Søk etter brukere i "}.
{"Send announcement to all online users on all hosts","Send kunngjøring til alle tilkoblede brukere på alle "}.
{"Send announcement to all online users","Send kunngjøring alle tilkoblede brukere"}.
{"Send announcement to all users on all hosts","Send kunngjøring til alle brukere på alle maskiner"}.
{"Send announcement to all users","Send kunngjøring til alle brukere"}.
{"September","september"}.
{"Server ~b","Server ~b"}.
{"Server:","Server:"}.
{"Set message of the day and send to online users","Angi melding for dagen og send til tilkoblede brukere"}.
{"Set message of the day on all hosts and send to online users","Angi melding for dagen på alle maskiner og send til "}.
{"Shared Roster Groups","Delte Kontaktgrupper"}.
{"Show Integral Table","Vis Integral Tabell"}.
{"Show Ordinary Table","Vis Ordinær Tabell"}.
{"Shut Down Service","Avslutt Tjeneste"}.
{"~s invites you to the room ~s","~s inviterer deg til rommet ~s"}.
{"Some Jabber clients can store your password in your computer. Use that feature only if you trust your computer is safe.","Noen Jabber klienter kan lagre passordet på datamaskinen. Bruk bare den funksjonen dersom du er sikker på at maskinen er trygg."}.
{"Specify the access model","Spesifiser aksess modellen"}.
{"Specify the event message type","Spesifiser hendelsesbeskjed type"}.
{"Specify the publisher model","Angi publiserings modell"}.
{"~s's Offline Messages Queue","~ss kø for Frakoblede Meldinger"}.
{"Start Modules at ","Start Moduler på "}.
{"Start Modules","Start Moduler"}.
{"Start","Start"}.
{"Statistics of ~p","Statistikk for ~p"}.
{"Statistics","Statistikk"}.
{"Stop Modules at ","Stopp Moduler på "}.
{"Stop Modules","Stop Moduler"}.
{"Stopped Nodes","Stoppede Noder"}.
{"Stop","Stoppe"}.
{"Storage Type","Lagringstype"}.
{"Store binary backup:","Lagre binær sikkerhetskopi:"}.
{"Store plain text backup:","Lagre rentekst sikkerhetskopi:"}.
{"Subject","Tittel"}.
{"Submit","Send"}.
{"Submitted","Innsendt"}.
{"Subscriber Address","Abonnements Adresse"}.
{"Subscription","Abonnement"}.
{"Sunday","søndag"}.
{"That nickname is already in use by another occupant","Det kallenavnet er allerede i bruk av en annen deltaker"}.
{"That nickname is registered by another person","Det kallenavnet er registrert av en annen person"}.
{"The CAPTCHA is valid.","Captchaen er ikke gyldig"}.
{"The CAPTCHA verification has failed","CAPTCHA godkjenningen har feilet"}.
{"The collections with which a node is affiliated","Samlingene som en node er assosiert med"}.
{"the password is","passordet er"}.
{"The password is too weak","Passordet er for svakt"}.
{"The password of your Jabber account was successfully changed.","Passordet for din Jabber konto ble endret."}.
{"There was an error changing the password: ","En feil skjedde under endring av passordet:"}.
{"There was an error creating the account: ","En feil skjedde under oppretting av kontoen:"}.
{"There was an error deleting the account: ","En feil skjedde under sletting av kontoen: "}.
{"This is case insensitive: macbeth is the same that MacBeth and Macbeth.","Denne er ufølsom for små og store bokstaver: macbeth er det samme som MacBeth og Macbeth. "}.
{"This page allows to create a Jabber account in this Jabber server. Your JID (Jabber IDentifier) will be of the form: username@server. Please read carefully the instructions to fill correctly the fields.","Denne siden lar deg lage en Jabber konto på denne Jabber serveren. Din JID (Jabber ID) vil være i formatet: brukernavn@server. Vennligst les instruksjonene nøye slik at du fyller ut skjemaet riktig."}.
{"This page allows to unregister a Jabber account in this Jabber server.","Denne siden lar deg avregistrere en Jabber konto på denne Jabber serveren."}.
{"This participant is kicked from the room because he sent an error message","Denne deltakeren er kastet ut av rommet fordi han sendte en feilmelding"}.
{"This participant is kicked from the room because he sent an error message to another participant","Denne deltakeren er kastet ut av rommet fordi han sendte en feilmelding til en annen deltaker"}.
{"This participant is kicked from the room because he sent an error presence","Denne deltakeren er kastet ut av rommet fordi han sendte feil tilstederværelse"}.
{"This room is not anonymous","Dette rommet er ikke anonymt"}.
{"Thursday","torsdag"}.
{"Time delay","Tids forsinkelse"}.
{"Time","Tid"}.
{"Too many CAPTCHA requests","For mange CAPTCHA forespørsler"}.
{"To ~s","Til ~s"}.
{"To","Til"}.
{"Traffic rate limit is exceeded","Trafikkmengde grense overskredet"}.
{"Transactions Aborted:","Avbrutte Transasksjoner:"}.
{"Transactions Committed:","Sendte Transaksjoner:"}.
{"Transactions Logged:","Loggede Transasksjoner:"}.
{"Transactions Restarted:","Omstartede Transasksjoner:"}.
{"Tuesday","tirsdag"}.
{"Unable to generate a CAPTCHA","Umulig å generere en CAPTCHA"}.
{"Unauthorized","Uautorisert"}.
{"Unregister a Jabber account","Avregistrer en Jabber konto"}.
{"Unregister","Avregistrer"}.
{"Update message of the day (don't send)","Oppdater melding for dagen (ikke send)"}.
{"Update message of the day on all hosts (don't send)","Oppdater melding for dagen på alle maskiner (ikke send)"}.
{"Update ","Oppdater "}.
{"Update","Oppdatere"}.
{"Update plan","Oppdaterings plan"}.
{"Update script","Oppdaterings skript"}.
{"Uptime:","Oppetid:"}.
{"Use of STARTTLS required","Bruk av STARTTLS kreves"}.
{"User ","Bruker "}.
{"User","Bruker"}.
{"User JID","Bruker JID"}.
{"User Management","Bruker Behandling"}.
{"Username:","Brukernavn:"}.
{"Users are not allowed to register accounts so quickly","Brukere får ikke lov til registrere kontoer så fort"}.
{"Users","Brukere"}.
{"Users Last Activity","Brukers Siste Aktivitet"}.
{"Validate","Bekrefte gyldighet"}.
{"vCard User Search","vCard Bruker Søk"}.
{"Virtual Hosts","Virtuella Maskiner"}.
{"Visitors are not allowed to change their nicknames in this room","Besøkende får ikke lov å endre kallenavn i dette "}.
{"Visitors are not allowed to send messages to all occupants","Besøkende får ikke sende meldinger til alle deltakere"}.
{"Voice request","Lyd forespørsel"}.
{"Voice requests are disabled in this conference","Lyd forespørsler er blokkert i denne konferansen"}.
{"Wednesday","onsdag"}.
{"When to send the last published item","Når skal siste publiserte artikkel sendes"}.
{"Whether to allow subscriptions","Om man skal tillate abonnenter"}.
{"You can later change your password using a Jabber client.","Du kan når som helst endre passordet via en Jabber klient."}.
{"You have been banned from this room","Du har blitt bannlyst i dette rommet."}.
{"You must fill in field \"Nickname\" in the form","Du må fylle inn feltet \"Nickname\" i skjemaet"}.
{"You need a client that supports x:data and CAPTCHA to register","Du trenger en klient som støtter x:data og CAPTCHA for registrering "}.
{"You need a client that supports x:data to register the nickname","Du trenger en klient som støtter x:data for å registrere kallenavnet"}.
{"You need an x:data capable client to configure mod_irc settings","Du trenger en x:data kompatibel klient for å konfigurere mod_irc instillinger"}.
{"You need an x:data capable client to configure room","Du trenger en klient som støtter x:data for å "}.
{"You need an x:data capable client to search","Du tregner en klient som støtter x:data for å kunne "}.
{"Your active privacy list has denied the routing of this stanza.","Din aktive privat liste har blokkert rutingen av denne strofen."}.
{"Your contact offline message queue is full. The message has been discarded.","Kontaktens frakoblede meldingskø er full. Meldingen har blitt kassert."}.
{"Your Jabber account was successfully created.","Din Jabber konto ble opprettet"}.
{"Your Jabber account was successfully deleted.","Dni Jabber konto er blitt sltettet."}.
{"Your messages to ~s are being blocked. To unblock them, visit ~s","Dine meldinger til ~s blir blokkert. For å åpne igjen, besøk ~s"}.
ejabberd-2.1.11/src/msgs/pl.po 0000664 0000000 0000000 00000155347 12240230175 012750 0 ustar msgid ""
msgstr ""
"Project-Id-Version: 2.1.0-alpha\n"
"POT-Creation-Date: \n"
"PO-Revision-Date: \n"
"Last-Translator: Zbyszek Żółkiewski \n"
"Language-Team: \n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Language: Polish (polski)\n"
"X-Additional-Translator: Janusz B. Wiśniewski\n"
"X-Additional-Translator: Marcin Owsiany\n"
"X-Additional-Translator: Andrzej Smyk\n"
"X-Additional-Translator: Mateusz Gajewski\n"
#: ejabberd_c2s.erl:424 ejabberd_c2s.erl:727
msgid "Use of STARTTLS required"
msgstr "Wymagane jest użycie STARTTLS"
#: ejabberd_c2s.erl:503
msgid "No resource provided"
msgstr "Nie podano zasobu"
#: ejabberd_c2s.erl:1197
msgid "Replaced by new connection"
msgstr "Połączenie zostało zastąpione"
#: ejabberd_c2s.erl:1885
msgid "Your active privacy list has denied the routing of this stanza."
msgstr "Aktualna lista prywatności zabrania przesyłania tej stanzy"
#: ejabberd_captcha.erl:96 ejabberd_captcha.erl:152 ejabberd_captcha.erl:178
msgid "Enter the text you see"
msgstr "Przepisz tekst z obrazka"
#: ejabberd_captcha.erl:101
msgid "Your messages to ~s are being blocked. To unblock them, visit ~s"
msgstr "Twoje wiadomości do ~s są blokowane. Aby je odblokować, odwiedź ~s"
#: ejabberd_captcha.erl:134
msgid "If you don't see the CAPTCHA image here, visit the web page."
msgstr "Jeśli nie widzisz obrazka CAPTCHA, odwiedź stronę internetową."
#: ejabberd_captcha.erl:146
msgid "CAPTCHA web page"
msgstr "Strona internetowa CAPTCHA"
#: ejabberd_captcha.erl:307
msgid "The CAPTCHA is valid."
msgstr "Captcha jest poprawna."
#: mod_adhoc.erl:95 mod_adhoc.erl:125 mod_adhoc.erl:143 mod_adhoc.erl:161
msgid "Commands"
msgstr "Polecenia"
#: mod_adhoc.erl:149 mod_adhoc.erl:243
msgid "Ping"
msgstr "Ping"
#: mod_adhoc.erl:260
msgid "Pong"
msgstr "Pong"
#: mod_announce.erl:507 mod_announce_odbc.erl:499
msgid "Really delete message of the day?"
msgstr "Na pewno usunąć wiadomość dnia?"
#: mod_announce.erl:515 mod_announce_odbc.erl:507 mod_configure.erl:1083
#: mod_configure.erl:1128
msgid "Subject"
msgstr "Temat"
#: mod_announce.erl:520 mod_announce_odbc.erl:512 mod_configure.erl:1088
#: mod_configure.erl:1133
msgid "Message body"
msgstr "Treść wiadomości"
#: mod_announce.erl:600 mod_announce_odbc.erl:592
msgid "No body provided for announce message"
msgstr "Brak treści powiadomienia"
#: mod_announce.erl:635 mod_announce_odbc.erl:627
msgid "Announcements"
msgstr "Powiadomienia"
#: mod_announce.erl:637 mod_announce_odbc.erl:629
msgid "Send announcement to all users"
msgstr "Wyślij powiadomienie do wszystkich użytkowników"
#: mod_announce.erl:639 mod_announce_odbc.erl:631
msgid "Send announcement to all users on all hosts"
msgstr "Wyślij powiadomienie do wszystkich użytkowników na wszystkich hostach"
#: mod_announce.erl:641 mod_announce_odbc.erl:633
msgid "Send announcement to all online users"
msgstr "Wyślij powiadomienie do wszystkich zalogowanych użytkowników"
#: mod_announce.erl:643 mod_announce_odbc.erl:635 mod_configure.erl:1078
#: mod_configure.erl:1123
msgid "Send announcement to all online users on all hosts"
msgstr ""
"Wyślij powiadomienie do wszystkich zalogowanych użytkowników na wszystkich "
"hostach"
#: mod_announce.erl:645 mod_announce_odbc.erl:637
msgid "Set message of the day and send to online users"
msgstr "Wyślij wiadomość dnia do wszystkich zalogowanych użytkowników"
#: mod_announce.erl:647 mod_announce_odbc.erl:639
msgid "Set message of the day on all hosts and send to online users"
msgstr ""
"Ustaw wiadomość dnia dla wszystkich hostów i wyślij do zalogowanych "
"uzytkowników"
#: mod_announce.erl:649 mod_announce_odbc.erl:641
msgid "Update message of the day (don't send)"
msgstr "Aktualizuj wiadomość dnia (bez wysyłania)"
#: mod_announce.erl:651 mod_announce_odbc.erl:643
msgid "Update message of the day on all hosts (don't send)"
msgstr "Aktualizuj wiadomość dnia na wszystkich hostach (bez wysyłania)"
#: mod_announce.erl:653 mod_announce_odbc.erl:645
msgid "Delete message of the day"
msgstr "Usuń wiadomość dnia"
#: mod_announce.erl:655 mod_announce_odbc.erl:647
msgid "Delete message of the day on all hosts"
msgstr "Usuń wiadomość dnia ze wszystkich hostów"
#: mod_configure.erl:114 mod_configure.erl:274 mod_configure.erl:296
#: mod_configure.erl:498
msgid "Configuration"
msgstr "Konfiguracja"
#: mod_configure.erl:125 mod_configure.erl:576 web/ejabberd_web_admin.erl:1936
msgid "Database"
msgstr "Baza danych"
#: mod_configure.erl:127 mod_configure.erl:595
msgid "Start Modules"
msgstr "Uruchom moduły"
#: mod_configure.erl:129 mod_configure.erl:596
msgid "Stop Modules"
msgstr "Zatrzymaj moduły"
#: mod_configure.erl:131 mod_configure.erl:604 web/ejabberd_web_admin.erl:1937
msgid "Backup"
msgstr "Wykonaj kopie"
#: mod_configure.erl:133 mod_configure.erl:605
msgid "Restore"
msgstr "Przywróć z kopii"
#: mod_configure.erl:135 mod_configure.erl:606
msgid "Dump to Text File"
msgstr "Wykonaj kopie do pliku tekstowego"
#: mod_configure.erl:137 mod_configure.erl:615
msgid "Import File"
msgstr "Importuj plik"
#: mod_configure.erl:139 mod_configure.erl:616
msgid "Import Directory"
msgstr "Importuj katalog"
#: mod_configure.erl:141 mod_configure.erl:581 mod_configure.erl:1057
msgid "Restart Service"
msgstr "Restart usługi"
#: mod_configure.erl:143 mod_configure.erl:582 mod_configure.erl:1102
msgid "Shut Down Service"
msgstr "Wyłącz usługę"
#: mod_configure.erl:145 mod_configure.erl:518 mod_configure.erl:1197
#: web/ejabberd_web_admin.erl:1527
msgid "Add User"
msgstr "Dodaj użytkownika"
#: mod_configure.erl:147 mod_configure.erl:519 mod_configure.erl:1219
msgid "Delete User"
msgstr "Usuń użytkownika"
#: mod_configure.erl:149 mod_configure.erl:520 mod_configure.erl:1231
msgid "End User Session"
msgstr "Zakończ sesję uzytkownika"
#: mod_configure.erl:151 mod_configure.erl:521 mod_configure.erl:1243
#: mod_configure.erl:1255
msgid "Get User Password"
msgstr "Pobierz hasło użytkownika"
#: mod_configure.erl:153 mod_configure.erl:522
msgid "Change User Password"
msgstr "Zmień hasło użytkownika"
#: mod_configure.erl:155 mod_configure.erl:523 mod_configure.erl:1272
msgid "Get User Last Login Time"
msgstr "Pokaż czas ostatniego zalogowania uzytkownika"
#: mod_configure.erl:157 mod_configure.erl:524 mod_configure.erl:1284
msgid "Get User Statistics"
msgstr "Pobierz statystyki użytkownika"
#: mod_configure.erl:159 mod_configure.erl:525
msgid "Get Number of Registered Users"
msgstr "Pokaż liczbę zarejestrowanych użytkowników"
#: mod_configure.erl:161 mod_configure.erl:526
msgid "Get Number of Online Users"
msgstr "Pokaż liczbę zalogowanych użytkowników"
#: mod_configure.erl:163 mod_configure.erl:509 web/ejabberd_web_admin.erl:831
#: web/ejabberd_web_admin.erl:872
msgid "Access Control Lists"
msgstr "Lista dostępowa"
#: mod_configure.erl:165 mod_configure.erl:510 web/ejabberd_web_admin.erl:940
#: web/ejabberd_web_admin.erl:976
msgid "Access Rules"
msgstr "Zasady dostępu"
#: mod_configure.erl:297 mod_configure.erl:499
msgid "User Management"
msgstr "Zarządzanie użytkownikami"
#: mod_configure.erl:500 web/ejabberd_web_admin.erl:1058
#: web/ejabberd_web_admin.erl:1462
msgid "Online Users"
msgstr "Użytkownicy zalogowani"
#: mod_configure.erl:501
msgid "All Users"
msgstr "Wszyscy użytkownicy"
#: mod_configure.erl:502
msgid "Outgoing s2s Connections"
msgstr "Wychodzące połączenia s2s"
#: mod_configure.erl:503 web/ejabberd_web_admin.erl:1907
msgid "Running Nodes"
msgstr "Uruchomione węzły"
#: mod_configure.erl:504 web/ejabberd_web_admin.erl:1909
msgid "Stopped Nodes"
msgstr "Zatrzymane węzły"
#: mod_configure.erl:577 mod_configure.erl:587 web/ejabberd_web_admin.erl:1953
msgid "Modules"
msgstr "Moduły"
#: mod_configure.erl:578
msgid "Backup Management"
msgstr "Zarządzanie kopiami zapasowymi"
#: mod_configure.erl:579
msgid "Import Users From jabberd14 Spool Files"
msgstr "Importuj użytkowników z plików roboczych serwera jabberd14"
#: mod_configure.erl:699
msgid "To ~s"
msgstr "Do ~s"
#: mod_configure.erl:717
msgid "From ~s"
msgstr "Od ~s"
#: mod_configure.erl:913
msgid "Database Tables Configuration at "
msgstr "Konfiguracja tabel bazy na "
#: mod_configure.erl:918
msgid "Choose storage type of tables"
msgstr "Wybierz typ bazy dla tablel"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "Disc only copy"
msgstr "Kopia tylko na dysku"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "RAM and disc copy"
msgstr "Kopia na dysku i w pamięci RAM"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "RAM copy"
msgstr "Kopia w pamięci RAM"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "Remote copy"
msgstr "Kopia zdalna"
#: mod_configure.erl:950
msgid "Stop Modules at "
msgstr "Zatrzymaj moduły na "
#: mod_configure.erl:954
msgid "Choose modules to stop"
msgstr "Wybierz moduły do zatrzymania"
#: mod_configure.erl:969
msgid "Start Modules at "
msgstr "Uruchom moduły na "
#: mod_configure.erl:973
msgid "Enter list of {Module, [Options]}"
msgstr "Wprowadź listę {Moduł, [Opcje]}"
#: mod_configure.erl:974
msgid "List of modules to start"
msgstr "Lista modułów do uruchomienia"
#: mod_configure.erl:983
msgid "Backup to File at "
msgstr "Zapisz kopię w pliku na "
#: mod_configure.erl:987 mod_configure.erl:1001
msgid "Enter path to backup file"
msgstr "Wprowadź scieżkę do pliku kopii zapasowej"
#: mod_configure.erl:988 mod_configure.erl:1002 mod_configure.erl:1016
#: mod_configure.erl:1030
msgid "Path to File"
msgstr "Scieżka do pliku"
#: mod_configure.erl:997
msgid "Restore Backup from File at "
msgstr "Odtwórz bazę danych z kopii zapasowej na "
#: mod_configure.erl:1011
msgid "Dump Backup to Text File at "
msgstr "Zapisz kopię zapasową w pliku tekstowym na "
#: mod_configure.erl:1015
msgid "Enter path to text file"
msgstr "Wprowadź scieżkę do pliku tekstowego"
#: mod_configure.erl:1025
msgid "Import User from File at "
msgstr "Importuj użytkownika z pliku na "
#: mod_configure.erl:1029
msgid "Enter path to jabberd14 spool file"
msgstr "Wprowadź ścieżkę do roboczego pliku serwera jabberd14"
#: mod_configure.erl:1039
msgid "Import Users from Dir at "
msgstr "Importuj użytkowników z katalogu na "
#: mod_configure.erl:1043
msgid "Enter path to jabberd14 spool dir"
msgstr "Wprowadź ścieżkę do roboczego katalogu serwera jabberd14"
#: mod_configure.erl:1044
msgid "Path to Dir"
msgstr "Ścieżka do katalogu"
#: mod_configure.erl:1060 mod_configure.erl:1105
msgid "Time delay"
msgstr "Opóźnienie"
#: mod_configure.erl:1143
msgid "Access Control List Configuration"
msgstr "Konfiguracja listy dostępowej"
#: mod_configure.erl:1147
msgid "Access control lists"
msgstr "Listy dostępowe"
#: mod_configure.erl:1171
msgid "Access Configuration"
msgstr "Konfiguracja dostępu"
#: mod_configure.erl:1175
msgid "Access rules"
msgstr "Reguły dostępu"
#: mod_configure.erl:1200 mod_configure.erl:1222 mod_configure.erl:1234
#: mod_configure.erl:1246 mod_configure.erl:1258 mod_configure.erl:1275
#: mod_configure.erl:1287 mod_configure.erl:1650 mod_configure.erl:1700
#: mod_configure.erl:1721 mod_roster.erl:943 mod_roster_odbc.erl:1060
#: mod_vcard.erl:472 mod_vcard_ldap.erl:554 mod_vcard_odbc.erl:448
msgid "Jabber ID"
msgstr "Jabber ID"
#: mod_configure.erl:1205 mod_configure.erl:1263 mod_configure.erl:1651
#: mod_configure.erl:1863 mod_muc/mod_muc_room.erl:3224 mod_register.erl:235
#: web/ejabberd_web_admin.erl:1520
msgid "Password"
msgstr "Hasło"
#: mod_configure.erl:1210
msgid "Password Verification"
msgstr "Weryfikacja hasła"
#: mod_configure.erl:1301
msgid "Number of registered users"
msgstr "Liczba zarejestrowanych użytkowników"
#: mod_configure.erl:1315
msgid "Number of online users"
msgstr "Liczba zalogowanych użytkowników"
#: mod_configure.erl:1682 web/ejabberd_web_admin.erl:1588
#: web/ejabberd_web_admin.erl:1743
msgid "Never"
msgstr "Nigdy"
#: mod_configure.erl:1696 web/ejabberd_web_admin.erl:1601
#: web/ejabberd_web_admin.erl:1756
msgid "Online"
msgstr "Dostępny"
#: mod_configure.erl:1701
msgid "Last login"
msgstr "Ostatnie logowanie"
#: mod_configure.erl:1722
msgid "Roster size"
msgstr "Rozmiar listy kontaktów"
#: mod_configure.erl:1723
msgid "IP addresses"
msgstr "Adresy IP"
#: mod_configure.erl:1724
msgid "Resources"
msgstr "Zasoby"
#: mod_configure.erl:1850
msgid "Administration of "
msgstr "Zarządzanie "
#: mod_configure.erl:1853
msgid "Action on user"
msgstr "Wykonaj na użytkowniku"
#: mod_configure.erl:1857
msgid "Edit Properties"
msgstr "Edytuj właściwości"
#: mod_configure.erl:1860 web/ejabberd_web_admin.erl:1769
msgid "Remove User"
msgstr "Usuń użytkownika"
#: mod_irc/mod_irc.erl:201 mod_irc/mod_irc_odbc.erl:196
#: mod_muc/mod_muc.erl:336 mod_muc/mod_muc_odbc.erl:342
msgid "Access denied by service policy"
msgstr "Dostęp zabroniony zgodnie z zasadami usługi"
#: mod_irc/mod_irc.erl:401 mod_irc/mod_irc_odbc.erl:398
msgid "IRC Transport"
msgstr "Transport IRC"
#: mod_irc/mod_irc.erl:428 mod_irc/mod_irc_odbc.erl:425
msgid "ejabberd IRC module"
msgstr "Moduł IRC ejabberd"
#: mod_irc/mod_irc.erl:559 mod_irc/mod_irc_odbc.erl:568
msgid "You need an x:data capable client to configure mod_irc settings"
msgstr "Potrzebujesz klienta obsługującego x:data aby skonfigurować mod_irc"
#: mod_irc/mod_irc.erl:566 mod_irc/mod_irc_odbc.erl:575
msgid "Registration in mod_irc for "
msgstr "Rejestracja w mod_irc dla "
#: mod_irc/mod_irc.erl:571 mod_irc/mod_irc_odbc.erl:580
msgid ""
"Enter username, encodings, ports and passwords you wish to use for "
"connecting to IRC servers"
msgstr ""
"Wprowadź nazwę użytkownika, port i kodowanie, których chcesz używać do "
"łączenia z serwerami IRC"
#: mod_irc/mod_irc.erl:576 mod_irc/mod_irc_odbc.erl:585
msgid "IRC Username"
msgstr "Nazwa użytkownika IRC"
#: mod_irc/mod_irc.erl:586 mod_irc/mod_irc_odbc.erl:595
msgid ""
"If you want to specify different ports, passwords, encodings for IRC "
"servers, fill this list with values in format '{\"irc server\", \"encoding"
"\", port, \"password\"}'. By default this service use \"~s\" encoding, port "
"~p, empty password."
msgstr ""
"Jeśli chcesz ustawić inne hasła, porty lub kodowania dla poszczególnych "
"serwerów IRC, wypełnij tą listę wartościami w formacie '{\"irc server\","
"\"encoding\", port, \"password\"}'. Domyślne ta usługa używa kodowania \"~s"
"\", portu ~p, bez hasła."
#: mod_irc/mod_irc.erl:598 mod_irc/mod_irc_odbc.erl:607
msgid ""
"Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef."
"net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."
msgstr ""
"Przykład: [{\"wroclaw.irc.pl\",\"utf-8\"}, {\"warszawa.irc.pl\", "
"\"iso8859-2\"}]."
#: mod_irc/mod_irc.erl:603 mod_irc/mod_irc_odbc.erl:612
msgid "Connections parameters"
msgstr "Parametry połączeń"
#: mod_irc/mod_irc.erl:728 mod_irc/mod_irc_odbc.erl:757
msgid "Join IRC channel"
msgstr "Dołącz do kanału IRC"
#: mod_irc/mod_irc.erl:732 mod_irc/mod_irc_odbc.erl:761
msgid "IRC channel (don't put the first #)"
msgstr "Kanał IRC (nie używaj #)"
#: mod_irc/mod_irc.erl:737 mod_irc/mod_irc_odbc.erl:766
msgid "IRC server"
msgstr "Serwer IRC"
#: mod_irc/mod_irc.erl:770 mod_irc/mod_irc.erl:774
#: mod_irc/mod_irc_odbc.erl:799 mod_irc/mod_irc_odbc.erl:803
msgid "Join the IRC channel here."
msgstr "Dołącz do kanału IRC."
#: mod_irc/mod_irc.erl:778 mod_irc/mod_irc_odbc.erl:807
msgid "Join the IRC channel in this Jabber ID: ~s"
msgstr "Dołącz do kanału IRC pod tym Jabber ID: ~s"
#: mod_irc/mod_irc.erl:863 mod_irc/mod_irc_odbc.erl:904
msgid "IRC settings"
msgstr "Ustawienia IRC"
#: mod_irc/mod_irc.erl:868 mod_irc/mod_irc_odbc.erl:909
msgid ""
"Enter username and encodings you wish to use for connecting to IRC servers. "
"Press 'Next' to get more fields to fill in. Press 'Complete' to save "
"settings."
msgstr ""
"Wprowadź nazwę użytkownika i kodowania których chcesz używać do łączenia z "
"serwerami IRC. Wciśnij \"Dalej\" aby ustawić więcej parametrów połączenia. "
"Wciśnij \"Zakończ\" aby zapisać ustawienia."
#: mod_irc/mod_irc.erl:874 mod_irc/mod_irc_odbc.erl:915
msgid "IRC username"
msgstr "Nazwa użytkownika IRC"
#: mod_irc/mod_irc.erl:923 mod_irc/mod_irc_odbc.erl:964
msgid "Password ~b"
msgstr "Hasło ~b"
#: mod_irc/mod_irc.erl:928 mod_irc/mod_irc_odbc.erl:969
msgid "Port ~b"
msgstr "Port ~b"
#: mod_irc/mod_irc.erl:933 mod_irc/mod_irc_odbc.erl:974
msgid "Encoding for server ~b"
msgstr "Kodowanie znaków dla serwera ~b"
#: mod_irc/mod_irc.erl:942 mod_irc/mod_irc_odbc.erl:983
msgid "Server ~b"
msgstr "Serwer ~b"
#: mod_muc/mod_muc.erl:449 mod_muc/mod_muc_odbc.erl:456
msgid "Only service administrators are allowed to send service messages"
msgstr "Tylko administratorzy mogą wysyłać wiadomości"
#: mod_muc/mod_muc.erl:493 mod_muc/mod_muc_odbc.erl:500
msgid "Room creation is denied by service policy"
msgstr "Zasady serwera zabraniają tworzyć nowe pokoje"
#: mod_muc/mod_muc.erl:500 mod_muc/mod_muc_odbc.erl:507
msgid "Conference room does not exist"
msgstr "Pokój konferencyjny nie istnieje"
#: mod_muc/mod_muc.erl:582 mod_muc/mod_muc_odbc.erl:595
msgid "Chatrooms"
msgstr "Pokoje rozmów"
#: mod_muc/mod_muc.erl:712 mod_muc/mod_muc_odbc.erl:729
msgid "You need a client that supports x:data to register the nickname"
msgstr "Potrzebujesz klienta obsługującego x:data aby zarejestrować nick"
#: mod_muc/mod_muc.erl:718 mod_muc/mod_muc_odbc.erl:735
msgid "Nickname Registration at "
msgstr "Rejestracja nazwy użytkownika na "
#: mod_muc/mod_muc.erl:722 mod_muc/mod_muc_odbc.erl:739
msgid "Enter nickname you want to register"
msgstr "Wprowadz nazwę użytkownika którego chcesz zarejestrować"
#: mod_muc/mod_muc.erl:723 mod_muc/mod_muc_odbc.erl:740
#: mod_muc/mod_muc_room.erl:3810 mod_roster.erl:944 mod_roster_odbc.erl:1061
#: mod_vcard.erl:364 mod_vcard.erl:477 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:453
msgid "Nickname"
msgstr "Nazwa użytkownika"
#: mod_muc/mod_muc.erl:762 mod_muc/mod_muc_odbc.erl:784
#: mod_muc/mod_muc_room.erl:1064 mod_muc/mod_muc_room.erl:1787
msgid "That nickname is registered by another person"
msgstr "Ta nazwa użytkownika jest już zarejestrowana przez inną osobę"
#: mod_muc/mod_muc.erl:788 mod_muc/mod_muc_odbc.erl:811
msgid "You must fill in field \"Nickname\" in the form"
msgstr "Musisz wypełnić pole \"Nazwa użytkownika\" w formularzu"
#: mod_muc/mod_muc.erl:808 mod_muc/mod_muc_odbc.erl:831
msgid "ejabberd MUC module"
msgstr "Moduł MUC"
#: mod_muc/mod_muc_log.erl:374 mod_muc/mod_muc_log.erl:381
msgid "Chatroom configuration modified"
msgstr "Konfiguracja pokoju zmodyfikowana"
#: mod_muc/mod_muc_log.erl:384
msgid "joins the room"
msgstr "dołącza do pokoju"
#: mod_muc/mod_muc_log.erl:387 mod_muc/mod_muc_log.erl:390
msgid "leaves the room"
msgstr "opuszcza pokój"
#: mod_muc/mod_muc_log.erl:393 mod_muc/mod_muc_log.erl:396
msgid "has been banned"
msgstr "został wykluczony"
#: mod_muc/mod_muc_log.erl:399 mod_muc/mod_muc_log.erl:402
msgid "has been kicked"
msgstr "został wyrzucony"
#: mod_muc/mod_muc_log.erl:405
msgid "has been kicked because of an affiliation change"
msgstr "został wyrzucony z powodu zmiany przynależności"
#: mod_muc/mod_muc_log.erl:408
msgid "has been kicked because the room has been changed to members-only"
msgstr "został wyrzucony z powodu zmiany pokoju na \"Tylko dla Członków\""
#: mod_muc/mod_muc_log.erl:411
msgid "has been kicked because of a system shutdown"
msgstr "został wyrzucony z powodu wyłączenia systemu"
#: mod_muc/mod_muc_log.erl:414
msgid "is now known as"
msgstr "jest teraz znany jako"
#: mod_muc/mod_muc_log.erl:417 mod_muc/mod_muc_log.erl:688
#: mod_muc/mod_muc_room.erl:2393
msgid " has set the subject to: "
msgstr " zmienił temat na: "
#: mod_muc/mod_muc_log.erl:452
msgid "Chatroom is created"
msgstr "Pokój został stworzony"
#: mod_muc/mod_muc_log.erl:453
msgid "Chatroom is destroyed"
msgstr "Pokój został usunięty"
#: mod_muc/mod_muc_log.erl:454
msgid "Chatroom is started"
msgstr "Pokój został uruchomiony"
#: mod_muc/mod_muc_log.erl:455
msgid "Chatroom is stopped"
msgstr "Pokój został zatrzymany"
#: mod_muc/mod_muc_log.erl:459
msgid "Monday"
msgstr "Poniedziałek"
#: mod_muc/mod_muc_log.erl:460
msgid "Tuesday"
msgstr "Wtorek"
#: mod_muc/mod_muc_log.erl:461
msgid "Wednesday"
msgstr "Środa"
#: mod_muc/mod_muc_log.erl:462
msgid "Thursday"
msgstr "Czwartek"
#: mod_muc/mod_muc_log.erl:463
msgid "Friday"
msgstr "Piątek"
#: mod_muc/mod_muc_log.erl:464
msgid "Saturday"
msgstr "Sobota"
#: mod_muc/mod_muc_log.erl:465
msgid "Sunday"
msgstr "Niedziela"
#: mod_muc/mod_muc_log.erl:469
msgid "January"
msgstr "Styczeń"
#: mod_muc/mod_muc_log.erl:470
msgid "February"
msgstr "Luty"
#: mod_muc/mod_muc_log.erl:471
msgid "March"
msgstr "Marzec"
#: mod_muc/mod_muc_log.erl:472
msgid "April"
msgstr "Kwiecień"
#: mod_muc/mod_muc_log.erl:473
msgid "May"
msgstr "Maj"
#: mod_muc/mod_muc_log.erl:474
msgid "June"
msgstr "Czerwiec"
#: mod_muc/mod_muc_log.erl:475
msgid "July"
msgstr "Lipiec"
#: mod_muc/mod_muc_log.erl:476
msgid "August"
msgstr "Sierpień"
#: mod_muc/mod_muc_log.erl:477
msgid "September"
msgstr "Wrzesień"
#: mod_muc/mod_muc_log.erl:478
msgid "October"
msgstr "Październik"
#: mod_muc/mod_muc_log.erl:479
msgid "November"
msgstr "Listopad"
#: mod_muc/mod_muc_log.erl:480
msgid "December"
msgstr "Grudzień"
#: mod_muc/mod_muc_log.erl:750
msgid "Room Configuration"
msgstr "Konfiguracja pokoju"
#: mod_muc/mod_muc_log.erl:759
msgid "Room Occupants"
msgstr "Lista uczestników"
#: mod_muc/mod_muc_room.erl:174
msgid "Traffic rate limit is exceeded"
msgstr "Limit transferu przekroczony"
#: mod_muc/mod_muc_room.erl:246
msgid ""
"This participant is kicked from the room because he sent an error message"
msgstr ""
"Ten uczestnik został wyrzucony z pokoju ponieważ wysłał komunikat błędu"
#: mod_muc/mod_muc_room.erl:255
msgid "It is not allowed to send private messages to the conference"
msgstr "Nie wolno wysyłac prywatnych wiadomości na konferencję"
#: mod_muc/mod_muc_room.erl:332
msgid "Please, wait for a while before sending new voice request"
msgstr "Proszę poczekać chwile, zanim wyślesz nowe żądanie głosowe"
#: mod_muc/mod_muc_room.erl:347
msgid "Voice requests are disabled in this conference"
msgstr "Głosowe żądania są wyłączone w tym pokoju"
#: mod_muc/mod_muc_room.erl:364
msgid "Failed to extract JID from your voice request approval"
msgstr "Nie udało się wydobyć JID-u z twojego żądania"
#: mod_muc/mod_muc_room.erl:393
msgid "Only moderators can approve voice requests"
msgstr "Tylko moderatorzy mogą zatwierdzać żądania głosowe"
#: mod_muc/mod_muc_room.erl:408
msgid "Improper message type"
msgstr "Nieprawidłowy typ wiadomości"
#: mod_muc/mod_muc_room.erl:518
msgid ""
"This participant is kicked from the room because he sent an error message to "
"another participant"
msgstr ""
"Ten uczestnik został wyrzucony z pokoju ponieważ wysłał komunikat błędu do "
"innego uczestnika"
#: mod_muc/mod_muc_room.erl:531
msgid "It is not allowed to send private messages of type \"groupchat\""
msgstr "Nie można wysyłać prywatnych wiadomości typu \"groupchat\""
#: mod_muc/mod_muc_room.erl:543 mod_muc/mod_muc_room.erl:611
msgid "Recipient is not in the conference room"
msgstr "Odbiorcy nie ma w pokoju"
#: mod_muc/mod_muc_room.erl:564 mod_muc/mod_muc_room.erl:585
msgid "It is not allowed to send private messages"
msgstr "Wysyłanie prywatnych wiadomości jest zabronione"
#: mod_muc/mod_muc_room.erl:576 mod_muc/mod_muc_room.erl:956
#: mod_muc/mod_muc_room.erl:4040
msgid "Only occupants are allowed to send messages to the conference"
msgstr "Tylko uczestnicy mogą wysyłać wiadomości na konferencję"
#: mod_muc/mod_muc_room.erl:634
msgid "Only occupants are allowed to send queries to the conference"
msgstr "Tylko uczestnicy mogą wysyłać zapytania do konferencji"
#: mod_muc/mod_muc_room.erl:646
msgid "Queries to the conference members are not allowed in this room"
msgstr "Informacje o członkach konferencji nie są dostępne w tym pokoju"
#: mod_muc/mod_muc_room.erl:932
msgid ""
"Only moderators and participants are allowed to change the subject in this "
"room"
msgstr "Tylko moderatorzy i uczestnicy mogą zmienić temat tego pokoju"
#: mod_muc/mod_muc_room.erl:937
msgid "Only moderators are allowed to change the subject in this room"
msgstr "Tylko moderatorzy mogą zmienić temat tego pokoju"
#: mod_muc/mod_muc_room.erl:947
msgid "Visitors are not allowed to send messages to all occupants"
msgstr "Odwiedzający nie mogą wysyłać wiadomości do wszystkich obecnych"
#: mod_muc/mod_muc_room.erl:1021
msgid ""
"This participant is kicked from the room because he sent an error presence"
msgstr ""
"Ten uczestnik został wyrzucony z pokoju ponieważ jego informacja o statusie "
"zawierała błędy"
#: mod_muc/mod_muc_room.erl:1040
msgid "Visitors are not allowed to change their nicknames in this room"
msgstr "Uczestnicy tego pokoju nie mogą zmieniać swoich nicków"
#: mod_muc/mod_muc_room.erl:1053 mod_muc/mod_muc_room.erl:1779
msgid "That nickname is already in use by another occupant"
msgstr "Ta nazwa użytkownika jest używana przez kogoś innego"
#: mod_muc/mod_muc_room.erl:1768
msgid "You have been banned from this room"
msgstr "Zostałeś wykluczony z tego pokoju"
#: mod_muc/mod_muc_room.erl:1771
msgid "Membership is required to enter this room"
msgstr "Musisz być na liście członków tego pokoju aby do niego wejść"
#: mod_muc/mod_muc_room.erl:1807
msgid "This room is not anonymous"
msgstr "Ten pokój nie jest anonimowy"
#: mod_muc/mod_muc_room.erl:1833
msgid "A password is required to enter this room"
msgstr "Aby wejść do pokoju wymagane jest hasło"
#: mod_muc/mod_muc_room.erl:1855 mod_register.erl:246
msgid "Too many CAPTCHA requests"
msgstr "Za dużo żądań CAPTCHA"
#: mod_muc/mod_muc_room.erl:1864 mod_register.erl:251
msgid "Unable to generate a CAPTCHA"
msgstr "Nie można wygenerować CAPTCHA"
#: mod_muc/mod_muc_room.erl:1874
msgid "Incorrect password"
msgstr "Nieprawidłowe hasło"
#: mod_muc/mod_muc_room.erl:2448
msgid "Administrator privileges required"
msgstr "Wymagane uprawnienia administratora"
#: mod_muc/mod_muc_room.erl:2463
msgid "Moderator privileges required"
msgstr "Wymagane uprawnienia moderatora"
#: mod_muc/mod_muc_room.erl:2619
msgid "Jabber ID ~s is invalid"
msgstr "Jabber ID ~s jest niepoprawny"
#: mod_muc/mod_muc_room.erl:2633
msgid "Nickname ~s does not exist in the room"
msgstr "Nie ma nicka ~s w tym pokoju"
#: mod_muc/mod_muc_room.erl:2659 mod_muc/mod_muc_room.erl:3049
msgid "Invalid affiliation: ~s"
msgstr "Nieprawidłowa przynależność: ~s"
#: mod_muc/mod_muc_room.erl:2713
msgid "Invalid role: ~s"
msgstr "Nieprawidłowa rola: ~s"
#: mod_muc/mod_muc_room.erl:3026 mod_muc/mod_muc_room.erl:3062
msgid "Owner privileges required"
msgstr "Wymagane uprawnienia właściciela"
#: mod_muc/mod_muc_room.erl:3195
msgid "Configuration of room ~s"
msgstr "Konfiguracja pokoju ~s"
#: mod_muc/mod_muc_room.erl:3200
msgid "Room title"
msgstr "Tytuł pokoju"
#: mod_muc/mod_muc_room.erl:3203 mod_muc/mod_muc_room.erl:3692
msgid "Room description"
msgstr "Opis pokoju"
#: mod_muc/mod_muc_room.erl:3210
msgid "Make room persistent"
msgstr "Utwórz pokój na stałe"
#: mod_muc/mod_muc_room.erl:3215
msgid "Make room public searchable"
msgstr "Pozwól wyszukiwać pokój"
#: mod_muc/mod_muc_room.erl:3218
msgid "Make participants list public"
msgstr "Upublicznij listę uczestników"
#: mod_muc/mod_muc_room.erl:3221
msgid "Make room password protected"
msgstr "Pokój zabezpieczony hasłem"
#: mod_muc/mod_muc_room.erl:3232
msgid "Maximum Number of Occupants"
msgstr "Maksymalna liczba uczestników"
#: mod_muc/mod_muc_room.erl:3239
msgid "No limit"
msgstr "Bez limitu"
#: mod_muc/mod_muc_room.erl:3250
msgid "Present real Jabber IDs to"
msgstr "Prawdziwe Jabber ID widoczne dla"
#: mod_muc/mod_muc_room.erl:3258 mod_muc/mod_muc_room.erl:3292
msgid "moderators only"
msgstr "tylko moderatorzy"
#: mod_muc/mod_muc_room.erl:3260 mod_muc/mod_muc_room.erl:3294
msgid "anyone"
msgstr "wszystkich"
#: mod_muc/mod_muc_room.erl:3262
msgid "Make room members-only"
msgstr "Pokój tylko dla członków"
#: mod_muc/mod_muc_room.erl:3265
msgid "Make room moderated"
msgstr "Pokój moderowany"
#: mod_muc/mod_muc_room.erl:3268
msgid "Default users as participants"
msgstr "Domyślni użytkownicy jako uczestnicy"
#: mod_muc/mod_muc_room.erl:3271
msgid "Allow users to change the subject"
msgstr "Pozwól użytkownikom zmieniać temat"
#: mod_muc/mod_muc_room.erl:3274
msgid "Allow users to send private messages"
msgstr "Pozwól użytkownikom wysyłać prywatne wiadomości"
#: mod_muc/mod_muc_room.erl:3279
msgid "Allow visitors to send private messages to"
msgstr "Pozwól użytkownikom wysyłać prywatne wiadomości"
#: mod_muc/mod_muc_room.erl:3290
msgid "nobody"
msgstr "nikt"
#: mod_muc/mod_muc_room.erl:3296
msgid "Allow users to query other users"
msgstr "Pozwól użytkownikom pobierać informacje o innych użytkownikach"
#: mod_muc/mod_muc_room.erl:3299
msgid "Allow users to send invites"
msgstr "Pozwól użytkownikom wysyłać zaproszenia"
#: mod_muc/mod_muc_room.erl:3302
msgid "Allow visitors to send status text in presence updates"
msgstr "Pozwól uczestnikom na wysyłanie statusów opisowych"
#: mod_muc/mod_muc_room.erl:3305
msgid "Allow visitors to change nickname"
msgstr "Pozwól uczestnikom na zmianę nicka"
#: mod_muc/mod_muc_room.erl:3308
msgid "Allow visitors to send voice requests"
msgstr "Pozwól użytkownikom wysyłać zaproszenia"
#: mod_muc/mod_muc_room.erl:3311
msgid "Minimum interval between voice requests (in seconds)"
msgstr "Minimalny odstęp między żądaniami głosowymi (w sekundach)"
#: mod_muc/mod_muc_room.erl:3317
msgid "Make room CAPTCHA protected"
msgstr "Pokój zabezpieczony captchą"
#: mod_muc/mod_muc_room.erl:3322
msgid "Exclude Jabber IDs from CAPTCHA challenge"
msgstr "Pomiń Jabber ID z żądania CAPTCHA"
#: mod_muc/mod_muc_room.erl:3329
msgid "Enable logging"
msgstr "Włącz logowanie"
#: mod_muc/mod_muc_room.erl:3337
msgid "You need an x:data capable client to configure room"
msgstr "Potrzebujesz klienta obsługującego x:data aby skonfigurować pokój"
#: mod_muc/mod_muc_room.erl:3694
msgid "Number of occupants"
msgstr "Liczba uczestników"
#: mod_muc/mod_muc_room.erl:3750
msgid "private, "
msgstr "prywatny, "
#: mod_muc/mod_muc_room.erl:3799
msgid "Voice request"
msgstr "Żądanie głosowe"
#: mod_muc/mod_muc_room.erl:3803
msgid "Either approve or decline the voice request."
msgstr "Zatwierdź lub odrzuć żądanie głosowe"
#: mod_muc/mod_muc_room.erl:3809
msgid "User JID"
msgstr "Użytkownik "
#: mod_muc/mod_muc_room.erl:3811
msgid "Grant voice to this person?"
msgstr "Udzielić głosu tej osobie?"
#: mod_muc/mod_muc_room.erl:3960
msgid "~s invites you to the room ~s"
msgstr "~s zaprasza Cię do pokoju ~s"
#: mod_muc/mod_muc_room.erl:3969
msgid "the password is"
msgstr "hasło to:"
#: mod_offline.erl:510 mod_offline_odbc.erl:352
msgid ""
"Your contact offline message queue is full. The message has been discarded."
msgstr ""
"Kolejka wiadomości offline adresata jest pełna. Wiadomość została odrzucona."
#: mod_offline.erl:560 mod_offline_odbc.erl:408
msgid "~s's Offline Messages Queue"
msgstr "Kolejka wiadomości offline użytkownika ~s"
#: mod_offline.erl:563 mod_offline_odbc.erl:411 mod_roster.erl:987
#: mod_roster_odbc.erl:1104 mod_shared_roster.erl:901
#: mod_shared_roster.erl:1010 mod_shared_roster_odbc.erl:930
#: mod_shared_roster_odbc.erl:1039 web/ejabberd_web_admin.erl:833
#: web/ejabberd_web_admin.erl:874 web/ejabberd_web_admin.erl:942
#: web/ejabberd_web_admin.erl:978 web/ejabberd_web_admin.erl:1019
#: web/ejabberd_web_admin.erl:1508 web/ejabberd_web_admin.erl:1760
#: web/ejabberd_web_admin.erl:1931 web/ejabberd_web_admin.erl:1963
#: web/ejabberd_web_admin.erl:2031 web/ejabberd_web_admin.erl:2135
#: web/ejabberd_web_admin.erl:2160 web/ejabberd_web_admin.erl:2248
msgid "Submitted"
msgstr "Wprowadzone"
#: mod_offline.erl:571
msgid "Time"
msgstr "Czas"
#: mod_offline.erl:572
msgid "From"
msgstr "Od"
#: mod_offline.erl:573
msgid "To"
msgstr "Do"
#: mod_offline.erl:574 mod_offline_odbc.erl:419
msgid "Packet"
msgstr "Pakiet"
#: mod_offline.erl:587 mod_offline_odbc.erl:432 mod_shared_roster.erl:908
#: mod_shared_roster_odbc.erl:937 web/ejabberd_web_admin.erl:882
#: web/ejabberd_web_admin.erl:986
msgid "Delete Selected"
msgstr "Usuń zaznaczone"
#: mod_offline.erl:645 mod_offline_odbc.erl:519
msgid "Offline Messages:"
msgstr "Wiadomości offline:"
#: mod_offline.erl:645 mod_offline_odbc.erl:519
msgid "Remove All Offline Messages"
msgstr "Usuń wszystkie wiadomości typu 'Offline'"
#: mod_proxy65/mod_proxy65_service.erl:213
msgid "ejabberd SOCKS5 Bytestreams module"
msgstr "Moduł SOCKS5 Bytestreams"
#: mod_pubsub/mod_pubsub.erl:1120 mod_pubsub/mod_pubsub_odbc.erl:929
msgid "Publish-Subscribe"
msgstr "PubSub"
#: mod_pubsub/mod_pubsub.erl:1214 mod_pubsub/mod_pubsub_odbc.erl:1025
msgid "ejabberd Publish-Subscribe module"
msgstr "Moduł Publish-Subscribe"
#: mod_pubsub/mod_pubsub.erl:1497 mod_pubsub/mod_pubsub_odbc.erl:1312
msgid "PubSub subscriber request"
msgstr "Żądanie subskrybcji PubSub"
#: mod_pubsub/mod_pubsub.erl:1499 mod_pubsub/mod_pubsub_odbc.erl:1314
msgid "Choose whether to approve this entity's subscription."
msgstr "Wybierz, czy akceptować subskrypcję tej jednostki"
#: mod_pubsub/mod_pubsub.erl:1505 mod_pubsub/mod_pubsub_odbc.erl:1320
msgid "Node ID"
msgstr "ID węzła"
#: mod_pubsub/mod_pubsub.erl:1510 mod_pubsub/mod_pubsub_odbc.erl:1325
msgid "Subscriber Address"
msgstr "Adres subskrybenta"
#: mod_pubsub/mod_pubsub.erl:1516 mod_pubsub/mod_pubsub_odbc.erl:1331
msgid "Allow this Jabber ID to subscribe to this pubsub node?"
msgstr "Pozwól temu Jabber ID na zapisanie się do tego węzła PubSub"
#: mod_pubsub/mod_pubsub.erl:3474 mod_pubsub/mod_pubsub_odbc.erl:3287
msgid "Deliver payloads with event notifications"
msgstr "Dostarczaj zawartość publikacji wraz z powiadomieniami o zdarzeniach"
#: mod_pubsub/mod_pubsub.erl:3475 mod_pubsub/mod_pubsub_odbc.erl:3288
msgid "Deliver event notifications"
msgstr "Dostarczaj powiadomienia o zdarzeniach"
#: mod_pubsub/mod_pubsub.erl:3476 mod_pubsub/mod_pubsub_odbc.erl:3289
msgid "Notify subscribers when the node configuration changes"
msgstr "Informuj subskrybentów o zmianach konfiguracji węzła"
#: mod_pubsub/mod_pubsub.erl:3477 mod_pubsub/mod_pubsub_odbc.erl:3290
msgid "Notify subscribers when the node is deleted"
msgstr "Informuj subskrybentów o usunięciu węzła"
#: mod_pubsub/mod_pubsub.erl:3478 mod_pubsub/mod_pubsub_odbc.erl:3291
msgid "Notify subscribers when items are removed from the node"
msgstr "Informuj subskrybentów o usunięciu elementów węzła"
#: mod_pubsub/mod_pubsub.erl:3479 mod_pubsub/mod_pubsub_odbc.erl:3292
msgid "Persist items to storage"
msgstr "Przechowuj na stałe dane PubSub"
#: mod_pubsub/mod_pubsub.erl:3480 mod_pubsub/mod_pubsub_odbc.erl:3293
msgid "A friendly name for the node"
msgstr "Przyjazna nazwa węzła"
#: mod_pubsub/mod_pubsub.erl:3481 mod_pubsub/mod_pubsub_odbc.erl:3294
msgid "Max # of items to persist"
msgstr "Maksymalna liczba przechowywanych przedmiotów"
#: mod_pubsub/mod_pubsub.erl:3482 mod_pubsub/mod_pubsub_odbc.erl:3295
msgid "Whether to allow subscriptions"
msgstr "Czy pozwolić na subskrypcje"
#: mod_pubsub/mod_pubsub.erl:3483 mod_pubsub/mod_pubsub_odbc.erl:3296
msgid "Specify the access model"
msgstr "Określ model dostępu"
#: mod_pubsub/mod_pubsub.erl:3486 mod_pubsub/mod_pubsub_odbc.erl:3299
msgid "Roster groups allowed to subscribe"
msgstr "Grupy kontaktów uprawnione do subskrypcji"
#: mod_pubsub/mod_pubsub.erl:3487 mod_pubsub/mod_pubsub_odbc.erl:3300
msgid "Specify the publisher model"
msgstr "Określ model publikującego"
#: mod_pubsub/mod_pubsub.erl:3489 mod_pubsub/mod_pubsub_odbc.erl:3302
msgid "Purge all items when the relevant publisher goes offline"
msgstr "Usuń wszystkie elementy w momencie kiedy publikujący rozłączy się"
#: mod_pubsub/mod_pubsub.erl:3490 mod_pubsub/mod_pubsub_odbc.erl:3303
msgid "Specify the event message type"
msgstr "Określ typ wiadomości"
#: mod_pubsub/mod_pubsub.erl:3492 mod_pubsub/mod_pubsub_odbc.erl:3305
msgid "Max payload size in bytes"
msgstr "Maksymalna wielkość powiadomienia w bajtach"
#: mod_pubsub/mod_pubsub.erl:3493 mod_pubsub/mod_pubsub_odbc.erl:3306
msgid "When to send the last published item"
msgstr "Kiedy wysłać ostatnio opublikowaną rzecz"
#: mod_pubsub/mod_pubsub.erl:3495 mod_pubsub/mod_pubsub_odbc.erl:3308
msgid "Only deliver notifications to available users"
msgstr "Dostarczaj powiadomienia tylko dostępnym użytkownikom"
#: mod_pubsub/mod_pubsub.erl:3496 mod_pubsub/mod_pubsub_odbc.erl:3309
msgid "The collections with which a node is affiliated"
msgstr "Grupy, do których należy węzeł"
#: mod_register.erl:193
msgid "The CAPTCHA verification has failed"
msgstr "Weryfikacja CAPTCHA nie powiodła się."
#: mod_register.erl:220
msgid "You need a client that supports x:data and CAPTCHA to register"
msgstr "Potrzebujesz klienta obsługującego x:data aby zarejestrować nick"
#: mod_register.erl:226 mod_register.erl:265
msgid "Choose a username and password to register with this server"
msgstr ""
"Wybierz nazwę użytkownika i hasło aby zarejestrować się na tym serwerze"
#: mod_register.erl:230 mod_vcard.erl:364 mod_vcard_odbc.erl:342
#: web/ejabberd_web_admin.erl:1515 web/ejabberd_web_admin.erl:1572
msgid "User"
msgstr "Użytkownik"
#: mod_register.erl:316 mod_register.erl:361
msgid "The password is too weak"
msgstr "Hasło nie jest wystarczająco trudne"
#: mod_register.erl:365
msgid "Users are not allowed to register accounts so quickly"
msgstr "Użytkowncy nie mogą tak szybko rejestrować nowych kont"
#: mod_roster.erl:938 mod_roster_odbc.erl:1055 web/ejabberd_web_admin.erl:1701
#: web/ejabberd_web_admin.erl:1886 web/ejabberd_web_admin.erl:1897
#: web/ejabberd_web_admin.erl:2219
msgid "None"
msgstr "Brak"
#: mod_roster.erl:945 mod_roster_odbc.erl:1062
msgid "Subscription"
msgstr "Subskrypcja"
#: mod_roster.erl:946 mod_roster_odbc.erl:1063
msgid "Pending"
msgstr "Oczekuje"
#: mod_roster.erl:947 mod_roster_odbc.erl:1064
msgid "Groups"
msgstr "Grupy"
#: mod_roster.erl:974 mod_roster_odbc.erl:1091
msgid "Validate"
msgstr "Potwierdź"
#: mod_roster.erl:982 mod_roster_odbc.erl:1099
msgid "Remove"
msgstr "Usuń"
#: mod_roster.erl:985 mod_roster_odbc.erl:1102
msgid "Roster of "
msgstr "Lista kontaktów "
#: mod_roster.erl:988 mod_roster_odbc.erl:1105 mod_shared_roster.erl:902
#: mod_shared_roster.erl:1011 mod_shared_roster_odbc.erl:931
#: mod_shared_roster_odbc.erl:1040 web/ejabberd_web_admin.erl:834
#: web/ejabberd_web_admin.erl:875 web/ejabberd_web_admin.erl:943
#: web/ejabberd_web_admin.erl:979 web/ejabberd_web_admin.erl:1020
#: web/ejabberd_web_admin.erl:1509 web/ejabberd_web_admin.erl:1761
#: web/ejabberd_web_admin.erl:1932 web/ejabberd_web_admin.erl:2136
#: web/ejabberd_web_admin.erl:2161
msgid "Bad format"
msgstr "Błędny format"
#: mod_roster.erl:995 mod_roster_odbc.erl:1112
msgid "Add Jabber ID"
msgstr "Dodaj Jabber ID"
#: mod_roster.erl:1094 mod_roster_odbc.erl:1211
msgid "Roster"
msgstr "Lista kontaktów"
#: mod_shared_roster.erl:857 mod_shared_roster.erl:899
#: mod_shared_roster.erl:1007 mod_shared_roster_odbc.erl:886
#: mod_shared_roster_odbc.erl:928 mod_shared_roster_odbc.erl:1036
msgid "Shared Roster Groups"
msgstr "Wspólne grupy kontaktów"
#: mod_shared_roster.erl:895 mod_shared_roster_odbc.erl:924
#: web/ejabberd_web_admin.erl:1365 web/ejabberd_web_admin.erl:2461
msgid "Add New"
msgstr "Dodaj nowe"
#: mod_shared_roster.erl:978 mod_shared_roster_odbc.erl:1007
msgid "Name:"
msgstr "Nazwa:"
#: mod_shared_roster.erl:983 mod_shared_roster_odbc.erl:1012
msgid "Description:"
msgstr "Opis:"
#: mod_shared_roster.erl:991 mod_shared_roster_odbc.erl:1020
msgid "Members:"
msgstr "Członkowie:"
#: mod_shared_roster.erl:999 mod_shared_roster_odbc.erl:1028
msgid "Displayed Groups:"
msgstr "Wyświetlane grupy:"
#: mod_shared_roster.erl:1008 mod_shared_roster_odbc.erl:1037
msgid "Group "
msgstr "Grupa "
#: mod_shared_roster.erl:1017 mod_shared_roster_odbc.erl:1046
#: web/ejabberd_web_admin.erl:840 web/ejabberd_web_admin.erl:884
#: web/ejabberd_web_admin.erl:949 web/ejabberd_web_admin.erl:1026
#: web/ejabberd_web_admin.erl:2017
msgid "Submit"
msgstr "Wyślij"
#: mod_vcard.erl:165 mod_vcard_ldap.erl:238 mod_vcard_odbc.erl:129
msgid "Erlang Jabber Server"
msgstr "Erlang Jabber Server"
#: mod_vcard.erl:364 mod_vcard.erl:478 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:454
msgid "Birthday"
msgstr "Data urodzenia"
#: mod_vcard.erl:364 mod_vcard.erl:480 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:456
msgid "City"
msgstr "Miasto"
#: mod_vcard.erl:364 mod_vcard.erl:479 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:455
msgid "Country"
msgstr "Państwo"
#: mod_vcard.erl:364 mod_vcard.erl:481 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:457
msgid "Email"
msgstr "Email"
#: mod_vcard.erl:364 mod_vcard.erl:476 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:452
msgid "Family Name"
msgstr "Nazwisko"
#: mod_vcard.erl:364 mod_vcard_odbc.erl:342
msgid ""
"Fill in the form to search for any matching Jabber User (Add * to the end of "
"field to match substring)"
msgstr ""
"Wypełnij formularz aby wyszukać użytkowników Jabbera (dodaj * na koniec "
"zapytania aby wyszukać po fragmencie)"
#: mod_vcard.erl:364 mod_vcard.erl:473 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:449
msgid "Full Name"
msgstr "Pełna nazwa"
#: mod_vcard.erl:364 mod_vcard.erl:475 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:451
msgid "Middle Name"
msgstr "Drugie imię"
#: mod_vcard.erl:364 mod_vcard.erl:474 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:450 web/ejabberd_web_admin.erl:2006
msgid "Name"
msgstr "Imię"
#: mod_vcard.erl:364 mod_vcard.erl:482 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:458
msgid "Organization Name"
msgstr "Nazwa organizacji"
#: mod_vcard.erl:364 mod_vcard.erl:483 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:459
msgid "Organization Unit"
msgstr "Dział"
#: mod_vcard.erl:364 mod_vcard_ldap.erl:462 mod_vcard_odbc.erl:342
msgid "Search users in "
msgstr "Wyszukaj użytkowników w "
#: mod_vcard.erl:364 mod_vcard_ldap.erl:462 mod_vcard_odbc.erl:342
msgid "You need an x:data capable client to search"
msgstr "Potrzebujesz klienta obsługującego x:data aby wyszukiwać"
#: mod_vcard.erl:389 mod_vcard_ldap.erl:487 mod_vcard_odbc.erl:367
msgid "vCard User Search"
msgstr "Wyszukiwanie vCard użytkowników"
#: mod_vcard.erl:445 mod_vcard_ldap.erl:541 mod_vcard_odbc.erl:421
msgid "ejabberd vCard module"
msgstr "Moduł vCard ejabberd"
#: mod_vcard.erl:469 mod_vcard_ldap.erl:551 mod_vcard_odbc.erl:445
msgid "Search Results for "
msgstr "Wyniki wyszukiwania dla "
#: mod_vcard_ldap.erl:462
msgid "Fill in fields to search for any matching Jabber User"
msgstr "Wypełnij pola aby znaleźć pasujących użytkowników Jabbera"
#: web/ejabberd_web_admin.erl:193 web/ejabberd_web_admin.erl:203
#: web/ejabberd_web_admin.erl:219 web/ejabberd_web_admin.erl:229
msgid "Unauthorized"
msgstr "Nie autoryzowano"
#: web/ejabberd_web_admin.erl:286 web/ejabberd_web_admin.erl:303
msgid "ejabberd Web Admin"
msgstr "ejabberd: Panel Administracyjny"
#: web/ejabberd_web_admin.erl:769 web/ejabberd_web_admin.erl:780
msgid "Administration"
msgstr "Administracja"
#: web/ejabberd_web_admin.erl:878 web/ejabberd_web_admin.erl:982
msgid "Raw"
msgstr "Żródło"
#: web/ejabberd_web_admin.erl:1017
msgid "~s access rule configuration"
msgstr "~s konfiguracja zasad dostępu"
#: web/ejabberd_web_admin.erl:1035
msgid "Virtual Hosts"
msgstr "Wirtualne Hosty"
#: web/ejabberd_web_admin.erl:1043 web/ejabberd_web_admin.erl:1050
msgid "Users"
msgstr "Użytkownicy"
#: web/ejabberd_web_admin.erl:1078
msgid "Users Last Activity"
msgstr "Ostatnia aktywność użytkowników"
#: web/ejabberd_web_admin.erl:1080
msgid "Period: "
msgstr "Przedział czasu: "
#: web/ejabberd_web_admin.erl:1090
msgid "Last month"
msgstr "Miniony miesiąc"
#: web/ejabberd_web_admin.erl:1091
msgid "Last year"
msgstr "Miniony rok"
#: web/ejabberd_web_admin.erl:1092
msgid "All activity"
msgstr "Cała aktywność"
#: web/ejabberd_web_admin.erl:1094
msgid "Show Ordinary Table"
msgstr "Pokaż zwykłą tabelę"
#: web/ejabberd_web_admin.erl:1096
msgid "Show Integral Table"
msgstr "Pokaż tabelę całkowitą"
#: web/ejabberd_web_admin.erl:1105 web/ejabberd_web_admin.erl:1939
msgid "Statistics"
msgstr "Statystyki"
#: web/ejabberd_web_admin.erl:1117
msgid "Not Found"
msgstr "Nie znaleziono"
#: web/ejabberd_web_admin.erl:1134
msgid "Node not found"
msgstr "Węzeł nie został znaleziony"
#: web/ejabberd_web_admin.erl:1460
msgid "Host"
msgstr "Host"
#: web/ejabberd_web_admin.erl:1461
msgid "Registered Users"
msgstr "Użytkownicy zarejestrowani"
#: web/ejabberd_web_admin.erl:1573
msgid "Offline Messages"
msgstr "Wiadomości offline"
#: web/ejabberd_web_admin.erl:1574 web/ejabberd_web_admin.erl:1767
msgid "Last Activity"
msgstr "Ostatnia aktywność"
#: web/ejabberd_web_admin.erl:1659 web/ejabberd_web_admin.erl:1675
msgid "Registered Users:"
msgstr "Użytkownicy zarejestrowani:"
#: web/ejabberd_web_admin.erl:1661 web/ejabberd_web_admin.erl:1677
#: web/ejabberd_web_admin.erl:2192
msgid "Online Users:"
msgstr "Użytkownicy zalogowani:"
#: web/ejabberd_web_admin.erl:1663
msgid "Outgoing s2s Connections:"
msgstr "Wychodzące połączenia s2s:"
#: web/ejabberd_web_admin.erl:1665
msgid "Outgoing s2s Servers:"
msgstr "Serwery zewnętrzne s2s:"
#: web/ejabberd_web_admin.erl:1734 web/mod_register_web.erl:175
#: web/mod_register_web.erl:372 web/mod_register_web.erl:381
#: web/mod_register_web.erl:411
msgid "Change Password"
msgstr "Zmień hasło"
#: web/ejabberd_web_admin.erl:1758
msgid "User "
msgstr "Użytkownik "
#: web/ejabberd_web_admin.erl:1765
msgid "Connected Resources:"
msgstr "Zasoby zalogowane:"
#: web/ejabberd_web_admin.erl:1766 web/mod_register_web.erl:227
#: web/mod_register_web.erl:519
msgid "Password:"
msgstr "Hasło:"
#: web/ejabberd_web_admin.erl:1828
msgid "No Data"
msgstr "Brak danych"
#: web/ejabberd_web_admin.erl:1906
msgid "Nodes"
msgstr "Węzły"
#: web/ejabberd_web_admin.erl:1929 web/ejabberd_web_admin.erl:1951
msgid "Node "
msgstr "Węzeł "
#: web/ejabberd_web_admin.erl:1938
msgid "Listened Ports"
msgstr "Porty nasłuchujące"
#: web/ejabberd_web_admin.erl:1940 web/ejabberd_web_admin.erl:2260
#: web/ejabberd_web_admin.erl:2448
msgid "Update"
msgstr "Aktualizuj"
#: web/ejabberd_web_admin.erl:1943 web/ejabberd_web_admin.erl:2569
msgid "Restart"
msgstr "Uruchom ponownie"
#: web/ejabberd_web_admin.erl:1945 web/ejabberd_web_admin.erl:2571
msgid "Stop"
msgstr "Zatrzymaj"
#: web/ejabberd_web_admin.erl:1959
msgid "RPC Call Error"
msgstr "Błąd żądania RPC"
#: web/ejabberd_web_admin.erl:2000
msgid "Database Tables at "
msgstr "Tabele bazy na "
#: web/ejabberd_web_admin.erl:2007
msgid "Storage Type"
msgstr "Typ bazy"
#: web/ejabberd_web_admin.erl:2008
msgid "Elements"
msgstr "Elementy"
#: web/ejabberd_web_admin.erl:2009
msgid "Memory"
msgstr "Pamięć"
#: web/ejabberd_web_admin.erl:2032 web/ejabberd_web_admin.erl:2137
msgid "Error"
msgstr "Błąd"
#: web/ejabberd_web_admin.erl:2034
msgid "Backup of "
msgstr "Kopia zapasowa "
#: web/ejabberd_web_admin.erl:2036
msgid ""
"Please note that these options will only backup the builtin Mnesia database. "
"If you are using the ODBC module, you also need to backup your SQL database "
"separately."
msgstr ""
"Te opcje kopii zapasowych dotyczą tylko wbudowanej bazy danych typu Mnesia. "
"Jeśli korzystasz z modułu ODBC, musisz wykonać kopie bazy we własnym "
"zakresie."
#: web/ejabberd_web_admin.erl:2041
msgid "Store binary backup:"
msgstr "Zachowaj kopię binarną:"
#: web/ejabberd_web_admin.erl:2045 web/ejabberd_web_admin.erl:2052
#: web/ejabberd_web_admin.erl:2060 web/ejabberd_web_admin.erl:2067
#: web/ejabberd_web_admin.erl:2074 web/ejabberd_web_admin.erl:2081
#: web/ejabberd_web_admin.erl:2088 web/ejabberd_web_admin.erl:2096
#: web/ejabberd_web_admin.erl:2103 web/ejabberd_web_admin.erl:2110
msgid "OK"
msgstr "OK"
#: web/ejabberd_web_admin.erl:2048
msgid "Restore binary backup immediately:"
msgstr "Natychmiast odtwórz kopię binarną:"
#: web/ejabberd_web_admin.erl:2056
msgid ""
"Restore binary backup after next ejabberd restart (requires less memory):"
msgstr ""
"Odtwórz kopię binarną podczas następnego uruchomienia ejabberd (wymaga mniej "
"zasobów):"
#: web/ejabberd_web_admin.erl:2063
msgid "Store plain text backup:"
msgstr "Zachowaj kopię w postaci tekstowej:"
#: web/ejabberd_web_admin.erl:2070
msgid "Restore plain text backup immediately:"
msgstr "Natychmiast odtwórz kopię z postaci tekstowej:"
#: web/ejabberd_web_admin.erl:2077
msgid "Import users data from a PIEFXIS file (XEP-0227):"
msgstr "Importuj dane użytkowników z pliku w formacie PIEFXIS (XEP-0227):"
#: web/ejabberd_web_admin.erl:2084
msgid "Export data of all users in the server to PIEFXIS files (XEP-0227):"
msgstr ""
"Eksportuj dane wszystkich użytkowników serwera do plików w formacie PIEFXIS "
"(XEP-0227):"
#: web/ejabberd_web_admin.erl:2091
msgid "Export data of users in a host to PIEFXIS files (XEP-0227):"
msgstr ""
"Eksportuj dane użytkowników z hosta do plików w formacie PIEFXIS (XEP-0227):"
#: web/ejabberd_web_admin.erl:2099
msgid "Import user data from jabberd14 spool file:"
msgstr "Importuj dane użytkownika z pliku roboczego serwera jabberd14:"
#: web/ejabberd_web_admin.erl:2106
msgid "Import users data from jabberd14 spool directory:"
msgstr "Importuj użytkowników z katalogu roboczego serwera jabberd14"
#: web/ejabberd_web_admin.erl:2132
msgid "Listened Ports at "
msgstr "Porty nasłuchujące na "
#: web/ejabberd_web_admin.erl:2157
msgid "Modules at "
msgstr "Moduły na "
#: web/ejabberd_web_admin.erl:2183
msgid "Statistics of ~p"
msgstr "Statystyki ~p"
#: web/ejabberd_web_admin.erl:2186
msgid "Uptime:"
msgstr "Czas pracy:"
#: web/ejabberd_web_admin.erl:2189
msgid "CPU Time:"
msgstr "Czas CPU:"
#: web/ejabberd_web_admin.erl:2195
msgid "Transactions Committed:"
msgstr "Transakcje zakończone:"
#: web/ejabberd_web_admin.erl:2198
msgid "Transactions Aborted:"
msgstr "Transakcje anulowane:"
#: web/ejabberd_web_admin.erl:2201
msgid "Transactions Restarted:"
msgstr "Transakcje uruchomione ponownie:"
#: web/ejabberd_web_admin.erl:2204
msgid "Transactions Logged:"
msgstr "Transakcje zalogowane:"
#: web/ejabberd_web_admin.erl:2246
msgid "Update "
msgstr "Uaktualnij "
#: web/ejabberd_web_admin.erl:2254
msgid "Update plan"
msgstr "Plan aktualizacji"
#: web/ejabberd_web_admin.erl:2255
msgid "Modified modules"
msgstr "Zmodyfikowane moduły"
#: web/ejabberd_web_admin.erl:2256
msgid "Update script"
msgstr "Skrypt aktualizacji"
#: web/ejabberd_web_admin.erl:2257
msgid "Low level update script"
msgstr "Skrypt aktualizacji niskiego poziomu"
#: web/ejabberd_web_admin.erl:2258
msgid "Script check"
msgstr "Sprawdź skrypt"
#: web/ejabberd_web_admin.erl:2426
msgid "Port"
msgstr "Port"
#: web/ejabberd_web_admin.erl:2427
msgid "IP"
msgstr "IP"
#: web/ejabberd_web_admin.erl:2428
msgid "Protocol"
msgstr "Protokół"
#: web/ejabberd_web_admin.erl:2429 web/ejabberd_web_admin.erl:2556
msgid "Module"
msgstr "Moduł"
#: web/ejabberd_web_admin.erl:2430 web/ejabberd_web_admin.erl:2557
msgid "Options"
msgstr "Opcje"
#: web/ejabberd_web_admin.erl:2450
msgid "Delete"
msgstr "Usuń"
#: web/ejabberd_web_admin.erl:2579
msgid "Start"
msgstr "Uruchom"
#: web/mod_register_web.erl:104
msgid "Your Jabber account was successfully created."
msgstr "Twoje konto zostało stworzone."
#: web/mod_register_web.erl:107
msgid "There was an error creating the account: "
msgstr "Wystąpił błąd podczas tworzenia konta:"
#: web/mod_register_web.erl:115
msgid "Your Jabber account was successfully deleted."
msgstr "Twoje konto zostało usunięte."
#: web/mod_register_web.erl:118
msgid "There was an error deleting the account: "
msgstr "Podczas usuwania konta wystąpił błąd:"
#: web/mod_register_web.erl:128
msgid "The password of your Jabber account was successfully changed."
msgstr "Hasło do Twojego konta zostało zmienione."
#: web/mod_register_web.erl:131
msgid "There was an error changing the password: "
msgstr "Podczas próby zmiany hasła wystąpił błąd:"
#: web/mod_register_web.erl:163 web/mod_register_web.erl:172
msgid "Jabber Account Registration"
msgstr "Zakładanie konta Jabber"
#: web/mod_register_web.erl:174 web/mod_register_web.erl:192
#: web/mod_register_web.erl:201
msgid "Register a Jabber account"
msgstr "Załóż konto Jabber"
#: web/mod_register_web.erl:176 web/mod_register_web.erl:493
#: web/mod_register_web.erl:502
msgid "Unregister a Jabber account"
msgstr "Usuń konto Jabber"
#: web/mod_register_web.erl:203
msgid ""
"This page allows to create a Jabber account in this Jabber server. Your JID "
"(Jabber IDentifier) will be of the form: username@server. Please read "
"carefully the instructions to fill correctly the fields."
msgstr ""
"Niniejsza strona pozwala na założenie konta Jabber na tym serwerze. Twój JID "
"(Jabber IDentyfikator) będzie miał postać: nazwa_użytkownika@serwer. "
"Przeczytaj dokładnie instrukcję i wypełnij pola."
#: web/mod_register_web.erl:212 web/mod_register_web.erl:386
#: web/mod_register_web.erl:509
msgid "Username:"
msgstr "Nazwa użytkownika:"
#: web/mod_register_web.erl:217
msgid "This is case insensitive: macbeth is the same that MacBeth and Macbeth."
msgstr ""
"Pole nie rozróżnia wielkości liter: słowo Hanna jest takie samo jak hAnna "
"lub haNNa."
#: web/mod_register_web.erl:218
msgid "Characters not allowed:"
msgstr "Te znaki są niedozwolone:"
#: web/mod_register_web.erl:222 web/mod_register_web.erl:391
#: web/mod_register_web.erl:514
msgid "Server:"
msgstr "Serwer:"
#: web/mod_register_web.erl:232
msgid ""
"Don't tell your password to anybody, not even the administrators of the "
"Jabber server."
msgstr ""
"Nie podawaj swojego hasła nikomu, nawet administratorowi serwera Jabber."
#: web/mod_register_web.erl:234
msgid "You can later change your password using a Jabber client."
msgstr "Możesz później zmienić swoje hasło za pomocą dowolnego klienta Jabber."
#: web/mod_register_web.erl:235
msgid ""
"Some Jabber clients can store your password in your computer. Use that "
"feature only if you trust your computer is safe."
msgstr ""
"Niektóre klienty Jabber mogą zapisywać Twoje hasło na komputerze. Używaj tej "
"opcji tylko jeśli ufasz komputerowi na którym pracujesz."
#: web/mod_register_web.erl:237
msgid ""
"Memorize your password, or write it in a paper placed in a safe place. In "
"Jabber there isn't an automated way to recover your password if you forget "
"it."
msgstr ""
"Zapamiętaj swoje hasło lub zapisz je na kartce i zachowaj w bezpiecznym "
"miejscu. Na Jabberze nie ma zautomatyzowanego systemu odzyskiwania haseł."
#: web/mod_register_web.erl:242 web/mod_register_web.erl:406
msgid "Password Verification:"
msgstr "Weryfikacja hasła:"
#: web/mod_register_web.erl:250
msgid "Register"
msgstr "Zarejestruj"
#: web/mod_register_web.erl:396
msgid "Old Password:"
msgstr "Stare hasło:"
#: web/mod_register_web.erl:401
msgid "New Password:"
msgstr "Nowe hasło:"
#: web/mod_register_web.erl:504
msgid "This page allows to unregister a Jabber account in this Jabber server."
msgstr "Ta strona pozwala usunąć konto Jabber z tego serwera."
#: web/mod_register_web.erl:524
msgid "Unregister"
msgstr "Wyrejestruj"
#, fuzzy
#~ msgid "Captcha test failed"
#~ msgstr "Captcha jest poprawna."
ejabberd-2.1.11/src/msgs/ca.msg 0000664 0000000 0000000 00000067104 12240230175 013061 0 ustar {"Access Configuration","Configuració d'accesos"}.
{"Access Control List Configuration","Configuració de la Llista de Control d'Accés"}.
{"Access Control Lists","Llista de Control d'Accés"}.
{"Access control lists","Llistes de Control de Accés"}.
{"Access denied by service policy","Accés denegat per la política del servei"}.
{"Access rules","Regles d'accés"}.
{"Access Rules","Regles d'Accés"}.
{"Action on user","Acció en l'usuari"}.
{"Add Jabber ID","Afegir Jabber ID"}.
{"Add New","Afegir nou"}.
{"Add User","Afegir usuari"}.
{"Administration","Administració"}.
{"Administration of ","Administració de "}.
{"Administrator privileges required","Es necessita tenir privilegis d'administrador"}.
{"A friendly name for the node","Un nom per al node"}.
{"All activity","Tota l'activitat"}.
{"Allow this Jabber ID to subscribe to this pubsub node?","Permetre que aquesta Jabber ID es puga subscriure a aquest node pubsub"}.
{"Allow users to change the subject","Permetre que els usuaris canviin el tema"}.
{"Allow users to query other users","Permetre que els usuaris fagen peticions a altres usuaris"}.
{"Allow users to send invites","Permetre que els usuaris envien invitacions"}.
{"Allow users to send private messages","Permetre que els usuaris envien missatges privats"}.
{"Allow visitors to change nickname","Permetre als visitants canviar el Nickname"}.
{"Allow visitors to send private messages to","Permetre als visitants enviar missatges privats a"}.
{"Allow visitors to send status text in presence updates","Permetre als visitants enviar text d'estat en les actualitzacions de presència"}.
{"Allow visitors to send voice requests","Permetre als visitants enviar peticions de veu"}.
{"All Users","Tots els usuaris"}.
{"Announcements","Anuncis"}.
{"anyone","qualsevol"}.
{"A password is required to enter this room","Es necessita contrasenya per a entrar en aquesta sala"}.
{"April","Abril"}.
{"August","Agost"}.
{"Backup","Guardar còpia de seguretat"}.
{"Backup Management","Gestió de còpia de seguretat"}.
{"Backup of ","Còpia de seguretat de "}.
{"Backup to File at ","Desar còpia de seguretat a fitxer en "}.
{"Bad format","Format erroni"}.
{"Birthday","Aniversari"}.
{"CAPTCHA web page","Pàgina web del CAPTCHA"}.
{"Change Password","Canviar Contrasenya"}.
{"Change User Password","Canviar Contrasenya d'Usuari"}.
{"Characters not allowed:","Caràcters no permesos:"}.
{"Chatroom configuration modified","Configuració de la sala de xat modificada"}.
{"Chatroom is created","La sala s'ha creat"}.
{"Chatroom is destroyed","La sala s'ha destruït"}.
{"Chatroom is started","La sala s'ha iniciat"}.
{"Chatroom is stopped","La sala s'ha aturat"}.
{"Chatrooms","Sales de xat"}.
{"Choose a username and password to register with this server","Tria nom d'usuari i contrasenya per a registrar-te en aquest servidor"}.
{"Choose modules to stop","Selecciona mòduls a detindre"}.
{"Choose storage type of tables","Selecciona el tipus d'almacenament de les taules"}.
{"Choose whether to approve this entity's subscription.","Tria si aprova aquesta entitat de subscripció"}.
{"City","Ciutat"}.
{"Commands","Comandaments"}.
{"Conference room does not exist","La sala de conferències no existeix"}.
{"Configuration","Configuració"}.
{"Configuration of room ~s","Configuració de la sala ~s"}.
{"Connected Resources:","Recursos connectats:"}.
{"Connections parameters","Paràmetres de connexió"}.
{"Country","Pais"}.
{"CPU Time:","Temps de CPU"}.
{"Database","Base de dades"}.
{"Database Tables at ","Taules de la base de dades en "}.
{"Database Tables Configuration at ","Configuració de la base de dades en "}.
{"December","Decembre"}.
{"Default users as participants","Els usuaris són participants per defecte"}.
{"Delete","Eliminar"}.
{"Delete message of the day","Eliminar el missatge del dia"}.
{"Delete message of the day on all hosts","Elimina el missatge del dis de tots els hosts"}.
{"Delete Selected","Eliminar els seleccionats"}.
{"Delete User","Eliminar Usuari"}.
{"Deliver event notifications","Entrega de notificacions d'events"}.
{"Deliver payloads with event notifications","Enviar payloads junt a les notificacions d'events"}.
{"Description:","Descripció:"}.
{"Disc only copy","Còpia sols en disc"}.
{"Displayed Groups:","Mostrar grups:"}.
{"Don't tell your password to anybody, not even the administrators of the Jabber server.","No li donis la teva contrasenya a ningú, ni tan sols als administradors del servidor Jabber."}.
{"Dump Backup to Text File at ","Exporta còpia de seguretat a fitxer de text en "}.
{"Dump to Text File","Exportar a fitxer de text"}.
{"Edit Properties","Editar propietats"}.
{"Either approve or decline the voice request.","Aprova o denega la petició de veu"}.
{"ejabberd IRC module","mòdul ejabberd IRC"}.
{"ejabberd MUC module","mòdul ejabberd MUC"}.
{"ejabberd Publish-Subscribe module","Mòdul ejabberd Publicar-Subscriure"}.
{"ejabberd SOCKS5 Bytestreams module","mòdul ejabberd SOCKS5 Bytestreams"}.
{"ejabberd vCard module","Mòdul ejabberd vCard"}.
{"ejabberd Web Admin","Web d'administració del ejabberd"}.
{"Elements","Elements"}.
{"Email","Email"}.
{"Enable logging","Habilitar el registre de la conversa"}.
{"Encoding for server ~b","Codificació pel servidor ~b"}.
{"End User Session","Finalitzar Sesió d'Usuari"}.
{"Enter list of {Module, [Options]}","Introdueix llista de {mòdul, [opcions]}"}.
{"Enter nickname you want to register","Introdueix el nickname que vols registrar"}.
{"Enter path to backup file","Introdueix ruta al fitxer de còpia de seguretat"}.
{"Enter path to jabberd14 spool dir","Introdueix la ruta al directori de jabberd14 spools"}.
{"Enter path to jabberd14 spool file","Introdueix ruta al fitxer jabberd14 spool"}.
{"Enter path to text file","Introdueix ruta al fitxer de text"}.
{"Enter the text you see","Introdueix el text que veus"}.
{"Enter username and encodings you wish to use for connecting to IRC servers. Press 'Next' to get more fields to fill in. Press 'Complete' to save settings.","Introdueix el nom d'usuari i les codificacions de caràcters per a utilitzar als servidors de IRC. Apreta \"Seguent\" per veure més caps per omplir. Apreta \"Completar\" per guardar la configuració. "}.
{"Enter username, encodings, ports and passwords you wish to use for connecting to IRC servers","Introdueix el nom d'usuari, les codificacions de caràcters, els ports i contrasenyes per a utilitzar al connectar als servidors de IRC"}.
{"Erlang Jabber Server","Servidor Erlang Jabber"}.
{"Error","Error"}.
{"Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef.net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}].","Exemple: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef.net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."}.
{"Exclude Jabber IDs from CAPTCHA challenge","Excloure Jabber IDs de la comprovació CAPTCHA"}.
{"Export data of all users in the server to PIEFXIS files (XEP-0227):","Exportar dades de tots els usuaris del servidor a arxius PIEFXIS (XEP-0227):"}.
{"Export data of users in a host to PIEFXIS files (XEP-0227):","Exportar dades d'usuaris d'un host a arxius PIEFXIS (XEP-0227):"}.
{"Failed to extract JID from your voice request approval","No s'ha pogut extraure el JID de la teva aprovació de petició de veu"}.
{"Family Name","Cognom"}.
{"February","Febrer"}.
{"Fill in fields to search for any matching Jabber User","Emplena camps per a buscar usuaris Jabber que concorden"}.
{"Fill in the form to search for any matching Jabber User (Add * to the end of field to match substring)","Emplena el formulari per a buscar usuaris Jabber. Afegix * al final d'un camp per a buscar subcadenes."}.
{"Friday","Divendres"}.
{"From","De"}.
{"From ~s","De ~s"}.
{"Full Name","Nom complet"}.
{"Get Number of Online Users","Obtenir Número d'Usuaris Connectats"}.
{"Get Number of Registered Users","Obtenir Número d'Usuaris Registrats"}.
{"Get User Last Login Time","Obtenir la última connexió d'Usuari"}.
{"Get User Password","Obtenir Contrasenya d'usuari"}.
{"Get User Statistics","Obtenir Estadístiques d'Usuari"}.
{"Grant voice to this person?","Concedir veu a aquesta persona?"}.
{"Group ","Grup "}.
{"Groups","Grups"}.
{"has been banned","Has sigut banejat"}.
{"has been kicked because of an affiliation change","Has sigut expulsat a causa d'un canvi d'afiliació"}.
{"has been kicked because of a system shutdown","Has sigut expulsat perquè el sistema s'ha apagat"}.
{"has been kicked because the room has been changed to members-only","Has sigut expulsat perquè la sala ha canviat a sols membres"}.
{"has been kicked","Has sigut expulsat"}.
{" has set the subject to: "," ha posat l'assumpte: "}.
{"Host","Host"}.
{"If you don't see the CAPTCHA image here, visit the web page.","Si no veus la imatge CAPTCHA açí, visita la pàgina web."}.
{"If you want to specify different ports, passwords, encodings for IRC servers, fill this list with values in format '{\"irc server\", \"encoding\", port, \"password\"}'. By default this service use \"~s\" encoding, port ~p, empty password.","Si vols especificar codificacions de caràcters diferents per a cada servidor IRC emplena aquesta llista amb els valors amb el format '{\"servidor irc\", \"codificació\", port, \"contrasenya\"}'. Aquest servei utilitza per defecte la codificació \"~s\", port ~p, no contrasenya."}.
{"Import Directory","Importar directori"}.
{"Import File","Importar fitxer"}.
{"Import user data from jabberd14 spool file:","Importar dades d'usuaris de l'arxiu de spool de jabberd14"}.
{"Import User from File at ","Importa usuari des de fitxer en "}.
{"Import users data from a PIEFXIS file (XEP-0227):","Importar dades d'usuaris des d'un arxiu PIEFXIS (XEP-0227):"}.
{"Import users data from jabberd14 spool directory:","Importar dades d'usuaris del directori de spool de jabberd14:"}.
{"Import Users from Dir at ","Importar usuaris des del directori en "}.
{"Import Users From jabberd14 Spool Files","Importar usuaris de jabberd14"}.
{"Improper message type","Tipus de missatge incorrecte"}.
{"Incorrect password","Contrasenya incorrecta"}.
{"Invalid affiliation: ~s","Afiliació invàlida: ~s"}.
{"Invalid role: ~s","Rol invàlid: ~s"}.
{"IP addresses","Adreça IP"}.
{"IP","IP"}.
{"IRC channel (don't put the first #)","Canal d'IRC (no posis la primera #)"}.
{"IRC server","Servidor d'IRC"}.
{"IRC settings","Configuració d'IRC."}.
{"IRC Transport","Transport a IRC"}.
{"IRC username","Nom d'usuari al IRC"}.
{"IRC Username","Nom d'usuari al IRC"}.
{"is now known as","ara es conegut com"}.
{"It is not allowed to send private messages","No està permés enviar missatges privats"}.
{"It is not allowed to send private messages of type \"groupchat\"","No està permés enviar missatges del tipus \"groupchat\""}.
{"It is not allowed to send private messages to the conference","No està permès l'enviament de missatges privats a la sala"}.
{"Jabber Account Registration","Registre de compte Jabber"}.
{"Jabber ID","ID Jabber"}.
{"Jabber ID ~s is invalid","El Jabber ID ~s no és vàlid"}.
{"January","Gener"}.
{"Join IRC channel","Entra a canal d'IRC"}.
{"joins the room","Entrar a la sala"}.
{"Join the IRC channel here.","Entra al canal d'IRC aquí."}.
{"Join the IRC channel in this Jabber ID: ~s","Entra al canal d'IRC en aquesta Jabber ID: ~s"}.
{"July","Juliol"}.
{"June","Juny"}.
{"Last Activity","Última activitat"}.
{"Last login","Últim login"}.
{"Last month","Últim mes"}.
{"Last year","Últim any"}.
{"leaves the room","Deixar la sala"}.
{"Listened Ports at ","Ports a la escolta en "}.
{"Listened Ports","Ports a l'escolta"}.
{"List of modules to start","Llista de mòduls a iniciar"}.
{"Low level update script","Script d'actualització de baix nivell"}.
{"Make participants list public","Crear una llista de participants pública"}.
{"Make room CAPTCHA protected","Crear una sala protegida per CAPTCHA"}.
{"Make room members-only","Crear una sala de \"només membres\""}.
{"Make room moderated","Crear una sala moderada"}.
{"Make room password protected","Crear una sala amb contrasenya"}.
{"Make room persistent","Crear una sala persistent"}.
{"Make room public searchable","Crear una sala pública"}.
{"March","Març"}.
{"Maximum Number of Occupants","Número màxim d'ocupants"}.
{"Max # of items to persist","Màxim # d'elements que persistixen"}.
{"Max payload size in bytes","Màxim tamany del payload en bytes"}.
{"May","Maig"}.
{"Membership is required to enter this room","Necessites ser membre d'aquesta sala per a poder entrar"}.
{"Members:","Membre:"}.
{"Memorize your password, or write it in a paper placed in a safe place. In Jabber there isn't an automated way to recover your password if you forget it.","Memoritza la teva contrasenya, o escriu-la en un paper guardat a un lloc segur.A Jabber no hi ha una forma automatitzada de recuperar la teva contrasenya si la oblides."}.
{"Memory","Memòria"}.
{"Message body","Missatge"}.
{"Middle Name","Segon nom"}.
{"Minimum interval between voice requests (in seconds)","Interval mínim entre peticions de veu (en segons)"}.
{"Moderator privileges required","Es necessita tenir privilegis de moderador"}.
{"moderators only","només moderadors"}.
{"Modified modules","Mòduls modificats"}.
{"Module","Mòdul"}.
{"Modules at ","Mòduls en "}.
{"Modules","Mòduls"}.
{"Monday","Dilluns"}.
{"Name:","Nom:"}.
{"Name","Nom"}.
{"Never","Mai"}.
{"New Password:","Nova Contrasenya:"}.
{"Nickname","Nickname"}.
{"Nickname Registration at ","Registre del Nickname en "}.
{"Nickname ~s does not exist in the room","El Nickname ~s no existeix a la sala"}.
{"nobody","ningú"}.
{"No body provided for announce message","No hi ha proveedor per al missatge anunci"}.
{"No Data","No hi ha dades"}.
{"Node ID","ID del Node"}.
{"Node ","Node "}.
{"Node not found","Node no trobat"}.
{"Nodes","Nodes"}.
{"No limit","Sense Llímit"}.
{"None","Cap"}.
{"No resource provided","Recurs no disponible"}.
{"Not Found","No Trobat"}.
{"Notify subscribers when items are removed from the node","Notificar subscriptors quan els elements són eliminats del node"}.
{"Notify subscribers when the node configuration changes","Notificar subscriptors quan canvia la configuració del node"}.
{"Notify subscribers when the node is deleted","Notificar subscriptors quan el node és eliminat"}.
{"November","Novembre"}.
{"Number of occupants","Número d'ocupants"}.
{"Number of online users","Número d'usuaris connectats"}.
{"Number of registered users","Número d'Usuaris Registrats"}.
{"October","Octubre"}.
{"Offline Messages:","Missatges fora de línia:"}.
{"Offline Messages","Missatges offline"}.
{"OK","Acceptar"}.
{"Old Password:","Antiga contrasenya:"}.
{"Online","Connectat"}.
{"Online Users","Usuaris conectats"}.
{"Online Users:","Usuaris en línia:"}.
{"Only deliver notifications to available users","Sols enviar notificacions als usuaris disponibles"}.
{"Only moderators and participants are allowed to change the subject in this room","Només els moderadors i participants poden canviar l'assumpte d'aquesta sala"}.
{"Only moderators are allowed to change the subject in this room","Només els moderadors poden canviar l'assumpte d'aquesta sala"}.
{"Only moderators can approve voice requests","Només els moderadors poden aprovar les peticions de veu"}.
{"Only occupants are allowed to send messages to the conference","Sols els ocupants poden enviar missatges a la sala"}.
{"Only occupants are allowed to send queries to the conference","Sols els ocupants poden enviar sol·licituds a la sala"}.
{"Only service administrators are allowed to send service messages","Sols els administradors del servei tenen permís per a enviar missatges de servei"}.
{"Options","Opcions"}.
{"Organization Name","Nom de la organizació"}.
{"Organization Unit","Unitat de la organizació"}.
{"Outgoing s2s Connections:","Connexions d'eixida s2s"}.
{"Outgoing s2s Connections","Connexions s2s d'eixida"}.
{"Outgoing s2s Servers:","Servidors d'eixida de s2s"}.
{"Owner privileges required","Es requerixen privilegis de propietari de la sala"}.
{"Packet","Paquet"}.
{"Password ~b","Contrasenya ~b"}.
{"Password:","Contrasenya:"}.
{"Password","Contrasenya"}.
{"Password Verification:","Verificació de la Contrasenya:"}.
{"Password Verification","Verificació de la Contrasenya"}.
{"Path to Dir","Ruta al directori"}.
{"Path to File","Ruta al fitxer"}.
{"Pending","Pendent"}.
{"Period: ","Període: "}.
{"Persist items to storage","Persistir elements al guardar"}.
{"Ping","Ping"}.
{"Please note that these options will only backup the builtin Mnesia database. If you are using the ODBC module, you also need to backup your SQL database separately.","Recorda que aquestes opcions només fan còpia de seguretat de la base de dades Mnesia. Si estàs utilitzant el mòdul d'ODBC també deus de fer una còpia de seguretat de la base de dades de SQL a part."}.
{"Please, wait for a while before sending new voice request","Si us plau, espera una mica abans d'enviar una nova petició de veu"}.
{"Pong","Pong"}.
{"Port ~b","Port ~b"}.
{"Port","Port"}.
{"Present real Jabber IDs to","Presentar Jabber ID's reals a"}.
{"private, ","privat"}.
{"Protocol","Protocol"}.
{"Publish-Subscribe","Publicar-subscriure't"}.
{"PubSub subscriber request","Petició de subscriptor PubSub"}.
{"Purge all items when the relevant publisher goes offline","Eliminar tots els elements quan el publicant relevant es desconnecti"}.
{"Queries to the conference members are not allowed in this room"," En aquesta sala no es permeten sol·licituds als membres de la conferència"}.
{"RAM and disc copy","Còpia en RAM i disc"}.
{"RAM copy","Còpia en RAM"}.
{"Raw","en format text"}.
{"Really delete message of the day?","Segur que vols eliminar el missatge del dia?"}.
{"Recipient is not in the conference room","El receptor no està en la sala de conferència"}.
{"Register a Jabber account","Registrar un compte Jabber"}.
{"Registered Users:","Usuaris registrats:"}.
{"Registered Users","Usuaris registrats"}.
{"Register","Registrar"}.
{"Registration in mod_irc for ","Registre en mod_irc per a"}.
{"Remote copy","Còpia remota"}.
{"Remove All Offline Messages","Eliminar tots els missatges offline"}.
{"Remove","Borrar"}.
{"Remove User","Eliminar usuari"}.
{"Replaced by new connection","Reemplaçat per una nova connexió"}.
{"Resources","Recursos"}.
{"Restart","Reiniciar"}.
{"Restart Service","Reiniciar el Servei"}.
{"Restore Backup from File at ","Restaura còpia de seguretat des del fitxer en "}.
{"Restore binary backup after next ejabberd restart (requires less memory):","Restaurar una còpia de seguretat binària després de reiniciar el ejabberd (requereix menys memòria:"}.
{"Restore binary backup immediately:","Restaurar una còpia de seguretat binària ara mateix."}.
{"Restore plain text backup immediately:","Restaurar una còpia de seguretat en format de text pla ara mateix:"}.
{"Restore","Restaurar"}.
{"Room Configuration","Configuració de la sala"}.
{"Room creation is denied by service policy","Se t'ha denegat el crear la sala per política del servei"}.
{"Room description","Descripció de la sala:"}.
{"Room Occupants","Nombre d'ocupants"}.
{"Room title","Títol de la sala"}.
{"Roster groups allowed to subscribe","Llista de grups que tenen permés subscriures"}.
{"Roster","Llista de contactes"}.
{"Roster of ","Llista de contactes de "}.
{"Roster size","Tamany de la llista"}.
{"RPC Call Error","Error de cridada RPC"}.
{"Running Nodes","Nodes funcionant"}.
{"~s access rule configuration","Configuració de les Regles d'Accés ~s"}.
{"Saturday","Dissabte"}.
{"Script check","Comprovar script"}.
{"Search Results for ","Resultat de la búsqueda"}.
{"Search users in ","Cerca usuaris en "}.
{"Send announcement to all online users","Enviar anunci a tots els usuaris connectats"}.
{"Send announcement to all online users on all hosts","Enviar anunci a tots els usuaris connectats a tots els hosts"}.
{"Send announcement to all users","Enviar anunci a tots els usuaris"}.
{"Send announcement to all users on all hosts","Enviar anunci a tots els usuaris de tots els hosts"}.
{"September","Setembre"}.
{"Server ~b","Servidor ~b"}.
{"Server:","Servidor:"}.
{"Set message of the day and send to online users","Configurar el missatge del dia i enviar a tots els usuaris"}.
{"Set message of the day on all hosts and send to online users","Escriure missatge del dia en tots els hosts i enviar-ho als usuaris connectats"}.
{"Shared Roster Groups","Grups de contactes compartits"}.
{"Show Integral Table","Mostrar Taula Integral"}.
{"Show Ordinary Table","Mostrar Taula Ordinaria"}.
{"Shut Down Service","Apager el Servei"}.
{"~s invites you to the room ~s","~s et convida a la sala ~s"}.
{"Some Jabber clients can store your password in your computer. Use that feature only if you trust your computer is safe.","Alguns clients Jabber poden emmagatzemar la teva contrasenya al teu ordinador. Fes servir aquesta característica només si saps que el teu ordinador és segur."}.
{"Specify the access model","Especificar el model d'accés"}.
{"Specify the event message type","Especifica el tipus de missatge d'event"}.
{"Specify the publisher model","Especificar el model del publicant"}.
{"~s's Offline Messages Queue","~s's cua de missatges offline"}.
{"Start","Iniciar"}.
{"Start Modules at ","Iniciar mòduls en "}.
{"Start Modules","Iniciar mòduls"}.
{"Statistics","Estadístiques"}.
{"Statistics of ~p","Estadístiques de ~p"}.
{"Stop","Detindre"}.
{"Stop Modules at ","Detindre mòduls en "}.
{"Stop Modules","Parar mòduls"}.
{"Stopped Nodes","Nodes parats"}.
{"Storage Type","Tipus d'emmagatzematge"}.
{"Store binary backup:","Guardar una còpia de seguretat binària:"}.
{"Store plain text backup:","Guardar una còpia de seguretat en format de text pla:"}.
{"Subject","Assumpte"}.
{"Submit","Enviar"}.
{"Submitted","Enviat"}.
{"Subscriber Address","Adreça del Subscriptor"}.
{"Subscription","Subscripció"}.
{"Sunday","Diumenge"}.
{"That nickname is already in use by another occupant","El Nickname està siguent utilitzat per una altra persona"}.
{"That nickname is registered by another person","El nickname ja està registrat per una altra persona"}.
{"The CAPTCHA is valid.","El CAPTCHA es vàlid."}.
{"The CAPTCHA verification has failed","La verificació CAPTCHA ha fallat"}.
{"The collections with which a node is affiliated","Les col.leccions amb les que un node està afiliat"}.
{"the password is","la contrasenya és"}.
{"The password is too weak","La contrasenya és massa simple"}.
{"The password of your Jabber account was successfully changed.","La contrasenya del teu compte Jabber s'ha canviat correctament."}.
{"There was an error changing the password: ","Hi ha hagut un error canviant la contrasenya: "}.
{"There was an error creating the account: ","Hi ha hagut un error creant el compte: "}.
{"There was an error deleting the account: ","Hi ha hagut un error esborrant el compte: "}.
{"This is case insensitive: macbeth is the same that MacBeth and Macbeth.","Això no distingeix majúscules de minúscules: macbeth es el mateix que MacBeth i Macbeth."}.
{"This page allows to create a Jabber account in this Jabber server. Your JID (Jabber IDentifier) will be of the form: username@server. Please read carefully the instructions to fill correctly the fields.","Aquesta pàgina permet crear un compte Jabber en aquest servidor Jabber. El teu JID (Jabber IDentifier; Identificador Jabber) tindrà aquesta forma: usuari@servidor. Si us plau, llegeix amb cura les instruccions per emplenar correctament els camps."}.
{"This page allows to unregister a Jabber account in this Jabber server.","Aquesta pàgina permet anul·lar el registre d'un compte Jabber en aquest servidor Jabber."}.
{"This participant is kicked from the room because he sent an error message","Aquest participant ha sigut expulsat de la sala perque ha enviat un missatge d'error"}.
{"This participant is kicked from the room because he sent an error message to another participant","Aquest participant ha sigut expulsat de la sala perque ha enviat un missatge erroni a un altre participant"}.
{"This participant is kicked from the room because he sent an error presence","Aquest participant ha sigut expulsat de la sala perque ha enviat un error de presencia"}.
{"This room is not anonymous","Aquesta sala no és anònima"}.
{"Thursday","Dijous"}.
{"Time","Data"}.
{"Time delay","Temps de retard"}.
{"Too many CAPTCHA requests","Massa peticions de CAPTCHA"}.
{"To","Per a"}.
{"To ~s","A ~s"}.
{"Traffic rate limit is exceeded","El llímit de tràfic ha sigut sobrepassat"}.
{"Transactions Aborted:","Transaccions Avortades"}.
{"Transactions Committed:","Transaccions Realitzades:"}.
{"Transactions Logged:","Transaccions registrades"}.
{"Transactions Restarted:","Transaccions reiniciades"}.
{"Tuesday","Dimarts"}.
{"Unable to generate a CAPTCHA","No s'ha pogut generar un CAPTCHA"}.
{"Unauthorized","No autoritzat"}.
{"Unregister a Jabber account","Anul·lar el registre d'un compte Jabber"}.
{"Unregister","Anul·lar el registre"}.
{"Update ","Actualitzar"}.
{"Update","Actualitzar"}.
{"Update message of the day (don't send)","Actualitzar el missatge del dia (no enviar)"}.
{"Update message of the day on all hosts (don't send)","Actualitza el missatge del dia en tots els hosts (no enviar)"}.
{"Update plan","Pla d'actualització"}.
{"Update script","Script d'actualització"}.
{"Uptime:","Temps en marxa"}.
{"Use of STARTTLS required","És obligatori utilitzar STARTTLS"}.
{"User JID","JID del usuari "}.
{"User Management","Gestió d'Usuaris"}.
{"Username:","Nom d'usuari:"}.
{"Users are not allowed to register accounts so quickly","Els usuaris no tenen permís per a crear comptes tan depresa"}.
{"Users Last Activity","Última activitat d'usuari"}.
{"Users","Usuaris"}.
{"User ","Usuari "}.
{"User","Usuari"}.
{"Validate","Validar"}.
{"vCard User Search","Recerca de vCard d'usuari"}.
{"Virtual Hosts","Hosts virtuals"}.
{"Visitors are not allowed to change their nicknames in this room","Els visitants no tenen permés canviar el seus Nicknames en esta sala"}.
{"Visitors are not allowed to send messages to all occupants","Els visitants no poden enviar missatges a tots els ocupants"}.
{"Voice request","Petició de veu"}.
{"Voice requests are disabled in this conference","Les peticions de veu es troben desactivades en aquesta conferència"}.
{"Wednesday","Dimecres"}.
{"When to send the last published item","Quan s'ha enviat l'última publicació"}.
{"Whether to allow subscriptions","Permetre subscripcions"}.
{"You can later change your password using a Jabber client.","Podràs canviar la teva contrasenya més endavant utilitzant un client Jabber."}.
{"You have been banned from this room","Has sigut bloquejat en aquesta sala"}.
{"You must fill in field \"Nickname\" in the form","Deus d'omplir el camp \"Nickname\" al formulari"}.
{"You need a client that supports x:data and CAPTCHA to register","Necessites un client amb suport x:data i de CAPTCHA para poder registrar-te"}.
{"You need a client that supports x:data to register the nickname","Necessites un client amb suport x:data per a poder registrar el Nickname"}.
{"You need an x:data capable client to configure mod_irc settings","Necessites un client amb suport x:data per a configurar les opcions de mod_irc"}.
{"You need an x:data capable client to configure room","Necessites un client amb suport x:data per a configurar la sala"}.
{"You need an x:data capable client to search","Necessites un client amb suport x:data per a poder buscar"}.
{"Your active privacy list has denied the routing of this stanza.","La teva llista de privacitat activa ha denegat l'encaminament d'aquesta stanza."}.
{"Your contact offline message queue is full. The message has been discarded.","La cua de missatges offline és plena. El missatge ha sigut descartat"}.
{"Your Jabber account was successfully created.","El teu compte Jabber ha sigut creat correctament."}.
{"Your Jabber account was successfully deleted.","El teu compte Jabber ha sigut esborrat correctament."}.
{"Your messages to ~s are being blocked. To unblock them, visit ~s","Els teus missatges per ~s s'estan bloquejant. Per desbloquejar-los, visita ~s"}.
ejabberd-2.1.11/src/msgs/eo.po 0000664 0000000 0000000 00000153326 12240230175 012733 0 ustar msgid ""
msgstr ""
"Project-Id-Version: 2.1.0-alpha\n"
"POT-Creation-Date: \n"
"PO-Revision-Date: \n"
"Last-Translator: Andreas van Cranenburgh \n"
"Language-Team: \n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Language: Esperanto\n"
#: ejabberd_c2s.erl:424 ejabberd_c2s.erl:727
msgid "Use of STARTTLS required"
msgstr "Uzo de STARTTLS bezonata"
#: ejabberd_c2s.erl:503
msgid "No resource provided"
msgstr "Neniu risurco donita"
#: ejabberd_c2s.erl:1197
msgid "Replaced by new connection"
msgstr "Anstataŭigita je nova konekto"
#: ejabberd_c2s.erl:1885
msgid "Your active privacy list has denied the routing of this stanza."
msgstr "Via aktiva privatec-listo malpermesas enkursigi ĉi-tiun pakaĵon"
#: ejabberd_captcha.erl:96 ejabberd_captcha.erl:152 ejabberd_captcha.erl:178
msgid "Enter the text you see"
msgstr "Enmetu montrita teksto"
#: ejabberd_captcha.erl:101
msgid "Your messages to ~s are being blocked. To unblock them, visit ~s"
msgstr "Viaj mesaĝoj al ~s estas blokata. Por malbloki ilin, iru al ~s"
#: ejabberd_captcha.erl:134
msgid "If you don't see the CAPTCHA image here, visit the web page."
msgstr "Se vi ne vidas la CAPTCHA-imagon jene, vizitu la teksaĵ-paĝon."
#: ejabberd_captcha.erl:146
msgid "CAPTCHA web page"
msgstr "CAPTCHA teksaĵ-paĝo"
#: ejabberd_captcha.erl:307
msgid "The CAPTCHA is valid."
msgstr "La CAPTCHA ĝustas"
#: mod_adhoc.erl:95 mod_adhoc.erl:125 mod_adhoc.erl:143 mod_adhoc.erl:161
msgid "Commands"
msgstr "Ordonoj"
#: mod_adhoc.erl:149 mod_adhoc.erl:243
msgid "Ping"
msgstr "Sondaĵo"
#: mod_adhoc.erl:260
msgid "Pong"
msgstr "Resondaĵo"
#: mod_announce.erl:507 mod_announce_odbc.erl:499
msgid "Really delete message of the day?"
msgstr "Ĉu vere forigi mesaĝon de la tago?"
#: mod_announce.erl:515 mod_announce_odbc.erl:507 mod_configure.erl:1083
#: mod_configure.erl:1128
msgid "Subject"
msgstr "Temo"
#: mod_announce.erl:520 mod_announce_odbc.erl:512 mod_configure.erl:1088
#: mod_configure.erl:1133
msgid "Message body"
msgstr "Teksto de mesaĝo"
#: mod_announce.erl:600 mod_announce_odbc.erl:592
msgid "No body provided for announce message"
msgstr "Neniu teksto donita por anonc-mesaĝo"
#: mod_announce.erl:635 mod_announce_odbc.erl:627
msgid "Announcements"
msgstr "Anoncoj"
#: mod_announce.erl:637 mod_announce_odbc.erl:629
msgid "Send announcement to all users"
msgstr "Sendu anoncon al ĉiu uzanto"
#: mod_announce.erl:639 mod_announce_odbc.erl:631
msgid "Send announcement to all users on all hosts"
msgstr "Sendu anoncon al ĉiu uzanto de ĉiu gastigo"
#: mod_announce.erl:641 mod_announce_odbc.erl:633
msgid "Send announcement to all online users"
msgstr "Sendu anoncon al ĉiu konektata uzanto"
#: mod_announce.erl:643 mod_announce_odbc.erl:635 mod_configure.erl:1078
#: mod_configure.erl:1123
msgid "Send announcement to all online users on all hosts"
msgstr "Sendu anoncon al ĉiu konektata uzanto de ĉiu gastigo"
#: mod_announce.erl:645 mod_announce_odbc.erl:637
msgid "Set message of the day and send to online users"
msgstr "Enmetu mesaĝon de la tago kaj sendu al konektataj uzantoj"
#: mod_announce.erl:647 mod_announce_odbc.erl:639
msgid "Set message of the day on all hosts and send to online users"
msgstr ""
"Enmetu mesaĝon de la tago je ĉiu gastigo kaj sendu al konektataj uzantoj"
#: mod_announce.erl:649 mod_announce_odbc.erl:641
msgid "Update message of the day (don't send)"
msgstr "Ŝanĝu mesaĝon de la tago (ne sendu)"
#: mod_announce.erl:651 mod_announce_odbc.erl:643
msgid "Update message of the day on all hosts (don't send)"
msgstr "Ŝanĝu mesaĝon de la tago je ĉiu gastigo (ne sendu)"
#: mod_announce.erl:653 mod_announce_odbc.erl:645
msgid "Delete message of the day"
msgstr "Forigu mesaĝo de la tago"
#: mod_announce.erl:655 mod_announce_odbc.erl:647
msgid "Delete message of the day on all hosts"
msgstr "Forigu mesaĝo de la tago je ĉiu gastigo"
#: mod_configure.erl:114 mod_configure.erl:274 mod_configure.erl:296
#: mod_configure.erl:498
msgid "Configuration"
msgstr "Agordo"
#: mod_configure.erl:125 mod_configure.erl:576 web/ejabberd_web_admin.erl:1936
msgid "Database"
msgstr "Datumbazo"
#: mod_configure.erl:127 mod_configure.erl:595
msgid "Start Modules"
msgstr "Startu Modulojn"
#: mod_configure.erl:129 mod_configure.erl:596
msgid "Stop Modules"
msgstr "Haltigu Modulojn"
#: mod_configure.erl:131 mod_configure.erl:604 web/ejabberd_web_admin.erl:1937
msgid "Backup"
msgstr "Faru Sekurkopion"
#: mod_configure.erl:133 mod_configure.erl:605
msgid "Restore"
msgstr "Restaŭru"
#: mod_configure.erl:135 mod_configure.erl:606
msgid "Dump to Text File"
msgstr "Skribu en plata tekst-dosiero"
#: mod_configure.erl:137 mod_configure.erl:615
msgid "Import File"
msgstr "Importu dosieron"
#: mod_configure.erl:139 mod_configure.erl:616
msgid "Import Directory"
msgstr "Importu dosierujo"
#: mod_configure.erl:141 mod_configure.erl:581 mod_configure.erl:1057
msgid "Restart Service"
msgstr "Restartu Servon"
#: mod_configure.erl:143 mod_configure.erl:582 mod_configure.erl:1102
msgid "Shut Down Service"
msgstr "Haltigu Servon"
#: mod_configure.erl:145 mod_configure.erl:518 mod_configure.erl:1197
#: web/ejabberd_web_admin.erl:1527
msgid "Add User"
msgstr "Aldonu Uzanton"
#: mod_configure.erl:147 mod_configure.erl:519 mod_configure.erl:1219
msgid "Delete User"
msgstr "Forigu Uzanton"
#: mod_configure.erl:149 mod_configure.erl:520 mod_configure.erl:1231
msgid "End User Session"
msgstr "Haltigu Uzant-seancon"
#: mod_configure.erl:151 mod_configure.erl:521 mod_configure.erl:1243
#: mod_configure.erl:1255
msgid "Get User Password"
msgstr "Montru pasvorton de uzanto"
#: mod_configure.erl:153 mod_configure.erl:522
msgid "Change User Password"
msgstr "Ŝanĝu pasvorton de uzanto"
#: mod_configure.erl:155 mod_configure.erl:523 mod_configure.erl:1272
msgid "Get User Last Login Time"
msgstr "Montru tempon de lasta ensaluto"
#: mod_configure.erl:157 mod_configure.erl:524 mod_configure.erl:1284
msgid "Get User Statistics"
msgstr "Montru statistikojn de uzanto"
#: mod_configure.erl:159 mod_configure.erl:525
msgid "Get Number of Registered Users"
msgstr "Montru nombron de registritaj uzantoj"
#: mod_configure.erl:161 mod_configure.erl:526
msgid "Get Number of Online Users"
msgstr "Montru nombron de konektataj uzantoj"
#: mod_configure.erl:163 mod_configure.erl:509 web/ejabberd_web_admin.erl:831
#: web/ejabberd_web_admin.erl:872
msgid "Access Control Lists"
msgstr "Atingokontrol-listoj"
#: mod_configure.erl:165 mod_configure.erl:510 web/ejabberd_web_admin.erl:940
#: web/ejabberd_web_admin.erl:976
msgid "Access Rules"
msgstr "Atingo-reguloj"
#: mod_configure.erl:297 mod_configure.erl:499
msgid "User Management"
msgstr "Uzanto-administrado"
#: mod_configure.erl:500 web/ejabberd_web_admin.erl:1058
#: web/ejabberd_web_admin.erl:1462
msgid "Online Users"
msgstr "Konektataj Uzantoj"
#: mod_configure.erl:501
msgid "All Users"
msgstr "Ĉiuj Uzantoj"
#: mod_configure.erl:502
msgid "Outgoing s2s Connections"
msgstr "Elirantaj s-al-s-konektoj"
#: mod_configure.erl:503 web/ejabberd_web_admin.erl:1907
msgid "Running Nodes"
msgstr "Funkciantaj Nodoj"
#: mod_configure.erl:504 web/ejabberd_web_admin.erl:1909
msgid "Stopped Nodes"
msgstr "Neaktivaj Nodoj"
#: mod_configure.erl:577 mod_configure.erl:587 web/ejabberd_web_admin.erl:1953
msgid "Modules"
msgstr "Moduloj"
#: mod_configure.erl:578
msgid "Backup Management"
msgstr "Mastrumado de sekurkopioj"
#: mod_configure.erl:579
msgid "Import Users From jabberd14 Spool Files"
msgstr "Importu uzantojn de jabberd14-uzantdosieroj"
#: mod_configure.erl:699
msgid "To ~s"
msgstr "Al ~s"
#: mod_configure.erl:717
msgid "From ~s"
msgstr "De ~s"
#: mod_configure.erl:913
msgid "Database Tables Configuration at "
msgstr "Agordo de datumbaz-tabeloj je "
#: mod_configure.erl:918
msgid "Choose storage type of tables"
msgstr "Elektu konserv-tipon de tabeloj"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "Disc only copy"
msgstr "Nur disk-kopio"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "RAM and disc copy"
msgstr "RAM- kaj disk-kopio"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "RAM copy"
msgstr "RAM-kopio"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "Remote copy"
msgstr "Fora kopio"
#: mod_configure.erl:950
msgid "Stop Modules at "
msgstr "Haltigu modulojn je "
#: mod_configure.erl:954
msgid "Choose modules to stop"
msgstr "Elektu modulojn por fini"
#: mod_configure.erl:969
msgid "Start Modules at "
msgstr "Startu modulojn je "
#: mod_configure.erl:973
msgid "Enter list of {Module, [Options]}"
msgstr "Enmetu liston de {Modulo, [Elektebloj]}"
#: mod_configure.erl:974
msgid "List of modules to start"
msgstr "Listo de moduloj por starti"
#: mod_configure.erl:983
msgid "Backup to File at "
msgstr "Faru sekurkopion je "
#: mod_configure.erl:987 mod_configure.erl:1001
msgid "Enter path to backup file"
msgstr "Enmetu vojon por sekurkopio"
#: mod_configure.erl:988 mod_configure.erl:1002 mod_configure.erl:1016
#: mod_configure.erl:1030
msgid "Path to File"
msgstr "Voje de dosiero"
#: mod_configure.erl:997
msgid "Restore Backup from File at "
msgstr "Restaŭrigu de dosiero el "
#: mod_configure.erl:1011
msgid "Dump Backup to Text File at "
msgstr "Skribu sekurkopion en plata teksto al "
#: mod_configure.erl:1015
msgid "Enter path to text file"
msgstr "Enmetu vojon al plata teksto"
#: mod_configure.erl:1025
msgid "Import User from File at "
msgstr "Importu uzanton de dosiero el "
#: mod_configure.erl:1029
msgid "Enter path to jabberd14 spool file"
msgstr "Enmetu vojon al jabberd14-uzantdosiero"
#: mod_configure.erl:1039
msgid "Import Users from Dir at "
msgstr "Importu uzantojn de dosierujo ĉe "
#: mod_configure.erl:1043
msgid "Enter path to jabberd14 spool dir"
msgstr "Enmetu vojon al jabberd14-uzantdosierujo"
#: mod_configure.erl:1044
msgid "Path to Dir"
msgstr "Vojo al dosierujo"
#: mod_configure.erl:1060 mod_configure.erl:1105
msgid "Time delay"
msgstr "Prokrasto"
#: mod_configure.erl:1143
msgid "Access Control List Configuration"
msgstr "Agordo de atingokontrolo"
#: mod_configure.erl:1147
msgid "Access control lists"
msgstr "Atingokontrol-listoj"
#: mod_configure.erl:1171
msgid "Access Configuration"
msgstr "Agordo de atingo"
#: mod_configure.erl:1175
msgid "Access rules"
msgstr "Atingo-reguloj"
#: mod_configure.erl:1200 mod_configure.erl:1222 mod_configure.erl:1234
#: mod_configure.erl:1246 mod_configure.erl:1258 mod_configure.erl:1275
#: mod_configure.erl:1287 mod_configure.erl:1650 mod_configure.erl:1700
#: mod_configure.erl:1721 mod_roster.erl:943 mod_roster_odbc.erl:1060
#: mod_vcard.erl:472 mod_vcard_ldap.erl:554 mod_vcard_odbc.erl:448
msgid "Jabber ID"
msgstr "Jabber ID"
#: mod_configure.erl:1205 mod_configure.erl:1263 mod_configure.erl:1651
#: mod_configure.erl:1863 mod_muc/mod_muc_room.erl:3224 mod_register.erl:235
#: web/ejabberd_web_admin.erl:1520
msgid "Password"
msgstr "Pasvorto"
#: mod_configure.erl:1210
msgid "Password Verification"
msgstr "Pasvortkontrolo"
#: mod_configure.erl:1301
msgid "Number of registered users"
msgstr "Nombro de registritaj uzantoj"
#: mod_configure.erl:1315
msgid "Number of online users"
msgstr "Nombro de konektataj uzantoj"
#: mod_configure.erl:1682 web/ejabberd_web_admin.erl:1588
#: web/ejabberd_web_admin.erl:1743
msgid "Never"
msgstr "Neniam"
#: mod_configure.erl:1696 web/ejabberd_web_admin.erl:1601
#: web/ejabberd_web_admin.erl:1756
msgid "Online"
msgstr "Konektata"
#: mod_configure.erl:1701
msgid "Last login"
msgstr "Lasta ensaluto"
#: mod_configure.erl:1722
msgid "Roster size"
msgstr "Kontaktlist-grando"
#: mod_configure.erl:1723
msgid "IP addresses"
msgstr "IP-adresoj"
#: mod_configure.erl:1724
msgid "Resources"
msgstr "Risurcoj"
#: mod_configure.erl:1850
msgid "Administration of "
msgstr "Mastrumado de "
#: mod_configure.erl:1853
msgid "Action on user"
msgstr "Ago je uzanto"
#: mod_configure.erl:1857
msgid "Edit Properties"
msgstr "Redaktu atributojn"
#: mod_configure.erl:1860 web/ejabberd_web_admin.erl:1769
msgid "Remove User"
msgstr "Forigu uzanton"
#: mod_irc/mod_irc.erl:201 mod_irc/mod_irc_odbc.erl:196
#: mod_muc/mod_muc.erl:336 mod_muc/mod_muc_odbc.erl:342
msgid "Access denied by service policy"
msgstr "Atingo rifuzita de serv-politiko"
#: mod_irc/mod_irc.erl:401 mod_irc/mod_irc_odbc.erl:398
msgid "IRC Transport"
msgstr "IRC-transportilo"
#: mod_irc/mod_irc.erl:428 mod_irc/mod_irc_odbc.erl:425
msgid "ejabberd IRC module"
msgstr "ejabberd IRC-modulo"
#: mod_irc/mod_irc.erl:559 mod_irc/mod_irc_odbc.erl:568
msgid "You need an x:data capable client to configure mod_irc settings"
msgstr "Vi bezonas klienton kun x:data-funkcio por agordi mod_irc"
#: mod_irc/mod_irc.erl:566 mod_irc/mod_irc_odbc.erl:575
msgid "Registration in mod_irc for "
msgstr "Registraĵo en mod_irc de "
#: mod_irc/mod_irc.erl:571 mod_irc/mod_irc_odbc.erl:580
msgid ""
"Enter username, encodings, ports and passwords you wish to use for "
"connecting to IRC servers"
msgstr ""
"Enmetu uzantnomon,j enkodigojn, pordojn kaj pasvortojn kiujn vi volas uzi "
"por konektoj al IRC-serviloj"
#: mod_irc/mod_irc.erl:576 mod_irc/mod_irc_odbc.erl:585
msgid "IRC Username"
msgstr "IRC-kaŝnomo"
#: mod_irc/mod_irc.erl:586 mod_irc/mod_irc_odbc.erl:595
msgid ""
"If you want to specify different ports, passwords, encodings for IRC "
"servers, fill this list with values in format '{\"irc server\", \"encoding"
"\", port, \"password\"}'. By default this service use \"~s\" encoding, port "
"~p, empty password."
msgstr ""
"Se vi volas specifi diversajn pordojn, pasvortojn, enkodigojn por IRC-"
"serviloj, kompletigu la jenan liston kun la formo '{\"irc-servilo\", "
"\"enkodigo\", porto, \"pasvorto\"}'. Se ne specifita, ĉi tiu servilo uzas la "
"enkodigo \"~s\", porto ~p, malplena pasvorto."
#: mod_irc/mod_irc.erl:598 mod_irc/mod_irc_odbc.erl:607
msgid ""
"Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef."
"net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."
msgstr ""
"Ekzemplo: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"sekreto\"}, {\"vendetta."
"fef.net\", \"iso8859-1\", 7000}, {\"irc.iutestservilo.net\", \"utf-8\"}]."
#: mod_irc/mod_irc.erl:603 mod_irc/mod_irc_odbc.erl:612
msgid "Connections parameters"
msgstr "Konekto-parametroj"
#: mod_irc/mod_irc.erl:728 mod_irc/mod_irc_odbc.erl:757
msgid "Join IRC channel"
msgstr "Eniras IRC-babilejon"
#: mod_irc/mod_irc.erl:732 mod_irc/mod_irc_odbc.erl:761
msgid "IRC channel (don't put the first #)"
msgstr "IRC-babilejo (ne aldonu #-prefikson)"
#: mod_irc/mod_irc.erl:737 mod_irc/mod_irc_odbc.erl:766
msgid "IRC server"
msgstr "IRC-servilo"
#: mod_irc/mod_irc.erl:770 mod_irc/mod_irc.erl:774
#: mod_irc/mod_irc_odbc.erl:799 mod_irc/mod_irc_odbc.erl:803
msgid "Join the IRC channel here."
msgstr "Eniru IRC-babilejon jen"
#: mod_irc/mod_irc.erl:778 mod_irc/mod_irc_odbc.erl:807
msgid "Join the IRC channel in this Jabber ID: ~s"
msgstr "Eniru IRC-babilejon en ĉi Jabber-ID: ~s"
#: mod_irc/mod_irc.erl:863 mod_irc/mod_irc_odbc.erl:904
msgid "IRC settings"
msgstr "IRC agordoj"
#: mod_irc/mod_irc.erl:868 mod_irc/mod_irc_odbc.erl:909
#, fuzzy
msgid ""
"Enter username and encodings you wish to use for connecting to IRC servers. "
"Press 'Next' to get more fields to fill in. Press 'Complete' to save "
"settings."
msgstr ""
"Enmetu uzantnomon kaj enkodigoj kiujn vi volas uzi por konektoj al IRC-"
"serviloj. Elektu \"Sekvonto\" por ekhavi pliajn kampojn. Elektu \"Kompletigu"
"\" por savi agordojn."
#: mod_irc/mod_irc.erl:874 mod_irc/mod_irc_odbc.erl:915
msgid "IRC username"
msgstr "IRC-uzantnomo"
#: mod_irc/mod_irc.erl:923 mod_irc/mod_irc_odbc.erl:964
msgid "Password ~b"
msgstr "Pasvorto ~b"
#: mod_irc/mod_irc.erl:928 mod_irc/mod_irc_odbc.erl:969
msgid "Port ~b"
msgstr "Pordo ~b"
#: mod_irc/mod_irc.erl:933 mod_irc/mod_irc_odbc.erl:974
msgid "Encoding for server ~b"
msgstr "Enkodigo por servilo ~b"
#: mod_irc/mod_irc.erl:942 mod_irc/mod_irc_odbc.erl:983
msgid "Server ~b"
msgstr "Servilo ~b"
#: mod_muc/mod_muc.erl:449 mod_muc/mod_muc_odbc.erl:456
msgid "Only service administrators are allowed to send service messages"
msgstr "Nur servo-administrantoj rajtas sendi serv-mesaĝojn"
#: mod_muc/mod_muc.erl:493 mod_muc/mod_muc_odbc.erl:500
msgid "Room creation is denied by service policy"
msgstr "Ĉi tiu serv-politiko ne permesas babilejo-kreadon"
#: mod_muc/mod_muc.erl:500 mod_muc/mod_muc_odbc.erl:507
msgid "Conference room does not exist"
msgstr "Babilejo ne ekzistas"
#: mod_muc/mod_muc.erl:582 mod_muc/mod_muc_odbc.erl:595
msgid "Chatrooms"
msgstr "Babilejoj"
#: mod_muc/mod_muc.erl:712 mod_muc/mod_muc_odbc.erl:729
msgid "You need a client that supports x:data to register the nickname"
msgstr "Vi bezonas klienton subtenante x:data-funkcio por registri kaŝnomon"
#: mod_muc/mod_muc.erl:718 mod_muc/mod_muc_odbc.erl:735
msgid "Nickname Registration at "
msgstr "Kaŝnomo-registrado je "
#: mod_muc/mod_muc.erl:722 mod_muc/mod_muc_odbc.erl:739
msgid "Enter nickname you want to register"
msgstr "Enmetu kaŝnomon kiun vi volas registri"
#: mod_muc/mod_muc.erl:723 mod_muc/mod_muc_odbc.erl:740
#: mod_muc/mod_muc_room.erl:3810 mod_roster.erl:944 mod_roster_odbc.erl:1061
#: mod_vcard.erl:364 mod_vcard.erl:477 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:453
msgid "Nickname"
msgstr "Kaŝnomo"
#: mod_muc/mod_muc.erl:762 mod_muc/mod_muc_odbc.erl:784
#: mod_muc/mod_muc_room.erl:1064 mod_muc/mod_muc_room.erl:1787
msgid "That nickname is registered by another person"
msgstr "Kaŝnomo estas registrita de alia persono"
#: mod_muc/mod_muc.erl:788 mod_muc/mod_muc_odbc.erl:811
msgid "You must fill in field \"Nickname\" in the form"
msgstr "Vi devas kompletigi la \"Kaŝnomo\" kampon"
#: mod_muc/mod_muc.erl:808 mod_muc/mod_muc_odbc.erl:831
msgid "ejabberd MUC module"
msgstr "ejabberd MUC-modulo"
#: mod_muc/mod_muc_log.erl:374 mod_muc/mod_muc_log.erl:381
msgid "Chatroom configuration modified"
msgstr "Agordo de babilejo ŝanĝita"
#: mod_muc/mod_muc_log.erl:384
msgid "joins the room"
msgstr "eniras la babilejo"
#: mod_muc/mod_muc_log.erl:387 mod_muc/mod_muc_log.erl:390
msgid "leaves the room"
msgstr "eliras la babilejo"
#: mod_muc/mod_muc_log.erl:393 mod_muc/mod_muc_log.erl:396
msgid "has been banned"
msgstr "estas forbarita"
#: mod_muc/mod_muc_log.erl:399 mod_muc/mod_muc_log.erl:402
msgid "has been kicked"
msgstr "estas forpelita"
#: mod_muc/mod_muc_log.erl:405
msgid "has been kicked because of an affiliation change"
msgstr "estas forpelita pro aparteneca ŝanĝo"
#: mod_muc/mod_muc_log.erl:408
msgid "has been kicked because the room has been changed to members-only"
msgstr "estas forpelita ĉar la babilejo fariĝis sole por membroj"
#: mod_muc/mod_muc_log.erl:411
msgid "has been kicked because of a system shutdown"
msgstr "estas forpelita pro sistem-haltigo"
#: mod_muc/mod_muc_log.erl:414
msgid "is now known as"
msgstr "nun nomiĝas"
#: mod_muc/mod_muc_log.erl:417 mod_muc/mod_muc_log.erl:688
#: mod_muc/mod_muc_room.erl:2393
msgid " has set the subject to: "
msgstr " ŝanĝis la temon al: "
#: mod_muc/mod_muc_log.erl:452
msgid "Chatroom is created"
msgstr "Babilejo kreita"
#: mod_muc/mod_muc_log.erl:453
msgid "Chatroom is destroyed"
msgstr "Babilejo neniigita"
#: mod_muc/mod_muc_log.erl:454
msgid "Chatroom is started"
msgstr "Babilejo lanĉita"
#: mod_muc/mod_muc_log.erl:455
msgid "Chatroom is stopped"
msgstr "Babilejo haltita"
#: mod_muc/mod_muc_log.erl:459
msgid "Monday"
msgstr "Lundo"
#: mod_muc/mod_muc_log.erl:460
msgid "Tuesday"
msgstr "Mardo"
#: mod_muc/mod_muc_log.erl:461
msgid "Wednesday"
msgstr "Merkredo"
#: mod_muc/mod_muc_log.erl:462
msgid "Thursday"
msgstr "Ĵaŭdo"
#: mod_muc/mod_muc_log.erl:463
msgid "Friday"
msgstr "Vendredo"
#: mod_muc/mod_muc_log.erl:464
msgid "Saturday"
msgstr "Sabato"
#: mod_muc/mod_muc_log.erl:465
msgid "Sunday"
msgstr "Dimanĉo"
#: mod_muc/mod_muc_log.erl:469
msgid "January"
msgstr "Januaro"
#: mod_muc/mod_muc_log.erl:470
msgid "February"
msgstr "Februaro"
#: mod_muc/mod_muc_log.erl:471
msgid "March"
msgstr "Marĉo"
#: mod_muc/mod_muc_log.erl:472
msgid "April"
msgstr "Aprilo"
#: mod_muc/mod_muc_log.erl:473
msgid "May"
msgstr "Majo"
#: mod_muc/mod_muc_log.erl:474
msgid "June"
msgstr "Junio"
#: mod_muc/mod_muc_log.erl:475
msgid "July"
msgstr "Julio"
#: mod_muc/mod_muc_log.erl:476
msgid "August"
msgstr "Aŭgusto"
#: mod_muc/mod_muc_log.erl:477
msgid "September"
msgstr "Septembro"
#: mod_muc/mod_muc_log.erl:478
msgid "October"
msgstr "Oktobro"
#: mod_muc/mod_muc_log.erl:479
msgid "November"
msgstr "Novembro"
#: mod_muc/mod_muc_log.erl:480
msgid "December"
msgstr "Decembro"
#: mod_muc/mod_muc_log.erl:750
msgid "Room Configuration"
msgstr "Babilejo-agordo"
#: mod_muc/mod_muc_log.erl:759
msgid "Room Occupants"
msgstr "Nombro de ĉeestantoj"
#: mod_muc/mod_muc_room.erl:174
msgid "Traffic rate limit is exceeded"
msgstr "Trafikrapida limigo superita"
#: mod_muc/mod_muc_room.erl:246
msgid ""
"This participant is kicked from the room because he sent an error message"
msgstr ""
"Ĉi tiu partoprenanta estas forpelata de la babilejo pro sendado de erar-"
"mesaĝo"
#: mod_muc/mod_muc_room.erl:255
msgid "It is not allowed to send private messages to the conference"
msgstr "Nur partoprenantoj rajtas sendi privatajn mesaĝojn al la babilejo"
#: mod_muc/mod_muc_room.erl:332
msgid "Please, wait for a while before sending new voice request"
msgstr "Bonvolu atendi iomete antaŭ ol sendi plian voĉ-peton"
#: mod_muc/mod_muc_room.erl:347
msgid "Voice requests are disabled in this conference"
msgstr "Voĉ-petoj estas malebligita en jena babilejo"
#: mod_muc/mod_muc_room.erl:364
msgid "Failed to extract JID from your voice request approval"
msgstr "Malsukcesis ekstrakti JID-on de via voĉ-pet-aprobo"
#: mod_muc/mod_muc_room.erl:393
msgid "Only moderators can approve voice requests"
msgstr "Nur moderigantoj povas aprobi voĉ-petojn"
#: mod_muc/mod_muc_room.erl:408
msgid "Improper message type"
msgstr "Malĝusta mesaĝo-tipo"
#: mod_muc/mod_muc_room.erl:518
msgid ""
"This participant is kicked from the room because he sent an error message to "
"another participant"
msgstr ""
"Ĉi tiu partoprenanto estas forpelata de la babilejo pro sendo de erar-mesaĝo "
"al alia partoprenanto"
#: mod_muc/mod_muc_room.erl:531
msgid "It is not allowed to send private messages of type \"groupchat\""
msgstr "Malpermesas sendi mesaĝojn de tipo \"groupchat\""
#: mod_muc/mod_muc_room.erl:543 mod_muc/mod_muc_room.erl:611
msgid "Recipient is not in the conference room"
msgstr "Ricevanto ne ĉeestas en la babilejo "
#: mod_muc/mod_muc_room.erl:564 mod_muc/mod_muc_room.erl:585
msgid "It is not allowed to send private messages"
msgstr "Ne estas permesata sendi privatajn mesaĝojn"
#: mod_muc/mod_muc_room.erl:576 mod_muc/mod_muc_room.erl:956
#: mod_muc/mod_muc_room.erl:4040
msgid "Only occupants are allowed to send messages to the conference"
msgstr "Nur partoprenantoj rajtas sendi mesaĝojn al la babilejo"
#: mod_muc/mod_muc_room.erl:634
msgid "Only occupants are allowed to send queries to the conference"
msgstr "Nur partoprenantoj rajtas sendi informmendojn al la babilejoj"
#: mod_muc/mod_muc_room.erl:646
msgid "Queries to the conference members are not allowed in this room"
msgstr "Malpermesas informmendoj al partoprenantoj en ĉi tiu babilejo"
#: mod_muc/mod_muc_room.erl:932
msgid ""
"Only moderators and participants are allowed to change the subject in this "
"room"
msgstr ""
"Nur moderigantoj kaj partoprenantoj rajtas ŝanĝi la temon en ĉi tiu babilejo"
#: mod_muc/mod_muc_room.erl:937
msgid "Only moderators are allowed to change the subject in this room"
msgstr "Nur moderigantoj rajtas ŝanĝi la temon en ĉi tiu babilejo"
#: mod_muc/mod_muc_room.erl:947
msgid "Visitors are not allowed to send messages to all occupants"
msgstr "Vizitantoj ne rajtas sendi mesaĝojn al ĉiuj partoprenantoj"
#: mod_muc/mod_muc_room.erl:1021
msgid ""
"This participant is kicked from the room because he sent an error presence"
msgstr ""
"Ĉi tiu partoprenanto estas forpelata de la babilejo pro sendo de erar-ĉeesto"
#: mod_muc/mod_muc_room.erl:1040
msgid "Visitors are not allowed to change their nicknames in this room"
msgstr ""
"Ne estas permesata al vizitantoj ŝanĝi siajn kaŝnomojn en ĉi tiu ĉambro"
#: mod_muc/mod_muc_room.erl:1053 mod_muc/mod_muc_room.erl:1779
msgid "That nickname is already in use by another occupant"
msgstr "Tiu kaŝnomo jam estas uzata de alia partoprenanto"
#: mod_muc/mod_muc_room.erl:1768
msgid "You have been banned from this room"
msgstr "Vi estas malpermesata en ĉi tiu babilejo"
#: mod_muc/mod_muc_room.erl:1771
msgid "Membership is required to enter this room"
msgstr "Membreco estas bezonata por eniri ĉi tiun babilejon"
#: mod_muc/mod_muc_room.erl:1807
msgid "This room is not anonymous"
msgstr "Ĉi tiu babilejo ne estas anonima"
#: mod_muc/mod_muc_room.erl:1833
msgid "A password is required to enter this room"
msgstr "Pasvorto estas bezonata por eniri ĉi tiun babilejon"
#: mod_muc/mod_muc_room.erl:1855 mod_register.erl:246
msgid "Too many CAPTCHA requests"
msgstr "Tro multaj CAPTCHA-petoj"
#: mod_muc/mod_muc_room.erl:1864 mod_register.erl:251
msgid "Unable to generate a CAPTCHA"
msgstr "Ne eblis krei CAPTCHA"
#: mod_muc/mod_muc_room.erl:1874
msgid "Incorrect password"
msgstr "Nekorekta pasvorto"
#: mod_muc/mod_muc_room.erl:2448
msgid "Administrator privileges required"
msgstr "Administrantaj rajtoj bezonata"
#: mod_muc/mod_muc_room.erl:2463
msgid "Moderator privileges required"
msgstr "Moderantaj rajtoj bezonata"
#: mod_muc/mod_muc_room.erl:2619
msgid "Jabber ID ~s is invalid"
msgstr "Jabber ID ~s estas nevalida"
#: mod_muc/mod_muc_room.erl:2633
msgid "Nickname ~s does not exist in the room"
msgstr "Kaŝnomo ~s ne ekzistas en la babilejo"
#: mod_muc/mod_muc_room.erl:2659 mod_muc/mod_muc_room.erl:3049
msgid "Invalid affiliation: ~s"
msgstr "Nevalida aparteneco: ~s"
#: mod_muc/mod_muc_room.erl:2713
msgid "Invalid role: ~s"
msgstr "Nevalida rolo: ~s"
#: mod_muc/mod_muc_room.erl:3026 mod_muc/mod_muc_room.erl:3062
msgid "Owner privileges required"
msgstr "Mastraj rajtoj bezonata"
#: mod_muc/mod_muc_room.erl:3195
msgid "Configuration of room ~s"
msgstr "Agordo de babilejo ~s"
#: mod_muc/mod_muc_room.erl:3200
msgid "Room title"
msgstr "Babilejo-nomo"
#: mod_muc/mod_muc_room.erl:3203 mod_muc/mod_muc_room.erl:3692
msgid "Room description"
msgstr "Babilejo-priskribo"
#: mod_muc/mod_muc_room.erl:3210
msgid "Make room persistent"
msgstr "Farigu babilejon daŭra"
#: mod_muc/mod_muc_room.erl:3215
msgid "Make room public searchable"
msgstr "Farigu babilejon publike trovebla"
#: mod_muc/mod_muc_room.erl:3218
msgid "Make participants list public"
msgstr "Farigu partoprento-liston publika"
#: mod_muc/mod_muc_room.erl:3221
msgid "Make room password protected"
msgstr "Farigu babilejon protektata per pasvorto"
#: mod_muc/mod_muc_room.erl:3232
msgid "Maximum Number of Occupants"
msgstr "Limigo de nombro de partoprenantoj"
#: mod_muc/mod_muc_room.erl:3239
msgid "No limit"
msgstr "Neniu limigo"
#: mod_muc/mod_muc_room.erl:3250
msgid "Present real Jabber IDs to"
msgstr "Montru verajn Jabber ID-ojn al"
#: mod_muc/mod_muc_room.erl:3258 mod_muc/mod_muc_room.erl:3292
msgid "moderators only"
msgstr "moderantoj sole"
#: mod_muc/mod_muc_room.erl:3260 mod_muc/mod_muc_room.erl:3294
msgid "anyone"
msgstr "iu ajn"
#: mod_muc/mod_muc_room.erl:3262
msgid "Make room members-only"
msgstr "Farigu babilejon sole por membroj"
#: mod_muc/mod_muc_room.erl:3265
msgid "Make room moderated"
msgstr "Farigu babilejon moderigata"
#: mod_muc/mod_muc_room.erl:3268
msgid "Default users as participants"
msgstr "Kutime farigu uzantojn kiel partpoprenantoj"
#: mod_muc/mod_muc_room.erl:3271
msgid "Allow users to change the subject"
msgstr "Permesu uzantojn ŝanĝi la temon"
#: mod_muc/mod_muc_room.erl:3274
msgid "Allow users to send private messages"
msgstr "Permesu uzantojn sendi privatajn mesaĝojn"
#: mod_muc/mod_muc_room.erl:3279
msgid "Allow visitors to send private messages to"
msgstr "Permesu uzantojn sendi privatajn mesaĝojn al"
#: mod_muc/mod_muc_room.erl:3290
msgid "nobody"
msgstr "neniu"
#: mod_muc/mod_muc_room.erl:3296
msgid "Allow users to query other users"
msgstr "Permesu uzantojn informpeti aliajn uzantojn"
#: mod_muc/mod_muc_room.erl:3299
msgid "Allow users to send invites"
msgstr "Permesu uzantojn sendi invitojn"
#: mod_muc/mod_muc_room.erl:3302
msgid "Allow visitors to send status text in presence updates"
msgstr "Permesu al vizitantoj sendi statmesaĝon en ĉeest-sciigoj"
#: mod_muc/mod_muc_room.erl:3305
msgid "Allow visitors to change nickname"
msgstr "Permesu al vizitantoj ŝanĝi siajn kaŝnomojn"
#: mod_muc/mod_muc_room.erl:3308
msgid "Allow visitors to send voice requests"
msgstr "Permesu uzantojn sendi voĉ-petojn"
#: mod_muc/mod_muc_room.erl:3311
msgid "Minimum interval between voice requests (in seconds)"
msgstr "Minimuma intervalo inter voĉ-petoj (je sekundoj)"
#: mod_muc/mod_muc_room.erl:3317
msgid "Make room CAPTCHA protected"
msgstr "Farigu babilejon protektata per CAPTCHA"
#: mod_muc/mod_muc_room.erl:3322
msgid "Exclude Jabber IDs from CAPTCHA challenge"
msgstr "Esceptu Ĵabber-identigilojn je CAPTCHA-defio"
#: mod_muc/mod_muc_room.erl:3329
msgid "Enable logging"
msgstr "Ŝaltu protokoladon"
#: mod_muc/mod_muc_room.erl:3337
msgid "You need an x:data capable client to configure room"
msgstr "Vi bezonas klienton kun x:data-funkcio por agordi la babilejon"
#: mod_muc/mod_muc_room.erl:3694
msgid "Number of occupants"
msgstr "Nombro de ĉeestantoj"
#: mod_muc/mod_muc_room.erl:3750
msgid "private, "
msgstr "privata, "
#: mod_muc/mod_muc_room.erl:3799
msgid "Voice request"
msgstr "Voĉ-peto"
#: mod_muc/mod_muc_room.erl:3803
msgid "Either approve or decline the voice request."
msgstr "Ĉu aprobu, aŭ malaprobu la voĉ-peton."
#: mod_muc/mod_muc_room.erl:3809
msgid "User JID"
msgstr "Uzant-JID"
#: mod_muc/mod_muc_room.erl:3811
msgid "Grant voice to this person?"
msgstr "Koncedu voĉon al ĉi-persono?"
#: mod_muc/mod_muc_room.erl:3960
msgid "~s invites you to the room ~s"
msgstr "~s invitas vin al la babilejo ~s"
#: mod_muc/mod_muc_room.erl:3969
msgid "the password is"
msgstr "la pasvorto estas"
#: mod_offline.erl:510 mod_offline_odbc.erl:352
msgid ""
"Your contact offline message queue is full. The message has been discarded."
msgstr ""
"Mesaĝo-atendovico de la senkonekta kontakto estas plena. La mesaĝo estas "
"forĵetita"
#: mod_offline.erl:560 mod_offline_odbc.erl:408
msgid "~s's Offline Messages Queue"
msgstr "Mesaĝo-atendovico de ~s"
#: mod_offline.erl:563 mod_offline_odbc.erl:411 mod_roster.erl:987
#: mod_roster_odbc.erl:1104 mod_shared_roster.erl:901
#: mod_shared_roster.erl:1010 mod_shared_roster_odbc.erl:930
#: mod_shared_roster_odbc.erl:1039 web/ejabberd_web_admin.erl:833
#: web/ejabberd_web_admin.erl:874 web/ejabberd_web_admin.erl:942
#: web/ejabberd_web_admin.erl:978 web/ejabberd_web_admin.erl:1019
#: web/ejabberd_web_admin.erl:1508 web/ejabberd_web_admin.erl:1760
#: web/ejabberd_web_admin.erl:1931 web/ejabberd_web_admin.erl:1963
#: web/ejabberd_web_admin.erl:2031 web/ejabberd_web_admin.erl:2135
#: web/ejabberd_web_admin.erl:2160 web/ejabberd_web_admin.erl:2248
msgid "Submitted"
msgstr "Sendita"
#: mod_offline.erl:571
msgid "Time"
msgstr "Tempo"
#: mod_offline.erl:572
msgid "From"
msgstr "De"
#: mod_offline.erl:573
msgid "To"
msgstr "Ĝis"
#: mod_offline.erl:574 mod_offline_odbc.erl:419
msgid "Packet"
msgstr "Pakaĵo"
#: mod_offline.erl:587 mod_offline_odbc.erl:432 mod_shared_roster.erl:908
#: mod_shared_roster_odbc.erl:937 web/ejabberd_web_admin.erl:882
#: web/ejabberd_web_admin.erl:986
msgid "Delete Selected"
msgstr "Forigu elektata(j)n"
#: mod_offline.erl:645 mod_offline_odbc.erl:519
msgid "Offline Messages:"
msgstr "Liverontaj mesaĝoj"
#: mod_offline.erl:645 mod_offline_odbc.erl:519
msgid "Remove All Offline Messages"
msgstr "Forigu ĉiujn liverontajn mesaĝojn"
#: mod_proxy65/mod_proxy65_service.erl:213
msgid "ejabberd SOCKS5 Bytestreams module"
msgstr "ejabberd SOCKS5 Bajtfluo modulo"
#: mod_pubsub/mod_pubsub.erl:1120 mod_pubsub/mod_pubsub_odbc.erl:929
msgid "Publish-Subscribe"
msgstr "Public-Abonado"
#: mod_pubsub/mod_pubsub.erl:1214 mod_pubsub/mod_pubsub_odbc.erl:1025
msgid "ejabberd Publish-Subscribe module"
msgstr "ejabberd Public-Abonada modulo"
#: mod_pubsub/mod_pubsub.erl:1497 mod_pubsub/mod_pubsub_odbc.erl:1312
msgid "PubSub subscriber request"
msgstr "PubAbo abonpeto"
#: mod_pubsub/mod_pubsub.erl:1499 mod_pubsub/mod_pubsub_odbc.erl:1314
msgid "Choose whether to approve this entity's subscription."
msgstr "Elektu ĉu permesi la abonon de ĉi tiu ento"
#: mod_pubsub/mod_pubsub.erl:1505 mod_pubsub/mod_pubsub_odbc.erl:1320
msgid "Node ID"
msgstr "Nodo ID"
#: mod_pubsub/mod_pubsub.erl:1510 mod_pubsub/mod_pubsub_odbc.erl:1325
msgid "Subscriber Address"
msgstr "Abonanta adreso"
#: mod_pubsub/mod_pubsub.erl:1516 mod_pubsub/mod_pubsub_odbc.erl:1331
msgid "Allow this Jabber ID to subscribe to this pubsub node?"
msgstr "Ĉu permesi ĉi tiun Jabber ID aboni al la jena PubAbo-nodo"
#: mod_pubsub/mod_pubsub.erl:3474 mod_pubsub/mod_pubsub_odbc.erl:3287
msgid "Deliver payloads with event notifications"
msgstr "Liveru aĵojn de event-sciigoj"
#: mod_pubsub/mod_pubsub.erl:3475 mod_pubsub/mod_pubsub_odbc.erl:3288
msgid "Deliver event notifications"
msgstr "Liveru event-sciigojn"
#: mod_pubsub/mod_pubsub.erl:3476 mod_pubsub/mod_pubsub_odbc.erl:3289
msgid "Notify subscribers when the node configuration changes"
msgstr "Sciigu abonantoj kiam la agordo de la nodo ŝanĝas"
#: mod_pubsub/mod_pubsub.erl:3477 mod_pubsub/mod_pubsub_odbc.erl:3290
msgid "Notify subscribers when the node is deleted"
msgstr "Sciigu abonantoj kiam la nodo estas forigita"
#: mod_pubsub/mod_pubsub.erl:3478 mod_pubsub/mod_pubsub_odbc.erl:3291
msgid "Notify subscribers when items are removed from the node"
msgstr "Sciigu abonantoj kiam eroj estas forigita de la nodo"
#: mod_pubsub/mod_pubsub.erl:3479 mod_pubsub/mod_pubsub_odbc.erl:3292
msgid "Persist items to storage"
msgstr "Savu erojn en konservado"
#: mod_pubsub/mod_pubsub.erl:3480 mod_pubsub/mod_pubsub_odbc.erl:3293
msgid "A friendly name for the node"
msgstr "Kromnomo por ĉi tiu nodo"
#: mod_pubsub/mod_pubsub.erl:3481 mod_pubsub/mod_pubsub_odbc.erl:3294
msgid "Max # of items to persist"
msgstr "Maksimuma kiomo de eroj en konservado"
#: mod_pubsub/mod_pubsub.erl:3482 mod_pubsub/mod_pubsub_odbc.erl:3295
msgid "Whether to allow subscriptions"
msgstr "Ĉu permesi aboni"
#: mod_pubsub/mod_pubsub.erl:3483 mod_pubsub/mod_pubsub_odbc.erl:3296
msgid "Specify the access model"
msgstr "Specifu atingo-modelon"
#: mod_pubsub/mod_pubsub.erl:3486 mod_pubsub/mod_pubsub_odbc.erl:3299
msgid "Roster groups allowed to subscribe"
msgstr "Kontaktlist-grupoj kiuj rajtas aboni"
#: mod_pubsub/mod_pubsub.erl:3487 mod_pubsub/mod_pubsub_odbc.erl:3300
msgid "Specify the publisher model"
msgstr "Enmetu publikadan modelon"
#: mod_pubsub/mod_pubsub.erl:3489 mod_pubsub/mod_pubsub_odbc.erl:3302
msgid "Purge all items when the relevant publisher goes offline"
msgstr "Forigu ĉiujn erojn kiam la rilata publikanto malkonektiĝas"
#: mod_pubsub/mod_pubsub.erl:3490 mod_pubsub/mod_pubsub_odbc.erl:3303
msgid "Specify the event message type"
msgstr "Specifu tipo de event-mesaĝo"
#: mod_pubsub/mod_pubsub.erl:3492 mod_pubsub/mod_pubsub_odbc.erl:3305
msgid "Max payload size in bytes"
msgstr "Maksimuma aĵo-grando je bajtoj"
#: mod_pubsub/mod_pubsub.erl:3493 mod_pubsub/mod_pubsub_odbc.erl:3306
msgid "When to send the last published item"
msgstr "Kiam sendi la laste publicitan eron"
#: mod_pubsub/mod_pubsub.erl:3495 mod_pubsub/mod_pubsub_odbc.erl:3308
msgid "Only deliver notifications to available users"
msgstr "Nur liveru sciigojn al konektataj uzantoj"
#: mod_pubsub/mod_pubsub.erl:3496 mod_pubsub/mod_pubsub_odbc.erl:3309
msgid "The collections with which a node is affiliated"
msgstr "Aro kun kiu nodo estas filigita"
#: mod_register.erl:193
msgid "The CAPTCHA verification has failed"
msgstr "La CAPTCHA-kontrolado malsukcesis"
#: mod_register.erl:220
msgid "You need a client that supports x:data and CAPTCHA to register"
msgstr ""
"Vi bezonas klienton subtenante x:data-funkcio kaj CAPTCHA por registri "
"kaŝnomon"
#: mod_register.erl:226 mod_register.erl:265
msgid "Choose a username and password to register with this server"
msgstr "Elektu uzantnomon kaj pasvorton por registri je ĉi tiu servilo"
#: mod_register.erl:230 mod_vcard.erl:364 mod_vcard_odbc.erl:342
#: web/ejabberd_web_admin.erl:1515 web/ejabberd_web_admin.erl:1572
msgid "User"
msgstr "Uzanto"
#: mod_register.erl:316 mod_register.erl:361
msgid "The password is too weak"
msgstr "La pasvorto estas ne sufiĉe forta"
#: mod_register.erl:365
msgid "Users are not allowed to register accounts so quickly"
msgstr "Ne estas permesata al uzantoj registri tiel rapide"
#: mod_roster.erl:938 mod_roster_odbc.erl:1055 web/ejabberd_web_admin.erl:1701
#: web/ejabberd_web_admin.erl:1886 web/ejabberd_web_admin.erl:1897
#: web/ejabberd_web_admin.erl:2219
msgid "None"
msgstr "Nenio"
#: mod_roster.erl:945 mod_roster_odbc.erl:1062
msgid "Subscription"
msgstr "Abono"
#: mod_roster.erl:946 mod_roster_odbc.erl:1063
msgid "Pending"
msgstr "Atendanta"
#: mod_roster.erl:947 mod_roster_odbc.erl:1064
msgid "Groups"
msgstr "Grupoj"
#: mod_roster.erl:974 mod_roster_odbc.erl:1091
msgid "Validate"
msgstr "Validigu"
#: mod_roster.erl:982 mod_roster_odbc.erl:1099
msgid "Remove"
msgstr "Forigu"
#: mod_roster.erl:985 mod_roster_odbc.erl:1102
msgid "Roster of "
msgstr "Kontaktlisto de "
#: mod_roster.erl:988 mod_roster_odbc.erl:1105 mod_shared_roster.erl:902
#: mod_shared_roster.erl:1011 mod_shared_roster_odbc.erl:931
#: mod_shared_roster_odbc.erl:1040 web/ejabberd_web_admin.erl:834
#: web/ejabberd_web_admin.erl:875 web/ejabberd_web_admin.erl:943
#: web/ejabberd_web_admin.erl:979 web/ejabberd_web_admin.erl:1020
#: web/ejabberd_web_admin.erl:1509 web/ejabberd_web_admin.erl:1761
#: web/ejabberd_web_admin.erl:1932 web/ejabberd_web_admin.erl:2136
#: web/ejabberd_web_admin.erl:2161
msgid "Bad format"
msgstr "Malĝusta formo"
#: mod_roster.erl:995 mod_roster_odbc.erl:1112
msgid "Add Jabber ID"
msgstr "Aldonu Jabber ID"
#: mod_roster.erl:1094 mod_roster_odbc.erl:1211
msgid "Roster"
msgstr "Kontaktlisto"
#: mod_shared_roster.erl:857 mod_shared_roster.erl:899
#: mod_shared_roster.erl:1007 mod_shared_roster_odbc.erl:886
#: mod_shared_roster_odbc.erl:928 mod_shared_roster_odbc.erl:1036
msgid "Shared Roster Groups"
msgstr "Komuna Kontaktlist-grupo"
#: mod_shared_roster.erl:895 mod_shared_roster_odbc.erl:924
#: web/ejabberd_web_admin.erl:1365 web/ejabberd_web_admin.erl:2461
msgid "Add New"
msgstr "Aldonu novan"
#: mod_shared_roster.erl:978 mod_shared_roster_odbc.erl:1007
msgid "Name:"
msgstr "Nomo:"
#: mod_shared_roster.erl:983 mod_shared_roster_odbc.erl:1012
msgid "Description:"
msgstr "Priskribo:"
#: mod_shared_roster.erl:991 mod_shared_roster_odbc.erl:1020
msgid "Members:"
msgstr "Membroj:"
#: mod_shared_roster.erl:999 mod_shared_roster_odbc.erl:1028
msgid "Displayed Groups:"
msgstr "Montrataj grupoj:"
#: mod_shared_roster.erl:1008 mod_shared_roster_odbc.erl:1037
msgid "Group "
msgstr "Grupo "
#: mod_shared_roster.erl:1017 mod_shared_roster_odbc.erl:1046
#: web/ejabberd_web_admin.erl:840 web/ejabberd_web_admin.erl:884
#: web/ejabberd_web_admin.erl:949 web/ejabberd_web_admin.erl:1026
#: web/ejabberd_web_admin.erl:2017
msgid "Submit"
msgstr "Sendu"
#: mod_vcard.erl:165 mod_vcard_ldap.erl:238 mod_vcard_odbc.erl:129
msgid "Erlang Jabber Server"
msgstr "Erlang-a Jabber-Servilo"
#: mod_vcard.erl:364 mod_vcard.erl:478 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:454
msgid "Birthday"
msgstr "Naskiĝtago"
#: mod_vcard.erl:364 mod_vcard.erl:480 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:456
msgid "City"
msgstr "Urbo"
#: mod_vcard.erl:364 mod_vcard.erl:479 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:455
msgid "Country"
msgstr "Lando"
#: mod_vcard.erl:364 mod_vcard.erl:481 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:457
msgid "Email"
msgstr "Retpoŝto"
#: mod_vcard.erl:364 mod_vcard.erl:476 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:452
msgid "Family Name"
msgstr "Lasta Nomo"
#: mod_vcard.erl:364 mod_vcard_odbc.erl:342
msgid ""
"Fill in the form to search for any matching Jabber User (Add * to the end of "
"field to match substring)"
msgstr ""
"Kompletigu la formon por serĉi rekonata Jabber-uzanto (Aldonu * je la fino "
"de la kampo por rekoni subĉenon"
#: mod_vcard.erl:364 mod_vcard.erl:473 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:449
msgid "Full Name"
msgstr "Plena Nomo"
#: mod_vcard.erl:364 mod_vcard.erl:475 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:451
msgid "Middle Name"
msgstr "Meza Nomo"
#: mod_vcard.erl:364 mod_vcard.erl:474 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:450 web/ejabberd_web_admin.erl:2006
msgid "Name"
msgstr "Nomo"
#: mod_vcard.erl:364 mod_vcard.erl:482 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:458
msgid "Organization Name"
msgstr "Organiz-nomo"
#: mod_vcard.erl:364 mod_vcard.erl:483 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:459
msgid "Organization Unit"
msgstr "Organiz-parto"
#: mod_vcard.erl:364 mod_vcard_ldap.erl:462 mod_vcard_odbc.erl:342
msgid "Search users in "
msgstr "Serĉu uzantojn en "
#: mod_vcard.erl:364 mod_vcard_ldap.erl:462 mod_vcard_odbc.erl:342
msgid "You need an x:data capable client to search"
msgstr "Vi bezonas klienton kun x:data-funkcio por serĉado"
#: mod_vcard.erl:389 mod_vcard_ldap.erl:487 mod_vcard_odbc.erl:367
msgid "vCard User Search"
msgstr "Serĉado de vizitkartoj"
#: mod_vcard.erl:445 mod_vcard_ldap.erl:541 mod_vcard_odbc.erl:421
msgid "ejabberd vCard module"
msgstr "ejabberd vCard-modulo"
#: mod_vcard.erl:469 mod_vcard_ldap.erl:551 mod_vcard_odbc.erl:445
msgid "Search Results for "
msgstr "Serĉ-rezultoj de "
#: mod_vcard_ldap.erl:462
msgid "Fill in fields to search for any matching Jabber User"
msgstr "Kompletigu la formon por serĉi rekonata Jabber-uzanto"
#: web/ejabberd_web_admin.erl:193 web/ejabberd_web_admin.erl:203
#: web/ejabberd_web_admin.erl:219 web/ejabberd_web_admin.erl:229
msgid "Unauthorized"
msgstr "Nepermesita"
#: web/ejabberd_web_admin.erl:286 web/ejabberd_web_admin.erl:303
msgid "ejabberd Web Admin"
msgstr "ejabberd Teksaĵa Administro"
#: web/ejabberd_web_admin.erl:769 web/ejabberd_web_admin.erl:780
msgid "Administration"
msgstr "Administro"
#: web/ejabberd_web_admin.erl:878 web/ejabberd_web_admin.erl:982
msgid "Raw"
msgstr "Kruda"
#: web/ejabberd_web_admin.erl:1017
msgid "~s access rule configuration"
msgstr "Agordo de atingo-reguloj de ~s"
#: web/ejabberd_web_admin.erl:1035
msgid "Virtual Hosts"
msgstr "Virtual-gastigoj"
#: web/ejabberd_web_admin.erl:1043 web/ejabberd_web_admin.erl:1050
msgid "Users"
msgstr "Uzantoj"
#: web/ejabberd_web_admin.erl:1078
msgid "Users Last Activity"
msgstr "Lasta aktiveco de uzanto"
#: web/ejabberd_web_admin.erl:1080
msgid "Period: "
msgstr "Periodo: "
#: web/ejabberd_web_admin.erl:1090
msgid "Last month"
msgstr "Lasta monato"
#: web/ejabberd_web_admin.erl:1091
msgid "Last year"
msgstr "Lasta jaro"
#: web/ejabberd_web_admin.erl:1092
msgid "All activity"
msgstr "Ĉiu aktiveco"
#: web/ejabberd_web_admin.erl:1094
msgid "Show Ordinary Table"
msgstr "Montru ordinaran tabelon"
#: web/ejabberd_web_admin.erl:1096
msgid "Show Integral Table"
msgstr "Montru integran tabelon"
#: web/ejabberd_web_admin.erl:1105 web/ejabberd_web_admin.erl:1939
msgid "Statistics"
msgstr "Statistikoj"
#: web/ejabberd_web_admin.erl:1117
msgid "Not Found"
msgstr "Ne trovita"
#: web/ejabberd_web_admin.erl:1134
msgid "Node not found"
msgstr "Nodo ne trovita"
#: web/ejabberd_web_admin.erl:1460
msgid "Host"
msgstr "Gastigo"
#: web/ejabberd_web_admin.erl:1461
msgid "Registered Users"
msgstr "Registritaj uzantoj"
#: web/ejabberd_web_admin.erl:1573
msgid "Offline Messages"
msgstr "Liverontaj mesaĝoj"
#: web/ejabberd_web_admin.erl:1574 web/ejabberd_web_admin.erl:1767
msgid "Last Activity"
msgstr "Lasta aktiveco"
#: web/ejabberd_web_admin.erl:1659 web/ejabberd_web_admin.erl:1675
msgid "Registered Users:"
msgstr "Registritaj uzantoj:"
#: web/ejabberd_web_admin.erl:1661 web/ejabberd_web_admin.erl:1677
#: web/ejabberd_web_admin.erl:2192
msgid "Online Users:"
msgstr "Konektataj uzantoj:"
#: web/ejabberd_web_admin.erl:1663
msgid "Outgoing s2s Connections:"
msgstr "Elirantaj s-al-s-konektoj:"
#: web/ejabberd_web_admin.erl:1665
msgid "Outgoing s2s Servers:"
msgstr "Elirantaj s-al-s-serviloj"
#: web/ejabberd_web_admin.erl:1734 web/mod_register_web.erl:175
#: web/mod_register_web.erl:372 web/mod_register_web.erl:381
#: web/mod_register_web.erl:411
msgid "Change Password"
msgstr "Ŝanĝu pasvorton"
#: web/ejabberd_web_admin.erl:1758
msgid "User "
msgstr "Uzanto "
#: web/ejabberd_web_admin.erl:1765
msgid "Connected Resources:"
msgstr "Konektataj risurcoj:"
#: web/ejabberd_web_admin.erl:1766 web/mod_register_web.erl:227
#: web/mod_register_web.erl:519
msgid "Password:"
msgstr "Pasvorto:"
#: web/ejabberd_web_admin.erl:1828
msgid "No Data"
msgstr "Neniu datumo"
#: web/ejabberd_web_admin.erl:1906
msgid "Nodes"
msgstr "Nodoj"
#: web/ejabberd_web_admin.erl:1929 web/ejabberd_web_admin.erl:1951
msgid "Node "
msgstr "Nodo "
#: web/ejabberd_web_admin.erl:1938
msgid "Listened Ports"
msgstr "Atentataj pordoj"
#: web/ejabberd_web_admin.erl:1940 web/ejabberd_web_admin.erl:2260
#: web/ejabberd_web_admin.erl:2448
msgid "Update"
msgstr "Ĝisdatigu"
#: web/ejabberd_web_admin.erl:1943 web/ejabberd_web_admin.erl:2569
msgid "Restart"
msgstr "Restartu"
#: web/ejabberd_web_admin.erl:1945 web/ejabberd_web_admin.erl:2571
msgid "Stop"
msgstr "Haltigu"
#: web/ejabberd_web_admin.erl:1959
msgid "RPC Call Error"
msgstr "Eraro de RPC-alvoko"
#: web/ejabberd_web_admin.erl:2000
msgid "Database Tables at "
msgstr "Datumbaz-tabeloj je "
#: web/ejabberd_web_admin.erl:2007
msgid "Storage Type"
msgstr "Konserv-tipo"
#: web/ejabberd_web_admin.erl:2008
msgid "Elements"
msgstr "Eroj"
#: web/ejabberd_web_admin.erl:2009
msgid "Memory"
msgstr "Memoro"
#: web/ejabberd_web_admin.erl:2032 web/ejabberd_web_admin.erl:2137
msgid "Error"
msgstr "Eraro"
#: web/ejabberd_web_admin.erl:2034
msgid "Backup of "
msgstr "Sekurkopio de "
#: web/ejabberd_web_admin.erl:2036
msgid ""
"Please note that these options will only backup the builtin Mnesia database. "
"If you are using the ODBC module, you also need to backup your SQL database "
"separately."
msgstr ""
"Rimarku ke ĉi tiuj elektebloj nur sekurkopias la propran Mnesia-datumbazon. "
"Se vi uzas la ODBC-modulon, vi ankaŭ devas sekurkopii tiujn SQL-datumbazoj "
"aparte."
#: web/ejabberd_web_admin.erl:2041
msgid "Store binary backup:"
msgstr "Konservu duuman sekurkopion:"
#: web/ejabberd_web_admin.erl:2045 web/ejabberd_web_admin.erl:2052
#: web/ejabberd_web_admin.erl:2060 web/ejabberd_web_admin.erl:2067
#: web/ejabberd_web_admin.erl:2074 web/ejabberd_web_admin.erl:2081
#: web/ejabberd_web_admin.erl:2088 web/ejabberd_web_admin.erl:2096
#: web/ejabberd_web_admin.erl:2103 web/ejabberd_web_admin.erl:2110
msgid "OK"
msgstr "Bone"
#: web/ejabberd_web_admin.erl:2048
msgid "Restore binary backup immediately:"
msgstr "Restaŭrigu duuman sekurkopion tuj:"
#: web/ejabberd_web_admin.erl:2056
msgid ""
"Restore binary backup after next ejabberd restart (requires less memory):"
msgstr "Restaŭrigu duuman sekurkopion post sekvonta ejabberd-restarto"
#: web/ejabberd_web_admin.erl:2063
msgid "Store plain text backup:"
msgstr "Skribu sekurkopion en plata tekstdosiero"
#: web/ejabberd_web_admin.erl:2070
msgid "Restore plain text backup immediately:"
msgstr "Restaŭrigu sekurkopion el plata tekstdosiero tuj"
#: web/ejabberd_web_admin.erl:2077
msgid "Import users data from a PIEFXIS file (XEP-0227):"
msgstr "Importu uzanto-datumojn de PIEFXIS dosiero (XEP-0227):"
#: web/ejabberd_web_admin.erl:2084
msgid "Export data of all users in the server to PIEFXIS files (XEP-0227):"
msgstr ""
"Eksportu datumojn de ĉiuj uzantoj en servilo al PIEFXIS dosieroj (XEP-0227):"
#: web/ejabberd_web_admin.erl:2091
msgid "Export data of users in a host to PIEFXIS files (XEP-0227):"
msgstr "Eksportu datumoj de uzantoj en gastigo al PIEFXIS dosieroj (XEP-0227):"
#: web/ejabberd_web_admin.erl:2099
msgid "Import user data from jabberd14 spool file:"
msgstr "Importu uzantojn de jabberd14-uzantdosieroj"
#: web/ejabberd_web_admin.erl:2106
msgid "Import users data from jabberd14 spool directory:"
msgstr "Importu uzantojn de jabberd14-uzantdosieroj"
#: web/ejabberd_web_admin.erl:2132
msgid "Listened Ports at "
msgstr "Atentataj pordoj je "
#: web/ejabberd_web_admin.erl:2157
msgid "Modules at "
msgstr "Moduloj je "
#: web/ejabberd_web_admin.erl:2183
msgid "Statistics of ~p"
msgstr "Statistikoj de ~p"
#: web/ejabberd_web_admin.erl:2186
msgid "Uptime:"
msgstr "Daŭro de funkciado"
#: web/ejabberd_web_admin.erl:2189
msgid "CPU Time:"
msgstr "CPU-tempo"
#: web/ejabberd_web_admin.erl:2195
msgid "Transactions Committed:"
msgstr "Transakcioj enmetitaj"
#: web/ejabberd_web_admin.erl:2198
msgid "Transactions Aborted:"
msgstr "Transakcioj nuligitaj"
#: web/ejabberd_web_admin.erl:2201
msgid "Transactions Restarted:"
msgstr "Transakcioj restartitaj"
#: web/ejabberd_web_admin.erl:2204
msgid "Transactions Logged:"
msgstr "Transakcioj protokolitaj"
#: web/ejabberd_web_admin.erl:2246
msgid "Update "
msgstr "Ĝisdatigu "
#: web/ejabberd_web_admin.erl:2254
msgid "Update plan"
msgstr "Ĝisdatigo-plano"
#: web/ejabberd_web_admin.erl:2255
msgid "Modified modules"
msgstr "Ĝisdatigitaj moduloj"
#: web/ejabberd_web_admin.erl:2256
msgid "Update script"
msgstr "Ĝisdatigo-skripto"
#: web/ejabberd_web_admin.erl:2257
msgid "Low level update script"
msgstr "Bazanivela ĝisdatigo-skripto"
#: web/ejabberd_web_admin.erl:2258
msgid "Script check"
msgstr "Skript-kontrolo"
#: web/ejabberd_web_admin.erl:2426
msgid "Port"
msgstr "Pordo"
#: web/ejabberd_web_admin.erl:2427
msgid "IP"
msgstr "IP"
#: web/ejabberd_web_admin.erl:2428
msgid "Protocol"
msgstr "Protokolo"
#: web/ejabberd_web_admin.erl:2429 web/ejabberd_web_admin.erl:2556
msgid "Module"
msgstr "Modulo"
#: web/ejabberd_web_admin.erl:2430 web/ejabberd_web_admin.erl:2557
msgid "Options"
msgstr "Elektebloj"
#: web/ejabberd_web_admin.erl:2450
msgid "Delete"
msgstr "Forigu"
#: web/ejabberd_web_admin.erl:2579
msgid "Start"
msgstr "Startu"
#: web/mod_register_web.erl:104
msgid "Your Jabber account was successfully created."
msgstr "Via Ĵabber-konto estis sukcese kreata."
#: web/mod_register_web.erl:107
msgid "There was an error creating the account: "
msgstr "Estis eraro dum kreado de la konto:"
#: web/mod_register_web.erl:115
msgid "Your Jabber account was successfully deleted."
msgstr "Via Ĵabber-konto estas sukcese forigita."
#: web/mod_register_web.erl:118
msgid "There was an error deleting the account: "
msgstr "Estis eraro dum forigado de la konto:"
#: web/mod_register_web.erl:128
msgid "The password of your Jabber account was successfully changed."
msgstr "La pasvorto de via Ĵabber-konto estas sukcese ŝanĝata."
#: web/mod_register_web.erl:131
msgid "There was an error changing the password: "
msgstr "Estis eraro dum ŝanĝi de la pasvortro:"
#: web/mod_register_web.erl:163 web/mod_register_web.erl:172
msgid "Jabber Account Registration"
msgstr "Ĵabber-konto registrado"
#: web/mod_register_web.erl:174 web/mod_register_web.erl:192
#: web/mod_register_web.erl:201
msgid "Register a Jabber account"
msgstr "Registru Ĵabber-konton"
#: web/mod_register_web.erl:176 web/mod_register_web.erl:493
#: web/mod_register_web.erl:502
msgid "Unregister a Jabber account"
msgstr "Malregistru Ĵabber-konton"
#: web/mod_register_web.erl:203
msgid ""
"This page allows to create a Jabber account in this Jabber server. Your JID "
"(Jabber IDentifier) will be of the form: username@server. Please read "
"carefully the instructions to fill correctly the fields."
msgstr ""
"Jena paĝo ebligas kreadon de Ĵabber-konto je ĉi-Ĵabber-servilo. Via JID "
"(Ĵabber-IDentigilo) estos ĉi-tiel: uzantnomo@servilo. Bonvolu legu bone la "
"instrukciojn por korekta enmetigo de la kampoj. "
#: web/mod_register_web.erl:212 web/mod_register_web.erl:386
#: web/mod_register_web.erl:509
msgid "Username:"
msgstr "Uzantnomo"
#: web/mod_register_web.erl:217
msgid "This is case insensitive: macbeth is the same that MacBeth and Macbeth."
msgstr "Uskleco ne signifas: macbeth estas la sama ol MacBeth kaj Macbeth."
#: web/mod_register_web.erl:218
msgid "Characters not allowed:"
msgstr "Karaktroj ne permesata:"
#: web/mod_register_web.erl:222 web/mod_register_web.erl:391
#: web/mod_register_web.erl:514
msgid "Server:"
msgstr "Servilo:"
#: web/mod_register_web.erl:232
msgid ""
"Don't tell your password to anybody, not even the administrators of the "
"Jabber server."
msgstr ""
"Ne donu vian pasvorton al iun ajn, eĉ ne al la administrantoj de la Ĵabber-"
"servilo."
#: web/mod_register_web.erl:234
msgid "You can later change your password using a Jabber client."
msgstr "Poste vi povas ŝanĝi vian pasvorton per Ĵabber-kliento."
#: web/mod_register_web.erl:235
msgid ""
"Some Jabber clients can store your password in your computer. Use that "
"feature only if you trust your computer is safe."
msgstr ""
"Kelkaj Ĵabber-klientoj povas memori vian pasvorton je via komputilo. Nur uzu "
"tiun eblon se vi fidas ke via komputilo estas sekura."
#: web/mod_register_web.erl:237
msgid ""
"Memorize your password, or write it in a paper placed in a safe place. In "
"Jabber there isn't an automated way to recover your password if you forget "
"it."
msgstr ""
"Memoru vian pasvorton, aŭ skribu ĝin sur papero formetata je sekura loko. Je "
"Ĵabber ne ekzistas aŭtomata metodo por reakiri vian pasvorton se vi forgesas "
"ĝin."
#: web/mod_register_web.erl:242 web/mod_register_web.erl:406
msgid "Password Verification:"
msgstr "Pasvortkontrolo:"
#: web/mod_register_web.erl:250
msgid "Register"
msgstr "Registru"
#: web/mod_register_web.erl:396
msgid "Old Password:"
msgstr "Malnova Pasvorto:"
#: web/mod_register_web.erl:401
msgid "New Password:"
msgstr "Nova Pasvorto:"
#: web/mod_register_web.erl:504
msgid "This page allows to unregister a Jabber account in this Jabber server."
msgstr "Jena pagxo ebligas malregistri Jxabber-konton je ĉi-servilo."
#: web/mod_register_web.erl:524
msgid "Unregister"
msgstr "Malregistru"
#, fuzzy
#~ msgid "Captcha test failed"
#~ msgstr "La aŭtomata Turingtesto estas ĝusta"
#~ msgid "Encodings"
#~ msgstr "Enkodigoj"
#~ msgid "(Raw)"
#~ msgstr "(Kruda)"
#~ msgid "Specified nickname is already registered"
#~ msgstr "Donita kaŝnomo jam estas registrita"
#~ msgid "Size"
#~ msgstr "Grando"
#~ msgid "You must fill in field \"nick\" in the form"
#~ msgstr "Vi devas enmeti kampon \"kaŝnomo\""
ejabberd-2.1.11/src/msgs/cs.po 0000664 0000000 0000000 00000154630 12240230175 012734 0 ustar msgid ""
msgstr ""
"Project-Id-Version: 2.1.0-alpha\n"
"Last-Translator: Lukáš Polívka [spike411] xmpp:spike411@jabber.cz\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Language: Czech (čeština)\n"
"X-Additional-Translator: Milos Svasek [DuxforD] from openheads.net\n"
#: ejabberd_c2s.erl:424 ejabberd_c2s.erl:727
msgid "Use of STARTTLS required"
msgstr "Je vyžadováno STARTTLS"
#: ejabberd_c2s.erl:503
msgid "No resource provided"
msgstr "Nebyl poskytnut žádný zdroj"
#: ejabberd_c2s.erl:1197
msgid "Replaced by new connection"
msgstr "Nahrazeno novým spojením"
#: ejabberd_c2s.erl:1885
msgid "Your active privacy list has denied the routing of this stanza."
msgstr "Vaše nastavení soukromí znemožnilo směrování této stance."
#: ejabberd_captcha.erl:96 ejabberd_captcha.erl:152 ejabberd_captcha.erl:178
msgid "Enter the text you see"
msgstr "Zadejte text, který vidíte"
#: ejabberd_captcha.erl:101
msgid "Your messages to ~s are being blocked. To unblock them, visit ~s"
msgstr "Nesmíte posílat zprávy na ~s. Pro povolení navštivte ~s"
#: ejabberd_captcha.erl:134
msgid "If you don't see the CAPTCHA image here, visit the web page."
msgstr "Pokud zde nevidíte obrázek CAPTCHA, přejděte na webovou stránku."
#: ejabberd_captcha.erl:146
msgid "CAPTCHA web page"
msgstr "Webová stránka CAPTCHA"
#: ejabberd_captcha.erl:307
msgid "The CAPTCHA is valid."
msgstr "CAPTCHA souhlasí."
#: mod_adhoc.erl:95 mod_adhoc.erl:125 mod_adhoc.erl:143 mod_adhoc.erl:161
msgid "Commands"
msgstr "Příkazy"
#: mod_adhoc.erl:149 mod_adhoc.erl:243
msgid "Ping"
msgstr "Ping"
#: mod_adhoc.erl:260
msgid "Pong"
msgstr "Pong"
#: mod_announce.erl:507 mod_announce_odbc.erl:499
msgid "Really delete message of the day?"
msgstr "Skutečně smazat zprávu dne?"
#: mod_announce.erl:515 mod_announce_odbc.erl:507 mod_configure.erl:1083
#: mod_configure.erl:1128
msgid "Subject"
msgstr "Předmět"
#: mod_announce.erl:520 mod_announce_odbc.erl:512 mod_configure.erl:1088
#: mod_configure.erl:1133
msgid "Message body"
msgstr "Tělo zprávy"
#: mod_announce.erl:600 mod_announce_odbc.erl:592
msgid "No body provided for announce message"
msgstr "Zpráva neobsahuje text"
#: mod_announce.erl:635 mod_announce_odbc.erl:627
msgid "Announcements"
msgstr "Oznámení"
#: mod_announce.erl:637 mod_announce_odbc.erl:629
msgid "Send announcement to all users"
msgstr "Odeslat oznámení všem uživatelům"
#: mod_announce.erl:639 mod_announce_odbc.erl:631
msgid "Send announcement to all users on all hosts"
msgstr "Odeslat oznámení všem uživatelům na všech hostitelích"
#: mod_announce.erl:641 mod_announce_odbc.erl:633
msgid "Send announcement to all online users"
msgstr "Odeslat oznámení všem online uživatelům"
#: mod_announce.erl:643 mod_announce_odbc.erl:635 mod_configure.erl:1078
#: mod_configure.erl:1123
msgid "Send announcement to all online users on all hosts"
msgstr "Odeslat oznámení všem online uživatelům na všech hostitelích"
#: mod_announce.erl:645 mod_announce_odbc.erl:637
msgid "Set message of the day and send to online users"
msgstr "Nastavit zprávu dne a odeslat ji online uživatelům"
#: mod_announce.erl:647 mod_announce_odbc.erl:639
msgid "Set message of the day on all hosts and send to online users"
msgstr "Nastavit zprávu dne a odeslat ji online uživatelům"
#: mod_announce.erl:649 mod_announce_odbc.erl:641
msgid "Update message of the day (don't send)"
msgstr "Aktualizovat zprávu dne (neodesílat)"
#: mod_announce.erl:651 mod_announce_odbc.erl:643
msgid "Update message of the day on all hosts (don't send)"
msgstr "Aktualizovat zprávu dne pro všechny hostitele (neodesílat)"
#: mod_announce.erl:653 mod_announce_odbc.erl:645
msgid "Delete message of the day"
msgstr "Smazat zprávu dne"
#: mod_announce.erl:655 mod_announce_odbc.erl:647
msgid "Delete message of the day on all hosts"
msgstr "Smazat zprávu dne na všech hostitelích"
#: mod_configure.erl:114 mod_configure.erl:274 mod_configure.erl:296
#: mod_configure.erl:498
msgid "Configuration"
msgstr "Konfigurace"
#: mod_configure.erl:125 mod_configure.erl:576 web/ejabberd_web_admin.erl:1936
msgid "Database"
msgstr "Databáze"
#: mod_configure.erl:127 mod_configure.erl:595
msgid "Start Modules"
msgstr "Spustit moduly"
#: mod_configure.erl:129 mod_configure.erl:596
msgid "Stop Modules"
msgstr "Zastavit moduly"
#: mod_configure.erl:131 mod_configure.erl:604 web/ejabberd_web_admin.erl:1937
msgid "Backup"
msgstr "Zálohovat"
#: mod_configure.erl:133 mod_configure.erl:605
msgid "Restore"
msgstr "Obnovit"
#: mod_configure.erl:135 mod_configure.erl:606
msgid "Dump to Text File"
msgstr "Uložit do textového souboru"
#: mod_configure.erl:137 mod_configure.erl:615
msgid "Import File"
msgstr "Import souboru"
#: mod_configure.erl:139 mod_configure.erl:616
msgid "Import Directory"
msgstr "Import adresáře"
#: mod_configure.erl:141 mod_configure.erl:581 mod_configure.erl:1057
msgid "Restart Service"
msgstr "Restartovat službu"
#: mod_configure.erl:143 mod_configure.erl:582 mod_configure.erl:1102
msgid "Shut Down Service"
msgstr "Vypnout službu"
#: mod_configure.erl:145 mod_configure.erl:518 mod_configure.erl:1197
#: web/ejabberd_web_admin.erl:1527
msgid "Add User"
msgstr "Přidat uživatele"
#: mod_configure.erl:147 mod_configure.erl:519 mod_configure.erl:1219
msgid "Delete User"
msgstr "Smazat uživatele"
#: mod_configure.erl:149 mod_configure.erl:520 mod_configure.erl:1231
msgid "End User Session"
msgstr "Ukončit sezení uživatele"
#: mod_configure.erl:151 mod_configure.erl:521 mod_configure.erl:1243
#: mod_configure.erl:1255
msgid "Get User Password"
msgstr "Získat heslo uživatele"
#: mod_configure.erl:153 mod_configure.erl:522
msgid "Change User Password"
msgstr "Změnit heslo uživatele"
#: mod_configure.erl:155 mod_configure.erl:523 mod_configure.erl:1272
msgid "Get User Last Login Time"
msgstr "Získat čas podleního přihlášení uživatele"
#: mod_configure.erl:157 mod_configure.erl:524 mod_configure.erl:1284
msgid "Get User Statistics"
msgstr "Získat statistiky uživatele"
#: mod_configure.erl:159 mod_configure.erl:525
msgid "Get Number of Registered Users"
msgstr "Získat počet registrovaných uživatelů"
#: mod_configure.erl:161 mod_configure.erl:526
msgid "Get Number of Online Users"
msgstr "Získat počet online uživatelů"
#: mod_configure.erl:163 mod_configure.erl:509 web/ejabberd_web_admin.erl:831
#: web/ejabberd_web_admin.erl:872
msgid "Access Control Lists"
msgstr "Seznamy přístupových práv (ACL)"
#: mod_configure.erl:165 mod_configure.erl:510 web/ejabberd_web_admin.erl:940
#: web/ejabberd_web_admin.erl:976
msgid "Access Rules"
msgstr "Pravidla přístupů"
#: mod_configure.erl:297 mod_configure.erl:499
msgid "User Management"
msgstr "Správa uživatelů"
#: mod_configure.erl:500 web/ejabberd_web_admin.erl:1058
#: web/ejabberd_web_admin.erl:1462
msgid "Online Users"
msgstr "Online uživatelé"
#: mod_configure.erl:501
msgid "All Users"
msgstr "Všichni uživatelé"
#: mod_configure.erl:502
msgid "Outgoing s2s Connections"
msgstr "Odchozí s2s spojení"
#: mod_configure.erl:503 web/ejabberd_web_admin.erl:1907
msgid "Running Nodes"
msgstr "Běžící uzly"
#: mod_configure.erl:504 web/ejabberd_web_admin.erl:1909
msgid "Stopped Nodes"
msgstr "Zastavené uzly"
#: mod_configure.erl:577 mod_configure.erl:587 web/ejabberd_web_admin.erl:1953
msgid "Modules"
msgstr "Moduly"
#: mod_configure.erl:578
msgid "Backup Management"
msgstr "Správa zálohování"
#: mod_configure.erl:579
msgid "Import Users From jabberd14 Spool Files"
msgstr "Importovat uživatele z jabberd14 spool souborů"
#: mod_configure.erl:699
msgid "To ~s"
msgstr "Pro ~s"
#: mod_configure.erl:717
msgid "From ~s"
msgstr "Od ~s"
#: mod_configure.erl:913
msgid "Database Tables Configuration at "
msgstr "Konfigurace databázových tabulek "
#: mod_configure.erl:918
msgid "Choose storage type of tables"
msgstr "Vyberte typ úložiště pro tabulky"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "Disc only copy"
msgstr "Jen kopie disku"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "RAM and disc copy"
msgstr "Kopie RAM a disku"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "RAM copy"
msgstr "Kopie RAM"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "Remote copy"
msgstr "Vzdálená kopie"
#: mod_configure.erl:950
msgid "Stop Modules at "
msgstr "Zastavit moduly na "
#: mod_configure.erl:954
msgid "Choose modules to stop"
msgstr "Vyberte moduly, které mají být zastaveny"
#: mod_configure.erl:969
msgid "Start Modules at "
msgstr "Spustit moduly na "
#: mod_configure.erl:973
msgid "Enter list of {Module, [Options]}"
msgstr "Vložte seznam modulů {Modul, [Parametry]}"
#: mod_configure.erl:974
msgid "List of modules to start"
msgstr "Seznam modulů, které mají být spuštěné"
#: mod_configure.erl:983
msgid "Backup to File at "
msgstr "Záloha do souboru na "
#: mod_configure.erl:987 mod_configure.erl:1001
msgid "Enter path to backup file"
msgstr "Zadajte cestu k souboru se zálohou"
#: mod_configure.erl:988 mod_configure.erl:1002 mod_configure.erl:1016
#: mod_configure.erl:1030
msgid "Path to File"
msgstr "Cesta k souboru"
#: mod_configure.erl:997
msgid "Restore Backup from File at "
msgstr "Obnovit zálohu ze souboru na "
#: mod_configure.erl:1011
msgid "Dump Backup to Text File at "
msgstr "Uložit zálohu do textového souboru na "
#: mod_configure.erl:1015
msgid "Enter path to text file"
msgstr "Zadajte cestu k textovému souboru"
#: mod_configure.erl:1025
msgid "Import User from File at "
msgstr "Importovat uživatele ze souboru na "
#: mod_configure.erl:1029
msgid "Enter path to jabberd14 spool file"
msgstr "Zadejte cestu k spool souboru jabberd14"
#: mod_configure.erl:1039
msgid "Import Users from Dir at "
msgstr "Importovat uživatele z adresáře na "
#: mod_configure.erl:1043
msgid "Enter path to jabberd14 spool dir"
msgstr "Zadejte cestu k jabberd14 spool adresáři"
#: mod_configure.erl:1044
msgid "Path to Dir"
msgstr "Cesta k adresáři"
#: mod_configure.erl:1060 mod_configure.erl:1105
msgid "Time delay"
msgstr "Časový posun"
#: mod_configure.erl:1143
msgid "Access Control List Configuration"
msgstr "Konfigurace seznamu přístupových práv (ACL)"
#: mod_configure.erl:1147
msgid "Access control lists"
msgstr "Seznamy přístupových práv (ACL)"
#: mod_configure.erl:1171
msgid "Access Configuration"
msgstr "Konfigurace přístupů"
#: mod_configure.erl:1175
msgid "Access rules"
msgstr "Pravidla přístupů"
#: mod_configure.erl:1200 mod_configure.erl:1222 mod_configure.erl:1234
#: mod_configure.erl:1246 mod_configure.erl:1258 mod_configure.erl:1275
#: mod_configure.erl:1287 mod_configure.erl:1650 mod_configure.erl:1700
#: mod_configure.erl:1721 mod_roster.erl:943 mod_roster_odbc.erl:1060
#: mod_vcard.erl:472 mod_vcard_ldap.erl:554 mod_vcard_odbc.erl:448
msgid "Jabber ID"
msgstr "Jabber ID"
#: mod_configure.erl:1205 mod_configure.erl:1263 mod_configure.erl:1651
#: mod_configure.erl:1863 mod_muc/mod_muc_room.erl:3224 mod_register.erl:235
#: web/ejabberd_web_admin.erl:1520
msgid "Password"
msgstr "Heslo"
#: mod_configure.erl:1210
msgid "Password Verification"
msgstr "Ověření hesla"
#: mod_configure.erl:1301
msgid "Number of registered users"
msgstr "Počet registrovaných uživatelů"
#: mod_configure.erl:1315
msgid "Number of online users"
msgstr "Počet online uživatelů"
#: mod_configure.erl:1682 web/ejabberd_web_admin.erl:1588
#: web/ejabberd_web_admin.erl:1743
msgid "Never"
msgstr "Nikdy"
#: mod_configure.erl:1696 web/ejabberd_web_admin.erl:1601
#: web/ejabberd_web_admin.erl:1756
msgid "Online"
msgstr "Online"
#: mod_configure.erl:1701
msgid "Last login"
msgstr "Poslední přihlášení"
#: mod_configure.erl:1722
msgid "Roster size"
msgstr "Velikost seznamu kontaktů"
#: mod_configure.erl:1723
msgid "IP addresses"
msgstr "IP adresy"
#: mod_configure.erl:1724
msgid "Resources"
msgstr "Zdroje"
#: mod_configure.erl:1850
msgid "Administration of "
msgstr "Administrace "
#: mod_configure.erl:1853
msgid "Action on user"
msgstr "Akce aplikovaná na uživatele"
#: mod_configure.erl:1857
msgid "Edit Properties"
msgstr "Upravit vlastnosti"
#: mod_configure.erl:1860 web/ejabberd_web_admin.erl:1769
msgid "Remove User"
msgstr "Odstranit uživatele"
#: mod_irc/mod_irc.erl:201 mod_irc/mod_irc_odbc.erl:196
#: mod_muc/mod_muc.erl:336 mod_muc/mod_muc_odbc.erl:342
msgid "Access denied by service policy"
msgstr "Přístup byl zamítnut nastavením služby"
#: mod_irc/mod_irc.erl:401 mod_irc/mod_irc_odbc.erl:398
msgid "IRC Transport"
msgstr "IRC transport"
#: mod_irc/mod_irc.erl:428 mod_irc/mod_irc_odbc.erl:425
msgid "ejabberd IRC module"
msgstr "ejabberd IRC modul"
#: mod_irc/mod_irc.erl:559 mod_irc/mod_irc_odbc.erl:568
msgid "You need an x:data capable client to configure mod_irc settings"
msgstr "Pro konfiguraci mod_irc potřebujete klienta s podporou x:data"
#: mod_irc/mod_irc.erl:566 mod_irc/mod_irc_odbc.erl:575
msgid "Registration in mod_irc for "
msgstr "Registrace do mod_irc na "
#: mod_irc/mod_irc.erl:571 mod_irc/mod_irc_odbc.erl:580
msgid ""
"Enter username, encodings, ports and passwords you wish to use for "
"connecting to IRC servers"
msgstr ""
"Zadejte přezdívku, kódování, porty a hesla, které chcete používat pro "
"připojení k serverům IRC"
#: mod_irc/mod_irc.erl:576 mod_irc/mod_irc_odbc.erl:585
msgid "IRC Username"
msgstr "IRC přezdívka"
#: mod_irc/mod_irc.erl:586 mod_irc/mod_irc_odbc.erl:595
msgid ""
"If you want to specify different ports, passwords, encodings for IRC "
"servers, fill this list with values in format '{\"irc server\", \"encoding"
"\", port, \"password\"}'. By default this service use \"~s\" encoding, port "
"~p, empty password."
msgstr ""
"Pokud chcete zadat jiné kódování pro IRC servery, vyplňte seznam s hodnotami "
"ve formátu '{\"irc server\",\"encoding\", port, \"password\"}'. Výchozí "
"kódování pro tuto službu je \"~s\", port ~p, empty password."
#: mod_irc/mod_irc.erl:598 mod_irc/mod_irc_odbc.erl:607
msgid ""
"Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef."
"net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."
msgstr ""
"Příklad: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef."
"net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}].2\"}]."
#: mod_irc/mod_irc.erl:603 mod_irc/mod_irc_odbc.erl:612
msgid "Connections parameters"
msgstr "Parametry spojení"
#: mod_irc/mod_irc.erl:728 mod_irc/mod_irc_odbc.erl:757
msgid "Join IRC channel"
msgstr "Vstoupit do IRC kanálu"
#: mod_irc/mod_irc.erl:732 mod_irc/mod_irc_odbc.erl:761
msgid "IRC channel (don't put the first #)"
msgstr "IRC kanál (bez počátečního #)"
#: mod_irc/mod_irc.erl:737 mod_irc/mod_irc_odbc.erl:766
msgid "IRC server"
msgstr "IRC přezdívka"
#: mod_irc/mod_irc.erl:770 mod_irc/mod_irc.erl:774
#: mod_irc/mod_irc_odbc.erl:799 mod_irc/mod_irc_odbc.erl:803
msgid "Join the IRC channel here."
msgstr "Vstoupit do tohoto IRC kanálu."
#: mod_irc/mod_irc.erl:778 mod_irc/mod_irc_odbc.erl:807
msgid "Join the IRC channel in this Jabber ID: ~s"
msgstr "Vstupte do IRC kanálu s tímto Jabber ID: ~s"
#: mod_irc/mod_irc.erl:863 mod_irc/mod_irc_odbc.erl:904
msgid "IRC settings"
msgstr "Nastavení IRC"
#: mod_irc/mod_irc.erl:868 mod_irc/mod_irc_odbc.erl:909
msgid ""
"Enter username and encodings you wish to use for connecting to IRC servers. "
"Press 'Next' to get more fields to fill in. Press 'Complete' to save "
"settings."
msgstr ""
"Zadejte přezdívku a kódování, které chcete používat pro připojení k serverům "
"IRC. Stiskněte 'Další' pro více políček k vyplnění. Stiskněte 'Dokončit' pro "
"uložení nastavení."
#: mod_irc/mod_irc.erl:874 mod_irc/mod_irc_odbc.erl:915
msgid "IRC username"
msgstr "IRC přezdívka"
#: mod_irc/mod_irc.erl:923 mod_irc/mod_irc_odbc.erl:964
msgid "Password ~b"
msgstr "Heslo ~b"
#: mod_irc/mod_irc.erl:928 mod_irc/mod_irc_odbc.erl:969
msgid "Port ~b"
msgstr "Port ~b"
#: mod_irc/mod_irc.erl:933 mod_irc/mod_irc_odbc.erl:974
msgid "Encoding for server ~b"
msgstr "Kódování pro server ~b"
#: mod_irc/mod_irc.erl:942 mod_irc/mod_irc_odbc.erl:983
msgid "Server ~b"
msgstr "Server ~b"
#: mod_muc/mod_muc.erl:449 mod_muc/mod_muc_odbc.erl:456
msgid "Only service administrators are allowed to send service messages"
msgstr "Pouze správci služby smí odesílat servisní zprávy"
#: mod_muc/mod_muc.erl:493 mod_muc/mod_muc_odbc.erl:500
msgid "Room creation is denied by service policy"
msgstr "Pravidla služby nepovolují vytvořit místnost"
#: mod_muc/mod_muc.erl:500 mod_muc/mod_muc_odbc.erl:507
msgid "Conference room does not exist"
msgstr "Konferenční místnost neexistuje"
#: mod_muc/mod_muc.erl:582 mod_muc/mod_muc_odbc.erl:595
msgid "Chatrooms"
msgstr "Konference"
#: mod_muc/mod_muc.erl:712 mod_muc/mod_muc_odbc.erl:729
msgid "You need a client that supports x:data to register the nickname"
msgstr "Pro registraci přezdívky potřebujete klienta s podporou x:data"
#: mod_muc/mod_muc.erl:718 mod_muc/mod_muc_odbc.erl:735
msgid "Nickname Registration at "
msgstr "Registrace přezdívky na "
#: mod_muc/mod_muc.erl:722 mod_muc/mod_muc_odbc.erl:739
msgid "Enter nickname you want to register"
msgstr "Zadejte přezdívku, kterou chcete zaregistrovat"
#: mod_muc/mod_muc.erl:723 mod_muc/mod_muc_odbc.erl:740
#: mod_muc/mod_muc_room.erl:3810 mod_roster.erl:944 mod_roster_odbc.erl:1061
#: mod_vcard.erl:364 mod_vcard.erl:477 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:453
msgid "Nickname"
msgstr "Přezdívka"
#: mod_muc/mod_muc.erl:762 mod_muc/mod_muc_odbc.erl:784
#: mod_muc/mod_muc_room.erl:1064 mod_muc/mod_muc_room.erl:1787
msgid "That nickname is registered by another person"
msgstr "Přezdívka je zaregistrována jinou osobou"
#: mod_muc/mod_muc.erl:788 mod_muc/mod_muc_odbc.erl:811
msgid "You must fill in field \"Nickname\" in the form"
msgstr "Musíte vyplnit políčko \"Přezdívka\" ve formuláři"
#: mod_muc/mod_muc.erl:808 mod_muc/mod_muc_odbc.erl:831
msgid "ejabberd MUC module"
msgstr "ejabberd MUC modul"
#: mod_muc/mod_muc_log.erl:374 mod_muc/mod_muc_log.erl:381
msgid "Chatroom configuration modified"
msgstr "Nastavení diskuzní místnosti bylo změněno"
#: mod_muc/mod_muc_log.erl:384
msgid "joins the room"
msgstr "vstoupil(a) do místnosti"
#: mod_muc/mod_muc_log.erl:387 mod_muc/mod_muc_log.erl:390
msgid "leaves the room"
msgstr "opustil(a) místnost"
#: mod_muc/mod_muc_log.erl:393 mod_muc/mod_muc_log.erl:396
msgid "has been banned"
msgstr "byl(a) zablokován(a)"
#: mod_muc/mod_muc_log.erl:399 mod_muc/mod_muc_log.erl:402
msgid "has been kicked"
msgstr "byl(a) vyhozen(a) z místnosti"
#: mod_muc/mod_muc_log.erl:405
msgid "has been kicked because of an affiliation change"
msgstr "byl(a) vyhozen(a) kvůli změně přiřazení"
#: mod_muc/mod_muc_log.erl:408
msgid "has been kicked because the room has been changed to members-only"
msgstr "byl(a) vyhozen(a), protože mísnost je nyní pouze pro členy"
#: mod_muc/mod_muc_log.erl:411
msgid "has been kicked because of a system shutdown"
msgstr "byl(a) vyhozen(a), protože dojde k vypnutí systému"
#: mod_muc/mod_muc_log.erl:414
msgid "is now known as"
msgstr "se přejmenoval(a) na"
#: mod_muc/mod_muc_log.erl:417 mod_muc/mod_muc_log.erl:688
#: mod_muc/mod_muc_room.erl:2393
msgid " has set the subject to: "
msgstr " změnil(a) téma na: "
#: mod_muc/mod_muc_log.erl:452
msgid "Chatroom is created"
msgstr "Konference vytvořena"
#: mod_muc/mod_muc_log.erl:453
msgid "Chatroom is destroyed"
msgstr "Konference zrušena"
#: mod_muc/mod_muc_log.erl:454
msgid "Chatroom is started"
msgstr "Konference spuštěna"
#: mod_muc/mod_muc_log.erl:455
msgid "Chatroom is stopped"
msgstr "Konference zastavena"
#: mod_muc/mod_muc_log.erl:459
msgid "Monday"
msgstr "Pondělí"
#: mod_muc/mod_muc_log.erl:460
msgid "Tuesday"
msgstr "Úterý"
#: mod_muc/mod_muc_log.erl:461
msgid "Wednesday"
msgstr "Středa"
#: mod_muc/mod_muc_log.erl:462
msgid "Thursday"
msgstr "Čtvrtek"
#: mod_muc/mod_muc_log.erl:463
msgid "Friday"
msgstr "Pátek"
#: mod_muc/mod_muc_log.erl:464
msgid "Saturday"
msgstr "Sobota"
#: mod_muc/mod_muc_log.erl:465
msgid "Sunday"
msgstr "Neděle"
#: mod_muc/mod_muc_log.erl:469
msgid "January"
msgstr ". ledna"
#: mod_muc/mod_muc_log.erl:470
msgid "February"
msgstr ". února"
#: mod_muc/mod_muc_log.erl:471
msgid "March"
msgstr ". března"
#: mod_muc/mod_muc_log.erl:472
msgid "April"
msgstr ". dubna"
#: mod_muc/mod_muc_log.erl:473
msgid "May"
msgstr ". května"
#: mod_muc/mod_muc_log.erl:474
msgid "June"
msgstr ". června"
#: mod_muc/mod_muc_log.erl:475
msgid "July"
msgstr ". července"
#: mod_muc/mod_muc_log.erl:476
msgid "August"
msgstr ". srpna"
#: mod_muc/mod_muc_log.erl:477
msgid "September"
msgstr ". září"
#: mod_muc/mod_muc_log.erl:478
msgid "October"
msgstr ". října"
#: mod_muc/mod_muc_log.erl:479
msgid "November"
msgstr ". listopadu"
#: mod_muc/mod_muc_log.erl:480
msgid "December"
msgstr ". prosince"
#: mod_muc/mod_muc_log.erl:750
msgid "Room Configuration"
msgstr "Nastavení místnosti"
#: mod_muc/mod_muc_log.erl:759
msgid "Room Occupants"
msgstr "Počet účastníků"
#: mod_muc/mod_muc_room.erl:174
msgid "Traffic rate limit is exceeded"
msgstr "Byl překročen limit"
#: mod_muc/mod_muc_room.erl:246
msgid ""
"This participant is kicked from the room because he sent an error message"
msgstr "Tento účastník byl vyhozen, protože odeslal chybovou zprávu"
#: mod_muc/mod_muc_room.erl:255
msgid "It is not allowed to send private messages to the conference"
msgstr "Není povoleno odesílat soukromé zprávy do konference"
#: mod_muc/mod_muc_room.erl:332
msgid "Please, wait for a while before sending new voice request"
msgstr "Prosím, počkejte chvíli před posláním nové žádosti o voice práva"
#: mod_muc/mod_muc_room.erl:347
msgid "Voice requests are disabled in this conference"
msgstr "Voice žádosti jsou v této konferenci zakázány"
#: mod_muc/mod_muc_room.erl:364
msgid "Failed to extract JID from your voice request approval"
msgstr "Došlo k chybě při získávání Jabber ID z vaší žádosti o voice práva"
#: mod_muc/mod_muc_room.erl:393
msgid "Only moderators can approve voice requests"
msgstr "Pouze moderátoři mohou schválit žádosti o voice práva"
#: mod_muc/mod_muc_room.erl:408
msgid "Improper message type"
msgstr "Nesprávný typ zprávy"
#: mod_muc/mod_muc_room.erl:518
msgid ""
"This participant is kicked from the room because he sent an error message to "
"another participant"
msgstr ""
"Tento účastník byl vyhozen, protože odeslal chybovou zprávu jinému "
"účastníkovi"
#: mod_muc/mod_muc_room.erl:531
msgid "It is not allowed to send private messages of type \"groupchat\""
msgstr "Není dovoleno odeslání soukromé zprávy typu \"skupinová zpráva\" "
#: mod_muc/mod_muc_room.erl:543 mod_muc/mod_muc_room.erl:611
msgid "Recipient is not in the conference room"
msgstr "Příjemce se nenachází v konferenční místnosti"
#: mod_muc/mod_muc_room.erl:564 mod_muc/mod_muc_room.erl:585
msgid "It is not allowed to send private messages"
msgstr "Je zakázáno posílat soukromé zprávy"
#: mod_muc/mod_muc_room.erl:576 mod_muc/mod_muc_room.erl:956
#: mod_muc/mod_muc_room.erl:4040
msgid "Only occupants are allowed to send messages to the conference"
msgstr "Jen členové mají povolené zasílat zprávy do konference"
#: mod_muc/mod_muc_room.erl:634
msgid "Only occupants are allowed to send queries to the conference"
msgstr "Jen členové mohou odesílat požadavky (query) do konference"
#: mod_muc/mod_muc_room.erl:646
msgid "Queries to the conference members are not allowed in this room"
msgstr ""
"Požadavky (queries) na členy konference nejsou v této místnosti povolené"
#: mod_muc/mod_muc_room.erl:932
msgid ""
"Only moderators and participants are allowed to change the subject in this "
"room"
msgstr "Jen moderátoři a účastníci mají povoleno měnit téma této místnosti"
#: mod_muc/mod_muc_room.erl:937
msgid "Only moderators are allowed to change the subject in this room"
msgstr "Jen moderátoři mají povoleno měnit téma místnosti"
#: mod_muc/mod_muc_room.erl:947
msgid "Visitors are not allowed to send messages to all occupants"
msgstr "Návštevníci nemají povoleno zasílat zprávy všem účastníkům konference"
#: mod_muc/mod_muc_room.erl:1021
msgid ""
"This participant is kicked from the room because he sent an error presence"
msgstr "Tento účastník byl vyhozen, protože odeslal chybový status"
#: mod_muc/mod_muc_room.erl:1040
msgid "Visitors are not allowed to change their nicknames in this room"
msgstr "Návštěvníkům této místnosti je zakázáno měnit přezdívku"
#: mod_muc/mod_muc_room.erl:1053 mod_muc/mod_muc_room.erl:1779
msgid "That nickname is already in use by another occupant"
msgstr "Přezdívka je již používána jiným členem"
#: mod_muc/mod_muc_room.erl:1768
msgid "You have been banned from this room"
msgstr "Byl jste vyloučen z této místnosti"
#: mod_muc/mod_muc_room.erl:1771
msgid "Membership is required to enter this room"
msgstr "Pro vstup do místnosti musíte být členem"
#: mod_muc/mod_muc_room.erl:1807
msgid "This room is not anonymous"
msgstr "Tato místnost není anonymní"
#: mod_muc/mod_muc_room.erl:1833
msgid "A password is required to enter this room"
msgstr "Pro vstup do místnosti musíte zadat heslo"
#: mod_muc/mod_muc_room.erl:1855 mod_register.erl:246
msgid "Too many CAPTCHA requests"
msgstr "Přiliš mnoho CAPTCHA žádostí"
#: mod_muc/mod_muc_room.erl:1864 mod_register.erl:251
msgid "Unable to generate a CAPTCHA"
msgstr "Nebylo možné vygenerovat CAPTCHA"
#: mod_muc/mod_muc_room.erl:1874
msgid "Incorrect password"
msgstr "Nesprávné heslo"
#: mod_muc/mod_muc_room.erl:2448
msgid "Administrator privileges required"
msgstr "Potřebujete práva administrátora"
#: mod_muc/mod_muc_room.erl:2463
msgid "Moderator privileges required"
msgstr "Potřebujete práva moderátora"
#: mod_muc/mod_muc_room.erl:2619
msgid "Jabber ID ~s is invalid"
msgstr "Jabber ID ~s je neplatné"
#: mod_muc/mod_muc_room.erl:2633
msgid "Nickname ~s does not exist in the room"
msgstr "Přezdívka ~s v místnosti neexistuje"
#: mod_muc/mod_muc_room.erl:2659 mod_muc/mod_muc_room.erl:3049
msgid "Invalid affiliation: ~s"
msgstr "Neplatné přiřazení: ~s"
#: mod_muc/mod_muc_room.erl:2713
msgid "Invalid role: ~s"
msgstr "Neplatná role: ~s"
#: mod_muc/mod_muc_room.erl:3026 mod_muc/mod_muc_room.erl:3062
msgid "Owner privileges required"
msgstr "Jsou vyžadována práva vlastníka"
#: mod_muc/mod_muc_room.erl:3195
msgid "Configuration of room ~s"
msgstr "Konfigurace místnosti ~s"
#: mod_muc/mod_muc_room.erl:3200
msgid "Room title"
msgstr "Název místnosti"
#: mod_muc/mod_muc_room.erl:3203 mod_muc/mod_muc_room.erl:3692
msgid "Room description"
msgstr "Popis místnosti"
#: mod_muc/mod_muc_room.erl:3210
msgid "Make room persistent"
msgstr "Nastavit místnost jako stálou"
#: mod_muc/mod_muc_room.erl:3215
msgid "Make room public searchable"
msgstr "Nastavit místnost jako veřejnou"
#: mod_muc/mod_muc_room.erl:3218
msgid "Make participants list public"
msgstr "Nastavit seznam účastníků jako veřejný"
#: mod_muc/mod_muc_room.erl:3221
msgid "Make room password protected"
msgstr "Chránit místnost heslem"
#: mod_muc/mod_muc_room.erl:3232
msgid "Maximum Number of Occupants"
msgstr "Počet účastníků"
#: mod_muc/mod_muc_room.erl:3239
msgid "No limit"
msgstr "Bez limitu"
#: mod_muc/mod_muc_room.erl:3250
msgid "Present real Jabber IDs to"
msgstr "Odhalovat skutečná Jabber ID"
#: mod_muc/mod_muc_room.erl:3258 mod_muc/mod_muc_room.erl:3292
msgid "moderators only"
msgstr "moderátorům"
#: mod_muc/mod_muc_room.erl:3260 mod_muc/mod_muc_room.erl:3294
msgid "anyone"
msgstr "každému"
#: mod_muc/mod_muc_room.erl:3262
msgid "Make room members-only"
msgstr "Zpřístupnit místnost jen členům"
#: mod_muc/mod_muc_room.erl:3265
msgid "Make room moderated"
msgstr "Nastavit místnost jako moderovanou"
#: mod_muc/mod_muc_room.erl:3268
msgid "Default users as participants"
msgstr "Uživatelé jsou implicitně členy"
#: mod_muc/mod_muc_room.erl:3271
msgid "Allow users to change the subject"
msgstr "Povolit uživatelům měnit téma místnosti"
#: mod_muc/mod_muc_room.erl:3274
msgid "Allow users to send private messages"
msgstr "Povolit uživatelům odesílat soukromé zprávy"
#: mod_muc/mod_muc_room.erl:3279
msgid "Allow visitors to send private messages to"
msgstr "Povolit návštěvníkům odesílat soukromé zprávy"
#: mod_muc/mod_muc_room.erl:3290
msgid "nobody"
msgstr "nikdo"
#: mod_muc/mod_muc_room.erl:3296
msgid "Allow users to query other users"
msgstr "Povolit uživatelům odesílat požadavky (query) ostatním uživatelům"
#: mod_muc/mod_muc_room.erl:3299
msgid "Allow users to send invites"
msgstr "Povolit uživatelům posílání pozvánek"
#: mod_muc/mod_muc_room.erl:3302
msgid "Allow visitors to send status text in presence updates"
msgstr "Povolit návštěvníkům posílat stavové zprávy ve statusu"
#: mod_muc/mod_muc_room.erl:3305
msgid "Allow visitors to change nickname"
msgstr "Povolit návštěvníkům měnit přezdívku"
#: mod_muc/mod_muc_room.erl:3308
msgid "Allow visitors to send voice requests"
msgstr "Povolit uživatelům posílat žádosti o voice práva"
#: mod_muc/mod_muc_room.erl:3311
msgid "Minimum interval between voice requests (in seconds)"
msgstr "Minimální interval mezi žádostmi o voice práva (v sekundách)"
#: mod_muc/mod_muc_room.erl:3317
msgid "Make room CAPTCHA protected"
msgstr "Chránit místnost pomocí CAPTCHA"
#: mod_muc/mod_muc_room.erl:3322
msgid "Exclude Jabber IDs from CAPTCHA challenge"
msgstr "Vyloučit Jabber ID z procesu CAPTCHA ověřování"
#: mod_muc/mod_muc_room.erl:3329
msgid "Enable logging"
msgstr "Zaznamenávat konverzace"
#: mod_muc/mod_muc_room.erl:3337
msgid "You need an x:data capable client to configure room"
msgstr "Ke konfiguraci místnosti potřebujete klienta podporujícího x:data"
#: mod_muc/mod_muc_room.erl:3694
msgid "Number of occupants"
msgstr "Počet účastníků"
#: mod_muc/mod_muc_room.erl:3750
msgid "private, "
msgstr "soukromá, "
#: mod_muc/mod_muc_room.erl:3799
msgid "Voice request"
msgstr "Žádost o voice práva"
#: mod_muc/mod_muc_room.erl:3803
msgid "Either approve or decline the voice request."
msgstr "Povolit nebo odmítnout voice žádost."
#: mod_muc/mod_muc_room.erl:3809
msgid "User JID"
msgstr "Jabber ID uživatele"
#: mod_muc/mod_muc_room.erl:3811
msgid "Grant voice to this person?"
msgstr "Udělit voice práva této osobě?"
#: mod_muc/mod_muc_room.erl:3960
msgid "~s invites you to the room ~s"
msgstr "~s vás zve do místnosti ~s"
#: mod_muc/mod_muc_room.erl:3969
msgid "the password is"
msgstr "heslo je"
#: mod_offline.erl:510 mod_offline_odbc.erl:352
msgid ""
"Your contact offline message queue is full. The message has been discarded."
msgstr "Fronta offline zpráv pro váš kontakt je plná. Zpráva byla zahozena."
#: mod_offline.erl:560 mod_offline_odbc.erl:408
msgid "~s's Offline Messages Queue"
msgstr "Fronta offline zpráv uživatele ~s"
#: mod_offline.erl:563 mod_offline_odbc.erl:411 mod_roster.erl:987
#: mod_roster_odbc.erl:1104 mod_shared_roster.erl:901
#: mod_shared_roster.erl:1010 mod_shared_roster_odbc.erl:930
#: mod_shared_roster_odbc.erl:1039 web/ejabberd_web_admin.erl:833
#: web/ejabberd_web_admin.erl:874 web/ejabberd_web_admin.erl:942
#: web/ejabberd_web_admin.erl:978 web/ejabberd_web_admin.erl:1019
#: web/ejabberd_web_admin.erl:1508 web/ejabberd_web_admin.erl:1760
#: web/ejabberd_web_admin.erl:1931 web/ejabberd_web_admin.erl:1963
#: web/ejabberd_web_admin.erl:2031 web/ejabberd_web_admin.erl:2135
#: web/ejabberd_web_admin.erl:2160 web/ejabberd_web_admin.erl:2248
msgid "Submitted"
msgstr "Odeslané"
#: mod_offline.erl:571
msgid "Time"
msgstr "Čas"
#: mod_offline.erl:572
msgid "From"
msgstr "Od"
#: mod_offline.erl:573
msgid "To"
msgstr "Pro"
#: mod_offline.erl:574 mod_offline_odbc.erl:419
msgid "Packet"
msgstr "Paket"
#: mod_offline.erl:587 mod_offline_odbc.erl:432 mod_shared_roster.erl:908
#: mod_shared_roster_odbc.erl:937 web/ejabberd_web_admin.erl:882
#: web/ejabberd_web_admin.erl:986
msgid "Delete Selected"
msgstr "Smazat vybrané"
#: mod_offline.erl:645 mod_offline_odbc.erl:519
msgid "Offline Messages:"
msgstr "Offline zprávy:"
#: mod_offline.erl:645 mod_offline_odbc.erl:519
msgid "Remove All Offline Messages"
msgstr "Odstranit všechny offline zprávy"
#: mod_proxy65/mod_proxy65_service.erl:213
msgid "ejabberd SOCKS5 Bytestreams module"
msgstr "ejabberd SOCKS5 Bytestreams modul"
#: mod_pubsub/mod_pubsub.erl:1120 mod_pubsub/mod_pubsub_odbc.erl:929
msgid "Publish-Subscribe"
msgstr "Publish-Subscribe"
#: mod_pubsub/mod_pubsub.erl:1214 mod_pubsub/mod_pubsub_odbc.erl:1025
msgid "ejabberd Publish-Subscribe module"
msgstr "ejabberd Publish-Subscribe modul"
#: mod_pubsub/mod_pubsub.erl:1497 mod_pubsub/mod_pubsub_odbc.erl:1312
msgid "PubSub subscriber request"
msgstr "Žádost odběratele PubSub"
#: mod_pubsub/mod_pubsub.erl:1499 mod_pubsub/mod_pubsub_odbc.erl:1314
msgid "Choose whether to approve this entity's subscription."
msgstr "Zvolte, zda chcete schválit odebírání touto entitou"
#: mod_pubsub/mod_pubsub.erl:1505 mod_pubsub/mod_pubsub_odbc.erl:1320
msgid "Node ID"
msgstr "ID uzlu"
#: mod_pubsub/mod_pubsub.erl:1510 mod_pubsub/mod_pubsub_odbc.erl:1325
msgid "Subscriber Address"
msgstr "Adresa odběratele"
#: mod_pubsub/mod_pubsub.erl:1516 mod_pubsub/mod_pubsub_odbc.erl:1331
msgid "Allow this Jabber ID to subscribe to this pubsub node?"
msgstr "Povolit tomuto Jabber ID odebírat tento pubsub uzel?"
#: mod_pubsub/mod_pubsub.erl:3474 mod_pubsub/mod_pubsub_odbc.erl:3287
msgid "Deliver payloads with event notifications"
msgstr "Doručovat náklad s upozorněním na událost"
#: mod_pubsub/mod_pubsub.erl:3475 mod_pubsub/mod_pubsub_odbc.erl:3288
msgid "Deliver event notifications"
msgstr "Doručovat upozornění na události"
#: mod_pubsub/mod_pubsub.erl:3476 mod_pubsub/mod_pubsub_odbc.erl:3289
msgid "Notify subscribers when the node configuration changes"
msgstr "Upozornit odběratele na změnu nastavení uzlu"
#: mod_pubsub/mod_pubsub.erl:3477 mod_pubsub/mod_pubsub_odbc.erl:3290
msgid "Notify subscribers when the node is deleted"
msgstr "Upozornit odběratele na smazání uzlu"
#: mod_pubsub/mod_pubsub.erl:3478 mod_pubsub/mod_pubsub_odbc.erl:3291
msgid "Notify subscribers when items are removed from the node"
msgstr "Upozornit odběratele na odstranění položek z uzlu"
#: mod_pubsub/mod_pubsub.erl:3479 mod_pubsub/mod_pubsub_odbc.erl:3292
msgid "Persist items to storage"
msgstr "Uložit položky natrvalo do úložiště"
#: mod_pubsub/mod_pubsub.erl:3480 mod_pubsub/mod_pubsub_odbc.erl:3293
msgid "A friendly name for the node"
msgstr "Přívětivé jméno pro uzel"
#: mod_pubsub/mod_pubsub.erl:3481 mod_pubsub/mod_pubsub_odbc.erl:3294
msgid "Max # of items to persist"
msgstr "Maximální počet položek, které je možné natrvalo uložit"
#: mod_pubsub/mod_pubsub.erl:3482 mod_pubsub/mod_pubsub_odbc.erl:3295
msgid "Whether to allow subscriptions"
msgstr "Povolit odebírání"
#: mod_pubsub/mod_pubsub.erl:3483 mod_pubsub/mod_pubsub_odbc.erl:3296
msgid "Specify the access model"
msgstr "Uveďte přístupový model"
#: mod_pubsub/mod_pubsub.erl:3486 mod_pubsub/mod_pubsub_odbc.erl:3299
msgid "Roster groups allowed to subscribe"
msgstr "Skupiny kontaktů, které mohou odebírat"
#: mod_pubsub/mod_pubsub.erl:3487 mod_pubsub/mod_pubsub_odbc.erl:3300
msgid "Specify the publisher model"
msgstr "Specifikovat model pro publikování"
#: mod_pubsub/mod_pubsub.erl:3489 mod_pubsub/mod_pubsub_odbc.erl:3302
msgid "Purge all items when the relevant publisher goes offline"
msgstr "Smazat všechny položky, pokud se příslušný poskytovatel odpojí"
#: mod_pubsub/mod_pubsub.erl:3490 mod_pubsub/mod_pubsub_odbc.erl:3303
msgid "Specify the event message type"
msgstr "Zvolte typ zpráv pro události"
#: mod_pubsub/mod_pubsub.erl:3492 mod_pubsub/mod_pubsub_odbc.erl:3305
msgid "Max payload size in bytes"
msgstr "Maximální náklad v bajtech"
#: mod_pubsub/mod_pubsub.erl:3493 mod_pubsub/mod_pubsub_odbc.erl:3306
msgid "When to send the last published item"
msgstr "Kdy odeslat poslední publikovanou položku"
#: mod_pubsub/mod_pubsub.erl:3495 mod_pubsub/mod_pubsub_odbc.erl:3308
msgid "Only deliver notifications to available users"
msgstr "Doručovat upozornění jen právě přihlášeným uživatelům"
#: mod_pubsub/mod_pubsub.erl:3496 mod_pubsub/mod_pubsub_odbc.erl:3309
msgid "The collections with which a node is affiliated"
msgstr "Kolekce, se kterými je uzel spřízněn"
#: mod_register.erl:193
msgid "The CAPTCHA verification has failed"
msgstr "Ověření CAPTCHA se nezdařilo"
#: mod_register.erl:220
msgid "You need a client that supports x:data and CAPTCHA to register"
msgstr "Pro registraci potřebujete klienta s podporou x:data a CAPTCHA"
#: mod_register.erl:226 mod_register.erl:265
msgid "Choose a username and password to register with this server"
msgstr "Zadejte jméno uživatele a heslo pro registraci na tomto serveru"
#: mod_register.erl:230 mod_vcard.erl:364 mod_vcard_odbc.erl:342
#: web/ejabberd_web_admin.erl:1515 web/ejabberd_web_admin.erl:1572
msgid "User"
msgstr "Uživatel"
#: mod_register.erl:316 mod_register.erl:361
msgid "The password is too weak"
msgstr "Heslo je příliš slabé"
#: mod_register.erl:365
msgid "Users are not allowed to register accounts so quickly"
msgstr "Je zakázáno registrovat účty v tak rychlém sledu"
#: mod_roster.erl:938 mod_roster_odbc.erl:1055 web/ejabberd_web_admin.erl:1701
#: web/ejabberd_web_admin.erl:1886 web/ejabberd_web_admin.erl:1897
#: web/ejabberd_web_admin.erl:2219
msgid "None"
msgstr "Nic"
#: mod_roster.erl:945 mod_roster_odbc.erl:1062
msgid "Subscription"
msgstr "Přihlášení"
#: mod_roster.erl:946 mod_roster_odbc.erl:1063
msgid "Pending"
msgstr "Čekající"
#: mod_roster.erl:947 mod_roster_odbc.erl:1064
msgid "Groups"
msgstr "Skupiny"
#: mod_roster.erl:974 mod_roster_odbc.erl:1091
msgid "Validate"
msgstr "Ověřit"
#: mod_roster.erl:982 mod_roster_odbc.erl:1099
msgid "Remove"
msgstr "Odstranit"
#: mod_roster.erl:985 mod_roster_odbc.erl:1102
msgid "Roster of "
msgstr "Seznam kontaktů "
#: mod_roster.erl:988 mod_roster_odbc.erl:1105 mod_shared_roster.erl:902
#: mod_shared_roster.erl:1011 mod_shared_roster_odbc.erl:931
#: mod_shared_roster_odbc.erl:1040 web/ejabberd_web_admin.erl:834
#: web/ejabberd_web_admin.erl:875 web/ejabberd_web_admin.erl:943
#: web/ejabberd_web_admin.erl:979 web/ejabberd_web_admin.erl:1020
#: web/ejabberd_web_admin.erl:1509 web/ejabberd_web_admin.erl:1761
#: web/ejabberd_web_admin.erl:1932 web/ejabberd_web_admin.erl:2136
#: web/ejabberd_web_admin.erl:2161
msgid "Bad format"
msgstr "Nesprávný formát"
#: mod_roster.erl:995 mod_roster_odbc.erl:1112
msgid "Add Jabber ID"
msgstr "Přidat Jabber ID"
#: mod_roster.erl:1094 mod_roster_odbc.erl:1211
msgid "Roster"
msgstr "Seznam kontaktů"
#: mod_shared_roster.erl:857 mod_shared_roster.erl:899
#: mod_shared_roster.erl:1007 mod_shared_roster_odbc.erl:886
#: mod_shared_roster_odbc.erl:928 mod_shared_roster_odbc.erl:1036
msgid "Shared Roster Groups"
msgstr "Skupiny pro sdílený seznam kontaktů"
#: mod_shared_roster.erl:895 mod_shared_roster_odbc.erl:924
#: web/ejabberd_web_admin.erl:1365 web/ejabberd_web_admin.erl:2461
msgid "Add New"
msgstr "Přidat nový"
#: mod_shared_roster.erl:978 mod_shared_roster_odbc.erl:1007
msgid "Name:"
msgstr "Jméno:"
#: mod_shared_roster.erl:983 mod_shared_roster_odbc.erl:1012
msgid "Description:"
msgstr "Popis:"
#: mod_shared_roster.erl:991 mod_shared_roster_odbc.erl:1020
msgid "Members:"
msgstr "Členové:"
#: mod_shared_roster.erl:999 mod_shared_roster_odbc.erl:1028
msgid "Displayed Groups:"
msgstr "Zobrazené skupiny:"
#: mod_shared_roster.erl:1008 mod_shared_roster_odbc.erl:1037
msgid "Group "
msgstr "Skupina "
#: mod_shared_roster.erl:1017 mod_shared_roster_odbc.erl:1046
#: web/ejabberd_web_admin.erl:840 web/ejabberd_web_admin.erl:884
#: web/ejabberd_web_admin.erl:949 web/ejabberd_web_admin.erl:1026
#: web/ejabberd_web_admin.erl:2017
msgid "Submit"
msgstr "Odeslat"
#: mod_vcard.erl:165 mod_vcard_ldap.erl:238 mod_vcard_odbc.erl:129
msgid "Erlang Jabber Server"
msgstr "Erlang Jabber Server"
#: mod_vcard.erl:364 mod_vcard.erl:478 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:454
msgid "Birthday"
msgstr "Datum narození"
#: mod_vcard.erl:364 mod_vcard.erl:480 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:456
msgid "City"
msgstr "Město"
#: mod_vcard.erl:364 mod_vcard.erl:479 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:455
msgid "Country"
msgstr "Země"
#: mod_vcard.erl:364 mod_vcard.erl:481 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:457
msgid "Email"
msgstr "E-mail"
#: mod_vcard.erl:364 mod_vcard.erl:476 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:452
msgid "Family Name"
msgstr "Příjmení"
#: mod_vcard.erl:364 mod_vcard_odbc.erl:342
msgid ""
"Fill in the form to search for any matching Jabber User (Add * to the end of "
"field to match substring)"
msgstr ""
"Pro vyhledání uživatele Jabberu vyplňte formulář (na konec přidejte znak * "
"pro vyhledání podřetězce)"
#: mod_vcard.erl:364 mod_vcard.erl:473 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:449
msgid "Full Name"
msgstr "Celé jméno"
#: mod_vcard.erl:364 mod_vcard.erl:475 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:451
msgid "Middle Name"
msgstr "Druhé jméno"
#: mod_vcard.erl:364 mod_vcard.erl:474 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:450 web/ejabberd_web_admin.erl:2006
msgid "Name"
msgstr "Jméno"
#: mod_vcard.erl:364 mod_vcard.erl:482 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:458
msgid "Organization Name"
msgstr "Název firmy"
#: mod_vcard.erl:364 mod_vcard.erl:483 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:459
msgid "Organization Unit"
msgstr "Oddělení"
#: mod_vcard.erl:364 mod_vcard_ldap.erl:462 mod_vcard_odbc.erl:342
msgid "Search users in "
msgstr "Hledat uživatele v "
#: mod_vcard.erl:364 mod_vcard_ldap.erl:462 mod_vcard_odbc.erl:342
msgid "You need an x:data capable client to search"
msgstr "K vyhledávání potřebujete klienta podporujícího x:data"
#: mod_vcard.erl:389 mod_vcard_ldap.erl:487 mod_vcard_odbc.erl:367
msgid "vCard User Search"
msgstr "Hledání uživatelů podle vizitek"
#: mod_vcard.erl:445 mod_vcard_ldap.erl:541 mod_vcard_odbc.erl:421
msgid "ejabberd vCard module"
msgstr "ejabberd vCard modul"
#: mod_vcard.erl:469 mod_vcard_ldap.erl:551 mod_vcard_odbc.erl:445
msgid "Search Results for "
msgstr "Výsledky hledání pro "
#: mod_vcard_ldap.erl:462
msgid "Fill in fields to search for any matching Jabber User"
msgstr "Vyplňte políčka pro vyhledání uživatele Jabberu"
#: web/ejabberd_web_admin.erl:193 web/ejabberd_web_admin.erl:203
#: web/ejabberd_web_admin.erl:219 web/ejabberd_web_admin.erl:229
msgid "Unauthorized"
msgstr "Nemáte oprávnění"
#: web/ejabberd_web_admin.erl:286 web/ejabberd_web_admin.erl:303
msgid "ejabberd Web Admin"
msgstr "Webová administrace ejabberd"
#: web/ejabberd_web_admin.erl:769 web/ejabberd_web_admin.erl:780
msgid "Administration"
msgstr "Administrace"
#: web/ejabberd_web_admin.erl:878 web/ejabberd_web_admin.erl:982
msgid "Raw"
msgstr "Zdroj"
#: web/ejabberd_web_admin.erl:1017
msgid "~s access rule configuration"
msgstr "~s konfigurace pravidla přístupu"
#: web/ejabberd_web_admin.erl:1035
msgid "Virtual Hosts"
msgstr "Virtuální hostitelé"
#: web/ejabberd_web_admin.erl:1043 web/ejabberd_web_admin.erl:1050
msgid "Users"
msgstr "Uživatelé"
#: web/ejabberd_web_admin.erl:1078
msgid "Users Last Activity"
msgstr "Poslední aktivita uživatele"
#: web/ejabberd_web_admin.erl:1080
msgid "Period: "
msgstr "Čas: "
#: web/ejabberd_web_admin.erl:1090
msgid "Last month"
msgstr "Poslední měsíc"
#: web/ejabberd_web_admin.erl:1091
msgid "Last year"
msgstr "Poslední rok"
#: web/ejabberd_web_admin.erl:1092
msgid "All activity"
msgstr "Všechny aktivity"
#: web/ejabberd_web_admin.erl:1094
msgid "Show Ordinary Table"
msgstr "Zobrazit běžnou tabulku"
#: web/ejabberd_web_admin.erl:1096
msgid "Show Integral Table"
msgstr "Zobrazit kompletní tabulku"
#: web/ejabberd_web_admin.erl:1105 web/ejabberd_web_admin.erl:1939
msgid "Statistics"
msgstr "Statistiky"
#: web/ejabberd_web_admin.erl:1117
msgid "Not Found"
msgstr "Nenalezeno"
#: web/ejabberd_web_admin.erl:1134
msgid "Node not found"
msgstr "Uzel nenalezen"
#: web/ejabberd_web_admin.erl:1460
msgid "Host"
msgstr "Hostitel"
#: web/ejabberd_web_admin.erl:1461
msgid "Registered Users"
msgstr "Registrovaní uživatelé"
#: web/ejabberd_web_admin.erl:1573
msgid "Offline Messages"
msgstr "Offline zprávy"
#: web/ejabberd_web_admin.erl:1574 web/ejabberd_web_admin.erl:1767
msgid "Last Activity"
msgstr "Poslední aktivita"
#: web/ejabberd_web_admin.erl:1659 web/ejabberd_web_admin.erl:1675
msgid "Registered Users:"
msgstr "Registrovaní živatelé:"
#: web/ejabberd_web_admin.erl:1661 web/ejabberd_web_admin.erl:1677
#: web/ejabberd_web_admin.erl:2192
msgid "Online Users:"
msgstr "Online uživatelé:"
#: web/ejabberd_web_admin.erl:1663
msgid "Outgoing s2s Connections:"
msgstr "Odchozí s2s spojení:"
#: web/ejabberd_web_admin.erl:1665
msgid "Outgoing s2s Servers:"
msgstr "Odchozí s2s servery:"
#: web/ejabberd_web_admin.erl:1734 web/mod_register_web.erl:175
#: web/mod_register_web.erl:372 web/mod_register_web.erl:381
#: web/mod_register_web.erl:411
msgid "Change Password"
msgstr "Změnit heslo"
#: web/ejabberd_web_admin.erl:1758
msgid "User "
msgstr "Uživatel "
#: web/ejabberd_web_admin.erl:1765
msgid "Connected Resources:"
msgstr "Připojené zdroje:"
#: web/ejabberd_web_admin.erl:1766 web/mod_register_web.erl:227
#: web/mod_register_web.erl:519
msgid "Password:"
msgstr "Heslo:"
#: web/ejabberd_web_admin.erl:1828
msgid "No Data"
msgstr "Žádná data"
#: web/ejabberd_web_admin.erl:1906
msgid "Nodes"
msgstr "Uzly"
#: web/ejabberd_web_admin.erl:1929 web/ejabberd_web_admin.erl:1951
msgid "Node "
msgstr "Uzel "
#: web/ejabberd_web_admin.erl:1938
msgid "Listened Ports"
msgstr "Otevřené porty"
#: web/ejabberd_web_admin.erl:1940 web/ejabberd_web_admin.erl:2260
#: web/ejabberd_web_admin.erl:2448
msgid "Update"
msgstr "Aktualizovat"
#: web/ejabberd_web_admin.erl:1943 web/ejabberd_web_admin.erl:2569
msgid "Restart"
msgstr "Restart"
#: web/ejabberd_web_admin.erl:1945 web/ejabberd_web_admin.erl:2571
msgid "Stop"
msgstr "Stop"
#: web/ejabberd_web_admin.erl:1959
msgid "RPC Call Error"
msgstr "Chyba RPC volání"
#: web/ejabberd_web_admin.erl:2000
msgid "Database Tables at "
msgstr "Databázové tabulky na "
#: web/ejabberd_web_admin.erl:2007
msgid "Storage Type"
msgstr "Typ úložiště"
#: web/ejabberd_web_admin.erl:2008
msgid "Elements"
msgstr "Položek"
#: web/ejabberd_web_admin.erl:2009
msgid "Memory"
msgstr "Paměť"
#: web/ejabberd_web_admin.erl:2032 web/ejabberd_web_admin.erl:2137
msgid "Error"
msgstr "Chyba"
#: web/ejabberd_web_admin.erl:2034
msgid "Backup of "
msgstr "Záloha na "
#: web/ejabberd_web_admin.erl:2036
msgid ""
"Please note that these options will only backup the builtin Mnesia database. "
"If you are using the ODBC module, you also need to backup your SQL database "
"separately."
msgstr ""
"Podotýkáme, že tato nastavení budou zálohována do zabudované databáze "
"Mnesia. Pokud používáte ODBC modul, musíte zálohovat svoji SQL databázi "
"samostatně."
#: web/ejabberd_web_admin.erl:2041
msgid "Store binary backup:"
msgstr "Uložit binární zálohu:"
#: web/ejabberd_web_admin.erl:2045 web/ejabberd_web_admin.erl:2052
#: web/ejabberd_web_admin.erl:2060 web/ejabberd_web_admin.erl:2067
#: web/ejabberd_web_admin.erl:2074 web/ejabberd_web_admin.erl:2081
#: web/ejabberd_web_admin.erl:2088 web/ejabberd_web_admin.erl:2096
#: web/ejabberd_web_admin.erl:2103 web/ejabberd_web_admin.erl:2110
msgid "OK"
msgstr "OK"
#: web/ejabberd_web_admin.erl:2048
msgid "Restore binary backup immediately:"
msgstr "Okamžitě obnovit binární zálohu:"
#: web/ejabberd_web_admin.erl:2056
msgid ""
"Restore binary backup after next ejabberd restart (requires less memory):"
msgstr ""
"Obnovit binární zálohu při následujícím restartu ejabberd (vyžaduje méně "
"paměti)"
#: web/ejabberd_web_admin.erl:2063
msgid "Store plain text backup:"
msgstr "Uložit zálohu do textového souboru:"
#: web/ejabberd_web_admin.erl:2070
msgid "Restore plain text backup immediately:"
msgstr "Okamžitě obnovit zálohu z textového souboru:"
#: web/ejabberd_web_admin.erl:2077
msgid "Import users data from a PIEFXIS file (XEP-0227):"
msgstr "Importovat uživatele ze souboru ve formátu PIEFXIS (XEP-0227):"
#: web/ejabberd_web_admin.erl:2084
msgid "Export data of all users in the server to PIEFXIS files (XEP-0227):"
msgstr "Exportovat všechny uživatele do souboru ve formátu PIEFXIS (XEP-0227):"
#: web/ejabberd_web_admin.erl:2091
msgid "Export data of users in a host to PIEFXIS files (XEP-0227):"
msgstr ""
"Exportovat uživatele na hostiteli do souboru ve formátu PIEFXIS (XEP-0227):"
#: web/ejabberd_web_admin.erl:2099
msgid "Import user data from jabberd14 spool file:"
msgstr "Importovat uživatele z jabberd14 spool souborů:"
#: web/ejabberd_web_admin.erl:2106
msgid "Import users data from jabberd14 spool directory:"
msgstr "Importovat uživatele z jabberd14 spool souborů:"
#: web/ejabberd_web_admin.erl:2132
msgid "Listened Ports at "
msgstr "Otevřené porty na "
#: web/ejabberd_web_admin.erl:2157
msgid "Modules at "
msgstr "Moduly na "
#: web/ejabberd_web_admin.erl:2183
msgid "Statistics of ~p"
msgstr "Statistiky ~p"
#: web/ejabberd_web_admin.erl:2186
msgid "Uptime:"
msgstr "Čas běhu:"
#: web/ejabberd_web_admin.erl:2189
msgid "CPU Time:"
msgstr "Čas procesoru"
#: web/ejabberd_web_admin.erl:2195
msgid "Transactions Committed:"
msgstr "Transakce potvrzena"
#: web/ejabberd_web_admin.erl:2198
msgid "Transactions Aborted:"
msgstr "Transakce zrušena"
#: web/ejabberd_web_admin.erl:2201
msgid "Transactions Restarted:"
msgstr "Transakce restartována"
#: web/ejabberd_web_admin.erl:2204
msgid "Transactions Logged:"
msgstr "Transakce zaznamenána"
#: web/ejabberd_web_admin.erl:2246
msgid "Update "
msgstr "Aktualizovat "
#: web/ejabberd_web_admin.erl:2254
msgid "Update plan"
msgstr "Aktualizovat plán"
#: web/ejabberd_web_admin.erl:2255
msgid "Modified modules"
msgstr "Aktualizované moduly"
#: web/ejabberd_web_admin.erl:2256
msgid "Update script"
msgstr "Aktualizované skripty"
#: web/ejabberd_web_admin.erl:2257
msgid "Low level update script"
msgstr "Nízkoúrovňový aktualizační skript"
#: web/ejabberd_web_admin.erl:2258
msgid "Script check"
msgstr "Kontrola skriptu"
#: web/ejabberd_web_admin.erl:2426
msgid "Port"
msgstr "Port"
#: web/ejabberd_web_admin.erl:2427
msgid "IP"
msgstr "IP"
#: web/ejabberd_web_admin.erl:2428
msgid "Protocol"
msgstr "Protokol"
#: web/ejabberd_web_admin.erl:2429 web/ejabberd_web_admin.erl:2556
msgid "Module"
msgstr "Modul"
#: web/ejabberd_web_admin.erl:2430 web/ejabberd_web_admin.erl:2557
msgid "Options"
msgstr "Nastavení"
#: web/ejabberd_web_admin.erl:2450
msgid "Delete"
msgstr "Smazat"
#: web/ejabberd_web_admin.erl:2579
msgid "Start"
msgstr "Start"
#: web/mod_register_web.erl:104
msgid "Your Jabber account was successfully created."
msgstr "Váš účet Jabberu byl úspěšně vytvořen."
#: web/mod_register_web.erl:107
msgid "There was an error creating the account: "
msgstr "Při vytváření účtu došlo k chybě."
#: web/mod_register_web.erl:115
msgid "Your Jabber account was successfully deleted."
msgstr "Váš účet Jabberu byl úspěšně smazán."
#: web/mod_register_web.erl:118
msgid "There was an error deleting the account: "
msgstr "Při mazání účtu došlo k chybě: "
#: web/mod_register_web.erl:128
msgid "The password of your Jabber account was successfully changed."
msgstr "Heslo vašeho účtu Jabberu bylo úspěšně změněno."
#: web/mod_register_web.erl:131
msgid "There was an error changing the password: "
msgstr "Při změně hesla došlo k chybě: "
#: web/mod_register_web.erl:163 web/mod_register_web.erl:172
msgid "Jabber Account Registration"
msgstr "Registrace účtu Jabberu"
#: web/mod_register_web.erl:174 web/mod_register_web.erl:192
#: web/mod_register_web.erl:201
msgid "Register a Jabber account"
msgstr "Zaregistrujte si účet Jabberu"
#: web/mod_register_web.erl:176 web/mod_register_web.erl:493
#: web/mod_register_web.erl:502
msgid "Unregister a Jabber account"
msgstr "Zrušte registraci účtu Jabberu"
#: web/mod_register_web.erl:203
msgid ""
"This page allows to create a Jabber account in this Jabber server. Your JID "
"(Jabber IDentifier) will be of the form: username@server. Please read "
"carefully the instructions to fill correctly the fields."
msgstr ""
"Na této stránce si můžete vytvořit účet na tomto serveru Jabberu. Vaše JID "
"(Jabber IDentifikátor) bude mít tvar: uživatelskéjméno@server. Přečtěte si "
"prosím pozorně instrukce pro vyplnění údajů."
#: web/mod_register_web.erl:212 web/mod_register_web.erl:386
#: web/mod_register_web.erl:509
msgid "Username:"
msgstr "Uživatelské jméno:"
#: web/mod_register_web.erl:217
msgid "This is case insensitive: macbeth is the same that MacBeth and Macbeth."
msgstr ""
"Zde nezáleží na velikosti písmen: macbeth je stejný jako MacBeth a Macbeth."
#: web/mod_register_web.erl:218
msgid "Characters not allowed:"
msgstr "Nepřípustné znaky:"
#: web/mod_register_web.erl:222 web/mod_register_web.erl:391
#: web/mod_register_web.erl:514
msgid "Server:"
msgstr "Server:"
#: web/mod_register_web.erl:232
msgid ""
"Don't tell your password to anybody, not even the administrators of the "
"Jabber server."
msgstr ""
"Nikdy nikomu nesdělujte své heslo, ani administrátorovi serveru Jabberu."
#: web/mod_register_web.erl:234
msgid "You can later change your password using a Jabber client."
msgstr "Později můžete své heslo změnit pomocí klienta Jabberu."
#: web/mod_register_web.erl:235
msgid ""
"Some Jabber clients can store your password in your computer. Use that "
"feature only if you trust your computer is safe."
msgstr ""
"Někteří klienti umí uložit vaše heslo na disk počítače. Tuto funkci "
"používejte, pouze pokud věříte zabezpečení svého počítače."
#: web/mod_register_web.erl:237
msgid ""
"Memorize your password, or write it in a paper placed in a safe place. In "
"Jabber there isn't an automated way to recover your password if you forget "
"it."
msgstr ""
"Svoje heslo si zapamatujte, nebo si jej poznamenejte na papírek a ten "
"uschovejte v bezpečí. Jabber nemá žádný automatizovaný způsob obnovy hesla."
#: web/mod_register_web.erl:242 web/mod_register_web.erl:406
msgid "Password Verification:"
msgstr "Ověření hesla:"
#: web/mod_register_web.erl:250
msgid "Register"
msgstr "Zaregistrovat se"
#: web/mod_register_web.erl:396
msgid "Old Password:"
msgstr "Současné heslo:"
#: web/mod_register_web.erl:401
msgid "New Password:"
msgstr "Nové heslo:"
#: web/mod_register_web.erl:504
msgid "This page allows to unregister a Jabber account in this Jabber server."
msgstr "Zde můžete zrušit registraci účtu na tomto serveru Jabberu."
#: web/mod_register_web.erl:524
msgid "Unregister"
msgstr "Zrušit registraci"
#, fuzzy
#~ msgid "Captcha test failed"
#~ msgstr "Zkouška CAPTCHA neprošla."
ejabberd-2.1.11/src/msgs/wa.po 0000664 0000000 0000000 00000152416 12240230175 012736 0 ustar msgid ""
msgstr ""
"Project-Id-Version: 2.1.0-alpha\n"
"Last-Translator: Pablo Saratxaga\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Language: Walon (Walloon)\n"
#: ejabberd_c2s.erl:424 ejabberd_c2s.erl:727
msgid "Use of STARTTLS required"
msgstr "L' eployaedje di STARTTL est oblidjî"
#: ejabberd_c2s.erl:503
msgid "No resource provided"
msgstr "Nole rissoûce di dnêye"
#: ejabberd_c2s.erl:1197
msgid "Replaced by new connection"
msgstr "Replaecî pa on novea raloyaedje"
#: ejabberd_c2s.erl:1885
msgid "Your active privacy list has denied the routing of this stanza."
msgstr ""
#: ejabberd_captcha.erl:96 ejabberd_captcha.erl:152 ejabberd_captcha.erl:178
#, fuzzy
msgid "Enter the text you see"
msgstr "Dinez l' tchimin viè l' fitchî tecse"
#: ejabberd_captcha.erl:101
msgid "Your messages to ~s are being blocked. To unblock them, visit ~s"
msgstr ""
#: ejabberd_captcha.erl:134
msgid "If you don't see the CAPTCHA image here, visit the web page."
msgstr ""
#: ejabberd_captcha.erl:146
msgid "CAPTCHA web page"
msgstr ""
#: ejabberd_captcha.erl:307
msgid "The CAPTCHA is valid."
msgstr ""
#: mod_adhoc.erl:95 mod_adhoc.erl:125 mod_adhoc.erl:143 mod_adhoc.erl:161
msgid "Commands"
msgstr "Comandes"
#: mod_adhoc.erl:149 mod_adhoc.erl:243
msgid "Ping"
msgstr "Ping"
#: mod_adhoc.erl:260
msgid "Pong"
msgstr "Pong"
#: mod_announce.erl:507 mod_announce_odbc.erl:499
msgid "Really delete message of the day?"
msgstr "Voloz vs vormint disfacer l' messaedje do djoû?"
#: mod_announce.erl:515 mod_announce_odbc.erl:507 mod_configure.erl:1083
#: mod_configure.erl:1128
msgid "Subject"
msgstr "Sudjet"
#: mod_announce.erl:520 mod_announce_odbc.erl:512 mod_configure.erl:1088
#: mod_configure.erl:1133
msgid "Message body"
msgstr "Coir do messaedje"
#: mod_announce.erl:600 mod_announce_odbc.erl:592
msgid "No body provided for announce message"
msgstr "I n' a nou coir do messaedje po ciste anonce la"
#: mod_announce.erl:635 mod_announce_odbc.erl:627
msgid "Announcements"
msgstr "Anonces"
#: mod_announce.erl:637 mod_announce_odbc.erl:629
msgid "Send announcement to all users"
msgstr "Evoyî l' anonce a tos les uzeus"
#: mod_announce.erl:639 mod_announce_odbc.erl:631
msgid "Send announcement to all users on all hosts"
msgstr "Evoyî l' anonce a tos les uzeus so tos les lodjoes"
#: mod_announce.erl:641 mod_announce_odbc.erl:633
msgid "Send announcement to all online users"
msgstr "Evoyî l' anonce a tos les uzeus raloyîs"
#: mod_announce.erl:643 mod_announce_odbc.erl:635 mod_configure.erl:1078
#: mod_configure.erl:1123
msgid "Send announcement to all online users on all hosts"
msgstr "Evoyî l' anonce a tos les uzeus raloyîs so tos les lodjoes"
#: mod_announce.erl:645 mod_announce_odbc.erl:637
msgid "Set message of the day and send to online users"
msgstr "Defini l' messaedje do djoû et l' evoyî åzès uzeus raloyîs"
#: mod_announce.erl:647 mod_announce_odbc.erl:639
msgid "Set message of the day on all hosts and send to online users"
msgstr ""
"Defini l' messaedje do djoû so tos les lodjoes et l' evoyî åzès uzeus raloyîs"
#: mod_announce.erl:649 mod_announce_odbc.erl:641
msgid "Update message of the day (don't send)"
msgstr "Mete a djoû l' messaedje do djoû (nén l' evoyî)"
#: mod_announce.erl:651 mod_announce_odbc.erl:643
msgid "Update message of the day on all hosts (don't send)"
msgstr "Mete a djoû l' messaedje do djoû so tos les lodjoes (nén l' evoyî)"
#: mod_announce.erl:653 mod_announce_odbc.erl:645
msgid "Delete message of the day"
msgstr "Disfacer l' messaedje do djoû"
#: mod_announce.erl:655 mod_announce_odbc.erl:647
msgid "Delete message of the day on all hosts"
msgstr "Disfacer l' messaedje do djoû so tos les lodjoes"
#: mod_configure.erl:114 mod_configure.erl:274 mod_configure.erl:296
#: mod_configure.erl:498
msgid "Configuration"
msgstr "Apontiaedjes"
#: mod_configure.erl:125 mod_configure.erl:576 web/ejabberd_web_admin.erl:1936
msgid "Database"
msgstr "Båze di dnêyes"
#: mod_configure.erl:127 mod_configure.erl:595
msgid "Start Modules"
msgstr "Enonder des modules"
#: mod_configure.erl:129 mod_configure.erl:596
msgid "Stop Modules"
msgstr "Arester des modules"
#: mod_configure.erl:131 mod_configure.erl:604 web/ejabberd_web_admin.erl:1937
msgid "Backup"
msgstr "Copeye di såvrité"
#: mod_configure.erl:133 mod_configure.erl:605
msgid "Restore"
msgstr "Rapexhî"
#: mod_configure.erl:135 mod_configure.erl:606
msgid "Dump to Text File"
msgstr "Schaper en on fitchî tecse"
#: mod_configure.erl:137 mod_configure.erl:615
msgid "Import File"
msgstr "Sititchî d' on fitchî"
#: mod_configure.erl:139 mod_configure.erl:616
msgid "Import Directory"
msgstr "Sititchî d' on ridant"
#: mod_configure.erl:141 mod_configure.erl:581 mod_configure.erl:1057
msgid "Restart Service"
msgstr "Renonder siervice"
#: mod_configure.erl:143 mod_configure.erl:582 mod_configure.erl:1102
msgid "Shut Down Service"
msgstr "Arester siervice"
#: mod_configure.erl:145 mod_configure.erl:518 mod_configure.erl:1197
#: web/ejabberd_web_admin.erl:1527
msgid "Add User"
msgstr "Radjouter èn uzeu"
#: mod_configure.erl:147 mod_configure.erl:519 mod_configure.erl:1219
msgid "Delete User"
msgstr "Disfacer èn uzeu"
#: mod_configure.erl:149 mod_configure.erl:520 mod_configure.erl:1231
msgid "End User Session"
msgstr "Fini l' session d' l' uzeu"
#: mod_configure.erl:151 mod_configure.erl:521 mod_configure.erl:1243
#: mod_configure.erl:1255
msgid "Get User Password"
msgstr "Riçure sicret d' l' uzeu"
#: mod_configure.erl:153 mod_configure.erl:522
msgid "Change User Password"
msgstr "Candjî l' sicret d' l' uzeu"
#: mod_configure.erl:155 mod_configure.erl:523 mod_configure.erl:1272
msgid "Get User Last Login Time"
msgstr "Riçure li date/eure do dierin elodjaedje di l' uzeu"
#: mod_configure.erl:157 mod_configure.erl:524 mod_configure.erl:1284
msgid "Get User Statistics"
msgstr "Riçure les statistikes di l' uzeu"
#: mod_configure.erl:159 mod_configure.erl:525
msgid "Get Number of Registered Users"
msgstr "Riçure li nombe d' uzeus edjîstrés"
#: mod_configure.erl:161 mod_configure.erl:526
msgid "Get Number of Online Users"
msgstr "Riçure li nombe d' uzeus raloyîs"
#: mod_configure.erl:163 mod_configure.erl:509 web/ejabberd_web_admin.erl:831
#: web/ejabberd_web_admin.erl:872
msgid "Access Control Lists"
msgstr "Droets (ACL)"
#: mod_configure.erl:165 mod_configure.erl:510 web/ejabberd_web_admin.erl:940
#: web/ejabberd_web_admin.erl:976
msgid "Access Rules"
msgstr "Rîles d' accès"
#: mod_configure.erl:297 mod_configure.erl:499
msgid "User Management"
msgstr "Manaedjaedje des uzeus"
#: mod_configure.erl:500 web/ejabberd_web_admin.erl:1058
#: web/ejabberd_web_admin.erl:1462
msgid "Online Users"
msgstr "Uzeus raloyîs"
#: mod_configure.erl:501
msgid "All Users"
msgstr "Tos les uzeus"
#: mod_configure.erl:502
msgid "Outgoing s2s Connections"
msgstr "Raloyaedjes s2s e rexhowe"
#: mod_configure.erl:503 web/ejabberd_web_admin.erl:1907
msgid "Running Nodes"
msgstr "Nuks en alaedje"
#: mod_configure.erl:504 web/ejabberd_web_admin.erl:1909
msgid "Stopped Nodes"
msgstr "Nuks essoctés"
#: mod_configure.erl:577 mod_configure.erl:587 web/ejabberd_web_admin.erl:1953
msgid "Modules"
msgstr "Modules"
#: mod_configure.erl:578
msgid "Backup Management"
msgstr "Manaedjaedje des copeyes di såvrité"
#: mod_configure.erl:579
msgid "Import Users From jabberd14 Spool Files"
msgstr "Sititchî des uzeus Jabberd 1.4"
#: mod_configure.erl:699
msgid "To ~s"
msgstr "Viè ~s"
#: mod_configure.erl:717
msgid "From ~s"
msgstr "Dispoy ~s"
#: mod_configure.erl:913
msgid "Database Tables Configuration at "
msgstr "Apontiaedje des tåves del båze di dnêyes so "
#: mod_configure.erl:918
msgid "Choose storage type of tables"
msgstr "Tchoezi l' sôre di wårdaedje po les tåves"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "Disc only copy"
msgstr "Copeye seulmint sol deure plake"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "RAM and disc copy"
msgstr "Copeye e memwere (RAM) et sol deure plake"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "RAM copy"
msgstr "Copeye e memwere (RAM)"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "Remote copy"
msgstr "Copeye å lon"
#: mod_configure.erl:950
msgid "Stop Modules at "
msgstr "Arester les modules so "
#: mod_configure.erl:954
msgid "Choose modules to stop"
msgstr "Tchoezixhoz les modules a-z arester"
#: mod_configure.erl:969
msgid "Start Modules at "
msgstr "Renonder les modules so "
#: mod_configure.erl:973
msgid "Enter list of {Module, [Options]}"
msgstr "Dinez ene djivêye del cogne {Module, [Tchuzes]}"
#: mod_configure.erl:974
msgid "List of modules to start"
msgstr "Djivêye di modules a-z enonder"
#: mod_configure.erl:983
msgid "Backup to File at "
msgstr "Fé ene copeye di såvrité dins on fitchî so "
#: mod_configure.erl:987 mod_configure.erl:1001
msgid "Enter path to backup file"
msgstr "Dinez l' tchimin viè l' fitchî copeye di såvrité"
#: mod_configure.erl:988 mod_configure.erl:1002 mod_configure.erl:1016
#: mod_configure.erl:1030
msgid "Path to File"
msgstr "Tchimin viè l' fitchî"
#: mod_configure.erl:997
msgid "Restore Backup from File at "
msgstr "Rapexhî dispoy li fitchî copeye di såvrité so "
#: mod_configure.erl:1011
msgid "Dump Backup to Text File at "
msgstr "Copeye di såvritè viè on fitchî tecse so "
#: mod_configure.erl:1015
msgid "Enter path to text file"
msgstr "Dinez l' tchimin viè l' fitchî tecse"
#: mod_configure.erl:1025
msgid "Import User from File at "
msgstr "Sititchî uzeu d' on fitchî so "
#: mod_configure.erl:1029
msgid "Enter path to jabberd14 spool file"
msgstr "Dinez l' tchimin viè l' fitchî di spool jabberd14"
#: mod_configure.erl:1039
msgid "Import Users from Dir at "
msgstr "Sitichî des uzeus d' on ridant so "
#: mod_configure.erl:1043
msgid "Enter path to jabberd14 spool dir"
msgstr "Dinez l' tchimin viè l' ridant di spool jabberd14"
#: mod_configure.erl:1044
msgid "Path to Dir"
msgstr "Tchimin viè l' ridant"
#: mod_configure.erl:1060 mod_configure.erl:1105
msgid "Time delay"
msgstr "Tårdjaedje"
#: mod_configure.erl:1143
msgid "Access Control List Configuration"
msgstr "Apontiaedje des droets (ACL)"
#: mod_configure.erl:1147
msgid "Access control lists"
msgstr "Droets (ACL)"
#: mod_configure.erl:1171
msgid "Access Configuration"
msgstr "Apontiaedje des accès"
#: mod_configure.erl:1175
msgid "Access rules"
msgstr "Rîles d' accès"
#: mod_configure.erl:1200 mod_configure.erl:1222 mod_configure.erl:1234
#: mod_configure.erl:1246 mod_configure.erl:1258 mod_configure.erl:1275
#: mod_configure.erl:1287 mod_configure.erl:1650 mod_configure.erl:1700
#: mod_configure.erl:1721 mod_roster.erl:943 mod_roster_odbc.erl:1060
#: mod_vcard.erl:472 mod_vcard_ldap.erl:554 mod_vcard_odbc.erl:448
msgid "Jabber ID"
msgstr "ID Jabber"
#: mod_configure.erl:1205 mod_configure.erl:1263 mod_configure.erl:1651
#: mod_configure.erl:1863 mod_muc/mod_muc_room.erl:3224 mod_register.erl:235
#: web/ejabberd_web_admin.erl:1520
msgid "Password"
msgstr "Sicret"
#: mod_configure.erl:1210
msgid "Password Verification"
msgstr "Acertinaedje do scret"
#: mod_configure.erl:1301
msgid "Number of registered users"
msgstr "Nombe d' uzeus edjîstrés"
#: mod_configure.erl:1315
msgid "Number of online users"
msgstr "Nombe d' uzeus raloyîs"
#: mod_configure.erl:1682 web/ejabberd_web_admin.erl:1588
#: web/ejabberd_web_admin.erl:1743
msgid "Never"
msgstr "Måy"
#: mod_configure.erl:1696 web/ejabberd_web_admin.erl:1601
#: web/ejabberd_web_admin.erl:1756
msgid "Online"
msgstr "Raloyî"
#: mod_configure.erl:1701
msgid "Last login"
msgstr "Dierin elodjaedje"
#: mod_configure.erl:1722
msgid "Roster size"
msgstr "Grandeu del djivêye des soçons"
#: mod_configure.erl:1723
msgid "IP addresses"
msgstr "Adresses IP"
#: mod_configure.erl:1724
msgid "Resources"
msgstr "Rissoûces"
#: mod_configure.erl:1850
msgid "Administration of "
msgstr "Manaedjaedje di "
#: mod_configure.erl:1853
msgid "Action on user"
msgstr "Accion so l' uzeu"
#: mod_configure.erl:1857
msgid "Edit Properties"
msgstr "Candjî les prôpietés"
#: mod_configure.erl:1860 web/ejabberd_web_admin.erl:1769
msgid "Remove User"
msgstr "Disfacer l' uzeu"
#: mod_irc/mod_irc.erl:201 mod_irc/mod_irc_odbc.erl:196
#: mod_muc/mod_muc.erl:336 mod_muc/mod_muc_odbc.erl:342
msgid "Access denied by service policy"
msgstr "L' accès a stî rfuzé pal politike do siervice"
#: mod_irc/mod_irc.erl:401 mod_irc/mod_irc_odbc.erl:398
msgid "IRC Transport"
msgstr "Transpoirt IRC"
#: mod_irc/mod_irc.erl:428 mod_irc/mod_irc_odbc.erl:425
msgid "ejabberd IRC module"
msgstr "Module IRC po ejabberd"
#: mod_irc/mod_irc.erl:559 mod_irc/mod_irc_odbc.erl:568
msgid "You need an x:data capable client to configure mod_irc settings"
msgstr ""
"Vos avoz mezåjhe d' on cliyint ki sopoite x:data po candjî ls apontiaedjes "
"di mod_irc"
#: mod_irc/mod_irc.erl:566 mod_irc/mod_irc_odbc.erl:575
msgid "Registration in mod_irc for "
msgstr "Edjîstraedje dins mod_irc po "
#: mod_irc/mod_irc.erl:571 mod_irc/mod_irc_odbc.erl:580
#, fuzzy
msgid ""
"Enter username, encodings, ports and passwords you wish to use for "
"connecting to IRC servers"
msgstr ""
"Dinez les nos d' uzeu et ls ecôdaedjes ki vos vloz eployî po vs raloyî åzès "
"sierveus IRC"
#: mod_irc/mod_irc.erl:576 mod_irc/mod_irc_odbc.erl:585
msgid "IRC Username"
msgstr "No d' uzeu IRC"
#: mod_irc/mod_irc.erl:586 mod_irc/mod_irc_odbc.erl:595
#, fuzzy
msgid ""
"If you want to specify different ports, passwords, encodings for IRC "
"servers, fill this list with values in format '{\"irc server\", \"encoding"
"\", port, \"password\"}'. By default this service use \"~s\" encoding, port "
"~p, empty password."
msgstr ""
"Si vos vloz dner des ecôdaedjes diferins po les sierveus IRC, rimplixhoz "
"cisse djivêye ci avou des valixhances del cogne «{\"sierveu irc\", "
"\"ecôdaedje\"}». Li prémetou ecôdaedje do siervice c' est «~s»."
#: mod_irc/mod_irc.erl:598 mod_irc/mod_irc_odbc.erl:607
#, fuzzy
msgid ""
"Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef."
"net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."
msgstr ""
"Egzimpe: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", "
"\"iso8859-1\"}]."
#: mod_irc/mod_irc.erl:603 mod_irc/mod_irc_odbc.erl:612
msgid "Connections parameters"
msgstr ""
#: mod_irc/mod_irc.erl:728 mod_irc/mod_irc_odbc.erl:757
msgid "Join IRC channel"
msgstr ""
#: mod_irc/mod_irc.erl:732 mod_irc/mod_irc_odbc.erl:761
msgid "IRC channel (don't put the first #)"
msgstr ""
#: mod_irc/mod_irc.erl:737 mod_irc/mod_irc_odbc.erl:766
#, fuzzy
msgid "IRC server"
msgstr "No d' uzeu IRC"
#: mod_irc/mod_irc.erl:770 mod_irc/mod_irc.erl:774
#: mod_irc/mod_irc_odbc.erl:799 mod_irc/mod_irc_odbc.erl:803
msgid "Join the IRC channel here."
msgstr ""
#: mod_irc/mod_irc.erl:778 mod_irc/mod_irc_odbc.erl:807
msgid "Join the IRC channel in this Jabber ID: ~s"
msgstr ""
#: mod_irc/mod_irc.erl:863 mod_irc/mod_irc_odbc.erl:904
msgid "IRC settings"
msgstr ""
#: mod_irc/mod_irc.erl:868 mod_irc/mod_irc_odbc.erl:909
#, fuzzy
msgid ""
"Enter username and encodings you wish to use for connecting to IRC servers. "
"Press 'Next' to get more fields to fill in. Press 'Complete' to save "
"settings."
msgstr ""
"Dinez les nos d' uzeu et ls ecôdaedjes ki vos vloz eployî po vs raloyî åzès "
"sierveus IRC"
#: mod_irc/mod_irc.erl:874 mod_irc/mod_irc_odbc.erl:915
#, fuzzy
msgid "IRC username"
msgstr "No d' uzeu IRC"
#: mod_irc/mod_irc.erl:923 mod_irc/mod_irc_odbc.erl:964
#, fuzzy
msgid "Password ~b"
msgstr "Sicret"
#: mod_irc/mod_irc.erl:928 mod_irc/mod_irc_odbc.erl:969
#, fuzzy
msgid "Port ~b"
msgstr "Pôrt"
#: mod_irc/mod_irc.erl:933 mod_irc/mod_irc_odbc.erl:974
msgid "Encoding for server ~b"
msgstr ""
#: mod_irc/mod_irc.erl:942 mod_irc/mod_irc_odbc.erl:983
msgid "Server ~b"
msgstr ""
#: mod_muc/mod_muc.erl:449 mod_muc/mod_muc_odbc.erl:456
msgid "Only service administrators are allowed to send service messages"
msgstr ""
"Seulmint les manaedjeus d' siervices polèt evoyî des messaedjes di siervice"
#: mod_muc/mod_muc.erl:493 mod_muc/mod_muc_odbc.erl:500
msgid "Room creation is denied by service policy"
msgstr "L' ahivaedje del såle est rfuzé pal politike do siervice"
#: mod_muc/mod_muc.erl:500 mod_muc/mod_muc_odbc.erl:507
msgid "Conference room does not exist"
msgstr "Li såle di conferince n' egzistêye nén"
#: mod_muc/mod_muc.erl:582 mod_muc/mod_muc_odbc.erl:595
msgid "Chatrooms"
msgstr "Såles di berdelaedje"
#: mod_muc/mod_muc.erl:712 mod_muc/mod_muc_odbc.erl:729
#, fuzzy
msgid "You need a client that supports x:data to register the nickname"
msgstr ""
"Vos avoz mezåjhe d' on cliyint ki sopoite x:data po-z edjîstrer on metou no"
#: mod_muc/mod_muc.erl:718 mod_muc/mod_muc_odbc.erl:735
msgid "Nickname Registration at "
msgstr "Edjîstraedje di metou no amon "
#: mod_muc/mod_muc.erl:722 mod_muc/mod_muc_odbc.erl:739
msgid "Enter nickname you want to register"
msgstr "Dinez l' metou no ki vos vloz edjîstrer"
#: mod_muc/mod_muc.erl:723 mod_muc/mod_muc_odbc.erl:740
#: mod_muc/mod_muc_room.erl:3810 mod_roster.erl:944 mod_roster_odbc.erl:1061
#: mod_vcard.erl:364 mod_vcard.erl:477 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:453
msgid "Nickname"
msgstr "Metou no"
#: mod_muc/mod_muc.erl:762 mod_muc/mod_muc_odbc.erl:784
#: mod_muc/mod_muc_room.erl:1064 mod_muc/mod_muc_room.erl:1787
#, fuzzy
msgid "That nickname is registered by another person"
msgstr "Li metou no est ddja edjîstré pa ene ôte sakî"
#: mod_muc/mod_muc.erl:788 mod_muc/mod_muc_odbc.erl:811
msgid "You must fill in field \"Nickname\" in the form"
msgstr "Vos dvoz rimpli l' tchamp «Metou no» dins l' formiulaire"
#: mod_muc/mod_muc.erl:808 mod_muc/mod_muc_odbc.erl:831
msgid "ejabberd MUC module"
msgstr "Module MUC (såles di berdelaedje) po ejabberd"
#: mod_muc/mod_muc_log.erl:374 mod_muc/mod_muc_log.erl:381
msgid "Chatroom configuration modified"
msgstr "L' apontiaedje del såle di berdelaedje a candjî"
#: mod_muc/mod_muc_log.erl:384
msgid "joins the room"
msgstr "arive sol såle"
#: mod_muc/mod_muc_log.erl:387 mod_muc/mod_muc_log.erl:390
msgid "leaves the room"
msgstr "cwite li såle"
#: mod_muc/mod_muc_log.erl:393 mod_muc/mod_muc_log.erl:396
msgid "has been banned"
msgstr "a stî bani"
#: mod_muc/mod_muc_log.erl:399 mod_muc/mod_muc_log.erl:402
msgid "has been kicked"
msgstr "a stî pité evoye"
#: mod_muc/mod_muc_log.erl:405
msgid "has been kicked because of an affiliation change"
msgstr "a stî pité evoye cåze d' on candjmint d' afiyaedje"
#: mod_muc/mod_muc_log.erl:408
msgid "has been kicked because the room has been changed to members-only"
msgstr ""
"a stî pité evoye cåze ki l' såle a stî ristrindowe åzès mimbes seulmint"
#: mod_muc/mod_muc_log.erl:411
msgid "has been kicked because of a system shutdown"
msgstr "a stî pité evoye cåze d' èn arestaedje do sistinme"
#: mod_muc/mod_muc_log.erl:414
msgid "is now known as"
msgstr "est asteure kinoxhou come"
#: mod_muc/mod_muc_log.erl:417 mod_muc/mod_muc_log.erl:688
#: mod_muc/mod_muc_room.erl:2393
msgid " has set the subject to: "
msgstr " a candjî l' tite a: "
#: mod_muc/mod_muc_log.erl:452
#, fuzzy
msgid "Chatroom is created"
msgstr "Såles di berdelaedje"
#: mod_muc/mod_muc_log.erl:453
#, fuzzy
msgid "Chatroom is destroyed"
msgstr "Såles di berdelaedje"
#: mod_muc/mod_muc_log.erl:454
#, fuzzy
msgid "Chatroom is started"
msgstr "Såles di berdelaedje"
#: mod_muc/mod_muc_log.erl:455
#, fuzzy
msgid "Chatroom is stopped"
msgstr "Såles di berdelaedje"
#: mod_muc/mod_muc_log.erl:459
msgid "Monday"
msgstr "londi"
#: mod_muc/mod_muc_log.erl:460
msgid "Tuesday"
msgstr "mårdi"
#: mod_muc/mod_muc_log.erl:461
msgid "Wednesday"
msgstr "mierkidi"
#: mod_muc/mod_muc_log.erl:462
msgid "Thursday"
msgstr "djudi"
#: mod_muc/mod_muc_log.erl:463
msgid "Friday"
msgstr "vénrdi"
#: mod_muc/mod_muc_log.erl:464
msgid "Saturday"
msgstr "semdi"
#: mod_muc/mod_muc_log.erl:465
msgid "Sunday"
msgstr "dimegne"
#: mod_muc/mod_muc_log.erl:469
msgid "January"
msgstr "djanvî"
#: mod_muc/mod_muc_log.erl:470
msgid "February"
msgstr "fevrî"
#: mod_muc/mod_muc_log.erl:471
msgid "March"
msgstr "måss"
#: mod_muc/mod_muc_log.erl:472
msgid "April"
msgstr "avri"
#: mod_muc/mod_muc_log.erl:473
msgid "May"
msgstr "may"
#: mod_muc/mod_muc_log.erl:474
msgid "June"
msgstr "djun"
#: mod_muc/mod_muc_log.erl:475
msgid "July"
msgstr "djulete"
#: mod_muc/mod_muc_log.erl:476
msgid "August"
msgstr "awousse"
#: mod_muc/mod_muc_log.erl:477
msgid "September"
msgstr "setimbe"
#: mod_muc/mod_muc_log.erl:478
msgid "October"
msgstr "octôbe"
#: mod_muc/mod_muc_log.erl:479
msgid "November"
msgstr "nôvimbe"
#: mod_muc/mod_muc_log.erl:480
msgid "December"
msgstr "decimbe"
#: mod_muc/mod_muc_log.erl:750
msgid "Room Configuration"
msgstr "Apontiaedje del såle"
#: mod_muc/mod_muc_log.erl:759
#, fuzzy
msgid "Room Occupants"
msgstr "Nombe di prezints"
#: mod_muc/mod_muc_room.erl:174
msgid "Traffic rate limit is exceeded"
msgstr "Li limite pol volume di trafik a stî passêye"
#: mod_muc/mod_muc_room.erl:246
msgid ""
"This participant is kicked from the room because he sent an error message"
msgstr ""
"Ci pårticipant ci a stî pité evoye del såle cåze k' il a-st evoyî on "
"messaedje d' aroke"
#: mod_muc/mod_muc_room.erl:255
msgid "It is not allowed to send private messages to the conference"
msgstr "On n' pout nén evoyî des messaedjes privés dins cisse conferince ci"
#: mod_muc/mod_muc_room.erl:332
msgid "Please, wait for a while before sending new voice request"
msgstr ""
#: mod_muc/mod_muc_room.erl:347
msgid "Voice requests are disabled in this conference"
msgstr ""
#: mod_muc/mod_muc_room.erl:364
msgid "Failed to extract JID from your voice request approval"
msgstr ""
#: mod_muc/mod_muc_room.erl:393
msgid "Only moderators can approve voice requests"
msgstr ""
#: mod_muc/mod_muc_room.erl:408
msgid "Improper message type"
msgstr "Sôre di messaedje nén valide"
#: mod_muc/mod_muc_room.erl:518
msgid ""
"This participant is kicked from the room because he sent an error message to "
"another participant"
msgstr ""
"Ci pårticipant ci a stî pité evoye del såle cåze k' il a-st evoyî on "
"messaedje d' aroke a èn ôte pårticipant"
#: mod_muc/mod_muc_room.erl:531
msgid "It is not allowed to send private messages of type \"groupchat\""
msgstr "C' est nén possibe d' evoyî des messaedjes privés del sôre «groupchat»"
#: mod_muc/mod_muc_room.erl:543 mod_muc/mod_muc_room.erl:611
msgid "Recipient is not in the conference room"
msgstr "Li riçuveu n' est nén dins l' såle di conferince"
#: mod_muc/mod_muc_room.erl:564 mod_muc/mod_muc_room.erl:585
msgid "It is not allowed to send private messages"
msgstr "Ci n' est nén permetou d' evoyî des messaedjes privés"
#: mod_muc/mod_muc_room.erl:576 mod_muc/mod_muc_room.erl:956
#: mod_muc/mod_muc_room.erl:4040
msgid "Only occupants are allowed to send messages to the conference"
msgstr "Seulmint les prezints polèt evoyî des messaedjes al conferince"
#: mod_muc/mod_muc_room.erl:634
msgid "Only occupants are allowed to send queries to the conference"
msgstr "Seulmint les prezints polèt evoyî des cweraedjes sol conferince"
#: mod_muc/mod_muc_room.erl:646
msgid "Queries to the conference members are not allowed in this room"
msgstr ""
"Les cweraedjes des mimbes del conferince ni sont nén permetous dins cisse "
"såle ci"
#: mod_muc/mod_muc_room.erl:932
#, fuzzy
msgid ""
"Only moderators and participants are allowed to change the subject in this "
"room"
msgstr ""
"Seulmint les moderateus et les pårticipants polèt candjî l' sudjet dins "
"cisse såle ci"
#: mod_muc/mod_muc_room.erl:937
#, fuzzy
msgid "Only moderators are allowed to change the subject in this room"
msgstr "Seulmint les moderateus polèt candjî l' sudjet dins cisse såle ci"
#: mod_muc/mod_muc_room.erl:947
msgid "Visitors are not allowed to send messages to all occupants"
msgstr "Les viziteus n' polèt nén evoyî des messaedjes a tos les prezints"
#: mod_muc/mod_muc_room.erl:1021
msgid ""
"This participant is kicked from the room because he sent an error presence"
msgstr ""
"Ci pårticipant ci a stî pité evoye del såle cåze k' il a-st evoyî ene aroke "
"di prezince"
#: mod_muc/mod_muc_room.erl:1040
msgid "Visitors are not allowed to change their nicknames in this room"
msgstr "Les viziteus èn polèt nén candjî leus metous no po ç' såle ci"
#: mod_muc/mod_muc_room.erl:1053 mod_muc/mod_muc_room.erl:1779
#, fuzzy
msgid "That nickname is already in use by another occupant"
msgstr "Li metou no est ddja eployî pa ene ôte sakî sol såle"
#: mod_muc/mod_muc_room.erl:1768
msgid "You have been banned from this room"
msgstr "Vos avoz stî bani di cisse såle ci"
#: mod_muc/mod_muc_room.erl:1771
#, fuzzy
msgid "Membership is required to enter this room"
msgstr "I fåt esse mimbe po poleur intrer dins cisse såle ci"
#: mod_muc/mod_muc_room.erl:1807
msgid "This room is not anonymous"
msgstr "Cisse såle ci n' est nén anonime"
#: mod_muc/mod_muc_room.erl:1833
#, fuzzy
msgid "A password is required to enter this room"
msgstr "I fåt dner on scret po poleur intrer dins cisse såle ci"
#: mod_muc/mod_muc_room.erl:1855 mod_register.erl:246
msgid "Too many CAPTCHA requests"
msgstr ""
#: mod_muc/mod_muc_room.erl:1864 mod_register.erl:251
msgid "Unable to generate a CAPTCHA"
msgstr ""
#: mod_muc/mod_muc_room.erl:1874
msgid "Incorrect password"
msgstr "Sicret nén corek"
#: mod_muc/mod_muc_room.erl:2448
msgid "Administrator privileges required"
msgstr "I fåt des priviledjes di manaedjeu"
#: mod_muc/mod_muc_room.erl:2463
msgid "Moderator privileges required"
msgstr "I fåt des priviledjes di moderateu"
#: mod_muc/mod_muc_room.erl:2619
msgid "Jabber ID ~s is invalid"
msgstr "Li Jabber ID ~s n' est nén valide"
#: mod_muc/mod_muc_room.erl:2633
msgid "Nickname ~s does not exist in the room"
msgstr "Li metou no ~s n' egzistêye nén dins l' såle"
#: mod_muc/mod_muc_room.erl:2659 mod_muc/mod_muc_room.erl:3049
msgid "Invalid affiliation: ~s"
msgstr "Afiyaedje nén valide: ~s"
#: mod_muc/mod_muc_room.erl:2713
msgid "Invalid role: ~s"
msgstr "Role nén valide: ~s"
#: mod_muc/mod_muc_room.erl:3026 mod_muc/mod_muc_room.erl:3062
msgid "Owner privileges required"
msgstr "I fåt des priviledjes di prôpietaire"
#: mod_muc/mod_muc_room.erl:3195
#, fuzzy
msgid "Configuration of room ~s"
msgstr "Apontiaedje po "
#: mod_muc/mod_muc_room.erl:3200
msgid "Room title"
msgstr "Tite del såle"
#: mod_muc/mod_muc_room.erl:3203 mod_muc/mod_muc_room.erl:3692
#, fuzzy
msgid "Room description"
msgstr "Discrijhaedje:"
#: mod_muc/mod_muc_room.erl:3210
msgid "Make room persistent"
msgstr "Rinde li såle permaninte"
#: mod_muc/mod_muc_room.erl:3215
msgid "Make room public searchable"
msgstr "Rinde li såle di berdelaedje cweråve publicmint"
#: mod_muc/mod_muc_room.erl:3218
msgid "Make participants list public"
msgstr "Rinde publike li djivêye des pårticipants"
#: mod_muc/mod_muc_room.erl:3221
msgid "Make room password protected"
msgstr "Rinde li såle di berdelaedje protedjeye pa scret"
#: mod_muc/mod_muc_room.erl:3232
msgid "Maximum Number of Occupants"
msgstr "Nombe macsimom di prezints"
#: mod_muc/mod_muc_room.erl:3239
msgid "No limit"
msgstr "Pont d' limite"
#: mod_muc/mod_muc_room.erl:3250
msgid "Present real Jabber IDs to"
msgstr "Mostrer les vraiys Jabber IDs a"
#: mod_muc/mod_muc_room.erl:3258 mod_muc/mod_muc_room.erl:3292
msgid "moderators only"
msgstr "les moderateus seulmint"
#: mod_muc/mod_muc_room.erl:3260 mod_muc/mod_muc_room.erl:3294
msgid "anyone"
msgstr "tot l' minme kî"
#: mod_muc/mod_muc_room.erl:3262
msgid "Make room members-only"
msgstr "Rinde li såle di berdelaedje ristrindowe ås mimbes seulmint"
#: mod_muc/mod_muc_room.erl:3265
msgid "Make room moderated"
msgstr "Rinde li såle di berdelaedje moderêye"
#: mod_muc/mod_muc_room.erl:3268
msgid "Default users as participants"
msgstr "Les uzeus sont des pårticipants come prémetowe dujhance"
#: mod_muc/mod_muc_room.erl:3271
#, fuzzy
msgid "Allow users to change the subject"
msgstr "Les uzeus polèt candjî l' tite"
#: mod_muc/mod_muc_room.erl:3274
msgid "Allow users to send private messages"
msgstr "Les uzeus polèt evoyî des messaedjes privés"
#: mod_muc/mod_muc_room.erl:3279
#, fuzzy
msgid "Allow visitors to send private messages to"
msgstr "Les uzeus polèt evoyî des messaedjes privés"
#: mod_muc/mod_muc_room.erl:3290
msgid "nobody"
msgstr ""
#: mod_muc/mod_muc_room.erl:3296
msgid "Allow users to query other users"
msgstr "Les uzeus polèt cweri ls ôtes uzeus"
#: mod_muc/mod_muc_room.erl:3299
msgid "Allow users to send invites"
msgstr "Les uzeus polèt evoyî priyaedjes"
#: mod_muc/mod_muc_room.erl:3302
msgid "Allow visitors to send status text in presence updates"
msgstr ""
"Permete ki les viziteus evoyexhe des tecse d' estat dins leus messaedjes di "
"prezince"
#: mod_muc/mod_muc_room.erl:3305
msgid "Allow visitors to change nickname"
msgstr "Permete ki les viziteus candjexhe leus metous nos"
#: mod_muc/mod_muc_room.erl:3308
#, fuzzy
msgid "Allow visitors to send voice requests"
msgstr "Les uzeus polèt evoyî priyaedjes"
#: mod_muc/mod_muc_room.erl:3311
msgid "Minimum interval between voice requests (in seconds)"
msgstr ""
#: mod_muc/mod_muc_room.erl:3317
#, fuzzy
msgid "Make room CAPTCHA protected"
msgstr "Rinde li såle di berdelaedje protedjeye pa scret"
#: mod_muc/mod_muc_room.erl:3322
msgid "Exclude Jabber IDs from CAPTCHA challenge"
msgstr ""
#: mod_muc/mod_muc_room.erl:3329
msgid "Enable logging"
msgstr "Mete en alaedje li djournå"
#: mod_muc/mod_muc_room.erl:3337
msgid "You need an x:data capable client to configure room"
msgstr "I vs fåt on cliyint ki sopoite x:data por vos poleur apontyî l' såle"
#: mod_muc/mod_muc_room.erl:3694
msgid "Number of occupants"
msgstr "Nombe di prezints"
#: mod_muc/mod_muc_room.erl:3750
msgid "private, "
msgstr "privé, "
#: mod_muc/mod_muc_room.erl:3799
msgid "Voice request"
msgstr ""
#: mod_muc/mod_muc_room.erl:3803
msgid "Either approve or decline the voice request."
msgstr ""
#: mod_muc/mod_muc_room.erl:3809
#, fuzzy
msgid "User JID"
msgstr "Uzeu "
#: mod_muc/mod_muc_room.erl:3811
msgid "Grant voice to this person?"
msgstr ""
#: mod_muc/mod_muc_room.erl:3960
msgid "~s invites you to the room ~s"
msgstr "~s vos preye sol såle ~s"
#: mod_muc/mod_muc_room.erl:3969
msgid "the password is"
msgstr "li scret est"
#: mod_offline.erl:510 mod_offline_odbc.erl:352
msgid ""
"Your contact offline message queue is full. The message has been discarded."
msgstr ""
"Li cawêye di messaedjes e môde disraloyî di vosse soçon est plinne. Li "
"messaedje a stî tapé å diale."
#: mod_offline.erl:560 mod_offline_odbc.erl:408
msgid "~s's Offline Messages Queue"
msgstr "messaedjes ki ratindèt el cawêye po ~s"
#: mod_offline.erl:563 mod_offline_odbc.erl:411 mod_roster.erl:987
#: mod_roster_odbc.erl:1104 mod_shared_roster.erl:901
#: mod_shared_roster.erl:1010 mod_shared_roster_odbc.erl:930
#: mod_shared_roster_odbc.erl:1039 web/ejabberd_web_admin.erl:833
#: web/ejabberd_web_admin.erl:874 web/ejabberd_web_admin.erl:942
#: web/ejabberd_web_admin.erl:978 web/ejabberd_web_admin.erl:1019
#: web/ejabberd_web_admin.erl:1508 web/ejabberd_web_admin.erl:1760
#: web/ejabberd_web_admin.erl:1931 web/ejabberd_web_admin.erl:1963
#: web/ejabberd_web_admin.erl:2031 web/ejabberd_web_admin.erl:2135
#: web/ejabberd_web_admin.erl:2160 web/ejabberd_web_admin.erl:2248
msgid "Submitted"
msgstr "Candjmints evoyîs"
#: mod_offline.erl:571
msgid "Time"
msgstr "Date"
#: mod_offline.erl:572
msgid "From"
msgstr "Di"
#: mod_offline.erl:573
msgid "To"
msgstr "Po"
#: mod_offline.erl:574 mod_offline_odbc.erl:419
msgid "Packet"
msgstr "Paket"
#: mod_offline.erl:587 mod_offline_odbc.erl:432 mod_shared_roster.erl:908
#: mod_shared_roster_odbc.erl:937 web/ejabberd_web_admin.erl:882
#: web/ejabberd_web_admin.erl:986
msgid "Delete Selected"
msgstr "Disfacer les elemints tchoezis"
#: mod_offline.erl:645 mod_offline_odbc.erl:519
msgid "Offline Messages:"
msgstr "Messaedjes ki ratindèt:"
#: mod_offline.erl:645 mod_offline_odbc.erl:519
#, fuzzy
msgid "Remove All Offline Messages"
msgstr "Messaedjes ki ratindèt"
#: mod_proxy65/mod_proxy65_service.erl:213
msgid "ejabberd SOCKS5 Bytestreams module"
msgstr "Module SOCKS5 Bytestreams po ejabberd"
#: mod_pubsub/mod_pubsub.erl:1120 mod_pubsub/mod_pubsub_odbc.erl:929
msgid "Publish-Subscribe"
msgstr "Eplaidaedje-abounmint"
#: mod_pubsub/mod_pubsub.erl:1214 mod_pubsub/mod_pubsub_odbc.erl:1025
msgid "ejabberd Publish-Subscribe module"
msgstr "Module d' eplaidaedje-abounmint po ejabberd"
#: mod_pubsub/mod_pubsub.erl:1497 mod_pubsub/mod_pubsub_odbc.erl:1312
msgid "PubSub subscriber request"
msgstr "Dimande d' eplaidaedje-abounmint d' èn abouné"
#: mod_pubsub/mod_pubsub.erl:1499 mod_pubsub/mod_pubsub_odbc.erl:1314
msgid "Choose whether to approve this entity's subscription."
msgstr "Tchoezi s' i fåt aprover ou nén l' abounmint di ciste intité."
#: mod_pubsub/mod_pubsub.erl:1505 mod_pubsub/mod_pubsub_odbc.erl:1320
msgid "Node ID"
msgstr "ID d' nuk"
#: mod_pubsub/mod_pubsub.erl:1510 mod_pubsub/mod_pubsub_odbc.erl:1325
msgid "Subscriber Address"
msgstr "Adresse di l' abouné"
#: mod_pubsub/mod_pubsub.erl:1516 mod_pubsub/mod_pubsub_odbc.erl:1331
msgid "Allow this Jabber ID to subscribe to this pubsub node?"
msgstr ""
"Permete ki ci Jabber ID ci si poye abouner a ç' nuk eplaidaedje-abounmint ci?"
#: mod_pubsub/mod_pubsub.erl:3474 mod_pubsub/mod_pubsub_odbc.erl:3287
msgid "Deliver payloads with event notifications"
msgstr "Evoyî l' contnou avou les notifiaedjes d' evenmints"
#: mod_pubsub/mod_pubsub.erl:3475 mod_pubsub/mod_pubsub_odbc.erl:3288
msgid "Deliver event notifications"
msgstr "Evoyî des notifiaedjes d' evenmints"
#: mod_pubsub/mod_pubsub.erl:3476 mod_pubsub/mod_pubsub_odbc.erl:3289
msgid "Notify subscribers when the node configuration changes"
msgstr "Notifyî åzès abounés cwand l' apontiaedje do nuk candje"
#: mod_pubsub/mod_pubsub.erl:3477 mod_pubsub/mod_pubsub_odbc.erl:3290
msgid "Notify subscribers when the node is deleted"
msgstr "Notifyî åzès abounés cwand l' nuk est disfacé"
#: mod_pubsub/mod_pubsub.erl:3478 mod_pubsub/mod_pubsub_odbc.erl:3291
msgid "Notify subscribers when items are removed from the node"
msgstr "Notifyî åzès abounés cwand des cayets sont oisté foû do nuk"
#: mod_pubsub/mod_pubsub.erl:3479 mod_pubsub/mod_pubsub_odbc.erl:3292
msgid "Persist items to storage"
msgstr "Cayets permanints a wårder"
#: mod_pubsub/mod_pubsub.erl:3480 mod_pubsub/mod_pubsub_odbc.erl:3293
msgid "A friendly name for the node"
msgstr "On no uzeu-ahessåve pol nuk"
#: mod_pubsub/mod_pubsub.erl:3481 mod_pubsub/mod_pubsub_odbc.erl:3294
msgid "Max # of items to persist"
msgstr "Nombe macsimoms di cayets permanints"
#: mod_pubsub/mod_pubsub.erl:3482 mod_pubsub/mod_pubsub_odbc.erl:3295
msgid "Whether to allow subscriptions"
msgstr "Si on permete les abounmints"
#: mod_pubsub/mod_pubsub.erl:3483 mod_pubsub/mod_pubsub_odbc.erl:3296
msgid "Specify the access model"
msgstr "Sipecifyî l' modele d' accès"
#: mod_pubsub/mod_pubsub.erl:3486 mod_pubsub/mod_pubsub_odbc.erl:3299
msgid "Roster groups allowed to subscribe"
msgstr "Pårtaedjîs groupes di soçons k' on s' î pout abouner"
#: mod_pubsub/mod_pubsub.erl:3487 mod_pubsub/mod_pubsub_odbc.erl:3300
msgid "Specify the publisher model"
msgstr "Dinez l' modele d' eplaideu"
#: mod_pubsub/mod_pubsub.erl:3489 mod_pubsub/mod_pubsub_odbc.erl:3302
msgid "Purge all items when the relevant publisher goes offline"
msgstr ""
#: mod_pubsub/mod_pubsub.erl:3490 mod_pubsub/mod_pubsub_odbc.erl:3303
#, fuzzy
msgid "Specify the event message type"
msgstr "Sipecifyî l' modele d' accès"
#: mod_pubsub/mod_pubsub.erl:3492 mod_pubsub/mod_pubsub_odbc.erl:3305
msgid "Max payload size in bytes"
msgstr "Contnou macsimom en octets"
#: mod_pubsub/mod_pubsub.erl:3493 mod_pubsub/mod_pubsub_odbc.erl:3306
msgid "When to send the last published item"
msgstr "Cwand evoyî l' dierin cayet eplaidî"
#: mod_pubsub/mod_pubsub.erl:3495 mod_pubsub/mod_pubsub_odbc.erl:3308
msgid "Only deliver notifications to available users"
msgstr "Seulmint evoyî des notifiaedje åzès uzeus disponibes"
#: mod_pubsub/mod_pubsub.erl:3496 mod_pubsub/mod_pubsub_odbc.erl:3309
msgid "The collections with which a node is affiliated"
msgstr ""
#: mod_register.erl:193
msgid "The CAPTCHA verification has failed"
msgstr ""
#: mod_register.erl:220
#, fuzzy
msgid "You need a client that supports x:data and CAPTCHA to register"
msgstr ""
"Vos avoz mezåjhe d' on cliyint ki sopoite x:data po-z edjîstrer on metou no"
#: mod_register.erl:226 mod_register.erl:265
msgid "Choose a username and password to register with this server"
msgstr ""
"Tchoezixhoz on no d' uzeu eyet on scret po vs edjîstrer so ç' sierveu ci"
#: mod_register.erl:230 mod_vcard.erl:364 mod_vcard_odbc.erl:342
#: web/ejabberd_web_admin.erl:1515 web/ejabberd_web_admin.erl:1572
msgid "User"
msgstr "Uzeu"
#: mod_register.erl:316 mod_register.erl:361
#, fuzzy
msgid "The password is too weak"
msgstr "li scret est"
#: mod_register.erl:365
#, fuzzy
msgid "Users are not allowed to register accounts so quickly"
msgstr "Les noveas uzeus n' si polèt nén edjîstrer si raddimint"
#: mod_roster.erl:938 mod_roster_odbc.erl:1055 web/ejabberd_web_admin.erl:1701
#: web/ejabberd_web_admin.erl:1886 web/ejabberd_web_admin.erl:1897
#: web/ejabberd_web_admin.erl:2219
msgid "None"
msgstr "Nole"
#: mod_roster.erl:945 mod_roster_odbc.erl:1062
msgid "Subscription"
msgstr "Abounmimnt"
#: mod_roster.erl:946 mod_roster_odbc.erl:1063
msgid "Pending"
msgstr "Ratindant"
#: mod_roster.erl:947 mod_roster_odbc.erl:1064
msgid "Groups"
msgstr "Groupes"
#: mod_roster.erl:974 mod_roster_odbc.erl:1091
msgid "Validate"
msgstr "Valider"
#: mod_roster.erl:982 mod_roster_odbc.erl:1099
msgid "Remove"
msgstr "Oister"
#: mod_roster.erl:985 mod_roster_odbc.erl:1102
msgid "Roster of "
msgstr "Djivêye des soçons da "
#: mod_roster.erl:988 mod_roster_odbc.erl:1105 mod_shared_roster.erl:902
#: mod_shared_roster.erl:1011 mod_shared_roster_odbc.erl:931
#: mod_shared_roster_odbc.erl:1040 web/ejabberd_web_admin.erl:834
#: web/ejabberd_web_admin.erl:875 web/ejabberd_web_admin.erl:943
#: web/ejabberd_web_admin.erl:979 web/ejabberd_web_admin.erl:1020
#: web/ejabberd_web_admin.erl:1509 web/ejabberd_web_admin.erl:1761
#: web/ejabberd_web_admin.erl:1932 web/ejabberd_web_admin.erl:2136
#: web/ejabberd_web_admin.erl:2161
msgid "Bad format"
msgstr "Mwais fôrmat"
#: mod_roster.erl:995 mod_roster_odbc.erl:1112
msgid "Add Jabber ID"
msgstr "Radjouter èn ID Jabber"
#: mod_roster.erl:1094 mod_roster_odbc.erl:1211
msgid "Roster"
msgstr "Djivêye des soçons"
#: mod_shared_roster.erl:857 mod_shared_roster.erl:899
#: mod_shared_roster.erl:1007 mod_shared_roster_odbc.erl:886
#: mod_shared_roster_odbc.erl:928 mod_shared_roster_odbc.erl:1036
msgid "Shared Roster Groups"
msgstr "Pårtaedjîs groupes ezès djivêyes di soçons"
#: mod_shared_roster.erl:895 mod_shared_roster_odbc.erl:924
#: web/ejabberd_web_admin.erl:1365 web/ejabberd_web_admin.erl:2461
msgid "Add New"
msgstr "Radjouter"
#: mod_shared_roster.erl:978 mod_shared_roster_odbc.erl:1007
msgid "Name:"
msgstr "Pitit no:"
#: mod_shared_roster.erl:983 mod_shared_roster_odbc.erl:1012
msgid "Description:"
msgstr "Discrijhaedje:"
#: mod_shared_roster.erl:991 mod_shared_roster_odbc.erl:1020
msgid "Members:"
msgstr "Mimbes:"
#: mod_shared_roster.erl:999 mod_shared_roster_odbc.erl:1028
msgid "Displayed Groups:"
msgstr "Groupes håynés:"
#: mod_shared_roster.erl:1008 mod_shared_roster_odbc.erl:1037
msgid "Group "
msgstr "Groupe "
#: mod_shared_roster.erl:1017 mod_shared_roster_odbc.erl:1046
#: web/ejabberd_web_admin.erl:840 web/ejabberd_web_admin.erl:884
#: web/ejabberd_web_admin.erl:949 web/ejabberd_web_admin.erl:1026
#: web/ejabberd_web_admin.erl:2017
msgid "Submit"
msgstr "Evoyî"
#: mod_vcard.erl:165 mod_vcard_ldap.erl:238 mod_vcard_odbc.erl:129
msgid "Erlang Jabber Server"
msgstr "Sierveu Jabber Erlang"
#: mod_vcard.erl:364 mod_vcard.erl:478 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:454
msgid "Birthday"
msgstr "Date d' askepiaedje"
#: mod_vcard.erl:364 mod_vcard.erl:480 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:456
msgid "City"
msgstr "Veye"
#: mod_vcard.erl:364 mod_vcard.erl:479 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:455
msgid "Country"
msgstr "Payis"
#: mod_vcard.erl:364 mod_vcard.erl:481 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:457
msgid "Email"
msgstr "Emile"
#: mod_vcard.erl:364 mod_vcard.erl:476 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:452
msgid "Family Name"
msgstr "No d' famile"
#: mod_vcard.erl:364 mod_vcard_odbc.erl:342
msgid ""
"Fill in the form to search for any matching Jabber User (Add * to the end of "
"field to match substring)"
msgstr ""
"Rimplixhoz les tchamps do formulaire po cweri èn uzeu Jabber (radjouter «*» "
"al fén do tchamp po cweri tot l' minme kéne fén d' tchinne"
#: mod_vcard.erl:364 mod_vcard.erl:473 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:449
msgid "Full Name"
msgstr "No etir"
#: mod_vcard.erl:364 mod_vcard.erl:475 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:451
msgid "Middle Name"
msgstr "No do mitan"
#: mod_vcard.erl:364 mod_vcard.erl:474 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:450 web/ejabberd_web_admin.erl:2006
msgid "Name"
msgstr "No"
#: mod_vcard.erl:364 mod_vcard.erl:482 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:458
msgid "Organization Name"
msgstr "No d' l' organizåcion"
#: mod_vcard.erl:364 mod_vcard.erl:483 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:459
msgid "Organization Unit"
msgstr "Unité d' l' organizåcion"
#: mod_vcard.erl:364 mod_vcard_ldap.erl:462 mod_vcard_odbc.erl:342
msgid "Search users in "
msgstr "Cweri des uzeus dins "
#: mod_vcard.erl:364 mod_vcard_ldap.erl:462 mod_vcard_odbc.erl:342
msgid "You need an x:data capable client to search"
msgstr "Vos avoz mezåjhe d' on cliyint ki sopoite x:data po fé on cweraedje"
#: mod_vcard.erl:389 mod_vcard_ldap.erl:487 mod_vcard_odbc.erl:367
msgid "vCard User Search"
msgstr "Calpin des uzeus"
#: mod_vcard.erl:445 mod_vcard_ldap.erl:541 mod_vcard_odbc.erl:421
msgid "ejabberd vCard module"
msgstr "Module vCard ejabberd"
#: mod_vcard.erl:469 mod_vcard_ldap.erl:551 mod_vcard_odbc.erl:445
msgid "Search Results for "
msgstr "Rizultats do cweraedje po "
#: mod_vcard_ldap.erl:462
msgid "Fill in fields to search for any matching Jabber User"
msgstr "Rimplixhoz les tchamps po cweri èn uzeu Jabber"
#: web/ejabberd_web_admin.erl:193 web/ejabberd_web_admin.erl:203
#: web/ejabberd_web_admin.erl:219 web/ejabberd_web_admin.erl:229
msgid "Unauthorized"
msgstr ""
#: web/ejabberd_web_admin.erl:286 web/ejabberd_web_admin.erl:303
msgid "ejabberd Web Admin"
msgstr "Manaedjeu waibe ejabberd"
#: web/ejabberd_web_admin.erl:769 web/ejabberd_web_admin.erl:780
msgid "Administration"
msgstr "Manaedjaedje"
#: web/ejabberd_web_admin.erl:878 web/ejabberd_web_admin.erl:982
msgid "Raw"
msgstr "Dinêyes brutes"
#: web/ejabberd_web_admin.erl:1017
msgid "~s access rule configuration"
msgstr "Apontiaedje des rîles d' accès a ~s"
#: web/ejabberd_web_admin.erl:1035
msgid "Virtual Hosts"
msgstr "Forveyous sierveus"
#: web/ejabberd_web_admin.erl:1043 web/ejabberd_web_admin.erl:1050
msgid "Users"
msgstr "Uzeus"
#: web/ejabberd_web_admin.erl:1078
msgid "Users Last Activity"
msgstr "Dierinne activité des uzeus"
#: web/ejabberd_web_admin.erl:1080
msgid "Period: "
msgstr "Termene:"
#: web/ejabberd_web_admin.erl:1090
msgid "Last month"
msgstr "Dierin moes"
#: web/ejabberd_web_admin.erl:1091
msgid "Last year"
msgstr "Dierinne anêye"
#: web/ejabberd_web_admin.erl:1092
msgid "All activity"
msgstr "Dispoy todi"
#: web/ejabberd_web_admin.erl:1094
msgid "Show Ordinary Table"
msgstr "Mostrer crexhince"
#: web/ejabberd_web_admin.erl:1096
msgid "Show Integral Table"
msgstr "Mostrer totå"
#: web/ejabberd_web_admin.erl:1105 web/ejabberd_web_admin.erl:1939
msgid "Statistics"
msgstr "Sitatistikes"
#: web/ejabberd_web_admin.erl:1117
#, fuzzy
msgid "Not Found"
msgstr "Nuk nén trové"
#: web/ejabberd_web_admin.erl:1134
msgid "Node not found"
msgstr "Nuk nén trové"
#: web/ejabberd_web_admin.erl:1460
msgid "Host"
msgstr "Sierveu"
#: web/ejabberd_web_admin.erl:1461
msgid "Registered Users"
msgstr "Uzeus edjistrés"
#: web/ejabberd_web_admin.erl:1573
msgid "Offline Messages"
msgstr "Messaedjes ki ratindèt"
#: web/ejabberd_web_admin.erl:1574 web/ejabberd_web_admin.erl:1767
msgid "Last Activity"
msgstr "Dierinne activité"
#: web/ejabberd_web_admin.erl:1659 web/ejabberd_web_admin.erl:1675
msgid "Registered Users:"
msgstr "Uzeus edjistrés:"
#: web/ejabberd_web_admin.erl:1661 web/ejabberd_web_admin.erl:1677
#: web/ejabberd_web_admin.erl:2192
msgid "Online Users:"
msgstr "Uzeus raloyîs:"
#: web/ejabberd_web_admin.erl:1663
msgid "Outgoing s2s Connections:"
msgstr "Raloyaedjes s2s e rexhowe:"
#: web/ejabberd_web_admin.erl:1665
msgid "Outgoing s2s Servers:"
msgstr "Sierveus s2s e rexhowe:"
#: web/ejabberd_web_admin.erl:1734 web/mod_register_web.erl:175
#: web/mod_register_web.erl:372 web/mod_register_web.erl:381
#: web/mod_register_web.erl:411
msgid "Change Password"
msgstr "Candjî l' sicret"
#: web/ejabberd_web_admin.erl:1758
msgid "User "
msgstr "Uzeu "
#: web/ejabberd_web_admin.erl:1765
msgid "Connected Resources:"
msgstr "Raloyî avou les rsoûces:"
#: web/ejabberd_web_admin.erl:1766 web/mod_register_web.erl:227
#: web/mod_register_web.erl:519
msgid "Password:"
msgstr "Sicret:"
#: web/ejabberd_web_admin.erl:1828
msgid "No Data"
msgstr "Nole dinêye disponibe"
#: web/ejabberd_web_admin.erl:1906
msgid "Nodes"
msgstr "Nuks"
#: web/ejabberd_web_admin.erl:1929 web/ejabberd_web_admin.erl:1951
msgid "Node "
msgstr "Nuk "
#: web/ejabberd_web_admin.erl:1938
msgid "Listened Ports"
msgstr "Pôrts drovous"
#: web/ejabberd_web_admin.erl:1940 web/ejabberd_web_admin.erl:2260
#: web/ejabberd_web_admin.erl:2448
msgid "Update"
msgstr "Mete a djoû"
#: web/ejabberd_web_admin.erl:1943 web/ejabberd_web_admin.erl:2569
msgid "Restart"
msgstr "Renonder"
#: web/ejabberd_web_admin.erl:1945 web/ejabberd_web_admin.erl:2571
msgid "Stop"
msgstr "Arester"
#: web/ejabberd_web_admin.erl:1959
msgid "RPC Call Error"
msgstr "Aroke di houcaedje RPC"
#: web/ejabberd_web_admin.erl:2000
msgid "Database Tables at "
msgstr "Tåves del båze di dnêyes so "
#: web/ejabberd_web_admin.erl:2007
msgid "Storage Type"
msgstr "Sôre di wårdaedje"
#: web/ejabberd_web_admin.erl:2008
msgid "Elements"
msgstr ""
#: web/ejabberd_web_admin.erl:2009
msgid "Memory"
msgstr "Memwere"
#: web/ejabberd_web_admin.erl:2032 web/ejabberd_web_admin.erl:2137
msgid "Error"
msgstr ""
#: web/ejabberd_web_admin.erl:2034
msgid "Backup of "
msgstr "Copeye di såvrité po "
#: web/ejabberd_web_admin.erl:2036
#, fuzzy
msgid ""
"Please note that these options will only backup the builtin Mnesia database. "
"If you are using the ODBC module, you also need to backup your SQL database "
"separately."
msgstr ""
"Notez ki ces tchuzes la vont seulmint fé ene copeye di såvrité del båze di "
"dnêyes Mnesia costrûte å dvins do programe. Si vos eployîz ene difoûtrinne "
"båze di dnêyes avou l' module ODBC, vos dvoz fé ene copeye di såvrité del "
"båze SQL da vosse sepårumint."
#: web/ejabberd_web_admin.erl:2041
msgid "Store binary backup:"
msgstr "Copeye di såvrité binaire:"
#: web/ejabberd_web_admin.erl:2045 web/ejabberd_web_admin.erl:2052
#: web/ejabberd_web_admin.erl:2060 web/ejabberd_web_admin.erl:2067
#: web/ejabberd_web_admin.erl:2074 web/ejabberd_web_admin.erl:2081
#: web/ejabberd_web_admin.erl:2088 web/ejabberd_web_admin.erl:2096
#: web/ejabberd_web_admin.erl:2103 web/ejabberd_web_admin.erl:2110
msgid "OK"
msgstr "'l est bon"
#: web/ejabberd_web_admin.erl:2048
msgid "Restore binary backup immediately:"
msgstr "Rapexhî do côp foû d' ene copeye di såvrité binaire:"
#: web/ejabberd_web_admin.erl:2056
msgid ""
"Restore binary backup after next ejabberd restart (requires less memory):"
msgstr ""
"Rapexhî l' copeye di såvrité binaire après l' renondaedje ki vént "
"d' ejabberd (çoula prind moens d' memwere del fé insi):"
#: web/ejabberd_web_admin.erl:2063
msgid "Store plain text backup:"
msgstr "Copeye di såvrité tecse:"
#: web/ejabberd_web_admin.erl:2070
msgid "Restore plain text backup immediately:"
msgstr "Rapexhî do côp foû d' ene copeye di såvrité tecse:"
#: web/ejabberd_web_admin.erl:2077
msgid "Import users data from a PIEFXIS file (XEP-0227):"
msgstr ""
#: web/ejabberd_web_admin.erl:2084
msgid "Export data of all users in the server to PIEFXIS files (XEP-0227):"
msgstr ""
#: web/ejabberd_web_admin.erl:2091
msgid "Export data of users in a host to PIEFXIS files (XEP-0227):"
msgstr ""
#: web/ejabberd_web_admin.erl:2099
#, fuzzy
msgid "Import user data from jabberd14 spool file:"
msgstr "Sititchî des uzeus Jabberd 1.4"
#: web/ejabberd_web_admin.erl:2106
#, fuzzy
msgid "Import users data from jabberd14 spool directory:"
msgstr "Sititchî des uzeus Jabberd 1.4"
#: web/ejabberd_web_admin.erl:2132
msgid "Listened Ports at "
msgstr "Pôrts drovous so "
#: web/ejabberd_web_admin.erl:2157
msgid "Modules at "
msgstr "Modules so "
#: web/ejabberd_web_admin.erl:2183
msgid "Statistics of ~p"
msgstr "Sitatistikes di ~p"
#: web/ejabberd_web_admin.erl:2186
msgid "Uptime:"
msgstr "Tins dispoy l' enondaedje:"
#: web/ejabberd_web_admin.erl:2189
msgid "CPU Time:"
msgstr "Tins CPU:"
#: web/ejabberd_web_admin.erl:2195
msgid "Transactions Committed:"
msgstr "Transaccions evoyeyes:"
#: web/ejabberd_web_admin.erl:2198
msgid "Transactions Aborted:"
msgstr "Transaccions arestêyes:"
#: web/ejabberd_web_admin.erl:2201
msgid "Transactions Restarted:"
msgstr "Transaccions renondêyes:"
#: web/ejabberd_web_admin.erl:2204
msgid "Transactions Logged:"
msgstr "Transaccions wårdêyes e djournå:"
#: web/ejabberd_web_admin.erl:2246
msgid "Update "
msgstr "Metaedje a djoû "
#: web/ejabberd_web_admin.erl:2254
msgid "Update plan"
msgstr "Plan d' metaedje a djoû"
#: web/ejabberd_web_admin.erl:2255
#, fuzzy
msgid "Modified modules"
msgstr "Modules metous a djoû"
#: web/ejabberd_web_admin.erl:2256
msgid "Update script"
msgstr "Sicripe di metaedje a djoû"
#: web/ejabberd_web_admin.erl:2257
msgid "Low level update script"
msgstr "Sicripe di metaedje a djoû d' bas livea"
#: web/ejabberd_web_admin.erl:2258
msgid "Script check"
msgstr "Acertinaedje do scripe"
#: web/ejabberd_web_admin.erl:2426
msgid "Port"
msgstr "Pôrt"
#: web/ejabberd_web_admin.erl:2427
msgid "IP"
msgstr ""
#: web/ejabberd_web_admin.erl:2428
#, fuzzy
msgid "Protocol"
msgstr "Pôrt"
#: web/ejabberd_web_admin.erl:2429 web/ejabberd_web_admin.erl:2556
msgid "Module"
msgstr "Module"
#: web/ejabberd_web_admin.erl:2430 web/ejabberd_web_admin.erl:2557
msgid "Options"
msgstr "Tchuzes"
#: web/ejabberd_web_admin.erl:2450
msgid "Delete"
msgstr "Disfacer"
#: web/ejabberd_web_admin.erl:2579
msgid "Start"
msgstr "Enonder"
#: web/mod_register_web.erl:104
msgid "Your Jabber account was successfully created."
msgstr ""
#: web/mod_register_web.erl:107
msgid "There was an error creating the account: "
msgstr ""
#: web/mod_register_web.erl:115
msgid "Your Jabber account was successfully deleted."
msgstr ""
#: web/mod_register_web.erl:118
msgid "There was an error deleting the account: "
msgstr ""
#: web/mod_register_web.erl:128
msgid "The password of your Jabber account was successfully changed."
msgstr ""
#: web/mod_register_web.erl:131
msgid "There was an error changing the password: "
msgstr ""
#: web/mod_register_web.erl:163 web/mod_register_web.erl:172
msgid "Jabber Account Registration"
msgstr ""
#: web/mod_register_web.erl:174 web/mod_register_web.erl:192
#: web/mod_register_web.erl:201
msgid "Register a Jabber account"
msgstr ""
#: web/mod_register_web.erl:176 web/mod_register_web.erl:493
#: web/mod_register_web.erl:502
msgid "Unregister a Jabber account"
msgstr ""
#: web/mod_register_web.erl:203
msgid ""
"This page allows to create a Jabber account in this Jabber server. Your JID "
"(Jabber IDentifier) will be of the form: username@server. Please read "
"carefully the instructions to fill correctly the fields."
msgstr ""
#: web/mod_register_web.erl:212 web/mod_register_web.erl:386
#: web/mod_register_web.erl:509
#, fuzzy
msgid "Username:"
msgstr "No d' uzeu IRC"
#: web/mod_register_web.erl:217
msgid "This is case insensitive: macbeth is the same that MacBeth and Macbeth."
msgstr ""
#: web/mod_register_web.erl:218
msgid "Characters not allowed:"
msgstr ""
#: web/mod_register_web.erl:222 web/mod_register_web.erl:391
#: web/mod_register_web.erl:514
#, fuzzy
msgid "Server:"
msgstr "Måy"
#: web/mod_register_web.erl:232
msgid ""
"Don't tell your password to anybody, not even the administrators of the "
"Jabber server."
msgstr ""
#: web/mod_register_web.erl:234
msgid "You can later change your password using a Jabber client."
msgstr ""
#: web/mod_register_web.erl:235
msgid ""
"Some Jabber clients can store your password in your computer. Use that "
"feature only if you trust your computer is safe."
msgstr ""
#: web/mod_register_web.erl:237
msgid ""
"Memorize your password, or write it in a paper placed in a safe place. In "
"Jabber there isn't an automated way to recover your password if you forget "
"it."
msgstr ""
#: web/mod_register_web.erl:242 web/mod_register_web.erl:406
#, fuzzy
msgid "Password Verification:"
msgstr "Acertinaedje do scret"
#: web/mod_register_web.erl:250
#, fuzzy
msgid "Register"
msgstr "Djivêye des soçons"
#: web/mod_register_web.erl:396
#, fuzzy
msgid "Old Password:"
msgstr "Sicret:"
#: web/mod_register_web.erl:401
#, fuzzy
msgid "New Password:"
msgstr "Sicret:"
#: web/mod_register_web.erl:504
msgid "This page allows to unregister a Jabber account in this Jabber server."
msgstr ""
#: web/mod_register_web.erl:524
msgid "Unregister"
msgstr ""
#~ msgid "Encodings"
#~ msgstr "Ecôdaedjes"
#~ msgid "(Raw)"
#~ msgstr "(Dinêyes brutes)"
#~ msgid "Specified nickname is already registered"
#~ msgstr "Li no metou dné est ddja edjîstré"
#~ msgid "Size"
#~ msgstr "Grandeu"
ejabberd-2.1.11/src/msgs/es.msg 0000664 0000000 0000000 00000067355 12240230175 013115 0 ustar {"Access Configuration","Configuración de accesos"}.
{"Access Control List Configuration","Configuración de la Lista de Control de Acceso"}.
{"Access control lists","Listas de Control de Acceso"}.
{"Access Control Lists","Listas de Control de Acceso"}.
{"Access denied by service policy","Acceso denegado por la política del servicio"}.
{"Access rules","Reglas de acceso"}.
{"Access Rules","Reglas de Acceso"}.
{"Action on user","Acción en el usuario"}.
{"Add Jabber ID","Añadir Jabber ID"}.
{"Add New","Añadir nuevo"}.
{"Add User","Añadir usuario"}.
{"Administration","Administración"}.
{"Administration of ","Administración de "}.
{"Administrator privileges required","Se necesita privilegios de administrador"}.
{"A friendly name for the node","Un nombre sencillo para el nodo"}.
{"All activity","Toda la actividad"}.
{"Allow this Jabber ID to subscribe to this pubsub node?","¿Deseas permitir a este Jabber ID que se subscriba a este nodo PubSub?"}.
{"Allow users to change the subject","Permitir a los usuarios cambiar el asunto"}.
{"Allow users to query other users","Permitir a los usuarios consultar a otros usuarios"}.
{"Allow users to send invites","Permitir a los usuarios enviar invitaciones"}.
{"Allow users to send private messages","Permitir a los usuarios enviar mensajes privados"}.
{"Allow visitors to change nickname","Permitir a los visitantes cambiarse el apodo"}.
{"Allow visitors to send private messages to","Permitir a los visitantes enviar mensajes privados a"}.
{"Allow visitors to send status text in presence updates","Permitir a los visitantes enviar texto de estado en las actualizaciones de presencia"}.
{"Allow visitors to send voice requests","Permitir a los visitantes enviar peticiones de voz"}.
{"All Users","Todos los usuarios"}.
{"Announcements","Anuncios"}.
{"anyone","cualquiera"}.
{"A password is required to enter this room","Se necesita contraseña para entrar en esta sala"}.
{"April","abril"}.
{"August","agosto"}.
{"Backup","Guardar copia de seguridad"}.
{"Backup Management","Gestión de copia de seguridad"}.
{"Backup of ","Copia de seguridad de "}.
{"Backup to File at ","Guardar copia de seguridad en fichero en "}.
{"Bad format","Mal formato"}.
{"Birthday","Cumpleaños"}.
{"CAPTCHA web page","Página web de CAPTCHA"}.
{"Change Password","Cambiar contraseña"}.
{"Change User Password","Cambiar contraseña de usuario"}.
{"Characters not allowed:","Caracteres no permitidos:"}.
{"Chatroom configuration modified","Configuración de la sala modificada"}.
{"Chatroom is created","Se ha creado la sala"}.
{"Chatroom is destroyed","Se ha destruido la sala"}.
{"Chatroom is started","Se ha iniciado la sala"}.
{"Chatroom is stopped","Se ha detenido la sala"}.
{"Chatrooms","Salas de charla"}.
{"Choose a username and password to register with this server","Escoge un nombre de usuario y contraseña para registrarte en este servidor"}.
{"Choose modules to stop","Selecciona módulos a detener"}.
{"Choose storage type of tables","Selecciona tipo de almacenamiento de las tablas"}.
{"Choose whether to approve this entity's subscription.","Decidir si aprobar la subscripción de esta entidad."}.
{"City","Ciudad"}.
{"Commands","Comandos"}.
{"Conference room does not exist","La sala de conferencias no existe"}.
{"Configuration","Configuración"}.
{"Configuration of room ~s","Configuración para la sala ~s"}.
{"Connected Resources:","Recursos conectados:"}.
{"Connections parameters","Parámetros de conexiones"}.
{"Country","País"}.
{"CPU Time:","Tiempo consumido de CPU:"}.
{"Database","Base de datos"}.
{"Database Tables at ","Tablas de la base de datos en "}.
{"Database Tables Configuration at ","Configuración de tablas de la base de datos en "}.
{"December","diciembre"}.
{"Default users as participants","Los usuarios son participantes por defecto"}.
{"Delete","Eliminar"}.
{"Delete message of the day","Borrar mensaje del dia"}.
{"Delete message of the day on all hosts","Borrar el mensaje del día en todos los dominios"}.
{"Delete Selected","Eliminar los seleccionados"}.
{"Delete User","Borrar usuario"}.
{"Deliver event notifications","Entregar notificaciones de eventos"}.
{"Deliver payloads with event notifications","Enviar contenidos junto con las notificaciones de eventos"}.
{"Description:","Descripción:"}.
{"Disc only copy","Copia en disco solamente"}.
{"Displayed Groups:","Mostrar grupos:"}.
{"Don't tell your password to anybody, not even the administrators of the Jabber server.","No le digas tu contraseña a nadie, ni siquiera a los administradores del servidor Jabber."}.
{"Dump Backup to Text File at ","Exporta copia de seguridad a fichero de texto en "}.
{"Dump to Text File","Exportar a fichero de texto"}.
{"Edit Properties","Editar propiedades"}.
{"Either approve or decline the voice request.","Aprueba o rechaza la petición de voz."}.
{"ejabberd IRC module","Módulo de IRC para ejabberd"}.
{"ejabberd MUC module","Módulo de MUC para ejabberd"}.
{"ejabberd Publish-Subscribe module","Módulo de Publicar-Subscribir de ejabberd"}.
{"ejabberd SOCKS5 Bytestreams module","Módulo SOCKS5 Bytestreams para ejabberd"}.
{"ejabberd vCard module","Módulo vCard para ejabberd"}.
{"ejabberd Web Admin","ejabberd Web Admin"}.
{"Elements","Elementos"}.
{"Email","correo"}.
{"Enable logging","Guardar históricos"}.
{"Encoding for server ~b","Codificación del servidor ~b"}.
{"End User Session","Cerrar sesión de usuario"}.
{"Enter list of {Module, [Options]}","Introduce lista de {módulo, [opciones]}"}.
{"Enter nickname you want to register","Introduce el apodo que quieras registrar"}.
{"Enter path to backup file","Introduce ruta al fichero de copia de seguridad"}.
{"Enter path to jabberd14 spool dir","Introduce la ruta al directorio de jabberd14 spools"}.
{"Enter path to jabberd14 spool file","Introduce ruta al fichero jabberd14 spool"}.
{"Enter path to text file","Introduce ruta al fichero de texto"}.
{"Enter the text you see","Teclea el texto que ves"}.
{"Enter username and encodings you wish to use for connecting to IRC servers. Press 'Next' to get more fields to fill in. Press 'Complete' to save settings.","Introduce el nombre de usuario y codificaciones de carácteres que quieras usar al conectar en los servidores de IRC. Pulsa Siguiente para conseguir más campos en el formulario. Pulsa Completar para guardar las opciones."}.
{"Enter username, encodings, ports and passwords you wish to use for connecting to IRC servers","Introduce el nombre de usuario, codificaciones de carácteres, puertos y contraseñas que quieras usar al conectar en los servidores de IRC"}.
{"Erlang Jabber Server","Servidor Jabber en Erlang"}.
{"Error","Error"}.
{"Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef.net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}].","Ejemplo: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef.net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."}.
{"Exclude Jabber IDs from CAPTCHA challenge","Excluir Jabber IDs de las pruebas de CAPTCHA"}.
{"Export data of all users in the server to PIEFXIS files (XEP-0227):","Exportar datos de todos los usuarios del servidor a ficheros PIEFXIS (XEP-0227):"}.
{"Export data of users in a host to PIEFXIS files (XEP-0227):","Exportar datos de los usuarios de un dominio a ficheros PIEFXIS (XEP-0227):"}.
{"Failed to extract JID from your voice request approval","Fallo al extraer el Jabber ID de tu aprobación de petición de voz"}.
{"Family Name","Apellido"}.
{"February","febrero"}.
{"Fill in fields to search for any matching Jabber User","Rellena campos para buscar usuarios Jabber que concuerden"}.
{"Fill in the form to search for any matching Jabber User (Add * to the end of field to match substring)","Rellena el formulario para buscar usuarios Jabber. Añade * al final de un campo para buscar subcadenas."}.
{"Friday","viernes"}.
{"From","De"}.
{"From ~s","De ~s"}.
{"Full Name","Nombre completo"}.
{"Get Number of Online Users","Ver número de usuarios conectados"}.
{"Get Number of Registered Users","Ver número de usuarios registrados"}.
{"Get User Last Login Time","Ver fecha de la última conexión de usuario"}.
{"Get User Password","Ver contraseña de usuario"}.
{"Get User Statistics","Ver estadísticas de usuario"}.
{"Grant voice to this person?","¿Conceder voz a esta persona?"}.
{"Group ","Grupo "}.
{"Groups","Grupos"}.
{"has been banned","ha sido bloqueado"}.
{"has been kicked because of an affiliation change","ha sido expulsado por un cambio de su afiliación"}.
{"has been kicked because of a system shutdown","ha sido expulsado porque el sistema se va a detener"}.
{"has been kicked because the room has been changed to members-only","ha sido expulsado porque la sala es ahora solo para miembros"}.
{"has been kicked","ha sido expulsado"}.
{" has set the subject to: "," ha puesto el asunto: "}.
{"Host","Dominio"}.
{"If you don't see the CAPTCHA image here, visit the web page.","Si no ves la imagen CAPTCHA aquí, visita la página web."}.
{"If you want to specify different ports, passwords, encodings for IRC servers, fill this list with values in format '{\"irc server\", \"encoding\", port, \"password\"}'. By default this service use \"~s\" encoding, port ~p, empty password.","Si quieres especificar distintos codificaciones de carácteres, contraseñas o puertos para cada servidor IRC rellena esta lista con valores en el formato '{\"servidor irc\", \"codificación\", \"puerto\", \"contrasela\"}'. Este servicio usa por defecto la codificación \"~s\", puerto ~p, sin contraseña."}.
{"Import Directory","Importar directorio"}.
{"Import File","Importar fichero"}.
{"Import user data from jabberd14 spool file:","Importar usuario de fichero spool de jabberd14:"}.
{"Import User from File at ","Importa usuario desde fichero en "}.
{"Import users data from a PIEFXIS file (XEP-0227):","Importar usuarios desde un fichero PIEFXIS (XEP-0227):"}.
{"Import users data from jabberd14 spool directory:","Importar usuarios del directorio spool de jabberd14:"}.
{"Import Users from Dir at ","Importar usuarios desde el directorio en "}.
{"Import Users From jabberd14 Spool Files","Importar usuarios de ficheros spool de jabberd-1.4"}.
{"Improper message type","Tipo de mensaje incorrecto"}.
{"Incorrect password","Contraseña incorrecta"}.
{"Invalid affiliation: ~s","Afiliación no válida: ~s"}.
{"Invalid role: ~s","Rol no válido: ~s"}.
{"IP addresses","Direcciones IP"}.
{"IP","IP"}.
{"IRC channel (don't put the first #)","Canal IRC (no pongas el # del principio)"}.
{"IRC server","Servidor IRC"}.
{"IRC settings","Opciones de IRC"}.
{"IRC Transport","Transporte de IRC"}.
{"IRC username","Nombre de usuario en IRC"}.
{"IRC Username","Nombre de usuario en IRC"}.
{"is now known as","se cambia el nombre a"}.
{"It is not allowed to send private messages","No está permitido enviar mensajes privados"}.
{"It is not allowed to send private messages of type \"groupchat\"","No está permitido enviar mensajes privados del tipo \"groupchat\""}.
{"It is not allowed to send private messages to the conference","Impedir el envio de mensajes privados a la sala"}.
{"Jabber Account Registration","Registro de Cuenta Jabber"}.
{"Jabber ID","Jabber ID"}.
{"Jabber ID ~s is invalid","El Jabber ID ~s no es válido"}.
{"January","enero"}.
{"Join IRC channel","Entrar en canal IRC"}.
{"joins the room","entra en la sala"}.
{"Join the IRC channel here.","Entrar en el canal de IRC aquí"}.
{"Join the IRC channel in this Jabber ID: ~s","Entra en el canal de IRC en esta dirección Jabber: ~s"}.
{"July","julio"}.
{"June","junio"}.
{"Last Activity","Última actividad"}.
{"Last login","Última conexión"}.
{"Last month","Último mes"}.
{"Last year","Último año"}.
{"leaves the room","sale de la sala"}.
{"Listened Ports at ","Puertos de escucha en "}.
{"Listened Ports","Puertos de escucha"}.
{"List of modules to start","Lista de módulos a iniciar"}.
{"Low level update script","Script de actualización a bajo nivel"}.
{"Make participants list public","La lista de participantes es pública"}.
{"Make room CAPTCHA protected","Proteger la sala con CAPTCHA"}.
{"Make room members-only","Sala sólo para miembros"}.
{"Make room moderated","Sala moderada"}.
{"Make room password protected","Proteger la sala con contraseña"}.
{"Make room persistent","Sala permanente"}.
{"Make room public searchable","Sala públicamente visible"}.
{"March","marzo"}.
{"Maximum Number of Occupants","Número máximo de ocupantes"}.
{"Max # of items to persist","Máximo # de elementos que persisten"}.
{"Max payload size in bytes","Máximo tamaño del contenido en bytes"}.
{"May","mayo"}.
{"Membership is required to enter this room","Necesitas ser miembro de esta sala para poder entrar"}.
{"Members:","Miembros:"}.
{"Memorize your password, or write it in a paper placed in a safe place. In Jabber there isn't an automated way to recover your password if you forget it.","Memoriza tu contraseña, o apúntala en un papel en un lugar seguro. En Jabber no hay un método automatizado para recuperar la contraseña si la olvidas."}.
{"Memory","Memoria"}.
{"Message body","Cuerpo del mensaje"}.
{"Middle Name","Segundo nombre"}.
{"Minimum interval between voice requests (in seconds)","Intervalo mínimo entre peticiones de voz (en segundos)"}.
{"Moderator privileges required","Se necesita privilegios de moderador"}.
{"moderators only","solo moderadores"}.
{"Modified modules","Módulos modificados"}.
{"Module","Módulo"}.
{"Modules at ","Módulos en "}.
{"Modules","Módulos"}.
{"Monday","lunes"}.
{"Name:","Nombre:"}.
{"Name","Nombre"}.
{"Never","Nunca"}.
{"New Password:","Nueva contraseña:"}.
{"Nickname","Apodo"}.
{"Nickname Registration at ","Registro del apodo en "}.
{"Nickname ~s does not exist in the room","El apodo ~s no existe en la sala"}.
{"nobody","nadie"}.
{"No body provided for announce message","No se ha proporcionado cuerpo de mensaje para el anuncio"}.
{"No Data","Sin datos"}.
{"Node ID","Nodo ID"}.
{"Node ","Nodo "}.
{"Node not found","Nodo no encontrado"}.
{"Nodes","Nodos"}.
{"No limit","Sin límite"}.
{"None","Ninguno"}.
{"No resource provided","No se ha proporcionado recurso"}.
{"Not Found","No encontrado"}.
{"Notify subscribers when items are removed from the node","Notificar subscriptores cuando los elementos se borran del nodo"}.
{"Notify subscribers when the node configuration changes","Notificar subscriptores cuando cambia la configuración del nodo"}.
{"Notify subscribers when the node is deleted","Notificar subscriptores cuando el nodo se borra"}.
{"November","noviembre"}.
{"Number of occupants","Número de ocupantes"}.
{"Number of online users","Número de usuarios conectados"}.
{"Number of registered users","Número de usuarios registrados"}.
{"October","octubre"}.
{"Offline Messages:","Mensajes diferidos:"}.
{"Offline Messages","Mensajes diferidos"}.
{"OK","Aceptar"}.
{"Old Password:","Contraseña antigua:"}.
{"Online","Conectado"}.
{"Online Users:","Usuarios conectados:"}.
{"Online Users","Usuarios conectados"}.
{"Only deliver notifications to available users","Solo enviar notificaciones a los usuarios disponibles"}.
{"Only moderators and participants are allowed to change the subject in this room","Solo los moderadores y participantes pueden cambiar el asunto de esta sala"}.
{"Only moderators are allowed to change the subject in this room","Solo los moderadores pueden cambiar el asunto de esta sala"}.
{"Only moderators can approve voice requests","Solo los moderadores pueden aprobar peticiones de voz"}.
{"Only occupants are allowed to send messages to the conference","Solo los ocupantes pueden enviar mensajes a la sala"}.
{"Only occupants are allowed to send queries to the conference","Solo los ocupantes pueden enviar solicitudes a la sala"}.
{"Only service administrators are allowed to send service messages","Solo los administradores del servicio tienen permiso para enviar mensajes de servicio"}.
{"Options","Opciones"}.
{"Organization Name","Nombre de la organización"}.
{"Organization Unit","Unidad de la organización"}.
{"Outgoing s2s Connections:","Conexiones S2S salientes:"}.
{"Outgoing s2s Connections","Conexiones S2S salientes"}.
{"Outgoing s2s Servers:","Servidores S2S salientes:"}.
{"Owner privileges required","Se requieren privilegios de propietario de la sala"}.
{"Packet","Paquete"}.
{"Password ~b","Contraseña ~b"}.
{"Password:","Contraseña:"}.
{"Password","Contraseña"}.
{"Password Verification:","Verificación de la contraseña:"}.
{"Password Verification","Verificación de la contraseña"}.
{"Path to Dir","Ruta al directorio"}.
{"Path to File","Ruta al fichero"}.
{"Pending","Pendiente"}.
{"Period: ","Periodo: "}.
{"Persist items to storage","Persistir elementos al almacenar"}.
{"Ping","Ping"}.
{"Please note that these options will only backup the builtin Mnesia database. If you are using the ODBC module, you also need to backup your SQL database separately.","Ten en cuenta que estas opciones solo harán copia de seguridad de la base de datos Mnesia embebida. Si estás usando ODBC tendrás que hacer también copia de seguridad de tu base de datos SQL."}.
{"Please, wait for a while before sending new voice request","Por favor, espera un poco antes de enviar otra petición de voz"}.
{"Pong","Pong"}.
{"Port ~b","Puerto ~b"}.
{"Port","Puerto"}.
{"Present real Jabber IDs to","Los Jabber ID reales pueden verlos"}.
{"private, ","privado"}.
{"Protocol","Protocolo"}.
{"Publish-Subscribe","Servicio de Publicar-Subscribir"}.
{"PubSub subscriber request","Petición de subscriptor de PubSub"}.
{"Purge all items when the relevant publisher goes offline","Borra todos los elementos cuando el publicador relevante se desconecta"}.
{"Queries to the conference members are not allowed in this room","En esta sala no se permiten solicitudes a los miembros de la sala"}.
{"RAM and disc copy","Copia en RAM y disco"}.
{"RAM copy","Copia en RAM"}.
{"Raw","Crudo"}.
{"Really delete message of the day?","¿Está seguro de quere borrar el mensaje del dia?"}.
{"Recipient is not in the conference room","El receptor no está en la sala de conferencia"}.
{"Register a Jabber account","Registrar una cuenta Jabber"}.
{"Registered Users:","Usuarios registrados:"}.
{"Registered Users","Usuarios registrados"}.
{"Register","Registrar"}.
{"Registration in mod_irc for ","Registro en mod_irc para"}.
{"Remote copy","Copia remota"}.
{"Remove All Offline Messages","Borrar todos los mensajes diferidos"}.
{"Remove","Borrar"}.
{"Remove User","Eliminar usuario"}.
{"Replaced by new connection","Reemplazado por una nueva conexión"}.
{"Resources","Recursos"}.
{"Restart","Reiniciar"}.
{"Restart Service","Reiniciar el servicio"}.
{"Restore Backup from File at ","Restaura copia de seguridad desde el fichero en "}.
{"Restore binary backup after next ejabberd restart (requires less memory):","Restaurar copia de seguridad binaria en el siguiente reinicio de ejabberd (requiere menos memoria que si instantánea):"}.
{"Restore binary backup immediately:","Restaurar inmediatamente copia de seguridad binaria:"}.
{"Restore plain text backup immediately:","Restaurar copias de seguridad de texto plano inmediatamente:"}.
{"Restore","Restaurar"}.
{"Room Configuration","Configuración de la sala"}.
{"Room creation is denied by service policy","Se te ha denegado crear la sala por política del servicio"}.
{"Room description","Descripción de la sala"}.
{"Room Occupants","Ocupantes de la sala"}.
{"Room title","Título de la sala"}.
{"Roster groups allowed to subscribe","Grupos de contactos que pueden suscribirse"}.
{"Roster","Lista de contactos"}.
{"Roster of ","Lista de contactos de "}.
{"Roster size","Tamaño de la lista de contactos"}.
{"RPC Call Error","Error en la llamada RPC"}.
{"Running Nodes","Nodos funcionando"}.
{"~s access rule configuration","Configuración de las Regla de Acceso ~s"}.
{"Saturday","sábado"}.
{"Script check","Comprobación de script"}.
{"Search Results for ","Buscar resultados por "}.
{"Search users in ","Buscar usuarios en "}.
{"Send announcement to all online users","Enviar anuncio a todos los usuarios conectados"}.
{"Send announcement to all online users on all hosts","Enviar anuncio a todos los usuarios conectados en todos los dominios"}.
{"Send announcement to all users","Enviar anuncio a todos los usuarios"}.
{"Send announcement to all users on all hosts","Enviar anuncio a todos los usuarios en todos los dominios"}.
{"September","septiembre"}.
{"Server ~b","Servidor ~b"}.
{"Server:","Servidor:"}.
{"Set message of the day and send to online users","Poner mensaje del dia y enviar a todos los usuarios conectados"}.
{"Set message of the day on all hosts and send to online users","Poner mensaje del día en todos los dominios y enviar a los usuarios conectados"}.
{"Shared Roster Groups","Grupos Compartidos"}.
{"Show Integral Table","Mostrar Tabla Integral"}.
{"Show Ordinary Table","Mostrar Tabla Ordinaria"}.
{"Shut Down Service","Detener el servicio"}.
{"~s invites you to the room ~s","~s te invita a la sala ~s"}.
{"Some Jabber clients can store your password in your computer. Use that feature only if you trust your computer is safe.","Algunos clientes Jabber pueden recordar tu contraseña en la máquina. Usa esa opción solo si confías en que la máquina que usas es segura."}.
{"Specify the access model","Especifica el modelo de acceso"}.
{"Specify the event message type","Especifica el tipo del mensaje de evento"}.
{"Specify the publisher model","Especificar el modelo del publicante"}.
{"~s's Offline Messages Queue","Cola de mensajes diferidos de ~s"}.
{"Start","Iniciar"}.
{"Start Modules at ","Iniciar módulos en "}.
{"Start Modules","Iniciar módulos"}.
{"Statistics","Estadísticas"}.
{"Statistics of ~p","Estadísticas de ~p"}.
{"Stop","Detener"}.
{"Stop Modules at ","Detener módulos en "}.
{"Stop Modules","Detener módulos"}.
{"Stopped Nodes","Nodos detenidos"}.
{"Storage Type","Tipo de almacenamiento"}.
{"Store binary backup:","Guardar copia de seguridad binaria:"}.
{"Store plain text backup:","Guardar copia de seguridad en texto plano:"}.
{"Subject","Asunto"}.
{"Submit","Enviar"}.
{"Submitted","Enviado"}.
{"Subscriber Address","Dirección del subscriptor"}.
{"Subscription","Subscripción"}.
{"Sunday","domingo"}.
{"That nickname is already in use by another occupant","Ese apodo ya está siendo usado por otro ocupante"}.
{"That nickname is registered by another person","El apodo ya está registrado por otra persona"}.
{"The CAPTCHA is valid.","El CAPTCHA es válido."}.
{"The CAPTCHA verification has failed","La verificación de CAPTCHA ha fallado"}.
{"The collections with which a node is affiliated","Las colecciones a las que un nodo está afiliado"}.
{"the password is","la contraseña es"}.
{"The password is too weak","La contraseña es demasiado débil"}.
{"The password of your Jabber account was successfully changed.","La contraseña de tu cuenta Jabber se ha cambiado correctamente."}.
{"There was an error changing the password: ","Hubo un error cambiando la contraseña."}.
{"There was an error creating the account: ","Hubo uno error al crear la cuenta:"}.
{"There was an error deleting the account: ","Hubo un error borrando la cuenta."}.
{"This is case insensitive: macbeth is the same that MacBeth and Macbeth.","No importa si usas mayúsculas: macbeth es lo mismo que MacBeth y Macbeth."}.
{"This page allows to create a Jabber account in this Jabber server. Your JID (Jabber IDentifier) will be of the form: username@server. Please read carefully the instructions to fill correctly the fields.","Esta página te permite crear una cuenta Jabber este servidor Jabber. Tu JID (Jabber IDentificador) será de la forma: nombredeusuario@servidor. Por favor lee detenidamente las instrucciones para rellenar correctamente los campos."}.
{"This page allows to unregister a Jabber account in this Jabber server.","Esta página te permite borrar tu cuenta Jabber en este servidor Jabber."}.
{"This participant is kicked from the room because he sent an error message","Este participante ha sido expulsado de la sala porque envió un mensaje de error"}.
{"This participant is kicked from the room because he sent an error message to another participant","Este participante ha sido expulsado de la sala porque envió un mensaje de error a otro participante"}.
{"This participant is kicked from the room because he sent an error presence","Este participante ha sido expulsado de la sala porque envió una presencia de error"}.
{"This room is not anonymous","Sala no anónima"}.
{"Thursday","jueves"}.
{"Time delay","Retraso temporal"}.
{"Time","Fecha"}.
{"Too many CAPTCHA requests","Demasiadas peticiones de CAPTCHA"}.
{"To","Para"}.
{"To ~s","A ~s"}.
{"Traffic rate limit is exceeded","Se ha exedido el límite de tráfico"}.
{"Transactions Aborted:","Transacciones abortadas:"}.
{"Transactions Committed:","Transacciones finalizadas:"}.
{"Transactions Logged:","Transacciones registradas:"}.
{"Transactions Restarted:","Transacciones reiniciadas:"}.
{"Tuesday","martes"}.
{"Unable to generate a CAPTCHA","No se pudo generar un CAPTCHA"}.
{"Unauthorized","No autorizado"}.
{"Unregister a Jabber account","Borrar una cuenta Jabber"}.
{"Unregister","Borrar"}.
{"Update ","Actualizar "}.
{"Update","Actualizar"}.
{"Update message of the day (don't send)","Actualizar mensaje del dia, pero no enviarlo"}.
{"Update message of the day on all hosts (don't send)","Actualizar el mensaje del día en todos los dominos (pero no enviarlo)"}.
{"Update plan","Plan de actualización"}.
{"Update script","Script de actualización"}.
{"Uptime:","Tiempo desde el inicio:"}.
{"Use of STARTTLS required","Es obligatorio usar STARTTLS"}.
{"User JID","Jabber ID del usuario"}.
{"User Management","Administración de usuarios"}.
{"Username:","Nombre de usuario:"}.
{"Users are not allowed to register accounts so quickly","Los usuarios no tienen permitido crear cuentas con tanta rapidez"}.
{"Users Last Activity","Última actividad de los usuarios"}.
{"Users","Usuarios"}.
{"User ","Usuario "}.
{"User","Usuario"}.
{"Validate","Validar"}.
{"vCard User Search","Buscar vCard de usuario"}.
{"Virtual Hosts","Dominios Virtuales"}.
{"Visitors are not allowed to change their nicknames in this room","Los visitantes no tienen permitido cambiar sus apodos en esta sala"}.
{"Visitors are not allowed to send messages to all occupants","Los visitantes no pueden enviar mensajes a todos los ocupantes"}.
{"Voice request","Petición de voz"}.
{"Voice requests are disabled in this conference","Las peticiones de voz están desactivadas en esta sala"}.
{"Wednesday","miércoles"}.
{"When to send the last published item","Cuando enviar el último elemento publicado"}.
{"Whether to allow subscriptions","Permitir subscripciones"}.
{"You can later change your password using a Jabber client.","Puedes cambiar tu contraseña después, usando un cliente Jabber."}.
{"You have been banned from this room","Has sido bloqueado en esta sala"}.
{"You must fill in field \"Nickname\" in the form","Debes rellenar el campo \"Apodo\" en el formulario"}.
{"You need a client that supports x:data and CAPTCHA to register","Necesitas un cliente con soporte de x:data y CAPTCHA para registrarte"}.
{"You need a client that supports x:data to register the nickname","Necesitas un cliente con soporte de x:data para poder registrar el apodo"}.
{"You need an x:data capable client to configure mod_irc settings","Necesitas un cliente con soporte de x:data para configurar las opciones de mod_irc"}.
{"You need an x:data capable client to configure room","Necesitas un cliente con soporte de x:data para configurar la sala"}.
{"You need an x:data capable client to search","Necesitas un cliente con soporte de x:data para poder buscar"}.
{"Your active privacy list has denied the routing of this stanza.","Tu lista de privacidad activa ha denegado el encío de este paquete."}.
{"Your contact offline message queue is full. The message has been discarded.","Tu cola de mensajes diferidos de contactos está llena. El mensaje se ha descartado."}.
{"Your Jabber account was successfully created.","Tu cuenta Jabber se ha creado correctamente."}.
{"Your Jabber account was successfully deleted.","Tu cuenta Jabber se ha borrado correctamente."}.
{"Your messages to ~s are being blocked. To unblock them, visit ~s","Tus mensajes a ~s están siendo bloqueados. Para desbloquearlos, visita ~s"}.
ejabberd-2.1.11/src/msgs/fr.po 0000664 0000000 0000000 00000157423 12240230175 012741 0 ustar msgid ""
msgstr ""
"Project-Id-Version: 2.1.0-alpha\n"
"POT-Creation-Date: \n"
"PO-Revision-Date: \n"
"Last-Translator: Nicolas Vérité \n"
"Language-Team: \n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Language: French (française)\n"
"X-Additional-Translator: Christophe Romain\n"
"X-Additional-Translator: Mickaël Rémond\n"
"X-Additional-Translator: Vincent Ricard\n"
#: ejabberd_c2s.erl:424 ejabberd_c2s.erl:727
msgid "Use of STARTTLS required"
msgstr "L'utilisation de STARTTLS est impérative"
#: ejabberd_c2s.erl:503
msgid "No resource provided"
msgstr "Aucune ressource fournie"
#: ejabberd_c2s.erl:1197
msgid "Replaced by new connection"
msgstr "Remplacé par une nouvelle connexion"
#: ejabberd_c2s.erl:1885
msgid "Your active privacy list has denied the routing of this stanza."
msgstr "Votre règle de flitrage active a empêché le routage de ce stanza."
#: ejabberd_captcha.erl:96 ejabberd_captcha.erl:152 ejabberd_captcha.erl:178
msgid "Enter the text you see"
msgstr "Tapez le texte que vous voyez"
#: ejabberd_captcha.erl:101
msgid "Your messages to ~s are being blocked. To unblock them, visit ~s"
msgstr ""
"Vos messages pour ~s sont bloqués. Pour les débloquer, veuillez visiter ~s"
#: ejabberd_captcha.erl:134
msgid "If you don't see the CAPTCHA image here, visit the web page."
msgstr "SI vous ne voyez pas l'image CAPTCHA ici, visitez la page web."
#: ejabberd_captcha.erl:146
msgid "CAPTCHA web page"
msgstr "Page web de CAPTCHA"
#: ejabberd_captcha.erl:307
msgid "The CAPTCHA is valid."
msgstr "Le CAPTCHA est valide"
#: mod_adhoc.erl:95 mod_adhoc.erl:125 mod_adhoc.erl:143 mod_adhoc.erl:161
msgid "Commands"
msgstr "Commandes"
#: mod_adhoc.erl:149 mod_adhoc.erl:243
msgid "Ping"
msgstr "Ping"
#: mod_adhoc.erl:260
msgid "Pong"
msgstr "Pong"
#: mod_announce.erl:507 mod_announce_odbc.erl:499
msgid "Really delete message of the day?"
msgstr "Confirmer la suppression du message du jour ?"
#: mod_announce.erl:515 mod_announce_odbc.erl:507 mod_configure.erl:1083
#: mod_configure.erl:1128
msgid "Subject"
msgstr "Sujet"
#: mod_announce.erl:520 mod_announce_odbc.erl:512 mod_configure.erl:1088
#: mod_configure.erl:1133
msgid "Message body"
msgstr "Corps du message"
#: mod_announce.erl:600 mod_announce_odbc.erl:592
msgid "No body provided for announce message"
msgstr "Pas de corps de message pour l'annonce"
#: mod_announce.erl:635 mod_announce_odbc.erl:627
msgid "Announcements"
msgstr "Annonces"
#: mod_announce.erl:637 mod_announce_odbc.erl:629
msgid "Send announcement to all users"
msgstr "Envoyer l'annonce à tous les utilisateurs"
#: mod_announce.erl:639 mod_announce_odbc.erl:631
msgid "Send announcement to all users on all hosts"
msgstr "Envoyer une annonce à tous les utilisateurs de tous les domaines"
#: mod_announce.erl:641 mod_announce_odbc.erl:633
msgid "Send announcement to all online users"
msgstr "Envoyer l'annonce à tous les utilisateurs en ligne"
#: mod_announce.erl:643 mod_announce_odbc.erl:635 mod_configure.erl:1078
#: mod_configure.erl:1123
msgid "Send announcement to all online users on all hosts"
msgstr ""
"Envoyer l'annonce à tous les utilisateurs en ligne sur tous les serveurs"
#: mod_announce.erl:645 mod_announce_odbc.erl:637
msgid "Set message of the day and send to online users"
msgstr "Définir le message du jour et l'envoyer aux utilisateurs en ligne"
#: mod_announce.erl:647 mod_announce_odbc.erl:639
msgid "Set message of the day on all hosts and send to online users"
msgstr ""
"Définir le message du jour pour tous domaines et l'envoyer aux utilisateurs "
"en ligne"
#: mod_announce.erl:649 mod_announce_odbc.erl:641
msgid "Update message of the day (don't send)"
msgstr "Mise à jour du message du jour (pas d'envoi)"
#: mod_announce.erl:651 mod_announce_odbc.erl:643
msgid "Update message of the day on all hosts (don't send)"
msgstr ""
"Mettre à jour le message du jour sur tous les domaines (ne pas envoyer)"
#: mod_announce.erl:653 mod_announce_odbc.erl:645
msgid "Delete message of the day"
msgstr "Supprimer le message du jour"
#: mod_announce.erl:655 mod_announce_odbc.erl:647
msgid "Delete message of the day on all hosts"
msgstr "Supprimer le message du jour sur tous les domaines"
#: mod_configure.erl:114 mod_configure.erl:274 mod_configure.erl:296
#: mod_configure.erl:498
msgid "Configuration"
msgstr "Configuration"
#: mod_configure.erl:125 mod_configure.erl:576 web/ejabberd_web_admin.erl:1936
msgid "Database"
msgstr "Base de données"
#: mod_configure.erl:127 mod_configure.erl:595
msgid "Start Modules"
msgstr "Modules de démarrage"
#: mod_configure.erl:129 mod_configure.erl:596
msgid "Stop Modules"
msgstr "Modules d'arrêt"
#: mod_configure.erl:131 mod_configure.erl:604 web/ejabberd_web_admin.erl:1937
msgid "Backup"
msgstr "Sauvegarde"
#: mod_configure.erl:133 mod_configure.erl:605
msgid "Restore"
msgstr "Restauration"
#: mod_configure.erl:135 mod_configure.erl:606
msgid "Dump to Text File"
msgstr "Sauvegarder dans un fichier texte"
#: mod_configure.erl:137 mod_configure.erl:615
msgid "Import File"
msgstr "Importer un fichier"
#: mod_configure.erl:139 mod_configure.erl:616
msgid "Import Directory"
msgstr "Importer une répertoire"
#: mod_configure.erl:141 mod_configure.erl:581 mod_configure.erl:1057
msgid "Restart Service"
msgstr "Redémarrer le service"
#: mod_configure.erl:143 mod_configure.erl:582 mod_configure.erl:1102
msgid "Shut Down Service"
msgstr "Arrêter le service"
#: mod_configure.erl:145 mod_configure.erl:518 mod_configure.erl:1197
#: web/ejabberd_web_admin.erl:1527
msgid "Add User"
msgstr "Ajouter un utilisateur"
#: mod_configure.erl:147 mod_configure.erl:519 mod_configure.erl:1219
msgid "Delete User"
msgstr "Supprimer l'utilisateur"
#: mod_configure.erl:149 mod_configure.erl:520 mod_configure.erl:1231
msgid "End User Session"
msgstr "Terminer la session de l'utilisateur"
#: mod_configure.erl:151 mod_configure.erl:521 mod_configure.erl:1243
#: mod_configure.erl:1255
msgid "Get User Password"
msgstr "Récupérer le mot de passe de l'utilisateur"
#: mod_configure.erl:153 mod_configure.erl:522
msgid "Change User Password"
msgstr "Changer le mot de passe de l'utilisateur"
#: mod_configure.erl:155 mod_configure.erl:523 mod_configure.erl:1272
msgid "Get User Last Login Time"
msgstr "Récupérer la dernière date de connexion de l'utilisateur"
#: mod_configure.erl:157 mod_configure.erl:524 mod_configure.erl:1284
msgid "Get User Statistics"
msgstr "Récupérer les statistiques de l'utilisateur"
#: mod_configure.erl:159 mod_configure.erl:525
msgid "Get Number of Registered Users"
msgstr "Récupérer le nombre d'utilisateurs enregistrés"
#: mod_configure.erl:161 mod_configure.erl:526
msgid "Get Number of Online Users"
msgstr "Récupérer le nombre d'utilisateurs en ligne"
#: mod_configure.erl:163 mod_configure.erl:509 web/ejabberd_web_admin.erl:831
#: web/ejabberd_web_admin.erl:872
msgid "Access Control Lists"
msgstr "Droits (ACL)"
#: mod_configure.erl:165 mod_configure.erl:510 web/ejabberd_web_admin.erl:940
#: web/ejabberd_web_admin.erl:976
msgid "Access Rules"
msgstr "Règles d'accès"
#: mod_configure.erl:297 mod_configure.erl:499
msgid "User Management"
msgstr "Gestion des utilisateurs"
#: mod_configure.erl:500 web/ejabberd_web_admin.erl:1058
#: web/ejabberd_web_admin.erl:1462
msgid "Online Users"
msgstr "Utilisateurs en ligne"
#: mod_configure.erl:501
msgid "All Users"
msgstr "Tous les utilisateurs"
#: mod_configure.erl:502
msgid "Outgoing s2s Connections"
msgstr "Connexions s2s sortantes"
#: mod_configure.erl:503 web/ejabberd_web_admin.erl:1907
msgid "Running Nodes"
msgstr "Noeuds actifs"
#: mod_configure.erl:504 web/ejabberd_web_admin.erl:1909
msgid "Stopped Nodes"
msgstr "Noeuds arrêtés"
#: mod_configure.erl:577 mod_configure.erl:587 web/ejabberd_web_admin.erl:1953
msgid "Modules"
msgstr "Modules"
#: mod_configure.erl:578
msgid "Backup Management"
msgstr "Gestion des sauvegardes"
#: mod_configure.erl:579
msgid "Import Users From jabberd14 Spool Files"
msgstr "Importer des utilisateurs depuis un fichier spool Jabberd 1.4"
#: mod_configure.erl:699
msgid "To ~s"
msgstr "A ~s"
#: mod_configure.erl:717
msgid "From ~s"
msgstr "De ~s"
#: mod_configure.erl:913
msgid "Database Tables Configuration at "
msgstr "Configuration des tables de base de données sur "
#: mod_configure.erl:918
msgid "Choose storage type of tables"
msgstr "Choisissez un type de stockage pour les tables"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "Disc only copy"
msgstr "Copie sur disque uniquement"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "RAM and disc copy"
msgstr "Copie en mémoire vive (RAM) et sur disque"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "RAM copy"
msgstr "Copie en mémoire vive (RAM)"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "Remote copy"
msgstr "Copie distante"
#: mod_configure.erl:950
msgid "Stop Modules at "
msgstr "Arrêter les modules sur "
#: mod_configure.erl:954
msgid "Choose modules to stop"
msgstr "Sélectionnez les modules à arrêter"
#: mod_configure.erl:969
msgid "Start Modules at "
msgstr "Démarrer les modules sur "
#: mod_configure.erl:973
msgid "Enter list of {Module, [Options]}"
msgstr "Entrez une liste de {Module, [Options]}"
#: mod_configure.erl:974
msgid "List of modules to start"
msgstr "Liste des modules à démarrer"
#: mod_configure.erl:983
msgid "Backup to File at "
msgstr "Sauvegarde sur fichier sur "
#: mod_configure.erl:987 mod_configure.erl:1001
msgid "Enter path to backup file"
msgstr "Entrez le chemin vers le fichier de sauvegarde"
#: mod_configure.erl:988 mod_configure.erl:1002 mod_configure.erl:1016
#: mod_configure.erl:1030
msgid "Path to File"
msgstr "Chemin vers le fichier"
#: mod_configure.erl:997
msgid "Restore Backup from File at "
msgstr "Restaurer la sauvegarde depuis le fichier sur "
#: mod_configure.erl:1011
msgid "Dump Backup to Text File at "
msgstr "Enregistrer la sauvegarde dans un fichier texte sur "
#: mod_configure.erl:1015
msgid "Enter path to text file"
msgstr "Entrez le chemin vers le fichier texte"
#: mod_configure.erl:1025
msgid "Import User from File at "
msgstr "Importer un utilisateur depuis le fichier sur "
#: mod_configure.erl:1029
msgid "Enter path to jabberd14 spool file"
msgstr "Entrez le chemin vers le fichier spool jabberd14"
#: mod_configure.erl:1039
msgid "Import Users from Dir at "
msgstr "Importer des utilisateurs depuis le répertoire sur "
#: mod_configure.erl:1043
msgid "Enter path to jabberd14 spool dir"
msgstr "Entrez le chemin vers le répertoire de spool jabberd14"
#: mod_configure.erl:1044
msgid "Path to Dir"
msgstr "Chemin vers le répertoire"
#: mod_configure.erl:1060 mod_configure.erl:1105
msgid "Time delay"
msgstr "Délais"
#: mod_configure.erl:1143
msgid "Access Control List Configuration"
msgstr "Configuration des droits (ACL)"
#: mod_configure.erl:1147
msgid "Access control lists"
msgstr "Droits (ACL)"
#: mod_configure.erl:1171
msgid "Access Configuration"
msgstr "Configuration d'accès"
#: mod_configure.erl:1175
msgid "Access rules"
msgstr "Règles d'accès"
#: mod_configure.erl:1200 mod_configure.erl:1222 mod_configure.erl:1234
#: mod_configure.erl:1246 mod_configure.erl:1258 mod_configure.erl:1275
#: mod_configure.erl:1287 mod_configure.erl:1650 mod_configure.erl:1700
#: mod_configure.erl:1721 mod_roster.erl:943 mod_roster_odbc.erl:1060
#: mod_vcard.erl:472 mod_vcard_ldap.erl:554 mod_vcard_odbc.erl:448
msgid "Jabber ID"
msgstr "Jabber ID"
#: mod_configure.erl:1205 mod_configure.erl:1263 mod_configure.erl:1651
#: mod_configure.erl:1863 mod_muc/mod_muc_room.erl:3224 mod_register.erl:235
#: web/ejabberd_web_admin.erl:1520
msgid "Password"
msgstr "Mot de passe"
#: mod_configure.erl:1210
msgid "Password Verification"
msgstr "Vérification du mot de passe"
#: mod_configure.erl:1301
msgid "Number of registered users"
msgstr "Nombre d'utilisateurs enregistrés"
#: mod_configure.erl:1315
msgid "Number of online users"
msgstr "Nombre d'utilisateurs en ligne"
#: mod_configure.erl:1682 web/ejabberd_web_admin.erl:1588
#: web/ejabberd_web_admin.erl:1743
msgid "Never"
msgstr "Jamais"
#: mod_configure.erl:1696 web/ejabberd_web_admin.erl:1601
#: web/ejabberd_web_admin.erl:1756
msgid "Online"
msgstr "En ligne"
#: mod_configure.erl:1701
msgid "Last login"
msgstr "Dernière connexion"
#: mod_configure.erl:1722
msgid "Roster size"
msgstr "Taille de la liste de contacts"
#: mod_configure.erl:1723
msgid "IP addresses"
msgstr "Adresses IP"
#: mod_configure.erl:1724
msgid "Resources"
msgstr "Ressources"
#: mod_configure.erl:1850
msgid "Administration of "
msgstr "Administration de "
#: mod_configure.erl:1853
msgid "Action on user"
msgstr "Action sur l'utilisateur"
#: mod_configure.erl:1857
msgid "Edit Properties"
msgstr "Modifier les propriétés"
#: mod_configure.erl:1860 web/ejabberd_web_admin.erl:1769
msgid "Remove User"
msgstr "Supprimer l'utilisateur"
#: mod_irc/mod_irc.erl:201 mod_irc/mod_irc_odbc.erl:196
#: mod_muc/mod_muc.erl:336 mod_muc/mod_muc_odbc.erl:342
msgid "Access denied by service policy"
msgstr "L'accès au service est refusé"
#: mod_irc/mod_irc.erl:401 mod_irc/mod_irc_odbc.erl:398
msgid "IRC Transport"
msgstr "Passerelle IRC"
#: mod_irc/mod_irc.erl:428 mod_irc/mod_irc_odbc.erl:425
msgid "ejabberd IRC module"
msgstr "Module IRC ejabberd"
#: mod_irc/mod_irc.erl:559 mod_irc/mod_irc_odbc.erl:568
msgid "You need an x:data capable client to configure mod_irc settings"
msgstr ""
"Vous avez besoin d'un client supportant x:data pour configurer le module IRC"
#: mod_irc/mod_irc.erl:566 mod_irc/mod_irc_odbc.erl:575
msgid "Registration in mod_irc for "
msgstr "Enregistrement du mod_irc pour "
#: mod_irc/mod_irc.erl:571 mod_irc/mod_irc_odbc.erl:580
msgid ""
"Enter username, encodings, ports and passwords you wish to use for "
"connecting to IRC servers"
msgstr ""
"Entrez le nom d'utilisateur, les encodages, les ports et mots de passe que "
"vous souhaitez utiliser pour vous connecter aux serveurs IRC"
#: mod_irc/mod_irc.erl:576 mod_irc/mod_irc_odbc.erl:585
msgid "IRC Username"
msgstr "Nom d'utilisateur IRC"
#: mod_irc/mod_irc.erl:586 mod_irc/mod_irc_odbc.erl:595
msgid ""
"If you want to specify different ports, passwords, encodings for IRC "
"servers, fill this list with values in format '{\"irc server\", \"encoding"
"\", port, \"password\"}'. By default this service use \"~s\" encoding, port "
"~p, empty password."
msgstr ""
"Si vous voulez préciser différents ports, mots de passe, et encodages pour "
"les serveurs IRC, remplissez cette liste avec des valeurs dans le format "
"'{\"serveur irc\", \"encodage\", port, \"mot de passe\"}'. Par défaut ce "
"service utilise l'encodage \"~s\", port ~p, mot de passe vide."
#: mod_irc/mod_irc.erl:598 mod_irc/mod_irc_odbc.erl:607
msgid ""
"Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef."
"net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."
msgstr ""
"Exemple: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef."
"net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."
#: mod_irc/mod_irc.erl:603 mod_irc/mod_irc_odbc.erl:612
msgid "Connections parameters"
msgstr "Paramètres de connexion"
#: mod_irc/mod_irc.erl:728 mod_irc/mod_irc_odbc.erl:757
msgid "Join IRC channel"
msgstr "Rejoindre un canal IRC"
#: mod_irc/mod_irc.erl:732 mod_irc/mod_irc_odbc.erl:761
msgid "IRC channel (don't put the first #)"
msgstr "Canal IRC (ne pas insérer le premier caractère #)"
#: mod_irc/mod_irc.erl:737 mod_irc/mod_irc_odbc.erl:766
msgid "IRC server"
msgstr "Serveur IRC"
#: mod_irc/mod_irc.erl:770 mod_irc/mod_irc.erl:774
#: mod_irc/mod_irc_odbc.erl:799 mod_irc/mod_irc_odbc.erl:803
msgid "Join the IRC channel here."
msgstr "Rejoindre un canal IRC ici"
#: mod_irc/mod_irc.erl:778 mod_irc/mod_irc_odbc.erl:807
msgid "Join the IRC channel in this Jabber ID: ~s"
msgstr "Rejoindre un canal IRC avec ce Jabber ID: ~s"
#: mod_irc/mod_irc.erl:863 mod_irc/mod_irc_odbc.erl:904
msgid "IRC settings"
msgstr "Configuration IRC"
#: mod_irc/mod_irc.erl:868 mod_irc/mod_irc_odbc.erl:909
msgid ""
"Enter username and encodings you wish to use for connecting to IRC servers. "
"Press 'Next' to get more fields to fill in. Press 'Complete' to save "
"settings."
msgstr ""
"Entrez le nom d'utilisateur et les encodages que vous souhaitez utiliser "
"pour vous connecter aux serveurs IRC. Appuyez sur 'Suivant' pour pour avoir "
"d'autres champs à remplir. Appuyez sur 'Terminer' pour sauver les paramètres."
#: mod_irc/mod_irc.erl:874 mod_irc/mod_irc_odbc.erl:915
msgid "IRC username"
msgstr "Nom d'utilisateur IRC"
#: mod_irc/mod_irc.erl:923 mod_irc/mod_irc_odbc.erl:964
msgid "Password ~b"
msgstr "Mot de passe ~b"
#: mod_irc/mod_irc.erl:928 mod_irc/mod_irc_odbc.erl:969
msgid "Port ~b"
msgstr "Port ~b"
#: mod_irc/mod_irc.erl:933 mod_irc/mod_irc_odbc.erl:974
msgid "Encoding for server ~b"
msgstr "Codage pour le serveur ~b"
#: mod_irc/mod_irc.erl:942 mod_irc/mod_irc_odbc.erl:983
msgid "Server ~b"
msgstr "Serveur ~b"
#: mod_muc/mod_muc.erl:449 mod_muc/mod_muc_odbc.erl:456
msgid "Only service administrators are allowed to send service messages"
msgstr ""
"Seuls les administrateurs du service sont autoriser à envoyer des messages "
"de service"
#: mod_muc/mod_muc.erl:493 mod_muc/mod_muc_odbc.erl:500
msgid "Room creation is denied by service policy"
msgstr "La création de salons est interdite par le service"
#: mod_muc/mod_muc.erl:500 mod_muc/mod_muc_odbc.erl:507
msgid "Conference room does not exist"
msgstr "La salle de conférence n'existe pas"
#: mod_muc/mod_muc.erl:582 mod_muc/mod_muc_odbc.erl:595
msgid "Chatrooms"
msgstr "Salons de discussion"
#: mod_muc/mod_muc.erl:712 mod_muc/mod_muc_odbc.erl:729
msgid "You need a client that supports x:data to register the nickname"
msgstr ""
"Vous avez besoin d'un client prenant en charge x:data pour enregistrer un "
"pseudo"
#: mod_muc/mod_muc.erl:718 mod_muc/mod_muc_odbc.erl:735
msgid "Nickname Registration at "
msgstr "Enregistrement d'un pseudo sur "
#: mod_muc/mod_muc.erl:722 mod_muc/mod_muc_odbc.erl:739
msgid "Enter nickname you want to register"
msgstr "Entrez le pseudo que vous souhaitez enregistrer"
#: mod_muc/mod_muc.erl:723 mod_muc/mod_muc_odbc.erl:740
#: mod_muc/mod_muc_room.erl:3810 mod_roster.erl:944 mod_roster_odbc.erl:1061
#: mod_vcard.erl:364 mod_vcard.erl:477 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:453
msgid "Nickname"
msgstr "Pseudo"
#: mod_muc/mod_muc.erl:762 mod_muc/mod_muc_odbc.erl:784
#: mod_muc/mod_muc_room.erl:1064 mod_muc/mod_muc_room.erl:1787
msgid "That nickname is registered by another person"
msgstr "Le pseudo est enregistré par une autre personne"
#: mod_muc/mod_muc.erl:788 mod_muc/mod_muc_odbc.erl:811
msgid "You must fill in field \"Nickname\" in the form"
msgstr "Vous devez préciser le champ \"pseudo\" dans le formulaire"
#: mod_muc/mod_muc.erl:808 mod_muc/mod_muc_odbc.erl:831
msgid "ejabberd MUC module"
msgstr "Module MUC ejabberd"
#: mod_muc/mod_muc_log.erl:374 mod_muc/mod_muc_log.erl:381
msgid "Chatroom configuration modified"
msgstr "Configuration du salon modifiée"
#: mod_muc/mod_muc_log.erl:384
msgid "joins the room"
msgstr "rejoint le salon"
#: mod_muc/mod_muc_log.erl:387 mod_muc/mod_muc_log.erl:390
msgid "leaves the room"
msgstr "quitte le salon"
#: mod_muc/mod_muc_log.erl:393 mod_muc/mod_muc_log.erl:396
msgid "has been banned"
msgstr "a été banni"
#: mod_muc/mod_muc_log.erl:399 mod_muc/mod_muc_log.erl:402
msgid "has been kicked"
msgstr "a été expulsé"
#: mod_muc/mod_muc_log.erl:405
msgid "has been kicked because of an affiliation change"
msgstr "a été éjecté à cause d'un changement d'autorisation"
#: mod_muc/mod_muc_log.erl:408
msgid "has been kicked because the room has been changed to members-only"
msgstr "a été éjecté car la salle est désormais réservée aux membres"
#: mod_muc/mod_muc_log.erl:411
msgid "has been kicked because of a system shutdown"
msgstr "a été éjecté en raison de l'arrêt du système"
#: mod_muc/mod_muc_log.erl:414
msgid "is now known as"
msgstr "est maintenant connu comme"
#: mod_muc/mod_muc_log.erl:417 mod_muc/mod_muc_log.erl:688
#: mod_muc/mod_muc_room.erl:2393
msgid " has set the subject to: "
msgstr " a changé le sujet pour: "
#: mod_muc/mod_muc_log.erl:452
msgid "Chatroom is created"
msgstr "Le salon de discussion est créé"
#: mod_muc/mod_muc_log.erl:453
msgid "Chatroom is destroyed"
msgstr "Le salon de discussion est détruit"
#: mod_muc/mod_muc_log.erl:454
msgid "Chatroom is started"
msgstr "Le salon de discussion a démarré"
#: mod_muc/mod_muc_log.erl:455
msgid "Chatroom is stopped"
msgstr "Le salon de discussion est stoppé"
#: mod_muc/mod_muc_log.erl:459
msgid "Monday"
msgstr "Lundi"
#: mod_muc/mod_muc_log.erl:460
msgid "Tuesday"
msgstr "Mardi"
#: mod_muc/mod_muc_log.erl:461
msgid "Wednesday"
msgstr "Mercredi"
#: mod_muc/mod_muc_log.erl:462
msgid "Thursday"
msgstr "Jeudi"
#: mod_muc/mod_muc_log.erl:463
msgid "Friday"
msgstr "Vendredi"
#: mod_muc/mod_muc_log.erl:464
msgid "Saturday"
msgstr "Samedi"
#: mod_muc/mod_muc_log.erl:465
msgid "Sunday"
msgstr "Dimanche"
#: mod_muc/mod_muc_log.erl:469
msgid "January"
msgstr "Janvier"
#: mod_muc/mod_muc_log.erl:470
msgid "February"
msgstr "Février"
#: mod_muc/mod_muc_log.erl:471
msgid "March"
msgstr "Mars"
#: mod_muc/mod_muc_log.erl:472
msgid "April"
msgstr "Avril"
#: mod_muc/mod_muc_log.erl:473
msgid "May"
msgstr "Mai"
#: mod_muc/mod_muc_log.erl:474
msgid "June"
msgstr "Juin"
#: mod_muc/mod_muc_log.erl:475
msgid "July"
msgstr "Juillet"
#: mod_muc/mod_muc_log.erl:476
msgid "August"
msgstr "Août"
#: mod_muc/mod_muc_log.erl:477
msgid "September"
msgstr "Septembre"
#: mod_muc/mod_muc_log.erl:478
msgid "October"
msgstr "Octobre"
#: mod_muc/mod_muc_log.erl:479
msgid "November"
msgstr "Novembre"
#: mod_muc/mod_muc_log.erl:480
msgid "December"
msgstr "Décembre"
#: mod_muc/mod_muc_log.erl:750
msgid "Room Configuration"
msgstr "Configuration du salon"
#: mod_muc/mod_muc_log.erl:759
msgid "Room Occupants"
msgstr "Occupants du salon"
#: mod_muc/mod_muc_room.erl:174
msgid "Traffic rate limit is exceeded"
msgstr "La limite de trafic a été dépassée"
#: mod_muc/mod_muc_room.erl:246
msgid ""
"This participant is kicked from the room because he sent an error message"
msgstr ""
"Ce participant est expulsé du salon pour avoir envoyé un message erronée"
#: mod_muc/mod_muc_room.erl:255
msgid "It is not allowed to send private messages to the conference"
msgstr "Il n'est pas permis d'envoyer des messages \"normaux\" à la conférence"
#: mod_muc/mod_muc_room.erl:332
msgid "Please, wait for a while before sending new voice request"
msgstr ""
#: mod_muc/mod_muc_room.erl:347
msgid "Voice requests are disabled in this conference"
msgstr ""
#: mod_muc/mod_muc_room.erl:364
msgid "Failed to extract JID from your voice request approval"
msgstr ""
#: mod_muc/mod_muc_room.erl:393
msgid "Only moderators can approve voice requests"
msgstr ""
#: mod_muc/mod_muc_room.erl:408
msgid "Improper message type"
msgstr "Mauvais type de message"
#: mod_muc/mod_muc_room.erl:518
msgid ""
"This participant is kicked from the room because he sent an error message to "
"another participant"
msgstr ""
"Ce participant est expulsé du salon pour avoir envoyé un message erronée à "
"un autre participant"
#: mod_muc/mod_muc_room.erl:531
msgid "It is not allowed to send private messages of type \"groupchat\""
msgstr ""
"Il n'est pas permis d'envoyer des messages privés de type \"groupchat\""
#: mod_muc/mod_muc_room.erl:543 mod_muc/mod_muc_room.erl:611
msgid "Recipient is not in the conference room"
msgstr "Le destinataire n'est pas dans la conférence"
#: mod_muc/mod_muc_room.erl:564 mod_muc/mod_muc_room.erl:585
msgid "It is not allowed to send private messages"
msgstr "L'envoi de messages privés n'est pas autorisé"
#: mod_muc/mod_muc_room.erl:576 mod_muc/mod_muc_room.erl:956
#: mod_muc/mod_muc_room.erl:4040
msgid "Only occupants are allowed to send messages to the conference"
msgstr "Seuls les occupants peuvent envoyer des messages à la conférence"
#: mod_muc/mod_muc_room.erl:634
msgid "Only occupants are allowed to send queries to the conference"
msgstr ""
"Seuls les occupants sont autorisés à envoyer des requêtes à la conférence"
#: mod_muc/mod_muc_room.erl:646
msgid "Queries to the conference members are not allowed in this room"
msgstr ""
"Les requêtes sur les membres de la conférence ne sont pas autorisé dans ce "
"salon"
#: mod_muc/mod_muc_room.erl:932
msgid ""
"Only moderators and participants are allowed to change the subject in this "
"room"
msgstr ""
"Seuls les modérateurs et les participants peuvent changer le sujet dans ce "
"salon"
#: mod_muc/mod_muc_room.erl:937
msgid "Only moderators are allowed to change the subject in this room"
msgstr "Seuls les modérateurs peuvent changer le sujet dans ce salon"
#: mod_muc/mod_muc_room.erl:947
msgid "Visitors are not allowed to send messages to all occupants"
msgstr ""
"Les visiteurs ne sont pas autorisés à envoyer des messages à tout les "
"occupants"
#: mod_muc/mod_muc_room.erl:1021
msgid ""
"This participant is kicked from the room because he sent an error presence"
msgstr ""
"Ce participant est expulsé du salon pour avoir envoyé une présence erronée"
#: mod_muc/mod_muc_room.erl:1040
msgid "Visitors are not allowed to change their nicknames in this room"
msgstr "Les visiteurs ne sont pas autorisés à changer de pseudo dans ce salon"
#: mod_muc/mod_muc_room.erl:1053 mod_muc/mod_muc_room.erl:1779
msgid "That nickname is already in use by another occupant"
msgstr "Le pseudo est déjà utilisé par un autre occupant"
#: mod_muc/mod_muc_room.erl:1768
msgid "You have been banned from this room"
msgstr "Vous avez été exclus de ce salon"
#: mod_muc/mod_muc_room.erl:1771
msgid "Membership is required to enter this room"
msgstr "Vous devez être membre pour accèder à ce salon"
#: mod_muc/mod_muc_room.erl:1807
msgid "This room is not anonymous"
msgstr "Ce salon n'est pas anonyme"
#: mod_muc/mod_muc_room.erl:1833
msgid "A password is required to enter this room"
msgstr "Un mot de passe est nécessaire pour accèder à ce salon"
#: mod_muc/mod_muc_room.erl:1855 mod_register.erl:246
msgid "Too many CAPTCHA requests"
msgstr ""
#: mod_muc/mod_muc_room.erl:1864 mod_register.erl:251
msgid "Unable to generate a CAPTCHA"
msgstr "Impossible de générer le CAPTCHA"
#: mod_muc/mod_muc_room.erl:1874
msgid "Incorrect password"
msgstr "Mot de passe incorrect"
#: mod_muc/mod_muc_room.erl:2448
msgid "Administrator privileges required"
msgstr "Les droits d'administrateur sont nécessaires"
#: mod_muc/mod_muc_room.erl:2463
msgid "Moderator privileges required"
msgstr "Les droits de modérateur sont nécessaires"
#: mod_muc/mod_muc_room.erl:2619
msgid "Jabber ID ~s is invalid"
msgstr "Le Jabber ID ~s n'est pas valide"
#: mod_muc/mod_muc_room.erl:2633
msgid "Nickname ~s does not exist in the room"
msgstr "Le pseudo ~s n'existe pas dans ce salon"
#: mod_muc/mod_muc_room.erl:2659 mod_muc/mod_muc_room.erl:3049
msgid "Invalid affiliation: ~s"
msgstr "Affiliation invalide : ~s"
#: mod_muc/mod_muc_room.erl:2713
msgid "Invalid role: ~s"
msgstr "Role invalide : ~s"
#: mod_muc/mod_muc_room.erl:3026 mod_muc/mod_muc_room.erl:3062
msgid "Owner privileges required"
msgstr "Les droits de propriétaire sont nécessaires"
#: mod_muc/mod_muc_room.erl:3195
msgid "Configuration of room ~s"
msgstr "Configuration pour le salon ~s"
#: mod_muc/mod_muc_room.erl:3200
msgid "Room title"
msgstr "Titre du salon"
#: mod_muc/mod_muc_room.erl:3203 mod_muc/mod_muc_room.erl:3692
msgid "Room description"
msgstr "Description :"
#: mod_muc/mod_muc_room.erl:3210
msgid "Make room persistent"
msgstr "Rendre le salon persistant"
#: mod_muc/mod_muc_room.erl:3215
msgid "Make room public searchable"
msgstr "Rendre le salon public"
#: mod_muc/mod_muc_room.erl:3218
msgid "Make participants list public"
msgstr "Rendre la liste des participants publique"
#: mod_muc/mod_muc_room.erl:3221
msgid "Make room password protected"
msgstr "Protéger le salon par mot de passe"
#: mod_muc/mod_muc_room.erl:3232
msgid "Maximum Number of Occupants"
msgstr "Nombre maximum d'occupants"
#: mod_muc/mod_muc_room.erl:3239
msgid "No limit"
msgstr "Pas de limite"
#: mod_muc/mod_muc_room.erl:3250
msgid "Present real Jabber IDs to"
msgstr "Rendre le Jabber ID réel visible pour"
#: mod_muc/mod_muc_room.erl:3258 mod_muc/mod_muc_room.erl:3292
msgid "moderators only"
msgstr "modérateurs seulement"
#: mod_muc/mod_muc_room.erl:3260 mod_muc/mod_muc_room.erl:3294
msgid "anyone"
msgstr "tout le monde"
#: mod_muc/mod_muc_room.erl:3262
msgid "Make room members-only"
msgstr "Réserver le salon aux membres uniquement"
#: mod_muc/mod_muc_room.erl:3265
msgid "Make room moderated"
msgstr "Rendre le salon modéré"
#: mod_muc/mod_muc_room.erl:3268
msgid "Default users as participants"
msgstr "Les utilisateurs sont par défaut participant"
#: mod_muc/mod_muc_room.erl:3271
msgid "Allow users to change the subject"
msgstr "Autoriser les utilisateurs à changer le sujet"
#: mod_muc/mod_muc_room.erl:3274
msgid "Allow users to send private messages"
msgstr "Autoriser les utilisateurs à envoyer des messages privés"
#: mod_muc/mod_muc_room.erl:3279
#, fuzzy
msgid "Allow visitors to send private messages to"
msgstr "Autoriser les utilisateurs à envoyer des messages privés"
#: mod_muc/mod_muc_room.erl:3290
msgid "nobody"
msgstr ""
#: mod_muc/mod_muc_room.erl:3296
msgid "Allow users to query other users"
msgstr ""
"Permettre aux utilisateurs d'envoyer des requêtes aux autres utilisateurs"
#: mod_muc/mod_muc_room.erl:3299
msgid "Allow users to send invites"
msgstr "Permettre aux utilisateurs d'envoyer des invitations"
#: mod_muc/mod_muc_room.erl:3302
msgid "Allow visitors to send status text in presence updates"
msgstr "Autoriser les visiteurs à envoyer un message d'état avec leur présence"
#: mod_muc/mod_muc_room.erl:3305
msgid "Allow visitors to change nickname"
msgstr "Autoriser les visiteurs à changer de pseudo"
#: mod_muc/mod_muc_room.erl:3308
#, fuzzy
msgid "Allow visitors to send voice requests"
msgstr "Permettre aux utilisateurs d'envoyer des invitations"
#: mod_muc/mod_muc_room.erl:3311
msgid "Minimum interval between voice requests (in seconds)"
msgstr ""
#: mod_muc/mod_muc_room.erl:3317
msgid "Make room CAPTCHA protected"
msgstr "Protéger le salon par un CAPTCHA"
#: mod_muc/mod_muc_room.erl:3322
msgid "Exclude Jabber IDs from CAPTCHA challenge"
msgstr ""
#: mod_muc/mod_muc_room.erl:3329
msgid "Enable logging"
msgstr "Activer l'archivage"
#: mod_muc/mod_muc_room.erl:3337
msgid "You need an x:data capable client to configure room"
msgstr ""
"Vous avez besoin d'un client supportant x:data pour configurer le salon"
#: mod_muc/mod_muc_room.erl:3694
msgid "Number of occupants"
msgstr "Nombre d'occupants"
#: mod_muc/mod_muc_room.erl:3750
msgid "private, "
msgstr "privé"
#: mod_muc/mod_muc_room.erl:3799
msgid "Voice request"
msgstr ""
#: mod_muc/mod_muc_room.erl:3803
msgid "Either approve or decline the voice request."
msgstr ""
#: mod_muc/mod_muc_room.erl:3809
#, fuzzy
msgid "User JID"
msgstr "Utilisateur "
#: mod_muc/mod_muc_room.erl:3811
msgid "Grant voice to this person?"
msgstr ""
#: mod_muc/mod_muc_room.erl:3960
msgid "~s invites you to the room ~s"
msgstr "~s vous a invité dans la salle de discussion ~s"
#: mod_muc/mod_muc_room.erl:3969
msgid "the password is"
msgstr "le mot de passe est"
#: mod_offline.erl:510 mod_offline_odbc.erl:352
msgid ""
"Your contact offline message queue is full. The message has been discarded."
msgstr ""
"La file d'attente de message de votre contact est pleine. Votre message a "
"été détruit."
#: mod_offline.erl:560 mod_offline_odbc.erl:408
msgid "~s's Offline Messages Queue"
msgstr "~s messages en file d'attente"
#: mod_offline.erl:563 mod_offline_odbc.erl:411 mod_roster.erl:987
#: mod_roster_odbc.erl:1104 mod_shared_roster.erl:901
#: mod_shared_roster.erl:1010 mod_shared_roster_odbc.erl:930
#: mod_shared_roster_odbc.erl:1039 web/ejabberd_web_admin.erl:833
#: web/ejabberd_web_admin.erl:874 web/ejabberd_web_admin.erl:942
#: web/ejabberd_web_admin.erl:978 web/ejabberd_web_admin.erl:1019
#: web/ejabberd_web_admin.erl:1508 web/ejabberd_web_admin.erl:1760
#: web/ejabberd_web_admin.erl:1931 web/ejabberd_web_admin.erl:1963
#: web/ejabberd_web_admin.erl:2031 web/ejabberd_web_admin.erl:2135
#: web/ejabberd_web_admin.erl:2160 web/ejabberd_web_admin.erl:2248
msgid "Submitted"
msgstr "Soumis"
#: mod_offline.erl:571
msgid "Time"
msgstr "Heure"
#: mod_offline.erl:572
msgid "From"
msgstr "De"
#: mod_offline.erl:573
msgid "To"
msgstr "A"
#: mod_offline.erl:574 mod_offline_odbc.erl:419
msgid "Packet"
msgstr "Paquet"
#: mod_offline.erl:587 mod_offline_odbc.erl:432 mod_shared_roster.erl:908
#: mod_shared_roster_odbc.erl:937 web/ejabberd_web_admin.erl:882
#: web/ejabberd_web_admin.erl:986
msgid "Delete Selected"
msgstr "Suppression des éléments sélectionnés"
#: mod_offline.erl:645 mod_offline_odbc.erl:519
msgid "Offline Messages:"
msgstr "Messages en attente :"
#: mod_offline.erl:645 mod_offline_odbc.erl:519
msgid "Remove All Offline Messages"
msgstr "Effacer tous les messages hors ligne"
#: mod_proxy65/mod_proxy65_service.erl:213
msgid "ejabberd SOCKS5 Bytestreams module"
msgstr "ejabberd SOCKS5 Bytestreams module"
#: mod_pubsub/mod_pubsub.erl:1120 mod_pubsub/mod_pubsub_odbc.erl:929
msgid "Publish-Subscribe"
msgstr "Publication-Abonnement"
#: mod_pubsub/mod_pubsub.erl:1214 mod_pubsub/mod_pubsub_odbc.erl:1025
msgid "ejabberd Publish-Subscribe module"
msgstr "Module Publish-Subscribe d'ejabberd"
#: mod_pubsub/mod_pubsub.erl:1497 mod_pubsub/mod_pubsub_odbc.erl:1312
msgid "PubSub subscriber request"
msgstr "Demande d'abonnement PubSub"
#: mod_pubsub/mod_pubsub.erl:1499 mod_pubsub/mod_pubsub_odbc.erl:1314
msgid "Choose whether to approve this entity's subscription."
msgstr "Accepter cet abonnement ?"
#: mod_pubsub/mod_pubsub.erl:1505 mod_pubsub/mod_pubsub_odbc.erl:1320
msgid "Node ID"
msgstr "Identifiant du nœud"
#: mod_pubsub/mod_pubsub.erl:1510 mod_pubsub/mod_pubsub_odbc.erl:1325
msgid "Subscriber Address"
msgstr "Adresse de l'abonné"
#: mod_pubsub/mod_pubsub.erl:1516 mod_pubsub/mod_pubsub_odbc.erl:1331
msgid "Allow this Jabber ID to subscribe to this pubsub node?"
msgstr "Autoriser ce Jabber ID à s'abonner à ce nœud PubSub"
#: mod_pubsub/mod_pubsub.erl:3474 mod_pubsub/mod_pubsub_odbc.erl:3287
msgid "Deliver payloads with event notifications"
msgstr "Inclure le contenu du message avec la notification"
#: mod_pubsub/mod_pubsub.erl:3475 mod_pubsub/mod_pubsub_odbc.erl:3288
msgid "Deliver event notifications"
msgstr "Envoyer les notifications d'événement"
#: mod_pubsub/mod_pubsub.erl:3476 mod_pubsub/mod_pubsub_odbc.erl:3289
msgid "Notify subscribers when the node configuration changes"
msgstr "Avertir les abonnés lorsque la configuration du nœud change"
#: mod_pubsub/mod_pubsub.erl:3477 mod_pubsub/mod_pubsub_odbc.erl:3290
msgid "Notify subscribers when the node is deleted"
msgstr "Avertir les abonnés lorsque le nœud est supprimé"
#: mod_pubsub/mod_pubsub.erl:3478 mod_pubsub/mod_pubsub_odbc.erl:3291
msgid "Notify subscribers when items are removed from the node"
msgstr "Avertir les abonnés lorsque des éléments sont supprimés sur le nœud"
#: mod_pubsub/mod_pubsub.erl:3479 mod_pubsub/mod_pubsub_odbc.erl:3292
msgid "Persist items to storage"
msgstr "Stockage persistant des éléments"
#: mod_pubsub/mod_pubsub.erl:3480 mod_pubsub/mod_pubsub_odbc.erl:3293
msgid "A friendly name for the node"
msgstr "Un nom convivial pour le noeud"
#: mod_pubsub/mod_pubsub.erl:3481 mod_pubsub/mod_pubsub_odbc.erl:3294
msgid "Max # of items to persist"
msgstr "Nombre maximum d'éléments à stocker"
#: mod_pubsub/mod_pubsub.erl:3482 mod_pubsub/mod_pubsub_odbc.erl:3295
msgid "Whether to allow subscriptions"
msgstr "Autoriser l'abonnement ?"
#: mod_pubsub/mod_pubsub.erl:3483 mod_pubsub/mod_pubsub_odbc.erl:3296
msgid "Specify the access model"
msgstr "Définir le modèle d'accès"
#: mod_pubsub/mod_pubsub.erl:3486 mod_pubsub/mod_pubsub_odbc.erl:3299
msgid "Roster groups allowed to subscribe"
msgstr "Groupes de liste de contact autorisés à s'abonner"
#: mod_pubsub/mod_pubsub.erl:3487 mod_pubsub/mod_pubsub_odbc.erl:3300
msgid "Specify the publisher model"
msgstr "Définir le modèle de publication"
#: mod_pubsub/mod_pubsub.erl:3489 mod_pubsub/mod_pubsub_odbc.erl:3302
msgid "Purge all items when the relevant publisher goes offline"
msgstr "Purger tous les items lorsque publieur est hors-ligne"
#: mod_pubsub/mod_pubsub.erl:3490 mod_pubsub/mod_pubsub_odbc.erl:3303
msgid "Specify the event message type"
msgstr "Définir le type de message d'événement"
#: mod_pubsub/mod_pubsub.erl:3492 mod_pubsub/mod_pubsub_odbc.erl:3305
msgid "Max payload size in bytes"
msgstr "Taille maximum pour le contenu du message en octet"
#: mod_pubsub/mod_pubsub.erl:3493 mod_pubsub/mod_pubsub_odbc.erl:3306
msgid "When to send the last published item"
msgstr "A quel moment envoyer le dernier élément publié"
#: mod_pubsub/mod_pubsub.erl:3495 mod_pubsub/mod_pubsub_odbc.erl:3308
msgid "Only deliver notifications to available users"
msgstr "Envoyer les notifications uniquement aux utilisateurs disponibles"
#: mod_pubsub/mod_pubsub.erl:3496 mod_pubsub/mod_pubsub_odbc.erl:3309
msgid "The collections with which a node is affiliated"
msgstr "Les collections avec lesquelle un nœud est affilié"
#: mod_register.erl:193
msgid "The CAPTCHA verification has failed"
msgstr "La vérification du CAPTCHA a échoué"
#: mod_register.erl:220
msgid "You need a client that supports x:data and CAPTCHA to register"
msgstr ""
"Vous avez besoin d'un client prenant en charge x:data et CAPTCHA pour "
"enregistrer un pseudo"
#: mod_register.erl:226 mod_register.erl:265
msgid "Choose a username and password to register with this server"
msgstr ""
"Choisissez un nom d'utilisateur et un mot de passe pour s'enregistrer sur ce "
"serveur"
#: mod_register.erl:230 mod_vcard.erl:364 mod_vcard_odbc.erl:342
#: web/ejabberd_web_admin.erl:1515 web/ejabberd_web_admin.erl:1572
msgid "User"
msgstr "Utilisateur"
#: mod_register.erl:316 mod_register.erl:361
msgid "The password is too weak"
msgstr "Le mot de passe est trop faible"
#: mod_register.erl:365
msgid "Users are not allowed to register accounts so quickly"
msgstr ""
"Les utilisateurs ne sont pas autorisés à enregistrer des comptes si "
"rapidement"
#: mod_roster.erl:938 mod_roster_odbc.erl:1055 web/ejabberd_web_admin.erl:1701
#: web/ejabberd_web_admin.erl:1886 web/ejabberd_web_admin.erl:1897
#: web/ejabberd_web_admin.erl:2219
msgid "None"
msgstr "Aucun"
#: mod_roster.erl:945 mod_roster_odbc.erl:1062
msgid "Subscription"
msgstr "Abonnement"
#: mod_roster.erl:946 mod_roster_odbc.erl:1063
msgid "Pending"
msgstr "En suspens"
#: mod_roster.erl:947 mod_roster_odbc.erl:1064
msgid "Groups"
msgstr "Groupes"
#: mod_roster.erl:974 mod_roster_odbc.erl:1091
msgid "Validate"
msgstr "Valider"
#: mod_roster.erl:982 mod_roster_odbc.erl:1099
msgid "Remove"
msgstr "Enlever"
#: mod_roster.erl:985 mod_roster_odbc.erl:1102
msgid "Roster of "
msgstr "Liste de contact de "
#: mod_roster.erl:988 mod_roster_odbc.erl:1105 mod_shared_roster.erl:902
#: mod_shared_roster.erl:1011 mod_shared_roster_odbc.erl:931
#: mod_shared_roster_odbc.erl:1040 web/ejabberd_web_admin.erl:834
#: web/ejabberd_web_admin.erl:875 web/ejabberd_web_admin.erl:943
#: web/ejabberd_web_admin.erl:979 web/ejabberd_web_admin.erl:1020
#: web/ejabberd_web_admin.erl:1509 web/ejabberd_web_admin.erl:1761
#: web/ejabberd_web_admin.erl:1932 web/ejabberd_web_admin.erl:2136
#: web/ejabberd_web_admin.erl:2161
msgid "Bad format"
msgstr "Mauvais format"
#: mod_roster.erl:995 mod_roster_odbc.erl:1112
msgid "Add Jabber ID"
msgstr "Ajouter un Jabber ID"
#: mod_roster.erl:1094 mod_roster_odbc.erl:1211
msgid "Roster"
msgstr "Liste de contacts"
#: mod_shared_roster.erl:857 mod_shared_roster.erl:899
#: mod_shared_roster.erl:1007 mod_shared_roster_odbc.erl:886
#: mod_shared_roster_odbc.erl:928 mod_shared_roster_odbc.erl:1036
msgid "Shared Roster Groups"
msgstr "Groupes de liste de contacts partagée"
#: mod_shared_roster.erl:895 mod_shared_roster_odbc.erl:924
#: web/ejabberd_web_admin.erl:1365 web/ejabberd_web_admin.erl:2461
msgid "Add New"
msgstr "Ajouter"
#: mod_shared_roster.erl:978 mod_shared_roster_odbc.erl:1007
msgid "Name:"
msgstr "Nom :"
#: mod_shared_roster.erl:983 mod_shared_roster_odbc.erl:1012
msgid "Description:"
msgstr "Description :"
#: mod_shared_roster.erl:991 mod_shared_roster_odbc.erl:1020
msgid "Members:"
msgstr "Membres :"
#: mod_shared_roster.erl:999 mod_shared_roster_odbc.erl:1028
msgid "Displayed Groups:"
msgstr "Groupes affichés :"
#: mod_shared_roster.erl:1008 mod_shared_roster_odbc.erl:1037
msgid "Group "
msgstr "Groupe "
#: mod_shared_roster.erl:1017 mod_shared_roster_odbc.erl:1046
#: web/ejabberd_web_admin.erl:840 web/ejabberd_web_admin.erl:884
#: web/ejabberd_web_admin.erl:949 web/ejabberd_web_admin.erl:1026
#: web/ejabberd_web_admin.erl:2017
msgid "Submit"
msgstr "Soumettre"
#: mod_vcard.erl:165 mod_vcard_ldap.erl:238 mod_vcard_odbc.erl:129
msgid "Erlang Jabber Server"
msgstr "Serveur Jabber Erlang"
#: mod_vcard.erl:364 mod_vcard.erl:478 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:454
msgid "Birthday"
msgstr "Date d'anniversaire"
#: mod_vcard.erl:364 mod_vcard.erl:480 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:456
msgid "City"
msgstr "Ville"
#: mod_vcard.erl:364 mod_vcard.erl:479 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:455
msgid "Country"
msgstr "Pays"
#: mod_vcard.erl:364 mod_vcard.erl:481 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:457
msgid "Email"
msgstr "Email"
#: mod_vcard.erl:364 mod_vcard.erl:476 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:452
msgid "Family Name"
msgstr "Nom de famille"
#: mod_vcard.erl:364 mod_vcard_odbc.erl:342
msgid ""
"Fill in the form to search for any matching Jabber User (Add * to the end of "
"field to match substring)"
msgstr ""
"Remplissez le formulaire pour recherche un utilisateur Jabber (Ajouter * à "
"la fin du champ pour chercher n'importe quelle fin de chaîne"
#: mod_vcard.erl:364 mod_vcard.erl:473 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:449
msgid "Full Name"
msgstr "Nom complet"
#: mod_vcard.erl:364 mod_vcard.erl:475 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:451
msgid "Middle Name"
msgstr "Autre nom"
#: mod_vcard.erl:364 mod_vcard.erl:474 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:450 web/ejabberd_web_admin.erl:2006
msgid "Name"
msgstr "Nom"
#: mod_vcard.erl:364 mod_vcard.erl:482 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:458
msgid "Organization Name"
msgstr "Nom de l'organisation"
#: mod_vcard.erl:364 mod_vcard.erl:483 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:459
msgid "Organization Unit"
msgstr "Unité de l'organisation"
#: mod_vcard.erl:364 mod_vcard_ldap.erl:462 mod_vcard_odbc.erl:342
msgid "Search users in "
msgstr "Rechercher des utilisateurs "
#: mod_vcard.erl:364 mod_vcard_ldap.erl:462 mod_vcard_odbc.erl:342
msgid "You need an x:data capable client to search"
msgstr ""
"Vous avez besoin d'un client supportant x:data pour faire une recherche"
#: mod_vcard.erl:389 mod_vcard_ldap.erl:487 mod_vcard_odbc.erl:367
msgid "vCard User Search"
msgstr "Recherche dans l'annnuaire"
#: mod_vcard.erl:445 mod_vcard_ldap.erl:541 mod_vcard_odbc.erl:421
msgid "ejabberd vCard module"
msgstr "Module vCard ejabberd"
#: mod_vcard.erl:469 mod_vcard_ldap.erl:551 mod_vcard_odbc.erl:445
msgid "Search Results for "
msgstr "Résultats de recherche pour "
#: mod_vcard_ldap.erl:462
msgid "Fill in fields to search for any matching Jabber User"
msgstr "Remplissez les champs pour rechercher un utilisateur Jabber"
#: web/ejabberd_web_admin.erl:193 web/ejabberd_web_admin.erl:203
#: web/ejabberd_web_admin.erl:219 web/ejabberd_web_admin.erl:229
msgid "Unauthorized"
msgstr "Non autorisé"
#: web/ejabberd_web_admin.erl:286 web/ejabberd_web_admin.erl:303
msgid "ejabberd Web Admin"
msgstr "Console Web d'administration de ejabberd"
#: web/ejabberd_web_admin.erl:769 web/ejabberd_web_admin.erl:780
msgid "Administration"
msgstr "Administration"
#: web/ejabberd_web_admin.erl:878 web/ejabberd_web_admin.erl:982
msgid "Raw"
msgstr "Brut"
#: web/ejabberd_web_admin.erl:1017
msgid "~s access rule configuration"
msgstr "Configuration des règles d'accès ~s"
#: web/ejabberd_web_admin.erl:1035
msgid "Virtual Hosts"
msgstr "Serveurs virtuels"
#: web/ejabberd_web_admin.erl:1043 web/ejabberd_web_admin.erl:1050
msgid "Users"
msgstr "Utilisateurs"
#: web/ejabberd_web_admin.erl:1078
msgid "Users Last Activity"
msgstr "Dernière activité des utilisateurs"
#: web/ejabberd_web_admin.erl:1080
msgid "Period: "
msgstr "Période :"
#: web/ejabberd_web_admin.erl:1090
msgid "Last month"
msgstr "Dernier mois"
#: web/ejabberd_web_admin.erl:1091
msgid "Last year"
msgstr "Dernière année"
#: web/ejabberd_web_admin.erl:1092
msgid "All activity"
msgstr "Toute activité"
#: web/ejabberd_web_admin.erl:1094
msgid "Show Ordinary Table"
msgstr "Montrer la table ordinaire"
#: web/ejabberd_web_admin.erl:1096
msgid "Show Integral Table"
msgstr "Montrer la table intégralement"
#: web/ejabberd_web_admin.erl:1105 web/ejabberd_web_admin.erl:1939
msgid "Statistics"
msgstr "Statistiques"
#: web/ejabberd_web_admin.erl:1117
msgid "Not Found"
msgstr "Nœud non trouvé"
#: web/ejabberd_web_admin.erl:1134
msgid "Node not found"
msgstr "Noeud non trouvé"
#: web/ejabberd_web_admin.erl:1460
msgid "Host"
msgstr "Serveur"
#: web/ejabberd_web_admin.erl:1461
msgid "Registered Users"
msgstr "Utilisateurs enregistrés"
#: web/ejabberd_web_admin.erl:1573
msgid "Offline Messages"
msgstr "Messages en attente"
#: web/ejabberd_web_admin.erl:1574 web/ejabberd_web_admin.erl:1767
msgid "Last Activity"
msgstr "Dernière Activité"
#: web/ejabberd_web_admin.erl:1659 web/ejabberd_web_admin.erl:1675
msgid "Registered Users:"
msgstr "Utilisateurs enregistrés:"
#: web/ejabberd_web_admin.erl:1661 web/ejabberd_web_admin.erl:1677
#: web/ejabberd_web_admin.erl:2192
msgid "Online Users:"
msgstr "Utilisateurs connectés:"
#: web/ejabberd_web_admin.erl:1663
msgid "Outgoing s2s Connections:"
msgstr "Connexions s2s sortantes:"
#: web/ejabberd_web_admin.erl:1665
msgid "Outgoing s2s Servers:"
msgstr "Serveurs s2s sortants"
#: web/ejabberd_web_admin.erl:1734 web/mod_register_web.erl:175
#: web/mod_register_web.erl:372 web/mod_register_web.erl:381
#: web/mod_register_web.erl:411
msgid "Change Password"
msgstr "Modifier le mot de passe"
#: web/ejabberd_web_admin.erl:1758
msgid "User "
msgstr "Utilisateur "
#: web/ejabberd_web_admin.erl:1765
msgid "Connected Resources:"
msgstr "Ressources connectées:"
#: web/ejabberd_web_admin.erl:1766 web/mod_register_web.erl:227
#: web/mod_register_web.erl:519
msgid "Password:"
msgstr "Mot de passe:"
#: web/ejabberd_web_admin.erl:1828
msgid "No Data"
msgstr "Aucune information disponible"
#: web/ejabberd_web_admin.erl:1906
msgid "Nodes"
msgstr "Noeuds"
#: web/ejabberd_web_admin.erl:1929 web/ejabberd_web_admin.erl:1951
msgid "Node "
msgstr "Noeud "
#: web/ejabberd_web_admin.erl:1938
msgid "Listened Ports"
msgstr "Ports ouverts"
#: web/ejabberd_web_admin.erl:1940 web/ejabberd_web_admin.erl:2260
#: web/ejabberd_web_admin.erl:2448
msgid "Update"
msgstr "Mettre à jour"
#: web/ejabberd_web_admin.erl:1943 web/ejabberd_web_admin.erl:2569
msgid "Restart"
msgstr "Redémarrer"
#: web/ejabberd_web_admin.erl:1945 web/ejabberd_web_admin.erl:2571
msgid "Stop"
msgstr "Arrêter"
#: web/ejabberd_web_admin.erl:1959
msgid "RPC Call Error"
msgstr "Erreur d'appel RPC"
#: web/ejabberd_web_admin.erl:2000
msgid "Database Tables at "
msgstr "Tables de base de données sur "
#: web/ejabberd_web_admin.erl:2007
msgid "Storage Type"
msgstr "Type de stockage"
#: web/ejabberd_web_admin.erl:2008
msgid "Elements"
msgstr "Éléments"
#: web/ejabberd_web_admin.erl:2009
msgid "Memory"
msgstr "Mémoire"
#: web/ejabberd_web_admin.erl:2032 web/ejabberd_web_admin.erl:2137
msgid "Error"
msgstr "Erreur"
#: web/ejabberd_web_admin.erl:2034
msgid "Backup of "
msgstr "Sauvegarde de "
#: web/ejabberd_web_admin.erl:2036
msgid ""
"Please note that these options will only backup the builtin Mnesia database. "
"If you are using the ODBC module, you also need to backup your SQL database "
"separately."
msgstr ""
"Ces options sauvegardent uniquement la base de données interne Mnesia. Si "
"vous utilisez le module ODBC vous devez sauvegarde votre base SQL séparément."
#: web/ejabberd_web_admin.erl:2041
msgid "Store binary backup:"
msgstr "Sauvegarde binaire:"
#: web/ejabberd_web_admin.erl:2045 web/ejabberd_web_admin.erl:2052
#: web/ejabberd_web_admin.erl:2060 web/ejabberd_web_admin.erl:2067
#: web/ejabberd_web_admin.erl:2074 web/ejabberd_web_admin.erl:2081
#: web/ejabberd_web_admin.erl:2088 web/ejabberd_web_admin.erl:2096
#: web/ejabberd_web_admin.erl:2103 web/ejabberd_web_admin.erl:2110
msgid "OK"
msgstr "OK"
#: web/ejabberd_web_admin.erl:2048
msgid "Restore binary backup immediately:"
msgstr "Restauration immédiate d'une sauvegarde binaire:"
#: web/ejabberd_web_admin.erl:2056
msgid ""
"Restore binary backup after next ejabberd restart (requires less memory):"
msgstr ""
"Restauration de la sauvegarde binaire après redémarrage (nécessite moins de "
"mémoire):"
#: web/ejabberd_web_admin.erl:2063
msgid "Store plain text backup:"
msgstr "Sauvegarde texte:"
#: web/ejabberd_web_admin.erl:2070
msgid "Restore plain text backup immediately:"
msgstr "Restauration immédiate d'une sauvegarde texte:"
#: web/ejabberd_web_admin.erl:2077
msgid "Import users data from a PIEFXIS file (XEP-0227):"
msgstr ""
"Importer les données utilisateurs à partir d'un fichier PIEFXIS (XEP-0227):"
#: web/ejabberd_web_admin.erl:2084
msgid "Export data of all users in the server to PIEFXIS files (XEP-0227):"
msgstr ""
"Exporter les données de tous les utilisateurs du serveur vers un fichier "
"PIEFXIS (XEP-0227):"
#: web/ejabberd_web_admin.erl:2091
msgid "Export data of users in a host to PIEFXIS files (XEP-0227):"
msgstr ""
"Exporter les données utilisateurs d'un hôte vers un fichier PIEFXIS "
"(XEP-0227):"
#: web/ejabberd_web_admin.erl:2099
msgid "Import user data from jabberd14 spool file:"
msgstr "Importer des utilisateurs depuis un fichier spool Jabberd 1.4:"
#: web/ejabberd_web_admin.erl:2106
msgid "Import users data from jabberd14 spool directory:"
msgstr "Importer des utilisateurs depuis un fichier spool Jabberd 1.4:"
#: web/ejabberd_web_admin.erl:2132
msgid "Listened Ports at "
msgstr "Ports ouverts sur "
#: web/ejabberd_web_admin.erl:2157
msgid "Modules at "
msgstr "Modules sur "
#: web/ejabberd_web_admin.erl:2183
msgid "Statistics of ~p"
msgstr "Statistiques de ~p"
#: web/ejabberd_web_admin.erl:2186
msgid "Uptime:"
msgstr "Temps depuis le démarrage :"
#: web/ejabberd_web_admin.erl:2189
msgid "CPU Time:"
msgstr "Temps CPU :"
#: web/ejabberd_web_admin.erl:2195
msgid "Transactions Committed:"
msgstr "Transactions commitées :"
#: web/ejabberd_web_admin.erl:2198
msgid "Transactions Aborted:"
msgstr "Transactions annulées :"
#: web/ejabberd_web_admin.erl:2201
msgid "Transactions Restarted:"
msgstr "Transactions redémarrées :"
#: web/ejabberd_web_admin.erl:2204
msgid "Transactions Logged:"
msgstr "Transactions journalisées :"
#: web/ejabberd_web_admin.erl:2246
msgid "Update "
msgstr "Mise à jour "
#: web/ejabberd_web_admin.erl:2254
msgid "Update plan"
msgstr "Plan de mise à jour"
#: web/ejabberd_web_admin.erl:2255
msgid "Modified modules"
msgstr "Modules mis à jour"
#: web/ejabberd_web_admin.erl:2256
msgid "Update script"
msgstr "Script de mise à jour"
#: web/ejabberd_web_admin.erl:2257
msgid "Low level update script"
msgstr "Script de mise à jour de bas-niveau"
#: web/ejabberd_web_admin.erl:2258
msgid "Script check"
msgstr "Validation du script"
#: web/ejabberd_web_admin.erl:2426
msgid "Port"
msgstr "Port"
#: web/ejabberd_web_admin.erl:2427
msgid "IP"
msgstr "IP"
#: web/ejabberd_web_admin.erl:2428
msgid "Protocol"
msgstr "Protocole"
#: web/ejabberd_web_admin.erl:2429 web/ejabberd_web_admin.erl:2556
msgid "Module"
msgstr "Module"
#: web/ejabberd_web_admin.erl:2430 web/ejabberd_web_admin.erl:2557
msgid "Options"
msgstr "Options"
#: web/ejabberd_web_admin.erl:2450
msgid "Delete"
msgstr "Supprimer"
#: web/ejabberd_web_admin.erl:2579
msgid "Start"
msgstr "Démarrer"
#: web/mod_register_web.erl:104
msgid "Your Jabber account was successfully created."
msgstr "Votre compte Jabber a été créé avec succès."
#: web/mod_register_web.erl:107
msgid "There was an error creating the account: "
msgstr "Il y a eu une erreur en créant le compte :"
#: web/mod_register_web.erl:115
msgid "Your Jabber account was successfully deleted."
msgstr "Votre compte Jabber a été effacé avec succès."
#: web/mod_register_web.erl:118
msgid "There was an error deleting the account: "
msgstr "Il y a eu une erreur en effaçant le compte :"
#: web/mod_register_web.erl:128
msgid "The password of your Jabber account was successfully changed."
msgstr "Le mot de passe de votre compte Jabber a été changé avec succès."
#: web/mod_register_web.erl:131
msgid "There was an error changing the password: "
msgstr "Il y a eu une erreur en changeant le mot de passe :"
#: web/mod_register_web.erl:163 web/mod_register_web.erl:172
msgid "Jabber Account Registration"
msgstr "Enregistrement du Compte Jabber"
#: web/mod_register_web.erl:174 web/mod_register_web.erl:192
#: web/mod_register_web.erl:201
msgid "Register a Jabber account"
msgstr "Enregistrer un compte Jabber"
#: web/mod_register_web.erl:176 web/mod_register_web.erl:493
#: web/mod_register_web.erl:502
msgid "Unregister a Jabber account"
msgstr "Effacer un compte Jabber"
#: web/mod_register_web.erl:203
msgid ""
"This page allows to create a Jabber account in this Jabber server. Your JID "
"(Jabber IDentifier) will be of the form: username@server. Please read "
"carefully the instructions to fill correctly the fields."
msgstr ""
"Cette page permet de créer un compte Jabber sur ce serveur Jabber. Votre JID "
"(Jabber IDentifier, identifiant Jabber) sera de la forme : nom@serveur. "
"Prière de lire avec attention les instructions pour remplir correctement ces "
"champs."
#: web/mod_register_web.erl:212 web/mod_register_web.erl:386
#: web/mod_register_web.erl:509
msgid "Username:"
msgstr "Nom d'utilisateur :"
#: web/mod_register_web.erl:217
msgid "This is case insensitive: macbeth is the same that MacBeth and Macbeth."
msgstr ""
"C'est insensible à la casse : macbeth est identique à MacBeth et Macbeth."
#: web/mod_register_web.erl:218
msgid "Characters not allowed:"
msgstr "Caractères non-autorisés :"
#: web/mod_register_web.erl:222 web/mod_register_web.erl:391
#: web/mod_register_web.erl:514
msgid "Server:"
msgstr "Serveur :"
#: web/mod_register_web.erl:232
msgid ""
"Don't tell your password to anybody, not even the administrators of the "
"Jabber server."
msgstr ""
"Ne révélez votre mot de passe à personne, pas même l'administrateur de ce "
"serveur."
#: web/mod_register_web.erl:234
msgid "You can later change your password using a Jabber client."
msgstr ""
"Vous pouvez changer votre mot de passe plus tard en utilisant un client "
"Jabber."
#: web/mod_register_web.erl:235
msgid ""
"Some Jabber clients can store your password in your computer. Use that "
"feature only if you trust your computer is safe."
msgstr ""
"Certains clients Jabber peuvent stocker votre mot de passe sur votre "
"ordinateur. N'utilisez cette fonctionnalité que si vous avez confiance en la "
"sécurité de votre ordinateur."
#: web/mod_register_web.erl:237
msgid ""
"Memorize your password, or write it in a paper placed in a safe place. In "
"Jabber there isn't an automated way to recover your password if you forget "
"it."
msgstr ""
"Mémorisez votre mot de passe, ou écrivez-le sur un papier conservé dans un "
"endroit secret. Dans Jabber il n'y a pas de mécanisme pour retrouver votre "
"mot de passe si vous l'avez oublié."
#: web/mod_register_web.erl:242 web/mod_register_web.erl:406
msgid "Password Verification:"
msgstr "Vérification du mot de passe :"
#: web/mod_register_web.erl:250
msgid "Register"
msgstr "Enregistrer"
#: web/mod_register_web.erl:396
msgid "Old Password:"
msgstr "Ancien mot de passe:"
#: web/mod_register_web.erl:401
msgid "New Password:"
msgstr "Nouveau mot de passe:"
#: web/mod_register_web.erl:504
msgid "This page allows to unregister a Jabber account in this Jabber server."
msgstr "Cette page permet d'effacer un compte Jabber sur ce serveur Jabber."
#: web/mod_register_web.erl:524
msgid "Unregister"
msgstr "Effacer"
#, fuzzy
#~ msgid "Captcha test failed"
#~ msgstr "Le CAPTCHA est valide"
#~ msgid "Encodings"
#~ msgstr "Encodages"
#~ msgid "(Raw)"
#~ msgstr "(Brut)"
ejabberd-2.1.11/src/msgs/pt-br.po 0000664 0000000 0000000 00000155671 12240230175 013361 0 ustar msgid ""
msgstr ""
"Project-Id-Version: 2.1.0-alpha\n"
"Last-Translator: Otávio Fernandes\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Language: Portuguese (Brazil)\n"
"X-Additional-Translator: Renato Botelho\n"
"X-Additional-Translator: Lucius Curado\n"
"X-Additional-Translator: Felipe Brito Vasconcellos\n"
"X-Additional-Translator: Victor Hugo dos Santos\n"
#: ejabberd_c2s.erl:424 ejabberd_c2s.erl:727
msgid "Use of STARTTLS required"
msgstr "É obrigatório uso de STARTTLS"
#: ejabberd_c2s.erl:503
msgid "No resource provided"
msgstr "Nenhum recurso foi informado"
#: ejabberd_c2s.erl:1197
msgid "Replaced by new connection"
msgstr "Substituído por nova conexão"
#: ejabberd_c2s.erl:1885
msgid "Your active privacy list has denied the routing of this stanza."
msgstr "Sua lista de privacidade ativa negou o roteamento deste."
#: ejabberd_captcha.erl:96 ejabberd_captcha.erl:152 ejabberd_captcha.erl:178
msgid "Enter the text you see"
msgstr "Insira o texto que você vê"
#: ejabberd_captcha.erl:101
msgid "Your messages to ~s are being blocked. To unblock them, visit ~s"
msgstr ""
"Suas mensagens para ~s estão bloqueadas. Para desbloquea-las, visite: ~s"
#: ejabberd_captcha.erl:134
msgid "If you don't see the CAPTCHA image here, visit the web page."
msgstr ""
#: ejabberd_captcha.erl:146
msgid "CAPTCHA web page"
msgstr ""
#: ejabberd_captcha.erl:307
msgid "The CAPTCHA is valid."
msgstr "O CAPTCHA é inválido."
#: mod_adhoc.erl:95 mod_adhoc.erl:125 mod_adhoc.erl:143 mod_adhoc.erl:161
msgid "Commands"
msgstr "Comandos"
#: mod_adhoc.erl:149 mod_adhoc.erl:243
msgid "Ping"
msgstr "Ping"
#: mod_adhoc.erl:260
msgid "Pong"
msgstr "Pong"
#: mod_announce.erl:507 mod_announce_odbc.erl:499
msgid "Really delete message of the day?"
msgstr "Deletar realmente a mensagem do dia?"
#: mod_announce.erl:515 mod_announce_odbc.erl:507 mod_configure.erl:1083
#: mod_configure.erl:1128
msgid "Subject"
msgstr "Assunto"
#: mod_announce.erl:520 mod_announce_odbc.erl:512 mod_configure.erl:1088
#: mod_configure.erl:1133
msgid "Message body"
msgstr "Corpo da mensagem"
#: mod_announce.erl:600 mod_announce_odbc.erl:592
msgid "No body provided for announce message"
msgstr "Nenhum corpo de texto fornecido para anunciar mensagem"
#: mod_announce.erl:635 mod_announce_odbc.erl:627
msgid "Announcements"
msgstr "Anúncios"
#: mod_announce.erl:637 mod_announce_odbc.erl:629
msgid "Send announcement to all users"
msgstr "Enviar anúncio a todos os usuários"
#: mod_announce.erl:639 mod_announce_odbc.erl:631
msgid "Send announcement to all users on all hosts"
msgstr "Enviar aviso para todos os usuários em todos os hosts"
#: mod_announce.erl:641 mod_announce_odbc.erl:633
msgid "Send announcement to all online users"
msgstr "Enviar anúncio a todos os usuárions online"
#: mod_announce.erl:643 mod_announce_odbc.erl:635 mod_configure.erl:1078
#: mod_configure.erl:1123
msgid "Send announcement to all online users on all hosts"
msgstr "Enviar anúncio a todos usuários online em todas as máquinas"
#: mod_announce.erl:645 mod_announce_odbc.erl:637
msgid "Set message of the day and send to online users"
msgstr "Definir mensagem do dia e enviar a todos usuários online"
#: mod_announce.erl:647 mod_announce_odbc.erl:639
msgid "Set message of the day on all hosts and send to online users"
msgstr ""
"Definir mensagem do dia em todos os hosts e enviar para os usuários online"
#: mod_announce.erl:649 mod_announce_odbc.erl:641
msgid "Update message of the day (don't send)"
msgstr "Atualizar mensagem do dia (não enviar)"
#: mod_announce.erl:651 mod_announce_odbc.erl:643
msgid "Update message of the day on all hosts (don't send)"
msgstr "Atualizar a mensagem do dia em todos os host (não enviar)"
#: mod_announce.erl:653 mod_announce_odbc.erl:645
msgid "Delete message of the day"
msgstr "Apagar mensagem do dia"
#: mod_announce.erl:655 mod_announce_odbc.erl:647
msgid "Delete message of the day on all hosts"
msgstr "Apagar a mensagem do dia em todos os hosts"
#: mod_configure.erl:114 mod_configure.erl:274 mod_configure.erl:296
#: mod_configure.erl:498
msgid "Configuration"
msgstr "Configuração"
#: mod_configure.erl:125 mod_configure.erl:576 web/ejabberd_web_admin.erl:1936
msgid "Database"
msgstr "Base de dados"
#: mod_configure.erl:127 mod_configure.erl:595
msgid "Start Modules"
msgstr "Iniciar módulos"
#: mod_configure.erl:129 mod_configure.erl:596
msgid "Stop Modules"
msgstr "Parar módulos"
#: mod_configure.erl:131 mod_configure.erl:604 web/ejabberd_web_admin.erl:1937
msgid "Backup"
msgstr "Salvar cópia de segurança"
#: mod_configure.erl:133 mod_configure.erl:605
msgid "Restore"
msgstr "Restaurar"
#: mod_configure.erl:135 mod_configure.erl:606
msgid "Dump to Text File"
msgstr "Exportar para arquivo de texto"
#: mod_configure.erl:137 mod_configure.erl:615
msgid "Import File"
msgstr "Importar arquivo"
#: mod_configure.erl:139 mod_configure.erl:616
msgid "Import Directory"
msgstr "Importar diretório"
#: mod_configure.erl:141 mod_configure.erl:581 mod_configure.erl:1057
msgid "Restart Service"
msgstr "Reiniciar Serviço"
#: mod_configure.erl:143 mod_configure.erl:582 mod_configure.erl:1102
msgid "Shut Down Service"
msgstr "Parar Serviço"
#: mod_configure.erl:145 mod_configure.erl:518 mod_configure.erl:1197
#: web/ejabberd_web_admin.erl:1527
msgid "Add User"
msgstr "Adicionar usuário"
#: mod_configure.erl:147 mod_configure.erl:519 mod_configure.erl:1219
msgid "Delete User"
msgstr "Deletar Usuário"
#: mod_configure.erl:149 mod_configure.erl:520 mod_configure.erl:1231
msgid "End User Session"
msgstr "Terminar Sessão do Usuário"
#: mod_configure.erl:151 mod_configure.erl:521 mod_configure.erl:1243
#: mod_configure.erl:1255
msgid "Get User Password"
msgstr "Obter Senha do Usuário"
#: mod_configure.erl:153 mod_configure.erl:522
msgid "Change User Password"
msgstr "Alterar Senha do Usuário"
#: mod_configure.erl:155 mod_configure.erl:523 mod_configure.erl:1272
msgid "Get User Last Login Time"
msgstr "Obter a Data do Último Login"
#: mod_configure.erl:157 mod_configure.erl:524 mod_configure.erl:1284
msgid "Get User Statistics"
msgstr "Obter Estatísticas do Usuário"
#: mod_configure.erl:159 mod_configure.erl:525
msgid "Get Number of Registered Users"
msgstr "Obter Número de Usuários Registrados"
#: mod_configure.erl:161 mod_configure.erl:526
msgid "Get Number of Online Users"
msgstr "Obter Número de Usuários Online"
#: mod_configure.erl:163 mod_configure.erl:509 web/ejabberd_web_admin.erl:831
#: web/ejabberd_web_admin.erl:872
msgid "Access Control Lists"
msgstr "Listas de Controle de Acesso"
#: mod_configure.erl:165 mod_configure.erl:510 web/ejabberd_web_admin.erl:940
#: web/ejabberd_web_admin.erl:976
msgid "Access Rules"
msgstr "Regras de Acesso"
#: mod_configure.erl:297 mod_configure.erl:499
msgid "User Management"
msgstr "Gerenciamento de Usuários"
#: mod_configure.erl:500 web/ejabberd_web_admin.erl:1058
#: web/ejabberd_web_admin.erl:1462
msgid "Online Users"
msgstr "Usuários conectados"
#: mod_configure.erl:501
msgid "All Users"
msgstr "Todos os usuários"
#: mod_configure.erl:502
msgid "Outgoing s2s Connections"
msgstr "Conexões que partam de s2s"
#: mod_configure.erl:503 web/ejabberd_web_admin.erl:1907
msgid "Running Nodes"
msgstr "Nos em execução"
#: mod_configure.erl:504 web/ejabberd_web_admin.erl:1909
msgid "Stopped Nodes"
msgstr "Nos parados"
#: mod_configure.erl:577 mod_configure.erl:587 web/ejabberd_web_admin.erl:1953
msgid "Modules"
msgstr "Módulos"
#: mod_configure.erl:578
msgid "Backup Management"
msgstr "Gestão de Backup"
#: mod_configure.erl:579
msgid "Import Users From jabberd14 Spool Files"
msgstr "Importar usuários de arquivos jabberd14"
#: mod_configure.erl:699
msgid "To ~s"
msgstr "Para ~s"
#: mod_configure.erl:717
msgid "From ~s"
msgstr "De ~s"
#: mod_configure.erl:913
msgid "Database Tables Configuration at "
msgstr "Configuração de Tabelas de Base de dados em "
#: mod_configure.erl:918
msgid "Choose storage type of tables"
msgstr "Selecione o tipo de armazenamento das tabelas"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "Disc only copy"
msgstr "Somente copia em disco"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "RAM and disc copy"
msgstr "Copias na RAM e disco rígido"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "RAM copy"
msgstr "Copia em RAM"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "Remote copy"
msgstr "Copia remota"
#: mod_configure.erl:950
msgid "Stop Modules at "
msgstr "Parar módulos em "
#: mod_configure.erl:954
msgid "Choose modules to stop"
msgstr "Selecione módulos a parar"
#: mod_configure.erl:969
msgid "Start Modules at "
msgstr "Iniciar módulos em "
#: mod_configure.erl:973
msgid "Enter list of {Module, [Options]}"
msgstr "Introduza lista de {módulo, [opções]}"
#: mod_configure.erl:974
msgid "List of modules to start"
msgstr "Listas de módulos para inicializar"
#: mod_configure.erl:983
msgid "Backup to File at "
msgstr "Salvar backup para arquivo em "
#: mod_configure.erl:987 mod_configure.erl:1001
msgid "Enter path to backup file"
msgstr "Introduza o caminho do arquivo de backup"
#: mod_configure.erl:988 mod_configure.erl:1002 mod_configure.erl:1016
#: mod_configure.erl:1030
msgid "Path to File"
msgstr "Caminho do arquivo"
#: mod_configure.erl:997
msgid "Restore Backup from File at "
msgstr "Restaurar backup a partir do arquivo em "
#: mod_configure.erl:1011
msgid "Dump Backup to Text File at "
msgstr "Exportar backup para texto em "
#: mod_configure.erl:1015
msgid "Enter path to text file"
msgstr "Introduza caminho para o arquivo texto"
#: mod_configure.erl:1025
msgid "Import User from File at "
msgstr "Importar usuário a partir do arquivo em "
#: mod_configure.erl:1029
msgid "Enter path to jabberd14 spool file"
msgstr "Insira o caminho para a fila (arquivo) do jabberd14"
#: mod_configure.erl:1039
msgid "Import Users from Dir at "
msgstr "Importar usuários a partir do diretório em "
#: mod_configure.erl:1043
msgid "Enter path to jabberd14 spool dir"
msgstr "Introduza o caminho para o diretório de fila do jabberd14"
#: mod_configure.erl:1044
msgid "Path to Dir"
msgstr "Caminho para o diretório"
#: mod_configure.erl:1060 mod_configure.erl:1105
msgid "Time delay"
msgstr "Intervalo (Tempo)"
#: mod_configure.erl:1143
msgid "Access Control List Configuration"
msgstr "Configuração da Lista de Controle de Acesso"
#: mod_configure.erl:1147
msgid "Access control lists"
msgstr "Listas de Controle de Acesso"
#: mod_configure.erl:1171
msgid "Access Configuration"
msgstr "Configuração de Acesso"
#: mod_configure.erl:1175
msgid "Access rules"
msgstr "Regras de acesso"
#: mod_configure.erl:1200 mod_configure.erl:1222 mod_configure.erl:1234
#: mod_configure.erl:1246 mod_configure.erl:1258 mod_configure.erl:1275
#: mod_configure.erl:1287 mod_configure.erl:1650 mod_configure.erl:1700
#: mod_configure.erl:1721 mod_roster.erl:943 mod_roster_odbc.erl:1060
#: mod_vcard.erl:472 mod_vcard_ldap.erl:554 mod_vcard_odbc.erl:448
msgid "Jabber ID"
msgstr "ID Jabber"
#: mod_configure.erl:1205 mod_configure.erl:1263 mod_configure.erl:1651
#: mod_configure.erl:1863 mod_muc/mod_muc_room.erl:3224 mod_register.erl:235
#: web/ejabberd_web_admin.erl:1520
msgid "Password"
msgstr "Senha"
#: mod_configure.erl:1210
msgid "Password Verification"
msgstr "Verificação de Senha"
#: mod_configure.erl:1301
msgid "Number of registered users"
msgstr "Número de usuários registrados"
#: mod_configure.erl:1315
msgid "Number of online users"
msgstr "Número de usuários online"
#: mod_configure.erl:1682 web/ejabberd_web_admin.erl:1588
#: web/ejabberd_web_admin.erl:1743
msgid "Never"
msgstr "Nunca"
#: mod_configure.erl:1696 web/ejabberd_web_admin.erl:1601
#: web/ejabberd_web_admin.erl:1756
msgid "Online"
msgstr "Conectado"
#: mod_configure.erl:1701
msgid "Last login"
msgstr "Último login"
#: mod_configure.erl:1722
msgid "Roster size"
msgstr "Tamanho da Lista"
#: mod_configure.erl:1723
msgid "IP addresses"
msgstr "Endereços IP"
#: mod_configure.erl:1724
msgid "Resources"
msgstr "Recursos"
#: mod_configure.erl:1850
msgid "Administration of "
msgstr "Administração de "
#: mod_configure.erl:1853
msgid "Action on user"
msgstr "Ação no usuário"
#: mod_configure.erl:1857
msgid "Edit Properties"
msgstr "Editar propriedades"
#: mod_configure.erl:1860 web/ejabberd_web_admin.erl:1769
msgid "Remove User"
msgstr "Remover usuário"
#: mod_irc/mod_irc.erl:201 mod_irc/mod_irc_odbc.erl:196
#: mod_muc/mod_muc.erl:336 mod_muc/mod_muc_odbc.erl:342
msgid "Access denied by service policy"
msgstr "Aceso denegado por la política do serviço"
#: mod_irc/mod_irc.erl:401 mod_irc/mod_irc_odbc.erl:398
msgid "IRC Transport"
msgstr "Transporte IRC"
#: mod_irc/mod_irc.erl:428 mod_irc/mod_irc_odbc.erl:425
msgid "ejabberd IRC module"
msgstr "Módulo de IRC para ejabberd"
#: mod_irc/mod_irc.erl:559 mod_irc/mod_irc_odbc.erl:568
msgid "You need an x:data capable client to configure mod_irc settings"
msgstr ""
"Necessitas um cliente com suporte de x:data para configurar las opções de "
"mod_irc"
#: mod_irc/mod_irc.erl:566 mod_irc/mod_irc_odbc.erl:575
msgid "Registration in mod_irc for "
msgstr "Registro em mod_irc para "
#: mod_irc/mod_irc.erl:571 mod_irc/mod_irc_odbc.erl:580
msgid ""
"Enter username, encodings, ports and passwords you wish to use for "
"connecting to IRC servers"
msgstr ""
"Insira o nome de usuário, codificações, portas e senhas que vocêdeseja para "
"usar nos servidores IRC"
#: mod_irc/mod_irc.erl:576 mod_irc/mod_irc_odbc.erl:585
msgid "IRC Username"
msgstr "Usuário IRC"
#: mod_irc/mod_irc.erl:586 mod_irc/mod_irc_odbc.erl:595
msgid ""
"If you want to specify different ports, passwords, encodings for IRC "
"servers, fill this list with values in format '{\"irc server\", \"encoding"
"\", port, \"password\"}'. By default this service use \"~s\" encoding, port "
"~p, empty password."
msgstr ""
"Se você deseja especificar portas diferentes, senhas ou codifações para "
"servidores de IRC, complete esta lista com os valores no formato: "
"'{\"servidor IRC\", \"codificação\", porta, \"senha\"}'. Por padrão, este "
"serviço usa a codificação \"~s\", porta \"~p\", e senha em branco (vazia)"
#: mod_irc/mod_irc.erl:598 mod_irc/mod_irc_odbc.erl:607
msgid ""
"Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef."
"net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."
msgstr ""
"Exemplo: [{\"irc.teste.net\", \"koi8-r\"}, 6667, \"senha\"}, {\"dominio.foo."
"net\", \"iso8859-1\", 7000}, {\"irc.servidordeteste.net\", \"utf-8\"}]."
#: mod_irc/mod_irc.erl:603 mod_irc/mod_irc_odbc.erl:612
msgid "Connections parameters"
msgstr "Parâmetros para as Conexões"
#: mod_irc/mod_irc.erl:728 mod_irc/mod_irc_odbc.erl:757
msgid "Join IRC channel"
msgstr "Juntar-se ao canal IRC"
#: mod_irc/mod_irc.erl:732 mod_irc/mod_irc_odbc.erl:761
msgid "IRC channel (don't put the first #)"
msgstr "Canal IRC (não coloque o #)"
#: mod_irc/mod_irc.erl:737 mod_irc/mod_irc_odbc.erl:766
msgid "IRC server"
msgstr "Servidor IRC"
#: mod_irc/mod_irc.erl:770 mod_irc/mod_irc.erl:774
#: mod_irc/mod_irc_odbc.erl:799 mod_irc/mod_irc_odbc.erl:803
msgid "Join the IRC channel here."
msgstr "Aqui! Juntar-se ao canal IRC."
#: mod_irc/mod_irc.erl:778 mod_irc/mod_irc_odbc.erl:807
msgid "Join the IRC channel in this Jabber ID: ~s"
msgstr "Entrar no canal IRC, neste ID Jabber: ~s"
#: mod_irc/mod_irc.erl:863 mod_irc/mod_irc_odbc.erl:904
msgid "IRC settings"
msgstr "Configurações do IRC"
#: mod_irc/mod_irc.erl:868 mod_irc/mod_irc_odbc.erl:909
msgid ""
"Enter username and encodings you wish to use for connecting to IRC servers. "
"Press 'Next' to get more fields to fill in. Press 'Complete' to save "
"settings."
msgstr ""
"Insira o nome de usuário e codificações que você deseja usar para conectar-"
"se aos servidores de IRC. Depois, presione 'Next' ('Próximo') para exibir "
"mais campos que devem ser preenchidos. Ao final, pressione "
"'Complete' ('Completar') para salvar a configuração."
#: mod_irc/mod_irc.erl:874 mod_irc/mod_irc_odbc.erl:915
msgid "IRC username"
msgstr "Usuário IRC"
#: mod_irc/mod_irc.erl:923 mod_irc/mod_irc_odbc.erl:964
msgid "Password ~b"
msgstr "Senha ~b"
#: mod_irc/mod_irc.erl:928 mod_irc/mod_irc_odbc.erl:969
msgid "Port ~b"
msgstr "Porta ~b"
#: mod_irc/mod_irc.erl:933 mod_irc/mod_irc_odbc.erl:974
msgid "Encoding for server ~b"
msgstr "Codificação para o servidor ~b"
#: mod_irc/mod_irc.erl:942 mod_irc/mod_irc_odbc.erl:983
msgid "Server ~b"
msgstr "Servidor ~b"
#: mod_muc/mod_muc.erl:449 mod_muc/mod_muc_odbc.erl:456
msgid "Only service administrators are allowed to send service messages"
msgstr ""
"Apenas administradores possuem permissão para enviar mensagens de serviço"
#: mod_muc/mod_muc.erl:493 mod_muc/mod_muc_odbc.erl:500
msgid "Room creation is denied by service policy"
msgstr "Se te a denegado criar la sala por política do serviço"
#: mod_muc/mod_muc.erl:500 mod_muc/mod_muc_odbc.erl:507
msgid "Conference room does not exist"
msgstr "La sala de conferencias não existe"
#: mod_muc/mod_muc.erl:582 mod_muc/mod_muc_odbc.erl:595
msgid "Chatrooms"
msgstr "Salas de Chat"
#: mod_muc/mod_muc.erl:712 mod_muc/mod_muc_odbc.erl:729
#, fuzzy
msgid "You need a client that supports x:data to register the nickname"
msgstr ""
"Você precisa de um cliente com suporte de x:data para poder registrar o nick"
#: mod_muc/mod_muc.erl:718 mod_muc/mod_muc_odbc.erl:735
msgid "Nickname Registration at "
msgstr "Registro do apelido em "
#: mod_muc/mod_muc.erl:722 mod_muc/mod_muc_odbc.erl:739
msgid "Enter nickname you want to register"
msgstr "Introduza o apelido que quer registrar"
#: mod_muc/mod_muc.erl:723 mod_muc/mod_muc_odbc.erl:740
#: mod_muc/mod_muc_room.erl:3810 mod_roster.erl:944 mod_roster_odbc.erl:1061
#: mod_vcard.erl:364 mod_vcard.erl:477 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:453
msgid "Nickname"
msgstr "Apelido"
#: mod_muc/mod_muc.erl:762 mod_muc/mod_muc_odbc.erl:784
#: mod_muc/mod_muc_room.erl:1064 mod_muc/mod_muc_room.erl:1787
msgid "That nickname is registered by another person"
msgstr "O nick já está registrado por outra pessoa"
#: mod_muc/mod_muc.erl:788 mod_muc/mod_muc_odbc.erl:811
msgid "You must fill in field \"Nickname\" in the form"
msgstr "Você deve completar o campo \"Apelido\" no formulário"
#: mod_muc/mod_muc.erl:808 mod_muc/mod_muc_odbc.erl:831
msgid "ejabberd MUC module"
msgstr "Módulo de MUC para ejabberd"
#: mod_muc/mod_muc_log.erl:374 mod_muc/mod_muc_log.erl:381
msgid "Chatroom configuration modified"
msgstr "Configuração da sala de bate-papo modificada"
#: mod_muc/mod_muc_log.erl:384
msgid "joins the room"
msgstr "Entrar na sala"
#: mod_muc/mod_muc_log.erl:387 mod_muc/mod_muc_log.erl:390
msgid "leaves the room"
msgstr "Sair da sala"
#: mod_muc/mod_muc_log.erl:393 mod_muc/mod_muc_log.erl:396
msgid "has been banned"
msgstr "foi banido"
#: mod_muc/mod_muc_log.erl:399 mod_muc/mod_muc_log.erl:402
msgid "has been kicked"
msgstr "foi removido"
#: mod_muc/mod_muc_log.erl:405
msgid "has been kicked because of an affiliation change"
msgstr "foi desconectado porque por afiliação inválida"
#: mod_muc/mod_muc_log.erl:408
msgid "has been kicked because the room has been changed to members-only"
msgstr ""
"foi desconectado porque a política da sala mudou, só membros são permitidos"
#: mod_muc/mod_muc_log.erl:411
msgid "has been kicked because of a system shutdown"
msgstr "foi desconectado porque o sistema foi desligado"
#: mod_muc/mod_muc_log.erl:414
msgid "is now known as"
msgstr "é agora conhecido como"
#: mod_muc/mod_muc_log.erl:417 mod_muc/mod_muc_log.erl:688
#: mod_muc/mod_muc_room.erl:2393
msgid " has set the subject to: "
msgstr " a posto o assunto: "
#: mod_muc/mod_muc_log.erl:452
msgid "Chatroom is created"
msgstr "A sala de chat está criada"
#: mod_muc/mod_muc_log.erl:453
msgid "Chatroom is destroyed"
msgstr "A sala de chat está destruída"
#: mod_muc/mod_muc_log.erl:454
msgid "Chatroom is started"
msgstr "A sala de chat está inciada"
#: mod_muc/mod_muc_log.erl:455
msgid "Chatroom is stopped"
msgstr "A sala de chat está parada"
#: mod_muc/mod_muc_log.erl:459
msgid "Monday"
msgstr "Segunda"
#: mod_muc/mod_muc_log.erl:460
msgid "Tuesday"
msgstr "Terça"
#: mod_muc/mod_muc_log.erl:461
msgid "Wednesday"
msgstr "Quarta"
#: mod_muc/mod_muc_log.erl:462
msgid "Thursday"
msgstr "Quinta"
#: mod_muc/mod_muc_log.erl:463
msgid "Friday"
msgstr "Sexta"
#: mod_muc/mod_muc_log.erl:464
msgid "Saturday"
msgstr "Sábado"
#: mod_muc/mod_muc_log.erl:465
msgid "Sunday"
msgstr "Domingo"
#: mod_muc/mod_muc_log.erl:469
msgid "January"
msgstr "Janeiro"
#: mod_muc/mod_muc_log.erl:470
msgid "February"
msgstr "Fevereiro"
#: mod_muc/mod_muc_log.erl:471
msgid "March"
msgstr "Março"
#: mod_muc/mod_muc_log.erl:472
msgid "April"
msgstr "Abril"
#: mod_muc/mod_muc_log.erl:473
msgid "May"
msgstr "Maio"
#: mod_muc/mod_muc_log.erl:474
msgid "June"
msgstr "Junho"
#: mod_muc/mod_muc_log.erl:475
msgid "July"
msgstr "Julho"
#: mod_muc/mod_muc_log.erl:476
msgid "August"
msgstr "Agosto"
#: mod_muc/mod_muc_log.erl:477
msgid "September"
msgstr "Setembro"
#: mod_muc/mod_muc_log.erl:478
msgid "October"
msgstr "Outubro"
#: mod_muc/mod_muc_log.erl:479
msgid "November"
msgstr "Novembro"
#: mod_muc/mod_muc_log.erl:480
msgid "December"
msgstr "Dezembro"
#: mod_muc/mod_muc_log.erl:750
msgid "Room Configuration"
msgstr "Configuração de salas"
#: mod_muc/mod_muc_log.erl:759
msgid "Room Occupants"
msgstr "Número de participantes"
#: mod_muc/mod_muc_room.erl:174
msgid "Traffic rate limit is exceeded"
msgstr "Limite de banda excedido"
#: mod_muc/mod_muc_room.erl:246
msgid ""
"This participant is kicked from the room because he sent an error message"
msgstr ""
"Este participante foi desconectado da sala de chat por ter enviado uma "
"mensagem de erro."
#: mod_muc/mod_muc_room.erl:255
msgid "It is not allowed to send private messages to the conference"
msgstr "Impedir o envio de mensagens privadas para a sala"
#: mod_muc/mod_muc_room.erl:332
msgid "Please, wait for a while before sending new voice request"
msgstr "Por favor, espere antes de enviar uma nova requisição de voz"
#: mod_muc/mod_muc_room.erl:347
msgid "Voice requests are disabled in this conference"
msgstr "Requisições de voz estào desabilitadas nesta conferência"
#: mod_muc/mod_muc_room.erl:364
msgid "Failed to extract JID from your voice request approval"
msgstr "Não foi possível extrair o JID (Jabber ID) da requisição de voz"
#: mod_muc/mod_muc_room.erl:393
msgid "Only moderators can approve voice requests"
msgstr "Somente moderadores podem aprovar requisições de voz"
#: mod_muc/mod_muc_room.erl:408
msgid "Improper message type"
msgstr "Tipo de mensagem incorreto"
#: mod_muc/mod_muc_room.erl:518
msgid ""
"This participant is kicked from the room because he sent an error message to "
"another participant"
msgstr ""
"Este participante foi desconectado da sala de chat por ter enviado uma "
"mensagem de erro para outro usuário."
#: mod_muc/mod_muc_room.erl:531
msgid "It is not allowed to send private messages of type \"groupchat\""
msgstr "No está permitido enviar mensagens privados do tipo \"groupchat\""
#: mod_muc/mod_muc_room.erl:543 mod_muc/mod_muc_room.erl:611
msgid "Recipient is not in the conference room"
msgstr "O receptor não está em la sala de conferencia"
#: mod_muc/mod_muc_room.erl:564 mod_muc/mod_muc_room.erl:585
msgid "It is not allowed to send private messages"
msgstr "Não é permitido enviar mensagens privadas"
#: mod_muc/mod_muc_room.erl:576 mod_muc/mod_muc_room.erl:956
#: mod_muc/mod_muc_room.erl:4040
msgid "Only occupants are allowed to send messages to the conference"
msgstr "Solo os ocupantes podem enviar mensagens a la sala"
#: mod_muc/mod_muc_room.erl:634
msgid "Only occupants are allowed to send queries to the conference"
msgstr "Solo os ocupantes podem enviar consultas a la sala"
#: mod_muc/mod_muc_room.erl:646
msgid "Queries to the conference members are not allowed in this room"
msgstr "Nesta sala não se permite consultas aos membros da sala"
#: mod_muc/mod_muc_room.erl:932
msgid ""
"Only moderators and participants are allowed to change the subject in this "
"room"
msgstr ""
"Somente os moderadores e os participamentes podem alterar o assunto desta "
"sala"
#: mod_muc/mod_muc_room.erl:937
msgid "Only moderators are allowed to change the subject in this room"
msgstr "Somente os moderadores podem alterar o assunto desta sala"
#: mod_muc/mod_muc_room.erl:947
msgid "Visitors are not allowed to send messages to all occupants"
msgstr "Os visitantes não podem enviar mensagens a todos os ocupantes"
#: mod_muc/mod_muc_room.erl:1021
msgid ""
"This participant is kicked from the room because he sent an error presence"
msgstr ""
"Este participante foi desconectado da sala de chat por ter enviado uma "
"notificação errônea de presença."
#: mod_muc/mod_muc_room.erl:1040
msgid "Visitors are not allowed to change their nicknames in this room"
msgstr "Nesta sala, os visitantes não pode mudar seus apelidos"
#: mod_muc/mod_muc_room.erl:1053 mod_muc/mod_muc_room.erl:1779
msgid "That nickname is already in use by another occupant"
msgstr "O apelido (nick) já está sendo utilizado"
#: mod_muc/mod_muc_room.erl:1768
msgid "You have been banned from this room"
msgstr "As sido bloqueado em esta sala"
#: mod_muc/mod_muc_room.erl:1771
msgid "Membership is required to enter this room"
msgstr "Necessitas ser membro de esta sala para poder entrar"
#: mod_muc/mod_muc_room.erl:1807
msgid "This room is not anonymous"
msgstr "Essa sala não é anônima"
#: mod_muc/mod_muc_room.erl:1833
msgid "A password is required to enter this room"
msgstr "Se necessita senha para entrar em esta sala"
#: mod_muc/mod_muc_room.erl:1855 mod_register.erl:246
msgid "Too many CAPTCHA requests"
msgstr "Número excessivo de requisições para o CAPTCHA"
#: mod_muc/mod_muc_room.erl:1864 mod_register.erl:251
msgid "Unable to generate a CAPTCHA"
msgstr "Impossível gerar um CAPTCHA"
#: mod_muc/mod_muc_room.erl:1874
msgid "Incorrect password"
msgstr "Senha incorreta"
#: mod_muc/mod_muc_room.erl:2448
msgid "Administrator privileges required"
msgstr "Se necessita privilégios de administrador"
#: mod_muc/mod_muc_room.erl:2463
msgid "Moderator privileges required"
msgstr "Se necessita privilégios de moderador"
#: mod_muc/mod_muc_room.erl:2619
msgid "Jabber ID ~s is invalid"
msgstr "O Jabber ID ~s não es válido"
#: mod_muc/mod_muc_room.erl:2633
msgid "Nickname ~s does not exist in the room"
msgstr "O nick ~s não existe em la sala"
#: mod_muc/mod_muc_room.erl:2659 mod_muc/mod_muc_room.erl:3049
msgid "Invalid affiliation: ~s"
msgstr "Afiliação não válida: ~s"
#: mod_muc/mod_muc_room.erl:2713
msgid "Invalid role: ~s"
msgstr "Cargo (role) é não válido: ~s"
#: mod_muc/mod_muc_room.erl:3026 mod_muc/mod_muc_room.erl:3062
msgid "Owner privileges required"
msgstr "Se requere privilégios de proprietário da sala"
#: mod_muc/mod_muc_room.erl:3195
msgid "Configuration of room ~s"
msgstr "Configuração para ~s"
#: mod_muc/mod_muc_room.erl:3200
msgid "Room title"
msgstr "Título da sala"
#: mod_muc/mod_muc_room.erl:3203 mod_muc/mod_muc_room.erl:3692
msgid "Room description"
msgstr "Descrição da Sala"
#: mod_muc/mod_muc_room.erl:3210
msgid "Make room persistent"
msgstr "Tornar sala persistente"
#: mod_muc/mod_muc_room.erl:3215
msgid "Make room public searchable"
msgstr "Tornar sala pública possível de ser encontrada"
#: mod_muc/mod_muc_room.erl:3218
msgid "Make participants list public"
msgstr "Tornar pública a lista de participantes"
#: mod_muc/mod_muc_room.erl:3221
msgid "Make room password protected"
msgstr "Tornar protegida a senha da sala"
#: mod_muc/mod_muc_room.erl:3232
msgid "Maximum Number of Occupants"
msgstr "Número máximo de participantes"
#: mod_muc/mod_muc_room.erl:3239
msgid "No limit"
msgstr "Ilimitado"
#: mod_muc/mod_muc_room.erl:3250
msgid "Present real Jabber IDs to"
msgstr "Tornar o Jabber ID real visível por"
#: mod_muc/mod_muc_room.erl:3258 mod_muc/mod_muc_room.erl:3292
msgid "moderators only"
msgstr "apenas moderadores"
#: mod_muc/mod_muc_room.erl:3260 mod_muc/mod_muc_room.erl:3294
msgid "anyone"
msgstr "qualquer um"
#: mod_muc/mod_muc_room.erl:3262
msgid "Make room members-only"
msgstr "Tornar sala apenas para membros"
#: mod_muc/mod_muc_room.erl:3265
msgid "Make room moderated"
msgstr "Tornar a sala moderada"
#: mod_muc/mod_muc_room.erl:3268
msgid "Default users as participants"
msgstr "Usuários padrões como participantes"
#: mod_muc/mod_muc_room.erl:3271
msgid "Allow users to change the subject"
msgstr "Permitir a usuários modificar o assunto"
#: mod_muc/mod_muc_room.erl:3274
msgid "Allow users to send private messages"
msgstr "Permitir a usuários enviarem mensagens privadas"
#: mod_muc/mod_muc_room.erl:3279
#, fuzzy
msgid "Allow visitors to send private messages to"
msgstr "Permitir a usuários enviarem mensagens privadas"
#: mod_muc/mod_muc_room.erl:3290
msgid "nobody"
msgstr "ninguém"
#: mod_muc/mod_muc_room.erl:3296
msgid "Allow users to query other users"
msgstr "Permitir a usuários pesquisar informações sobre os demais"
#: mod_muc/mod_muc_room.erl:3299
msgid "Allow users to send invites"
msgstr "Permitir a usuários envio de convites"
#: mod_muc/mod_muc_room.erl:3302
msgid "Allow visitors to send status text in presence updates"
msgstr "Permitir atualizações de status aos visitantes"
#: mod_muc/mod_muc_room.erl:3305
msgid "Allow visitors to change nickname"
msgstr "Permitir mudança de apelido aos visitantes"
#: mod_muc/mod_muc_room.erl:3308
#, fuzzy
msgid "Allow visitors to send voice requests"
msgstr "Permitir a usuários envio de convites"
#: mod_muc/mod_muc_room.erl:3311
msgid "Minimum interval between voice requests (in seconds)"
msgstr "O intervalo mínimo entre requisições de voz (em segundos)"
#: mod_muc/mod_muc_room.erl:3317
msgid "Make room CAPTCHA protected"
msgstr "Tornar protegida a senha da sala"
#: mod_muc/mod_muc_room.erl:3322
msgid "Exclude Jabber IDs from CAPTCHA challenge"
msgstr "Excluir IDs Jabber de serem submetidos ao CAPTCHA"
#: mod_muc/mod_muc_room.erl:3329
msgid "Enable logging"
msgstr "Permitir criação de logs"
#: mod_muc/mod_muc_room.erl:3337
msgid "You need an x:data capable client to configure room"
msgstr "Necessitas um cliente com suporte de x:data para configurar la sala"
#: mod_muc/mod_muc_room.erl:3694
msgid "Number of occupants"
msgstr "Número de participantes"
#: mod_muc/mod_muc_room.erl:3750
msgid "private, "
msgstr "privado, "
#: mod_muc/mod_muc_room.erl:3799
msgid "Voice request"
msgstr "Requisição de voz"
#: mod_muc/mod_muc_room.erl:3803
msgid "Either approve or decline the voice request."
msgstr "Você deve aprovar/desaprovar a requisição de voz."
#: mod_muc/mod_muc_room.erl:3809
#, fuzzy
msgid "User JID"
msgstr "Usuário "
#: mod_muc/mod_muc_room.erl:3811
msgid "Grant voice to this person?"
msgstr ""
#: mod_muc/mod_muc_room.erl:3960
msgid "~s invites you to the room ~s"
msgstr "~s convidou você para a sala ~s"
#: mod_muc/mod_muc_room.erl:3969
msgid "the password is"
msgstr "a senha é"
#: mod_offline.erl:510 mod_offline_odbc.erl:352
msgid ""
"Your contact offline message queue is full. The message has been discarded."
msgstr "Sua fila de mensagens offline esta cheia. Sua mensagem foi descartada"
#: mod_offline.erl:560 mod_offline_odbc.erl:408
msgid "~s's Offline Messages Queue"
msgstr "~s's Fila de Mensagens Offline"
#: mod_offline.erl:563 mod_offline_odbc.erl:411 mod_roster.erl:987
#: mod_roster_odbc.erl:1104 mod_shared_roster.erl:901
#: mod_shared_roster.erl:1010 mod_shared_roster_odbc.erl:930
#: mod_shared_roster_odbc.erl:1039 web/ejabberd_web_admin.erl:833
#: web/ejabberd_web_admin.erl:874 web/ejabberd_web_admin.erl:942
#: web/ejabberd_web_admin.erl:978 web/ejabberd_web_admin.erl:1019
#: web/ejabberd_web_admin.erl:1508 web/ejabberd_web_admin.erl:1760
#: web/ejabberd_web_admin.erl:1931 web/ejabberd_web_admin.erl:1963
#: web/ejabberd_web_admin.erl:2031 web/ejabberd_web_admin.erl:2135
#: web/ejabberd_web_admin.erl:2160 web/ejabberd_web_admin.erl:2248
msgid "Submitted"
msgstr "Submetido"
#: mod_offline.erl:571
msgid "Time"
msgstr "Fecha"
#: mod_offline.erl:572
msgid "From"
msgstr "De"
#: mod_offline.erl:573
msgid "To"
msgstr "Para"
#: mod_offline.erl:574 mod_offline_odbc.erl:419
msgid "Packet"
msgstr "Pacote"
#: mod_offline.erl:587 mod_offline_odbc.erl:432 mod_shared_roster.erl:908
#: mod_shared_roster_odbc.erl:937 web/ejabberd_web_admin.erl:882
#: web/ejabberd_web_admin.erl:986
msgid "Delete Selected"
msgstr "Remover os selecionados"
#: mod_offline.erl:645 mod_offline_odbc.erl:519
msgid "Offline Messages:"
msgstr "Mensagens offline"
#: mod_offline.erl:645 mod_offline_odbc.erl:519
msgid "Remove All Offline Messages"
msgstr "Remover Todas as Mensagens Offline"
#: mod_proxy65/mod_proxy65_service.erl:213
msgid "ejabberd SOCKS5 Bytestreams module"
msgstr "Modulo ejabberd SOCKS5 Bytestreams"
#: mod_pubsub/mod_pubsub.erl:1120 mod_pubsub/mod_pubsub_odbc.erl:929
msgid "Publish-Subscribe"
msgstr "Publicação de Tópico"
#: mod_pubsub/mod_pubsub.erl:1214 mod_pubsub/mod_pubsub_odbc.erl:1025
msgid "ejabberd Publish-Subscribe module"
msgstr "Módulo para Publicar Tópicos do ejabberd"
#: mod_pubsub/mod_pubsub.erl:1497 mod_pubsub/mod_pubsub_odbc.erl:1312
msgid "PubSub subscriber request"
msgstr "PubSub requisição de assinante"
#: mod_pubsub/mod_pubsub.erl:1499 mod_pubsub/mod_pubsub_odbc.erl:1314
msgid "Choose whether to approve this entity's subscription."
msgstr "Aprovar esta assinatura."
#: mod_pubsub/mod_pubsub.erl:1505 mod_pubsub/mod_pubsub_odbc.erl:1320
msgid "Node ID"
msgstr "ID do Tópico"
#: mod_pubsub/mod_pubsub.erl:1510 mod_pubsub/mod_pubsub_odbc.erl:1325
msgid "Subscriber Address"
msgstr "Endereço dos Assinantes"
#: mod_pubsub/mod_pubsub.erl:1516 mod_pubsub/mod_pubsub_odbc.erl:1331
msgid "Allow this Jabber ID to subscribe to this pubsub node?"
msgstr "Autorizar este Jabber ID para a inscrição neste tópico pubsub?"
#: mod_pubsub/mod_pubsub.erl:3474 mod_pubsub/mod_pubsub_odbc.erl:3287
msgid "Deliver payloads with event notifications"
msgstr "Enviar payloads junto com as notificações de eventos"
#: mod_pubsub/mod_pubsub.erl:3475 mod_pubsub/mod_pubsub_odbc.erl:3288
msgid "Deliver event notifications"
msgstr "Entregar as notificações de evento"
#: mod_pubsub/mod_pubsub.erl:3476 mod_pubsub/mod_pubsub_odbc.erl:3289
msgid "Notify subscribers when the node configuration changes"
msgstr "Notificar subscritores quando cambia la configuração do nodo"
#: mod_pubsub/mod_pubsub.erl:3477 mod_pubsub/mod_pubsub_odbc.erl:3290
msgid "Notify subscribers when the node is deleted"
msgstr "Notificar subscritores quando o nodo se elimine"
#: mod_pubsub/mod_pubsub.erl:3478 mod_pubsub/mod_pubsub_odbc.erl:3291
msgid "Notify subscribers when items are removed from the node"
msgstr "Notificar subscritores quando os elementos se eliminem do nodo"
#: mod_pubsub/mod_pubsub.erl:3479 mod_pubsub/mod_pubsub_odbc.erl:3292
msgid "Persist items to storage"
msgstr "Persistir elementos ao armazenar"
#: mod_pubsub/mod_pubsub.erl:3480 mod_pubsub/mod_pubsub_odbc.erl:3293
msgid "A friendly name for the node"
msgstr "Um nome familiar para o nó"
#: mod_pubsub/mod_pubsub.erl:3481 mod_pubsub/mod_pubsub_odbc.erl:3294
msgid "Max # of items to persist"
msgstr "Máximo # de elementos que persistem"
#: mod_pubsub/mod_pubsub.erl:3482 mod_pubsub/mod_pubsub_odbc.erl:3295
msgid "Whether to allow subscriptions"
msgstr "Permitir subscrições"
#: mod_pubsub/mod_pubsub.erl:3483 mod_pubsub/mod_pubsub_odbc.erl:3296
msgid "Specify the access model"
msgstr "Especificar os modelos de acesso"
#: mod_pubsub/mod_pubsub.erl:3486 mod_pubsub/mod_pubsub_odbc.erl:3299
msgid "Roster groups allowed to subscribe"
msgstr "Listar grupos autorizados"
#: mod_pubsub/mod_pubsub.erl:3487 mod_pubsub/mod_pubsub_odbc.erl:3300
msgid "Specify the publisher model"
msgstr "Especificar o modelo do publicante"
#: mod_pubsub/mod_pubsub.erl:3489 mod_pubsub/mod_pubsub_odbc.erl:3302
msgid "Purge all items when the relevant publisher goes offline"
msgstr "Descartar todos os itens quando o publicante principal estiver offline"
#: mod_pubsub/mod_pubsub.erl:3490 mod_pubsub/mod_pubsub_odbc.erl:3303
msgid "Specify the event message type"
msgstr "Especificar o tipo de mensagem para o evento"
#: mod_pubsub/mod_pubsub.erl:3492 mod_pubsub/mod_pubsub_odbc.erl:3305
msgid "Max payload size in bytes"
msgstr "Máximo tamanho do payload em bytes"
#: mod_pubsub/mod_pubsub.erl:3493 mod_pubsub/mod_pubsub_odbc.erl:3306
msgid "When to send the last published item"
msgstr "Quando enviar o último tópico publicado"
#: mod_pubsub/mod_pubsub.erl:3495 mod_pubsub/mod_pubsub_odbc.erl:3308
msgid "Only deliver notifications to available users"
msgstr "Solo enviar notificações aos usuários disponíveis"
#: mod_pubsub/mod_pubsub.erl:3496 mod_pubsub/mod_pubsub_odbc.erl:3309
msgid "The collections with which a node is affiliated"
msgstr "As coleções com as quais o nó está relacionado"
#: mod_register.erl:193
msgid "The CAPTCHA verification has failed"
msgstr "A verificação do CAPTCHA falhou"
#: mod_register.erl:220
#, fuzzy
msgid "You need a client that supports x:data and CAPTCHA to register"
msgstr ""
"Você precisa de um cliente com suporte de x:data para poder registrar o nick"
#: mod_register.erl:226 mod_register.erl:265
msgid "Choose a username and password to register with this server"
msgstr "Escolha um nome de usuário e senha para registrar-se neste servidor"
#: mod_register.erl:230 mod_vcard.erl:364 mod_vcard_odbc.erl:342
#: web/ejabberd_web_admin.erl:1515 web/ejabberd_web_admin.erl:1572
msgid "User"
msgstr "Usuário"
#: mod_register.erl:316 mod_register.erl:361
#, fuzzy
msgid "The password is too weak"
msgstr "Senha considerada fraca'"
#: mod_register.erl:365
msgid "Users are not allowed to register accounts so quickly"
msgstr "Usuários não estão autorizados a registrar contas imediatamente"
#: mod_roster.erl:938 mod_roster_odbc.erl:1055 web/ejabberd_web_admin.erl:1701
#: web/ejabberd_web_admin.erl:1886 web/ejabberd_web_admin.erl:1897
#: web/ejabberd_web_admin.erl:2219
msgid "None"
msgstr "Nenhum"
#: mod_roster.erl:945 mod_roster_odbc.erl:1062
msgid "Subscription"
msgstr "Subscrição"
#: mod_roster.erl:946 mod_roster_odbc.erl:1063
msgid "Pending"
msgstr "Pendente"
#: mod_roster.erl:947 mod_roster_odbc.erl:1064
msgid "Groups"
msgstr "Grupos"
#: mod_roster.erl:974 mod_roster_odbc.erl:1091
msgid "Validate"
msgstr "Validar"
#: mod_roster.erl:982 mod_roster_odbc.erl:1099
msgid "Remove"
msgstr "Remover"
#: mod_roster.erl:985 mod_roster_odbc.erl:1102
msgid "Roster of "
msgstr "Lista de contatos de "
#: mod_roster.erl:988 mod_roster_odbc.erl:1105 mod_shared_roster.erl:902
#: mod_shared_roster.erl:1011 mod_shared_roster_odbc.erl:931
#: mod_shared_roster_odbc.erl:1040 web/ejabberd_web_admin.erl:834
#: web/ejabberd_web_admin.erl:875 web/ejabberd_web_admin.erl:943
#: web/ejabberd_web_admin.erl:979 web/ejabberd_web_admin.erl:1020
#: web/ejabberd_web_admin.erl:1509 web/ejabberd_web_admin.erl:1761
#: web/ejabberd_web_admin.erl:1932 web/ejabberd_web_admin.erl:2136
#: web/ejabberd_web_admin.erl:2161
msgid "Bad format"
msgstr "Formato incorreto"
#: mod_roster.erl:995 mod_roster_odbc.erl:1112
msgid "Add Jabber ID"
msgstr "Adicionar ID jabber"
#: mod_roster.erl:1094 mod_roster_odbc.erl:1211
msgid "Roster"
msgstr "Lista de contatos"
#: mod_shared_roster.erl:857 mod_shared_roster.erl:899
#: mod_shared_roster.erl:1007 mod_shared_roster_odbc.erl:886
#: mod_shared_roster_odbc.erl:928 mod_shared_roster_odbc.erl:1036
msgid "Shared Roster Groups"
msgstr "Grupos Shared Roster"
#: mod_shared_roster.erl:895 mod_shared_roster_odbc.erl:924
#: web/ejabberd_web_admin.erl:1365 web/ejabberd_web_admin.erl:2461
msgid "Add New"
msgstr "Adicionar novo"
#: mod_shared_roster.erl:978 mod_shared_roster_odbc.erl:1007
msgid "Name:"
msgstr "Nome:"
#: mod_shared_roster.erl:983 mod_shared_roster_odbc.erl:1012
msgid "Description:"
msgstr "Descrição:"
#: mod_shared_roster.erl:991 mod_shared_roster_odbc.erl:1020
msgid "Members:"
msgstr "Miembros:"
#: mod_shared_roster.erl:999 mod_shared_roster_odbc.erl:1028
#, fuzzy
msgid "Displayed Groups:"
msgstr "Grupos Indicados:"
#: mod_shared_roster.erl:1008 mod_shared_roster_odbc.erl:1037
msgid "Group "
msgstr "Grupo "
#: mod_shared_roster.erl:1017 mod_shared_roster_odbc.erl:1046
#: web/ejabberd_web_admin.erl:840 web/ejabberd_web_admin.erl:884
#: web/ejabberd_web_admin.erl:949 web/ejabberd_web_admin.erl:1026
#: web/ejabberd_web_admin.erl:2017
msgid "Submit"
msgstr "Enviar"
#: mod_vcard.erl:165 mod_vcard_ldap.erl:238 mod_vcard_odbc.erl:129
msgid "Erlang Jabber Server"
msgstr "Servidor Jabber em Erlang"
#: mod_vcard.erl:364 mod_vcard.erl:478 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:454
msgid "Birthday"
msgstr "Aniversário"
#: mod_vcard.erl:364 mod_vcard.erl:480 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:456
msgid "City"
msgstr "Cidade"
#: mod_vcard.erl:364 mod_vcard.erl:479 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:455
msgid "Country"
msgstr "País"
#: mod_vcard.erl:364 mod_vcard.erl:481 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:457
msgid "Email"
msgstr "Email"
#: mod_vcard.erl:364 mod_vcard.erl:476 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:452
msgid "Family Name"
msgstr "Sobrenome"
#: mod_vcard.erl:364 mod_vcard_odbc.erl:342
msgid ""
"Fill in the form to search for any matching Jabber User (Add * to the end of "
"field to match substring)"
msgstr ""
"Preencha o formulário para buscar usuários Jabber. Agrega * ao final de um "
"campo para buscar sub-palavras."
#: mod_vcard.erl:364 mod_vcard.erl:473 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:449
msgid "Full Name"
msgstr "Nome completo"
#: mod_vcard.erl:364 mod_vcard.erl:475 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:451
msgid "Middle Name"
msgstr "Nome do meio"
#: mod_vcard.erl:364 mod_vcard.erl:474 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:450 web/ejabberd_web_admin.erl:2006
msgid "Name"
msgstr "Nome"
#: mod_vcard.erl:364 mod_vcard.erl:482 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:458
msgid "Organization Name"
msgstr "Nome da organização"
#: mod_vcard.erl:364 mod_vcard.erl:483 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:459
msgid "Organization Unit"
msgstr "Departamento/Unidade"
#: mod_vcard.erl:364 mod_vcard_ldap.erl:462 mod_vcard_odbc.erl:342
msgid "Search users in "
msgstr "Procurar usuários em "
#: mod_vcard.erl:364 mod_vcard_ldap.erl:462 mod_vcard_odbc.erl:342
msgid "You need an x:data capable client to search"
msgstr "Necessitas um cliente com suporte de x:data para poder buscar"
#: mod_vcard.erl:389 mod_vcard_ldap.erl:487 mod_vcard_odbc.erl:367
msgid "vCard User Search"
msgstr "Busca de Usuário vCard"
#: mod_vcard.erl:445 mod_vcard_ldap.erl:541 mod_vcard_odbc.erl:421
msgid "ejabberd vCard module"
msgstr "Módulo vCard para ejabberd"
#: mod_vcard.erl:469 mod_vcard_ldap.erl:551 mod_vcard_odbc.erl:445
msgid "Search Results for "
msgstr "Resultados de pesquisa para "
#: mod_vcard_ldap.erl:462
msgid "Fill in fields to search for any matching Jabber User"
msgstr "Preencha campos para buscar usuários Jabber que concordem"
#: web/ejabberd_web_admin.erl:193 web/ejabberd_web_admin.erl:203
#: web/ejabberd_web_admin.erl:219 web/ejabberd_web_admin.erl:229
msgid "Unauthorized"
msgstr "Não Autorizado"
#: web/ejabberd_web_admin.erl:286 web/ejabberd_web_admin.erl:303
msgid "ejabberd Web Admin"
msgstr "ejabberd Web Admin"
#: web/ejabberd_web_admin.erl:769 web/ejabberd_web_admin.erl:780
msgid "Administration"
msgstr "Administração"
#: web/ejabberd_web_admin.erl:878 web/ejabberd_web_admin.erl:982
msgid "Raw"
msgstr "Intocado"
#: web/ejabberd_web_admin.erl:1017
msgid "~s access rule configuration"
msgstr "Configuração da Regra de Acesso ~s"
#: web/ejabberd_web_admin.erl:1035
msgid "Virtual Hosts"
msgstr "Hosts virtuais"
#: web/ejabberd_web_admin.erl:1043 web/ejabberd_web_admin.erl:1050
msgid "Users"
msgstr "Usuários"
#: web/ejabberd_web_admin.erl:1078
msgid "Users Last Activity"
msgstr "Ultimas atividades dos usuários"
#: web/ejabberd_web_admin.erl:1080
msgid "Period: "
msgstr "Período: "
#: web/ejabberd_web_admin.erl:1090
msgid "Last month"
msgstr "Último mês"
#: web/ejabberd_web_admin.erl:1091
msgid "Last year"
msgstr "Último ano"
#: web/ejabberd_web_admin.erl:1092
msgid "All activity"
msgstr "Todas atividades"
#: web/ejabberd_web_admin.erl:1094
msgid "Show Ordinary Table"
msgstr "Mostrar Tabela Ordinária"
#: web/ejabberd_web_admin.erl:1096
msgid "Show Integral Table"
msgstr "Mostrar Tabela Integral"
#: web/ejabberd_web_admin.erl:1105 web/ejabberd_web_admin.erl:1939
msgid "Statistics"
msgstr "Estatísticas"
#: web/ejabberd_web_admin.erl:1117
msgid "Not Found"
msgstr "Não encontrado"
#: web/ejabberd_web_admin.erl:1134
msgid "Node not found"
msgstr "Nó não encontrado"
#: web/ejabberd_web_admin.erl:1460
msgid "Host"
msgstr "Máquina"
#: web/ejabberd_web_admin.erl:1461
msgid "Registered Users"
msgstr "Usuários Registrados"
#: web/ejabberd_web_admin.erl:1573
msgid "Offline Messages"
msgstr "Mensagens offline"
#: web/ejabberd_web_admin.erl:1574 web/ejabberd_web_admin.erl:1767
msgid "Last Activity"
msgstr "Última atividade"
#: web/ejabberd_web_admin.erl:1659 web/ejabberd_web_admin.erl:1675
msgid "Registered Users:"
msgstr "Usuários registrados"
#: web/ejabberd_web_admin.erl:1661 web/ejabberd_web_admin.erl:1677
#: web/ejabberd_web_admin.erl:2192
msgid "Online Users:"
msgstr "Usuários online"
#: web/ejabberd_web_admin.erl:1663
msgid "Outgoing s2s Connections:"
msgstr "Conexões que partem de s2s"
#: web/ejabberd_web_admin.erl:1665
msgid "Outgoing s2s Servers:"
msgstr "Servidores que partem de s2s"
#: web/ejabberd_web_admin.erl:1734 web/mod_register_web.erl:175
#: web/mod_register_web.erl:372 web/mod_register_web.erl:381
#: web/mod_register_web.erl:411
msgid "Change Password"
msgstr "Mudar senha"
#: web/ejabberd_web_admin.erl:1758
msgid "User "
msgstr "Usuário "
#: web/ejabberd_web_admin.erl:1765
msgid "Connected Resources:"
msgstr "Recursos conectados:"
#: web/ejabberd_web_admin.erl:1766 web/mod_register_web.erl:227
#: web/mod_register_web.erl:519
msgid "Password:"
msgstr "Senha:"
#: web/ejabberd_web_admin.erl:1828
msgid "No Data"
msgstr "Nenhum dado"
#: web/ejabberd_web_admin.erl:1906
msgid "Nodes"
msgstr "Nós"
#: web/ejabberd_web_admin.erl:1929 web/ejabberd_web_admin.erl:1951
msgid "Node "
msgstr "Nó"
#: web/ejabberd_web_admin.erl:1938
msgid "Listened Ports"
msgstr "Portas escutadas"
#: web/ejabberd_web_admin.erl:1940 web/ejabberd_web_admin.erl:2260
#: web/ejabberd_web_admin.erl:2448
msgid "Update"
msgstr "Atualizar"
#: web/ejabberd_web_admin.erl:1943 web/ejabberd_web_admin.erl:2569
msgid "Restart"
msgstr "Reiniciar"
#: web/ejabberd_web_admin.erl:1945 web/ejabberd_web_admin.erl:2571
msgid "Stop"
msgstr "Parar"
#: web/ejabberd_web_admin.erl:1959
msgid "RPC Call Error"
msgstr "Erro de chamada RPC"
#: web/ejabberd_web_admin.erl:2000
msgid "Database Tables at "
msgstr "Tabelas de base de dados em "
#: web/ejabberd_web_admin.erl:2007
msgid "Storage Type"
msgstr "Tipo de armazenamento"
#: web/ejabberd_web_admin.erl:2008
msgid "Elements"
msgstr "Elementos"
#: web/ejabberd_web_admin.erl:2009
msgid "Memory"
msgstr "Memória"
#: web/ejabberd_web_admin.erl:2032 web/ejabberd_web_admin.erl:2137
msgid "Error"
msgstr "Erro"
#: web/ejabberd_web_admin.erl:2034
msgid "Backup of "
msgstr "Backup de "
#: web/ejabberd_web_admin.erl:2036
msgid ""
"Please note that these options will only backup the builtin Mnesia database. "
"If you are using the ODBC module, you also need to backup your SQL database "
"separately."
msgstr ""
"Observe que tais opções farão backup apenas da base de dados Mnesia. Caso "
"você esteja utilizando o modulo ODBC, você precisará fazer backup de sua "
"base de dados SQL separadamente."
#: web/ejabberd_web_admin.erl:2041
msgid "Store binary backup:"
msgstr "Armazenar backup binário:"
#: web/ejabberd_web_admin.erl:2045 web/ejabberd_web_admin.erl:2052
#: web/ejabberd_web_admin.erl:2060 web/ejabberd_web_admin.erl:2067
#: web/ejabberd_web_admin.erl:2074 web/ejabberd_web_admin.erl:2081
#: web/ejabberd_web_admin.erl:2088 web/ejabberd_web_admin.erl:2096
#: web/ejabberd_web_admin.erl:2103 web/ejabberd_web_admin.erl:2110
msgid "OK"
msgstr "OK"
#: web/ejabberd_web_admin.erl:2048
msgid "Restore binary backup immediately:"
msgstr "Restaurar backup binário imediatamente"
#: web/ejabberd_web_admin.erl:2056
msgid ""
"Restore binary backup after next ejabberd restart (requires less memory):"
msgstr ""
"Restaurar backup binário após próximo reinicialização do ejabberd (requer "
"menos memória):"
#: web/ejabberd_web_admin.erl:2063
msgid "Store plain text backup:"
msgstr "Armazenar backup em texto:"
#: web/ejabberd_web_admin.erl:2070
msgid "Restore plain text backup immediately:"
msgstr "Restaurar backup formato texto imediatamente:"
#: web/ejabberd_web_admin.erl:2077
msgid "Import users data from a PIEFXIS file (XEP-0227):"
msgstr "Importar usuários de um arquivo PIEFXIS (XEP-0227): "
#: web/ejabberd_web_admin.erl:2084
msgid "Export data of all users in the server to PIEFXIS files (XEP-0227):"
msgstr ""
"Exportar todos os dados de todos os usuários no servidor, para arquivos "
"formato PIEFXIS (XEP-0227):"
#: web/ejabberd_web_admin.erl:2091
msgid "Export data of users in a host to PIEFXIS files (XEP-0227):"
msgstr ""
"Exportar dados dos usuários em um host, para arquivos PIEFXIS (XEP-0227):"
#: web/ejabberd_web_admin.erl:2099
msgid "Import user data from jabberd14 spool file:"
msgstr "Importar dados dos usuários de uma fila jabberd14:"
#: web/ejabberd_web_admin.erl:2106
msgid "Import users data from jabberd14 spool directory:"
msgstr "Importar dados dos usuários de um diretório-fila jabberd14:"
#: web/ejabberd_web_admin.erl:2132
msgid "Listened Ports at "
msgstr "Portas ouvintes em "
#: web/ejabberd_web_admin.erl:2157
msgid "Modules at "
msgstr "Módulos em "
#: web/ejabberd_web_admin.erl:2183
msgid "Statistics of ~p"
msgstr "Estatísticas de ~p"
#: web/ejabberd_web_admin.erl:2186
msgid "Uptime:"
msgstr "Uptime:"
#: web/ejabberd_web_admin.erl:2189
msgid "CPU Time:"
msgstr "Tempo de CPU"
#: web/ejabberd_web_admin.erl:2195
msgid "Transactions Committed:"
msgstr "Transações salvas:"
#: web/ejabberd_web_admin.erl:2198
msgid "Transactions Aborted:"
msgstr "Transações abortadas:"
#: web/ejabberd_web_admin.erl:2201
msgid "Transactions Restarted:"
msgstr "Transações reiniciadas:"
#: web/ejabberd_web_admin.erl:2204
msgid "Transactions Logged:"
msgstr "Transações de log:"
#: web/ejabberd_web_admin.erl:2246
msgid "Update "
msgstr "Atualizar "
#: web/ejabberd_web_admin.erl:2254
msgid "Update plan"
msgstr "Plano de Atualização"
#: web/ejabberd_web_admin.erl:2255
msgid "Modified modules"
msgstr "Módulos atualizados"
#: web/ejabberd_web_admin.erl:2256
msgid "Update script"
msgstr "Script de atualização"
#: web/ejabberd_web_admin.erl:2257
msgid "Low level update script"
msgstr "Script de atualização low level"
#: web/ejabberd_web_admin.erl:2258
msgid "Script check"
msgstr "Verificação de Script"
#: web/ejabberd_web_admin.erl:2426
msgid "Port"
msgstr "Porta"
#: web/ejabberd_web_admin.erl:2427
msgid "IP"
msgstr "IP"
#: web/ejabberd_web_admin.erl:2428
msgid "Protocol"
msgstr "Porta"
#: web/ejabberd_web_admin.erl:2429 web/ejabberd_web_admin.erl:2556
msgid "Module"
msgstr "Módulo"
#: web/ejabberd_web_admin.erl:2430 web/ejabberd_web_admin.erl:2557
msgid "Options"
msgstr "Opções"
#: web/ejabberd_web_admin.erl:2450
msgid "Delete"
msgstr "Eliminar"
#: web/ejabberd_web_admin.erl:2579
msgid "Start"
msgstr "Iniciar"
#: web/mod_register_web.erl:104
msgid "Your Jabber account was successfully created."
msgstr "Sua conta jabber foi criada corretamente."
#: web/mod_register_web.erl:107
msgid "There was an error creating the account: "
msgstr "Houveram erras ao criar esta conta: "
#: web/mod_register_web.erl:115
msgid "Your Jabber account was successfully deleted."
msgstr "Sua conta Jabber foi deletada com sucesso."
#: web/mod_register_web.erl:118
msgid "There was an error deleting the account: "
msgstr "Erro ao deletar esta conta: "
#: web/mod_register_web.erl:128
msgid "The password of your Jabber account was successfully changed."
msgstr "A senha da sua conta Jabber foi mudada com sucesso."
#: web/mod_register_web.erl:131
msgid "There was an error changing the password: "
msgstr "Houveram erros ao mudar a senha: "
#: web/mod_register_web.erl:163 web/mod_register_web.erl:172
msgid "Jabber Account Registration"
msgstr "Registros de Contas Jabber"
#: web/mod_register_web.erl:174 web/mod_register_web.erl:192
#: web/mod_register_web.erl:201
msgid "Register a Jabber account"
msgstr "Registrar uma conta Jabber"
#: web/mod_register_web.erl:176 web/mod_register_web.erl:493
#: web/mod_register_web.erl:502
msgid "Unregister a Jabber account"
msgstr "Deletar conta Jabber"
#: web/mod_register_web.erl:203
msgid ""
"This page allows to create a Jabber account in this Jabber server. Your JID "
"(Jabber IDentifier) will be of the form: username@server. Please read "
"carefully the instructions to fill correctly the fields."
msgstr ""
"Esta pagina aceita criações de novas contas Jabber neste servidor. A sua JID "
"(Identificador Jabber) será da seguinte forma: 'usuário@servidor'. Por "
"favor, leia cuidadosamente as instruções para preencher corretamente os "
"campos."
#: web/mod_register_web.erl:212 web/mod_register_web.erl:386
#: web/mod_register_web.erl:509
#, fuzzy
msgid "Username:"
msgstr "Nome de usuário no IRC"
#: web/mod_register_web.erl:217
msgid "This is case insensitive: macbeth is the same that MacBeth and Macbeth."
msgstr ""
"Não é 'case insensitive': macbeth é o mesmo que MacBeth e ainda Macbeth. "
#: web/mod_register_web.erl:218
msgid "Characters not allowed:"
msgstr "Caracteres não aceitos:"
#: web/mod_register_web.erl:222 web/mod_register_web.erl:391
#: web/mod_register_web.erl:514
#, fuzzy
msgid "Server:"
msgstr "Servidor ~b"
#: web/mod_register_web.erl:232
msgid ""
"Don't tell your password to anybody, not even the administrators of the "
"Jabber server."
msgstr ""
"Não revele o seu computador a ninguém, mesmo para o administrador deste "
"servidor Jabber."
#: web/mod_register_web.erl:234
msgid "You can later change your password using a Jabber client."
msgstr "Mais tarde você pode alterar a sua senha usando um cliente Jabber."
#: web/mod_register_web.erl:235
msgid ""
"Some Jabber clients can store your password in your computer. Use that "
"feature only if you trust your computer is safe."
msgstr ""
"Alguns clientes jabber podem salvar a sua senha no seu computador. Use "
"recurso somente se você considera este computador seguro o suficiente."
#: web/mod_register_web.erl:237
msgid ""
"Memorize your password, or write it in a paper placed in a safe place. In "
"Jabber there isn't an automated way to recover your password if you forget "
"it."
msgstr ""
"Memorize a sua senha, ou escreva-a em um papel e guarde-o em um lugar "
"seguro. Jabber não é uma maneira automatizada para recuperar a sua senha, se "
"você a esquecer eventualmente."
#: web/mod_register_web.erl:242 web/mod_register_web.erl:406
#, fuzzy
msgid "Password Verification:"
msgstr "Verificação de Senha"
#: web/mod_register_web.erl:250
#, fuzzy
msgid "Register"
msgstr "Lista de contatos"
#: web/mod_register_web.erl:396
#, fuzzy
msgid "Old Password:"
msgstr "Senha Antiga:"
#: web/mod_register_web.erl:401
#, fuzzy
msgid "New Password:"
msgstr "Nova Senha:"
#: web/mod_register_web.erl:504
msgid "This page allows to unregister a Jabber account in this Jabber server."
msgstr "Esta página aceita para deletar uma conta Jabber neste servidor."
#: web/mod_register_web.erl:524
msgid "Unregister"
msgstr "Deletar registro"
#, fuzzy
#~ msgid "Captcha test failed"
#~ msgstr "O CAPTCHA é inválido."
ejabberd-2.1.11/src/msgs/sv.po 0000664 0000000 0000000 00000147757 12240230175 012773 0 ustar msgid ""
msgstr ""
"Project-Id-Version: 2.1.0-alpha\n"
"Last-Translator: Gustaf Alströmer\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Language: Swedish (svenska)\n"
"X-Additional-Translator: Thore Alstromer\n"
"X-Additional-Translator: Heysan\n"
"X-Additional-Translator: Magnus Henoch\n"
"X-Additional-Translator: Jonas Ådahl\n"
#: ejabberd_c2s.erl:424 ejabberd_c2s.erl:727
msgid "Use of STARTTLS required"
msgstr "Du måste använda STARTTLS"
#: ejabberd_c2s.erl:503
msgid "No resource provided"
msgstr "Ingen resurs angiven"
#: ejabberd_c2s.erl:1197
msgid "Replaced by new connection"
msgstr "Ersatt av ny anslutning"
#: ejabberd_c2s.erl:1885
msgid "Your active privacy list has denied the routing of this stanza."
msgstr ""
#: ejabberd_captcha.erl:96 ejabberd_captcha.erl:152 ejabberd_captcha.erl:178
msgid "Enter the text you see"
msgstr "Skriv in sökväg till textfil"
#: ejabberd_captcha.erl:101
msgid "Your messages to ~s are being blocked. To unblock them, visit ~s"
msgstr ""
"Dina meddelanden till ~s är blockerade. För att avblockera dem, gå till ~s"
#: ejabberd_captcha.erl:134
msgid "If you don't see the CAPTCHA image here, visit the web page."
msgstr ""
#: ejabberd_captcha.erl:146
msgid "CAPTCHA web page"
msgstr ""
#: ejabberd_captcha.erl:307
msgid "The CAPTCHA is valid."
msgstr "Din CAPTCHA är godkänd."
#: mod_adhoc.erl:95 mod_adhoc.erl:125 mod_adhoc.erl:143 mod_adhoc.erl:161
msgid "Commands"
msgstr "Kommandon"
#: mod_adhoc.erl:149 mod_adhoc.erl:243
msgid "Ping"
msgstr "Ping"
#: mod_adhoc.erl:260
msgid "Pong"
msgstr "Pong"
#: mod_announce.erl:507 mod_announce_odbc.erl:499
msgid "Really delete message of the day?"
msgstr "Verkligen ta bort dagens meddelanden?"
#: mod_announce.erl:515 mod_announce_odbc.erl:507 mod_configure.erl:1083
#: mod_configure.erl:1128
msgid "Subject"
msgstr "Ämne"
#: mod_announce.erl:520 mod_announce_odbc.erl:512 mod_configure.erl:1088
#: mod_configure.erl:1133
msgid "Message body"
msgstr "Meddelande kropp"
#: mod_announce.erl:600 mod_announce_odbc.erl:592
msgid "No body provided for announce message"
msgstr "Ingen kropp behövs för dessa meddelanden"
#: mod_announce.erl:635 mod_announce_odbc.erl:627
msgid "Announcements"
msgstr "Meddelanden"
#: mod_announce.erl:637 mod_announce_odbc.erl:629
msgid "Send announcement to all users"
msgstr "Sänd meddelanden till alla användare"
#: mod_announce.erl:639 mod_announce_odbc.erl:631
msgid "Send announcement to all users on all hosts"
msgstr "Sänd meddelanden till alla användare på alla värdar"
#: mod_announce.erl:641 mod_announce_odbc.erl:633
msgid "Send announcement to all online users"
msgstr "Sänd meddelanden till alla inloggade användare"
#: mod_announce.erl:643 mod_announce_odbc.erl:635 mod_configure.erl:1078
#: mod_configure.erl:1123
msgid "Send announcement to all online users on all hosts"
msgstr "Sänd meddelanden till alla inloggade användare på alla värdar"
#: mod_announce.erl:645 mod_announce_odbc.erl:637
msgid "Set message of the day and send to online users"
msgstr "Sätt dagens status meddelande och skicka till alla användare"
#: mod_announce.erl:647 mod_announce_odbc.erl:639
msgid "Set message of the day on all hosts and send to online users"
msgstr ""
"Sätt dagens status meddelande pa alla värdar och skicka till alla användare"
#: mod_announce.erl:649 mod_announce_odbc.erl:641
msgid "Update message of the day (don't send)"
msgstr "Uppdatera dagens status meddelande (skicka inte)"
#: mod_announce.erl:651 mod_announce_odbc.erl:643
msgid "Update message of the day on all hosts (don't send)"
msgstr "Uppdatera dagens status meddelande på alla värdar (skicka inte)"
#: mod_announce.erl:653 mod_announce_odbc.erl:645
msgid "Delete message of the day"
msgstr "Ta bort dagens meddelande"
#: mod_announce.erl:655 mod_announce_odbc.erl:647
msgid "Delete message of the day on all hosts"
msgstr "Ta bort dagens meddelande på alla värdar"
#: mod_configure.erl:114 mod_configure.erl:274 mod_configure.erl:296
#: mod_configure.erl:498
msgid "Configuration"
msgstr "Konfiguration"
#: mod_configure.erl:125 mod_configure.erl:576 web/ejabberd_web_admin.erl:1936
msgid "Database"
msgstr "Databas"
#: mod_configure.erl:127 mod_configure.erl:595
msgid "Start Modules"
msgstr "Starta moduler"
#: mod_configure.erl:129 mod_configure.erl:596
msgid "Stop Modules"
msgstr "Stanna moduler"
#: mod_configure.erl:131 mod_configure.erl:604 web/ejabberd_web_admin.erl:1937
msgid "Backup"
msgstr "Säkerhetskopiera"
#: mod_configure.erl:133 mod_configure.erl:605
msgid "Restore"
msgstr "Återställ"
#: mod_configure.erl:135 mod_configure.erl:606
msgid "Dump to Text File"
msgstr "Dumpa till textfil"
#: mod_configure.erl:137 mod_configure.erl:615
msgid "Import File"
msgstr "Importera fil"
#: mod_configure.erl:139 mod_configure.erl:616
msgid "Import Directory"
msgstr "Importera katalog"
#: mod_configure.erl:141 mod_configure.erl:581 mod_configure.erl:1057
msgid "Restart Service"
msgstr "Starta om servicen"
#: mod_configure.erl:143 mod_configure.erl:582 mod_configure.erl:1102
msgid "Shut Down Service"
msgstr "Stäng ner servicen"
#: mod_configure.erl:145 mod_configure.erl:518 mod_configure.erl:1197
#: web/ejabberd_web_admin.erl:1527
msgid "Add User"
msgstr "Lägg till användare"
#: mod_configure.erl:147 mod_configure.erl:519 mod_configure.erl:1219
msgid "Delete User"
msgstr "Ta bort användare"
#: mod_configure.erl:149 mod_configure.erl:520 mod_configure.erl:1231
msgid "End User Session"
msgstr "Avsluta användarsession"
#: mod_configure.erl:151 mod_configure.erl:521 mod_configure.erl:1243
#: mod_configure.erl:1255
msgid "Get User Password"
msgstr "Hämta användarlösenord"
#: mod_configure.erl:153 mod_configure.erl:522
msgid "Change User Password"
msgstr "Andra användarlösenord"
#: mod_configure.erl:155 mod_configure.erl:523 mod_configure.erl:1272
msgid "Get User Last Login Time"
msgstr "Hämta användarens senast inloggade tid"
#: mod_configure.erl:157 mod_configure.erl:524 mod_configure.erl:1284
msgid "Get User Statistics"
msgstr "Hämta användarstatistik"
#: mod_configure.erl:159 mod_configure.erl:525
msgid "Get Number of Registered Users"
msgstr "Hämta antal registrerade användare"
#: mod_configure.erl:161 mod_configure.erl:526
msgid "Get Number of Online Users"
msgstr "Hämta antal inloggade användare"
#: mod_configure.erl:163 mod_configure.erl:509 web/ejabberd_web_admin.erl:831
#: web/ejabberd_web_admin.erl:872
msgid "Access Control Lists"
msgstr "ACL"
#: mod_configure.erl:165 mod_configure.erl:510 web/ejabberd_web_admin.erl:940
#: web/ejabberd_web_admin.erl:976
msgid "Access Rules"
msgstr "Åtkomstregler"
#: mod_configure.erl:297 mod_configure.erl:499
msgid "User Management"
msgstr "Användarmanagement"
#: mod_configure.erl:500 web/ejabberd_web_admin.erl:1058
#: web/ejabberd_web_admin.erl:1462
msgid "Online Users"
msgstr "Anslutna användare"
#: mod_configure.erl:501
msgid "All Users"
msgstr "Alla användare"
#: mod_configure.erl:502
msgid "Outgoing s2s Connections"
msgstr "Utgaende s2s anslutning"
#: mod_configure.erl:503 web/ejabberd_web_admin.erl:1907
msgid "Running Nodes"
msgstr "Körande noder"
#: mod_configure.erl:504 web/ejabberd_web_admin.erl:1909
msgid "Stopped Nodes"
msgstr "Stannade noder"
#: mod_configure.erl:577 mod_configure.erl:587 web/ejabberd_web_admin.erl:1953
msgid "Modules"
msgstr "Moduler"
#: mod_configure.erl:578
msgid "Backup Management"
msgstr "Hantera säkerhetskopior"
#: mod_configure.erl:579
msgid "Import Users From jabberd14 Spool Files"
msgstr "Importera användare från jabberd14 Spool filer"
#: mod_configure.erl:699
msgid "To ~s"
msgstr "Till ~s"
#: mod_configure.erl:717
msgid "From ~s"
msgstr "Från ~s"
#: mod_configure.erl:913
msgid "Database Tables Configuration at "
msgstr "Databastabellers konfiguration"
#: mod_configure.erl:918
msgid "Choose storage type of tables"
msgstr "Välj lagringstyp för tabeller"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "Disc only copy"
msgstr "Endast diskkopia"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "RAM and disc copy"
msgstr "RAM- och diskkopia"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "RAM copy"
msgstr "RAM-kopia"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "Remote copy"
msgstr "Sparas inte lokalt"
#: mod_configure.erl:950
msgid "Stop Modules at "
msgstr "Stoppa moduler på "
#: mod_configure.erl:954
msgid "Choose modules to stop"
msgstr "Välj vilka moduler som skall stoppas"
#: mod_configure.erl:969
msgid "Start Modules at "
msgstr "Starta moduler på "
#: mod_configure.erl:973
msgid "Enter list of {Module, [Options]}"
msgstr "Skriv in en lista av {Module, [Options]}"
#: mod_configure.erl:974
msgid "List of modules to start"
msgstr "Lista av moduler som skall startas"
#: mod_configure.erl:983
msgid "Backup to File at "
msgstr "Säkerhetskopiera till fil på "
#: mod_configure.erl:987 mod_configure.erl:1001
msgid "Enter path to backup file"
msgstr "Skriv in sökväg till fil för säkerhetskopia"
#: mod_configure.erl:988 mod_configure.erl:1002 mod_configure.erl:1016
#: mod_configure.erl:1030
msgid "Path to File"
msgstr "Sökväg till fil"
#: mod_configure.erl:997
msgid "Restore Backup from File at "
msgstr "Återställ säkerhetskopia från fil på "
#: mod_configure.erl:1011
msgid "Dump Backup to Text File at "
msgstr "Dumpa säkerhetskopia till textfil på "
#: mod_configure.erl:1015
msgid "Enter path to text file"
msgstr "Skriv in sökväg till textfil"
#: mod_configure.erl:1025
msgid "Import User from File at "
msgstr "Importera användare från fil på "
#: mod_configure.erl:1029
msgid "Enter path to jabberd14 spool file"
msgstr "Skriv in sökväg till spoolfil från jabberd14"
#: mod_configure.erl:1039
msgid "Import Users from Dir at "
msgstr "Importera användare från katalog på "
#: mod_configure.erl:1043
msgid "Enter path to jabberd14 spool dir"
msgstr "Skriv in sökväg till spoolkatalog från jabberd14"
#: mod_configure.erl:1044
msgid "Path to Dir"
msgstr "Sökväg till katalog"
#: mod_configure.erl:1060 mod_configure.erl:1105
msgid "Time delay"
msgstr "Tidsförsening"
#: mod_configure.erl:1143
msgid "Access Control List Configuration"
msgstr "Konfiguera ACL"
#: mod_configure.erl:1147
msgid "Access control lists"
msgstr "ACL"
#: mod_configure.erl:1171
msgid "Access Configuration"
msgstr "Åtkomstkonfiguration"
#: mod_configure.erl:1175
msgid "Access rules"
msgstr "Åtkomstregler"
#: mod_configure.erl:1200 mod_configure.erl:1222 mod_configure.erl:1234
#: mod_configure.erl:1246 mod_configure.erl:1258 mod_configure.erl:1275
#: mod_configure.erl:1287 mod_configure.erl:1650 mod_configure.erl:1700
#: mod_configure.erl:1721 mod_roster.erl:943 mod_roster_odbc.erl:1060
#: mod_vcard.erl:472 mod_vcard_ldap.erl:554 mod_vcard_odbc.erl:448
msgid "Jabber ID"
msgstr "Jabber ID"
#: mod_configure.erl:1205 mod_configure.erl:1263 mod_configure.erl:1651
#: mod_configure.erl:1863 mod_muc/mod_muc_room.erl:3224 mod_register.erl:235
#: web/ejabberd_web_admin.erl:1520
msgid "Password"
msgstr "Lösenord"
#: mod_configure.erl:1210
msgid "Password Verification"
msgstr "Lösenordsverifikation"
#: mod_configure.erl:1301
msgid "Number of registered users"
msgstr "Antal registrerade användare"
#: mod_configure.erl:1315
msgid "Number of online users"
msgstr "Antal inloggade användare"
#: mod_configure.erl:1682 web/ejabberd_web_admin.erl:1588
#: web/ejabberd_web_admin.erl:1743
msgid "Never"
msgstr "Aldrig"
#: mod_configure.erl:1696 web/ejabberd_web_admin.erl:1601
#: web/ejabberd_web_admin.erl:1756
msgid "Online"
msgstr "Ansluten"
#: mod_configure.erl:1701
msgid "Last login"
msgstr "Senaste login"
#: mod_configure.erl:1722
msgid "Roster size"
msgstr "Roster storlek"
#: mod_configure.erl:1723
msgid "IP addresses"
msgstr "IP adresser"
#: mod_configure.erl:1724
msgid "Resources"
msgstr "Resurser"
#: mod_configure.erl:1850
msgid "Administration of "
msgstr "Administration av "
#: mod_configure.erl:1853
msgid "Action on user"
msgstr "Handling mot användare"
#: mod_configure.erl:1857
msgid "Edit Properties"
msgstr "Redigera egenskaper"
#: mod_configure.erl:1860 web/ejabberd_web_admin.erl:1769
msgid "Remove User"
msgstr "Ta bort användare"
#: mod_irc/mod_irc.erl:201 mod_irc/mod_irc_odbc.erl:196
#: mod_muc/mod_muc.erl:336 mod_muc/mod_muc_odbc.erl:342
msgid "Access denied by service policy"
msgstr "Åtkomst nekad enligt lokal policy"
#: mod_irc/mod_irc.erl:401 mod_irc/mod_irc_odbc.erl:398
msgid "IRC Transport"
msgstr "IRC transport"
#: mod_irc/mod_irc.erl:428 mod_irc/mod_irc_odbc.erl:425
msgid "ejabberd IRC module"
msgstr "ejabberd IRC-modul"
#: mod_irc/mod_irc.erl:559 mod_irc/mod_irc_odbc.erl:568
msgid "You need an x:data capable client to configure mod_irc settings"
msgstr "Du behöer en klient som stöjer x:data för att konfigurera mod_irc"
#: mod_irc/mod_irc.erl:566 mod_irc/mod_irc_odbc.erl:575
msgid "Registration in mod_irc for "
msgstr "mod_irc-registrering för "
#: mod_irc/mod_irc.erl:571 mod_irc/mod_irc_odbc.erl:580
msgid ""
"Enter username, encodings, ports and passwords you wish to use for "
"connecting to IRC servers"
msgstr ""
"Skriv in användarnamn och textkodning du vill använda för att ansluta till "
"IRC-servrar"
#: mod_irc/mod_irc.erl:576 mod_irc/mod_irc_odbc.erl:585
msgid "IRC Username"
msgstr "IRC-användarnamn"
#: mod_irc/mod_irc.erl:586 mod_irc/mod_irc_odbc.erl:595
msgid ""
"If you want to specify different ports, passwords, encodings for IRC "
"servers, fill this list with values in format '{\"irc server\", \"encoding"
"\", port, \"password\"}'. By default this service use \"~s\" encoding, port "
"~p, empty password."
msgstr ""
"Om du vill specifiera textkodning för IRC-servrar, fyll i listan med värden "
"i formatet '{\"irc server\", \"encoding\", port, \"password\"}'. Som "
"standard används \"~s\", port ~p, no password."
#: mod_irc/mod_irc.erl:598 mod_irc/mod_irc_odbc.erl:607
msgid ""
"Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef."
"net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."
msgstr ""
"Exempel: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef."
"net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."
#: mod_irc/mod_irc.erl:603 mod_irc/mod_irc_odbc.erl:612
msgid "Connections parameters"
msgstr "Uppkopplingsparametrar"
#: mod_irc/mod_irc.erl:728 mod_irc/mod_irc_odbc.erl:757
msgid "Join IRC channel"
msgstr "Lägg till IRC kanal"
#: mod_irc/mod_irc.erl:732 mod_irc/mod_irc_odbc.erl:761
msgid "IRC channel (don't put the first #)"
msgstr "IRC kanal (skriv inte första #)"
#: mod_irc/mod_irc.erl:737 mod_irc/mod_irc_odbc.erl:766
msgid "IRC server"
msgstr "IRC-användarnamn"
#: mod_irc/mod_irc.erl:770 mod_irc/mod_irc.erl:774
#: mod_irc/mod_irc_odbc.erl:799 mod_irc/mod_irc_odbc.erl:803
msgid "Join the IRC channel here."
msgstr "Lägg till IRC kanal här."
#: mod_irc/mod_irc.erl:778 mod_irc/mod_irc_odbc.erl:807
msgid "Join the IRC channel in this Jabber ID: ~s"
msgstr "Lägg till IRC kanal till detta Jabber ID: ~s"
#: mod_irc/mod_irc.erl:863 mod_irc/mod_irc_odbc.erl:904
msgid "IRC settings"
msgstr "IRC Inställningar"
#: mod_irc/mod_irc.erl:868 mod_irc/mod_irc_odbc.erl:909
#, fuzzy
msgid ""
"Enter username and encodings you wish to use for connecting to IRC servers. "
"Press 'Next' to get more fields to fill in. Press 'Complete' to save "
"settings."
msgstr ""
"Skriv in användarnamn och textkodning du vill använda för att ansluta till "
"IRC-servrar"
#: mod_irc/mod_irc.erl:874 mod_irc/mod_irc_odbc.erl:915
msgid "IRC username"
msgstr "IRC-användarnamn"
#: mod_irc/mod_irc.erl:923 mod_irc/mod_irc_odbc.erl:964
msgid "Password ~b"
msgstr "Lösenord ~b"
#: mod_irc/mod_irc.erl:928 mod_irc/mod_irc_odbc.erl:969
msgid "Port ~b"
msgstr "Port ~b"
#: mod_irc/mod_irc.erl:933 mod_irc/mod_irc_odbc.erl:974
msgid "Encoding for server ~b"
msgstr "Encoding för server ~b"
#: mod_irc/mod_irc.erl:942 mod_irc/mod_irc_odbc.erl:983
msgid "Server ~b"
msgstr "Server ~b"
#: mod_muc/mod_muc.erl:449 mod_muc/mod_muc_odbc.erl:456
msgid "Only service administrators are allowed to send service messages"
msgstr "Endast administratörer får skicka tjänstmeddelanden"
#: mod_muc/mod_muc.erl:493 mod_muc/mod_muc_odbc.erl:500
msgid "Room creation is denied by service policy"
msgstr "Skapandet av rum är förbjudet enligt lokal policy"
#: mod_muc/mod_muc.erl:500 mod_muc/mod_muc_odbc.erl:507
msgid "Conference room does not exist"
msgstr "Rummet finns inte"
#: mod_muc/mod_muc.erl:582 mod_muc/mod_muc_odbc.erl:595
msgid "Chatrooms"
msgstr "Chattrum"
#: mod_muc/mod_muc.erl:712 mod_muc/mod_muc_odbc.erl:729
#, fuzzy
msgid "You need a client that supports x:data to register the nickname"
msgstr "Du behöver en klient som stödjer x:data för att registrera smeknamn"
#: mod_muc/mod_muc.erl:718 mod_muc/mod_muc_odbc.erl:735
msgid "Nickname Registration at "
msgstr "Registrera smeknamn på "
#: mod_muc/mod_muc.erl:722 mod_muc/mod_muc_odbc.erl:739
msgid "Enter nickname you want to register"
msgstr "Skriv in smeknamnet du vill registrera"
#: mod_muc/mod_muc.erl:723 mod_muc/mod_muc_odbc.erl:740
#: mod_muc/mod_muc_room.erl:3810 mod_roster.erl:944 mod_roster_odbc.erl:1061
#: mod_vcard.erl:364 mod_vcard.erl:477 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:453
msgid "Nickname"
msgstr "Smeknamn"
#: mod_muc/mod_muc.erl:762 mod_muc/mod_muc_odbc.erl:784
#: mod_muc/mod_muc_room.erl:1064 mod_muc/mod_muc_room.erl:1787
msgid "That nickname is registered by another person"
msgstr "Smeknamnet är reserverat"
#: mod_muc/mod_muc.erl:788 mod_muc/mod_muc_odbc.erl:811
msgid "You must fill in field \"Nickname\" in the form"
msgstr "Du måste fylla i fält \"smeknamn\" i formen"
#: mod_muc/mod_muc.erl:808 mod_muc/mod_muc_odbc.erl:831
msgid "ejabberd MUC module"
msgstr "ejabberd MUC modul"
#: mod_muc/mod_muc_log.erl:374 mod_muc/mod_muc_log.erl:381
msgid "Chatroom configuration modified"
msgstr "Chattrum konfiguration modifierad"
#: mod_muc/mod_muc_log.erl:384
msgid "joins the room"
msgstr "joinar rummet"
#: mod_muc/mod_muc_log.erl:387 mod_muc/mod_muc_log.erl:390
msgid "leaves the room"
msgstr "lämnar rummet"
#: mod_muc/mod_muc_log.erl:393 mod_muc/mod_muc_log.erl:396
msgid "has been banned"
msgstr "har blivit bannad"
#: mod_muc/mod_muc_log.erl:399 mod_muc/mod_muc_log.erl:402
msgid "has been kicked"
msgstr "har blivit kickad"
#: mod_muc/mod_muc_log.erl:405
msgid "has been kicked because of an affiliation change"
msgstr "har blivit kickad p.g.a en ändring av tillhörighet"
#: mod_muc/mod_muc_log.erl:408
msgid "has been kicked because the room has been changed to members-only"
msgstr "har blivit kickad p.g.a att rummet har ändrats till endast användare"
#: mod_muc/mod_muc_log.erl:411
msgid "has been kicked because of a system shutdown"
msgstr "har blivit kickad p.g.a en systemnerstängning"
#: mod_muc/mod_muc_log.erl:414
msgid "is now known as"
msgstr "är känd som"
#: mod_muc/mod_muc_log.erl:417 mod_muc/mod_muc_log.erl:688
#: mod_muc/mod_muc_room.erl:2393
msgid " has set the subject to: "
msgstr " har satt ämnet till: "
#: mod_muc/mod_muc_log.erl:452
#, fuzzy
msgid "Chatroom is created"
msgstr "Chattrum"
#: mod_muc/mod_muc_log.erl:453
#, fuzzy
msgid "Chatroom is destroyed"
msgstr "Chattrum"
#: mod_muc/mod_muc_log.erl:454
#, fuzzy
msgid "Chatroom is started"
msgstr "Chattrum"
#: mod_muc/mod_muc_log.erl:455
#, fuzzy
msgid "Chatroom is stopped"
msgstr "Chattrum"
#: mod_muc/mod_muc_log.erl:459
msgid "Monday"
msgstr "Måndag"
#: mod_muc/mod_muc_log.erl:460
msgid "Tuesday"
msgstr "Tisdag"
#: mod_muc/mod_muc_log.erl:461
msgid "Wednesday"
msgstr "Onsdag"
#: mod_muc/mod_muc_log.erl:462
msgid "Thursday"
msgstr "Torsdag"
#: mod_muc/mod_muc_log.erl:463
msgid "Friday"
msgstr "Fredag"
#: mod_muc/mod_muc_log.erl:464
msgid "Saturday"
msgstr "Lördag"
#: mod_muc/mod_muc_log.erl:465
msgid "Sunday"
msgstr "Söndag"
#: mod_muc/mod_muc_log.erl:469
msgid "January"
msgstr "Januari"
#: mod_muc/mod_muc_log.erl:470
msgid "February"
msgstr "Februari"
#: mod_muc/mod_muc_log.erl:471
msgid "March"
msgstr "Mars"
#: mod_muc/mod_muc_log.erl:472
msgid "April"
msgstr "April"
#: mod_muc/mod_muc_log.erl:473
msgid "May"
msgstr "Maj"
#: mod_muc/mod_muc_log.erl:474
msgid "June"
msgstr "Juni"
#: mod_muc/mod_muc_log.erl:475
msgid "July"
msgstr "Juli"
#: mod_muc/mod_muc_log.erl:476
msgid "August"
msgstr "Augusti"
#: mod_muc/mod_muc_log.erl:477
msgid "September"
msgstr "September"
#: mod_muc/mod_muc_log.erl:478
msgid "October"
msgstr "Oktober"
#: mod_muc/mod_muc_log.erl:479
msgid "November"
msgstr "November"
#: mod_muc/mod_muc_log.erl:480
msgid "December"
msgstr "December"
#: mod_muc/mod_muc_log.erl:750
msgid "Room Configuration"
msgstr "Rumkonfiguration"
#: mod_muc/mod_muc_log.erl:759
msgid "Room Occupants"
msgstr "Antal besökare"
#: mod_muc/mod_muc_room.erl:174
msgid "Traffic rate limit is exceeded"
msgstr "Trafikgränsen har överstigits"
#: mod_muc/mod_muc_room.erl:246
msgid ""
"This participant is kicked from the room because he sent an error message"
msgstr ""
"Deltagaren har blivit kickad fran rummet p.g.a att han skickade ett "
"errormeddelande"
#: mod_muc/mod_muc_room.erl:255
msgid "It is not allowed to send private messages to the conference"
msgstr ""
"Det är inte tillåtet att skicka privata medelanden till den här konferensen"
#: mod_muc/mod_muc_room.erl:332
msgid "Please, wait for a while before sending new voice request"
msgstr ""
#: mod_muc/mod_muc_room.erl:347
msgid "Voice requests are disabled in this conference"
msgstr ""
#: mod_muc/mod_muc_room.erl:364
msgid "Failed to extract JID from your voice request approval"
msgstr ""
#: mod_muc/mod_muc_room.erl:393
msgid "Only moderators can approve voice requests"
msgstr ""
#: mod_muc/mod_muc_room.erl:408
msgid "Improper message type"
msgstr "Felaktig medelandetyp"
#: mod_muc/mod_muc_room.erl:518
msgid ""
"This participant is kicked from the room because he sent an error message to "
"another participant"
msgstr ""
"Deltagaren har blivit kickad från rummet p.g.a att han skickade ett "
"errormeddelande till en annan deltagare"
#: mod_muc/mod_muc_room.erl:531
msgid "It is not allowed to send private messages of type \"groupchat\""
msgstr ""
"Det är inte tillåtet att skicka privata medelanden med typen \"groupchat\""
#: mod_muc/mod_muc_room.erl:543 mod_muc/mod_muc_room.erl:611
msgid "Recipient is not in the conference room"
msgstr "Mottagaren finns inte i rummet"
#: mod_muc/mod_muc_room.erl:564 mod_muc/mod_muc_room.erl:585
msgid "It is not allowed to send private messages"
msgstr "Det ar inte tillåtet att skicka privata meddelanden"
#: mod_muc/mod_muc_room.erl:576 mod_muc/mod_muc_room.erl:956
#: mod_muc/mod_muc_room.erl:4040
msgid "Only occupants are allowed to send messages to the conference"
msgstr "Utomstående får inte skicka medelanden till den här konferensen"
#: mod_muc/mod_muc_room.erl:634
msgid "Only occupants are allowed to send queries to the conference"
msgstr "Utomstående får inte skicka iq-queries till den här konferensen"
#: mod_muc/mod_muc_room.erl:646
msgid "Queries to the conference members are not allowed in this room"
msgstr "Det är förbjudet att skicka iq-queries till konferensdeltagare"
#: mod_muc/mod_muc_room.erl:932
msgid ""
"Only moderators and participants are allowed to change the subject in this "
"room"
msgstr ""
"Endast moderatorer och deltagare har tillåtelse att ändra ämnet i det här "
"rummet"
#: mod_muc/mod_muc_room.erl:937
#, fuzzy
msgid "Only moderators are allowed to change the subject in this room"
msgstr "Endast moderatorer får ändra ämnet i det här rummet"
#: mod_muc/mod_muc_room.erl:947
msgid "Visitors are not allowed to send messages to all occupants"
msgstr "Besökare får inte skicka medelande till alla"
#: mod_muc/mod_muc_room.erl:1021
msgid ""
"This participant is kicked from the room because he sent an error presence"
msgstr ""
"Denna deltagaren är kickad från rummet p.g.a att han skickade en errorstatus"
#: mod_muc/mod_muc_room.erl:1040
msgid "Visitors are not allowed to change their nicknames in this room"
msgstr "Det är inte tillåtet for gäster att ändra sina smeknamn i detta rummet"
#: mod_muc/mod_muc_room.erl:1053 mod_muc/mod_muc_room.erl:1779
#, fuzzy
msgid "That nickname is already in use by another occupant"
msgstr "Smeknamnet används redan"
#: mod_muc/mod_muc_room.erl:1768
msgid "You have been banned from this room"
msgstr "Du har blivit bannlyst från det här rummet"
#: mod_muc/mod_muc_room.erl:1771
msgid "Membership is required to enter this room"
msgstr "Du måste vara medlem för att komma in i det här rummet"
#: mod_muc/mod_muc_room.erl:1807
msgid "This room is not anonymous"
msgstr "Detta rum är inte anonymt"
#: mod_muc/mod_muc_room.erl:1833
#, fuzzy
msgid "A password is required to enter this room"
msgstr "Lösenord erfordras"
#: mod_muc/mod_muc_room.erl:1855 mod_register.erl:246
msgid "Too many CAPTCHA requests"
msgstr ""
#: mod_muc/mod_muc_room.erl:1864 mod_register.erl:251
#, fuzzy
msgid "Unable to generate a CAPTCHA"
msgstr "Kunde inte generera ett CAPTCHA"
#: mod_muc/mod_muc_room.erl:1874
msgid "Incorrect password"
msgstr "Fel lösenord"
#: mod_muc/mod_muc_room.erl:2448
msgid "Administrator privileges required"
msgstr "Administrationsprivilegier krävs"
#: mod_muc/mod_muc_room.erl:2463
msgid "Moderator privileges required"
msgstr "Moderatorprivilegier krävs"
#: mod_muc/mod_muc_room.erl:2619
msgid "Jabber ID ~s is invalid"
msgstr "Otillåtet Jabber ID ~s"
#: mod_muc/mod_muc_room.erl:2633
msgid "Nickname ~s does not exist in the room"
msgstr "Smeknamnet ~s existerar inte i det här rummet"
#: mod_muc/mod_muc_room.erl:2659 mod_muc/mod_muc_room.erl:3049
msgid "Invalid affiliation: ~s"
msgstr "Ogiltlig rang: ~s"
#: mod_muc/mod_muc_room.erl:2713
msgid "Invalid role: ~s"
msgstr "Ogiltlig roll: ~s"
#: mod_muc/mod_muc_room.erl:3026 mod_muc/mod_muc_room.erl:3062
msgid "Owner privileges required"
msgstr "Ägarprivilegier krävs"
#: mod_muc/mod_muc_room.erl:3195
msgid "Configuration of room ~s"
msgstr "Konfiguration för ~s"
#: mod_muc/mod_muc_room.erl:3200
msgid "Room title"
msgstr "Rumstitel"
#: mod_muc/mod_muc_room.erl:3203 mod_muc/mod_muc_room.erl:3692
#, fuzzy
msgid "Room description"
msgstr "Beskrivning:"
#: mod_muc/mod_muc_room.erl:3210
msgid "Make room persistent"
msgstr "Gör rummet permanent"
#: mod_muc/mod_muc_room.erl:3215
msgid "Make room public searchable"
msgstr "Gör rummet publikt sökbart"
#: mod_muc/mod_muc_room.erl:3218
msgid "Make participants list public"
msgstr "Gör deltagarlistan publik"
#: mod_muc/mod_muc_room.erl:3221
msgid "Make room password protected"
msgstr "Gör losenorden i rummet publika"
#: mod_muc/mod_muc_room.erl:3232
msgid "Maximum Number of Occupants"
msgstr "Maximalt antal av användare"
#: mod_muc/mod_muc_room.erl:3239
msgid "No limit"
msgstr "Ingen gräns"
#: mod_muc/mod_muc_room.erl:3250
msgid "Present real Jabber IDs to"
msgstr "Nuvarande äkta Jabber IDs till"
#: mod_muc/mod_muc_room.erl:3258 mod_muc/mod_muc_room.erl:3292
msgid "moderators only"
msgstr "endast moderatorer"
#: mod_muc/mod_muc_room.erl:3260 mod_muc/mod_muc_room.erl:3294
msgid "anyone"
msgstr "Vemsomhelst"
#: mod_muc/mod_muc_room.erl:3262
msgid "Make room members-only"
msgstr "Gör om rummet till endast medlemmar"
#: mod_muc/mod_muc_room.erl:3265
msgid "Make room moderated"
msgstr "Gör rummet modererat"
#: mod_muc/mod_muc_room.erl:3268
msgid "Default users as participants"
msgstr "Gör om användare till deltagare"
#: mod_muc/mod_muc_room.erl:3271
msgid "Allow users to change the subject"
msgstr "Tillåt användare att byta ämne"
#: mod_muc/mod_muc_room.erl:3274
msgid "Allow users to send private messages"
msgstr "Tillåt användare att skicka privata meddelanden"
#: mod_muc/mod_muc_room.erl:3279
#, fuzzy
msgid "Allow visitors to send private messages to"
msgstr "Tillåt användare att skicka privata meddelanden"
#: mod_muc/mod_muc_room.erl:3290
msgid "nobody"
msgstr ""
#: mod_muc/mod_muc_room.erl:3296
msgid "Allow users to query other users"
msgstr "Tillåt användare att söka efter andra användare"
#: mod_muc/mod_muc_room.erl:3299
msgid "Allow users to send invites"
msgstr "Tillåt användare att skicka inbjudningar"
#: mod_muc/mod_muc_room.erl:3302
msgid "Allow visitors to send status text in presence updates"
msgstr "Tillåt gäster att skicka statustext som uppdatering"
#: mod_muc/mod_muc_room.erl:3305
msgid "Allow visitors to change nickname"
msgstr "Tillåt gäster att kunna ändra smeknamn"
#: mod_muc/mod_muc_room.erl:3308
#, fuzzy
msgid "Allow visitors to send voice requests"
msgstr "Tillåt användare att skicka inbjudningar"
#: mod_muc/mod_muc_room.erl:3311
msgid "Minimum interval between voice requests (in seconds)"
msgstr ""
#: mod_muc/mod_muc_room.erl:3317
#, fuzzy
msgid "Make room CAPTCHA protected"
msgstr "Gör losenorden i rummet publika"
#: mod_muc/mod_muc_room.erl:3322
msgid "Exclude Jabber IDs from CAPTCHA challenge"
msgstr ""
#: mod_muc/mod_muc_room.erl:3329
msgid "Enable logging"
msgstr "Möjliggör login"
#: mod_muc/mod_muc_room.erl:3337
msgid "You need an x:data capable client to configure room"
msgstr "Du behöver en klient som stödjer x:data för att konfiguera detta rum"
#: mod_muc/mod_muc_room.erl:3694
msgid "Number of occupants"
msgstr "Antal besökare"
#: mod_muc/mod_muc_room.erl:3750
msgid "private, "
msgstr "privat, "
#: mod_muc/mod_muc_room.erl:3799
msgid "Voice request"
msgstr ""
#: mod_muc/mod_muc_room.erl:3803
msgid "Either approve or decline the voice request."
msgstr ""
#: mod_muc/mod_muc_room.erl:3809
#, fuzzy
msgid "User JID"
msgstr "Användare "
#: mod_muc/mod_muc_room.erl:3811
msgid "Grant voice to this person?"
msgstr ""
#: mod_muc/mod_muc_room.erl:3960
msgid "~s invites you to the room ~s"
msgstr "~s bjöd in dig till rummet ~s"
#: mod_muc/mod_muc_room.erl:3969
msgid "the password is"
msgstr "Lösenordet är"
#: mod_offline.erl:510 mod_offline_odbc.erl:352
msgid ""
"Your contact offline message queue is full. The message has been discarded."
msgstr "Din kontaktkö for offlinekontakter ar full"
#: mod_offline.erl:560 mod_offline_odbc.erl:408
msgid "~s's Offline Messages Queue"
msgstr "~s's offline meddelandekö"
#: mod_offline.erl:563 mod_offline_odbc.erl:411 mod_roster.erl:987
#: mod_roster_odbc.erl:1104 mod_shared_roster.erl:901
#: mod_shared_roster.erl:1010 mod_shared_roster_odbc.erl:930
#: mod_shared_roster_odbc.erl:1039 web/ejabberd_web_admin.erl:833
#: web/ejabberd_web_admin.erl:874 web/ejabberd_web_admin.erl:942
#: web/ejabberd_web_admin.erl:978 web/ejabberd_web_admin.erl:1019
#: web/ejabberd_web_admin.erl:1508 web/ejabberd_web_admin.erl:1760
#: web/ejabberd_web_admin.erl:1931 web/ejabberd_web_admin.erl:1963
#: web/ejabberd_web_admin.erl:2031 web/ejabberd_web_admin.erl:2135
#: web/ejabberd_web_admin.erl:2160 web/ejabberd_web_admin.erl:2248
msgid "Submitted"
msgstr "Skicka in"
#: mod_offline.erl:571
msgid "Time"
msgstr "Tid"
#: mod_offline.erl:572
msgid "From"
msgstr "Från"
#: mod_offline.erl:573
msgid "To"
msgstr "Till"
#: mod_offline.erl:574 mod_offline_odbc.erl:419
msgid "Packet"
msgstr "Paket"
#: mod_offline.erl:587 mod_offline_odbc.erl:432 mod_shared_roster.erl:908
#: mod_shared_roster_odbc.erl:937 web/ejabberd_web_admin.erl:882
#: web/ejabberd_web_admin.erl:986
msgid "Delete Selected"
msgstr "Tabort valda"
#: mod_offline.erl:645 mod_offline_odbc.erl:519
msgid "Offline Messages:"
msgstr "Offline meddelanden:"
#: mod_offline.erl:645 mod_offline_odbc.erl:519
#, fuzzy
msgid "Remove All Offline Messages"
msgstr "Offline meddelanden"
#: mod_proxy65/mod_proxy65_service.erl:213
msgid "ejabberd SOCKS5 Bytestreams module"
msgstr "ejabberd SOCKS5 Bytestrem modul"
#: mod_pubsub/mod_pubsub.erl:1120 mod_pubsub/mod_pubsub_odbc.erl:929
msgid "Publish-Subscribe"
msgstr "Publikprenumeration"
#: mod_pubsub/mod_pubsub.erl:1214 mod_pubsub/mod_pubsub_odbc.erl:1025
msgid "ejabberd Publish-Subscribe module"
msgstr "ejabberd publikprenumerations modul"
#: mod_pubsub/mod_pubsub.erl:1497 mod_pubsub/mod_pubsub_odbc.erl:1312
msgid "PubSub subscriber request"
msgstr "Pubsub prenumerationsforfrågan"
#: mod_pubsub/mod_pubsub.erl:1499 mod_pubsub/mod_pubsub_odbc.erl:1314
msgid "Choose whether to approve this entity's subscription."
msgstr "Välj om du vill godkänna hela denna prenumertion."
#: mod_pubsub/mod_pubsub.erl:1505 mod_pubsub/mod_pubsub_odbc.erl:1320
msgid "Node ID"
msgstr "Node ID"
#: mod_pubsub/mod_pubsub.erl:1510 mod_pubsub/mod_pubsub_odbc.erl:1325
msgid "Subscriber Address"
msgstr "Prenumerationsadress"
#: mod_pubsub/mod_pubsub.erl:1516 mod_pubsub/mod_pubsub_odbc.erl:1331
msgid "Allow this Jabber ID to subscribe to this pubsub node?"
msgstr "Tillåt denna Jabber ID att prenumerera på denna pubsub node"
#: mod_pubsub/mod_pubsub.erl:3474 mod_pubsub/mod_pubsub_odbc.erl:3287
msgid "Deliver payloads with event notifications"
msgstr "Skicka innehåll tillsammans med notifikationer"
#: mod_pubsub/mod_pubsub.erl:3475 mod_pubsub/mod_pubsub_odbc.erl:3288
msgid "Deliver event notifications"
msgstr "Skicka eventnotifikation"
#: mod_pubsub/mod_pubsub.erl:3476 mod_pubsub/mod_pubsub_odbc.erl:3289
msgid "Notify subscribers when the node configuration changes"
msgstr "Meddela prenumeranter när nodens konfiguration ändras"
#: mod_pubsub/mod_pubsub.erl:3477 mod_pubsub/mod_pubsub_odbc.erl:3290
msgid "Notify subscribers when the node is deleted"
msgstr "Meddela prenumeranter när noden tas bort"
#: mod_pubsub/mod_pubsub.erl:3478 mod_pubsub/mod_pubsub_odbc.erl:3291
msgid "Notify subscribers when items are removed from the node"
msgstr "Meddela prenumeranter när dataposter tas bort från noden"
#: mod_pubsub/mod_pubsub.erl:3479 mod_pubsub/mod_pubsub_odbc.erl:3292
msgid "Persist items to storage"
msgstr "Spara dataposter permanent"
#: mod_pubsub/mod_pubsub.erl:3480 mod_pubsub/mod_pubsub_odbc.erl:3293
msgid "A friendly name for the node"
msgstr "Ett vänligt namn for noden"
#: mod_pubsub/mod_pubsub.erl:3481 mod_pubsub/mod_pubsub_odbc.erl:3294
msgid "Max # of items to persist"
msgstr "Högsta antal dataposter som sparas"
#: mod_pubsub/mod_pubsub.erl:3482 mod_pubsub/mod_pubsub_odbc.erl:3295
msgid "Whether to allow subscriptions"
msgstr "Tillåta prenumerationer?"
#: mod_pubsub/mod_pubsub.erl:3483 mod_pubsub/mod_pubsub_odbc.erl:3296
msgid "Specify the access model"
msgstr "Specificera accessmodellen"
#: mod_pubsub/mod_pubsub.erl:3486 mod_pubsub/mod_pubsub_odbc.erl:3299
msgid "Roster groups allowed to subscribe"
msgstr "Rostergrupper tillåts att prenumerera"
#: mod_pubsub/mod_pubsub.erl:3487 mod_pubsub/mod_pubsub_odbc.erl:3300
msgid "Specify the publisher model"
msgstr "Ange publiceringsmodell"
#: mod_pubsub/mod_pubsub.erl:3489 mod_pubsub/mod_pubsub_odbc.erl:3302
msgid "Purge all items when the relevant publisher goes offline"
msgstr ""
#: mod_pubsub/mod_pubsub.erl:3490 mod_pubsub/mod_pubsub_odbc.erl:3303
#, fuzzy
msgid "Specify the event message type"
msgstr "Specificera accessmodellen"
#: mod_pubsub/mod_pubsub.erl:3492 mod_pubsub/mod_pubsub_odbc.erl:3305
msgid "Max payload size in bytes"
msgstr "Högsta innehållsstorlek i bytes"
#: mod_pubsub/mod_pubsub.erl:3493 mod_pubsub/mod_pubsub_odbc.erl:3306
msgid "When to send the last published item"
msgstr "När att skicka senast publicerade ämne"
#: mod_pubsub/mod_pubsub.erl:3495 mod_pubsub/mod_pubsub_odbc.erl:3308
msgid "Only deliver notifications to available users"
msgstr "Skicka notifikationer bara till uppkopplade användare"
#: mod_pubsub/mod_pubsub.erl:3496 mod_pubsub/mod_pubsub_odbc.erl:3309
msgid "The collections with which a node is affiliated"
msgstr ""
#: mod_register.erl:193
msgid "The CAPTCHA verification has failed"
msgstr ""
#: mod_register.erl:220
#, fuzzy
msgid "You need a client that supports x:data and CAPTCHA to register"
msgstr "Du behöver en klient som stödjer x:data för att registrera smeknamn"
#: mod_register.erl:226 mod_register.erl:265
msgid "Choose a username and password to register with this server"
msgstr "Välj ett användarnamn och lösenord för att registrera mot denna server"
#: mod_register.erl:230 mod_vcard.erl:364 mod_vcard_odbc.erl:342
#: web/ejabberd_web_admin.erl:1515 web/ejabberd_web_admin.erl:1572
msgid "User"
msgstr "Användarnamn"
#: mod_register.erl:316 mod_register.erl:361
#, fuzzy
msgid "The password is too weak"
msgstr "Lösenordet är"
#: mod_register.erl:365
msgid "Users are not allowed to register accounts so quickly"
msgstr "Det är inte tillåtet för användare att skapa konton så fort"
#: mod_roster.erl:938 mod_roster_odbc.erl:1055 web/ejabberd_web_admin.erl:1701
#: web/ejabberd_web_admin.erl:1886 web/ejabberd_web_admin.erl:1897
#: web/ejabberd_web_admin.erl:2219
msgid "None"
msgstr "Inga"
#: mod_roster.erl:945 mod_roster_odbc.erl:1062
msgid "Subscription"
msgstr "Prenumeration"
#: mod_roster.erl:946 mod_roster_odbc.erl:1063
msgid "Pending"
msgstr "Ännu inte godkända"
#: mod_roster.erl:947 mod_roster_odbc.erl:1064
msgid "Groups"
msgstr "Grupper"
#: mod_roster.erl:974 mod_roster_odbc.erl:1091
msgid "Validate"
msgstr "Validera"
#: mod_roster.erl:982 mod_roster_odbc.erl:1099
msgid "Remove"
msgstr "Ta bort"
#: mod_roster.erl:985 mod_roster_odbc.erl:1102
msgid "Roster of "
msgstr "Kontaktlista för "
#: mod_roster.erl:988 mod_roster_odbc.erl:1105 mod_shared_roster.erl:902
#: mod_shared_roster.erl:1011 mod_shared_roster_odbc.erl:931
#: mod_shared_roster_odbc.erl:1040 web/ejabberd_web_admin.erl:834
#: web/ejabberd_web_admin.erl:875 web/ejabberd_web_admin.erl:943
#: web/ejabberd_web_admin.erl:979 web/ejabberd_web_admin.erl:1020
#: web/ejabberd_web_admin.erl:1509 web/ejabberd_web_admin.erl:1761
#: web/ejabberd_web_admin.erl:1932 web/ejabberd_web_admin.erl:2136
#: web/ejabberd_web_admin.erl:2161
msgid "Bad format"
msgstr "Dåligt format"
#: mod_roster.erl:995 mod_roster_odbc.erl:1112
msgid "Add Jabber ID"
msgstr "Lägg till Jabber ID"
#: mod_roster.erl:1094 mod_roster_odbc.erl:1211
msgid "Roster"
msgstr "Kontaktlista"
#: mod_shared_roster.erl:857 mod_shared_roster.erl:899
#: mod_shared_roster.erl:1007 mod_shared_roster_odbc.erl:886
#: mod_shared_roster_odbc.erl:928 mod_shared_roster_odbc.erl:1036
msgid "Shared Roster Groups"
msgstr "Delade Rostergrupper"
#: mod_shared_roster.erl:895 mod_shared_roster_odbc.erl:924
#: web/ejabberd_web_admin.erl:1365 web/ejabberd_web_admin.erl:2461
msgid "Add New"
msgstr "Lägg till ny"
#: mod_shared_roster.erl:978 mod_shared_roster_odbc.erl:1007
msgid "Name:"
msgstr "Namn:"
#: mod_shared_roster.erl:983 mod_shared_roster_odbc.erl:1012
msgid "Description:"
msgstr "Beskrivning:"
#: mod_shared_roster.erl:991 mod_shared_roster_odbc.erl:1020
msgid "Members:"
msgstr "Medlemmar:"
#: mod_shared_roster.erl:999 mod_shared_roster_odbc.erl:1028
msgid "Displayed Groups:"
msgstr "Visade grupper:"
#: mod_shared_roster.erl:1008 mod_shared_roster_odbc.erl:1037
msgid "Group "
msgstr "Grupp "
#: mod_shared_roster.erl:1017 mod_shared_roster_odbc.erl:1046
#: web/ejabberd_web_admin.erl:840 web/ejabberd_web_admin.erl:884
#: web/ejabberd_web_admin.erl:949 web/ejabberd_web_admin.erl:1026
#: web/ejabberd_web_admin.erl:2017
msgid "Submit"
msgstr "Skicka"
#: mod_vcard.erl:165 mod_vcard_ldap.erl:238 mod_vcard_odbc.erl:129
msgid "Erlang Jabber Server"
msgstr "Erlang Jabber Server"
#: mod_vcard.erl:364 mod_vcard.erl:478 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:454
msgid "Birthday"
msgstr "Födelsedag"
#: mod_vcard.erl:364 mod_vcard.erl:480 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:456
msgid "City"
msgstr "Stad"
#: mod_vcard.erl:364 mod_vcard.erl:479 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:455
msgid "Country"
msgstr "Land"
#: mod_vcard.erl:364 mod_vcard.erl:481 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:457
msgid "Email"
msgstr "Email"
#: mod_vcard.erl:364 mod_vcard.erl:476 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:452
msgid "Family Name"
msgstr "Efternamn"
#: mod_vcard.erl:364 mod_vcard_odbc.erl:342
msgid ""
"Fill in the form to search for any matching Jabber User (Add * to the end of "
"field to match substring)"
msgstr ""
"Fyll i formuläret för att söka efter en användare (lägg till * på slutet av "
"fältet för att hitta alla som börjar så)"
#: mod_vcard.erl:364 mod_vcard.erl:473 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:449
msgid "Full Name"
msgstr "Fullständigt namn"
#: mod_vcard.erl:364 mod_vcard.erl:475 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:451
msgid "Middle Name"
msgstr "Mellannamn"
#: mod_vcard.erl:364 mod_vcard.erl:474 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:450 web/ejabberd_web_admin.erl:2006
msgid "Name"
msgstr "Namn"
#: mod_vcard.erl:364 mod_vcard.erl:482 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:458
msgid "Organization Name"
msgstr "Organisationsnamn"
#: mod_vcard.erl:364 mod_vcard.erl:483 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:459
msgid "Organization Unit"
msgstr "Organisationsenhet"
#: mod_vcard.erl:364 mod_vcard_ldap.erl:462 mod_vcard_odbc.erl:342
msgid "Search users in "
msgstr "Sök efter användare på "
#: mod_vcard.erl:364 mod_vcard_ldap.erl:462 mod_vcard_odbc.erl:342
msgid "You need an x:data capable client to search"
msgstr "Du behöver en klient som stödjer x:data, för att kunna söka"
#: mod_vcard.erl:389 mod_vcard_ldap.erl:487 mod_vcard_odbc.erl:367
msgid "vCard User Search"
msgstr "vCard användare sök"
#: mod_vcard.erl:445 mod_vcard_ldap.erl:541 mod_vcard_odbc.erl:421
msgid "ejabberd vCard module"
msgstr "ejabberd vCard-modul"
#: mod_vcard.erl:469 mod_vcard_ldap.erl:551 mod_vcard_odbc.erl:445
msgid "Search Results for "
msgstr "Sökresultat för"
#: mod_vcard_ldap.erl:462
msgid "Fill in fields to search for any matching Jabber User"
msgstr "Fyll i fält för att söka efter jabberanvändare"
#: web/ejabberd_web_admin.erl:193 web/ejabberd_web_admin.erl:203
#: web/ejabberd_web_admin.erl:219 web/ejabberd_web_admin.erl:229
msgid "Unauthorized"
msgstr "Ej auktoriserad"
#: web/ejabberd_web_admin.erl:286 web/ejabberd_web_admin.erl:303
msgid "ejabberd Web Admin"
msgstr "ejabberd Web Admin"
#: web/ejabberd_web_admin.erl:769 web/ejabberd_web_admin.erl:780
msgid "Administration"
msgstr "Administration"
#: web/ejabberd_web_admin.erl:878 web/ejabberd_web_admin.erl:982
msgid "Raw"
msgstr "Ra"
#: web/ejabberd_web_admin.erl:1017
msgid "~s access rule configuration"
msgstr "Åtkomstregelkonfiguration för ~s"
#: web/ejabberd_web_admin.erl:1035
msgid "Virtual Hosts"
msgstr "Virtuella servrar"
#: web/ejabberd_web_admin.erl:1043 web/ejabberd_web_admin.erl:1050
msgid "Users"
msgstr "Användare"
#: web/ejabberd_web_admin.erl:1078
msgid "Users Last Activity"
msgstr "Användarens senaste aktivitet"
#: web/ejabberd_web_admin.erl:1080
msgid "Period: "
msgstr "Period: "
#: web/ejabberd_web_admin.erl:1090
msgid "Last month"
msgstr "Senaste månaden"
#: web/ejabberd_web_admin.erl:1091
msgid "Last year"
msgstr "Senaste året"
#: web/ejabberd_web_admin.erl:1092
msgid "All activity"
msgstr "All aktivitet"
#: web/ejabberd_web_admin.erl:1094
msgid "Show Ordinary Table"
msgstr "Visa normal tabell"
#: web/ejabberd_web_admin.erl:1096
msgid "Show Integral Table"
msgstr "Visa kumulativ tabell"
#: web/ejabberd_web_admin.erl:1105 web/ejabberd_web_admin.erl:1939
msgid "Statistics"
msgstr "Statistik"
#: web/ejabberd_web_admin.erl:1117
msgid "Not Found"
msgstr "Noden finns inte"
#: web/ejabberd_web_admin.erl:1134
msgid "Node not found"
msgstr "Noden finns inte"
#: web/ejabberd_web_admin.erl:1460
msgid "Host"
msgstr "Server"
#: web/ejabberd_web_admin.erl:1461
msgid "Registered Users"
msgstr "Registrerade användare"
#: web/ejabberd_web_admin.erl:1573
msgid "Offline Messages"
msgstr "Offline meddelanden"
#: web/ejabberd_web_admin.erl:1574 web/ejabberd_web_admin.erl:1767
msgid "Last Activity"
msgstr "Senast aktivitet"
#: web/ejabberd_web_admin.erl:1659 web/ejabberd_web_admin.erl:1675
msgid "Registered Users:"
msgstr "Registrerade användare"
#: web/ejabberd_web_admin.erl:1661 web/ejabberd_web_admin.erl:1677
#: web/ejabberd_web_admin.erl:2192
msgid "Online Users:"
msgstr "Inloggade användare"
#: web/ejabberd_web_admin.erl:1663
msgid "Outgoing s2s Connections:"
msgstr "Utgående s2s anslutning"
#: web/ejabberd_web_admin.erl:1665
msgid "Outgoing s2s Servers:"
msgstr "Utgående s2s server"
#: web/ejabberd_web_admin.erl:1734 web/mod_register_web.erl:175
#: web/mod_register_web.erl:372 web/mod_register_web.erl:381
#: web/mod_register_web.erl:411
msgid "Change Password"
msgstr "Ändra lösenord"
#: web/ejabberd_web_admin.erl:1758
msgid "User "
msgstr "Användare "
#: web/ejabberd_web_admin.erl:1765
msgid "Connected Resources:"
msgstr "Anslutna resurser:"
#: web/ejabberd_web_admin.erl:1766 web/mod_register_web.erl:227
#: web/mod_register_web.erl:519
msgid "Password:"
msgstr "Lösenord:"
#: web/ejabberd_web_admin.erl:1828
msgid "No Data"
msgstr "Ingen data"
#: web/ejabberd_web_admin.erl:1906
msgid "Nodes"
msgstr "Noder"
#: web/ejabberd_web_admin.erl:1929 web/ejabberd_web_admin.erl:1951
msgid "Node "
msgstr "Nod "
#: web/ejabberd_web_admin.erl:1938
msgid "Listened Ports"
msgstr "Lyssnarport"
#: web/ejabberd_web_admin.erl:1940 web/ejabberd_web_admin.erl:2260
#: web/ejabberd_web_admin.erl:2448
msgid "Update"
msgstr "Uppdatera"
#: web/ejabberd_web_admin.erl:1943 web/ejabberd_web_admin.erl:2569
msgid "Restart"
msgstr "Omstart"
#: web/ejabberd_web_admin.erl:1945 web/ejabberd_web_admin.erl:2571
msgid "Stop"
msgstr "Stoppa"
#: web/ejabberd_web_admin.erl:1959
msgid "RPC Call Error"
msgstr "RPC Uppringningserror"
#: web/ejabberd_web_admin.erl:2000
msgid "Database Tables at "
msgstr "Databas tabell pa"
#: web/ejabberd_web_admin.erl:2007
msgid "Storage Type"
msgstr "Lagringstyp"
#: web/ejabberd_web_admin.erl:2008
msgid "Elements"
msgstr "Elements"
#: web/ejabberd_web_admin.erl:2009
msgid "Memory"
msgstr "Minne"
#: web/ejabberd_web_admin.erl:2032 web/ejabberd_web_admin.erl:2137
msgid "Error"
msgstr "Fel"
#: web/ejabberd_web_admin.erl:2034
msgid "Backup of "
msgstr "Backup av"
#: web/ejabberd_web_admin.erl:2036
msgid ""
"Please note that these options will only backup the builtin Mnesia database. "
"If you are using the ODBC module, you also need to backup your SQL database "
"separately."
msgstr ""
"Kom ihåg att dessa inställningar endast tar backup pa builtin Mnesias "
"databas. Om du använder ODBC modul så måste du ta backup på SQLs databas "
"enskilt"
#: web/ejabberd_web_admin.erl:2041
msgid "Store binary backup:"
msgstr "Lagra den binära backupen"
#: web/ejabberd_web_admin.erl:2045 web/ejabberd_web_admin.erl:2052
#: web/ejabberd_web_admin.erl:2060 web/ejabberd_web_admin.erl:2067
#: web/ejabberd_web_admin.erl:2074 web/ejabberd_web_admin.erl:2081
#: web/ejabberd_web_admin.erl:2088 web/ejabberd_web_admin.erl:2096
#: web/ejabberd_web_admin.erl:2103 web/ejabberd_web_admin.erl:2110
msgid "OK"
msgstr "OK"
#: web/ejabberd_web_admin.erl:2048
msgid "Restore binary backup immediately:"
msgstr "återställ den binära backupen omedelbart"
#: web/ejabberd_web_admin.erl:2056
msgid ""
"Restore binary backup after next ejabberd restart (requires less memory):"
msgstr "återställ den binära backupen efter nästa ejabberd omstart"
#: web/ejabberd_web_admin.erl:2063
msgid "Store plain text backup:"
msgstr "Lagra textbackup"
#: web/ejabberd_web_admin.erl:2070
msgid "Restore plain text backup immediately:"
msgstr "återställ textbackup omedelbart"
#: web/ejabberd_web_admin.erl:2077
msgid "Import users data from a PIEFXIS file (XEP-0227):"
msgstr "Importera användardata från en PIEFXIS fil (XEP-0227):"
#: web/ejabberd_web_admin.erl:2084
msgid "Export data of all users in the server to PIEFXIS files (XEP-0227):"
msgstr ""
"Exportera data av alla användare i servern till en PIEFXIS fil (XEP-0227):"
#: web/ejabberd_web_admin.erl:2091
msgid "Export data of users in a host to PIEFXIS files (XEP-0227):"
msgstr "Exportera data av användare i en host till PIEFXIS fil (XEP-0227):"
#: web/ejabberd_web_admin.erl:2099
msgid "Import user data from jabberd14 spool file:"
msgstr "Importera användare från jabberd14 Spool filer"
#: web/ejabberd_web_admin.erl:2106
msgid "Import users data from jabberd14 spool directory:"
msgstr "Importera användare från jabberd14 Spool directory:"
#: web/ejabberd_web_admin.erl:2132
msgid "Listened Ports at "
msgstr "Lyssnande portar på "
#: web/ejabberd_web_admin.erl:2157
msgid "Modules at "
msgstr "Moduler på"
#: web/ejabberd_web_admin.erl:2183
msgid "Statistics of ~p"
msgstr "Statistik på ~p"
#: web/ejabberd_web_admin.erl:2186
msgid "Uptime:"
msgstr "Tid upp"
#: web/ejabberd_web_admin.erl:2189
msgid "CPU Time:"
msgstr "CPU tid"
#: web/ejabberd_web_admin.erl:2195
msgid "Transactions Committed:"
msgstr "Transaktioner kommittade"
#: web/ejabberd_web_admin.erl:2198
msgid "Transactions Aborted:"
msgstr "Transaktioner borttagna"
#: web/ejabberd_web_admin.erl:2201
msgid "Transactions Restarted:"
msgstr "Transaktioner omstartade"
#: web/ejabberd_web_admin.erl:2204
msgid "Transactions Logged:"
msgstr "Transaktioner loggade "
#: web/ejabberd_web_admin.erl:2246
msgid "Update "
msgstr "Uppdatera"
#: web/ejabberd_web_admin.erl:2254
msgid "Update plan"
msgstr "Uppdateringsplan"
#: web/ejabberd_web_admin.erl:2255
msgid "Modified modules"
msgstr "Uppdaterade moduler"
#: web/ejabberd_web_admin.erl:2256
msgid "Update script"
msgstr "Uppdatera skript"
#: web/ejabberd_web_admin.erl:2257
msgid "Low level update script"
msgstr "Uppdaterade laglevel skript"
#: web/ejabberd_web_admin.erl:2258
msgid "Script check"
msgstr "Skript kollat"
#: web/ejabberd_web_admin.erl:2426
msgid "Port"
msgstr "Port"
#: web/ejabberd_web_admin.erl:2427
msgid "IP"
msgstr "IP"
#: web/ejabberd_web_admin.erl:2428
msgid "Protocol"
msgstr "Protocol"
#: web/ejabberd_web_admin.erl:2429 web/ejabberd_web_admin.erl:2556
msgid "Module"
msgstr "Modul"
#: web/ejabberd_web_admin.erl:2430 web/ejabberd_web_admin.erl:2557
msgid "Options"
msgstr "Parametrar"
#: web/ejabberd_web_admin.erl:2450
msgid "Delete"
msgstr "Ta bort"
#: web/ejabberd_web_admin.erl:2579
msgid "Start"
msgstr "Starta"
#: web/mod_register_web.erl:104
msgid "Your Jabber account was successfully created."
msgstr ""
#: web/mod_register_web.erl:107
msgid "There was an error creating the account: "
msgstr ""
#: web/mod_register_web.erl:115
msgid "Your Jabber account was successfully deleted."
msgstr ""
#: web/mod_register_web.erl:118
msgid "There was an error deleting the account: "
msgstr ""
#: web/mod_register_web.erl:128
msgid "The password of your Jabber account was successfully changed."
msgstr ""
#: web/mod_register_web.erl:131
msgid "There was an error changing the password: "
msgstr ""
#: web/mod_register_web.erl:163 web/mod_register_web.erl:172
msgid "Jabber Account Registration"
msgstr ""
#: web/mod_register_web.erl:174 web/mod_register_web.erl:192
#: web/mod_register_web.erl:201
msgid "Register a Jabber account"
msgstr ""
#: web/mod_register_web.erl:176 web/mod_register_web.erl:493
#: web/mod_register_web.erl:502
msgid "Unregister a Jabber account"
msgstr ""
#: web/mod_register_web.erl:203
msgid ""
"This page allows to create a Jabber account in this Jabber server. Your JID "
"(Jabber IDentifier) will be of the form: username@server. Please read "
"carefully the instructions to fill correctly the fields."
msgstr ""
#: web/mod_register_web.erl:212 web/mod_register_web.erl:386
#: web/mod_register_web.erl:509
#, fuzzy
msgid "Username:"
msgstr "IRC-användarnamn"
#: web/mod_register_web.erl:217
msgid "This is case insensitive: macbeth is the same that MacBeth and Macbeth."
msgstr ""
#: web/mod_register_web.erl:218
msgid "Characters not allowed:"
msgstr ""
#: web/mod_register_web.erl:222 web/mod_register_web.erl:391
#: web/mod_register_web.erl:514
#, fuzzy
msgid "Server:"
msgstr "Server ~b"
#: web/mod_register_web.erl:232
msgid ""
"Don't tell your password to anybody, not even the administrators of the "
"Jabber server."
msgstr ""
#: web/mod_register_web.erl:234
msgid "You can later change your password using a Jabber client."
msgstr ""
#: web/mod_register_web.erl:235
msgid ""
"Some Jabber clients can store your password in your computer. Use that "
"feature only if you trust your computer is safe."
msgstr ""
#: web/mod_register_web.erl:237
msgid ""
"Memorize your password, or write it in a paper placed in a safe place. In "
"Jabber there isn't an automated way to recover your password if you forget "
"it."
msgstr ""
#: web/mod_register_web.erl:242 web/mod_register_web.erl:406
#, fuzzy
msgid "Password Verification:"
msgstr "Lösenordsverifikation"
#: web/mod_register_web.erl:250
#, fuzzy
msgid "Register"
msgstr "Kontaktlista"
#: web/mod_register_web.erl:396
#, fuzzy
msgid "Old Password:"
msgstr "Lösenord:"
#: web/mod_register_web.erl:401
#, fuzzy
msgid "New Password:"
msgstr "Lösenord:"
#: web/mod_register_web.erl:504
msgid "This page allows to unregister a Jabber account in this Jabber server."
msgstr ""
#: web/mod_register_web.erl:524
msgid "Unregister"
msgstr ""
#, fuzzy
#~ msgid "Captcha test failed"
#~ msgstr "Din CAPTCHA är godkänd."
ejabberd-2.1.11/src/msgs/vi.po 0000664 0000000 0000000 00000156416 12240230175 012751 0 ustar msgid ""
msgstr ""
"Project-Id-Version: 2.1.0-alpha\n"
"Last-Translator: EQHO Communications (Thailand) Ltd. - http://www.eqho.com\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Language: Vietnamese (tiếng việt)\n"
#: ejabberd_c2s.erl:424 ejabberd_c2s.erl:727
msgid "Use of STARTTLS required"
msgstr "Yêu cầu sử dụng STARTTLS"
#: ejabberd_c2s.erl:503
msgid "No resource provided"
msgstr "Không có nguồn lực cung cấp"
#: ejabberd_c2s.erl:1197
msgid "Replaced by new connection"
msgstr "Được thay thế bởi kết nối mới"
#: ejabberd_c2s.erl:1885
msgid "Your active privacy list has denied the routing of this stanza."
msgstr ""
#: ejabberd_captcha.erl:96 ejabberd_captcha.erl:152 ejabberd_captcha.erl:178
#, fuzzy
msgid "Enter the text you see"
msgstr "Nhập đường dẫn đến tập tin văn bản"
#: ejabberd_captcha.erl:101
msgid "Your messages to ~s are being blocked. To unblock them, visit ~s"
msgstr ""
#: ejabberd_captcha.erl:134
msgid "If you don't see the CAPTCHA image here, visit the web page."
msgstr ""
#: ejabberd_captcha.erl:146
msgid "CAPTCHA web page"
msgstr ""
#: ejabberd_captcha.erl:307
msgid "The CAPTCHA is valid."
msgstr ""
#: mod_adhoc.erl:95 mod_adhoc.erl:125 mod_adhoc.erl:143 mod_adhoc.erl:161
msgid "Commands"
msgstr "Lệnh"
#: mod_adhoc.erl:149 mod_adhoc.erl:243
msgid "Ping"
msgstr "Ping"
#: mod_adhoc.erl:260
msgid "Pong"
msgstr "Pong"
#: mod_announce.erl:507 mod_announce_odbc.erl:499
msgid "Really delete message of the day?"
msgstr "Có thực sự xóa thư trong ngày này không?"
#: mod_announce.erl:515 mod_announce_odbc.erl:507 mod_configure.erl:1083
#: mod_configure.erl:1128
msgid "Subject"
msgstr "Tiêu đề"
#: mod_announce.erl:520 mod_announce_odbc.erl:512 mod_configure.erl:1088
#: mod_configure.erl:1133
msgid "Message body"
msgstr "Thân thư"
#: mod_announce.erl:600 mod_announce_odbc.erl:592
msgid "No body provided for announce message"
msgstr "Không có nội dung trong thư thông báo"
#: mod_announce.erl:635 mod_announce_odbc.erl:627
msgid "Announcements"
msgstr "Thông báo"
#: mod_announce.erl:637 mod_announce_odbc.erl:629
msgid "Send announcement to all users"
msgstr "Gửi thông báo đến tất cả người sử dụng"
#: mod_announce.erl:639 mod_announce_odbc.erl:631
msgid "Send announcement to all users on all hosts"
msgstr "Gửi thông báo đến tất cả người sử dụng trên tất cả các máy chủ"
#: mod_announce.erl:641 mod_announce_odbc.erl:633
msgid "Send announcement to all online users"
msgstr "Gửi thông báo đến tất cả người sử dụng trực tuyến"
#: mod_announce.erl:643 mod_announce_odbc.erl:635 mod_configure.erl:1078
#: mod_configure.erl:1123
msgid "Send announcement to all online users on all hosts"
msgstr ""
"Gửi thông báo đến tất cả người sử dụng trực tuyến trên tất cả các máy chủ"
#: mod_announce.erl:645 mod_announce_odbc.erl:637
msgid "Set message of the day and send to online users"
msgstr "Tạo lập thư trong ngày và gửi đến những người sử dụng trực tuyến"
#: mod_announce.erl:647 mod_announce_odbc.erl:639
msgid "Set message of the day on all hosts and send to online users"
msgstr ""
"Tạo lập thư trong ngày trên tất cả các máy chủ và gửi đến những người sử "
"dụng trực tuyến"
#: mod_announce.erl:649 mod_announce_odbc.erl:641
msgid "Update message of the day (don't send)"
msgstr "Cập nhật thư trong ngày (không gửi)"
#: mod_announce.erl:651 mod_announce_odbc.erl:643
msgid "Update message of the day on all hosts (don't send)"
msgstr "Cập nhật thư trong ngày trên tất cả các máy chủ (không gửi)"
#: mod_announce.erl:653 mod_announce_odbc.erl:645
msgid "Delete message of the day"
msgstr "Xóa thư trong ngày"
#: mod_announce.erl:655 mod_announce_odbc.erl:647
msgid "Delete message of the day on all hosts"
msgstr "Xóa thư trong ngày trên tất cả các máy chủ"
#: mod_configure.erl:114 mod_configure.erl:274 mod_configure.erl:296
#: mod_configure.erl:498
msgid "Configuration"
msgstr "Cấu hình"
#: mod_configure.erl:125 mod_configure.erl:576 web/ejabberd_web_admin.erl:1936
msgid "Database"
msgstr "Cơ sở dữ liệu"
#: mod_configure.erl:127 mod_configure.erl:595
msgid "Start Modules"
msgstr "Môđun Khởi Động"
#: mod_configure.erl:129 mod_configure.erl:596
msgid "Stop Modules"
msgstr "Môđun Dừng"
#: mod_configure.erl:131 mod_configure.erl:604 web/ejabberd_web_admin.erl:1937
msgid "Backup"
msgstr "Sao lưu dự phòng"
#: mod_configure.erl:133 mod_configure.erl:605
msgid "Restore"
msgstr "Khôi phục"
#: mod_configure.erl:135 mod_configure.erl:606
msgid "Dump to Text File"
msgstr "Kết xuất ra Tập Tin Văn Bản"
#: mod_configure.erl:137 mod_configure.erl:615
msgid "Import File"
msgstr "Nhập Tập Tin"
#: mod_configure.erl:139 mod_configure.erl:616
msgid "Import Directory"
msgstr "Nhập Thư Mục"
#: mod_configure.erl:141 mod_configure.erl:581 mod_configure.erl:1057
msgid "Restart Service"
msgstr "Khởi Động Lại Dịch Vụ"
#: mod_configure.erl:143 mod_configure.erl:582 mod_configure.erl:1102
msgid "Shut Down Service"
msgstr "Tắt Dịch Vụ"
#: mod_configure.erl:145 mod_configure.erl:518 mod_configure.erl:1197
#: web/ejabberd_web_admin.erl:1527
msgid "Add User"
msgstr "Thêm Người Sử Dụng"
#: mod_configure.erl:147 mod_configure.erl:519 mod_configure.erl:1219
msgid "Delete User"
msgstr "Xóa Người Sử Dụng"
#: mod_configure.erl:149 mod_configure.erl:520 mod_configure.erl:1231
msgid "End User Session"
msgstr "Kết Thúc Phiên Giao Dịch Người Sử Dụng"
#: mod_configure.erl:151 mod_configure.erl:521 mod_configure.erl:1243
#: mod_configure.erl:1255
msgid "Get User Password"
msgstr "Nhận Mật Khẩu Người Sử Dụng"
#: mod_configure.erl:153 mod_configure.erl:522
msgid "Change User Password"
msgstr "Thay Đổi Mật Khẩu Người Sử Dụng"
#: mod_configure.erl:155 mod_configure.erl:523 mod_configure.erl:1272
msgid "Get User Last Login Time"
msgstr "Nhận Thời Gian Đăng Nhập Cuối Cùng Của Người Sử Dụng"
#: mod_configure.erl:157 mod_configure.erl:524 mod_configure.erl:1284
msgid "Get User Statistics"
msgstr "Nhận Thông Tin Thống Kê Người Sử Dụng"
#: mod_configure.erl:159 mod_configure.erl:525
msgid "Get Number of Registered Users"
msgstr "Nhận Số Người Sử Dụng Đã Đăng Ký"
#: mod_configure.erl:161 mod_configure.erl:526
msgid "Get Number of Online Users"
msgstr "Nhận Số Người Sử Dụng Trực Tuyến"
#: mod_configure.erl:163 mod_configure.erl:509 web/ejabberd_web_admin.erl:831
#: web/ejabberd_web_admin.erl:872
msgid "Access Control Lists"
msgstr "Danh Sách Kiểm Soát Truy Cập"
#: mod_configure.erl:165 mod_configure.erl:510 web/ejabberd_web_admin.erl:940
#: web/ejabberd_web_admin.erl:976
msgid "Access Rules"
msgstr "Quy Tắc Truy Cập"
#: mod_configure.erl:297 mod_configure.erl:499
msgid "User Management"
msgstr "Quản Lý Người Sử Dụng"
#: mod_configure.erl:500 web/ejabberd_web_admin.erl:1058
#: web/ejabberd_web_admin.erl:1462
msgid "Online Users"
msgstr "Người Sử Dụng Trực Tuyến"
#: mod_configure.erl:501
msgid "All Users"
msgstr "Tất Cả Người Sử Dụng"
#: mod_configure.erl:502
msgid "Outgoing s2s Connections"
msgstr "Kết Nối Bên Ngoài s2s"
#: mod_configure.erl:503 web/ejabberd_web_admin.erl:1907
msgid "Running Nodes"
msgstr "Nút Hoạt Động"
#: mod_configure.erl:504 web/ejabberd_web_admin.erl:1909
msgid "Stopped Nodes"
msgstr "Nút Dừng"
#: mod_configure.erl:577 mod_configure.erl:587 web/ejabberd_web_admin.erl:1953
msgid "Modules"
msgstr "Môđun"
#: mod_configure.erl:578
msgid "Backup Management"
msgstr "Quản lý Sao Lưu Dự Phòng"
#: mod_configure.erl:579
msgid "Import Users From jabberd14 Spool Files"
msgstr "Nhập Người Sử Dụng Từ Các Tập Tin Spool jabberd14"
#: mod_configure.erl:699
msgid "To ~s"
msgstr "Gửi đến ~s"
#: mod_configure.erl:717
msgid "From ~s"
msgstr "Nhận từ ~s"
#: mod_configure.erl:913
msgid "Database Tables Configuration at "
msgstr "Cấu Hình Bảng Cơ Sở Dữ Liệu tại"
#: mod_configure.erl:918
msgid "Choose storage type of tables"
msgstr "Chọn loại bảng lưu trữ"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "Disc only copy"
msgstr "Chỉ sao chép vào đĩa"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "RAM and disc copy"
msgstr "Sao chép vào RAM và đĩa"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "RAM copy"
msgstr "Sao chép vào RAM"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "Remote copy"
msgstr "Sao chép từ xa"
#: mod_configure.erl:950
msgid "Stop Modules at "
msgstr "Môđun Dừng tại"
#: mod_configure.erl:954
msgid "Choose modules to stop"
msgstr "Chọn môđun để dừng"
#: mod_configure.erl:969
msgid "Start Modules at "
msgstr "Môđun Khởi Động tại "
#: mod_configure.erl:973
msgid "Enter list of {Module, [Options]}"
msgstr "Nhập danh sách {Môđun, [Các Tùy Chọn]}"
#: mod_configure.erl:974
msgid "List of modules to start"
msgstr "Danh sách các môđun khởi động"
#: mod_configure.erl:983
msgid "Backup to File at "
msgstr "Sao lưu dự phòng ra Tập Tin tại"
#: mod_configure.erl:987 mod_configure.erl:1001
msgid "Enter path to backup file"
msgstr "Nhập đường dẫn đến tập tin sao lưu dự phòng"
#: mod_configure.erl:988 mod_configure.erl:1002 mod_configure.erl:1016
#: mod_configure.erl:1030
msgid "Path to File"
msgstr "Đường dẫn đến Tập Tin"
#: mod_configure.erl:997
msgid "Restore Backup from File at "
msgstr "Phục hồi Sao Lưu từ Tập Tin tại "
#: mod_configure.erl:1011
msgid "Dump Backup to Text File at "
msgstr "Kết Xuất Sao Lưu ra Tập Tin Văn Bản tại"
#: mod_configure.erl:1015
msgid "Enter path to text file"
msgstr "Nhập đường dẫn đến tập tin văn bản"
#: mod_configure.erl:1025
msgid "Import User from File at "
msgstr "Nhập Người Sử Dụng từ Tập Tin tại"
#: mod_configure.erl:1029
msgid "Enter path to jabberd14 spool file"
msgstr "Nhập đường dẫn đến tập tin spool jabberd14"
#: mod_configure.erl:1039
msgid "Import Users from Dir at "
msgstr "Nhập Người Sử Dụng từ Thư Mục tại"
#: mod_configure.erl:1043
msgid "Enter path to jabberd14 spool dir"
msgstr "Nhập đường dẫn đến thư mục spool jabberd14"
#: mod_configure.erl:1044
msgid "Path to Dir"
msgstr "Đường Dẫn đến Thư Mục"
#: mod_configure.erl:1060 mod_configure.erl:1105
msgid "Time delay"
msgstr "Thời gian trì hoãn"
#: mod_configure.erl:1143
msgid "Access Control List Configuration"
msgstr "Cấu Hình Danh Sách Kiểm Soát Truy Cập"
#: mod_configure.erl:1147
msgid "Access control lists"
msgstr "Danh sách kiểm soát truy cập"
#: mod_configure.erl:1171
msgid "Access Configuration"
msgstr "Cấu Hình Truy Cập"
#: mod_configure.erl:1175
msgid "Access rules"
msgstr "Quy tắc Truy Cập"
#: mod_configure.erl:1200 mod_configure.erl:1222 mod_configure.erl:1234
#: mod_configure.erl:1246 mod_configure.erl:1258 mod_configure.erl:1275
#: mod_configure.erl:1287 mod_configure.erl:1650 mod_configure.erl:1700
#: mod_configure.erl:1721 mod_roster.erl:943 mod_roster_odbc.erl:1060
#: mod_vcard.erl:472 mod_vcard_ldap.erl:554 mod_vcard_odbc.erl:448
msgid "Jabber ID"
msgstr "Jabber ID"
#: mod_configure.erl:1205 mod_configure.erl:1263 mod_configure.erl:1651
#: mod_configure.erl:1863 mod_muc/mod_muc_room.erl:3224 mod_register.erl:235
#: web/ejabberd_web_admin.erl:1520
msgid "Password"
msgstr "Mật Khẩu"
#: mod_configure.erl:1210
msgid "Password Verification"
msgstr "Kiểm Tra Mật Khẩu"
#: mod_configure.erl:1301
msgid "Number of registered users"
msgstr "Số người sử dụng đã đăng ký"
#: mod_configure.erl:1315
msgid "Number of online users"
msgstr "Số người sử dụng trực tuyến"
#: mod_configure.erl:1682 web/ejabberd_web_admin.erl:1588
#: web/ejabberd_web_admin.erl:1743
msgid "Never"
msgstr "Không bao giờ"
#: mod_configure.erl:1696 web/ejabberd_web_admin.erl:1601
#: web/ejabberd_web_admin.erl:1756
msgid "Online"
msgstr "Trực tuyến"
#: mod_configure.erl:1701
msgid "Last login"
msgstr "Đăng nhập lần cuối"
#: mod_configure.erl:1722
msgid "Roster size"
msgstr "Kích thước bảng phân công"
#: mod_configure.erl:1723
msgid "IP addresses"
msgstr "Địa chỉ IP"
#: mod_configure.erl:1724
msgid "Resources"
msgstr "Nguồn tài nguyên"
#: mod_configure.erl:1850
msgid "Administration of "
msgstr "Quản trị về "
#: mod_configure.erl:1853
msgid "Action on user"
msgstr "Hành động đối với người sử dụng"
#: mod_configure.erl:1857
msgid "Edit Properties"
msgstr "Chỉnh Sửa Thuộc Tính"
#: mod_configure.erl:1860 web/ejabberd_web_admin.erl:1769
msgid "Remove User"
msgstr "Gỡ Bỏ Người Sử Dụng"
#: mod_irc/mod_irc.erl:201 mod_irc/mod_irc_odbc.erl:196
#: mod_muc/mod_muc.erl:336 mod_muc/mod_muc_odbc.erl:342
msgid "Access denied by service policy"
msgstr "Sự truy cập bị chặn theo chính sách phục vụ"
#: mod_irc/mod_irc.erl:401 mod_irc/mod_irc_odbc.erl:398
msgid "IRC Transport"
msgstr "Truyền tải IRC"
#: mod_irc/mod_irc.erl:428 mod_irc/mod_irc_odbc.erl:425
msgid "ejabberd IRC module"
msgstr "Môdun ejabberd IRC Bản quyền"
#: mod_irc/mod_irc.erl:559 mod_irc/mod_irc_odbc.erl:568
msgid "You need an x:data capable client to configure mod_irc settings"
msgstr ""
"Bạn cần có một trình ứng dụng khách hỗ trợ định dạng dữ liệu x: để xác định "
"các thiết lập mod_irc"
#: mod_irc/mod_irc.erl:566 mod_irc/mod_irc_odbc.erl:575
msgid "Registration in mod_irc for "
msgstr "Đăng ký trong mod_irc cho "
#: mod_irc/mod_irc.erl:571 mod_irc/mod_irc_odbc.erl:580
#, fuzzy
msgid ""
"Enter username, encodings, ports and passwords you wish to use for "
"connecting to IRC servers"
msgstr ""
"Nhập tên truy cập và mã hóa mà bạn muốn sử dụng khi kết nối với các máy chủ "
"IRC"
#: mod_irc/mod_irc.erl:576 mod_irc/mod_irc_odbc.erl:585
msgid "IRC Username"
msgstr "Tên truy cập IRC"
#: mod_irc/mod_irc.erl:586 mod_irc/mod_irc_odbc.erl:595
#, fuzzy
msgid ""
"If you want to specify different ports, passwords, encodings for IRC "
"servers, fill this list with values in format '{\"irc server\", \"encoding"
"\", port, \"password\"}'. By default this service use \"~s\" encoding, port "
"~p, empty password."
msgstr ""
"Nếu bạn muốn xác định các cách thức mã hóa khác nhau cho các máy chủ IRC, "
"hãy điền vào danh sách này những giá trị theo định dạng '{\"máy chủ irc\", "
"\"mã hóa\"}'. Dịch vụ này mặc định sử dụng định dạng mã hóa \"~s\"."
#: mod_irc/mod_irc.erl:598 mod_irc/mod_irc_odbc.erl:607
#, fuzzy
msgid ""
"Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef."
"net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."
msgstr ""
"Ví dụ: [{\"irc.lucky.net\", \"koi8-r\"}, {\"vendetta.fef.net\", "
"\"iso8859-1\"}]"
#: mod_irc/mod_irc.erl:603 mod_irc/mod_irc_odbc.erl:612
msgid "Connections parameters"
msgstr ""
#: mod_irc/mod_irc.erl:728 mod_irc/mod_irc_odbc.erl:757
msgid "Join IRC channel"
msgstr ""
#: mod_irc/mod_irc.erl:732 mod_irc/mod_irc_odbc.erl:761
msgid "IRC channel (don't put the first #)"
msgstr ""
#: mod_irc/mod_irc.erl:737 mod_irc/mod_irc_odbc.erl:766
#, fuzzy
msgid "IRC server"
msgstr "Tên truy cập IRC"
#: mod_irc/mod_irc.erl:770 mod_irc/mod_irc.erl:774
#: mod_irc/mod_irc_odbc.erl:799 mod_irc/mod_irc_odbc.erl:803
msgid "Join the IRC channel here."
msgstr ""
#: mod_irc/mod_irc.erl:778 mod_irc/mod_irc_odbc.erl:807
msgid "Join the IRC channel in this Jabber ID: ~s"
msgstr ""
#: mod_irc/mod_irc.erl:863 mod_irc/mod_irc_odbc.erl:904
msgid "IRC settings"
msgstr ""
#: mod_irc/mod_irc.erl:868 mod_irc/mod_irc_odbc.erl:909
#, fuzzy
msgid ""
"Enter username and encodings you wish to use for connecting to IRC servers. "
"Press 'Next' to get more fields to fill in. Press 'Complete' to save "
"settings."
msgstr ""
"Nhập tên truy cập và mã hóa mà bạn muốn sử dụng khi kết nối với các máy chủ "
"IRC"
#: mod_irc/mod_irc.erl:874 mod_irc/mod_irc_odbc.erl:915
#, fuzzy
msgid "IRC username"
msgstr "Tên truy cập IRC"
#: mod_irc/mod_irc.erl:923 mod_irc/mod_irc_odbc.erl:964
#, fuzzy
msgid "Password ~b"
msgstr "Mật Khẩu"
#: mod_irc/mod_irc.erl:928 mod_irc/mod_irc_odbc.erl:969
#, fuzzy
msgid "Port ~b"
msgstr "Cổng"
#: mod_irc/mod_irc.erl:933 mod_irc/mod_irc_odbc.erl:974
msgid "Encoding for server ~b"
msgstr ""
#: mod_irc/mod_irc.erl:942 mod_irc/mod_irc_odbc.erl:983
msgid "Server ~b"
msgstr ""
#: mod_muc/mod_muc.erl:449 mod_muc/mod_muc_odbc.erl:456
msgid "Only service administrators are allowed to send service messages"
msgstr "Chỉ có người quản trị dịch vụ mới được phép gửi những thư dịch vụ"
#: mod_muc/mod_muc.erl:493 mod_muc/mod_muc_odbc.erl:500
msgid "Room creation is denied by service policy"
msgstr "Việc tạo phòng bị ngăn lại theo chính sách dịch vụ"
#: mod_muc/mod_muc.erl:500 mod_muc/mod_muc_odbc.erl:507
msgid "Conference room does not exist"
msgstr "Phòng họp không tồn tại"
#: mod_muc/mod_muc.erl:582 mod_muc/mod_muc_odbc.erl:595
msgid "Chatrooms"
msgstr "Phòng trò chuyện"
#: mod_muc/mod_muc.erl:712 mod_muc/mod_muc_odbc.erl:729
#, fuzzy
msgid "You need a client that supports x:data to register the nickname"
msgstr ""
"Bạn cần có một trình ứng dụng khách hỗ trợ định dạng dữ liệu x: để đăng ký "
"bí danh"
#: mod_muc/mod_muc.erl:718 mod_muc/mod_muc_odbc.erl:735
msgid "Nickname Registration at "
msgstr "Đăng Ký Bí Danh tại"
#: mod_muc/mod_muc.erl:722 mod_muc/mod_muc_odbc.erl:739
msgid "Enter nickname you want to register"
msgstr "Nhập bí danh bạn muốn đăng ký"
#: mod_muc/mod_muc.erl:723 mod_muc/mod_muc_odbc.erl:740
#: mod_muc/mod_muc_room.erl:3810 mod_roster.erl:944 mod_roster_odbc.erl:1061
#: mod_vcard.erl:364 mod_vcard.erl:477 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:453
msgid "Nickname"
msgstr "Bí danh"
#: mod_muc/mod_muc.erl:762 mod_muc/mod_muc_odbc.erl:784
#: mod_muc/mod_muc_room.erl:1064 mod_muc/mod_muc_room.erl:1787
#, fuzzy
msgid "That nickname is registered by another person"
msgstr "Một người khác đã đăng ký bí danh này rồi"
#: mod_muc/mod_muc.erl:788 mod_muc/mod_muc_odbc.erl:811
msgid "You must fill in field \"Nickname\" in the form"
msgstr "Bạn phải điền thông tin vào ô \"Nickname\" trong biểu mẫu này"
#: mod_muc/mod_muc.erl:808 mod_muc/mod_muc_odbc.erl:831
msgid "ejabberd MUC module"
msgstr "Môdun ejabberd MUC Bản quyền"
#: mod_muc/mod_muc_log.erl:374 mod_muc/mod_muc_log.erl:381
msgid "Chatroom configuration modified"
msgstr "Cấu hình phòng trò chuyện được chỉnh sửa"
#: mod_muc/mod_muc_log.erl:384
msgid "joins the room"
msgstr "tham gia phòng này"
#: mod_muc/mod_muc_log.erl:387 mod_muc/mod_muc_log.erl:390
msgid "leaves the room"
msgstr "rời khỏi phòng này"
#: mod_muc/mod_muc_log.erl:393 mod_muc/mod_muc_log.erl:396
msgid "has been banned"
msgstr "đã bị cấm"
#: mod_muc/mod_muc_log.erl:399 mod_muc/mod_muc_log.erl:402
msgid "has been kicked"
msgstr "đã bị đẩy ra khỏi"
#: mod_muc/mod_muc_log.erl:405
msgid "has been kicked because of an affiliation change"
msgstr ""
#: mod_muc/mod_muc_log.erl:408
msgid "has been kicked because the room has been changed to members-only"
msgstr ""
#: mod_muc/mod_muc_log.erl:411
msgid "has been kicked because of a system shutdown"
msgstr ""
#: mod_muc/mod_muc_log.erl:414
msgid "is now known as"
msgstr "bây giờ được biết như"
#: mod_muc/mod_muc_log.erl:417 mod_muc/mod_muc_log.erl:688
#: mod_muc/mod_muc_room.erl:2393
msgid " has set the subject to: "
msgstr " đã đặt chủ đề thành: "
#: mod_muc/mod_muc_log.erl:452
#, fuzzy
msgid "Chatroom is created"
msgstr "Phòng trò chuyện"
#: mod_muc/mod_muc_log.erl:453
#, fuzzy
msgid "Chatroom is destroyed"
msgstr "Phòng trò chuyện"
#: mod_muc/mod_muc_log.erl:454
#, fuzzy
msgid "Chatroom is started"
msgstr "Phòng trò chuyện"
#: mod_muc/mod_muc_log.erl:455
#, fuzzy
msgid "Chatroom is stopped"
msgstr "Phòng trò chuyện"
#: mod_muc/mod_muc_log.erl:459
msgid "Monday"
msgstr "Thứ Hai"
#: mod_muc/mod_muc_log.erl:460
msgid "Tuesday"
msgstr "Thứ Ba"
#: mod_muc/mod_muc_log.erl:461
msgid "Wednesday"
msgstr "Thứ Tư"
#: mod_muc/mod_muc_log.erl:462
msgid "Thursday"
msgstr "Thứ Năm"
#: mod_muc/mod_muc_log.erl:463
msgid "Friday"
msgstr "Thứ Sáu"
#: mod_muc/mod_muc_log.erl:464
msgid "Saturday"
msgstr "Thứ Bảy"
#: mod_muc/mod_muc_log.erl:465
msgid "Sunday"
msgstr "Chủ Nhật"
#: mod_muc/mod_muc_log.erl:469
msgid "January"
msgstr "Tháng Một"
#: mod_muc/mod_muc_log.erl:470
msgid "February"
msgstr "Tháng Hai"
#: mod_muc/mod_muc_log.erl:471
msgid "March"
msgstr "Tháng Ba"
#: mod_muc/mod_muc_log.erl:472
msgid "April"
msgstr "Tháng Tư"
#: mod_muc/mod_muc_log.erl:473
msgid "May"
msgstr "Tháng Năm"
#: mod_muc/mod_muc_log.erl:474
msgid "June"
msgstr "Tháng Sáu"
#: mod_muc/mod_muc_log.erl:475
msgid "July"
msgstr "Tháng Bảy"
#: mod_muc/mod_muc_log.erl:476
msgid "August"
msgstr "Tháng Tám"
#: mod_muc/mod_muc_log.erl:477
msgid "September"
msgstr "Tháng Chín"
#: mod_muc/mod_muc_log.erl:478
msgid "October"
msgstr "Tháng Mười"
#: mod_muc/mod_muc_log.erl:479
msgid "November"
msgstr "Tháng Mười Một"
#: mod_muc/mod_muc_log.erl:480
msgid "December"
msgstr "Tháng Mười Hai"
#: mod_muc/mod_muc_log.erl:750
msgid "Room Configuration"
msgstr "Cấu Hình Phòng"
#: mod_muc/mod_muc_log.erl:759
#, fuzzy
msgid "Room Occupants"
msgstr "Số người tham dự"
#: mod_muc/mod_muc_room.erl:174
msgid "Traffic rate limit is exceeded"
msgstr "Quá giới hạn tỷ lệ lưu lượng truyền tải"
#: mod_muc/mod_muc_room.erl:246
msgid ""
"This participant is kicked from the room because he sent an error message"
msgstr ""
#: mod_muc/mod_muc_room.erl:255
msgid "It is not allowed to send private messages to the conference"
msgstr "Không được phép gửi những thư riêng đến phòng họp"
#: mod_muc/mod_muc_room.erl:332
msgid "Please, wait for a while before sending new voice request"
msgstr ""
#: mod_muc/mod_muc_room.erl:347
msgid "Voice requests are disabled in this conference"
msgstr ""
#: mod_muc/mod_muc_room.erl:364
msgid "Failed to extract JID from your voice request approval"
msgstr ""
#: mod_muc/mod_muc_room.erl:393
msgid "Only moderators can approve voice requests"
msgstr ""
#: mod_muc/mod_muc_room.erl:408
msgid "Improper message type"
msgstr "Loại thư không phù hợp"
#: mod_muc/mod_muc_room.erl:518
msgid ""
"This participant is kicked from the room because he sent an error message to "
"another participant"
msgstr ""
#: mod_muc/mod_muc_room.erl:531
msgid "It is not allowed to send private messages of type \"groupchat\""
msgstr "Không được phép gửi những thư riêng loại \"groupchat\""
#: mod_muc/mod_muc_room.erl:543 mod_muc/mod_muc_room.erl:611
msgid "Recipient is not in the conference room"
msgstr "Người nhận không có trong phòng họp"
#: mod_muc/mod_muc_room.erl:564 mod_muc/mod_muc_room.erl:585
#, fuzzy
msgid "It is not allowed to send private messages"
msgstr "Không được phép gửi những thư riêng đến phòng họp"
#: mod_muc/mod_muc_room.erl:576 mod_muc/mod_muc_room.erl:956
#: mod_muc/mod_muc_room.erl:4040
msgid "Only occupants are allowed to send messages to the conference"
msgstr "Chỉ có những đối tượng tham gia mới được phép gửi thư đến phòng họp"
#: mod_muc/mod_muc_room.erl:634
msgid "Only occupants are allowed to send queries to the conference"
msgstr ""
"Chỉ có những đối tượng tham gia mới được phép gửi yêu cầu đến phòng họp"
#: mod_muc/mod_muc_room.erl:646
msgid "Queries to the conference members are not allowed in this room"
msgstr ""
"Không được phép gửi các yêu cầu gửi đến các thành viên trong phòng họp này"
#: mod_muc/mod_muc_room.erl:932
#, fuzzy
msgid ""
"Only moderators and participants are allowed to change the subject in this "
"room"
msgstr ""
"Chỉ có những người điều phối và những người tham gia được phép thay đổi chủ "
"đề trong phòng này"
#: mod_muc/mod_muc_room.erl:937
#, fuzzy
msgid "Only moderators are allowed to change the subject in this room"
msgstr "Chỉ có những người điều phối được phép thay đổi chủ đề trong phòng này"
#: mod_muc/mod_muc_room.erl:947
msgid "Visitors are not allowed to send messages to all occupants"
msgstr "Người ghé thăm không được phép gửi thư đến tất cả các người tham dự"
#: mod_muc/mod_muc_room.erl:1021
msgid ""
"This participant is kicked from the room because he sent an error presence"
msgstr ""
#: mod_muc/mod_muc_room.erl:1040
#, fuzzy
msgid "Visitors are not allowed to change their nicknames in this room"
msgstr "Chỉ có những người điều phối được phép thay đổi chủ đề trong phòng này"
#: mod_muc/mod_muc_room.erl:1053 mod_muc/mod_muc_room.erl:1779
#, fuzzy
msgid "That nickname is already in use by another occupant"
msgstr "Bí danh đang do một người tham dự khác sử dụng"
#: mod_muc/mod_muc_room.erl:1768
msgid "You have been banned from this room"
msgstr "Bạn bị cấm tham gia phòng này"
#: mod_muc/mod_muc_room.erl:1771
#, fuzzy
msgid "Membership is required to enter this room"
msgstr "Yêu cầu tư cách thành viên khi tham gia vào phòng này"
#: mod_muc/mod_muc_room.erl:1807
msgid "This room is not anonymous"
msgstr "Phòng này không nặc danh"
#: mod_muc/mod_muc_room.erl:1833
#, fuzzy
msgid "A password is required to enter this room"
msgstr "Yêu cầu nhập mật khẩu để vào phòng này"
#: mod_muc/mod_muc_room.erl:1855 mod_register.erl:246
msgid "Too many CAPTCHA requests"
msgstr ""
#: mod_muc/mod_muc_room.erl:1864 mod_register.erl:251
msgid "Unable to generate a CAPTCHA"
msgstr ""
#: mod_muc/mod_muc_room.erl:1874
msgid "Incorrect password"
msgstr "Mật khẩu sai"
#: mod_muc/mod_muc_room.erl:2448
msgid "Administrator privileges required"
msgstr "Yêu cầu đặc quyền của nhà quản trị"
#: mod_muc/mod_muc_room.erl:2463
msgid "Moderator privileges required"
msgstr "Yêu cầu đặc quyền của nhà điều phối"
#: mod_muc/mod_muc_room.erl:2619
msgid "Jabber ID ~s is invalid"
msgstr "Jabber ID ~s không hợp lệ"
#: mod_muc/mod_muc_room.erl:2633
msgid "Nickname ~s does not exist in the room"
msgstr "Bí danh ~s không tồn tại trong phòng này"
#: mod_muc/mod_muc_room.erl:2659 mod_muc/mod_muc_room.erl:3049
msgid "Invalid affiliation: ~s"
msgstr "Tư cách không hợp lệ: ~s"
#: mod_muc/mod_muc_room.erl:2713
msgid "Invalid role: ~s"
msgstr "Vai trò không hợp lệ: ~s"
#: mod_muc/mod_muc_room.erl:3026 mod_muc/mod_muc_room.erl:3062
msgid "Owner privileges required"
msgstr "Yêu cầu đặc quyền của người sở hữu"
#: mod_muc/mod_muc_room.erl:3195
#, fuzzy
msgid "Configuration of room ~s"
msgstr "Cấu hình cho "
#: mod_muc/mod_muc_room.erl:3200
msgid "Room title"
msgstr "Tên phòng"
#: mod_muc/mod_muc_room.erl:3203 mod_muc/mod_muc_room.erl:3692
#, fuzzy
msgid "Room description"
msgstr "Miêu tả:"
#: mod_muc/mod_muc_room.erl:3210
msgid "Make room persistent"
msgstr "Tạo phòng bền vững"
#: mod_muc/mod_muc_room.erl:3215
msgid "Make room public searchable"
msgstr "Tạo phòng có thể tìm kiếm công khai"
#: mod_muc/mod_muc_room.erl:3218
msgid "Make participants list public"
msgstr "Tạo danh sách người tham dự công khai"
#: mod_muc/mod_muc_room.erl:3221
msgid "Make room password protected"
msgstr "Tạo phòng được bảo vệ bằng mật khẩu"
#: mod_muc/mod_muc_room.erl:3232
msgid "Maximum Number of Occupants"
msgstr "Số Lượng Người Tham Dự Tối Đa"
#: mod_muc/mod_muc_room.erl:3239
msgid "No limit"
msgstr "Không giới hạn"
#: mod_muc/mod_muc_room.erl:3250
msgid "Present real Jabber IDs to"
msgstr "Jabber ID thực tế hiện hành đến"
#: mod_muc/mod_muc_room.erl:3258 mod_muc/mod_muc_room.erl:3292
msgid "moderators only"
msgstr "nhà điều phối duy nhất"
#: mod_muc/mod_muc_room.erl:3260 mod_muc/mod_muc_room.erl:3294
msgid "anyone"
msgstr "bất kỳ ai"
#: mod_muc/mod_muc_room.erl:3262
msgid "Make room members-only"
msgstr "Tạo phòng chỉ cho phép tư cách thành viên tham gia"
#: mod_muc/mod_muc_room.erl:3265
#, fuzzy
msgid "Make room moderated"
msgstr "Tạo phòng bền vững"
#: mod_muc/mod_muc_room.erl:3268
msgid "Default users as participants"
msgstr "Người sử dụng mặc định là người tham dự"
#: mod_muc/mod_muc_room.erl:3271
#, fuzzy
msgid "Allow users to change the subject"
msgstr "Cho phép người sử dụng thay đổi chủ đề"
#: mod_muc/mod_muc_room.erl:3274
msgid "Allow users to send private messages"
msgstr "Cho phép người sử dụng gửi thư riêng"
#: mod_muc/mod_muc_room.erl:3279
#, fuzzy
msgid "Allow visitors to send private messages to"
msgstr "Cho phép người sử dụng gửi thư riêng"
#: mod_muc/mod_muc_room.erl:3290
msgid "nobody"
msgstr ""
#: mod_muc/mod_muc_room.erl:3296
msgid "Allow users to query other users"
msgstr "Cho phép người sử dụng hỏi người sử dụng khác"
#: mod_muc/mod_muc_room.erl:3299
msgid "Allow users to send invites"
msgstr "Cho phép người sử dụng gửi lời mời"
#: mod_muc/mod_muc_room.erl:3302
#, fuzzy
msgid "Allow visitors to send status text in presence updates"
msgstr "Cho phép người sử dụng gửi thư riêng"
#: mod_muc/mod_muc_room.erl:3305
#, fuzzy
msgid "Allow visitors to change nickname"
msgstr "Cho phép người sử dụng thay đổi chủ đề"
#: mod_muc/mod_muc_room.erl:3308
#, fuzzy
msgid "Allow visitors to send voice requests"
msgstr "Cho phép người sử dụng gửi lời mời"
#: mod_muc/mod_muc_room.erl:3311
msgid "Minimum interval between voice requests (in seconds)"
msgstr ""
#: mod_muc/mod_muc_room.erl:3317
#, fuzzy
msgid "Make room CAPTCHA protected"
msgstr "Tạo phòng được bảo vệ bằng mật khẩu"
#: mod_muc/mod_muc_room.erl:3322
msgid "Exclude Jabber IDs from CAPTCHA challenge"
msgstr ""
#: mod_muc/mod_muc_room.erl:3329
msgid "Enable logging"
msgstr "Cho phép ghi nhật ký"
#: mod_muc/mod_muc_room.erl:3337
msgid "You need an x:data capable client to configure room"
msgstr ""
"Bạn cần có một trình ứng dụng khách hỗ trợ định dạng dữ liệu x: để xác định "
"cấu hình phòng họp"
#: mod_muc/mod_muc_room.erl:3694
msgid "Number of occupants"
msgstr "Số người tham dự"
#: mod_muc/mod_muc_room.erl:3750
msgid "private, "
msgstr "riêng,"
#: mod_muc/mod_muc_room.erl:3799
msgid "Voice request"
msgstr ""
#: mod_muc/mod_muc_room.erl:3803
msgid "Either approve or decline the voice request."
msgstr ""
#: mod_muc/mod_muc_room.erl:3809
#, fuzzy
msgid "User JID"
msgstr "Người sử dụng "
#: mod_muc/mod_muc_room.erl:3811
msgid "Grant voice to this person?"
msgstr ""
#: mod_muc/mod_muc_room.erl:3960
msgid "~s invites you to the room ~s"
msgstr "~s mời bạn vào phòng ~s"
#: mod_muc/mod_muc_room.erl:3969
msgid "the password is"
msgstr "mật khẩu là"
#: mod_offline.erl:510 mod_offline_odbc.erl:352
msgid ""
"Your contact offline message queue is full. The message has been discarded."
msgstr ""
"Danh sách chờ thư liên lạc ngoại tuyến của bạn đã đầy. Thư này đã bị loại bỏ."
#: mod_offline.erl:560 mod_offline_odbc.erl:408
msgid "~s's Offline Messages Queue"
msgstr "~s's Danh Sách Chờ Thư Ngoại Tuyến"
#: mod_offline.erl:563 mod_offline_odbc.erl:411 mod_roster.erl:987
#: mod_roster_odbc.erl:1104 mod_shared_roster.erl:901
#: mod_shared_roster.erl:1010 mod_shared_roster_odbc.erl:930
#: mod_shared_roster_odbc.erl:1039 web/ejabberd_web_admin.erl:833
#: web/ejabberd_web_admin.erl:874 web/ejabberd_web_admin.erl:942
#: web/ejabberd_web_admin.erl:978 web/ejabberd_web_admin.erl:1019
#: web/ejabberd_web_admin.erl:1508 web/ejabberd_web_admin.erl:1760
#: web/ejabberd_web_admin.erl:1931 web/ejabberd_web_admin.erl:1963
#: web/ejabberd_web_admin.erl:2031 web/ejabberd_web_admin.erl:2135
#: web/ejabberd_web_admin.erl:2160 web/ejabberd_web_admin.erl:2248
msgid "Submitted"
msgstr "Đã gửi"
#: mod_offline.erl:571
msgid "Time"
msgstr "Thời Gian"
#: mod_offline.erl:572
msgid "From"
msgstr "Từ"
#: mod_offline.erl:573
msgid "To"
msgstr "Đến"
#: mod_offline.erl:574 mod_offline_odbc.erl:419
msgid "Packet"
msgstr "Gói thông tin"
#: mod_offline.erl:587 mod_offline_odbc.erl:432 mod_shared_roster.erl:908
#: mod_shared_roster_odbc.erl:937 web/ejabberd_web_admin.erl:882
#: web/ejabberd_web_admin.erl:986
msgid "Delete Selected"
msgstr "Tùy chọn Xóa được Chọn"
#: mod_offline.erl:645 mod_offline_odbc.erl:519
msgid "Offline Messages:"
msgstr "Thư Ngoại Tuyến:"
#: mod_offline.erl:645 mod_offline_odbc.erl:519
#, fuzzy
msgid "Remove All Offline Messages"
msgstr "Thư Ngoại Tuyến"
#: mod_proxy65/mod_proxy65_service.erl:213
msgid "ejabberd SOCKS5 Bytestreams module"
msgstr "Môdun SOCKS5 Bytestreams Bản quyền"
#: mod_pubsub/mod_pubsub.erl:1120 mod_pubsub/mod_pubsub_odbc.erl:929
msgid "Publish-Subscribe"
msgstr "Xuất Bản-Đăng Ký"
#: mod_pubsub/mod_pubsub.erl:1214 mod_pubsub/mod_pubsub_odbc.erl:1025
msgid "ejabberd Publish-Subscribe module"
msgstr "Môdun ejabberd Xuất Bản-Đăng Ký Bản quyền"
#: mod_pubsub/mod_pubsub.erl:1497 mod_pubsub/mod_pubsub_odbc.erl:1312
msgid "PubSub subscriber request"
msgstr "Yêu cầu người đăng ký môđun Xuất Bản Đăng Ký"
#: mod_pubsub/mod_pubsub.erl:1499 mod_pubsub/mod_pubsub_odbc.erl:1314
msgid "Choose whether to approve this entity's subscription."
msgstr "Chọn có nên chấp nhận sự đăng ký của đối tượng này không"
#: mod_pubsub/mod_pubsub.erl:1505 mod_pubsub/mod_pubsub_odbc.erl:1320
msgid "Node ID"
msgstr "ID Nút"
#: mod_pubsub/mod_pubsub.erl:1510 mod_pubsub/mod_pubsub_odbc.erl:1325
msgid "Subscriber Address"
msgstr "Địa Chỉ Người Đăng Ký"
#: mod_pubsub/mod_pubsub.erl:1516 mod_pubsub/mod_pubsub_odbc.erl:1331
msgid "Allow this Jabber ID to subscribe to this pubsub node?"
msgstr "Cho phép Jabber ID đăng ký nút môđun xuất bản đăng ký này không?"
#: mod_pubsub/mod_pubsub.erl:3474 mod_pubsub/mod_pubsub_odbc.erl:3287
msgid "Deliver payloads with event notifications"
msgstr "Đưa ra thông tin dung lượng với các thông báo sự kiện"
#: mod_pubsub/mod_pubsub.erl:3475 mod_pubsub/mod_pubsub_odbc.erl:3288
msgid "Deliver event notifications"
msgstr "Đưa ra các thông báo sự kiện"
#: mod_pubsub/mod_pubsub.erl:3476 mod_pubsub/mod_pubsub_odbc.erl:3289
msgid "Notify subscribers when the node configuration changes"
msgstr "Thông báo cho người đăng ký khi nào cấu hình nút thay đổi"
#: mod_pubsub/mod_pubsub.erl:3477 mod_pubsub/mod_pubsub_odbc.erl:3290
msgid "Notify subscribers when the node is deleted"
msgstr "Thông báo cho người đăng ký khi nào nút bị xóa bỏ"
#: mod_pubsub/mod_pubsub.erl:3478 mod_pubsub/mod_pubsub_odbc.erl:3291
msgid "Notify subscribers when items are removed from the node"
msgstr "Thông báo cho người đăng ký khi nào các mục chọn bị gỡ bỏ khỏi nút"
#: mod_pubsub/mod_pubsub.erl:3479 mod_pubsub/mod_pubsub_odbc.erl:3292
msgid "Persist items to storage"
msgstr "Những mục cần để lưu trữ"
#: mod_pubsub/mod_pubsub.erl:3480 mod_pubsub/mod_pubsub_odbc.erl:3293
msgid "A friendly name for the node"
msgstr ""
#: mod_pubsub/mod_pubsub.erl:3481 mod_pubsub/mod_pubsub_odbc.erl:3294
msgid "Max # of items to persist"
msgstr "Số mục tối đa để lưu trữ"
#: mod_pubsub/mod_pubsub.erl:3482 mod_pubsub/mod_pubsub_odbc.erl:3295
msgid "Whether to allow subscriptions"
msgstr "Xác định nên cho phép đăng ký không"
#: mod_pubsub/mod_pubsub.erl:3483 mod_pubsub/mod_pubsub_odbc.erl:3296
msgid "Specify the access model"
msgstr "Xác định mô hình truy cập"
#: mod_pubsub/mod_pubsub.erl:3486 mod_pubsub/mod_pubsub_odbc.erl:3299
msgid "Roster groups allowed to subscribe"
msgstr ""
#: mod_pubsub/mod_pubsub.erl:3487 mod_pubsub/mod_pubsub_odbc.erl:3300
msgid "Specify the publisher model"
msgstr "Xác định mô hình nhà xuất bản"
#: mod_pubsub/mod_pubsub.erl:3489 mod_pubsub/mod_pubsub_odbc.erl:3302
msgid "Purge all items when the relevant publisher goes offline"
msgstr ""
#: mod_pubsub/mod_pubsub.erl:3490 mod_pubsub/mod_pubsub_odbc.erl:3303
#, fuzzy
msgid "Specify the event message type"
msgstr "Xác định mô hình truy cập"
#: mod_pubsub/mod_pubsub.erl:3492 mod_pubsub/mod_pubsub_odbc.erl:3305
msgid "Max payload size in bytes"
msgstr "Kích thước dung lượng byte tối đa"
#: mod_pubsub/mod_pubsub.erl:3493 mod_pubsub/mod_pubsub_odbc.erl:3306
msgid "When to send the last published item"
msgstr "Khi cần gửi mục được xuất bản cuối cùng"
#: mod_pubsub/mod_pubsub.erl:3495 mod_pubsub/mod_pubsub_odbc.erl:3308
msgid "Only deliver notifications to available users"
msgstr "Chỉ gửi thông báo đến những người sử dụng hiện có"
#: mod_pubsub/mod_pubsub.erl:3496 mod_pubsub/mod_pubsub_odbc.erl:3309
msgid "The collections with which a node is affiliated"
msgstr ""
#: mod_register.erl:193
msgid "The CAPTCHA verification has failed"
msgstr ""
#: mod_register.erl:220
#, fuzzy
msgid "You need a client that supports x:data and CAPTCHA to register"
msgstr ""
"Bạn cần có một trình ứng dụng khách hỗ trợ định dạng dữ liệu x: để đăng ký "
"bí danh"
#: mod_register.erl:226 mod_register.erl:265
msgid "Choose a username and password to register with this server"
msgstr "Chọn một tên truy cập và mật khẩu để đăng ký với máy chủ này"
#: mod_register.erl:230 mod_vcard.erl:364 mod_vcard_odbc.erl:342
#: web/ejabberd_web_admin.erl:1515 web/ejabberd_web_admin.erl:1572
msgid "User"
msgstr "Người sử dụng"
#: mod_register.erl:316 mod_register.erl:361
#, fuzzy
msgid "The password is too weak"
msgstr "mật khẩu là"
#: mod_register.erl:365
#, fuzzy
msgid "Users are not allowed to register accounts so quickly"
msgstr "Người ghé thăm không được phép gửi thư đến tất cả các người tham dự"
#: mod_roster.erl:938 mod_roster_odbc.erl:1055 web/ejabberd_web_admin.erl:1701
#: web/ejabberd_web_admin.erl:1886 web/ejabberd_web_admin.erl:1897
#: web/ejabberd_web_admin.erl:2219
msgid "None"
msgstr "Không có"
#: mod_roster.erl:945 mod_roster_odbc.erl:1062
msgid "Subscription"
msgstr "Đăng ký"
#: mod_roster.erl:946 mod_roster_odbc.erl:1063
msgid "Pending"
msgstr "Chờ"
#: mod_roster.erl:947 mod_roster_odbc.erl:1064
msgid "Groups"
msgstr "Nhóm"
#: mod_roster.erl:974 mod_roster_odbc.erl:1091
msgid "Validate"
msgstr "Xác nhận hợp lệ"
#: mod_roster.erl:982 mod_roster_odbc.erl:1099
msgid "Remove"
msgstr "Gỡ bỏ"
#: mod_roster.erl:985 mod_roster_odbc.erl:1102
msgid "Roster of "
msgstr "Bảng phân công của "
#: mod_roster.erl:988 mod_roster_odbc.erl:1105 mod_shared_roster.erl:902
#: mod_shared_roster.erl:1011 mod_shared_roster_odbc.erl:931
#: mod_shared_roster_odbc.erl:1040 web/ejabberd_web_admin.erl:834
#: web/ejabberd_web_admin.erl:875 web/ejabberd_web_admin.erl:943
#: web/ejabberd_web_admin.erl:979 web/ejabberd_web_admin.erl:1020
#: web/ejabberd_web_admin.erl:1509 web/ejabberd_web_admin.erl:1761
#: web/ejabberd_web_admin.erl:1932 web/ejabberd_web_admin.erl:2136
#: web/ejabberd_web_admin.erl:2161
msgid "Bad format"
msgstr "Định dạng hỏng"
#: mod_roster.erl:995 mod_roster_odbc.erl:1112
msgid "Add Jabber ID"
msgstr "Thêm Jabber ID"
#: mod_roster.erl:1094 mod_roster_odbc.erl:1211
msgid "Roster"
msgstr "Bảng phân công"
#: mod_shared_roster.erl:857 mod_shared_roster.erl:899
#: mod_shared_roster.erl:1007 mod_shared_roster_odbc.erl:886
#: mod_shared_roster_odbc.erl:928 mod_shared_roster_odbc.erl:1036
msgid "Shared Roster Groups"
msgstr "Nhóm Phân Công Chia Sẻ"
#: mod_shared_roster.erl:895 mod_shared_roster_odbc.erl:924
#: web/ejabberd_web_admin.erl:1365 web/ejabberd_web_admin.erl:2461
msgid "Add New"
msgstr "Thêm Mới"
#: mod_shared_roster.erl:978 mod_shared_roster_odbc.erl:1007
msgid "Name:"
msgstr "Tên:"
#: mod_shared_roster.erl:983 mod_shared_roster_odbc.erl:1012
msgid "Description:"
msgstr "Miêu tả:"
#: mod_shared_roster.erl:991 mod_shared_roster_odbc.erl:1020
msgid "Members:"
msgstr "Thành viên:"
#: mod_shared_roster.erl:999 mod_shared_roster_odbc.erl:1028
msgid "Displayed Groups:"
msgstr "Nhóm được hiển thị:"
#: mod_shared_roster.erl:1008 mod_shared_roster_odbc.erl:1037
msgid "Group "
msgstr "Nhóm "
#: mod_shared_roster.erl:1017 mod_shared_roster_odbc.erl:1046
#: web/ejabberd_web_admin.erl:840 web/ejabberd_web_admin.erl:884
#: web/ejabberd_web_admin.erl:949 web/ejabberd_web_admin.erl:1026
#: web/ejabberd_web_admin.erl:2017
msgid "Submit"
msgstr "Gửi"
#: mod_vcard.erl:165 mod_vcard_ldap.erl:238 mod_vcard_odbc.erl:129
msgid "Erlang Jabber Server"
msgstr "Erlang Jabber Server Bản quyền"
#: mod_vcard.erl:364 mod_vcard.erl:478 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:454
msgid "Birthday"
msgstr "Ngày sinh"
#: mod_vcard.erl:364 mod_vcard.erl:480 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:456
msgid "City"
msgstr "Thành phố"
#: mod_vcard.erl:364 mod_vcard.erl:479 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:455
msgid "Country"
msgstr "Quốc gia"
#: mod_vcard.erl:364 mod_vcard.erl:481 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:457
msgid "Email"
msgstr "Email"
#: mod_vcard.erl:364 mod_vcard.erl:476 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:452
msgid "Family Name"
msgstr "Họ"
#: mod_vcard.erl:364 mod_vcard_odbc.erl:342
msgid ""
"Fill in the form to search for any matching Jabber User (Add * to the end of "
"field to match substring)"
msgstr ""
"Điền vào mẫu này để tìm kiếm bất kỳ thông tin nào khớp với Người sử dụng "
"Jabber (Thêm dấu * vào cuối ô để thông tin khớp với chuỗi bên trong)"
#: mod_vcard.erl:364 mod_vcard.erl:473 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:449
msgid "Full Name"
msgstr "Tên Đầy Đủ"
#: mod_vcard.erl:364 mod_vcard.erl:475 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:451
msgid "Middle Name"
msgstr "Họ Đệm"
#: mod_vcard.erl:364 mod_vcard.erl:474 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:450 web/ejabberd_web_admin.erl:2006
msgid "Name"
msgstr "Tên"
#: mod_vcard.erl:364 mod_vcard.erl:482 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:458
msgid "Organization Name"
msgstr "Tên Tổ Chức"
#: mod_vcard.erl:364 mod_vcard.erl:483 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:459
msgid "Organization Unit"
msgstr "Bộ Phận"
#: mod_vcard.erl:364 mod_vcard_ldap.erl:462 mod_vcard_odbc.erl:342
msgid "Search users in "
msgstr "Tìm kiếm người sử dụng trong"
#: mod_vcard.erl:364 mod_vcard_ldap.erl:462 mod_vcard_odbc.erl:342
msgid "You need an x:data capable client to search"
msgstr ""
"Bạn cần có một trình ứng dụng khách hỗ trợ định dạng dữ liệu x: để tìm kiếm"
#: mod_vcard.erl:389 mod_vcard_ldap.erl:487 mod_vcard_odbc.erl:367
msgid "vCard User Search"
msgstr "Tìm Kiếm Người Sử Dụng vCard"
#: mod_vcard.erl:445 mod_vcard_ldap.erl:541 mod_vcard_odbc.erl:421
msgid "ejabberd vCard module"
msgstr "Môdun ejabberd vCard Bản quyền"
#: mod_vcard.erl:469 mod_vcard_ldap.erl:551 mod_vcard_odbc.erl:445
msgid "Search Results for "
msgstr "Kết Quả Tìm Kiếm cho "
#: mod_vcard_ldap.erl:462
msgid "Fill in fields to search for any matching Jabber User"
msgstr ""
"Điền vào các ô để tìm kiếm bất kỳ các thông tin nào khớp với Người sử dụng "
"Jabber"
#: web/ejabberd_web_admin.erl:193 web/ejabberd_web_admin.erl:203
#: web/ejabberd_web_admin.erl:219 web/ejabberd_web_admin.erl:229
msgid "Unauthorized"
msgstr ""
#: web/ejabberd_web_admin.erl:286 web/ejabberd_web_admin.erl:303
#, fuzzy
msgid "ejabberd Web Admin"
msgstr "Giao diện Web ejabberd"
#: web/ejabberd_web_admin.erl:769 web/ejabberd_web_admin.erl:780
msgid "Administration"
msgstr "Quản trị"
#: web/ejabberd_web_admin.erl:878 web/ejabberd_web_admin.erl:982
msgid "Raw"
msgstr "Thô"
#: web/ejabberd_web_admin.erl:1017
msgid "~s access rule configuration"
msgstr "~s cấu hình quy tắc truy cập"
#: web/ejabberd_web_admin.erl:1035
msgid "Virtual Hosts"
msgstr "Máy Chủ Ảo"
#: web/ejabberd_web_admin.erl:1043 web/ejabberd_web_admin.erl:1050
msgid "Users"
msgstr "Người sử dụng"
#: web/ejabberd_web_admin.erl:1078
msgid "Users Last Activity"
msgstr "Hoạt Động Cuối Cùng Của Người Sử Dụng"
#: web/ejabberd_web_admin.erl:1080
msgid "Period: "
msgstr "Giai đoạn: "
#: web/ejabberd_web_admin.erl:1090
msgid "Last month"
msgstr "Tháng trước"
#: web/ejabberd_web_admin.erl:1091
msgid "Last year"
msgstr "Năm trước"
#: web/ejabberd_web_admin.erl:1092
msgid "All activity"
msgstr "Tất cả hoạt động"
#: web/ejabberd_web_admin.erl:1094
msgid "Show Ordinary Table"
msgstr "Hiển Thị Bảng Thường"
#: web/ejabberd_web_admin.erl:1096
msgid "Show Integral Table"
msgstr "Hiển Thị Bảng Đầy Đủ"
#: web/ejabberd_web_admin.erl:1105 web/ejabberd_web_admin.erl:1939
msgid "Statistics"
msgstr "Số liệu thống kê"
#: web/ejabberd_web_admin.erl:1117
#, fuzzy
msgid "Not Found"
msgstr "Nút không tìm thấy"
#: web/ejabberd_web_admin.erl:1134
msgid "Node not found"
msgstr "Nút không tìm thấy"
#: web/ejabberd_web_admin.erl:1460
msgid "Host"
msgstr "Máy chủ"
#: web/ejabberd_web_admin.erl:1461
msgid "Registered Users"
msgstr "Người Sử Dụng Đã Đăng Ký"
#: web/ejabberd_web_admin.erl:1573
msgid "Offline Messages"
msgstr "Thư Ngoại Tuyến"
#: web/ejabberd_web_admin.erl:1574 web/ejabberd_web_admin.erl:1767
msgid "Last Activity"
msgstr "Hoạt Động Cuối Cùng"
#: web/ejabberd_web_admin.erl:1659 web/ejabberd_web_admin.erl:1675
msgid "Registered Users:"
msgstr "Người Sử Dụng Đã Đăng Ký:"
#: web/ejabberd_web_admin.erl:1661 web/ejabberd_web_admin.erl:1677
#: web/ejabberd_web_admin.erl:2192
msgid "Online Users:"
msgstr "Người Sử Dụng Trực Tuyến:"
#: web/ejabberd_web_admin.erl:1663
msgid "Outgoing s2s Connections:"
msgstr "Kết Nối Bên Ngoài s2s:"
#: web/ejabberd_web_admin.erl:1665
msgid "Outgoing s2s Servers:"
msgstr "Máy chủ Bên Ngoài s2s:"
#: web/ejabberd_web_admin.erl:1734 web/mod_register_web.erl:175
#: web/mod_register_web.erl:372 web/mod_register_web.erl:381
#: web/mod_register_web.erl:411
msgid "Change Password"
msgstr "Thay Đổi Mật Khẩu"
#: web/ejabberd_web_admin.erl:1758
msgid "User "
msgstr "Người sử dụng "
#: web/ejabberd_web_admin.erl:1765
msgid "Connected Resources:"
msgstr "Tài Nguyên Được Kết Nối:"
#: web/ejabberd_web_admin.erl:1766 web/mod_register_web.erl:227
#: web/mod_register_web.erl:519
msgid "Password:"
msgstr "Mật Khẩu:"
#: web/ejabberd_web_admin.erl:1828
msgid "No Data"
msgstr "Không Dữ Liệu"
#: web/ejabberd_web_admin.erl:1906
msgid "Nodes"
msgstr "Nút"
#: web/ejabberd_web_admin.erl:1929 web/ejabberd_web_admin.erl:1951
msgid "Node "
msgstr "Nút "
#: web/ejabberd_web_admin.erl:1938
msgid "Listened Ports"
msgstr "Cổng Kết Nối"
#: web/ejabberd_web_admin.erl:1940 web/ejabberd_web_admin.erl:2260
#: web/ejabberd_web_admin.erl:2448
msgid "Update"
msgstr "Cập Nhật"
#: web/ejabberd_web_admin.erl:1943 web/ejabberd_web_admin.erl:2569
msgid "Restart"
msgstr "Khởi động lại"
#: web/ejabberd_web_admin.erl:1945 web/ejabberd_web_admin.erl:2571
msgid "Stop"
msgstr "Dừng"
#: web/ejabberd_web_admin.erl:1959
msgid "RPC Call Error"
msgstr "Lỗi Gọi RPC"
#: web/ejabberd_web_admin.erl:2000
msgid "Database Tables at "
msgstr "Bảng Cơ Sở Dữ Liệu tại"
#: web/ejabberd_web_admin.erl:2007
msgid "Storage Type"
msgstr "Loại Lưu Trữ"
#: web/ejabberd_web_admin.erl:2008
msgid "Elements"
msgstr ""
#: web/ejabberd_web_admin.erl:2009
msgid "Memory"
msgstr "Bộ Nhớ"
#: web/ejabberd_web_admin.erl:2032 web/ejabberd_web_admin.erl:2137
msgid "Error"
msgstr ""
#: web/ejabberd_web_admin.erl:2034
msgid "Backup of "
msgstr "Sao lưu dự phòng về"
#: web/ejabberd_web_admin.erl:2036
#, fuzzy
msgid ""
"Please note that these options will only backup the builtin Mnesia database. "
"If you are using the ODBC module, you also need to backup your SQL database "
"separately."
msgstr ""
"Lưu ý rằng những tùy chọn này sẽ chỉ được sao lưu cơ sở dữ liệu bên trong "
"Mnesia. Nếu bạn đang sử dụng môđun ODBC, bạn cũng cần sao lưu cơ sở dữ liệu "
"SQL của bạn riêng biệt."
#: web/ejabberd_web_admin.erl:2041
msgid "Store binary backup:"
msgstr "Lưu dữ liệu sao lưu dạng nhị phân:"
#: web/ejabberd_web_admin.erl:2045 web/ejabberd_web_admin.erl:2052
#: web/ejabberd_web_admin.erl:2060 web/ejabberd_web_admin.erl:2067
#: web/ejabberd_web_admin.erl:2074 web/ejabberd_web_admin.erl:2081
#: web/ejabberd_web_admin.erl:2088 web/ejabberd_web_admin.erl:2096
#: web/ejabberd_web_admin.erl:2103 web/ejabberd_web_admin.erl:2110
msgid "OK"
msgstr "OK"
#: web/ejabberd_web_admin.erl:2048
msgid "Restore binary backup immediately:"
msgstr "Khôi phục bản sao lưu dự phòng dạng nhị phận ngay lập tức:"
#: web/ejabberd_web_admin.erl:2056
msgid ""
"Restore binary backup after next ejabberd restart (requires less memory):"
msgstr ""
"Khôi phục bản sao lưu dự phòng dạng nhị phân sau lần khởi động ejabberd kế "
"tiếp (yêu cầu ít bộ nhớ hơn):"
#: web/ejabberd_web_admin.erl:2063
msgid "Store plain text backup:"
msgstr "Khôi phục bản sao lưu dự phòng thuần văn bản"
#: web/ejabberd_web_admin.erl:2070
msgid "Restore plain text backup immediately:"
msgstr "Khôi phục bản sao lưu dự phòng thuần văn bản ngay lập tức:"
#: web/ejabberd_web_admin.erl:2077
msgid "Import users data from a PIEFXIS file (XEP-0227):"
msgstr ""
#: web/ejabberd_web_admin.erl:2084
msgid "Export data of all users in the server to PIEFXIS files (XEP-0227):"
msgstr ""
#: web/ejabberd_web_admin.erl:2091
msgid "Export data of users in a host to PIEFXIS files (XEP-0227):"
msgstr ""
#: web/ejabberd_web_admin.erl:2099
#, fuzzy
msgid "Import user data from jabberd14 spool file:"
msgstr "Nhập Người Sử Dụng Từ Các Tập Tin Spool jabberd14"
#: web/ejabberd_web_admin.erl:2106
#, fuzzy
msgid "Import users data from jabberd14 spool directory:"
msgstr "Nhập Người Sử Dụng Từ Các Tập Tin Spool jabberd14"
#: web/ejabberd_web_admin.erl:2132
msgid "Listened Ports at "
msgstr "Cổng Liên Lạc tại"
#: web/ejabberd_web_admin.erl:2157
msgid "Modules at "
msgstr "Môđun tại "
#: web/ejabberd_web_admin.erl:2183
msgid "Statistics of ~p"
msgstr "Thống kê về ~p"
#: web/ejabberd_web_admin.erl:2186
msgid "Uptime:"
msgstr "Thời gian tải lên:"
#: web/ejabberd_web_admin.erl:2189
msgid "CPU Time:"
msgstr "Thời Gian CPU:"
#: web/ejabberd_web_admin.erl:2195
msgid "Transactions Committed:"
msgstr "Giao Dịch Được Cam Kết:"
#: web/ejabberd_web_admin.erl:2198
msgid "Transactions Aborted:"
msgstr "Giao Dịch Hủy Bỏ:"
#: web/ejabberd_web_admin.erl:2201
msgid "Transactions Restarted:"
msgstr "Giao Dịch Khởi Động Lại:"
#: web/ejabberd_web_admin.erl:2204
msgid "Transactions Logged:"
msgstr "Giao Dịch Được Ghi Nhận:"
#: web/ejabberd_web_admin.erl:2246
msgid "Update "
msgstr "Cập Nhật "
#: web/ejabberd_web_admin.erl:2254
msgid "Update plan"
msgstr "Kế hoạch cập nhật"
#: web/ejabberd_web_admin.erl:2255
#, fuzzy
msgid "Modified modules"
msgstr "Môđun cập nhật"
#: web/ejabberd_web_admin.erl:2256
msgid "Update script"
msgstr "Cập nhận lệnh"
#: web/ejabberd_web_admin.erl:2257
msgid "Low level update script"
msgstr "Lệnh cập nhật mức độ thấp"
#: web/ejabberd_web_admin.erl:2258
msgid "Script check"
msgstr "Lệnh kiểm tra"
#: web/ejabberd_web_admin.erl:2426
msgid "Port"
msgstr "Cổng"
#: web/ejabberd_web_admin.erl:2427
msgid "IP"
msgstr ""
#: web/ejabberd_web_admin.erl:2428
#, fuzzy
msgid "Protocol"
msgstr "Cổng"
#: web/ejabberd_web_admin.erl:2429 web/ejabberd_web_admin.erl:2556
msgid "Module"
msgstr "Môđun"
#: web/ejabberd_web_admin.erl:2430 web/ejabberd_web_admin.erl:2557
msgid "Options"
msgstr "Tùy chọn"
#: web/ejabberd_web_admin.erl:2450
msgid "Delete"
msgstr "Xóa"
#: web/ejabberd_web_admin.erl:2579
msgid "Start"
msgstr "Khởi động"
#: web/mod_register_web.erl:104
msgid "Your Jabber account was successfully created."
msgstr ""
#: web/mod_register_web.erl:107
msgid "There was an error creating the account: "
msgstr ""
#: web/mod_register_web.erl:115
msgid "Your Jabber account was successfully deleted."
msgstr ""
#: web/mod_register_web.erl:118
msgid "There was an error deleting the account: "
msgstr ""
#: web/mod_register_web.erl:128
msgid "The password of your Jabber account was successfully changed."
msgstr ""
#: web/mod_register_web.erl:131
msgid "There was an error changing the password: "
msgstr ""
#: web/mod_register_web.erl:163 web/mod_register_web.erl:172
msgid "Jabber Account Registration"
msgstr ""
#: web/mod_register_web.erl:174 web/mod_register_web.erl:192
#: web/mod_register_web.erl:201
msgid "Register a Jabber account"
msgstr ""
#: web/mod_register_web.erl:176 web/mod_register_web.erl:493
#: web/mod_register_web.erl:502
msgid "Unregister a Jabber account"
msgstr ""
#: web/mod_register_web.erl:203
msgid ""
"This page allows to create a Jabber account in this Jabber server. Your JID "
"(Jabber IDentifier) will be of the form: username@server. Please read "
"carefully the instructions to fill correctly the fields."
msgstr ""
#: web/mod_register_web.erl:212 web/mod_register_web.erl:386
#: web/mod_register_web.erl:509
#, fuzzy
msgid "Username:"
msgstr "Tên truy cập IRC"
#: web/mod_register_web.erl:217
msgid "This is case insensitive: macbeth is the same that MacBeth and Macbeth."
msgstr ""
#: web/mod_register_web.erl:218
msgid "Characters not allowed:"
msgstr ""
#: web/mod_register_web.erl:222 web/mod_register_web.erl:391
#: web/mod_register_web.erl:514
#, fuzzy
msgid "Server:"
msgstr "Không bao giờ"
#: web/mod_register_web.erl:232
msgid ""
"Don't tell your password to anybody, not even the administrators of the "
"Jabber server."
msgstr ""
#: web/mod_register_web.erl:234
msgid "You can later change your password using a Jabber client."
msgstr ""
#: web/mod_register_web.erl:235
msgid ""
"Some Jabber clients can store your password in your computer. Use that "
"feature only if you trust your computer is safe."
msgstr ""
#: web/mod_register_web.erl:237
msgid ""
"Memorize your password, or write it in a paper placed in a safe place. In "
"Jabber there isn't an automated way to recover your password if you forget "
"it."
msgstr ""
#: web/mod_register_web.erl:242 web/mod_register_web.erl:406
#, fuzzy
msgid "Password Verification:"
msgstr "Kiểm Tra Mật Khẩu"
#: web/mod_register_web.erl:250
#, fuzzy
msgid "Register"
msgstr "Bảng phân công"
#: web/mod_register_web.erl:396
#, fuzzy
msgid "Old Password:"
msgstr "Mật Khẩu:"
#: web/mod_register_web.erl:401
#, fuzzy
msgid "New Password:"
msgstr "Mật Khẩu:"
#: web/mod_register_web.erl:504
msgid "This page allows to unregister a Jabber account in this Jabber server."
msgstr ""
#: web/mod_register_web.erl:524
msgid "Unregister"
msgstr ""
#~ msgid "Encodings"
#~ msgstr "Mã hóa"
#~ msgid "(Raw)"
#~ msgstr "(Thô)"
#~ msgid "Specified nickname is already registered"
#~ msgstr "Bí danh xác định đã đăng ký rồi"
#~ msgid "Size"
#~ msgstr "Kích thước"
#~ msgid "Roster groups that may subscribe (if access model is roster)"
#~ msgstr ""
#~ "Các nhóm phân công có thể đăng ký (nếu mô hình truy cập là dạng phân công)"
ejabberd-2.1.11/src/msgs/ru.msg 0000664 0000000 0000000 00000112757 12240230175 013131 0 ustar {"Access Configuration","Конфигурация доступа"}.
{"Access Control List Configuration","Конфигурация списков управления доступом"}.
{"Access control lists","Списки управления доступом"}.
{"Access Control Lists","Списки управления доступом"}.
{"Access denied by service policy","Доступ запрещён политикой службы"}.
{"Access rules","Правила доступа"}.
{"Access Rules","Правила доступа"}.
{"Action on user","Действие над пользователем"}.
{"Add Jabber ID","Добавить Jabber ID"}.
{"Add New","Добавить"}.
{"Add User","Добавить пользователя"}.
{"Administration of ","Администрирование "}.
{"Administration","Администрирование"}.
{"Administrator privileges required","Требуются права администратора"}.
{"A friendly name for the node","Легко запоминаемое имя для узла"}.
{"All activity","Вся статистика"}.
{"Allow this Jabber ID to subscribe to this pubsub node?","Разрешить этому Jabber ID подписаться на данный узел?"}.
{"Allow users to change the subject","Разрешить пользователям изменять тему"}.
{"Allow users to query other users","Разрешить iq-запросы к пользователям"}.
{"Allow users to send invites","Разрешить пользователям посылать приглашения"}.
{"Allow users to send private messages","Разрешить приватные сообщения"}.
{"Allow visitors to change nickname","Разрешить посетителям изменять псевдоним"}.
{"Allow visitors to send private messages to","Разрешить посетителям посылать приватные сообщения"}.
{"Allow visitors to send status text in presence updates","Разрешить посетителям вставлять текcт статуса в сообщения о присутствии"}.
{"Allow visitors to send voice requests","Разрешить посетителям запрашивать право голоса"}.
{"All Users","Все пользователи"}.
{"Announcements","Объявления"}.
{"anyone","всем участникам"}.
{"A password is required to enter this room","Чтобы войти в эту конференцию, нужен пароль"}.
{"April","апреля"}.
{"August","августа"}.
{"Backup Management","Управление резервным копированием"}.
{"Backup of ","Резервное копирование "}.
{"Backup to File at ","Резервное копирование в файл на "}.
{"Backup","Резервное копирование"}.
{"Bad format","Неправильный формат"}.
{"Birthday","День рождения"}.
{"CAPTCHA web page","Ссылка на капчу"}.
{"Change Password","Сменить пароль"}.
{"Change User Password","Изменить пароль пользователя"}.
{"Characters not allowed:","Недопустимые символы:"}.
{"Chatroom configuration modified","Конфигурация комнаты изменилась"}.
{"Chatroom is created","Комната создана"}.
{"Chatroom is destroyed","Комната уничтожена"}.
{"Chatroom is started","Комната запущена"}.
{"Chatroom is stopped","Комната остановлена"}.
{"Chatrooms","Комнаты"}.
{"Choose a username and password to register with this server","Выберите имя пользователя и пароль для регистрации на этом сервере"}.
{"Choose modules to stop","Выберите модули, которые следует остановить"}.
{"Choose storage type of tables","Выберите тип хранения таблиц"}.
{"Choose whether to approve this entity's subscription.","Решите: предоставить ли подписку этому объекту."}.
{"City","Город"}.
{"Commands","Команды"}.
{"Conference room does not exist","Конференция не существует"}.
{"Configuration of room ~s","Конфигурация комнаты ~s"}.
{"Configuration","Конфигурация"}.
{"Connected Resources:","Подключённые ресурсы:"}.
{"Connections parameters","Параметры соединения"}.
{"Country","Страна"}.
{"CPU Time:","Процессорное время:"}.
{"Database Tables at ","Таблицы базы данных на "}.
{"Database Tables Configuration at ","Конфигурация таблиц базы данных на "}.
{"Database","База данных"}.
{"December","декабря"}.
{"Default users as participants","Сделать пользователей участниками по умолчанию"}.
{"Delete message of the day on all hosts","Удалить сообщение дня со всех виртуальных серверов"}.
{"Delete message of the day","Удалить сообщение дня"}.
{"Delete Selected","Удалить выделенные"}.
{"Delete User","Удалить пользователя"}.
{"Delete","Удалить"}.
{"Deliver event notifications","Доставлять уведомления о событиях"}.
{"Deliver payloads with event notifications","Доставлять вместе с уведомлениями o публикациях сами публикации"}.
{"Description:","Описание:"}.
{"Disc only copy","только диск"}.
{"Displayed Groups:","Видимые группы:"}.
{"Don't tell your password to anybody, not even the administrators of the Jabber server.","Не говорите никому свой пароль, даже администраторам сервера."}.
{"Dump Backup to Text File at ","Копирование в текстовый файл на "}.
{"Dump to Text File","Копирование в текстовый файл"}.
{"Edit Properties","Изменить параметры"}.
{"Either approve or decline the voice request.","Подтвердите или отклоните право голоса."}.
{"ejabberd IRC module","ejabberd IRC модуль"}.
{"ejabberd MUC module","ejabberd MUC модуль"}.
{"ejabberd Publish-Subscribe module","Модуль ejabberd Публикации-Подписки"}.
{"ejabberd SOCKS5 Bytestreams module","ejabberd SOCKS5 Bytestreams модуль"}.
{"ejabberd vCard module","ejabberd vCard модуль"}.
{"ejabberd Web Admin","Web-интерфейс администрирования ejabberd"}.
{"Elements","Элементы"}.
{"Email","Электронная почта"}.
{"Enable logging","Включить журналирование"}.
{"Encoding for server ~b","Кодировка сервера ~b"}.
{"End User Session","Завершить сеанс пользователя"}.
{"Enter list of {Module, [Options]}","Введите список вида {Module, [Options]}"}.
{"Enter nickname you want to register","Введите псевдоним, который Вы хотели бы зарегистрировать"}.
{"Enter path to backup file","Введите путь к резервному файлу"}.
{"Enter path to jabberd14 spool dir","Введите путь к директории спула jabberd14"}.
{"Enter path to jabberd14 spool file","Введите путь к файлу из спула jabberd14"}.
{"Enter path to text file","Введите путь к текстовому файлу"}.
{"Enter the text you see","Введите увиденный текст"}.
{"Enter username and encodings you wish to use for connecting to IRC servers. Press 'Next' to get more fields to fill in. Press 'Complete' to save settings.","Введите имя пользователя и кодировки, которые будут использоваться при подключении к IRC-серверам. Нажмите 'Далее' для получения дополнительных полей для заполнения. Нажмите 'Завершить' для сохранения настроек."}.
{"Enter username, encodings, ports and passwords you wish to use for connecting to IRC servers","Введите имя пользователя, кодировки, порты и пароли, которые будут использоваться при подключении к IRC-серверам"}.
{"Erlang Jabber Server","Erlang Jabber Server"}.
{"Error","Ошибка"}.
{"Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef.net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}].","Пример: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef.net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."}.
{"Exclude Jabber IDs from CAPTCHA challenge","Исключить показ капчи для списка Jabber ID"}.
{"Export data of all users in the server to PIEFXIS files (XEP-0227):","Экспорт данных всех пользователей сервера в файлы формата PIEFXIS (XEP-0227):"}.
{"Export data of users in a host to PIEFXIS files (XEP-0227):","Экспорт пользовательских данных домена в файлы формата PIEFXIS (XEP-0227):"}.
{"Failed to extract JID from your voice request approval","Ошибка обработки JID из вашего запроса на право голоса"}.
{"Family Name","Фамилия"}.
{"February","февраля"}.
{"Fill in fields to search for any matching Jabber User","Заполните форму для поиска пользователя Jabber"}.
{"Fill in the form to search for any matching Jabber User (Add * to the end of field to match substring)","Заполните форму для поиска пользователя Jabber (Если добавить * в конец поля, то происходит поиск подстроки)"}.
{"Friday","Пятница"}.
{"From ~s","От ~s"}.
{"From","От кого"}.
{"Full Name","Полное имя"}.
{"Get Number of Online Users","Получить количество подключённых пользователей"}.
{"Get Number of Registered Users","Получить количество зарегистрированных пользователей"}.
{"Get User Last Login Time","Получить время последнего подключения пользователя"}.
{"Get User Password","Получить пароль пользователя"}.
{"Get User Statistics","Получить статистику по пользователю"}.
{"Grant voice to this person?","Предоставить голос?"}.
{"Groups","Группы"}.
{"Group ","Группа "}.
{"has been banned","запретили входить в комнату"}.
{"has been kicked because of an affiliation change","выгнали из комнаты вследствие смены ранга"}.
{"has been kicked because of a system shutdown","выгнали из комнаты из-за останова системы"}.
{"has been kicked because the room has been changed to members-only","выгнали из комнаты потому что она стала только для членов"}.
{"has been kicked","выгнали из комнаты"}.
{" has set the subject to: "," установил(а) тему: "}.
{"Host","Хост"}.
{"If you don't see the CAPTCHA image here, visit the web page.","Если вы не видите изображение капчи, перейдите по ссылке."}.
{"If you want to specify different ports, passwords, encodings for IRC servers, fill this list with values in format '{\"irc server\", \"encoding\", port, \"password\"}'. By default this service use \"~s\" encoding, port ~p, empty password.","Чтобы указать различные порты, пароли, кодировки для разных серверов IRC, заполните список значениями в формате '{\"сервер IRC\", \"кодировка\", порт, \"пароль\"}'. По умолчанию сервис использует кодировку \"~s\", порт ~p, пустой пароль."}.
{"Import Directory","Импорт из директории"}.
{"Import File","Импорт из файла"}.
{"Import user data from jabberd14 spool file:","Импорт пользовательских данных из буферного файла jabberd14:"}.
{"Import User from File at ","Импорт пользователя из файла на "}.
{"Import users data from a PIEFXIS file (XEP-0227):","Импорт пользовательских данных из файла формата PIEFXIS (XEP-0227):"}.
{"Import users data from jabberd14 spool directory:","Импорт пользовательских данных из буферной директории jabberd14:"}.
{"Import Users from Dir at ","Импорт пользователей из директории на "}.
{"Import Users From jabberd14 Spool Files","Импорт пользователей из спула jabberd14"}.
{"Improper message type","Неправильный тип сообщения"}.
{"Incorrect password","Неправильный пароль"}.
{"Invalid affiliation: ~s","Недопустимый ранг: ~s"}.
{"Invalid role: ~s","Недопустимая роль: ~s"}.
{"IP addresses","IP адреса"}.
{"IP","IP"}.
{"IRC channel (don't put the first #)","Канал IRC (без символа #)"}.
{"IRC server","Сервер IRC"}.
{"IRC settings","Настройки IRC"}.
{"IRC Transport","IRC Транспорт"}.
{"IRC username","Имя пользователя IRC"}.
{"IRC Username","Имя пользователя IRC"}.
{"is now known as","изменил(а) имя на"}.
{"It is not allowed to send private messages of type \"groupchat\"","Нельзя посылать частные сообщения типа \"groupchat\""}.
{"It is not allowed to send private messages to the conference","Не разрешается посылать частные сообщения прямо в конференцию"}.
{"It is not allowed to send private messages","Запрещено посылать приватные сообщения"}.
{"Jabber Account Registration","Регистрация Jabber-аккаунта"}.
{"Jabber ID","Jabber ID"}.
{"Jabber ID ~s is invalid","Jabber ID ~s недопустимый"}.
{"January","января"}.
{"Join IRC channel","Присоединиться к каналу IRC"}.
{"joins the room","вошёл(а) в комнату"}.
{"Join the IRC channel here.","Присоединяйтесь к каналу IRC"}.
{"Join the IRC channel in this Jabber ID: ~s","Присоединиться к каналу IRC с Jabber ID: ~s"}.
{"July","июля"}.
{"June","июня"}.
{"Last Activity","Последнее подключение"}.
{"Last login","Время последнего подключения"}.
{"Last month","За последний месяц"}.
{"Last year","За последний год"}.
{"leaves the room","вышел(а) из комнаты"}.
{"Listened Ports at ","Прослушиваемые порты на "}.
{"Listened Ports","Прослушиваемые порты"}.
{"List of modules to start","Список запускаемых модулей"}.
{"Low level update script","Низкоуровневый сценарий обновления"}.
{"Make participants list public","Сделать список участников видимым всем"}.
{"Make room CAPTCHA protected","Сделать комнату защищённой капчей"}.
{"Make room members-only","Комната только для зарегистрированных участников"}.
{"Make room moderated","Сделать комнату модерируемой"}.
{"Make room password protected","Сделать комнату защищённой паролем"}.
{"Make room persistent","Сделать комнату постоянной"}.
{"Make room public searchable","Сделать комнату видимой всем"}.
{"March","марта"}.
{"Maximum Number of Occupants","Максимальное количество участников"}.
{"Max # of items to persist","Максимальное число сохраняемых публикаций"}.
{"Max payload size in bytes","Максимальный размер полезной нагрузки в байтах"}.
{"May","мая"}.
{"Membership is required to enter this room","В эту конференцию могут входить только её члены"}.
{"Members:","Члены:"}.
{"Memorize your password, or write it in a paper placed in a safe place. In Jabber there isn't an automated way to recover your password if you forget it.","Запомните пароль или запишите его на бумаге, которую сохраните в безопасном месте. В Jabber'е нет автоматизированного средства восстановления пароля в том случае, если Вы его забудете."}.
{"Memory","Память"}.
{"Message body","Тело сообщения"}.
{"Middle Name","Отчество"}.
{"Minimum interval between voice requests (in seconds)","Минимальный интервал между запросами на право голоса"}.
{"Moderator privileges required","Требуются права модератора"}.
{"moderators only","только модераторам"}.
{"Modified modules","Изменённые модули"}.
{"Modules at ","Модули на "}.
{"Modules","Модули"}.
{"Module","Модуль"}.
{"Monday","Понедельник"}.
{"Name:","Название:"}.
{"Name","Название"}.
{"Never","Никогда"}.
{"New Password:","Новый пароль:"}.
{"Nickname Registration at ","Регистрация псевдонима на "}.
{"Nickname ~s does not exist in the room","Псевдоним ~s в комнате отсутствует"}.
{"Nickname","Псевдоним"}.
{"No body provided for announce message","Тело объявления не должно быть пустым"}.
{"nobody","никто"}.
{"No Data","Нет данных"}.
{"Node ID","ID узла"}.
{"Node not found","Узел не найден"}.
{"Nodes","Узлы"}.
{"Node ","Узел "}.
{"No limit","Не ограничено"}.
{"None","Нет"}.
{"No resource provided","Не указан ресурс"}.
{"Not Found","Не Найдено"}.
{"Notify subscribers when items are removed from the node","Уведомлять подписчиков об удалении публикаций из сборника"}.
{"Notify subscribers when the node configuration changes","Уведомлять подписчиков об изменении конфигурации сборника"}.
{"Notify subscribers when the node is deleted","Уведомлять подписчиков об удалении сборника"}.
{"November","ноября"}.
{"Number of occupants","Число присутствующих"}.
{"Number of online users","Количество подключённых пользователей"}.
{"Number of registered users","Количество зарегистрированных пользователей"}.
{"October","октября"}.
{"Offline Messages:","Офлайновые сообщения:"}.
{"Offline Messages","Офлайновые сообщения"}.
{"OK","Продолжить"}.
{"Old Password:","Старый пароль:"}.
{"Online Users:","Подключённые пользователи:"}.
{"Online Users","Подключённые пользователи"}.
{"Online","Подключён"}.
{"Only deliver notifications to available users","Доставлять уведомления только доступным пользователям"}.
{"Only moderators and participants are allowed to change the subject in this room","Только модераторы и участники могут изменять тему в этой комнате"}.
{"Only moderators are allowed to change the subject in this room","Только модераторы могут изменять тему в этой комнате"}.
{"Only moderators can approve voice requests","Только модераторы могут утверждать запросы на право голоса"}.
{"Only occupants are allowed to send messages to the conference","Только присутствующим разрешается посылать сообщения в конференцию"}.
{"Only occupants are allowed to send queries to the conference","Только присутствующим разрешается посылать запросы в конференцию"}.
{"Only service administrators are allowed to send service messages","Только администратор службы может посылать служебные сообщения"}.
{"Options","Параметры"}.
{"Organization Name","Название организации"}.
{"Organization Unit","Отдел организации"}.
{"Outgoing s2s Connections:","Исходящие s2s-серверы:"}.
{"Outgoing s2s Connections","Исходящие s2s-соединения"}.
{"Outgoing s2s Servers:","Исходящие s2s-серверы:"}.
{"Owner privileges required","Требуются права владельца"}.
{"Packet","Пакет"}.
{"Password ~b","Пароль ~b"}.
{"Password Verification:","Проверка пароля:"}.
{"Password Verification","Проверка пароля"}.
{"Password:","Пароль:"}.
{"Password","Пароль"}.
{"Path to Dir","Путь к директории"}.
{"Path to File","Путь к файлу"}.
{"Pending","Ожидание"}.
{"Period: ","Период"}.
{"Persist items to storage","Сохранять публикации в хранилище"}.
{"Ping","Пинг"}.
{"Please note that these options will only backup the builtin Mnesia database. If you are using the ODBC module, you also need to backup your SQL database separately.","Заметьте, что здесь производится резервное копирование только встроенной базы данных Mnesia. Если Вы также используете другое хранилище данных (например с помощью модуля ODBC), то его резервное копирование следует осуществлять отдельно."}.
{"Please, wait for a while before sending new voice request","Пожалуйста, подождите перед тем как подать новый запрос на право голоса"}.
{"Pong","Понг"}.
{"Port ~b","Порт ~b"}.
{"Port","Порт"}.
{"Present real Jabber IDs to","Сделать реальные Jabber ID участников видимыми"}.
{"private, ","приватная, "}.
{"Protocol","Протокол"}.
{"Publish-Subscribe","Публикация-Подписка"}.
{"PubSub subscriber request","Запрос подписчика PubSub"}.
{"Purge all items when the relevant publisher goes offline","Очищать все записи автора публикации когда он отключается"}.
{"Queries to the conference members are not allowed in this room","Запросы к пользователям в этой конференции запрещены"}.
{"RAM and disc copy","ОЗУ и диск"}.
{"RAM copy","ОЗУ"}.
{"Raw","Необработанный формат"}.
{"Really delete message of the day?","Действительно удалить сообщение дня?"}.
{"Recipient is not in the conference room","Адресата нет в конференции"}.
{"Register a Jabber account","Зарегистрировать Jabber-аккаунт"}.
{"Registered Users:","Зарегистрированные пользователи:"}.
{"Registered Users","Зарегистрированные пользователи"}.
{"Register","Зарегистрировать"}.
{"Registration in mod_irc for ","Регистрация в mod_irc для "}.
{"Remote copy","не хранится локально"}.
{"Remove All Offline Messages","Удалить все офлайновые сообщения"}.
{"Remove User","Удалить пользователя"}.
{"Remove","Удалить"}.
{"Replaced by new connection","Заменено новым соединением"}.
{"Resources","Ресурсы"}.
{"Restart Service","Перезапустить службу"}.
{"Restart","Перезапустить"}.
{"Restore Backup from File at ","Восстановление из резервной копии на "}.
{"Restore binary backup after next ejabberd restart (requires less memory):","Восстановить из бинарной резервной копии при следующем запуске (требует меньше памяти):"}.
{"Restore binary backup immediately:","Восстановить из бинарной резервной копии немедленно:"}.
{"Restore plain text backup immediately:","Восстановить из текстовой резервной копии немедленно:"}.
{"Restore","Восстановление из резервной копии"}.
{"Room Configuration","Конфигурация комнаты"}.
{"Room creation is denied by service policy","Cоздавать конференцию запрещено политикой службы"}.
{"Room description","Описание комнаты"}.
{"Room Occupants","Участники комнаты"}.
{"Room title","Название комнаты"}.
{"Roster groups allowed to subscribe","Группы списка контактов, которым разрешена подписка"}.
{"Roster of ","Ростер пользователя "}.
{"Roster size","Размер списка контактов"}.
{"Roster","Ростер"}.
{"RPC Call Error","Ошибка вызова RPC"}.
{"Running Nodes","Работающие узлы"}.
{"~s access rule configuration","Конфигурация правила доступа ~s"}.
{"Saturday","Суббота"}.
{"Script check","Проверка сценария"}.
{"Search Results for ","Результаты поиска в "}.
{"Search users in ","Поиск пользователей в "}.
{"Send announcement to all online users on all hosts","Разослать объявление всем подключённым пользователям на всех виртуальных серверах"}.
{"Send announcement to all online users","Разослать объявление всем подключённым пользователям"}.
{"Send announcement to all users on all hosts","Разослать объявление всем пользователям на всех виртуальных серверах"}.
{"Send announcement to all users","Разослать объявление всем пользователям"}.
{"September","сентября"}.
{"Server ~b","Сервер ~b"}.
{"Server:","Сервер:"}.
{"Set message of the day and send to online users","Установить сообщение дня и разослать его подключённым пользователям"}.
{"Set message of the day on all hosts and send to online users","Установить сообщение дня на всех виртуальных серверах и разослать его подключённым пользователям"}.
{"Shared Roster Groups","Группы общих контактов"}.
{"Show Integral Table","Показать интегральную таблицу"}.
{"Show Ordinary Table","Показать обычную таблицу"}.
{"Shut Down Service","Остановить службу"}.
{"~s invites you to the room ~s","~s приглашает вас в комнату ~s"}.
{"Some Jabber clients can store your password in your computer. Use that feature only if you trust your computer is safe.","Некоторые Jabber-клиенты могут сохранять пароль на Вашем компьютере. Используйте эту функцию только в том случае, если считаете это безопасным."}.
{"Specify the access model","Укажите механизм управления доступом"}.
{"Specify the event message type","Укажите тип сообщения о событии"}.
{"Specify the publisher model","Условия публикации"}.
{"~s's Offline Messages Queue","Oчередь офлайновых сообщений ~s"}.
{"Start Modules at ","Запуск модулей на "}.
{"Start Modules","Запуск модулей"}.
{"Start","Запустить"}.
{"Statistics of ~p","статистика узла ~p"}.
{"Statistics","Статистика"}.
{"Stop Modules at ","Остановка модулей на "}.
{"Stop Modules","Остановка модулей"}.
{"Stopped Nodes","Остановленные узлы"}.
{"Stop","Остановить"}.
{"Storage Type","Тип таблицы"}.
{"Store binary backup:","Сохранить бинарную резервную копию:"}.
{"Store plain text backup:","Сохранить текстовую резервную копию:"}.
{"Subject","Тема"}.
{"Submitted","Отправлено"}.
{"Submit","Отправить"}.
{"Subscriber Address","Адрес подписчика"}.
{"Subscription","Подписка"}.
{"Sunday","Воскресенье"}.
{"That nickname is already in use by another occupant","Этот псевдоним уже занят другим участником"}.
{"That nickname is registered by another person","Этот псевдоним зарегистрирован кем-то другим"}.
{"The CAPTCHA is valid.","Проверка капчи прошла успешно."}.
{"The CAPTCHA verification has failed","Проверка капчи не пройдена"}.
{"The collections with which a node is affiliated","Имя коллекции, в которую входит узел"}.
{"The password is too weak","Слишком слабый пароль"}.
{"the password is","пароль:"}.
{"The password of your Jabber account was successfully changed.","Пароль Вашего Jabber-аккаунта был успешно изменен."}.
{"There was an error changing the password: ","Ошибка при смене пароля:"}.
{"There was an error creating the account: ","Ошибка при создании аккаунта:"}.
{"There was an error deleting the account: ","Ошибка при удалении аккаунта:"}.
{"This is case insensitive: macbeth is the same that MacBeth and Macbeth.","Регистр не имеет значения: \"маша\" и \"МАША\" будет считаться одним и тем же именем."}.
{"This page allows to create a Jabber account in this Jabber server. Your JID (Jabber IDentifier) will be of the form: username@server. Please read carefully the instructions to fill correctly the fields.","Здесь Вы можете создать Jabber-аккаунт на этом Jabber-сервере. Ваш JID (Jabber-идентификатор) будет в виде: \"пользователь@сервер\". Пожалуйста, внимательно читайте инструкции для правильного заполнения полей."}.
{"This page allows to unregister a Jabber account in this Jabber server.","Здесь Вы можете удалить Jabber-аккаунт с этого сервера."}.
{"This participant is kicked from the room because he sent an error message to another participant","Этого участника выгнали из комнаты за то, что он послал сообщение об ошибке другому участнику"}.
{"This participant is kicked from the room because he sent an error message","Этого участника выгнали из комнаты за то, что он послал сообщение об ошибке"}.
{"This participant is kicked from the room because he sent an error presence","Этого участника выгнали из комнаты за то, что он послал присутствие с ошибкой"}.
{"This room is not anonymous","Эта комната не анонимная"}.
{"Thursday","Четверг"}.
{"Time delay","По истечение"}.
{"Time","Время"}.
{"Too many CAPTCHA requests","Слишком много запросов капчи"}.
{"To ~s","К ~s"}.
{"To","Кому"}.
{"Traffic rate limit is exceeded","Превышен лимит скорости посылки информации"}.
{"Transactions Aborted:","Транзакции отмененные:"}.
{"Transactions Committed:","Транзакции завершенные:"}.
{"Transactions Logged:","Транзакции запротоколированные:"}.
{"Transactions Restarted:","Транзакции перезапущенные:"}.
{"Tuesday","Вторник"}.
{"Unable to generate a CAPTCHA","Не получилось создать капчу"}.
{"Unauthorized","Не авторизован"}.
{"Unregister a Jabber account","Удалить Jabber-аккаунт"}.
{"Unregister","Удалить"}.
{"Update message of the day (don't send)","Обновить сообщение дня (не рассылать)"}.
{"Update message of the day on all hosts (don't send)","Обновить сообщение дня на всех виртуальных серверах (не рассылать)"}.
{"Update plan","План обновления"}.
{"Update script","Сценарий обновления"}.
{"Update","Обновить"}.
{"Update ","Обновление "}.
{"Uptime:","Время работы:"}.
{"Use of STARTTLS required","Вы обязаны использовать STARTTLS"}.
{"User JID","JID пользователя"}.
{"User Management","Управление пользователями"}.
{"Username:","Имя пользователя:"}.
{"Users are not allowed to register accounts so quickly","Пользователи не могут регистрировать учётные записи так быстро"}.
{"Users Last Activity","Статистика последнего подключения пользователей"}.
{"Users","Пользователи"}.
{"User ","Пользователь "}.
{"User","Пользователь"}.
{"Validate","Утвердить"}.
{"vCard User Search","Поиск пользователей по vCard"}.
{"Virtual Hosts","Виртуальные хосты"}.
{"Visitors are not allowed to change their nicknames in this room","Посетителям запрещено изменять свои псевдонимы в этой комнате"}.
{"Visitors are not allowed to send messages to all occupants","Посетителям не разрешается посылать сообщения всем присутствующим"}.
{"Voice requests are disabled in this conference","Запросы на право голоса отключены в этой конференции"}.
{"Voice request","Запрос на право голоса"}.
{"Wednesday","Среда"}.
{"When to send the last published item","Когда посылать последний опубликованный элемент"}.
{"Whether to allow subscriptions","Разрешить подписку"}.
{"You can later change your password using a Jabber client.","Позже Вы можете изменить пароль через Jabber-клиент."}.
{"You have been banned from this room","Вам запрещено входить в эту конференцию"}.
{"You must fill in field \"Nickname\" in the form","Вы должны заполнить поле \"Псевдоним\" в форме"}.
{"You need a client that supports x:data and CAPTCHA to register","Чтобы зарегистрироваться, требуется x:data-совместимый клиент"}.
{"You need a client that supports x:data to register the nickname","Чтобы зарегистрировать псевдоним, требуется x:data-совместимый клиент"}.
{"You need an x:data capable client to configure mod_irc settings","Чтобы настроить параметры mod_irc, требуется x:data-совместимый клиент"}.
{"You need an x:data capable client to configure room","Чтобы сконфигурировать комнату, требуется x:data-совместимый клиент"}.
{"You need an x:data capable client to search","Чтобы воспользоваться поиском, требуется x:data-совместимый клиент"}.
{"Your active privacy list has denied the routing of this stanza.","Маршрутизация этой строфы запрещена вашим активным списком приватности."}.
{"Your contact offline message queue is full. The message has been discarded.","Очередь недоставленных сообщений Вашего адресата переполнена. Сообщение не было сохранено."}.
{"Your Jabber account was successfully created.","Ваш Jabber-аккаунт был успешно создан."}.
{"Your Jabber account was successfully deleted.","Ваш Jabber-аккаунт был успешно удален."}.
{"Your messages to ~s are being blocked. To unblock them, visit ~s","Ваши сообщения к ~s блокируются. Для снятия блокировки перейдите по ссылке ~s"}.
ejabberd-2.1.11/src/msgs/pt.msg 0000664 0000000 0000000 00000015773 12240230175 013126 0 ustar {"Access Configuration","Configuração de acessos"}.
{"Access Control List Configuration","Configuração da Lista de Controlo de Acesso"}.
{"Access control lists","Listas de Controlo de Acesso"}.
{"Access Control Lists","Listas de Controlo de Acesso"}.
{"Access denied by service policy","Acesso negado pela política de serviço"}.
{"Access rules","Regras de acesso"}.
{"Access Rules","Regras de Acesso"}.
{"Action on user","Acção no utilizador"}.
{"Add New","Adicionar novo"}.
{"Add User","Adicionar utilizador"}.
{"Administration of ","Administração de "}.
{"Administrator privileges required","São necessários privilégios de administrador"}.
{"All Users","Todos os utilizadores"}.
{"Backup","Guardar cópia de segurança"}.
{"Backup Management","Gestão de cópias de segurança"}.
{"Backup to File at ","Guardar cópia de segurança para ficheiro em "}.
{"Birthday","Data de nascimento"}.
{"Change Password","Mudar palavra-chave"}.
{"Choose a username and password to register with this server","Escolha um nome de utilizador e palavra-chave para se registar neste servidor"}.
{"Choose modules to stop","Seleccione os módulos a parar"}.
{"Choose storage type of tables","Seleccione o tipo de armazenagem das tabelas"}.
{"City","Cidade"}.
{"Conference room does not exist","A sala não existe"}.
{"Configuration","Configuração"}.
{"Connected Resources:","Recursos conectados:"}.
{"Country","País"}.
{"Delete","Eliminar"}.
{"Delete Selected","Eliminar os seleccionados"}.
{"Disc only copy","Cópia apenas em disco"}.
{"Dump Backup to Text File at ","Exporta cópia de segurança para ficheiro de texto em "}.
{"Dump to Text File","Exportar para ficheiro de texto"}.
{"Edit Properties","Editar propriedades"}.
{"ejabberd IRC module","Módulo de IRC ejabberd"}.
{"ejabberd MUC module","Módulo MUC de ejabberd"}.
{"ejabberd vCard module","Módulo vCard de ejabberd"}.
{"Enter list of {Module, [Options]}","Introduza lista de {módulos, [opções]}"}.
{"Enter nickname you want to register","Introduza a alcunha que quer registar"}.
{"Enter path to backup file","Introduza o caminho do ficheiro de cópia de segurança"}.
{"Enter path to jabberd14 spool dir","Introduza o caminho para o directório de spools do jabberd14"}.
{"Enter path to jabberd14 spool file","Introduza o caminho para o ficheiro de spool do jabberd14"}.
{"Enter path to text file","Introduza caminho para o ficheiro de texto"}.
{"Erlang Jabber Server","Servidor Jabber em Erlang"}.
{"Family Name","Apelido"}.
{"Fill in fields to search for any matching Jabber User","Preencha os campos para procurar utilizadores Jabber coincidentes"}.
{"From","De"}.
{"From ~s","De ~s"}.
{"Full Name","Nome completo"}.
{"Groups","Grupos"}.
{" has set the subject to: "," colocou o tópico: "}.
{"Import Directory","Importar directório"}.
{"Import File","Importar ficheiro"}.
{"Import User from File at ","Importar utilizador a partir do ficheiro em "}.
{"Import Users from Dir at ","Importar utilizadores a partir do directório em "}.
{"Improper message type","Tipo de mensagem incorrecto"}.
{"Incorrect password","Palavra-chave incorrecta"}.
{"Invalid affiliation: ~s","Afiliação inválida: ~s"}.
{"Invalid role: ~s","Papel inválido: ~s"}.
{"IRC Username","Nome do utilizador de IRC"}.
{"It is not allowed to send private messages of type \"groupchat\"","Não é permitido enviar mensagens privadas do tipo \"groupchat\""}.
{"It is not allowed to send private messages to the conference","Impedir o envio de mensagens privadas para a sala"}.
{"Jabber ID ~s is invalid","O Jabber ID ~s não é válido"}.
{"Last Activity","Última actividade"}.
{"Listened Ports at ","Portas em escuta em "}.
{"List of modules to start","Lista de módulos a iniciar"}.
{"Make room moderated","Tornar a sala moderada"}.
{"Memory","Memória"}.
{"Middle Name","Segundo nome"}.
{"Moderator privileges required","São necessários privilégios de moderador"}.
{"Module","Módulo"}.
{"Modules","Módulos"}.
{"Name","Nome"}.
{"Never","Nunca"}.
{"Nickname","Alcunha"}.
{"Nickname Registration at ","Registo da alcunha em "}.
{"Nickname ~s does not exist in the room","A alcunha ~s não existe na sala"}.
{"Node ","Nodo"}.
{"Node not found","Nodo não encontrado"}.
{"Nodes","Nodos"}.
{"None","Nenhum"}.
{"No resource provided","Não foi passado nenhum recurso"}.
{"OK","OK"}.
{"Online","Ligado"}.
{"Online Users","Utilizadores ligados"}.
{"Only occupants are allowed to send messages to the conference","Só os ocupantes podem enviar mensagens para a sala"}.
{"Only occupants are allowed to send queries to the conference","Só os ocupantes podem enviar consultas para a sala"}.
{"Only service administrators are allowed to send service messages","Só os administradores do serviço têm permissão para enviar mensagens de serviço"}.
{"Options","Opções"}.
{"Organization Name","Nome da organização"}.
{"Organization Unit","Unidade da organização"}.
{"Owner privileges required","São necessários privilégios de dono"}.
{"Packet","Pacote"}.
{"Password:","Palavra-chave:"}.
{"Password","Palavra-chave"}.
{"Path to Dir","Caminho para o directório"}.
{"Path to File","Caminho do ficheiro"}.
{"Pending","Pendente"}.
{"Port","Porta"}.
{"private, ","privado"}.
{"Queries to the conference members are not allowed in this room","Nesta sala não são permitidas consultas aos seus membros"}.
{"RAM and disc copy","Cópia em RAM e em disco"}.
{"RAM copy","Cópia em RAM"}.
{"Recipient is not in the conference room","O destinatário não está na sala"}.
{"Registration in mod_irc for ","Registo no mod_irc para"}.
{"Remote copy","Cópia remota"}.
{"Remove","Remover"}.
{"Remove User","Eliminar utilizador"}.
{"Restart","Reiniciar"}.
{"Restore Backup from File at ","Restaura cópia de segurança a partir do ficheiro em "}.
{"Restore","Restaurar"}.
{"Room title","Título da sala"}.
{"Roster","Lista de contactos"}.
{"Roster of ","Lista de contactos de "}.
{"Running Nodes","Nodos a correr"}.
{"~s access rule configuration","Configuração das Regra de Acesso ~s"}.
{"Search users in ","Procurar utilizadores em "}.
{"Start Modules at ","Iniciar os módulos em "}.
{"Start Modules","Iniciar módulos"}.
{"Statistics","Estatísticas"}.
{"Stop Modules at ","Parar módulos em "}.
{"Stop Modules","Parar módulos"}.
{"Stop","Parar"}.
{"Stopped Nodes","Nodos parados"}.
{"Storage Type","Tipo de armazenagem"}.
{"Submit","Enviar"}.
{"Subscription","Subscrição"}.
{"Time","Data"}.
{"To","Para"}.
{"To ~s","A ~s"}.
{"Update","Actualizar"}.
{"Users","Utilizadores"}.
{"User ","Utilizador"}.
{"User","Utilizador"}.
{"Visitors are not allowed to send messages to all occupants","Os visitantes não podem enviar mensagens para todos os ocupantes"}.
{"You have been banned from this room","Foi banido desta sala"}.
{"You need an x:data capable client to configure mod_irc settings","É necessário um cliente com suporte de x:data para configurar as opções do mod_irc"}.
{"You need an x:data capable client to configure room","É necessário um cliente com suporte de x:data para configurar a sala"}.
{"You need an x:data capable client to search","É necessário um cliente com suporte de x:data para poder procurar"}.
ejabberd-2.1.11/src/msgs/pt.po 0000664 0000000 0000000 00000146724 12240230175 012757 0 ustar msgid ""
msgstr ""
"Project-Id-Version: 2.1.0-alpha\n"
"Last-Translator: Iceburn\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Language: Portuguese (português)\n"
#: ejabberd_c2s.erl:424 ejabberd_c2s.erl:727
msgid "Use of STARTTLS required"
msgstr ""
#: ejabberd_c2s.erl:503
msgid "No resource provided"
msgstr "Não foi passado nenhum recurso"
#: ejabberd_c2s.erl:1197
msgid "Replaced by new connection"
msgstr ""
#: ejabberd_c2s.erl:1885
msgid "Your active privacy list has denied the routing of this stanza."
msgstr ""
#: ejabberd_captcha.erl:96 ejabberd_captcha.erl:152 ejabberd_captcha.erl:178
#, fuzzy
msgid "Enter the text you see"
msgstr "Introduza caminho para o ficheiro de texto"
#: ejabberd_captcha.erl:101
msgid "Your messages to ~s are being blocked. To unblock them, visit ~s"
msgstr ""
#: ejabberd_captcha.erl:134
msgid "If you don't see the CAPTCHA image here, visit the web page."
msgstr ""
#: ejabberd_captcha.erl:146
msgid "CAPTCHA web page"
msgstr ""
#: ejabberd_captcha.erl:307
msgid "The CAPTCHA is valid."
msgstr ""
#: mod_adhoc.erl:95 mod_adhoc.erl:125 mod_adhoc.erl:143 mod_adhoc.erl:161
msgid "Commands"
msgstr ""
#: mod_adhoc.erl:149 mod_adhoc.erl:243
#, fuzzy
msgid "Ping"
msgstr "Pendente"
#: mod_adhoc.erl:260
msgid "Pong"
msgstr ""
#: mod_announce.erl:507 mod_announce_odbc.erl:499
msgid "Really delete message of the day?"
msgstr ""
#: mod_announce.erl:515 mod_announce_odbc.erl:507 mod_configure.erl:1083
#: mod_configure.erl:1128
#, fuzzy
msgid "Subject"
msgstr "Enviar"
#: mod_announce.erl:520 mod_announce_odbc.erl:512 mod_configure.erl:1088
#: mod_configure.erl:1133
msgid "Message body"
msgstr ""
#: mod_announce.erl:600 mod_announce_odbc.erl:592
msgid "No body provided for announce message"
msgstr ""
#: mod_announce.erl:635 mod_announce_odbc.erl:627
msgid "Announcements"
msgstr ""
#: mod_announce.erl:637 mod_announce_odbc.erl:629
msgid "Send announcement to all users"
msgstr ""
#: mod_announce.erl:639 mod_announce_odbc.erl:631
msgid "Send announcement to all users on all hosts"
msgstr ""
#: mod_announce.erl:641 mod_announce_odbc.erl:633
msgid "Send announcement to all online users"
msgstr ""
#: mod_announce.erl:643 mod_announce_odbc.erl:635 mod_configure.erl:1078
#: mod_configure.erl:1123
msgid "Send announcement to all online users on all hosts"
msgstr ""
#: mod_announce.erl:645 mod_announce_odbc.erl:637
msgid "Set message of the day and send to online users"
msgstr ""
#: mod_announce.erl:647 mod_announce_odbc.erl:639
msgid "Set message of the day on all hosts and send to online users"
msgstr ""
#: mod_announce.erl:649 mod_announce_odbc.erl:641
msgid "Update message of the day (don't send)"
msgstr ""
#: mod_announce.erl:651 mod_announce_odbc.erl:643
msgid "Update message of the day on all hosts (don't send)"
msgstr ""
#: mod_announce.erl:653 mod_announce_odbc.erl:645
#, fuzzy
msgid "Delete message of the day"
msgstr "Eliminar os seleccionados"
#: mod_announce.erl:655 mod_announce_odbc.erl:647
msgid "Delete message of the day on all hosts"
msgstr ""
#: mod_configure.erl:114 mod_configure.erl:274 mod_configure.erl:296
#: mod_configure.erl:498
msgid "Configuration"
msgstr "Configuração"
#: mod_configure.erl:125 mod_configure.erl:576 web/ejabberd_web_admin.erl:1936
msgid "Database"
msgstr ""
#: mod_configure.erl:127 mod_configure.erl:595
msgid "Start Modules"
msgstr "Iniciar módulos"
#: mod_configure.erl:129 mod_configure.erl:596
msgid "Stop Modules"
msgstr "Parar módulos"
#: mod_configure.erl:131 mod_configure.erl:604 web/ejabberd_web_admin.erl:1937
msgid "Backup"
msgstr "Guardar cópia de segurança"
#: mod_configure.erl:133 mod_configure.erl:605
msgid "Restore"
msgstr "Restaurar"
#: mod_configure.erl:135 mod_configure.erl:606
msgid "Dump to Text File"
msgstr "Exportar para ficheiro de texto"
#: mod_configure.erl:137 mod_configure.erl:615
msgid "Import File"
msgstr "Importar ficheiro"
#: mod_configure.erl:139 mod_configure.erl:616
msgid "Import Directory"
msgstr "Importar directório"
#: mod_configure.erl:141 mod_configure.erl:581 mod_configure.erl:1057
#, fuzzy
msgid "Restart Service"
msgstr "Reiniciar"
#: mod_configure.erl:143 mod_configure.erl:582 mod_configure.erl:1102
msgid "Shut Down Service"
msgstr ""
#: mod_configure.erl:145 mod_configure.erl:518 mod_configure.erl:1197
#: web/ejabberd_web_admin.erl:1527
msgid "Add User"
msgstr "Adicionar utilizador"
#: mod_configure.erl:147 mod_configure.erl:519 mod_configure.erl:1219
#, fuzzy
msgid "Delete User"
msgstr "Eliminar"
#: mod_configure.erl:149 mod_configure.erl:520 mod_configure.erl:1231
msgid "End User Session"
msgstr ""
#: mod_configure.erl:151 mod_configure.erl:521 mod_configure.erl:1243
#: mod_configure.erl:1255
#, fuzzy
msgid "Get User Password"
msgstr "Palavra-chave"
#: mod_configure.erl:153 mod_configure.erl:522
#, fuzzy
msgid "Change User Password"
msgstr "Mudar palavra-chave"
#: mod_configure.erl:155 mod_configure.erl:523 mod_configure.erl:1272
msgid "Get User Last Login Time"
msgstr ""
#: mod_configure.erl:157 mod_configure.erl:524 mod_configure.erl:1284
#, fuzzy
msgid "Get User Statistics"
msgstr "Estatísticas"
#: mod_configure.erl:159 mod_configure.erl:525
#, fuzzy
msgid "Get Number of Registered Users"
msgstr "Utilizadores registados"
#: mod_configure.erl:161 mod_configure.erl:526
#, fuzzy
msgid "Get Number of Online Users"
msgstr "Utilizadores ligados"
#: mod_configure.erl:163 mod_configure.erl:509 web/ejabberd_web_admin.erl:831
#: web/ejabberd_web_admin.erl:872
msgid "Access Control Lists"
msgstr "Listas de Controlo de Acesso"
#: mod_configure.erl:165 mod_configure.erl:510 web/ejabberd_web_admin.erl:940
#: web/ejabberd_web_admin.erl:976
msgid "Access Rules"
msgstr "Regras de Acesso"
#: mod_configure.erl:297 mod_configure.erl:499
#, fuzzy
msgid "User Management"
msgstr "Gestão da BD"
#: mod_configure.erl:500 web/ejabberd_web_admin.erl:1058
#: web/ejabberd_web_admin.erl:1462
msgid "Online Users"
msgstr "Utilizadores ligados"
#: mod_configure.erl:501
msgid "All Users"
msgstr "Todos os utilizadores"
#: mod_configure.erl:502
#, fuzzy
msgid "Outgoing s2s Connections"
msgstr "Conexões S2S para fora"
#: mod_configure.erl:503 web/ejabberd_web_admin.erl:1907
msgid "Running Nodes"
msgstr "Nodos a correr"
#: mod_configure.erl:504 web/ejabberd_web_admin.erl:1909
msgid "Stopped Nodes"
msgstr "Nodos parados"
#: mod_configure.erl:577 mod_configure.erl:587 web/ejabberd_web_admin.erl:1953
msgid "Modules"
msgstr "Módulos"
#: mod_configure.erl:578
msgid "Backup Management"
msgstr "Gestão de cópias de segurança"
#: mod_configure.erl:579
#, fuzzy
msgid "Import Users From jabberd14 Spool Files"
msgstr "Importar utilizadores a partir de ficheiros da spool do jabberd14"
#: mod_configure.erl:699
msgid "To ~s"
msgstr "A ~s"
#: mod_configure.erl:717
msgid "From ~s"
msgstr "De ~s"
#: mod_configure.erl:913
#, fuzzy
msgid "Database Tables Configuration at "
msgstr "Configuração de tabelas da BD em "
#: mod_configure.erl:918
msgid "Choose storage type of tables"
msgstr "Seleccione o tipo de armazenagem das tabelas"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "Disc only copy"
msgstr "Cópia apenas em disco"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "RAM and disc copy"
msgstr "Cópia em RAM e em disco"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "RAM copy"
msgstr "Cópia em RAM"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "Remote copy"
msgstr "Cópia remota"
#: mod_configure.erl:950
msgid "Stop Modules at "
msgstr "Parar módulos em "
#: mod_configure.erl:954
msgid "Choose modules to stop"
msgstr "Seleccione os módulos a parar"
#: mod_configure.erl:969
msgid "Start Modules at "
msgstr "Iniciar os módulos em "
#: mod_configure.erl:973
msgid "Enter list of {Module, [Options]}"
msgstr "Introduza lista de {módulos, [opções]}"
#: mod_configure.erl:974
msgid "List of modules to start"
msgstr "Lista de módulos a iniciar"
#: mod_configure.erl:983
msgid "Backup to File at "
msgstr "Guardar cópia de segurança para ficheiro em "
#: mod_configure.erl:987 mod_configure.erl:1001
msgid "Enter path to backup file"
msgstr "Introduza o caminho do ficheiro de cópia de segurança"
#: mod_configure.erl:988 mod_configure.erl:1002 mod_configure.erl:1016
#: mod_configure.erl:1030
msgid "Path to File"
msgstr "Caminho do ficheiro"
#: mod_configure.erl:997
msgid "Restore Backup from File at "
msgstr "Restaura cópia de segurança a partir do ficheiro em "
#: mod_configure.erl:1011
msgid "Dump Backup to Text File at "
msgstr "Exporta cópia de segurança para ficheiro de texto em "
#: mod_configure.erl:1015
msgid "Enter path to text file"
msgstr "Introduza caminho para o ficheiro de texto"
#: mod_configure.erl:1025
msgid "Import User from File at "
msgstr "Importar utilizador a partir do ficheiro em "
#: mod_configure.erl:1029
msgid "Enter path to jabberd14 spool file"
msgstr "Introduza o caminho para o ficheiro de spool do jabberd14"
#: mod_configure.erl:1039
msgid "Import Users from Dir at "
msgstr "Importar utilizadores a partir do directório em "
#: mod_configure.erl:1043
msgid "Enter path to jabberd14 spool dir"
msgstr "Introduza o caminho para o directório de spools do jabberd14"
#: mod_configure.erl:1044
msgid "Path to Dir"
msgstr "Caminho para o directório"
#: mod_configure.erl:1060 mod_configure.erl:1105
msgid "Time delay"
msgstr ""
#: mod_configure.erl:1143
msgid "Access Control List Configuration"
msgstr "Configuração da Lista de Controlo de Acesso"
#: mod_configure.erl:1147
msgid "Access control lists"
msgstr "Listas de Controlo de Acesso"
#: mod_configure.erl:1171
msgid "Access Configuration"
msgstr "Configuração de acessos"
#: mod_configure.erl:1175
msgid "Access rules"
msgstr "Regras de acesso"
#: mod_configure.erl:1200 mod_configure.erl:1222 mod_configure.erl:1234
#: mod_configure.erl:1246 mod_configure.erl:1258 mod_configure.erl:1275
#: mod_configure.erl:1287 mod_configure.erl:1650 mod_configure.erl:1700
#: mod_configure.erl:1721 mod_roster.erl:943 mod_roster_odbc.erl:1060
#: mod_vcard.erl:472 mod_vcard_ldap.erl:554 mod_vcard_odbc.erl:448
msgid "Jabber ID"
msgstr ""
#: mod_configure.erl:1205 mod_configure.erl:1263 mod_configure.erl:1651
#: mod_configure.erl:1863 mod_muc/mod_muc_room.erl:3224 mod_register.erl:235
#: web/ejabberd_web_admin.erl:1520
msgid "Password"
msgstr "Palavra-chave"
#: mod_configure.erl:1210
msgid "Password Verification"
msgstr ""
#: mod_configure.erl:1301
#, fuzzy
msgid "Number of registered users"
msgstr "Utilizadores registados"
#: mod_configure.erl:1315
#, fuzzy
msgid "Number of online users"
msgstr "Utilizadores ligados"
#: mod_configure.erl:1682 web/ejabberd_web_admin.erl:1588
#: web/ejabberd_web_admin.erl:1743
msgid "Never"
msgstr "Nunca"
#: mod_configure.erl:1696 web/ejabberd_web_admin.erl:1601
#: web/ejabberd_web_admin.erl:1756
msgid "Online"
msgstr "Ligado"
#: mod_configure.erl:1701
msgid "Last login"
msgstr ""
#: mod_configure.erl:1722
#, fuzzy
msgid "Roster size"
msgstr "Lista de contactos"
#: mod_configure.erl:1723
msgid "IP addresses"
msgstr ""
#: mod_configure.erl:1724
#, fuzzy
msgid "Resources"
msgstr "Restaurar"
#: mod_configure.erl:1850
msgid "Administration of "
msgstr "Administração de "
#: mod_configure.erl:1853
msgid "Action on user"
msgstr "Acção no utilizador"
#: mod_configure.erl:1857
msgid "Edit Properties"
msgstr "Editar propriedades"
#: mod_configure.erl:1860 web/ejabberd_web_admin.erl:1769
msgid "Remove User"
msgstr "Eliminar utilizador"
#: mod_irc/mod_irc.erl:201 mod_irc/mod_irc_odbc.erl:196
#: mod_muc/mod_muc.erl:336 mod_muc/mod_muc_odbc.erl:342
msgid "Access denied by service policy"
msgstr "Acesso negado pela política de serviço"
#: mod_irc/mod_irc.erl:401 mod_irc/mod_irc_odbc.erl:398
msgid "IRC Transport"
msgstr ""
#: mod_irc/mod_irc.erl:428 mod_irc/mod_irc_odbc.erl:425
msgid "ejabberd IRC module"
msgstr "Módulo de IRC ejabberd"
#: mod_irc/mod_irc.erl:559 mod_irc/mod_irc_odbc.erl:568
msgid "You need an x:data capable client to configure mod_irc settings"
msgstr ""
"É necessário um cliente com suporte de x:data para configurar as opções do "
"mod_irc"
#: mod_irc/mod_irc.erl:566 mod_irc/mod_irc_odbc.erl:575
msgid "Registration in mod_irc for "
msgstr "Registo no mod_irc para"
#: mod_irc/mod_irc.erl:571 mod_irc/mod_irc_odbc.erl:580
#, fuzzy
msgid ""
"Enter username, encodings, ports and passwords you wish to use for "
"connecting to IRC servers"
msgstr ""
"Introduza o nome de utilizador e codificações de caracteres que quer usar ao "
"conectar-se aos servidores de IRC"
#: mod_irc/mod_irc.erl:576 mod_irc/mod_irc_odbc.erl:585
msgid "IRC Username"
msgstr "Nome do utilizador de IRC"
#: mod_irc/mod_irc.erl:586 mod_irc/mod_irc_odbc.erl:595
#, fuzzy
msgid ""
"If you want to specify different ports, passwords, encodings for IRC "
"servers, fill this list with values in format '{\"irc server\", \"encoding"
"\", port, \"password\"}'. By default this service use \"~s\" encoding, port "
"~p, empty password."
msgstr ""
"Se deseja especificar codificações de caracteres diferentes para cada "
"servidor IRC preencha esta lista con valores no formato '{\"servidor irc\", "
"\"codificação\"}'. Este serviço usa por omissão a codificação \"~s\"."
#: mod_irc/mod_irc.erl:598 mod_irc/mod_irc_odbc.erl:607
msgid ""
"Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef."
"net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."
msgstr ""
#: mod_irc/mod_irc.erl:603 mod_irc/mod_irc_odbc.erl:612
msgid "Connections parameters"
msgstr ""
#: mod_irc/mod_irc.erl:728 mod_irc/mod_irc_odbc.erl:757
msgid "Join IRC channel"
msgstr ""
#: mod_irc/mod_irc.erl:732 mod_irc/mod_irc_odbc.erl:761
msgid "IRC channel (don't put the first #)"
msgstr ""
#: mod_irc/mod_irc.erl:737 mod_irc/mod_irc_odbc.erl:766
#, fuzzy
msgid "IRC server"
msgstr "Nome do utilizador de IRC"
#: mod_irc/mod_irc.erl:770 mod_irc/mod_irc.erl:774
#: mod_irc/mod_irc_odbc.erl:799 mod_irc/mod_irc_odbc.erl:803
msgid "Join the IRC channel here."
msgstr ""
#: mod_irc/mod_irc.erl:778 mod_irc/mod_irc_odbc.erl:807
msgid "Join the IRC channel in this Jabber ID: ~s"
msgstr ""
#: mod_irc/mod_irc.erl:863 mod_irc/mod_irc_odbc.erl:904
msgid "IRC settings"
msgstr ""
#: mod_irc/mod_irc.erl:868 mod_irc/mod_irc_odbc.erl:909
#, fuzzy
msgid ""
"Enter username and encodings you wish to use for connecting to IRC servers. "
"Press 'Next' to get more fields to fill in. Press 'Complete' to save "
"settings."
msgstr ""
"Introduza o nome de utilizador e codificações de caracteres que quer usar ao "
"conectar-se aos servidores de IRC"
#: mod_irc/mod_irc.erl:874 mod_irc/mod_irc_odbc.erl:915
#, fuzzy
msgid "IRC username"
msgstr "Nome do utilizador de IRC"
#: mod_irc/mod_irc.erl:923 mod_irc/mod_irc_odbc.erl:964
#, fuzzy
msgid "Password ~b"
msgstr "Palavra-chave"
#: mod_irc/mod_irc.erl:928 mod_irc/mod_irc_odbc.erl:969
#, fuzzy
msgid "Port ~b"
msgstr "Porta"
#: mod_irc/mod_irc.erl:933 mod_irc/mod_irc_odbc.erl:974
msgid "Encoding for server ~b"
msgstr ""
#: mod_irc/mod_irc.erl:942 mod_irc/mod_irc_odbc.erl:983
msgid "Server ~b"
msgstr ""
#: mod_muc/mod_muc.erl:449 mod_muc/mod_muc_odbc.erl:456
msgid "Only service administrators are allowed to send service messages"
msgstr ""
"Só os administradores do serviço têm permissão para enviar mensagens de "
"serviço"
#: mod_muc/mod_muc.erl:493 mod_muc/mod_muc_odbc.erl:500
#, fuzzy
msgid "Room creation is denied by service policy"
msgstr "Acesso negado pela política de serviço"
#: mod_muc/mod_muc.erl:500 mod_muc/mod_muc_odbc.erl:507
msgid "Conference room does not exist"
msgstr "A sala não existe"
#: mod_muc/mod_muc.erl:582 mod_muc/mod_muc_odbc.erl:595
msgid "Chatrooms"
msgstr ""
#: mod_muc/mod_muc.erl:712 mod_muc/mod_muc_odbc.erl:729
#, fuzzy
msgid "You need a client that supports x:data to register the nickname"
msgstr ""
"É necessário um cliente com suporte de x:data para poder registar a alcunha"
#: mod_muc/mod_muc.erl:718 mod_muc/mod_muc_odbc.erl:735
msgid "Nickname Registration at "
msgstr "Registo da alcunha em "
#: mod_muc/mod_muc.erl:722 mod_muc/mod_muc_odbc.erl:739
msgid "Enter nickname you want to register"
msgstr "Introduza a alcunha que quer registar"
#: mod_muc/mod_muc.erl:723 mod_muc/mod_muc_odbc.erl:740
#: mod_muc/mod_muc_room.erl:3810 mod_roster.erl:944 mod_roster_odbc.erl:1061
#: mod_vcard.erl:364 mod_vcard.erl:477 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:453
msgid "Nickname"
msgstr "Alcunha"
#: mod_muc/mod_muc.erl:762 mod_muc/mod_muc_odbc.erl:784
#: mod_muc/mod_muc_room.erl:1064 mod_muc/mod_muc_room.erl:1787
#, fuzzy
msgid "That nickname is registered by another person"
msgstr "A alcunha já está registada por outra pessoa"
#: mod_muc/mod_muc.erl:788 mod_muc/mod_muc_odbc.erl:811
#, fuzzy
msgid "You must fill in field \"Nickname\" in the form"
msgstr "Deve preencher o campo \"alcunha\" no formulário"
#: mod_muc/mod_muc.erl:808 mod_muc/mod_muc_odbc.erl:831
msgid "ejabberd MUC module"
msgstr "Módulo MUC de ejabberd"
#: mod_muc/mod_muc_log.erl:374 mod_muc/mod_muc_log.erl:381
#, fuzzy
msgid "Chatroom configuration modified"
msgstr "Configuração para "
#: mod_muc/mod_muc_log.erl:384
msgid "joins the room"
msgstr ""
#: mod_muc/mod_muc_log.erl:387 mod_muc/mod_muc_log.erl:390
msgid "leaves the room"
msgstr ""
#: mod_muc/mod_muc_log.erl:393 mod_muc/mod_muc_log.erl:396
msgid "has been banned"
msgstr ""
#: mod_muc/mod_muc_log.erl:399 mod_muc/mod_muc_log.erl:402
msgid "has been kicked"
msgstr ""
#: mod_muc/mod_muc_log.erl:405
msgid "has been kicked because of an affiliation change"
msgstr ""
#: mod_muc/mod_muc_log.erl:408
msgid "has been kicked because the room has been changed to members-only"
msgstr ""
#: mod_muc/mod_muc_log.erl:411
msgid "has been kicked because of a system shutdown"
msgstr ""
#: mod_muc/mod_muc_log.erl:414
msgid "is now known as"
msgstr ""
#: mod_muc/mod_muc_log.erl:417 mod_muc/mod_muc_log.erl:688
#: mod_muc/mod_muc_room.erl:2393
msgid " has set the subject to: "
msgstr " colocou o tópico: "
#: mod_muc/mod_muc_log.erl:452
#, fuzzy
msgid "Chatroom is created"
msgstr "Configuração para "
#: mod_muc/mod_muc_log.erl:453
msgid "Chatroom is destroyed"
msgstr ""
#: mod_muc/mod_muc_log.erl:454
msgid "Chatroom is started"
msgstr ""
#: mod_muc/mod_muc_log.erl:455
msgid "Chatroom is stopped"
msgstr ""
#: mod_muc/mod_muc_log.erl:459
msgid "Monday"
msgstr ""
#: mod_muc/mod_muc_log.erl:460
msgid "Tuesday"
msgstr ""
#: mod_muc/mod_muc_log.erl:461
msgid "Wednesday"
msgstr ""
#: mod_muc/mod_muc_log.erl:462
msgid "Thursday"
msgstr ""
#: mod_muc/mod_muc_log.erl:463
msgid "Friday"
msgstr ""
#: mod_muc/mod_muc_log.erl:464
msgid "Saturday"
msgstr ""
#: mod_muc/mod_muc_log.erl:465
msgid "Sunday"
msgstr ""
#: mod_muc/mod_muc_log.erl:469
msgid "January"
msgstr ""
#: mod_muc/mod_muc_log.erl:470
msgid "February"
msgstr ""
#: mod_muc/mod_muc_log.erl:471
msgid "March"
msgstr ""
#: mod_muc/mod_muc_log.erl:472
msgid "April"
msgstr ""
#: mod_muc/mod_muc_log.erl:473
msgid "May"
msgstr ""
#: mod_muc/mod_muc_log.erl:474
msgid "June"
msgstr ""
#: mod_muc/mod_muc_log.erl:475
msgid "July"
msgstr ""
#: mod_muc/mod_muc_log.erl:476
msgid "August"
msgstr ""
#: mod_muc/mod_muc_log.erl:477
msgid "September"
msgstr ""
#: mod_muc/mod_muc_log.erl:478
msgid "October"
msgstr ""
#: mod_muc/mod_muc_log.erl:479
#, fuzzy
msgid "November"
msgstr "Nunca"
#: mod_muc/mod_muc_log.erl:480
msgid "December"
msgstr ""
#: mod_muc/mod_muc_log.erl:750
#, fuzzy
msgid "Room Configuration"
msgstr "Configuração"
#: mod_muc/mod_muc_log.erl:759
msgid "Room Occupants"
msgstr ""
#: mod_muc/mod_muc_room.erl:174
msgid "Traffic rate limit is exceeded"
msgstr ""
#: mod_muc/mod_muc_room.erl:246
msgid ""
"This participant is kicked from the room because he sent an error message"
msgstr ""
#: mod_muc/mod_muc_room.erl:255
msgid "It is not allowed to send private messages to the conference"
msgstr "Impedir o envio de mensagens privadas para a sala"
#: mod_muc/mod_muc_room.erl:332
msgid "Please, wait for a while before sending new voice request"
msgstr ""
#: mod_muc/mod_muc_room.erl:347
msgid "Voice requests are disabled in this conference"
msgstr ""
#: mod_muc/mod_muc_room.erl:364
msgid "Failed to extract JID from your voice request approval"
msgstr ""
#: mod_muc/mod_muc_room.erl:393
msgid "Only moderators can approve voice requests"
msgstr ""
#: mod_muc/mod_muc_room.erl:408
msgid "Improper message type"
msgstr "Tipo de mensagem incorrecto"
#: mod_muc/mod_muc_room.erl:518
msgid ""
"This participant is kicked from the room because he sent an error message to "
"another participant"
msgstr ""
#: mod_muc/mod_muc_room.erl:531
msgid "It is not allowed to send private messages of type \"groupchat\""
msgstr "Não é permitido enviar mensagens privadas do tipo \"groupchat\""
#: mod_muc/mod_muc_room.erl:543 mod_muc/mod_muc_room.erl:611
msgid "Recipient is not in the conference room"
msgstr "O destinatário não está na sala"
#: mod_muc/mod_muc_room.erl:564 mod_muc/mod_muc_room.erl:585
#, fuzzy
msgid "It is not allowed to send private messages"
msgstr "Impedir o envio de mensagens privadas para a sala"
#: mod_muc/mod_muc_room.erl:576 mod_muc/mod_muc_room.erl:956
#: mod_muc/mod_muc_room.erl:4040
msgid "Only occupants are allowed to send messages to the conference"
msgstr "Só os ocupantes podem enviar mensagens para a sala"
#: mod_muc/mod_muc_room.erl:634
msgid "Only occupants are allowed to send queries to the conference"
msgstr "Só os ocupantes podem enviar consultas para a sala"
#: mod_muc/mod_muc_room.erl:646
msgid "Queries to the conference members are not allowed in this room"
msgstr "Nesta sala não são permitidas consultas aos seus membros"
#: mod_muc/mod_muc_room.erl:932
#, fuzzy
msgid ""
"Only moderators and participants are allowed to change the subject in this "
"room"
msgstr "Só os moderadores e os participantes podem mudar o tópico desta sala"
#: mod_muc/mod_muc_room.erl:937
#, fuzzy
msgid "Only moderators are allowed to change the subject in this room"
msgstr "Só os moderadores podem mudar o tópico desta sala"
#: mod_muc/mod_muc_room.erl:947
msgid "Visitors are not allowed to send messages to all occupants"
msgstr "Os visitantes não podem enviar mensagens para todos os ocupantes"
#: mod_muc/mod_muc_room.erl:1021
msgid ""
"This participant is kicked from the room because he sent an error presence"
msgstr ""
#: mod_muc/mod_muc_room.erl:1040
#, fuzzy
msgid "Visitors are not allowed to change their nicknames in this room"
msgstr "Só os moderadores podem mudar o tópico desta sala"
#: mod_muc/mod_muc_room.erl:1053 mod_muc/mod_muc_room.erl:1779
#, fuzzy
msgid "That nickname is already in use by another occupant"
msgstr "A alcunha já está a ser usado por outro ocupante"
#: mod_muc/mod_muc_room.erl:1768
msgid "You have been banned from this room"
msgstr "Foi banido desta sala"
#: mod_muc/mod_muc_room.erl:1771
#, fuzzy
msgid "Membership is required to enter this room"
msgstr "É necessário ser membro desta sala para poder entrar"
#: mod_muc/mod_muc_room.erl:1807
#, fuzzy
msgid "This room is not anonymous"
msgstr "Tornar a sala anónima?"
#: mod_muc/mod_muc_room.erl:1833
#, fuzzy
msgid "A password is required to enter this room"
msgstr "É necessária a palavra-chave para poder entrar nesta sala"
#: mod_muc/mod_muc_room.erl:1855 mod_register.erl:246
msgid "Too many CAPTCHA requests"
msgstr ""
#: mod_muc/mod_muc_room.erl:1864 mod_register.erl:251
msgid "Unable to generate a CAPTCHA"
msgstr ""
#: mod_muc/mod_muc_room.erl:1874
msgid "Incorrect password"
msgstr "Palavra-chave incorrecta"
#: mod_muc/mod_muc_room.erl:2448
msgid "Administrator privileges required"
msgstr "São necessários privilégios de administrador"
#: mod_muc/mod_muc_room.erl:2463
msgid "Moderator privileges required"
msgstr "São necessários privilégios de moderador"
#: mod_muc/mod_muc_room.erl:2619
msgid "Jabber ID ~s is invalid"
msgstr "O Jabber ID ~s não é válido"
#: mod_muc/mod_muc_room.erl:2633
msgid "Nickname ~s does not exist in the room"
msgstr "A alcunha ~s não existe na sala"
#: mod_muc/mod_muc_room.erl:2659 mod_muc/mod_muc_room.erl:3049
msgid "Invalid affiliation: ~s"
msgstr "Afiliação inválida: ~s"
#: mod_muc/mod_muc_room.erl:2713
msgid "Invalid role: ~s"
msgstr "Papel inválido: ~s"
#: mod_muc/mod_muc_room.erl:3026 mod_muc/mod_muc_room.erl:3062
msgid "Owner privileges required"
msgstr "São necessários privilégios de dono"
#: mod_muc/mod_muc_room.erl:3195
#, fuzzy
msgid "Configuration of room ~s"
msgstr "Configuração para "
#: mod_muc/mod_muc_room.erl:3200
msgid "Room title"
msgstr "Título da sala"
#: mod_muc/mod_muc_room.erl:3203 mod_muc/mod_muc_room.erl:3692
#, fuzzy
msgid "Room description"
msgstr "Subscrição"
#: mod_muc/mod_muc_room.erl:3210
#, fuzzy
msgid "Make room persistent"
msgstr "Tornar a sala permanente?"
#: mod_muc/mod_muc_room.erl:3215
#, fuzzy
msgid "Make room public searchable"
msgstr "Tornar a sala publicamente visível?"
#: mod_muc/mod_muc_room.erl:3218
#, fuzzy
msgid "Make participants list public"
msgstr "Tornar pública a lista de participantes?"
#: mod_muc/mod_muc_room.erl:3221
#, fuzzy
msgid "Make room password protected"
msgstr "Proteger a sala com palavra-chave?"
#: mod_muc/mod_muc_room.erl:3232
msgid "Maximum Number of Occupants"
msgstr ""
#: mod_muc/mod_muc_room.erl:3239
msgid "No limit"
msgstr ""
#: mod_muc/mod_muc_room.erl:3250
msgid "Present real Jabber IDs to"
msgstr ""
#: mod_muc/mod_muc_room.erl:3258 mod_muc/mod_muc_room.erl:3292
msgid "moderators only"
msgstr ""
#: mod_muc/mod_muc_room.erl:3260 mod_muc/mod_muc_room.erl:3294
#, fuzzy
msgid "anyone"
msgstr "Nenhum"
#: mod_muc/mod_muc_room.erl:3262
#, fuzzy
msgid "Make room members-only"
msgstr "Tornar a sala exclusiva a membros?"
#: mod_muc/mod_muc_room.erl:3265
msgid "Make room moderated"
msgstr "Tornar a sala moderada"
#: mod_muc/mod_muc_room.erl:3268
#, fuzzy
msgid "Default users as participants"
msgstr "Os utilizadores são membros por omissão?"
#: mod_muc/mod_muc_room.erl:3271
#, fuzzy
msgid "Allow users to change the subject"
msgstr "Permitir aos utilizadores mudar o tópico?"
#: mod_muc/mod_muc_room.erl:3274
#, fuzzy
msgid "Allow users to send private messages"
msgstr "Permitir que os utilizadores enviem mensagens privadas?"
#: mod_muc/mod_muc_room.erl:3279
#, fuzzy
msgid "Allow visitors to send private messages to"
msgstr "Permitir que os utilizadores enviem mensagens privadas?"
#: mod_muc/mod_muc_room.erl:3290
msgid "nobody"
msgstr ""
#: mod_muc/mod_muc_room.erl:3296
#, fuzzy
msgid "Allow users to query other users"
msgstr "Permitir aos utilizadores consultar outros utilizadores?"
#: mod_muc/mod_muc_room.erl:3299
#, fuzzy
msgid "Allow users to send invites"
msgstr "Permitir que os utilizadores enviem convites?"
#: mod_muc/mod_muc_room.erl:3302
msgid "Allow visitors to send status text in presence updates"
msgstr ""
#: mod_muc/mod_muc_room.erl:3305
#, fuzzy
msgid "Allow visitors to change nickname"
msgstr "Permitir aos utilizadores mudar o tópico?"
#: mod_muc/mod_muc_room.erl:3308
#, fuzzy
msgid "Allow visitors to send voice requests"
msgstr "Permitir que os utilizadores enviem convites?"
#: mod_muc/mod_muc_room.erl:3311
msgid "Minimum interval between voice requests (in seconds)"
msgstr ""
#: mod_muc/mod_muc_room.erl:3317
#, fuzzy
msgid "Make room CAPTCHA protected"
msgstr "Proteger a sala com palavra-chave?"
#: mod_muc/mod_muc_room.erl:3322
msgid "Exclude Jabber IDs from CAPTCHA challenge"
msgstr ""
#: mod_muc/mod_muc_room.erl:3329
#, fuzzy
msgid "Enable logging"
msgstr "Guardar históricos?"
#: mod_muc/mod_muc_room.erl:3337
msgid "You need an x:data capable client to configure room"
msgstr "É necessário um cliente com suporte de x:data para configurar a sala"
#: mod_muc/mod_muc_room.erl:3694
msgid "Number of occupants"
msgstr ""
#: mod_muc/mod_muc_room.erl:3750
msgid "private, "
msgstr "privado"
#: mod_muc/mod_muc_room.erl:3799
msgid "Voice request"
msgstr ""
#: mod_muc/mod_muc_room.erl:3803
msgid "Either approve or decline the voice request."
msgstr ""
#: mod_muc/mod_muc_room.erl:3809
#, fuzzy
msgid "User JID"
msgstr "Utilizador"
#: mod_muc/mod_muc_room.erl:3811
msgid "Grant voice to this person?"
msgstr ""
#: mod_muc/mod_muc_room.erl:3960
msgid "~s invites you to the room ~s"
msgstr ""
#: mod_muc/mod_muc_room.erl:3969
#, fuzzy
msgid "the password is"
msgstr "Mudar palavra-chave"
#: mod_offline.erl:510 mod_offline_odbc.erl:352
msgid ""
"Your contact offline message queue is full. The message has been discarded."
msgstr ""
#: mod_offline.erl:560 mod_offline_odbc.erl:408
#, fuzzy
msgid "~s's Offline Messages Queue"
msgstr "~s fila de mensagens diferidas"
#: mod_offline.erl:563 mod_offline_odbc.erl:411 mod_roster.erl:987
#: mod_roster_odbc.erl:1104 mod_shared_roster.erl:901
#: mod_shared_roster.erl:1010 mod_shared_roster_odbc.erl:930
#: mod_shared_roster_odbc.erl:1039 web/ejabberd_web_admin.erl:833
#: web/ejabberd_web_admin.erl:874 web/ejabberd_web_admin.erl:942
#: web/ejabberd_web_admin.erl:978 web/ejabberd_web_admin.erl:1019
#: web/ejabberd_web_admin.erl:1508 web/ejabberd_web_admin.erl:1760
#: web/ejabberd_web_admin.erl:1931 web/ejabberd_web_admin.erl:1963
#: web/ejabberd_web_admin.erl:2031 web/ejabberd_web_admin.erl:2135
#: web/ejabberd_web_admin.erl:2160 web/ejabberd_web_admin.erl:2248
#, fuzzy
msgid "Submitted"
msgstr "enviado"
#: mod_offline.erl:571
msgid "Time"
msgstr "Data"
#: mod_offline.erl:572
msgid "From"
msgstr "De"
#: mod_offline.erl:573
msgid "To"
msgstr "Para"
#: mod_offline.erl:574 mod_offline_odbc.erl:419
msgid "Packet"
msgstr "Pacote"
#: mod_offline.erl:587 mod_offline_odbc.erl:432 mod_shared_roster.erl:908
#: mod_shared_roster_odbc.erl:937 web/ejabberd_web_admin.erl:882
#: web/ejabberd_web_admin.erl:986
msgid "Delete Selected"
msgstr "Eliminar os seleccionados"
#: mod_offline.erl:645 mod_offline_odbc.erl:519
#, fuzzy
msgid "Offline Messages:"
msgstr "Mensagens diferidas:"
#: mod_offline.erl:645 mod_offline_odbc.erl:519
#, fuzzy
msgid "Remove All Offline Messages"
msgstr "Mensagens diferidas"
#: mod_proxy65/mod_proxy65_service.erl:213
#, fuzzy
msgid "ejabberd SOCKS5 Bytestreams module"
msgstr "Módulo vCard de ejabberd"
#: mod_pubsub/mod_pubsub.erl:1120 mod_pubsub/mod_pubsub_odbc.erl:929
msgid "Publish-Subscribe"
msgstr ""
#: mod_pubsub/mod_pubsub.erl:1214 mod_pubsub/mod_pubsub_odbc.erl:1025
#, fuzzy
msgid "ejabberd Publish-Subscribe module"
msgstr "Módulo pub/sub de ejabberd"
#: mod_pubsub/mod_pubsub.erl:1497 mod_pubsub/mod_pubsub_odbc.erl:1312
msgid "PubSub subscriber request"
msgstr ""
#: mod_pubsub/mod_pubsub.erl:1499 mod_pubsub/mod_pubsub_odbc.erl:1314
msgid "Choose whether to approve this entity's subscription."
msgstr ""
#: mod_pubsub/mod_pubsub.erl:1505 mod_pubsub/mod_pubsub_odbc.erl:1320
#, fuzzy
msgid "Node ID"
msgstr "Nodo"
#: mod_pubsub/mod_pubsub.erl:1510 mod_pubsub/mod_pubsub_odbc.erl:1325
msgid "Subscriber Address"
msgstr ""
#: mod_pubsub/mod_pubsub.erl:1516 mod_pubsub/mod_pubsub_odbc.erl:1331
msgid "Allow this Jabber ID to subscribe to this pubsub node?"
msgstr ""
#: mod_pubsub/mod_pubsub.erl:3474 mod_pubsub/mod_pubsub_odbc.erl:3287
msgid "Deliver payloads with event notifications"
msgstr ""
#: mod_pubsub/mod_pubsub.erl:3475 mod_pubsub/mod_pubsub_odbc.erl:3288
msgid "Deliver event notifications"
msgstr ""
#: mod_pubsub/mod_pubsub.erl:3476 mod_pubsub/mod_pubsub_odbc.erl:3289
msgid "Notify subscribers when the node configuration changes"
msgstr ""
#: mod_pubsub/mod_pubsub.erl:3477 mod_pubsub/mod_pubsub_odbc.erl:3290
msgid "Notify subscribers when the node is deleted"
msgstr ""
#: mod_pubsub/mod_pubsub.erl:3478 mod_pubsub/mod_pubsub_odbc.erl:3291
msgid "Notify subscribers when items are removed from the node"
msgstr ""
#: mod_pubsub/mod_pubsub.erl:3479 mod_pubsub/mod_pubsub_odbc.erl:3292
msgid "Persist items to storage"
msgstr ""
#: mod_pubsub/mod_pubsub.erl:3480 mod_pubsub/mod_pubsub_odbc.erl:3293
msgid "A friendly name for the node"
msgstr ""
#: mod_pubsub/mod_pubsub.erl:3481 mod_pubsub/mod_pubsub_odbc.erl:3294
msgid "Max # of items to persist"
msgstr ""
#: mod_pubsub/mod_pubsub.erl:3482 mod_pubsub/mod_pubsub_odbc.erl:3295
msgid "Whether to allow subscriptions"
msgstr ""
#: mod_pubsub/mod_pubsub.erl:3483 mod_pubsub/mod_pubsub_odbc.erl:3296
msgid "Specify the access model"
msgstr ""
#: mod_pubsub/mod_pubsub.erl:3486 mod_pubsub/mod_pubsub_odbc.erl:3299
msgid "Roster groups allowed to subscribe"
msgstr ""
#: mod_pubsub/mod_pubsub.erl:3487 mod_pubsub/mod_pubsub_odbc.erl:3300
msgid "Specify the publisher model"
msgstr ""
#: mod_pubsub/mod_pubsub.erl:3489 mod_pubsub/mod_pubsub_odbc.erl:3302
msgid "Purge all items when the relevant publisher goes offline"
msgstr ""
#: mod_pubsub/mod_pubsub.erl:3490 mod_pubsub/mod_pubsub_odbc.erl:3303
msgid "Specify the event message type"
msgstr ""
#: mod_pubsub/mod_pubsub.erl:3492 mod_pubsub/mod_pubsub_odbc.erl:3305
msgid "Max payload size in bytes"
msgstr ""
#: mod_pubsub/mod_pubsub.erl:3493 mod_pubsub/mod_pubsub_odbc.erl:3306
msgid "When to send the last published item"
msgstr ""
#: mod_pubsub/mod_pubsub.erl:3495 mod_pubsub/mod_pubsub_odbc.erl:3308
msgid "Only deliver notifications to available users"
msgstr ""
#: mod_pubsub/mod_pubsub.erl:3496 mod_pubsub/mod_pubsub_odbc.erl:3309
msgid "The collections with which a node is affiliated"
msgstr ""
#: mod_register.erl:193
msgid "The CAPTCHA verification has failed"
msgstr ""
#: mod_register.erl:220
#, fuzzy
msgid "You need a client that supports x:data and CAPTCHA to register"
msgstr ""
"É necessário um cliente com suporte de x:data para poder registar a alcunha"
#: mod_register.erl:226 mod_register.erl:265
msgid "Choose a username and password to register with this server"
msgstr ""
"Escolha um nome de utilizador e palavra-chave para se registar neste servidor"
#: mod_register.erl:230 mod_vcard.erl:364 mod_vcard_odbc.erl:342
#: web/ejabberd_web_admin.erl:1515 web/ejabberd_web_admin.erl:1572
msgid "User"
msgstr "Utilizador"
#: mod_register.erl:316 mod_register.erl:361
#, fuzzy
msgid "The password is too weak"
msgstr "Mudar palavra-chave"
#: mod_register.erl:365
#, fuzzy
msgid "Users are not allowed to register accounts so quickly"
msgstr "Os visitantes não podem enviar mensagens para todos os ocupantes"
#: mod_roster.erl:938 mod_roster_odbc.erl:1055 web/ejabberd_web_admin.erl:1701
#: web/ejabberd_web_admin.erl:1886 web/ejabberd_web_admin.erl:1897
#: web/ejabberd_web_admin.erl:2219
msgid "None"
msgstr "Nenhum"
#: mod_roster.erl:945 mod_roster_odbc.erl:1062
msgid "Subscription"
msgstr "Subscrição"
#: mod_roster.erl:946 mod_roster_odbc.erl:1063
msgid "Pending"
msgstr "Pendente"
#: mod_roster.erl:947 mod_roster_odbc.erl:1064
msgid "Groups"
msgstr "Grupos"
#: mod_roster.erl:974 mod_roster_odbc.erl:1091
msgid "Validate"
msgstr ""
#: mod_roster.erl:982 mod_roster_odbc.erl:1099
msgid "Remove"
msgstr "Remover"
#: mod_roster.erl:985 mod_roster_odbc.erl:1102
msgid "Roster of "
msgstr "Lista de contactos de "
#: mod_roster.erl:988 mod_roster_odbc.erl:1105 mod_shared_roster.erl:902
#: mod_shared_roster.erl:1011 mod_shared_roster_odbc.erl:931
#: mod_shared_roster_odbc.erl:1040 web/ejabberd_web_admin.erl:834
#: web/ejabberd_web_admin.erl:875 web/ejabberd_web_admin.erl:943
#: web/ejabberd_web_admin.erl:979 web/ejabberd_web_admin.erl:1020
#: web/ejabberd_web_admin.erl:1509 web/ejabberd_web_admin.erl:1761
#: web/ejabberd_web_admin.erl:1932 web/ejabberd_web_admin.erl:2136
#: web/ejabberd_web_admin.erl:2161
#, fuzzy
msgid "Bad format"
msgstr "formato inválido"
#: mod_roster.erl:995 mod_roster_odbc.erl:1112
#, fuzzy
msgid "Add Jabber ID"
msgstr "Adicionar Jabber ID"
#: mod_roster.erl:1094 mod_roster_odbc.erl:1211
msgid "Roster"
msgstr "Lista de contactos"
#: mod_shared_roster.erl:857 mod_shared_roster.erl:899
#: mod_shared_roster.erl:1007 mod_shared_roster_odbc.erl:886
#: mod_shared_roster_odbc.erl:928 mod_shared_roster_odbc.erl:1036
#, fuzzy
msgid "Shared Roster Groups"
msgstr "Lista de contactos partilhada"
#: mod_shared_roster.erl:895 mod_shared_roster_odbc.erl:924
#: web/ejabberd_web_admin.erl:1365 web/ejabberd_web_admin.erl:2461
msgid "Add New"
msgstr "Adicionar novo"
#: mod_shared_roster.erl:978 mod_shared_roster_odbc.erl:1007
#, fuzzy
msgid "Name:"
msgstr "Nome"
#: mod_shared_roster.erl:983 mod_shared_roster_odbc.erl:1012
#, fuzzy
msgid "Description:"
msgstr "Subscrição"
#: mod_shared_roster.erl:991 mod_shared_roster_odbc.erl:1020
msgid "Members:"
msgstr ""
#: mod_shared_roster.erl:999 mod_shared_roster_odbc.erl:1028
msgid "Displayed Groups:"
msgstr ""
#: mod_shared_roster.erl:1008 mod_shared_roster_odbc.erl:1037
#, fuzzy
msgid "Group "
msgstr "Grupos"
#: mod_shared_roster.erl:1017 mod_shared_roster_odbc.erl:1046
#: web/ejabberd_web_admin.erl:840 web/ejabberd_web_admin.erl:884
#: web/ejabberd_web_admin.erl:949 web/ejabberd_web_admin.erl:1026
#: web/ejabberd_web_admin.erl:2017
msgid "Submit"
msgstr "Enviar"
#: mod_vcard.erl:165 mod_vcard_ldap.erl:238 mod_vcard_odbc.erl:129
msgid "Erlang Jabber Server"
msgstr "Servidor Jabber em Erlang"
#: mod_vcard.erl:364 mod_vcard.erl:478 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:454
msgid "Birthday"
msgstr "Data de nascimento"
#: mod_vcard.erl:364 mod_vcard.erl:480 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:456
msgid "City"
msgstr "Cidade"
#: mod_vcard.erl:364 mod_vcard.erl:479 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:455
msgid "Country"
msgstr "País"
#: mod_vcard.erl:364 mod_vcard.erl:481 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:457
#, fuzzy
msgid "Email"
msgstr "email"
#: mod_vcard.erl:364 mod_vcard.erl:476 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:452
msgid "Family Name"
msgstr "Apelido"
#: mod_vcard.erl:364 mod_vcard_odbc.erl:342
#, fuzzy
msgid ""
"Fill in the form to search for any matching Jabber User (Add * to the end of "
"field to match substring)"
msgstr "Preencha os campos para procurar utilizadores Jabber coincidentes"
#: mod_vcard.erl:364 mod_vcard.erl:473 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:449
msgid "Full Name"
msgstr "Nome completo"
#: mod_vcard.erl:364 mod_vcard.erl:475 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:451
msgid "Middle Name"
msgstr "Segundo nome"
#: mod_vcard.erl:364 mod_vcard.erl:474 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:450 web/ejabberd_web_admin.erl:2006
msgid "Name"
msgstr "Nome"
#: mod_vcard.erl:364 mod_vcard.erl:482 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:458
msgid "Organization Name"
msgstr "Nome da organização"
#: mod_vcard.erl:364 mod_vcard.erl:483 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:459
msgid "Organization Unit"
msgstr "Unidade da organização"
#: mod_vcard.erl:364 mod_vcard_ldap.erl:462 mod_vcard_odbc.erl:342
msgid "Search users in "
msgstr "Procurar utilizadores em "
#: mod_vcard.erl:364 mod_vcard_ldap.erl:462 mod_vcard_odbc.erl:342
msgid "You need an x:data capable client to search"
msgstr "É necessário um cliente com suporte de x:data para poder procurar"
#: mod_vcard.erl:389 mod_vcard_ldap.erl:487 mod_vcard_odbc.erl:367
msgid "vCard User Search"
msgstr ""
#: mod_vcard.erl:445 mod_vcard_ldap.erl:541 mod_vcard_odbc.erl:421
msgid "ejabberd vCard module"
msgstr "Módulo vCard de ejabberd"
#: mod_vcard.erl:469 mod_vcard_ldap.erl:551 mod_vcard_odbc.erl:445
#, fuzzy
msgid "Search Results for "
msgstr "Procurar utilizadores em "
#: mod_vcard_ldap.erl:462
msgid "Fill in fields to search for any matching Jabber User"
msgstr "Preencha os campos para procurar utilizadores Jabber coincidentes"
#: web/ejabberd_web_admin.erl:193 web/ejabberd_web_admin.erl:203
#: web/ejabberd_web_admin.erl:219 web/ejabberd_web_admin.erl:229
msgid "Unauthorized"
msgstr ""
#: web/ejabberd_web_admin.erl:286 web/ejabberd_web_admin.erl:303
#, fuzzy
msgid "ejabberd Web Admin"
msgstr "Administração do ejabberd"
#: web/ejabberd_web_admin.erl:769 web/ejabberd_web_admin.erl:780
#, fuzzy
msgid "Administration"
msgstr "Administração de "
#: web/ejabberd_web_admin.erl:878 web/ejabberd_web_admin.erl:982
#, fuzzy
msgid "Raw"
msgstr "modo texto"
#: web/ejabberd_web_admin.erl:1017
msgid "~s access rule configuration"
msgstr "Configuração das Regra de Acesso ~s"
#: web/ejabberd_web_admin.erl:1035
#, fuzzy
msgid "Virtual Hosts"
msgstr "Servidores virtuales"
#: web/ejabberd_web_admin.erl:1043 web/ejabberd_web_admin.erl:1050
msgid "Users"
msgstr "Utilizadores"
#: web/ejabberd_web_admin.erl:1078
#, fuzzy
msgid "Users Last Activity"
msgstr "Última actividade"
#: web/ejabberd_web_admin.erl:1080
msgid "Period: "
msgstr ""
#: web/ejabberd_web_admin.erl:1090
msgid "Last month"
msgstr ""
#: web/ejabberd_web_admin.erl:1091
msgid "Last year"
msgstr ""
#: web/ejabberd_web_admin.erl:1092
#, fuzzy
msgid "All activity"
msgstr "Última actividade"
#: web/ejabberd_web_admin.erl:1094
msgid "Show Ordinary Table"
msgstr ""
#: web/ejabberd_web_admin.erl:1096
msgid "Show Integral Table"
msgstr ""
#: web/ejabberd_web_admin.erl:1105 web/ejabberd_web_admin.erl:1939
msgid "Statistics"
msgstr "Estatísticas"
#: web/ejabberd_web_admin.erl:1117
#, fuzzy
msgid "Not Found"
msgstr "Nodo não encontrado"
#: web/ejabberd_web_admin.erl:1134
msgid "Node not found"
msgstr "Nodo não encontrado"
#: web/ejabberd_web_admin.erl:1460
#, fuzzy
msgid "Host"
msgstr "Nome do servidor"
#: web/ejabberd_web_admin.erl:1461
#, fuzzy
msgid "Registered Users"
msgstr "Utilizadores registados"
#: web/ejabberd_web_admin.erl:1573
#, fuzzy
msgid "Offline Messages"
msgstr "Mensagens diferidas"
#: web/ejabberd_web_admin.erl:1574 web/ejabberd_web_admin.erl:1767
msgid "Last Activity"
msgstr "Última actividade"
#: web/ejabberd_web_admin.erl:1659 web/ejabberd_web_admin.erl:1675
#, fuzzy
msgid "Registered Users:"
msgstr "Utilizadores registados"
#: web/ejabberd_web_admin.erl:1661 web/ejabberd_web_admin.erl:1677
#: web/ejabberd_web_admin.erl:2192
#, fuzzy
msgid "Online Users:"
msgstr "Utilizadores ligados"
#: web/ejabberd_web_admin.erl:1663
#, fuzzy
msgid "Outgoing s2s Connections:"
msgstr "Conexões S2S para fora"
#: web/ejabberd_web_admin.erl:1665
#, fuzzy
msgid "Outgoing s2s Servers:"
msgstr "Servidores S2S de saída"
#: web/ejabberd_web_admin.erl:1734 web/mod_register_web.erl:175
#: web/mod_register_web.erl:372 web/mod_register_web.erl:381
#: web/mod_register_web.erl:411
msgid "Change Password"
msgstr "Mudar palavra-chave"
#: web/ejabberd_web_admin.erl:1758
msgid "User "
msgstr "Utilizador"
#: web/ejabberd_web_admin.erl:1765
msgid "Connected Resources:"
msgstr "Recursos conectados:"
#: web/ejabberd_web_admin.erl:1766 web/mod_register_web.erl:227
#: web/mod_register_web.erl:519
msgid "Password:"
msgstr "Palavra-chave:"
#: web/ejabberd_web_admin.erl:1828
msgid "No Data"
msgstr ""
#: web/ejabberd_web_admin.erl:1906
msgid "Nodes"
msgstr "Nodos"
#: web/ejabberd_web_admin.erl:1929 web/ejabberd_web_admin.erl:1951
msgid "Node "
msgstr "Nodo"
#: web/ejabberd_web_admin.erl:1938
#, fuzzy
msgid "Listened Ports"
msgstr "Portas em escuta em "
#: web/ejabberd_web_admin.erl:1940 web/ejabberd_web_admin.erl:2260
#: web/ejabberd_web_admin.erl:2448
msgid "Update"
msgstr "Actualizar"
#: web/ejabberd_web_admin.erl:1943 web/ejabberd_web_admin.erl:2569
msgid "Restart"
msgstr "Reiniciar"
#: web/ejabberd_web_admin.erl:1945 web/ejabberd_web_admin.erl:2571
msgid "Stop"
msgstr "Parar"
#: web/ejabberd_web_admin.erl:1959
#, fuzzy
msgid "RPC Call Error"
msgstr "Erro na chamada RPC"
#: web/ejabberd_web_admin.erl:2000
#, fuzzy
msgid "Database Tables at "
msgstr "Tabelas da BD em "
#: web/ejabberd_web_admin.erl:2007
msgid "Storage Type"
msgstr "Tipo de armazenagem"
#: web/ejabberd_web_admin.erl:2008
msgid "Elements"
msgstr ""
#: web/ejabberd_web_admin.erl:2009
msgid "Memory"
msgstr "Memória"
#: web/ejabberd_web_admin.erl:2032 web/ejabberd_web_admin.erl:2137
msgid "Error"
msgstr ""
#: web/ejabberd_web_admin.erl:2034
#, fuzzy
msgid "Backup of "
msgstr "Guardar cópia de segurança"
#: web/ejabberd_web_admin.erl:2036
msgid ""
"Please note that these options will only backup the builtin Mnesia database. "
"If you are using the ODBC module, you also need to backup your SQL database "
"separately."
msgstr ""
#: web/ejabberd_web_admin.erl:2041
#, fuzzy
msgid "Store binary backup:"
msgstr "Armazenar uma cópia de segurança no ficheiro"
#: web/ejabberd_web_admin.erl:2045 web/ejabberd_web_admin.erl:2052
#: web/ejabberd_web_admin.erl:2060 web/ejabberd_web_admin.erl:2067
#: web/ejabberd_web_admin.erl:2074 web/ejabberd_web_admin.erl:2081
#: web/ejabberd_web_admin.erl:2088 web/ejabberd_web_admin.erl:2096
#: web/ejabberd_web_admin.erl:2103 web/ejabberd_web_admin.erl:2110
msgid "OK"
msgstr "OK"
#: web/ejabberd_web_admin.erl:2048
#, fuzzy
msgid "Restore binary backup immediately:"
msgstr "Recuperar uma cópia de segurança a partir de ficheiro"
#: web/ejabberd_web_admin.erl:2056
msgid ""
"Restore binary backup after next ejabberd restart (requires less memory):"
msgstr ""
#: web/ejabberd_web_admin.erl:2063
msgid "Store plain text backup:"
msgstr ""
#: web/ejabberd_web_admin.erl:2070
#, fuzzy
msgid "Restore plain text backup immediately:"
msgstr "Recuperar uma cópia de segurança a partir de ficheiro"
#: web/ejabberd_web_admin.erl:2077
msgid "Import users data from a PIEFXIS file (XEP-0227):"
msgstr ""
#: web/ejabberd_web_admin.erl:2084
msgid "Export data of all users in the server to PIEFXIS files (XEP-0227):"
msgstr ""
#: web/ejabberd_web_admin.erl:2091
msgid "Export data of users in a host to PIEFXIS files (XEP-0227):"
msgstr ""
#: web/ejabberd_web_admin.erl:2099
#, fuzzy
msgid "Import user data from jabberd14 spool file:"
msgstr "Importar utilizadores a partir de ficheiros da spool do jabberd14"
#: web/ejabberd_web_admin.erl:2106
#, fuzzy
msgid "Import users data from jabberd14 spool directory:"
msgstr "Importar utilizadores a partir de ficheiros da spool do jabberd14"
#: web/ejabberd_web_admin.erl:2132
msgid "Listened Ports at "
msgstr "Portas em escuta em "
#: web/ejabberd_web_admin.erl:2157
#, fuzzy
msgid "Modules at "
msgstr "Parar módulos em "
#: web/ejabberd_web_admin.erl:2183
#, fuzzy
msgid "Statistics of ~p"
msgstr "Estatísticas"
#: web/ejabberd_web_admin.erl:2186
#, fuzzy
msgid "Uptime:"
msgstr "Tempo de funcionamento"
#: web/ejabberd_web_admin.erl:2189
#, fuzzy
msgid "CPU Time:"
msgstr "Tempo de processador consumido"
#: web/ejabberd_web_admin.erl:2195
#, fuzzy
msgid "Transactions Committed:"
msgstr "Transacções realizadas"
#: web/ejabberd_web_admin.erl:2198
#, fuzzy
msgid "Transactions Aborted:"
msgstr "Transacções abortadas"
#: web/ejabberd_web_admin.erl:2201
#, fuzzy
msgid "Transactions Restarted:"
msgstr "Transacções reiniciadas"
#: web/ejabberd_web_admin.erl:2204
#, fuzzy
msgid "Transactions Logged:"
msgstr "Transacções armazenadas"
#: web/ejabberd_web_admin.erl:2246
#, fuzzy
msgid "Update "
msgstr "Actualizar"
#: web/ejabberd_web_admin.erl:2254
#, fuzzy
msgid "Update plan"
msgstr "Actualizar"
#: web/ejabberd_web_admin.erl:2255
#, fuzzy
msgid "Modified modules"
msgstr "Iniciar módulos"
#: web/ejabberd_web_admin.erl:2256
#, fuzzy
msgid "Update script"
msgstr "Actualizar"
#: web/ejabberd_web_admin.erl:2257
msgid "Low level update script"
msgstr ""
#: web/ejabberd_web_admin.erl:2258
msgid "Script check"
msgstr ""
#: web/ejabberd_web_admin.erl:2426
msgid "Port"
msgstr "Porta"
#: web/ejabberd_web_admin.erl:2427
msgid "IP"
msgstr ""
#: web/ejabberd_web_admin.erl:2428
#, fuzzy
msgid "Protocol"
msgstr "Porta"
#: web/ejabberd_web_admin.erl:2429 web/ejabberd_web_admin.erl:2556
msgid "Module"
msgstr "Módulo"
#: web/ejabberd_web_admin.erl:2430 web/ejabberd_web_admin.erl:2557
msgid "Options"
msgstr "Opções"
#: web/ejabberd_web_admin.erl:2450
msgid "Delete"
msgstr "Eliminar"
#: web/ejabberd_web_admin.erl:2579
#, fuzzy
msgid "Start"
msgstr "Reiniciar"
#: web/mod_register_web.erl:104
msgid "Your Jabber account was successfully created."
msgstr ""
#: web/mod_register_web.erl:107
msgid "There was an error creating the account: "
msgstr ""
#: web/mod_register_web.erl:115
msgid "Your Jabber account was successfully deleted."
msgstr ""
#: web/mod_register_web.erl:118
msgid "There was an error deleting the account: "
msgstr ""
#: web/mod_register_web.erl:128
msgid "The password of your Jabber account was successfully changed."
msgstr ""
#: web/mod_register_web.erl:131
msgid "There was an error changing the password: "
msgstr ""
#: web/mod_register_web.erl:163 web/mod_register_web.erl:172
#, fuzzy
msgid "Jabber Account Registration"
msgstr "Configuração das Listas de Controlo de Acesso do ejabberd"
#: web/mod_register_web.erl:174 web/mod_register_web.erl:192
#: web/mod_register_web.erl:201
msgid "Register a Jabber account"
msgstr ""
#: web/mod_register_web.erl:176 web/mod_register_web.erl:493
#: web/mod_register_web.erl:502
msgid "Unregister a Jabber account"
msgstr ""
#: web/mod_register_web.erl:203
msgid ""
"This page allows to create a Jabber account in this Jabber server. Your JID "
"(Jabber IDentifier) will be of the form: username@server. Please read "
"carefully the instructions to fill correctly the fields."
msgstr ""
#: web/mod_register_web.erl:212 web/mod_register_web.erl:386
#: web/mod_register_web.erl:509
#, fuzzy
msgid "Username:"
msgstr "Nome do utilizador de IRC"
#: web/mod_register_web.erl:217
msgid "This is case insensitive: macbeth is the same that MacBeth and Macbeth."
msgstr ""
#: web/mod_register_web.erl:218
msgid "Characters not allowed:"
msgstr ""
#: web/mod_register_web.erl:222 web/mod_register_web.erl:391
#: web/mod_register_web.erl:514
#, fuzzy
msgid "Server:"
msgstr "Nunca"
#: web/mod_register_web.erl:232
msgid ""
"Don't tell your password to anybody, not even the administrators of the "
"Jabber server."
msgstr ""
#: web/mod_register_web.erl:234
msgid "You can later change your password using a Jabber client."
msgstr ""
#: web/mod_register_web.erl:235
msgid ""
"Some Jabber clients can store your password in your computer. Use that "
"feature only if you trust your computer is safe."
msgstr ""
#: web/mod_register_web.erl:237
msgid ""
"Memorize your password, or write it in a paper placed in a safe place. In "
"Jabber there isn't an automated way to recover your password if you forget "
"it."
msgstr ""
#: web/mod_register_web.erl:242 web/mod_register_web.erl:406
msgid "Password Verification:"
msgstr ""
#: web/mod_register_web.erl:250
#, fuzzy
msgid "Register"
msgstr "Lista de contactos"
#: web/mod_register_web.erl:396
#, fuzzy
msgid "Old Password:"
msgstr "Palavra-chave:"
#: web/mod_register_web.erl:401
#, fuzzy
msgid "New Password:"
msgstr "Palavra-chave:"
#: web/mod_register_web.erl:504
msgid "This page allows to unregister a Jabber account in this Jabber server."
msgstr ""
#: web/mod_register_web.erl:524
msgid "Unregister"
msgstr ""
#~ msgid "Encodings"
#~ msgstr "Codificações"
#, fuzzy
#~ msgid "(Raw)"
#~ msgstr "(modo texto)"
#~ msgid "Specified nickname is already registered"
#~ msgstr "A alcunha especificada já está registada"
#~ msgid "Size"
#~ msgstr "Tamanho"
#~ msgid "Backup Management at "
#~ msgstr "Gestão da cópia de segurança em "
#~ msgid "Choose host name"
#~ msgstr "Introduza o nome do servidor"
#~ msgid "Choose users to remove"
#~ msgstr "Seleccione utilizadores a eliminar"
#~ msgid "DB"
#~ msgstr "BD"
#~ msgid "Dump a database in a text file"
#~ msgstr "Exportar uma Base de Dados para um ficheiro de texto"
#~ msgid "Host name"
#~ msgstr "Nome do servidor"
#~ msgid "Hostname Configuration"
#~ msgstr "Configuração do nome do servidor"
#~ msgid "Install a database fallback from a file"
#~ msgstr "Instalar uma recuperação de BD desde um ficheiro"
#~ msgid "It is not allowed to send normal messages to the conference"
#~ msgstr "Impedir o envio de mensagens normais para a sala"
#~ msgid "Listened Ports Management"
#~ msgstr "Gestão das portas em escuta"
#~ msgid "Make room moderated?"
#~ msgstr "Tornar a sala moderada?"
#~ msgid "Remove Users"
#~ msgstr "Eliminar utilizadores"
#~ msgid "Restore a database from a text file"
#~ msgstr "Restaurar uma Base de Dados a partir de ficheiro de texto"
#~ msgid "Results of search in "
#~ msgstr "Resultados da procura em "
#~ msgid "ejabberd (c) 2002-2005 Alexey Shchepin, 2005 Process One"
#~ msgstr "ejabberd (c) 2002-2005 Alexey Shchepin, 2005 Process One"
#~ msgid "ejabberd access rules configuration"
#~ msgstr "Configuração das Regras de Acesso do ejabberd"
#~ msgid "ejabberd users"
#~ msgstr "Utilizadores do ejabberd"
#~ msgid "~p statistics"
#~ msgstr "Estatísticas de ~p"
ejabberd-2.1.11/src/msgs/vi.msg 0000664 0000000 0000000 00000045301 12240230175 013107 0 ustar {"Access Configuration","Cấu Hình Truy Cập"}.
{"Access Control List Configuration","Cấu Hình Danh Sách Kiểm Soát Truy Cập"}.
{"Access control lists","Danh sách kiểm soát truy cập"}.
{"Access Control Lists","Danh Sách Kiểm Soát Truy Cập"}.
{"Access denied by service policy","Sự truy cập bị chặn theo chính sách phục vụ"}.
{"Access rules","Quy tắc Truy Cập"}.
{"Access Rules","Quy Tắc Truy Cập"}.
{"Action on user","Hành động đối với người sử dụng"}.
{"Add Jabber ID","Thêm Jabber ID"}.
{"Add New","Thêm Mới"}.
{"Add User","Thêm Người Sử Dụng"}.
{"Administration of ","Quản trị về "}.
{"Administration","Quản trị"}.
{"Administrator privileges required","Yêu cầu đặc quyền của nhà quản trị"}.
{"All activity","Tất cả hoạt động"}.
{"Allow this Jabber ID to subscribe to this pubsub node?","Cho phép Jabber ID đăng ký nút môđun xuất bản đăng ký này không?"}.
{"Allow users to query other users","Cho phép người sử dụng hỏi người sử dụng khác"}.
{"Allow users to send invites","Cho phép người sử dụng gửi lời mời"}.
{"Allow users to send private messages","Cho phép người sử dụng gửi thư riêng"}.
{"All Users","Tất Cả Người Sử Dụng"}.
{"Announcements","Thông báo"}.
{"anyone","bất kỳ ai"}.
{"April","Tháng Tư"}.
{"August","Tháng Tám"}.
{"Backup Management","Quản lý Sao Lưu Dự Phòng"}.
{"Backup of ","Sao lưu dự phòng về"}.
{"Backup","Sao lưu dự phòng"}.
{"Backup to File at ","Sao lưu dự phòng ra Tập Tin tại"}.
{"Bad format","Định dạng hỏng"}.
{"Birthday","Ngày sinh"}.
{"Change Password","Thay Đổi Mật Khẩu"}.
{"Change User Password","Thay Đổi Mật Khẩu Người Sử Dụng"}.
{"Chatroom configuration modified","Cấu hình phòng trò chuyện được chỉnh sửa"}.
{"Chatrooms","Phòng trò chuyện"}.
{"Choose a username and password to register with this server","Chọn một tên truy cập và mật khẩu để đăng ký với máy chủ này"}.
{"Choose modules to stop","Chọn môđun để dừng"}.
{"Choose storage type of tables","Chọn loại bảng lưu trữ"}.
{"Choose whether to approve this entity's subscription.","Chọn có nên chấp nhận sự đăng ký của đối tượng này không"}.
{"City","Thành phố"}.
{"Commands","Lệnh"}.
{"Conference room does not exist","Phòng họp không tồn tại"}.
{"Configuration","Cấu hình"}.
{"Connected Resources:","Tài Nguyên Được Kết Nối:"}.
{"Country","Quốc gia"}.
{"CPU Time:","Thời Gian CPU:"}.
{"Database","Cơ sở dữ liệu"}.
{"Database Tables at ","Bảng Cơ Sở Dữ Liệu tại"}.
{"Database Tables Configuration at ","Cấu Hình Bảng Cơ Sở Dữ Liệu tại"}.
{"December","Tháng Mười Hai"}.
{"Default users as participants","Người sử dụng mặc định là người tham dự"}.
{"Delete message of the day on all hosts","Xóa thư trong ngày trên tất cả các máy chủ"}.
{"Delete message of the day","Xóa thư trong ngày"}.
{"Delete Selected","Tùy chọn Xóa được Chọn"}.
{"Delete User","Xóa Người Sử Dụng"}.
{"Delete","Xóa"}.
{"Deliver event notifications","Đưa ra các thông báo sự kiện"}.
{"Deliver payloads with event notifications","Đưa ra thông tin dung lượng với các thông báo sự kiện"}.
{"Description:","Miêu tả:"}.
{"Disc only copy","Chỉ sao chép vào đĩa"}.
{"Displayed Groups:","Nhóm được hiển thị:"}.
{"Dump Backup to Text File at ","Kết Xuất Sao Lưu ra Tập Tin Văn Bản tại"}.
{"Dump to Text File","Kết xuất ra Tập Tin Văn Bản"}.
{"Edit Properties","Chỉnh Sửa Thuộc Tính"}.
{"ejabberd IRC module","Môdun ejabberd IRC Bản quyền"}.
{"ejabberd MUC module","Môdun ejabberd MUC Bản quyền"}.
{"ejabberd Publish-Subscribe module","Môdun ejabberd Xuất Bản-Đăng Ký Bản quyền"}.
{"ejabberd SOCKS5 Bytestreams module","Môdun SOCKS5 Bytestreams Bản quyền"}.
{"ejabberd vCard module","Môdun ejabberd vCard Bản quyền"}.
{"Email","Email"}.
{"Enable logging","Cho phép ghi nhật ký"}.
{"End User Session","Kết Thúc Phiên Giao Dịch Người Sử Dụng"}.
{"Enter list of {Module, [Options]}","Nhập danh sách {Môđun, [Các Tùy Chọn]}"}.
{"Enter nickname you want to register","Nhập bí danh bạn muốn đăng ký"}.
{"Enter path to backup file","Nhập đường dẫn đến tập tin sao lưu dự phòng"}.
{"Enter path to jabberd14 spool dir","Nhập đường dẫn đến thư mục spool jabberd14"}.
{"Enter path to jabberd14 spool file","Nhập đường dẫn đến tập tin spool jabberd14"}.
{"Enter path to text file","Nhập đường dẫn đến tập tin văn bản"}.
{"Erlang Jabber Server","Erlang Jabber Server Bản quyền"}.
{"Family Name","Họ"}.
{"February","Tháng Hai"}.
{"Fill in fields to search for any matching Jabber User","Điền vào các ô để tìm kiếm bất kỳ các thông tin nào khớp với Người sử dụng Jabber"}.
{"Fill in the form to search for any matching Jabber User (Add * to the end of field to match substring)","Điền vào mẫu này để tìm kiếm bất kỳ thông tin nào khớp với Người sử dụng Jabber (Thêm dấu * vào cuối ô để thông tin khớp với chuỗi bên trong)"}.
{"Friday","Thứ Sáu"}.
{"From ~s","Nhận từ ~s"}.
{"From","Từ"}.
{"Full Name","Tên Đầy Đủ"}.
{"Get Number of Online Users","Nhận Số Người Sử Dụng Trực Tuyến"}.
{"Get Number of Registered Users","Nhận Số Người Sử Dụng Đã Đăng Ký"}.
{"Get User Last Login Time","Nhận Thời Gian Đăng Nhập Cuối Cùng Của Người Sử Dụng"}.
{"Get User Password","Nhận Mật Khẩu Người Sử Dụng"}.
{"Get User Statistics","Nhận Thông Tin Thống Kê Người Sử Dụng"}.
{"Group ","Nhóm "}.
{"Groups","Nhóm"}.
{"has been banned","đã bị cấm"}.
{"has been kicked","đã bị đẩy ra khỏi"}.
{" has set the subject to: "," đã đặt chủ đề thành: "}.
{"Host","Máy chủ"}.
{"Import Directory","Nhập Thư Mục"}.
{"Import File","Nhập Tập Tin"}.
{"Import User from File at ","Nhập Người Sử Dụng từ Tập Tin tại"}.
{"Import Users from Dir at ","Nhập Người Sử Dụng từ Thư Mục tại"}.
{"Import Users From jabberd14 Spool Files","Nhập Người Sử Dụng Từ Các Tập Tin Spool jabberd14"}.
{"Improper message type","Loại thư không phù hợp"}.
{"Incorrect password","Mật khẩu sai"}.
{"Invalid affiliation: ~s","Tư cách không hợp lệ: ~s"}.
{"Invalid role: ~s","Vai trò không hợp lệ: ~s"}.
{"IP addresses","Địa chỉ IP"}.
{"IRC Transport","Truyền tải IRC"}.
{"IRC Username","Tên truy cập IRC"}.
{"is now known as","bây giờ được biết như"}.
{"It is not allowed to send private messages of type \"groupchat\"","Không được phép gửi những thư riêng loại \"groupchat\""}.
{"It is not allowed to send private messages to the conference","Không được phép gửi những thư riêng đến phòng họp"}.
{"Jabber ID","Jabber ID"}.
{"Jabber ID ~s is invalid","Jabber ID ~s không hợp lệ"}.
{"January","Tháng Một"}.
{"joins the room","tham gia phòng này"}.
{"July","Tháng Bảy"}.
{"June","Tháng Sáu"}.
{"Last Activity","Hoạt Động Cuối Cùng"}.
{"Last login","Đăng nhập lần cuối"}.
{"Last month","Tháng trước"}.
{"Last year","Năm trước"}.
{"leaves the room","rời khỏi phòng này"}.
{"Listened Ports at ","Cổng Liên Lạc tại"}.
{"Listened Ports","Cổng Kết Nối"}.
{"List of modules to start","Danh sách các môđun khởi động"}.
{"Low level update script","Lệnh cập nhật mức độ thấp"}.
{"Make participants list public","Tạo danh sách người tham dự công khai"}.
{"Make room members-only","Tạo phòng chỉ cho phép tư cách thành viên tham gia"}.
{"Make room password protected","Tạo phòng được bảo vệ bằng mật khẩu"}.
{"Make room persistent","Tạo phòng bền vững"}.
{"Make room public searchable","Tạo phòng có thể tìm kiếm công khai"}.
{"March","Tháng Ba"}.
{"Maximum Number of Occupants","Số Lượng Người Tham Dự Tối Đa"}.
{"Max # of items to persist","Số mục tối đa để lưu trữ"}.
{"Max payload size in bytes","Kích thước dung lượng byte tối đa"}.
{"May","Tháng Năm"}.
{"Members:","Thành viên:"}.
{"Memory","Bộ Nhớ"}.
{"Message body","Thân thư"}.
{"Middle Name","Họ Đệm"}.
{"Moderator privileges required","Yêu cầu đặc quyền của nhà điều phối"}.
{"moderators only","nhà điều phối duy nhất"}.
{"Module","Môđun"}.
{"Modules at ","Môđun tại "}.
{"Modules","Môđun"}.
{"Monday","Thứ Hai"}.
{"Name:","Tên:"}.
{"Name","Tên"}.
{"Never","Không bao giờ"}.
{"Nickname","Bí danh"}.
{"Nickname Registration at ","Đăng Ký Bí Danh tại"}.
{"Nickname ~s does not exist in the room","Bí danh ~s không tồn tại trong phòng này"}.
{"No body provided for announce message","Không có nội dung trong thư thông báo"}.
{"No Data","Không Dữ Liệu"}.
{"Node ID","ID Nút"}.
{"Node not found","Nút không tìm thấy"}.
{"Node ","Nút "}.
{"Nodes","Nút"}.
{"No limit","Không giới hạn"}.
{"None","Không có"}.
{"No resource provided","Không có nguồn lực cung cấp"}.
{"Notify subscribers when items are removed from the node","Thông báo cho người đăng ký khi nào các mục chọn bị gỡ bỏ khỏi nút"}.
{"Notify subscribers when the node configuration changes","Thông báo cho người đăng ký khi nào cấu hình nút thay đổi"}.
{"Notify subscribers when the node is deleted","Thông báo cho người đăng ký khi nào nút bị xóa bỏ"}.
{"November","Tháng Mười Một"}.
{"Number of occupants","Số người tham dự"}.
{"Number of online users","Số người sử dụng trực tuyến"}.
{"Number of registered users","Số người sử dụng đã đăng ký"}.
{"October","Tháng Mười"}.
{"Offline Messages:","Thư Ngoại Tuyến:"}.
{"Offline Messages","Thư Ngoại Tuyến"}.
{"OK","OK"}.
{"Online","Trực tuyến"}.
{"Online Users:","Người Sử Dụng Trực Tuyến:"}.
{"Online Users","Người Sử Dụng Trực Tuyến"}.
{"Only deliver notifications to available users","Chỉ gửi thông báo đến những người sử dụng hiện có"}.
{"Only occupants are allowed to send messages to the conference","Chỉ có những đối tượng tham gia mới được phép gửi thư đến phòng họp"}.
{"Only occupants are allowed to send queries to the conference","Chỉ có những đối tượng tham gia mới được phép gửi yêu cầu đến phòng họp"}.
{"Only service administrators are allowed to send service messages","Chỉ có người quản trị dịch vụ mới được phép gửi những thư dịch vụ"}.
{"Options","Tùy chọn"}.
{"Organization Name","Tên Tổ Chức"}.
{"Organization Unit","Bộ Phận"}.
{"Outgoing s2s Connections:","Kết Nối Bên Ngoài s2s:"}.
{"Outgoing s2s Connections","Kết Nối Bên Ngoài s2s"}.
{"Outgoing s2s Servers:","Máy chủ Bên Ngoài s2s:"}.
{"Owner privileges required","Yêu cầu đặc quyền của người sở hữu"}.
{"Packet","Gói thông tin"}.
{"Password:","Mật Khẩu:"}.
{"Password","Mật Khẩu"}.
{"Password Verification","Kiểm Tra Mật Khẩu"}.
{"Path to Dir","Đường Dẫn đến Thư Mục"}.
{"Path to File","Đường dẫn đến Tập Tin"}.
{"Pending","Chờ"}.
{"Period: ","Giai đoạn: "}.
{"Persist items to storage","Những mục cần để lưu trữ"}.
{"Ping","Ping"}.
{"Pong","Pong"}.
{"Port","Cổng"}.
{"Present real Jabber IDs to","Jabber ID thực tế hiện hành đến"}.
{"private, ","riêng,"}.
{"Publish-Subscribe","Xuất Bản-Đăng Ký"}.
{"PubSub subscriber request","Yêu cầu người đăng ký môđun Xuất Bản Đăng Ký"}.
{"Queries to the conference members are not allowed in this room","Không được phép gửi các yêu cầu gửi đến các thành viên trong phòng họp này"}.
{"RAM and disc copy","Sao chép vào RAM và đĩa"}.
{"RAM copy","Sao chép vào RAM"}.
{"Raw","Thô"}.
{"Really delete message of the day?","Có thực sự xóa thư trong ngày này không?"}.
{"Recipient is not in the conference room","Người nhận không có trong phòng họp"}.
{"Registered Users:","Người Sử Dụng Đã Đăng Ký:"}.
{"Registered Users","Người Sử Dụng Đã Đăng Ký"}.
{"Registration in mod_irc for ","Đăng ký trong mod_irc cho "}.
{"Remote copy","Sao chép từ xa"}.
{"Remove","Gỡ bỏ"}.
{"Remove User","Gỡ Bỏ Người Sử Dụng"}.
{"Replaced by new connection","Được thay thế bởi kết nối mới"}.
{"Resources","Nguồn tài nguyên"}.
{"Restart","Khởi động lại"}.
{"Restart Service","Khởi Động Lại Dịch Vụ"}.
{"Restore Backup from File at ","Phục hồi Sao Lưu từ Tập Tin tại "}.
{"Restore binary backup after next ejabberd restart (requires less memory):","Khôi phục bản sao lưu dự phòng dạng nhị phân sau lần khởi động ejabberd kế tiếp (yêu cầu ít bộ nhớ hơn):"}.
{"Restore binary backup immediately:","Khôi phục bản sao lưu dự phòng dạng nhị phận ngay lập tức:"}.
{"Restore","Khôi phục"}.
{"Restore plain text backup immediately:","Khôi phục bản sao lưu dự phòng thuần văn bản ngay lập tức:"}.
{"Room Configuration","Cấu Hình Phòng"}.
{"Room creation is denied by service policy","Việc tạo phòng bị ngăn lại theo chính sách dịch vụ"}.
{"Room title","Tên phòng"}.
{"Roster","Bảng phân công"}.
{"Roster of ","Bảng phân công của "}.
{"Roster size","Kích thước bảng phân công"}.
{"RPC Call Error","Lỗi Gọi RPC"}.
{"Running Nodes","Nút Hoạt Động"}.
{"~s access rule configuration","~s cấu hình quy tắc truy cập"}.
{"Saturday","Thứ Bảy"}.
{"Script check","Lệnh kiểm tra"}.
{"Search Results for ","Kết Quả Tìm Kiếm cho "}.
{"Search users in ","Tìm kiếm người sử dụng trong"}.
{"Send announcement to all online users","Gửi thông báo đến tất cả người sử dụng trực tuyến"}.
{"Send announcement to all online users on all hosts","Gửi thông báo đến tất cả người sử dụng trực tuyến trên tất cả các máy chủ"}.
{"Send announcement to all users","Gửi thông báo đến tất cả người sử dụng"}.
{"Send announcement to all users on all hosts","Gửi thông báo đến tất cả người sử dụng trên tất cả các máy chủ"}.
{"September","Tháng Chín"}.
{"Set message of the day and send to online users","Tạo lập thư trong ngày và gửi đến những người sử dụng trực tuyến"}.
{"Set message of the day on all hosts and send to online users","Tạo lập thư trong ngày trên tất cả các máy chủ và gửi đến những người sử dụng trực tuyến"}.
{"Shared Roster Groups","Nhóm Phân Công Chia Sẻ"}.
{"Show Integral Table","Hiển Thị Bảng Đầy Đủ"}.
{"Show Ordinary Table","Hiển Thị Bảng Thường"}.
{"Shut Down Service","Tắt Dịch Vụ"}.
{"~s invites you to the room ~s","~s mời bạn vào phòng ~s"}.
{"Specify the access model","Xác định mô hình truy cập"}.
{"Specify the publisher model","Xác định mô hình nhà xuất bản"}.
{"~s's Offline Messages Queue","~s's Danh Sách Chờ Thư Ngoại Tuyến"}.
{"Start","Khởi động"}.
{"Start Modules at ","Môđun Khởi Động tại "}.
{"Start Modules","Môđun Khởi Động"}.
{"Statistics of ~p","Thống kê về ~p"}.
{"Statistics","Số liệu thống kê"}.
{"Stop","Dừng"}.
{"Stop Modules at ","Môđun Dừng tại"}.
{"Stop Modules","Môđun Dừng"}.
{"Stopped Nodes","Nút Dừng"}.
{"Storage Type","Loại Lưu Trữ"}.
{"Store binary backup:","Lưu dữ liệu sao lưu dạng nhị phân:"}.
{"Store plain text backup:","Khôi phục bản sao lưu dự phòng thuần văn bản"}.
{"Subject","Tiêu đề"}.
{"Submit","Gửi"}.
{"Submitted","Đã gửi"}.
{"Subscriber Address","Địa Chỉ Người Đăng Ký"}.
{"Subscription","Đăng ký"}.
{"Sunday","Chủ Nhật"}.
{"the password is","mật khẩu là"}.
{"This room is not anonymous","Phòng này không nặc danh"}.
{"Thursday","Thứ Năm"}.
{"Time delay","Thời gian trì hoãn"}.
{"Time","Thời Gian"}.
{"To","Đến"}.
{"To ~s","Gửi đến ~s"}.
{"Traffic rate limit is exceeded","Quá giới hạn tỷ lệ lưu lượng truyền tải"}.
{"Transactions Aborted:","Giao Dịch Hủy Bỏ:"}.
{"Transactions Committed:","Giao Dịch Được Cam Kết:"}.
{"Transactions Logged:","Giao Dịch Được Ghi Nhận:"}.
{"Transactions Restarted:","Giao Dịch Khởi Động Lại:"}.
{"Tuesday","Thứ Ba"}.
{"Update ","Cập Nhật "}.
{"Update","Cập Nhật"}.
{"Update message of the day (don't send)","Cập nhật thư trong ngày (không gửi)"}.
{"Update message of the day on all hosts (don't send)","Cập nhật thư trong ngày trên tất cả các máy chủ (không gửi)"}.
{"Update plan","Kế hoạch cập nhật"}.
{"Update script","Cập nhận lệnh"}.
{"Uptime:","Thời gian tải lên:"}.
{"Use of STARTTLS required","Yêu cầu sử dụng STARTTLS"}.
{"User Management","Quản Lý Người Sử Dụng"}.
{"User ","Người sử dụng "}.
{"User","Người sử dụng"}.
{"Users Last Activity","Hoạt Động Cuối Cùng Của Người Sử Dụng"}.
{"Users","Người sử dụng"}.
{"Validate","Xác nhận hợp lệ"}.
{"vCard User Search","Tìm Kiếm Người Sử Dụng vCard"}.
{"Virtual Hosts","Máy Chủ Ảo"}.
{"Visitors are not allowed to send messages to all occupants","Người ghé thăm không được phép gửi thư đến tất cả các người tham dự"}.
{"Wednesday","Thứ Tư"}.
{"When to send the last published item","Khi cần gửi mục được xuất bản cuối cùng"}.
{"Whether to allow subscriptions","Xác định nên cho phép đăng ký không"}.
{"You have been banned from this room","Bạn bị cấm tham gia phòng này"}.
{"You must fill in field \"Nickname\" in the form","Bạn phải điền thông tin vào ô \"Nickname\" trong biểu mẫu này"}.
{"You need an x:data capable client to configure mod_irc settings","Bạn cần có một trình ứng dụng khách hỗ trợ định dạng dữ liệu x: để xác định các thiết lập mod_irc"}.
{"You need an x:data capable client to configure room","Bạn cần có một trình ứng dụng khách hỗ trợ định dạng dữ liệu x: để xác định cấu hình phòng họp"}.
{"You need an x:data capable client to search","Bạn cần có một trình ứng dụng khách hỗ trợ định dạng dữ liệu x: để tìm kiếm"}.
{"Your contact offline message queue is full. The message has been discarded.","Danh sách chờ thư liên lạc ngoại tuyến của bạn đã đầy. Thư này đã bị loại bỏ."}.
ejabberd-2.1.11/src/msgs/sv.msg 0000664 0000000 0000000 00000051063 12240230175 013123 0 ustar {"Access Configuration","Åtkomstkonfiguration"}.
{"Access Control List Configuration","Konfiguera ACL"}.
{"Access control lists","ACL"}.
{"Access Control Lists","ACL"}.
{"Access denied by service policy","Åtkomst nekad enligt lokal policy"}.
{"Access rules","Åtkomstregler"}.
{"Access Rules","Åtkomstregler"}.
{"Action on user","Handling mot användare"}.
{"Add Jabber ID","Lägg till Jabber ID"}.
{"Add New","Lägg till ny"}.
{"Add User","Lägg till användare"}.
{"Administration","Administration"}.
{"Administration of ","Administration av "}.
{"Administrator privileges required","Administrationsprivilegier krävs"}.
{"A friendly name for the node","Ett vänligt namn for noden"}.
{"All activity","All aktivitet"}.
{"Allow this Jabber ID to subscribe to this pubsub node?","Tillåt denna Jabber ID att prenumerera på denna pubsub node"}.
{"Allow users to change the subject","Tillåt användare att byta ämne"}.
{"Allow users to query other users","Tillåt användare att söka efter andra användare"}.
{"Allow users to send invites","Tillåt användare att skicka inbjudningar"}.
{"Allow users to send private messages","Tillåt användare att skicka privata meddelanden"}.
{"Allow visitors to change nickname","Tillåt gäster att kunna ändra smeknamn"}.
{"Allow visitors to send status text in presence updates","Tillåt gäster att skicka statustext som uppdatering"}.
{"All Users","Alla användare"}.
{"Announcements","Meddelanden"}.
{"anyone","Vemsomhelst"}.
{"April","April"}.
{"August","Augusti"}.
{"Backup Management","Hantera säkerhetskopior"}.
{"Backup of ","Backup av"}.
{"Backup","Säkerhetskopiera"}.
{"Backup to File at ","Säkerhetskopiera till fil på "}.
{"Bad format","Dåligt format"}.
{"Birthday","Födelsedag"}.
{"Change Password","Ändra lösenord"}.
{"Change User Password","Andra användarlösenord"}.
{"Chatroom configuration modified","Chattrum konfiguration modifierad"}.
{"Chatrooms","Chattrum"}.
{"Choose a username and password to register with this server","Välj ett användarnamn och lösenord för att registrera mot denna server"}.
{"Choose modules to stop","Välj vilka moduler som skall stoppas"}.
{"Choose storage type of tables","Välj lagringstyp för tabeller"}.
{"Choose whether to approve this entity's subscription.","Välj om du vill godkänna hela denna prenumertion."}.
{"City","Stad"}.
{"Commands","Kommandon"}.
{"Conference room does not exist","Rummet finns inte"}.
{"Configuration","Konfiguration"}.
{"Configuration of room ~s","Konfiguration för ~s"}.
{"Connected Resources:","Anslutna resurser:"}.
{"Connections parameters","Uppkopplingsparametrar"}.
{"Country","Land"}.
{"CPU Time:","CPU tid"}.
{"Database","Databas"}.
{"Database Tables at ","Databas tabell pa"}.
{"Database Tables Configuration at ","Databastabellers konfiguration"}.
{"December","December"}.
{"Default users as participants","Gör om användare till deltagare"}.
{"Delete message of the day on all hosts","Ta bort dagens meddelande på alla värdar"}.
{"Delete message of the day","Ta bort dagens meddelande"}.
{"Delete Selected","Tabort valda"}.
{"Delete","Ta bort"}.
{"Delete User","Ta bort användare"}.
{"Deliver event notifications","Skicka eventnotifikation"}.
{"Deliver payloads with event notifications","Skicka innehåll tillsammans med notifikationer"}.
{"Description:","Beskrivning:"}.
{"Disc only copy","Endast diskkopia"}.
{"Displayed Groups:","Visade grupper:"}.
{"Dump Backup to Text File at ","Dumpa säkerhetskopia till textfil på "}.
{"Dump to Text File","Dumpa till textfil"}.
{"Edit Properties","Redigera egenskaper"}.
{"ejabberd IRC module","ejabberd IRC-modul"}.
{"ejabberd MUC module","ejabberd MUC modul"}.
{"ejabberd Publish-Subscribe module","ejabberd publikprenumerations modul"}.
{"ejabberd SOCKS5 Bytestreams module","ejabberd SOCKS5 Bytestrem modul"}.
{"ejabberd vCard module","ejabberd vCard-modul"}.
{"ejabberd Web Admin","ejabberd Web Admin"}.
{"Elements","Elements"}.
{"Email","Email"}.
{"Enable logging","Möjliggör login"}.
{"Encoding for server ~b","Encoding för server ~b"}.
{"End User Session","Avsluta användarsession"}.
{"Enter list of {Module, [Options]}","Skriv in en lista av {Module, [Options]}"}.
{"Enter nickname you want to register","Skriv in smeknamnet du vill registrera"}.
{"Enter path to backup file","Skriv in sökväg till fil för säkerhetskopia"}.
{"Enter path to jabberd14 spool dir","Skriv in sökväg till spoolkatalog från jabberd14"}.
{"Enter path to jabberd14 spool file","Skriv in sökväg till spoolfil från jabberd14"}.
{"Enter path to text file","Skriv in sökväg till textfil"}.
{"Enter the text you see","Skriv in sökväg till textfil"}.
{"Enter username, encodings, ports and passwords you wish to use for connecting to IRC servers","Skriv in användarnamn och textkodning du vill använda för att ansluta till IRC-servrar"}.
{"Erlang Jabber Server","Erlang Jabber Server"}.
{"Error","Fel"}.
{"Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef.net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}].","Exempel: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef.net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."}.
{"Export data of all users in the server to PIEFXIS files (XEP-0227):","Exportera data av alla användare i servern till en PIEFXIS fil (XEP-0227):"}.
{"Export data of users in a host to PIEFXIS files (XEP-0227):","Exportera data av användare i en host till PIEFXIS fil (XEP-0227):"}.
{"Family Name","Efternamn"}.
{"February","Februari"}.
{"Fill in fields to search for any matching Jabber User","Fyll i fält för att söka efter jabberanvändare"}.
{"Fill in the form to search for any matching Jabber User (Add * to the end of field to match substring)","Fyll i formuläret för att söka efter en användare (lägg till * på slutet av fältet för att hitta alla som börjar så)"}.
{"Friday","Fredag"}.
{"From","Från"}.
{"From ~s","Från ~s"}.
{"Full Name","Fullständigt namn"}.
{"Get Number of Online Users","Hämta antal inloggade användare"}.
{"Get Number of Registered Users","Hämta antal registrerade användare"}.
{"Get User Last Login Time","Hämta användarens senast inloggade tid"}.
{"Get User Password","Hämta användarlösenord"}.
{"Get User Statistics","Hämta användarstatistik"}.
{"Group ","Grupp "}.
{"Groups","Grupper"}.
{"has been banned","har blivit bannad"}.
{"has been kicked because of an affiliation change","har blivit kickad p.g.a en ändring av tillhörighet"}.
{"has been kicked because of a system shutdown","har blivit kickad p.g.a en systemnerstängning"}.
{"has been kicked because the room has been changed to members-only","har blivit kickad p.g.a att rummet har ändrats till endast användare"}.
{"has been kicked","har blivit kickad"}.
{" has set the subject to: "," har satt ämnet till: "}.
{"Host","Server"}.
{"If you want to specify different ports, passwords, encodings for IRC servers, fill this list with values in format '{\"irc server\", \"encoding\", port, \"password\"}'. By default this service use \"~s\" encoding, port ~p, empty password.","Om du vill specifiera textkodning för IRC-servrar, fyll i listan med värden i formatet '{\"irc server\", \"encoding\", port, \"password\"}'. Som standard används \"~s\", port ~p, no password."}.
{"Import Directory","Importera katalog"}.
{"Import File","Importera fil"}.
{"Import user data from jabberd14 spool file:","Importera användare från jabberd14 Spool filer"}.
{"Import User from File at ","Importera användare från fil på "}.
{"Import users data from a PIEFXIS file (XEP-0227):","Importera användardata från en PIEFXIS fil (XEP-0227):"}.
{"Import users data from jabberd14 spool directory:","Importera användare från jabberd14 Spool directory:"}.
{"Import Users from Dir at ","Importera användare från katalog på "}.
{"Import Users From jabberd14 Spool Files","Importera användare från jabberd14 Spool filer"}.
{"Improper message type","Felaktig medelandetyp"}.
{"Incorrect password","Fel lösenord"}.
{"Invalid affiliation: ~s","Ogiltlig rang: ~s"}.
{"Invalid role: ~s","Ogiltlig roll: ~s"}.
{"IP addresses","IP adresser"}.
{"IP","IP"}.
{"IRC channel (don't put the first #)","IRC kanal (skriv inte första #)"}.
{"IRC server","IRC-användarnamn"}.
{"IRC settings","IRC Inställningar"}.
{"IRC Transport","IRC transport"}.
{"IRC username","IRC-användarnamn"}.
{"IRC Username","IRC-användarnamn"}.
{"is now known as","är känd som"}.
{"It is not allowed to send private messages","Det ar inte tillåtet att skicka privata meddelanden"}.
{"It is not allowed to send private messages of type \"groupchat\"","Det är inte tillåtet att skicka privata medelanden med typen \"groupchat\""}.
{"It is not allowed to send private messages to the conference","Det är inte tillåtet att skicka privata medelanden till den här konferensen"}.
{"Jabber ID","Jabber ID"}.
{"Jabber ID ~s is invalid","Otillåtet Jabber ID ~s"}.
{"January","Januari"}.
{"Join IRC channel","Lägg till IRC kanal"}.
{"joins the room","joinar rummet"}.
{"Join the IRC channel here.","Lägg till IRC kanal här."}.
{"Join the IRC channel in this Jabber ID: ~s","Lägg till IRC kanal till detta Jabber ID: ~s"}.
{"July","Juli"}.
{"June","Juni"}.
{"Last Activity","Senast aktivitet"}.
{"Last login","Senaste login"}.
{"Last month","Senaste månaden"}.
{"Last year","Senaste året"}.
{"leaves the room","lämnar rummet"}.
{"Listened Ports at ","Lyssnande portar på "}.
{"Listened Ports","Lyssnarport"}.
{"List of modules to start","Lista av moduler som skall startas"}.
{"Low level update script","Uppdaterade laglevel skript"}.
{"Make participants list public","Gör deltagarlistan publik"}.
{"Make room members-only","Gör om rummet till endast medlemmar"}.
{"Make room moderated","Gör rummet modererat"}.
{"Make room password protected","Gör losenorden i rummet publika"}.
{"Make room persistent","Gör rummet permanent"}.
{"Make room public searchable","Gör rummet publikt sökbart"}.
{"March","Mars"}.
{"Maximum Number of Occupants","Maximalt antal av användare"}.
{"Max # of items to persist","Högsta antal dataposter som sparas"}.
{"Max payload size in bytes","Högsta innehållsstorlek i bytes"}.
{"May","Maj"}.
{"Membership is required to enter this room","Du måste vara medlem för att komma in i det här rummet"}.
{"Members:","Medlemmar:"}.
{"Memory","Minne"}.
{"Message body","Meddelande kropp"}.
{"Middle Name","Mellannamn"}.
{"Moderator privileges required","Moderatorprivilegier krävs"}.
{"moderators only","endast moderatorer"}.
{"Modified modules","Uppdaterade moduler"}.
{"Module","Modul"}.
{"Modules at ","Moduler på"}.
{"Modules","Moduler"}.
{"Monday","Måndag"}.
{"Name:","Namn:"}.
{"Name","Namn"}.
{"Never","Aldrig"}.
{"Nickname Registration at ","Registrera smeknamn på "}.
{"Nickname ~s does not exist in the room","Smeknamnet ~s existerar inte i det här rummet"}.
{"Nickname","Smeknamn"}.
{"No body provided for announce message","Ingen kropp behövs för dessa meddelanden"}.
{"No Data","Ingen data"}.
{"Node ID","Node ID"}.
{"Node ","Nod "}.
{"Node not found","Noden finns inte"}.
{"Nodes","Noder"}.
{"No limit","Ingen gräns"}.
{"None","Inga"}.
{"No resource provided","Ingen resurs angiven"}.
{"Not Found","Noden finns inte"}.
{"Notify subscribers when items are removed from the node","Meddela prenumeranter när dataposter tas bort från noden"}.
{"Notify subscribers when the node configuration changes","Meddela prenumeranter när nodens konfiguration ändras"}.
{"Notify subscribers when the node is deleted","Meddela prenumeranter när noden tas bort"}.
{"November","November"}.
{"Number of occupants","Antal besökare"}.
{"Number of online users","Antal inloggade användare"}.
{"Number of registered users","Antal registrerade användare"}.
{"October","Oktober"}.
{"Offline Messages:","Offline meddelanden:"}.
{"Offline Messages","Offline meddelanden"}.
{"OK","OK"}.
{"Online","Ansluten"}.
{"Online Users","Anslutna användare"}.
{"Online Users:","Inloggade användare"}.
{"Only deliver notifications to available users","Skicka notifikationer bara till uppkopplade användare"}.
{"Only moderators and participants are allowed to change the subject in this room","Endast moderatorer och deltagare har tillåtelse att ändra ämnet i det här rummet"}.
{"Only occupants are allowed to send messages to the conference","Utomstående får inte skicka medelanden till den här konferensen"}.
{"Only occupants are allowed to send queries to the conference","Utomstående får inte skicka iq-queries till den här konferensen"}.
{"Only service administrators are allowed to send service messages","Endast administratörer får skicka tjänstmeddelanden"}.
{"Options","Parametrar"}.
{"Organization Name","Organisationsnamn"}.
{"Organization Unit","Organisationsenhet"}.
{"Outgoing s2s Connections","Utgaende s2s anslutning"}.
{"Outgoing s2s Connections:","Utgående s2s anslutning"}.
{"Outgoing s2s Servers:","Utgående s2s server"}.
{"Owner privileges required","Ägarprivilegier krävs"}.
{"Packet","Paket"}.
{"Password ~b","Lösenord ~b"}.
{"Password:","Lösenord:"}.
{"Password","Lösenord"}.
{"Password Verification","Lösenordsverifikation"}.
{"Path to Dir","Sökväg till katalog"}.
{"Path to File","Sökväg till fil"}.
{"Pending","Ännu inte godkända"}.
{"Period: ","Period: "}.
{"Persist items to storage","Spara dataposter permanent"}.
{"Ping","Ping"}.
{"Please note that these options will only backup the builtin Mnesia database. If you are using the ODBC module, you also need to backup your SQL database separately.","Kom ihåg att dessa inställningar endast tar backup pa builtin Mnesias databas. Om du använder ODBC modul så måste du ta backup på SQLs databas enskilt"}.
{"Pong","Pong"}.
{"Port ~b","Port ~b"}.
{"Port","Port"}.
{"Present real Jabber IDs to","Nuvarande äkta Jabber IDs till"}.
{"private, ","privat, "}.
{"Protocol","Protocol"}.
{"Publish-Subscribe","Publikprenumeration"}.
{"PubSub subscriber request","Pubsub prenumerationsforfrågan"}.
{"Queries to the conference members are not allowed in this room","Det är förbjudet att skicka iq-queries till konferensdeltagare"}.
{"RAM and disc copy","RAM- och diskkopia"}.
{"RAM copy","RAM-kopia"}.
{"Raw","Ra"}.
{"Really delete message of the day?","Verkligen ta bort dagens meddelanden?"}.
{"Recipient is not in the conference room","Mottagaren finns inte i rummet"}.
{"Registered Users:","Registrerade användare"}.
{"Registered Users","Registrerade användare"}.
{"Registration in mod_irc for ","mod_irc-registrering för "}.
{"Remote copy","Sparas inte lokalt"}.
{"Remove","Ta bort"}.
{"Remove User","Ta bort användare"}.
{"Replaced by new connection","Ersatt av ny anslutning"}.
{"Resources","Resurser"}.
{"Restart","Omstart"}.
{"Restart Service","Starta om servicen"}.
{"Restore","Återställ"}.
{"Restore Backup from File at ","Återställ säkerhetskopia från fil på "}.
{"Restore binary backup after next ejabberd restart (requires less memory):","återställ den binära backupen efter nästa ejabberd omstart"}.
{"Restore binary backup immediately:","återställ den binära backupen omedelbart"}.
{"Restore plain text backup immediately:","återställ textbackup omedelbart"}.
{"Room Configuration","Rumkonfiguration"}.
{"Room creation is denied by service policy","Skapandet av rum är förbjudet enligt lokal policy"}.
{"Room Occupants","Antal besökare"}.
{"Room title","Rumstitel"}.
{"Roster groups allowed to subscribe","Rostergrupper tillåts att prenumerera"}.
{"Roster","Kontaktlista"}.
{"Roster of ","Kontaktlista för "}.
{"Roster size","Roster storlek"}.
{"RPC Call Error","RPC Uppringningserror"}.
{"Running Nodes","Körande noder"}.
{"~s access rule configuration","Åtkomstregelkonfiguration för ~s"}.
{"Saturday","Lördag"}.
{"Script check","Skript kollat"}.
{"Search Results for ","Sökresultat för"}.
{"Search users in ","Sök efter användare på "}.
{"Send announcement to all online users on all hosts","Sänd meddelanden till alla inloggade användare på alla värdar"}.
{"Send announcement to all online users","Sänd meddelanden till alla inloggade användare"}.
{"Send announcement to all users on all hosts","Sänd meddelanden till alla användare på alla värdar"}.
{"Send announcement to all users","Sänd meddelanden till alla användare"}.
{"September","September"}.
{"Server ~b","Server ~b"}.
{"Set message of the day and send to online users","Sätt dagens status meddelande och skicka till alla användare"}.
{"Set message of the day on all hosts and send to online users","Sätt dagens status meddelande pa alla värdar och skicka till alla användare"}.
{"Shared Roster Groups","Delade Rostergrupper"}.
{"Show Integral Table","Visa kumulativ tabell"}.
{"Show Ordinary Table","Visa normal tabell"}.
{"Shut Down Service","Stäng ner servicen"}.
{"~s invites you to the room ~s","~s bjöd in dig till rummet ~s"}.
{"Specify the access model","Specificera accessmodellen"}.
{"Specify the publisher model","Ange publiceringsmodell"}.
{"~s's Offline Messages Queue","~s's offline meddelandekö"}.
{"Start Modules at ","Starta moduler på "}.
{"Start Modules","Starta moduler"}.
{"Start","Starta"}.
{"Statistics of ~p","Statistik på ~p"}.
{"Statistics","Statistik"}.
{"Stop Modules at ","Stoppa moduler på "}.
{"Stop Modules","Stanna moduler"}.
{"Stopped Nodes","Stannade noder"}.
{"Stop","Stoppa"}.
{"Storage Type","Lagringstyp"}.
{"Store binary backup:","Lagra den binära backupen"}.
{"Store plain text backup:","Lagra textbackup"}.
{"Subject","Ämne"}.
{"Submit","Skicka"}.
{"Submitted","Skicka in"}.
{"Subscriber Address","Prenumerationsadress"}.
{"Subscription","Prenumeration"}.
{"Sunday","Söndag"}.
{"That nickname is registered by another person","Smeknamnet är reserverat"}.
{"The CAPTCHA is valid.","Din CAPTCHA är godkänd."}.
{"the password is","Lösenordet är"}.
{"This participant is kicked from the room because he sent an error message","Deltagaren har blivit kickad fran rummet p.g.a att han skickade ett errormeddelande"}.
{"This participant is kicked from the room because he sent an error message to another participant","Deltagaren har blivit kickad från rummet p.g.a att han skickade ett errormeddelande till en annan deltagare"}.
{"This participant is kicked from the room because he sent an error presence","Denna deltagaren är kickad från rummet p.g.a att han skickade en errorstatus"}.
{"This room is not anonymous","Detta rum är inte anonymt"}.
{"Thursday","Torsdag"}.
{"Time delay","Tidsförsening"}.
{"Time","Tid"}.
{"To ~s","Till ~s"}.
{"To","Till"}.
{"Traffic rate limit is exceeded","Trafikgränsen har överstigits"}.
{"Transactions Aborted:","Transaktioner borttagna"}.
{"Transactions Committed:","Transaktioner kommittade"}.
{"Transactions Logged:","Transaktioner loggade "}.
{"Transactions Restarted:","Transaktioner omstartade"}.
{"Tuesday","Tisdag"}.
{"Unauthorized","Ej auktoriserad"}.
{"Update message of the day (don't send)","Uppdatera dagens status meddelande (skicka inte)"}.
{"Update message of the day on all hosts (don't send)","Uppdatera dagens status meddelande på alla värdar (skicka inte)"}.
{"Update plan","Uppdateringsplan"}.
{"Update script","Uppdatera skript"}.
{"Update ","Uppdatera"}.
{"Update","Uppdatera"}.
{"Uptime:","Tid upp"}.
{"Use of STARTTLS required","Du måste använda STARTTLS"}.
{"User ","Användare "}.
{"User","Användarnamn"}.
{"User Management","Användarmanagement"}.
{"Users","Användare"}.
{"Users are not allowed to register accounts so quickly","Det är inte tillåtet för användare att skapa konton så fort"}.
{"Users Last Activity","Användarens senaste aktivitet"}.
{"Validate","Validera"}.
{"vCard User Search","vCard användare sök"}.
{"Virtual Hosts","Virtuella servrar"}.
{"Visitors are not allowed to change their nicknames in this room","Det är inte tillåtet for gäster att ändra sina smeknamn i detta rummet"}.
{"Visitors are not allowed to send messages to all occupants","Besökare får inte skicka medelande till alla"}.
{"Wednesday","Onsdag"}.
{"When to send the last published item","När att skicka senast publicerade ämne"}.
{"Whether to allow subscriptions","Tillåta prenumerationer?"}.
{"You have been banned from this room","Du har blivit bannlyst från det här rummet"}.
{"You must fill in field \"Nickname\" in the form","Du måste fylla i fält \"smeknamn\" i formen"}.
{"You need an x:data capable client to configure mod_irc settings","Du behöer en klient som stöjer x:data för att konfigurera mod_irc"}.
{"You need an x:data capable client to configure room","Du behöver en klient som stödjer x:data för att konfiguera detta rum"}.
{"You need an x:data capable client to search","Du behöver en klient som stödjer x:data, för att kunna söka"}.
{"Your contact offline message queue is full. The message has been discarded.","Din kontaktkö for offlinekontakter ar full"}.
{"Your messages to ~s are being blocked. To unblock them, visit ~s","Dina meddelanden till ~s är blockerade. För att avblockera dem, gå till ~s"}.
ejabberd-2.1.11/src/msgs/zh.po 0000664 0000000 0000000 00000147667 12240230175 012764 0 ustar msgid ""
msgstr ""
"Project-Id-Version: 2.1.0-alpha\n"
"Last-Translator: Shelley Shyan - shelleyshyan AT gmail DOT com\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Language: Chinese (中文)\n"
"X-Additional-Translator: Zhan Caibao - zhancaibao AT gmail DOT com\n"
"X-Additional-Translator: Mike Wang\n"
#: ejabberd_c2s.erl:424 ejabberd_c2s.erl:727
msgid "Use of STARTTLS required"
msgstr "要求使用 STARTTLS"
#: ejabberd_c2s.erl:503
msgid "No resource provided"
msgstr "无资源提供"
#: ejabberd_c2s.erl:1197
msgid "Replaced by new connection"
msgstr "被新的连接替换"
#: ejabberd_c2s.erl:1885
msgid "Your active privacy list has denied the routing of this stanza."
msgstr "你的活跃私聊列表拒绝了在此房间进行路由分发."
#: ejabberd_captcha.erl:96 ejabberd_captcha.erl:152 ejabberd_captcha.erl:178
msgid "Enter the text you see"
msgstr "请输入您所看到的文本"
#: ejabberd_captcha.erl:101
msgid "Your messages to ~s are being blocked. To unblock them, visit ~s"
msgstr "您发送给 ~s 的消息已被阻止. 要解除阻止, 请访问 ~s"
#: ejabberd_captcha.erl:134
msgid "If you don't see the CAPTCHA image here, visit the web page."
msgstr "如果您在这里没有看到验证码图片, 请访问网页."
#: ejabberd_captcha.erl:146
msgid "CAPTCHA web page"
msgstr "验证码网页"
#: ejabberd_captcha.erl:307
msgid "The CAPTCHA is valid."
msgstr "验证码有效."
#: mod_adhoc.erl:95 mod_adhoc.erl:125 mod_adhoc.erl:143 mod_adhoc.erl:161
msgid "Commands"
msgstr "命令"
#: mod_adhoc.erl:149 mod_adhoc.erl:243
msgid "Ping"
msgstr "Ping"
#: mod_adhoc.erl:260
msgid "Pong"
msgstr "Pong"
#: mod_announce.erl:507 mod_announce_odbc.erl:499
msgid "Really delete message of the day?"
msgstr "确实要删除每日消息吗?"
#: mod_announce.erl:515 mod_announce_odbc.erl:507 mod_configure.erl:1083
#: mod_configure.erl:1128
msgid "Subject"
msgstr "标题"
#: mod_announce.erl:520 mod_announce_odbc.erl:512 mod_configure.erl:1088
#: mod_configure.erl:1133
msgid "Message body"
msgstr "消息主体"
#: mod_announce.erl:600 mod_announce_odbc.erl:592
msgid "No body provided for announce message"
msgstr "通知消息无正文内容"
#: mod_announce.erl:635 mod_announce_odbc.erl:627
msgid "Announcements"
msgstr "通知"
#: mod_announce.erl:637 mod_announce_odbc.erl:629
msgid "Send announcement to all users"
msgstr "发送通知给所有用户"
#: mod_announce.erl:639 mod_announce_odbc.erl:631
msgid "Send announcement to all users on all hosts"
msgstr "发送通知给所有主机上的所有用户"
#: mod_announce.erl:641 mod_announce_odbc.erl:633
msgid "Send announcement to all online users"
msgstr "发送通知给所有在线用户"
#: mod_announce.erl:643 mod_announce_odbc.erl:635 mod_configure.erl:1078
#: mod_configure.erl:1123
msgid "Send announcement to all online users on all hosts"
msgstr "发送通知给所有主机的在线用户"
#: mod_announce.erl:645 mod_announce_odbc.erl:637
msgid "Set message of the day and send to online users"
msgstr "设定每日消息并发送给所有在线用户"
#: mod_announce.erl:647 mod_announce_odbc.erl:639
msgid "Set message of the day on all hosts and send to online users"
msgstr "设置所有主机上的每日消息并发送给在线用户"
#: mod_announce.erl:649 mod_announce_odbc.erl:641
msgid "Update message of the day (don't send)"
msgstr "更新每日消息(不发送)"
#: mod_announce.erl:651 mod_announce_odbc.erl:643
msgid "Update message of the day on all hosts (don't send)"
msgstr "更新所有主机上的每日消息(不发送)"
#: mod_announce.erl:653 mod_announce_odbc.erl:645
msgid "Delete message of the day"
msgstr "删除每日消息"
#: mod_announce.erl:655 mod_announce_odbc.erl:647
msgid "Delete message of the day on all hosts"
msgstr "删除所有主机上的每日消息"
#: mod_configure.erl:114 mod_configure.erl:274 mod_configure.erl:296
#: mod_configure.erl:498
msgid "Configuration"
msgstr "配置"
#: mod_configure.erl:125 mod_configure.erl:576 web/ejabberd_web_admin.erl:1936
msgid "Database"
msgstr "数据库"
#: mod_configure.erl:127 mod_configure.erl:595
msgid "Start Modules"
msgstr "启动模块"
#: mod_configure.erl:129 mod_configure.erl:596
msgid "Stop Modules"
msgstr "停止模块"
#: mod_configure.erl:131 mod_configure.erl:604 web/ejabberd_web_admin.erl:1937
msgid "Backup"
msgstr "备份"
#: mod_configure.erl:133 mod_configure.erl:605
msgid "Restore"
msgstr "恢复"
#: mod_configure.erl:135 mod_configure.erl:606
msgid "Dump to Text File"
msgstr "转储到文本文件"
#: mod_configure.erl:137 mod_configure.erl:615
msgid "Import File"
msgstr "导入文件"
#: mod_configure.erl:139 mod_configure.erl:616
msgid "Import Directory"
msgstr "导入目录"
#: mod_configure.erl:141 mod_configure.erl:581 mod_configure.erl:1057
msgid "Restart Service"
msgstr "重启服务"
#: mod_configure.erl:143 mod_configure.erl:582 mod_configure.erl:1102
msgid "Shut Down Service"
msgstr "关闭服务"
#: mod_configure.erl:145 mod_configure.erl:518 mod_configure.erl:1197
#: web/ejabberd_web_admin.erl:1527
msgid "Add User"
msgstr "添加用户"
#: mod_configure.erl:147 mod_configure.erl:519 mod_configure.erl:1219
msgid "Delete User"
msgstr "删除用户"
#: mod_configure.erl:149 mod_configure.erl:520 mod_configure.erl:1231
msgid "End User Session"
msgstr "结束用户会话"
#: mod_configure.erl:151 mod_configure.erl:521 mod_configure.erl:1243
#: mod_configure.erl:1255
msgid "Get User Password"
msgstr "获取用户密码"
#: mod_configure.erl:153 mod_configure.erl:522
msgid "Change User Password"
msgstr "更改用户密码"
#: mod_configure.erl:155 mod_configure.erl:523 mod_configure.erl:1272
msgid "Get User Last Login Time"
msgstr "获取用户上次登陆时间"
#: mod_configure.erl:157 mod_configure.erl:524 mod_configure.erl:1284
msgid "Get User Statistics"
msgstr "获取用户统计"
#: mod_configure.erl:159 mod_configure.erl:525
msgid "Get Number of Registered Users"
msgstr "获取注册用户数"
#: mod_configure.erl:161 mod_configure.erl:526
msgid "Get Number of Online Users"
msgstr "获取在线用户数"
#: mod_configure.erl:163 mod_configure.erl:509 web/ejabberd_web_admin.erl:831
#: web/ejabberd_web_admin.erl:872
msgid "Access Control Lists"
msgstr "访问控制列表(ACL)"
#: mod_configure.erl:165 mod_configure.erl:510 web/ejabberd_web_admin.erl:940
#: web/ejabberd_web_admin.erl:976
msgid "Access Rules"
msgstr "访问规则"
#: mod_configure.erl:297 mod_configure.erl:499
msgid "User Management"
msgstr "用户管理"
#: mod_configure.erl:500 web/ejabberd_web_admin.erl:1058
#: web/ejabberd_web_admin.erl:1462
msgid "Online Users"
msgstr "在线用户"
#: mod_configure.erl:501
msgid "All Users"
msgstr "所有用户"
#: mod_configure.erl:502
msgid "Outgoing s2s Connections"
msgstr "出站 s2s 连接"
#: mod_configure.erl:503 web/ejabberd_web_admin.erl:1907
msgid "Running Nodes"
msgstr "运行中的节点"
#: mod_configure.erl:504 web/ejabberd_web_admin.erl:1909
msgid "Stopped Nodes"
msgstr "已经停止的节点"
#: mod_configure.erl:577 mod_configure.erl:587 web/ejabberd_web_admin.erl:1953
msgid "Modules"
msgstr "模块"
#: mod_configure.erl:578
msgid "Backup Management"
msgstr "备份管理"
#: mod_configure.erl:579
msgid "Import Users From jabberd14 Spool Files"
msgstr "从 jabberd14 Spool 文件导入用户"
#: mod_configure.erl:699
msgid "To ~s"
msgstr "发送给~s"
#: mod_configure.erl:717
msgid "From ~s"
msgstr "来自~s"
#: mod_configure.erl:913
msgid "Database Tables Configuration at "
msgstr "数据库表格配置位于"
#: mod_configure.erl:918
msgid "Choose storage type of tables"
msgstr "请选择表格的存储类型"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "Disc only copy"
msgstr "仅磁盘复制"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "RAM and disc copy"
msgstr "内存与磁盘复制"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "RAM copy"
msgstr "内存(RAM)复制"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "Remote copy"
msgstr "远程复制"
#: mod_configure.erl:950
msgid "Stop Modules at "
msgstr "要停止的模块位于 "
#: mod_configure.erl:954
msgid "Choose modules to stop"
msgstr "请选择要停止的模块"
#: mod_configure.erl:969
msgid "Start Modules at "
msgstr "要启动的模块位于 "
#: mod_configure.erl:973
msgid "Enter list of {Module, [Options]}"
msgstr "请输入{模块, [选项]}列表"
#: mod_configure.erl:974
msgid "List of modules to start"
msgstr "要启动的模块列表"
#: mod_configure.erl:983
msgid "Backup to File at "
msgstr "备份文件位于"
#: mod_configure.erl:987 mod_configure.erl:1001
msgid "Enter path to backup file"
msgstr "请输入备份文件的路径"
#: mod_configure.erl:988 mod_configure.erl:1002 mod_configure.erl:1016
#: mod_configure.erl:1030
msgid "Path to File"
msgstr "文件路径"
#: mod_configure.erl:997
msgid "Restore Backup from File at "
msgstr "要恢复的备份文件位于"
#: mod_configure.erl:1011
msgid "Dump Backup to Text File at "
msgstr "转储备份到文本文件于"
#: mod_configure.erl:1015
msgid "Enter path to text file"
msgstr "请输入文本文件的路径"
#: mod_configure.erl:1025
msgid "Import User from File at "
msgstr "导入用户的文件位于 "
#: mod_configure.erl:1029
msgid "Enter path to jabberd14 spool file"
msgstr "请输入 jabberd14 spool 文件的路径"
#: mod_configure.erl:1039
msgid "Import Users from Dir at "
msgstr "导入用户的目录位于 "
#: mod_configure.erl:1043
msgid "Enter path to jabberd14 spool dir"
msgstr "请输入 jabberd14 spool 目录的路径"
#: mod_configure.erl:1044
msgid "Path to Dir"
msgstr "目录的路径"
#: mod_configure.erl:1060 mod_configure.erl:1105
msgid "Time delay"
msgstr "时间延迟"
#: mod_configure.erl:1143
msgid "Access Control List Configuration"
msgstr "访问控制列表(ACL)配置"
#: mod_configure.erl:1147
msgid "Access control lists"
msgstr "访问控制列表(ACL)"
#: mod_configure.erl:1171
msgid "Access Configuration"
msgstr "访问配置"
#: mod_configure.erl:1175
msgid "Access rules"
msgstr "访问规则"
#: mod_configure.erl:1200 mod_configure.erl:1222 mod_configure.erl:1234
#: mod_configure.erl:1246 mod_configure.erl:1258 mod_configure.erl:1275
#: mod_configure.erl:1287 mod_configure.erl:1650 mod_configure.erl:1700
#: mod_configure.erl:1721 mod_roster.erl:943 mod_roster_odbc.erl:1060
#: mod_vcard.erl:472 mod_vcard_ldap.erl:554 mod_vcard_odbc.erl:448
msgid "Jabber ID"
msgstr "Jabber ID"
#: mod_configure.erl:1205 mod_configure.erl:1263 mod_configure.erl:1651
#: mod_configure.erl:1863 mod_muc/mod_muc_room.erl:3224 mod_register.erl:235
#: web/ejabberd_web_admin.erl:1520
msgid "Password"
msgstr "密码"
#: mod_configure.erl:1210
msgid "Password Verification"
msgstr "确认密码"
#: mod_configure.erl:1301
msgid "Number of registered users"
msgstr "注册用户数"
#: mod_configure.erl:1315
msgid "Number of online users"
msgstr "在线用户数"
#: mod_configure.erl:1682 web/ejabberd_web_admin.erl:1588
#: web/ejabberd_web_admin.erl:1743
msgid "Never"
msgstr "从未"
#: mod_configure.erl:1696 web/ejabberd_web_admin.erl:1601
#: web/ejabberd_web_admin.erl:1756
msgid "Online"
msgstr "在线"
#: mod_configure.erl:1701
msgid "Last login"
msgstr "上次登陆"
#: mod_configure.erl:1722
msgid "Roster size"
msgstr "花名册大小"
#: mod_configure.erl:1723
msgid "IP addresses"
msgstr "IP 地址"
#: mod_configure.erl:1724
msgid "Resources"
msgstr "资源"
#: mod_configure.erl:1850
msgid "Administration of "
msgstr "管理"
#: mod_configure.erl:1853
msgid "Action on user"
msgstr "对用户的动作"
#: mod_configure.erl:1857
msgid "Edit Properties"
msgstr "编辑属性"
#: mod_configure.erl:1860 web/ejabberd_web_admin.erl:1769
msgid "Remove User"
msgstr "删除用户"
#: mod_irc/mod_irc.erl:201 mod_irc/mod_irc_odbc.erl:196
#: mod_muc/mod_muc.erl:336 mod_muc/mod_muc_odbc.erl:342
msgid "Access denied by service policy"
msgstr "访问被服务策略拒绝"
#: mod_irc/mod_irc.erl:401 mod_irc/mod_irc_odbc.erl:398
msgid "IRC Transport"
msgstr "IRC 传输"
#: mod_irc/mod_irc.erl:428 mod_irc/mod_irc_odbc.erl:425
msgid "ejabberd IRC module"
msgstr "ejabberd IRC 模块"
#: mod_irc/mod_irc.erl:559 mod_irc/mod_irc_odbc.erl:568
msgid "You need an x:data capable client to configure mod_irc settings"
msgstr "您需要一个兼容 x:data 的客户端来配置 mod_irc 设置"
#: mod_irc/mod_irc.erl:566 mod_irc/mod_irc_odbc.erl:575
msgid "Registration in mod_irc for "
msgstr "mod_irc 中的注册是为 "
#: mod_irc/mod_irc.erl:571 mod_irc/mod_irc_odbc.erl:580
msgid ""
"Enter username, encodings, ports and passwords you wish to use for "
"connecting to IRC servers"
msgstr "请输入您想使用的用来连接到IRC服务器的用户名, 编码, 端口和密码."
#: mod_irc/mod_irc.erl:576 mod_irc/mod_irc_odbc.erl:585
msgid "IRC Username"
msgstr "IRC 用户名"
#: mod_irc/mod_irc.erl:586 mod_irc/mod_irc_odbc.erl:595
msgid ""
"If you want to specify different ports, passwords, encodings for IRC "
"servers, fill this list with values in format '{\"irc server\", \"encoding"
"\", port, \"password\"}'. By default this service use \"~s\" encoding, port "
"~p, empty password."
msgstr ""
"如果您想为 IRC 服务器指定不同的端口, 密码, 编码, 请用 '{\"irc 服务器\", \"编"
"码\", 端口, \"密码\"}' 格式的值填充此表单. 默认情况下此服务使用\"~s\"编码, "
"~p 端口, 密码为空."
#: mod_irc/mod_irc.erl:598 mod_irc/mod_irc_odbc.erl:607
msgid ""
"Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef."
"net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."
msgstr ""
"例如: [{\"irc.lucky.net\", \"koi8-r\"}, 6667, \"secret\"}, {\"vendetta.fef."
"net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."
#: mod_irc/mod_irc.erl:603 mod_irc/mod_irc_odbc.erl:612
msgid "Connections parameters"
msgstr "连接参数"
#: mod_irc/mod_irc.erl:728 mod_irc/mod_irc_odbc.erl:757
msgid "Join IRC channel"
msgstr "加入 IRC 频道"
#: mod_irc/mod_irc.erl:732 mod_irc/mod_irc_odbc.erl:761
msgid "IRC channel (don't put the first #)"
msgstr "IRC 频道 (不要输入第一个#号)"
#: mod_irc/mod_irc.erl:737 mod_irc/mod_irc_odbc.erl:766
msgid "IRC server"
msgstr "IRC 服务器"
#: mod_irc/mod_irc.erl:770 mod_irc/mod_irc.erl:774
#: mod_irc/mod_irc_odbc.erl:799 mod_irc/mod_irc_odbc.erl:803
msgid "Join the IRC channel here."
msgstr "在这里加入 IRC 频道."
#: mod_irc/mod_irc.erl:778 mod_irc/mod_irc_odbc.erl:807
msgid "Join the IRC channel in this Jabber ID: ~s"
msgstr "用此 Jabber ID: ~s 加入 IRC 频道"
#: mod_irc/mod_irc.erl:863 mod_irc/mod_irc_odbc.erl:904
msgid "IRC settings"
msgstr "IRC 设置"
#: mod_irc/mod_irc.erl:868 mod_irc/mod_irc_odbc.erl:909
msgid ""
"Enter username and encodings you wish to use for connecting to IRC servers. "
"Press 'Next' to get more fields to fill in. Press 'Complete' to save "
"settings."
msgstr ""
"请输入您想使用的用来连接到 IRC 服务器的用户名和编码. 按 '下一步' 获取更多待填"
"字段. 按 '完成' 保存设置."
#: mod_irc/mod_irc.erl:874 mod_irc/mod_irc_odbc.erl:915
msgid "IRC username"
msgstr "IRC 用户名"
#: mod_irc/mod_irc.erl:923 mod_irc/mod_irc_odbc.erl:964
msgid "Password ~b"
msgstr "~b 的密码"
#: mod_irc/mod_irc.erl:928 mod_irc/mod_irc_odbc.erl:969
msgid "Port ~b"
msgstr "~b 的端口"
#: mod_irc/mod_irc.erl:933 mod_irc/mod_irc_odbc.erl:974
msgid "Encoding for server ~b"
msgstr "服务器 ~b 的编码"
#: mod_irc/mod_irc.erl:942 mod_irc/mod_irc_odbc.erl:983
msgid "Server ~b"
msgstr "服务器 ~b"
#: mod_muc/mod_muc.erl:449 mod_muc/mod_muc_odbc.erl:456
msgid "Only service administrators are allowed to send service messages"
msgstr "只有服务管理员可以发送服务消息"
#: mod_muc/mod_muc.erl:493 mod_muc/mod_muc_odbc.erl:500
msgid "Room creation is denied by service policy"
msgstr "创建房间被服务策略拒绝"
#: mod_muc/mod_muc.erl:500 mod_muc/mod_muc_odbc.erl:507
msgid "Conference room does not exist"
msgstr "会议室不存在"
#: mod_muc/mod_muc.erl:582 mod_muc/mod_muc_odbc.erl:595
msgid "Chatrooms"
msgstr "聊天室"
#: mod_muc/mod_muc.erl:712 mod_muc/mod_muc_odbc.erl:729
msgid "You need a client that supports x:data to register the nickname"
msgstr "您需要一个支持 x:data 的客户端来注册昵称"
#: mod_muc/mod_muc.erl:718 mod_muc/mod_muc_odbc.erl:735
msgid "Nickname Registration at "
msgstr "昵称注册于 "
#: mod_muc/mod_muc.erl:722 mod_muc/mod_muc_odbc.erl:739
msgid "Enter nickname you want to register"
msgstr "请输入您想要注册的昵称"
#: mod_muc/mod_muc.erl:723 mod_muc/mod_muc_odbc.erl:740
#: mod_muc/mod_muc_room.erl:3810 mod_roster.erl:944 mod_roster_odbc.erl:1061
#: mod_vcard.erl:364 mod_vcard.erl:477 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:453
msgid "Nickname"
msgstr "昵称"
#: mod_muc/mod_muc.erl:762 mod_muc/mod_muc_odbc.erl:784
#: mod_muc/mod_muc_room.erl:1064 mod_muc/mod_muc_room.erl:1787
msgid "That nickname is registered by another person"
msgstr "该昵称已被另一个人注册了"
#: mod_muc/mod_muc.erl:788 mod_muc/mod_muc_odbc.erl:811
msgid "You must fill in field \"Nickname\" in the form"
msgstr "您必须填充表单中\"昵称\"项"
#: mod_muc/mod_muc.erl:808 mod_muc/mod_muc_odbc.erl:831
msgid "ejabberd MUC module"
msgstr "ejabberd MUC 模块"
#: mod_muc/mod_muc_log.erl:374 mod_muc/mod_muc_log.erl:381
msgid "Chatroom configuration modified"
msgstr "聊天室配置已修改"
#: mod_muc/mod_muc_log.erl:384
msgid "joins the room"
msgstr "加入房间"
#: mod_muc/mod_muc_log.erl:387 mod_muc/mod_muc_log.erl:390
msgid "leaves the room"
msgstr "离开房间"
#: mod_muc/mod_muc_log.erl:393 mod_muc/mod_muc_log.erl:396
msgid "has been banned"
msgstr "已被禁止"
#: mod_muc/mod_muc_log.erl:399 mod_muc/mod_muc_log.erl:402
msgid "has been kicked"
msgstr "已被踢出"
#: mod_muc/mod_muc_log.erl:405
msgid "has been kicked because of an affiliation change"
msgstr "因联属关系改变而被踢出"
#: mod_muc/mod_muc_log.erl:408
msgid "has been kicked because the room has been changed to members-only"
msgstr "因该房间改为只对会员开放而被踢出"
#: mod_muc/mod_muc_log.erl:411
msgid "has been kicked because of a system shutdown"
msgstr "因系统关机而被踢出"
#: mod_muc/mod_muc_log.erl:414
msgid "is now known as"
msgstr "现在称呼为"
#: mod_muc/mod_muc_log.erl:417 mod_muc/mod_muc_log.erl:688
#: mod_muc/mod_muc_room.erl:2393
msgid " has set the subject to: "
msgstr "已将标题设置为: "
#: mod_muc/mod_muc_log.erl:452
msgid "Chatroom is created"
msgstr "聊天室已被创建"
#: mod_muc/mod_muc_log.erl:453
msgid "Chatroom is destroyed"
msgstr "聊天室已被销毁"
#: mod_muc/mod_muc_log.erl:454
msgid "Chatroom is started"
msgstr "聊天室已被启动"
#: mod_muc/mod_muc_log.erl:455
msgid "Chatroom is stopped"
msgstr "聊天室已被停用"
#: mod_muc/mod_muc_log.erl:459
msgid "Monday"
msgstr "星期一"
#: mod_muc/mod_muc_log.erl:460
msgid "Tuesday"
msgstr "星期二"
#: mod_muc/mod_muc_log.erl:461
msgid "Wednesday"
msgstr "星期三"
#: mod_muc/mod_muc_log.erl:462
msgid "Thursday"
msgstr "星期四"
#: mod_muc/mod_muc_log.erl:463
msgid "Friday"
msgstr "星期五"
#: mod_muc/mod_muc_log.erl:464
msgid "Saturday"
msgstr "星期六"
#: mod_muc/mod_muc_log.erl:465
msgid "Sunday"
msgstr "星期天"
#: mod_muc/mod_muc_log.erl:469
msgid "January"
msgstr "一月"
#: mod_muc/mod_muc_log.erl:470
msgid "February"
msgstr "二月"
#: mod_muc/mod_muc_log.erl:471
msgid "March"
msgstr "三月"
#: mod_muc/mod_muc_log.erl:472
msgid "April"
msgstr "四月"
#: mod_muc/mod_muc_log.erl:473
msgid "May"
msgstr "五月"
#: mod_muc/mod_muc_log.erl:474
msgid "June"
msgstr "六月"
#: mod_muc/mod_muc_log.erl:475
msgid "July"
msgstr "七月"
#: mod_muc/mod_muc_log.erl:476
msgid "August"
msgstr "八月"
#: mod_muc/mod_muc_log.erl:477
msgid "September"
msgstr "九月"
#: mod_muc/mod_muc_log.erl:478
msgid "October"
msgstr "十月"
#: mod_muc/mod_muc_log.erl:479
msgid "November"
msgstr "十一月"
#: mod_muc/mod_muc_log.erl:480
msgid "December"
msgstr "十二月"
#: mod_muc/mod_muc_log.erl:750
msgid "Room Configuration"
msgstr "房间配置"
#: mod_muc/mod_muc_log.erl:759
msgid "Room Occupants"
msgstr "房间人数"
#: mod_muc/mod_muc_room.erl:174
msgid "Traffic rate limit is exceeded"
msgstr "已经超过传输率限制"
#: mod_muc/mod_muc_room.erl:246
msgid ""
"This participant is kicked from the room because he sent an error message"
msgstr "该参与人由于发送了错误消息而被踢出了聊天室"
#: mod_muc/mod_muc_room.erl:255
msgid "It is not allowed to send private messages to the conference"
msgstr "不允许向会议发送私聊消息"
#: mod_muc/mod_muc_room.erl:332
msgid "Please, wait for a while before sending new voice request"
msgstr "请稍后再发送新的声音请求"
#: mod_muc/mod_muc_room.erl:347
msgid "Voice requests are disabled in this conference"
msgstr "该会议的声音请求以被禁用"
#: mod_muc/mod_muc_room.erl:364
msgid "Failed to extract JID from your voice request approval"
msgstr "无法从你的声音请求确认信息中提取JID"
#: mod_muc/mod_muc_room.erl:393
msgid "Only moderators can approve voice requests"
msgstr "仅主持人能确认声音请求"
#: mod_muc/mod_muc_room.erl:408
msgid "Improper message type"
msgstr "不恰当的消息类型"
#: mod_muc/mod_muc_room.erl:518
msgid ""
"This participant is kicked from the room because he sent an error message to "
"another participant"
msgstr "该参与人由于给其他人发送了出错消息而被踢出了聊天室"
#: mod_muc/mod_muc_room.erl:531
msgid "It is not allowed to send private messages of type \"groupchat\""
msgstr "\"群组聊天\"类型不允许发送私聊消息"
#: mod_muc/mod_muc_room.erl:543 mod_muc/mod_muc_room.erl:611
msgid "Recipient is not in the conference room"
msgstr "接收人不在会议室"
#: mod_muc/mod_muc_room.erl:564 mod_muc/mod_muc_room.erl:585
msgid "It is not allowed to send private messages"
msgstr "不可以发送私聊消息"
#: mod_muc/mod_muc_room.erl:576 mod_muc/mod_muc_room.erl:956
#: mod_muc/mod_muc_room.erl:4040
msgid "Only occupants are allowed to send messages to the conference"
msgstr "只有与会人可以向大会发送消息"
#: mod_muc/mod_muc_room.erl:634
msgid "Only occupants are allowed to send queries to the conference"
msgstr "只有与会人可以向大会发出查询请求"
#: mod_muc/mod_muc_room.erl:646
msgid "Queries to the conference members are not allowed in this room"
msgstr "本房间不可以查询会议成员信息"
#: mod_muc/mod_muc_room.erl:932
msgid ""
"Only moderators and participants are allowed to change the subject in this "
"room"
msgstr "只有主持人和参与人可以在此房间里更改主题"
#: mod_muc/mod_muc_room.erl:937
msgid "Only moderators are allowed to change the subject in this room"
msgstr "只有主持人可以在此房间里更改主题"
#: mod_muc/mod_muc_room.erl:947
msgid "Visitors are not allowed to send messages to all occupants"
msgstr "不允许访客给所有占有者发送消息"
#: mod_muc/mod_muc_room.erl:1021
msgid ""
"This participant is kicked from the room because he sent an error presence"
msgstr "该用户由于发送了错误状态而被踢出了聊天室"
#: mod_muc/mod_muc_room.erl:1040
msgid "Visitors are not allowed to change their nicknames in this room"
msgstr "此房间不允许用户更改昵称"
#: mod_muc/mod_muc_room.erl:1053 mod_muc/mod_muc_room.erl:1779
msgid "That nickname is already in use by another occupant"
msgstr "该昵称已被另一用户使用"
#: mod_muc/mod_muc_room.erl:1768
msgid "You have been banned from this room"
msgstr "您已被禁止进入该房间"
#: mod_muc/mod_muc_room.erl:1771
msgid "Membership is required to enter this room"
msgstr "进入此房间需要会员身份"
#: mod_muc/mod_muc_room.erl:1807
msgid "This room is not anonymous"
msgstr "此房间不是匿名房间"
#: mod_muc/mod_muc_room.erl:1833
msgid "A password is required to enter this room"
msgstr "进入此房间需要密码"
#: mod_muc/mod_muc_room.erl:1855 mod_register.erl:246
msgid "Too many CAPTCHA requests"
msgstr "验证码请求太多"
#: mod_muc/mod_muc_room.erl:1864 mod_register.erl:251
msgid "Unable to generate a CAPTCHA"
msgstr "无法生成验证码"
#: mod_muc/mod_muc_room.erl:1874
msgid "Incorrect password"
msgstr "密码不正确"
#: mod_muc/mod_muc_room.erl:2448
msgid "Administrator privileges required"
msgstr "需要管理员权限"
#: mod_muc/mod_muc_room.erl:2463
msgid "Moderator privileges required"
msgstr "需要主持人权限"
#: mod_muc/mod_muc_room.erl:2619
msgid "Jabber ID ~s is invalid"
msgstr "Jabber ID ~s 无效"
#: mod_muc/mod_muc_room.erl:2633
msgid "Nickname ~s does not exist in the room"
msgstr "昵称 ~s 不在该房间"
#: mod_muc/mod_muc_room.erl:2659 mod_muc/mod_muc_room.erl:3049
msgid "Invalid affiliation: ~s"
msgstr "无效加入: ~s"
#: mod_muc/mod_muc_room.erl:2713
msgid "Invalid role: ~s"
msgstr "无效角色: ~s"
#: mod_muc/mod_muc_room.erl:3026 mod_muc/mod_muc_room.erl:3062
msgid "Owner privileges required"
msgstr "需要持有人权限"
#: mod_muc/mod_muc_room.erl:3195
msgid "Configuration of room ~s"
msgstr "房间 ~s 的配置 "
#: mod_muc/mod_muc_room.erl:3200
msgid "Room title"
msgstr "房间标题"
#: mod_muc/mod_muc_room.erl:3203 mod_muc/mod_muc_room.erl:3692
msgid "Room description"
msgstr "房间描述"
#: mod_muc/mod_muc_room.erl:3210
msgid "Make room persistent"
msgstr "永久保存该房间"
#: mod_muc/mod_muc_room.erl:3215
msgid "Make room public searchable"
msgstr "使房间可被公开搜索"
#: mod_muc/mod_muc_room.erl:3218
msgid "Make participants list public"
msgstr "公开参与人列表"
#: mod_muc/mod_muc_room.erl:3221
msgid "Make room password protected"
msgstr "进入此房间需要密码"
#: mod_muc/mod_muc_room.erl:3232
msgid "Maximum Number of Occupants"
msgstr "允许的与会人最大数"
#: mod_muc/mod_muc_room.erl:3239
msgid "No limit"
msgstr "不限"
#: mod_muc/mod_muc_room.erl:3250
msgid "Present real Jabber IDs to"
msgstr "将真实 Jabber ID 显示给"
#: mod_muc/mod_muc_room.erl:3258 mod_muc/mod_muc_room.erl:3292
msgid "moderators only"
msgstr "仅主持人"
#: mod_muc/mod_muc_room.erl:3260 mod_muc/mod_muc_room.erl:3294
msgid "anyone"
msgstr "任何人"
#: mod_muc/mod_muc_room.erl:3262
msgid "Make room members-only"
msgstr "设置房间只接收会员"
#: mod_muc/mod_muc_room.erl:3265
msgid "Make room moderated"
msgstr "设置房间只接收主持人"
#: mod_muc/mod_muc_room.erl:3268
msgid "Default users as participants"
msgstr "用户默认被视为参与人"
#: mod_muc/mod_muc_room.erl:3271
msgid "Allow users to change the subject"
msgstr "允许用户更改主题"
#: mod_muc/mod_muc_room.erl:3274
msgid "Allow users to send private messages"
msgstr "允许用户发送私聊消息"
#: mod_muc/mod_muc_room.erl:3279
msgid "Allow visitors to send private messages to"
msgstr "允许访客发送私聊消息至"
#: mod_muc/mod_muc_room.erl:3290
msgid "nobody"
msgstr "没有人"
#: mod_muc/mod_muc_room.erl:3296
msgid "Allow users to query other users"
msgstr "允许用户查询其它用户"
#: mod_muc/mod_muc_room.erl:3299
msgid "Allow users to send invites"
msgstr "允许用户发送邀请"
#: mod_muc/mod_muc_room.erl:3302
msgid "Allow visitors to send status text in presence updates"
msgstr "更新在线状态时允许用户发送状态文本"
#: mod_muc/mod_muc_room.erl:3305
msgid "Allow visitors to change nickname"
msgstr "允许用户更改昵称"
#: mod_muc/mod_muc_room.erl:3308
msgid "Allow visitors to send voice requests"
msgstr "允许访客发送声音请求"
#: mod_muc/mod_muc_room.erl:3311
msgid "Minimum interval between voice requests (in seconds)"
msgstr "声音请求的最小间隔(以秒为单位)"
#: mod_muc/mod_muc_room.erl:3317
msgid "Make room CAPTCHA protected"
msgstr "保护房间验证码"
#: mod_muc/mod_muc_room.erl:3322
msgid "Exclude Jabber IDs from CAPTCHA challenge"
msgstr "从验证码挑战中排除 Jabber ID"
#: mod_muc/mod_muc_room.erl:3329
msgid "Enable logging"
msgstr "启用服务器端聊天记录"
#: mod_muc/mod_muc_room.erl:3337
msgid "You need an x:data capable client to configure room"
msgstr "您需要一个兼容 x:data 的客户端来配置房间"
#: mod_muc/mod_muc_room.erl:3694
msgid "Number of occupants"
msgstr "驻留人数"
#: mod_muc/mod_muc_room.erl:3750
msgid "private, "
msgstr "保密, "
#: mod_muc/mod_muc_room.erl:3799
msgid "Voice request"
msgstr "声音请求"
#: mod_muc/mod_muc_room.erl:3803
msgid "Either approve or decline the voice request."
msgstr "接受或拒绝声音请求"
#: mod_muc/mod_muc_room.erl:3809
msgid "User JID"
msgstr "用户 JID"
#: mod_muc/mod_muc_room.erl:3811
msgid "Grant voice to this person?"
msgstr "为此人授权声音?"
#: mod_muc/mod_muc_room.erl:3960
msgid "~s invites you to the room ~s"
msgstr "~s 邀请你到 ~s 房间"
#: mod_muc/mod_muc_room.erl:3969
msgid "the password is"
msgstr "密码是"
#: mod_offline.erl:510 mod_offline_odbc.erl:352
msgid ""
"Your contact offline message queue is full. The message has been discarded."
msgstr "您的联系人离线消息队列已满. 消息已被丢弃"
#: mod_offline.erl:560 mod_offline_odbc.erl:408
msgid "~s's Offline Messages Queue"
msgstr "~s 的离线消息队列"
#: mod_offline.erl:563 mod_offline_odbc.erl:411 mod_roster.erl:987
#: mod_roster_odbc.erl:1104 mod_shared_roster.erl:901
#: mod_shared_roster.erl:1010 mod_shared_roster_odbc.erl:930
#: mod_shared_roster_odbc.erl:1039 web/ejabberd_web_admin.erl:833
#: web/ejabberd_web_admin.erl:874 web/ejabberd_web_admin.erl:942
#: web/ejabberd_web_admin.erl:978 web/ejabberd_web_admin.erl:1019
#: web/ejabberd_web_admin.erl:1508 web/ejabberd_web_admin.erl:1760
#: web/ejabberd_web_admin.erl:1931 web/ejabberd_web_admin.erl:1963
#: web/ejabberd_web_admin.erl:2031 web/ejabberd_web_admin.erl:2135
#: web/ejabberd_web_admin.erl:2160 web/ejabberd_web_admin.erl:2248
msgid "Submitted"
msgstr "已提交"
#: mod_offline.erl:571
msgid "Time"
msgstr "时间"
#: mod_offline.erl:572
msgid "From"
msgstr "从"
#: mod_offline.erl:573
msgid "To"
msgstr "到"
#: mod_offline.erl:574 mod_offline_odbc.erl:419
msgid "Packet"
msgstr "数据包"
#: mod_offline.erl:587 mod_offline_odbc.erl:432 mod_shared_roster.erl:908
#: mod_shared_roster_odbc.erl:937 web/ejabberd_web_admin.erl:882
#: web/ejabberd_web_admin.erl:986
msgid "Delete Selected"
msgstr "删除已选内容"
#: mod_offline.erl:645 mod_offline_odbc.erl:519
msgid "Offline Messages:"
msgstr "离线消息:"
#: mod_offline.erl:645 mod_offline_odbc.erl:519
msgid "Remove All Offline Messages"
msgstr "移除所有离线消息"
#: mod_proxy65/mod_proxy65_service.erl:213
msgid "ejabberd SOCKS5 Bytestreams module"
msgstr "ejabberd SOCKS5 字节流模块"
#: mod_pubsub/mod_pubsub.erl:1120 mod_pubsub/mod_pubsub_odbc.erl:929
msgid "Publish-Subscribe"
msgstr "发行-订阅"
#: mod_pubsub/mod_pubsub.erl:1214 mod_pubsub/mod_pubsub_odbc.erl:1025
msgid "ejabberd Publish-Subscribe module"
msgstr "ejabberd 发行-订阅模块"
#: mod_pubsub/mod_pubsub.erl:1497 mod_pubsub/mod_pubsub_odbc.erl:1312
msgid "PubSub subscriber request"
msgstr "PubSub 订阅人请求"
#: mod_pubsub/mod_pubsub.erl:1499 mod_pubsub/mod_pubsub_odbc.erl:1314
msgid "Choose whether to approve this entity's subscription."
msgstr "选择是否允许该实体的订阅"
#: mod_pubsub/mod_pubsub.erl:1505 mod_pubsub/mod_pubsub_odbc.erl:1320
msgid "Node ID"
msgstr "节点 ID"
#: mod_pubsub/mod_pubsub.erl:1510 mod_pubsub/mod_pubsub_odbc.erl:1325
msgid "Subscriber Address"
msgstr "订阅人地址"
#: mod_pubsub/mod_pubsub.erl:1516 mod_pubsub/mod_pubsub_odbc.erl:1331
msgid "Allow this Jabber ID to subscribe to this pubsub node?"
msgstr "允许该 Jabber ID 订阅该 pubsub 节点?"
#: mod_pubsub/mod_pubsub.erl:3474 mod_pubsub/mod_pubsub_odbc.erl:3287
msgid "Deliver payloads with event notifications"
msgstr "用事件通告传输有效负载"
#: mod_pubsub/mod_pubsub.erl:3475 mod_pubsub/mod_pubsub_odbc.erl:3288
msgid "Deliver event notifications"
msgstr "传递事件通知"
#: mod_pubsub/mod_pubsub.erl:3476 mod_pubsub/mod_pubsub_odbc.erl:3289
msgid "Notify subscribers when the node configuration changes"
msgstr "当节点设置改变时通知订阅人"
#: mod_pubsub/mod_pubsub.erl:3477 mod_pubsub/mod_pubsub_odbc.erl:3290
msgid "Notify subscribers when the node is deleted"
msgstr "当节点被删除时通知订阅人"
#: mod_pubsub/mod_pubsub.erl:3478 mod_pubsub/mod_pubsub_odbc.erl:3291
msgid "Notify subscribers when items are removed from the node"
msgstr "当从节点删除内容条目时通知订阅人"
#: mod_pubsub/mod_pubsub.erl:3479 mod_pubsub/mod_pubsub_odbc.erl:3292
msgid "Persist items to storage"
msgstr "持久化内容条目"
#: mod_pubsub/mod_pubsub.erl:3480 mod_pubsub/mod_pubsub_odbc.erl:3293
msgid "A friendly name for the node"
msgstr "该节点的友好名称"
#: mod_pubsub/mod_pubsub.erl:3481 mod_pubsub/mod_pubsub_odbc.erl:3294
msgid "Max # of items to persist"
msgstr "允许持久化的最大内容条目数"
#: mod_pubsub/mod_pubsub.erl:3482 mod_pubsub/mod_pubsub_odbc.erl:3295
msgid "Whether to allow subscriptions"
msgstr "是否允许订阅"
#: mod_pubsub/mod_pubsub.erl:3483 mod_pubsub/mod_pubsub_odbc.erl:3296
msgid "Specify the access model"
msgstr "指定访问范例"
#: mod_pubsub/mod_pubsub.erl:3486 mod_pubsub/mod_pubsub_odbc.erl:3299
msgid "Roster groups allowed to subscribe"
msgstr "允许订阅的花名册组"
#: mod_pubsub/mod_pubsub.erl:3487 mod_pubsub/mod_pubsub_odbc.erl:3300
msgid "Specify the publisher model"
msgstr "指定发布人范例"
#: mod_pubsub/mod_pubsub.erl:3489 mod_pubsub/mod_pubsub_odbc.erl:3302
msgid "Purge all items when the relevant publisher goes offline"
msgstr "相关发布人离线后清除所有选项"
#: mod_pubsub/mod_pubsub.erl:3490 mod_pubsub/mod_pubsub_odbc.erl:3303
msgid "Specify the event message type"
msgstr "指定事件消息类型"
# bytes was translated as 'bits'. It's corrected now.
#: mod_pubsub/mod_pubsub.erl:3492 mod_pubsub/mod_pubsub_odbc.erl:3305
msgid "Max payload size in bytes"
msgstr "最大有效负载字节数"
#: mod_pubsub/mod_pubsub.erl:3493 mod_pubsub/mod_pubsub_odbc.erl:3306
msgid "When to send the last published item"
msgstr "何时发送最新发布的内容条目"
#: mod_pubsub/mod_pubsub.erl:3495 mod_pubsub/mod_pubsub_odbc.erl:3308
msgid "Only deliver notifications to available users"
msgstr "仅将通知发送给可发送的用户"
#: mod_pubsub/mod_pubsub.erl:3496 mod_pubsub/mod_pubsub_odbc.erl:3309
msgid "The collections with which a node is affiliated"
msgstr "加入结点的集合"
#: mod_register.erl:193
msgid "The CAPTCHA verification has failed"
msgstr "验证码检查失败"
#: mod_register.erl:220
msgid "You need a client that supports x:data and CAPTCHA to register"
msgstr "您需要一个支持 x:data 和验证码的客户端进行注册"
#: mod_register.erl:226 mod_register.erl:265
msgid "Choose a username and password to register with this server"
msgstr "请选择在此服务器上注册所需的用户名和密码"
#: mod_register.erl:230 mod_vcard.erl:364 mod_vcard_odbc.erl:342
#: web/ejabberd_web_admin.erl:1515 web/ejabberd_web_admin.erl:1572
msgid "User"
msgstr "用户"
#: mod_register.erl:316 mod_register.erl:361
msgid "The password is too weak"
msgstr "密码强度太弱"
#: mod_register.erl:365
msgid "Users are not allowed to register accounts so quickly"
msgstr "不允许用户太频繁地注册帐户"
#: mod_roster.erl:938 mod_roster_odbc.erl:1055 web/ejabberd_web_admin.erl:1701
#: web/ejabberd_web_admin.erl:1886 web/ejabberd_web_admin.erl:1897
#: web/ejabberd_web_admin.erl:2219
msgid "None"
msgstr "无"
#: mod_roster.erl:945 mod_roster_odbc.erl:1062
msgid "Subscription"
msgstr "订阅"
#: mod_roster.erl:946 mod_roster_odbc.erl:1063
msgid "Pending"
msgstr "挂起"
#: mod_roster.erl:947 mod_roster_odbc.erl:1064
msgid "Groups"
msgstr "组"
#: mod_roster.erl:974 mod_roster_odbc.erl:1091
msgid "Validate"
msgstr "确认"
#: mod_roster.erl:982 mod_roster_odbc.erl:1099
msgid "Remove"
msgstr "移除"
#: mod_roster.erl:985 mod_roster_odbc.erl:1102
msgid "Roster of "
msgstr "花名册属于 "
#: mod_roster.erl:988 mod_roster_odbc.erl:1105 mod_shared_roster.erl:902
#: mod_shared_roster.erl:1011 mod_shared_roster_odbc.erl:931
#: mod_shared_roster_odbc.erl:1040 web/ejabberd_web_admin.erl:834
#: web/ejabberd_web_admin.erl:875 web/ejabberd_web_admin.erl:943
#: web/ejabberd_web_admin.erl:979 web/ejabberd_web_admin.erl:1020
#: web/ejabberd_web_admin.erl:1509 web/ejabberd_web_admin.erl:1761
#: web/ejabberd_web_admin.erl:1932 web/ejabberd_web_admin.erl:2136
#: web/ejabberd_web_admin.erl:2161
msgid "Bad format"
msgstr "格式错误"
#: mod_roster.erl:995 mod_roster_odbc.erl:1112
msgid "Add Jabber ID"
msgstr "添加 Jabber ID"
#: mod_roster.erl:1094 mod_roster_odbc.erl:1211
msgid "Roster"
msgstr "花名册"
#: mod_shared_roster.erl:857 mod_shared_roster.erl:899
#: mod_shared_roster.erl:1007 mod_shared_roster_odbc.erl:886
#: mod_shared_roster_odbc.erl:928 mod_shared_roster_odbc.erl:1036
msgid "Shared Roster Groups"
msgstr "共享的花名册组群"
#: mod_shared_roster.erl:895 mod_shared_roster_odbc.erl:924
#: web/ejabberd_web_admin.erl:1365 web/ejabberd_web_admin.erl:2461
msgid "Add New"
msgstr "添加新用户"
#: mod_shared_roster.erl:978 mod_shared_roster_odbc.erl:1007
msgid "Name:"
msgstr "姓名:"
#: mod_shared_roster.erl:983 mod_shared_roster_odbc.erl:1012
msgid "Description:"
msgstr "描述:"
#: mod_shared_roster.erl:991 mod_shared_roster_odbc.erl:1020
msgid "Members:"
msgstr "会员:"
#: mod_shared_roster.erl:999 mod_shared_roster_odbc.erl:1028
msgid "Displayed Groups:"
msgstr "已显示的组:"
#: mod_shared_roster.erl:1008 mod_shared_roster_odbc.erl:1037
msgid "Group "
msgstr "组"
#: mod_shared_roster.erl:1017 mod_shared_roster_odbc.erl:1046
#: web/ejabberd_web_admin.erl:840 web/ejabberd_web_admin.erl:884
#: web/ejabberd_web_admin.erl:949 web/ejabberd_web_admin.erl:1026
#: web/ejabberd_web_admin.erl:2017
msgid "Submit"
msgstr "提交"
#: mod_vcard.erl:165 mod_vcard_ldap.erl:238 mod_vcard_odbc.erl:129
msgid "Erlang Jabber Server"
msgstr "Erlang Jabber 服务器"
#: mod_vcard.erl:364 mod_vcard.erl:478 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:454
msgid "Birthday"
msgstr "出生日期"
#: mod_vcard.erl:364 mod_vcard.erl:480 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:456
msgid "City"
msgstr "城市"
#: mod_vcard.erl:364 mod_vcard.erl:479 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:455
msgid "Country"
msgstr "国家"
#: mod_vcard.erl:364 mod_vcard.erl:481 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:457
msgid "Email"
msgstr "电子邮件"
#: mod_vcard.erl:364 mod_vcard.erl:476 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:452
msgid "Family Name"
msgstr "姓氏"
#: mod_vcard.erl:364 mod_vcard_odbc.erl:342
msgid ""
"Fill in the form to search for any matching Jabber User (Add * to the end of "
"field to match substring)"
msgstr "填充表单以搜索任何匹配的 Jabber 用户(在字段末添加*来匹配子串)"
#: mod_vcard.erl:364 mod_vcard.erl:473 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:449
msgid "Full Name"
msgstr "全名"
#: mod_vcard.erl:364 mod_vcard.erl:475 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:451
msgid "Middle Name"
msgstr "中间名"
#: mod_vcard.erl:364 mod_vcard.erl:474 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:450 web/ejabberd_web_admin.erl:2006
msgid "Name"
msgstr "姓名"
#: mod_vcard.erl:364 mod_vcard.erl:482 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:458
msgid "Organization Name"
msgstr "组织名称"
#: mod_vcard.erl:364 mod_vcard.erl:483 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:459
msgid "Organization Unit"
msgstr "组织单位"
#: mod_vcard.erl:364 mod_vcard_ldap.erl:462 mod_vcard_odbc.erl:342
msgid "Search users in "
msgstr "搜索用户于 "
#: mod_vcard.erl:364 mod_vcard_ldap.erl:462 mod_vcard_odbc.erl:342
msgid "You need an x:data capable client to search"
msgstr "您需要一个兼容 x:data 的客户端来搜索"
#: mod_vcard.erl:389 mod_vcard_ldap.erl:487 mod_vcard_odbc.erl:367
msgid "vCard User Search"
msgstr "vCard 用户搜索"
#: mod_vcard.erl:445 mod_vcard_ldap.erl:541 mod_vcard_odbc.erl:421
msgid "ejabberd vCard module"
msgstr "ejabberd vCard 模块"
#: mod_vcard.erl:469 mod_vcard_ldap.erl:551 mod_vcard_odbc.erl:445
msgid "Search Results for "
msgstr "搜索结果属于关键词 "
#: mod_vcard_ldap.erl:462
msgid "Fill in fields to search for any matching Jabber User"
msgstr "填充字段以搜索任何匹配的 Jabber 用户"
#: web/ejabberd_web_admin.erl:193 web/ejabberd_web_admin.erl:203
#: web/ejabberd_web_admin.erl:219 web/ejabberd_web_admin.erl:229
msgid "Unauthorized"
msgstr "未认证的"
#: web/ejabberd_web_admin.erl:286 web/ejabberd_web_admin.erl:303
msgid "ejabberd Web Admin"
msgstr "ejabberd 网页管理"
#: web/ejabberd_web_admin.erl:769 web/ejabberd_web_admin.erl:780
msgid "Administration"
msgstr "管理"
#: web/ejabberd_web_admin.erl:878 web/ejabberd_web_admin.erl:982
msgid "Raw"
msgstr "原始格式"
#: web/ejabberd_web_admin.erl:1017
msgid "~s access rule configuration"
msgstr "~s 访问规则配置"
#: web/ejabberd_web_admin.erl:1035
msgid "Virtual Hosts"
msgstr "虚拟主机"
#: web/ejabberd_web_admin.erl:1043 web/ejabberd_web_admin.erl:1050
msgid "Users"
msgstr "用户"
#: web/ejabberd_web_admin.erl:1078
msgid "Users Last Activity"
msgstr "用户上次活动"
#: web/ejabberd_web_admin.erl:1080
msgid "Period: "
msgstr "持续时间: "
#: web/ejabberd_web_admin.erl:1090
msgid "Last month"
msgstr "上个月"
#: web/ejabberd_web_admin.erl:1091
msgid "Last year"
msgstr "上一年"
#: web/ejabberd_web_admin.erl:1092
msgid "All activity"
msgstr "所有活动"
#: web/ejabberd_web_admin.erl:1094
msgid "Show Ordinary Table"
msgstr "显示普通列表"
#: web/ejabberd_web_admin.erl:1096
msgid "Show Integral Table"
msgstr "显示完整列表"
#: web/ejabberd_web_admin.erl:1105 web/ejabberd_web_admin.erl:1939
msgid "Statistics"
msgstr "统计"
#: web/ejabberd_web_admin.erl:1117
msgid "Not Found"
msgstr "没有找到"
#: web/ejabberd_web_admin.erl:1134
msgid "Node not found"
msgstr "没有找到节点"
#: web/ejabberd_web_admin.erl:1460
msgid "Host"
msgstr "主机"
#: web/ejabberd_web_admin.erl:1461
msgid "Registered Users"
msgstr "注册用户"
#: web/ejabberd_web_admin.erl:1573
msgid "Offline Messages"
msgstr "离线消息"
#: web/ejabberd_web_admin.erl:1574 web/ejabberd_web_admin.erl:1767
msgid "Last Activity"
msgstr "上次活动"
#: web/ejabberd_web_admin.erl:1659 web/ejabberd_web_admin.erl:1675
msgid "Registered Users:"
msgstr "注册用户:"
#: web/ejabberd_web_admin.erl:1661 web/ejabberd_web_admin.erl:1677
#: web/ejabberd_web_admin.erl:2192
msgid "Online Users:"
msgstr "在线用户:"
#: web/ejabberd_web_admin.erl:1663
msgid "Outgoing s2s Connections:"
msgstr "出站 s2s 连接:"
#: web/ejabberd_web_admin.erl:1665
msgid "Outgoing s2s Servers:"
msgstr "出站 s2s 服务器"
#: web/ejabberd_web_admin.erl:1734 web/mod_register_web.erl:175
#: web/mod_register_web.erl:372 web/mod_register_web.erl:381
#: web/mod_register_web.erl:411
msgid "Change Password"
msgstr "更改密码"
#: web/ejabberd_web_admin.erl:1758
msgid "User "
msgstr "用户 "
#: web/ejabberd_web_admin.erl:1765
msgid "Connected Resources:"
msgstr "已连接资源:"
#: web/ejabberd_web_admin.erl:1766 web/mod_register_web.erl:227
#: web/mod_register_web.erl:519
msgid "Password:"
msgstr "密码:"
#: web/ejabberd_web_admin.erl:1828
msgid "No Data"
msgstr "没有数据"
#: web/ejabberd_web_admin.erl:1906
msgid "Nodes"
msgstr "节点"
#: web/ejabberd_web_admin.erl:1929 web/ejabberd_web_admin.erl:1951
msgid "Node "
msgstr "节点 "
#: web/ejabberd_web_admin.erl:1938
msgid "Listened Ports"
msgstr "被监听的端口"
#: web/ejabberd_web_admin.erl:1940 web/ejabberd_web_admin.erl:2260
#: web/ejabberd_web_admin.erl:2448
msgid "Update"
msgstr "更新"
#: web/ejabberd_web_admin.erl:1943 web/ejabberd_web_admin.erl:2569
msgid "Restart"
msgstr "重启"
#: web/ejabberd_web_admin.erl:1945 web/ejabberd_web_admin.erl:2571
msgid "Stop"
msgstr "停止"
#: web/ejabberd_web_admin.erl:1959
msgid "RPC Call Error"
msgstr "RPC 调用错误"
#: web/ejabberd_web_admin.erl:2000
msgid "Database Tables at "
msgstr "数据库列表位于 "
#: web/ejabberd_web_admin.erl:2007
msgid "Storage Type"
msgstr "存储类型"
#: web/ejabberd_web_admin.erl:2008
msgid "Elements"
msgstr "元素"
#: web/ejabberd_web_admin.erl:2009
msgid "Memory"
msgstr "内存"
#: web/ejabberd_web_admin.erl:2032 web/ejabberd_web_admin.erl:2137
msgid "Error"
msgstr "错误"
#: web/ejabberd_web_admin.erl:2034
msgid "Backup of "
msgstr "备份来源 "
#: web/ejabberd_web_admin.erl:2036
msgid ""
"Please note that these options will only backup the builtin Mnesia database. "
"If you are using the ODBC module, you also need to backup your SQL database "
"separately."
msgstr ""
"注意:这些选项仅将备份内置的 Mnesia 数据库. 如果您正在使用 ODBC 模块, 您还需"
"要分别备份您的数据库."
#: web/ejabberd_web_admin.erl:2041
msgid "Store binary backup:"
msgstr "存储为二进制备份:"
#: web/ejabberd_web_admin.erl:2045 web/ejabberd_web_admin.erl:2052
#: web/ejabberd_web_admin.erl:2060 web/ejabberd_web_admin.erl:2067
#: web/ejabberd_web_admin.erl:2074 web/ejabberd_web_admin.erl:2081
#: web/ejabberd_web_admin.erl:2088 web/ejabberd_web_admin.erl:2096
#: web/ejabberd_web_admin.erl:2103 web/ejabberd_web_admin.erl:2110
msgid "OK"
msgstr "确定"
#: web/ejabberd_web_admin.erl:2048
msgid "Restore binary backup immediately:"
msgstr "立即恢复二进制备份:"
#: web/ejabberd_web_admin.erl:2056
msgid ""
"Restore binary backup after next ejabberd restart (requires less memory):"
msgstr "在下次 ejabberd 重启后恢复二进制备份(需要的内存更少):"
#: web/ejabberd_web_admin.erl:2063
msgid "Store plain text backup:"
msgstr "存储为普通文本备份:"
#: web/ejabberd_web_admin.erl:2070
msgid "Restore plain text backup immediately:"
msgstr "立即恢复普通文本备份:"
#: web/ejabberd_web_admin.erl:2077
msgid "Import users data from a PIEFXIS file (XEP-0227):"
msgstr "从 PIEFXIS 文件 (XEP-0227) 导入用户数据:"
#: web/ejabberd_web_admin.erl:2084
msgid "Export data of all users in the server to PIEFXIS files (XEP-0227):"
msgstr "将服务器上所有用户的数据导出到 PIEFXIS 文件 (XEP-0227):"
#: web/ejabberd_web_admin.erl:2091
msgid "Export data of users in a host to PIEFXIS files (XEP-0227):"
msgstr "将某主机的用户数据导出到 PIEFXIS 文件 (XEP-0227):"
#: web/ejabberd_web_admin.erl:2099
msgid "Import user data from jabberd14 spool file:"
msgstr "从 jabberd14 Spool 文件导入用户数据:"
#: web/ejabberd_web_admin.erl:2106
msgid "Import users data from jabberd14 spool directory:"
msgstr "从 jabberd14 Spool 目录导入用户数据:"
#: web/ejabberd_web_admin.erl:2132
msgid "Listened Ports at "
msgstr "监听的端口位于 "
#: web/ejabberd_web_admin.erl:2157
msgid "Modules at "
msgstr "模块位于 "
#: web/ejabberd_web_admin.erl:2183
msgid "Statistics of ~p"
msgstr "~p 的统计"
#: web/ejabberd_web_admin.erl:2186
msgid "Uptime:"
msgstr "正常运行时间:"
#: web/ejabberd_web_admin.erl:2189
msgid "CPU Time:"
msgstr "CPU 时间:"
#: web/ejabberd_web_admin.erl:2195
msgid "Transactions Committed:"
msgstr "提交的事务:"
#: web/ejabberd_web_admin.erl:2198
msgid "Transactions Aborted:"
msgstr "取消的事务:"
#: web/ejabberd_web_admin.erl:2201
msgid "Transactions Restarted:"
msgstr "重启的事务:"
#: web/ejabberd_web_admin.erl:2204
msgid "Transactions Logged:"
msgstr "记入日志的事务:"
#: web/ejabberd_web_admin.erl:2246
msgid "Update "
msgstr "更新 "
#: web/ejabberd_web_admin.erl:2254
msgid "Update plan"
msgstr "更新计划"
#: web/ejabberd_web_admin.erl:2255
msgid "Modified modules"
msgstr "被修改模块"
#: web/ejabberd_web_admin.erl:2256
msgid "Update script"
msgstr "更新脚本"
#: web/ejabberd_web_admin.erl:2257
msgid "Low level update script"
msgstr "低级别更新脚本"
#: web/ejabberd_web_admin.erl:2258
msgid "Script check"
msgstr "脚本检查"
#: web/ejabberd_web_admin.erl:2426
msgid "Port"
msgstr "端口"
#: web/ejabberd_web_admin.erl:2427
msgid "IP"
msgstr "IP"
#: web/ejabberd_web_admin.erl:2428
msgid "Protocol"
msgstr "协议"
#: web/ejabberd_web_admin.erl:2429 web/ejabberd_web_admin.erl:2556
msgid "Module"
msgstr "模块"
#: web/ejabberd_web_admin.erl:2430 web/ejabberd_web_admin.erl:2557
msgid "Options"
msgstr "选项"
#: web/ejabberd_web_admin.erl:2450
msgid "Delete"
msgstr "删除"
#: web/ejabberd_web_admin.erl:2579
msgid "Start"
msgstr "开始"
#: web/mod_register_web.erl:104
msgid "Your Jabber account was successfully created."
msgstr "你的 Jabber 帐户已成功创建."
#: web/mod_register_web.erl:107
msgid "There was an error creating the account: "
msgstr "帐户创建出错: "
#: web/mod_register_web.erl:115
msgid "Your Jabber account was successfully deleted."
msgstr "你的 Jabber 帐户已成功删除."
#: web/mod_register_web.erl:118
msgid "There was an error deleting the account: "
msgstr "帐户删除失败: "
#: web/mod_register_web.erl:128
msgid "The password of your Jabber account was successfully changed."
msgstr "你的 Jabber 帐户密码已成功更新."
#: web/mod_register_web.erl:131
msgid "There was an error changing the password: "
msgstr "修改密码出错: "
#: web/mod_register_web.erl:163 web/mod_register_web.erl:172
msgid "Jabber Account Registration"
msgstr "Jabber 帐户注册"
#: web/mod_register_web.erl:174 web/mod_register_web.erl:192
#: web/mod_register_web.erl:201
msgid "Register a Jabber account"
msgstr "注册 Jabber 帐户"
#: web/mod_register_web.erl:176 web/mod_register_web.erl:493
#: web/mod_register_web.erl:502
msgid "Unregister a Jabber account"
msgstr "注销 Jabber 帐户"
#: web/mod_register_web.erl:203
msgid ""
"This page allows to create a Jabber account in this Jabber server. Your JID "
"(Jabber IDentifier) will be of the form: username@server. Please read "
"carefully the instructions to fill correctly the fields."
msgstr ""
"本页面允许在此服务器上创建 Jabber 帐户. 你的 JID (Jabber ID) 的形式如下: 用户"
"名@服务器. 请仔细阅读说明并正确填写相应字段."
#: web/mod_register_web.erl:212 web/mod_register_web.erl:386
#: web/mod_register_web.erl:509
msgid "Username:"
msgstr "用户名:"
#: web/mod_register_web.erl:217
msgid "This is case insensitive: macbeth is the same that MacBeth and Macbeth."
msgstr "此处不区分大小写: macbeth 与 MacBeth 和 Macbeth 是一样的."
#: web/mod_register_web.erl:218
msgid "Characters not allowed:"
msgstr "禁用字符:"
#: web/mod_register_web.erl:222 web/mod_register_web.erl:391
#: web/mod_register_web.erl:514
msgid "Server:"
msgstr "服务器:"
#: web/mod_register_web.erl:232
msgid ""
"Don't tell your password to anybody, not even the administrators of the "
"Jabber server."
msgstr "不要将密码告诉任何人, 就算是 Jabber 服务器的管理员也不可以."
#: web/mod_register_web.erl:234
msgid "You can later change your password using a Jabber client."
msgstr "你可以稍后用 Jabber 客户端修改你的密码."
#: web/mod_register_web.erl:235
msgid ""
"Some Jabber clients can store your password in your computer. Use that "
"feature only if you trust your computer is safe."
msgstr ""
"某些 Jabber 客户端可以在你的计算机里存储密码. 请仅在你确认你的计算机安全的情"
"况下使用该功能."
#: web/mod_register_web.erl:237
msgid ""
"Memorize your password, or write it in a paper placed in a safe place. In "
"Jabber there isn't an automated way to recover your password if you forget "
"it."
msgstr ""
"记住你的密码, 或将其记到纸上并放于安全位置. 如果你忘记了密码, Jabber 也没有自"
"动恢复密码的方式."
#: web/mod_register_web.erl:242 web/mod_register_web.erl:406
msgid "Password Verification:"
msgstr "密码确认:"
#: web/mod_register_web.erl:250
msgid "Register"
msgstr "注册"
#: web/mod_register_web.erl:396
msgid "Old Password:"
msgstr "旧密码: "
#: web/mod_register_web.erl:401
msgid "New Password:"
msgstr "新密码: "
#: web/mod_register_web.erl:504
msgid "This page allows to unregister a Jabber account in this Jabber server."
msgstr "此页面允许在此 Jabber 服务器上注销 Jabber 帐户"
#: web/mod_register_web.erl:524
msgid "Unregister"
msgstr "取消注册"
#~ msgid "Captcha test failed"
#~ msgstr "验证码检测失败."
#~ msgid "Encodings"
#~ msgstr "编码"
#~ msgid "(Raw)"
#~ msgstr "(原始格式)"
#~ msgid "Specified nickname is already registered"
#~ msgstr "指定的昵称已被注册"
#~ msgid "Size"
#~ msgstr "大小"
ejabberd-2.1.11/src/msgs/de.msg 0000664 0000000 0000000 00000067173 12240230175 013074 0 ustar {"Access Configuration","Zugangskonfiguration"}.
{"Access Control List Configuration","Konfiguration der Zugangskontrolllisten"}.
{"Access control lists","Zugangskontroll-Listen (ACL)"}.
{"Access Control Lists","Zugangskontroll-Listen (ACL)"}.
{"Access denied by service policy","Zugang aufgrund der Dienstrichtlinien verweigert"}.
{"Access rules","Zugangsregeln"}.
{"Access Rules","Zugangsregeln"}.
{"Action on user","Aktion auf Benutzer"}.
{"Add Jabber ID","Jabber-ID hinzufügen"}.
{"Add New","Neue hinzufügen"}.
{"Add User","Benutzer hinzufügen"}.
{"Administration of ","Administration von "}.
{"Administration","Verwaltung"}.
{"Administrator privileges required","Administratorenrechte benötigt"}.
{"A friendly name for the node","Ein merkbarer Name für den Knoten"}.
{"All activity","Alle Aktivitäten"}.
{"Allow this Jabber ID to subscribe to this pubsub node?","Dieser Jabber-ID das Abonnement dieses pubsub-Knotens erlauben?"}.
{"Allow users to change the subject","Erlaube Benutzern das Thema zu ändern"}.
{"Allow users to query other users","Erlaube Benutzern Informationen über andere Benutzer abzufragen"}.
{"Allow users to send invites","Erlaube Benutzern Einladungen zu senden"}.
{"Allow users to send private messages","Erlaube Benutzern private Nachrichten zu senden"}.
{"Allow visitors to change nickname","Erlaube Besuchern ihren Spitznamen zu ändern"}.
{"Allow visitors to send private messages to","Erlaube Besuchern das Senden von privaten Nachrichten an"}.
{"Allow visitors to send status text in presence updates","Erlaube Besuchern einen Text bei Statusänderung zu senden"}.
{"Allow visitors to send voice requests","Anfragen von Sprachrechten für Benutzer erlauben"}.
{"All Users","Alle Benutzer"}.
{"Announcements","Ankündigungen"}.
{"anyone","jeden"}.
{"A password is required to enter this room","Sie brauchen ein Passwort um diesen Raum zu betreten"}.
{"April","April"}.
{"August","August"}.
{"Backup","Datensicherung"}.
{"Backup Management","Datensicherungsverwaltung"}.
{"Backup of ","Sicherung von "}.
{"Backup to File at ","Datensicherung in die Datei "}.
{"Bad format","Ungültiges Format"}.
{"Birthday","Geburtsdatum"}.
{"CAPTCHA web page","CAPTCHA Webseite"}.
{"Change Password","Passwort ändern"}.
{"Change User Password","Benutzer-Passwort ändern"}.
{"Characters not allowed:","Nicht erlaubte Zeichen:"}.
{"Chatroom configuration modified","Chatraum-Konfiguration geändert"}.
{"Chatroom is created","Chatraum wurde erstellt"}.
{"Chatroom is destroyed","Chatraum wurde entfernt"}.
{"Chatroom is started","Chatraum wurde gestartet"}.
{"Chatroom is stopped","Chatraum wurde beendet"}.
{"Chatrooms","Chaträume"}.
{"Choose a username and password to register with this server","Wählen sie zum Registrieren einen Benutzernamen und ein Passwort"}.
{"Choose modules to stop","Wähle zu stoppende Module"}.
{"Choose storage type of tables","Wähle Speichertyp der Tabellen"}.
{"Choose whether to approve this entity's subscription.","Wähle Sie, ob dieses Abonnement akzeptiert werden soll."}.
{"City","Stadt"}.
{"Commands","Befehle"}.
{"Conference room does not exist","Konferenzraum existiert nicht"}.
{"Configuration","Konfiguration"}.
{"Configuration of room ~s","Konfiguration für Raum ~s"}.
{"Connected Resources:","Verbundene Ressourcen:"}.
{"Connections parameters","Verbindungsparameter"}.
{"Country","Land"}.
{"CPU Time:","CPU-Zeit:"}.
{"Database","Datenbank"}.
{"Database Tables at ","Datenbanktabellen auf "}.
{"Database Tables Configuration at ","Datenbanktabellen-Konfiguration auf "}.
{"December","Dezember"}.
{"Default users as participants","Standardbenutzer als Teilnehmer"}.
{"Delete","Löschen"}.
{"Delete message of the day","Lösche Nachricht des Tages"}.
{"Delete message of the day on all hosts","Lösche Nachricht des Tages auf allen Hosts"}.
{"Delete Selected","Markierte löschen"}.
{"Delete User","Benutzer löschen"}.
{"Deliver event notifications","Ereignisbenachrichtigung zustellen"}.
{"Deliver payloads with event notifications","Nachrichten mit Ereignis-Benachrichtigungen zustellen"}.
{"Description:","Beschreibung:"}.
{"Disc only copy","Nur auf Festplatte"}.
{"Displayed Groups:","Angezeigte Gruppen:"}.
{"Don't tell your password to anybody, not even the administrators of the Jabber server.","Geben sie niemandem ihr Passwort, auch nicht den Administratoren des Jabber Servers."}.
{"Dump Backup to Text File at ","Ausgabe der Sicherung in diese Textdatei "}.
{"Dump to Text File","Ausgabe in Textdatei"}.
{"Edit Properties","Einstellungen ändern"}.
{"Either approve or decline the voice request.","Diese Anfrage für Sprachrechte bestätigen oder ablehnen."}.
{"ejabberd IRC module","ejabberd IRC-Modul"}.
{"ejabberd MUC module","ejabberd MUC-Modul"}.
{"ejabberd Publish-Subscribe module","ejabberd Publish-Subscribe-Modul"}.
{"ejabberd SOCKS5 Bytestreams module","ejabberd SOCKS5-Bytestreams-Modul"}.
{"ejabberd vCard module","ejabberd vCard-Modul"}.
{"ejabberd Web Admin","ejabberd Web-Admin"}.
{"Elements","Elemente"}.
{"Email","E-Mail"}.
{"Enable logging","Protokollierung aktivieren"}.
{"Encoding for server ~b","Kodierung für Server ~b"}.
{"End User Session","Benutzer-Sitzung beenden"}.
{"Enter list of {Module, [Options]}","Geben sie eine Liste bestehend aus {Modul, [Optionen]} ein"}.
{"Enter nickname you want to register","Geben sie den zu registrierenden Benutzernamen ein"}.
{"Enter path to backup file","Geben sie den Pfad zur Datensicherung ein"}.
{"Enter path to jabberd14 spool dir","Geben Sie den Pfad zum jabberd14-Spool-Verzeichnis ein"}.
{"Enter path to jabberd14 spool file","Geben Sie den Pfad zur jabberd14-Spool-Datei ein"}.
{"Enter path to text file","Geben sie den Pfad zur Textdatei ein"}.
{"Enter the text you see","Geben sie den Text den sie sehen ein"}.
{"Enter username and encodings you wish to use for connecting to IRC servers. Press 'Next' to get more fields to fill in. Press 'Complete' to save settings.","Geben sie Benutzernamen und Kodierung für Verbindungen zu IRC Servern an. Drücken sie 'Mehr' um leere Felder hinzuzufügen. Drücken sie 'Beenden' um die Einstellungen zu speichern."}.
{"Enter username, encodings, ports and passwords you wish to use for connecting to IRC servers","Geben Sie Benutzernamen und Zeichenkodierung für die Verbindung zum IRC-Server an"}.
{"Erlang Jabber Server","Erlang Jabber Server"}.
{"Error","Fehler"}.
{"Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef.net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}].","Beispiel: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef.net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."}.
{"Exclude Jabber IDs from CAPTCHA challenge","Von CAPTCHA Überprüfung ausgeschlossene Jabber IDs"}.
{"Export data of all users in the server to PIEFXIS files (XEP-0227):","Alle Benutzerdaten des Servers in PIEFXIS Dateien (XEP-0227) exportieren:"}.
{"Export data of users in a host to PIEFXIS files (XEP-0227):","Alle Benutzerdaten des Hosts in PIEFXIS Dateien (XEP-0227) exportieren:"}.
{"Failed to extract JID from your voice request approval","Fehler beim Auslesen der JID aus der Anfragenbestätigung für Sprachrechte"}.
{"Family Name","Nachname"}.
{"February","Februar"}.
{"Fill in fields to search for any matching Jabber User","Füllen Sie die Felder aus, um nach passenden Jabber-Benutzern zu suchen"}.
{"Fill in the form to search for any matching Jabber User (Add * to the end of field to match substring)","Füllen Sie die Felder aus, um nach passenden Jabber-Benutzern zu suchen (beenden Sie ein Feld mit *, um auch nach Teilzeichenketten zu suchen)"}.
{"Friday","Freitag"}.
{"From ~s","Von ~s"}.
{"From","Von"}.
{"Full Name","Vollständiger Name"}.
{"Get Number of Online Users","Anzahl der angemeldeten Benutzer abrufen"}.
{"Get Number of Registered Users","Anzahl der registrierten Benutzer abrufen"}.
{"Get User Last Login Time","letzte Anmeldezeit abrufen"}.
{"Get User Password","Benutzer-Passwort abrufen"}.
{"Get User Statistics","Benutzer-Statistiken abrufen"}.
{"Grant voice to this person?","Sprachrechte dieser Person erteilen?"}.
{"Group ","Gruppe "}.
{"Groups","Gruppen"}.
{"has been banned","wurde gebannt"}.
{"has been kicked because of an affiliation change","wurde wegen Änderung des Mitgliederstatus gekickt"}.
{"has been kicked because of a system shutdown","wurde wegen Systemabschaltung gekickt"}.
{"has been kicked because the room has been changed to members-only","wurde gekickt weil der Raum auf Nur-Mitglieder umgestellt wurde"}.
{"has been kicked","wurde gekickt"}.
{" has set the subject to: "," hat das Thema geändert auf: "}.
{"Host","Host"}.
{"If you don't see the CAPTCHA image here, visit the web page.","Wenn sie das CAPTCHA Bild nicht sehen, besuchen sie bitte die Webseite."}.
{"If you want to specify different ports, passwords, encodings for IRC servers, fill this list with values in format '{\"irc server\", \"encoding\", port, \"password\"}'. By default this service use \"~s\" encoding, port ~p, empty password.","Wenn sie verschiedene Ports, Passwörter und Kodierungen für IRC Server angeben wollen, erstellen sie die Liste mit folgendem Format '{\"IRC Server\", \"Kodierung\", Port, \"Passwort\"}'. Standardmäßig benutzt dieser Dienst die \"~s\" Kodierung, den Port ~p und kein Passwort."}.
{"Import Directory","Verzeichnis importieren"}.
{"Import File","Datei importieren"}.
{"Import user data from jabberd14 spool file:","Importiere Benutzer von jabberd14 Spool Datei:"}.
{"Import User from File at ","Benutzer aus dieser Datei importieren "}.
{"Import users data from a PIEFXIS file (XEP-0227):","Benutzerdaten von einer PIEFXIS Datei (XEP-0227) importieren:"}.
{"Import users data from jabberd14 spool directory:","Importiere Benutzer von jabberd14 Spool Verzeichnis:"}.
{"Import Users from Dir at ","Benutzer importieren aus dem Verzeichnis "}.
{"Import Users From jabberd14 Spool Files","Importiere Benutzer aus jabberd14-Spool-Dateien"}.
{"Improper message type","Unzulässiger Nachrichtentyp"}.
{"Incorrect password","Falsches Passwort"}.
{"Invalid affiliation: ~s","Ungültige Mitgliedschaft: ~s"}.
{"Invalid role: ~s","Ungültige Rolle: ~s"}.
{"IP addresses","IP Adressen"}.
{"IP","IP"}.
{"IRC channel (don't put the first #)","IRC Channel (ohne dem ersten #)"}.
{"IRC server","IRC Server"}.
{"IRC settings","IRC Einstellungen"}.
{"IRC Transport","IRC Transport"}.
{"IRC username","IRC Benutzername"}.
{"IRC Username","IRC-Benutzername"}.
{"is now known as","ist nun bekannt als"}.
{"It is not allowed to send private messages","Es ist nicht erlaubt private Nachrichten zu senden"}.
{"It is not allowed to send private messages of type \"groupchat\"","Es ist nicht erlaubt private Nachrichten des Typs \"Gruppenchat\" zu senden"}.
{"It is not allowed to send private messages to the conference","Es ist nicht erlaubt private Nachrichten an den Raum zu schicken"}.
{"Jabber Account Registration","Jabber Konto Anmeldung"}.
{"Jabber ID","Jabber ID"}.
{"Jabber ID ~s is invalid","Die Jabber-ID ~s ist ungültig"}.
{"January","Januar"}.
{"Join IRC channel","IRC Channel beitreten"}.
{"joins the room","betretet den Raum"}.
{"Join the IRC channel here.","Hier den IRC Channel beitreten."}.
{"Join the IRC channel in this Jabber ID: ~s","Den IRC Channel mit dieser Jabber ID beitreten: ~s"}.
{"July","Juli"}.
{"June","Juni"}.
{"Last Activity","Letzte Aktivität"}.
{"Last login","Letzte Anmeldung"}.
{"Last month","Letzter Monat"}.
{"Last year","Letztes Jahr"}.
{"leaves the room","verlässt den Raum"}.
{"Listened Ports","Aktive Ports"}.
{"Listened Ports at ","Aktive Ports bei"}.
{"List of modules to start","Liste der zu startenden Module"}.
{"Low level update script","Low level Aktualisierungsscript"}.
{"Make participants list public","Teilnehmerliste öffentlich machen"}.
{"Make room CAPTCHA protected","Raum mit Verifizierung (Captcha) versehen"}.
{"Make room members-only","Raum nur für Mitglieder zugänglich machen"}.
{"Make room moderated","Raum moderiert machen"}.
{"Make room password protected","Raum mit Passwort schützen"}.
{"Make room persistent","Raum persistent machen"}.
{"Make room public searchable","Raum öffentlich suchbar machen"}.
{"March","März"}.
{"Maximum Number of Occupants","Maximale Anzahl von Teilnehmern"}.
{"Max # of items to persist","Maximale Anzahl dauerhaft zu speichernder Einträge"}.
{"Max payload size in bytes","Maximale Nutzlastgrösse in Bytes"}.
{"May","Mai"}.
{"Membership is required to enter this room","Um diesen Raum zu betreten müssen sie Mitglied sein"}.
{"Members:","Mitglieder:"}.
{"Memorize your password, or write it in a paper placed in a safe place. In Jabber there isn't an automated way to recover your password if you forget it.","Merken sie sich ihr Passwort, oder schreiben sie es auf einen Zettel den sie sicher verwahren. Bei Jabber gibt es keine automatische Möglichkeit, das Passwort wiederherzustellen."}.
{"Memory","Speicher"}.
{"Message body","Nachrichtentext"}.
{"Middle Name","Zweiter Vorname"}.
{"Minimum interval between voice requests (in seconds)","Mindestdauer zwischen Anfragen für Sprachrechte (in Sekunden)"}.
{"Moderator privileges required","Moderatorrechte benötigt"}.
{"moderators only","ausschliesslich Moderatoren"}.
{"Modified modules","Geänderte Module"}.
{"Module","Modul"}.
{"Modules at ","Module bei "}.
{"Modules","Module"}.
{"Monday","Montag"}.
{"Name:","Name:"}.
{"Name","Vorname"}.
{"Never","Nie"}.
{"New Password:","Neues Passwort:"}.
{"Nickname","Benutzername"}.
{"Nickname Registration at ","Registrieren des Benutzernames auf"}.
{"Nickname ~s does not exist in the room","Der Benutzername ~s existiert im Raum nicht"}.
{"nobody","niemanden"}.
{"No body provided for announce message","Kein Text für die Ankündigung angegeben"}.
{"No Data","Keine Daten"}.
{"Node ID","Knoten-ID"}.
{"Node ","Knoten "}.
{"Node not found","Knoten nicht gefunden"}.
{"Nodes","Knoten"}.
{"No limit","Keine Begrenzung"}.
{"None","Keine"}.
{"No resource provided","Keine Ressource angegeben"}.
{"Not Found","Nicht gefunden"}.
{"Notify subscribers when items are removed from the node","Abonnenten benachrichtigen, wenn Einträge vom Knoten entfernt werden"}.
{"Notify subscribers when the node configuration changes","Abonnenten benachrichtigen, wenn sich die Knotenkonfiguration ändert"}.
{"Notify subscribers when the node is deleted","Abonnenten benachrichtigen, wenn der Knoten gelöscht wird"}.
{"November","November"}.
{"Number of occupants","Anzahl der Teilnehmer"}.
{"Number of online users","Anzahl der angemeldeten Benutzer"}.
{"Number of registered users","Anzahl der registrierten Benutzer"}.
{"October","Oktober"}.
{"Offline Messages:","Offline-Nachrichten:"}.
{"Offline Messages","Offline-Nachrichten"}.
{"OK","OK"}.
{"Old Password:","Aktuelles Passwort:"}.
{"Online","Angemeldet"}.
{"Online Users:","Angemeldete Benutzer:"}.
{"Online Users","Angemeldete Benutzer"}.
{"Only deliver notifications to available users","Benachrichtigungen nur an verfügbare Benutzer schicken"}.
{"Only moderators and participants are allowed to change the subject in this room","Nur Moderatoren und Mitglieder dürfen das Thema in diesem Raum ändern"}.
{"Only moderators are allowed to change the subject in this room","Nur Moderatoren dürfen das Thema in diesem Raum ändern"}.
{"Only moderators can approve voice requests","Nur Moderatoren können Anfragen für Sprachrechte bestätigen"}.
{"Only occupants are allowed to send messages to the conference","Nur Teilnehmer dürfen Nachrichten an den Raum schicken"}.
{"Only occupants are allowed to send queries to the conference","Nur Teilnehmer sind berechtigt Anfragen an die Konferenz zu senden"}.
{"Only service administrators are allowed to send service messages","Nur Service-Administratoren sind berechtigt, Servicenachrichten zu versenden"}.
{"Options","Optionen"}.
{"Organization Name","Organisation"}.
{"Organization Unit","Abteilung"}.
{"Outgoing s2s Connections:","Ausgehende s2s-Verbindungen:"}.
{"Outgoing s2s Connections","Ausgehende s2s-Verbindungen"}.
{"Outgoing s2s Servers:","Ausgehende s2s-Server:"}.
{"Owner privileges required","Besitzerrechte benötigt"}.
{"Packet","Paket"}.
{"Password ~b","Passwort ~b"}.
{"Password:","Passwort:"}.
{"Password","Passwort"}.
{"Password Verification:","Passwort bestätigen:"}.
{"Password Verification","Passwort bestätigen"}.
{"Path to Dir","Pfad zum Verzeichnis"}.
{"Path to File","Pfad zur Datei"}.
{"Pending","anhängig"}.
{"Period: ","Zeitraum: "}.
{"Persist items to storage","Einträge dauerhaft speichern"}.
{"Ping","Ping"}.
{"Please note that these options will only backup the builtin Mnesia database. If you are using the ODBC module, you also need to backup your SQL database separately.","Beachten sie, das diese Optionen nur die eingebaute Mnesia-Datenbank sichern. Wenn sie das ODBC-Modul verwenden, müssen sie die SQL-Datenbank manuell sichern."}.
{"Please, wait for a while before sending new voice request","Bitte warten sie ein wenig, bevor sie eine weitere Anfrage für Sprachrechte senden"}.
{"Pong","Pong"}.
{"Port ~b","Port ~b"}.
{"Port","Port"}.
{"Present real Jabber IDs to","Echte Jabber-IDs anzeigen für"}.
{"private, ","privat, "}.
{"Protocol","Protokoll"}.
{"Publish-Subscribe","Publish-Subscribe"}.
{"PubSub subscriber request","PubSub-Abonnenten-Anfrage"}.
{"Purge all items when the relevant publisher goes offline","Alle Einträge entfernen, wenn der relevante Veröffentlicher offline geht"}.
{"Queries to the conference members are not allowed in this room","Anfragen an die Teilnehmer sind in diesem Raum nicht erlaubt"}.
{"RAM and disc copy","RAM und Festplatte"}.
{"RAM copy","Nur RAM"}.
{"Raw","Unformatiert"}.
{"Really delete message of the day?","Die Nachricht des Tages wirklich löschen?"}.
{"Recipient is not in the conference room","Der Empfänger ist nicht im Raum"}.
{"Register a Jabber account","Jabber Konto registrieren"}.
{"Register","Anmelden"}.
{"Registered Users:","Registrierte Benutzer:"}.
{"Registered Users","Registrierte Benutzer"}.
{"Registration in mod_irc for ","Registrierung in mod_irc für "}.
{"Remote copy","Fernkopie"}.
{"Remove All Offline Messages","Alle Offline Nachrichten löschen"}.
{"Remove","Entfernen"}.
{"Remove User","Benutzer löschen"}.
{"Replaced by new connection","Durch neue Verbindung ersetzt"}.
{"Resources","Ressourcen"}.
{"Restart","Neustart"}.
{"Restart Service","Dienst neustarten"}.
{"Restore Backup from File at ","Datenwiederherstellung aus der Datei "}.
{"Restore binary backup after next ejabberd restart (requires less memory):","Stelle binäre Sicherung beim nächsten ejabberd-Neustart wieder her (benötigt weniger Speicher):"}.
{"Restore binary backup immediately:","Stelle binäre Sicherung sofort wieder her:"}.
{"Restore plain text backup immediately:","Stelle Klartext-Sicherung sofort wieder her:"}.
{"Restore","Wiederherstellung"}.
{"Room Configuration","Raum-Konfiguration"}.
{"Room creation is denied by service policy","Anlegen des Raumes aufgrund der Dienstrichtlinien verweigert"}.
{"Room description","Raum Beschreibung"}.
{"Room Occupants","Teilnehmer in diesem Raum"}.
{"Room title","Raumname"}.
{"Roster groups allowed to subscribe","Kontaktlisten-Gruppen die abonnieren dürfen"}.
{"Roster","Kontaktliste"}.
{"Roster of ","Kontaktliste von "}.
{"Roster size","Kontaktlistengröße"}.
{"RPC Call Error","Fehler bei RPC-Aufruf"}.
{"Running Nodes","Aktive Knoten"}.
{"~s access rule configuration","~s Zugangsregel-Konfiguration"}.
{"Saturday","Samstag"}.
{"Script check","Script-Überprüfung"}.
{"Search Results for ","Suchergebnisse für "}.
{"Search users in ","Benutzer suchen in "}.
{"Send announcement to all online users on all hosts","Sende Ankündigung an alle angemeldeten Benutzer auf allen Hosts"}.
{"Send announcement to all online users","Sende Ankündigung an alle angemeldeten Benutzer"}.
{"Send announcement to all users on all hosts","Sende Ankündigung an alle Benutzer auf allen Hosts"}.
{"Send announcement to all users","Sende Ankündigung an alle Benutzer"}.
{"September","September"}.
{"Server ~b","Server ~b"}.
{"Server:","Server:"}.
{"Set message of the day and send to online users","Setze Nachricht des Tages und sende sie an alle angemeldeten Benutzer"}.
{"Set message of the day on all hosts and send to online users","Setze Nachricht des Tages auf allen Hosts und sende sie an alle angemeldeten Benutzer"}.
{"Shared Roster Groups","Gruppen der gemeinsamen Kontaktliste"}.
{"Show Integral Table","Vollständige Tabelle anzeigen"}.
{"Show Ordinary Table","Normale Tabelle anzeigen"}.
{"Shut Down Service","Dienst herunterfahren"}.
{"~s invites you to the room ~s","~s lädt Sie in den Raum ~s ein"}.
{"Some Jabber clients can store your password in your computer. Use that feature only if you trust your computer is safe.","Einige Jabber Client Programme speichern ihr Passwort auf ihrem Computer. Verwenden sie diese Möglichkeit nur auf Computern, die sie als sicher einstufen."}.
{"Specify the access model","Geben sie das Zugangsmodell an"}.
{"Specify the event message type","Geben sie den Ereignis-Nachrichtentyp an"}.
{"Specify the publisher model","Geben sie das Publikationsmodell an"}.
{"~s's Offline Messages Queue","~s's Offline-Nachrichten-Warteschlange"}.
{"Start Modules at ","Starte Module auf "}.
{"Start Modules","Module starten"}.
{"Start","Starten"}.
{"Statistics of ~p","Statistiken von ~p"}.
{"Statistics","Statistik"}.
{"Stop Modules at ","Stoppe Module auf "}.
{"Stop Modules","Module stoppen"}.
{"Stopped Nodes","Inaktive Knoten"}.
{"Stop","Stoppen"}.
{"Storage Type","Speichertyp"}.
{"Store binary backup:","Speichere binäre Sicherung:"}.
{"Store plain text backup:","Speichere Klartext-Sicherung:"}.
{"Subject","Betreff"}.
{"Submit","Senden"}.
{"Submitted","Gesendet"}.
{"Subscriber Address","Abonnenten-Adresse"}.
{"Subscription","Abonnement"}.
{"Sunday","Sonntag"}.
{"That nickname is already in use by another occupant","Dieser Benutzername wird bereits von einem Teilnehmer genutzt"}.
{"That nickname is registered by another person","Dieser Benutzername wurde bereits von jemand anderem registriert"}.
{"The CAPTCHA is valid.","Die Verifizierung ist gültig."}.
{"The CAPTCHA verification has failed","Die CAPTCHA Verifizierung schlug fehl"}.
{"The collections with which a node is affiliated","Sammlungen, mit denen ein Knoten verknüpft ist"}.
{"the password is","das Passwort lautet"}.
{"The password is too weak","Das Passwort ist zu einfach"}.
{"The password of your Jabber account was successfully changed.","Das Passwort von ihrem Jabber Konto wurde geändert."}.
{"There was an error changing the password: ","Es trat ein Fehler beim Ändern des Passworts auf:"}.
{"There was an error creating the account: ","Es trat ein Fehler beim erstellen des Kontos auf:"}.
{"There was an error deleting the account: ","Es trat ein Fehler beim Löschen des Kontos auf:"}.
{"This is case insensitive: macbeth is the same that MacBeth and Macbeth.","Groß/Klein-Schreibung spielt hierbei keine Rolle: macbeth ist gleich MacBeth und Macbeth."}.
{"This page allows to create a Jabber account in this Jabber server. Your JID (Jabber IDentifier) will be of the form: username@server. Please read carefully the instructions to fill correctly the fields.","Diese Seite erlaubt das anlegen eines Jabber Kontos auf diesem Jabber Server. Ihre JID (Jabber IDentifier) setzt sich folgend zusammen: benutzername@server. Bitte lesen sie die Hinweise genau durch, um die Felder korrekt auszufüllen."}.
{"This page allows to unregister a Jabber account in this Jabber server.","Diese Seite erlaubt es, ein Jabber Konto von diesem Server zu entfernen."}.
{"This participant is kicked from the room because he sent an error message","Dieser Teilnehmer wurde aus dem Raum geworfen, da er eine fehlerhafte Nachricht gesendet hat"}.
{"This participant is kicked from the room because he sent an error message to another participant","Dieser Teilnehmer wurde aus dem Raum geworfen, da er eine fehlerhafte Nachricht an einen anderen Teilnehmer gesendet hat"}.
{"This participant is kicked from the room because he sent an error presence","Dieser Teilnehmer wurde aus dem Raum gekickt, da er einen fehlerhaften Status gesendet hat"}.
{"This room is not anonymous","Dieser Raum ist nicht anonym"}.
{"Thursday","Donnerstag"}.
{"Time delay","Zeitverzögerung"}.
{"Time","Zeit"}.
{"To","An"}.
{"Too many CAPTCHA requests","Zu viele CAPTCHA Anfragen"}.
{"To ~s","An ~s"}.
{"Traffic rate limit is exceeded","Datenratenlimit wurde überschritten"}.
{"Transactions Aborted:","Abgebrochene Transaktionen:"}.
{"Transactions Committed:","Durchgeführte Transaktionen:"}.
{"Transactions Logged:","Protokollierte Transaktionen:"}.
{"Transactions Restarted:","Neu gestartete Transaktionen:"}.
{"Tuesday","Dienstag"}.
{"Unable to generate a CAPTCHA","Konnte CAPTCHA nicht erstellen"}.
{"Unauthorized","Nicht berechtigt"}.
{"Unregister","Abmelden"}.
{"Unregister a Jabber account","Jabber Konto entfernen"}.
{"Update","Aktualisieren"}.
{"Update ","Aktualisierung "}.
{"Update message of the day (don't send)","Aktualisiere Nachricht des Tages (nicht senden)"}.
{"Update message of the day on all hosts (don't send)","Aktualisiere Nachricht des Tages auf allen Hosts (nicht senden)"}.
{"Update plan","Aktualisierungsplan"}.
{"Update script","Aktualisierungsscript"}.
{"Uptime:","Betriebszeit:"}.
{"Use of STARTTLS required","Verwendung von STARTTLS erforderlich"}.
{"User ","Benutzer "}.
{"User","Benutzer"}.
{"User JID","Benutzer JID"}.
{"User Management","Benutzerverwaltung"}.
{"Username:","Benutzername:"}.
{"Users are not allowed to register accounts so quickly","Benutzer dürfen Konten nicht so schnell registrieren"}.
{"Users","Benutzer"}.
{"Users Last Activity","Letzte Benutzeraktivität"}.
{"Validate","Validieren"}.
{"vCard User Search","vCard-Benutzer-Suche"}.
{"Virtual Hosts","Virtuelle Hosts"}.
{"Visitors are not allowed to change their nicknames in this room","Besucher dürfen in diesem Raum ihren Benutzernamen nicht ändern"}.
{"Visitors are not allowed to send messages to all occupants","Besucher dürfen nicht an alle Teilnehmer Nachrichten verschicken"}.
{"Voice request","Anfrage für Sprachrechte"}.
{"Voice requests are disabled in this conference","Anfragen für Sprachrechte sind in diesem Raum deaktiviert"}.
{"Wednesday","Mittwoch"}.
{"When to send the last published item","Wann soll das letzte veröffentlichte Objekt gesendet werden"}.
{"Whether to allow subscriptions","Ob Abonnements erlaubt sind"}.
{"You can later change your password using a Jabber client.","Sie können das Passwort später mit einem Jabber Client Programm ändern."}.
{"You have been banned from this room","Sie wurden aus diesem Raum verbannt"}.
{"You must fill in field \"Nickname\" in the form","Sie müssen das Feld \"Benutzername\" ausfüllen"}.
{"You need a client that supports x:data and CAPTCHA to register","Sie benötigen einen Client, der x:data und CAPTCHA unterstützt, um Ihren Benutzernamen zu registrieren"}.
{"You need a client that supports x:data to register the nickname","Sie benötigen einen Client, der x:data unterstützt, um Ihren Benutzernamen zu registrieren"}.
{"You need an x:data capable client to configure mod_irc settings","Sie benötigen einen Client, der x:data unterstützt, um die mod_irc-Einstellungen zu konfigurieren"}.
{"You need an x:data capable client to configure room","Sie benötigen einen Client, der x:data unterstützt, um den Raum zu konfigurieren"}.
{"You need an x:data capable client to search","Sie benötigen einen Client, der x:data unterstützt, um die Suche verwenden zu können"}.
{"Your active privacy list has denied the routing of this stanza.","Ihre aktive Privacy Liste hat die Weiterleitung des Stanzas unterbunden."}.
{"Your contact offline message queue is full. The message has been discarded.","Ihre Offline-Nachrichten-Warteschlange ist voll. Die Nachricht wurde verworfen."}.
{"Your Jabber account was successfully created.","Ihr Jabber Konto wurde erfolgreich erstellt."}.
{"Your Jabber account was successfully deleted.","Ihr Jabber Konto wurde erfolgreich gelöscht."}.
{"Your messages to ~s are being blocked. To unblock them, visit ~s","Ihre Nachrichten an ~s werden blockiert. Um dies zu ändern, besuchen sie ~s"}.
ejabberd-2.1.11/src/msgs/sk.po 0000664 0000000 0000000 00000152452 12240230175 012744 0 ustar msgid ""
msgstr ""
"Project-Id-Version: 2.1.0-alpha\n"
"Last-Translator: Marek Bečka\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Language: Slovak (slovenčina)\n"
"X-Additional-Translator: Juraj Michalek\n"
"X-Additional-Translator: SkLUG\n"
#: ejabberd_c2s.erl:424 ejabberd_c2s.erl:727
msgid "Use of STARTTLS required"
msgstr "Použitie STARTTLS je vyžadované"
#: ejabberd_c2s.erl:503
msgid "No resource provided"
msgstr "Nebol poskytnutý žiadny zdroj"
#: ejabberd_c2s.erl:1197
msgid "Replaced by new connection"
msgstr "Nahradené novým spojením"
#: ejabberd_c2s.erl:1885
msgid "Your active privacy list has denied the routing of this stanza."
msgstr ""
#: ejabberd_captcha.erl:96 ejabberd_captcha.erl:152 ejabberd_captcha.erl:178
msgid "Enter the text you see"
msgstr "Zadajte zobrazený text"
#: ejabberd_captcha.erl:101
msgid "Your messages to ~s are being blocked. To unblock them, visit ~s"
msgstr "Správa určená pre ~s bola zablokovaná. Oblokovať ju môžete na ~s"
#: ejabberd_captcha.erl:134
msgid "If you don't see the CAPTCHA image here, visit the web page."
msgstr ""
#: ejabberd_captcha.erl:146
msgid "CAPTCHA web page"
msgstr ""
#: ejabberd_captcha.erl:307
msgid "The CAPTCHA is valid."
msgstr "Platná CAPTCHA."
#: mod_adhoc.erl:95 mod_adhoc.erl:125 mod_adhoc.erl:143 mod_adhoc.erl:161
msgid "Commands"
msgstr "Príkazy"
#: mod_adhoc.erl:149 mod_adhoc.erl:243
msgid "Ping"
msgstr "Ping"
#: mod_adhoc.erl:260
msgid "Pong"
msgstr "Pong"
#: mod_announce.erl:507 mod_announce_odbc.erl:499
msgid "Really delete message of the day?"
msgstr "Skutočne zmazať správu dňa?"
#: mod_announce.erl:515 mod_announce_odbc.erl:507 mod_configure.erl:1083
#: mod_configure.erl:1128
msgid "Subject"
msgstr "Predmet"
#: mod_announce.erl:520 mod_announce_odbc.erl:512 mod_configure.erl:1088
#: mod_configure.erl:1133
msgid "Message body"
msgstr "Telo správy"
#: mod_announce.erl:600 mod_announce_odbc.erl:592
msgid "No body provided for announce message"
msgstr "Správa neobsahuje text"
#: mod_announce.erl:635 mod_announce_odbc.erl:627
msgid "Announcements"
msgstr "Oznámenia"
#: mod_announce.erl:637 mod_announce_odbc.erl:629
msgid "Send announcement to all users"
msgstr "Odoslať oznam všetkým používateľom"
#: mod_announce.erl:639 mod_announce_odbc.erl:631
msgid "Send announcement to all users on all hosts"
msgstr "Poslať oznámenie všetkým užívateľom na všetkých serveroch"
#: mod_announce.erl:641 mod_announce_odbc.erl:633
msgid "Send announcement to all online users"
msgstr "Odoslať zoznam všetkým online používateľom"
#: mod_announce.erl:643 mod_announce_odbc.erl:635 mod_configure.erl:1078
#: mod_configure.erl:1123
msgid "Send announcement to all online users on all hosts"
msgstr "Odoslať oznam všetkým online používateľom na všetkých serveroch"
#: mod_announce.erl:645 mod_announce_odbc.erl:637
msgid "Set message of the day and send to online users"
msgstr "Nastaviť správu dňa a odoslať ju online používateľom"
#: mod_announce.erl:647 mod_announce_odbc.erl:639
msgid "Set message of the day on all hosts and send to online users"
msgstr ""
"Nastaviť správu dňa na všetkých serveroch a poslať ju online užívateľom"
#: mod_announce.erl:649 mod_announce_odbc.erl:641
msgid "Update message of the day (don't send)"
msgstr "Aktualizovať správu dňa (neodosielať)"
#: mod_announce.erl:651 mod_announce_odbc.erl:643
msgid "Update message of the day on all hosts (don't send)"
msgstr "Upraviť správu dňa na všetkých serveroch"
#: mod_announce.erl:653 mod_announce_odbc.erl:645
msgid "Delete message of the day"
msgstr "Zmazať správu dňa"
#: mod_announce.erl:655 mod_announce_odbc.erl:647
msgid "Delete message of the day on all hosts"
msgstr "Zmazať správu dňa na všetkých serveroch"
#: mod_configure.erl:114 mod_configure.erl:274 mod_configure.erl:296
#: mod_configure.erl:498
msgid "Configuration"
msgstr "Konfigurácia"
#: mod_configure.erl:125 mod_configure.erl:576 web/ejabberd_web_admin.erl:1936
msgid "Database"
msgstr "Databáza"
#: mod_configure.erl:127 mod_configure.erl:595
msgid "Start Modules"
msgstr "Spustiť moduly"
#: mod_configure.erl:129 mod_configure.erl:596
msgid "Stop Modules"
msgstr "Zastaviť moduly"
#: mod_configure.erl:131 mod_configure.erl:604 web/ejabberd_web_admin.erl:1937
msgid "Backup"
msgstr "Zálohovať"
#: mod_configure.erl:133 mod_configure.erl:605
msgid "Restore"
msgstr "Obnoviť"
#: mod_configure.erl:135 mod_configure.erl:606
msgid "Dump to Text File"
msgstr "Uložiť do textového súboru"
#: mod_configure.erl:137 mod_configure.erl:615
msgid "Import File"
msgstr "Import súboru"
#: mod_configure.erl:139 mod_configure.erl:616
msgid "Import Directory"
msgstr "Import adresára"
#: mod_configure.erl:141 mod_configure.erl:581 mod_configure.erl:1057
msgid "Restart Service"
msgstr "Reštartovať službu"
#: mod_configure.erl:143 mod_configure.erl:582 mod_configure.erl:1102
msgid "Shut Down Service"
msgstr "Vypnúť službu"
#: mod_configure.erl:145 mod_configure.erl:518 mod_configure.erl:1197
#: web/ejabberd_web_admin.erl:1527
msgid "Add User"
msgstr "Pridať používateľa"
#: mod_configure.erl:147 mod_configure.erl:519 mod_configure.erl:1219
msgid "Delete User"
msgstr "Vymazať užívateľa"
#: mod_configure.erl:149 mod_configure.erl:520 mod_configure.erl:1231
msgid "End User Session"
msgstr "Ukončiť reláciu užívateľa"
#: mod_configure.erl:151 mod_configure.erl:521 mod_configure.erl:1243
#: mod_configure.erl:1255
msgid "Get User Password"
msgstr "Zobraziť heslo užívateľa"
#: mod_configure.erl:153 mod_configure.erl:522
msgid "Change User Password"
msgstr "Zmeniť heslo užívateľa"
#: mod_configure.erl:155 mod_configure.erl:523 mod_configure.erl:1272
msgid "Get User Last Login Time"
msgstr "Zobraziť čas posledného prihlásenia"
#: mod_configure.erl:157 mod_configure.erl:524 mod_configure.erl:1284
msgid "Get User Statistics"
msgstr "Zobraziť štatistiku užívateľa"
#: mod_configure.erl:159 mod_configure.erl:525
msgid "Get Number of Registered Users"
msgstr "Zobraziť počet registrovaných užívateľov"
#: mod_configure.erl:161 mod_configure.erl:526
msgid "Get Number of Online Users"
msgstr "Zobraziť počet pripojených užívateľov"
#: mod_configure.erl:163 mod_configure.erl:509 web/ejabberd_web_admin.erl:831
#: web/ejabberd_web_admin.erl:872
msgid "Access Control Lists"
msgstr "Zoznamy prístupových oprávnení (ACL)"
#: mod_configure.erl:165 mod_configure.erl:510 web/ejabberd_web_admin.erl:940
#: web/ejabberd_web_admin.erl:976
msgid "Access Rules"
msgstr "Prístupové pravidlá"
#: mod_configure.erl:297 mod_configure.erl:499
msgid "User Management"
msgstr "Správa užívateľov"
#: mod_configure.erl:500 web/ejabberd_web_admin.erl:1058
#: web/ejabberd_web_admin.erl:1462
msgid "Online Users"
msgstr "Online užívatelia"
#: mod_configure.erl:501
msgid "All Users"
msgstr "Všetci užívatelia"
#: mod_configure.erl:502
msgid "Outgoing s2s Connections"
msgstr "Odchádzajúce s2s spojenia"
#: mod_configure.erl:503 web/ejabberd_web_admin.erl:1907
msgid "Running Nodes"
msgstr "Bežiace uzly"
#: mod_configure.erl:504 web/ejabberd_web_admin.erl:1909
msgid "Stopped Nodes"
msgstr "Zastavené uzly"
#: mod_configure.erl:577 mod_configure.erl:587 web/ejabberd_web_admin.erl:1953
msgid "Modules"
msgstr "Moduly"
#: mod_configure.erl:578
msgid "Backup Management"
msgstr "Správa zálohovania"
#: mod_configure.erl:579
msgid "Import Users From jabberd14 Spool Files"
msgstr "Importovať užívateľov z jabberd14 spool súborov"
#: mod_configure.erl:699
msgid "To ~s"
msgstr "Pre ~s"
#: mod_configure.erl:717
msgid "From ~s"
msgstr "Od ~s"
#: mod_configure.erl:913
msgid "Database Tables Configuration at "
msgstr "Konfigurácia databázových tabuliek "
#: mod_configure.erl:918
msgid "Choose storage type of tables"
msgstr "Vyberte typ úložiska pre tabuľky"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "Disc only copy"
msgstr "Len kópia disku"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "RAM and disc copy"
msgstr "Kópia RAM a disku"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "RAM copy"
msgstr "Kópia RAM"
#: mod_configure.erl:926 mod_configure.erl:928
msgid "Remote copy"
msgstr "Vzdialená kópia"
#: mod_configure.erl:950
msgid "Stop Modules at "
msgstr "Zastaviť moduly na "
#: mod_configure.erl:954
msgid "Choose modules to stop"
msgstr "Vyberte moduly, ktoré majú byť zastavené"
#: mod_configure.erl:969
msgid "Start Modules at "
msgstr "Spustiť moduly na "
#: mod_configure.erl:973
msgid "Enter list of {Module, [Options]}"
msgstr "Vložte zoznam modulov {Modul, [Parametre]}"
#: mod_configure.erl:974
msgid "List of modules to start"
msgstr "Zoznam modulov, ktoré majú byť spustené"
#: mod_configure.erl:983
msgid "Backup to File at "
msgstr "Záloha do súboru na "
#: mod_configure.erl:987 mod_configure.erl:1001
msgid "Enter path to backup file"
msgstr "Zadajte cestu k súboru so zálohou"
#: mod_configure.erl:988 mod_configure.erl:1002 mod_configure.erl:1016
#: mod_configure.erl:1030
msgid "Path to File"
msgstr "Cesta k súboru"
#: mod_configure.erl:997
msgid "Restore Backup from File at "
msgstr "Obnoviť zálohu zo súboru na "
#: mod_configure.erl:1011
msgid "Dump Backup to Text File at "
msgstr "Uložiť zálohu do textového súboru na "
#: mod_configure.erl:1015
msgid "Enter path to text file"
msgstr "Zadajte cestu k textovému súboru"
#: mod_configure.erl:1025
msgid "Import User from File at "
msgstr "Importovať užívateľa zo súboru na "
#: mod_configure.erl:1029
msgid "Enter path to jabberd14 spool file"
msgstr "Zadajte cestu k spool súboru jabberd14"
#: mod_configure.erl:1039
msgid "Import Users from Dir at "
msgstr "Importovať užívateľov z adresára na "
#: mod_configure.erl:1043
msgid "Enter path to jabberd14 spool dir"
msgstr "Zadajte cestu k jabberd14 spool adresáru"
#: mod_configure.erl:1044
msgid "Path to Dir"
msgstr "Cesta k adresáru"
#: mod_configure.erl:1060 mod_configure.erl:1105
msgid "Time delay"
msgstr "Časový posun"
#: mod_configure.erl:1143
msgid "Access Control List Configuration"
msgstr "Konfigurácia zoznamu prístupových oprávnení (ACL)"
#: mod_configure.erl:1147
msgid "Access control lists"
msgstr "Zoznamy prístupových oprávnení (ACL)"
#: mod_configure.erl:1171
msgid "Access Configuration"
msgstr "Konfigurácia prístupu"
#: mod_configure.erl:1175
msgid "Access rules"
msgstr "Prístupové pravidlá"
#: mod_configure.erl:1200 mod_configure.erl:1222 mod_configure.erl:1234
#: mod_configure.erl:1246 mod_configure.erl:1258 mod_configure.erl:1275
#: mod_configure.erl:1287 mod_configure.erl:1650 mod_configure.erl:1700
#: mod_configure.erl:1721 mod_roster.erl:943 mod_roster_odbc.erl:1060
#: mod_vcard.erl:472 mod_vcard_ldap.erl:554 mod_vcard_odbc.erl:448
msgid "Jabber ID"
msgstr "Jabber ID"
#: mod_configure.erl:1205 mod_configure.erl:1263 mod_configure.erl:1651
#: mod_configure.erl:1863 mod_muc/mod_muc_room.erl:3224 mod_register.erl:235
#: web/ejabberd_web_admin.erl:1520
msgid "Password"
msgstr "Heslo"
#: mod_configure.erl:1210
msgid "Password Verification"
msgstr "Overenie hesla"
#: mod_configure.erl:1301
msgid "Number of registered users"
msgstr "Počet registrovaných užívateľov"
#: mod_configure.erl:1315
msgid "Number of online users"
msgstr "Počet online užívateľov"
#: mod_configure.erl:1682 web/ejabberd_web_admin.erl:1588
#: web/ejabberd_web_admin.erl:1743
msgid "Never"
msgstr "Nikdy"
#: mod_configure.erl:1696 web/ejabberd_web_admin.erl:1601
#: web/ejabberd_web_admin.erl:1756
msgid "Online"
msgstr "Online"
#: mod_configure.erl:1701
msgid "Last login"
msgstr "Posledné prihlásenie"
#: mod_configure.erl:1722
msgid "Roster size"
msgstr "Počet kontaktov v zozname"
#: mod_configure.erl:1723
msgid "IP addresses"
msgstr "IP adresa"
#: mod_configure.erl:1724
msgid "Resources"
msgstr "Zdroje"
#: mod_configure.erl:1850
msgid "Administration of "
msgstr "Administrácia "
#: mod_configure.erl:1853
msgid "Action on user"
msgstr "Operácia aplikovaná na užívateľa"
#: mod_configure.erl:1857
msgid "Edit Properties"
msgstr "Editovať vlastnosti"
#: mod_configure.erl:1860 web/ejabberd_web_admin.erl:1769
msgid "Remove User"
msgstr "Odstrániť užívateľa"
#: mod_irc/mod_irc.erl:201 mod_irc/mod_irc_odbc.erl:196
#: mod_muc/mod_muc.erl:336 mod_muc/mod_muc_odbc.erl:342
msgid "Access denied by service policy"
msgstr "Prístup bol zamietnutý nastavením služby"
#: mod_irc/mod_irc.erl:401 mod_irc/mod_irc_odbc.erl:398
msgid "IRC Transport"
msgstr "IRC Transport"
#: mod_irc/mod_irc.erl:428 mod_irc/mod_irc_odbc.erl:425
msgid "ejabberd IRC module"
msgstr "ejabberd IRC modul"
#: mod_irc/mod_irc.erl:559 mod_irc/mod_irc_odbc.erl:568
msgid "You need an x:data capable client to configure mod_irc settings"
msgstr "Pre konfiguráciu mod_irc potrebujete klienta podporujúceho x:data"
#: mod_irc/mod_irc.erl:566 mod_irc/mod_irc_odbc.erl:575
msgid "Registration in mod_irc for "
msgstr "Registrácia do mod_irc na "
#: mod_irc/mod_irc.erl:571 mod_irc/mod_irc_odbc.erl:580
msgid ""
"Enter username, encodings, ports and passwords you wish to use for "
"connecting to IRC servers"
msgstr ""
"Vložte meno používateľa, kódovanie, porty a heslo ktoré chcete používať pri "
"pripojení na IRC server"
#: mod_irc/mod_irc.erl:576 mod_irc/mod_irc_odbc.erl:585
msgid "IRC Username"
msgstr "IRC prezývka"
#: mod_irc/mod_irc.erl:586 mod_irc/mod_irc_odbc.erl:595
msgid ""
"If you want to specify different ports, passwords, encodings for IRC "
"servers, fill this list with values in format '{\"irc server\", \"encoding"
"\", port, \"password\"}'. By default this service use \"~s\" encoding, port "
"~p, empty password."
msgstr ""
"Ak chcete zadať iné porty, heslá a kódovania pre IRC servery, vyplnte zoznam "
"s hodnotami vo formáte '{\"irc server\",\"kódovanie\", \"port\", \"heslo"
"\"}'. Predvolenéi hodnoty pre túto službu sú: kódovanie \"~s\", port ~p a "
"žiadne heslo."
#: mod_irc/mod_irc.erl:598 mod_irc/mod_irc_odbc.erl:607
msgid ""
"Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef."
"net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."
msgstr ""
"Príklad: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef."
"net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}]."
#: mod_irc/mod_irc.erl:603 mod_irc/mod_irc_odbc.erl:612
msgid "Connections parameters"
msgstr "Parametre spojenia"
#: mod_irc/mod_irc.erl:728 mod_irc/mod_irc_odbc.erl:757
msgid "Join IRC channel"
msgstr "Pripojit IRC kanál"
#: mod_irc/mod_irc.erl:732 mod_irc/mod_irc_odbc.erl:761
msgid "IRC channel (don't put the first #)"
msgstr "IRC kanál (bez počiatočnej #)"
#: mod_irc/mod_irc.erl:737 mod_irc/mod_irc_odbc.erl:766
msgid "IRC server"
msgstr "IRC server"
#: mod_irc/mod_irc.erl:770 mod_irc/mod_irc.erl:774
#: mod_irc/mod_irc_odbc.erl:799 mod_irc/mod_irc_odbc.erl:803
msgid "Join the IRC channel here."
msgstr "Propojiť IRC kanál sem."
#: mod_irc/mod_irc.erl:778 mod_irc/mod_irc_odbc.erl:807
msgid "Join the IRC channel in this Jabber ID: ~s"
msgstr "Pripojit IRC kanál k tomuto Jabber ID: ~s"
#: mod_irc/mod_irc.erl:863 mod_irc/mod_irc_odbc.erl:904
msgid "IRC settings"
msgstr "Nastavania IRC"
#: mod_irc/mod_irc.erl:868 mod_irc/mod_irc_odbc.erl:909
msgid ""
"Enter username and encodings you wish to use for connecting to IRC servers. "
"Press 'Next' to get more fields to fill in. Press 'Complete' to save "
"settings."
msgstr ""
"Vložte meno používateľa a kódovanie, ktoré chcete používať pri pripojení na "
"IRC servery. Kliknutím na tlačítko 'Ďalej' môžete zadať niektoré ďalšie "
"hodnoty. Pomocou 'Ukončiť ' uložíte nastavenia."
#: mod_irc/mod_irc.erl:874 mod_irc/mod_irc_odbc.erl:915
msgid "IRC username"
msgstr "IRC prezývka"
#: mod_irc/mod_irc.erl:923 mod_irc/mod_irc_odbc.erl:964
msgid "Password ~b"
msgstr "Heslo ~b"
#: mod_irc/mod_irc.erl:928 mod_irc/mod_irc_odbc.erl:969
msgid "Port ~b"
msgstr "Port ~b"
#: mod_irc/mod_irc.erl:933 mod_irc/mod_irc_odbc.erl:974
msgid "Encoding for server ~b"
msgstr "Kódovanie pre server ~b"
#: mod_irc/mod_irc.erl:942 mod_irc/mod_irc_odbc.erl:983
msgid "Server ~b"
msgstr "Server ~b"
#: mod_muc/mod_muc.erl:449 mod_muc/mod_muc_odbc.erl:456
msgid "Only service administrators are allowed to send service messages"
msgstr "Iba správcovia služby majú povolené odosielanie servisných správ"
#: mod_muc/mod_muc.erl:493 mod_muc/mod_muc_odbc.erl:500
msgid "Room creation is denied by service policy"
msgstr "Vytváranie miestnosti nie je povolené"
#: mod_muc/mod_muc.erl:500 mod_muc/mod_muc_odbc.erl:507
msgid "Conference room does not exist"
msgstr "Diskusná miestnosť neexistuje"
#: mod_muc/mod_muc.erl:582 mod_muc/mod_muc_odbc.erl:595
msgid "Chatrooms"
msgstr "Diskusné miestnosti"
#: mod_muc/mod_muc.erl:712 mod_muc/mod_muc_odbc.erl:729
#, fuzzy
msgid "You need a client that supports x:data to register the nickname"
msgstr "Na registráciu prezývky potrebujete klienta podporujúceho z x:data"
#: mod_muc/mod_muc.erl:718 mod_muc/mod_muc_odbc.erl:735
msgid "Nickname Registration at "
msgstr "Registrácia prezývky na "
#: mod_muc/mod_muc.erl:722 mod_muc/mod_muc_odbc.erl:739
msgid "Enter nickname you want to register"
msgstr "Zadajte prezývku, ktorú chcete registrovať"
#: mod_muc/mod_muc.erl:723 mod_muc/mod_muc_odbc.erl:740
#: mod_muc/mod_muc_room.erl:3810 mod_roster.erl:944 mod_roster_odbc.erl:1061
#: mod_vcard.erl:364 mod_vcard.erl:477 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:453
msgid "Nickname"
msgstr "Prezývka"
#: mod_muc/mod_muc.erl:762 mod_muc/mod_muc_odbc.erl:784
#: mod_muc/mod_muc_room.erl:1064 mod_muc/mod_muc_room.erl:1787
msgid "That nickname is registered by another person"
msgstr "Prezývka je už zaregistrovaná inou osobou"
#: mod_muc/mod_muc.erl:788 mod_muc/mod_muc_odbc.erl:811
msgid "You must fill in field \"Nickname\" in the form"
msgstr "Musíte vyplniť políčko \"Prezývka\" vo formulári"
#: mod_muc/mod_muc.erl:808 mod_muc/mod_muc_odbc.erl:831
msgid "ejabberd MUC module"
msgstr "ejabberd MUC modul"
#: mod_muc/mod_muc_log.erl:374 mod_muc/mod_muc_log.erl:381
msgid "Chatroom configuration modified"
msgstr "Nastavenie diskusnej miestnosti bolo zmenené"
#: mod_muc/mod_muc_log.erl:384
msgid "joins the room"
msgstr "vstúpil(a) do miestnosti"
#: mod_muc/mod_muc_log.erl:387 mod_muc/mod_muc_log.erl:390
msgid "leaves the room"
msgstr "odišiel(a) z miestnosti"
#: mod_muc/mod_muc_log.erl:393 mod_muc/mod_muc_log.erl:396
msgid "has been banned"
msgstr "bol(a) zablokovaný(á)"
#: mod_muc/mod_muc_log.erl:399 mod_muc/mod_muc_log.erl:402
msgid "has been kicked"
msgstr "bol(a) vyhodený(á) z miestnosti"
#: mod_muc/mod_muc_log.erl:405
msgid "has been kicked because of an affiliation change"
msgstr "bol vyhodený(á) kvôli zmene priradenia"
#: mod_muc/mod_muc_log.erl:408
msgid "has been kicked because the room has been changed to members-only"
msgstr "bol vyhodený(á), pretože miestnosť bola vyhradená len pre členov"
#: mod_muc/mod_muc_log.erl:411
msgid "has been kicked because of a system shutdown"
msgstr "bol vyhodený(á) kvôli reštartu systému"
#: mod_muc/mod_muc_log.erl:414
msgid "is now known as"
msgstr "sa premenoval(a) na"
#: mod_muc/mod_muc_log.erl:417 mod_muc/mod_muc_log.erl:688
#: mod_muc/mod_muc_room.erl:2393
msgid " has set the subject to: "
msgstr "zmenil(a) tému na: "
#: mod_muc/mod_muc_log.erl:452
msgid "Chatroom is created"
msgstr "Diskusná miestnosť je vytvorená"
#: mod_muc/mod_muc_log.erl:453
msgid "Chatroom is destroyed"
msgstr "Diskusná miestnosť je zrušená"
#: mod_muc/mod_muc_log.erl:454
msgid "Chatroom is started"
msgstr "Diskusná miestnosť je obnovená"
#: mod_muc/mod_muc_log.erl:455
msgid "Chatroom is stopped"
msgstr "Diskusná miestnosť je pozastavená"
#: mod_muc/mod_muc_log.erl:459
msgid "Monday"
msgstr "Pondelok"
#: mod_muc/mod_muc_log.erl:460
msgid "Tuesday"
msgstr "Utorok"
#: mod_muc/mod_muc_log.erl:461
msgid "Wednesday"
msgstr "Streda"
#: mod_muc/mod_muc_log.erl:462
msgid "Thursday"
msgstr "Štvrtok"
#: mod_muc/mod_muc_log.erl:463
msgid "Friday"
msgstr "Piatok"
#: mod_muc/mod_muc_log.erl:464
msgid "Saturday"
msgstr "Sobota"
#: mod_muc/mod_muc_log.erl:465
msgid "Sunday"
msgstr "Nedeľa"
#: mod_muc/mod_muc_log.erl:469
msgid "January"
msgstr "Január"
#: mod_muc/mod_muc_log.erl:470
msgid "February"
msgstr "Február"
#: mod_muc/mod_muc_log.erl:471
msgid "March"
msgstr "Marec"
#: mod_muc/mod_muc_log.erl:472
msgid "April"
msgstr "Apríl"
#: mod_muc/mod_muc_log.erl:473
msgid "May"
msgstr "Máj"
#: mod_muc/mod_muc_log.erl:474
msgid "June"
msgstr "Jún"
#: mod_muc/mod_muc_log.erl:475
msgid "July"
msgstr "Júl"
#: mod_muc/mod_muc_log.erl:476
msgid "August"
msgstr "August"
#: mod_muc/mod_muc_log.erl:477
msgid "September"
msgstr "September"
#: mod_muc/mod_muc_log.erl:478
msgid "October"
msgstr "Október"
#: mod_muc/mod_muc_log.erl:479
msgid "November"
msgstr "November"
#: mod_muc/mod_muc_log.erl:480
msgid "December"
msgstr "December"
#: mod_muc/mod_muc_log.erl:750
msgid "Room Configuration"
msgstr "Nastavenia miestnosti"
#: mod_muc/mod_muc_log.erl:759
msgid "Room Occupants"
msgstr "Ľudí v miestnosti"
#: mod_muc/mod_muc_room.erl:174
msgid "Traffic rate limit is exceeded"
msgstr "Bol prekročený prenosový limit"
#: mod_muc/mod_muc_room.erl:246
msgid ""
"This participant is kicked from the room because he sent an error message"
msgstr "Účastník bol vyhodený z miestnosti, pretože poslal chybovú správu"
#: mod_muc/mod_muc_room.erl:255
msgid "It is not allowed to send private messages to the conference"
msgstr "Nie je povolené odosielať súkromné správy do konferencie"
#: mod_muc/mod_muc_room.erl:332
msgid "Please, wait for a while before sending new voice request"
msgstr ""
#: mod_muc/mod_muc_room.erl:347
msgid "Voice requests are disabled in this conference"
msgstr ""
#: mod_muc/mod_muc_room.erl:364
msgid "Failed to extract JID from your voice request approval"
msgstr ""
#: mod_muc/mod_muc_room.erl:393
msgid "Only moderators can approve voice requests"
msgstr ""
#: mod_muc/mod_muc_room.erl:408
msgid "Improper message type"
msgstr "Nesprávny typ správy"
#: mod_muc/mod_muc_room.erl:518
msgid ""
"This participant is kicked from the room because he sent an error message to "
"another participant"
msgstr ""
"Účastník bol vyhodený z miestnosti, pretože poslal chybovú správu inému "
"účastníkovi"
#: mod_muc/mod_muc_room.erl:531
msgid "It is not allowed to send private messages of type \"groupchat\""
msgstr "Nie je dovolené odoslanie súkromnej správy typu \"Skupinová správa\" "
#: mod_muc/mod_muc_room.erl:543 mod_muc/mod_muc_room.erl:611
msgid "Recipient is not in the conference room"
msgstr "Príjemca sa nenachádza v konferenčnej miestnosti"
#: mod_muc/mod_muc_room.erl:564 mod_muc/mod_muc_room.erl:585
msgid "It is not allowed to send private messages"
msgstr "Nieje povolené posielať súkromné správy"
#: mod_muc/mod_muc_room.erl:576 mod_muc/mod_muc_room.erl:956
#: mod_muc/mod_muc_room.erl:4040
msgid "Only occupants are allowed to send messages to the conference"
msgstr "Len členovia majú povolené zasielať správy do konferencie"
#: mod_muc/mod_muc_room.erl:634
msgid "Only occupants are allowed to send queries to the conference"
msgstr "Len členovia majú povolené dotazovať sa o konferencii"
#: mod_muc/mod_muc_room.erl:646
msgid "Queries to the conference members are not allowed in this room"
msgstr "Dotazovať sa o členoch nie je v tejto miestnosti povolené"
#: mod_muc/mod_muc_room.erl:932
msgid ""
"Only moderators and participants are allowed to change the subject in this "
"room"
msgstr "Len moderátori a zúčastnený majú povolené meniť tému tejto miestnosti"
#: mod_muc/mod_muc_room.erl:937
msgid "Only moderators are allowed to change the subject in this room"
msgstr "Len moderátori majú povolené meniť tému miestnosti"
#: mod_muc/mod_muc_room.erl:947
msgid "Visitors are not allowed to send messages to all occupants"
msgstr ""
"Návštevníci nemajú povolené zasielať správy všetkým prihláseným do "
"konferencie"
#: mod_muc/mod_muc_room.erl:1021
msgid ""
"This participant is kicked from the room because he sent an error presence"
msgstr ""
"Účastník bol vyhodený z miestnosti, pretože poslal chybovú správu o stave"
#: mod_muc/mod_muc_room.erl:1040
msgid "Visitors are not allowed to change their nicknames in this room"
msgstr "V tejto miestnosti nieje povolené meniť prezývky"
#: mod_muc/mod_muc_room.erl:1053 mod_muc/mod_muc_room.erl:1779
msgid "That nickname is already in use by another occupant"
msgstr "Prezývka je už používaná iným členom"
#: mod_muc/mod_muc_room.erl:1768
msgid "You have been banned from this room"
msgstr "Boli ste vylúčený z tejto miestnosti"
#: mod_muc/mod_muc_room.erl:1771
msgid "Membership is required to enter this room"
msgstr "Pre vstup do miestnosti je potrebné byť členom"
#: mod_muc/mod_muc_room.erl:1807
msgid "This room is not anonymous"
msgstr "Táto miestnosť nie je anonymná"
#: mod_muc/mod_muc_room.erl:1833
msgid "A password is required to enter this room"
msgstr "Pre vstup do miestnosti je potrebné heslo"
#: mod_muc/mod_muc_room.erl:1855 mod_register.erl:246
msgid "Too many CAPTCHA requests"
msgstr ""
#: mod_muc/mod_muc_room.erl:1864 mod_register.erl:251
#, fuzzy
msgid "Unable to generate a CAPTCHA"
msgstr "Nepodarilo sa vygenerovat CAPTCHA"
#: mod_muc/mod_muc_room.erl:1874
msgid "Incorrect password"
msgstr "Nesprávne heslo"
#: mod_muc/mod_muc_room.erl:2448
msgid "Administrator privileges required"
msgstr "Sú potrebné práva administrátora"
#: mod_muc/mod_muc_room.erl:2463
msgid "Moderator privileges required"
msgstr "Sú potrebné práva moderátora"
#: mod_muc/mod_muc_room.erl:2619
msgid "Jabber ID ~s is invalid"
msgstr "Jabber ID ~s je neplatné"
#: mod_muc/mod_muc_room.erl:2633
msgid "Nickname ~s does not exist in the room"
msgstr "Prezývka ~s v miestnosti neexistuje"
#: mod_muc/mod_muc_room.erl:2659 mod_muc/mod_muc_room.erl:3049
msgid "Invalid affiliation: ~s"
msgstr "Neplatné priradenie: ~s"
#: mod_muc/mod_muc_room.erl:2713
msgid "Invalid role: ~s"
msgstr "Neplatná rola: ~s"
#: mod_muc/mod_muc_room.erl:3026 mod_muc/mod_muc_room.erl:3062
msgid "Owner privileges required"
msgstr "Sú vyžadované práva vlastníka"
#: mod_muc/mod_muc_room.erl:3195
msgid "Configuration of room ~s"
msgstr "Konfigurácia miestnosti ~s"
#: mod_muc/mod_muc_room.erl:3200
msgid "Room title"
msgstr "Názov miestnosti"
#: mod_muc/mod_muc_room.erl:3203 mod_muc/mod_muc_room.erl:3692
msgid "Room description"
msgstr "Popis miestnosti"
#: mod_muc/mod_muc_room.erl:3210
msgid "Make room persistent"
msgstr "Nastaviť miestnosť ako trvalú"
#: mod_muc/mod_muc_room.erl:3215
msgid "Make room public searchable"
msgstr "Nastaviť miestnosť ako verejne prehľadávateľnú"
#: mod_muc/mod_muc_room.erl:3218
msgid "Make participants list public"
msgstr "Nastaviť zoznam zúčastnených ako verejný"
#: mod_muc/mod_muc_room.erl:3221
msgid "Make room password protected"
msgstr "Chrániť miestnosť heslom"
#: mod_muc/mod_muc_room.erl:3232
msgid "Maximum Number of Occupants"
msgstr "Počet účastníkov"
#: mod_muc/mod_muc_room.erl:3239
msgid "No limit"
msgstr "Bez limitu"
#: mod_muc/mod_muc_room.erl:3250
msgid "Present real Jabber IDs to"
msgstr "Zobrazovať skutočné Jabber ID"
#: mod_muc/mod_muc_room.erl:3258 mod_muc/mod_muc_room.erl:3292
msgid "moderators only"
msgstr "moderátorom"
#: mod_muc/mod_muc_room.erl:3260 mod_muc/mod_muc_room.erl:3294
msgid "anyone"
msgstr "všetkým"
#: mod_muc/mod_muc_room.erl:3262
msgid "Make room members-only"
msgstr "Nastaviť miestnosť len pre členov"
#: mod_muc/mod_muc_room.erl:3265
msgid "Make room moderated"
msgstr "Nastaviť miestnosť ako moderovanú"
#: mod_muc/mod_muc_room.erl:3268
msgid "Default users as participants"
msgstr "Užívatelia sú implicitne členmi"
#: mod_muc/mod_muc_room.erl:3271
msgid "Allow users to change the subject"
msgstr "Povoliť užívateľom meniť tému"
#: mod_muc/mod_muc_room.erl:3274
msgid "Allow users to send private messages"
msgstr "Povoliť užívateľom odosielať súkromné správy"
#: mod_muc/mod_muc_room.erl:3279
#, fuzzy
msgid "Allow visitors to send private messages to"
msgstr "Povoliť užívateľom odosielať súkromné správy"
#: mod_muc/mod_muc_room.erl:3290
msgid "nobody"
msgstr ""
#: mod_muc/mod_muc_room.erl:3296
msgid "Allow users to query other users"
msgstr "Povoliť užívateľom dotazovať sa informácie o iných užívateľoch"
#: mod_muc/mod_muc_room.erl:3299
msgid "Allow users to send invites"
msgstr "Povoliť používateľom posielanie pozvánok"
#: mod_muc/mod_muc_room.erl:3302
msgid "Allow visitors to send status text in presence updates"
msgstr "Návštevníci môžu posielať textové informácie v stavových správach"
#: mod_muc/mod_muc_room.erl:3305
msgid "Allow visitors to change nickname"
msgstr "Návštevníci môžu meniť prezývky"
#: mod_muc/mod_muc_room.erl:3308
#, fuzzy
msgid "Allow visitors to send voice requests"
msgstr "Povoliť používateľom posielanie pozvánok"
#: mod_muc/mod_muc_room.erl:3311
msgid "Minimum interval between voice requests (in seconds)"
msgstr ""
#: mod_muc/mod_muc_room.erl:3317
msgid "Make room CAPTCHA protected"
msgstr "Chrániť miestnosť systémom CAPTCHA"
#: mod_muc/mod_muc_room.erl:3322
msgid "Exclude Jabber IDs from CAPTCHA challenge"
msgstr ""
#: mod_muc/mod_muc_room.erl:3329
msgid "Enable logging"
msgstr "Zapnúť zaznamenávanie histórie"
#: mod_muc/mod_muc_room.erl:3337
msgid "You need an x:data capable client to configure room"
msgstr "Na konfiguráciu miestnosti potrebujete klienta podporujúceho x:data"
#: mod_muc/mod_muc_room.erl:3694
msgid "Number of occupants"
msgstr "Počet zúčastnených"
#: mod_muc/mod_muc_room.erl:3750
msgid "private, "
msgstr "súkromná, "
#: mod_muc/mod_muc_room.erl:3799
msgid "Voice request"
msgstr ""
#: mod_muc/mod_muc_room.erl:3803
msgid "Either approve or decline the voice request."
msgstr ""
#: mod_muc/mod_muc_room.erl:3809
#, fuzzy
msgid "User JID"
msgstr "Používateľ "
#: mod_muc/mod_muc_room.erl:3811
msgid "Grant voice to this person?"
msgstr ""
#: mod_muc/mod_muc_room.erl:3960
msgid "~s invites you to the room ~s"
msgstr "~s Vás pozýva do miestnosti ~s"
#: mod_muc/mod_muc_room.erl:3969
msgid "the password is"
msgstr "heslo je"
#: mod_offline.erl:510 mod_offline_odbc.erl:352
msgid ""
"Your contact offline message queue is full. The message has been discarded."
msgstr "Fronta offline správ tohoto kontaktu je plná. Správa bola zahodená."
#: mod_offline.erl:560 mod_offline_odbc.erl:408
msgid "~s's Offline Messages Queue"
msgstr "~s Offline správy"
#: mod_offline.erl:563 mod_offline_odbc.erl:411 mod_roster.erl:987
#: mod_roster_odbc.erl:1104 mod_shared_roster.erl:901
#: mod_shared_roster.erl:1010 mod_shared_roster_odbc.erl:930
#: mod_shared_roster_odbc.erl:1039 web/ejabberd_web_admin.erl:833
#: web/ejabberd_web_admin.erl:874 web/ejabberd_web_admin.erl:942
#: web/ejabberd_web_admin.erl:978 web/ejabberd_web_admin.erl:1019
#: web/ejabberd_web_admin.erl:1508 web/ejabberd_web_admin.erl:1760
#: web/ejabberd_web_admin.erl:1931 web/ejabberd_web_admin.erl:1963
#: web/ejabberd_web_admin.erl:2031 web/ejabberd_web_admin.erl:2135
#: web/ejabberd_web_admin.erl:2160 web/ejabberd_web_admin.erl:2248
msgid "Submitted"
msgstr "Odoslané"
#: mod_offline.erl:571
msgid "Time"
msgstr "Čas"
#: mod_offline.erl:572
msgid "From"
msgstr "Od"
#: mod_offline.erl:573
msgid "To"
msgstr "Pre"
#: mod_offline.erl:574 mod_offline_odbc.erl:419
msgid "Packet"
msgstr "Paket"
#: mod_offline.erl:587 mod_offline_odbc.erl:432 mod_shared_roster.erl:908
#: mod_shared_roster_odbc.erl:937 web/ejabberd_web_admin.erl:882
#: web/ejabberd_web_admin.erl:986
msgid "Delete Selected"
msgstr "Zmazať vybrané"
#: mod_offline.erl:645 mod_offline_odbc.erl:519
msgid "Offline Messages:"
msgstr "Offline správy"
#: mod_offline.erl:645 mod_offline_odbc.erl:519
msgid "Remove All Offline Messages"
msgstr "Odstrániť všetky offline správy"
#: mod_proxy65/mod_proxy65_service.erl:213
msgid "ejabberd SOCKS5 Bytestreams module"
msgstr "ejabberd SOCKS5 Bytestreams modul"
#: mod_pubsub/mod_pubsub.erl:1120 mod_pubsub/mod_pubsub_odbc.erl:929
msgid "Publish-Subscribe"
msgstr "Publish-Subscribe"
#: mod_pubsub/mod_pubsub.erl:1214 mod_pubsub/mod_pubsub_odbc.erl:1025
msgid "ejabberd Publish-Subscribe module"
msgstr "ejabberd Publish-Subscribe modul"
#: mod_pubsub/mod_pubsub.erl:1497 mod_pubsub/mod_pubsub_odbc.erl:1312
msgid "PubSub subscriber request"
msgstr "Žiadosť odberateľa PubSub"
#: mod_pubsub/mod_pubsub.erl:1499 mod_pubsub/mod_pubsub_odbc.erl:1314
msgid "Choose whether to approve this entity's subscription."
msgstr "Zvolte, či chcete povoliť toto odoberanie"
#: mod_pubsub/mod_pubsub.erl:1505 mod_pubsub/mod_pubsub_odbc.erl:1320
msgid "Node ID"
msgstr "ID uzlu"
#: mod_pubsub/mod_pubsub.erl:1510 mod_pubsub/mod_pubsub_odbc.erl:1325
msgid "Subscriber Address"
msgstr "Adresa odberateľa"
#: mod_pubsub/mod_pubsub.erl:1516 mod_pubsub/mod_pubsub_odbc.erl:1331
msgid "Allow this Jabber ID to subscribe to this pubsub node?"
msgstr "Dovoliť tomuto Jabber ID odoberať PubSub uzol?"
#: mod_pubsub/mod_pubsub.erl:3474 mod_pubsub/mod_pubsub_odbc.erl:3287
msgid "Deliver payloads with event notifications"
msgstr "Doručiť náklad s upozornením na udalosť"
#: mod_pubsub/mod_pubsub.erl:3475 mod_pubsub/mod_pubsub_odbc.erl:3288
msgid "Deliver event notifications"
msgstr "Doručiť oznamy o udalosti"
#: mod_pubsub/mod_pubsub.erl:3476 mod_pubsub/mod_pubsub_odbc.erl:3289
msgid "Notify subscribers when the node configuration changes"
msgstr "Upozorniť prihlásených používateľov na zmenu nastavenia uzlu"
#: mod_pubsub/mod_pubsub.erl:3477 mod_pubsub/mod_pubsub_odbc.erl:3290
msgid "Notify subscribers when the node is deleted"
msgstr "Upozorniť prihlásených používateľov na zmazanie uzlu"
#: mod_pubsub/mod_pubsub.erl:3478 mod_pubsub/mod_pubsub_odbc.erl:3291
msgid "Notify subscribers when items are removed from the node"
msgstr "Upozorniť prihlásených používateľov na odstránenie položiek z uzlu"
#: mod_pubsub/mod_pubsub.erl:3479 mod_pubsub/mod_pubsub_odbc.erl:3292
msgid "Persist items to storage"
msgstr "Uložiť položky natrvalo do úložiska"
#: mod_pubsub/mod_pubsub.erl:3480 mod_pubsub/mod_pubsub_odbc.erl:3293
msgid "A friendly name for the node"
msgstr "Prístupný názov pre uzol"
#: mod_pubsub/mod_pubsub.erl:3481 mod_pubsub/mod_pubsub_odbc.erl:3294
msgid "Max # of items to persist"
msgstr "Maximálny počet položiek, ktoré je možné natrvalo uložiť"
#: mod_pubsub/mod_pubsub.erl:3482 mod_pubsub/mod_pubsub_odbc.erl:3295
msgid "Whether to allow subscriptions"
msgstr "Povoliť prihlasovanie"
#: mod_pubsub/mod_pubsub.erl:3483 mod_pubsub/mod_pubsub_odbc.erl:3296
msgid "Specify the access model"
msgstr "Uveďte model prístupu"
#: mod_pubsub/mod_pubsub.erl:3486 mod_pubsub/mod_pubsub_odbc.erl:3299
msgid "Roster groups allowed to subscribe"
msgstr "Skupiny kontaktov, ktoré môžu odoberať"
#: mod_pubsub/mod_pubsub.erl:3487 mod_pubsub/mod_pubsub_odbc.erl:3300
msgid "Specify the publisher model"
msgstr "Špecifikovať model publikovania"
#: mod_pubsub/mod_pubsub.erl:3489 mod_pubsub/mod_pubsub_odbc.erl:3302
msgid "Purge all items when the relevant publisher goes offline"
msgstr ""
"Odstrániť všetky relevantné položky, keď užívateľ prejde do módu offline"
#: mod_pubsub/mod_pubsub.erl:3490 mod_pubsub/mod_pubsub_odbc.erl:3303
msgid "Specify the event message type"
msgstr "Uveďte typ pre správu o udalosti"
#: mod_pubsub/mod_pubsub.erl:3492 mod_pubsub/mod_pubsub_odbc.erl:3305
msgid "Max payload size in bytes"
msgstr "Maximálny náklad v bajtoch"
#: mod_pubsub/mod_pubsub.erl:3493 mod_pubsub/mod_pubsub_odbc.erl:3306
msgid "When to send the last published item"
msgstr "Kedy odoslať posledne publikovanú položku"
#: mod_pubsub/mod_pubsub.erl:3495 mod_pubsub/mod_pubsub_odbc.erl:3308
msgid "Only deliver notifications to available users"
msgstr "Doručovať upozornenia len aktuálne prihláseným používateľom"
#: mod_pubsub/mod_pubsub.erl:3496 mod_pubsub/mod_pubsub_odbc.erl:3309
msgid "The collections with which a node is affiliated"
msgstr "Kolekcie asociované s uzlom"
#: mod_register.erl:193
msgid "The CAPTCHA verification has failed"
msgstr ""
#: mod_register.erl:220
#, fuzzy
msgid "You need a client that supports x:data and CAPTCHA to register"
msgstr "Na registráciu prezývky potrebujete klienta podporujúceho z x:data"
#: mod_register.erl:226 mod_register.erl:265
msgid "Choose a username and password to register with this server"
msgstr "Zvolte meno užívateľa a heslo pre registráciu na tomto servere"
#: mod_register.erl:230 mod_vcard.erl:364 mod_vcard_odbc.erl:342
#: web/ejabberd_web_admin.erl:1515 web/ejabberd_web_admin.erl:1572
msgid "User"
msgstr "Užívateľ"
#: mod_register.erl:316 mod_register.erl:361
#, fuzzy
msgid "The password is too weak"
msgstr "heslo je"
#: mod_register.erl:365
msgid "Users are not allowed to register accounts so quickly"
msgstr "Nieje dovolené vytvárať účty tak rýchlo po sebe"
#: mod_roster.erl:938 mod_roster_odbc.erl:1055 web/ejabberd_web_admin.erl:1701
#: web/ejabberd_web_admin.erl:1886 web/ejabberd_web_admin.erl:1897
#: web/ejabberd_web_admin.erl:2219
msgid "None"
msgstr "Nič"
#: mod_roster.erl:945 mod_roster_odbc.erl:1062
msgid "Subscription"
msgstr "Prihlásenie"
#: mod_roster.erl:946 mod_roster_odbc.erl:1063
msgid "Pending"
msgstr "Čakajúce"
#: mod_roster.erl:947 mod_roster_odbc.erl:1064
msgid "Groups"
msgstr "Skupiny"
#: mod_roster.erl:974 mod_roster_odbc.erl:1091
msgid "Validate"
msgstr "Overiť"
#: mod_roster.erl:982 mod_roster_odbc.erl:1099
msgid "Remove"
msgstr "Odstrániť"
#: mod_roster.erl:985 mod_roster_odbc.erl:1102
msgid "Roster of "
msgstr "Zoznam kontaktov "
#: mod_roster.erl:988 mod_roster_odbc.erl:1105 mod_shared_roster.erl:902
#: mod_shared_roster.erl:1011 mod_shared_roster_odbc.erl:931
#: mod_shared_roster_odbc.erl:1040 web/ejabberd_web_admin.erl:834
#: web/ejabberd_web_admin.erl:875 web/ejabberd_web_admin.erl:943
#: web/ejabberd_web_admin.erl:979 web/ejabberd_web_admin.erl:1020
#: web/ejabberd_web_admin.erl:1509 web/ejabberd_web_admin.erl:1761
#: web/ejabberd_web_admin.erl:1932 web/ejabberd_web_admin.erl:2136
#: web/ejabberd_web_admin.erl:2161
msgid "Bad format"
msgstr "Zlý formát"
#: mod_roster.erl:995 mod_roster_odbc.erl:1112
msgid "Add Jabber ID"
msgstr "Pridať Jabber ID"
#: mod_roster.erl:1094 mod_roster_odbc.erl:1211
msgid "Roster"
msgstr "Zoznam kontaktov"
#: mod_shared_roster.erl:857 mod_shared_roster.erl:899
#: mod_shared_roster.erl:1007 mod_shared_roster_odbc.erl:886
#: mod_shared_roster_odbc.erl:928 mod_shared_roster_odbc.erl:1036
msgid "Shared Roster Groups"
msgstr "Skupiny pre zdieľaný zoznam kontaktov"
#: mod_shared_roster.erl:895 mod_shared_roster_odbc.erl:924
#: web/ejabberd_web_admin.erl:1365 web/ejabberd_web_admin.erl:2461
msgid "Add New"
msgstr "Pridať nový"
#: mod_shared_roster.erl:978 mod_shared_roster_odbc.erl:1007
msgid "Name:"
msgstr "Meno:"
#: mod_shared_roster.erl:983 mod_shared_roster_odbc.erl:1012
msgid "Description:"
msgstr "Popis:"
#: mod_shared_roster.erl:991 mod_shared_roster_odbc.erl:1020
msgid "Members:"
msgstr "Členovia:"
#: mod_shared_roster.erl:999 mod_shared_roster_odbc.erl:1028
msgid "Displayed Groups:"
msgstr "Zobrazené skupiny:"
#: mod_shared_roster.erl:1008 mod_shared_roster_odbc.erl:1037
msgid "Group "
msgstr "Skupina "
#: mod_shared_roster.erl:1017 mod_shared_roster_odbc.erl:1046
#: web/ejabberd_web_admin.erl:840 web/ejabberd_web_admin.erl:884
#: web/ejabberd_web_admin.erl:949 web/ejabberd_web_admin.erl:1026
#: web/ejabberd_web_admin.erl:2017
msgid "Submit"
msgstr "Odoslať"
#: mod_vcard.erl:165 mod_vcard_ldap.erl:238 mod_vcard_odbc.erl:129
msgid "Erlang Jabber Server"
msgstr "Erlang Jabber Server"
#: mod_vcard.erl:364 mod_vcard.erl:478 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:454
msgid "Birthday"
msgstr "Dátum narodenia"
#: mod_vcard.erl:364 mod_vcard.erl:480 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:456
msgid "City"
msgstr "Mesto"
#: mod_vcard.erl:364 mod_vcard.erl:479 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:455
msgid "Country"
msgstr "Krajina"
#: mod_vcard.erl:364 mod_vcard.erl:481 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:457
msgid "Email"
msgstr "E-mail"
#: mod_vcard.erl:364 mod_vcard.erl:476 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:452
msgid "Family Name"
msgstr "Priezvisko"
#: mod_vcard.erl:364 mod_vcard_odbc.erl:342
msgid ""
"Fill in the form to search for any matching Jabber User (Add * to the end of "
"field to match substring)"
msgstr ""
"Pre vyhľadanie Jabber používateľa vyplňte formulár (pridajte znak * na "
"koniec, pre vyhľadanie podreťazca)"
#: mod_vcard.erl:364 mod_vcard.erl:473 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:449
msgid "Full Name"
msgstr "Celé meno: "
#: mod_vcard.erl:364 mod_vcard.erl:475 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:451
msgid "Middle Name"
msgstr "Prostredné meno: "
#: mod_vcard.erl:364 mod_vcard.erl:474 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:450 web/ejabberd_web_admin.erl:2006
msgid "Name"
msgstr "Meno"
#: mod_vcard.erl:364 mod_vcard.erl:482 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:458
msgid "Organization Name"
msgstr "Meno organizácie: "
#: mod_vcard.erl:364 mod_vcard.erl:483 mod_vcard_odbc.erl:342
#: mod_vcard_odbc.erl:459
msgid "Organization Unit"
msgstr "Organizačná jednotka: "
#: mod_vcard.erl:364 mod_vcard_ldap.erl:462 mod_vcard_odbc.erl:342
msgid "Search users in "
msgstr "Hľadať užívateľov v "
#: mod_vcard.erl:364 mod_vcard_ldap.erl:462 mod_vcard_odbc.erl:342
msgid "You need an x:data capable client to search"
msgstr "Na vyhľadávanie potrebujete klienta podporujúceho x:data"
#: mod_vcard.erl:389 mod_vcard_ldap.erl:487 mod_vcard_odbc.erl:367
msgid "vCard User Search"
msgstr "Hľadať užívateľov vo vCard"
#: mod_vcard.erl:445 mod_vcard_ldap.erl:541 mod_vcard_odbc.erl:421
msgid "ejabberd vCard module"
msgstr "ejabberd vCard modul"
#: mod_vcard.erl:469 mod_vcard_ldap.erl:551 mod_vcard_odbc.erl:445
msgid "Search Results for "
msgstr "Hľadať výsledky pre "
#: mod_vcard_ldap.erl:462
msgid "Fill in fields to search for any matching Jabber User"
msgstr "Vyplnte políčka pre vyhľadávanie Jabber užívateľa"
#: web/ejabberd_web_admin.erl:193 web/ejabberd_web_admin.erl:203
#: web/ejabberd_web_admin.erl:219 web/ejabberd_web_admin.erl:229
msgid "Unauthorized"
msgstr "Neautorizovaný"
#: web/ejabberd_web_admin.erl:286 web/ejabberd_web_admin.erl:303
msgid "ejabberd Web Admin"
msgstr "ejabberd Web Admin"
#: web/ejabberd_web_admin.erl:769 web/ejabberd_web_admin.erl:780
msgid "Administration"
msgstr "Administrácia"
#: web/ejabberd_web_admin.erl:878 web/ejabberd_web_admin.erl:982
msgid "Raw"
msgstr "Raw"
#: web/ejabberd_web_admin.erl:1017
msgid "~s access rule configuration"
msgstr "~s konfigurácia prístupového pravidla"
#: web/ejabberd_web_admin.erl:1035
msgid "Virtual Hosts"
msgstr "Virtuálne servery"
#: web/ejabberd_web_admin.erl:1043 web/ejabberd_web_admin.erl:1050
msgid "Users"
msgstr "Používatelia"
#: web/ejabberd_web_admin.erl:1078
msgid "Users Last Activity"
msgstr "Posledná aktivita používateľa"
#: web/ejabberd_web_admin.erl:1080
msgid "Period: "
msgstr "Čas:"
#: web/ejabberd_web_admin.erl:1090
msgid "Last month"
msgstr "Posledný mesiac"
#: web/ejabberd_web_admin.erl:1091
msgid "Last year"
msgstr "Posledný rok"
#: web/ejabberd_web_admin.erl:1092
msgid "All activity"
msgstr "Všetky aktivity"
#: web/ejabberd_web_admin.erl:1094
msgid "Show Ordinary Table"
msgstr "Zobraziť bežnú tabuľku"
#: web/ejabberd_web_admin.erl:1096
msgid "Show Integral Table"
msgstr "Zobraziť kompletnú tabuľku"
#: web/ejabberd_web_admin.erl:1105 web/ejabberd_web_admin.erl:1939
msgid "Statistics"
msgstr "Štatistiky"
#: web/ejabberd_web_admin.erl:1117
msgid "Not Found"
msgstr "Nebol nájdený"
#: web/ejabberd_web_admin.erl:1134
msgid "Node not found"
msgstr "Uzol nenájdený"
#: web/ejabberd_web_admin.erl:1460
msgid "Host"
msgstr "Server"
#: web/ejabberd_web_admin.erl:1461
msgid "Registered Users"
msgstr "Registrovaní používatelia"
#: web/ejabberd_web_admin.erl:1573
msgid "Offline Messages"
msgstr "Offline správy"
#: web/ejabberd_web_admin.erl:1574 web/ejabberd_web_admin.erl:1767
msgid "Last Activity"
msgstr "Posledná aktivita"
#: web/ejabberd_web_admin.erl:1659 web/ejabberd_web_admin.erl:1675
msgid "Registered Users:"
msgstr "Registrovaní používatelia:"
#: web/ejabberd_web_admin.erl:1661 web/ejabberd_web_admin.erl:1677
#: web/ejabberd_web_admin.erl:2192
msgid "Online Users:"
msgstr "Online používatelia:"
#: web/ejabberd_web_admin.erl:1663
msgid "Outgoing s2s Connections:"
msgstr "Odchádzajúce s2s spojenia:"
#: web/ejabberd_web_admin.erl:1665
msgid "Outgoing s2s Servers:"
msgstr "Odchádzajúce s2s servery:"
#: web/ejabberd_web_admin.erl:1734 web/mod_register_web.erl:175
#: web/mod_register_web.erl:372 web/mod_register_web.erl:381
#: web/mod_register_web.erl:411
msgid "Change Password"
msgstr "Zmeniť heslo"
#: web/ejabberd_web_admin.erl:1758
msgid "User "
msgstr "Používateľ "
#: web/ejabberd_web_admin.erl:1765
msgid "Connected Resources:"
msgstr "Pripojené zdroje:"
#: web/ejabberd_web_admin.erl:1766 web/mod_register_web.erl:227
#: web/mod_register_web.erl:519
msgid "Password:"
msgstr "Heslo:"
#: web/ejabberd_web_admin.erl:1828
msgid "No Data"
msgstr "Žiadne dáta"
#: web/ejabberd_web_admin.erl:1906
msgid "Nodes"
msgstr "Uzly"
#: web/ejabberd_web_admin.erl:1929 web/ejabberd_web_admin.erl:1951
msgid "Node "
msgstr "Uzol "
#: web/ejabberd_web_admin.erl:1938
msgid "Listened Ports"
msgstr "Otvorené portov"
#: web/ejabberd_web_admin.erl:1940 web/ejabberd_web_admin.erl:2260
#: web/ejabberd_web_admin.erl:2448
msgid "Update"
msgstr "Aktualizovať"
#: web/ejabberd_web_admin.erl:1943 web/ejabberd_web_admin.erl:2569
msgid "Restart"
msgstr "Reštart"
#: web/ejabberd_web_admin.erl:1945 web/ejabberd_web_admin.erl:2571
msgid "Stop"
msgstr "Zastaviť"
#: web/ejabberd_web_admin.erl:1959
msgid "RPC Call Error"
msgstr "Chyba RPC volania"
#: web/ejabberd_web_admin.erl:2000
msgid "Database Tables at "
msgstr "Databázové tabuľky na "
#: web/ejabberd_web_admin.erl:2007
msgid "Storage Type"
msgstr "Typ úložiska"
#: web/ejabberd_web_admin.erl:2008
msgid "Elements"
msgstr "Prvky"
#: web/ejabberd_web_admin.erl:2009
msgid "Memory"
msgstr "Pamäť"
#: web/ejabberd_web_admin.erl:2032 web/ejabberd_web_admin.erl:2137
msgid "Error"
msgstr "Chyba"
#: web/ejabberd_web_admin.erl:2034
msgid "Backup of "
msgstr "Záloha "
#: web/ejabberd_web_admin.erl:2036
msgid ""
"Please note that these options will only backup the builtin Mnesia database. "
"If you are using the ODBC module, you also need to backup your SQL database "
"separately."
msgstr ""
"Prosím, berte na vedomie, že tieto nastavenia zázálohujú iba zabudovnú "
"Mnesia databázu. Ak používate ODBC modul, musíte zálohovať vašu SQL databázu "
"separátne."
#: web/ejabberd_web_admin.erl:2041
msgid "Store binary backup:"
msgstr "Uložiť binárnu zálohu:"
#: web/ejabberd_web_admin.erl:2045 web/ejabberd_web_admin.erl:2052
#: web/ejabberd_web_admin.erl:2060 web/ejabberd_web_admin.erl:2067
#: web/ejabberd_web_admin.erl:2074 web/ejabberd_web_admin.erl:2081
#: web/ejabberd_web_admin.erl:2088 web/ejabberd_web_admin.erl:2096
#: web/ejabberd_web_admin.erl:2103 web/ejabberd_web_admin.erl:2110
msgid "OK"
msgstr "OK"
#: web/ejabberd_web_admin.erl:2048
msgid "Restore binary backup immediately:"
msgstr "Okamžite obnoviť binárnu zálohu:"
#: web/ejabberd_web_admin.erl:2056
msgid ""
"Restore binary backup after next ejabberd restart (requires less memory):"
msgstr ""
"Obnoviť binárnu zálohu pri nasledujúcom reštarte ejabberd (vyžaduje menej "
"pamäte)"
#: web/ejabberd_web_admin.erl:2063
msgid "Store plain text backup:"
msgstr "Uložiť zálohu do textového súboru:"
#: web/ejabberd_web_admin.erl:2070
msgid "Restore plain text backup immediately:"
msgstr "Okamžite obnoviť zálohu z textového súboru:"
#: web/ejabberd_web_admin.erl:2077
msgid "Import users data from a PIEFXIS file (XEP-0227):"
msgstr "Importovat dáta užívateľov zo súboru PIEFXIS (XEP-0227):"
#: web/ejabberd_web_admin.erl:2084
msgid "Export data of all users in the server to PIEFXIS files (XEP-0227):"
msgstr ""
"Exportovať dáta všetkých uživateľov na serveri do súborov PIEFXIS (XEP-0227):"
#: web/ejabberd_web_admin.erl:2091
msgid "Export data of users in a host to PIEFXIS files (XEP-0227):"
msgstr ""
"Exportovať dáta uživateľov na hostitelovi do súborov PIEFXIS (XEP-0227):"
#: web/ejabberd_web_admin.erl:2099
msgid "Import user data from jabberd14 spool file:"
msgstr "Importovať dáta užívateľov z jabberd14 spool súboru:"
#: web/ejabberd_web_admin.erl:2106
msgid "Import users data from jabberd14 spool directory:"
msgstr "Importovať dáta užívateľov z jabberd14 spool adresára:"
#: web/ejabberd_web_admin.erl:2132
msgid "Listened Ports at "
msgstr "Otvorené porty na "
#: web/ejabberd_web_admin.erl:2157
msgid "Modules at "
msgstr "Moduly na "
#: web/ejabberd_web_admin.erl:2183
msgid "Statistics of ~p"
msgstr "Štatistiky ~p"
#: web/ejabberd_web_admin.erl:2186
msgid "Uptime:"
msgstr "Uptime:"
#: web/ejabberd_web_admin.erl:2189
msgid "CPU Time:"
msgstr "Čas procesoru"
#: web/ejabberd_web_admin.erl:2195
msgid "Transactions Committed:"
msgstr "Transakcie potvrdená"
#: web/ejabberd_web_admin.erl:2198
msgid "Transactions Aborted:"
msgstr "Transakcie zrušená"
#: web/ejabberd_web_admin.erl:2201
msgid "Transactions Restarted:"
msgstr "Transakcie reštartovaná"
#: web/ejabberd_web_admin.erl:2204
msgid "Transactions Logged:"
msgstr "Transakcie zaznamenaná"
#: web/ejabberd_web_admin.erl:2246
msgid "Update "
msgstr "Aktualizovať "
#: web/ejabberd_web_admin.erl:2254
msgid "Update plan"
msgstr "Aktualizovať plán"
#: web/ejabberd_web_admin.erl:2255
msgid "Modified modules"
msgstr "Modifikované moduly"
#: web/ejabberd_web_admin.erl:2256
msgid "Update script"
msgstr "Aktualizované skripty"
#: web/ejabberd_web_admin.erl:2257
msgid "Low level update script"
msgstr "Nízkoúrovňový aktualizačný skript"
#: web/ejabberd_web_admin.erl:2258
msgid "Script check"
msgstr "Kontrola skriptu"
#: web/ejabberd_web_admin.erl:2426
msgid "Port"
msgstr "Port"
#: web/ejabberd_web_admin.erl:2427
msgid "IP"
msgstr "IP"
#: web/ejabberd_web_admin.erl:2428
msgid "Protocol"
msgstr "Protokol"
#: web/ejabberd_web_admin.erl:2429 web/ejabberd_web_admin.erl:2556
msgid "Module"
msgstr "Modul"
#: web/ejabberd_web_admin.erl:2430 web/ejabberd_web_admin.erl:2557
msgid "Options"
msgstr "Nastavenia"
#: web/ejabberd_web_admin.erl:2450
msgid "Delete"
msgstr "Zmazať"
#: web/ejabberd_web_admin.erl:2579
msgid "Start"
msgstr "Štart"
#: web/mod_register_web.erl:104
msgid "Your Jabber account was successfully created."
msgstr ""
#: web/mod_register_web.erl:107
msgid "There was an error creating the account: "
msgstr ""
#: web/mod_register_web.erl:115
msgid "Your Jabber account was successfully deleted."
msgstr ""
#: web/mod_register_web.erl:118
msgid "There was an error deleting the account: "
msgstr ""
#: web/mod_register_web.erl:128
msgid "The password of your Jabber account was successfully changed."
msgstr ""
#: web/mod_register_web.erl:131
msgid "There was an error changing the password: "
msgstr ""
#: web/mod_register_web.erl:163 web/mod_register_web.erl:172
msgid "Jabber Account Registration"
msgstr ""
#: web/mod_register_web.erl:174 web/mod_register_web.erl:192
#: web/mod_register_web.erl:201
msgid "Register a Jabber account"
msgstr ""
#: web/mod_register_web.erl:176 web/mod_register_web.erl:493
#: web/mod_register_web.erl:502
msgid "Unregister a Jabber account"
msgstr ""
#: web/mod_register_web.erl:203
msgid ""
"This page allows to create a Jabber account in this Jabber server. Your JID "
"(Jabber IDentifier) will be of the form: username@server. Please read "
"carefully the instructions to fill correctly the fields."
msgstr ""
#: web/mod_register_web.erl:212 web/mod_register_web.erl:386
#: web/mod_register_web.erl:509
#, fuzzy
msgid "Username:"
msgstr "IRC prezývka"
#: web/mod_register_web.erl:217
msgid "This is case insensitive: macbeth is the same that MacBeth and Macbeth."
msgstr ""
#: web/mod_register_web.erl:218
msgid "Characters not allowed:"
msgstr ""
#: web/mod_register_web.erl:222 web/mod_register_web.erl:391
#: web/mod_register_web.erl:514
#, fuzzy
msgid "Server:"
msgstr "Server ~b"
#: web/mod_register_web.erl:232
msgid ""
"Don't tell your password to anybody, not even the administrators of the "
"Jabber server."
msgstr ""
#: web/mod_register_web.erl:234
msgid "You can later change your password using a Jabber client."
msgstr ""
#: web/mod_register_web.erl:235
msgid ""
"Some Jabber clients can store your password in your computer. Use that "
"feature only if you trust your computer is safe."
msgstr ""
#: web/mod_register_web.erl:237
msgid ""
"Memorize your password, or write it in a paper placed in a safe place. In "
"Jabber there isn't an automated way to recover your password if you forget "
"it."
msgstr ""
#: web/mod_register_web.erl:242 web/mod_register_web.erl:406
#, fuzzy
msgid "Password Verification:"
msgstr "Overenie hesla"
#: web/mod_register_web.erl:250
#, fuzzy
msgid "Register"
msgstr "Zoznam kontaktov"
#: web/mod_register_web.erl:396
#, fuzzy
msgid "Old Password:"
msgstr "Heslo:"
#: web/mod_register_web.erl:401
#, fuzzy
msgid "New Password:"
msgstr "Heslo:"
#: web/mod_register_web.erl:504
msgid "This page allows to unregister a Jabber account in this Jabber server."
msgstr ""
#: web/mod_register_web.erl:524
msgid "Unregister"
msgstr ""
#, fuzzy
#~ msgid "Captcha test failed"
#~ msgstr "Platná CAPTCHA."
#~ msgid "Encodings"
#~ msgstr "Kódovania"
#~ msgid "(Raw)"
#~ msgstr "(Raw)"
#~ msgid "Specified nickname is already registered"
#~ msgstr "Zadaná prezývka je už registrovaná"
#~ msgid "Size"
#~ msgstr "Veľkosť"
#~ msgid "You must fill in field \"nick\" in the form"
#~ msgstr "Musíte vyplniť políčko \"prezývka\" vo formulári"
ejabberd-2.1.11/src/msgs/nl.msg 0000664 0000000 0000000 00000066514 12240230175 013113 0 ustar {"Access Configuration","Toegangsinstellingen"}.
{"Access Control List Configuration","Instellingen van access control lists"}.
{"Access control lists","Access control lists"}.
{"Access Control Lists","Access control lists"}.
{"Access denied by service policy","De toegang werd geweigerd door het beleid van deze dienst"}.
{"Access rules","Access rules"}.
{"Access Rules","Access rules"}.
{"Action on user","Actie op gebruiker"}.
{"Add Jabber ID","Jabber ID toevoegen"}.
{"Add New","Toevoegen"}.
{"Add User","Gebruiker toevoegen"}.
{"Administration","Beheer"}.
{"Administration of ","Beheer van "}.
{"Administrator privileges required","U hebt beheerdersprivileges nodig"}.
{"A friendly name for the node","Bijnaam voor deze knoop"}.
{"All activity","Alle activiteit"}.
{"Allow this Jabber ID to subscribe to this pubsub node?","Deze gebruiker toestaan te abonneren op deze pubsub node?"}.
{"Allow users to change the subject","Sta gebruikers toe het onderwerp te veranderen"}.
{"Allow users to query other users","Gebruikers mogen naar andere gebruikers verzoeken verzenden"}.
{"Allow users to send invites","Gebruikers mogen uitnodigingen verzenden"}.
{"Allow users to send private messages","Gebruikers mogen privéberichten verzenden"}.
{"Allow visitors to change nickname","Sta bezoekers toe hun naam te veranderen"}.
{"Allow visitors to send private messages to","Gebruikers mogen privéberichten verzenden aan"}.
{"Allow visitors to send status text in presence updates","Sta bezoekers toe hun statusbericht in te stellen"}.
{"Allow visitors to send voice requests","Gebruikers mogen stemaanvragen verzenden"}.
{"All Users","Alle gebruikers"}.
{"Announcements","Mededelingen"}.
{"anyone","iedereen"}.
{"A password is required to enter this room","U hebt een wachtwoord nodig om deze chatruimte te kunnen betreden"}.
{"April","April"}.
{"August","Augustus"}.
{"Backup","Backup"}.
{"Backup Management","Backup"}.
{"Backup of ","Backup maken van "}.
{"Backup to File at ","Binaire backup maken op "}.
{"Bad format","Slecht formaat"}.
{"Birthday","Geboortedatum"}.
{"CAPTCHA web page","CAPTCHA webpagina."}.
{"Change Password","Wachtwoord wijzigen"}.
{"Change User Password","Verander Gebruikerswachtwoord"}.
{"Characters not allowed:","Niet-toegestane karakters:"}.
{"Chatroom configuration modified","De instellingen van de chatruimte werden veranderd"}.
{"Chatroom is created","Gespreksruimte gecreëerd"}.
{"Chatroom is destroyed","Gespreksruimte vernietigd"}.
{"Chatroom is started","Gespreksruimte gestart"}.
{"Chatroom is stopped","Gespreksruimte gestopt"}.
{"Chatrooms","Groepsgesprekken"}.
{"Choose a username and password to register with this server","Kies een gebruikersnaam en een wachtwoord om u te registreren op deze server"}.
{"Choose modules to stop","Selecteer de modules die u wilt stoppen"}.
{"Choose storage type of tables","Opslagmethode voor tabellen kiezen"}.
{"Choose whether to approve this entity's subscription.","Beslis of dit verzoek tot abonneren zal worden goedgekeurd"}.
{"City","Plaats"}.
{"Commands","Commando's"}.
{"Conference room does not exist","De chatruimte bestaat niet"}.
{"Configuration","Instellingen"}.
{"Configuration of room ~s","Instellingen van chatruimte ~s"}.
{"Connected Resources:","Verbonden bronnen:"}.
{"Connections parameters","Verbindingsparameters"}.
{"Country","Land"}.
{"CPU Time:","Processortijd:"}.
{"Database","Database"}.
{"Database Tables at ","Databasetabellen van "}.
{"Database Tables Configuration at ","Instellingen van databasetabellen op "}.
{"December","December"}.
{"Default users as participants","Gebruikers standaard instellen als deelnemers"}.
{"Delete message of the day","Bericht van de dag verwijderen"}.
{"Delete message of the day on all hosts","Verwijder bericht-van-de-dag op alle hosts"}.
{"Delete Selected","Geselecteerde verwijderen"}.
{"Delete User","Verwijder Gebruiker"}.
{"Delete","Verwijderen"}.
{"Deliver event notifications","Gebeurtenisbevestigingen Sturen"}.
{"Deliver payloads with event notifications","Berichten bezorgen samen met gebeurtenisnotificaties"}.
{"Description:","Beschrijving:"}.
{"Disc only copy","Harde schijf"}.
{"Displayed Groups:","Weergegeven groepen:"}.
{"Don't tell your password to anybody, not even the administrators of the Jabber server.","Geef Uw wachtwoord aan niemand, zelfs niet aan de beheerders van deze Jabber-server."}.
{"Dump Backup to Text File at ","Backup naar een tekstbestand schrijven op "}.
{"Dump to Text File","Backup naar een tekstbestand schrijven"}.
{"Edit Properties","Eigenschappen bewerken"}.
{"Either approve or decline the voice request.","Keur stemaanvraag goed of af."}.
{"ejabberd IRC module","ejabberd's IRC-module"}.
{"ejabberd MUC module","ejabberd's MUC module"}.
{"ejabberd Publish-Subscribe module","ejabberd Publish-Subscribe module"}.
{"ejabberd SOCKS5 Bytestreams module","ejabberd SOCKS5 Bytestreams module"}.
{"ejabberd vCard module","ejabberd's vCard-module"}.
{"ejabberd Web Admin","ejabberd Webbeheer"}.
{"Elements","Elementen"}.
{"Email","E-mail"}.
{"Enable logging","Logs aanzetten"}.
{"Encoding for server ~b","Karakterset voor server ~b"}.
{"End User Session","Verwijder Gebruikers-sessie"}.
{"Enter list of {Module, [Options]}","Voer lijst met op te starten modules als volgt in: {Module, [Opties]}"}.
{"Enter nickname you want to register","Voer de bijnaam in die u wilt registreren"}.
{"Enter path to backup file","Voer pad naar backupbestand in"}.
{"Enter path to jabberd14 spool dir","Voer pad naar jabberd14-spool-directory in"}.
{"Enter path to jabberd14 spool file","Voer pad naar jabberd14-spool-bestand in"}.
{"Enter path to text file","Voer pad naar backupbestand in"}.
{"Enter the text you see","Voer de getoonde tekst in"}.
{"Enter username and encodings you wish to use for connecting to IRC servers. Press 'Next' to get more fields to fill in. Press 'Complete' to save settings.","Voer de gebruikersnaam en de coderingen in die u wilt gebruiken voor verbindingen met IRC-servers. Klik op 'Volgende' om meer velden aan te maken. Klik op \"Voltooi' om de instellingen op te slaan."}.
{"Enter username, encodings, ports and passwords you wish to use for connecting to IRC servers","Voer de gebruikersnaam, coderingen, poorten en wachtwoorden in die U wilt gebruiken voor het verbinden met IRC-servers"}.
{"Erlang Jabber Server","Erlang Jabber Server"}.
{"Error","Fout"}.
{"Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef.net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}].","Voorbeeld: [{\"irc.example.org\", \"koi8-r\", 6667, \"geheim\"}, {\"vendetta.example.net\", \"iso8859-1\", 7000}, {irc,testserver.nl\", \"utf-8\"}]."}.
{"Exclude Jabber IDs from CAPTCHA challenge","Geen CAPTCHA test voor Jabber IDs"}.
{"Export data of all users in the server to PIEFXIS files (XEP-0227):","Exporteer data van alle gebruikers in de server naar PIEFXIS-bestanden (XEP-0227):"}.
{"Export data of users in a host to PIEFXIS files (XEP-0227):","Exporteer data van alle gebruikers van een host naar PIEXFIS-bestanden (XEP-0227):"}.
{"Failed to extract JID from your voice request approval","Er kon geen JID worden ontleend uit deze stemaanvraag"}.
{"Family Name","Achternaam"}.
{"February","Februari"}.
{"Fill in fields to search for any matching Jabber User","Vul de velden in om te zoeken naar Jabber-gebruikers op deze server"}.
{"Fill in the form to search for any matching Jabber User (Add * to the end of field to match substring)","Gebruik de velden om te zoeken (Voeg achteraan het teken * toe om te zoeken naar alles wat met het eerste deel begint.)."}.
{"Friday","Vrijdag"}.
{"From ~s","Van ~s"}.
{"From","Van"}.
{"Full Name","Volledige naam"}.
{"Get Number of Online Users","Aantal Aanwezige Gebruikers Opvragen"}.
{"Get Number of Registered Users","Aantal Geregistreerde Gebruikers Opvragen"}.
{"Get User Last Login Time","Tijd van Laatste Aanmelding Opvragen"}.
{"Get User Password","Gebruikerswachtwoord Opvragen"}.
{"Get User Statistics","Gebruikers-statistieken Opvragen"}.
{"Grant voice to this person?","Stemaanvraag honoreren voor deze persoon?"}.
{"Group ","Groep "}.
{"Groups","Groepen"}.
{"has been banned","werd verbannen"}.
{"has been kicked because of an affiliation change","is weggestuurd vanwege een affiliatieverandering"}.
{"has been kicked because of a system shutdown","is weggestuurd omdat het systeem gestopt wordt"}.
{"has been kicked because the room has been changed to members-only","is weggestuurd omdat de chatruimte vanaf heden alleen toegankelijk is voor leden"}.
{"has been kicked","werd gekicked"}.
{" has set the subject to: "," veranderde het onderwerp in: "}.
{"Host","Host"}.
{"If you don't see the CAPTCHA image here, visit the web page.","Als U het CAPTCHA-plaatje niet ziet, bezoek dan de webpagina."}.
{"If you want to specify different ports, passwords, encodings for IRC servers, fill this list with values in format '{\"irc server\", \"encoding\", port, \"password\"}'. By default this service use \"~s\" encoding, port ~p, empty password.","Als u verschillende poorten, wachtwoorden en coderingen wilt opgeven voor elke IRC-server, vul dan deze lijst met het volgende formaat: '{\"IRC-server\", \"codering\", poort, \"wachtwoord\"}'. Standaard gebruikt deze service de codering \"~s\", poort ~p, leeg wachtwoord."}.
{"Import Directory","Directory importeren"}.
{"Import File","Bestand importeren"}.
{"Import user data from jabberd14 spool file:","Importeer gebruikersdata via spool-bestanden van jabberd14"}.
{"Import User from File at ","Importeer gebruiker via bestand op "}.
{"Import users data from a PIEFXIS file (XEP-0227):","Importeer gebruikersdata van een PIEFXIS-bestand (XEP-0227):"}.
{"Import users data from jabberd14 spool directory:","Importeer gebruikersdata via spool-bestanden van jabberd14"}.
{"Import Users from Dir at ","Gebruikers importeren vanaf directory op "}.
{"Import Users From jabberd14 Spool Files","Importeer gebruikers via spool-bestanden van jabberd14"}.
{"Improper message type","Onjuist berichttype"}.
{"Incorrect password","Foutief wachtwoord"}.
{"Invalid affiliation: ~s","Ongeldige affiliatie: ~s"}.
{"Invalid role: ~s","Ongeldige rol: ~s"}.
{"IP addresses","IP-adres"}.
{"IP","IP"}.
{"IRC channel (don't put the first #)","IRC kanaal (zonder eerste #)"}.
{"IRC server","IRC-server"}.
{"IRC settings","IRC instellingen"}.
{"IRC Transport","IRC Transport"}.
{"IRC username","Gebruikersnaam voor IRC"}.
{"IRC Username","Gebruikersnaam voor IRC:"}.
{"is now known as","heet nu"}.
{"It is not allowed to send private messages","Het is niet toegestaan priveberichten te sturen"}.
{"It is not allowed to send private messages of type \"groupchat\"","Er mogen geen privéberichten van het type \"groupchat\" worden verzonden"}.
{"It is not allowed to send private messages to the conference","Er mogen geen privéberichten naar de chatruimte worden verzonden"}.
{"Jabber Account Registration","Jabber-account registratie"}.
{"Jabber ID","Jabber ID"}.
{"Jabber ID ~s is invalid","De Jabber ID ~s is ongeldig"}.
{"January","Januari"}.
{"Join IRC channel","Ga IRC kanaal binnen"}.
{"joins the room","betrad de chatruimte"}.
{"Join the IRC channel here.","Ga het IRC kanaal binnen"}.
{"Join the IRC channel in this Jabber ID: ~s","Ga het IRC kanaal van deze Jabber ID binnen: ~s"}.
{"July","Juli"}.
{"June","Juni"}.
{"Last Activity","Laatste activiteit"}.
{"Last login","Laatste Aanmelding"}.
{"Last month","Afgelopen maand"}.
{"Last year","Afgelopen jaar"}.
{"leaves the room","verliet de chatruimte"}.
{"Listened Ports at ","Openstaande poorten op "}.
{"Listened Ports","Openstaande poorten"}.
{"List of modules to start","Lijst met op te starten modules"}.
{"Low level update script","Lowlevel script voor de opwaardering"}.
{"Make participants list public","Deelnemerslijst publiek maken"}.
{"Make room CAPTCHA protected","Chatruimte beveiligen met een geautomatiseerde Turing test"}.
{"Make room members-only","Chatruimte enkel toegankelijk maken voor leden"}.
{"Make room moderated","Chatruimte gemodereerd maken"}.
{"Make room password protected","Chatruimte beveiligen met een wachtwoord"}.
{"Make room persistent","Chatruimte blijvend maken"}.
{"Make room public searchable","Chatruimte doorzoekbaar maken"}.
{"March","Maart"}.
{"Maximum Number of Occupants","Maximum aantal aanwezigen"}.
{"Max # of items to persist","Maximum aantal in het geheugen te bewaren items"}.
{"Max payload size in bytes","Maximumgrootte van bericht in bytes"}.
{"May","Mei"}.
{"Members:","Groepsleden:"}.
{"Membership is required to enter this room","U moet lid zijn om deze chatruimte te kunnen betreden"}.
{"Memorize your password, or write it in a paper placed in a safe place. In Jabber there isn't an automated way to recover your password if you forget it.","Onthou het wachtwoord, of schrijf het op en bewaar het op een veilige plaats. Met Jabber is er geen geautomatiseerde manier om het wachtwoord terug te halen als U het vergeet."}.
{"Memory","Geheugen"}.
{"Message body","Bericht"}.
{"Middle Name","Tussennaam"}.
{"Minimum interval between voice requests (in seconds)","Minimale interval tussen stemaanvragen (in seconden)"}.
{"Moderator privileges required","U hebt moderatorprivileges nodig"}.
{"moderators only","moderators"}.
{"Modified modules","Gewijzigde modules"}.
{"Module","Module"}.
{"Modules at ","Modules op "}.
{"Modules","Modules"}.
{"Monday","Maandag"}.
{"Name:","Naam:"}.
{"Name","Naam"}.
{"Never","Nooit"}.
{"New Password:","Nieuw Wachtwoord:"}.
{"Nickname","Bijnaam"}.
{"Nickname Registration at ","Registratie van een bijnaam op "}.
{"Nickname ~s does not exist in the room","De bijnaam ~s bestaat niet in deze chatruimte"}.
{"nobody","niemand"}.
{"No body provided for announce message","De mededeling bevat geen bericht"}.
{"No Data","Geen gegevens"}.
{"Node ID","Node ID"}.
{"Node ","Node "}.
{"Node not found","Node niet gevonden"}.
{"Nodes","Nodes"}.
{"No limit","Geen limiet"}.
{"None","Geen"}.
{"No resource provided","Geen bron opgegeven"}.
{"Not Found","Niet gevonden"}.
{"Notify subscribers when items are removed from the node","Abonnees informeren wanneer items verwijderd worden uit de node"}.
{"Notify subscribers when the node configuration changes","Abonnees informeren wanneer de instellingen van de node veranderen"}.
{"Notify subscribers when the node is deleted","Abonnees informeren wanneer de node verwijderd word"}.
{"November","November"}.
{"Number of occupants","Aantal aanwezigen"}.
{"Number of online users","Aantal Aanwezige Gebruikers"}.
{"Number of registered users","Aantal Geregistreerde Gebruikers"}.
{"October","Oktober"}.
{"Offline Messages:","Offline berichten:"}.
{"Offline Messages","Offline berichten"}.
{"OK","OK"}.
{"Old Password:","Oud Wachtwoord:"}.
{"Online","Online"}.
{"Online Users:","Online gebruikers:"}.
{"Online Users","Online gebruikers"}.
{"Only deliver notifications to available users","Notificaties alleen verzenden naar online gebruikers"}.
{"Only moderators and participants are allowed to change the subject in this room","Alleen moderators en deelnemers mogen het onderwerp van deze chatruimte veranderen"}.
{"Only moderators are allowed to change the subject in this room","Alleen moderators mogen het onderwerp van deze chatruimte veranderen"}.
{"Only moderators can approve voice requests","Alleen moderators kunnen stemaanvragen goedkeuren"}.
{"Only occupants are allowed to send messages to the conference","Alleen aanwezigen mogen berichten naar de chatruimte verzenden"}.
{"Only occupants are allowed to send queries to the conference","Alleen aanwezigen mogen verzoeken verzenden naar de chatruimte"}.
{"Only service administrators are allowed to send service messages","Alleen beheerders van deze dienst mogen mededelingen verzenden naar alle chatruimtes"}.
{"Options","Opties"}.
{"Organization Name","Organisatie"}.
{"Organization Unit","Afdeling"}.
{"Outgoing s2s Connections:","Uitgaande s2s-verbindingen:"}.
{"Outgoing s2s Connections","Uitgaande s2s-verbindingen"}.
{"Outgoing s2s Servers:","Uitgaande s2s-verbindingen:"}.
{"Owner privileges required","U hebt eigenaarsprivileges nodig"}.
{"Packet","Pakket"}.
{"Password ~b","Wachtwoord ~b"}.
{"Password Verification:","Wachtwoord Bevestiging:"}.
{"Password Verification","Wachtwoord Bevestiging"}.
{"Password:","Wachtwoord:"}.
{"Password","Wachtwoord"}.
{"Path to Dir","Pad naar directory"}.
{"Path to File","Pad naar bestand"}.
{"Pending","Bezig"}.
{"Period: ","Periode: "}.
{"Persist items to storage","Items in het geheugen bewaren"}.
{"Ping","Ping"}.
{"Please note that these options will only backup the builtin Mnesia database. If you are using the ODBC module, you also need to backup your SQL database separately.","Merk op dat volgende opties enkel backups maken van de ingebouwde database Mnesia. Als U de ODBC module gebruikt dan moeten daarvan afzonderlijke backups gemaakt worden."}.
{"Please, wait for a while before sending new voice request","Wacht s.v.p. met het maken van een nieuwe stemaanvraag."}.
{"Pong","Pong"}.
{"Port ~b","Poort ~b"}.
{"Port","Poort"}.
{"Present real Jabber IDs to","Jabber ID's kunnen achterhaald worden door"}.
{"private, ","privé, "}.
{"Protocol","Protocol"}.
{"Publish-Subscribe","Publish-Subscribe"}.
{"PubSub subscriber request","PubSub abonnee verzoek"}.
{"Purge all items when the relevant publisher goes offline","Verwijder alle items wanneer de gerelateerde publiceerder offline gaat"}.
{"Queries to the conference members are not allowed in this room","Er mogen geen verzoeken verzenden worden naar deelnemers in deze chatruimte"}.
{"RAM and disc copy","RAM en harde schijf"}.
{"RAM copy","RAM"}.
{"Raw","Ruw"}.
{"Really delete message of the day?","Wilt u het bericht van de dag verwijderen?"}.
{"Recipient is not in the conference room","De ontvanger is niet in de chatruimte"}.
{"Register a Jabber account","Registreer een Jabber-account"}.
{"Registered Users:","Geregistreerde gebruikers:"}.
{"Registered Users","Geregistreerde gebruikers"}.
{"Register","Registreer"}.
{"Registration in mod_irc for ","Registratie van "}.
{"Remote copy","Op andere nodes in de cluster"}.
{"Remove All Offline Messages","Verwijder alle offline berichten"}.
{"Remove User","Gebruiker verwijderen"}.
{"Remove","Verwijderen"}.
{"Replaced by new connection","Vervangen door een nieuwe verbinding"}.
{"Resources","Bronnen"}.
{"Restart","Herstarten"}.
{"Restart Service","Herstart Service"}.
{"Restore Backup from File at ","Binaire backup direct herstellen op "}.
{"Restore","Binaire backup direct herstellen"}.
{"Restore binary backup after next ejabberd restart (requires less memory):","Binaire backup herstellen na herstart van ejabberd (vereist minder geheugen):"}.
{"Restore binary backup immediately:","Binaire backup direct herstellen:"}.
{"Restore plain text backup immediately:","Backup in een tekstbestand direct herstellen:"}.
{"Room Configuration","Instellingen van de chatruimte"}.
{"Room creation is denied by service policy","De aanmaak van de chatruimte is verhinderd door de instellingen van deze server"}.
{"Room description","Beschrijving"}.
{"Room Occupants","Aantal aanwezigen"}.
{"Room title","Naam van de chatruimte"}.
{"Roster groups allowed to subscribe","Contactlijst-groepen die mogen abonneren"}.
{"Roster of ","Roster van "}.
{"Roster","Roster"}.
{"Roster size","Contactlijst Groote"}.
{"RPC Call Error","RPC-oproepfout"}.
{"Running Nodes","Draaiende nodes"}.
{"~s access rule configuration","Access rules op ~s"}.
{"Saturday","Zaterdag"}.
{"Script check","Controle van script"}.
{"Search Results for ","Zoekresultaten voor "}.
{"Search users in ","Gebruikers zoeken in "}.
{"Send announcement to all online users","Mededeling verzenden naar alle online gebruikers"}.
{"Send announcement to all online users on all hosts","Mededeling verzenden naar alle online gebruikers op alle virtuele hosts"}.
{"Send announcement to all users","Mededeling verzenden naar alle gebruikers"}.
{"Send announcement to all users on all hosts","Stuur aankondiging aan alle gebruikers op alle hosts"}.
{"September","September"}.
{"Server ~b","Server ~b"}.
{"Server:","Server:"}.
{"Set message of the day and send to online users","Bericht van de dag instellen en verzenden naar online gebruikers"}.
{"Set message of the day on all hosts and send to online users","Stel bericht-van-de-dag in op alle hosts en stuur naar aanwezige gebruikers"}.
{"Shared Roster Groups","Gedeelde rostergroepen"}.
{"Show Integral Table","Volledige tabel laten zien"}.
{"Show Ordinary Table","Deel van tabel laten zien"}.
{"Shut Down Service","Stop Service"}.
{"~s invites you to the room ~s","~s nodigt je uit voor het groepsgesprek ~s"}.
{"Some Jabber clients can store your password in your computer. Use that feature only if you trust your computer is safe.","Sommige Jabber-clienten kunnen het wachtwoord opslaan op Uw computer. Gebruik deze mogelijkheid alleen als U vertrouwd dat Uw computer afdoende beveiligd is."}.
{"Specify the access model","Geef toegangsmodel"}.
{"Specify the event message type","Geef type van eventbericht"}.
{"Specify the publisher model","Publicatietype opgeven"}.
{"~s's Offline Messages Queue","offline berichten van ~s"}.
{"Start Modules at ","Modules starten op "}.
{"Start Modules","Modules starten"}.
{"Start","Starten"}.
{"Statistics of ~p","Statistieken van ~p"}.
{"Statistics","Statistieken"}.
{"Stop Modules at ","Modules stoppen op "}.
{"Stop Modules","Modules stoppen"}.
{"Stopped Nodes","Gestopte nodes"}.
{"Stop","Stoppen"}.
{"Storage Type","Opslagmethode"}.
{"Store binary backup:","Binaire backup maken:"}.
{"Store plain text backup:","Backup naar een tekstbestand schrijven:"}.
{"Subject","Onderwerp"}.
{"Submitted","Verzonden"}.
{"Submit","Verzenden"}.
{"Subscriber Address","Abonnee Adres"}.
{"Subscription","Inschrijving"}.
{"Sunday","Zondag"}.
{"That nickname is already in use by another occupant","Deze bijnaam is al in gebruik door een andere aanwezige"}.
{"That nickname is registered by another person","Deze bijnaam is al geregistreerd door iemand anders"}.
{"The CAPTCHA is valid.","De geautomatiseerde Turing-test is geslaagd."}.
{"The CAPTCHA verification has failed","De CAPTCHA-verificatie is mislukt"}.
{"The collections with which a node is affiliated","De collecties waar een node mee is gerelateerd"}.
{"the password is","het wachtwoord is"}.
{"The password is too weak","Het wachtwoord is te zwak"}.
{"The password of your Jabber account was successfully changed.","Het wachtwoord van Uw Jabber-account is succesvol veranderd."}.
{"There was an error changing the password: ","Er was een fout bij het veranderen van het wachtwoord:"}.
{"There was an error creating the account: ","Er was een fout bij het creeern van de account:"}.
{"There was an error deleting the account: ","Er was een fout bij het verwijderen van de account."}.
{"This is case insensitive: macbeth is the same that MacBeth and Macbeth.","Dit is niet hoofdlettergevoelig: macbeth is hetzelfde als MacBeth en Macbeth."}.
{"This page allows to create a Jabber account in this Jabber server. Your JID (Jabber IDentifier) will be of the form: username@server. Please read carefully the instructions to fill correctly the fields.","Deze pagina maakt het mogelijk een Jabber-account te registreren op deze server. Uw JID (Jabber IDentiteit) zal er als volg uit zien: gebruikersnaam@server. Lees de instructies zorgvuldig teneinde de velden correct in te vullen."}.
{"This page allows to unregister a Jabber account in this Jabber server.","Deze pagina maakt het mogelijk een Jabber-account op deze server op te heffen."}.
{"This participant is kicked from the room because he sent an error message","Deze deelnemer wordt weggestuurd vanwege het sturen van een foutmeldingsbericht"}.
{"This participant is kicked from the room because he sent an error message to another participant","Deze deelnemer wordt weggestuurd vanwege het sturen van een foutmeldingsbericht aan een andere deelnemer"}.
{"This participant is kicked from the room because he sent an error presence","Deze deelnemer wordt weggestuurd vanwege het sturen van een foutmelding-aanwezigheid"}.
{"This room is not anonymous","Deze chatruimte is niet anoniem"}.
{"Thursday","Donderdag"}.
{"Time delay","Vertraging"}.
{"Time","Tijd"}.
{"To","Aan"}.
{"Too many CAPTCHA requests","Te veel CAPTCHA-aanvragen"}.
{"To ~s","Naar ~s"}.
{"Traffic rate limit is exceeded","Dataverkeerslimiet overschreden"}.
{"Transactions Aborted:","Afgebroken transacties:"}.
{"Transactions Committed:","Bevestigde transacties:"}.
{"Transactions Logged:","Gelogde transacties:"}.
{"Transactions Restarted:","Herstarte transacties:"}.
{"Tuesday","Dinsdag"}.
{"Unable to generate a CAPTCHA","Het generen van een CAPTCHA is mislukt"}.
{"Unauthorized","Niet geautoriseerd"}.
{"Unregister a Jabber account","Opheffen van Jabber-account"}.
{"Unregister","Opheffen"}.
{"Update","Bijwerken"}.
{"Update message of the day (don't send)","Bericht van de dag bijwerken (niet verzenden)"}.
{"Update message of the day on all hosts (don't send)","Verander bericht-van-de-dag op alle hosts (niet versturen)"}.
{"Update ","Opwaarderen van "}.
{"Update plan","Plan voor de opwaardering"}.
{"Update script","Script voor de opwaardering"}.
{"Uptime:","Uptime:"}.
{"Use of STARTTLS required","Gebruik van STARTTLS is vereist"}.
{"User ","Gebruiker "}.
{"User","Gebruiker"}.
{"User JID","JID Gebruiker"}.
{"User Management","Gebruikersbeheer"}.
{"Username:","Gebruikersnaam:"}.
{"Users are not allowed to register accounts so quickly","Het is gebruikers niet toegestaan zo snel achter elkaar te registreren"}.
{"Users","Gebruikers"}.
{"Users Last Activity","Laatste activiteit van gebruikers"}.
{"Validate","Bevestigen"}.
{"vCard User Search","Gebruikers zoeken"}.
{"Virtual Hosts","Virtuele hosts"}.
{"Visitors are not allowed to change their nicknames in this room","Het is bezoekers niet toegestaan hun naam te veranderen in dit kanaal"}.
{"Visitors are not allowed to send messages to all occupants","Bezoekers mogen geen berichten verzenden naar alle aanwezigen"}.
{"Voice requests are disabled in this conference","Stemaanvragen zijn uitgeschakeld voor deze chatruimte"}.
{"Voice request","Stemaanvraag"}.
{"Wednesday","Woensdag"}.
{"When to send the last published item","Wanneer het laatst gepubliceerde item verzonden moet worden"}.
{"Whether to allow subscriptions","Abonnementsaanvraag toestaan"}.
{"You can later change your password using a Jabber client.","U can het wachtwoord later veranderen met een Jabber-client."}.
{"You have been banned from this room","U werd verbannen uit deze chatruimte"}.
{"You must fill in field \"Nickname\" in the form","U moet het veld \"bijnaam\" invullen"}.
{"You need a client that supports x:data and CAPTCHA to register","U hebt een client nodig die x:data en CAPTCHA ondersteunt om een bijnaam te registreren"}.
{"You need a client that supports x:data to register the nickname","U hebt een client nodig die x:data ondersteunt om een bijnaam te registreren"}.
{"You need an x:data capable client to configure mod_irc settings","U hebt een client nodig die x:data ondersteunt om dit IRC-transport in te stellen"}.
{"You need an x:data capable client to configure room","U hebt een client nodig die x:data ondersteunt om deze chatruimte in te stellen"}.
{"You need an x:data capable client to search","U hebt een client nodig die x:data ondersteunt om te zoeken"}.
{"Your active privacy list has denied the routing of this stanza.","Uw actieve privacy-lijst verbied het routeren van dit stanza."}.
{"Your contact offline message queue is full. The message has been discarded.","Te veel offline berichten voor dit contactpersoon. Het bericht is niet opgeslagen."}.
{"Your Jabber account was successfully created.","Uw Jabber-account is succesvol gecreeerd."}.
{"Your Jabber account was successfully deleted.","Uw Jabber-account is succesvol verwijderd."}.
{"Your messages to ~s are being blocked. To unblock them, visit ~s","Uw berichten aan ~s worden geblokkeerd. Om ze te deblokkeren, ga naar ~s"}.
ejabberd-2.1.11/src/msgs/pl.msg 0000664 0000000 0000000 00000066171 12240230175 013114 0 ustar {"Access Configuration","Konfiguracja dostępu"}.
{"Access Control List Configuration","Konfiguracja listy dostępowej"}.
{"Access Control Lists","Lista dostępowa"}.
{"Access control lists","Listy dostępowe"}.
{"Access denied by service policy","Dostęp zabroniony zgodnie z zasadami usługi"}.
{"Access rules","Reguły dostępu"}.
{"Access Rules","Zasady dostępu"}.
{"Action on user","Wykonaj na użytkowniku"}.
{"Add Jabber ID","Dodaj Jabber ID"}.
{"Add New","Dodaj nowe"}.
{"Add User","Dodaj użytkownika"}.
{"Administration","Administracja"}.
{"Administration of ","Zarządzanie "}.
{"Administrator privileges required","Wymagane uprawnienia administratora"}.
{"A friendly name for the node","Przyjazna nazwa węzła"}.
{"All activity","Cała aktywność"}.
{"Allow this Jabber ID to subscribe to this pubsub node?","Pozwól temu Jabber ID na zapisanie się do tego węzła PubSub"}.
{"Allow users to change the subject","Pozwól użytkownikom zmieniać temat"}.
{"Allow users to query other users","Pozwól użytkownikom pobierać informacje o innych użytkownikach"}.
{"Allow users to send invites","Pozwól użytkownikom wysyłać zaproszenia"}.
{"Allow users to send private messages","Pozwól użytkownikom wysyłać prywatne wiadomości"}.
{"Allow visitors to change nickname","Pozwól uczestnikom na zmianę nicka"}.
{"Allow visitors to send private messages to","Pozwól użytkownikom wysyłać prywatne wiadomości"}.
{"Allow visitors to send status text in presence updates","Pozwól uczestnikom na wysyłanie statusów opisowych"}.
{"Allow visitors to send voice requests","Pozwól użytkownikom wysyłać zaproszenia"}.
{"All Users","Wszyscy użytkownicy"}.
{"Announcements","Powiadomienia"}.
{"anyone","wszystkich"}.
{"A password is required to enter this room","Aby wejść do pokoju wymagane jest hasło"}.
{"April","Kwiecień"}.
{"August","Sierpień"}.
{"Backup Management","Zarządzanie kopiami zapasowymi"}.
{"Backup of ","Kopia zapasowa "}.
{"Backup to File at ","Zapisz kopię w pliku na "}.
{"Backup","Wykonaj kopie"}.
{"Bad format","Błędny format"}.
{"Birthday","Data urodzenia"}.
{"CAPTCHA web page","Strona internetowa CAPTCHA"}.
{"Change Password","Zmień hasło"}.
{"Change User Password","Zmień hasło użytkownika"}.
{"Characters not allowed:","Te znaki są niedozwolone:"}.
{"Chatroom configuration modified","Konfiguracja pokoju zmodyfikowana"}.
{"Chatroom is created","Pokój został stworzony"}.
{"Chatroom is destroyed","Pokój został usunięty"}.
{"Chatroom is started","Pokój został uruchomiony"}.
{"Chatroom is stopped","Pokój został zatrzymany"}.
{"Chatrooms","Pokoje rozmów"}.
{"Choose a username and password to register with this server","Wybierz nazwę użytkownika i hasło aby zarejestrować się na tym serwerze"}.
{"Choose modules to stop","Wybierz moduły do zatrzymania"}.
{"Choose storage type of tables","Wybierz typ bazy dla tablel"}.
{"Choose whether to approve this entity's subscription.","Wybierz, czy akceptować subskrypcję tej jednostki"}.
{"City","Miasto"}.
{"Commands","Polecenia"}.
{"Conference room does not exist","Pokój konferencyjny nie istnieje"}.
{"Configuration","Konfiguracja"}.
{"Configuration of room ~s","Konfiguracja pokoju ~s"}.
{"Connected Resources:","Zasoby zalogowane:"}.
{"Connections parameters","Parametry połączeń"}.
{"Country","Państwo"}.
{"CPU Time:","Czas CPU:"}.
{"Database","Baza danych"}.
{"Database Tables at ","Tabele bazy na "}.
{"Database Tables Configuration at ","Konfiguracja tabel bazy na "}.
{"December","Grudzień"}.
{"Default users as participants","Domyślni użytkownicy jako uczestnicy"}.
{"Delete message of the day on all hosts","Usuń wiadomość dnia ze wszystkich hostów"}.
{"Delete message of the day","Usuń wiadomość dnia"}.
{"Delete Selected","Usuń zaznaczone"}.
{"Delete User","Usuń użytkownika"}.
{"Delete","Usuń"}.
{"Deliver event notifications","Dostarczaj powiadomienia o zdarzeniach"}.
{"Deliver payloads with event notifications","Dostarczaj zawartość publikacji wraz z powiadomieniami o zdarzeniach"}.
{"Description:","Opis:"}.
{"Disc only copy","Kopia tylko na dysku"}.
{"Displayed Groups:","Wyświetlane grupy:"}.
{"Don't tell your password to anybody, not even the administrators of the Jabber server.","Nie podawaj swojego hasła nikomu, nawet administratorowi serwera Jabber."}.
{"Dump Backup to Text File at ","Zapisz kopię zapasową w pliku tekstowym na "}.
{"Dump to Text File","Wykonaj kopie do pliku tekstowego"}.
{"Edit Properties","Edytuj właściwości"}.
{"Either approve or decline the voice request.","Zatwierdź lub odrzuć żądanie głosowe"}.
{"ejabberd IRC module","Moduł IRC ejabberd"}.
{"ejabberd MUC module","Moduł MUC"}.
{"ejabberd Publish-Subscribe module","Moduł Publish-Subscribe"}.
{"ejabberd SOCKS5 Bytestreams module","Moduł SOCKS5 Bytestreams"}.
{"ejabberd vCard module","Moduł vCard ejabberd"}.
{"ejabberd Web Admin","ejabberd: Panel Administracyjny"}.
{"Elements","Elementy"}.
{"Email","Email"}.
{"Enable logging","Włącz logowanie"}.
{"Encoding for server ~b","Kodowanie znaków dla serwera ~b"}.
{"End User Session","Zakończ sesję uzytkownika"}.
{"Enter list of {Module, [Options]}","Wprowadź listę {Moduł, [Opcje]}"}.
{"Enter nickname you want to register","Wprowadz nazwę użytkownika którego chcesz zarejestrować"}.
{"Enter path to backup file","Wprowadź scieżkę do pliku kopii zapasowej"}.
{"Enter path to jabberd14 spool dir","Wprowadź ścieżkę do roboczego katalogu serwera jabberd14"}.
{"Enter path to jabberd14 spool file","Wprowadź ścieżkę do roboczego pliku serwera jabberd14"}.
{"Enter path to text file","Wprowadź scieżkę do pliku tekstowego"}.
{"Enter the text you see","Przepisz tekst z obrazka"}.
{"Enter username and encodings you wish to use for connecting to IRC servers. Press 'Next' to get more fields to fill in. Press 'Complete' to save settings.","Wprowadź nazwę użytkownika i kodowania których chcesz używać do łączenia z serwerami IRC. Wciśnij \"Dalej\" aby ustawić więcej parametrów połączenia. Wciśnij \"Zakończ\" aby zapisać ustawienia."}.
{"Enter username, encodings, ports and passwords you wish to use for connecting to IRC servers","Wprowadź nazwę użytkownika, port i kodowanie, których chcesz używać do łączenia z serwerami IRC"}.
{"Erlang Jabber Server","Erlang Jabber Server"}.
{"Error","Błąd"}.
{"Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef.net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}].","Przykład: [{\"wroclaw.irc.pl\",\"utf-8\"}, {\"warszawa.irc.pl\", \"iso8859-2\"}]."}.
{"Exclude Jabber IDs from CAPTCHA challenge","Pomiń Jabber ID z żądania CAPTCHA"}.
{"Export data of all users in the server to PIEFXIS files (XEP-0227):","Eksportuj dane wszystkich użytkowników serwera do plików w formacie PIEFXIS (XEP-0227):"}.
{"Export data of users in a host to PIEFXIS files (XEP-0227):","Eksportuj dane użytkowników z hosta do plików w formacie PIEFXIS (XEP-0227):"}.
{"Failed to extract JID from your voice request approval","Nie udało się wydobyć JID-u z twojego żądania"}.
{"Family Name","Nazwisko"}.
{"February","Luty"}.
{"Fill in fields to search for any matching Jabber User","Wypełnij pola aby znaleźć pasujących użytkowników Jabbera"}.
{"Fill in the form to search for any matching Jabber User (Add * to the end of field to match substring)","Wypełnij formularz aby wyszukać użytkowników Jabbera (dodaj * na koniec zapytania aby wyszukać po fragmencie)"}.
{"Friday","Piątek"}.
{"From","Od"}.
{"From ~s","Od ~s"}.
{"Full Name","Pełna nazwa"}.
{"Get Number of Online Users","Pokaż liczbę zalogowanych użytkowników"}.
{"Get Number of Registered Users","Pokaż liczbę zarejestrowanych użytkowników"}.
{"Get User Last Login Time","Pokaż czas ostatniego zalogowania uzytkownika"}.
{"Get User Password","Pobierz hasło użytkownika"}.
{"Get User Statistics","Pobierz statystyki użytkownika"}.
{"Grant voice to this person?","Udzielić głosu tej osobie?"}.
{"Group ","Grupa "}.
{"Groups","Grupy"}.
{"has been banned","został wykluczony"}.
{"has been kicked because of an affiliation change","został wyrzucony z powodu zmiany przynależności"}.
{"has been kicked because of a system shutdown","został wyrzucony z powodu wyłączenia systemu"}.
{"has been kicked because the room has been changed to members-only","został wyrzucony z powodu zmiany pokoju na \"Tylko dla Członków\""}.
{"has been kicked","został wyrzucony"}.
{" has set the subject to: "," zmienił temat na: "}.
{"Host","Host"}.
{"If you don't see the CAPTCHA image here, visit the web page.","Jeśli nie widzisz obrazka CAPTCHA, odwiedź stronę internetową."}.
{"If you want to specify different ports, passwords, encodings for IRC servers, fill this list with values in format '{\"irc server\", \"encoding\", port, \"password\"}'. By default this service use \"~s\" encoding, port ~p, empty password.","Jeśli chcesz ustawić inne hasła, porty lub kodowania dla poszczególnych serwerów IRC, wypełnij tą listę wartościami w formacie '{\"irc server\",\"encoding\", port, \"password\"}'. Domyślne ta usługa używa kodowania \"~s\", portu ~p, bez hasła."}.
{"Import Directory","Importuj katalog"}.
{"Import File","Importuj plik"}.
{"Import user data from jabberd14 spool file:","Importuj dane użytkownika z pliku roboczego serwera jabberd14:"}.
{"Import User from File at ","Importuj użytkownika z pliku na "}.
{"Import users data from a PIEFXIS file (XEP-0227):","Importuj dane użytkowników z pliku w formacie PIEFXIS (XEP-0227):"}.
{"Import users data from jabberd14 spool directory:","Importuj użytkowników z katalogu roboczego serwera jabberd14"}.
{"Import Users from Dir at ","Importuj użytkowników z katalogu na "}.
{"Import Users From jabberd14 Spool Files","Importuj użytkowników z plików roboczych serwera jabberd14"}.
{"Improper message type","Nieprawidłowy typ wiadomości"}.
{"Incorrect password","Nieprawidłowe hasło"}.
{"Invalid affiliation: ~s","Nieprawidłowa przynależność: ~s"}.
{"Invalid role: ~s","Nieprawidłowa rola: ~s"}.
{"IP addresses","Adresy IP"}.
{"IP","IP"}.
{"IRC channel (don't put the first #)","Kanał IRC (nie używaj #)"}.
{"IRC server","Serwer IRC"}.
{"IRC settings","Ustawienia IRC"}.
{"IRC Transport","Transport IRC"}.
{"IRC username","Nazwa użytkownika IRC"}.
{"IRC Username","Nazwa użytkownika IRC"}.
{"is now known as","jest teraz znany jako"}.
{"It is not allowed to send private messages of type \"groupchat\"","Nie można wysyłać prywatnych wiadomości typu \"groupchat\""}.
{"It is not allowed to send private messages to the conference","Nie wolno wysyłac prywatnych wiadomości na konferencję"}.
{"It is not allowed to send private messages","Wysyłanie prywatnych wiadomości jest zabronione"}.
{"Jabber Account Registration","Zakładanie konta Jabber"}.
{"Jabber ID","Jabber ID"}.
{"Jabber ID ~s is invalid","Jabber ID ~s jest niepoprawny"}.
{"January","Styczeń"}.
{"Join IRC channel","Dołącz do kanału IRC"}.
{"joins the room","dołącza do pokoju"}.
{"Join the IRC channel here.","Dołącz do kanału IRC."}.
{"Join the IRC channel in this Jabber ID: ~s","Dołącz do kanału IRC pod tym Jabber ID: ~s"}.
{"July","Lipiec"}.
{"June","Czerwiec"}.
{"Last Activity","Ostatnia aktywność"}.
{"Last login","Ostatnie logowanie"}.
{"Last month","Miniony miesiąc"}.
{"Last year","Miniony rok"}.
{"leaves the room","opuszcza pokój"}.
{"Listened Ports at ","Porty nasłuchujące na "}.
{"Listened Ports","Porty nasłuchujące"}.
{"List of modules to start","Lista modułów do uruchomienia"}.
{"Low level update script","Skrypt aktualizacji niskiego poziomu"}.
{"Make participants list public","Upublicznij listę uczestników"}.
{"Make room CAPTCHA protected","Pokój zabezpieczony captchą"}.
{"Make room members-only","Pokój tylko dla członków"}.
{"Make room moderated","Pokój moderowany"}.
{"Make room password protected","Pokój zabezpieczony hasłem"}.
{"Make room persistent","Utwórz pokój na stałe"}.
{"Make room public searchable","Pozwól wyszukiwać pokój"}.
{"March","Marzec"}.
{"Maximum Number of Occupants","Maksymalna liczba uczestników"}.
{"Max # of items to persist","Maksymalna liczba przechowywanych przedmiotów"}.
{"Max payload size in bytes","Maksymalna wielkość powiadomienia w bajtach"}.
{"May","Maj"}.
{"Members:","Członkowie:"}.
{"Membership is required to enter this room","Musisz być na liście członków tego pokoju aby do niego wejść"}.
{"Memorize your password, or write it in a paper placed in a safe place. In Jabber there isn't an automated way to recover your password if you forget it.","Zapamiętaj swoje hasło lub zapisz je na kartce i zachowaj w bezpiecznym miejscu. Na Jabberze nie ma zautomatyzowanego systemu odzyskiwania haseł."}.
{"Memory","Pamięć"}.
{"Message body","Treść wiadomości"}.
{"Middle Name","Drugie imię"}.
{"Minimum interval between voice requests (in seconds)","Minimalny odstęp między żądaniami głosowymi (w sekundach)"}.
{"Moderator privileges required","Wymagane uprawnienia moderatora"}.
{"moderators only","tylko moderatorzy"}.
{"Modified modules","Zmodyfikowane moduły"}.
{"Module","Moduł"}.
{"Modules at ","Moduły na "}.
{"Modules","Moduły"}.
{"Monday","Poniedziałek"}.
{"Name","Imię"}.
{"Name:","Nazwa:"}.
{"Never","Nigdy"}.
{"New Password:","Nowe hasło:"}.
{"Nickname","Nazwa użytkownika"}.
{"Nickname Registration at ","Rejestracja nazwy użytkownika na "}.
{"Nickname ~s does not exist in the room","Nie ma nicka ~s w tym pokoju"}.
{"nobody","nikt"}.
{"No body provided for announce message","Brak treści powiadomienia"}.
{"No Data","Brak danych"}.
{"Node ID","ID węzła"}.
{"Node not found","Węzeł nie został znaleziony"}.
{"Nodes","Węzły"}.
{"Node ","Węzeł "}.
{"No limit","Bez limitu"}.
{"None","Brak"}.
{"No resource provided","Nie podano zasobu"}.
{"Not Found","Nie znaleziono"}.
{"Notify subscribers when items are removed from the node","Informuj subskrybentów o usunięciu elementów węzła"}.
{"Notify subscribers when the node configuration changes","Informuj subskrybentów o zmianach konfiguracji węzła"}.
{"Notify subscribers when the node is deleted","Informuj subskrybentów o usunięciu węzła"}.
{"November","Listopad"}.
{"Number of occupants","Liczba uczestników"}.
{"Number of online users","Liczba zalogowanych użytkowników"}.
{"Number of registered users","Liczba zarejestrowanych użytkowników"}.
{"October","Październik"}.
{"Offline Messages:","Wiadomości offline:"}.
{"Offline Messages","Wiadomości offline"}.
{"OK","OK"}.
{"Old Password:","Stare hasło:"}.
{"Online","Dostępny"}.
{"Online Users:","Użytkownicy zalogowani:"}.
{"Online Users","Użytkownicy zalogowani"}.
{"Only deliver notifications to available users","Dostarczaj powiadomienia tylko dostępnym użytkownikom"}.
{"Only moderators and participants are allowed to change the subject in this room","Tylko moderatorzy i uczestnicy mogą zmienić temat tego pokoju"}.
{"Only moderators are allowed to change the subject in this room","Tylko moderatorzy mogą zmienić temat tego pokoju"}.
{"Only moderators can approve voice requests","Tylko moderatorzy mogą zatwierdzać żądania głosowe"}.
{"Only occupants are allowed to send messages to the conference","Tylko uczestnicy mogą wysyłać wiadomości na konferencję"}.
{"Only occupants are allowed to send queries to the conference","Tylko uczestnicy mogą wysyłać zapytania do konferencji"}.
{"Only service administrators are allowed to send service messages","Tylko administratorzy mogą wysyłać wiadomości"}.
{"Options","Opcje"}.
{"Organization Name","Nazwa organizacji"}.
{"Organization Unit","Dział"}.
{"Outgoing s2s Connections:","Wychodzące połączenia s2s:"}.
{"Outgoing s2s Connections","Wychodzące połączenia s2s"}.
{"Outgoing s2s Servers:","Serwery zewnętrzne s2s:"}.
{"Owner privileges required","Wymagane uprawnienia właściciela"}.
{"Packet","Pakiet"}.
{"Password ~b","Hasło ~b"}.
{"Password:","Hasło:"}.
{"Password","Hasło"}.
{"Password Verification:","Weryfikacja hasła:"}.
{"Password Verification","Weryfikacja hasła"}.
{"Path to Dir","Ścieżka do katalogu"}.
{"Path to File","Scieżka do pliku"}.
{"Pending","Oczekuje"}.
{"Period: ","Przedział czasu: "}.
{"Persist items to storage","Przechowuj na stałe dane PubSub"}.
{"Ping","Ping"}.
{"Please note that these options will only backup the builtin Mnesia database. If you are using the ODBC module, you also need to backup your SQL database separately.","Te opcje kopii zapasowych dotyczą tylko wbudowanej bazy danych typu Mnesia. Jeśli korzystasz z modułu ODBC, musisz wykonać kopie bazy we własnym zakresie."}.
{"Please, wait for a while before sending new voice request","Proszę poczekać chwile, zanim wyślesz nowe żądanie głosowe"}.
{"Pong","Pong"}.
{"Port ~b","Port ~b"}.
{"Port","Port"}.
{"Present real Jabber IDs to","Prawdziwe Jabber ID widoczne dla"}.
{"private, ","prywatny, "}.
{"Protocol","Protokół"}.
{"Publish-Subscribe","PubSub"}.
{"PubSub subscriber request","Żądanie subskrybcji PubSub"}.
{"Purge all items when the relevant publisher goes offline","Usuń wszystkie elementy w momencie kiedy publikujący rozłączy się"}.
{"Queries to the conference members are not allowed in this room","Informacje o członkach konferencji nie są dostępne w tym pokoju"}.
{"RAM and disc copy","Kopia na dysku i w pamięci RAM"}.
{"RAM copy","Kopia w pamięci RAM"}.
{"Raw","Żródło"}.
{"Really delete message of the day?","Na pewno usunąć wiadomość dnia?"}.
{"Recipient is not in the conference room","Odbiorcy nie ma w pokoju"}.
{"Register a Jabber account","Załóż konto Jabber"}.
{"Registered Users:","Użytkownicy zarejestrowani:"}.
{"Registered Users","Użytkownicy zarejestrowani"}.
{"Register","Zarejestruj"}.
{"Registration in mod_irc for ","Rejestracja w mod_irc dla "}.
{"Remote copy","Kopia zdalna"}.
{"Remove All Offline Messages","Usuń wszystkie wiadomości typu 'Offline'"}.
{"Remove User","Usuń użytkownika"}.
{"Remove","Usuń"}.
{"Replaced by new connection","Połączenie zostało zastąpione"}.
{"Resources","Zasoby"}.
{"Restart Service","Restart usługi"}.
{"Restart","Uruchom ponownie"}.
{"Restore Backup from File at ","Odtwórz bazę danych z kopii zapasowej na "}.
{"Restore binary backup after next ejabberd restart (requires less memory):","Odtwórz kopię binarną podczas następnego uruchomienia ejabberd (wymaga mniej zasobów):"}.
{"Restore binary backup immediately:","Natychmiast odtwórz kopię binarną:"}.
{"Restore plain text backup immediately:","Natychmiast odtwórz kopię z postaci tekstowej:"}.
{"Restore","Przywróć z kopii"}.
{"Room Configuration","Konfiguracja pokoju"}.
{"Room creation is denied by service policy","Zasady serwera zabraniają tworzyć nowe pokoje"}.
{"Room description","Opis pokoju"}.
{"Room Occupants","Lista uczestników"}.
{"Room title","Tytuł pokoju"}.
{"Roster groups allowed to subscribe","Grupy kontaktów uprawnione do subskrypcji"}.
{"Roster","Lista kontaktów"}.
{"Roster of ","Lista kontaktów "}.
{"Roster size","Rozmiar listy kontaktów"}.
{"RPC Call Error","Błąd żądania RPC"}.
{"Running Nodes","Uruchomione węzły"}.
{"~s access rule configuration","~s konfiguracja zasad dostępu"}.
{"Saturday","Sobota"}.
{"Script check","Sprawdź skrypt"}.
{"Search Results for ","Wyniki wyszukiwania dla "}.
{"Search users in ","Wyszukaj użytkowników w "}.
{"Send announcement to all online users on all hosts","Wyślij powiadomienie do wszystkich zalogowanych użytkowników na wszystkich hostach"}.
{"Send announcement to all online users","Wyślij powiadomienie do wszystkich zalogowanych użytkowników"}.
{"Send announcement to all users on all hosts","Wyślij powiadomienie do wszystkich użytkowników na wszystkich hostach"}.
{"Send announcement to all users","Wyślij powiadomienie do wszystkich użytkowników"}.
{"September","Wrzesień"}.
{"Server ~b","Serwer ~b"}.
{"Server:","Serwer:"}.
{"Set message of the day and send to online users","Wyślij wiadomość dnia do wszystkich zalogowanych użytkowników"}.
{"Set message of the day on all hosts and send to online users","Ustaw wiadomość dnia dla wszystkich hostów i wyślij do zalogowanych uzytkowników"}.
{"Shared Roster Groups","Wspólne grupy kontaktów"}.
{"Show Integral Table","Pokaż tabelę całkowitą"}.
{"Show Ordinary Table","Pokaż zwykłą tabelę"}.
{"Shut Down Service","Wyłącz usługę"}.
{"~s invites you to the room ~s","~s zaprasza Cię do pokoju ~s"}.
{"Some Jabber clients can store your password in your computer. Use that feature only if you trust your computer is safe.","Niektóre klienty Jabber mogą zapisywać Twoje hasło na komputerze. Używaj tej opcji tylko jeśli ufasz komputerowi na którym pracujesz."}.
{"Specify the access model","Określ model dostępu"}.
{"Specify the event message type","Określ typ wiadomości"}.
{"Specify the publisher model","Określ model publikującego"}.
{"~s's Offline Messages Queue","Kolejka wiadomości offline użytkownika ~s"}.
{"Start Modules at ","Uruchom moduły na "}.
{"Start Modules","Uruchom moduły"}.
{"Start","Uruchom"}.
{"Statistics of ~p","Statystyki ~p"}.
{"Statistics","Statystyki"}.
{"Stop Modules at ","Zatrzymaj moduły na "}.
{"Stop Modules","Zatrzymaj moduły"}.
{"Stopped Nodes","Zatrzymane węzły"}.
{"Stop","Zatrzymaj"}.
{"Storage Type","Typ bazy"}.
{"Store binary backup:","Zachowaj kopię binarną:"}.
{"Store plain text backup:","Zachowaj kopię w postaci tekstowej:"}.
{"Subject","Temat"}.
{"Submitted","Wprowadzone"}.
{"Submit","Wyślij"}.
{"Subscriber Address","Adres subskrybenta"}.
{"Subscription","Subskrypcja"}.
{"Sunday","Niedziela"}.
{"That nickname is already in use by another occupant","Ta nazwa użytkownika jest używana przez kogoś innego"}.
{"That nickname is registered by another person","Ta nazwa użytkownika jest już zarejestrowana przez inną osobę"}.
{"The CAPTCHA is valid.","Captcha jest poprawna."}.
{"The CAPTCHA verification has failed","Weryfikacja CAPTCHA nie powiodła się."}.
{"The collections with which a node is affiliated","Grupy, do których należy węzeł"}.
{"the password is","hasło to:"}.
{"The password is too weak","Hasło nie jest wystarczająco trudne"}.
{"The password of your Jabber account was successfully changed.","Hasło do Twojego konta zostało zmienione."}.
{"There was an error changing the password: ","Podczas próby zmiany hasła wystąpił błąd:"}.
{"There was an error creating the account: ","Wystąpił błąd podczas tworzenia konta:"}.
{"There was an error deleting the account: ","Podczas usuwania konta wystąpił błąd:"}.
{"This is case insensitive: macbeth is the same that MacBeth and Macbeth.","Pole nie rozróżnia wielkości liter: słowo Hanna jest takie samo jak hAnna lub haNNa."}.
{"This page allows to create a Jabber account in this Jabber server. Your JID (Jabber IDentifier) will be of the form: username@server. Please read carefully the instructions to fill correctly the fields.","Niniejsza strona pozwala na założenie konta Jabber na tym serwerze. Twój JID (Jabber IDentyfikator) będzie miał postać: nazwa_użytkownika@serwer. Przeczytaj dokładnie instrukcję i wypełnij pola."}.
{"This page allows to unregister a Jabber account in this Jabber server.","Ta strona pozwala usunąć konto Jabber z tego serwera."}.
{"This participant is kicked from the room because he sent an error message","Ten uczestnik został wyrzucony z pokoju ponieważ wysłał komunikat błędu"}.
{"This participant is kicked from the room because he sent an error message to another participant","Ten uczestnik został wyrzucony z pokoju ponieważ wysłał komunikat błędu do innego uczestnika"}.
{"This participant is kicked from the room because he sent an error presence","Ten uczestnik został wyrzucony z pokoju ponieważ jego informacja o statusie zawierała błędy"}.
{"This room is not anonymous","Ten pokój nie jest anonimowy"}.
{"Thursday","Czwartek"}.
{"Time","Czas"}.
{"Time delay","Opóźnienie"}.
{"To","Do"}.
{"Too many CAPTCHA requests","Za dużo żądań CAPTCHA"}.
{"To ~s","Do ~s"}.
{"Traffic rate limit is exceeded","Limit transferu przekroczony"}.
{"Transactions Aborted:","Transakcje anulowane:"}.
{"Transactions Committed:","Transakcje zakończone:"}.
{"Transactions Logged:","Transakcje zalogowane:"}.
{"Transactions Restarted:","Transakcje uruchomione ponownie:"}.
{"Tuesday","Wtorek"}.
{"Unable to generate a CAPTCHA","Nie można wygenerować CAPTCHA"}.
{"Unauthorized","Nie autoryzowano"}.
{"Unregister a Jabber account","Usuń konto Jabber"}.
{"Unregister","Wyrejestruj"}.
{"Update","Aktualizuj"}.
{"Update message of the day (don't send)","Aktualizuj wiadomość dnia (bez wysyłania)"}.
{"Update message of the day on all hosts (don't send)","Aktualizuj wiadomość dnia na wszystkich hostach (bez wysyłania)"}.
{"Update plan","Plan aktualizacji"}.
{"Update script","Skrypt aktualizacji"}.
{"Update ","Uaktualnij "}.
{"Uptime:","Czas pracy:"}.
{"Use of STARTTLS required","Wymagane jest użycie STARTTLS"}.
{"User JID","Użytkownik "}.
{"User Management","Zarządzanie użytkownikami"}.
{"Username:","Nazwa użytkownika:"}.
{"Users are not allowed to register accounts so quickly","Użytkowncy nie mogą tak szybko rejestrować nowych kont"}.
{"Users Last Activity","Ostatnia aktywność użytkowników"}.
{"Users","Użytkownicy"}.
{"User ","Użytkownik "}.
{"User","Użytkownik"}.
{"Validate","Potwierdź"}.
{"vCard User Search","Wyszukiwanie vCard użytkowników"}.
{"Virtual Hosts","Wirtualne Hosty"}.
{"Visitors are not allowed to change their nicknames in this room","Uczestnicy tego pokoju nie mogą zmieniać swoich nicków"}.
{"Visitors are not allowed to send messages to all occupants","Odwiedzający nie mogą wysyłać wiadomości do wszystkich obecnych"}.
{"Voice requests are disabled in this conference","Głosowe żądania są wyłączone w tym pokoju"}.
{"Voice request","Żądanie głosowe"}.
{"Wednesday","Środa"}.
{"When to send the last published item","Kiedy wysłać ostatnio opublikowaną rzecz"}.
{"Whether to allow subscriptions","Czy pozwolić na subskrypcje"}.
{"You can later change your password using a Jabber client.","Możesz później zmienić swoje hasło za pomocą dowolnego klienta Jabber."}.
{"You have been banned from this room","Zostałeś wykluczony z tego pokoju"}.
{"You must fill in field \"Nickname\" in the form","Musisz wypełnić pole \"Nazwa użytkownika\" w formularzu"}.
{"You need a client that supports x:data and CAPTCHA to register","Potrzebujesz klienta obsługującego x:data aby zarejestrować nick"}.
{"You need a client that supports x:data to register the nickname","Potrzebujesz klienta obsługującego x:data aby zarejestrować nick"}.
{"You need an x:data capable client to configure mod_irc settings","Potrzebujesz klienta obsługującego x:data aby skonfigurować mod_irc"}.
{"You need an x:data capable client to configure room","Potrzebujesz klienta obsługującego x:data aby skonfigurować pokój"}.
{"You need an x:data capable client to search","Potrzebujesz klienta obsługującego x:data aby wyszukiwać"}.
{"Your active privacy list has denied the routing of this stanza.","Aktualna lista prywatności zabrania przesyłania tej stanzy"}.
{"Your contact offline message queue is full. The message has been discarded.","Kolejka wiadomości offline adresata jest pełna. Wiadomość została odrzucona."}.
{"Your Jabber account was successfully created.","Twoje konto zostało stworzone."}.
{"Your Jabber account was successfully deleted.","Twoje konto zostało usunięte."}.
{"Your messages to ~s are being blocked. To unblock them, visit ~s","Twoje wiadomości do ~s są blokowane. Aby je odblokować, odwiedź ~s"}.
ejabberd-2.1.11/src/msgs/pt-br.msg 0000664 0000000 0000000 00000064543 12240230175 013526 0 ustar {"Access Configuration","Configuração de Acesso"}.
{"Access Control List Configuration","Configuração da Lista de Controle de Acesso"}.
{"Access control lists","Listas de Controle de Acesso"}.
{"Access Control Lists","Listas de Controle de Acesso"}.
{"Access denied by service policy","Aceso denegado por la política do serviço"}.
{"Access rules","Regras de acesso"}.
{"Access Rules","Regras de Acesso"}.
{"Action on user","Ação no usuário"}.
{"Add Jabber ID","Adicionar ID jabber"}.
{"Add New","Adicionar novo"}.
{"Add User","Adicionar usuário"}.
{"Administration","Administração"}.
{"Administration of ","Administração de "}.
{"Administrator privileges required","Se necessita privilégios de administrador"}.
{"A friendly name for the node","Um nome familiar para o nó"}.
{"All activity","Todas atividades"}.
{"Allow this Jabber ID to subscribe to this pubsub node?","Autorizar este Jabber ID para a inscrição neste tópico pubsub?"}.
{"Allow users to change the subject","Permitir a usuários modificar o assunto"}.
{"Allow users to query other users","Permitir a usuários pesquisar informações sobre os demais"}.
{"Allow users to send invites","Permitir a usuários envio de convites"}.
{"Allow users to send private messages","Permitir a usuários enviarem mensagens privadas"}.
{"Allow visitors to change nickname","Permitir mudança de apelido aos visitantes"}.
{"Allow visitors to send status text in presence updates","Permitir atualizações de status aos visitantes"}.
{"All Users","Todos os usuários"}.
{"Announcements","Anúncios"}.
{"anyone","qualquer um"}.
{"A password is required to enter this room","Se necessita senha para entrar em esta sala"}.
{"April","Abril"}.
{"August","Agosto"}.
{"Backup Management","Gestão de Backup"}.
{"Backup of ","Backup de "}.
{"Backup","Salvar cópia de segurança"}.
{"Backup to File at ","Salvar backup para arquivo em "}.
{"Bad format","Formato incorreto"}.
{"Birthday","Aniversário"}.
{"Change Password","Mudar senha"}.
{"Change User Password","Alterar Senha do Usuário"}.
{"Characters not allowed:","Caracteres não aceitos:"}.
{"Chatroom configuration modified","Configuração da sala de bate-papo modificada"}.
{"Chatroom is created","A sala de chat está criada"}.
{"Chatroom is destroyed","A sala de chat está destruída"}.
{"Chatroom is started","A sala de chat está inciada"}.
{"Chatroom is stopped","A sala de chat está parada"}.
{"Chatrooms","Salas de Chat"}.
{"Choose a username and password to register with this server","Escolha um nome de usuário e senha para registrar-se neste servidor"}.
{"Choose modules to stop","Selecione módulos a parar"}.
{"Choose storage type of tables","Selecione o tipo de armazenamento das tabelas"}.
{"Choose whether to approve this entity's subscription.","Aprovar esta assinatura."}.
{"City","Cidade"}.
{"Commands","Comandos"}.
{"Conference room does not exist","La sala de conferencias não existe"}.
{"Configuration","Configuração"}.
{"Configuration of room ~s","Configuração para ~s"}.
{"Connected Resources:","Recursos conectados:"}.
{"Connections parameters","Parâmetros para as Conexões"}.
{"Country","País"}.
{"CPU Time:","Tempo de CPU"}.
{"Database","Base de dados"}.
{"Database Tables at ","Tabelas de base de dados em "}.
{"Database Tables Configuration at ","Configuração de Tabelas de Base de dados em "}.
{"December","Dezembro"}.
{"Default users as participants","Usuários padrões como participantes"}.
{"Delete","Eliminar"}.
{"Delete message of the day","Apagar mensagem do dia"}.
{"Delete message of the day on all hosts","Apagar a mensagem do dia em todos os hosts"}.
{"Delete Selected","Remover os selecionados"}.
{"Delete User","Deletar Usuário"}.
{"Deliver event notifications","Entregar as notificações de evento"}.
{"Deliver payloads with event notifications","Enviar payloads junto com as notificações de eventos"}.
{"Description:","Descrição:"}.
{"Disc only copy","Somente copia em disco"}.
{"Don't tell your password to anybody, not even the administrators of the Jabber server.","Não revele o seu computador a ninguém, mesmo para o administrador deste servidor Jabber."}.
{"Dump Backup to Text File at ","Exportar backup para texto em "}.
{"Dump to Text File","Exportar para arquivo de texto"}.
{"Edit Properties","Editar propriedades"}.
{"Either approve or decline the voice request.","Você deve aprovar/desaprovar a requisição de voz."}.
{"ejabberd IRC module","Módulo de IRC para ejabberd"}.
{"ejabberd MUC module","Módulo de MUC para ejabberd"}.
{"ejabberd Publish-Subscribe module","Módulo para Publicar Tópicos do ejabberd"}.
{"ejabberd SOCKS5 Bytestreams module","Modulo ejabberd SOCKS5 Bytestreams"}.
{"ejabberd vCard module","Módulo vCard para ejabberd"}.
{"ejabberd Web Admin","ejabberd Web Admin"}.
{"Elements","Elementos"}.
{"Email","Email"}.
{"Enable logging","Permitir criação de logs"}.
{"Encoding for server ~b","Codificação para o servidor ~b"}.
{"End User Session","Terminar Sessão do Usuário"}.
{"Enter list of {Module, [Options]}","Introduza lista de {módulo, [opções]}"}.
{"Enter nickname you want to register","Introduza o apelido que quer registrar"}.
{"Enter path to backup file","Introduza o caminho do arquivo de backup"}.
{"Enter path to jabberd14 spool dir","Introduza o caminho para o diretório de fila do jabberd14"}.
{"Enter path to jabberd14 spool file","Insira o caminho para a fila (arquivo) do jabberd14"}.
{"Enter path to text file","Introduza caminho para o arquivo texto"}.
{"Enter the text you see","Insira o texto que você vê"}.
{"Enter username and encodings you wish to use for connecting to IRC servers. Press 'Next' to get more fields to fill in. Press 'Complete' to save settings.","Insira o nome de usuário e codificações que você deseja usar para conectar-se aos servidores de IRC. Depois, presione 'Next' ('Próximo') para exibir mais campos que devem ser preenchidos. Ao final, pressione 'Complete' ('Completar') para salvar a configuração."}.
{"Enter username, encodings, ports and passwords you wish to use for connecting to IRC servers","Insira o nome de usuário, codificações, portas e senhas que vocêdeseja para usar nos servidores IRC"}.
{"Erlang Jabber Server","Servidor Jabber em Erlang"}.
{"Error","Erro"}.
{"Example: [{\"irc.lucky.net\", \"koi8-r\", 6667, \"secret\"}, {\"vendetta.fef.net\", \"iso8859-1\", 7000}, {\"irc.sometestserver.net\", \"utf-8\"}].","Exemplo: [{\"irc.teste.net\", \"koi8-r\"}, 6667, \"senha\"}, {\"dominio.foo.net\", \"iso8859-1\", 7000}, {\"irc.servidordeteste.net\", \"utf-8\"}]."}.
{"Exclude Jabber IDs from CAPTCHA challenge","Excluir IDs Jabber de serem submetidos ao CAPTCHA"}.
{"Export data of all users in the server to PIEFXIS files (XEP-0227):","Exportar todos os dados de todos os usuários no servidor, para arquivos formato PIEFXIS (XEP-0227):"}.
{"Export data of users in a host to PIEFXIS files (XEP-0227):","Exportar dados dos usuários em um host, para arquivos PIEFXIS (XEP-0227):"}.
{"Failed to extract JID from your voice request approval","Não foi possível extrair o JID (Jabber ID) da requisição de voz"}.
{"Family Name","Sobrenome"}.
{"February","Fevereiro"}.
{"Fill in fields to search for any matching Jabber User","Preencha campos para buscar usuários Jabber que concordem"}.
{"Fill in the form to search for any matching Jabber User (Add * to the end of field to match substring)","Preencha o formulário para buscar usuários Jabber. Agrega * ao final de um campo para buscar sub-palavras."}.
{"Friday","Sexta"}.
{"From","De"}.
{"From ~s","De ~s"}.
{"Full Name","Nome completo"}.
{"Get Number of Online Users","Obter Número de Usuários Online"}.
{"Get Number of Registered Users","Obter Número de Usuários Registrados"}.
{"Get User Last Login Time","Obter a Data do Último Login"}.
{"Get User Password","Obter Senha do Usuário"}.
{"Get User Statistics","Obter Estatísticas do Usuário"}.
{"Group ","Grupo "}.
{"Groups","Grupos"}.
{"has been banned","foi banido"}.
{"has been kicked because of an affiliation change","foi desconectado porque por afiliação inválida"}.
{"has been kicked because of a system shutdown","foi desconectado porque o sistema foi desligado"}.
{"has been kicked because the room has been changed to members-only","foi desconectado porque a política da sala mudou, só membros são permitidos"}.
{"has been kicked","foi removido"}.
{" has set the subject to: "," a posto o assunto: "}.
{"Host","Máquina"}.
{"If you want to specify different ports, passwords, encodings for IRC servers, fill this list with values in format '{\"irc server\", \"encoding\", port, \"password\"}'. By default this service use \"~s\" encoding, port ~p, empty password.","Se você deseja especificar portas diferentes, senhas ou codifações para servidores de IRC, complete esta lista com os valores no formato: '{\"servidor IRC\", \"codificação\", porta, \"senha\"}'. Por padrão, este serviço usa a codificação \"~s\", porta \"~p\", e senha em branco (vazia)"}.
{"Import Directory","Importar diretório"}.
{"Import File","Importar arquivo"}.
{"Import user data from jabberd14 spool file:","Importar dados dos usuários de uma fila jabberd14:"}.
{"Import User from File at ","Importar usuário a partir do arquivo em "}.
{"Import users data from a PIEFXIS file (XEP-0227):","Importar usuários de um arquivo PIEFXIS (XEP-0227): "}.
{"Import users data from jabberd14 spool directory:","Importar dados dos usuários de um diretório-fila jabberd14:"}.
{"Import Users from Dir at ","Importar usuários a partir do diretório em "}.
{"Import Users From jabberd14 Spool Files","Importar usuários de arquivos jabberd14"}.
{"Improper message type","Tipo de mensagem incorreto"}.
{"Incorrect password","Senha incorreta"}.
{"Invalid affiliation: ~s","Afiliação não válida: ~s"}.
{"Invalid role: ~s","Cargo (role) é não válido: ~s"}.
{"IP addresses","Endereços IP"}.
{"IP","IP"}.
{"IRC channel (don't put the first #)","Canal IRC (não coloque o #)"}.
{"IRC server","Servidor IRC"}.
{"IRC settings","Configurações do IRC"}.
{"IRC Transport","Transporte IRC"}.
{"IRC username","Usuário IRC"}.
{"IRC Username","Usuário IRC"}.
{"is now known as","é agora conhecido como"}.
{"It is not allowed to send private messages","Não é permitido enviar mensagens privadas"}.
{"It is not allowed to send private messages of type \"groupchat\"","No está permitido enviar mensagens privados do tipo \"groupchat\""}.
{"It is not allowed to send private messages to the conference","Impedir o envio de mensagens privadas para a sala"}.
{"Jabber Account Registration","Registros de Contas Jabber"}.
{"Jabber ID","ID Jabber"}.
{"Jabber ID ~s is invalid","O Jabber ID ~s não es válido"}.
{"January","Janeiro"}.
{"Join IRC channel","Juntar-se ao canal IRC"}.
{"joins the room","Entrar na sala"}.
{"Join the IRC channel here.","Aqui! Juntar-se ao canal IRC."}.
{"Join the IRC channel in this Jabber ID: ~s","Entrar no canal IRC, neste ID Jabber: ~s"}.
{"July","Julho"}.
{"June","Junho"}.
{"Last Activity","Última atividade"}.
{"Last login","Último login"}.
{"Last month","Último mês"}.
{"Last year","Último ano"}.
{"leaves the room","Sair da sala"}.
{"Listened Ports at ","Portas ouvintes em "}.
{"Listened Ports","Portas escutadas"}.
{"List of modules to start","Listas de módulos para inicializar"}.
{"Low level update script","Script de atualização low level"}.
{"Make participants list public","Tornar pública a lista de participantes"}.
{"Make room CAPTCHA protected","Tornar protegida a senha da sala"}.
{"Make room members-only","Tornar sala apenas para membros"}.
{"Make room moderated","Tornar a sala moderada"}.
{"Make room password protected","Tornar protegida a senha da sala"}.
{"Make room persistent","Tornar sala persistente"}.
{"Make room public searchable","Tornar sala pública possível de ser encontrada"}.
{"March","Março"}.
{"Maximum Number of Occupants","Número máximo de participantes"}.
{"Max # of items to persist","Máximo # de elementos que persistem"}.
{"Max payload size in bytes","Máximo tamanho do payload em bytes"}.
{"May","Maio"}.
{"Membership is required to enter this room","Necessitas ser membro de esta sala para poder entrar"}.
{"Members:","Miembros:"}.
{"Memorize your password, or write it in a paper placed in a safe place. In Jabber there isn't an automated way to recover your password if you forget it.","Memorize a sua senha, ou escreva-a em um papel e guarde-o em um lugar seguro. Jabber não é uma maneira automatizada para recuperar a sua senha, se você a esquecer eventualmente."}.
{"Memory","Memória"}.
{"Message body","Corpo da mensagem"}.
{"Middle Name","Nome do meio"}.
{"Minimum interval between voice requests (in seconds)","O intervalo mínimo entre requisições de voz (em segundos)"}.
{"Moderator privileges required","Se necessita privilégios de moderador"}.
{"moderators only","apenas moderadores"}.
{"Modified modules","Módulos atualizados"}.
{"Module","Módulo"}.
{"Modules at ","Módulos em "}.
{"Modules","Módulos"}.
{"Monday","Segunda"}.
{"Name:","Nome:"}.
{"Name","Nome"}.
{"Never","Nunca"}.
{"Nickname","Apelido"}.
{"Nickname Registration at ","Registro do apelido em "}.
{"Nickname ~s does not exist in the room","O nick ~s não existe em la sala"}.
{"nobody","ninguém"}.
{"No body provided for announce message","Nenhum corpo de texto fornecido para anunciar mensagem"}.
{"No Data","Nenhum dado"}.
{"Node ID","ID do Tópico"}.
{"Node ","Nó"}.
{"Node not found","Nó não encontrado"}.
{"Nodes","Nós"}.
{"No limit","Ilimitado"}.
{"None","Nenhum"}.
{"No resource provided","Nenhum recurso foi informado"}.
{"Not Found","Não encontrado"}.
{"Notify subscribers when items are removed from the node","Notificar subscritores quando os elementos se eliminem do nodo"}.
{"Notify subscribers when the node configuration changes","Notificar subscritores quando cambia la configuração do nodo"}.
{"Notify subscribers when the node is deleted","Notificar subscritores quando o nodo se elimine"}.
{"November","Novembro"}.
{"Number of occupants","Número de participantes"}.
{"Number of online users","Número de usuários online"}.
{"Number of registered users","Número de usuários registrados"}.
{"October","Outubro"}.
{"Offline Messages:","Mensagens offline"}.
{"Offline Messages","Mensagens offline"}.
{"OK","OK"}.
{"Online","Conectado"}.
{"Online Users","Usuários conectados"}.
{"Online Users:","Usuários online"}.
{"Only deliver notifications to available users","Solo enviar notificações aos usuários disponíveis"}.
{"Only moderators and participants are allowed to change the subject in this room","Somente os moderadores e os participamentes podem alterar o assunto desta sala"}.
{"Only moderators are allowed to change the subject in this room","Somente os moderadores podem alterar o assunto desta sala"}.
{"Only moderators can approve voice requests","Somente moderadores podem aprovar requisições de voz"}.
{"Only occupants are allowed to send messages to the conference","Solo os ocupantes podem enviar mensagens a la sala"}.
{"Only occupants are allowed to send queries to the conference","Solo os ocupantes podem enviar consultas a la sala"}.
{"Only service administrators are allowed to send service messages","Apenas administradores possuem permissão para enviar mensagens de serviço"}.
{"Options","Opções"}.
{"Organization Name","Nome da organização"}.
{"Organization Unit","Departamento/Unidade"}.
{"Outgoing s2s Connections","Conexões que partam de s2s"}.
{"Outgoing s2s Connections:","Conexões que partem de s2s"}.
{"Outgoing s2s Servers:","Servidores que partem de s2s"}.
{"Owner privileges required","Se requere privilégios de proprietário da sala"}.
{"Packet","Pacote"}.
{"Password ~b","Senha ~b"}.
{"Password:","Senha:"}.
{"Password","Senha"}.
{"Password Verification","Verificação de Senha"}.
{"Path to Dir","Caminho para o diretório"}.
{"Path to File","Caminho do arquivo"}.
{"Pending","Pendente"}.
{"Period: ","Período: "}.
{"Persist items to storage","Persistir elementos ao armazenar"}.
{"Ping","Ping"}.
{"Please note that these options will only backup the builtin Mnesia database. If you are using the ODBC module, you also need to backup your SQL database separately.","Observe que tais opções farão backup apenas da base de dados Mnesia. Caso você esteja utilizando o modulo ODBC, você precisará fazer backup de sua base de dados SQL separadamente."}.
{"Please, wait for a while before sending new voice request","Por favor, espere antes de enviar uma nova requisição de voz"}.
{"Pong","Pong"}.
{"Port ~b","Porta ~b"}.
{"Port","Porta"}.
{"Present real Jabber IDs to","Tornar o Jabber ID real visível por"}.
{"private, ","privado, "}.
{"Protocol","Porta"}.
{"Publish-Subscribe","Publicação de Tópico"}.
{"PubSub subscriber request","PubSub requisição de assinante"}.
{"Purge all items when the relevant publisher goes offline","Descartar todos os itens quando o publicante principal estiver offline"}.
{"Queries to the conference members are not allowed in this room","Nesta sala não se permite consultas aos membros da sala"}.
{"RAM and disc copy","Copias na RAM e disco rígido"}.
{"RAM copy","Copia em RAM"}.
{"Raw","Intocado"}.
{"Really delete message of the day?","Deletar realmente a mensagem do dia?"}.
{"Recipient is not in the conference room","O receptor não está em la sala de conferencia"}.
{"Register a Jabber account","Registrar uma conta Jabber"}.
{"Registered Users:","Usuários registrados"}.
{"Registered Users","Usuários Registrados"}.
{"Registration in mod_irc for ","Registro em mod_irc para "}.
{"Remote copy","Copia remota"}.
{"Remove All Offline Messages","Remover Todas as Mensagens Offline"}.
{"Remove","Remover"}.
{"Remove User","Remover usuário"}.
{"Replaced by new connection","Substituído por nova conexão"}.
{"Resources","Recursos"}.
{"Restart","Reiniciar"}.
{"Restart Service","Reiniciar Serviço"}.
{"Restore Backup from File at ","Restaurar backup a partir do arquivo em "}.
{"Restore binary backup after next ejabberd restart (requires less memory):","Restaurar backup binário após próximo reinicialização do ejabberd (requer menos memória):"}.
{"Restore binary backup immediately:","Restaurar backup binário imediatamente"}.
{"Restore plain text backup immediately:","Restaurar backup formato texto imediatamente:"}.
{"Restore","Restaurar"}.
{"Room Configuration","Configuração de salas"}.
{"Room creation is denied by service policy","Se te a denegado criar la sala por política do serviço"}.
{"Room description","Descrição da Sala"}.
{"Room Occupants","Número de participantes"}.
{"Room title","Título da sala"}.
{"Roster groups allowed to subscribe","Listar grupos autorizados"}.
{"Roster","Lista de contatos"}.
{"Roster of ","Lista de contatos de "}.
{"Roster size","Tamanho da Lista"}.
{"RPC Call Error","Erro de chamada RPC"}.
{"Running Nodes","Nos em execução"}.
{"~s access rule configuration","Configuração da Regra de Acesso ~s"}.
{"Saturday","Sábado"}.
{"Script check","Verificação de Script"}.
{"Search Results for ","Resultados de pesquisa para "}.
{"Search users in ","Procurar usuários em "}.
{"Send announcement to all online users","Enviar anúncio a todos os usuárions online"}.
{"Send announcement to all online users on all hosts","Enviar anúncio a todos usuários online em todas as máquinas"}.
{"Send announcement to all users","Enviar anúncio a todos os usuários"}.
{"Send announcement to all users on all hosts","Enviar aviso para todos os usuários em todos os hosts"}.
{"September","Setembro"}.
{"Server ~b","Servidor ~b"}.
{"Set message of the day and send to online users","Definir mensagem do dia e enviar a todos usuários online"}.
{"Set message of the day on all hosts and send to online users","Definir mensagem do dia em todos os hosts e enviar para os usuários online"}.
{"Shared Roster Groups","Grupos Shared Roster"}.
{"Show Integral Table","Mostrar Tabela Integral"}.
{"Show Ordinary Table","Mostrar Tabela Ordinária"}.
{"Shut Down Service","Parar Serviço"}.
{"~s invites you to the room ~s","~s convidou você para a sala ~s"}.
{"Some Jabber clients can store your password in your computer. Use that feature only if you trust your computer is safe.","Alguns clientes jabber podem salvar a sua senha no seu computador. Use recurso somente se você considera este computador seguro o suficiente."}.
{"Specify the access model","Especificar os modelos de acesso"}.
{"Specify the event message type","Especificar o tipo de mensagem para o evento"}.
{"Specify the publisher model","Especificar o modelo do publicante"}.
{"~s's Offline Messages Queue","~s's Fila de Mensagens Offline"}.
{"Start","Iniciar"}.
{"Start Modules at ","Iniciar módulos em "}.
{"Start Modules","Iniciar módulos"}.
{"Statistics","Estatísticas"}.
{"Statistics of ~p","Estatísticas de ~p"}.
{"Stop Modules at ","Parar módulos em "}.
{"Stop Modules","Parar módulos"}.
{"Stop","Parar"}.
{"Stopped Nodes","Nos parados"}.
{"Storage Type","Tipo de armazenamento"}.
{"Store binary backup:","Armazenar backup binário:"}.
{"Store plain text backup:","Armazenar backup em texto:"}.
{"Subject","Assunto"}.
{"Submit","Enviar"}.
{"Submitted","Submetido"}.
{"Subscriber Address","Endereço dos Assinantes"}.
{"Subscription","Subscrição"}.
{"Sunday","Domingo"}.
{"That nickname is already in use by another occupant","O apelido (nick) já está sendo utilizado"}.
{"That nickname is registered by another person","O nick já está registrado por outra pessoa"}.
{"The CAPTCHA is valid.","O CAPTCHA é inválido."}.
{"The CAPTCHA verification has failed","A verificação do CAPTCHA falhou"}.
{"The collections with which a node is affiliated","As coleções com as quais o nó está relacionado"}.
{"the password is","a senha é"}.
{"The password of your Jabber account was successfully changed.","A senha da sua conta Jabber foi mudada com sucesso."}.
{"There was an error changing the password: ","Houveram erros ao mudar a senha: "}.
{"There was an error creating the account: ","Houveram erras ao criar esta conta: "}.
{"There was an error deleting the account: ","Erro ao deletar esta conta: "}.
{"This is case insensitive: macbeth is the same that MacBeth and Macbeth.","Não é 'case insensitive': macbeth é o mesmo que MacBeth e ainda Macbeth. "}.
{"This page allows to create a Jabber account in this Jabber server. Your JID (Jabber IDentifier) will be of the form: username@server. Please read carefully the instructions to fill correctly the fields.","Esta pagina aceita criações de novas contas Jabber neste servidor. A sua JID (Identificador Jabber) será da seguinte forma: 'usuário@servidor'. Por favor, leia cuidadosamente as instruções para preencher corretamente os campos."}.
{"This page allows to unregister a Jabber account in this Jabber server.","Esta página aceita para deletar uma conta Jabber neste servidor."}.
{"This participant is kicked from the room because he sent an error message","Este participante foi desconectado da sala de chat por ter enviado uma mensagem de erro."}.
{"This participant is kicked from the room because he sent an error message to another participant","Este participante foi desconectado da sala de chat por ter enviado uma mensagem de erro para outro usuário."}.
{"This participant is kicked from the room because he sent an error presence","Este participante foi desconectado da sala de chat por ter enviado uma notificação errônea de presença."}.
{"This room is not anonymous","Essa sala não é anônima"}.
{"Thursday","Quinta"}.
{"Time delay","Intervalo (Tempo)"}.
{"Time","Fecha"}.
{"Too many CAPTCHA requests","Número excessivo de requisições para o CAPTCHA"}.
{"To","Para"}.
{"To ~s","Para ~s"}.
{"Traffic rate limit is exceeded","Limite de banda excedido"}.
{"Transactions Aborted:","Transações abortadas:"}.
{"Transactions Committed:","Transações salvas:"}.
{"Transactions Logged:","Transações de log:"}.
{"Transactions Restarted:","Transações reiniciadas:"}.
{"Tuesday","Terça"}.
{"Unable to generate a CAPTCHA","Impossível gerar um CAPTCHA"}.
{"Unauthorized","Não Autorizado"}.
{"Unregister a Jabber account","Deletar conta Jabber"}.
{"Unregister","Deletar registro"}.
{"Update ","Atualizar "}.
{"Update","Atualizar"}.
{"Update message of the day (don't send)","Atualizar mensagem do dia (não enviar)"}.
{"Update message of the day on all hosts (don't send)","Atualizar a mensagem do dia em todos os host (não enviar)"}.
{"Update plan","Plano de Atualização"}.
{"Update script","Script de atualização"}.
{"Uptime:","Uptime:"}.
{"Use of STARTTLS required","É obrigatório uso de STARTTLS"}.
{"User Management","Gerenciamento de Usuários"}.
{"Users are not allowed to register accounts so quickly","Usuários não estão autorizados a registrar contas imediatamente"}.
{"Users Last Activity","Ultimas atividades dos usuários"}.
{"Users","Usuários"}.
{"User ","Usuário "}.
{"User","Usuário"}.
{"Validate","Validar"}.
{"vCard User Search","Busca de Usuário vCard"}.
{"Virtual Hosts","Hosts virtuais"}.
{"Visitors are not allowed to change their nicknames in this room","Nesta sala, os visitantes não pode mudar seus apelidos"}.
{"Visitors are not allowed to send messages to all occupants","Os visitantes não podem enviar mensagens a todos os ocupantes"}.
{"Voice request","Requisição de voz"}.
{"Voice requests are disabled in this conference","Requisições de voz estào desabilitadas nesta conferência"}.
{"Wednesday","Quarta"}.
{"When to send the last published item","Quando enviar o último tópico publicado"}.
{"Whether to allow subscriptions","Permitir subscrições"}.
{"You can later change your password using a Jabber client.","Mais tarde você pode alterar a sua senha usando um cliente Jabber."}.
{"You have been banned from this room","As sido bloqueado em esta sala"}.
{"You must fill in field \"Nickname\" in the form","Você deve completar o campo \"Apelido\" no formulário"}.
{"You need an x:data capable client to configure mod_irc settings","Necessitas um cliente com suporte de x:data para configurar las opções de mod_irc"}.
{"You need an x:data capable client to configure room","Necessitas um cliente com suporte de x:data para configurar la sala"}.
{"You need an x:data capable client to search","Necessitas um cliente com suporte de x:data para poder buscar"}.
{"Your active privacy list has denied the routing of this stanza.","Sua lista de privacidade ativa negou o roteamento deste."}.
{"Your contact offline message queue is full. The message has been discarded.","Sua fila de mensagens offline esta cheia. Sua mensagem foi descartada"}.
{"Your Jabber account was successfully created.","Sua conta jabber foi criada corretamente."}.
{"Your Jabber account was successfully deleted.","Sua conta Jabber foi deletada com sucesso."}.
{"Your messages to ~s are being blocked. To unblock them, visit ~s","Suas mensagens para ~s estão bloqueadas. Para desbloquea-las, visite: ~s"}.
ejabberd-2.1.11/src/mod_vcard_ldap.erl 0000664 0000000 0000000 00000061437 12240230175 014462 0 ustar %%%----------------------------------------------------------------------
%%% File : mod_vcard_ldap.erl
%%% Author : Alexey Shchepin
%%% Purpose : Support for VCards from LDAP storage.
%%% Created : 2 Jan 2003 by Alexey Shchepin
%%%
%%%
%%% ejabberd, Copyright (C) 2002-2012 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
%%% published by the Free Software Foundation; either version 2 of the
%%% License, or (at your option) any later version.
%%%
%%% This program is distributed in the hope that it will be useful,
%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
%%% General Public License for more details.
%%%
%%% You should have received a copy of the GNU General Public License
%%% along with this program; if not, write to the Free Software
%%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
%%% 02111-1307 USA
%%%
%%%----------------------------------------------------------------------
-module(mod_vcard_ldap).
-author('alexey@process-one.net').
-behaviour(gen_server).
-behaviour(gen_mod).
%% gen_server callbacks.
-export([init/1,
handle_info/2,
handle_call/3,
handle_cast/2,
terminate/2,
code_change/3
]).
-export([start/2,
start_link/2,
stop/1,
get_sm_features/5,
process_local_iq/3,
process_sm_iq/3,
remove_user/1,
route/4
]).
-include("ejabberd.hrl").
-include("eldap/eldap.hrl").
-include("jlib.hrl").
-define(PROCNAME, ejabberd_mod_vcard_ldap).
-record(state, {serverhost,
myhost,
eldap_id,
search,
servers,
backups,
port,
tls_options,
dn,
base,
password,
uids,
vcard_map,
vcard_map_attrs,
user_filter,
search_filter,
search_fields,
search_reported,
search_reported_attrs,
deref_aliases,
matches
}).
-define(VCARD_MAP,
[{"NICKNAME", "%u", []},
{"FN", "%s", ["displayName"]},
{"FAMILY", "%s", ["sn"]},
{"GIVEN", "%s", ["givenName"]},
{"MIDDLE", "%s", ["initials"]},
{"ORGNAME", "%s", ["o"]},
{"ORGUNIT", "%s", ["ou"]},
{"CTRY", "%s", ["c"]},
{"LOCALITY", "%s", ["l"]},
{"STREET", "%s", ["street"]},
{"REGION", "%s", ["st"]},
{"PCODE", "%s", ["postalCode"]},
{"TITLE", "%s", ["title"]},
{"URL", "%s", ["labeleduri"]},
{"DESC", "%s", ["description"]},
{"TEL", "%s", ["telephoneNumber"]},
{"EMAIL", "%s", ["mail"]},
{"BDAY", "%s", ["birthDay"]},
{"ROLE", "%s", ["employeeType"]},
{"PHOTO", "%s", ["jpegPhoto"]}
]).
-define(SEARCH_FIELDS,
[{"User", "%u"},
{"Full Name", "displayName"},
{"Given Name", "givenName"},
{"Middle Name", "initials"},
{"Family Name", "sn"},
{"Nickname", "%u"},
{"Birthday", "birthDay"},
{"Country", "c"},
{"City", "l"},
{"Email", "mail"},
{"Organization Name", "o"},
{"Organization Unit", "ou"}
]).
-define(SEARCH_REPORTED,
[{"Full Name", "FN"},
{"Given Name", "FIRST"},
{"Middle Name", "MIDDLE"},
{"Family Name", "LAST"},
{"Nickname", "NICK"},
{"Birthday", "BDAY"},
{"Country", "CTRY"},
{"City", "LOCALITY"},
{"Email", "EMAIL"},
{"Organization Name", "ORGNAME"},
{"Organization Unit", "ORGUNIT"}
]).
%% Unused callbacks.
handle_cast(_Request, State) ->
{noreply, State}.
code_change(_OldVsn, State, _Extra) ->
{ok, State}.
%% -----
start(Host, Opts) ->
Proc = gen_mod:get_module_proc(Host, ?PROCNAME),
ChildSpec = {
Proc, {?MODULE, start_link, [Host, Opts]},
transient, 1000, worker, [?MODULE]
},
supervisor:start_child(ejabberd_sup, ChildSpec).
stop(Host) ->
Proc = gen_mod:get_module_proc(Host, ?PROCNAME),
gen_server:call(Proc, stop),
supervisor:terminate_child(ejabberd_sup, Proc),
supervisor:delete_child(ejabberd_sup, Proc).
terminate(_Reason, State) ->
Host = State#state.serverhost,
gen_iq_handler:remove_iq_handler(ejabberd_local, Host, ?NS_VCARD),
gen_iq_handler:remove_iq_handler(ejabberd_sm, Host, ?NS_VCARD),
ejabberd_hooks:delete(disco_sm_features, Host, ?MODULE, get_sm_features, 50),
case State#state.search of
true ->
ejabberd_router:unregister_route(State#state.myhost);
_ ->
ok
end.
start_link(Host, Opts) ->
Proc = gen_mod:get_module_proc(Host, ?PROCNAME),
gen_server:start_link({local, Proc}, ?MODULE, [Host, Opts], []).
init([Host, Opts]) ->
State = parse_options(Host, Opts),
IQDisc = gen_mod:get_opt(iqdisc, Opts, one_queue),
gen_iq_handler:add_iq_handler(ejabberd_local, Host, ?NS_VCARD,
?MODULE, process_local_iq, IQDisc),
gen_iq_handler:add_iq_handler(ejabberd_sm, Host, ?NS_VCARD,
?MODULE, process_sm_iq, IQDisc),
ejabberd_hooks:add(disco_sm_features, Host, ?MODULE, get_sm_features, 50),
eldap_pool:start_link(State#state.eldap_id,
State#state.servers,
State#state.backups,
State#state.port,
State#state.dn,
State#state.password,
State#state.tls_options),
case State#state.search of
true ->
ejabberd_router:register_route(State#state.myhost);
_ ->
ok
end,
{ok, State}.
handle_info({route, From, To, Packet}, State) ->
case catch do_route(State, From, To, Packet) of
Pid when is_pid(Pid) ->
ok;
_ ->
Err = jlib:make_error_reply(Packet, ?ERR_INTERNAL_SERVER_ERROR),
ejabberd_router:route(To, From, Err)
end,
{noreply, State};
handle_info(_Info, State) ->
{noreply, State}.
get_sm_features({error, _Error} = Acc, _From, _To, _Node, _Lang) ->
Acc;
get_sm_features(Acc, _From, _To, Node, _Lang) ->
case Node of
[] ->
case Acc of
{result, Features} ->
{result, [?NS_VCARD | Features]};
empty ->
{result, [?NS_VCARD]}
end;
_ ->
Acc
end.
process_local_iq(_From, _To, #iq{type = Type, lang = Lang, sub_el = SubEl} = IQ) ->
case Type of
set ->
IQ#iq{type = error, sub_el = [SubEl, ?ERR_NOT_ALLOWED]};
get ->
IQ#iq{type = result,
sub_el = [{xmlelement, "vCard",
[{"xmlns", ?NS_VCARD}],
[{xmlelement, "FN", [],
[{xmlcdata, "ejabberd"}]},
{xmlelement, "URL", [],
[{xmlcdata, ?EJABBERD_URI}]},
{xmlelement, "DESC", [],
[{xmlcdata,
translate:translate(
Lang,
"Erlang Jabber Server") ++
"\nCopyright (c) 2002-2012 ProcessOne"}]},
{xmlelement, "BDAY", [],
[{xmlcdata, "2002-11-16"}]}
]}]}
end.
process_sm_iq(_From, #jid{lserver=LServer} = To, #iq{sub_el = SubEl} = IQ) ->
case catch process_vcard_ldap(To, IQ, LServer) of
{'EXIT', _} ->
IQ#iq{type = error, sub_el = [SubEl, ?ERR_INTERNAL_SERVER_ERROR]};
Other ->
Other
end.
process_vcard_ldap(To, IQ, Server) ->
{ok, State} = eldap_utils:get_state(Server, ?PROCNAME),
#iq{type = Type, sub_el = SubEl} = IQ,
case Type of
set ->
IQ#iq{type = error, sub_el = [SubEl, ?ERR_NOT_ALLOWED]};
get ->
#jid{luser = LUser} = To,
LServer = State#state.serverhost,
case ejabberd_auth:is_user_exists(LUser, LServer) of
true ->
VCardMap = State#state.vcard_map,
case find_ldap_user(LUser, State) of
#eldap_entry{attributes = Attributes} ->
Vcard = ldap_attributes_to_vcard(Attributes, VCardMap, {LUser, LServer}),
IQ#iq{type = result, sub_el = Vcard};
_ ->
IQ#iq{type = result, sub_el = []}
end;
_ ->
IQ#iq{type = result, sub_el = []}
end
end.
handle_call(get_state, _From, State) ->
{reply, {ok, State}, State};
handle_call(stop, _From, State) ->
{stop, normal, ok, State};
handle_call(_Request, _From, State) ->
{reply, bad_request, State}.
find_ldap_user(User, State) ->
Base = State#state.base,
RFC2254_Filter = State#state.user_filter,
Eldap_ID = State#state.eldap_id,
VCardAttrs = State#state.vcard_map_attrs,
case eldap_filter:parse(RFC2254_Filter, [{"%u", User}]) of
{ok, EldapFilter} ->
case eldap_pool:search(Eldap_ID,
[{base, Base},
{filter, EldapFilter},
{deref_aliases, State#state.deref_aliases},
{attributes, VCardAttrs}]) of
#eldap_search_result{entries = [E | _]} ->
E;
_ ->
false
end;
_ ->
false
end.
ldap_attributes_to_vcard(Attributes, VCardMap, UD) ->
Attrs = lists:map(
fun({VCardName, _, _}) ->
{stringprep:tolower(VCardName),
map_vcard_attr(VCardName, Attributes, VCardMap, UD)}
end, VCardMap),
Elts = [ldap_attribute_to_vcard(vCard, Attr) || Attr <- Attrs],
NElts = [ldap_attribute_to_vcard(vCardN, Attr) || Attr <- Attrs],
OElts = [ldap_attribute_to_vcard(vCardO, Attr) || Attr <- Attrs],
AElts = [ldap_attribute_to_vcard(vCardA, Attr) || Attr <- Attrs],
[{xmlelement, "vCard", [{"xmlns", ?NS_VCARD}],
lists:append([X || X <- Elts, X /= none],
[{xmlelement,"N",[], [X || X <- NElts, X /= none]},
{xmlelement,"ORG",[], [X || X <- OElts, X /= none]},
{xmlelement,"ADR",[], [X || X <- AElts, X /= none]}])
}].
ldap_attribute_to_vcard(vCard, {"fn", Value}) ->
{xmlelement,"FN",[],[{xmlcdata,Value}]};
ldap_attribute_to_vcard(vCard, {"nickname", Value}) ->
{xmlelement,"NICKNAME",[],[{xmlcdata,Value}]};
ldap_attribute_to_vcard(vCard, {"title", Value}) ->
{xmlelement,"TITLE",[],[{xmlcdata,Value}]};
ldap_attribute_to_vcard(vCard, {"bday", Value}) ->
{xmlelement,"BDAY",[],[{xmlcdata,Value}]};
ldap_attribute_to_vcard(vCard, {"url", Value}) ->
{xmlelement,"URL",[],[{xmlcdata,Value}]};
ldap_attribute_to_vcard(vCard, {"desc", Value}) ->
{xmlelement,"DESC",[],[{xmlcdata,Value}]};
ldap_attribute_to_vcard(vCard, {"role", Value}) ->
{xmlelement,"ROLE",[],[{xmlcdata,Value}]};
ldap_attribute_to_vcard(vCard, {"tel", Value}) ->
{xmlelement,"TEL",[],[{xmlelement,"VOICE",[],[]},
{xmlelement,"WORK",[],[]},
{xmlelement,"NUMBER",[],[{xmlcdata,Value}]}]};
ldap_attribute_to_vcard(vCard, {"email", Value}) ->
{xmlelement,"EMAIL",[],[{xmlelement,"INTERNET",[],[]},
{xmlelement,"PREF",[],[]},
{xmlelement,"USERID",[],[{xmlcdata,Value}]}]};
ldap_attribute_to_vcard(vCard, {"photo", Value}) ->
{xmlelement,"PHOTO",[],[
{xmlelement,"TYPE",[],[{xmlcdata,"image/jpeg"}]},
{xmlelement,"BINVAL",[],[{xmlcdata, jlib:encode_base64(Value)}]}]};
ldap_attribute_to_vcard(vCardN, {"family", Value}) ->
{xmlelement,"FAMILY",[],[{xmlcdata,Value}]};
ldap_attribute_to_vcard(vCardN, {"given", Value}) ->
{xmlelement,"GIVEN",[],[{xmlcdata,Value}]};
ldap_attribute_to_vcard(vCardN, {"middle", Value}) ->
{xmlelement,"MIDDLE",[],[{xmlcdata,Value}]};
ldap_attribute_to_vcard(vCardO, {"orgname", Value}) ->
{xmlelement,"ORGNAME",[],[{xmlcdata,Value}]};
ldap_attribute_to_vcard(vCardO, {"orgunit", Value}) ->
{xmlelement,"ORGUNIT",[],[{xmlcdata,Value}]};
ldap_attribute_to_vcard(vCardA, {"locality", Value}) ->
{xmlelement,"LOCALITY",[],[{xmlcdata,Value}]};
ldap_attribute_to_vcard(vCardA, {"street", Value}) ->
{xmlelement,"STREET",[],[{xmlcdata,Value}]};
ldap_attribute_to_vcard(vCardA, {"ctry", Value}) ->
{xmlelement,"CTRY",[],[{xmlcdata,Value}]};
ldap_attribute_to_vcard(vCardA, {"region", Value}) ->
{xmlelement,"REGION",[],[{xmlcdata,Value}]};
ldap_attribute_to_vcard(vCardA, {"pcode", Value}) ->
{xmlelement,"PCODE",[],[{xmlcdata,Value}]};
ldap_attribute_to_vcard(_, _) ->
none.
-define(TLFIELD(Type, Label, Var),
{xmlelement, "field", [{"type", Type},
{"label", translate:translate(Lang, Label)},
{"var", Var}], []}).
-define(FORM(JID, SearchFields),
[{xmlelement, "instructions", [],
[{xmlcdata, translate:translate(Lang, "You need an x:data capable client to search")}]},
{xmlelement, "x", [{"xmlns", ?NS_XDATA}, {"type", "form"}],
[{xmlelement, "title", [],
[{xmlcdata, translate:translate(Lang, "Search users in ") ++
jlib:jid_to_string(JID)}]},
{xmlelement, "instructions", [],
[{xmlcdata, translate:translate(Lang, "Fill in fields to search "
"for any matching Jabber User")}]}
] ++ lists:map(fun({X,Y}) -> ?TLFIELD("text-single", X, Y) end, SearchFields)}]).
do_route(State, From, To, Packet) ->
spawn(?MODULE, route, [State, From, To, Packet]).
route(State, From, To, Packet) ->
#jid{user = User, resource = Resource} = To,
ServerHost = State#state.serverhost,
if
(User /= "") or (Resource /= "") ->
Err = jlib:make_error_reply(Packet, ?ERR_SERVICE_UNAVAILABLE),
ejabberd_router:route(To, From, Err);
true ->
IQ = jlib:iq_query_info(Packet),
case IQ of
#iq{type = Type, xmlns = ?NS_SEARCH, lang = Lang, sub_el = SubEl} ->
case Type of
set ->
XDataEl = find_xdata_el(SubEl),
case XDataEl of
false ->
Err = jlib:make_error_reply(
Packet, ?ERR_BAD_REQUEST),
ejabberd_router:route(To, From, Err);
_ ->
XData = jlib:parse_xdata_submit(XDataEl),
case XData of
invalid ->
Err = jlib:make_error_reply(
Packet,
?ERR_BAD_REQUEST),
ejabberd_router:route(To, From,
Err);
_ ->
ResIQ =
IQ#iq{
type = result,
sub_el =
[{xmlelement,
"query",
[{"xmlns", ?NS_SEARCH}],
[{xmlelement, "x",
[{"xmlns", ?NS_XDATA},
{"type", "result"}],
search_result(Lang, To, State, XData)
}]}]},
ejabberd_router:route(
To, From, jlib:iq_to_xml(ResIQ))
end
end;
get ->
SearchFields = State#state.search_fields,
ResIQ = IQ#iq{type = result,
sub_el = [{xmlelement,
"query",
[{"xmlns", ?NS_SEARCH}],
?FORM(To, SearchFields)
}]},
ejabberd_router:route(To,
From,
jlib:iq_to_xml(ResIQ))
end;
#iq{type = Type, xmlns = ?NS_DISCO_INFO, lang = Lang} ->
case Type of
set ->
Err = jlib:make_error_reply(
Packet, ?ERR_NOT_ALLOWED),
ejabberd_router:route(To, From, Err);
get ->
Info = ejabberd_hooks:run_fold(
disco_info, ServerHost, [],
[ServerHost, ?MODULE, "", ""]),
ResIQ =
IQ#iq{type = result,
sub_el = [{xmlelement,
"query",
[{"xmlns", ?NS_DISCO_INFO}],
[{xmlelement, "identity",
[{"category", "directory"},
{"type", "user"},
{"name",
translate:translate(Lang, "vCard User Search")}],
[]},
{xmlelement, "feature",
[{"var", ?NS_SEARCH}], []},
{xmlelement, "feature",
[{"var", ?NS_VCARD}], []}
] ++ Info
}]},
ejabberd_router:route(To,
From,
jlib:iq_to_xml(ResIQ))
end;
#iq{type = Type, xmlns = ?NS_DISCO_ITEMS} ->
case Type of
set ->
Err = jlib:make_error_reply(
Packet, ?ERR_NOT_ALLOWED),
ejabberd_router:route(To, From, Err);
get ->
ResIQ =
IQ#iq{type = result,
sub_el = [{xmlelement,
"query",
[{"xmlns", ?NS_DISCO_ITEMS}],
[]}]},
ejabberd_router:route(To,
From,
jlib:iq_to_xml(ResIQ))
end;
#iq{type = get, xmlns = ?NS_VCARD, lang = Lang} ->
ResIQ =
IQ#iq{type = result,
sub_el = [{xmlelement,
"vCard",
[{"xmlns", ?NS_VCARD}],
iq_get_vcard(Lang)}]},
ejabberd_router:route(To,
From,
jlib:iq_to_xml(ResIQ));
_ ->
Err = jlib:make_error_reply(Packet,
?ERR_SERVICE_UNAVAILABLE),
ejabberd_router:route(To, From, Err)
end
end.
iq_get_vcard(Lang) ->
[{xmlelement, "FN", [],
[{xmlcdata, "ejabberd/mod_vcard"}]},
{xmlelement, "URL", [],
[{xmlcdata, ?EJABBERD_URI}]},
{xmlelement, "DESC", [],
[{xmlcdata, translate:translate(
Lang,
"ejabberd vCard module") ++
"\nCopyright (c) 2003-2012 ProcessOne"}]}].
-define(LFIELD(Label, Var),
{xmlelement, "field", [{"label", translate:translate(Lang, Label)},
{"var", Var}], []}).
search_result(Lang, JID, State, Data) ->
SearchReported = State#state.search_reported,
Header = [{xmlelement, "title", [],
[{xmlcdata, translate:translate(Lang, "Search Results for ") ++
jlib:jid_to_string(JID)}]},
{xmlelement, "reported", [],
[?TLFIELD("text-single", "Jabber ID", "jid")] ++
lists:map(
fun({Name, Value}) -> ?TLFIELD("text-single", Name, Value) end,
SearchReported)
}],
case search(State, Data) of
error ->
Header;
Result ->
Header ++ Result
end.
-define(FIELD(Var, Val),
{xmlelement, "field", [{"var", Var}],
[{xmlelement, "value", [],
[{xmlcdata, Val}]}]}).
search(State, Data) ->
Base = State#state.base,
SearchFilter = State#state.search_filter,
Eldap_ID = State#state.eldap_id,
UIDs = State#state.uids,
Limit = State#state.matches,
ReportedAttrs = State#state.search_reported_attrs,
Filter = eldap:'and'([SearchFilter, eldap_utils:make_filter(Data, UIDs)]),
case eldap_pool:search(Eldap_ID,
[{base, Base},
{filter, Filter},
{limit, Limit},
{deref_aliases, State#state.deref_aliases},
{attributes, ReportedAttrs}]) of
#eldap_search_result{entries = E} ->
search_items(E, State);
_ ->
error
end.
search_items(Entries, State) ->
LServer = State#state.serverhost,
SearchReported = State#state.search_reported,
VCardMap = State#state.vcard_map,
UIDs = State#state.uids,
Attributes = lists:map(
fun(E) ->
#eldap_entry{attributes = Attrs} = E,
Attrs
end, Entries),
lists:flatmap(
fun(Attrs) ->
case eldap_utils:find_ldap_attrs(UIDs, Attrs) of
{U, UIDAttrFormat} ->
case eldap_utils:get_user_part(U, UIDAttrFormat) of
{ok, Username} ->
case ejabberd_auth:is_user_exists(Username, LServer) of
true ->
RFields = lists:map(
fun({_, VCardName}) ->
{VCardName,
map_vcard_attr(
VCardName,
Attrs,
VCardMap,
{Username, ?MYNAME})}
end, SearchReported),
Result = [?FIELD("jid", Username ++ "@" ++ LServer)] ++
[?FIELD(Name, Value) || {Name, Value} <- RFields],
[{xmlelement, "item", [], Result}];
_ ->
[]
end;
_ ->
[]
end;
"" ->
[]
end
end, Attributes).
remove_user(_User) ->
true.
%%%-----------------------
%%% Auxiliary functions.
%%%-----------------------
map_vcard_attr(VCardName, Attributes, Pattern, UD) ->
Res = lists:filter(
fun({Name, _, _}) ->
eldap_utils:case_insensitive_match(Name, VCardName)
end, Pattern),
case Res of
[{_, Str, Attrs}] ->
process_pattern(Str, UD,
[eldap_utils:get_ldap_attr(X, Attributes) || X<-Attrs]);
_ -> ""
end.
process_pattern(Str, {User, Domain}, AttrValues) ->
eldap_filter:do_sub(
Str,
[{"%u", User},{"%d", Domain}] ++
[{"%s", V, 1} || V <- AttrValues]).
find_xdata_el({xmlelement, _Name, _Attrs, SubEls}) ->
find_xdata_el1(SubEls).
find_xdata_el1([]) ->
false;
find_xdata_el1([{xmlelement, Name, Attrs, SubEls} | Els]) ->
case xml:get_attr_s("xmlns", Attrs) of
?NS_XDATA ->
{xmlelement, Name, Attrs, SubEls};
_ ->
find_xdata_el1(Els)
end;
find_xdata_el1([_ | Els]) ->
find_xdata_el1(Els).
parse_options(Host, Opts) ->
MyHost = gen_mod:get_opt_host(Host, Opts, "vjud.@HOST@"),
Search = gen_mod:get_opt(search, Opts, true),
Matches = case gen_mod:get_opt(matches, Opts, 30) of
infinity -> 0;
N -> N
end,
Eldap_ID = atom_to_list(gen_mod:get_module_proc(Host, ?PROCNAME)),
LDAPServers = case gen_mod:get_opt(ldap_servers, Opts, undefined) of
undefined ->
ejabberd_config:get_local_option({ldap_servers, Host});
S -> S
end,
LDAPBackups = case gen_mod:get_opt(ldap_backups, Opts, undefined) of
undefined ->
ejabberd_config:get_local_option({ldap_servers, Host});
Backups -> Backups
end,
LDAPEncrypt = case gen_mod:get_opt(ldap_encrypt, Opts, undefined) of
undefined ->
ejabberd_config:get_local_option({ldap_encrypt, Host});
E -> E
end,
LDAPTLSVerify = case gen_mod:get_opt(ldap_tls_verify, Opts, undefined) of
undefined ->
ejabberd_config:get_local_option({ldap_tls_verify, Host});
Verify -> Verify
end,
LDAPTLSCAFile = case gen_mod:get_opt(ldap_tls_cacertfile, Opts, undefined) of
undefined ->
ejabberd_config:get_local_option({ldap_tls_cacertfile, Host});
CAFile -> CAFile
end,
LDAPTLSDepth = case gen_mod:get_opt(ldap_tls_depth, Opts, undefined) of
undefined ->
ejabberd_config:get_local_option({ldap_tls_depth, Host});
Depth ->
Depth
end,
LDAPPortTemp = case gen_mod:get_opt(ldap_port, Opts, undefined) of
undefined ->
ejabberd_config:get_local_option({ldap_port, Host});
PT -> PT
end,
LDAPPort = case LDAPPortTemp of
undefined ->
case LDAPEncrypt of
tls -> ?LDAPS_PORT;
starttls -> ?LDAP_PORT;
_ -> ?LDAP_PORT
end;
P -> P
end,
LDAPBase = case gen_mod:get_opt(ldap_base, Opts, undefined) of
undefined ->
ejabberd_config:get_local_option({ldap_base, Host});
B -> B
end,
UIDs = case gen_mod:get_opt(ldap_uids, Opts, undefined) of
undefined ->
case ejabberd_config:get_local_option({ldap_uids, Host}) of
undefined -> [{"uid", "%u"}];
UI -> eldap_utils:uids_domain_subst(Host, UI)
end;
UI -> eldap_utils:uids_domain_subst(Host, UI)
end,
RootDN = case gen_mod:get_opt(ldap_rootdn, Opts, undefined) of
undefined ->
case ejabberd_config:get_local_option({ldap_rootdn, Host}) of
undefined -> "";
RDN -> RDN
end;
RDN -> RDN
end,
Password = case gen_mod:get_opt(ldap_password, Opts, undefined) of
undefined ->
case ejabberd_config:get_local_option({ldap_password, Host}) of
undefined -> "";
Pass -> Pass
end;
Pass -> Pass
end,
SubFilter = lists:flatten(eldap_utils:generate_subfilter(UIDs)),
UserFilter = case gen_mod:get_opt(ldap_filter, Opts, undefined) of
undefined ->
case ejabberd_config:get_local_option({ldap_filter, Host}) of
undefined -> SubFilter;
"" -> SubFilter;
F ->
eldap_utils:check_filter(F),
"(&" ++ SubFilter ++ F ++ ")"
end;
"" -> SubFilter;
F ->
eldap_utils:check_filter(F),
"(&" ++ SubFilter ++ F ++ ")"
end,
{ok, SearchFilter} = eldap_filter:parse(
eldap_filter:do_sub(UserFilter, [{"%u","*"}])),
VCardMap = gen_mod:get_opt(ldap_vcard_map, Opts, ?VCARD_MAP),
SearchFields = gen_mod:get_opt(ldap_search_fields, Opts, ?SEARCH_FIELDS),
SearchReported = gen_mod:get_opt(ldap_search_reported, Opts, ?SEARCH_REPORTED),
%% In search requests we need to fetch only attributes defined
%% in vcard-map and search-reported. In some cases,
%% this will essentially reduce network traffic from an LDAP server.
UIDAttrs = [UAttr || {UAttr, _} <- UIDs],
VCardMapAttrs = lists:usort(
lists:append([A || {_, _, A} <- VCardMap]) ++ UIDAttrs),
SearchReportedAttrs =
lists:usort(lists:flatmap(
fun({_, N}) ->
case lists:keysearch(N, 1, VCardMap) of
{value, {_, _, L}} -> L;
_ -> []
end
end, SearchReported) ++ UIDAttrs),
DerefAliases = case gen_mod:get_opt(deref_aliases, Opts, undefined) of
undefined ->
case ejabberd_config:get_local_option(
{deref_aliases, Host}) of
undefined -> never;
D -> D
end;
D -> D
end,
#state{serverhost = Host,
myhost = MyHost,
eldap_id = Eldap_ID,
search = Search,
servers = LDAPServers,
backups = LDAPBackups,
port = LDAPPort,
tls_options = [{encrypt, LDAPEncrypt},
{tls_verify, LDAPTLSVerify},
{tls_cacertfile, LDAPTLSCAFile},
{tls_depth, LDAPTLSDepth}],
dn = RootDN,
base = LDAPBase,
password = Password,
uids = UIDs,
vcard_map = VCardMap,
vcard_map_attrs = VCardMapAttrs,
user_filter = UserFilter,
search_filter = SearchFilter,
search_fields = SearchFields,
search_reported = SearchReported,
search_reported_attrs = SearchReportedAttrs,
deref_aliases = DerefAliases,
matches = Matches
}.
ejabberd-2.1.11/src/jlib.erl 0000664 0000000 0000000 00000052036 12240230175 012437 0 ustar %%%----------------------------------------------------------------------
%%% File : jlib.erl
%%% Author : Alexey Shchepin
%%% Purpose : General XMPP library.
%%% Created : 23 Nov 2002 by Alexey Shchepin
%%%
%%%
%%% ejabberd, Copyright (C) 2002-2012 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
%%% published by the Free Software Foundation; either version 2 of the
%%% License, or (at your option) any later version.
%%%
%%% This program is distributed in the hope that it will be useful,
%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
%%% General Public License for more details.
%%%
%%% You should have received a copy of the GNU General Public License
%%% along with this program; if not, write to the Free Software
%%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
%%% 02111-1307 USA
%%%
%%%----------------------------------------------------------------------
-module(jlib).
-author('alexey@process-one.net').
-export([make_result_iq_reply/1,
make_error_reply/3,
make_error_reply/2,
make_error_element/2,
make_correct_from_to_attrs/3,
replace_from_to_attrs/3,
replace_from_to/3,
replace_from_attrs/2,
replace_from/2,
remove_attr/2,
make_jid/3,
make_jid/1,
string_to_jid/1,
jid_to_string/1,
is_nodename/1,
tolower/1,
nodeprep/1,
nameprep/1,
resourceprep/1,
jid_tolower/1,
jid_remove_resource/1,
jid_replace_resource/2,
get_iq_namespace/1,
iq_query_info/1,
iq_query_or_response_info/1,
is_iq_request_type/1,
iq_to_xml/1,
parse_xdata_submit/1,
timestamp_to_iso/1, % TODO: Remove once XEP-0091 is Obsolete
timestamp_to_iso/2,
timestamp_to_xml/4,
timestamp_to_xml/1, % TODO: Remove once XEP-0091 is Obsolete
now_to_utc_string/1,
now_to_local_string/1,
datetime_string_to_timestamp/1,
decode_base64/1,
encode_base64/1,
ip_to_list/1,
rsm_encode/1,
rsm_encode/2,
rsm_decode/1]).
-include("jlib.hrl").
%send_iq(From, To, ID, SubTags) ->
% ok.
make_result_iq_reply({xmlelement, Name, Attrs, SubTags}) ->
NewAttrs = make_result_iq_reply_attrs(Attrs),
{xmlelement, Name, NewAttrs, SubTags}.
make_result_iq_reply_attrs(Attrs) ->
To = xml:get_attr("to", Attrs),
From = xml:get_attr("from", Attrs),
Attrs1 = lists:keydelete("to", 1, Attrs),
Attrs2 = lists:keydelete("from", 1, Attrs1),
Attrs3 = case To of
{value, ToVal} ->
[{"from", ToVal} | Attrs2];
_ ->
Attrs2
end,
Attrs4 = case From of
{value, FromVal} ->
[{"to", FromVal} | Attrs3];
_ ->
Attrs3
end,
Attrs5 = lists:keydelete("type", 1, Attrs4),
Attrs6 = [{"type", "result"} | Attrs5],
Attrs6.
make_error_reply({xmlelement, Name, Attrs, SubTags}, Code, Desc) ->
NewAttrs = make_error_reply_attrs(Attrs),
{xmlelement, Name, NewAttrs, SubTags ++ [{xmlelement, "error",
[{"code", Code}],
[{xmlcdata, Desc}]}]}.
make_error_reply({xmlelement, Name, Attrs, SubTags}, Error) ->
NewAttrs = make_error_reply_attrs(Attrs),
{xmlelement, Name, NewAttrs, SubTags ++ [Error]}.
make_error_reply_attrs(Attrs) ->
To = xml:get_attr("to", Attrs),
From = xml:get_attr("from", Attrs),
Attrs1 = lists:keydelete("to", 1, Attrs),
Attrs2 = lists:keydelete("from", 1, Attrs1),
Attrs3 = case To of
{value, ToVal} ->
[{"from", ToVal} | Attrs2];
_ ->
Attrs2
end,
Attrs4 = case From of
{value, FromVal} ->
[{"to", FromVal} | Attrs3];
_ ->
Attrs3
end,
Attrs5 = lists:keydelete("type", 1, Attrs4),
Attrs6 = [{"type", "error"} | Attrs5],
Attrs6.
make_error_element(Code, Desc) ->
{xmlelement, "error",
[{"code", Code}],
[{xmlcdata, Desc}]}.
make_correct_from_to_attrs(From, To, Attrs) ->
Attrs1 = lists:keydelete("from", 1, Attrs),
Attrs2 = case xml:get_attr("to", Attrs) of
{value, _} ->
Attrs1;
_ ->
[{"to", To} | Attrs1]
end,
Attrs3 = [{"from", From} | Attrs2],
Attrs3.
replace_from_to_attrs(From, To, Attrs) ->
Attrs1 = lists:keydelete("to", 1, Attrs),
Attrs2 = lists:keydelete("from", 1, Attrs1),
Attrs3 = [{"to", To} | Attrs2],
Attrs4 = [{"from", From} | Attrs3],
Attrs4.
replace_from_to(From, To, {xmlelement, Name, Attrs, Els}) ->
NewAttrs = replace_from_to_attrs(jlib:jid_to_string(From),
jlib:jid_to_string(To),
Attrs),
{xmlelement, Name, NewAttrs, Els}.
replace_from_attrs(From, Attrs) ->
Attrs1 = lists:keydelete("from", 1, Attrs),
[{"from", From} | Attrs1].
replace_from(From, {xmlelement, Name, Attrs, Els}) ->
NewAttrs = replace_from_attrs(jlib:jid_to_string(From), Attrs),
{xmlelement, Name, NewAttrs, Els}.
remove_attr(Attr, {xmlelement, Name, Attrs, Els}) ->
NewAttrs = lists:keydelete(Attr, 1, Attrs),
{xmlelement, Name, NewAttrs, Els}.
make_jid(User, Server, Resource) ->
case nodeprep(User) of
error -> error;
LUser ->
case nameprep(Server) of
error -> error;
LServer ->
case resourceprep(Resource) of
error -> error;
LResource ->
#jid{user = User,
server = Server,
resource = Resource,
luser = LUser,
lserver = LServer,
lresource = LResource}
end
end
end.
make_jid({User, Server, Resource}) ->
make_jid(User, Server, Resource).
string_to_jid(J) ->
string_to_jid1(J, "").
string_to_jid1([$@ | _J], "") ->
error;
string_to_jid1([$@ | J], N) ->
string_to_jid2(J, lists:reverse(N), "");
string_to_jid1([$/ | _J], "") ->
error;
string_to_jid1([$/ | J], N) ->
string_to_jid3(J, "", lists:reverse(N), "");
string_to_jid1([C | J], N) ->
string_to_jid1(J, [C | N]);
string_to_jid1([], "") ->
error;
string_to_jid1([], N) ->
make_jid("", lists:reverse(N), "").
%% Only one "@" is admitted per JID
string_to_jid2([$@ | _J], _N, _S) ->
error;
string_to_jid2([$/ | _J], _N, "") ->
error;
string_to_jid2([$/ | J], N, S) ->
string_to_jid3(J, N, lists:reverse(S), "");
string_to_jid2([C | J], N, S) ->
string_to_jid2(J, N, [C | S]);
string_to_jid2([], _N, "") ->
error;
string_to_jid2([], N, S) ->
make_jid(N, lists:reverse(S), "").
string_to_jid3([C | J], N, S, R) ->
string_to_jid3(J, N, S, [C | R]);
string_to_jid3([], N, S, R) ->
make_jid(N, S, lists:reverse(R)).
jid_to_string(#jid{user = User, server = Server, resource = Resource}) ->
jid_to_string({User, Server, Resource});
jid_to_string({Node, Server, Resource}) ->
S1 = case Node of
"" ->
"";
_ ->
Node ++ "@"
end,
S2 = S1 ++ Server,
S3 = case Resource of
"" ->
S2;
_ ->
S2 ++ "/" ++ Resource
end,
S3.
is_nodename([]) ->
false;
is_nodename(J) ->
nodeprep(J) /= error.
%tolower_c(C) when C >= $A, C =< $Z ->
% C + 32;
%tolower_c(C) ->
% C.
-define(LOWER(Char),
if
Char >= $A, Char =< $Z ->
Char + 32;
true ->
Char
end).
%tolower(S) ->
% lists:map(fun tolower_c/1, S).
%tolower(S) ->
% [?LOWER(Char) || Char <- S].
% Not tail-recursive but it seems works faster than variants above
tolower([C | Cs]) ->
if
C >= $A, C =< $Z ->
[C + 32 | tolower(Cs)];
true ->
[C | tolower(Cs)]
end;
tolower([]) ->
[].
%tolower([C | Cs]) when C >= $A, C =< $Z ->
% [C + 32 | tolower(Cs)];
%tolower([C | Cs]) ->
% [C | tolower(Cs)];
%tolower([]) ->
% [].
nodeprep(S) when length(S) < 1024 ->
R = stringprep:nodeprep(S),
if
length(R) < 1024 -> R;
true -> error
end;
nodeprep(_) ->
error.
nameprep(S) when length(S) < 1024 ->
R = stringprep:nameprep(S),
if
length(R) < 1024 -> R;
true -> error
end;
nameprep(_) ->
error.
resourceprep(S) when length(S) < 1024 ->
R = stringprep:resourceprep(S),
if
length(R) < 1024 -> R;
true -> error
end;
resourceprep(_) ->
error.
jid_tolower(#jid{luser = U, lserver = S, lresource = R}) ->
{U, S, R};
jid_tolower({U, S, R}) ->
case nodeprep(U) of
error -> error;
LUser ->
case nameprep(S) of
error -> error;
LServer ->
case resourceprep(R) of
error -> error;
LResource ->
{LUser, LServer, LResource}
end
end
end.
jid_remove_resource(#jid{} = JID) ->
JID#jid{resource = "", lresource = ""};
jid_remove_resource({U, S, _R}) ->
{U, S, ""}.
jid_replace_resource(JID, Resource) ->
case resourceprep(Resource) of
error -> error;
LResource ->
JID#jid{resource = Resource, lresource = LResource}
end.
get_iq_namespace({xmlelement, Name, _Attrs, Els}) when Name == "iq" ->
case xml:remove_cdata(Els) of
[{xmlelement, _Name2, Attrs2, _Els2}] ->
xml:get_attr_s("xmlns", Attrs2);
_ ->
""
end;
get_iq_namespace(_) ->
"".
%% @spec (xmlelement()) -> iq() | reply | invalid | not_iq
iq_query_info(El) ->
iq_info_internal(El, request).
iq_query_or_response_info(El) ->
iq_info_internal(El, any).
iq_info_internal({xmlelement, Name, Attrs, Els}, Filter) when Name == "iq" ->
%% Filter is either request or any. If it is request, any replies
%% are converted to the atom reply.
ID = xml:get_attr_s("id", Attrs),
Type = xml:get_attr_s("type", Attrs),
Lang = xml:get_attr_s("xml:lang", Attrs),
{Type1, Class} = case Type of
"set" -> {set, request};
"get" -> {get, request};
"result" -> {result, reply};
"error" -> {error, reply};
_ -> {invalid, invalid}
end,
if
Type1 == invalid ->
invalid;
Class == request; Filter == any ->
%% The iq record is a bit strange. The sub_el field is an
%% XML tuple for requests, but a list of XML tuples for
%% responses.
FilteredEls = xml:remove_cdata(Els),
{XMLNS, SubEl} =
case {Class, FilteredEls} of
{request, [{xmlelement, _Name2, Attrs2, _Els2}]} ->
{xml:get_attr_s("xmlns", Attrs2),
hd(FilteredEls)};
{reply, _} ->
%% Find the namespace of the first non-error
%% element, if there is one.
NonErrorEls = [El ||
{xmlelement, SubName, _, _} = El
<- FilteredEls,
SubName /= "error"],
{case NonErrorEls of
[NonErrorEl] ->
xml:get_tag_attr_s("xmlns", NonErrorEl);
_ ->
""
end,
FilteredEls};
_ ->
{"", []}
end,
if XMLNS == "", Class == request ->
invalid;
true ->
#iq{id = ID,
type = Type1,
xmlns = XMLNS,
lang = Lang,
sub_el = SubEl}
end;
Class == reply, Filter /= any ->
reply
end;
iq_info_internal(_, _) ->
not_iq.
is_iq_request_type(set) -> true;
is_iq_request_type(get) -> true;
is_iq_request_type(_) -> false.
iq_type_to_string(set) -> "set";
iq_type_to_string(get) -> "get";
iq_type_to_string(result) -> "result";
iq_type_to_string(error) -> "error";
iq_type_to_string(_) -> invalid.
iq_to_xml(#iq{id = ID, type = Type, sub_el = SubEl}) ->
if
ID /= "" ->
{xmlelement, "iq",
[{"id", ID}, {"type", iq_type_to_string(Type)}], SubEl};
true ->
{xmlelement, "iq",
[{"type", iq_type_to_string(Type)}], SubEl}
end.
parse_xdata_submit(El) ->
{xmlelement, _Name, Attrs, Els} = El,
case xml:get_attr_s("type", Attrs) of
"submit" ->
lists:reverse(parse_xdata_fields(Els, []));
"form" -> %% This is a workaround to accept Psi's wrong forms
lists:reverse(parse_xdata_fields(Els, []));
_ ->
invalid
end.
parse_xdata_fields([], Res) ->
Res;
parse_xdata_fields([{xmlelement, Name, Attrs, SubEls} | Els], Res) ->
case Name of
"field" ->
case xml:get_attr_s("var", Attrs) of
"" ->
parse_xdata_fields(Els, Res);
Var ->
Field =
{Var, lists:reverse(parse_xdata_values(SubEls, []))},
parse_xdata_fields(Els, [Field | Res])
end;
_ ->
parse_xdata_fields(Els, Res)
end;
parse_xdata_fields([_ | Els], Res) ->
parse_xdata_fields(Els, Res).
parse_xdata_values([], Res) ->
Res;
parse_xdata_values([{xmlelement, Name, _Attrs, SubEls} | Els], Res) ->
case Name of
"value" ->
Val = xml:get_cdata(SubEls),
parse_xdata_values(Els, [Val | Res]);
_ ->
parse_xdata_values(Els, Res)
end;
parse_xdata_values([_ | Els], Res) ->
parse_xdata_values(Els, Res).
rsm_decode(#iq{sub_el=SubEl})->
rsm_decode(SubEl);
rsm_decode({xmlelement, _,_,_}=SubEl)->
case xml:get_subtag(SubEl,"set") of
false ->
none;
{xmlelement, "set", _Attrs, SubEls}->
lists:foldl(fun rsm_parse_element/2, #rsm_in{}, SubEls)
end.
rsm_parse_element({xmlelement, "max",[], _}=Elem, RsmIn)->
CountStr = xml:get_tag_cdata(Elem),
{Count, _} = string:to_integer(CountStr),
RsmIn#rsm_in{max=Count};
rsm_parse_element({xmlelement, "before", [], _}=Elem, RsmIn)->
UID = xml:get_tag_cdata(Elem),
RsmIn#rsm_in{direction=before, id=UID};
rsm_parse_element({xmlelement, "after", [], _}=Elem, RsmIn)->
UID = xml:get_tag_cdata(Elem),
RsmIn#rsm_in{direction=aft, id=UID};
rsm_parse_element({xmlelement, "index",[], _}=Elem, RsmIn)->
IndexStr = xml:get_tag_cdata(Elem),
{Index, _} = string:to_integer(IndexStr),
RsmIn#rsm_in{index=Index};
rsm_parse_element(_, RsmIn)->
RsmIn.
rsm_encode(#iq{sub_el=SubEl}=IQ,RsmOut)->
Set = {xmlelement, "set", [{"xmlns", ?NS_RSM}],
lists:reverse(rsm_encode_out(RsmOut))},
{xmlelement, Name, Attrs, SubEls} = SubEl,
New = {xmlelement, Name, Attrs, [Set | SubEls]},
IQ#iq{sub_el=New}.
rsm_encode(none)->
[];
rsm_encode(RsmOut)->
[{xmlelement, "set", [{"xmlns", ?NS_RSM}], lists:reverse(rsm_encode_out(RsmOut))}].
rsm_encode_out(#rsm_out{count=Count, index=Index, first=First, last=Last})->
El = rsm_encode_first(First, Index, []),
El2 = rsm_encode_last(Last,El),
rsm_encode_count(Count, El2).
rsm_encode_first(undefined, undefined, Arr) ->
Arr;
rsm_encode_first(First, undefined, Arr) ->
[{xmlelement, "first",[], [{xmlcdata, First}]}|Arr];
rsm_encode_first(First, Index, Arr) ->
[{xmlelement, "first",[{"index", i2l(Index)}], [{xmlcdata, First}]}|Arr].
rsm_encode_last(undefined, Arr) -> Arr;
rsm_encode_last(Last, Arr) ->
[{xmlelement, "last",[], [{xmlcdata, Last}]}|Arr].
rsm_encode_count(undefined, Arr)-> Arr;
rsm_encode_count(Count, Arr)->
[{xmlelement, "count",[], [{xmlcdata, i2l(Count)}]} | Arr].
i2l(I) when is_integer(I) -> integer_to_list(I);
i2l(L) when is_list(L) -> L.
%% Timezone = utc | {Sign::string(), {Hours, Minutes}} | {Hours, Minutes}
%% Hours = integer()
%% Minutes = integer()
timestamp_to_iso({{Year, Month, Day}, {Hour, Minute, Second}}, Timezone) ->
Timestamp_string =
lists:flatten(
io_lib:format("~4..0w-~2..0w-~2..0wT~2..0w:~2..0w:~2..0w",
[Year, Month, Day, Hour, Minute, Second])),
Timezone_string =
case Timezone of
utc -> "Z";
{Sign, {TZh, TZm}} ->
io_lib:format("~s~2..0w:~2..0w", [Sign, TZh, TZm]);
{TZh, TZm} ->
Sign = case TZh >= 0 of
true -> "+";
false -> "-"
end,
io_lib:format("~s~2..0w:~2..0w", [Sign, abs(TZh),TZm])
end,
{Timestamp_string, Timezone_string}.
timestamp_to_iso({{Year, Month, Day}, {Hour, Minute, Second}}) ->
lists:flatten(
io_lib:format("~4..0w~2..0w~2..0wT~2..0w:~2..0w:~2..0w",
[Year, Month, Day, Hour, Minute, Second])).
timestamp_to_xml(DateTime, Timezone, FromJID, Desc) ->
{T_string, Tz_string} = timestamp_to_iso(DateTime, Timezone),
Text = [{xmlcdata, Desc}],
From = jlib:jid_to_string(FromJID),
{xmlelement, "delay",
[{"xmlns", ?NS_DELAY},
{"from", From},
{"stamp", T_string ++ Tz_string}],
Text}.
%% TODO: Remove this function once XEP-0091 is Obsolete
timestamp_to_xml({{Year, Month, Day}, {Hour, Minute, Second}}) ->
{xmlelement, "x",
[{"xmlns", ?NS_DELAY91},
{"stamp", lists:flatten(
io_lib:format("~4..0w~2..0w~2..0wT~2..0w:~2..0w:~2..0w",
[Year, Month, Day, Hour, Minute, Second]))}],
[]}.
now_to_utc_string({MegaSecs, Secs, MicroSecs}) ->
{{Year, Month, Day}, {Hour, Minute, Second}} =
calendar:now_to_universal_time({MegaSecs, Secs, MicroSecs}),
lists:flatten(
io_lib:format("~4..0w-~2..0w-~2..0wT~2..0w:~2..0w:~2..0w.~6..0wZ",
[Year, Month, Day, Hour, Minute, Second, MicroSecs])).
now_to_local_string({MegaSecs, Secs, MicroSecs}) ->
LocalTime = calendar:now_to_local_time({MegaSecs, Secs, MicroSecs}),
UTCTime = calendar:now_to_universal_time({MegaSecs, Secs, MicroSecs}),
Seconds = calendar:datetime_to_gregorian_seconds(LocalTime) -
calendar:datetime_to_gregorian_seconds(UTCTime),
{{H, M, _}, Sign} = if
Seconds < 0 ->
{calendar:seconds_to_time(-Seconds), "-"};
true ->
{calendar:seconds_to_time(Seconds), "+"}
end,
{{Year, Month, Day}, {Hour, Minute, Second}} = LocalTime,
lists:flatten(
io_lib:format("~4..0w-~2..0w-~2..0wT~2..0w:~2..0w:~2..0w.~6..0w~s~2..0w:~2..0w",
[Year, Month, Day, Hour, Minute, Second, MicroSecs, Sign, H, M])).
% yyyy-mm-ddThh:mm:ss[.sss]{Z|{+|-}hh:mm} -> {MegaSecs, Secs, MicroSecs}
datetime_string_to_timestamp(TimeStr) ->
case catch parse_datetime(TimeStr) of
{'EXIT', _Err} ->
undefined;
TimeStamp ->
TimeStamp
end.
parse_datetime(TimeStr) ->
[Date, Time] = string:tokens(TimeStr, "T"),
D = parse_date(Date),
{T, MS, TZH, TZM} = parse_time(Time),
S = calendar:datetime_to_gregorian_seconds({D, T}),
S1 = calendar:datetime_to_gregorian_seconds({{1970, 1, 1}, {0, 0, 0}}),
Seconds = (S - S1) - TZH * 60 * 60 - TZM * 60,
{Seconds div 1000000, Seconds rem 1000000, MS}.
% yyyy-mm-dd
parse_date(Date) ->
[Y, M, D] = string:tokens(Date, "-"),
Date1 = {list_to_integer(Y), list_to_integer(M), list_to_integer(D)},
case calendar:valid_date(Date1) of
true ->
Date1;
_ ->
false
end.
% hh:mm:ss[.sss]TZD
parse_time(Time) ->
case string:str(Time, "Z") of
0 ->
parse_time_with_timezone(Time);
_ ->
[T | _] = string:tokens(Time, "Z"),
{TT, MS} = parse_time1(T),
{TT, MS, 0, 0}
end.
parse_time_with_timezone(Time) ->
case string:str(Time, "+") of
0 ->
case string:str(Time, "-") of
0 ->
false;
_ ->
parse_time_with_timezone(Time, "-")
end;
_ ->
parse_time_with_timezone(Time, "+")
end.
parse_time_with_timezone(Time, Delim) ->
[T, TZ] = string:tokens(Time, Delim),
{TZH, TZM} = parse_timezone(TZ),
{TT, MS} = parse_time1(T),
case Delim of
"-" ->
{TT, MS, -TZH, -TZM};
"+" ->
{TT, MS, TZH, TZM}
end.
parse_timezone(TZ) ->
[H, M] = string:tokens(TZ, ":"),
{[H1, M1], true} = check_list([{H, 12}, {M, 60}]),
{H1, M1}.
parse_time1(Time) ->
[HMS | T] = string:tokens(Time, "."),
MS = case T of
[] ->
0;
[Val] ->
list_to_integer(string:left(Val, 6, $0))
end,
[H, M, S] = string:tokens(HMS, ":"),
{[H1, M1, S1], true} = check_list([{H, 24}, {M, 60}, {S, 60}]),
{{H1, M1, S1}, MS}.
check_list(List) ->
lists:mapfoldl(
fun({L, N}, B)->
V = list_to_integer(L),
if
(V >= 0) and (V =< N) ->
{V, B};
true ->
{false, false}
end
end, true, List).
%
% Base64 stuff (based on httpd_util.erl)
%
decode_base64(S) ->
decode1_base64([C || C <- S,
C /= $ ,
C /= $\t,
C /= $\n,
C /= $\r]).
decode1_base64([]) ->
[];
decode1_base64([Sextet1,Sextet2,$=,$=|Rest]) ->
Bits2x6=
(d(Sextet1) bsl 18) bor
(d(Sextet2) bsl 12),
Octet1=Bits2x6 bsr 16,
[Octet1|decode1_base64(Rest)];
decode1_base64([Sextet1,Sextet2,Sextet3,$=|Rest]) ->
Bits3x6=
(d(Sextet1) bsl 18) bor
(d(Sextet2) bsl 12) bor
(d(Sextet3) bsl 6),
Octet1=Bits3x6 bsr 16,
Octet2=(Bits3x6 bsr 8) band 16#ff,
[Octet1,Octet2|decode1_base64(Rest)];
decode1_base64([Sextet1,Sextet2,Sextet3,Sextet4|Rest]) ->
Bits4x6=
(d(Sextet1) bsl 18) bor
(d(Sextet2) bsl 12) bor
(d(Sextet3) bsl 6) bor
d(Sextet4),
Octet1=Bits4x6 bsr 16,
Octet2=(Bits4x6 bsr 8) band 16#ff,
Octet3=Bits4x6 band 16#ff,
[Octet1,Octet2,Octet3|decode1_base64(Rest)];
decode1_base64(_CatchAll) ->
"".
d(X) when X >= $A, X =<$Z ->
X-65;
d(X) when X >= $a, X =<$z ->
X-71;
d(X) when X >= $0, X =<$9 ->
X+4;
d($+) -> 62;
d($/) -> 63;
d(_) -> 63.
encode_base64([]) ->
[];
encode_base64([A]) ->
[e(A bsr 2), e((A band 3) bsl 4), $=, $=];
encode_base64([A,B]) ->
[e(A bsr 2), e(((A band 3) bsl 4) bor (B bsr 4)), e((B band 15) bsl 2), $=];
encode_base64([A,B,C|Ls]) ->
encode_base64_do(A,B,C, Ls).
encode_base64_do(A,B,C, Rest) ->
BB = (A bsl 16) bor (B bsl 8) bor C,
[e(BB bsr 18), e((BB bsr 12) band 63),
e((BB bsr 6) band 63), e(BB band 63)|encode_base64(Rest)].
e(X) when X >= 0, X < 26 -> X+65;
e(X) when X>25, X<52 -> X+71;
e(X) when X>51, X<62 -> X-4;
e(62) -> $+;
e(63) -> $/;
e(X) -> exit({bad_encode_base64_token, X}).
%% Convert Erlang inet IP to list
ip_to_list({IP, _Port}) ->
ip_to_list(IP);
ip_to_list({_,_,_,_,_,_,_,_} = Ipv6Address) ->
inet_parse:ntoa(Ipv6Address);
%% This function clause could use inet_parse too:
ip_to_list({A,B,C,D}) ->
lists:flatten(io_lib:format("~w.~w.~w.~w",[A,B,C,D]));
ip_to_list(IP) ->
lists:flatten(io_lib:format("~w", [IP])).
ejabberd-2.1.11/src/ejabberd_auth.erl 0000664 0000000 0000000 00000027163 12240230175 014301 0 ustar %%%----------------------------------------------------------------------
%%% File : ejabberd_auth.erl
%%% Author : Alexey Shchepin
%%% Purpose : Authentification
%%% Created : 23 Nov 2002 by Alexey Shchepin
%%%
%%%
%%% ejabberd, Copyright (C) 2002-2012 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
%%% published by the Free Software Foundation; either version 2 of the
%%% License, or (at your option) any later version.
%%%
%%% This program is distributed in the hope that it will be useful,
%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
%%% General Public License for more details.
%%%
%%% You should have received a copy of the GNU General Public License
%%% along with this program; if not, write to the Free Software
%%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
%%% 02111-1307 USA
%%%
%%%----------------------------------------------------------------------
%% TODO: Use the functions in ejabberd auth to add and remove users.
-module(ejabberd_auth).
-author('alexey@process-one.net').
%% External exports
-export([start/0,
set_password/3,
check_password/3,
check_password/5,
check_password_with_authmodule/3,
check_password_with_authmodule/5,
try_register/3,
dirty_get_registered_users/0,
get_vh_registered_users/1,
get_vh_registered_users/2,
get_vh_registered_users_number/1,
get_vh_registered_users_number/2,
get_password/2,
get_password_s/2,
get_password_with_authmodule/2,
is_user_exists/2,
is_user_exists_in_other_modules/3,
remove_user/2,
remove_user/3,
plain_password_required/1,
store_type/1,
entropy/1
]).
-export([auth_modules/1]).
-include("ejabberd.hrl").
%%%----------------------------------------------------------------------
%%% API
%%%----------------------------------------------------------------------
start() ->
lists:foreach(
fun(Host) ->
lists:foreach(
fun(M) ->
M:start(Host)
end, auth_modules(Host))
end, ?MYHOSTS).
%% This is only executed by ejabberd_c2s for non-SASL auth client
plain_password_required(Server) ->
lists:any(
fun(M) ->
M:plain_password_required()
end, auth_modules(Server)).
store_type(Server) ->
lists:foldl(
fun(_, external) ->
external;
(M, scram) ->
case M:store_type() of
external ->
external;
_Else ->
scram
end;
(M, plain) ->
M:store_type()
end, plain, auth_modules(Server)).
%% @doc Check if the user and password can login in server.
%% @spec (User::string(), Server::string(), Password::string()) ->
%% true | false
check_password(User, Server, Password) ->
case check_password_with_authmodule(User, Server, Password) of
{true, _AuthModule} -> true;
false -> false
end.
%% @doc Check if the user and password can login in server.
%% @spec (User::string(), Server::string(), Password::string(),
%% Digest::string(), DigestGen::function()) ->
%% true | false
check_password(User, Server, Password, Digest, DigestGen) ->
case check_password_with_authmodule(User, Server, Password,
Digest, DigestGen) of
{true, _AuthModule} -> true;
false -> false
end.
%% @doc Check if the user and password can login in server.
%% The user can login if at least an authentication method accepts the user
%% and the password.
%% The first authentication method that accepts the credentials is returned.
%% @spec (User::string(), Server::string(), Password::string()) ->
%% {true, AuthModule} | false
%% where
%% AuthModule = ejabberd_auth_anonymous | ejabberd_auth_external
%% | ejabberd_auth_internal | ejabberd_auth_ldap
%% | ejabberd_auth_odbc | ejabberd_auth_pam
check_password_with_authmodule(User, Server, Password) ->
check_password_loop(auth_modules(Server), [User, Server, Password]).
check_password_with_authmodule(User, Server, Password, Digest, DigestGen) ->
check_password_loop(auth_modules(Server), [User, Server, Password,
Digest, DigestGen]).
check_password_loop([], _Args) ->
false;
check_password_loop([AuthModule | AuthModules], Args) ->
case apply(AuthModule, check_password, Args) of
true ->
{true, AuthModule};
false ->
check_password_loop(AuthModules, Args)
end.
%% @spec (User::string(), Server::string(), Password::string()) ->
%% ok | {error, ErrorType}
%% where ErrorType = empty_password | not_allowed | invalid_jid
set_password(_User, _Server, "") ->
%% We do not allow empty password
{error, empty_password};
set_password(User, Server, Password) ->
lists:foldl(
fun(M, {error, _}) ->
M:set_password(User, Server, Password);
(_M, Res) ->
Res
end, {error, not_allowed}, auth_modules(Server)).
%% @spec (User, Server, Password) -> {atomic, ok} | {atomic, exists} | {error, not_allowed}
try_register(_User, _Server, "") ->
%% We do not allow empty password
{error, not_allowed};
try_register(User, Server, Password) ->
case is_user_exists(User,Server) of
true ->
{atomic, exists};
false ->
case lists:member(jlib:nameprep(Server), ?MYHOSTS) of
true ->
Res = lists:foldl(
fun(_M, {atomic, ok} = Res) ->
Res;
(M, _) ->
M:try_register(User, Server, Password)
end, {error, not_allowed}, auth_modules(Server)),
case Res of
{atomic, ok} ->
ejabberd_hooks:run(register_user, Server,
[User, Server]),
{atomic, ok};
_ -> Res
end;
false ->
{error, not_allowed}
end
end.
%% Registered users list do not include anonymous users logged
dirty_get_registered_users() ->
lists:flatmap(
fun(M) ->
M:dirty_get_registered_users()
end, auth_modules()).
%% Registered users list do not include anonymous users logged
get_vh_registered_users(Server) ->
lists:flatmap(
fun(M) ->
M:get_vh_registered_users(Server)
end, auth_modules(Server)).
get_vh_registered_users(Server, Opts) ->
lists:flatmap(
fun(M) ->
case erlang:function_exported(
M, get_vh_registered_users, 2) of
true ->
M:get_vh_registered_users(Server, Opts);
false ->
M:get_vh_registered_users(Server)
end
end, auth_modules(Server)).
get_vh_registered_users_number(Server) ->
lists:sum(
lists:map(
fun(M) ->
case erlang:function_exported(
M, get_vh_registered_users_number, 1) of
true ->
M:get_vh_registered_users_number(Server);
false ->
length(M:get_vh_registered_users(Server))
end
end, auth_modules(Server))).
get_vh_registered_users_number(Server, Opts) ->
lists:sum(
lists:map(
fun(M) ->
case erlang:function_exported(
M, get_vh_registered_users_number, 2) of
true ->
M:get_vh_registered_users_number(Server, Opts);
false ->
length(M:get_vh_registered_users(Server))
end
end, auth_modules(Server))).
%% @doc Get the password of the user.
%% @spec (User::string(), Server::string()) -> Password::string()
get_password(User, Server) ->
lists:foldl(
fun(M, false) ->
M:get_password(User, Server);
(_M, Password) ->
Password
end, false, auth_modules(Server)).
get_password_s(User, Server) ->
case get_password(User, Server) of
false ->
"";
Password when is_list(Password) ->
Password;
_ ->
""
end.
%% @doc Get the password of the user and the auth module.
%% @spec (User::string(), Server::string()) ->
%% {Password::string(), AuthModule::atom()} | {false, none}
get_password_with_authmodule(User, Server) ->
lists:foldl(
fun(M, {false, _}) ->
{M:get_password(User, Server), M};
(_M, {Password, AuthModule}) ->
{Password, AuthModule}
end, {false, none}, auth_modules(Server)).
%% Returns true if the user exists in the DB or if an anonymous user is logged
%% under the given name
is_user_exists(User, Server) ->
lists:any(
fun(M) ->
case M:is_user_exists(User, Server) of
{error, Error} ->
?ERROR_MSG("The authentication module ~p returned an "
"error~nwhen checking user ~p in server ~p~n"
"Error message: ~p",
[M, User, Server, Error]),
false;
Else ->
Else
end
end, auth_modules(Server)).
%% Check if the user exists in all authentications module except the module
%% passed as parameter
%% @spec (Module::atom(), User, Server) -> true | false | maybe
is_user_exists_in_other_modules(Module, User, Server) ->
is_user_exists_in_other_modules_loop(
auth_modules(Server)--[Module],
User, Server).
is_user_exists_in_other_modules_loop([], _User, _Server) ->
false;
is_user_exists_in_other_modules_loop([AuthModule|AuthModules], User, Server) ->
case AuthModule:is_user_exists(User, Server) of
true ->
true;
false ->
is_user_exists_in_other_modules_loop(AuthModules, User, Server);
{error, Error} ->
?DEBUG("The authentication module ~p returned an error~nwhen "
"checking user ~p in server ~p~nError message: ~p",
[AuthModule, User, Server, Error]),
maybe
end.
%% @spec (User, Server) -> ok
%% @doc Remove user.
%% Note: it may return ok even if there was some problem removing the user.
remove_user(User, Server) ->
lists:foreach(
fun(M) ->
M:remove_user(User, Server)
end, auth_modules(Server)),
ejabberd_hooks:run(remove_user, jlib:nameprep(Server), [User, Server]),
ok.
%% @spec (User, Server, Password) -> ok | not_exists | not_allowed | bad_request | error
%% @doc Try to remove user if the provided password is correct.
%% The removal is attempted in each auth method provided:
%% when one returns 'ok' the loop stops;
%% if no method returns 'ok' then it returns the error message indicated by the last method attempted.
remove_user(User, Server, Password) ->
R = lists:foldl(
fun(_M, ok = Res) ->
Res;
(M, _) ->
M:remove_user(User, Server, Password)
end, error, auth_modules(Server)),
case R of
ok -> ejabberd_hooks:run(remove_user, jlib:nameprep(Server), [User, Server]);
_ -> none
end,
R.
%% @spec (IOList) -> non_negative_float()
%% @doc Calculate informational entropy.
entropy(IOList) ->
case binary_to_list(iolist_to_binary(IOList)) of
"" ->
0.0;
S ->
Set = lists:foldl(
fun(C, [Digit, Printable, LowLetter, HiLetter, Other]) ->
if C >= $a, C =< $z ->
[Digit, Printable, 26, HiLetter, Other];
C >= $0, C =< $9 ->
[9, Printable, LowLetter, HiLetter, Other];
C >= $A, C =< $Z ->
[Digit, Printable, LowLetter, 26, Other];
C >= 16#21, C =< 16#7e ->
[Digit, 33, LowLetter, HiLetter, Other];
true ->
[Digit, Printable, LowLetter, HiLetter, 128]
end
end, [0, 0, 0, 0, 0], S),
length(S) * math:log(lists:sum(Set))/math:log(2)
end.
%%%----------------------------------------------------------------------
%%% Internal functions
%%%----------------------------------------------------------------------
%% Return the lists of all the auth modules actually used in the
%% configuration
auth_modules() ->
lists:usort(
lists:flatmap(
fun(Server) ->
auth_modules(Server)
end, ?MYHOSTS)).
%% Return the list of authenticated modules for a given host
auth_modules(Server) ->
LServer = jlib:nameprep(Server),
Method = ejabberd_config:get_local_option({auth_method, LServer}),
Methods = if
Method == undefined -> [];
is_list(Method) -> Method;
is_atom(Method) -> [Method]
end,
[list_to_atom("ejabberd_auth_" ++ atom_to_list(M)) || M <- Methods].
ejabberd-2.1.11/src/ejabberd_local.erl 0000664 0000000 0000000 00000027475 12240230175 014440 0 ustar %%%----------------------------------------------------------------------
%%% File : ejabberd_local.erl
%%% Author : Alexey Shchepin
%%% Purpose : Route local packets
%%% Created : 30 Nov 2002 by Alexey Shchepin
%%%
%%%
%%% ejabberd, Copyright (C) 2002-2012 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
%%% published by the Free Software Foundation; either version 2 of the
%%% License, or (at your option) any later version.
%%%
%%% This program is distributed in the hope that it will be useful,
%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
%%% General Public License for more details.
%%%
%%% You should have received a copy of the GNU General Public License
%%% along with this program; if not, write to the Free Software
%%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
%%% 02111-1307 USA
%%%
%%%----------------------------------------------------------------------
-module(ejabberd_local).
-author('alexey@process-one.net').
-behaviour(gen_server).
%% API
-export([start_link/0]).
-export([route/3,
route_iq/4,
route_iq/5,
process_iq_reply/3,
register_iq_handler/4,
register_iq_handler/5,
register_iq_response_handler/4,
register_iq_response_handler/5,
unregister_iq_handler/2,
unregister_iq_response_handler/2,
refresh_iq_handlers/0,
bounce_resource_packet/3
]).
%% gen_server callbacks
-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
terminate/2, code_change/3]).
-include("ejabberd.hrl").
-include("jlib.hrl").
-record(state, {}).
-record(iq_response, {id, module, function, timer}).
-define(IQTABLE, local_iqtable).
%% This value is used in SIP and Megaco for a transaction lifetime.
-define(IQ_TIMEOUT, 32000).
%%====================================================================
%% API
%%====================================================================
%%--------------------------------------------------------------------
%% Function: start_link() -> {ok,Pid} | ignore | {error,Error}
%% Description: Starts the server
%%--------------------------------------------------------------------
start_link() ->
gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
process_iq(From, To, Packet) ->
IQ = jlib:iq_query_info(Packet),
case IQ of
#iq{xmlns = XMLNS} ->
Host = To#jid.lserver,
case ets:lookup(?IQTABLE, {XMLNS, Host}) of
[{_, Module, Function}] ->
ResIQ = Module:Function(From, To, IQ),
if
ResIQ /= ignore ->
ejabberd_router:route(
To, From, jlib:iq_to_xml(ResIQ));
true ->
ok
end;
[{_, Module, Function, Opts}] ->
gen_iq_handler:handle(Host, Module, Function, Opts,
From, To, IQ);
[] ->
Err = jlib:make_error_reply(
Packet, ?ERR_FEATURE_NOT_IMPLEMENTED),
ejabberd_router:route(To, From, Err)
end;
reply ->
IQReply = jlib:iq_query_or_response_info(Packet),
process_iq_reply(From, To, IQReply);
_ ->
Err = jlib:make_error_reply(Packet, ?ERR_BAD_REQUEST),
ejabberd_router:route(To, From, Err),
ok
end.
process_iq_reply(From, To, #iq{id = ID} = IQ) ->
case get_iq_callback(ID) of
{ok, undefined, Function} ->
Function(IQ),
ok;
{ok, Module, Function} ->
Module:Function(From, To, IQ),
ok;
_ ->
nothing
end.
route(From, To, Packet) ->
case catch do_route(From, To, Packet) of
{'EXIT', Reason} ->
?ERROR_MSG("~p~nwhen processing: ~p",
[Reason, {From, To, Packet}]);
_ ->
ok
end.
route_iq(From, To, IQ, F) ->
route_iq(From, To, IQ, F, undefined).
route_iq(From, To, #iq{type = Type} = IQ, F, Timeout) when is_function(F) ->
Packet = if Type == set; Type == get ->
ID = randoms:get_string(),
Host = From#jid.lserver,
register_iq_response_handler(Host, ID, undefined, F, Timeout),
jlib:iq_to_xml(IQ#iq{id = ID});
true ->
jlib:iq_to_xml(IQ)
end,
ejabberd_router:route(From, To, Packet).
register_iq_response_handler(Host, ID, Module, Function) ->
register_iq_response_handler(Host, ID, Module, Function, undefined).
register_iq_response_handler(_Host, ID, Module, Function, Timeout0) ->
Timeout = case Timeout0 of
undefined ->
?IQ_TIMEOUT;
N when is_integer(N), N > 0 ->
N
end,
TRef = erlang:start_timer(Timeout, ejabberd_local, ID),
mnesia:dirty_write(#iq_response{id = ID,
module = Module,
function = Function,
timer = TRef}).
register_iq_handler(Host, XMLNS, Module, Fun) ->
ejabberd_local ! {register_iq_handler, Host, XMLNS, Module, Fun}.
register_iq_handler(Host, XMLNS, Module, Fun, Opts) ->
ejabberd_local ! {register_iq_handler, Host, XMLNS, Module, Fun, Opts}.
unregister_iq_response_handler(_Host, ID) ->
catch get_iq_callback(ID),
ok.
unregister_iq_handler(Host, XMLNS) ->
ejabberd_local ! {unregister_iq_handler, Host, XMLNS}.
refresh_iq_handlers() ->
ejabberd_local ! refresh_iq_handlers.
bounce_resource_packet(From, To, Packet) ->
Err = jlib:make_error_reply(Packet, ?ERR_ITEM_NOT_FOUND),
ejabberd_router:route(To, From, Err),
stop.
%%====================================================================
%% gen_server callbacks
%%====================================================================
%%--------------------------------------------------------------------
%% Function: init(Args) -> {ok, State} |
%% {ok, State, Timeout} |
%% ignore |
%% {stop, Reason}
%% Description: Initiates the server
%%--------------------------------------------------------------------
init([]) ->
lists:foreach(
fun(Host) ->
ejabberd_router:register_route(Host, {apply, ?MODULE, route}),
ejabberd_hooks:add(local_send_to_resource_hook, Host,
?MODULE, bounce_resource_packet, 100)
end, ?MYHOSTS),
catch ets:new(?IQTABLE, [named_table, public]),
update_table(),
mnesia:create_table(iq_response,
[{ram_copies, [node()]},
{attributes, record_info(fields, iq_response)}]),
mnesia:add_table_copy(iq_response, node(), ram_copies),
{ok, #state{}}.
%%--------------------------------------------------------------------
%% Function: %% handle_call(Request, From, State) -> {reply, Reply, State} |
%% {reply, Reply, State, Timeout} |
%% {noreply, State} |
%% {noreply, State, Timeout} |
%% {stop, Reason, Reply, State} |
%% {stop, Reason, State}
%% Description: Handling call messages
%%--------------------------------------------------------------------
handle_call(_Request, _From, State) ->
Reply = ok,
{reply, Reply, State}.
%%--------------------------------------------------------------------
%% Function: handle_cast(Msg, State) -> {noreply, State} |
%% {noreply, State, Timeout} |
%% {stop, Reason, State}
%% Description: Handling cast messages
%%--------------------------------------------------------------------
handle_cast(_Msg, State) ->
{noreply, State}.
%%--------------------------------------------------------------------
%% Function: handle_info(Info, State) -> {noreply, State} |
%% {noreply, State, Timeout} |
%% {stop, Reason, State}
%% Description: Handling all non call/cast messages
%%--------------------------------------------------------------------
handle_info({route, From, To, Packet}, State) ->
case catch do_route(From, To, Packet) of
{'EXIT', Reason} ->
?ERROR_MSG("~p~nwhen processing: ~p",
[Reason, {From, To, Packet}]);
_ ->
ok
end,
{noreply, State};
handle_info({register_iq_handler, Host, XMLNS, Module, Function}, State) ->
ets:insert(?IQTABLE, {{XMLNS, Host}, Module, Function}),
catch mod_disco:register_feature(Host, XMLNS),
{noreply, State};
handle_info({register_iq_handler, Host, XMLNS, Module, Function, Opts}, State) ->
ets:insert(?IQTABLE, {{XMLNS, Host}, Module, Function, Opts}),
catch mod_disco:register_feature(Host, XMLNS),
{noreply, State};
handle_info({unregister_iq_handler, Host, XMLNS}, State) ->
case ets:lookup(?IQTABLE, {XMLNS, Host}) of
[{_, Module, Function, Opts}] ->
gen_iq_handler:stop_iq_handler(Module, Function, Opts);
_ ->
ok
end,
ets:delete(?IQTABLE, {XMLNS, Host}),
catch mod_disco:unregister_feature(Host, XMLNS),
{noreply, State};
handle_info(refresh_iq_handlers, State) ->
lists:foreach(
fun(T) ->
case T of
{{XMLNS, Host}, _Module, _Function, _Opts} ->
catch mod_disco:register_feature(Host, XMLNS);
{{XMLNS, Host}, _Module, _Function} ->
catch mod_disco:register_feature(Host, XMLNS);
_ ->
ok
end
end, ets:tab2list(?IQTABLE)),
{noreply, State};
handle_info({timeout, _TRef, ID}, State) ->
process_iq_timeout(ID),
{noreply, State};
handle_info(_Info, State) ->
{noreply, State}.
%%--------------------------------------------------------------------
%% Function: terminate(Reason, State) -> void()
%% Description: This function is called by a gen_server when it is about to
%% terminate. It should be the opposite of Module:init/1 and do any necessary
%% cleaning up. When it returns, the gen_server terminates with Reason.
%% The return value is ignored.
%%--------------------------------------------------------------------
terminate(_Reason, _State) ->
ok.
%%--------------------------------------------------------------------
%% Func: code_change(OldVsn, State, Extra) -> {ok, NewState}
%% Description: Convert process state when code is changed
%%--------------------------------------------------------------------
code_change(_OldVsn, State, _Extra) ->
{ok, State}.
%%--------------------------------------------------------------------
%%% Internal functions
%%--------------------------------------------------------------------
do_route(From, To, Packet) ->
?DEBUG("local route~n\tfrom ~p~n\tto ~p~n\tpacket ~P~n",
[From, To, Packet, 8]),
if
To#jid.luser /= "" ->
ejabberd_sm:route(From, To, Packet);
To#jid.lresource == "" ->
{xmlelement, Name, _Attrs, _Els} = Packet,
case Name of
"iq" ->
process_iq(From, To, Packet);
"message" ->
ok;
"presence" ->
ok;
_ ->
ok
end;
true ->
{xmlelement, _Name, Attrs, _Els} = Packet,
case xml:get_attr_s("type", Attrs) of
"error" -> ok;
"result" -> ok;
_ ->
ejabberd_hooks:run(local_send_to_resource_hook,
To#jid.lserver,
[From, To, Packet])
end
end.
update_table() ->
case catch mnesia:table_info(iq_response, attributes) of
[id, module, function] ->
mnesia:delete_table(iq_response);
[id, module, function, timer] ->
ok;
{'EXIT', _} ->
ok
end.
get_iq_callback(ID) ->
case mnesia:dirty_read(iq_response, ID) of
[#iq_response{module = Module, timer = TRef,
function = Function}] ->
cancel_timer(TRef),
mnesia:dirty_delete(iq_response, ID),
{ok, Module, Function};
_ ->
error
end.
process_iq_timeout(ID) ->
spawn(fun process_iq_timeout/0) ! ID.
process_iq_timeout() ->
receive
ID ->
case get_iq_callback(ID) of
{ok, undefined, Function} ->
Function(timeout);
_ ->
ok
end
after 5000 ->
ok
end.
cancel_timer(TRef) ->
case erlang:cancel_timer(TRef) of
false ->
receive
{timeout, TRef, _} ->
ok
after 0 ->
ok
end;
_ ->
ok
end.
ejabberd-2.1.11/src/mod_echo.erl 0000664 0000000 0000000 00000020223 12240230175 013265 0 ustar %%%----------------------------------------------------------------------
%%% File : mod_echo.erl
%%% Author : Alexey Shchepin
%%% Purpose : Simple ejabberd module.
%%% Created : 15 Jan 2003 by Alexey Shchepin
%%%
%%%
%%% ejabberd, Copyright (C) 2002-2012 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
%%% published by the Free Software Foundation; either version 2 of the
%%% License, or (at your option) any later version.
%%%
%%% This program is distributed in the hope that it will be useful,
%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
%%% General Public License for more details.
%%%
%%% You should have received a copy of the GNU General Public License
%%% along with this program; if not, write to the Free Software
%%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
%%% 02111-1307 USA
%%%
%%%----------------------------------------------------------------------
-module(mod_echo).
-author('alexey@process-one.net').
-behaviour(gen_server).
-behaviour(gen_mod).
%% API
-export([start_link/2, start/2, stop/1, do_client_version/3]).
%% gen_server callbacks
-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
terminate/2, code_change/3]).
-include("ejabberd.hrl").
-include("jlib.hrl").
-record(state, {host}).
-define(PROCNAME, ejabberd_mod_echo).
%%====================================================================
%% API
%%====================================================================
%%--------------------------------------------------------------------
%% Function: start_link() -> {ok,Pid} | ignore | {error,Error}
%% Description: Starts the server
%%--------------------------------------------------------------------
start_link(Host, Opts) ->
Proc = gen_mod:get_module_proc(Host, ?PROCNAME),
gen_server:start_link({local, Proc}, ?MODULE, [Host, Opts], []).
start(Host, Opts) ->
Proc = gen_mod:get_module_proc(Host, ?PROCNAME),
ChildSpec =
{Proc,
{?MODULE, start_link, [Host, Opts]},
temporary,
1000,
worker,
[?MODULE]},
supervisor:start_child(ejabberd_sup, ChildSpec).
stop(Host) ->
Proc = gen_mod:get_module_proc(Host, ?PROCNAME),
gen_server:call(Proc, stop),
supervisor:terminate_child(ejabberd_sup, Proc),
supervisor:delete_child(ejabberd_sup, Proc).
%%====================================================================
%% gen_server callbacks
%%====================================================================
%%--------------------------------------------------------------------
%% Function: init(Args) -> {ok, State} |
%% {ok, State, Timeout} |
%% ignore |
%% {stop, Reason}
%% Description: Initiates the server
%%--------------------------------------------------------------------
init([Host, Opts]) ->
MyHost = gen_mod:get_opt_host(Host, Opts, "echo.@HOST@"),
ejabberd_router:register_route(MyHost),
{ok, #state{host = MyHost}}.
%%--------------------------------------------------------------------
%% Function: %% handle_call(Request, From, State) -> {reply, Reply, State} |
%% {reply, Reply, State, Timeout} |
%% {noreply, State} |
%% {noreply, State, Timeout} |
%% {stop, Reason, Reply, State} |
%% {stop, Reason, State}
%% Description: Handling call messages
%%--------------------------------------------------------------------
handle_call(stop, _From, State) ->
{stop, normal, ok, State}.
%%--------------------------------------------------------------------
%% Function: handle_cast(Msg, State) -> {noreply, State} |
%% {noreply, State, Timeout} |
%% {stop, Reason, State}
%% Description: Handling cast messages
%%--------------------------------------------------------------------
handle_cast(_Msg, State) ->
{noreply, State}.
%%--------------------------------------------------------------------
%% Function: handle_info(Info, State) -> {noreply, State} |
%% {noreply, State, Timeout} |
%% {stop, Reason, State}
%% Description: Handling all non call/cast messages
%%--------------------------------------------------------------------
handle_info({route, From, To, Packet}, State) ->
Packet2 = case From#jid.user of
"" -> jlib:make_error_reply(Packet, ?ERR_BAD_REQUEST);
_ -> Packet
end,
do_client_version(disabled, To, From), % Put 'enabled' to enable it
ejabberd_router:route(To, From, Packet2),
{noreply, State};
handle_info(_Info, State) ->
{noreply, State}.
%%--------------------------------------------------------------------
%% Function: terminate(Reason, State) -> void()
%% Description: This function is called by a gen_server when it is about to
%% terminate. It should be the opposite of Module:init/1 and do any necessary
%% cleaning up. When it returns, the gen_server terminates with Reason.
%% The return value is ignored.
%%--------------------------------------------------------------------
terminate(_Reason, State) ->
ejabberd_router:unregister_route(State#state.host),
ok.
%%--------------------------------------------------------------------
%% Func: code_change(OldVsn, State, Extra) -> {ok, NewState}
%% Description: Convert process state when code is changed
%%--------------------------------------------------------------------
code_change(_OldVsn, State, _Extra) ->
{ok, State}.
%%--------------------------------------------------------------------
%% Example of routing XMPP packets using Erlang's message passing
%%--------------------------------------------------------------------
%% To enable this educational example, edit the function handle_info:
%% replace the argument 'disabled' with 'enabled' in the call to the
%% function do_client_version.
%% ejabberd provides a method to receive XMPP packets using Erlang's
%% message passing mechanism.
%%
%% The packets received by ejabberd are sent
%% to the local destination process by sending an Erlang message.
%% This means that you can receive XMPP stanzas in an Erlang process
%% using Erlang's Receive, as long as this process is registered in
%% ejabberd as the process which handles the destination JID.
%%
%% This example function is called when a client queries the echo service.
%% This function then sends a query to the client, and waits 5 seconds to
%% receive an answer. The answer will only be accepted if it was sent
%% using exactly the same JID. We add a (mostly) random resource to
%% try to guarantee that the received response matches the request sent.
%% Finally, the received response is printed in the ejabberd log file.
do_client_version(disabled, _From, _To) ->
ok;
do_client_version(enabled, From, To) ->
ToS = jlib:jid_to_string(To),
%% It is important to identify this process and packet
Random_resource = integer_to_list(random:uniform(100000)),
From2 = From#jid{resource = Random_resource,
lresource = Random_resource},
%% Build an iq:query request
Packet = {xmlelement, "iq",
[{"to", ToS}, {"type", "get"}],
[{xmlelement, "query", [{"xmlns", ?NS_VERSION}], []}]},
%% Send the request
ejabberd_router:route(From2, To, Packet),
%% Wait to receive the response
%% It is very important to only accept a packet which is the
%% response to the request that he sent
Els = receive {route, To, From2, IQ} ->
{xmlelement, "query", _, List} = xml:get_subtag(IQ, "query"),
List
after 5000 -> % Timeout in miliseconds: 5 seconds
[]
end,
Values = [{Name, Value} || {xmlelement,Name,[],[{xmlcdata,Value}]} <- Els],
%% Print in log
Values_string1 = [io_lib:format("~n~s: ~p", [N, V]) || {N, V} <- Values],
Values_string2 = lists:concat(Values_string1),
?INFO_MSG("Information of the client: ~s~s", [ToS, Values_string2]).
ejabberd-2.1.11/src/ejabberd_service.erl 0000664 0000000 0000000 00000032164 12240230175 014775 0 ustar %%%----------------------------------------------------------------------
%%% File : ejabberd_service.erl
%%% Author : Alexey Shchepin
%%% Purpose : External component management (XEP-0114)
%%% Created : 6 Dec 2002 by Alexey Shchepin
%%%
%%%
%%% ejabberd, Copyright (C) 2002-2012 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
%%% published by the Free Software Foundation; either version 2 of the
%%% License, or (at your option) any later version.
%%%
%%% This program is distributed in the hope that it will be useful,
%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
%%% General Public License for more details.
%%%
%%% You should have received a copy of the GNU General Public License
%%% along with this program; if not, write to the Free Software
%%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
%%% 02111-1307 USA
%%%
%%%----------------------------------------------------------------------
-module(ejabberd_service).
-author('alexey@process-one.net').
-define(GEN_FSM, p1_fsm).
-behaviour(?GEN_FSM).
%% External exports
-export([start/2,
start_link/2,
send_text/2,
send_element/2,
socket_type/0]).
%% gen_fsm callbacks
-export([init/1,
wait_for_stream/2,
wait_for_handshake/2,
stream_established/2,
handle_event/3,
handle_sync_event/4,
code_change/4,
handle_info/3,
terminate/3,
print_state/1]).
-include("ejabberd.hrl").
-include("jlib.hrl").
-record(state, {socket, sockmod, streamid,
hosts, password, access,
check_from}).
%-define(DBGFSM, true).
-ifdef(DBGFSM).
-define(FSMOPTS, [{debug, [trace]}]).
-else.
-define(FSMOPTS, []).
-endif.
-define(STREAM_HEADER,
""
""
).
-define(STREAM_TRAILER, " ").
-define(INVALID_HEADER_ERR,
""
"Invalid Stream Header "
" "
).
-define(INVALID_HANDSHAKE_ERR,
""
" "
""
"Invalid Handshake "
" "
""
).
-define(INVALID_XML_ERR,
xml:element_to_string(?SERR_XML_NOT_WELL_FORMED)).
-define(INVALID_NS_ERR,
xml:element_to_string(?SERR_INVALID_NAMESPACE)).
%%%----------------------------------------------------------------------
%%% API
%%%----------------------------------------------------------------------
start(SockData, Opts) ->
supervisor:start_child(ejabberd_service_sup, [SockData, Opts]).
start_link(SockData, Opts) ->
?GEN_FSM:start_link(ejabberd_service, [SockData, Opts],
fsm_limit_opts(Opts) ++ ?FSMOPTS).
socket_type() ->
xml_stream.
%%%----------------------------------------------------------------------
%%% Callback functions from gen_fsm
%%%----------------------------------------------------------------------
%%----------------------------------------------------------------------
%% Func: init/1
%% Returns: {ok, StateName, StateData} |
%% {ok, StateName, StateData, Timeout} |
%% ignore |
%% {stop, StopReason}
%%----------------------------------------------------------------------
init([{SockMod, Socket}, Opts]) ->
?INFO_MSG("(~w) External service connected", [Socket]),
Access = case lists:keysearch(access, 1, Opts) of
{value, {_, A}} -> A;
_ -> all
end,
{Hosts, Password} =
case lists:keysearch(hosts, 1, Opts) of
{value, {_, Hs, HOpts}} ->
case lists:keysearch(password, 1, HOpts) of
{value, {_, P}} ->
{Hs, P};
_ ->
% TODO: generate error
false
end;
_ ->
case lists:keysearch(host, 1, Opts) of
{value, {_, H, HOpts}} ->
case lists:keysearch(password, 1, HOpts) of
{value, {_, P}} ->
{[H], P};
_ ->
% TODO: generate error
false
end;
_ ->
% TODO: generate error
false
end
end,
Shaper = case lists:keysearch(shaper_rule, 1, Opts) of
{value, {_, S}} -> S;
_ -> none
end,
CheckFrom = case lists:keysearch(service_check_from, 1, Opts) of
{value, {_, CF}} -> CF;
_ -> true
end,
SockMod:change_shaper(Socket, Shaper),
{ok, wait_for_stream, #state{socket = Socket,
sockmod = SockMod,
streamid = new_id(),
hosts = Hosts,
password = Password,
access = Access,
check_from = CheckFrom
}}.
%%----------------------------------------------------------------------
%% Func: StateName/2
%% Returns: {next_state, NextStateName, NextStateData} |
%% {next_state, NextStateName, NextStateData, Timeout} |
%% {stop, Reason, NewStateData}
%%----------------------------------------------------------------------
wait_for_stream({xmlstreamstart, _Name, Attrs}, StateData) ->
case xml:get_attr_s("xmlns", Attrs) of
"jabber:component:accept" ->
%% Note: XEP-0114 requires to check that destination is a Jabber
%% component served by this Jabber server.
%% However several transports don't respect that,
%% so ejabberd doesn't check 'to' attribute (EJAB-717)
To = xml:get_attr_s("to", Attrs),
Header = io_lib:format(?STREAM_HEADER,
[StateData#state.streamid, xml:crypt(To)]),
send_text(StateData, Header),
{next_state, wait_for_handshake, StateData};
_ ->
send_text(StateData, ?INVALID_HEADER_ERR),
{stop, normal, StateData}
end;
wait_for_stream({xmlstreamerror, _}, StateData) ->
Header = io_lib:format(?STREAM_HEADER,
["none", ?MYNAME]),
send_text(StateData,
Header ++ ?INVALID_XML_ERR ++ ?STREAM_TRAILER),
{stop, normal, StateData};
wait_for_stream(closed, StateData) ->
{stop, normal, StateData}.
wait_for_handshake({xmlstreamelement, El}, StateData) ->
{xmlelement, Name, _Attrs, Els} = El,
case {Name, xml:get_cdata(Els)} of
{"handshake", Digest} ->
case sha:sha(StateData#state.streamid ++
StateData#state.password) of
Digest ->
send_text(StateData, " "),
lists:foreach(
fun(H) ->
ejabberd_router:register_route(H),
?INFO_MSG("Route registered for service ~p~n", [H])
end, StateData#state.hosts),
{next_state, stream_established, StateData};
_ ->
send_text(StateData, ?INVALID_HANDSHAKE_ERR),
{stop, normal, StateData}
end;
_ ->
{next_state, wait_for_handshake, StateData}
end;
wait_for_handshake({xmlstreamend, _Name}, StateData) ->
{stop, normal, StateData};
wait_for_handshake({xmlstreamerror, _}, StateData) ->
send_text(StateData, ?INVALID_XML_ERR ++ ?STREAM_TRAILER),
{stop, normal, StateData};
wait_for_handshake(closed, StateData) ->
{stop, normal, StateData}.
stream_established({xmlstreamelement, El}, StateData) ->
NewEl = jlib:remove_attr("xmlns", El),
{xmlelement, Name, Attrs, _Els} = NewEl,
From = xml:get_attr_s("from", Attrs),
FromJID = case StateData#state.check_from of
%% If the admin does not want to check the from field
%% when accept packets from any address.
%% In this case, the component can send packet of
%% behalf of the server users.
false -> jlib:string_to_jid(From);
%% The default is the standard behaviour in XEP-0114
_ ->
FromJID1 = jlib:string_to_jid(From),
case FromJID1 of
#jid{lserver = Server} ->
case lists:member(Server, StateData#state.hosts) of
true -> FromJID1;
false -> error
end;
_ -> error
end
end,
To = xml:get_attr_s("to", Attrs),
ToJID = case To of
"" -> error;
_ -> jlib:string_to_jid(To)
end,
if ((Name == "iq") or
(Name == "message") or
(Name == "presence")) and
(ToJID /= error) and (FromJID /= error) ->
ejabberd_router:route(FromJID, ToJID, NewEl);
true ->
Err = jlib:make_error_reply(NewEl, ?ERR_BAD_REQUEST),
send_element(StateData, Err),
error
end,
{next_state, stream_established, StateData};
stream_established({xmlstreamend, _Name}, StateData) ->
% TODO
{stop, normal, StateData};
stream_established({xmlstreamerror, _}, StateData) ->
send_text(StateData, ?INVALID_XML_ERR ++ ?STREAM_TRAILER),
{stop, normal, StateData};
stream_established(closed, StateData) ->
% TODO
{stop, normal, StateData}.
%%----------------------------------------------------------------------
%% Func: StateName/3
%% Returns: {next_state, NextStateName, NextStateData} |
%% {next_state, NextStateName, NextStateData, Timeout} |
%% {reply, Reply, NextStateName, NextStateData} |
%% {reply, Reply, NextStateName, NextStateData, Timeout} |
%% {stop, Reason, NewStateData} |
%% {stop, Reason, Reply, NewStateData}
%%----------------------------------------------------------------------
%state_name(Event, From, StateData) ->
% Reply = ok,
% {reply, Reply, state_name, StateData}.
%%----------------------------------------------------------------------
%% Func: handle_event/3
%% Returns: {next_state, NextStateName, NextStateData} |
%% {next_state, NextStateName, NextStateData, Timeout} |
%% {stop, Reason, NewStateData}
%%----------------------------------------------------------------------
handle_event(_Event, StateName, StateData) ->
{next_state, StateName, StateData}.
%%----------------------------------------------------------------------
%% Func: handle_sync_event/4
%% Returns: {next_state, NextStateName, NextStateData} |
%% {next_state, NextStateName, NextStateData, Timeout} |
%% {reply, Reply, NextStateName, NextStateData} |
%% {reply, Reply, NextStateName, NextStateData, Timeout} |
%% {stop, Reason, NewStateData} |
%% {stop, Reason, Reply, NewStateData}
%%----------------------------------------------------------------------
handle_sync_event(_Event, _From, StateName, StateData) ->
Reply = ok,
{reply, Reply, StateName, StateData}.
code_change(_OldVsn, StateName, StateData, _Extra) ->
{ok, StateName, StateData}.
%%----------------------------------------------------------------------
%% Func: handle_info/3
%% Returns: {next_state, NextStateName, NextStateData} |
%% {next_state, NextStateName, NextStateData, Timeout} |
%% {stop, Reason, NewStateData}
%%----------------------------------------------------------------------
handle_info({send_text, Text}, StateName, StateData) ->
send_text(StateData, Text),
{next_state, StateName, StateData};
handle_info({send_element, El}, StateName, StateData) ->
send_element(StateData, El),
{next_state, StateName, StateData};
handle_info({route, From, To, Packet}, StateName, StateData) ->
case acl:match_rule(global, StateData#state.access, From) of
allow ->
{xmlelement, Name, Attrs, Els} = Packet,
Attrs2 = jlib:replace_from_to_attrs(jlib:jid_to_string(From),
jlib:jid_to_string(To),
Attrs),
Text = xml:element_to_binary({xmlelement, Name, Attrs2, Els}),
send_text(StateData, Text);
deny ->
Err = jlib:make_error_reply(Packet, ?ERR_NOT_ALLOWED),
ejabberd_router:route_error(To, From, Err, Packet)
end,
{next_state, StateName, StateData};
handle_info(Info, StateName, StateData) ->
?ERROR_MSG("Unexpected info: ~p", [Info]),
{next_state, StateName, StateData}.
%%----------------------------------------------------------------------
%% Func: terminate/3
%% Purpose: Shutdown the fsm
%% Returns: any
%%----------------------------------------------------------------------
terminate(Reason, StateName, StateData) ->
?INFO_MSG("terminated: ~p", [Reason]),
case StateName of
stream_established ->
lists:foreach(
fun(H) ->
ejabberd_router:unregister_route(H)
end, StateData#state.hosts);
_ ->
ok
end,
(StateData#state.sockmod):close(StateData#state.socket),
ok.
%%----------------------------------------------------------------------
%% Func: print_state/1
%% Purpose: Prepare the state to be printed on error log
%% Returns: State to print
%%----------------------------------------------------------------------
print_state(State) ->
State.
%%%----------------------------------------------------------------------
%%% Internal functions
%%%----------------------------------------------------------------------
send_text(StateData, Text) ->
(StateData#state.sockmod):send(StateData#state.socket, Text).
send_element(StateData, El) ->
send_text(StateData, xml:element_to_binary(El)).
new_id() ->
randoms:get_string().
fsm_limit_opts(Opts) ->
case lists:keysearch(max_fsm_queue, 1, Opts) of
{value, {_, N}} when is_integer(N) ->
[{max_queue, N}];
_ ->
case ejabberd_config:get_local_option(max_fsm_queue) of
N when is_integer(N) ->
[{max_queue, N}];
_ ->
[]
end
end.
ejabberd-2.1.11/src/XmppAddr.asn1 0000664 0000000 0000000 00000000577 12240230175 013321 0 ustar XmppAddr { iso(1) identified-organization(3)
dod(6) internet(1) security(5) mechanisms(5) pkix(7)
id-on(8) id-on-xmppAddr(5) }
DEFINITIONS EXPLICIT TAGS ::=
BEGIN
id-on-xmppAddr OBJECT IDENTIFIER ::= { iso(1) identified-organization(3)
dod(6) internet(1) security(5) mechanisms(5) pkix(7)
id-on(8) 5 }
XmppAddr ::= UTF8String
END
ejabberd-2.1.11/src/configure.ac 0000664 0000000 0000000 00000012172 12240230175 013276 0 ustar # -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ(2.53)
AC_INIT(ejabberd, m4_esyscmd([grep -o -E "\{vsn,.\".*\"\}" ejabberd.app | cut -d \" -f 2 | tr -d '\n']), [ejabberd@process-one.net], [ejabberd])
# Checks for programs.
AC_PROG_CC
AC_PROG_MAKE_SET
if test "x$GCC" = "xyes"; then
CFLAGS="$CFLAGS -Wall"
fi
#locating erlang
AM_WITH_ERLANG
#locating iconv
AM_ICONV
#locating libexpat
AM_WITH_EXPAT
# Checks for typedefs, structures, and compiler characteristics.
AC_C_CONST
# Check Erlang headers are installed
#AC_CHECK_HEADER(erl_driver.h,,[AC_MSG_ERROR([cannot find Erlang header files])])
# Change default prefix
AC_PREFIX_DEFAULT(/)
# Checks for library functions.
AC_FUNC_MALLOC
AC_HEADER_STDC
AC_MOD_ENABLE(mod_irc, yes)
AC_MOD_ENABLE(mod_muc, yes)
AC_MOD_ENABLE(mod_proxy65, yes)
AC_MOD_ENABLE(mod_pubsub, yes)
AC_MOD_ENABLE(eldap, yes)
AC_MOD_ENABLE(odbc, no)
AC_MOD_ENABLE(tls, yes)
AC_MOD_ENABLE(web, yes)
AC_MOD_ENABLE(ejabberd_zlib, yes)
#locating zlib
AM_WITH_ZLIB
AC_MOD_ENABLE(pam, no)
#locating PAM
AM_WITH_PAM
AC_ARG_ENABLE(hipe,
[AC_HELP_STRING([--enable-hipe], [compile natively with HiPE, not recommended (default: no)])],
[case "${enableval}" in
yes) hipe=true ;;
no) hipe=false ;;
*) AC_MSG_ERROR(bad value ${enableval} for --enable-hipe) ;;
esac],[hipe=false])
AC_SUBST(hipe)
AC_ARG_ENABLE(roster_gateway_workaround,
[AC_HELP_STRING([--enable-roster-gateway-workaround], [turn on workaround for processing gateway subscriptions (default: no)])],
[case "${enableval}" in
yes) roster_gateway_workaround=true ;;
no) roster_gateway_workaround=false ;;
*) AC_MSG_ERROR(bad value ${enableval} for --enable-roster-gateway-workaround) ;;
esac],[roster_gateway_workaround=false])
AC_SUBST(roster_gateway_workaround)
AC_ARG_ENABLE(mssql,
[AC_HELP_STRING([--enable-mssql], [use Microsoft SQL Server database (default: no, requires --enable-odbc)])],
[case "${enableval}" in
yes) db_type=mssql ;;
no) db_type=generic ;;
*) AC_MSG_ERROR(bad value ${enableval} for --enable-mssql) ;;
esac],[db_type=generic])
AC_SUBST(db_type)
AC_ARG_ENABLE(transient_supervisors,
[AC_HELP_STRING([--enable-transient_supervisors], [use Erlang supervision for transient process (default: yes)])],
[case "${enableval}" in
yes) transient_supervisors=true ;;
no) transient_supervisors=false ;;
*) AC_MSG_ERROR(bad value ${enableval} for --enable-transient_supervisors) ;;
esac],[transient_supervisors=true])
AC_SUBST(transient_supervisors)
AC_ARG_ENABLE(full_xml,
[AC_HELP_STRING([--enable-full-xml], [use XML features in XMPP stream (ex: CDATA) (default: no, requires XML compliant clients)])],
[case "${enableval}" in
yes) full_xml=true ;;
no) full_xml=false ;;
*) AC_MSG_ERROR(bad value ${enableval} for --enable-full-xml) ;;
esac],[full_xml=false])
AC_SUBST(full_xml)
AC_ARG_ENABLE(nif,
[AC_HELP_STRING([--enable-nif], [replace some functions with C equivalents. Requires Erlang R13B04 or higher (default: no)])],
[case "${enableval}" in
yes) nif=true ;;
no) nif=false ;;
*) AC_MSG_ERROR(bad value ${enableval} for --enable-nif) ;;
esac],[nif=false])
AC_SUBST(nif)
AC_CONFIG_FILES([Makefile
$make_mod_irc
$make_mod_muc
$make_mod_pubsub
$make_mod_proxy65
$make_eldap
$make_pam
$make_web
stringprep/Makefile
stun/Makefile
$make_tls
$make_odbc
$make_ejabberd_zlib])
#openssl
AM_WITH_OPENSSL
# If ssl is kerberized it need krb5.h
# On RedHat and OpenBSD, krb5.h is in an unsual place:
KRB5_INCLUDE="`krb5-config --cflags 2>/dev/null`"
if test -n "$KRB5_INCLUDE" ; then
CPPFLAGS="$CPPFLAGS $KRB5_INCLUDE"
else
# For RedHat For BSD
for D in /usr/kerberos/include /usr/include/kerberos /usr/include/kerberosV
do
if test -d $D ; then
CPPFLAGS="$CPPFLAGS -I$D"
fi
done
fi
AC_CHECK_HEADER(krb5.h,,)
ENABLEUSER=""
AC_ARG_ENABLE(user,
[AS_HELP_STRING([--enable-user[[[[=USER]]]]], [allow this system user to start ejabberd (default: no)])],
[case "${enableval}" in
yes) ENABLEUSER=`whoami` ;;
no) ENABLEUSER="" ;;
*) ENABLEUSER=$enableval
esac],
[])
if test "$ENABLEUSER" != ""; then
echo "allow this system user to start ejabberd: $ENABLEUSER"
AC_SUBST([INSTALLUSER], [$ENABLEUSER])
fi
AC_CHECK_HEADER(openssl/md2.h, md2=true, md2=false)
AC_SUBST(md2)
AC_CANONICAL_SYSTEM
#AC_DEFINE_UNQUOTED(CPU_VENDOR_OS, "$target")
#AC_SUBST(target_os)
case "$target_os" in
*darwin10*)
echo "Target OS is 'Darwin10'"
AC_LANG(Erlang)
AC_RUN_IFELSE(
[AC_LANG_PROGRAM([],[dnl
halt(case erlang:system_info(wordsize) of
8 -> 0; 4 -> 1 end)])],
[AC_MSG_NOTICE(found 64-bit Erlang)
CBIT=-m64],
[AC_MSG_NOTICE(found 32-bit Erlang)
CBIT=-m32])
;;
*)
echo "Target OS is '$target_os'"
CBIT=""
;;
esac
CFLAGS="$CFLAGS $CBIT"
LD_SHARED="$LD_SHARED $CBIT"
echo "CBIT is set to '$CBIT'"
AC_OUTPUT
ejabberd-2.1.11/src/cyrsasl_digest.erl 0000664 0000000 0000000 00000016264 12240230175 014541 0 ustar %%%----------------------------------------------------------------------
%%% File : cyrsasl_digest.erl
%%% Author : Alexey Shchepin
%%% Purpose : DIGEST-MD5 SASL mechanism
%%% Created : 11 Mar 2003 by Alexey Shchepin
%%%
%%%
%%% ejabberd, Copyright (C) 2002-2012 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
%%% published by the Free Software Foundation; either version 2 of the
%%% License, or (at your option) any later version.
%%%
%%% This program is distributed in the hope that it will be useful,
%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
%%% General Public License for more details.
%%%
%%% You should have received a copy of the GNU General Public License
%%% along with this program; if not, write to the Free Software
%%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
%%% 02111-1307 USA
%%%
%%%----------------------------------------------------------------------
-module(cyrsasl_digest).
-author('alexey@sevcom.net').
-export([start/1,
stop/0,
mech_new/4,
mech_step/2]).
-include("ejabberd.hrl").
-behaviour(cyrsasl).
-record(state, {step, nonce, username, authzid, get_password, check_password, auth_module,
host, hostfqdn}).
start(_Opts) ->
Fqdn = get_local_fqdn(),
?INFO_MSG("FQDN used to check DIGEST-MD5 SASL authentication: ~p", [Fqdn]),
cyrsasl:register_mechanism("DIGEST-MD5", ?MODULE, digest).
stop() ->
ok.
mech_new(Host, GetPassword, _CheckPassword, CheckPasswordDigest) ->
{ok, #state{step = 1,
nonce = randoms:get_string(),
host = Host,
hostfqdn = get_local_fqdn(),
get_password = GetPassword,
check_password = CheckPasswordDigest}}.
mech_step(#state{step = 1, nonce = Nonce} = State, _) ->
{continue,
"nonce=\"" ++ Nonce ++
"\",qop=\"auth\",charset=utf-8,algorithm=md5-sess",
State#state{step = 3}};
mech_step(#state{step = 3, nonce = Nonce} = State, ClientIn) ->
case parse(ClientIn) of
bad ->
{error, "bad-protocol"};
KeyVals ->
DigestURI = xml:get_attr_s("digest-uri", KeyVals),
UserName = xml:get_attr_s("username", KeyVals),
case is_digesturi_valid(DigestURI, State#state.host, State#state.hostfqdn) of
false ->
?DEBUG("User login not authorized because digest-uri "
"seems invalid: ~p (checking for Host ~p, FQDN ~p)", [DigestURI,
State#state.host, State#state.hostfqdn]),
{error, "not-authorized", UserName};
true ->
AuthzId = xml:get_attr_s("authzid", KeyVals),
case (State#state.get_password)(UserName) of
{false, _} ->
{error, "not-authorized", UserName};
{Passwd, AuthModule} ->
case (State#state.check_password)(UserName, "",
xml:get_attr_s("response", KeyVals),
fun(PW) -> response(KeyVals, UserName, PW, Nonce, AuthzId,
"AUTHENTICATE") end) of
{true, _} ->
RspAuth = response(KeyVals,
UserName, Passwd,
Nonce, AuthzId, ""),
{continue,
"rspauth=" ++ RspAuth,
State#state{step = 5,
auth_module = AuthModule,
username = UserName,
authzid = AuthzId}};
false ->
{error, "not-authorized", UserName};
{false, _} ->
{error, "not-authorized", UserName}
end
end
end
end;
mech_step(#state{step = 5,
auth_module = AuthModule,
username = UserName,
authzid = AuthzId}, "") ->
{ok, [{username, UserName}, {authzid, AuthzId},
{auth_module, AuthModule}]};
mech_step(A, B) ->
?DEBUG("SASL DIGEST: A ~p B ~p", [A,B]),
{error, "bad-protocol"}.
parse(S) ->
parse1(S, "", []).
parse1([$= | Cs], S, Ts) ->
parse2(Cs, lists:reverse(S), "", Ts);
parse1([$, | Cs], [], Ts) ->
parse1(Cs, [], Ts);
parse1([$\s | Cs], [], Ts) ->
parse1(Cs, [], Ts);
parse1([C | Cs], S, Ts) ->
parse1(Cs, [C | S], Ts);
parse1([], [], T) ->
lists:reverse(T);
parse1([], _S, _T) ->
bad.
parse2([$\" | Cs], Key, Val, Ts) ->
parse3(Cs, Key, Val, Ts);
parse2([C | Cs], Key, Val, Ts) ->
parse4(Cs, Key, [C | Val], Ts);
parse2([], _, _, _) ->
bad.
parse3([$\" | Cs], Key, Val, Ts) ->
parse4(Cs, Key, Val, Ts);
parse3([$\\, C | Cs], Key, Val, Ts) ->
parse3(Cs, Key, [C | Val], Ts);
parse3([C | Cs], Key, Val, Ts) ->
parse3(Cs, Key, [C | Val], Ts);
parse3([], _, _, _) ->
bad.
parse4([$, | Cs], Key, Val, Ts) ->
parse1(Cs, "", [{Key, lists:reverse(Val)} | Ts]);
parse4([$\s | Cs], Key, Val, Ts) ->
parse4(Cs, Key, Val, Ts);
parse4([C | Cs], Key, Val, Ts) ->
parse4(Cs, Key, [C | Val], Ts);
parse4([], Key, Val, Ts) ->
parse1([], "", [{Key, lists:reverse(Val)} | Ts]).
%% @doc Check if the digest-uri is valid.
%% RFC-2831 allows to provide the IP address in Host,
%% however ejabberd doesn't allow that.
%% If the service (for example jabber.example.org)
%% is provided by several hosts (being one of them server3.example.org),
%% then acceptable digest-uris would be:
%% xmpp/server3.example.org/jabber.example.org, xmpp/server3.example.org and
%% xmpp/jabber.example.org
%% The last version is not actually allowed by the RFC, but implemented by popular clients
is_digesturi_valid(DigestURICase, JabberDomain, JabberFQDN) ->
DigestURI = stringprep:tolower(DigestURICase),
case catch string:tokens(DigestURI, "/") of
["xmpp", Host] when (Host == JabberDomain) or (Host == JabberFQDN) ->
true;
["xmpp", Host, ServName] when (ServName == JabberDomain) and (Host == JabberFQDN) ->
true;
_ ->
false
end.
get_local_fqdn() ->
case (catch get_local_fqdn2()) of
Str when is_list(Str) -> Str;
_ -> "unknown-fqdn, please configure fqdn option in ejabberd.cfg!"
end.
get_local_fqdn2() ->
case ejabberd_config:get_local_option(fqdn) of
ConfiguredFqdn when is_list(ConfiguredFqdn) ->
ConfiguredFqdn;
_undefined ->
{ok, Hostname} = inet:gethostname(),
{ok, {hostent, Fqdn, _, _, _, _}} = inet:gethostbyname(Hostname),
Fqdn
end.
digit_to_xchar(D) when (D >= 0) and (D < 10) ->
D + 48;
digit_to_xchar(D) ->
D + 87.
hex(S) ->
hex(S, []).
hex([], Res) ->
lists:reverse(Res);
hex([N | Ns], Res) ->
hex(Ns, [digit_to_xchar(N rem 16),
digit_to_xchar(N div 16) | Res]).
response(KeyVals, User, Passwd, Nonce, AuthzId, A2Prefix) ->
Realm = xml:get_attr_s("realm", KeyVals),
CNonce = xml:get_attr_s("cnonce", KeyVals),
DigestURI = xml:get_attr_s("digest-uri", KeyVals),
NC = xml:get_attr_s("nc", KeyVals),
QOP = xml:get_attr_s("qop", KeyVals),
A1 = case AuthzId of
"" ->
binary_to_list(
crypto:md5(User ++ ":" ++ Realm ++ ":" ++ Passwd)) ++
":" ++ Nonce ++ ":" ++ CNonce;
_ ->
binary_to_list(
crypto:md5(User ++ ":" ++ Realm ++ ":" ++ Passwd)) ++
":" ++ Nonce ++ ":" ++ CNonce ++ ":" ++ AuthzId
end,
A2 = case QOP of
"auth" ->
A2Prefix ++ ":" ++ DigestURI;
_ ->
A2Prefix ++ ":" ++ DigestURI ++
":00000000000000000000000000000000"
end,
T = hex(binary_to_list(crypto:md5(A1))) ++ ":" ++ Nonce ++ ":" ++
NC ++ ":" ++ CNonce ++ ":" ++ QOP ++ ":" ++
hex(binary_to_list(crypto:md5(A2))),
hex(binary_to_list(crypto:md5(T))).
ejabberd-2.1.11/src/mod_shared_roster_odbc.erl 0000664 0000000 0000000 00000112043 12240230175 016204 0 ustar %%%----------------------------------------------------------------------
%%% File : mod_shared_roster_odbc.erl
%%% Author : Alexey Shchepin
%%% Purpose : Shared roster management
%%% Created : 5 Mar 2005 by Alexey Shchepin
%%%
%%%
%%% ejabberd, Copyright (C) 2002-2012 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
%%% published by the Free Software Foundation; either version 2 of the
%%% License, or (at your option) any later version.
%%%
%%% This program is distributed in the hope that it will be useful,
%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
%%% General Public License for more details.
%%%
%%% You should have received a copy of the GNU General Public License
%%% along with this program; if not, write to the Free Software
%%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
%%% 02111-1307 USA
%%%
%%%----------------------------------------------------------------------
-module(mod_shared_roster_odbc).
-author('alexey@process-one.net').
-behaviour(gen_mod).
-export([start/2, stop/1,
item_to_xml/1,
webadmin_menu/3, webadmin_page/3,
get_user_roster/2,
get_subscription_lists/3,
get_jid_info/4,
process_item/2,
in_subscription/6,
out_subscription/4,
user_available/1,
unset_presence/4,
register_user/2,
remove_user/2,
list_groups/1,
create_group/2,
create_group/3,
delete_group/2,
get_group_opts/2,
set_group_opts/3,
get_group_users/2,
get_group_explicit_users/2,
is_user_in_group/3,
add_user_to_group/3,
remove_user_from_group/3]).
-include("ejabberd.hrl").
-include("jlib.hrl").
-include("mod_roster.hrl").
-include("web/ejabberd_http.hrl").
-include("web/ejabberd_web_admin.hrl").
start(Host, _Opts) ->
ejabberd_hooks:add(webadmin_menu_host, Host,
?MODULE, webadmin_menu, 70),
ejabberd_hooks:add(webadmin_page_host, Host,
?MODULE, webadmin_page, 50),
ejabberd_hooks:add(roster_get, Host,
?MODULE, get_user_roster, 70),
ejabberd_hooks:add(roster_in_subscription, Host,
?MODULE, in_subscription, 30),
ejabberd_hooks:add(roster_out_subscription, Host,
?MODULE, out_subscription, 30),
ejabberd_hooks:add(roster_get_subscription_lists, Host,
?MODULE, get_subscription_lists, 70),
ejabberd_hooks:add(roster_get_jid_info, Host,
?MODULE, get_jid_info, 70),
ejabberd_hooks:add(roster_process_item, Host,
?MODULE, process_item, 50),
ejabberd_hooks:add(user_available_hook, Host,
?MODULE, user_available, 50),
ejabberd_hooks:add(unset_presence_hook, Host,
?MODULE, unset_presence, 50),
ejabberd_hooks:add(register_user, Host,
?MODULE, register_user, 50),
ejabberd_hooks:add(anonymous_purge_hook, Host,
?MODULE, remove_user, 50),
ejabberd_hooks:add(remove_user, Host,
?MODULE, remove_user, 50).
%%ejabberd_hooks:add(remove_user, Host,
%% ?MODULE, remove_user, 50),
stop(Host) ->
ejabberd_hooks:delete(webadmin_menu_host, Host,
?MODULE, webadmin_menu, 70),
ejabberd_hooks:delete(webadmin_page_host, Host,
?MODULE, webadmin_page, 50),
ejabberd_hooks:delete(roster_get, Host,
?MODULE, get_user_roster, 70),
ejabberd_hooks:delete(roster_in_subscription, Host,
?MODULE, in_subscription, 30),
ejabberd_hooks:delete(roster_out_subscription, Host,
?MODULE, out_subscription, 30),
ejabberd_hooks:delete(roster_get_subscription_lists, Host,
?MODULE, get_subscription_lists, 70),
ejabberd_hooks:delete(roster_get_jid_info, Host,
?MODULE, get_jid_info, 70),
ejabberd_hooks:delete(roster_process_item, Host,
?MODULE, process_item, 50),
ejabberd_hooks:delete(user_available_hook, Host,
?MODULE, user_available, 50),
ejabberd_hooks:delete(unset_presence_hook, Host,
?MODULE, unset_presence, 50),
ejabberd_hooks:delete(register_user, Host,
?MODULE, register_user, 50),
ejabberd_hooks:delete(anonymous_purge_hook, Host,
?MODULE, remove_user, 50),
ejabberd_hooks:delete(remove_user, Host,
?MODULE, remove_user, 50).
%%ejabberd_hooks:delete(remove_user, Host,
%% ?MODULE, remove_user, 50),
get_user_roster(Items, US) ->
{U, S} = US,
DisplayedGroups = get_user_displayed_groups(US),
%% Get shared roster users in all groups and remove self:
SRUsers =
lists:foldl(
fun(Group, Acc1) ->
GroupName = get_group_name(S, Group),
lists:foldl(
fun(User, Acc2) ->
if User == US -> Acc2;
true -> dict:append(User,
GroupName,
Acc2)
end
end, Acc1, get_group_users(S, Group))
end, dict:new(), DisplayedGroups),
%% If partially subscribed users are also in shared roster, show them as
%% totally subscribed:
{NewItems1, SRUsersRest} =
lists:mapfoldl(
fun(Item, SRUsers1) ->
{_, _, {U1, S1, _}} = Item#roster.usj,
US1 = {U1, S1},
case dict:find(US1, SRUsers1) of
{ok, _GroupNames} ->
{Item#roster{subscription = both, ask = none},
dict:erase(US1, SRUsers1)};
error ->
{Item, SRUsers1}
end
end, SRUsers, Items),
%% Export items in roster format:
ModVcard = get_vcard_module(S),
SRItems = [#roster{usj = {U, S, {U1, S1, ""}},
us = US,
jid = {U1, S1, ""},
name = get_rosteritem_name(ModVcard, U1, S1),
subscription = both,
ask = none,
groups = GroupNames} ||
{{U1, S1}, GroupNames} <- dict:to_list(SRUsersRest)],
SRItems ++ NewItems1.
get_vcard_module(Server) ->
Modules = gen_mod:loaded_modules(Server),
[M || M <- Modules,
(M == mod_vcard) or (M == mod_vcard_odbc) or (M == mod_vcard_ldap)].
get_rosteritem_name([], _, _) ->
"";
get_rosteritem_name([ModVcard], U, S) ->
From = jlib:make_jid("", S, ?MODULE),
To = jlib:make_jid(U, S, ""),
IQ = {iq,"",get,"vcard-temp","",
{xmlelement,"vCard",[{"xmlns","vcard-temp"}],[]}},
IQ_Vcard = ModVcard:process_sm_iq(From, To, IQ),
try get_rosteritem_name_vcard(IQ_Vcard#iq.sub_el)
catch E1:E2 ->
?ERROR_MSG("Error ~p found when trying to get the vCard of ~s@~s "
"in ~p:~n ~p", [E1, U, S, ModVcard, E2]),
""
end.
get_rosteritem_name_vcard([]) ->
"";
get_rosteritem_name_vcard([Vcard]) ->
case xml:get_path_s(Vcard, [{elem, "NICKNAME"}, cdata]) of
"" -> xml:get_path_s(Vcard, [{elem, "FN"}, cdata]);
Nickname -> Nickname
end.
%% This function rewrites the roster entries when moving or renaming
%% them in the user contact list.
process_item(RosterItem, Host) ->
USFrom = {UserFrom, ServerFrom} = RosterItem#roster.us,
{UserTo, ServerTo, ResourceTo} = RosterItem#roster.jid,
NameTo = RosterItem#roster.name,
USTo = {UserTo, ServerTo},
DisplayedGroups = get_user_displayed_groups(USFrom),
CommonGroups = lists:filter(fun(Group) ->
is_user_in_group(USTo, Group, Host)
end, DisplayedGroups),
case CommonGroups of
[] -> RosterItem;
%% Roster item cannot be removed: We simply reset the original groups:
_ when RosterItem#roster.subscription == remove ->
GroupNames = lists:map(fun(Group) ->
get_group_name(Host, Group)
end, CommonGroups),
RosterItem#roster{subscription = both, ask = none,
groups=[GroupNames]};
%% Both users have at least a common shared group,
%% So each user can see the other
_ ->
%% Check if the list of groups of the new roster item
%% include at least a new one
case lists:subtract(RosterItem#roster.groups, CommonGroups) of
%% If it doesn't, then remove this user from any
%% existing roster groups.
[] ->
%% Remove pending subscription by setting it
%% unsubscribed.
Mod = get_roster_mod(ServerFrom),
%% Remove pending out subscription
Mod:out_subscription(UserTo, ServerTo,
jlib:make_jid(UserFrom, ServerFrom, ""),
unsubscribe),
%% Remove pending in subscription
Mod:in_subscription(aaaa, UserFrom, ServerFrom,
jlib:make_jid(UserTo, ServerTo, ""),
unsubscribe, ""),
%% But we're still subscribed, so respond as such.
RosterItem#roster{subscription = both, ask = none};
%% If so, it means the user wants to add that contact
%% to his personal roster
PersonalGroups ->
%% Store roster items in From and To rosters
set_new_rosteritems(UserFrom, ServerFrom,
UserTo, ServerTo, ResourceTo, NameTo,
PersonalGroups)
end
end.
build_roster_record(User1, Server1, User2, Server2, Name2, Groups) ->
USR2 = {User2, Server2, ""},
#roster{usj = {User1, Server1, USR2},
us = {User1, Server1},
jid = USR2,
name = Name2,
subscription = both,
ask = none,
groups = Groups
}.
set_new_rosteritems(UserFrom, ServerFrom,
UserTo, ServerTo, ResourceTo, NameTo, GroupsFrom) ->
Mod = get_roster_mod(ServerFrom),
RIFrom = build_roster_record(UserFrom, ServerFrom,
UserTo, ServerTo, NameTo, GroupsFrom),
set_item(UserFrom, ServerFrom, ResourceTo, RIFrom),
JIDTo = jlib:make_jid(UserTo, ServerTo, ""),
JIDFrom = jlib:make_jid(UserFrom, ServerFrom, ""),
RITo = build_roster_record(UserTo, ServerTo,
UserFrom, ServerFrom, UserFrom,[]),
set_item(UserTo, ServerTo, "", RITo),
%% From requests
Mod:out_subscription(UserFrom, ServerFrom, JIDTo, subscribe),
Mod:in_subscription(aaa, UserTo, ServerTo, JIDFrom, subscribe, ""),
%% To accepts
Mod:out_subscription(UserTo, ServerTo, JIDFrom, subscribed),
Mod:in_subscription(aaa, UserFrom, ServerFrom, JIDTo, subscribed, ""),
%% To requests
Mod:out_subscription(UserTo, ServerTo, JIDFrom, subscribe),
Mod:in_subscription(aaa, UserFrom, ServerFrom, JIDTo, subscribe, ""),
%% From accepts
Mod:out_subscription(UserFrom, ServerFrom, JIDTo, subscribed),
Mod:in_subscription(aaa, UserTo, ServerTo, JIDFrom, subscribed, ""),
RIFrom.
set_item(User, Server, Resource, Item) ->
ResIQ = #iq{type = set, xmlns = ?NS_ROSTER,
id = "push" ++ randoms:get_string(),
sub_el = [{xmlelement, "query",
[{"xmlns", ?NS_ROSTER}],
[mod_roster:item_to_xml(Item)]}]},
ejabberd_router:route(
jlib:make_jid(User, Server, Resource),
jlib:make_jid("", Server, ""),
jlib:iq_to_xml(ResIQ)).
get_subscription_lists({F, T}, User, Server) ->
LUser = jlib:nodeprep(User),
LServer = jlib:nameprep(Server),
US = {LUser, LServer},
DisplayedGroups = get_user_displayed_groups(US),
SRUsers =
lists:usort(
lists:flatmap(
fun(Group) ->
get_group_users(LServer, Group)
end, DisplayedGroups)),
SRJIDs = [{U1, S1, ""} || {U1, S1} <- SRUsers],
{lists:usort(SRJIDs ++ F), lists:usort(SRJIDs ++ T)}.
get_jid_info({Subscription, Groups}, User, Server, JID) ->
LUser = jlib:nodeprep(User),
LServer = jlib:nameprep(Server),
US = {LUser, LServer},
{U1, S1, _} = jlib:jid_tolower(JID),
US1 = {U1, S1},
DisplayedGroups = get_user_displayed_groups(US),
SRUsers =
lists:foldl(
fun(Group, Acc1) ->
lists:foldl(
fun(User1, Acc2) ->
dict:append(
User1, get_group_name(LServer, Group), Acc2)
end, Acc1, get_group_users(LServer, Group))
end, dict:new(), DisplayedGroups),
case dict:find(US1, SRUsers) of
{ok, GroupNames} ->
NewGroups = if
Groups == [] -> GroupNames;
true -> Groups
end,
{both, NewGroups};
error ->
{Subscription, Groups}
end.
in_subscription(Acc, User, Server, JID, Type, _Reason) ->
process_subscription(in, User, Server, JID, Type, Acc).
out_subscription(UserFrom, ServerFrom, JIDTo, unsubscribed) ->
Mod = get_roster_mod(ServerFrom),
%% Remove pending out subscription
#jid{luser = UserTo, lserver = ServerTo} = JIDTo,
JIDFrom = jlib:make_jid(UserFrom, UserTo, ""),
Mod:out_subscription(UserTo, ServerTo, JIDFrom, unsubscribe),
%% Remove pending in subscription
Mod:in_subscription(aaaa, UserFrom, ServerFrom, JIDTo, unsubscribe, ""),
process_subscription(out, UserFrom, ServerFrom, JIDTo, unsubscribed, false);
out_subscription(User, Server, JID, Type) ->
process_subscription(out, User, Server, JID, Type, false).
process_subscription(Direction, User, Server, JID, _Type, Acc) ->
LUser = jlib:nodeprep(User),
LServer = jlib:nameprep(Server),
US = {LUser, LServer},
{U1, S1, _} = jlib:jid_tolower(jlib:jid_remove_resource(JID)),
US1 = {U1, S1},
DisplayedGroups = get_user_displayed_groups(US),
SRUsers =
lists:usort(
lists:flatmap(
fun(Group) ->
get_group_users(LServer, Group)
end, DisplayedGroups)),
case lists:member(US1, SRUsers) of
true ->
case Direction of
in ->
{stop, false};
out ->
stop
end;
false ->
Acc
end.
list_groups(Host) ->
case ejabberd_odbc:sql_query(
Host, ["select name from sr_group;"]) of
{selected, ["name"], Rs} ->
[G || {G} <- Rs];
_ ->
[]
end.
groups_with_opts(Host) ->
case ejabberd_odbc:sql_query(
Host, ["select name, opts from sr_group;"]) of
{selected, ["name", "opts"], Rs} ->
[{G, ejabberd_odbc:decode_term(Opts)} || {G, Opts} <- Rs];
_ ->
[]
end.
create_group(Host, Group) ->
create_group(Host, Group, []).
create_group(Host, Group, Opts) ->
SGroup = ejabberd_odbc:escape(Group),
SOpts = ejabberd_odbc:encode_term(Opts),
F = fun() ->
odbc_queries:update_t("sr_group",
["name", "opts"],
[SGroup, SOpts],
["name='", SGroup, "'"])
end,
ejabberd_odbc:sql_transaction(Host, F).
delete_group(Host, Group) ->
SGroup = ejabberd_odbc:escape(Group),
F = fun() ->
ejabberd_odbc:sql_query_t(
["delete from sr_group where name='", SGroup, "';"]),
ejabberd_odbc:sql_query_t(
["delete from sr_user where grp='", SGroup, "';"])
end,
ejabberd_odbc:sql_transaction(Host, F).
get_group_opts(Host, Group) ->
SGroup = ejabberd_odbc:escape(Group),
case catch ejabberd_odbc:sql_query(
Host, ["select opts from sr_group "
"where name='", SGroup, "';"]) of
{selected, ["opts"], [{SOpts}]} ->
ejabberd_odbc:decode_term(SOpts);
_ ->
error
end.
set_group_opts(Host, Group, Opts) ->
SGroup = ejabberd_odbc:escape(Group),
SOpts = ejabberd_odbc:encode_term(Opts),
F = fun() ->
odbc_queries:update_t("sr_group",
["name", "opts"],
[SGroup, SOpts],
["name='", SGroup, "'"])
end,
ejabberd_odbc:sql_transaction(Host, F).
get_user_groups(US) ->
Host = element(2, US),
SJID = make_jid_s(US),
case catch ejabberd_odbc:sql_query(
Host, ["select grp from sr_user "
"where jid='", SJID, "';"]) of
{selected, ["grp"], Rs} ->
[G || {G} <- Rs];
_ ->
[]
end ++ get_special_users_groups(Host).
is_group_enabled(Host1, Group1) ->
{Host, Group} = split_grouphost(Host1, Group1),
SGroup = ejabberd_odbc:escape(Group),
case catch ejabberd_odbc:sql_query(
Host, ["select opts from sr_group "
"where name='", SGroup, "';"]) of
{selected, ["opts"], [{SOpts}]} ->
Opts = ejabberd_odbc:decode_term(SOpts),
not lists:member(disabled, Opts);
_ ->
false
end.
%% @spec (Host::string(), Group::string(), Opt::atom(), Default) -> OptValue | Default
get_group_opt(Host, Group, Opt, Default) ->
SGroup = ejabberd_odbc:escape(Group),
case catch ejabberd_odbc:sql_query(
Host, ["select opts from sr_group "
"where name='", SGroup, "';"]) of
{selected, ["opts"], [{SOpts}]} ->
Opts = ejabberd_odbc:decode_term(SOpts),
case lists:keysearch(Opt, 1, Opts) of
{value, {_, Val}} ->
Val;
false ->
Default
end;
_ ->
Default
end.
get_online_users(Host) ->
lists:usort([{U, S} || {U, S, _} <- ejabberd_sm:get_vh_session_list(Host)]).
get_group_users(Host1, Group1) ->
{Host, Group} = split_grouphost(Host1, Group1),
case get_group_opt(Host, Group, all_users, false) of
true ->
ejabberd_auth:get_vh_registered_users(Host);
false ->
[]
end ++
case get_group_opt(Host, Group, online_users, false) of
true ->
get_online_users(Host);
false ->
[]
end ++
get_group_explicit_users(Host, Group).
get_group_users(Host, Group, GroupOpts) ->
case proplists:get_value(all_users, GroupOpts, false) of
true ->
ejabberd_auth:get_vh_registered_users(Host);
false ->
[]
end ++
case proplists:get_value(online_users, GroupOpts, false) of
true ->
get_online_users(Host);
false ->
[]
end ++
get_group_explicit_users(Host, Group).
%% @spec (Host::string(), Group::string()) -> [{User::string(), Server::string()}]
get_group_explicit_users(Host, Group) ->
SGroup = ejabberd_odbc:escape(Group),
case catch ejabberd_odbc:sql_query(
Host, ["select jid from sr_user "
"where grp='", SGroup, "';"]) of
{selected, ["jid"], Rs} ->
lists:map(
fun({JID}) ->
{U, S, _} = jlib:jid_tolower(
jlib:string_to_jid(JID)),
{U, S}
end, Rs);
_ ->
[]
end.
get_group_name(Host1, Group1) ->
{Host, Group} = split_grouphost(Host1, Group1),
get_group_opt(Host, Group, name, Group).
%% Get list of names of groups that have @all@/@online@/etc in the memberlist
get_special_users_groups(Host) ->
lists:filter(
fun(Group) ->
get_group_opt(Host, Group, all_users, false)
orelse get_group_opt(Host, Group, online_users, false)
end,
list_groups(Host)).
%% Get list of names of groups that have @online@ in the memberlist
get_special_users_groups_online(Host) ->
lists:filter(
fun(Group) ->
get_group_opt(Host, Group, online_users, false)
end,
list_groups(Host)).
%% Given two lists of groupnames and their options,
%% return the list of displayed groups to the second list
displayed_groups(GroupsOpts, SelectedGroupsOpts) ->
DisplayedGroups =
lists:usort(
lists:flatmap(
fun({_Group, Opts}) ->
[G || G <- proplists:get_value(displayed_groups, Opts, []),
not lists:member(disabled, Opts)]
end, SelectedGroupsOpts)),
[G || G <- DisplayedGroups,
not lists:member(disabled, proplists:get_value(G, GroupsOpts, []))].
%% Given a list of group names with options,
%% for those that have @all@ in memberlist,
%% get the list of groups displayed
get_special_displayed_groups(GroupsOpts) ->
Groups = lists:filter(
fun({_Group, Opts}) ->
proplists:get_value(all_users, Opts, false)
end, GroupsOpts),
displayed_groups(GroupsOpts, Groups).
%% Given a username and server, and a list of group names with options,
%% for the list of groups of that server that user is member
%% get the list of groups displayed
get_user_displayed_groups(LUser, LServer, GroupsOpts) ->
SJID = make_jid_s(LUser, LServer),
Groups = case catch ejabberd_odbc:sql_query(
LServer, ["select grp from sr_user "
"where jid='", SJID, "';"]) of
{selected, ["grp"], Rs} ->
[{Group, proplists:get_value(Group, GroupsOpts, [])} ||
{Group} <- Rs];
_ ->
[]
end,
displayed_groups(GroupsOpts, Groups).
%% @doc Get the list of groups that are displayed to this user
get_user_displayed_groups(US) ->
Host = element(2, US),
DisplayedGroups1 =
lists:usort(
lists:flatmap(
fun(Group) ->
case is_group_enabled(Host, Group) of
true ->
get_group_opt(Host, Group, displayed_groups, []);
false ->
[]
end
end, get_user_groups(US))),
[Group || Group <- DisplayedGroups1, is_group_enabled(Host, Group)].
is_user_in_group(US, Group, Host) ->
SJID = make_jid_s(US),
SGroup = ejabberd_odbc:escape(Group),
case catch ejabberd_odbc:sql_query(
Host, ["select * from sr_user where "
"jid='", SJID, "' and grp='", SGroup, "';"]) of
{selected, _, []} ->
lists:member(US, get_group_users(Host, Group));
_ ->
true
end.
%% @spec (Host::string(), {User::string(), Server::string()}, Group::string()) -> {atomic, ok}
add_user_to_group(Host, US, Group) ->
{LUser, LServer} = US,
case ejabberd_regexp:run(LUser, "^@.+@$") of
match ->
GroupOpts = ?MODULE:get_group_opts(Host, Group),
MoreGroupOpts =
case LUser of
"@all@" -> [{all_users, true}];
"@online@" -> [{online_users, true}];
_ -> []
end,
?MODULE:set_group_opts(
Host, Group,
GroupOpts ++ MoreGroupOpts);
nomatch ->
%% Push this new user to members of groups where this group is displayed
push_user_to_displayed(LUser, LServer, Group, Host, both),
%% Push members of groups that are displayed to this group
push_displayed_to_user(LUser, LServer, Group, Host, both),
SJID = make_jid_s(US),
SGroup = ejabberd_odbc:escape(Group),
F = fun() ->
odbc_queries:update_t(
"sr_user",
["jid", "grp"],
[SJID, SGroup],
["jid='", SJID, "' and grp='", SGroup, "'"])
end,
ejabberd_odbc:sql_transaction(Host, F)
end.
push_displayed_to_user(LUser, LServer, Group, Host, Subscription) ->
GroupsOpts = groups_with_opts(LServer),
GroupOpts = proplists:get_value(Group, GroupsOpts, []),
DisplayedGroups = proplists:get_value(displayed_groups, GroupOpts, []),
[push_members_to_user(LUser, LServer, DGroup, Host, Subscription) || DGroup <- DisplayedGroups].
remove_user_from_group(Host, US, Group) ->
{LUser, LServer} = US,
case ejabberd_regexp:run(LUser, "^@.+@$") of
match ->
GroupOpts = ?MODULE:get_group_opts(Host, Group),
NewGroupOpts =
case LUser of
"@all@" ->
lists:filter(fun(X) -> X/={all_users,true} end, GroupOpts);
"@online@" ->
lists:filter(fun(X) -> X/={online_users,true} end, GroupOpts)
end,
?MODULE:set_group_opts(Host, Group, NewGroupOpts);
nomatch ->
SJID = make_jid_s(US),
SGroup = ejabberd_odbc:escape(Group),
F = fun() ->
ejabberd_odbc:sql_query_t(
["delete from sr_user where jid='",
SJID, "' and grp='", SGroup, "';"]),
ok
end,
Result = ejabberd_odbc:sql_transaction(Host, F),
%% Push removal of the old user to members of groups where the group that this user was members was displayed
push_user_to_displayed(LUser, LServer, Group, Host, remove),
%% Push removal of members of groups that where displayed to the group which this user has left
push_displayed_to_user(LUser, LServer, Group, Host, remove),
Result
end.
push_members_to_user(LUser, LServer, Group, Host, Subscription) ->
GroupsOpts = groups_with_opts(LServer),
GroupOpts = proplists:get_value(Group, GroupsOpts, []),
GroupName = proplists:get_value(name, GroupOpts, Group),
Members = get_group_users(Host, Group),
lists:foreach(
fun({U, S}) ->
push_roster_item(LUser, LServer, U, S, GroupName, Subscription)
end, Members).
register_user(User, Server) ->
%% Get list of groups where this user is member
Groups = get_user_groups({User, Server}),
%% Push this user to members of groups where is displayed a group which this user is member
[push_user_to_displayed(User, Server, Group, Server, both) || Group <- Groups].
remove_user(User, Server) ->
push_user_to_members(User, Server, remove).
push_user_to_members(User, Server, Subscription) ->
LUser = jlib:nodeprep(User),
LServer = jlib:nameprep(Server),
GroupsOpts = groups_with_opts(LServer),
SpecialGroups = get_special_displayed_groups(GroupsOpts),
UserGroups = get_user_displayed_groups(LUser, LServer, GroupsOpts),
lists:foreach(
fun(Group) ->
remove_user_from_group(LServer, {LUser, LServer}, Group),
GroupOpts = proplists:get_value(Group, GroupsOpts, []),
GroupName = proplists:get_value(name, GroupOpts, Group),
lists:foreach(
fun({U, S}) ->
push_roster_item(U, S, LUser, LServer, GroupName, Subscription)
end, get_group_users(LServer, Group, GroupOpts))
end, lists:usort(SpecialGroups++UserGroups)).
push_user_to_displayed(LUser, LServer, Group, Host, Subscription) ->
GroupsOpts = groups_with_opts(Host),
GroupOpts = proplists:get_value(Group, GroupsOpts, []),
GroupName = proplists:get_value(name, GroupOpts, Group),
DisplayedToGroupsOpts = displayed_to_groups(Group, Host),
[push_user_to_group(LUser, LServer, GroupD, Host, GroupName, Subscription) || {GroupD, _Opts} <- DisplayedToGroupsOpts].
push_user_to_group(LUser, LServer, Group, Host, GroupName, Subscription) ->
lists:foreach(
fun({U, S}) when (U == LUser) and (S == LServer) -> ok;
({U, S}) ->
push_roster_item(U, S, LUser, LServer, GroupName, Subscription)
end, get_group_users(Host, Group)).
%% Get list of groups to which this group is displayed
displayed_to_groups(GroupName, LServer) ->
GroupsOpts = groups_with_opts(LServer),
lists:filter(
fun({_Group, Opts}) ->
lists:member(GroupName, proplists:get_value(displayed_groups, Opts, []))
end, GroupsOpts).
push_item(User, Server, From, Item) ->
%% It was
%% ejabberd_sm:route(jlib:make_jid("", "", ""),
%% jlib:make_jid(User, Server, "")
%% why?
ejabberd_sm:route(From, jlib:make_jid(User, Server, ""),
{xmlelement, "broadcast", [],
[{item,
Item#roster.jid,
Item#roster.subscription}]}),
Stanza = jlib:iq_to_xml(
#iq{type = set, xmlns = ?NS_ROSTER,
id = "push" ++ randoms:get_string(),
sub_el = [{xmlelement, "query",
[{"xmlns", ?NS_ROSTER}],
[item_to_xml(Item)]}]}),
lists:foreach(
fun(Resource) ->
JID = jlib:make_jid(User, Server, Resource),
ejabberd_router:route(JID, JID, Stanza)
end, ejabberd_sm:get_user_resources(User, Server)).
push_roster_item(User, Server, ContactU, ContactS, GroupName, Subscription) ->
Item = #roster{usj = {User, Server, {ContactU, ContactS, ""}},
us = {User, Server},
jid = {ContactU, ContactS, ""},
name = "",
subscription = Subscription,
ask = none,
groups = [GroupName]},
push_item(User, Server, jlib:make_jid("", Server, ""), Item).
item_to_xml(Item) ->
Attrs1 = [{"jid", jlib:jid_to_string(Item#roster.jid)}],
Attrs2 = case Item#roster.name of
"" ->
Attrs1;
Name ->
[{"name", Name} | Attrs1]
end,
Attrs3 = case Item#roster.subscription of
none ->
[{"subscription", "none"} | Attrs2];
from ->
[{"subscription", "from"} | Attrs2];
to ->
[{"subscription", "to"} | Attrs2];
both ->
[{"subscription", "both"} | Attrs2];
remove ->
[{"subscription", "remove"} | Attrs2]
end,
Attrs4 = case ask_to_pending(Item#roster.ask) of
out ->
[{"ask", "subscribe"} | Attrs3];
both ->
[{"ask", "subscribe"} | Attrs3];
_ ->
Attrs3
end,
SubEls1 = lists:map(fun(G) ->
{xmlelement, "group", [], [{xmlcdata, G}]}
end, Item#roster.groups),
SubEls = SubEls1 ++ Item#roster.xs,
{xmlelement, "item", Attrs4, SubEls}.
ask_to_pending(subscribe) -> out;
ask_to_pending(unsubscribe) -> none;
ask_to_pending(Ask) -> Ask.
user_available(New) ->
LUser = New#jid.luser,
LServer = New#jid.lserver,
Resources = ejabberd_sm:get_user_resources(LUser, LServer),
?DEBUG("user_available for ~p @ ~p (~p resources)",
[LUser, LServer, length(Resources)]),
case length(Resources) of
%% first session for this user
1 ->
%% This is a simplification - we ignore he 'display'
%% property - @online@ is always reflective.
OnlineGroups = get_special_users_groups_online(LServer),
lists:foreach(
fun(OG) ->
?DEBUG("user_available: pushing ~p @ ~p grp ~p",
[LUser, LServer, OG ]),
push_user_to_displayed(LUser, LServer, OG, LServer, both)
end, OnlineGroups);
_ ->
ok
end.
unset_presence(LUser, LServer, Resource, Status) ->
Resources = ejabberd_sm:get_user_resources(LUser, LServer),
?DEBUG("unset_presence for ~p @ ~p / ~p -> ~p (~p resources)",
[LUser, LServer, Resource, Status, length(Resources)]),
%% if user has no resources left...
case length(Resources) of
0 ->
%% This is a simplification - we ignore he 'display'
%% property - @online@ is always reflective.
OnlineGroups = get_special_users_groups_online(LServer),
%% for each of these groups...
lists:foreach(
fun(OG) ->
%% Push removal of the old user to members of groups
%% where the group that this uwas members was displayed
push_user_to_displayed(LUser, LServer, OG, LServer, remove),
%% Push removal of members of groups that where
%% displayed to the group which thiuser has left
push_displayed_to_user(LUser, LServer, OG, LServer,remove)
end, OnlineGroups);
_ ->
ok
end.
%%---------------------
%% Web Admin
%%---------------------
webadmin_menu(Acc, _Host, Lang) ->
[{"shared-roster", ?T("Shared Roster Groups")} | Acc].
webadmin_page(_, Host,
#request{us = _US,
path = ["shared-roster"],
q = Query,
lang = Lang} = _Request) ->
Res = list_shared_roster_groups(Host, Query, Lang),
{stop, Res};
webadmin_page(_, Host,
#request{us = _US,
path = ["shared-roster", Group],
q = Query,
lang = Lang} = _Request) ->
Res = shared_roster_group(Host, Group, Query, Lang),
{stop, Res};
webadmin_page(Acc, _, _) -> Acc.
list_shared_roster_groups(Host, Query, Lang) ->
Res = list_sr_groups_parse_query(Host, Query),
SRGroups = ?MODULE:list_groups(Host),
FGroups =
?XAE("table", [],
[?XE("tbody",
lists:map(
fun(Group) ->
?XE("tr",
[?XE("td", [?INPUT("checkbox", "selected",
Group)]),
?XE("td", [?AC(Group ++ "/", Group)])
]
)
end, lists:sort(SRGroups)) ++
[?XE("tr",
[?X("td"),
?XE("td", [?INPUT("text", "namenew", "")]),
?XE("td", [?INPUTT("submit", "addnew", "Add New")])
]
)]
)]),
?H1GL(?T("Shared Roster Groups"), "modsharedroster", "mod_shared_roster") ++
case Res of
ok -> [?XREST("Submitted")];
error -> [?XREST("Bad format")];
nothing -> []
end ++
[?XAE("form", [{"action", ""}, {"method", "post"}],
[FGroups,
?BR,
?INPUTT("submit", "delete", "Delete Selected")
])
].
list_sr_groups_parse_query(Host, Query) ->
case lists:keysearch("addnew", 1, Query) of
{value, _} ->
list_sr_groups_parse_addnew(Host, Query);
_ ->
case lists:keysearch("delete", 1, Query) of
{value, _} ->
list_sr_groups_parse_delete(Host, Query);
_ ->
nothing
end
end.
list_sr_groups_parse_addnew(Host, Query) ->
case lists:keysearch("namenew", 1, Query) of
{value, {_, Group}} when Group /= "" ->
?MODULE:create_group(Host, Group),
ok;
_ ->
error
end.
list_sr_groups_parse_delete(Host, Query) ->
SRGroups = ?MODULE:list_groups(Host),
lists:foreach(
fun(Group) ->
case lists:member({"selected", Group}, Query) of
true ->
?MODULE:delete_group(Host, Group);
_ ->
ok
end
end, SRGroups),
ok.
shared_roster_group(Host, Group, Query, Lang) ->
Res = shared_roster_group_parse_query(Host, Group, Query),
GroupOpts = ?MODULE:get_group_opts(Host, Group),
Name = get_opt(GroupOpts, name, ""),
Description = get_opt(GroupOpts, description, ""),
AllUsers = get_opt(GroupOpts, all_users, false),
OnlineUsers = get_opt(GroupOpts, online_users, false),
%%Disabled = false,
DisplayedGroups = get_opt(GroupOpts, displayed_groups, []),
Members = ?MODULE:get_group_explicit_users(Host, Group),
FMembers =
if
AllUsers ->
"@all@\n";
true ->
[]
end ++
if
OnlineUsers ->
"@online@\n";
true ->
[]
end ++
[[us_to_list(Member), $\n] || Member <- Members],
FDisplayedGroups = [[DG, $\n] || DG <- DisplayedGroups],
DescNL = length(ejabberd_regexp:split(Description, "\n")),
FGroup =
?XAE("table", [{"class", "withtextareas"}],
[?XE("tbody",
[?XE("tr",
[?XCT("td", "Name:"),
?XE("td", [?INPUT("text", "name", Name)])
]
),
?XE("tr",
[?XCT("td", "Description:"),
?XE("td", [
?TEXTAREA("description", integer_to_list(lists:max([3, DescNL])), "20", Description)
]
)
]
),
?XE("tr",
[?XCT("td", "Members:"),
?XE("td", [
?TEXTAREA("members", integer_to_list(lists:max([3, length(FMembers)])), "20", FMembers)
]
)
]
),
?XE("tr",
[?XCT("td", "Displayed Groups:"),
?XE("td", [
?TEXTAREA("dispgroups", integer_to_list(lists:max([3, length(FDisplayedGroups)])), "20", FDisplayedGroups)
]
)
]
)]
)]),
?H1GL(?T("Shared Roster Groups"), "modsharedroster", "mod_shared_roster") ++
[?XC("h2", ?T("Group ") ++ Group)] ++
case Res of
ok -> [?XREST("Submitted")];
error -> [?XREST("Bad format")];
nothing -> []
end ++
[?XAE("form", [{"action", ""}, {"method", "post"}],
[FGroup,
?BR,
?INPUTT("submit", "submit", "Submit")
])
].
shared_roster_group_parse_query(Host, Group, Query) ->
case lists:keysearch("submit", 1, Query) of
{value, _} ->
{value, {_, Name}} = lists:keysearch("name", 1, Query),
{value, {_, Description}} = lists:keysearch("description", 1, Query),
{value, {_, SMembers}} = lists:keysearch("members", 1, Query),
{value, {_, SDispGroups}} = lists:keysearch("dispgroups", 1, Query),
NameOpt =
if
Name == "" -> [];
true -> [{name, Name}]
end,
DescriptionOpt =
if
Description == "" -> [];
true -> [{description, Description}]
end,
DispGroups = string:tokens(SDispGroups, "\r\n"),
DispGroupsOpt =
if
DispGroups == [] -> [];
true -> [{displayed_groups, DispGroups}]
end,
OldMembers = ?MODULE:get_group_explicit_users(
Host, Group),
SJIDs = string:tokens(SMembers, ", \r\n"),
NewMembers =
lists:foldl(
fun(_SJID, error) -> error;
(SJID, USs) ->
case SJID of
"@all@" ->
USs;
"@online@" ->
USs;
_ ->
case jlib:string_to_jid(SJID) of
JID when is_record(JID, jid) ->
[{JID#jid.luser, JID#jid.lserver} | USs];
error ->
error
end
end
end, [], SJIDs),
AllUsersOpt =
case lists:member("@all@", SJIDs) of
true -> [{all_users, true}];
false -> []
end,
OnlineUsersOpt =
case lists:member("@online@", SJIDs) of
true -> [{online_users, true}];
false -> []
end,
?MODULE:set_group_opts(
Host, Group,
NameOpt ++ DispGroupsOpt ++ DescriptionOpt ++ AllUsersOpt ++ OnlineUsersOpt),
if
NewMembers == error -> error;
true ->
AddedMembers = NewMembers -- OldMembers,
RemovedMembers = OldMembers -- NewMembers,
lists:foreach(
fun(US) ->
?MODULE:remove_user_from_group(
Host, US, Group)
end, RemovedMembers),
lists:foreach(
fun(US) ->
?MODULE:add_user_to_group(
Host, US, Group)
end, AddedMembers),
ok
end;
_ ->
nothing
end.
%% Get the roster module for Server.
get_roster_mod(Server) ->
case lists:member(mod_roster_odbc,
gen_mod:loaded_modules(Server)) of
true -> mod_roster_odbc;
false -> mod_roster
end.
get_opt(Opts, Opt, Default) ->
case lists:keysearch(Opt, 1, Opts) of
{value, {_, Val}} ->
Val;
false ->
Default
end.
us_to_list({User, Server}) ->
jlib:jid_to_string({User, Server, ""}).
split_grouphost(Host, Group) ->
case string:tokens(Group, "@") of
[GroupName, HostName] ->
{HostName, GroupName};
[_] ->
{Host, Group}
end.
make_jid_s(U, S) ->
ejabberd_odbc:escape(
jlib:jid_to_string(
jlib:jid_tolower(
jlib:make_jid(U, S, "")))).
make_jid_s({U, S}) ->
make_jid_s(U, S).
ejabberd-2.1.11/src/p1_prof.erl 0000664 0000000 0000000 00000022220 12240230175 013055 0 ustar %%%-------------------------------------------------------------------
%%% File : p1_prof.erl
%%% Author : Evgeniy Khramtsov
%%% Description : Handy wrapper around eprof and fprof
%%%
%%% Created : 23 Jan 2010 by Evgeniy Khramtsov
%%%
%%%
%%% ejabberd, Copyright (C) 2002-2012 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
%%% published by the Free Software Foundation; either version 2 of the
%%% License, or (at your option) any later version.
%%%
%%% This program is distributed in the hope that it will be useful,
%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
%%% General Public License for more details.
%%%
%%% You should have received a copy of the GNU General Public License
%%% along with this program; if not, write to the Free Software
%%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
%%% 02111-1307 USA
%%%
%%%-------------------------------------------------------------------
-module(p1_prof).
%% API
-export([eprof_start/0, eprof_stop/0,
fprof_start/0, fprof_start/1,
fprof_stop/0, fprof_analyze/0,
queue/0, queue/1, memory/0, memory/1,
reds/0, reds/1, trace/1, help/0,
q/0, m/0, r/0, q/1, m/1, r/1]).
-define(APPS, [ejabberd, mnesia]).
%%====================================================================
%% API
%%====================================================================
eprof_start() ->
eprof:start(),
case lists:keyfind(running, 1, application:info()) of
{_, Apps} ->
case get_procs(?APPS, Apps) of
[] ->
{error, no_procs_found};
Procs ->
eprof:start_profiling(Procs)
end;
_ ->
{error, no_app_info}
end.
fprof_start() ->
fprof_start(0).
fprof_start(Duration) ->
case lists:keyfind(running, 1, application:info()) of
{_, Apps} ->
case get_procs(?APPS, Apps) of
[] ->
{error, no_procs_found};
Procs ->
fprof:trace([start, {procs, Procs}]),
io:format("Profiling started~n"),
if Duration > 0 ->
timer:sleep(Duration*1000),
fprof:trace([stop]),
fprof:stop();
true->
ok
end
end;
_ ->
{error, no_app_info}
end.
fprof_stop() ->
fprof:trace([stop]),
fprof:profile(),
fprof:analyse([totals, no_details, {sort, own},
no_callers, {dest, "fprof.analysis"}]),
fprof:stop(),
format_fprof_analyze().
fprof_analyze() ->
fprof_stop().
eprof_stop() ->
eprof:stop_profiling(),
case erlang:function_exported(eprof, analyse, 0) of
true ->
eprof:analyse();
false ->
eprof:analyze()
end.
help() ->
M = ?MODULE,
io:format("Brief help:~n"
"~p:queue(N) - show top N pids sorted by queue length~n"
"~p:queue() - shorthand for ~p:queue(10)~n"
"~p:memory(N) - show top N pids sorted by memory usage~n"
"~p:memory() - shorthand for ~p:memory(10)~n"
"~p:reds(N) - show top N pids sorted by reductions~n"
"~p:reds() - shorthand for ~p:reds(10)~n"
"~p:q(N)|~p:q() - same as ~p:queue(N)|~p:queue()~n"
"~p:m(N)|~p:m() - same as ~p:memory(N)|~p:memory()~n"
"~p:r(N)|~p:r() - same as ~p:reds(N)|~p:reds()~n"
"~p:trace(Pid) - trace Pid; to stop tracing close "
"Erlang shell with Ctrl+C~n"
"~p:eprof_start() - start eprof on all available pids; "
"DO NOT use on production system!~n"
"~p:eprof_stop() - stop eprof and print result~n"
"~p:fprof_start() - start fprof on all available pids; "
"DO NOT use on production system!~n"
"~p:fprof_stop() - stop eprof and print formatted result~n"
"~p:fprof_start(N) - start and run fprof for N seconds; "
"use ~p:fprof_analyze() to analyze collected statistics and "
"print formatted result; use on production system with CARE~n"
"~p:fprof_analyze() - analyze previously collected statistics "
"using ~p:fprof_start(N) and print formatted result~n"
"~p:help() - print this help~n",
lists:duplicate(31, M)).
q() ->
queue().
q(N) ->
queue(N).
m() ->
memory().
m(N) ->
memory(N).
r() ->
reds().
r(N) ->
reds(N).
queue() ->
queue(10).
memory() ->
memory(10).
reds() ->
reds(10).
queue(N) ->
dump(N, lists:reverse(lists:ukeysort(1, all_pids(queue)))).
memory(N) ->
dump(N, lists:reverse(lists:ukeysort(3, all_pids(memory)))).
reds(N) ->
dump(N, lists:reverse(lists:ukeysort(4, all_pids(reductions)))).
trace(Pid) ->
erlang:trace(Pid, true, [send, 'receive']),
trace_loop().
trace_loop() ->
receive
M ->
io:format("~p~n", [M]),
trace_loop()
end.
%%====================================================================
%% Internal functions
%%====================================================================
get_procs(Apps, AppList) ->
io:format("Searching for processes to profile...~n", []),
Procs = lists:flatmap(
fun({App, Leader}) when is_pid(Leader) ->
case lists:member(App, Apps) of
true ->
get_procs(Leader);
false ->
[]
end;
(_) ->
[]
end, AppList),
io:format("Found ~p processes~n", [length(Procs)]),
Procs.
get_procs(Leader) ->
lists:filter(
fun(Pid) ->
case process_info(Pid, group_leader) of
{_, Leader} ->
true;
_ ->
false
end
end, processes()).
format_fprof_analyze() ->
case file:consult("fprof.analysis") of
{ok, [_, [{totals, _, _, TotalOWN}] | Rest]} ->
OWNs = lists:flatmap(
fun({MFA, _, _, OWN}) ->
Percent = OWN*100/TotalOWN,
case round(Percent) of
0 ->
[];
_ ->
[{mfa_to_list(MFA), Percent}]
end
end, Rest),
ACCs = collect_accs(Rest),
MaxACC = find_max(ACCs),
MaxOWN = find_max(OWNs),
io:format("=== Sorted by OWN:~n"),
lists:foreach(
fun({MFA, Per}) ->
L = length(MFA),
S = lists:duplicate(MaxOWN - L + 2, $ ),
io:format("~s~s~.2f%~n", [MFA, S, Per])
end, lists:reverse(lists:keysort(2, OWNs))),
io:format("~n=== Sorted by ACC:~n"),
lists:foreach(
fun({MFA, Per}) ->
L = length(MFA),
S = lists:duplicate(MaxACC - L + 2, $ ),
io:format("~s~s~.2f%~n", [MFA, S, Per])
end, lists:reverse(lists:keysort(2, ACCs)));
Err ->
Err
end.
mfa_to_list({M, F, A}) ->
atom_to_list(M) ++ ":" ++ atom_to_list(F) ++ "/" ++ integer_to_list(A);
mfa_to_list(F) when is_atom(F) ->
atom_to_list(F).
find_max(List) ->
find_max(List, 0).
find_max([{V, _}|Tail], Acc) ->
find_max(Tail, lists:max([length(V), Acc]));
find_max([], Acc) ->
Acc.
collect_accs(List) ->
List1 = lists:filter(
fun({MFA, _, _, _}) ->
case MFA of
{sys, _, _} ->
false;
suspend ->
false;
{gen_fsm, _, _} ->
false;
{p1_fsm, _, _} ->
false;
{gen, _, _} ->
false;
{gen_server, _, _} ->
false;
{proc_lib, _, _} ->
false;
_ ->
true
end
end, List),
TotalACC = lists:sum([A || {_, _, A, _} <- List1]),
lists:flatmap(
fun({MFA, _, ACC, _}) ->
Percent = ACC*100/TotalACC,
case round(Percent) of
0 ->
[];
_ ->
[{mfa_to_list(MFA), Percent}]
end
end, List1).
all_pids(Type) ->
lists:foldl(
fun(P, Acc) when P == self() ->
%% exclude ourself from statistics
Acc;
(P, Acc) ->
case catch process_info(
P,
[message_queue_len,
memory,
reductions,
dictionary,
current_function,
registered_name]) of
[{_, Len}, {_, Memory}, {_, Reds},
{_, Dict}, {_, CurFun}, {_, RegName}] ->
IntQLen = case lists:keysearch('$internal_queue_len', 1, Dict) of
{value, {_, N}} ->
N;
_ ->
0
end,
if Type == queue andalso Len == 0 andalso IntQLen == 0 ->
Acc;
true ->
MaxLen = lists:max([Len, IntQLen]),
[{MaxLen, Len, Memory, Reds, Dict, CurFun, P, RegName}|Acc]
end;
_ ->
Acc
end
end, [], processes()).
dump(N, Rs) ->
lists:foreach(
fun({_, MsgQLen, Memory, Reds, Dict, CurFun, Pid, RegName}) ->
PidStr = pid_to_list(Pid),
[_, Maj, Min] = string:tokens(
string:substr(
PidStr, 2, length(PidStr) - 2), "."),
io:format("** pid(0,~s,~s)~n"
"** registered name: ~p~n"
"** memory: ~p~n"
"** reductions: ~p~n"
"** message queue len: ~p~n"
"** current_function: ~p~n"
"** dictionary: ~p~n~n",
[Maj, Min, RegName, Memory, Reds, MsgQLen, CurFun, Dict])
end, nthhead(N, Rs)).
nthhead(N, L) ->
lists:reverse(nthhead(N, L, [])).
nthhead(0, _L, Acc) ->
Acc;
nthhead(N, [H|T], Acc) ->
nthhead(N-1, T, [H|Acc]);
nthhead(_N, [], Acc) ->
Acc.
ejabberd-2.1.11/src/ejabberd_ctl.erl 0000664 0000000 0000000 00000061454 12240230175 014123 0 ustar %%%----------------------------------------------------------------------
%%% File : ejabberd_ctl.erl
%%% Author : Alexey Shchepin
%%% Purpose : ejabberd command line admin tool
%%% Created : 11 Jan 2004 by Alexey Shchepin
%%%
%%%
%%% ejabberd, Copyright (C) 2002-2012 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
%%% published by the Free Software Foundation; either version 2 of the
%%% License, or (at your option) any later version.
%%%
%%% This program is distributed in the hope that it will be useful,
%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
%%% General Public License for more details.
%%%
%%% You should have received a copy of the GNU General Public License
%%% along with this program; if not, write to the Free Software
%%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
%%% 02111-1307 USA
%%%
%%%----------------------------------------------------------------------
%%% @headerfile "ejabberd_ctl.hrl"
%%% @doc Management of ejabberdctl commands and frontend to ejabberd commands.
%%%
%%% An ejabberdctl command is an abstract function identified by a
%%% name, with a defined number of calling arguments, that can be
%%% defined in any Erlang module and executed using ejabberdctl
%%% administration script.
%%%
%%% Note: strings cannot have blankspaces
%%%
%%% Does not support commands that have arguments with ctypes: list, tuple
%%%
%%% TODO: Update the guide
%%% TODO: Mention this in the release notes
%%% Note: the commands with several words use now the underline: _
%%% It is still possible to call the commands with dash: -
%%% but this is deprecated, and may be removed in a future version.
-module(ejabberd_ctl).
-author('alexey@process-one.net').
-export([start/0,
init/0,
process/1,
process2/2,
register_commands/3,
unregister_commands/3]).
-include("ejabberd_ctl.hrl").
-include("ejabberd_commands.hrl").
-include("ejabberd.hrl").
%%-----------------------------
%% Module
%%-----------------------------
start() ->
case init:get_plain_arguments() of
[SNode | Args] ->
SNode1 = case string:tokens(SNode, "@") of
[_Node, _Server] ->
SNode;
_ ->
case net_kernel:longnames() of
true ->
SNode ++ "@" ++ inet_db:gethostname() ++
"." ++ inet_db:res_option(domain);
false ->
SNode ++ "@" ++ inet_db:gethostname();
_ ->
SNode
end
end,
Node = list_to_atom(SNode1),
Status = case rpc:call(Node, ?MODULE, process, [Args]) of
{badrpc, Reason} ->
?PRINT("Failed RPC connection to the node ~p: ~p~n",
[Node, Reason]),
%% TODO: show minimal start help
?STATUS_BADRPC;
S ->
S
end,
halt(Status);
_ ->
print_usage(),
halt(?STATUS_USAGE)
end.
init() ->
ets:new(ejabberd_ctl_cmds, [named_table, set, public]),
ets:new(ejabberd_ctl_host_cmds, [named_table, set, public]).
%%-----------------------------
%% ejabberdctl Command managment
%%-----------------------------
register_commands(CmdDescs, Module, Function) ->
ets:insert(ejabberd_ctl_cmds, CmdDescs),
ejabberd_hooks:add(ejabberd_ctl_process,
Module, Function, 50),
ok.
unregister_commands(CmdDescs, Module, Function) ->
lists:foreach(fun(CmdDesc) ->
ets:delete_object(ejabberd_ctl_cmds, CmdDesc)
end, CmdDescs),
ejabberd_hooks:delete(ejabberd_ctl_process,
Module, Function, 50),
ok.
%%-----------------------------
%% Process
%%-----------------------------
%% The commands status, stop and restart are defined here to ensure
%% they are usable even if ejabberd is completely stopped.
process(["status"]) ->
{InternalStatus, ProvidedStatus} = init:get_status(),
?PRINT("The node ~p is ~p with status: ~p~n",
[node(), InternalStatus, ProvidedStatus]),
case lists:keysearch(ejabberd, 1, application:which_applications()) of
false ->
EjabberdLogPath = ejabberd_app:get_log_path(),
?PRINT("ejabberd is not running in that node~n"
"Check for error messages: ~s~n"
"or other files in that directory.~n", [EjabberdLogPath]),
?STATUS_ERROR;
{value, {_, _, Version}} ->
?PRINT("ejabberd ~s is running in that node~n", [Version]),
?STATUS_SUCCESS
end;
process(["stop"]) ->
%%ejabberd_cover:stop(),
init:stop(),
?STATUS_SUCCESS;
process(["restart"]) ->
init:restart(),
?STATUS_SUCCESS;
process(["mnesia"]) ->
?PRINT("~p~n", [mnesia:system_info(all)]),
?STATUS_SUCCESS;
process(["mnesia", "info"]) ->
mnesia:info(),
?STATUS_SUCCESS;
process(["mnesia", Arg]) when is_list(Arg) ->
case catch mnesia:system_info(list_to_atom(Arg)) of
{'EXIT', Error} -> ?PRINT("Error: ~p~n", [Error]);
Return -> ?PRINT("~p~n", [Return])
end,
?STATUS_SUCCESS;
%% The arguments --long and --dual are not documented because they are
%% automatically selected depending in the number of columns of the shell
process(["help" | Mode]) ->
{MaxC, ShCode} = get_shell_info(),
case Mode of
[] ->
print_usage(dual, MaxC, ShCode),
?STATUS_USAGE;
["--dual"] ->
print_usage(dual, MaxC, ShCode),
?STATUS_USAGE;
["--long"] ->
print_usage(long, MaxC, ShCode),
?STATUS_USAGE;
["--tags"] ->
print_usage_tags(MaxC, ShCode),
?STATUS_SUCCESS;
["--tags", Tag] ->
print_usage_tags(Tag, MaxC, ShCode),
?STATUS_SUCCESS;
["help"] ->
print_usage_help(MaxC, ShCode),
?STATUS_SUCCESS;
[CmdString | _] ->
CmdStringU = ejabberd_regexp:greplace(CmdString, "-", "_"),
print_usage_commands(CmdStringU, MaxC, ShCode),
?STATUS_SUCCESS
end;
process(Args) ->
AccessCommands = get_accesscommands(),
{String, Code} = process2(Args, AccessCommands),
case String of
[] -> ok;
_ ->
io:format("~s~n", [String])
end,
Code.
%% @spec (Args::[string()], AccessCommands) -> {String::string(), Code::integer()}
process2(["--auth", User, Server, Pass | Args], AccessCommands) ->
process2(Args, {User, Server, Pass}, AccessCommands);
process2(Args, AccessCommands) ->
process2(Args, noauth, AccessCommands).
process2(Args, Auth, AccessCommands) ->
case try_run_ctp(Args, Auth, AccessCommands) of
{String, wrong_command_arguments}
when is_list(String) ->
io:format(lists:flatten(["\n" | String]++["\n"])),
[CommandString | _] = Args,
process(["help" | [CommandString]]),
{lists:flatten(String), ?STATUS_ERROR};
{String, Code}
when is_list(String) and is_integer(Code) ->
{lists:flatten(String), Code};
String
when is_list(String) ->
{lists:flatten(String), ?STATUS_SUCCESS};
Code
when is_integer(Code) ->
{"", Code};
Other ->
{"Erroneous result: " ++ io_lib:format("~p", [Other]), ?STATUS_ERROR}
end.
get_accesscommands() ->
case ejabberd_config:get_local_option(ejabberdctl_access_commands) of
ACs when is_list(ACs) -> ACs;
_ -> []
end.
%%-----------------------------
%% Command calling
%%-----------------------------
%% @spec (Args::[string()], Auth, AccessCommands) -> string() | integer() | {string(), integer()}
try_run_ctp(Args, Auth, AccessCommands) ->
try ejabberd_hooks:run_fold(ejabberd_ctl_process, false, [Args]) of
false when Args /= [] ->
try_call_command(Args, Auth, AccessCommands);
false ->
print_usage(),
{"", ?STATUS_USAGE};
Status ->
{"", Status}
catch
exit:Why ->
print_usage(),
{io_lib:format("Error in ejabberd ctl process: ~p", [Why]), ?STATUS_USAGE};
Error:Why ->
%% In this case probably ejabberd is not started, so let's show Status
process(["status"]),
?PRINT("~n", []),
{io_lib:format("Error in ejabberd ctl process: '~p' ~p", [Error, Why]), ?STATUS_USAGE}
end.
%% @spec (Args::[string()], Auth, AccessCommands) -> string() | integer() | {string(), integer()}
try_call_command(Args, Auth, AccessCommands) ->
try call_command(Args, Auth, AccessCommands) of
{error, command_unknown} ->
{io_lib:format("Error: command ~p not known.", [hd(Args)]), ?STATUS_ERROR};
{error, wrong_command_arguments} ->
{"Error: wrong arguments", ?STATUS_ERROR};
Res ->
Res
catch
A:Why ->
Stack = erlang:get_stacktrace(),
{io_lib:format("Problem '~p ~p' occurred executing the command.~nStacktrace: ~p", [A, Why, Stack]), ?STATUS_ERROR}
end.
%% @spec (Args::[string()], Auth, AccessCommands) -> string() | integer() | {string(), integer()} | {error, ErrorType}
call_command([CmdString | Args], Auth, AccessCommands) ->
CmdStringU = ejabberd_regexp:greplace(CmdString, "-", "_"),
Command = list_to_atom(CmdStringU),
case ejabberd_commands:get_command_format(Command) of
{error, command_unknown} ->
{error, command_unknown};
{ArgsFormat, ResultFormat} ->
case (catch format_args(Args, ArgsFormat)) of
ArgsFormatted when is_list(ArgsFormatted) ->
Result = ejabberd_commands:execute_command(AccessCommands, Auth, Command,
ArgsFormatted),
format_result(Result, ResultFormat);
{'EXIT', {function_clause,[{lists,zip,[A1, A2]} | _]}} ->
{NumCompa, TextCompa} =
case {length(A1), length(A2)} of
{L1, L2} when L1 < L2 -> {L2-L1, "less argument"};
{L1, L2} when L1 > L2 -> {L1-L2, "more argument"}
end,
{io_lib:format("Error: the command ~p requires ~p ~s.",
[CmdString, NumCompa, TextCompa]),
wrong_command_arguments}
end
end.
%%-----------------------------
%% Format arguments
%%-----------------------------
format_args(Args, ArgsFormat) ->
lists:foldl(
fun({{_ArgName, ArgFormat}, Arg}, Res) ->
Formatted = format_arg(Arg, ArgFormat),
Res ++ [Formatted]
end,
[],
lists:zip(ArgsFormat, Args)).
format_arg(Arg, integer) ->
format_arg2(Arg, "~d");
format_arg("", string) ->
"";
format_arg(Arg, string) ->
NumChars = integer_to_list(string:len(Arg)),
Parse = "~" ++ NumChars ++ "c",
format_arg2(Arg, Parse).
format_arg2(Arg, Parse)->
{ok, [Arg2], _RemainingArguments} = io_lib:fread(Parse, Arg),
Arg2.
%%-----------------------------
%% Format result
%%-----------------------------
format_result({error, ErrorAtom}, _) ->
{io_lib:format("Error: ~p", [ErrorAtom]), make_status(error)};
format_result(Atom, {_Name, atom}) ->
io_lib:format("~p", [Atom]);
format_result(Int, {_Name, integer}) ->
io_lib:format("~p", [Int]);
format_result(String, {_Name, string}) ->
io_lib:format("~s", [String]);
format_result(Code, {_Name, rescode}) ->
make_status(Code);
format_result({Code, Text}, {_Name, restuple}) ->
{io_lib:format("~s", [Text]), make_status(Code)};
%% The result is a list of something: [something()]
format_result([], {_Name, {list, _ElementsDef}}) ->
"";
format_result([FirstElement | Elements], {_Name, {list, ElementsDef}}) ->
%% Start formatting the first element
[format_result(FirstElement, ElementsDef) |
%% If there are more elements, put always first a newline character
lists:map(
fun(Element) ->
["\n" | format_result(Element, ElementsDef)]
end,
Elements)];
%% The result is a tuple with several elements: {something1(), something2(),...}
%% NOTE: the elements in the tuple are separated with tabular characters,
%% if a string is empty, it will be difficult to notice in the shell,
%% maybe a different separation character should be used, like ;;?
format_result(ElementsTuple, {_Name, {tuple, ElementsDef}}) ->
ElementsList = tuple_to_list(ElementsTuple),
[{FirstE, FirstD} | ElementsAndDef] = lists:zip(ElementsList, ElementsDef),
[format_result(FirstE, FirstD) |
lists:map(
fun({Element, ElementDef}) ->
["\t" | format_result(Element, ElementDef)]
end,
ElementsAndDef)].
make_status(ok) -> ?STATUS_SUCCESS;
make_status(true) -> ?STATUS_SUCCESS;
make_status(_Error) -> ?STATUS_ERROR.
get_list_commands() ->
try ejabberd_commands:list_commands() of
Commands ->
[tuple_command_help(Command)
|| {N,_,_}=Command <- Commands,
%% Don't show again those commands, because they are already
%% announced by ejabberd_ctl itself
N /= status, N /= stop, N /= restart]
catch
exit:_ ->
[]
end.
%% Return: {string(), [string()], string()}
tuple_command_help({Name, Args, Desc}) ->
Arguments = [atom_to_list(ArgN) || {ArgN, _ArgF} <- Args],
Prepend = case is_supported_args(Args) of
true -> "";
false -> "*"
end,
CallString = atom_to_list(Name),
{CallString, Arguments, Prepend ++ Desc}.
is_supported_args(Args) ->
lists:all(
fun({_Name, Format}) ->
(Format == integer)
or (Format == string)
end,
Args).
get_list_ctls() ->
case catch ets:tab2list(ejabberd_ctl_cmds) of
{'EXIT', _} -> [];
Cs -> [{NameArgs, [], Desc} || {NameArgs, Desc} <- Cs]
end.
%%-----------------------------
%% Print help
%%-----------------------------
%% Bold
-define(B1, "\e[1m").
-define(B2, "\e[22m").
-define(B(S), case ShCode of true -> [?B1, S, ?B2]; false -> S end).
%% Underline
-define(U1, "\e[4m").
-define(U2, "\e[24m").
-define(U(S), case ShCode of true -> [?U1, S, ?U2]; false -> S end).
print_usage() ->
{MaxC, ShCode} = get_shell_info(),
print_usage(dual, MaxC, ShCode).
print_usage(HelpMode, MaxC, ShCode) ->
AllCommands =
[
{"status", [], "Get ejabberd status"},
{"stop", [], "Stop ejabberd"},
{"restart", [], "Restart ejabberd"},
{"help", ["[--tags [tag] | com?*]"], "Show help (try: ejabberdctl help help)"},
{"mnesia", ["[info]"], "show information of Mnesia system"}] ++
get_list_commands() ++
get_list_ctls(),
?PRINT(
["Usage: ", ?B("ejabberdctl"), " [--node ", ?U("nodename"), "] [--auth ",
?U("user"), " ", ?U("host"), " ", ?U("password"), "] ",
?U("command"), " [", ?U("options"), "]\n"
"\n"
"Available commands in this ejabberd node:\n"], []),
print_usage_commands(HelpMode, MaxC, ShCode, AllCommands),
?PRINT(
["\n"
"Examples:\n"
" ejabberdctl restart\n"
" ejabberdctl --node ejabberd@host restart\n"],
[]).
print_usage_commands(HelpMode, MaxC, ShCode, Commands) ->
CmdDescsSorted = lists:keysort(1, Commands),
%% What is the length of the largest command?
{CmdArgsLenDescsSorted, Lens} =
lists:mapfoldl(
fun({Cmd, Args, Desc}, Lengths) ->
Len =
length(Cmd) +
lists:foldl(fun(Arg, R) ->
R + 1 + length(Arg)
end,
0,
Args),
{{Cmd, Args, Len, Desc}, [Len | Lengths]}
end,
[],
CmdDescsSorted),
MaxCmdLen = case Lens of
[] -> 80;
_ -> lists:max(Lens)
end,
%% For each command in the list of commands
%% Convert its definition to a line
FmtCmdDescs = format_command_lines(CmdArgsLenDescsSorted, MaxCmdLen, MaxC, ShCode, HelpMode),
?PRINT([FmtCmdDescs], []).
%% Get some info about the shell:
%% how many columns of width
%% and guess if it supports text formatting codes.
get_shell_info() ->
%% This function was introduced in OTP R12B-0
try io:columns() of
{ok, C} -> {C-2, true};
{error, enotsup} -> {78, false}
catch
_:_ -> {78, false}
end.
%% Split this command description in several lines of proper length
prepare_description(DescInit, MaxC, Desc) ->
Words = string:tokens(Desc, " "),
prepare_long_line(DescInit, MaxC, Words).
prepare_long_line(DescInit, MaxC, Words) ->
MaxSegmentLen = MaxC - DescInit,
MarginString = lists:duplicate(DescInit, $\s), % Put spaces
[FirstSegment | MoreSegments] = split_desc_segments(MaxSegmentLen, Words),
MoreSegmentsMixed = mix_desc_segments(MarginString, MoreSegments),
[FirstSegment | MoreSegmentsMixed].
mix_desc_segments(MarginString, Segments) ->
[["\n", MarginString, Segment] || Segment <- Segments].
split_desc_segments(MaxL, Words) ->
join(MaxL, Words).
%% Join words in a segment,
%% but stop adding to a segment if adding this word would pass L
join(L, Words) ->
join(L, Words, 0, [], []).
join(_L, [], _LenLastSeg, LastSeg, ResSeg) ->
ResSeg2 = [lists:reverse(LastSeg) | ResSeg],
lists:reverse(ResSeg2);
join(L, [Word | Words], LenLastSeg, LastSeg, ResSeg) ->
LWord = length(Word),
case LWord + LenLastSeg < L of
true ->
%% This word fits in the last segment
%% If this word ends with "\n", reset column counter
case string:str(Word, "\n") of
0 ->
join(L, Words, LenLastSeg+LWord+1, [" ", Word | LastSeg], ResSeg);
_ ->
join(L, Words, LWord+1, [" ", Word | LastSeg], ResSeg)
end;
false ->
join(L, Words, LWord, [" ", Word], [lists:reverse(LastSeg) | ResSeg])
end.
format_command_lines(CALD, MaxCmdLen, MaxC, ShCode, dual)
when MaxC - MaxCmdLen < 40 ->
%% If the space available for descriptions is too narrow, enforce long help mode
format_command_lines(CALD, MaxCmdLen, MaxC, ShCode, long);
format_command_lines(CALD, MaxCmdLen, MaxC, ShCode, dual) ->
lists:map(
fun({Cmd, Args, CmdArgsL, Desc}) ->
DescFmt = prepare_description(MaxCmdLen+4, MaxC, Desc),
[" ", ?B(Cmd), " ", [[?U(Arg), " "] || Arg <- Args], string:chars($\s, MaxCmdLen - CmdArgsL + 1),
DescFmt, "\n"]
end, CALD);
format_command_lines(CALD, _MaxCmdLen, MaxC, ShCode, long) ->
lists:map(
fun({Cmd, Args, _CmdArgsL, Desc}) ->
DescFmt = prepare_description(8, MaxC, Desc),
["\n ", ?B(Cmd), " ", [[?U(Arg), " "] || Arg <- Args], "\n", " ",
DescFmt, "\n"]
end, CALD).
%%-----------------------------
%% Print Tags
%%-----------------------------
print_usage_tags(MaxC, ShCode) ->
?PRINT("Available tags and commands:", []),
TagsCommands = ejabberd_commands:get_tags_commands(),
lists:foreach(
fun({Tag, Commands} = _TagCommands) ->
?PRINT(["\n\n ", ?B(Tag), "\n "], []),
Words = lists:sort(Commands),
Desc = prepare_long_line(5, MaxC, Words),
?PRINT(Desc, [])
end,
TagsCommands),
?PRINT("\n\n", []).
print_usage_tags(Tag, MaxC, ShCode) ->
?PRINT(["Available commands with tag ", ?B(Tag), ":", "\n"], []),
HelpMode = long,
TagsCommands = ejabberd_commands:get_tags_commands(),
CommandsNames = case lists:keysearch(Tag, 1, TagsCommands) of
{value, {Tag, CNs}} -> CNs;
false -> []
end,
CommandsList = lists:map(
fun(NameString) ->
C = ejabberd_commands:get_command_definition(list_to_atom(NameString)),
#ejabberd_commands{name = Name,
args = Args,
desc = Desc} = C,
tuple_command_help({Name, Args, Desc})
end,
CommandsNames),
print_usage_commands(HelpMode, MaxC, ShCode, CommandsList),
?PRINT("\n", []).
%%-----------------------------
%% Print usage of 'help' command
%%-----------------------------
print_usage_help(MaxC, ShCode) ->
LongDesc =
["The special 'help' ejabberdctl command provides help of ejabberd commands.\n\n"
"The format is:\n ", ?B("ejabberdctl"), " ", ?B("help"), " [", ?B("--tags"), " ", ?U("[tag]"), " | ", ?U("com?*"), "]\n\n"
"The optional arguments:\n"
" ",?B("--tags")," Show all tags and the names of commands in each tag\n"
" ",?B("--tags"), " ", ?U("tag")," Show description of commands in this tag\n"
" ",?U("command")," Show detailed description of the command\n"
" ",?U("com?*")," Show detailed description of commands that match this glob.\n"
" You can use ? to match a simple character,\n"
" and * to match several characters.\n"
"\n",
"Some example usages:\n",
" ejabberdctl help\n",
" ejabberdctl help --tags\n",
" ejabberdctl help --tags accounts\n",
" ejabberdctl help register\n",
" ejabberdctl help regist*\n",
"\n",
"Please note that 'ejabberdctl help' shows all ejabberd commands,\n",
"even those that cannot be used in the shell with ejabberdctl.\n",
"Those commands can be identified because the description starts with: *"],
ArgsDef = [],
C = #ejabberd_commands{
desc = "Show help of ejabberd commands",
longdesc = lists:flatten(LongDesc),
args = ArgsDef,
result = {help, string}},
print_usage_command("help", C, MaxC, ShCode).
%%-----------------------------
%% Print usage command
%%-----------------------------
%% @spec (CmdSubString::string(), MaxC::integer(), ShCode::boolean()) -> ok
print_usage_commands(CmdSubString, MaxC, ShCode) ->
%% Get which command names match this substring
AllCommandsNames = [atom_to_list(Name) || {Name, _, _} <- ejabberd_commands:list_commands()],
Cmds = filter_commands(AllCommandsNames, CmdSubString),
case Cmds of
[] -> io:format("Error: not command found that match: ~p~n", [CmdSubString]);
_ -> print_usage_commands2(lists:sort(Cmds), MaxC, ShCode)
end.
print_usage_commands2(Cmds, MaxC, ShCode) ->
%% Then for each one print it
lists:mapfoldl(
fun(Cmd, Remaining) ->
print_usage_command(Cmd, MaxC, ShCode),
case Remaining > 1 of
true -> ?PRINT([" ", lists:duplicate(MaxC, 126), " \n"], []);
false -> ok
end,
{ok, Remaining-1}
end,
length(Cmds),
Cmds).
filter_commands(All, SubString) ->
case lists:member(SubString, All) of
true -> [SubString];
false -> filter_commands_regexp(All, SubString)
end.
filter_commands_regexp(All, Glob) ->
RegExp = ejabberd_regexp:sh_to_awk(Glob),
lists:filter(
fun(Command) ->
case ejabberd_regexp:run(Command, RegExp) of
match ->
true;
nomatch ->
false
end
end,
All).
%% @spec (Cmd::string(), MaxC::integer(), ShCode::boolean()) -> ok
print_usage_command(Cmd, MaxC, ShCode) ->
Name = list_to_atom(Cmd),
case ejabberd_commands:get_command_definition(Name) of
command_not_found ->
io:format("Error: command ~p not known.~n", [Cmd]);
C ->
print_usage_command(Cmd, C, MaxC, ShCode)
end.
print_usage_command(Cmd, C, MaxC, ShCode) ->
#ejabberd_commands{
tags = TagsAtoms,
desc = Desc,
longdesc = LongDesc,
args = ArgsDef,
result = ResultDef} = C,
NameFmt = [" ", ?B("Command Name"), ": ", Cmd, "\n"],
%% Initial indentation of result is 13 = length(" Arguments: ")
Args = [format_usage_ctype(ArgDef, 13) || ArgDef <- ArgsDef],
ArgsMargin = lists:duplicate(13, $\s),
ArgsListFmt = case Args of
[] -> "\n";
_ -> [ [Arg, "\n", ArgsMargin] || Arg <- Args]
end,
ArgsFmt = [" ", ?B("Arguments"), ": ", ArgsListFmt],
%% Initial indentation of result is 11 = length(" Returns: ")
ResultFmt = format_usage_ctype(ResultDef, 11),
ReturnsFmt = [" ",?B("Returns"),": ", ResultFmt],
XmlrpcFmt = "", %%+++ [" ",?B("XML-RPC"),": ", format_usage_xmlrpc(ArgsDef, ResultDef), "\n\n"],
TagsFmt = [" ",?B("Tags"),": ", prepare_long_line(8, MaxC, [atom_to_list(TagA) || TagA <- TagsAtoms])],
DescFmt = [" ",?B("Description"),": ", prepare_description(15, MaxC, Desc)],
LongDescFmt = case LongDesc of
"" -> "";
_ -> ["", prepare_description(0, MaxC, LongDesc), "\n\n"]
end,
NoteEjabberdctl = case is_supported_args(ArgsDef) of
true -> "";
false -> [" ", ?B("Note:"), " This command cannot be executed using ejabberdctl. Try ejabberd_xmlrpc.\n\n"]
end,
?PRINT(["\n", NameFmt, "\n", ArgsFmt, "\n", ReturnsFmt, "\n\n", XmlrpcFmt, TagsFmt, "\n\n", DescFmt, "\n\n", LongDescFmt, NoteEjabberdctl], []).
format_usage_ctype(Type, _Indentation)
when (Type==atom) or (Type==integer) or (Type==string) or (Type==rescode) or (Type==restuple)->
io_lib:format("~p", [Type]);
format_usage_ctype({Name, Type}, _Indentation)
when (Type==atom) or (Type==integer) or (Type==string) or (Type==rescode) or (Type==restuple)->
io_lib:format("~p::~p", [Name, Type]);
format_usage_ctype({Name, {list, ElementDef}}, Indentation) ->
NameFmt = atom_to_list(Name),
Indentation2 = Indentation + length(NameFmt) + 4,
ElementFmt = format_usage_ctype(ElementDef, Indentation2),
[NameFmt, "::[ ", ElementFmt, " ]"];
format_usage_ctype({Name, {tuple, ElementsDef}}, Indentation) ->
NameFmt = atom_to_list(Name),
Indentation2 = Indentation + length(NameFmt) + 4,
ElementsFmt = format_usage_tuple(ElementsDef, Indentation2),
[NameFmt, "::{ " | ElementsFmt].
format_usage_tuple([], _Indentation) ->
[];
format_usage_tuple([ElementDef], Indentation) ->
[format_usage_ctype(ElementDef, Indentation) , " }"];
format_usage_tuple([ElementDef | ElementsDef], Indentation) ->
ElementFmt = format_usage_ctype(ElementDef, Indentation),
MarginString = lists:duplicate(Indentation, $\s), % Put spaces
[ElementFmt, ",\n", MarginString, format_usage_tuple(ElementsDef, Indentation)].
%%-----------------------------
%% Command managment
%%-----------------------------
%%+++
%% Struct(Integer res) create_account(Struct(String user, String server, String password))
%%format_usage_xmlrpc(ArgsDef, ResultDef) ->
%% ["aaaa bbb ccc"].
ejabberd-2.1.11/src/mod_service_log.erl 0000664 0000000 0000000 00000005065 12240230175 014657 0 ustar %%%----------------------------------------------------------------------
%%% File : mod_service_log.erl
%%% Author : Alexey Shchepin
%%% Purpose : Copy user messages to logger service
%%% Created : 24 Aug 2003 by Alexey Shchepin
%%%
%%%
%%% ejabberd, Copyright (C) 2002-2012 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
%%% published by the Free Software Foundation; either version 2 of the
%%% License, or (at your option) any later version.
%%%
%%% This program is distributed in the hope that it will be useful,
%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
%%% General Public License for more details.
%%%
%%% You should have received a copy of the GNU General Public License
%%% along with this program; if not, write to the Free Software
%%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
%%% 02111-1307 USA
%%%
%%%----------------------------------------------------------------------
-module(mod_service_log).
-author('alexey@process-one.net').
-behaviour(gen_mod).
-export([start/2,
stop/1,
log_user_send/3,
log_user_receive/4]).
-include("ejabberd.hrl").
-include("jlib.hrl").
start(Host, _Opts) ->
ejabberd_hooks:add(user_send_packet, Host,
?MODULE, log_user_send, 50),
ejabberd_hooks:add(user_receive_packet, Host,
?MODULE, log_user_receive, 50),
ok.
stop(Host) ->
ejabberd_hooks:delete(user_send_packet, Host,
?MODULE, log_user_send, 50),
ejabberd_hooks:delete(user_receive_packet, Host,
?MODULE, log_user_receive, 50),
ok.
log_user_send(From, To, Packet) ->
log_packet(From, To, Packet, From#jid.lserver).
log_user_receive(_JID, From, To, Packet) ->
log_packet(From, To, Packet, To#jid.lserver).
log_packet(From, To, {xmlelement, Name, Attrs, Els}, Host) ->
Loggers = gen_mod:get_module_opt(Host, ?MODULE, loggers, []),
ServerJID = #jid{user = "", server = Host, resource = "",
luser = "", lserver = Host, lresource = ""},
NewAttrs = jlib:replace_from_to_attrs(jlib:jid_to_string(From),
jlib:jid_to_string(To),
Attrs),
FixedPacket = {xmlelement, Name, NewAttrs, Els},
lists:foreach(
fun(Logger) ->
ejabberd_router:route(
ServerJID,
#jid{user = "", server = Logger, resource = "",
luser = "", lserver = Logger, lresource = ""},
{xmlelement, "route", [], [FixedPacket]})
end, Loggers).
ejabberd-2.1.11/src/ejabberd_s2s_out.erl 0000664 0000000 0000000 00000124200 12240230175 014724 0 ustar %%%----------------------------------------------------------------------
%%% File : ejabberd_s2s_out.erl
%%% Author : Alexey Shchepin
%%% Purpose : Manage outgoing server-to-server connections
%%% Created : 6 Dec 2002 by Alexey Shchepin
%%%
%%%
%%% ejabberd, Copyright (C) 2002-2012 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
%%% published by the Free Software Foundation; either version 2 of the
%%% License, or (at your option) any later version.
%%%
%%% This program is distributed in the hope that it will be useful,
%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
%%% General Public License for more details.
%%%
%%% You should have received a copy of the GNU General Public License
%%% along with this program; if not, write to the Free Software
%%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
%%% 02111-1307 USA
%%%
%%%----------------------------------------------------------------------
-module(ejabberd_s2s_out).
-author('alexey@process-one.net').
-behaviour(p1_fsm).
%% External exports
-export([start/3,
start_link/3,
start_connection/1,
terminate_if_waiting_delay/2,
stop_connection/1]).
%% p1_fsm callbacks (same as gen_fsm)
-export([init/1,
open_socket/2,
wait_for_stream/2,
wait_for_validation/2,
wait_for_features/2,
wait_for_auth_result/2,
wait_for_starttls_proceed/2,
relay_to_bridge/2,
reopen_socket/2,
wait_before_retry/2,
stream_established/2,
handle_event/3,
handle_sync_event/4,
handle_info/3,
terminate/3,
print_state/1,
code_change/4,
test_get_addr_port/1,
get_addr_port/1]).
-include("ejabberd.hrl").
-include("jlib.hrl").
-record(state, {socket,
streamid,
use_v10,
tls = false,
tls_required = false,
tls_enabled = false,
tls_options = [connect],
authenticated = false,
db_enabled = true,
try_auth = true,
myname, server, queue,
delay_to_retry = undefined_delay,
new = false, verify = false,
bridge,
timer}).
%%-define(DBGFSM, true).
-ifdef(DBGFSM).
-define(FSMOPTS, [{debug, [trace]}]).
-else.
-define(FSMOPTS, []).
-endif.
%% Module start with or without supervisor:
-ifdef(NO_TRANSIENT_SUPERVISORS).
-define(SUPERVISOR_START, p1_fsm:start(ejabberd_s2s_out, [From, Host, Type],
fsm_limit_opts() ++ ?FSMOPTS)).
-else.
-define(SUPERVISOR_START, supervisor:start_child(ejabberd_s2s_out_sup,
[From, Host, Type])).
-endif.
-define(FSMTIMEOUT, 30000).
%% We do not block on send anymore.
-define(TCP_SEND_TIMEOUT, 15000).
%% Maximum delay to wait before retrying to connect after a failed attempt.
%% Specified in miliseconds. Default value is 5 minutes.
-define(MAX_RETRY_DELAY, 300000).
-define(STREAM_HEADER,
""
""
).
-define(STREAM_TRAILER, " ").
-define(INVALID_NAMESPACE_ERR,
xml:element_to_string(?SERR_INVALID_NAMESPACE)).
-define(HOST_UNKNOWN_ERR,
xml:element_to_string(?SERR_HOST_UNKNOWN)).
-define(INVALID_XML_ERR,
xml:element_to_string(?SERR_XML_NOT_WELL_FORMED)).
-define(SOCKET_DEFAULT_RESULT, {error, badarg}).
%%%----------------------------------------------------------------------
%%% API
%%%----------------------------------------------------------------------
start(From, Host, Type) ->
?SUPERVISOR_START.
start_link(From, Host, Type) ->
p1_fsm:start_link(ejabberd_s2s_out, [From, Host, Type],
fsm_limit_opts() ++ ?FSMOPTS).
start_connection(Pid) ->
p1_fsm:send_event(Pid, init).
stop_connection(Pid) ->
p1_fsm:send_event(Pid, closed).
%%%----------------------------------------------------------------------
%%% Callback functions from p1_fsm
%%%----------------------------------------------------------------------
%%----------------------------------------------------------------------
%% Func: init/1
%% Returns: {ok, StateName, StateData} |
%% {ok, StateName, StateData, Timeout} |
%% ignore |
%% {stop, StopReason}
%%----------------------------------------------------------------------
init([From, Server, Type]) ->
process_flag(trap_exit, true),
?DEBUG("started: ~p", [{From, Server, Type}]),
{TLS, TLSRequired} = case ejabberd_config:get_local_option(s2s_use_starttls) of
UseTls when (UseTls==undefined) or (UseTls==false) ->
{false, false};
UseTls when (UseTls==true) or (UseTls==optional) ->
{true, false};
UseTls when (UseTls==required) or (UseTls==required_trusted) ->
{true, true}
end,
UseV10 = TLS,
TLSOpts = case ejabberd_config:get_local_option(s2s_certfile) of
undefined ->
[connect];
CertFile ->
[{certfile, CertFile}, connect]
end,
{New, Verify} = case Type of
{new, Key} ->
{Key, false};
{verify, Pid, Key, SID} ->
start_connection(self()),
{false, {Pid, Key, SID}}
end,
Timer = erlang:start_timer(?S2STIMEOUT, self(), []),
{ok, open_socket, #state{use_v10 = UseV10,
tls = TLS,
tls_required = TLSRequired,
tls_options = TLSOpts,
queue = queue:new(),
myname = From,
server = Server,
new = New,
verify = Verify,
timer = Timer}}.
%%----------------------------------------------------------------------
%% Func: StateName/2
%% Returns: {next_state, NextStateName, NextStateData} |
%% {next_state, NextStateName, NextStateData, Timeout} |
%% {stop, Reason, NewStateData}
%%----------------------------------------------------------------------
open_socket(init, StateData) ->
log_s2s_out(StateData#state.new,
StateData#state.myname,
StateData#state.server,
StateData#state.tls),
?DEBUG("open_socket: ~p", [{StateData#state.myname,
StateData#state.server,
StateData#state.new,
StateData#state.verify}]),
AddrList = case idna:domain_utf8_to_ascii(StateData#state.server) of
false -> [];
ASCIIAddr ->
get_addr_port(ASCIIAddr)
end,
case lists:foldl(fun({Addr, Port}, Acc) ->
case Acc of
{ok, Socket} ->
{ok, Socket};
_ ->
open_socket1(Addr, Port)
end
end, ?SOCKET_DEFAULT_RESULT, AddrList) of
{ok, Socket} ->
Version = if
StateData#state.use_v10 ->
" version='1.0'";
true ->
""
end,
NewStateData = StateData#state{socket = Socket,
tls_enabled = false,
streamid = new_id()},
send_text(NewStateData, io_lib:format(?STREAM_HEADER,
[StateData#state.myname, StateData#state.server,
Version])),
{next_state, wait_for_stream, NewStateData, ?FSMTIMEOUT};
{error, _Reason} ->
?INFO_MSG("s2s connection: ~s -> ~s (remote server not found)",
[StateData#state.myname, StateData#state.server]),
case ejabberd_hooks:run_fold(find_s2s_bridge,
undefined,
[StateData#state.myname,
StateData#state.server]) of
{Mod, Fun, Type} ->
?INFO_MSG("found a bridge to ~s for: ~s -> ~s",
[Type, StateData#state.myname,
StateData#state.server]),
NewStateData = StateData#state{bridge={Mod, Fun}},
{next_state, relay_to_bridge, NewStateData};
_ ->
wait_before_reconnect(StateData)
end
end;
open_socket(closed, StateData) ->
?INFO_MSG("s2s connection: ~s -> ~s (stopped in open socket)",
[StateData#state.myname, StateData#state.server]),
{stop, normal, StateData};
open_socket(timeout, StateData) ->
?INFO_MSG("s2s connection: ~s -> ~s (timeout in open socket)",
[StateData#state.myname, StateData#state.server]),
{stop, normal, StateData};
open_socket(_, StateData) ->
{next_state, open_socket, StateData}.
%%----------------------------------------------------------------------
%% IPv4
open_socket1({_,_,_,_} = Addr, Port) ->
open_socket2(inet, Addr, Port);
%% IPv6
open_socket1({_,_,_,_,_,_,_,_} = Addr, Port) ->
open_socket2(inet6, Addr, Port);
%% Hostname
open_socket1(Host, Port) ->
lists:foldl(fun(_Family, {ok, _Socket} = R) ->
R;
(Family, _) ->
Addrs = get_addrs(Host, Family),
lists:foldl(fun(_Addr, {ok, _Socket} = R) ->
R;
(Addr, _) ->
open_socket1(Addr, Port)
end, ?SOCKET_DEFAULT_RESULT, Addrs)
end, ?SOCKET_DEFAULT_RESULT, outgoing_s2s_families()).
open_socket2(Type, Addr, Port) ->
?DEBUG("s2s_out: connecting to ~p:~p~n", [Addr, Port]),
Timeout = outgoing_s2s_timeout(),
SockOpts = try erlang:system_info(otp_release) >= "R13B" of
true -> [{send_timeout_close, true}];
false -> []
catch
_:_ -> []
end,
case (catch ejabberd_socket:connect(Addr, Port,
[binary, {packet, 0},
{send_timeout, ?TCP_SEND_TIMEOUT},
{active, false}, Type | SockOpts],
Timeout)) of
{ok, _Socket} = R -> R;
{error, Reason} = R ->
?DEBUG("s2s_out: connect return ~p~n", [Reason]),
R;
{'EXIT', Reason} ->
?DEBUG("s2s_out: connect crashed ~p~n", [Reason]),
{error, Reason}
end.
%%----------------------------------------------------------------------
wait_for_stream({xmlstreamstart, _Name, Attrs}, StateData) ->
case {xml:get_attr_s("xmlns", Attrs),
xml:get_attr_s("xmlns:db", Attrs),
xml:get_attr_s("version", Attrs) == "1.0"} of
{"jabber:server", "jabber:server:dialback", false} ->
send_db_request(StateData);
{"jabber:server", "jabber:server:dialback", true} when
StateData#state.use_v10 ->
{next_state, wait_for_features, StateData, ?FSMTIMEOUT};
%% Clause added to handle Tigase's workaround for an old ejabberd bug:
{"jabber:server", "jabber:server:dialback", true} when
not StateData#state.use_v10 ->
send_db_request(StateData);
{"jabber:server", "", true} when StateData#state.use_v10 ->
{next_state, wait_for_features, StateData#state{db_enabled = false}, ?FSMTIMEOUT};
{NSProvided, DB, _} ->
send_text(StateData, ?INVALID_NAMESPACE_ERR),
?INFO_MSG("Closing s2s connection: ~s -> ~s (invalid namespace).~n"
"Namespace provided: ~p~nNamespace expected: \"jabber:server\"~n"
"xmlns:db provided: ~p~nAll attributes: ~p",
[StateData#state.myname, StateData#state.server, NSProvided, DB, Attrs]),
{stop, normal, StateData}
end;
wait_for_stream({xmlstreamerror, _}, StateData) ->
send_text(StateData,
?INVALID_XML_ERR ++ ?STREAM_TRAILER),
?INFO_MSG("Closing s2s connection: ~s -> ~s (invalid xml)",
[StateData#state.myname, StateData#state.server]),
{stop, normal, StateData};
wait_for_stream({xmlstreamend,_Name}, StateData) ->
?INFO_MSG("Closing s2s connection: ~s -> ~s (xmlstreamend)",
[StateData#state.myname, StateData#state.server]),
{stop, normal, StateData};
wait_for_stream(timeout, StateData) ->
?INFO_MSG("Closing s2s connection: ~s -> ~s (timeout in wait_for_stream)",
[StateData#state.myname, StateData#state.server]),
{stop, normal, StateData};
wait_for_stream(closed, StateData) ->
?INFO_MSG("Closing s2s connection: ~s -> ~s (close in wait_for_stream)",
[StateData#state.myname, StateData#state.server]),
{stop, normal, StateData}.
wait_for_validation({xmlstreamelement, El}, StateData) ->
case is_verify_res(El) of
{result, To, From, Id, Type} ->
?DEBUG("recv result: ~p", [{From, To, Id, Type}]),
case {Type, StateData#state.tls_enabled, StateData#state.tls_required} of
{"valid", Enabled, Required} when (Enabled==true) or (Required==false) ->
send_queue(StateData, StateData#state.queue),
?INFO_MSG("Connection established: ~s -> ~s with TLS=~p",
[StateData#state.myname, StateData#state.server, StateData#state.tls_enabled]),
ejabberd_hooks:run(s2s_connect_hook,
[StateData#state.myname,
StateData#state.server]),
{next_state, stream_established,
StateData#state{queue = queue:new()}};
{"valid", Enabled, Required} when (Enabled==false) and (Required==true) ->
%% TODO: bounce packets
?INFO_MSG("Closing s2s connection: ~s -> ~s (TLS is required but unavailable)",
[StateData#state.myname, StateData#state.server]),
{stop, normal, StateData};
_ ->
%% TODO: bounce packets
?INFO_MSG("Closing s2s connection: ~s -> ~s (invalid dialback key)",
[StateData#state.myname, StateData#state.server]),
{stop, normal, StateData}
end;
{verify, To, From, Id, Type} ->
?DEBUG("recv verify: ~p", [{From, To, Id, Type}]),
case StateData#state.verify of
false ->
NextState = wait_for_validation,
%% TODO: Should'nt we close the connection here ?
{next_state, NextState, StateData,
get_timeout_interval(NextState)};
{Pid, _Key, _SID} ->
case Type of
"valid" ->
p1_fsm:send_event(
Pid, {valid,
StateData#state.server,
StateData#state.myname});
_ ->
p1_fsm:send_event(
Pid, {invalid,
StateData#state.server,
StateData#state.myname})
end,
if
StateData#state.verify == false ->
{stop, normal, StateData};
true ->
NextState = wait_for_validation,
{next_state, NextState, StateData,
get_timeout_interval(NextState)}
end
end;
_ ->
{next_state, wait_for_validation, StateData, ?FSMTIMEOUT*3}
end;
wait_for_validation({xmlstreamend, _Name}, StateData) ->
?INFO_MSG("wait for validation: ~s -> ~s (xmlstreamend)",
[StateData#state.myname, StateData#state.server]),
{stop, normal, StateData};
wait_for_validation({xmlstreamerror, _}, StateData) ->
?INFO_MSG("wait for validation: ~s -> ~s (xmlstreamerror)",
[StateData#state.myname, StateData#state.server]),
send_text(StateData,
?INVALID_XML_ERR ++ ?STREAM_TRAILER),
{stop, normal, StateData};
wait_for_validation(timeout, #state{verify = {VPid, VKey, SID}} = StateData)
when is_pid(VPid) and is_list(VKey) and is_list(SID) ->
%% This is an auxiliary s2s connection for dialback.
%% This timeout is normal and doesn't represent a problem.
?DEBUG("wait_for_validation: ~s -> ~s (timeout in verify connection)",
[StateData#state.myname, StateData#state.server]),
{stop, normal, StateData};
wait_for_validation(timeout, StateData) ->
?INFO_MSG("wait_for_validation: ~s -> ~s (connect timeout)",
[StateData#state.myname, StateData#state.server]),
{stop, normal, StateData};
wait_for_validation(closed, StateData) ->
?INFO_MSG("wait for validation: ~s -> ~s (closed)",
[StateData#state.myname, StateData#state.server]),
{stop, normal, StateData}.
wait_for_features({xmlstreamelement, El}, StateData) ->
case El of
{xmlelement, "stream:features", _Attrs, Els} ->
{SASLEXT, StartTLS, StartTLSRequired} =
lists:foldl(
fun({xmlelement, "mechanisms", Attrs1, Els1} = _El1,
{_SEXT, STLS, STLSReq} = Acc) ->
case xml:get_attr_s("xmlns", Attrs1) of
?NS_SASL ->
NewSEXT =
lists:any(
fun({xmlelement, "mechanism", _, Els2}) ->
case xml:get_cdata(Els2) of
"EXTERNAL" -> true;
_ -> false
end;
(_) -> false
end, Els1),
{NewSEXT, STLS, STLSReq};
_ ->
Acc
end;
({xmlelement, "starttls", Attrs1, _Els1} = El1,
{SEXT, _STLS, _STLSReq} = Acc) ->
case xml:get_attr_s("xmlns", Attrs1) of
?NS_TLS ->
Req = case xml:get_subtag(El1, "required") of
{xmlelement, _, _, _} -> true;
false -> false
end,
{SEXT, true, Req};
_ ->
Acc
end;
(_, Acc) ->
Acc
end, {false, false, false}, Els),
if
(not SASLEXT) and (not StartTLS) and
StateData#state.authenticated ->
send_queue(StateData, StateData#state.queue),
?INFO_MSG("Connection established: ~s -> ~s",
[StateData#state.myname, StateData#state.server]),
ejabberd_hooks:run(s2s_connect_hook,
[StateData#state.myname,
StateData#state.server]),
{next_state, stream_established,
StateData#state{queue = queue:new()}};
SASLEXT and StateData#state.try_auth and
(StateData#state.new /= false) ->
send_element(StateData,
{xmlelement, "auth",
[{"xmlns", ?NS_SASL},
{"mechanism", "EXTERNAL"}],
[{xmlcdata,
jlib:encode_base64(
StateData#state.myname)}]}),
{next_state, wait_for_auth_result,
StateData#state{try_auth = false}, ?FSMTIMEOUT};
StartTLS and StateData#state.tls and
(not StateData#state.tls_enabled) ->
send_element(StateData,
{xmlelement, "starttls",
[{"xmlns", ?NS_TLS}], []}),
{next_state, wait_for_starttls_proceed, StateData,
?FSMTIMEOUT};
StartTLSRequired and (not StateData#state.tls) ->
?DEBUG("restarted: ~p", [{StateData#state.myname,
StateData#state.server}]),
ejabberd_socket:close(StateData#state.socket),
{next_state, reopen_socket,
StateData#state{socket = undefined,
use_v10 = false}, ?FSMTIMEOUT};
StateData#state.db_enabled ->
send_db_request(StateData);
true ->
?DEBUG("restarted: ~p", [{StateData#state.myname,
StateData#state.server}]),
% TODO: clear message queue
ejabberd_socket:close(StateData#state.socket),
{next_state, reopen_socket, StateData#state{socket = undefined,
use_v10 = false}, ?FSMTIMEOUT}
end;
_ ->
send_text(StateData,
xml:element_to_string(?SERR_BAD_FORMAT) ++
?STREAM_TRAILER),
?INFO_MSG("Closing s2s connection: ~s -> ~s (bad format)",
[StateData#state.myname, StateData#state.server]),
{stop, normal, StateData}
end;
wait_for_features({xmlstreamend, _Name}, StateData) ->
?INFO_MSG("wait_for_features: xmlstreamend", []),
{stop, normal, StateData};
wait_for_features({xmlstreamerror, _}, StateData) ->
send_text(StateData,
?INVALID_XML_ERR ++ ?STREAM_TRAILER),
?INFO_MSG("wait for features: xmlstreamerror", []),
{stop, normal, StateData};
wait_for_features(timeout, StateData) ->
?INFO_MSG("wait for features: timeout", []),
{stop, normal, StateData};
wait_for_features(closed, StateData) ->
?INFO_MSG("wait for features: closed", []),
{stop, normal, StateData}.
wait_for_auth_result({xmlstreamelement, El}, StateData) ->
case El of
{xmlelement, "success", Attrs, _Els} ->
case xml:get_attr_s("xmlns", Attrs) of
?NS_SASL ->
?DEBUG("auth: ~p", [{StateData#state.myname,
StateData#state.server}]),
ejabberd_socket:reset_stream(StateData#state.socket),
send_text(StateData,
io_lib:format(?STREAM_HEADER,
[StateData#state.myname, StateData#state.server,
" version='1.0'"])),
{next_state, wait_for_stream,
StateData#state{streamid = new_id(),
authenticated = true
}, ?FSMTIMEOUT};
_ ->
send_text(StateData,
xml:element_to_string(?SERR_BAD_FORMAT) ++
?STREAM_TRAILER),
?INFO_MSG("Closing s2s connection: ~s -> ~s (bad format)",
[StateData#state.myname, StateData#state.server]),
{stop, normal, StateData}
end;
{xmlelement, "failure", Attrs, _Els} ->
case xml:get_attr_s("xmlns", Attrs) of
?NS_SASL ->
?DEBUG("restarted: ~p", [{StateData#state.myname,
StateData#state.server}]),
ejabberd_socket:close(StateData#state.socket),
{next_state, reopen_socket,
StateData#state{socket = undefined}, ?FSMTIMEOUT};
_ ->
send_text(StateData,
xml:element_to_string(?SERR_BAD_FORMAT) ++
?STREAM_TRAILER),
?INFO_MSG("Closing s2s connection: ~s -> ~s (bad format)",
[StateData#state.myname, StateData#state.server]),
{stop, normal, StateData}
end;
_ ->
send_text(StateData,
xml:element_to_string(?SERR_BAD_FORMAT) ++
?STREAM_TRAILER),
?INFO_MSG("Closing s2s connection: ~s -> ~s (bad format)",
[StateData#state.myname, StateData#state.server]),
{stop, normal, StateData}
end;
wait_for_auth_result({xmlstreamend, _Name}, StateData) ->
?INFO_MSG("wait for auth result: xmlstreamend", []),
{stop, normal, StateData};
wait_for_auth_result({xmlstreamerror, _}, StateData) ->
send_text(StateData,
?INVALID_XML_ERR ++ ?STREAM_TRAILER),
?INFO_MSG("wait for auth result: xmlstreamerror", []),
{stop, normal, StateData};
wait_for_auth_result(timeout, StateData) ->
?INFO_MSG("wait for auth result: timeout", []),
{stop, normal, StateData};
wait_for_auth_result(closed, StateData) ->
?INFO_MSG("wait for auth result: closed", []),
{stop, normal, StateData}.
wait_for_starttls_proceed({xmlstreamelement, El}, StateData) ->
case El of
{xmlelement, "proceed", Attrs, _Els} ->
case xml:get_attr_s("xmlns", Attrs) of
?NS_TLS ->
?DEBUG("starttls: ~p", [{StateData#state.myname,
StateData#state.server}]),
Socket = StateData#state.socket,
TLSOpts = case ejabberd_config:get_local_option(
{domain_certfile,
StateData#state.myname}) of
undefined ->
StateData#state.tls_options;
CertFile ->
[{certfile, CertFile} |
lists:keydelete(
certfile, 1,
StateData#state.tls_options)]
end,
TLSSocket = ejabberd_socket:starttls(Socket, TLSOpts),
NewStateData = StateData#state{socket = TLSSocket,
streamid = new_id(),
tls_enabled = true,
tls_options = TLSOpts
},
send_text(NewStateData,
io_lib:format(?STREAM_HEADER,
[StateData#state.myname, StateData#state.server,
" version='1.0'"])),
{next_state, wait_for_stream, NewStateData, ?FSMTIMEOUT};
_ ->
send_text(StateData,
xml:element_to_string(?SERR_BAD_FORMAT) ++
?STREAM_TRAILER),
?INFO_MSG("Closing s2s connection: ~s -> ~s (bad format)",
[StateData#state.myname, StateData#state.server]),
{stop, normal, StateData}
end;
_ ->
?INFO_MSG("Closing s2s connection: ~s -> ~s (bad format)",
[StateData#state.myname, StateData#state.server]),
{stop, normal, StateData}
end;
wait_for_starttls_proceed({xmlstreamend, _Name}, StateData) ->
?INFO_MSG("wait for starttls proceed: xmlstreamend", []),
{stop, normal, StateData};
wait_for_starttls_proceed({xmlstreamerror, _}, StateData) ->
send_text(StateData,
?INVALID_XML_ERR ++ ?STREAM_TRAILER),
?INFO_MSG("wait for starttls proceed: xmlstreamerror", []),
{stop, normal, StateData};
wait_for_starttls_proceed(timeout, StateData) ->
?INFO_MSG("wait for starttls proceed: timeout", []),
{stop, normal, StateData};
wait_for_starttls_proceed(closed, StateData) ->
?INFO_MSG("wait for starttls proceed: closed", []),
{stop, normal, StateData}.
reopen_socket({xmlstreamelement, _El}, StateData) ->
{next_state, reopen_socket, StateData, ?FSMTIMEOUT};
reopen_socket({xmlstreamend, _Name}, StateData) ->
{next_state, reopen_socket, StateData, ?FSMTIMEOUT};
reopen_socket({xmlstreamerror, _}, StateData) ->
{next_state, reopen_socket, StateData, ?FSMTIMEOUT};
reopen_socket(timeout, StateData) ->
?INFO_MSG("reopen socket: timeout", []),
{stop, normal, StateData};
reopen_socket(closed, StateData) ->
p1_fsm:send_event(self(), init),
{next_state, open_socket, StateData, ?FSMTIMEOUT}.
%% This state is use to avoid reconnecting to often to bad sockets
wait_before_retry(_Event, StateData) ->
{next_state, wait_before_retry, StateData, ?FSMTIMEOUT}.
relay_to_bridge(stop, StateData) ->
wait_before_reconnect(StateData);
relay_to_bridge(closed, StateData) ->
?INFO_MSG("relay to bridge: ~s -> ~s (closed)",
[StateData#state.myname, StateData#state.server]),
{stop, normal, StateData};
relay_to_bridge(_Event, StateData) ->
{next_state, relay_to_bridge, StateData}.
stream_established({xmlstreamelement, El}, StateData) ->
?DEBUG("s2S stream established", []),
case is_verify_res(El) of
{verify, VTo, VFrom, VId, VType} ->
?DEBUG("recv verify: ~p", [{VFrom, VTo, VId, VType}]),
case StateData#state.verify of
{VPid, _VKey, _SID} ->
case VType of
"valid" ->
p1_fsm:send_event(
VPid, {valid,
StateData#state.server,
StateData#state.myname});
_ ->
p1_fsm:send_event(
VPid, {invalid,
StateData#state.server,
StateData#state.myname})
end;
_ ->
ok
end;
_ ->
ok
end,
{next_state, stream_established, StateData};
stream_established({xmlstreamend, _Name}, StateData) ->
?INFO_MSG("Connection closed in stream established: ~s -> ~s (xmlstreamend)",
[StateData#state.myname, StateData#state.server]),
{stop, normal, StateData};
stream_established({xmlstreamerror, _}, StateData) ->
send_text(StateData,
?INVALID_XML_ERR ++ ?STREAM_TRAILER),
?INFO_MSG("stream established: ~s -> ~s (xmlstreamerror)",
[StateData#state.myname, StateData#state.server]),
{stop, normal, StateData};
stream_established(timeout, StateData) ->
?INFO_MSG("stream established: ~s -> ~s (timeout)",
[StateData#state.myname, StateData#state.server]),
{stop, normal, StateData};
stream_established(closed, StateData) ->
?INFO_MSG("stream established: ~s -> ~s (closed)",
[StateData#state.myname, StateData#state.server]),
{stop, normal, StateData}.
%%----------------------------------------------------------------------
%% Func: StateName/3
%% Returns: {next_state, NextStateName, NextStateData} |
%% {next_state, NextStateName, NextStateData, Timeout} |
%% {reply, Reply, NextStateName, NextStateData} |
%% {reply, Reply, NextStateName, NextStateData, Timeout} |
%% {stop, Reason, NewStateData} |
%% {stop, Reason, Reply, NewStateData}
%%----------------------------------------------------------------------
%%state_name(Event, From, StateData) ->
%% Reply = ok,
%% {reply, Reply, state_name, StateData}.
%%----------------------------------------------------------------------
%% Func: handle_event/3
%% Returns: {next_state, NextStateName, NextStateData} |
%% {next_state, NextStateName, NextStateData, Timeout} |
%% {stop, Reason, NewStateData}
%%----------------------------------------------------------------------
handle_event(_Event, StateName, StateData) ->
{next_state, StateName, StateData, get_timeout_interval(StateName)}.
%%----------------------------------------------------------------------
%% Func: handle_sync_event/4
%% Returns: The associated StateData for this connection
%% {reply, Reply, NextStateName, NextStateData}
%% Reply = {state_infos, [{InfoName::atom(), InfoValue::any()]
%%----------------------------------------------------------------------
handle_sync_event(get_state_infos, _From, StateName, StateData) ->
{Addr,Port} = try ejabberd_socket:peername(StateData#state.socket) of
{ok, {A,P}} -> {A,P};
{error, _} -> {unknown,unknown}
catch
_:_ ->
{unknown,unknown}
end,
Infos = [
{direction, out},
{statename, StateName},
{addr, Addr},
{port, Port},
{streamid, StateData#state.streamid},
{use_v10, StateData#state.use_v10},
{tls, StateData#state.tls},
{tls_required, StateData#state.tls_required},
{tls_enabled, StateData#state.tls_enabled},
{tls_options, StateData#state.tls_options},
{authenticated, StateData#state.authenticated},
{db_enabled, StateData#state.db_enabled},
{try_auth, StateData#state.try_auth},
{myname, StateData#state.myname},
{server, StateData#state.server},
{delay_to_retry, StateData#state.delay_to_retry},
{verify, StateData#state.verify}
],
Reply = {state_infos, Infos},
{reply,Reply,StateName,StateData};
%%----------------------------------------------------------------------
%% Func: handle_sync_event/4
%% Returns: {next_state, NextStateName, NextStateData} |
%% {next_state, NextStateName, NextStateData, Timeout} |
%% {reply, Reply, NextStateName, NextStateData} |
%% {reply, Reply, NextStateName, NextStateData, Timeout} |
%% {stop, Reason, NewStateData} |
%% {stop, Reason, Reply, NewStateData}
%%----------------------------------------------------------------------
handle_sync_event(_Event, _From, StateName, StateData) ->
Reply = ok,
{reply, Reply, StateName, StateData, get_timeout_interval(StateName)}.
code_change(_OldVsn, StateName, StateData, _Extra) ->
{ok, StateName, StateData}.
%%----------------------------------------------------------------------
%% Func: handle_info/3
%% Returns: {next_state, NextStateName, NextStateData} |
%% {next_state, NextStateName, NextStateData, Timeout} |
%% {stop, Reason, NewStateData}
%%----------------------------------------------------------------------
handle_info({send_text, Text}, StateName, StateData) ->
send_text(StateData, Text),
cancel_timer(StateData#state.timer),
Timer = erlang:start_timer(?S2STIMEOUT, self(), []),
{next_state, StateName, StateData#state{timer = Timer},
get_timeout_interval(StateName)};
handle_info({send_element, El}, StateName, StateData) ->
case StateName of
stream_established ->
cancel_timer(StateData#state.timer),
Timer = erlang:start_timer(?S2STIMEOUT, self(), []),
send_element(StateData, El),
{next_state, StateName, StateData#state{timer = Timer}};
%% In this state we bounce all message: We are waiting before
%% trying to reconnect
wait_before_retry ->
bounce_element(El, ?ERR_REMOTE_SERVER_NOT_FOUND),
{next_state, StateName, StateData};
relay_to_bridge ->
%% In this state we relay all outbound messages
%% to a foreign protocol bridge such as SMTP, SIP, etc.
{Mod, Fun} = StateData#state.bridge,
?DEBUG("relaying stanza via ~p:~p/1", [Mod, Fun]),
case catch Mod:Fun(El) of
{'EXIT', Reason} ->
?ERROR_MSG("Error while relaying to bridge: ~p", [Reason]),
bounce_element(El, ?ERR_INTERNAL_SERVER_ERROR),
wait_before_reconnect(StateData);
_ ->
{next_state, StateName, StateData}
end;
_ ->
Q = queue:in(El, StateData#state.queue),
{next_state, StateName, StateData#state{queue = Q},
get_timeout_interval(StateName)}
end;
handle_info({timeout, Timer, _}, wait_before_retry,
#state{timer = Timer} = StateData) ->
?INFO_MSG("Reconnect delay expired: Will now retry to connect to ~s when needed.", [StateData#state.server]),
{stop, normal, StateData};
handle_info({timeout, Timer, _}, _StateName,
#state{timer = Timer} = StateData) ->
?INFO_MSG("Closing connection with ~s: timeout", [StateData#state.server]),
{stop, normal, StateData};
handle_info(terminate_if_waiting_before_retry, wait_before_retry, StateData) ->
{stop, normal, StateData};
handle_info(terminate_if_waiting_before_retry, StateName, StateData) ->
{next_state, StateName, StateData, get_timeout_interval(StateName)};
handle_info(_, StateName, StateData) ->
{next_state, StateName, StateData, get_timeout_interval(StateName)}.
%%----------------------------------------------------------------------
%% Func: terminate/3
%% Purpose: Shutdown the fsm
%% Returns: any
%%----------------------------------------------------------------------
terminate(Reason, StateName, StateData) ->
?DEBUG("terminated: ~p", [{Reason, StateName}]),
case StateData#state.new of
false ->
ok;
Key ->
ejabberd_s2s:remove_connection(
{StateData#state.myname, StateData#state.server}, self(), Key)
end,
%% bounce queue manage by process and Erlang message queue
bounce_queue(StateData#state.queue, ?ERR_REMOTE_SERVER_NOT_FOUND),
bounce_messages(?ERR_REMOTE_SERVER_NOT_FOUND),
case StateData#state.socket of
undefined ->
ok;
_Socket ->
ejabberd_socket:close(StateData#state.socket)
end,
ok.
%%----------------------------------------------------------------------
%% Func: print_state/1
%% Purpose: Prepare the state to be printed on error log
%% Returns: State to print
%%----------------------------------------------------------------------
print_state(State) ->
State.
%%%----------------------------------------------------------------------
%%% Internal functions
%%%----------------------------------------------------------------------
send_text(StateData, Text) ->
ejabberd_socket:send(StateData#state.socket, Text).
send_element(StateData, El) ->
send_text(StateData, xml:element_to_binary(El)).
send_queue(StateData, Q) ->
case queue:out(Q) of
{{value, El}, Q1} ->
send_element(StateData, El),
send_queue(StateData, Q1);
{empty, _Q1} ->
ok
end.
%% Bounce a single message (xmlelement)
bounce_element(El, Error) ->
{xmlelement, _Name, Attrs, _SubTags} = El,
case xml:get_attr_s("type", Attrs) of
"error" -> ok;
"result" -> ok;
_ ->
Err = jlib:make_error_reply(El, Error),
From = jlib:string_to_jid(xml:get_tag_attr_s("from", El)),
To = jlib:string_to_jid(xml:get_tag_attr_s("to", El)),
ejabberd_router:route(To, From, Err)
end.
bounce_queue(Q, Error) ->
case queue:out(Q) of
{{value, El}, Q1} ->
bounce_element(El, Error),
bounce_queue(Q1, Error);
{empty, _} ->
ok
end.
new_id() ->
randoms:get_string().
cancel_timer(Timer) ->
erlang:cancel_timer(Timer),
receive
{timeout, Timer, _} ->
ok
after 0 ->
ok
end.
bounce_messages(Error) ->
receive
{send_element, El} ->
bounce_element(El, Error),
bounce_messages(Error)
after 0 ->
ok
end.
send_db_request(StateData) ->
Server = StateData#state.server,
New = case StateData#state.new of
false ->
case ejabberd_s2s:try_register(
{StateData#state.myname, Server}) of
{key, Key} ->
Key;
false ->
false
end;
Key ->
Key
end,
NewStateData = StateData#state{new = New},
try
case New of
false ->
ok;
Key1 ->
send_element(StateData,
{xmlelement,
"db:result",
[{"from", StateData#state.myname},
{"to", Server}],
[{xmlcdata, Key1}]})
end,
case StateData#state.verify of
false ->
ok;
{_Pid, Key2, SID} ->
send_element(StateData,
{xmlelement,
"db:verify",
[{"from", StateData#state.myname},
{"to", StateData#state.server},
{"id", SID}],
[{xmlcdata, Key2}]})
end,
{next_state, wait_for_validation, NewStateData, ?FSMTIMEOUT*6}
catch
_:_ ->
{stop, normal, NewStateData}
end.
is_verify_res({xmlelement, Name, Attrs, _Els}) when Name == "db:result" ->
{result,
xml:get_attr_s("to", Attrs),
xml:get_attr_s("from", Attrs),
xml:get_attr_s("id", Attrs),
xml:get_attr_s("type", Attrs)};
is_verify_res({xmlelement, Name, Attrs, _Els}) when Name == "db:verify" ->
{verify,
xml:get_attr_s("to", Attrs),
xml:get_attr_s("from", Attrs),
xml:get_attr_s("id", Attrs),
xml:get_attr_s("type", Attrs)};
is_verify_res(_) ->
false.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% SRV support
-include_lib("kernel/include/inet.hrl").
get_addr_port(Server) ->
Res = srv_lookup(Server),
case Res of
{error, Reason} ->
?DEBUG("srv lookup of '~s' failed: ~p~n", [Server, Reason]),
[{Server, outgoing_s2s_port()}];
{ok, HEnt} ->
?DEBUG("srv lookup of '~s': ~p~n",
[Server, HEnt#hostent.h_addr_list]),
AddrList = HEnt#hostent.h_addr_list,
%% Probabilities are not exactly proportional to weights
%% for simplicity (higher weigths are overvalued)
{A1, A2, A3} = now(),
random:seed(A1, A2, A3),
case (catch lists:map(
fun({Priority, Weight, Port, Host}) ->
N = case Weight of
0 -> 0;
_ -> (Weight + 1) * random:uniform()
end,
{Priority * 65536 - N, Host, Port}
end, AddrList)) of
SortedList = [_|_] ->
List = lists:map(
fun({_, Host, Port}) ->
{Host, Port}
end, lists:keysort(1, SortedList)),
?DEBUG("srv lookup of '~s': ~p~n", [Server, List]),
List;
_ ->
[{Server, outgoing_s2s_port()}]
end
end.
srv_lookup(Server) ->
Options = case ejabberd_config:get_local_option(s2s_dns_options) of
L when is_list(L) -> L;
_ -> []
end,
TimeoutMs = timer:seconds(proplists:get_value(timeout, Options, 10)),
Retries = proplists:get_value(retries, Options, 2),
srv_lookup(Server, TimeoutMs, Retries).
%% XXX - this behaviour is suboptimal in the case that the domain
%% has a "_xmpp-server._tcp." but not a "_jabber._tcp." record and
%% we don't get a DNS reply for the "_xmpp-server._tcp." lookup. In this
%% case we'll give up when we get the "_jabber._tcp." nxdomain reply.
srv_lookup(_Server, _Timeout, Retries) when Retries < 1 ->
{error, timeout};
srv_lookup(Server, Timeout, Retries) ->
case inet_res:getbyname("_xmpp-server._tcp." ++ Server, srv, Timeout) of
{error, _Reason} ->
case inet_res:getbyname("_jabber._tcp." ++ Server, srv, Timeout) of
{error, timeout} ->
?ERROR_MSG("The DNS servers~n ~p~ntimed out on request"
" for ~p IN SRV."
" You should check your DNS configuration.",
[inet_db:res_option(nameserver), Server]),
srv_lookup(Server, Timeout, Retries - 1);
R -> R
end;
{ok, _HEnt} = R -> R
end.
test_get_addr_port(Server) ->
lists:foldl(
fun(_, Acc) ->
[HostPort | _] = get_addr_port(Server),
case lists:keysearch(HostPort, 1, Acc) of
false ->
[{HostPort, 1} | Acc];
{value, {_, Num}} ->
lists:keyreplace(HostPort, 1, Acc, {HostPort, Num + 1})
end
end, [], lists:seq(1, 100000)).
get_addrs(Host, Family) ->
Type = case Family of
inet4 -> inet;
ipv4 -> inet;
inet6 -> inet6;
ipv6 -> inet6
end,
case inet:gethostbyname(Host, Type) of
{ok, #hostent{h_addr_list = Addrs}} ->
?DEBUG("~s of ~s resolved to: ~p~n", [Type, Host, Addrs]),
Addrs;
{error, Reason} ->
?DEBUG("~s lookup of '~s' failed: ~p~n", [Type, Host, Reason]),
[]
end.
outgoing_s2s_port() ->
case ejabberd_config:get_local_option(outgoing_s2s_port) of
Port when is_integer(Port) ->
Port;
undefined ->
5269
end.
outgoing_s2s_families() ->
case ejabberd_config:get_local_option(outgoing_s2s_options) of
{Families, _} when is_list(Families) ->
Families;
undefined ->
%% DISCUSSION: Why prefer IPv4 first?
%%
%% IPv4 connectivity will be available for everyone for
%% many years to come. So, there's absolutely no benefit
%% in preferring IPv6 connections which are flaky at best
%% nowadays.
%%
%% On the other hand content providers hesitate putting up
%% AAAA records for their sites due to the mentioned
%% quality of current IPv6 connectivity. Making IPv6 the a
%% `fallback' may avoid these problems elegantly.
[ipv4, ipv6]
end.
outgoing_s2s_timeout() ->
case ejabberd_config:get_local_option(outgoing_s2s_options) of
{_, Timeout} when is_integer(Timeout) ->
Timeout;
{_, infinity} ->
infinity;
undefined ->
%% 10 seconds
10000
end.
%% Human readable S2S logging: Log only new outgoing connections as INFO
%% Do not log dialback
log_s2s_out(false, _, _, _) -> ok;
%% Log new outgoing connections:
log_s2s_out(_, Myname, Server, Tls) ->
?INFO_MSG("Trying to open s2s connection: ~s -> ~s with TLS=~p", [Myname, Server, Tls]).
%% Calculate timeout depending on which state we are in:
%% Can return integer > 0 | infinity
get_timeout_interval(StateName) ->
case StateName of
%% Validation implies dialback: Networking can take longer:
wait_for_validation ->
?FSMTIMEOUT*6;
%% When stream is established, we only rely on S2S Timeout timer:
stream_established ->
infinity;
_ ->
?FSMTIMEOUT
end.
%% This function is intended to be called at the end of a state
%% function that want to wait for a reconnect delay before stopping.
wait_before_reconnect(StateData) ->
%% bounce queue manage by process and Erlang message queue
bounce_queue(StateData#state.queue, ?ERR_REMOTE_SERVER_NOT_FOUND),
bounce_messages(?ERR_REMOTE_SERVER_NOT_FOUND),
cancel_timer(StateData#state.timer),
Delay = case StateData#state.delay_to_retry of
undefined_delay ->
%% The initial delay is random between 1 and 15 seconds
%% Return a random integer between 1000 and 15000
{_, _, MicroSecs} = now(),
(MicroSecs rem 14000) + 1000;
D1 ->
%% Duplicate the delay with each successive failed
%% reconnection attempt, but don't exceed the max
lists:min([D1 * 2, get_max_retry_delay()])
end,
Timer = erlang:start_timer(Delay, self(), []),
{next_state, wait_before_retry, StateData#state{timer=Timer,
delay_to_retry = Delay,
queue = queue:new()}}.
%% @doc Get the maximum allowed delay for retry to reconnect (in miliseconds).
%% The default value is 5 minutes.
%% The option {s2s_max_retry_delay, Seconds} can be used (in seconds).
%% @spec () -> integer()
get_max_retry_delay() ->
case ejabberd_config:get_local_option(s2s_max_retry_delay) of
Seconds when is_integer(Seconds) ->
Seconds*1000;
_ ->
?MAX_RETRY_DELAY
end.
%% Terminate s2s_out connections that are in state wait_before_retry
terminate_if_waiting_delay(From, To) ->
FromTo = {From, To},
Pids = ejabberd_s2s:get_connections_pids(FromTo),
lists:foreach(
fun(Pid) ->
Pid ! terminate_if_waiting_before_retry
end,
Pids).
fsm_limit_opts() ->
case ejabberd_config:get_local_option(max_fsm_queue) of
N when is_integer(N) ->
[{max_queue, N}];
_ ->
[]
end.
ejabberd-2.1.11/src/configure.bat 0000664 0000000 0000000 00000000457 12240230175 013464 0 ustar
@if "x%1"=="x--help" goto usage
@set arg=dynamic
@if "x%1"=="x--static" set arg=static
@echo Configuring for %arg% build...
erlc configure.erl
erl -s configure -env arg %arg% -noshell
@goto end
:usage
@echo Usage: configure.bat
@echo or configure.bat --static
@echo or configure.bat --help
:end
ejabberd-2.1.11/src/ejabberd_s2s_in.erl 0000664 0000000 0000000 00000063412 12240230175 014532 0 ustar %%%----------------------------------------------------------------------
%%% File : ejabberd_s2s_in.erl
%%% Author : Alexey Shchepin
%%% Purpose : Serve incoming s2s connection
%%% Created : 6 Dec 2002 by Alexey Shchepin
%%%
%%%
%%% ejabberd, Copyright (C) 2002-2012 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
%%% published by the Free Software Foundation; either version 2 of the
%%% License, or (at your option) any later version.
%%%
%%% This program is distributed in the hope that it will be useful,
%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
%%% General Public License for more details.
%%%
%%% You should have received a copy of the GNU General Public License
%%% along with this program; if not, write to the Free Software
%%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
%%% 02111-1307 USA
%%%
%%%----------------------------------------------------------------------
-module(ejabberd_s2s_in).
-author('alexey@process-one.net').
-behaviour(p1_fsm).
%% External exports
-export([start/2,
start_link/2,
match_domain/2,
socket_type/0]).
%% gen_fsm callbacks
-export([init/1,
wait_for_stream/2,
wait_for_feature_request/2,
stream_established/2,
handle_event/3,
handle_sync_event/4,
code_change/4,
handle_info/3,
print_state/1,
terminate/3]).
-include("ejabberd.hrl").
-include("jlib.hrl").
-ifdef(SSL40).
-include_lib("public_key/include/public_key.hrl").
-define(PKIXEXPLICIT, 'OTP-PUB-KEY').
-define(PKIXIMPLICIT, 'OTP-PUB-KEY').
-else.
-ifdef(SSL39).
-include_lib("ssl/include/ssl_pkix.hrl").
-define(PKIXEXPLICIT, 'OTP-PKIX').
-define(PKIXIMPLICIT, 'OTP-PKIX').
-else.
-include_lib("ssl/include/PKIX1Explicit88.hrl").
-include_lib("ssl/include/PKIX1Implicit88.hrl").
-define(PKIXEXPLICIT, 'PKIX1Explicit88').
-define(PKIXIMPLICIT, 'PKIX1Implicit88').
-endif.
-endif.
-include("XmppAddr.hrl").
-define(DICT, dict).
-record(state, {socket,
sockmod,
streamid,
shaper,
tls = false,
tls_enabled = false,
tls_required = false,
tls_certverify = false,
tls_options = [],
server,
authenticated = false,
auth_domain,
connections = ?DICT:new(),
timer}).
%-define(DBGFSM, true).
-ifdef(DBGFSM).
-define(FSMOPTS, [{debug, [trace]}]).
-else.
-define(FSMOPTS, []).
-endif.
-define(FSMLIMITS, [{max_queue, 2000}]). %% if queue grows more than this, we shutdown this connection.
%% Module start with or without supervisor:
-ifdef(NO_TRANSIENT_SUPERVISORS).
-define(SUPERVISOR_START, p1_fsm:start(ejabberd_s2s_in, [SockData, Opts],
?FSMOPTS ++ ?FSMLIMITS)).
-else.
-define(SUPERVISOR_START, supervisor:start_child(ejabberd_s2s_in_sup,
[SockData, Opts])).
-endif.
-define(STREAM_HEADER(Version),
(""
"")
).
-define(STREAM_TRAILER, " ").
-define(INVALID_NAMESPACE_ERR,
xml:element_to_string(?SERR_INVALID_NAMESPACE)).
-define(HOST_UNKNOWN_ERR,
xml:element_to_string(?SERR_HOST_UNKNOWN)).
-define(INVALID_FROM_ERR,
xml:element_to_string(?SERR_INVALID_FROM)).
-define(INVALID_XML_ERR,
xml:element_to_string(?SERR_XML_NOT_WELL_FORMED)).
%%%----------------------------------------------------------------------
%%% API
%%%----------------------------------------------------------------------
start(SockData, Opts) ->
?SUPERVISOR_START.
start_link(SockData, Opts) ->
p1_fsm:start_link(ejabberd_s2s_in, [SockData, Opts], ?FSMOPTS ++ ?FSMLIMITS).
socket_type() ->
xml_stream.
%%%----------------------------------------------------------------------
%%% Callback functions from gen_fsm
%%%----------------------------------------------------------------------
%%----------------------------------------------------------------------
%% Func: init/1
%% Returns: {ok, StateName, StateData} |
%% {ok, StateName, StateData, Timeout} |
%% ignore |
%% {stop, StopReason}
%%----------------------------------------------------------------------
init([{SockMod, Socket}, Opts]) ->
?DEBUG("started: ~p", [{SockMod, Socket}]),
Shaper = case lists:keysearch(shaper, 1, Opts) of
{value, {_, S}} -> S;
_ -> none
end,
{StartTLS, TLSRequired, TLSCertverify} = case ejabberd_config:get_local_option(s2s_use_starttls) of
UseTls when (UseTls==undefined) or (UseTls==false) ->
{false, false, false};
UseTls when (UseTls==true) or (UseTls==optional) ->
{true, false, false};
required ->
{true, true, false};
required_trusted ->
{true, true, true}
end,
TLSOpts = case ejabberd_config:get_local_option(s2s_certfile) of
undefined ->
[];
CertFile ->
[{certfile, CertFile}]
end,
Timer = erlang:start_timer(?S2STIMEOUT, self(), []),
{ok, wait_for_stream,
#state{socket = Socket,
sockmod = SockMod,
streamid = new_id(),
shaper = Shaper,
tls = StartTLS,
tls_enabled = false,
tls_required = TLSRequired,
tls_certverify = TLSCertverify,
tls_options = TLSOpts,
timer = Timer}}.
%%----------------------------------------------------------------------
%% Func: StateName/2
%% Returns: {next_state, NextStateName, NextStateData} |
%% {next_state, NextStateName, NextStateData, Timeout} |
%% {stop, Reason, NewStateData}
%%----------------------------------------------------------------------
wait_for_stream({xmlstreamstart, _Name, Attrs}, StateData) ->
case {xml:get_attr_s("xmlns", Attrs),
xml:get_attr_s("xmlns:db", Attrs),
xml:get_attr_s("to", Attrs),
xml:get_attr_s("version", Attrs) == "1.0"} of
{"jabber:server", _, Server, true} when
StateData#state.tls and (not StateData#state.authenticated) ->
send_text(StateData, ?STREAM_HEADER(" version='1.0'")),
SASL =
if
StateData#state.tls_enabled ->
case (StateData#state.sockmod):get_peer_certificate(
StateData#state.socket) of
{ok, Cert} ->
case (StateData#state.sockmod):get_verify_result(StateData#state.socket) of
0 ->
[{xmlelement, "mechanisms",
[{"xmlns", ?NS_SASL}],
[{xmlelement, "mechanism", [],
[{xmlcdata, "EXTERNAL"}]}]}];
CertVerifyRes ->
case StateData#state.tls_certverify of
true -> {error_cert_verif, CertVerifyRes, Cert};
false -> []
end
end;
error ->
[]
end;
true ->
[]
end,
StartTLS = if
StateData#state.tls_enabled ->
[];
(not StateData#state.tls_enabled) and (not StateData#state.tls_required) ->
[{xmlelement, "starttls", [{"xmlns", ?NS_TLS}], []}];
(not StateData#state.tls_enabled) and StateData#state.tls_required ->
[{xmlelement, "starttls", [{"xmlns", ?NS_TLS}],
[{xmlelement, "required", [], []}]
}]
end,
case SASL of
{error_cert_verif, CertVerifyResult, Certificate} ->
CertError = tls:get_cert_verify_string(CertVerifyResult, Certificate),
RemoteServer = xml:get_attr_s("from", Attrs),
?INFO_MSG("Closing s2s connection: ~s <--> ~s (~s)", [StateData#state.server, RemoteServer, CertError]),
send_text(StateData, xml:element_to_string(?SERRT_POLICY_VIOLATION("en", CertError))),
{atomic, Pid} = ejabberd_s2s:find_connection(jlib:make_jid("", Server, ""), jlib:make_jid("", RemoteServer, "")),
ejabberd_s2s_out:stop_connection(Pid),
{stop, normal, StateData};
_ ->
send_element(StateData,
{xmlelement, "stream:features", [],
SASL ++ StartTLS ++
ejabberd_hooks:run_fold(
s2s_stream_features,
Server,
[], [Server])}),
{next_state, wait_for_feature_request, StateData#state{server = Server}}
end;
{"jabber:server", _, Server, true} when
StateData#state.authenticated ->
send_text(StateData, ?STREAM_HEADER(" version='1.0'")),
send_element(StateData,
{xmlelement, "stream:features", [],
ejabberd_hooks:run_fold(
s2s_stream_features,
Server,
[], [Server])}),
{next_state, stream_established, StateData};
{"jabber:server", "jabber:server:dialback", _Server, _} ->
send_text(StateData, ?STREAM_HEADER("")),
{next_state, stream_established, StateData};
_ ->
send_text(StateData, ?INVALID_NAMESPACE_ERR),
{stop, normal, StateData}
end;
wait_for_stream({xmlstreamerror, _}, StateData) ->
send_text(StateData,
?STREAM_HEADER("") ++ ?INVALID_XML_ERR ++ ?STREAM_TRAILER),
{stop, normal, StateData};
wait_for_stream(timeout, StateData) ->
{stop, normal, StateData};
wait_for_stream(closed, StateData) ->
{stop, normal, StateData}.
wait_for_feature_request({xmlstreamelement, El}, StateData) ->
{xmlelement, Name, Attrs, Els} = El,
TLS = StateData#state.tls,
TLSEnabled = StateData#state.tls_enabled,
SockMod = (StateData#state.sockmod):get_sockmod(StateData#state.socket),
case {xml:get_attr_s("xmlns", Attrs), Name} of
{?NS_TLS, "starttls"} when TLS == true,
TLSEnabled == false,
SockMod == gen_tcp ->
?DEBUG("starttls", []),
Socket = StateData#state.socket,
TLSOpts = case ejabberd_config:get_local_option(
{domain_certfile,
StateData#state.server}) of
undefined ->
StateData#state.tls_options;
CertFile ->
[{certfile, CertFile} |
lists:keydelete(
certfile, 1,
StateData#state.tls_options)]
end,
TLSSocket = (StateData#state.sockmod):starttls(
Socket, TLSOpts,
xml:element_to_binary(
{xmlelement, "proceed", [{"xmlns", ?NS_TLS}], []})),
{next_state, wait_for_stream,
StateData#state{socket = TLSSocket,
streamid = new_id(),
tls_enabled = true,
tls_options = TLSOpts
}};
{?NS_SASL, "auth"} when TLSEnabled ->
Mech = xml:get_attr_s("mechanism", Attrs),
case Mech of
"EXTERNAL" ->
Auth = jlib:decode_base64(xml:get_cdata(Els)),
AuthDomain = jlib:nameprep(Auth),
AuthRes =
case (StateData#state.sockmod):get_peer_certificate(
StateData#state.socket) of
{ok, Cert} ->
case (StateData#state.sockmod):get_verify_result(
StateData#state.socket) of
0 ->
case AuthDomain of
error ->
false;
_ ->
case idna:domain_utf8_to_ascii(AuthDomain) of
false ->
false;
PCAuthDomain ->
lists:any(
fun(D) ->
match_domain(
PCAuthDomain, D)
end, get_cert_domains(Cert))
end
end;
_ ->
false
end;
error ->
false
end,
AllowRemoteHost = ejabberd_s2s:allow_host("", AuthDomain),
if
AuthRes andalso AllowRemoteHost ->
(StateData#state.sockmod):reset_stream(
StateData#state.socket),
send_element(StateData,
{xmlelement, "success",
[{"xmlns", ?NS_SASL}], []}),
?DEBUG("(~w) Accepted s2s authentication for ~s",
[StateData#state.socket, AuthDomain]),
%% acess rules are first checked against the globally defined ones, that have precedence over
%% domain-specific ones.. http://www.process-one.net/docs/ejabberd/guide_en.html#AccessRights
%% since there is allways a shaper defined globally for s2s, it doesn't matter the actual
%% local host, since the globall one will be used, even if this domain has a special rule
change_shaper(StateData, "", jlib:make_jid("", AuthDomain, "")),
{next_state, wait_for_stream,
StateData#state{streamid = new_id(),
authenticated = true,
auth_domain = AuthDomain
}};
true ->
send_element(StateData,
{xmlelement, "failure",
[{"xmlns", ?NS_SASL}], []}),
send_text(StateData, ?STREAM_TRAILER),
{stop, normal, StateData}
end;
_ ->
send_element(StateData,
{xmlelement, "failure",
[{"xmlns", ?NS_SASL}],
[{xmlelement, "invalid-mechanism", [], []}]}),
{stop, normal, StateData}
end;
_ ->
stream_established({xmlstreamelement, El}, StateData)
end;
wait_for_feature_request({xmlstreamend, _Name}, StateData) ->
send_text(StateData, ?STREAM_TRAILER),
{stop, normal, StateData};
wait_for_feature_request({xmlstreamerror, _}, StateData) ->
send_text(StateData, ?INVALID_XML_ERR ++ ?STREAM_TRAILER),
{stop, normal, StateData};
wait_for_feature_request(closed, StateData) ->
{stop, normal, StateData}.
stream_established({xmlstreamelement, El}, StateData) ->
cancel_timer(StateData#state.timer),
Timer = erlang:start_timer(?S2STIMEOUT, self(), []),
case is_key_packet(El) of
{key, To, From, Id, Key} ->
?DEBUG("GET KEY: ~p", [{To, From, Id, Key}]),
LTo = jlib:nameprep(To),
LFrom = jlib:nameprep(From),
%% Checks if the from domain is allowed and if the to
%% domain is handled by this server:
case {ejabberd_s2s:allow_host(LTo, LFrom),
lists:member(LTo, ejabberd_router:dirty_get_all_domains())} of
{true, true} ->
ejabberd_s2s_out:terminate_if_waiting_delay(LTo, LFrom),
ejabberd_s2s_out:start(LTo, LFrom,
{verify, self(),
Key, StateData#state.streamid}),
Conns = ?DICT:store({LFrom, LTo}, wait_for_verification,
StateData#state.connections),
change_shaper(StateData, LTo, jlib:make_jid("", LFrom, "")),
{next_state,
stream_established,
StateData#state{connections = Conns,
timer = Timer}};
{_, false} ->
send_text(StateData, ?HOST_UNKNOWN_ERR),
{stop, normal, StateData};
{false, _} ->
send_text(StateData, ?INVALID_FROM_ERR),
{stop, normal, StateData}
end;
{verify, To, From, Id, Key} ->
?DEBUG("VERIFY KEY: ~p", [{To, From, Id, Key}]),
LTo = jlib:nameprep(To),
LFrom = jlib:nameprep(From),
Type = case ejabberd_s2s:has_key({LTo, LFrom}, Key) of
true -> "valid";
_ -> "invalid"
end,
%Type = if Key == Key1 -> "valid";
% true -> "invalid"
% end,
send_element(StateData,
{xmlelement,
"db:verify",
[{"from", To},
{"to", From},
{"id", Id},
{"type", Type}],
[]}),
{next_state, stream_established, StateData#state{timer = Timer}};
_ ->
NewEl = jlib:remove_attr("xmlns", El),
{xmlelement, Name, Attrs, _Els} = NewEl,
From_s = xml:get_attr_s("from", Attrs),
From = jlib:string_to_jid(From_s),
To_s = xml:get_attr_s("to", Attrs),
To = jlib:string_to_jid(To_s),
if
(To /= error) and (From /= error) ->
LFrom = From#jid.lserver,
LTo = To#jid.lserver,
if
StateData#state.authenticated ->
case (LFrom == StateData#state.auth_domain)
andalso
lists:member(
LTo,
ejabberd_router:dirty_get_all_domains()) of
true ->
if ((Name == "iq") or
(Name == "message") or
(Name == "presence")) ->
ejabberd_hooks:run(
s2s_receive_packet,
LTo,
[From, To, NewEl]),
ejabberd_router:route(
From, To, NewEl);
true ->
error
end;
false ->
error
end;
true ->
case ?DICT:find({LFrom, LTo},
StateData#state.connections) of
{ok, established} ->
if ((Name == "iq") or
(Name == "message") or
(Name == "presence")) ->
ejabberd_hooks:run(
s2s_receive_packet,
LTo,
[From, To, NewEl]),
ejabberd_router:route(
From, To, NewEl);
true ->
error
end;
_ ->
error
end
end;
true ->
error
end,
ejabberd_hooks:run(s2s_loop_debug, [{xmlstreamelement, El}]),
{next_state, stream_established, StateData#state{timer = Timer}}
end;
stream_established({valid, From, To}, StateData) ->
send_element(StateData,
{xmlelement,
"db:result",
[{"from", To},
{"to", From},
{"type", "valid"}],
[]}),
LFrom = jlib:nameprep(From),
LTo = jlib:nameprep(To),
NSD = StateData#state{
connections = ?DICT:store({LFrom, LTo}, established,
StateData#state.connections)},
{next_state, stream_established, NSD};
stream_established({invalid, From, To}, StateData) ->
send_element(StateData,
{xmlelement,
"db:result",
[{"from", To},
{"to", From},
{"type", "invalid"}],
[]}),
LFrom = jlib:nameprep(From),
LTo = jlib:nameprep(To),
NSD = StateData#state{
connections = ?DICT:erase({LFrom, LTo},
StateData#state.connections)},
{next_state, stream_established, NSD};
stream_established({xmlstreamend, _Name}, StateData) ->
{stop, normal, StateData};
stream_established({xmlstreamerror, _}, StateData) ->
send_text(StateData,
?INVALID_XML_ERR ++ ?STREAM_TRAILER),
{stop, normal, StateData};
stream_established(timeout, StateData) ->
{stop, normal, StateData};
stream_established(closed, StateData) ->
{stop, normal, StateData}.
%%----------------------------------------------------------------------
%% Func: StateName/3
%% Returns: {next_state, NextStateName, NextStateData} |
%% {next_state, NextStateName, NextStateData, Timeout} |
%% {reply, Reply, NextStateName, NextStateData} |
%% {reply, Reply, NextStateName, NextStateData, Timeout} |
%% {stop, Reason, NewStateData} |
%% {stop, Reason, Reply, NewStateData}
%%----------------------------------------------------------------------
%state_name(Event, From, StateData) ->
% Reply = ok,
% {reply, Reply, state_name, StateData}.
%%----------------------------------------------------------------------
%% Func: handle_event/3
%% Returns: {next_state, NextStateName, NextStateData} |
%% {next_state, NextStateName, NextStateData, Timeout} |
%% {stop, Reason, NewStateData}
%%----------------------------------------------------------------------
handle_event(_Event, StateName, StateData) ->
{next_state, StateName, StateData}.
%%----------------------------------------------------------------------
%% Func: handle_sync_event/4
%% Returns: The associated StateData for this connection
%% {reply, Reply, NextStateName, NextStateData}
%% Reply = {state_infos, [{InfoName::atom(), InfoValue::any()]
%%----------------------------------------------------------------------
handle_sync_event(get_state_infos, _From, StateName, StateData) ->
SockMod = StateData#state.sockmod,
{Addr,Port} = try SockMod:peername(StateData#state.socket) of
{ok, {A,P}} -> {A,P};
{error, _} -> {unknown,unknown}
catch
_:_ -> {unknown,unknown}
end,
Domains = get_external_hosts(StateData),
Infos = [
{direction, in},
{statename, StateName},
{addr, Addr},
{port, Port},
{streamid, StateData#state.streamid},
{tls, StateData#state.tls},
{tls_enabled, StateData#state.tls_enabled},
{tls_options, StateData#state.tls_options},
{authenticated, StateData#state.authenticated},
{shaper, StateData#state.shaper},
{sockmod, SockMod},
{domains, Domains}
],
Reply = {state_infos, Infos},
{reply,Reply,StateName,StateData};
%%----------------------------------------------------------------------
%% Func: handle_sync_event/4
%% Returns: {next_state, NextStateName, NextStateData} |
%% {next_state, NextStateName, NextStateData, Timeout} |
%% {reply, Reply, NextStateName, NextStateData} |
%% {reply, Reply, NextStateName, NextStateData, Timeout} |
%% {stop, Reason, NewStateData} |
%% {stop, Reason, Reply, NewStateData}
%%----------------------------------------------------------------------
handle_sync_event(_Event, _From, StateName, StateData) ->
Reply = ok,
{reply, Reply, StateName, StateData}.
code_change(_OldVsn, StateName, StateData, _Extra) ->
{ok, StateName, StateData}.
%%----------------------------------------------------------------------
%% Func: handle_info/3
%% Returns: {next_state, NextStateName, NextStateData} |
%% {next_state, NextStateName, NextStateData, Timeout} |
%% {stop, Reason, NewStateData}
%%----------------------------------------------------------------------
handle_info({send_text, Text}, StateName, StateData) ->
send_text(StateData, Text),
{next_state, StateName, StateData};
handle_info({timeout, Timer, _}, _StateName,
#state{timer = Timer} = StateData) ->
{stop, normal, StateData};
handle_info(_, StateName, StateData) ->
{next_state, StateName, StateData}.
%%----------------------------------------------------------------------
%% Func: terminate/3
%% Purpose: Shutdown the fsm
%% Returns: any
%%----------------------------------------------------------------------
terminate(Reason, _StateName, StateData) ->
?DEBUG("terminated: ~p", [Reason]),
case Reason of
{process_limit, _} ->
[ejabberd_s2s:external_host_overloaded(Host) || Host <- get_external_hosts(StateData)];
_ ->
ok
end,
(StateData#state.sockmod):close(StateData#state.socket),
ok.
get_external_hosts(StateData) ->
case StateData#state.authenticated of
true ->
[StateData#state.auth_domain];
false ->
Connections = StateData#state.connections,
[D || {{D, _}, established} <- dict:to_list(Connections)]
end.
%%----------------------------------------------------------------------
%% Func: print_state/1
%% Purpose: Prepare the state to be printed on error log
%% Returns: State to print
%%----------------------------------------------------------------------
print_state(State) ->
State.
%%%----------------------------------------------------------------------
%%% Internal functions
%%%----------------------------------------------------------------------
send_text(StateData, Text) ->
(StateData#state.sockmod):send(StateData#state.socket, Text).
send_element(StateData, El) ->
send_text(StateData, xml:element_to_binary(El)).
change_shaper(StateData, Host, JID) ->
Shaper = acl:match_rule(Host, StateData#state.shaper, JID),
(StateData#state.sockmod):change_shaper(StateData#state.socket, Shaper).
new_id() ->
randoms:get_string().
cancel_timer(Timer) ->
erlang:cancel_timer(Timer),
receive
{timeout, Timer, _} ->
ok
after 0 ->
ok
end.
is_key_packet({xmlelement, Name, Attrs, Els}) when Name == "db:result" ->
{key,
xml:get_attr_s("to", Attrs),
xml:get_attr_s("from", Attrs),
xml:get_attr_s("id", Attrs),
xml:get_cdata(Els)};
is_key_packet({xmlelement, Name, Attrs, Els}) when Name == "db:verify" ->
{verify,
xml:get_attr_s("to", Attrs),
xml:get_attr_s("from", Attrs),
xml:get_attr_s("id", Attrs),
xml:get_cdata(Els)};
is_key_packet(_) ->
false.
get_cert_domains(Cert) ->
{rdnSequence, Subject} =
(Cert#'Certificate'.tbsCertificate)#'TBSCertificate'.subject,
Extensions =
(Cert#'Certificate'.tbsCertificate)#'TBSCertificate'.extensions,
lists:flatmap(
fun(#'AttributeTypeAndValue'{type = ?'id-at-commonName',
value = Val}) ->
case ?PKIXEXPLICIT:decode('X520CommonName', Val) of
{ok, {_, D1}} ->
D = if
is_list(D1) -> D1;
is_binary(D1) -> binary_to_list(D1);
true -> error
end,
if
D /= error ->
case jlib:string_to_jid(D) of
#jid{luser = "",
lserver = LD,
lresource = ""} ->
[LD];
_ ->
[]
end;
true ->
[]
end;
_ ->
[]
end;
(_) ->
[]
end, lists:flatten(Subject)) ++
lists:flatmap(
fun(#'Extension'{extnID = ?'id-ce-subjectAltName',
extnValue = Val}) ->
BVal = if
is_list(Val) -> list_to_binary(Val);
is_binary(Val) -> Val;
true -> Val
end,
case ?PKIXIMPLICIT:decode('SubjectAltName', BVal) of
{ok, SANs} ->
lists:flatmap(
fun({otherName,
#'AnotherName'{'type-id' = ?'id-on-xmppAddr',
value = XmppAddr
}}) ->
case 'XmppAddr':decode(
'XmppAddr', XmppAddr) of
{ok, D} when is_binary(D) ->
case jlib:string_to_jid(
binary_to_list(D)) of
#jid{luser = "",
lserver = LD,
lresource = ""} ->
case idna:domain_utf8_to_ascii(LD) of
false ->
[];
PCLD ->
[PCLD]
end;
_ ->
[]
end;
_ ->
[]
end;
({dNSName, D}) when is_list(D) ->
case jlib:string_to_jid(D) of
#jid{luser = "",
lserver = LD,
lresource = ""} ->
[LD];
_ ->
[]
end;
(_) ->
[]
end, SANs);
_ ->
[]
end;
(_) ->
[]
end, Extensions).
match_domain(Domain, Domain) ->
true;
match_domain(Domain, Pattern) ->
DLabels = string:tokens(Domain, "."),
PLabels = string:tokens(Pattern, "."),
match_labels(DLabels, PLabels).
match_labels([], []) ->
true;
match_labels([], [_ | _]) ->
false;
match_labels([_ | _], []) ->
false;
match_labels([DL | DLabels], [PL | PLabels]) ->
case lists:all(fun(C) -> (($a =< C) andalso (C =< $z))
orelse (($0 =< C) andalso (C =< $9))
orelse (C == $-) orelse (C == $*)
end, PL) of
true ->
Regexp = ejabberd_regexp:sh_to_awk(PL),
case ejabberd_regexp:run(DL, Regexp) of
match ->
match_labels(DLabels, PLabels);
nomatch ->
false
end;
false ->
false
end.
ejabberd-2.1.11/src/gen_iq_handler.erl 0000664 0000000 0000000 00000016016 12240230175 014454 0 ustar %%%----------------------------------------------------------------------
%%% File : gen_iq_handler.erl
%%% Author : Alexey Shchepin
%%% Purpose : IQ handler support
%%% Created : 22 Jan 2003 by Alexey Shchepin
%%%
%%%
%%% ejabberd, Copyright (C) 2002-2012 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
%%% published by the Free Software Foundation; either version 2 of the
%%% License, or (at your option) any later version.
%%%
%%% This program is distributed in the hope that it will be useful,
%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
%%% General Public License for more details.
%%%
%%% You should have received a copy of the GNU General Public License
%%% along with this program; if not, write to the Free Software
%%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
%%% 02111-1307 USA
%%%
%%%----------------------------------------------------------------------
-module(gen_iq_handler).
-author('alexey@process-one.net').
-behaviour(gen_server).
%% API
-export([start_link/3,
add_iq_handler/6,
remove_iq_handler/3,
stop_iq_handler/3,
handle/7,
process_iq/6]).
%% gen_server callbacks
-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
terminate/2, code_change/3]).
-include("ejabberd.hrl").
-record(state, {host,
module,
function}).
%%====================================================================
%% API
%%====================================================================
%%--------------------------------------------------------------------
%% Function: start_link() -> {ok,Pid} | ignore | {error,Error}
%% Description: Starts the server
%%--------------------------------------------------------------------
start_link(Host, Module, Function) ->
gen_server:start_link(?MODULE, [Host, Module, Function], []).
add_iq_handler(Component, Host, NS, Module, Function, Type) ->
case Type of
no_queue ->
Component:register_iq_handler(Host, NS, Module, Function, no_queue);
one_queue ->
{ok, Pid} = supervisor:start_child(ejabberd_iq_sup,
[Host, Module, Function]),
Component:register_iq_handler(Host, NS, Module, Function,
{one_queue, Pid});
{queues, N} ->
Pids =
lists:map(
fun(_) ->
{ok, Pid} = supervisor:start_child(
ejabberd_iq_sup,
[Host, Module, Function]),
Pid
end, lists:seq(1, N)),
Component:register_iq_handler(Host, NS, Module, Function,
{queues, Pids});
parallel ->
Component:register_iq_handler(Host, NS, Module, Function, parallel)
end.
remove_iq_handler(Component, Host, NS) ->
Component:unregister_iq_handler(Host, NS).
stop_iq_handler(_Module, _Function, Opts) ->
case Opts of
{one_queue, Pid} ->
gen_server:call(Pid, stop);
{queues, Pids} ->
lists:foreach(fun(Pid) ->
catch gen_server:call(Pid, stop)
end, Pids);
_ ->
ok
end.
handle(Host, Module, Function, Opts, From, To, IQ) ->
case Opts of
no_queue ->
process_iq(Host, Module, Function, From, To, IQ);
{one_queue, Pid} ->
Pid ! {process_iq, From, To, IQ};
{queues, Pids} ->
Pid = lists:nth(erlang:phash(now(), length(Pids)), Pids),
Pid ! {process_iq, From, To, IQ};
parallel ->
spawn(?MODULE, process_iq, [Host, Module, Function, From, To, IQ]);
_ ->
todo
end.
process_iq(_Host, Module, Function, From, To, IQ) ->
case catch Module:Function(From, To, IQ) of
{'EXIT', Reason} ->
?ERROR_MSG("~p", [Reason]);
ResIQ ->
if
ResIQ /= ignore ->
ejabberd_router:route(To, From,
jlib:iq_to_xml(ResIQ));
true ->
ok
end
end.
%%====================================================================
%% gen_server callbacks
%%====================================================================
%%--------------------------------------------------------------------
%% Function: init(Args) -> {ok, State} |
%% {ok, State, Timeout} |
%% ignore |
%% {stop, Reason}
%% Description: Initiates the server
%%--------------------------------------------------------------------
init([Host, Module, Function]) ->
{ok, #state{host = Host,
module = Module,
function = Function}}.
%%--------------------------------------------------------------------
%% Function: %% handle_call(Request, From, State) -> {reply, Reply, State} |
%% {reply, Reply, State, Timeout} |
%% {noreply, State} |
%% {noreply, State, Timeout} |
%% {stop, Reason, Reply, State} |
%% {stop, Reason, State}
%% Description: Handling call messages
%%--------------------------------------------------------------------
handle_call(stop, _From, State) ->
Reply = ok,
{stop, normal, Reply, State}.
%%--------------------------------------------------------------------
%% Function: handle_cast(Msg, State) -> {noreply, State} |
%% {noreply, State, Timeout} |
%% {stop, Reason, State}
%% Description: Handling cast messages
%%--------------------------------------------------------------------
handle_cast(_Msg, State) ->
{noreply, State}.
%%--------------------------------------------------------------------
%% Function: handle_info(Info, State) -> {noreply, State} |
%% {noreply, State, Timeout} |
%% {stop, Reason, State}
%% Description: Handling all non call/cast messages
%%--------------------------------------------------------------------
handle_info({process_iq, From, To, IQ},
#state{host = Host,
module = Module,
function = Function} = State) ->
process_iq(Host, Module, Function, From, To, IQ),
{noreply, State};
handle_info(_Info, State) ->
{noreply, State}.
%%--------------------------------------------------------------------
%% Function: terminate(Reason, State) -> void()
%% Description: This function is called by a gen_server when it is about to
%% terminate. It should be the opposite of Module:init/1 and do any necessary
%% cleaning up. When it returns, the gen_server terminates with Reason.
%% The return value is ignored.
%%--------------------------------------------------------------------
terminate(_Reason, _State) ->
ok.
%%--------------------------------------------------------------------
%% Func: code_change(OldVsn, State, Extra) -> {ok, NewState}
%% Description: Convert process state when code is changed
%%--------------------------------------------------------------------
code_change(_OldVsn, State, _Extra) ->
{ok, State}.
%%--------------------------------------------------------------------
%%% Internal functions
%%--------------------------------------------------------------------
ejabberd-2.1.11/src/tls/ 0000775 0000000 0000000 00000000000 12240452476 011621 5 ustar ejabberd-2.1.11/src/tls/tls.erl 0000664 0000000 0000000 00000026446 12240230175 013131 0 ustar %%%----------------------------------------------------------------------
%%% File : tls.erl
%%% Author : Alexey Shchepin
%%% Purpose : Interface to openssl
%%% Created : 24 Jul 2004 by Alexey Shchepin
%%%
%%%
%%% ejabberd, Copyright (C) 2002-2012 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
%%% published by the Free Software Foundation; either version 2 of the
%%% License, or (at your option) any later version.
%%%
%%% This program is distributed in the hope that it will be useful,
%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
%%% General Public License for more details.
%%%
%%% You should have received a copy of the GNU General Public License
%%% along with this program; if not, write to the Free Software
%%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
%%% 02111-1307 USA
%%%
%%%----------------------------------------------------------------------
-module(tls).
-author('alexey@process-one.net').
-behaviour(gen_server).
-export([start/0, start_link/0,
tcp_to_tls/2, tls_to_tcp/1,
send/2,
recv/2, recv/3,
recv_data/2,
setopts/2,
sockname/1, peername/1,
controlling_process/2,
close/1,
get_peer_certificate/1,
get_verify_result/1,
get_cert_verify_string/2,
test/0]).
%% Internal exports, call-back functions.
-export([init/1,
handle_call/3,
handle_cast/2,
handle_info/2,
code_change/3,
terminate/2]).
-include("ejabberd.hrl").
-define(SET_CERTIFICATE_FILE_ACCEPT, 1).
-define(SET_CERTIFICATE_FILE_CONNECT, 2).
-define(SET_ENCRYPTED_INPUT, 3).
-define(SET_DECRYPTED_OUTPUT, 4).
-define(GET_ENCRYPTED_OUTPUT, 5).
-define(GET_DECRYPTED_INPUT, 6).
-define(GET_PEER_CERTIFICATE, 7).
-define(GET_VERIFY_RESULT, 8).
-define(VERIFY_NONE, 16#10000).
-ifdef(SSL40).
-define(CERT_DECODE, {public_key, pkix_decode_cert, plain}).
-define(CERT_SELFSIGNED, {public_key, pkix_is_self_signed}).
-else.
-define(CERT_DECODE, {ssl_pkix, decode_cert, [pkix]}).
-define(CERT_SELFSIGNED, {erlang, is_atom}). %% Dummy function for old OTPs
-endif.
-record(tlssock, {tcpsock, tlsport}).
start() ->
gen_server:start({local, ?MODULE}, ?MODULE, [], []).
start_link() ->
gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
init([]) ->
case erl_ddll:load_driver(ejabberd:get_so_path(), tls_drv) of
ok -> ok;
{error, already_loaded} -> ok
end,
Port = open_port({spawn, "tls_drv"}, [binary]),
Res = port_control(Port, ?SET_CERTIFICATE_FILE_ACCEPT, "./ssl.pem" ++ [0]),
case Res of
<<0>> ->
%ets:new(iconv_table, [set, public, named_table]),
%ets:insert(iconv_table, {port, Port}),
{ok, Port};
<<1, Error/binary>> ->
{error, binary_to_list(Error)}
end.
%%% --------------------------------------------------------
%%% The call-back functions.
%%% --------------------------------------------------------
handle_call(_, _, State) ->
{noreply, State}.
handle_cast(_, State) ->
{noreply, State}.
handle_info({'EXIT', Port, Reason}, Port) ->
{stop, {port_died, Reason}, Port};
handle_info({'EXIT', _Pid, _Reason}, Port) ->
{noreply, Port};
handle_info(_, State) ->
{noreply, State}.
code_change(_OldVsn, State, _Extra) ->
{ok, State}.
terminate(_Reason, Port) ->
Port ! {self, close},
ok.
tcp_to_tls(TCPSocket, Options) ->
case lists:keysearch(certfile, 1, Options) of
{value, {certfile, CertFile}} ->
case erl_ddll:load_driver(ejabberd:get_so_path(), tls_drv) of
ok -> ok;
{error, already_loaded} -> ok
end,
Port = open_port({spawn, "tls_drv"}, [binary]),
Flags =
case lists:member(verify_none, Options) of
true ->
?VERIFY_NONE;
false ->
0
end,
Command = case lists:member(connect, Options) of
true ->
?SET_CERTIFICATE_FILE_CONNECT;
false ->
?SET_CERTIFICATE_FILE_ACCEPT
end,
case port_control(Port, Command bor Flags, CertFile ++ [0]) of
<<0>> ->
{ok, #tlssock{tcpsock = TCPSocket, tlsport = Port}};
<<1, Error/binary>> ->
{error, binary_to_list(Error)}
end;
false ->
{error, no_certfile}
end.
tls_to_tcp(#tlssock{tcpsock = TCPSocket, tlsport = Port}) ->
port_close(Port),
TCPSocket.
recv(Socket, Length) ->
recv(Socket, Length, infinity).
recv(#tlssock{tcpsock = TCPSocket, tlsport = Port} = TLSSock,
Length, Timeout) ->
case port_control(Port, ?GET_DECRYPTED_INPUT, <>) of
<<0>> ->
case gen_tcp:recv(TCPSocket, 0, Timeout) of
{ok, Packet} ->
recv_data(TLSSock, Packet, Length);
{error, _Reason} = Error ->
Error
end;
<<0, In/binary>> ->
{ok, In};
<<1, Error/binary>> ->
{error, binary_to_list(Error)}
end.
recv_data(TLSSock, Packet) ->
recv_data(TLSSock, Packet, 0).
recv_data(TLSSock, Packet, Length) ->
case catch recv_data1(TLSSock, Packet, Length) of
{'EXIT', Reason} ->
{error, Reason};
Res ->
Res
end.
recv_data1(#tlssock{tcpsock = TCPSocket, tlsport = Port}, Packet, Length) ->
case port_control(Port, ?SET_ENCRYPTED_INPUT, Packet) of
<<0>> ->
case port_control(Port, ?GET_DECRYPTED_INPUT, <>) of
<<0, In/binary>> ->
case port_control(Port, ?GET_ENCRYPTED_OUTPUT, []) of
<<0, Out/binary>> ->
case gen_tcp:send(TCPSocket, Out) of
ok ->
%?PRINT("IN: ~p~n", [{TCPSocket, binary_to_list(In)}]),
{ok, In};
Error ->
Error
end;
<<1, Error/binary>> ->
{error, binary_to_list(Error)}
end;
<<1, Error/binary>> ->
{error, binary_to_list(Error)}
end;
<<1, Error/binary>> ->
{error, binary_to_list(Error)}
end.
send(#tlssock{tcpsock = TCPSocket, tlsport = Port} = TLSSock, Packet) ->
case port_control(Port, ?SET_DECRYPTED_OUTPUT, Packet) of
<<0>> ->
%?PRINT("OUT: ~p~n", [{TCPSocket, lists:flatten(Packet)}]),
case port_control(Port, ?GET_ENCRYPTED_OUTPUT, []) of
<<0, Out/binary>> ->
gen_tcp:send(TCPSocket, Out);
<<1, Error/binary>> ->
{error, binary_to_list(Error)}
end;
<<1, Error/binary>> ->
{error, binary_to_list(Error)};
<<2>> -> % Dirty hack
receive
{timeout, _Timer, _} ->
{error, timeout}
after 100 ->
send(TLSSock, Packet)
end
end.
setopts(#tlssock{tcpsock = TCPSocket}, Opts) ->
inet:setopts(TCPSocket, Opts).
sockname(#tlssock{tcpsock = TCPSocket}) ->
inet:sockname(TCPSocket).
peername(#tlssock{tcpsock = TCPSocket}) ->
inet:peername(TCPSocket).
controlling_process(#tlssock{tcpsock = TCPSocket}, Pid) ->
gen_tcp:controlling_process(TCPSocket, Pid).
close(#tlssock{tcpsock = TCPSocket, tlsport = Port}) ->
gen_tcp:close(TCPSocket),
port_close(Port).
get_peer_certificate(#tlssock{tlsport = Port}) ->
case port_control(Port, ?GET_PEER_CERTIFICATE, []) of
<<0, BCert/binary>> ->
{CertMod, CertFun, CertSecondArg} = ?CERT_DECODE,
case catch apply(CertMod, CertFun, [BCert, CertSecondArg]) of
{ok, Cert} -> %% returned by R13 and older
{ok, Cert};
{'Certificate', _, _, _} = Cert ->
{ok, Cert};
_ ->
error
end;
<<1>> ->
error
end.
get_verify_result(#tlssock{tlsport = Port}) ->
<> = port_control(Port, ?GET_VERIFY_RESULT, []),
Res.
test() ->
case erl_ddll:load_driver(ejabberd:get_so_path(), tls_drv) of
ok -> ok;
{error, already_loaded} -> ok
end,
Port = open_port({spawn, "tls_drv"}, [binary]),
?PRINT("open_port: ~p~n", [Port]),
PCRes = port_control(Port, ?SET_CERTIFICATE_FILE_ACCEPT,
"./ssl.pem" ++ [0]),
?PRINT("port_control: ~p~n", [PCRes]),
{ok, ListenSocket} = gen_tcp:listen(1234, [binary,
{packet, 0},
{active, true},
{reuseaddr, true},
{nodelay, true}]),
?PRINT("listen: ~p~n", [ListenSocket]),
{ok, Socket} = gen_tcp:accept(ListenSocket),
?PRINT("accept: ~p~n", [Socket]),
loop(Port, Socket).
loop(Port, Socket) ->
receive
{tcp, Socket, Data} ->
%?PRINT("read: ~p~n", [Data]),
Res = port_control(Port, ?SET_ENCRYPTED_INPUT, Data),
?PRINT("SET_ENCRYPTED_INPUT: ~p~n", [Res]),
DIRes = port_control(Port, ?GET_DECRYPTED_INPUT, Data),
?PRINT("GET_DECRYPTED_INPUT: ~p~n", [DIRes]),
case DIRes of
<<0, In/binary>> ->
?PRINT("input: ~s~n", [binary_to_list(In)]);
<<1, DIError/binary>> ->
?PRINT("GET_DECRYPTED_INPUT error: ~p~n", [binary_to_list(DIError)])
end,
EORes = port_control(Port, ?GET_ENCRYPTED_OUTPUT, Data),
?PRINT("GET_ENCRYPTED_OUTPUT: ~p~n", [EORes]),
case EORes of
<<0, Out/binary>> ->
gen_tcp:send(Socket, Out);
<<1, EOError/binary>> ->
?PRINT("GET_ENCRYPTED_OUTPUT error: ~p~n", [binary_to_list(EOError)])
end,
loop(Port, Socket);
Msg ->
?PRINT("receive: ~p~n", [Msg]),
loop(Port, Socket)
end.
get_cert_verify_string(CertVerifyRes, Cert) ->
BCert = public_key:pkix_encode('Certificate', Cert, plain),
{CertMod, CertFun} = ?CERT_SELFSIGNED,
IsSelfsigned = apply(CertMod, CertFun, [BCert]),
case {CertVerifyRes, IsSelfsigned} of
{21, true} -> "self-signed certificate";
_ -> cert_verify_code(CertVerifyRes)
end.
%% http://www.openssl.org/docs/apps/verify.html
cert_verify_code(0) -> "ok";
cert_verify_code(2) -> "unable to get issuer certificate";
cert_verify_code(3) -> "unable to get certificate CRL";
cert_verify_code(4) -> "unable to decrypt certificate's signature";
cert_verify_code(5) -> "unable to decrypt CRL's signature";
cert_verify_code(6) -> "unable to decode issuer public key";
cert_verify_code(7) -> "certificate signature failure";
cert_verify_code(8) -> "CRL signature failure";
cert_verify_code(9) -> "certificate is not yet valid";
cert_verify_code(10) -> "certificate has expired";
cert_verify_code(11) -> "CRL is not yet valid";
cert_verify_code(12) -> "CRL has expired";
cert_verify_code(13) -> "format error in certificate's notBefore field";
cert_verify_code(14) -> "format error in certificate's notAfter field";
cert_verify_code(15) -> "format error in CRL's lastUpdate field";
cert_verify_code(16) -> "format error in CRL's nextUpdate field";
cert_verify_code(17) -> "out of memory";
cert_verify_code(18) -> "self signed certificate";
cert_verify_code(19) -> "self signed certificate in certificate chain";
cert_verify_code(20) -> "unable to get local issuer certificate";
cert_verify_code(21) -> "unable to verify the first certificate";
cert_verify_code(22) -> "certificate chain too long";
cert_verify_code(23) -> "certificate revoked";
cert_verify_code(24) -> "invalid CA certificate";
cert_verify_code(25) -> "path length constraint exceeded";
cert_verify_code(26) -> "unsupported certificate purpose";
cert_verify_code(27) -> "certificate not trusted";
cert_verify_code(28) -> "certificate rejected";
cert_verify_code(29) -> "subject issuer mismatch";
cert_verify_code(30) -> "authority and subject key identifier mismatch";
cert_verify_code(31) -> "authority and issuer serial number mismatch";
cert_verify_code(32) -> "key usage does not include certificate signing";
cert_verify_code(50) -> "application verification failure";
cert_verify_code(X) -> "Unknown OpenSSL error code: " ++ integer_to_list(X).
ejabberd-2.1.11/src/tls/sha_drv.c 0000664 0000000 0000000 00000007247 12240230175 013413 0 ustar /*
* ejabberd, Copyright (C) 2002-2012 ProcessOne
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
* 02111-1307 USA
*
*/
#include
#include
#ifdef HAVE_MD2
#include
#endif
/*
* R15B changed several driver callbacks to use ErlDrvSizeT and
* ErlDrvSSizeT typedefs instead of int.
* This provides missing typedefs on older OTP versions.
*/
#if ERL_DRV_EXTENDED_MAJOR_VERSION < 2
typedef int ErlDrvSizeT;
typedef int ErlDrvSSizeT;
#endif
static ErlDrvData sha_drv_start(ErlDrvPort port, char *buf)
{
set_port_control_flags(port, PORT_CONTROL_FLAG_BINARY);
return NULL;
}
static ErlDrvSSizeT sha_drv_control(ErlDrvData handle,
unsigned int command,
char *buf, ErlDrvSizeT len,
char **rbuf, ErlDrvSizeT rlen)
{
ErlDrvBinary *b = NULL;
switch (command) {
#ifdef HAVE_MD2
case 2:
rlen = MD2_DIGEST_LENGTH;
b = driver_alloc_binary(rlen);
if (b) MD2((unsigned char*)buf, len, (unsigned char*)b->orig_bytes);
break;
#endif
case 224:
rlen = SHA224_DIGEST_LENGTH;
b = driver_alloc_binary(rlen);
if (b) SHA224((unsigned char*)buf, len, (unsigned char*)b->orig_bytes);
break;
case 256:
rlen = SHA256_DIGEST_LENGTH;
b = driver_alloc_binary(rlen);
if (b) SHA256((unsigned char*)buf, len, (unsigned char*)b->orig_bytes);
break;
case 384:
rlen = SHA384_DIGEST_LENGTH;
b = driver_alloc_binary(rlen);
if (b) SHA384((unsigned char*)buf, len, (unsigned char*)b->orig_bytes);
break;
case 512:
rlen = SHA512_DIGEST_LENGTH;
b = driver_alloc_binary(rlen);
if (b) SHA512((unsigned char*)buf, len, (unsigned char*)b->orig_bytes);
break;
};
if (b) {
*rbuf = (char *)b;
} else {
*rbuf = NULL;
rlen = 0;
};
return rlen;
}
ErlDrvEntry sha_driver_entry = {
NULL, /* F_PTR init, N/A */
sha_drv_start, /* L_PTR start, called when port is opened */
NULL, /* F_PTR stop, called when port is closed */
NULL, /* F_PTR output, called when erlang has sent */
NULL, /* F_PTR ready_input, called when input descriptor ready */
NULL, /* F_PTR ready_output, called when output descriptor ready */
"sha_drv", /* char *driver_name, the argument to open_port */
NULL, /* F_PTR finish, called when unloaded */
NULL, /* handle */
sha_drv_control, /* F_PTR control, port_command callback */
NULL, /* F_PTR timeout, reserved */
NULL, /* F_PTR outputv, reserved */
/* Added in Erlang/OTP R15B: */
NULL, /* ready_async */
NULL, /* flush */
NULL, /* call */
NULL, /* event */
ERL_DRV_EXTENDED_MARKER, /* extended_marker */
ERL_DRV_EXTENDED_MAJOR_VERSION, /* major_version */
ERL_DRV_EXTENDED_MINOR_VERSION, /* minor_version */
0, /* driver_flags */
NULL, /* handle2 */
NULL, /* process_exit */
NULL /* stop_select */
};
DRIVER_INIT(sha_drv) /* must match name in driver_entry */
{
return &sha_driver_entry;
}
ejabberd-2.1.11/src/tls/Makefile.in 0000664 0000000 0000000 00000002525 12240230175 013660 0 ustar # $Id$
CC = @CC@
CFLAGS = @CFLAGS@
CPPFLAGS = @CPPFLAGS@
LDFLAGS = @LDFLAGS@
LIBS = @LIBS@
SSL_CFLAGS = @SSL_CFLAGS@
SSL_LIBS = @SSL_LIBS@
ERLANG_CFLAGS = @ERLANG_CFLAGS@
ERLANG_LIBS = @ERLANG_LIBS@
# Assume Linux-style dynamic library flags
DYNAMIC_LIB_CFLAGS = -fpic -shared
ifeq ($(shell uname),Darwin)
DYNAMIC_LIB_CFLAGS = -fPIC -bundle -flat_namespace -undefined suppress
endif
ifeq ($(shell uname),SunOs)
DYNAMIC_LIB_CFLAGS = -KPIC -G -z text
endif
EFLAGS += @ERLANG_SSLVER@
EFLAGS += -I ..
EFLAGS += -pz ..
# make debug=true to compile Erlang module with debug informations.
ifdef debug
EFLAGS+=+debug_info +export_all
endif
ifeq (@md2@, true)
EFLAGS+=-DHAVE_MD2
ERLANG_CFLAGS += -DHAVE_MD2
endif
ERLSHLIBS = ../tls_drv.so ../sha_drv.so
OUTDIR = ..
SOURCES = $(wildcard *.erl)
BEAMS = $(addprefix $(OUTDIR)/,$(SOURCES:.erl=.beam))
all: $(BEAMS) $(ERLSHLIBS)
$(OUTDIR)/%.beam: %.erl
@ERLC@ -W $(EFLAGS) -o $(OUTDIR) $<
#all: $(ERLSHLIBS)
# erl -s make all report "{outdir, \"..\"}" -noinput -s erlang halt
$(ERLSHLIBS): ../%.so: %.c
$(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) \
$(subst ../,,$(subst .so,.c,$@)) \
$(LIBS) \
$(SSL_LIBS) \
$(SSL_CFLAGS) \
$(ERLANG_LIBS) \
$(ERLANG_CFLAGS) \
-o $@ \
$(DYNAMIC_LIB_CFLAGS)
clean:
rm -f $(BEAMS) $(ERLSHLIBS)
distclean: clean
rm -f Makefile
TAGS:
etags *.erl
ejabberd-2.1.11/src/tls/Makefile.win32 0000664 0000000 0000000 00000002017 12240230175 014210 0 ustar
include ..\Makefile.inc
EFLAGS = -I .. -pz ..
OUTDIR = ..
BEAMS = ..\tls.beam
SOURCE = tls_drv.c sha_drv.c
OBJECT = tls_drv.o sha_drv.o
DLL = $(OUTDIR)\tls_drv.dll $(OUTPUT)\sha_drv.dll
ALL : $(DLL) $(BEAMS)
CLEAN :
-@erase $(DLL)
-@erase $(OUTDIR)\tls_drv.exp
-@erase $(OUTDIR)\tls_drv.lib
-@erase $(OUTDIR)\sha_drv.exp
-@erase $(OUTDIR)\sha_drv.lib
-@erase $(OBJECT)
-@erase $(BEAMS)
$(OUTDIR)\tls.beam : tls.erl
erlc -W $(EFLAGS) -o $(OUTDIR) tls.erl
CC=cl.exe
CC_FLAGS=-nologo -D__WIN32__ -DWIN32 -DWINDOWS -D_WIN32 -DNT -MD -Ox -I"$(ERLANG_DIR)\usr\include" -I"$(EI_DIR)\include" -I"$(OPENSSL_DIR)\include" -I"."
LD=link.exe
LD_FLAGS=-release -nologo -incremental:no -dll "$(EI_DIR)\lib\ei_md.lib" "$(EI_DIR)\lib\erl_interface_md.lib" "$(OPENSSL_DIR)\lib\VC\ssleay32MD.lib" "$(OPENSSL_DIR)\lib\VC\libeay32MD.lib" MSVCRT.LIB kernel32.lib advapi32.lib gdi32.lib user32.lib comctl32.lib comdlg32.lib shell32.lib
$(DLL) : $(OBJECT)
$(LD) $(LD_FLAGS) -out:$@ $<
$(OBJECT) : $(SOURCE)
$(CC) $(CC_FLAGS) -c -Fo$@ $<
ejabberd-2.1.11/src/tls/tls_drv.c 0000664 0000000 0000000 00000033450 12240230175 013435 0 ustar /*
* ejabberd, Copyright (C) 2002-2012 ProcessOne
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
* 02111-1307 USA
*
*/
#include
#include
#include
#include
#include
#include
#include
#include
#define BUF_SIZE 1024
typedef struct {
ErlDrvPort port;
BIO *bio_read;
BIO *bio_write;
SSL *ssl;
} tls_data;
#ifdef _WIN32
typedef unsigned __int32 uint32_t;
#endif
#ifndef SSL_OP_NO_TICKET
#define SSL_OP_NO_TICKET 0
#endif
/*
* R15B changed several driver callbacks to use ErlDrvSizeT and
* ErlDrvSSizeT typedefs instead of int.
* This provides missing typedefs on older OTP versions.
*/
#if ERL_DRV_EXTENDED_MAJOR_VERSION < 2
typedef int ErlDrvSizeT;
typedef int ErlDrvSSizeT;
#endif
/*
* str_hash is based on the public domain code from
* http://www.burtleburtle.net/bob/hash/doobs.html
*/
static uint32_t str_hash(char *s)
{
unsigned char *key = (unsigned char *)s;
uint32_t hash = 0;
size_t i;
for (i = 0; key[i] != 0; i++) {
hash += key[i];
hash += (hash << 10);
hash ^= (hash >> 6);
}
hash += (hash << 3);
hash ^= (hash >> 11);
hash += (hash << 15);
return hash;
}
/* Linear hashing */
#define MIN_LEVEL 8
#define MAX_LEVEL 20
struct bucket {
uint32_t hash;
char *key_file;
time_t mtime;
SSL_CTX *ssl_ctx;
struct bucket *next;
};
struct hash_table {
int split;
int level;
struct bucket **buckets;
int size;
};
struct hash_table ht;
static void init_hash_table()
{
size_t size = 1 << (MIN_LEVEL + 1);
size_t i;
ht.buckets = (struct bucket **)driver_alloc(sizeof(struct bucket *) * size);
ht.split = 0;
ht.level = MIN_LEVEL;
for (i = 0; i < size; i++)
ht.buckets[i] = NULL;
}
static void hash_table_insert(char *key_file, time_t mtime,
SSL_CTX *ssl_ctx)
{
int level, split;
uint32_t hash = str_hash(key_file);
size_t bucket;
int do_split = 0;
struct bucket *el;
struct bucket *new_bucket_el;
split = ht.split;
level = ht.level;
bucket = hash & ((1 << level) - 1);
if (bucket < split)
bucket = hash & ((1 << (level + 1)) - 1);
el = ht.buckets[bucket];
while (el != NULL) {
if (el->hash == hash && strcmp(el->key_file, key_file) == 0) {
el->mtime = mtime;
if (el->ssl_ctx != NULL)
SSL_CTX_free(el->ssl_ctx);
el->ssl_ctx = ssl_ctx;
break;
}
el = el->next;
}
if (el == NULL) {
if (ht.buckets[bucket] != NULL)
do_split = !0;
new_bucket_el = (struct bucket *)driver_alloc(sizeof(struct bucket));
new_bucket_el->hash = hash;
new_bucket_el->key_file = (char *)driver_alloc(strlen(key_file) + 1);
strcpy(new_bucket_el->key_file, key_file);
new_bucket_el->mtime = mtime;
new_bucket_el->ssl_ctx = ssl_ctx;
new_bucket_el->next = ht.buckets[bucket];
ht.buckets[bucket] = new_bucket_el;
}
if (do_split) {
struct bucket **el_ptr = &ht.buckets[split];
size_t new_bucket = split + (1 << level);
while (*el_ptr != NULL) {
uint32_t hash = (*el_ptr)->hash;
if ((hash & ((1 << (level + 1)) - 1)) == new_bucket) {
struct bucket *moved_el = *el_ptr;
*el_ptr = (*el_ptr)->next;
moved_el->next = ht.buckets[new_bucket];
ht.buckets[new_bucket] = moved_el;
} else
el_ptr = &(*el_ptr)->next;
}
split++;
if (split == 1 << level) {
size_t size;
size_t i;
split = 0;
level++;
size = 1 << (level + 1);
ht.split = split;
ht.level = level;
ht.buckets = (struct bucket **)
driver_realloc(ht.buckets, sizeof(struct bucket *) * size);
for (i = 1 << level; i < size; i++)
ht.buckets[i] = NULL;
} else
ht.split = split;
}
}
static SSL_CTX *hash_table_lookup(char *key_file, time_t *pmtime)
{
int level, split;
uint32_t hash = str_hash(key_file);
size_t bucket;
struct bucket *el;
split = ht.split;
level = ht.level;
bucket = hash & ((1 << level) - 1);
if (bucket < split)
bucket = hash & ((1 << (level + 1)) - 1);
el = ht.buckets[bucket];
while (el != NULL) {
if (el->hash == hash && strcmp(el->key_file, key_file) == 0) {
*pmtime = el->mtime;
return el->ssl_ctx;
}
el = el->next;
}
return NULL;
}
static ErlDrvData tls_drv_start(ErlDrvPort port, char *buff)
{
tls_data *d = (tls_data *)driver_alloc(sizeof(tls_data));
d->port = port;
d->bio_read = NULL;
d->bio_write = NULL;
d->ssl = NULL;
set_port_control_flags(port, PORT_CONTROL_FLAG_BINARY);
return (ErlDrvData)d;
}
static void tls_drv_stop(ErlDrvData handle)
{
tls_data *d = (tls_data *)handle;
if (d->ssl != NULL)
SSL_free(d->ssl);
driver_free((char *)handle);
}
static void tls_drv_finish()
{
int level;
struct bucket *el;
int i;
level = ht.level;
for (i = 0; i < 1 << (level + 1); i++) {
el = ht.buckets[i];
while (el != NULL) {
if (el->ssl_ctx != NULL)
SSL_CTX_free(el->ssl_ctx);
driver_free(el->key_file);
el = el->next;
}
}
driver_free(ht.buckets);
}
static int is_key_file_modified(char *file, time_t *key_file_mtime)
{
struct stat file_stat;
if (stat(file, &file_stat))
{
*key_file_mtime = 0;
return 1;
} else {
if (*key_file_mtime != file_stat.st_mtime)
{
*key_file_mtime = file_stat.st_mtime;
return 1;
} else
return 0;
}
}
static int verify_callback(int preverify_ok, X509_STORE_CTX *ctx)
{
return 1;
}
#define SET_CERTIFICATE_FILE_ACCEPT 1
#define SET_CERTIFICATE_FILE_CONNECT 2
#define SET_ENCRYPTED_INPUT 3
#define SET_DECRYPTED_OUTPUT 4
#define GET_ENCRYPTED_OUTPUT 5
#define GET_DECRYPTED_INPUT 6
#define GET_PEER_CERTIFICATE 7
#define GET_VERIFY_RESULT 8
#define VERIFY_NONE 0x10000
#define die_unless(cond, errstr) \
if (!(cond)) \
{ \
int errstrlen = strlen(errstr); \
unsigned long error_code = ERR_get_error(); \
char *error_string = error_code ? \
ERR_error_string(error_code, NULL) : \
NULL; \
int error_string_length = error_string ? \
strlen(error_string) : 0; \
if (error_code) \
rlen = errstrlen + error_string_length + 3; \
else \
rlen = errstrlen + 1; \
b = driver_alloc_binary(rlen); \
b->orig_bytes[0] = 1; \
strncpy(b->orig_bytes + 1, errstr, errstrlen); \
if (error_code) { \
strncpy(b->orig_bytes + 1 + errstrlen, \
": ", 2); \
strncpy(b->orig_bytes + 3 + errstrlen, \
error_string, error_string_length); \
} \
*rbuf = (char *)b; \
return rlen; \
}
static ErlDrvSSizeT tls_drv_control(ErlDrvData handle,
unsigned int command,
char *buf, ErlDrvSizeT len,
char **rbuf, ErlDrvSizeT rlen)
{
tls_data *d = (tls_data *)handle;
int res;
int size;
ErlDrvBinary *b;
X509 *cert;
unsigned int flags = command;
command &= 0xffff;
ERR_clear_error();
switch (command)
{
case SET_CERTIFICATE_FILE_ACCEPT:
case SET_CERTIFICATE_FILE_CONNECT: {
time_t mtime = 0;
SSL_CTX *ssl_ctx = hash_table_lookup(buf, &mtime);
if (is_key_file_modified(buf, &mtime) || ssl_ctx == NULL)
{
SSL_CTX *ctx;
hash_table_insert(buf, mtime, NULL);
ctx = SSL_CTX_new(SSLv23_method());
die_unless(ctx, "SSL_CTX_new failed");
res = SSL_CTX_use_certificate_chain_file(ctx, buf);
die_unless(res > 0, "SSL_CTX_use_certificate_file failed");
res = SSL_CTX_use_PrivateKey_file(ctx, buf, SSL_FILETYPE_PEM);
die_unless(res > 0, "SSL_CTX_use_PrivateKey_file failed");
res = SSL_CTX_check_private_key(ctx);
die_unless(res > 0, "SSL_CTX_check_private_key failed");
SSL_CTX_set_session_cache_mode(ctx, SSL_SESS_CACHE_OFF);
SSL_CTX_set_default_verify_paths(ctx);
#ifdef SSL_MODE_RELEASE_BUFFERS
SSL_CTX_set_mode(ctx, SSL_MODE_RELEASE_BUFFERS);
#endif
/* SSL_CTX_load_verify_locations(ctx, "/etc/ejabberd/ca_certificates.pem", NULL); */
/* SSL_CTX_load_verify_locations(ctx, NULL, "/etc/ejabberd/ca_certs/"); */
/* This IF is commented to allow verification in all cases: */
/* if (command == SET_CERTIFICATE_FILE_ACCEPT) */
/* { */
SSL_CTX_set_verify(ctx,
SSL_VERIFY_PEER|SSL_VERIFY_CLIENT_ONCE,
verify_callback);
/* } */
ssl_ctx = ctx;
hash_table_insert(buf, mtime, ssl_ctx);
}
d->ssl = SSL_new(ssl_ctx);
die_unless(d->ssl, "SSL_new failed");
if (flags & VERIFY_NONE)
SSL_set_verify(d->ssl, SSL_VERIFY_NONE, verify_callback);
d->bio_read = BIO_new(BIO_s_mem());
d->bio_write = BIO_new(BIO_s_mem());
SSL_set_bio(d->ssl, d->bio_read, d->bio_write);
if (command == SET_CERTIFICATE_FILE_ACCEPT) {
SSL_set_options(d->ssl, SSL_OP_NO_TICKET);
SSL_set_accept_state(d->ssl);
} else {
SSL_set_options(d->ssl, SSL_OP_NO_SSLv2|SSL_OP_NO_TICKET);
SSL_set_connect_state(d->ssl);
}
break;
}
case SET_ENCRYPTED_INPUT:
die_unless(d->ssl, "SSL not initialized");
BIO_write(d->bio_read, buf, len);
break;
case SET_DECRYPTED_OUTPUT:
die_unless(d->ssl, "SSL not initialized");
res = SSL_write(d->ssl, buf, len);
if (res <= 0)
{
res = SSL_get_error(d->ssl, res);
if (res == SSL_ERROR_WANT_READ || res == SSL_ERROR_WANT_WRITE)
{
b = driver_alloc_binary(1);
b->orig_bytes[0] = 2;
*rbuf = (char *)b;
return 1;
} else {
die_unless(0, "SSL_write failed");
}
}
break;
case GET_ENCRYPTED_OUTPUT:
die_unless(d->ssl, "SSL not initialized");
size = BIO_ctrl_pending(d->bio_write) + 1;
b = driver_alloc_binary(size);
b->orig_bytes[0] = 0;
BIO_read(d->bio_write, b->orig_bytes + 1, size - 1);
*rbuf = (char *)b;
return size;
case GET_DECRYPTED_INPUT:
if (!SSL_is_init_finished(d->ssl))
{
res = SSL_do_handshake(d->ssl);
if (res <= 0)
die_unless(SSL_get_error(d->ssl, res) == SSL_ERROR_WANT_READ,
"SSL_do_handshake failed");
}
if (SSL_is_init_finished(d->ssl)) {
size_t req_size = 0;
if (len == 4)
{
req_size =
(buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3];
}
size = BUF_SIZE + 1;
rlen = 1;
b = driver_alloc_binary(size);
b->orig_bytes[0] = 0;
res = 0;
while ((req_size == 0 || rlen < req_size + 1) &&
(res = SSL_read(d->ssl,
b->orig_bytes + rlen,
(req_size == 0 || req_size + 1 >= size) ?
size - rlen : req_size + 1 - rlen)) > 0)
{
//printf("%d bytes of decrypted data read from state machine\r\n",res);
rlen += res;
if (size - rlen < BUF_SIZE) {
size *= 2;
b = driver_realloc_binary(b, size);
}
}
if (res < 0)
{
int err = SSL_get_error(d->ssl, res);
if (err == SSL_ERROR_WANT_READ)
{
//printf("SSL_read wants more data\r\n");
//return 0;
}
// TODO
}
b = driver_realloc_binary(b, rlen);
*rbuf = (char *)b;
return rlen;
}
break;
case GET_PEER_CERTIFICATE:
cert = SSL_get_peer_certificate(d->ssl);
if (cert == NULL)
{
b = driver_alloc_binary(1);
b->orig_bytes[0] = 1;
*rbuf = (char *)b;
return 1;
} else {
unsigned char *tmp_buf;
rlen = i2d_X509(cert, NULL);
if (rlen >= 0)
{
rlen++;
b = driver_alloc_binary(rlen);
b->orig_bytes[0] = 0;
tmp_buf = (unsigned char *)&b->orig_bytes[1];
i2d_X509(cert, &tmp_buf);
X509_free(cert);
*rbuf = (char *)b;
return rlen;
} else
X509_free(cert);
}
break;
case GET_VERIFY_RESULT:
b = driver_alloc_binary(1);
b->orig_bytes[0] = SSL_get_verify_result(d->ssl);
*rbuf = (char *)b;
return 1;
break;
}
b = driver_alloc_binary(1);
b->orig_bytes[0] = 0;
*rbuf = (char *)b;
return 1;
}
ErlDrvEntry tls_driver_entry = {
NULL, /* F_PTR init, N/A */
tls_drv_start, /* L_PTR start, called when port is opened */
tls_drv_stop, /* F_PTR stop, called when port is closed */
NULL, /* F_PTR output, called when erlang has sent */
NULL, /* F_PTR ready_input, called when input descriptor ready */
NULL, /* F_PTR ready_output, called when output descriptor ready */
"tls_drv", /* char *driver_name, the argument to open_port */
tls_drv_finish, /* F_PTR finish, called when unloaded */
NULL, /* handle */
tls_drv_control, /* F_PTR control, port_command callback */
NULL, /* F_PTR timeout, reserved */
NULL, /* F_PTR outputv, reserved */
/* Added in Erlang/OTP R15B: */
NULL, /* ready_async */
NULL, /* flush */
NULL, /* call */
NULL, /* event */
ERL_DRV_EXTENDED_MARKER, /* extended_marker */
ERL_DRV_EXTENDED_MAJOR_VERSION, /* major_version */
ERL_DRV_EXTENDED_MINOR_VERSION, /* minor_version */
0, /* driver_flags */
NULL, /* handle2 */
NULL, /* process_exit */
NULL /* stop_select */
};
DRIVER_INIT(tls_drv) /* must match name in driver_entry */
{
OpenSSL_add_ssl_algorithms();
SSL_load_error_strings();
init_hash_table();
return &tls_driver_entry;
}
ejabberd-2.1.11/src/tls/stdint.h 0000775 0000000 0000000 00000016201 12240230175 013270 0 ustar // ISO C9x compliant stdint.h for Microsoft Visual Studio
// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124
//
// Copyright (c) 2006-2008 Alexander Chemeris
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// 1. Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
//
// 2. Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
//
// 3. The name of the author may be used to endorse or promote products
// derived from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
///////////////////////////////////////////////////////////////////////////////
#ifndef _MSC_VER // [
#error "Use this header only with Microsoft Visual C++ compilers!"
#endif // _MSC_VER ]
#ifndef _MSC_STDINT_H_ // [
#define _MSC_STDINT_H_
#if _MSC_VER > 1000
#pragma once
#endif
#include
// For Visual Studio 6 in C++ mode wrap include with 'extern "C++" {}'
// or compiler give many errors like this:
// error C2733: second C linkage of overloaded function 'wmemchr' not allowed
#if (_MSC_VER < 1300) && defined(__cplusplus)
extern "C++" {
#endif
# include
#if (_MSC_VER < 1300) && defined(__cplusplus)
}
#endif
// Define _W64 macros to mark types changing their size, like intptr_t.
#ifndef _W64
# if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300
# define _W64 __w64
# else
# define _W64
# endif
#endif
// 7.18.1 Integer types
// 7.18.1.1 Exact-width integer types
typedef __int8 int8_t;
typedef __int16 int16_t;
typedef __int32 int32_t;
typedef __int64 int64_t;
typedef unsigned __int8 uint8_t;
typedef unsigned __int16 uint16_t;
typedef unsigned __int32 uint32_t;
typedef unsigned __int64 uint64_t;
// 7.18.1.2 Minimum-width integer types
typedef int8_t int_least8_t;
typedef int16_t int_least16_t;
typedef int32_t int_least32_t;
typedef int64_t int_least64_t;
typedef uint8_t uint_least8_t;
typedef uint16_t uint_least16_t;
typedef uint32_t uint_least32_t;
typedef uint64_t uint_least64_t;
// 7.18.1.3 Fastest minimum-width integer types
typedef int8_t int_fast8_t;
typedef int16_t int_fast16_t;
typedef int32_t int_fast32_t;
typedef int64_t int_fast64_t;
typedef uint8_t uint_fast8_t;
typedef uint16_t uint_fast16_t;
typedef uint32_t uint_fast32_t;
typedef uint64_t uint_fast64_t;
// 7.18.1.4 Integer types capable of holding object pointers
#ifdef _WIN64 // [
typedef __int64 intptr_t;
typedef unsigned __int64 uintptr_t;
#else // _WIN64 ][
typedef _W64 int intptr_t;
typedef _W64 unsigned int uintptr_t;
#endif // _WIN64 ]
// 7.18.1.5 Greatest-width integer types
typedef int64_t intmax_t;
typedef uint64_t uintmax_t;
// 7.18.2 Limits of specified-width integer types
#if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) // [ See footnote 220 at page 257 and footnote 221 at page 259
// 7.18.2.1 Limits of exact-width integer types
#define INT8_MIN ((int8_t)_I8_MIN)
#define INT8_MAX _I8_MAX
#define INT16_MIN ((int16_t)_I16_MIN)
#define INT16_MAX _I16_MAX
#define INT32_MIN ((int32_t)_I32_MIN)
#define INT32_MAX _I32_MAX
#define INT64_MIN ((int64_t)_I64_MIN)
#define INT64_MAX _I64_MAX
#define UINT8_MAX _UI8_MAX
#define UINT16_MAX _UI16_MAX
#define UINT32_MAX _UI32_MAX
#define UINT64_MAX _UI64_MAX
// 7.18.2.2 Limits of minimum-width integer types
#define INT_LEAST8_MIN INT8_MIN
#define INT_LEAST8_MAX INT8_MAX
#define INT_LEAST16_MIN INT16_MIN
#define INT_LEAST16_MAX INT16_MAX
#define INT_LEAST32_MIN INT32_MIN
#define INT_LEAST32_MAX INT32_MAX
#define INT_LEAST64_MIN INT64_MIN
#define INT_LEAST64_MAX INT64_MAX
#define UINT_LEAST8_MAX UINT8_MAX
#define UINT_LEAST16_MAX UINT16_MAX
#define UINT_LEAST32_MAX UINT32_MAX
#define UINT_LEAST64_MAX UINT64_MAX
// 7.18.2.3 Limits of fastest minimum-width integer types
#define INT_FAST8_MIN INT8_MIN
#define INT_FAST8_MAX INT8_MAX
#define INT_FAST16_MIN INT16_MIN
#define INT_FAST16_MAX INT16_MAX
#define INT_FAST32_MIN INT32_MIN
#define INT_FAST32_MAX INT32_MAX
#define INT_FAST64_MIN INT64_MIN
#define INT_FAST64_MAX INT64_MAX
#define UINT_FAST8_MAX UINT8_MAX
#define UINT_FAST16_MAX UINT16_MAX
#define UINT_FAST32_MAX UINT32_MAX
#define UINT_FAST64_MAX UINT64_MAX
// 7.18.2.4 Limits of integer types capable of holding object pointers
#ifdef _WIN64 // [
# define INTPTR_MIN INT64_MIN
# define INTPTR_MAX INT64_MAX
# define UINTPTR_MAX UINT64_MAX
#else // _WIN64 ][
# define INTPTR_MIN INT32_MIN
# define INTPTR_MAX INT32_MAX
# define UINTPTR_MAX UINT32_MAX
#endif // _WIN64 ]
// 7.18.2.5 Limits of greatest-width integer types
#define INTMAX_MIN INT64_MIN
#define INTMAX_MAX INT64_MAX
#define UINTMAX_MAX UINT64_MAX
// 7.18.3 Limits of other integer types
#ifdef _WIN64 // [
# define PTRDIFF_MIN _I64_MIN
# define PTRDIFF_MAX _I64_MAX
#else // _WIN64 ][
# define PTRDIFF_MIN _I32_MIN
# define PTRDIFF_MAX _I32_MAX
#endif // _WIN64 ]
#define SIG_ATOMIC_MIN INT_MIN
#define SIG_ATOMIC_MAX INT_MAX
#ifndef SIZE_MAX // [
# ifdef _WIN64 // [
# define SIZE_MAX _UI64_MAX
# else // _WIN64 ][
# define SIZE_MAX _UI32_MAX
# endif // _WIN64 ]
#endif // SIZE_MAX ]
// WCHAR_MIN and WCHAR_MAX are also defined in
#ifndef WCHAR_MIN // [
# define WCHAR_MIN 0
#endif // WCHAR_MIN ]
#ifndef WCHAR_MAX // [
# define WCHAR_MAX _UI16_MAX
#endif // WCHAR_MAX ]
#define WINT_MIN 0
#define WINT_MAX _UI16_MAX
#endif // __STDC_LIMIT_MACROS ]
// 7.18.4 Limits of other integer types
#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [ See footnote 224 at page 260
// 7.18.4.1 Macros for minimum-width integer constants
#define INT8_C(val) val##i8
#define INT16_C(val) val##i16
#define INT32_C(val) val##i32
#define INT64_C(val) val##i64
#define UINT8_C(val) val##ui8
#define UINT16_C(val) val##ui16
#define UINT32_C(val) val##ui32
#define UINT64_C(val) val##ui64
// 7.18.4.2 Macros for greatest-width integer constants
#define INTMAX_C INT64_C
#define UINTMAX_C UINT64_C
#endif // __STDC_CONSTANT_MACROS ]
#endif // _MSC_STDINT_H_ ]
ejabberd-2.1.11/src/p1_fsm.erl 0000664 0000000 0000000 00000070201 12240230175 012676 0 ustar %% ``The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
%% compliance with the License. You should have received a copy of the
%% Erlang Public License along with this software. If not, it can be
%% retrieved via the world wide web at http://www.erlang.org/.
%%
%% Software distributed under the License is distributed on an "AS IS"
%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
%% the License for the specific language governing rights and limitations
%% under the License.
%%
%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
%% AB. All Rights Reserved.''
%%
%% The code has been modified and improved by ProcessOne.
%% Copyright 2007-2012, ProcessOne
%%
%% The change adds the following features:
%% - You can send exit(priority_shutdown) to the p1_fsm process to
%% terminate immediatetly. If the fsm trap_exit process flag has been
%% set to true, the FSM terminate function will called.
%% - You can pass the gen_fsm options to control resource usage.
%% {max_queue, N} will exit the process with priority_shutdown
%% - You can limit the time processing a message (TODO): If the
%% message processing does not return in a given period of time, the
%% process will be terminated.
%% - You might customize the State data before sending it to error_logger
%% in case of a crash (just export the function print_state/1)
%% $Id$
%%
-module(p1_fsm).
%%%-----------------------------------------------------------------
%%%
%%% This state machine is somewhat more pure than state_lib. It is
%%% still based on State dispatching (one function per state), but
%%% allows a function handle_event to take care of events in all states.
%%% It's not that pure anymore :( We also allow synchronized event sending.
%%%
%%% If the Parent process terminates the Module:terminate/2
%%% function is called.
%%%
%%% The user module should export:
%%%
%%% init(Args)
%%% ==> {ok, StateName, StateData}
%%% {ok, StateName, StateData, Timeout}
%%% ignore
%%% {stop, Reason}
%%%
%%% StateName(Msg, StateData)
%%%
%%% ==> {next_state, NewStateName, NewStateData}
%%% {next_state, NewStateName, NewStateData, Timeout}
%%% {stop, Reason, NewStateData}
%%% Reason = normal | shutdown | Term terminate(State) is called
%%%
%%% StateName(Msg, From, StateData)
%%%
%%% ==> {next_state, NewStateName, NewStateData}
%%% {next_state, NewStateName, NewStateData, Timeout}
%%% {reply, Reply, NewStateName, NewStateData}
%%% {reply, Reply, NewStateName, NewStateData, Timeout}
%%% {stop, Reason, NewStateData}
%%% Reason = normal | shutdown | Term terminate(State) is called
%%%
%%% handle_event(Msg, StateName, StateData)
%%%
%%% ==> {next_state, NewStateName, NewStateData}
%%% {next_state, NewStateName, NewStateData, Timeout}
%%% {stop, Reason, Reply, NewStateData}
%%% {stop, Reason, NewStateData}
%%% Reason = normal | shutdown | Term terminate(State) is called
%%%
%%% handle_sync_event(Msg, From, StateName, StateData)
%%%
%%% ==> {next_state, NewStateName, NewStateData}
%%% {next_state, NewStateName, NewStateData, Timeout}
%%% {reply, Reply, NewStateName, NewStateData}
%%% {reply, Reply, NewStateName, NewStateData, Timeout}
%%% {stop, Reason, Reply, NewStateData}
%%% {stop, Reason, NewStateData}
%%% Reason = normal | shutdown | Term terminate(State) is called
%%%
%%% handle_info(Info, StateName) (e.g. {'EXIT', P, R}, {nodedown, N}, ...
%%%
%%% ==> {next_state, NewStateName, NewStateData}
%%% {next_state, NewStateName, NewStateData, Timeout}
%%% {stop, Reason, NewStateData}
%%% Reason = normal | shutdown | Term terminate(State) is called
%%%
%%% terminate(Reason, StateName, StateData) Let the user module clean up
%%% always called when server terminates
%%%
%%% ==> the return value is ignored
%%%
%%%
%%% The work flow (of the fsm) can be described as follows:
%%%
%%% User module fsm
%%% ----------- -------
%%% start -----> start
%%% init <----- .
%%%
%%% loop
%%% StateName <----- .
%%%
%%% handle_event <----- .
%%%
%%% handle__sunc_event <----- .
%%%
%%% handle_info <----- .
%%%
%%% terminate <----- .
%%%
%%%
%%% ---------------------------------------------------
-export([start/3, start/4,
start_link/3, start_link/4,
send_event/2, sync_send_event/2, sync_send_event/3,
send_all_state_event/2,
sync_send_all_state_event/2, sync_send_all_state_event/3,
reply/2,
start_timer/2,send_event_after/2,cancel_timer/1,
enter_loop/4, enter_loop/5, enter_loop/6, wake_hib/7]).
-export([behaviour_info/1]).
%% Internal exports
-export([init_it/6, print_event/3,
system_continue/3,
system_terminate/4,
system_code_change/4,
format_status/2]).
-import(error_logger , [format/2]).
%%% Internal gen_fsm state
%%% This state is used to defined resource control values:
-record(limits, {max_queue}).
%%% ---------------------------------------------------
%%% Interface functions.
%%% ---------------------------------------------------
behaviour_info(callbacks) ->
[{init,1},{handle_event,3},{handle_sync_event,4},{handle_info,3},
{terminate,3},{code_change,4}, {print_state,1}];
behaviour_info(_Other) ->
undefined.
%%% ---------------------------------------------------
%%% Starts a generic state machine.
%%% start(Mod, Args, Options)
%%% start(Name, Mod, Args, Options)
%%% start_link(Mod, Args, Options)
%%% start_link(Name, Mod, Args, Options) where:
%%% Name ::= {local, atom()} | {global, atom()}
%%% Mod ::= atom(), callback module implementing the 'real' fsm
%%% Args ::= term(), init arguments (to Mod:init/1)
%%% Options ::= [{debug, [Flag]}]
%%% Flag ::= trace | log | {logfile, File} | statistics | debug
%%% (debug == log && statistics)
%%% Returns: {ok, Pid} |
%%% {error, {already_started, Pid}} |
%%% {error, Reason}
%%% ---------------------------------------------------
start(Mod, Args, Options) ->
gen:start(?MODULE, nolink, Mod, Args, Options).
start(Name, Mod, Args, Options) ->
gen:start(?MODULE, nolink, Name, Mod, Args, Options).
start_link(Mod, Args, Options) ->
gen:start(?MODULE, link, Mod, Args, Options).
start_link(Name, Mod, Args, Options) ->
gen:start(?MODULE, link, Name, Mod, Args, Options).
send_event({global, Name}, Event) ->
catch global:send(Name, {'$gen_event', Event}),
ok;
send_event(Name, Event) ->
Name ! {'$gen_event', Event},
ok.
sync_send_event(Name, Event) ->
case catch gen:call(Name, '$gen_sync_event', Event) of
{ok,Res} ->
Res;
{'EXIT',Reason} ->
exit({Reason, {?MODULE, sync_send_event, [Name, Event]}})
end.
sync_send_event(Name, Event, Timeout) ->
case catch gen:call(Name, '$gen_sync_event', Event, Timeout) of
{ok,Res} ->
Res;
{'EXIT',Reason} ->
exit({Reason, {?MODULE, sync_send_event, [Name, Event, Timeout]}})
end.
send_all_state_event({global, Name}, Event) ->
catch global:send(Name, {'$gen_all_state_event', Event}),
ok;
send_all_state_event(Name, Event) ->
Name ! {'$gen_all_state_event', Event},
ok.
sync_send_all_state_event(Name, Event) ->
case catch gen:call(Name, '$gen_sync_all_state_event', Event) of
{ok,Res} ->
Res;
{'EXIT',Reason} ->
exit({Reason, {?MODULE, sync_send_all_state_event, [Name, Event]}})
end.
sync_send_all_state_event(Name, Event, Timeout) ->
case catch gen:call(Name, '$gen_sync_all_state_event', Event, Timeout) of
{ok,Res} ->
Res;
{'EXIT',Reason} ->
exit({Reason, {?MODULE, sync_send_all_state_event,
[Name, Event, Timeout]}})
end.
%% Designed to be only callable within one of the callbacks
%% hence using the self() of this instance of the process.
%% This is to ensure that timers don't go astray in global
%% e.g. when straddling a failover, or turn up in a restarted
%% instance of the process.
%% Returns Ref, sends event {timeout,Ref,Msg} after Time
%% to the (then) current state.
start_timer(Time, Msg) ->
erlang:start_timer(Time, self(), {'$gen_timer', Msg}).
%% Returns Ref, sends Event after Time to the (then) current state.
send_event_after(Time, Event) ->
erlang:start_timer(Time, self(), {'$gen_event', Event}).
%% Returns the remaing time for the timer if Ref referred to
%% an active timer/send_event_after, false otherwise.
cancel_timer(Ref) ->
case erlang:cancel_timer(Ref) of
false ->
receive {timeout, Ref, _} -> 0
after 0 -> false
end;
RemainingTime ->
RemainingTime
end.
%% enter_loop/4,5,6
%% Makes an existing process into a gen_fsm.
%% The calling process will enter the gen_fsm receive loop and become a
%% gen_fsm process.
%% The process *must* have been started using one of the start functions
%% in proc_lib, see proc_lib(3).
%% The user is responsible for any initialization of the process,
%% including registering a name for it.
enter_loop(Mod, Options, StateName, StateData) ->
enter_loop(Mod, Options, StateName, StateData, self(), infinity).
enter_loop(Mod, Options, StateName, StateData, ServerName = {_,_}) ->
enter_loop(Mod, Options, StateName, StateData, ServerName,infinity);
enter_loop(Mod, Options, StateName, StateData, Timeout) ->
enter_loop(Mod, Options, StateName, StateData, self(), Timeout).
enter_loop(Mod, Options, StateName, StateData, ServerName, Timeout) ->
Name = get_proc_name(ServerName),
Parent = get_parent(),
Debug = gen:debug_options(Options),
Limits = limit_options(Options),
Queue = queue:new(),
QueueLen = 0,
loop(Parent, Name, StateName, StateData, Mod, Timeout, Debug,
Limits, Queue, QueueLen).
get_proc_name(Pid) when is_pid(Pid) ->
Pid;
get_proc_name({local, Name}) ->
case process_info(self(), registered_name) of
{registered_name, Name} ->
Name;
{registered_name, _Name} ->
exit(process_not_registered);
[] ->
exit(process_not_registered)
end;
get_proc_name({global, Name}) ->
case global:whereis_name(Name) of
undefined ->
exit(process_not_registered_globally);
Pid when Pid==self() ->
Name;
_Pid ->
exit(process_not_registered_globally)
end.
get_parent() ->
case get('$ancestors') of
[Parent | _] when is_pid(Parent) ->
Parent;
[Parent | _] when is_atom(Parent) ->
name_to_pid(Parent);
_ ->
exit(process_was_not_started_by_proc_lib)
end.
name_to_pid(Name) ->
case whereis(Name) of
undefined ->
case global:whereis_name(Name) of
undefined ->
exit(could_not_find_registerd_name);
Pid ->
Pid
end;
Pid ->
Pid
end.
%%% ---------------------------------------------------
%%% Initiate the new process.
%%% Register the name using the Rfunc function
%%% Calls the Mod:init/Args function.
%%% Finally an acknowledge is sent to Parent and the main
%%% loop is entered.
%%% ---------------------------------------------------
init_it(Starter, self, Name, Mod, Args, Options) ->
init_it(Starter, self(), Name, Mod, Args, Options);
init_it(Starter, Parent, Name0, Mod, Args, Options) ->
Name = name(Name0),
Debug = gen:debug_options(Options),
Limits = limit_options(Options),
Queue = queue:new(),
QueueLen = 0,
case catch Mod:init(Args) of
{ok, StateName, StateData} ->
proc_lib:init_ack(Starter, {ok, self()}),
loop(Parent, Name, StateName, StateData, Mod, infinity, Debug, Limits, Queue, QueueLen);
{ok, StateName, StateData, Timeout} ->
proc_lib:init_ack(Starter, {ok, self()}),
loop(Parent, Name, StateName, StateData, Mod, Timeout, Debug, Limits, Queue, QueueLen);
{stop, Reason} ->
proc_lib:init_ack(Starter, {error, Reason}),
exit(Reason);
ignore ->
proc_lib:init_ack(Starter, ignore),
exit(normal);
{'EXIT', Reason} ->
proc_lib:init_ack(Starter, {error, Reason}),
exit(Reason);
Else ->
Error = {bad_return_value, Else},
proc_lib:init_ack(Starter, {error, Error}),
exit(Error)
end.
name({local,Name}) -> Name;
name({global,Name}) -> Name;
name(Pid) when is_pid(Pid) -> Pid.
%%-----------------------------------------------------------------
%% The MAIN loop
%%-----------------------------------------------------------------
loop(Parent, Name, StateName, StateData, Mod, hibernate, Debug,
Limits, Queue, QueueLen)
when QueueLen > 0 ->
case queue:out(Queue) of
{{value, Msg}, Queue1} ->
decode_msg(Msg, Parent, Name, StateName, StateData, Mod, hibernate,
Debug, Limits, Queue1, QueueLen - 1, false);
{empty, _} ->
Reason = internal_queue_error,
error_info(Mod, Reason, Name, hibernate, StateName, StateData, Debug),
exit(Reason)
end;
loop(Parent, Name, StateName, StateData, Mod, hibernate, Debug,
Limits, _Queue, _QueueLen) ->
proc_lib:hibernate(?MODULE,wake_hib,
[Parent, Name, StateName, StateData, Mod,
Debug, Limits]);
%% First we test if we have reach a defined limit ...
loop(Parent, Name, StateName, StateData, Mod, Time, Debug,
Limits, Queue, QueueLen) ->
try
message_queue_len(Limits, QueueLen)
%% TODO: We can add more limit checking here...
catch
{process_limit, Limit} ->
Reason = {process_limit, Limit},
Msg = {'EXIT', Parent, {error, {process_limit, Limit}}},
terminate(Reason, Name, Msg, Mod, StateName, StateData, Debug)
end,
process_message(Parent, Name, StateName, StateData,
Mod, Time, Debug, Limits, Queue, QueueLen).
%% ... then we can process a new message:
process_message(Parent, Name, StateName, StateData, Mod, Time, Debug,
Limits, Queue, QueueLen) ->
{Msg, Queue1, QueueLen1} = collect_messages(Queue, QueueLen, Time),
decode_msg(Msg,Parent, Name, StateName, StateData, Mod, Time,
Debug, Limits, Queue1, QueueLen1, false).
collect_messages(Queue, QueueLen, Time) ->
receive
Input ->
case Input of
{'EXIT', _Parent, priority_shutdown} ->
{Input, Queue, QueueLen};
_ ->
collect_messages(
queue:in(Input, Queue), QueueLen + 1, Time)
end
after 0 ->
case queue:out(Queue) of
{{value, Msg}, Queue1} ->
{Msg, Queue1, QueueLen - 1};
{empty, _} ->
receive
Input ->
{Input, Queue, QueueLen}
after Time ->
{{'$gen_event', timeout}, Queue, QueueLen}
end
end
end.
wake_hib(Parent, Name, StateName, StateData, Mod, Debug,
Limits) ->
Msg = receive
Input ->
Input
end,
Queue = queue:new(),
QueueLen = 0,
decode_msg(Msg, Parent, Name, StateName, StateData, Mod, hibernate,
Debug, Limits, Queue, QueueLen, true).
decode_msg(Msg,Parent, Name, StateName, StateData, Mod, Time, Debug,
Limits, Queue, QueueLen, Hib) ->
put('$internal_queue_len', QueueLen),
case Msg of
{system, From, Req} ->
sys:handle_system_msg(Req, From, Parent, ?MODULE, Debug,
[Name, StateName, StateData,
Mod, Time, Limits, Queue, QueueLen], Hib);
{'EXIT', Parent, Reason} ->
terminate(Reason, Name, Msg, Mod, StateName, StateData, Debug);
_Msg when Debug == [] ->
handle_msg(Msg, Parent, Name, StateName, StateData,
Mod, Time, Limits, Queue, QueueLen);
_Msg ->
Debug1 = sys:handle_debug(Debug, fun print_event/3,
{Name, StateName}, {in, Msg}),
handle_msg(Msg, Parent, Name, StateName, StateData,
Mod, Time, Debug1, Limits, Queue, QueueLen)
end.
%%-----------------------------------------------------------------
%% Callback functions for system messages handling.
%%-----------------------------------------------------------------
system_continue(Parent, Debug, [Name, StateName, StateData,
Mod, Time, Limits, Queue, QueueLen]) ->
loop(Parent, Name, StateName, StateData, Mod, Time, Debug,
Limits, Queue, QueueLen).
-spec system_terminate(term(), _, _, [term(),...]) -> no_return().
system_terminate(Reason, _Parent, Debug,
[Name, StateName, StateData, Mod, _Time, _Limits]) ->
terminate(Reason, Name, [], Mod, StateName, StateData, Debug).
system_code_change([Name, StateName, StateData, Mod, Time,
Limits, Queue, QueueLen],
_Module, OldVsn, Extra) ->
case catch Mod:code_change(OldVsn, StateName, StateData, Extra) of
{ok, NewStateName, NewStateData} ->
{ok, [Name, NewStateName, NewStateData, Mod, Time,
Limits, Queue, QueueLen]};
Else -> Else
end.
%%-----------------------------------------------------------------
%% Format debug messages. Print them as the call-back module sees
%% them, not as the real erlang messages. Use trace for that.
%%-----------------------------------------------------------------
print_event(Dev, {in, Msg}, {Name, StateName}) ->
case Msg of
{'$gen_event', Event} ->
io:format(Dev, "*DBG* ~p got event ~p in state ~w~n",
[Name, Event, StateName]);
{'$gen_all_state_event', Event} ->
io:format(Dev,
"*DBG* ~p got all_state_event ~p in state ~w~n",
[Name, Event, StateName]);
{timeout, Ref, {'$gen_timer', Message}} ->
io:format(Dev,
"*DBG* ~p got timer ~p in state ~w~n",
[Name, {timeout, Ref, Message}, StateName]);
{timeout, _Ref, {'$gen_event', Event}} ->
io:format(Dev,
"*DBG* ~p got timer ~p in state ~w~n",
[Name, Event, StateName]);
_ ->
io:format(Dev, "*DBG* ~p got ~p in state ~w~n",
[Name, Msg, StateName])
end;
print_event(Dev, {out, Msg, To, StateName}, Name) ->
io:format(Dev, "*DBG* ~p sent ~p to ~w~n"
" and switched to state ~w~n",
[Name, Msg, To, StateName]);
print_event(Dev, return, {Name, StateName}) ->
io:format(Dev, "*DBG* ~p switched to state ~w~n",
[Name, StateName]).
relay_messages(MRef, TRef, Clone, Queue) ->
lists:foreach(
fun(Msg) -> Clone ! Msg end,
queue:to_list(Queue)),
relay_messages(MRef, TRef, Clone).
relay_messages(MRef, TRef, Clone) ->
receive
{'DOWN', MRef, process, Clone, Reason} ->
Reason;
{'EXIT', _Parent, _Reason} ->
{migrated, Clone};
{timeout, TRef, timeout} ->
{migrated, Clone};
Msg ->
Clone ! Msg,
relay_messages(MRef, TRef, Clone)
end.
handle_msg(Msg, Parent, Name, StateName, StateData, Mod, _Time,
Limits, Queue, QueueLen) -> %No debug here
From = from(Msg),
case catch dispatch(Msg, Mod, StateName, StateData) of
{next_state, NStateName, NStateData} ->
loop(Parent, Name, NStateName, NStateData,
Mod, infinity, [], Limits, Queue, QueueLen);
{next_state, NStateName, NStateData, Time1} ->
loop(Parent, Name, NStateName, NStateData, Mod, Time1, [],
Limits, Queue, QueueLen);
{reply, Reply, NStateName, NStateData} when From =/= undefined ->
reply(From, Reply),
loop(Parent, Name, NStateName, NStateData,
Mod, infinity, [], Limits, Queue, QueueLen);
{reply, Reply, NStateName, NStateData, Time1} when From =/= undefined ->
reply(From, Reply),
loop(Parent, Name, NStateName, NStateData, Mod, Time1, [],
Limits, Queue, QueueLen);
{migrate, NStateData, {Node, M, F, A}, Time1} ->
Reason = case catch rpc:call(Node, M, F, A, 5000) of
{badrpc, _} = Err ->
{migration_error, Err};
{'EXIT', _} = Err ->
{migration_error, Err};
{error, _} = Err ->
{migration_error, Err};
{ok, Clone} ->
process_flag(trap_exit, true),
MRef = erlang:monitor(process, Clone),
TRef = erlang:start_timer(Time1, self(), timeout),
relay_messages(MRef, TRef, Clone, Queue);
Reply ->
{migration_error, {bad_reply, Reply}}
end,
terminate(Reason, Name, Msg, Mod, StateName, NStateData, []);
{stop, Reason, NStateData} ->
terminate(Reason, Name, Msg, Mod, StateName, NStateData, []);
{stop, Reason, Reply, NStateData} when From =/= undefined ->
{'EXIT', R} = (catch terminate(Reason, Name, Msg, Mod,
StateName, NStateData, [])),
reply(From, Reply),
exit(R);
{'EXIT', What} ->
terminate(What, Name, Msg, Mod, StateName, StateData, []);
Reply ->
terminate({bad_return_value, Reply},
Name, Msg, Mod, StateName, StateData, [])
end.
handle_msg(Msg, Parent, Name, StateName, StateData,
Mod, _Time, Debug, Limits, Queue, QueueLen) ->
From = from(Msg),
case catch dispatch(Msg, Mod, StateName, StateData) of
{next_state, NStateName, NStateData} ->
Debug1 = sys:handle_debug(Debug, fun print_event/3,
{Name, NStateName}, return),
loop(Parent, Name, NStateName, NStateData,
Mod, infinity, Debug1, Limits, Queue, QueueLen);
{next_state, NStateName, NStateData, Time1} ->
Debug1 = sys:handle_debug(Debug, fun print_event/3,
{Name, NStateName}, return),
loop(Parent, Name, NStateName, NStateData,
Mod, Time1, Debug1, Limits, Queue, QueueLen);
{reply, Reply, NStateName, NStateData} when From =/= undefined ->
Debug1 = reply(Name, From, Reply, Debug, NStateName),
loop(Parent, Name, NStateName, NStateData,
Mod, infinity, Debug1, Limits, Queue, QueueLen);
{reply, Reply, NStateName, NStateData, Time1} when From =/= undefined ->
Debug1 = reply(Name, From, Reply, Debug, NStateName),
loop(Parent, Name, NStateName, NStateData,
Mod, Time1, Debug1, Limits, Queue, QueueLen);
{migrate, NStateData, {Node, M, F, A}, Time1} ->
Reason = case catch rpc:call(Node, M, F, A, Time1) of
{badrpc, R} ->
{migration_error, R};
{'EXIT', R} ->
{migration_error, R};
{error, R} ->
{migration_error, R};
{ok, Clone} ->
process_flag(trap_exit, true),
MRef = erlang:monitor(process, Clone),
TRef = erlang:start_timer(Time1, self(), timeout),
relay_messages(MRef, TRef, Clone, Queue);
Reply ->
{migration_error, {bad_reply, Reply}}
end,
terminate(Reason, Name, Msg, Mod, StateName, NStateData, Debug);
{stop, Reason, NStateData} ->
terminate(Reason, Name, Msg, Mod, StateName, NStateData, Debug);
{stop, Reason, Reply, NStateData} when From =/= undefined ->
{'EXIT', R} = (catch terminate(Reason, Name, Msg, Mod,
StateName, NStateData, Debug)),
reply(Name, From, Reply, Debug, StateName),
exit(R);
{'EXIT', What} ->
terminate(What, Name, Msg, Mod, StateName, StateData, Debug);
Reply ->
terminate({bad_return_value, Reply},
Name, Msg, Mod, StateName, StateData, Debug)
end.
dispatch({'$gen_event', Event}, Mod, StateName, StateData) ->
Mod:StateName(Event, StateData);
dispatch({'$gen_all_state_event', Event}, Mod, StateName, StateData) ->
Mod:handle_event(Event, StateName, StateData);
dispatch({'$gen_sync_event', From, Event}, Mod, StateName, StateData) ->
Mod:StateName(Event, From, StateData);
dispatch({'$gen_sync_all_state_event', From, Event},
Mod, StateName, StateData) ->
Mod:handle_sync_event(Event, From, StateName, StateData);
dispatch({timeout, Ref, {'$gen_timer', Msg}}, Mod, StateName, StateData) ->
Mod:StateName({timeout, Ref, Msg}, StateData);
dispatch({timeout, _Ref, {'$gen_event', Event}}, Mod, StateName, StateData) ->
Mod:StateName(Event, StateData);
dispatch(Info, Mod, StateName, StateData) ->
Mod:handle_info(Info, StateName, StateData).
from({'$gen_sync_event', From, _Event}) -> From;
from({'$gen_sync_all_state_event', From, _Event}) -> From;
from(_) -> undefined.
%% Send a reply to the client.
reply({To, Tag}, Reply) ->
catch To ! {Tag, Reply}.
reply(Name, {To, Tag}, Reply, Debug, StateName) ->
reply({To, Tag}, Reply),
sys:handle_debug(Debug, fun print_event/3, Name,
{out, Reply, To, StateName}).
%%% ---------------------------------------------------
%%% Terminate the server.
%%% ---------------------------------------------------
-spec terminate(term(), _, _, atom(), _, _, _) -> no_return().
terminate(Reason, Name, Msg, Mod, StateName, StateData, Debug) ->
case catch Mod:terminate(Reason, StateName, StateData) of
{'EXIT', R} ->
error_info(Mod, R, Name, Msg, StateName, StateData, Debug),
exit(R);
_ ->
case Reason of
normal ->
exit(normal);
shutdown ->
exit(shutdown);
priority_shutdown ->
%% Priority shutdown should be considered as
%% shutdown by SASL
exit(shutdown);
{process_limit, _Limit} ->
exit(Reason);
{migrated, _Clone} ->
exit(normal);
_ ->
error_info(Mod, Reason, Name, Msg, StateName, StateData, Debug),
exit(Reason)
end
end.
error_info(Mod, Reason, Name, Msg, StateName, StateData, Debug) ->
Reason1 =
case Reason of
{undef,[{M,F,A}|MFAs]} ->
case code:is_loaded(M) of
false ->
{'module could not be loaded',[{M,F,A}|MFAs]};
_ ->
case erlang:function_exported(M, F, length(A)) of
true ->
Reason;
false ->
{'function not exported',[{M,F,A}|MFAs]}
end
end;
_ ->
Reason
end,
StateToPrint = case erlang:function_exported(Mod, print_state, 1) of
true -> (catch Mod:print_state(StateData));
false -> StateData
end,
Str = "** State machine ~p terminating \n" ++
get_msg_str(Msg) ++
"** When State == ~p~n"
"** Data == ~p~n"
"** Reason for termination = ~n** ~p~n",
format(Str, [Name, get_msg(Msg), StateName, StateToPrint, Reason1]),
sys:print_log(Debug),
ok.
get_msg_str({'$gen_event', _Event}) ->
"** Last event in was ~p~n";
get_msg_str({'$gen_sync_event', _Event}) ->
"** Last sync event in was ~p~n";
get_msg_str({'$gen_all_state_event', _Event}) ->
"** Last event in was ~p (for all states)~n";
get_msg_str({'$gen_sync_all_state_event', _Event}) ->
"** Last sync event in was ~p (for all states)~n";
get_msg_str({timeout, _Ref, {'$gen_timer', _Msg}}) ->
"** Last timer event in was ~p~n";
get_msg_str({timeout, _Ref, {'$gen_event', _Msg}}) ->
"** Last timer event in was ~p~n";
get_msg_str(_Msg) ->
"** Last message in was ~p~n".
get_msg({'$gen_event', Event}) -> Event;
get_msg({'$gen_sync_event', Event}) -> Event;
get_msg({'$gen_all_state_event', Event}) -> Event;
get_msg({'$gen_sync_all_state_event', Event}) -> Event;
get_msg({timeout, Ref, {'$gen_timer', Msg}}) -> {timeout, Ref, Msg};
get_msg({timeout, _Ref, {'$gen_event', Event}}) -> Event;
get_msg(Msg) -> Msg.
%%-----------------------------------------------------------------
%% Status information
%%-----------------------------------------------------------------
format_status(Opt, StatusData) ->
[PDict, SysState, Parent, Debug, [Name, StateName, StateData, Mod, _Time]] =
StatusData,
NameTag = if is_pid(Name) ->
pid_to_list(Name);
is_atom(Name) ->
Name
end,
Header = lists:concat(["Status for state machine ", NameTag]),
Log = sys:get_debug(log, Debug, []),
Specfic =
case erlang:function_exported(Mod, format_status, 2) of
true ->
case catch Mod:format_status(Opt,[PDict,StateData]) of
{'EXIT', _} -> [{data, [{"StateData", StateData}]}];
Else -> Else
end;
_ ->
[{data, [{"StateData", StateData}]}]
end,
[{header, Header},
{data, [{"Status", SysState},
{"Parent", Parent},
{"Logged events", Log},
{"StateName", StateName}]} |
Specfic].
%%-----------------------------------------------------------------
%% Resources limit management
%%-----------------------------------------------------------------
%% Extract know limit options
limit_options(Options) ->
limit_options(Options, #limits{}).
limit_options([], Limits) ->
Limits;
%% Maximum number of messages allowed in the process message queue
limit_options([{max_queue,N}|Options], Limits)
when is_integer(N) ->
NewLimits = Limits#limits{max_queue=N},
limit_options(Options, NewLimits);
limit_options([_|Options], Limits) ->
limit_options(Options, Limits).
%% Throw max_queue if we have reach the max queue size
%% Returns ok otherwise
message_queue_len(#limits{max_queue = undefined}, _QueueLen) ->
ok;
message_queue_len(#limits{max_queue = MaxQueue}, QueueLen) ->
Pid = self(),
case process_info(Pid, message_queue_len) of
{message_queue_len, N} when N + QueueLen > MaxQueue ->
throw({process_limit, {max_queue, N + QueueLen}});
_ ->
ok
end.
ejabberd-2.1.11/src/ejabberd_hooks.erl 0000664 0000000 0000000 00000026353 12240230175 014463 0 ustar %%%----------------------------------------------------------------------
%%% File : ejabberd_hooks.erl
%%% Author : Alexey Shchepin
%%% Purpose : Manage hooks
%%% Created : 8 Aug 2004 by Alexey Shchepin
%%%
%%%
%%% ejabberd, Copyright (C) 2002-2012 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
%%% published by the Free Software Foundation; either version 2 of the
%%% License, or (at your option) any later version.
%%%
%%% This program is distributed in the hope that it will be useful,
%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
%%% General Public License for more details.
%%%
%%% You should have received a copy of the GNU General Public License
%%% along with this program; if not, write to the Free Software
%%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
%%% 02111-1307 USA
%%%
%%%----------------------------------------------------------------------
-module(ejabberd_hooks).
-author('alexey@process-one.net').
-behaviour(gen_server).
%% External exports
-export([start_link/0,
add/3,
add/4,
add_dist/5,
delete/3,
delete/4,
delete_dist/5,
run/2,
run_fold/3,
add/5,
add_dist/6,
delete/5,
delete_dist/6,
run/3,
run_fold/4]).
%% gen_server callbacks
-export([init/1,
handle_call/3,
handle_cast/2,
code_change/3,
handle_info/2,
terminate/2]).
-include("ejabberd.hrl").
%% Timeout of 5 seconds in calls to distributed hooks
-define(TIMEOUT_DISTRIBUTED_HOOK, 5000).
-record(state, {}).
%%%----------------------------------------------------------------------
%%% API
%%%----------------------------------------------------------------------
start_link() ->
gen_server:start_link({local, ejabberd_hooks}, ejabberd_hooks, [], []).
%% @spec (Hook::atom(), Function::function(), Seq::integer()) -> ok
%% @doc See add/4.
add(Hook, Function, Seq) when is_function(Function) ->
add(Hook, global, undefined, Function, Seq).
add(Hook, Host, Function, Seq) when is_function(Function) ->
add(Hook, Host, undefined, Function, Seq);
%% @spec (Hook::atom(), Module::atom(), Function::atom(), Seq::integer()) -> ok
%% @doc Add a module and function to this hook.
%% The integer sequence is used to sort the calls: low number is called before high number.
add(Hook, Module, Function, Seq) ->
add(Hook, global, Module, Function, Seq).
add(Hook, Host, Module, Function, Seq) ->
gen_server:call(ejabberd_hooks, {add, Hook, Host, Module, Function, Seq}).
add_dist(Hook, Node, Module, Function, Seq) ->
gen_server:call(ejabberd_hooks, {add, Hook, global, Node, Module, Function, Seq}).
add_dist(Hook, Host, Node, Module, Function, Seq) ->
gen_server:call(ejabberd_hooks, {add, Hook, Host, Node, Module, Function, Seq}).
%% @spec (Hook::atom(), Function::function(), Seq::integer()) -> ok
%% @doc See del/4.
delete(Hook, Function, Seq) when is_function(Function) ->
delete(Hook, global, undefined, Function, Seq).
delete(Hook, Host, Function, Seq) when is_function(Function) ->
delete(Hook, Host, undefined, Function, Seq);
%% @spec (Hook::atom(), Module::atom(), Function::atom(), Seq::integer()) -> ok
%% @doc Delete a module and function from this hook.
%% It is important to indicate exactly the same information than when the call was added.
delete(Hook, Module, Function, Seq) ->
delete(Hook, global, Module, Function, Seq).
delete(Hook, Host, Module, Function, Seq) ->
gen_server:call(ejabberd_hooks, {delete, Hook, Host, Module, Function, Seq}).
delete_dist(Hook, Node, Module, Function, Seq) ->
delete_dist(Hook, global, Node, Module, Function, Seq).
delete_dist(Hook, Host, Node, Module, Function, Seq) ->
gen_server:call(ejabberd_hooks, {delete, Hook, Host, Node, Module, Function, Seq}).
%% @spec (Hook::atom(), Args) -> ok
%% @doc Run the calls of this hook in order, don't care about function results.
%% If a call returns stop, no more calls are performed.
run(Hook, Args) ->
run(Hook, global, Args).
run(Hook, Host, Args) ->
case ets:lookup(hooks, {Hook, Host}) of
[{_, Ls}] ->
run1(Ls, Hook, Args);
[] ->
ok
end.
%% @spec (Hook::atom(), Val, Args) -> Val | stopped | NewVal
%% @doc Run the calls of this hook in order.
%% The arguments passed to the function are: [Val | Args].
%% The result of a call is used as Val for the next call.
%% If a call returns 'stop', no more calls are performed and 'stopped' is returned.
%% If a call returns {stopped, NewVal}, no more calls are performed and NewVal is returned.
run_fold(Hook, Val, Args) ->
run_fold(Hook, global, Val, Args).
run_fold(Hook, Host, Val, Args) ->
case ets:lookup(hooks, {Hook, Host}) of
[{_, Ls}] ->
run_fold1(Ls, Hook, Val, Args);
[] ->
Val
end.
%%%----------------------------------------------------------------------
%%% Callback functions from gen_server
%%%----------------------------------------------------------------------
%%----------------------------------------------------------------------
%% Func: init/1
%% Returns: {ok, State} |
%% {ok, State, Timeout} |
%% ignore |
%% {stop, Reason}
%%----------------------------------------------------------------------
init([]) ->
ets:new(hooks, [named_table]),
{ok, #state{}}.
%%----------------------------------------------------------------------
%% Func: handle_call/3
%% Returns: {reply, Reply, State} |
%% {reply, Reply, State, Timeout} |
%% {noreply, State} |
%% {noreply, State, Timeout} |
%% {stop, Reason, Reply, State} | (terminate/2 is called)
%% {stop, Reason, State} (terminate/2 is called)
%%----------------------------------------------------------------------
handle_call({add, Hook, Host, Module, Function, Seq}, _From, State) ->
Reply = case ets:lookup(hooks, {Hook, Host}) of
[{_, Ls}] ->
El = {Seq, Module, Function},
case lists:member(El, Ls) of
true ->
ok;
false ->
NewLs = lists:merge(Ls, [El]),
ets:insert(hooks, {{Hook, Host}, NewLs}),
ok
end;
[] ->
NewLs = [{Seq, Module, Function}],
ets:insert(hooks, {{Hook, Host}, NewLs}),
ok
end,
{reply, Reply, State};
handle_call({add, Hook, Host, Node, Module, Function, Seq}, _From, State) ->
Reply = case ets:lookup(hooks, {Hook, Host}) of
[{_, Ls}] ->
El = {Seq, Node, Module, Function},
case lists:member(El, Ls) of
true ->
ok;
false ->
NewLs = lists:merge(Ls, [El]),
ets:insert(hooks, {{Hook, Host}, NewLs}),
ok
end;
[] ->
NewLs = [{Seq, Node, Module, Function}],
ets:insert(hooks, {{Hook, Host}, NewLs}),
ok
end,
{reply, Reply, State};
handle_call({delete, Hook, Host, Module, Function, Seq}, _From, State) ->
Reply = case ets:lookup(hooks, {Hook, Host}) of
[{_, Ls}] ->
NewLs = lists:delete({Seq, Module, Function}, Ls),
ets:insert(hooks, {{Hook, Host}, NewLs}),
ok;
[] ->
ok
end,
{reply, Reply, State};
handle_call({delete, Hook, Host, Node, Module, Function, Seq}, _From, State) ->
Reply = case ets:lookup(hooks, {Hook, Host}) of
[{_, Ls}] ->
NewLs = lists:delete({Seq, Node, Module, Function}, Ls),
ets:insert(hooks, {{Hook, Host}, NewLs}),
ok;
[] ->
ok
end,
{reply, Reply, State};
handle_call(_Request, _From, State) ->
Reply = ok,
{reply, Reply, State}.
%%----------------------------------------------------------------------
%% Func: handle_cast/2
%% Returns: {noreply, State} |
%% {noreply, State, Timeout} |
%% {stop, Reason, State} (terminate/2 is called)
%%----------------------------------------------------------------------
handle_cast(_Msg, State) ->
{noreply, State}.
%%----------------------------------------------------------------------
%% Func: handle_info/2
%% Returns: {noreply, State} |
%% {noreply, State, Timeout} |
%% {stop, Reason, State} (terminate/2 is called)
%%----------------------------------------------------------------------
handle_info(_Info, State) ->
{noreply, State}.
%%----------------------------------------------------------------------
%% Func: terminate/2
%% Purpose: Shutdown the server
%% Returns: any (ignored by gen_server)
%%----------------------------------------------------------------------
terminate(_Reason, _State) ->
ok.
code_change(_OldVsn, State, _Extra) ->
{ok, State}.
%%%----------------------------------------------------------------------
%%% Internal functions
%%%----------------------------------------------------------------------
run1([], _Hook, _Args) ->
ok;
run1([{_Seq, Node, Module, Function} | Ls], Hook, Args) ->
case rpc:call(Node, Module, Function, Args, ?TIMEOUT_DISTRIBUTED_HOOK) of
timeout ->
?ERROR_MSG("Timeout on RPC to ~p~nrunning hook: ~p",
[Node, {Hook, Args}]),
run1(Ls, Hook, Args);
{badrpc, Reason} ->
?ERROR_MSG("Bad RPC error to ~p: ~p~nrunning hook: ~p",
[Node, Reason, {Hook, Args}]),
run1(Ls, Hook, Args);
stop ->
?INFO_MSG("~nThe process ~p in node ~p ran a hook in node ~p.~n"
"Stop.", [self(), node(), Node]), % debug code
ok;
Res ->
?INFO_MSG("~nThe process ~p in node ~p ran a hook in node ~p.~n"
"The response is:~n~s", [self(), node(), Node, Res]), % debug code
run1(Ls, Hook, Args)
end;
run1([{_Seq, Module, Function} | Ls], Hook, Args) ->
Res = if is_function(Function) ->
catch apply(Function, Args);
true ->
catch apply(Module, Function, Args)
end,
case Res of
{'EXIT', Reason} ->
?ERROR_MSG("~p~nrunning hook: ~p",
[Reason, {Hook, Args}]),
run1(Ls, Hook, Args);
stop ->
ok;
_ ->
run1(Ls, Hook, Args)
end.
run_fold1([], _Hook, Val, _Args) ->
Val;
run_fold1([{_Seq, Node, Module, Function} | Ls], Hook, Val, Args) ->
case rpc:call(Node, Module, Function, [Val | Args], ?TIMEOUT_DISTRIBUTED_HOOK) of
{badrpc, Reason} ->
?ERROR_MSG("Bad RPC error to ~p: ~p~nrunning hook: ~p",
[Node, Reason, {Hook, Args}]),
run_fold1(Ls, Hook, Val, Args);
timeout ->
?ERROR_MSG("Timeout on RPC to ~p~nrunning hook: ~p",
[Node, {Hook, Args}]),
run_fold1(Ls, Hook, Val, Args);
stop ->
stopped;
{stop, NewVal} ->
?INFO_MSG("~nThe process ~p in node ~p ran a hook in node ~p.~n"
"Stop, and the NewVal is:~n~p", [self(), node(), Node, NewVal]), % debug code
NewVal;
NewVal ->
?INFO_MSG("~nThe process ~p in node ~p ran a hook in node ~p.~n"
"The NewVal is:~n~p", [self(), node(), Node, NewVal]), % debug code
run_fold1(Ls, Hook, NewVal, Args)
end;
run_fold1([{_Seq, Module, Function} | Ls], Hook, Val, Args) ->
Res = if is_function(Function) ->
catch apply(Function, [Val | Args]);
true ->
catch apply(Module, Function, [Val | Args])
end,
case Res of
{'EXIT', Reason} ->
?ERROR_MSG("~p~nrunning hook: ~p",
[Reason, {Hook, Args}]),
run_fold1(Ls, Hook, Val, Args);
stop ->
stopped;
{stop, NewVal} ->
NewVal;
NewVal ->
run_fold1(Ls, Hook, NewVal, Args)
end.
ejabberd-2.1.11/src/mod_privacy_odbc.erl 0000664 0000000 0000000 00000055642 12240230175 015030 0 ustar %%%----------------------------------------------------------------------
%%% File : mod_privacy_odbc.erl
%%% Author : Alexey Shchepin
%%% Purpose : jabber:iq:privacy support
%%% Created : 5 Oct 2006 by Alexey Shchepin
%%%
%%%
%%% ejabberd, Copyright (C) 2002-2012 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
%%% published by the Free Software Foundation; either version 2 of the
%%% License, or (at your option) any later version.
%%%
%%% This program is distributed in the hope that it will be useful,
%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
%%% General Public License for more details.
%%%
%%% You should have received a copy of the GNU General Public License
%%% along with this program; if not, write to the Free Software
%%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
%%% 02111-1307 USA
%%%
%%%----------------------------------------------------------------------
-module(mod_privacy_odbc).
-author('alexey@process-one.net').
-behaviour(gen_mod).
-export([start/2, stop/1,
process_iq/3,
process_iq_set/4,
process_iq_get/5,
get_user_list/3,
check_packet/6,
remove_user/2,
item_to_raw/1,
raw_to_item/1,
updated_list/3]).
%% For mod_blocking_odbc
-export([sql_add_privacy_list/2,
sql_get_default_privacy_list/2,
sql_get_default_privacy_list_t/1,
sql_get_privacy_list_data/3,
sql_get_privacy_list_data_by_id_t/1,
sql_get_privacy_list_id_t/2,
sql_set_default_privacy_list/2,
sql_set_privacy_list/2]).
-include("ejabberd.hrl").
-include("jlib.hrl").
-include("mod_privacy.hrl").
start(Host, Opts) ->
IQDisc = gen_mod:get_opt(iqdisc, Opts, one_queue),
ejabberd_hooks:add(privacy_iq_get, Host,
?MODULE, process_iq_get, 50),
ejabberd_hooks:add(privacy_iq_set, Host,
?MODULE, process_iq_set, 50),
ejabberd_hooks:add(privacy_get_user_list, Host,
?MODULE, get_user_list, 50),
ejabberd_hooks:add(privacy_check_packet, Host,
?MODULE, check_packet, 50),
ejabberd_hooks:add(privacy_updated_list, Host,
?MODULE, updated_list, 50),
ejabberd_hooks:add(remove_user, Host,
?MODULE, remove_user, 50),
gen_iq_handler:add_iq_handler(ejabberd_sm, Host, ?NS_PRIVACY,
?MODULE, process_iq, IQDisc).
stop(Host) ->
ejabberd_hooks:delete(privacy_iq_get, Host,
?MODULE, process_iq_get, 50),
ejabberd_hooks:delete(privacy_iq_set, Host,
?MODULE, process_iq_set, 50),
ejabberd_hooks:delete(privacy_get_user_list, Host,
?MODULE, get_user_list, 50),
ejabberd_hooks:delete(privacy_check_packet, Host,
?MODULE, check_packet, 50),
ejabberd_hooks:delete(privacy_updated_list, Host,
?MODULE, updated_list, 50),
ejabberd_hooks:delete(remove_user, Host,
?MODULE, remove_user, 50),
gen_iq_handler:remove_iq_handler(ejabberd_sm, Host, ?NS_PRIVACY).
process_iq(_From, _To, IQ) ->
SubEl = IQ#iq.sub_el,
IQ#iq{type = error, sub_el = [SubEl, ?ERR_NOT_ALLOWED]}.
process_iq_get(_, From, _To, #iq{sub_el = SubEl},
#userlist{name = Active}) ->
#jid{luser = LUser, lserver = LServer} = From,
{xmlelement, _, _, Els} = SubEl,
case xml:remove_cdata(Els) of
[] ->
process_lists_get(LUser, LServer, Active);
[{xmlelement, Name, Attrs, _SubEls}] ->
case Name of
"list" ->
ListName = xml:get_attr("name", Attrs),
process_list_get(LUser, LServer, ListName);
_ ->
{error, ?ERR_BAD_REQUEST}
end;
_ ->
{error, ?ERR_BAD_REQUEST}
end.
process_lists_get(LUser, LServer, Active) ->
Default = case catch sql_get_default_privacy_list(LUser, LServer) of
{selected, ["name"], []} ->
none;
{selected, ["name"], [{DefName}]} ->
DefName;
_ ->
none
end,
case catch sql_get_privacy_list_names(LUser, LServer) of
{selected, ["name"], []} ->
{result, [{xmlelement, "query", [{"xmlns", ?NS_PRIVACY}], []}]};
{selected, ["name"], Names} ->
LItems = lists:map(
fun({N}) ->
{xmlelement, "list",
[{"name", N}], []}
end, Names),
DItems =
case Default of
none ->
LItems;
_ ->
[{xmlelement, "default",
[{"name", Default}], []} | LItems]
end,
ADItems =
case Active of
none ->
DItems;
_ ->
[{xmlelement, "active",
[{"name", Active}], []} | DItems]
end,
{result,
[{xmlelement, "query", [{"xmlns", ?NS_PRIVACY}],
ADItems}]};
_ ->
{error, ?ERR_INTERNAL_SERVER_ERROR}
end.
process_list_get(LUser, LServer, {value, Name}) ->
case catch sql_get_privacy_list_id(LUser, LServer, Name) of
{selected, ["id"], []} ->
{error, ?ERR_ITEM_NOT_FOUND};
{selected, ["id"], [{ID}]} ->
case catch sql_get_privacy_list_data_by_id(ID, LServer) of
{selected, ["t", "value", "action", "ord", "match_all",
"match_iq", "match_message",
"match_presence_in", "match_presence_out"],
RItems} ->
Items = lists:map(fun raw_to_item/1, RItems),
LItems = lists:map(fun item_to_xml/1, Items),
{result,
[{xmlelement, "query", [{"xmlns", ?NS_PRIVACY}],
[{xmlelement, "list",
[{"name", Name}], LItems}]}]};
_ ->
{error, ?ERR_INTERNAL_SERVER_ERROR}
end;
_ ->
{error, ?ERR_INTERNAL_SERVER_ERROR}
end;
process_list_get(_LUser, _LServer, false) ->
{error, ?ERR_BAD_REQUEST}.
item_to_xml(Item) ->
Attrs1 = [{"action", action_to_list(Item#listitem.action)},
{"order", order_to_list(Item#listitem.order)}],
Attrs2 = case Item#listitem.type of
none ->
Attrs1;
Type ->
[{"type", type_to_list(Item#listitem.type)},
{"value", value_to_list(Type, Item#listitem.value)} |
Attrs1]
end,
SubEls = case Item#listitem.match_all of
true ->
[];
false ->
SE1 = case Item#listitem.match_iq of
true ->
[{xmlelement, "iq", [], []}];
false ->
[]
end,
SE2 = case Item#listitem.match_message of
true ->
[{xmlelement, "message", [], []} | SE1];
false ->
SE1
end,
SE3 = case Item#listitem.match_presence_in of
true ->
[{xmlelement, "presence-in", [], []} | SE2];
false ->
SE2
end,
SE4 = case Item#listitem.match_presence_out of
true ->
[{xmlelement, "presence-out", [], []} | SE3];
false ->
SE3
end,
SE4
end,
{xmlelement, "item", Attrs2, SubEls}.
action_to_list(Action) ->
case Action of
allow -> "allow";
deny -> "deny"
end.
order_to_list(Order) ->
integer_to_list(Order).
type_to_list(Type) ->
case Type of
jid -> "jid";
group -> "group";
subscription -> "subscription"
end.
value_to_list(Type, Val) ->
case Type of
jid -> jlib:jid_to_string(Val);
group -> Val;
subscription ->
case Val of
both -> "both";
to -> "to";
from -> "from";
none -> "none"
end
end.
list_to_action(S) ->
case S of
"allow" -> allow;
"deny" -> deny
end.
process_iq_set(_, From, _To, #iq{sub_el = SubEl}) ->
#jid{luser = LUser, lserver = LServer} = From,
{xmlelement, _, _, Els} = SubEl,
case xml:remove_cdata(Els) of
[{xmlelement, Name, Attrs, SubEls}] ->
ListName = xml:get_attr("name", Attrs),
case Name of
"list" ->
process_list_set(LUser, LServer, ListName,
xml:remove_cdata(SubEls));
"active" ->
process_active_set(LUser, LServer, ListName);
"default" ->
process_default_set(LUser, LServer, ListName);
_ ->
{error, ?ERR_BAD_REQUEST}
end;
_ ->
{error, ?ERR_BAD_REQUEST}
end.
process_default_set(LUser, LServer, {value, Name}) ->
F = fun() ->
case sql_get_privacy_list_names_t(LUser) of
{selected, ["name"], []} ->
{error, ?ERR_ITEM_NOT_FOUND};
{selected, ["name"], Names} ->
case lists:member({Name}, Names) of
true ->
sql_set_default_privacy_list(LUser, Name),
{result, []};
false ->
{error, ?ERR_ITEM_NOT_FOUND}
end
end
end,
case odbc_queries:sql_transaction(LServer, F) of
{atomic, {error, _} = Error} ->
Error;
{atomic, {result, _} = Res} ->
Res;
_ ->
{error, ?ERR_INTERNAL_SERVER_ERROR}
end;
process_default_set(LUser, LServer, false) ->
case catch sql_unset_default_privacy_list(LUser, LServer) of
{'EXIT', _Reason} ->
{error, ?ERR_INTERNAL_SERVER_ERROR};
{error, _Reason} ->
{error, ?ERR_INTERNAL_SERVER_ERROR};
_ ->
{result, []}
end.
process_active_set(LUser, LServer, {value, Name}) ->
case catch sql_get_privacy_list_id(LUser, LServer, Name) of
{selected, ["id"], []} ->
{error, ?ERR_ITEM_NOT_FOUND};
{selected, ["id"], [{ID}]} ->
case catch sql_get_privacy_list_data_by_id(ID, LServer) of
{selected, ["t", "value", "action", "ord", "match_all",
"match_iq", "match_message",
"match_presence_in", "match_presence_out"],
RItems} ->
Items = lists:map(fun raw_to_item/1, RItems),
NeedDb = is_list_needdb(Items),
{result, [], #userlist{name = Name, list = Items, needdb = NeedDb}};
_ ->
{error, ?ERR_INTERNAL_SERVER_ERROR}
end;
_ ->
{error, ?ERR_INTERNAL_SERVER_ERROR}
end;
process_active_set(_LUser, _LServer, false) ->
{result, [], #userlist{}}.
process_list_set(LUser, LServer, {value, Name}, Els) ->
case parse_items(Els) of
false ->
{error, ?ERR_BAD_REQUEST};
remove ->
F =
fun() ->
case sql_get_default_privacy_list_t(LUser) of
{selected, ["name"], []} ->
sql_remove_privacy_list(LUser, Name),
{result, []};
{selected, ["name"], [{Default}]} ->
%% TODO: check active
if
Name == Default ->
{error, ?ERR_CONFLICT};
true ->
sql_remove_privacy_list(LUser, Name),
{result, []}
end
end
end,
case odbc_queries:sql_transaction(LServer, F) of
{atomic, {error, _} = Error} ->
Error;
{atomic, {result, _} = Res} ->
ejabberd_router:route(
jlib:make_jid(LUser, LServer, ""),
jlib:make_jid(LUser, LServer, ""),
{xmlelement, "broadcast", [],
[{privacy_list,
#userlist{name = Name, list = []},
Name}]}),
Res;
_ ->
{error, ?ERR_INTERNAL_SERVER_ERROR}
end;
List ->
RItems = lists:map(fun item_to_raw/1, List),
F =
fun() ->
ID =
case sql_get_privacy_list_id_t(LUser, Name) of
{selected, ["id"], []} ->
sql_add_privacy_list(LUser, Name),
{selected, ["id"], [{I}]} =
sql_get_privacy_list_id_t(LUser, Name),
I;
{selected, ["id"], [{I}]} ->
I
end,
sql_set_privacy_list(ID, RItems),
{result, []}
end,
case odbc_queries:sql_transaction(LServer, F) of
{atomic, {error, _} = Error} ->
Error;
{atomic, {result, _} = Res} ->
NeedDb = is_list_needdb(List),
ejabberd_router:route(
jlib:make_jid(LUser, LServer, ""),
jlib:make_jid(LUser, LServer, ""),
{xmlelement, "broadcast", [],
[{privacy_list,
#userlist{name = Name, list = List, needdb = NeedDb},
Name}]}),
Res;
_ ->
{error, ?ERR_INTERNAL_SERVER_ERROR}
end
end;
process_list_set(_LUser, _LServer, false, _Els) ->
{error, ?ERR_BAD_REQUEST}.
parse_items([]) ->
remove;
parse_items(Els) ->
parse_items(Els, []).
parse_items([], Res) ->
%% Sort the items by their 'order' attribute
lists:keysort(#listitem.order, Res);
parse_items([{xmlelement, "item", Attrs, SubEls} | Els], Res) ->
Type = xml:get_attr("type", Attrs),
Value = xml:get_attr("value", Attrs),
SAction = xml:get_attr("action", Attrs),
SOrder = xml:get_attr("order", Attrs),
Action = case catch list_to_action(element(2, SAction)) of
{'EXIT', _} -> false;
Val -> Val
end,
Order = case catch list_to_integer(element(2, SOrder)) of
{'EXIT', _} ->
false;
IntVal ->
if
IntVal >= 0 ->
IntVal;
true ->
false
end
end,
if
(Action /= false) and (Order /= false) ->
I1 = #listitem{action = Action, order = Order},
I2 = case {Type, Value} of
{{value, T}, {value, V}} ->
case T of
"jid" ->
case jlib:string_to_jid(V) of
error ->
false;
JID ->
I1#listitem{
type = jid,
value = jlib:jid_tolower(JID)}
end;
"group" ->
I1#listitem{type = group,
value = V};
"subscription" ->
case V of
"none" ->
I1#listitem{type = subscription,
value = none};
"both" ->
I1#listitem{type = subscription,
value = both};
"from" ->
I1#listitem{type = subscription,
value = from};
"to" ->
I1#listitem{type = subscription,
value = to};
_ ->
false
end
end;
{{value, _}, false} ->
false;
_ ->
I1
end,
case I2 of
false ->
false;
_ ->
case parse_matches(I2, xml:remove_cdata(SubEls)) of
false ->
false;
I3 ->
parse_items(Els, [I3 | Res])
end
end;
true ->
false
end;
parse_items(_, _Res) ->
false.
parse_matches(Item, []) ->
Item#listitem{match_all = true};
parse_matches(Item, Els) ->
parse_matches1(Item, Els).
parse_matches1(Item, []) ->
Item;
parse_matches1(Item, [{xmlelement, "message", _, _} | Els]) ->
parse_matches1(Item#listitem{match_message = true}, Els);
parse_matches1(Item, [{xmlelement, "iq", _, _} | Els]) ->
parse_matches1(Item#listitem{match_iq = true}, Els);
parse_matches1(Item, [{xmlelement, "presence-in", _, _} | Els]) ->
parse_matches1(Item#listitem{match_presence_in = true}, Els);
parse_matches1(Item, [{xmlelement, "presence-out", _, _} | Els]) ->
parse_matches1(Item#listitem{match_presence_out = true}, Els);
parse_matches1(_Item, [{xmlelement, _, _, _} | _Els]) ->
false.
is_list_needdb(Items) ->
lists:any(
fun(X) ->
case X#listitem.type of
subscription -> true;
group -> true;
_ -> false
end
end, Items).
get_user_list(_, User, Server) ->
LUser = jlib:nodeprep(User),
LServer = jlib:nameprep(Server),
case catch sql_get_default_privacy_list(LUser, LServer) of
{selected, ["name"], []} ->
#userlist{};
{selected, ["name"], [{Default}]} ->
case catch sql_get_privacy_list_data(LUser, LServer, Default) of
{selected, ["t", "value", "action", "ord", "match_all",
"match_iq", "match_message",
"match_presence_in", "match_presence_out"],
RItems} ->
Items = lists:map(fun raw_to_item/1, RItems),
NeedDb = is_list_needdb(Items),
#userlist{name = Default, list = Items, needdb = NeedDb};
_ ->
#userlist{}
end;
_ ->
#userlist{}
end.
%% From is the sender, To is the destination.
%% If Dir = out, User@Server is the sender account (From).
%% If Dir = in, User@Server is the destination account (To).
check_packet(_, _User, _Server,
_UserList,
{#jid{luser = "", lserver = Server} = _From,
#jid{lserver = Server} = _To,
_},
in) ->
allow;
check_packet(_, _User, _Server,
_UserList,
{#jid{lserver = Server} = _From,
#jid{luser = "", lserver = Server} = _To,
_},
out) ->
allow;
check_packet(_, _User, _Server,
_UserList,
{#jid{luser = User, lserver = Server} = _From,
#jid{luser = User, lserver = Server} = _To,
_},
_Dir) ->
allow;
check_packet(_, User, Server,
#userlist{list = List, needdb = NeedDb},
{From, To, {xmlelement, PName, Attrs, _}},
Dir) ->
case List of
[] ->
allow;
_ ->
PType = case PName of
"message" -> message;
"iq" -> iq;
"presence" ->
case xml:get_attr_s("type", Attrs) of
%% notification
"" -> presence;
"unavailable" -> presence;
%% subscribe, subscribed, unsubscribe,
%% unsubscribed, error, probe, or other
_ -> other
end
end,
PType2 = case {PType, Dir} of
{message, in} -> message;
{iq, in} -> iq;
{presence, in} -> presence_in;
{presence, out} -> presence_out;
{_, _} -> other
end,
LJID = case Dir of
in -> jlib:jid_tolower(From);
out -> jlib:jid_tolower(To)
end,
{Subscription, Groups} =
case NeedDb of
true -> ejabberd_hooks:run_fold(roster_get_jid_info,
jlib:nameprep(Server),
{none, []},
[User, Server, LJID]);
false -> {[], []}
end,
check_packet_aux(List, PType2, LJID, Subscription, Groups)
end.
check_packet_aux([], _PType, _JID, _Subscription, _Groups) ->
allow;
check_packet_aux([Item | List], PType, JID, Subscription, Groups) ->
#listitem{type = Type, value = Value, action = Action} = Item,
case is_ptype_match(Item, PType) of
true ->
case Type of
none ->
Action;
_ ->
case is_type_match(Type, Value,
JID, Subscription, Groups) of
true ->
Action;
false ->
check_packet_aux(List, PType,
JID, Subscription, Groups)
end
end;
false ->
check_packet_aux(List, PType, JID, Subscription, Groups)
end.
is_ptype_match(Item, PType) ->
case Item#listitem.match_all of
true ->
true;
false ->
case PType of
message ->
Item#listitem.match_message;
iq ->
Item#listitem.match_iq;
presence_in ->
Item#listitem.match_presence_in;
presence_out ->
Item#listitem.match_presence_out;
other ->
false
end
end.
is_type_match(Type, Value, JID, Subscription, Groups) ->
case Type of
jid ->
case Value of
{"", Server, ""} ->
case JID of
{_, Server, _} ->
true;
_ ->
false
end;
{User, Server, ""} ->
case JID of
{User, Server, _} ->
true;
_ ->
false
end;
_ ->
Value == JID
end;
subscription ->
Value == Subscription;
group ->
lists:member(Value, Groups)
end.
remove_user(User, Server) ->
LUser = jlib:nodeprep(User),
LServer = jlib:nameprep(Server),
sql_del_privacy_lists(LUser, LServer).
updated_list(_,
#userlist{name = OldName} = Old,
#userlist{name = NewName} = New) ->
if
OldName == NewName ->
New;
true ->
Old
end.
raw_to_item({SType, SValue, SAction, SOrder, SMatchAll, SMatchIQ,
SMatchMessage, SMatchPresenceIn, SMatchPresenceOut}) ->
{Type, Value} =
case SType of
"n" ->
{none, none};
"j" ->
case jlib:string_to_jid(SValue) of
#jid{} = JID ->
{jid, jlib:jid_tolower(JID)}
end;
"g" ->
{group, SValue};
"s" ->
case SValue of
"none" ->
{subscription, none};
"both" ->
{subscription, both};
"from" ->
{subscription, from};
"to" ->
{subscription, to}
end
end,
Action =
case SAction of
"a" -> allow;
"d" -> deny
end,
Order = list_to_integer(SOrder),
MatchAll = ejabberd_odbc:to_bool(SMatchAll),
MatchIQ = ejabberd_odbc:to_bool(SMatchIQ),
MatchMessage = ejabberd_odbc:to_bool(SMatchMessage),
MatchPresenceIn = ejabberd_odbc:to_bool(SMatchPresenceIn),
MatchPresenceOut = ejabberd_odbc:to_bool(SMatchPresenceOut),
#listitem{type = Type,
value = Value,
action = Action,
order = Order,
match_all = MatchAll,
match_iq = MatchIQ,
match_message = MatchMessage,
match_presence_in = MatchPresenceIn,
match_presence_out = MatchPresenceOut
}.
item_to_raw(#listitem{type = Type,
value = Value,
action = Action,
order = Order,
match_all = MatchAll,
match_iq = MatchIQ,
match_message = MatchMessage,
match_presence_in = MatchPresenceIn,
match_presence_out = MatchPresenceOut
}) ->
{SType, SValue} =
case Type of
none ->
{"n", ""};
jid ->
{"j", ejabberd_odbc:escape(jlib:jid_to_string(Value))};
group ->
{"g", ejabberd_odbc:escape(Value)};
subscription ->
case Value of
none ->
{"s", "none"};
both ->
{"s", "both"};
from ->
{"s", "from"};
to ->
{"s", "to"}
end
end,
SAction =
case Action of
allow -> "a";
deny -> "d"
end,
SOrder = integer_to_list(Order),
SMatchAll = if MatchAll -> "1"; true -> "0" end,
SMatchIQ = if MatchIQ -> "1"; true -> "0" end,
SMatchMessage = if MatchMessage -> "1"; true -> "0" end,
SMatchPresenceIn = if MatchPresenceIn -> "1"; true -> "0" end,
SMatchPresenceOut = if MatchPresenceOut -> "1"; true -> "0" end,
[SType, SValue, SAction, SOrder, SMatchAll, SMatchIQ,
SMatchMessage, SMatchPresenceIn, SMatchPresenceOut].
sql_get_default_privacy_list(LUser, LServer) ->
Username = ejabberd_odbc:escape(LUser),
odbc_queries:get_default_privacy_list(LServer, Username).
sql_get_default_privacy_list_t(LUser) ->
Username = ejabberd_odbc:escape(LUser),
odbc_queries:get_default_privacy_list_t(Username).
sql_get_privacy_list_names(LUser, LServer) ->
Username = ejabberd_odbc:escape(LUser),
odbc_queries:get_privacy_list_names(LServer, Username).
sql_get_privacy_list_names_t(LUser) ->
Username = ejabberd_odbc:escape(LUser),
odbc_queries:get_privacy_list_names_t(Username).
sql_get_privacy_list_id(LUser, LServer, Name) ->
Username = ejabberd_odbc:escape(LUser),
SName = ejabberd_odbc:escape(Name),
odbc_queries:get_privacy_list_id(LServer, Username, SName).
sql_get_privacy_list_id_t(LUser, Name) ->
Username = ejabberd_odbc:escape(LUser),
SName = ejabberd_odbc:escape(Name),
odbc_queries:get_privacy_list_id_t(Username, SName).
sql_get_privacy_list_data(LUser, LServer, Name) ->
Username = ejabberd_odbc:escape(LUser),
SName = ejabberd_odbc:escape(Name),
odbc_queries:get_privacy_list_data(LServer, Username, SName).
sql_get_privacy_list_data_by_id(ID, LServer) ->
odbc_queries:get_privacy_list_data_by_id(LServer, ID).
sql_get_privacy_list_data_by_id_t(ID) ->
odbc_queries:get_privacy_list_data_by_id_t(ID).
sql_set_default_privacy_list(LUser, Name) ->
Username = ejabberd_odbc:escape(LUser),
SName = ejabberd_odbc:escape(Name),
odbc_queries:set_default_privacy_list(Username, SName).
sql_unset_default_privacy_list(LUser, LServer) ->
Username = ejabberd_odbc:escape(LUser),
odbc_queries:unset_default_privacy_list(LServer, Username).
sql_remove_privacy_list(LUser, Name) ->
Username = ejabberd_odbc:escape(LUser),
SName = ejabberd_odbc:escape(Name),
odbc_queries:remove_privacy_list(Username, SName).
sql_add_privacy_list(LUser, Name) ->
Username = ejabberd_odbc:escape(LUser),
SName = ejabberd_odbc:escape(Name),
odbc_queries:add_privacy_list(Username, SName).
sql_set_privacy_list(ID, RItems) ->
odbc_queries:set_privacy_list(ID, RItems).
sql_del_privacy_lists(LUser, LServer) ->
Username = ejabberd_odbc:escape(LUser),
Server = ejabberd_odbc:escape(LServer),
odbc_queries:del_privacy_lists(LServer, Server, Username).
ejabberd-2.1.11/src/mod_vcard_odbc.erl 0000664 0000000 0000000 00000052307 12240230175 014445 0 ustar %%%----------------------------------------------------------------------
%%% File : mod_vcard.erl
%%% Author : Alexey Shchepin
%%% Purpose : vCard support via ODBC
%%% Created : 2 Jan 2003 by Alexey Shchepin
%%%
%%%
%%% ejabberd, Copyright (C) 2002-2012 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
%%% published by the Free Software Foundation; either version 2 of the
%%% License, or (at your option) any later version.
%%%
%%% This program is distributed in the hope that it will be useful,
%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
%%% General Public License for more details.
%%%
%%% You should have received a copy of the GNU General Public License
%%% along with this program; if not, write to the Free Software
%%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
%%% 02111-1307 USA
%%%
%%%----------------------------------------------------------------------
-module(mod_vcard_odbc).
-author('alexey@process-one.net').
-behaviour(gen_mod).
-export([start/2, init/3, stop/1,
get_sm_features/5,
process_local_iq/3,
process_sm_iq/3,
%reindex_vcards/0,
remove_user/2]).
-include("ejabberd.hrl").
-include("jlib.hrl").
-define(JUD_MATCHES, 30).
-define(PROCNAME, ejabberd_mod_vcard).
start(Host, Opts) ->
ejabberd_hooks:add(remove_user, Host,
?MODULE, remove_user, 50),
IQDisc = gen_mod:get_opt(iqdisc, Opts, one_queue),
gen_iq_handler:add_iq_handler(ejabberd_local, Host, ?NS_VCARD,
?MODULE, process_local_iq, IQDisc),
gen_iq_handler:add_iq_handler(ejabberd_sm, Host, ?NS_VCARD,
?MODULE, process_sm_iq, IQDisc),
ejabberd_hooks:add(disco_sm_features, Host, ?MODULE, get_sm_features, 50),
MyHost = gen_mod:get_opt_host(Host, Opts, "vjud.@HOST@"),
Search = gen_mod:get_opt(search, Opts, true),
register(gen_mod:get_module_proc(Host, ?PROCNAME),
spawn(?MODULE, init, [MyHost, Host, Search])).
init(Host, ServerHost, Search) ->
case Search of
false ->
loop(Host, ServerHost);
_ ->
ejabberd_router:register_route(Host),
loop(Host, ServerHost)
end.
loop(Host, ServerHost) ->
receive
{route, From, To, Packet} ->
case catch do_route(ServerHost, From, To, Packet) of
{'EXIT', Reason} ->
?ERROR_MSG("~p", [Reason]);
_ ->
ok
end,
loop(Host, ServerHost);
stop ->
ejabberd_router:unregister_route(Host),
ok;
_ ->
loop(Host, ServerHost)
end.
stop(Host) ->
ejabberd_hooks:delete(remove_user, Host,
?MODULE, remove_user, 50),
gen_iq_handler:remove_iq_handler(ejabberd_local, Host, ?NS_VCARD),
gen_iq_handler:remove_iq_handler(ejabberd_sm, Host, ?NS_VCARD),
ejabberd_hooks:delete(disco_sm_features, Host, ?MODULE, get_sm_features, 50),
Proc = gen_mod:get_module_proc(Host, ?PROCNAME),
Proc ! stop,
{wait, Proc}.
get_sm_features({error, _Error} = Acc, _From, _To, _Node, _Lang) ->
Acc;
get_sm_features(Acc, _From, _To, Node, _Lang) ->
case Node of
[] ->
case Acc of
{result, Features} ->
{result, [?NS_VCARD | Features]};
empty ->
{result, [?NS_VCARD]}
end;
_ ->
Acc
end.
process_local_iq(_From, _To, #iq{type = Type, lang = Lang, sub_el = SubEl} = IQ) ->
case Type of
set ->
IQ#iq{type = error, sub_el = [SubEl, ?ERR_NOT_ALLOWED]};
get ->
IQ#iq{type = result,
sub_el = [{xmlelement, "vCard",
[{"xmlns", ?NS_VCARD}],
[{xmlelement, "FN", [],
[{xmlcdata, "ejabberd"}]},
{xmlelement, "URL", [],
[{xmlcdata, ?EJABBERD_URI}]},
{xmlelement, "DESC", [],
[{xmlcdata,
translate:translate(
Lang,
"Erlang Jabber Server") ++
"\nCopyright (c) 2002-2012 ProcessOne"}]},
{xmlelement, "BDAY", [],
[{xmlcdata, "2002-11-16"}]}
]}]}
end.
process_sm_iq(From, To, #iq{type = Type, sub_el = SubEl} = IQ) ->
case Type of
set ->
#jid{user = User, lserver = LServer} = From,
case lists:member(LServer, ?MYHOSTS) of
true ->
set_vcard(User, LServer, SubEl),
IQ#iq{type = result, sub_el = []};
false ->
IQ#iq{type = error, sub_el = [SubEl, ?ERR_NOT_ALLOWED]}
end;
get ->
#jid{luser = LUser, lserver = LServer} = To,
Username = ejabberd_odbc:escape(LUser),
case catch odbc_queries:get_vcard(LServer, Username) of
{selected, ["vcard"], [{SVCARD}]} ->
case xml_stream:parse_element(SVCARD) of
{error, _Reason} ->
IQ#iq{type = error,
sub_el = [SubEl, ?ERR_SERVICE_UNAVAILABLE]};
VCARD ->
IQ#iq{type = result, sub_el = [VCARD]}
end;
{selected, ["vcard"], []} ->
IQ#iq{type = result, sub_el = []};
_ ->
IQ#iq{type = error,
sub_el = [SubEl, ?ERR_INTERNAL_SERVER_ERROR]}
end
end.
set_vcard(User, LServer, VCARD) ->
FN = xml:get_path_s(VCARD, [{elem, "FN"}, cdata]),
Family = xml:get_path_s(VCARD, [{elem, "N"}, {elem, "FAMILY"}, cdata]),
Given = xml:get_path_s(VCARD, [{elem, "N"}, {elem, "GIVEN"}, cdata]),
Middle = xml:get_path_s(VCARD, [{elem, "N"}, {elem, "MIDDLE"}, cdata]),
Nickname = xml:get_path_s(VCARD, [{elem, "NICKNAME"}, cdata]),
BDay = xml:get_path_s(VCARD, [{elem, "BDAY"}, cdata]),
CTRY = xml:get_path_s(VCARD, [{elem, "ADR"}, {elem, "CTRY"}, cdata]),
Locality = xml:get_path_s(VCARD, [{elem, "ADR"}, {elem, "LOCALITY"},cdata]),
EMail1 = xml:get_path_s(VCARD, [{elem, "EMAIL"}, {elem, "USERID"},cdata]),
EMail2 = xml:get_path_s(VCARD, [{elem, "EMAIL"}, cdata]),
OrgName = xml:get_path_s(VCARD, [{elem, "ORG"}, {elem, "ORGNAME"}, cdata]),
OrgUnit = xml:get_path_s(VCARD, [{elem, "ORG"}, {elem, "ORGUNIT"}, cdata]),
EMail = case EMail1 of
"" ->
EMail2;
_ ->
EMail1
end,
LUser = jlib:nodeprep(User),
LFN = string2lower(FN),
LFamily = string2lower(Family),
LGiven = string2lower(Given),
LMiddle = string2lower(Middle),
LNickname = string2lower(Nickname),
LBDay = string2lower(BDay),
LCTRY = string2lower(CTRY),
LLocality = string2lower(Locality),
LEMail = string2lower(EMail),
LOrgName = string2lower(OrgName),
LOrgUnit = string2lower(OrgUnit),
if
(LUser == error) or
(LFN == error) or
(LFamily == error) or
(LGiven == error) or
(LMiddle == error) or
(LNickname == error) or
(LBDay == error) or
(LCTRY == error) or
(LLocality == error) or
(LEMail == error) or
(LOrgName == error) or
(LOrgUnit == error) ->
{error, badarg};
true ->
Username = ejabberd_odbc:escape(User),
LUsername = ejabberd_odbc:escape(LUser),
SVCARD = ejabberd_odbc:escape(
xml:element_to_binary(VCARD)),
SFN = ejabberd_odbc:escape(FN),
SLFN = ejabberd_odbc:escape(LFN),
SFamily = ejabberd_odbc:escape(Family),
SLFamily = ejabberd_odbc:escape(LFamily),
SGiven = ejabberd_odbc:escape(Given),
SLGiven = ejabberd_odbc:escape(LGiven),
SMiddle = ejabberd_odbc:escape(Middle),
SLMiddle = ejabberd_odbc:escape(LMiddle),
SNickname = ejabberd_odbc:escape(Nickname),
SLNickname = ejabberd_odbc:escape(LNickname),
SBDay = ejabberd_odbc:escape(BDay),
SLBDay = ejabberd_odbc:escape(LBDay),
SCTRY = ejabberd_odbc:escape(CTRY),
SLCTRY = ejabberd_odbc:escape(LCTRY),
SLocality = ejabberd_odbc:escape(Locality),
SLLocality = ejabberd_odbc:escape(LLocality),
SEMail = ejabberd_odbc:escape(EMail),
SLEMail = ejabberd_odbc:escape(LEMail),
SOrgName = ejabberd_odbc:escape(OrgName),
SLOrgName = ejabberd_odbc:escape(LOrgName),
SOrgUnit = ejabberd_odbc:escape(OrgUnit),
SLOrgUnit = ejabberd_odbc:escape(LOrgUnit),
odbc_queries:set_vcard(LServer, LUsername, SBDay, SCTRY, SEMail,
SFN, SFamily, SGiven, SLBDay, SLCTRY,
SLEMail, SLFN, SLFamily, SLGiven,
SLLocality, SLMiddle, SLNickname,
SLOrgName, SLOrgUnit, SLocality,
SMiddle, SNickname, SOrgName,
SOrgUnit, SVCARD, Username),
ejabberd_hooks:run(vcard_set, LServer, [LUser, LServer, VCARD])
end.
string2lower(String) ->
case stringprep:tolower(String) of
Lower when is_list(Lower) -> Lower;
error -> string:to_lower(String)
end.
-define(TLFIELD(Type, Label, Var),
{xmlelement, "field", [{"type", Type},
{"label", translate:translate(Lang, Label)},
{"var", Var}], []}).
-define(FORM(JID),
[{xmlelement, "instructions", [],
[{xmlcdata, translate:translate(Lang, "You need an x:data capable client to search")}]},
{xmlelement, "x", [{"xmlns", ?NS_XDATA}, {"type", "form"}],
[{xmlelement, "title", [],
[{xmlcdata, translate:translate(Lang, "Search users in ") ++
jlib:jid_to_string(JID)}]},
{xmlelement, "instructions", [],
[{xmlcdata, translate:translate(Lang, "Fill in the form to search "
"for any matching Jabber User "
"(Add * to the end of field to "
"match substring)")}]},
?TLFIELD("text-single", "User", "user"),
?TLFIELD("text-single", "Full Name", "fn"),
?TLFIELD("text-single", "Name", "first"),
?TLFIELD("text-single", "Middle Name", "middle"),
?TLFIELD("text-single", "Family Name", "last"),
?TLFIELD("text-single", "Nickname", "nick"),
?TLFIELD("text-single", "Birthday", "bday"),
?TLFIELD("text-single", "Country", "ctry"),
?TLFIELD("text-single", "City", "locality"),
?TLFIELD("text-single", "Email", "email"),
?TLFIELD("text-single", "Organization Name", "orgname"),
?TLFIELD("text-single", "Organization Unit", "orgunit")
]}]).
do_route(ServerHost, From, To, Packet) ->
#jid{user = User, resource = Resource} = To,
if
(User /= "") or (Resource /= "") ->
Err = jlib:make_error_reply(Packet, ?ERR_SERVICE_UNAVAILABLE),
ejabberd_router:route(To, From, Err);
true ->
IQ = jlib:iq_query_info(Packet),
case IQ of
#iq{type = Type, xmlns = ?NS_SEARCH, lang = Lang, sub_el = SubEl} ->
case Type of
set ->
XDataEl = find_xdata_el(SubEl),
case XDataEl of
false ->
Err = jlib:make_error_reply(
Packet, ?ERR_BAD_REQUEST),
ejabberd_router:route(To, From, Err);
_ ->
XData = jlib:parse_xdata_submit(XDataEl),
case XData of
invalid ->
Err = jlib:make_error_reply(
Packet,
?ERR_BAD_REQUEST),
ejabberd_router:route(To, From,
Err);
_ ->
ResIQ =
IQ#iq{
type = result,
sub_el =
[{xmlelement,
"query",
[{"xmlns", ?NS_SEARCH}],
[{xmlelement, "x",
[{"xmlns", ?NS_XDATA},
{"type", "result"}],
search_result(Lang, To, ServerHost, XData)
}]}]},
ejabberd_router:route(
To, From, jlib:iq_to_xml(ResIQ))
end
end;
get ->
ResIQ = IQ#iq{type = result,
sub_el = [{xmlelement,
"query",
[{"xmlns", ?NS_SEARCH}],
?FORM(To)
}]},
ejabberd_router:route(To,
From,
jlib:iq_to_xml(ResIQ))
end;
#iq{type = Type, xmlns = ?NS_DISCO_INFO, lang = Lang} ->
case Type of
set ->
Err = jlib:make_error_reply(
Packet, ?ERR_NOT_ALLOWED),
ejabberd_router:route(To, From, Err);
get ->
Info = ejabberd_hooks:run_fold(
disco_info, ServerHost, [],
[ServerHost, ?MODULE, "", ""]),
ResIQ =
IQ#iq{type = result,
sub_el = [{xmlelement,
"query",
[{"xmlns", ?NS_DISCO_INFO}],
[{xmlelement, "identity",
[{"category", "directory"},
{"type", "user"},
{"name",
translate:translate(Lang, "vCard User Search")}],
[]},
{xmlelement, "feature",
[{"var", ?NS_SEARCH}], []},
{xmlelement, "feature",
[{"var", ?NS_VCARD}], []}
] ++ Info
}]},
ejabberd_router:route(To,
From,
jlib:iq_to_xml(ResIQ))
end;
#iq{type = Type, xmlns = ?NS_DISCO_ITEMS} ->
case Type of
set ->
Err = jlib:make_error_reply(
Packet, ?ERR_NOT_ALLOWED),
ejabberd_router:route(To, From, Err);
get ->
ResIQ =
IQ#iq{type = result,
sub_el = [{xmlelement,
"query",
[{"xmlns", ?NS_DISCO_ITEMS}],
[]}]},
ejabberd_router:route(To,
From,
jlib:iq_to_xml(ResIQ))
end;
#iq{type = get, xmlns = ?NS_VCARD, lang = Lang} ->
ResIQ =
IQ#iq{type = result,
sub_el = [{xmlelement,
"vCard",
[{"xmlns", ?NS_VCARD}],
iq_get_vcard(Lang)}]},
ejabberd_router:route(To,
From,
jlib:iq_to_xml(ResIQ));
_ ->
Err = jlib:make_error_reply(Packet,
?ERR_SERVICE_UNAVAILABLE),
ejabberd_router:route(To, From, Err)
end
end.
iq_get_vcard(Lang) ->
[{xmlelement, "FN", [],
[{xmlcdata, "ejabberd/mod_vcard"}]},
{xmlelement, "URL", [],
[{xmlcdata, ?EJABBERD_URI}]},
{xmlelement, "DESC", [],
[{xmlcdata, translate:translate(
Lang,
"ejabberd vCard module") ++
"\nCopyright (c) 2003-2012 ProcessOne"}]}].
find_xdata_el({xmlelement, _Name, _Attrs, SubEls}) ->
find_xdata_el1(SubEls).
find_xdata_el1([]) ->
false;
find_xdata_el1([{xmlelement, Name, Attrs, SubEls} | Els]) ->
case xml:get_attr_s("xmlns", Attrs) of
?NS_XDATA ->
{xmlelement, Name, Attrs, SubEls};
_ ->
find_xdata_el1(Els)
end;
find_xdata_el1([_ | Els]) ->
find_xdata_el1(Els).
-define(LFIELD(Label, Var),
{xmlelement, "field", [{"label", translate:translate(Lang, Label)},
{"var", Var}], []}).
search_result(Lang, JID, ServerHost, Data) ->
[{xmlelement, "title", [],
[{xmlcdata, translate:translate(Lang, "Search Results for ") ++
jlib:jid_to_string(JID)}]},
{xmlelement, "reported", [],
[?TLFIELD("text-single", "Jabber ID", "jid"),
?TLFIELD("text-single", "Full Name", "fn"),
?TLFIELD("text-single", "Name", "first"),
?TLFIELD("text-single", "Middle Name", "middle"),
?TLFIELD("text-single", "Family Name", "last"),
?TLFIELD("text-single", "Nickname", "nick"),
?TLFIELD("text-single", "Birthday", "bday"),
?TLFIELD("text-single", "Country", "ctry"),
?TLFIELD("text-single", "City", "locality"),
?TLFIELD("text-single", "Email", "email"),
?TLFIELD("text-single", "Organization Name", "orgname"),
?TLFIELD("text-single", "Organization Unit", "orgunit")
]}] ++ lists:map(fun(R) -> record_to_item(ServerHost, R) end,
search(ServerHost, Data)).
-define(FIELD(Var, Val),
{xmlelement, "field", [{"var", Var}],
[{xmlelement, "value", [],
[{xmlcdata, Val}]}]}).
record_to_item(LServer, {Username, FN, Family, Given, Middle,
Nickname, BDay, CTRY, Locality,
EMail, OrgName, OrgUnit}) ->
{xmlelement, "item", [],
[
?FIELD("jid", Username ++ "@" ++ LServer),
?FIELD("fn", FN),
?FIELD("last", Family),
?FIELD("first", Given),
?FIELD("middle", Middle),
?FIELD("nick", Nickname),
?FIELD("bday", BDay),
?FIELD("ctry", CTRY),
?FIELD("locality", Locality),
?FIELD("email", EMail),
?FIELD("orgname", OrgName),
?FIELD("orgunit", OrgUnit)
]
}.
search(LServer, Data) ->
MatchSpec = make_matchspec(LServer, Data),
AllowReturnAll = gen_mod:get_module_opt(LServer, ?MODULE,
allow_return_all, false),
if
(MatchSpec == "") and (not AllowReturnAll) ->
[];
true ->
Limit = case gen_mod:get_module_opt(LServer, ?MODULE,
matches, ?JUD_MATCHES) of
infinity ->
"";
Val when is_integer(Val) and (Val > 0) ->
[" LIMIT ", integer_to_list(Val)];
Val ->
?ERROR_MSG("Illegal option value ~p. "
"Default value ~p substituted.",
[{matches, Val}, ?JUD_MATCHES]),
[" LIMIT ", integer_to_list(?JUD_MATCHES)]
end,
case catch ejabberd_odbc:sql_query(
LServer,
["select username, fn, family, given, middle, "
" nickname, bday, ctry, locality, "
" email, orgname, orgunit from vcard_search ",
MatchSpec, Limit, ";"]) of
{selected, ["username", "fn", "family", "given", "middle",
"nickname", "bday", "ctry", "locality",
"email", "orgname", "orgunit"],
Rs} when is_list(Rs) ->
Rs;
Error ->
?ERROR_MSG("~p", [Error]),
[]
end
end.
make_matchspec(LServer, Data) ->
filter_fields(Data, "", LServer).
filter_fields([], Match, _LServer) ->
case Match of
"" ->
"";
_ ->
[" where ", Match]
end;
filter_fields([{SVar, [Val]} | Ds], Match, LServer)
when is_list(Val) and (Val /= "") ->
LVal = string2lower(Val),
NewMatch = case SVar of
"user" -> make_val(Match, "lusername", LVal);
"fn" -> make_val(Match, "lfn", LVal);
"last" -> make_val(Match, "lfamily", LVal);
"first" -> make_val(Match, "lgiven", LVal);
"middle" -> make_val(Match, "lmiddle", LVal);
"nick" -> make_val(Match, "lnickname", LVal);
"bday" -> make_val(Match, "lbday", LVal);
"ctry" -> make_val(Match, "lctry", LVal);
"locality" -> make_val(Match, "llocality", LVal);
"email" -> make_val(Match, "lemail", LVal);
"orgname" -> make_val(Match, "lorgname", LVal);
"orgunit" -> make_val(Match, "lorgunit", LVal);
_ -> Match
end,
filter_fields(Ds, NewMatch, LServer);
filter_fields([_ | Ds], Match, LServer) ->
filter_fields(Ds, Match, LServer).
make_val(Match, Field, Val) ->
Condition =
case lists:suffix("*", Val) of
true ->
Val1 = lists:sublist(Val, length(Val) - 1),
SVal = ejabberd_odbc:escape_like(Val1) ++ "%",
[Field, " LIKE '", SVal, "'"];
_ ->
SVal = ejabberd_odbc:escape(Val),
[Field, " = '", SVal, "'"]
end,
case Match of
"" ->
Condition;
_ ->
[Match, " and ", Condition]
end.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%set_vcard_t(R, _) ->
% US = R#vcard.us,
% User = US,
% VCARD = R#vcard.vcard,
%
% FN = xml:get_path_s(VCARD, [{elem, "FN"}, cdata]),
% Family = xml:get_path_s(VCARD, [{elem, "N"}, {elem, "FAMILY"}, cdata]),
% Given = xml:get_path_s(VCARD, [{elem, "N"}, {elem, "GIVEN"}, cdata]),
% Middle = xml:get_path_s(VCARD, [{elem, "N"}, {elem, "MIDDLE"}, cdata]),
% Nickname = xml:get_path_s(VCARD, [{elem, "NICKNAME"}, cdata]),
% BDay = xml:get_path_s(VCARD, [{elem, "BDAY"}, cdata]),
% CTRY = xml:get_path_s(VCARD, [{elem, "ADR"}, {elem, "CTRY"}, cdata]),
% Locality = xml:get_path_s(VCARD, [{elem, "ADR"}, {elem, "LOCALITY"},cdata]),
% EMail = xml:get_path_s(VCARD, [{elem, "EMAIL"}, cdata]),
% OrgName = xml:get_path_s(VCARD, [{elem, "ORG"}, {elem, "ORGNAME"}, cdata]),
% OrgUnit = xml:get_path_s(VCARD, [{elem, "ORG"}, {elem, "ORGUNIT"}, cdata]),
%
% {LUser, _LServer} = US,
% LFN = stringprep:tolower(FN),
% LFamily = stringprep:tolower(Family),
% LGiven = stringprep:tolower(Given),
% LMiddle = stringprep:tolower(Middle),
% LNickname = stringprep:tolower(Nickname),
% LBDay = stringprep:tolower(BDay),
% LCTRY = stringprep:tolower(CTRY),
% LLocality = stringprep:tolower(Locality),
% LEMail = stringprep:tolower(EMail),
% LOrgName = stringprep:tolower(OrgName),
% LOrgUnit = stringprep:tolower(OrgUnit),
%
% if
% (LUser == error) or
% (LFN == error) or
% (LFamily == error) or
% (LGiven == error) or
% (LMiddle == error) or
% (LNickname == error) or
% (LBDay == error) or
% (LCTRY == error) or
% (LLocality == error) or
% (LEMail == error) or
% (LOrgName == error) or
% (LOrgUnit == error) ->
% {error, badarg};
% true ->
% mnesia:write(
% #vcard_search{us = US,
% user = User, luser = LUser,
% fn = FN, lfn = LFN,
% family = Family, lfamily = LFamily,
% given = Given, lgiven = LGiven,
% middle = Middle, lmiddle = LMiddle,
% nickname = Nickname, lnickname = LNickname,
% bday = BDay, lbday = LBDay,
% ctry = CTRY, lctry = LCTRY,
% locality = Locality, llocality = LLocality,
% email = EMail, lemail = LEMail,
% orgname = OrgName, lorgname = LOrgName,
% orgunit = OrgUnit, lorgunit = LOrgUnit
% })
% end.
%
%
%reindex_vcards() ->
% F = fun() ->
% mnesia:foldl(fun set_vcard_t/2, [], vcard)
% end,
% mnesia:transaction(F).
remove_user(User, Server) ->
LUser = jlib:nodeprep(User),
LServer = jlib:nameprep(Server),
Username = ejabberd_odbc:escape(LUser),
ejabberd_odbc:sql_transaction(
LServer,
[["delete from vcard where username='", Username, "';"],
["delete from vcard_search where lusername='", Username, "';"]]).
ejabberd-2.1.11/src/eldap/ 0000775 0000000 0000000 00000000000 12240452476 012104 5 ustar ejabberd-2.1.11/src/eldap/eldap_pool.erl 0000664 0000000 0000000 00000005366 12240230175 014726 0 ustar %%%-------------------------------------------------------------------
%%% File : eldap_pool.erl
%%% Author : Evgeniy Khramtsov
%%% Purpose : LDAP connections pool
%%% Created : 12 Nov 2006 by Evgeniy Khramtsov
%%%
%%%
%%% ejabberd, Copyright (C) 2002-2012 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
%%% published by the Free Software Foundation; either version 2 of the
%%% License, or (at your option) any later version.
%%%
%%% This program is distributed in the hope that it will be useful,
%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
%%% General Public License for more details.
%%%
%%% You should have received a copy of the GNU General Public License
%%% along with this program; if not, write to the Free Software
%%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
%%% 02111-1307 USA
%%%
%%%-------------------------------------------------------------------
-module(eldap_pool).
-author('xram@jabber.ru').
%% API
-export([
start_link/7,
bind/3,
search/2,
modify_passwd/3
]).
-include("ejabberd.hrl").
-ifdef(SSL40).
-define(PG2, pg2).
-else.
-define(PG2, pg2_backport).
-endif.
%%====================================================================
%% API
%%====================================================================
bind(PoolName, DN, Passwd) ->
do_request(PoolName, {bind, [DN, Passwd]}).
search(PoolName, Opts) ->
do_request(PoolName, {search, [Opts]}).
modify_passwd(PoolName, DN, Passwd) ->
do_request(PoolName, {modify_passwd, [DN, Passwd]}).
start_link(Name, Hosts, Backups, Port, Rootdn, Passwd, Opts) ->
PoolName = make_id(Name),
?PG2:create(PoolName),
lists:foreach(
fun(Host) ->
ID = erlang:ref_to_list(make_ref()),
case catch eldap:start_link(ID, [Host|Backups], Port,
Rootdn, Passwd, Opts) of
{ok, Pid} ->
?PG2:join(PoolName, Pid);
_ ->
error
end
end, Hosts).
%%====================================================================
%% Internal functions
%%====================================================================
do_request(Name, {F, Args}) ->
case ?PG2:get_closest_pid(make_id(Name)) of
Pid when is_pid(Pid) ->
case catch apply(eldap, F, [Pid | Args]) of
{'EXIT', {timeout, _}} ->
?ERROR_MSG("LDAP request failed: timed out", []);
{'EXIT', Reason} ->
?ERROR_MSG("LDAP request failed: eldap:~p(~p)~nReason: ~p",
[F, Args, Reason]),
{error, Reason};
Reply ->
Reply
end;
Err ->
Err
end.
make_id(Name) ->
list_to_atom("eldap_pool_" ++ Name).
ejabberd-2.1.11/src/eldap/eldap.hrl 0000664 0000000 0000000 00000002510 12240230175 013664 0 ustar %%%----------------------------------------------------------------------
%%%
%%% ejabberd, Copyright (C) 2002-2012 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
%%% published by the Free Software Foundation; either version 2 of the
%%% License, or (at your option) any later version.
%%%
%%% This program is distributed in the hope that it will be useful,
%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
%%% General Public License for more details.
%%%
%%% You should have received a copy of the GNU General Public License
%%% along with this program; if not, write to the Free Software
%%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
%%% 02111-1307 USA
%%%
%%%----------------------------------------------------------------------
-define(LDAP_PORT, 389).
-define(LDAPS_PORT, 636).
-record(eldap_search, {scope = wholeSubtree,
base = [],
filter,
limit = 0,
attributes = [],
types_only = false,
deref_aliases = neverDerefAliases,
timeout = 0}).
-record(eldap_search_result, {entries,
referrals}).
-record(eldap_entry, {object_name,
attributes}).
ejabberd-2.1.11/src/eldap/Makefile.in 0000664 0000000 0000000 00000002132 12240230175 014135 0 ustar # $Id: Makefile.in 2842 2009-12-29 19:10:52Z badlop $
CC = @CC@
CFLAGS = @CFLAGS@
CPPFLAGS = @CPPFLAGS@
LDFLAGS = @LDFLAGS@
LIBS = @LIBS@
ASN_FLAGS = -bber_bin +optimize
ERLANG_CFLAGS = @ERLANG_CFLAGS@
ERLANG_LIBS = @ERLANG_LIBS@
EFLAGS += @ERLANG_SSLVER@
EFLAGS += -I ..
EFLAGS += -pz ..
# make debug=true to compile Erlang module with debug informations.
ifdef debug
EFLAGS+=+debug_info +export_all
endif
OUTDIR = ..
SOURCES = $(wildcard *.erl) ELDAPv3.erl eldap_filter_yecc.erl
BEAMS = $(addprefix $(OUTDIR)/,$(SOURCES:.erl=.beam))
all: $(BEAMS) ELDAPv3.beam eldap_filter_yecc.beam
ELDAPv3.beam: ELDAPv3.erl
ELDAPv3.erl: ELDAPv3.asn
@ERLC@ $(ASN_FLAGS) -W $(EFLAGS) $<
eldap_filter_yecc.beam: eldap_filter_yecc.erl
eldap_filter_yecc.erl: eldap_filter_yecc.yrl
@ERLC@ -W $<
$(OUTDIR)/%.beam: %.erl ELDAPv3.erl eldap_filter_yecc.erl
@ERLC@ -W $(EFLAGS) -o $(OUTDIR) $<
clean:
rm -f ELDAPv3.asn1db
rm -f ELDAPv3.erl
rm -f ELDAPv3.hrl
rm -f ELDAPv3.beam
rm -f eldap_filter_yecc.erl
rm -f eldap_filter_yecc.beam
rm -f $(BEAMS)
distclean: clean
rm -f Makefile
TAGS:
etags *.erl
ejabberd-2.1.11/src/eldap/eldap.erl 0000664 0000000 0000000 00000123362 12240230175 013672 0 ustar -module(eldap).
%%% --------------------------------------------------------------------
%%% Created: 12 Oct 2000 by Tobbe
%%% Function: Erlang client LDAP implementation according RFC 2251.
%%% The interface is based on RFC 1823, and
%%% draft-ietf-asid-ldap-c-api-00.txt
%%%
%%% Copyright (C) 2000 Torbjorn Tornkvist, tnt@home.se
%%%
%%% This program is free software; you can redistribute it and/or modify
%%% it under the terms of the GNU General Public License as published by
%%% the Free Software Foundation; either version 2 of the License, or
%%% (at your option) any later version.
%%%
%%% This program is distributed in the hope that it will be useful,
%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
%%% GNU General Public License for more details.
%%%
%%% You should have received a copy of the GNU General Public License
%%% along with this program; if not, write to the Free Software
%%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
%%% Modified by Sean Hinde 7th Dec 2000
%%% Turned into gen_fsm, made non-blocking, added timers etc to support this.
%%% Now has the concept of a name (string() or atom()) per instance which allows
%%% multiple users to call by name if so desired.
%%%
%%% Can be configured with start_link parameters or use a config file to get
%%% host to connect to, dn, password, log function etc.
%%% Modified by Alexey Shchepin
%%% Modified by Evgeniy Khramtsov
%%% Implemented queue for bind() requests to prevent pending binds.
%%% Implemented extensibleMatch/2 function.
%%% Implemented LDAP Extended Operations (currently only Password Modify
%%% is supported - RFC 3062).
%%% Modified by Christophe Romain
%%% Improve error case handling
%%% Modified by Mickael Remond
%%% Now use ejabberd log mechanism
%%% Modified by:
%%% Thomas Baden 2008 April 6th
%%% Andy Harb 2008 April 28th
%%% Anton Podavalov 2009 February 22th
%%% Added LDAPS support, modeled off jungerl eldap.erl version.
%%% NOTICE: STARTTLS is not supported.
%%% --------------------------------------------------------------------
-vc('$Id$ ').
%%%----------------------------------------------------------------------
%%% LDAP Client state machine.
%%% Possible states are:
%%% connecting - actually disconnected, but retrying periodically
%%% wait_bind_response - connected and sent bind request
%%% active - bound to LDAP Server and ready to handle commands
%%% active_bind - sent bind() request and waiting for response
%%%----------------------------------------------------------------------
-behaviour(gen_fsm).
-include("ejabberd.hrl").
%% External exports
-export([start_link/1, start_link/6]).
-export([baseObject/0,singleLevel/0,wholeSubtree/0,close/1,
equalityMatch/2,greaterOrEqual/2,lessOrEqual/2,
approxMatch/2,search/2,substrings/2,present/1,extensibleMatch/2,
'and'/1,'or'/1,'not'/1,modify/3, mod_add/2, mod_delete/2,
mod_replace/2, add/3, delete/2, modify_dn/5, modify_passwd/3, bind/3]).
-export([get_status/1]).
%% gen_fsm callbacks
-export([init/1, connecting/2,
connecting/3, wait_bind_response/3, active/3, active_bind/3, handle_event/3,
handle_sync_event/4, handle_info/3, terminate/3, code_change/4]).
-import(lists,[concat/1]).
-include("ELDAPv3.hrl").
-include("eldap.hrl").
-define(LDAP_VERSION, 3).
-define(RETRY_TIMEOUT, 500).
-define(BIND_TIMEOUT, 10000).
-define(CMD_TIMEOUT, 100000).
%% Used in gen_fsm sync calls.
-define(CALL_TIMEOUT, ?CMD_TIMEOUT + ?BIND_TIMEOUT + ?RETRY_TIMEOUT).
%% Used as a timeout for gen_tcp:send/2
-define(SEND_TIMEOUT, 30000).
-define(MAX_TRANSACTION_ID, 65535).
-define(MIN_TRANSACTION_ID, 0).
%% Grace period after "soft" LDAP bind errors:
-define(GRACEFUL_RETRY_TIMEOUT, 5000).
-define(SUPPORTEDEXTENSION, "1.3.6.1.4.1.1466.101.120.7").
-define(SUPPORTEDEXTENSIONSYNTAX, "1.3.6.1.4.1.1466.115.121.1.38").
-define(STARTTLS, "1.3.6.1.4.1.1466.20037").
-record(eldap, {version = ?LDAP_VERSION,
hosts, % Possible hosts running LDAP servers
host = null, % Connected Host LDAP server
port = 389, % The LDAP server port
sockmod, % SockMod (gen_tcp|tls)
tls = none, % LDAP/LDAPS (none|tls)
tls_options = [],
fd = null, % Socket filedescriptor.
rootdn = "", % Name of the entry to bind as
passwd, % Password for (above) entry
id = 0, % LDAP Request ID
bind_timer, % Ref to bind timeout
dict, % dict holding operation params and results
req_q % Queue for requests
}).
%%%----------------------------------------------------------------------
%%% API
%%%----------------------------------------------------------------------
start_link(Name) ->
Reg_name = list_to_atom("eldap_" ++ Name),
gen_fsm:start_link({local, Reg_name}, ?MODULE, [], []).
start_link(Name, Hosts, Port, Rootdn, Passwd, Opts) ->
Reg_name = list_to_atom("eldap_" ++ Name),
gen_fsm:start_link({local, Reg_name}, ?MODULE,
{Hosts, Port, Rootdn, Passwd, Opts}, []).
%%% --------------------------------------------------------------------
%%% Get status of connection.
%%% --------------------------------------------------------------------
get_status(Handle) ->
Handle1 = get_handle(Handle),
gen_fsm:sync_send_all_state_event(Handle1, get_status).
%%% --------------------------------------------------------------------
%%% Shutdown connection (and process) asynchronous.
%%% --------------------------------------------------------------------
close(Handle) ->
Handle1 = get_handle(Handle),
gen_fsm:send_all_state_event(Handle1, close).
%%% --------------------------------------------------------------------
%%% Add an entry. The entry field MUST NOT exist for the AddRequest
%%% to succeed. The parent of the entry MUST exist.
%%% Example:
%%%
%%% add(Handle,
%%% "cn=Bill Valentine, ou=people, o=Bluetail AB, dc=bluetail, dc=com",
%%% [{"objectclass", ["person"]},
%%% {"cn", ["Bill Valentine"]},
%%% {"sn", ["Valentine"]},
%%% {"telephoneNumber", ["545 555 00"]}]
%%% )
%%% --------------------------------------------------------------------
add(Handle, Entry, Attributes) when is_list(Entry), is_list(Attributes) ->
Handle1 = get_handle(Handle),
gen_fsm:sync_send_event(Handle1, {add, Entry, add_attrs(Attributes)},
?CALL_TIMEOUT).
%%% Do sanity check !
add_attrs(Attrs) ->
F = fun({Type,Vals}) when is_list(Type), is_list(Vals) ->
%% Confused ? Me too... :-/
{'AddRequest_attributes',Type, Vals}
end,
case catch lists:map(F, Attrs) of
{'EXIT', _} -> throw({error, attribute_values});
Else -> Else
end.
%%% --------------------------------------------------------------------
%%% Delete an entry. The entry consists of the DN of
%%% the entry to be deleted.
%%% Example:
%%%
%%% delete(Handle,
%%% "cn=Bill Valentine, ou=people, o=Bluetail AB, dc=bluetail, dc=com"
%%% )
%%% --------------------------------------------------------------------
delete(Handle, Entry) when is_list(Entry) ->
Handle1 = get_handle(Handle),
gen_fsm:sync_send_event(Handle1, {delete, Entry}, ?CALL_TIMEOUT).
%%% --------------------------------------------------------------------
%%% Modify an entry. Given an entry a number of modification
%%% operations can be performed as one atomic operation.
%%% Example:
%%%
%%% modify(Handle,
%%% "cn=Torbjorn Tornkvist, ou=people, o=Bluetail AB, dc=bluetail, dc=com",
%%% [replace("telephoneNumber", ["555 555 00"]),
%%% add("description", ["LDAP hacker"])]
%%% )
%%% --------------------------------------------------------------------
modify(Handle, Object, Mods) when is_list(Object), is_list(Mods) ->
Handle1 = get_handle(Handle),
gen_fsm:sync_send_event(Handle1, {modify, Object, Mods}, ?CALL_TIMEOUT).
%%%
%%% Modification operations.
%%% Example:
%%% replace("telephoneNumber", ["555 555 00"])
%%%
mod_add(Type, Values) when is_list(Type), is_list(Values) -> m(add, Type, Values).
mod_delete(Type, Values) when is_list(Type), is_list(Values) -> m(delete, Type, Values).
mod_replace(Type, Values) when is_list(Type), is_list(Values) -> m(replace, Type, Values).
m(Operation, Type, Values) ->
#'ModifyRequest_modification_SEQOF'{
operation = Operation,
modification = #'AttributeTypeAndValues'{
type = Type,
vals = Values}}.
%%% --------------------------------------------------------------------
%%% Modify an entry. Given an entry a number of modification
%%% operations can be performed as one atomic operation.
%%% Example:
%%%
%%% modify_dn(Handle,
%%% "cn=Bill Valentine, ou=people, o=Bluetail AB, dc=bluetail, dc=com",
%%% "cn=Ben Emerson",
%%% true,
%%% ""
%%% )
%%% --------------------------------------------------------------------
modify_dn(Handle, Entry, NewRDN, DelOldRDN, NewSup)
when is_list(Entry), is_list(NewRDN), is_atom(DelOldRDN), is_list(NewSup) ->
Handle1 = get_handle(Handle),
gen_fsm:sync_send_event(
Handle1,
{modify_dn, Entry, NewRDN, bool_p(DelOldRDN), optional(NewSup)},
?CALL_TIMEOUT).
modify_passwd(Handle, DN, Passwd) when is_list(DN), is_list(Passwd) ->
Handle1 = get_handle(Handle),
gen_fsm:sync_send_event(
Handle1, {modify_passwd, DN, Passwd}, ?CALL_TIMEOUT).
%%% --------------------------------------------------------------------
%%% Bind.
%%% Example:
%%%
%%% bind(Handle,
%%% "cn=Bill Valentine, ou=people, o=Bluetail AB, dc=bluetail, dc=com",
%%% "secret")
%%% --------------------------------------------------------------------
bind(Handle, RootDN, Passwd)
when is_list(RootDN), is_list(Passwd) ->
Handle1 = get_handle(Handle),
gen_fsm:sync_send_event(Handle1, {bind, RootDN, Passwd}, ?CALL_TIMEOUT).
%%% Sanity checks !
bool_p(Bool) when Bool==true;Bool==false -> Bool.
optional([]) -> asn1_NOVALUE;
optional(Value) -> Value.
%%% --------------------------------------------------------------------
%%% Synchronous search of the Directory returning a
%%% requested set of attributes.
%%%
%%% Example:
%%%
%%% Filter = eldap:substrings("sn", [{any,"o"}]),
%%% eldap:search(S, [{base, "dc=bluetail, dc=com"},
%%% {filter, Filter},
%%% {attributes,["cn"]}])),
%%%
%%% Returned result: {ok, #eldap_search_result{}}
%%%
%%% Example:
%%%
%%% {ok,{eldap_search_result,
%%% [{eldap_entry,
%%% "cn=Magnus Froberg, dc=bluetail, dc=com",
%%% [{"cn",["Magnus Froberg"]}]},
%%% {eldap_entry,
%%% "cn=Torbjorn Tornkvist, dc=bluetail, dc=com",
%%% [{"cn",["Torbjorn Tornkvist"]}]}],
%%% []}}
%%%
%%% --------------------------------------------------------------------
search(Handle, A) when is_record(A, eldap_search) ->
call_search(Handle, A);
search(Handle, L) when is_list(L) ->
case catch parse_search_args(L) of
{error, Emsg} -> {error, Emsg};
{'EXIT', Emsg} -> {error, Emsg};
A when is_record(A, eldap_search) -> call_search(Handle, A)
end.
call_search(Handle, A) ->
Handle1 = get_handle(Handle),
gen_fsm:sync_send_event(Handle1, {search, A}, ?CALL_TIMEOUT).
parse_search_args(Args) ->
parse_search_args(Args, #eldap_search{scope = wholeSubtree}).
parse_search_args([{base, Base}|T],A) ->
parse_search_args(T,A#eldap_search{base = Base});
parse_search_args([{filter, Filter}|T],A) ->
parse_search_args(T,A#eldap_search{filter = Filter});
parse_search_args([{scope, Scope}|T],A) ->
parse_search_args(T,A#eldap_search{scope = Scope});
parse_search_args([{attributes, Attrs}|T],A) ->
parse_search_args(T,A#eldap_search{attributes = Attrs});
parse_search_args([{types_only, TypesOnly}|T],A) ->
parse_search_args(T,A#eldap_search{types_only = TypesOnly});
parse_search_args([{timeout, Timeout}|T],A) when is_integer(Timeout) ->
parse_search_args(T,A#eldap_search{timeout = Timeout});
parse_search_args([{limit, Limit}|T],A) when is_integer(Limit) ->
parse_search_args(T,A#eldap_search{limit = Limit});
parse_search_args([{deref_aliases, never}|T],A) ->
parse_search_args(T,A#eldap_search{deref_aliases = neverDerefAliases});
parse_search_args([{deref_aliases, searching}|T],A) ->
parse_search_args(T,A#eldap_search{deref_aliases = derefInSearching});
parse_search_args([{deref_aliases, finding}|T],A) ->
parse_search_args(T,A#eldap_search{deref_aliases = derefFindingBaseObj});
parse_search_args([{deref_aliases, always}|T],A) ->
parse_search_args(T,A#eldap_search{deref_aliases = derefAlways});
parse_search_args([H|_],_) ->
throw({error,{unknown_arg, H}});
parse_search_args([],A) ->
A.
%%%
%%% The Scope parameter
%%%
baseObject() -> baseObject.
singleLevel() -> singleLevel.
wholeSubtree() -> wholeSubtree.
%%%
%%% Boolean filter operations
%%%
'and'(ListOfFilters) when is_list(ListOfFilters) -> {'and',ListOfFilters}.
'or'(ListOfFilters) when is_list(ListOfFilters) -> {'or', ListOfFilters}.
'not'(Filter) when is_tuple(Filter) -> {'not',Filter}.
%%%
%%% The following Filter parameters consist of an attribute
%%% and an attribute value. Example: F("uid","tobbe")
%%%
equalityMatch(Desc, Value) -> {equalityMatch, av_assert(Desc, Value)}.
greaterOrEqual(Desc, Value) -> {greaterOrEqual, av_assert(Desc, Value)}.
lessOrEqual(Desc, Value) -> {lessOrEqual, av_assert(Desc, Value)}.
approxMatch(Desc, Value) -> {approxMatch, av_assert(Desc, Value)}.
av_assert(Desc, Value) ->
#'AttributeValueAssertion'{attributeDesc = Desc,
assertionValue = Value}.
%%%
%%% Filter to check for the presence of an attribute
%%%
present(Attribute) when is_list(Attribute) ->
{present, Attribute}.
%%%
%%% A substring filter seem to be based on a pattern:
%%%
%%% InitValue*AnyValue*FinalValue
%%%
%%% where all three parts seem to be optional (at least when
%%% talking with an OpenLDAP server). Thus, the arguments
%%% to substrings/2 looks like this:
%%%
%%% Type ::= string( )
%%% SubStr ::= listof( {initial,Value} | {any,Value}, {final,Value})
%%%
%%% Example: substrings("sn",[{initial,"To"},{any,"kv"},{final,"st"}])
%%% will match entries containing: 'sn: Tornkvist'
%%%
substrings(Type, SubStr) when is_list(Type), is_list(SubStr) ->
Ss = {'SubstringFilter_substrings',v_substr(SubStr)},
{substrings,#'SubstringFilter'{type = Type,
substrings = Ss}}.
%%%
%%% extensibleMatch filter.
%%% FIXME: Describe the purpose of this filter.
%%%
%%% Value ::= string( )
%%% Opts ::= listof( {matchingRule, Str} | {type, Str} | {dnAttributes, true} )
%%%
%%% Example: extensibleMatch("Fred", [{matchingRule, "1.2.3.4.5"}, {type, "cn"}]).
%%%
extensibleMatch(Value, Opts) when is_list(Value), is_list(Opts) ->
MRA = #'MatchingRuleAssertion'{matchValue=Value},
{extensibleMatch, extensibleMatch_opts(Opts, MRA)}.
extensibleMatch_opts([{matchingRule, Rule} | Opts], MRA) when is_list(Rule) ->
extensibleMatch_opts(Opts, MRA#'MatchingRuleAssertion'{matchingRule=Rule});
extensibleMatch_opts([{type, Desc} | Opts], MRA) when is_list(Desc) ->
extensibleMatch_opts(Opts, MRA#'MatchingRuleAssertion'{type=Desc});
extensibleMatch_opts([{dnAttributes, true} | Opts], MRA) ->
extensibleMatch_opts(Opts, MRA#'MatchingRuleAssertion'{dnAttributes=true});
extensibleMatch_opts([_ | Opts], MRA) ->
extensibleMatch_opts(Opts, MRA);
extensibleMatch_opts([], MRA) ->
MRA.
get_handle(Pid) when is_pid(Pid) -> Pid;
get_handle(Atom) when is_atom(Atom) -> Atom;
get_handle(Name) when is_list(Name) -> list_to_atom("eldap_" ++ Name).
%%%----------------------------------------------------------------------
%%% Callback functions from gen_fsm
%%%----------------------------------------------------------------------
%%----------------------------------------------------------------------
%% Func: init/1
%% Returns: {ok, StateName, StateData} |
%% {ok, StateName, StateData, Timeout} |
%% ignore |
%% {stop, StopReason}
%% I use the trick of setting a timeout of 0 to pass control into the
%% process.
%%----------------------------------------------------------------------
init([]) ->
case get_config() of
{ok, Hosts, Port, Rootdn, Passwd, Opts} ->
init({Hosts, Port, Rootdn, Passwd, Opts});
{error, Reason} ->
{stop, Reason}
end;
init({Hosts, Port, Rootdn, Passwd, Opts}) ->
catch ssl:start(),
%% ssl:seed was removed in OTP R14B04, newer Dialyzer will complain
catch ssl:seed(randoms:get_string()),
Encrypt = case proplists:get_value(encrypt, Opts) of
tls -> tls;
_ -> none
end,
PortTemp = case Port of
undefined ->
case Encrypt of
tls ->
?LDAPS_PORT;
_ ->
?LDAP_PORT
end;
PT -> PT
end,
CacertOpts = case proplists:get_value(tls_cacertfile, Opts) of
[_|_] = Path -> [{cacertfile, Path}];
_ -> []
end,
DepthOpts = case proplists:get_value(tls_depth, Opts) of
Depth when is_integer(Depth), Depth >= 0 ->
[{depth, Depth}];
_ -> []
end,
Verify = proplists:get_value(tls_verify, Opts),
TLSOpts = if (Verify == hard orelse Verify == soft)
andalso CacertOpts == [] ->
?WARNING_MSG("TLS verification is enabled "
"but no CA certfiles configured, so "
"verification is disabled.", []),
[];
Verify == soft ->
[{verify, 1}] ++ CacertOpts ++ DepthOpts;
Verify == hard ->
[{verify, 2}] ++ CacertOpts ++ DepthOpts;
true ->
[]
end,
{ok, connecting, #eldap{hosts = Hosts,
port = PortTemp,
rootdn = Rootdn,
passwd = Passwd,
tls = Encrypt,
tls_options = TLSOpts,
id = 0,
dict = dict:new(),
req_q = queue:new()}, 0}.
%%----------------------------------------------------------------------
%% Func: StateName/2
%% Called when gen_fsm:send_event/2,3 is invoked (async)
%% Returns: {next_state, NextStateName, NextStateData} |
%% {next_state, NextStateName, NextStateData, Timeout} |
%% {stop, Reason, NewStateData}
%%----------------------------------------------------------------------
connecting(timeout, S) ->
{ok, NextState, NewS} = connect_bind(S),
{next_state, NextState, NewS}.
%%----------------------------------------------------------------------
%% Func: StateName/3
%% Called when gen_fsm:sync_send_event/2,3 is invoked.
%% Returns: {next_state, NextStateName, NextStateData} |
%% {next_state, NextStateName, NextStateData, Timeout} |
%% {reply, Reply, NextStateName, NextStateData} |
%% {reply, Reply, NextStateName, NextStateData, Timeout} |
%% {stop, Reason, NewStateData} |
%% {stop, Reason, Reply, NewStateData}
%%----------------------------------------------------------------------
connecting(Event, From, S) ->
Q = queue:in({Event, From}, S#eldap.req_q),
{next_state, connecting, S#eldap{req_q=Q}}.
wait_bind_response(Event, From, S) ->
Q = queue:in({Event, From}, S#eldap.req_q),
{next_state, wait_bind_response, S#eldap{req_q=Q}}.
active_bind(Event, From, S) ->
Q = queue:in({Event, From}, S#eldap.req_q),
{next_state, active_bind, S#eldap{req_q=Q}}.
active(Event, From, S) ->
process_command(S, Event, From).
%%----------------------------------------------------------------------
%% Func: handle_event/3
%% Called when gen_fsm:send_all_state_event/2 is invoked.
%% Returns: {next_state, NextStateName, NextStateData} |
%% {next_state, NextStateName, NextStateData, Timeout} |
%% {stop, Reason, NewStateData}
%%----------------------------------------------------------------------
handle_event(close, _StateName, S) ->
catch (S#eldap.sockmod):close(S#eldap.fd),
{stop, normal, S};
handle_event(_Event, StateName, S) ->
{next_state, StateName, S}.
%%----------------------------------------------------------------------
%% Func: handle_sync_event/4
%% Called when gen_fsm:sync_send_all_state_event/2,3 is invoked
%% Returns: {next_state, NextStateName, NextStateData} |
%% {next_state, NextStateName, NextStateData, Timeout} |
%% {reply, Reply, NextStateName, NextStateData} |
%% {reply, Reply, NextStateName, NextStateData, Timeout} |
%% {stop, Reason, NewStateData} |
%% {stop, Reason, Reply, NewStateData}
%%----------------------------------------------------------------------
handle_sync_event(_Event, _From, StateName, S) ->
{reply, {StateName, S}, StateName, S}.
%%----------------------------------------------------------------------
%% Func: handle_info/3
%% Returns: {next_state, NextStateName, NextStateData} |
%% {next_state, NextStateName, NextStateData, Timeout} |
%% {stop, Reason, NewStateData}
%%----------------------------------------------------------------------
%%
%% Packets arriving in various states
%%
handle_info({Tag, _Socket, Data}, connecting, S)
when Tag == tcp; Tag == ssl ->
?DEBUG("tcp packet received when disconnected!~n~p", [Data]),
{next_state, connecting, S};
handle_info({Tag, _Socket, Data}, wait_bind_response, S)
when Tag == tcp; Tag == ssl ->
cancel_timer(S#eldap.bind_timer),
case catch recvd_wait_bind_response(Data, S) of
bound ->
dequeue_commands(S);
{fail_bind, Reason} ->
report_bind_failure(S#eldap.host, S#eldap.port, Reason),
{next_state, connecting, close_and_retry(S, ?GRACEFUL_RETRY_TIMEOUT)};
{'EXIT', Reason} ->
report_bind_failure(S#eldap.host, S#eldap.port, Reason),
{next_state, connecting, close_and_retry(S)};
{error, Reason} ->
report_bind_failure(S#eldap.host, S#eldap.port, Reason),
{next_state, connecting, close_and_retry(S)}
end;
handle_info({Tag, _Socket, Data}, StateName, S)
when (StateName == active orelse StateName == active_bind) andalso
(Tag == tcp orelse Tag == ssl) ->
case catch recvd_packet(Data, S) of
{response, Response, RequestType} ->
NewS = case Response of
{reply, Reply, To, S1} ->
gen_fsm:reply(To, Reply),
S1;
{ok, S1} ->
S1
end,
if (StateName == active_bind andalso
RequestType == bindRequest) orelse
(StateName == active) ->
dequeue_commands(NewS);
true ->
{next_state, StateName, NewS}
end;
_ ->
{next_state, StateName, S}
end;
handle_info({Tag, _Socket}, Fsm_state, S)
when Tag == tcp_closed; Tag == ssl_closed ->
?WARNING_MSG("LDAP server closed the connection: ~s:~p~nIn State: ~p",
[S#eldap.host, S#eldap.port ,Fsm_state]),
{next_state, connecting, close_and_retry(S)};
handle_info({Tag, _Socket, Reason}, Fsm_state, S)
when Tag == tcp_error; Tag == ssl_error ->
?DEBUG("eldap received tcp_error: ~p~nIn State: ~p", [Reason, Fsm_state]),
{next_state, connecting, close_and_retry(S)};
%%
%% Timers
%%
handle_info({timeout, Timer, {cmd_timeout, Id}}, StateName, S) ->
case cmd_timeout(Timer, Id, S) of
{reply, To, Reason, NewS} -> gen_fsm:reply(To, Reason),
{next_state, StateName, NewS};
{error, _Reason} -> {next_state, StateName, S}
end;
handle_info({timeout, retry_connect}, connecting, S) ->
{ok, NextState, NewS} = connect_bind(S),
{next_state, NextState, NewS};
handle_info({timeout, _Timer, bind_timeout}, wait_bind_response, S) ->
{next_state, connecting, close_and_retry(S)};
%%
%% Make sure we don't fill the message queue with rubbish
%%
handle_info(Info, StateName, S) ->
?DEBUG("eldap. Unexpected Info: ~p~nIn state: ~p~n when StateData is: ~p",
[Info, StateName, S]),
{next_state, StateName, S}.
%%----------------------------------------------------------------------
%% Func: terminate/3
%% Purpose: Shutdown the fsm
%% Returns: any
%%----------------------------------------------------------------------
terminate(_Reason, _StateName, _StatData) ->
ok.
%%----------------------------------------------------------------------
%% Func: code_change/4
%% Purpose: Convert process state when code is changed
%% Returns: {ok, NewState, NewStateData}
%%----------------------------------------------------------------------
code_change(_OldVsn, StateName, S, _Extra) ->
{ok, StateName, S}.
%%%----------------------------------------------------------------------
%%% Internal functions
%%%----------------------------------------------------------------------
dequeue_commands(S) ->
case queue:out(S#eldap.req_q) of
{{value, {Event, From}}, Q} ->
case process_command(S#eldap{req_q=Q}, Event, From) of
{_, active, NewS} ->
dequeue_commands(NewS);
Res ->
Res
end;
{empty, _} ->
{next_state, active, S}
end.
process_command(S, Event, From) ->
case send_command(Event, From, S) of
{ok, NewS} ->
case Event of
{bind, _, _} ->
{next_state, active_bind, NewS};
_ ->
{next_state, active, NewS}
end;
{error, _Reason} ->
Q = queue:in_r({Event, From}, S#eldap.req_q),
NewS = close_and_retry(S#eldap{req_q=Q}),
{next_state, connecting, NewS}
end.
send_command(Command, From, S) ->
Id = bump_id(S),
{Name, Request} = gen_req(Command),
Message = #'LDAPMessage'{messageID = Id,
protocolOp = {Name, Request}},
?DEBUG("~p~n",[{Name, Request}]),
{ok, Bytes} = asn1rt:encode('ELDAPv3', 'LDAPMessage', Message),
case (S#eldap.sockmod):send(S#eldap.fd, Bytes) of
ok ->
Timer = erlang:start_timer(?CMD_TIMEOUT, self(), {cmd_timeout, Id}),
New_dict = dict:store(Id, [{Timer, Command, From, Name}], S#eldap.dict),
{ok, S#eldap{id = Id, dict = New_dict}};
Error ->
Error
end.
gen_req({search, A}) ->
{searchRequest,
#'SearchRequest'{baseObject = A#eldap_search.base,
scope = v_scope(A#eldap_search.scope),
derefAliases = A#eldap_search.deref_aliases,
sizeLimit = A#eldap_search.limit,
timeLimit = v_timeout(A#eldap_search.timeout),
typesOnly = v_bool(A#eldap_search.types_only),
filter = v_filter(A#eldap_search.filter),
attributes = v_attributes(A#eldap_search.attributes)
}};
gen_req({add, Entry, Attrs}) ->
{addRequest,
#'AddRequest'{entry = Entry,
attributes = Attrs}};
gen_req({delete, Entry}) ->
{delRequest, Entry};
gen_req({modify, Obj, Mod}) ->
v_modifications(Mod),
{modifyRequest,
#'ModifyRequest'{object = Obj,
modification = Mod}};
gen_req({modify_dn, Entry, NewRDN, DelOldRDN, NewSup}) ->
{modDNRequest,
#'ModifyDNRequest'{entry = Entry,
newrdn = NewRDN,
deleteoldrdn = DelOldRDN,
newSuperior = NewSup}};
gen_req({modify_passwd, DN, Passwd}) ->
{ok, ReqVal} = asn1rt:encode(
'ELDAPv3', 'PasswdModifyRequestValue',
#'PasswdModifyRequestValue'{
userIdentity = DN,
newPasswd = Passwd}),
{extendedReq,
#'ExtendedRequest'{requestName = ?passwdModifyOID,
requestValue = list_to_binary(ReqVal)}};
gen_req({bind, RootDN, Passwd}) ->
{bindRequest,
#'BindRequest'{version = ?LDAP_VERSION,
name = RootDN,
authentication = {simple, Passwd}}}.
%%-----------------------------------------------------------------------
%% recvd_packet
%% Deals with incoming packets in the active state
%% Will return one of:
%% {ok, NewS} - Don't reply to client yet as this is part of a search
%% result and we haven't got all the answers yet.
%% {reply, Result, From, NewS} - Reply with result to client From
%% {error, Reason}
%% {'EXIT', Reason} - Broke
%%-----------------------------------------------------------------------
recvd_packet(Pkt, S) ->
check_tag(Pkt),
case asn1rt:decode('ELDAPv3', 'LDAPMessage', Pkt) of
{ok,Msg} ->
Op = Msg#'LDAPMessage'.protocolOp,
?DEBUG("~p",[Op]),
Dict = S#eldap.dict,
Id = Msg#'LDAPMessage'.messageID,
{Timer, From, Name, Result_so_far} = get_op_rec(Id, Dict),
Answer =
case {Name, Op} of
{searchRequest, {searchResEntry, R}} when
is_record(R,'SearchResultEntry') ->
New_dict = dict:append(Id, R, Dict),
{ok, S#eldap{dict = New_dict}};
{searchRequest, {searchResDone, Result}} ->
Reason = Result#'LDAPResult'.resultCode,
if
Reason==success; Reason=='sizeLimitExceeded' ->
{Res, Ref} = polish(Result_so_far),
New_dict = dict:erase(Id, Dict),
cancel_timer(Timer),
{reply, #eldap_search_result{entries = Res,
referrals = Ref}, From,
S#eldap{dict = New_dict}};
true ->
New_dict = dict:erase(Id, Dict),
cancel_timer(Timer),
{reply, {error, Reason}, From, S#eldap{dict = New_dict}}
end;
{searchRequest, {searchResRef, R}} ->
New_dict = dict:append(Id, R, Dict),
{ok, S#eldap{dict = New_dict}};
{addRequest, {addResponse, Result}} ->
New_dict = dict:erase(Id, Dict),
cancel_timer(Timer),
Reply = check_reply(Result, From),
{reply, Reply, From, S#eldap{dict = New_dict}};
{delRequest, {delResponse, Result}} ->
New_dict = dict:erase(Id, Dict),
cancel_timer(Timer),
Reply = check_reply(Result, From),
{reply, Reply, From, S#eldap{dict = New_dict}};
{modifyRequest, {modifyResponse, Result}} ->
New_dict = dict:erase(Id, Dict),
cancel_timer(Timer),
Reply = check_reply(Result, From),
{reply, Reply, From, S#eldap{dict = New_dict}};
{modDNRequest, {modDNResponse, Result}} ->
New_dict = dict:erase(Id, Dict),
cancel_timer(Timer),
Reply = check_reply(Result, From),
{reply, Reply, From, S#eldap{dict = New_dict}};
{bindRequest, {bindResponse, Result}} ->
New_dict = dict:erase(Id, Dict),
cancel_timer(Timer),
Reply = check_bind_reply(Result, From),
{reply, Reply, From, S#eldap{dict = New_dict}};
{extendedReq, {extendedResp, Result}} ->
New_dict = dict:erase(Id, Dict),
cancel_timer(Timer),
Reply = check_extended_reply(Result, From),
{reply, Reply, From, S#eldap{dict = New_dict}};
{OtherName, OtherResult} ->
New_dict = dict:erase(Id, Dict),
cancel_timer(Timer),
{reply, {error, {invalid_result, OtherName, OtherResult}},
From, S#eldap{dict = New_dict}}
end,
{response, Answer, Name};
Error -> Error
end.
check_reply(#'LDAPResult'{resultCode = success}, _From) ->
ok;
check_reply(#'LDAPResult'{resultCode = Reason}, _From) ->
{error, Reason};
check_reply(Other, _From) ->
{error, Other}.
check_bind_reply(#'BindResponse'{resultCode = success}, _From) ->
ok;
check_bind_reply(#'BindResponse'{resultCode = Reason}, _From) ->
{error, Reason};
check_bind_reply(Other, _From) ->
{error, Other}.
%% TODO: process reply depending on requestName:
%% this requires BER-decoding of #'ExtendedResponse'.response
check_extended_reply(#'ExtendedResponse'{resultCode = success}, _From) ->
ok;
check_extended_reply(#'ExtendedResponse'{resultCode = Reason}, _From) ->
{error, Reason};
check_extended_reply(Other, _From) ->
{error, Other}.
get_op_rec(Id, Dict) ->
case dict:find(Id, Dict) of
{ok, [{Timer, _Command, From, Name}|Res]} ->
{Timer, From, Name, Res};
error ->
throw({error, unkown_id})
end.
%%-----------------------------------------------------------------------
%% recvd_wait_bind_response packet
%% Deals with incoming packets in the wait_bind_response state
%% Will return one of:
%% bound - Success - move to active state
%% {fail_bind, Reason} - Failed
%% {error, Reason}
%% {'EXIT', Reason} - Broken packet
%%-----------------------------------------------------------------------
recvd_wait_bind_response(Pkt, S) ->
check_tag(Pkt),
case asn1rt:decode('ELDAPv3', 'LDAPMessage', Pkt) of
{ok,Msg} ->
?DEBUG("~p", [Msg]),
check_id(S#eldap.id, Msg#'LDAPMessage'.messageID),
case Msg#'LDAPMessage'.protocolOp of
{bindResponse, Result} ->
case Result#'BindResponse'.resultCode of
success -> bound;
Error -> {fail_bind, Error}
end
end;
Else ->
{fail_bind, Else}
end.
check_id(Id, Id) -> ok;
check_id(_, _) -> throw({error, wrong_bind_id}).
%%-----------------------------------------------------------------------
%% General Helpers
%%-----------------------------------------------------------------------
cancel_timer(Timer) ->
erlang:cancel_timer(Timer),
receive
{timeout, Timer, _} ->
ok
after 0 ->
ok
end.
%%% Sanity check of received packet
check_tag(Data) ->
{_Tag, Data1, _Rb} = asn1rt_ber_bin:decode_tag(Data),
{{_Len,_Data2}, _Rb2} = asn1rt_ber_bin:decode_length(Data1),
ok.
close_and_retry(S, Timeout) ->
catch (S#eldap.sockmod):close(S#eldap.fd),
Queue = dict:fold(
fun(_Id, [{Timer, Command, From, _Name}|_], Q) ->
cancel_timer(Timer),
queue:in_r({Command, From}, Q);
(_, _, Q) ->
Q
end, S#eldap.req_q, S#eldap.dict),
erlang:send_after(Timeout, self(), {timeout, retry_connect}),
S#eldap{fd=null, req_q=Queue, dict=dict:new()}.
close_and_retry(S) ->
close_and_retry(S, ?RETRY_TIMEOUT).
report_bind_failure(Host, Port, Reason) ->
?WARNING_MSG("LDAP bind failed on ~s:~p~nReason: ~p",
[Host, Port, Reason]).
%%-----------------------------------------------------------------------
%% Sort out timed out commands
%%-----------------------------------------------------------------------
cmd_timeout(Timer, Id, S) ->
Dict = S#eldap.dict,
case dict:find(Id, Dict) of
{ok, [{Timer, _Command, From, Name}|Res]} ->
case Name of
searchRequest ->
{Res1, Ref1} = polish(Res),
New_dict = dict:erase(Id, Dict),
{reply, From, {timeout,
#eldap_search_result{entries = Res1,
referrals = Ref1}},
S#eldap{dict = New_dict}};
_ ->
New_dict = dict:erase(Id, Dict),
{reply, From, {error, timeout}, S#eldap{dict = New_dict}}
end;
error ->
{error, timed_out_cmd_not_in_dict}
end.
%%-----------------------------------------------------------------------
%% Common stuff for results
%%-----------------------------------------------------------------------
%%%
%%% Polish the returned search result
%%%
polish(Entries) ->
polish(Entries, [], []).
polish([H|T], Res, Ref) when is_record(H, 'SearchResultEntry') ->
ObjectName = H#'SearchResultEntry'.objectName,
F = fun({_,A,V}) -> {A,V} end,
Attrs = lists:map(F, H#'SearchResultEntry'.attributes),
polish(T, [#eldap_entry{object_name = ObjectName,
attributes = Attrs}|Res], Ref);
polish([H|T], Res, Ref) -> % No special treatment of referrals at the moment.
polish(T, Res, [H|Ref]);
polish([], Res, Ref) ->
{Res, Ref}.
%%-----------------------------------------------------------------------
%% Connect to next server in list and attempt to bind to it.
%%-----------------------------------------------------------------------
connect_bind(S) ->
Host = next_host(S#eldap.host, S#eldap.hosts),
?INFO_MSG("LDAP connection on ~s:~p", [Host, S#eldap.port]),
Opts = if S#eldap.tls == tls ->
[{packet, asn1}, {active, true}, {keepalive, true},
binary | S#eldap.tls_options];
true ->
[{packet, asn1}, {active, true}, {keepalive, true},
{send_timeout, ?SEND_TIMEOUT}, binary]
end,
SocketData = case S#eldap.tls of
tls ->
SockMod = ssl,
ssl:connect(Host, S#eldap.port, Opts);
%% starttls -> %% TODO: Implement STARTTLS;
_ ->
SockMod = gen_tcp,
gen_tcp:connect(Host, S#eldap.port, Opts)
end,
case SocketData of
{ok, Socket} ->
case bind_request(Socket, S#eldap{sockmod = SockMod}) of
{ok, NewS} ->
Timer = erlang:start_timer(?BIND_TIMEOUT, self(),
{timeout, bind_timeout}),
{ok, wait_bind_response, NewS#eldap{fd = Socket,
sockmod = SockMod,
host = Host,
bind_timer = Timer}};
{error, Reason} ->
report_bind_failure(Host, S#eldap.port, Reason),
NewS = close_and_retry(S),
{ok, connecting, NewS#eldap{host = Host}}
end;
{error, Reason} ->
?ERROR_MSG("LDAP connection failed:~n"
"** Server: ~s:~p~n"
"** Reason: ~p~n"
"** Socket options: ~p",
[Host, S#eldap.port, Reason, Opts]),
NewS = close_and_retry(S),
{ok, connecting, NewS#eldap{host = Host}}
end.
bind_request(Socket, S) ->
Id = bump_id(S),
Req = #'BindRequest'{version = S#eldap.version,
name = S#eldap.rootdn,
authentication = {simple, S#eldap.passwd}},
Message = #'LDAPMessage'{messageID = Id,
protocolOp = {bindRequest, Req}},
?DEBUG("Bind Request Message:~p~n",[Message]),
{ok, Bytes} = asn1rt:encode('ELDAPv3', 'LDAPMessage', Message),
case (S#eldap.sockmod):send(Socket, Bytes) of
ok -> {ok, S#eldap{id = Id}};
Error -> Error
end.
%% Given last tried Server, find next one to try
next_host(null, [H|_]) -> H; % First time, take first
next_host(Host, Hosts) -> % Find next in turn
next_host(Host, Hosts, Hosts).
next_host(Host, [Host], Hosts) -> hd(Hosts); % Wrap back to first
next_host(Host, [Host|Tail], _Hosts) -> hd(Tail); % Take next
next_host(_Host, [], Hosts) -> hd(Hosts); % Never connected before? (shouldn't happen)
next_host(Host, [_|T], Hosts) -> next_host(Host, T, Hosts).
%%% --------------------------------------------------------------------
%%% Verify the input data
%%% --------------------------------------------------------------------
v_filter({'and',L}) -> {'and',L};
v_filter({'or', L}) -> {'or',L};
v_filter({'not',L}) -> {'not',L};
v_filter({equalityMatch,AV}) -> {equalityMatch,AV};
v_filter({greaterOrEqual,AV}) -> {greaterOrEqual,AV};
v_filter({lessOrEqual,AV}) -> {lessOrEqual,AV};
v_filter({approxMatch,AV}) -> {approxMatch,AV};
v_filter({present,A}) -> {present,A};
v_filter({substrings,S}) when is_record(S,'SubstringFilter') -> {substrings,S};
v_filter({extensibleMatch, S}) when is_record(S, 'MatchingRuleAssertion') ->
{extensibleMatch, S};
v_filter(_Filter) -> throw({error,concat(["unknown filter: ",_Filter])}).
v_modifications(Mods) ->
F = fun({_,Op,_}) ->
case lists:member(Op,[add,delete,replace]) of
true -> true;
_ -> throw({error,{mod_operation,Op}})
end
end,
lists:foreach(F, Mods).
v_substr([{Key,Str}|T]) when is_list(Str),Key==initial;Key==any;Key==final ->
[{Key,Str}|v_substr(T)];
v_substr([H|_]) ->
throw({error,{substring_arg,H}});
v_substr([]) ->
[].
v_scope(baseObject) -> baseObject;
v_scope(singleLevel) -> singleLevel;
v_scope(wholeSubtree) -> wholeSubtree;
v_scope(_Scope) -> throw({error,concat(["unknown scope: ",_Scope])}).
v_bool(true) -> true;
v_bool(false) -> false;
v_bool(_Bool) -> throw({error,concat(["not Boolean: ",_Bool])}).
v_timeout(I) when is_integer(I), I>=0 -> I;
v_timeout(_I) -> throw({error,concat(["timeout not positive integer: ",_I])}).
v_attributes(Attrs) ->
F = fun(A) when is_list(A) -> A;
(A) -> throw({error,concat(["attribute not String: ",A])})
end,
lists:map(F,Attrs).
%%% --------------------------------------------------------------------
%%% Get and Validate the initial configuration
%%% --------------------------------------------------------------------
get_config() ->
Priv_dir = code:priv_dir(eldap),
File = filename:join(Priv_dir, "eldap.conf"),
case file:consult(File) of
{ok, Entries} ->
case catch parse(Entries) of
{ok, Hosts, Port, Rootdn, Passwd, Opts} ->
{ok, Hosts, Port, Rootdn, Passwd, Opts};
{error, Reason} ->
{error, Reason};
{'EXIT', Reason} ->
{error, Reason}
end;
{error, Reason} ->
{error, Reason}
end.
parse(Entries) ->
{ok,
get_hosts(host, Entries),
get_integer(port, Entries),
get_list(rootdn, Entries),
get_list(passwd, Entries),
get_list(options, Entries)}.
get_integer(Key, List) ->
case lists:keysearch(Key, 1, List) of
{value, {Key, Value}} when is_integer(Value) ->
Value;
{value, {Key, _Value}} ->
throw({error, "Bad Value in Config for " ++ atom_to_list(Key)});
false ->
throw({error, "No Entry in Config for " ++ atom_to_list(Key)})
end.
get_list(Key, List) ->
case lists:keysearch(Key, 1, List) of
{value, {Key, Value}} when is_list(Value) ->
Value;
{value, {Key, _Value}} ->
throw({error, "Bad Value in Config for " ++ atom_to_list(Key)});
false ->
throw({error, "No Entry in Config for " ++ atom_to_list(Key)})
end.
%% get_atom(Key, List) ->
%% case lists:keysearch(Key, 1, List) of
%% {value, {Key, Value}} when is_atom(Value) ->
%% Value;
%% {value, {Key, _Value}} ->
%% throw({error, "Bad Value in Config for " ++ atom_to_list(Key)});
%% false ->
%% throw({error, "No Entry in Config for " ++ atom_to_list(Key)})
%% end.
get_hosts(Key, List) ->
lists:map(fun({Key1, {A,B,C,D}}) when is_integer(A),
is_integer(B),
is_integer(C),
is_integer(D),
Key == Key1->
{A,B,C,D};
({Key1, Value}) when is_list(Value),
Key == Key1->
Value;
({_Else, _Value}) ->
throw({error, "Bad Hostname in config"})
end, List).
%%% --------------------------------------------------------------------
%%% Other Stuff
%%% --------------------------------------------------------------------
bump_id(#eldap{id = Id}) when Id > ?MAX_TRANSACTION_ID ->
?MIN_TRANSACTION_ID;
bump_id(#eldap{id = Id}) ->
Id + 1.
ejabberd-2.1.11/src/eldap/eldap_utils.erl 0000664 0000000 0000000 00000011675 12240230175 015115 0 ustar %%%----------------------------------------------------------------------
%%% File : eldap_utils.erl
%%% Author : Mickael Remond
%%% Purpose : ejabberd LDAP helper functions
%%% Created : 12 Oct 2006 by Mickael Remond
%%%
%%%
%%% ejabberd, Copyright (C) 2002-2012 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
%%% published by the Free Software Foundation; either version 2 of the
%%% License, or (at your option) any later version.
%%%
%%% This program is distributed in the hope that it will be useful,
%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
%%% General Public License for more details.
%%%
%%% You should have received a copy of the GNU General Public License
%%% along with this program; if not, write to the Free Software
%%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
%%% 02111-1307 USA
%%%
%%%----------------------------------------------------------------------
-module(eldap_utils).
-author('mremond@process-one.net').
-export([generate_subfilter/1,
find_ldap_attrs/2,
get_ldap_attr/2,
usort_attrs/1,
get_user_part/2,
make_filter/2,
get_state/2,
case_insensitive_match/2,
check_filter/1,
uids_domain_subst/2]).
-include("ejabberd.hrl").
%% Generate an 'or' LDAP query on one or several attributes
%% If there is only one attribute
generate_subfilter([UID]) ->
subfilter(UID);
%% If there is several attributes
generate_subfilter(UIDs) ->
"(|" ++ [subfilter(UID) || UID <- UIDs] ++ ")".
%% Subfilter for a single attribute
subfilter({UIDAttr, UIDAttrFormat}) ->
"(" ++ UIDAttr ++ "=" ++ UIDAttrFormat ++ ")";
%% The default UiDAttrFormat is %u
subfilter({UIDAttr}) ->
"(" ++ UIDAttr ++ "=" ++ "%u)".
%% Not tail-recursive, but it is not very terribly.
%% It stops finding on the first not empty value.
find_ldap_attrs([{Attr} | Rest], Attributes) ->
find_ldap_attrs([{Attr, "%u"} | Rest], Attributes);
find_ldap_attrs([{Attr, Format} | Rest], Attributes) ->
case get_ldap_attr(Attr, Attributes) of
Value when is_list(Value), Value /= "" ->
{Value, Format};
_ ->
find_ldap_attrs(Rest, Attributes)
end;
find_ldap_attrs([], _) ->
"".
get_ldap_attr(LDAPAttr, Attributes) ->
Res = lists:filter(
fun({Name, _}) ->
case_insensitive_match(Name, LDAPAttr)
end, Attributes),
case Res of
[{_, [Value|_]}] -> Value;
_ -> ""
end.
usort_attrs(Attrs) when is_list(Attrs) ->
lists:usort(Attrs);
usort_attrs(_) ->
[].
get_user_part(String, Pattern) ->
F = fun(S, P) ->
First = string:str(P, "%u"),
TailLength = length(P) - (First+1),
string:sub_string(S, First, length(S) - TailLength)
end,
case catch F(String, Pattern) of
{'EXIT', _} ->
{error, badmatch};
Result ->
case catch ejabberd_regexp:replace(Pattern, "%u", Result) of
{'EXIT', _} ->
{error, badmatch};
StringRes ->
case (string:to_lower(StringRes) ==
string:to_lower(String)) of
true ->
{ok, Result};
false ->
{error, badmatch}
end
end
end.
make_filter(Data, UIDs) ->
NewUIDs = [{U, eldap_filter:do_sub(UF, [{"%u", "*%u*", 1}])} || {U, UF} <- UIDs],
Filter = lists:flatmap(
fun({Name, [Value | _]}) ->
case Name of
"%u" when Value /= "" ->
case eldap_filter:parse(
lists:flatten(generate_subfilter(NewUIDs)),
[{"%u", Value}]) of
{ok, F} -> [F];
_ -> []
end;
_ when Value /= "" ->
[eldap:substrings(Name, [{any, Value}])];
_ ->
[]
end
end, Data),
case Filter of
[F] ->
F;
_ ->
eldap:'and'(Filter)
end.
case_insensitive_match(X, Y) ->
X1 = stringprep:tolower(X),
Y1 = stringprep:tolower(Y),
if
X1 == Y1 -> true;
true -> false
end.
get_state(Server, Module) ->
Proc = gen_mod:get_module_proc(Server, Module),
gen_server:call(Proc, get_state).
%% From the list of uids attribute:
%% we look from alias domain (%d) and make the substitution
%% with the actual host domain
%% This help when you need to configure many virtual domains.
uids_domain_subst(Host, UIDs) ->
lists:map(fun({U,V}) ->
{U, eldap_filter:do_sub(V,[{"%d", Host}])};
(A) -> A
end,
UIDs).
check_filter(undefined) ->
ok;
check_filter(Filter) ->
case eldap_filter:parse(Filter) of
{ok, _} ->
ok;
Err ->
?ERROR_MSG("failed to parse LDAP filter:~n"
"** Filter: ~p~n"
"** Reason: ~p",
[Filter, Err])
end.
ejabberd-2.1.11/src/eldap/Makefile.win32 0000664 0000000 0000000 00000002124 12240230175 014472 0 ustar
include ..\Makefile.inc
EFLAGS = -I .. -pz ..
OUTDIR = ..
BEAMS = ..\eldap.beam ..\eldap_filter.beam ..\eldap_pool.beam ..\eldap_utils.beam ..\eldap_filter_yecc.beam
ASN_FLAGS = -bber_bin +optimize
ALL : $(BEAMS)
Clean :
-@erase ELDAPv3.asn1db
-@erase ELDAPv3.erl
-@erase ELDAPv3.hrl
-@erase ELDAPv3.beam
-@erase eldap_filter_yecc.erl
-@erase eldap_filter_yecc.beam
-@erase $(BEAMS)
ELDAPv3.erl : ELDAPv3.asn
erlc $(ASN_FLAGS) -W $(EFLAGS) ELDAPv3.asn
eldap_filter_yecc.erl: eldap_filter_yecc.yrl
erlc -W eldap_filter_yecc.yrl
$(OUTDIR)\eldap.beam : eldap.erl ELDAPv3.erl
erlc -W $(EFLAGS) -o $(OUTDIR) eldap.erl
$(OUTDIR)\ELDAPv3.beam : ELDAPv3.erl
erlc -W $(EFLAGS) -o $(OUTDIR) ELDAPv3.erl
$(OUTDIR)\eldap_filter.beam : eldap_filter.erl
erlc -W $(EFLAGS) -o $(OUTDIR) eldap_filter.erl
$(OUTDIR)\eldap_utils.beam : eldap_utils.erl
erlc -W $(EFLAGS) -o $(OUTDIR) eldap_utils.erl
$(OUTDIR)\eldap_pool.beam : eldap_pool.erl
erlc -W $(EFLAGS) -o $(OUTDIR) eldap_pool.erl
$(OUTDIR)\eldap_filter_yecc.beam : eldap_filter_yecc.erl
erlc -W $(EFLAGS) -o $(OUTDIR) eldap_filter_yecc.erl
ejabberd-2.1.11/src/eldap/eldap_filter_yecc.yrl 0000664 0000000 0000000 00000005316 12240230175 016264 0 ustar Nonterminals
filter filtercomp filterlist item
simple present substring extensible
initial any final matchingrule xattr
attr value.
Terminals str
'(' ')' '&' '|' '!' '=' '~=' '>=' '<=' '=*' '*' ':dn' ':' ':='.
Rootsymbol filter.
filter -> '(' filtercomp ')': '$2'.
filtercomp -> '&' filterlist: 'and'('$2').
filtercomp -> '|' filterlist: 'or'('$2').
filtercomp -> '!' filter: 'not'('$2').
filtercomp -> item: '$1'.
filterlist -> filter: '$1'.
filterlist -> filter filterlist: flatten(['$1', '$2']).
item -> simple: '$1'.
item -> present: '$1'.
item -> substring: '$1'.
item -> extensible: '$1'.
simple -> attr '=' value: equal('$1', '$3').
simple -> attr '~=' value: approx('$1', '$3').
simple -> attr '>=' value: greater('$1', '$3').
simple -> attr '<=' value: less('$1', '$3').
present -> attr '=*': present('$1').
substring -> attr '=' initial '*' any: substrings('$1', ['$3', '$5']).
substring -> attr '=' '*' any final: substrings('$1', ['$4', '$5']).
substring -> attr '=' initial '*' any final: substrings('$1', ['$3', '$5', '$6']).
substring -> attr '=' '*' any: substrings('$1', ['$4']).
any -> any value '*': 'any'('$1', '$2').
any -> '$empty': [].
initial -> value: initial('$1').
final -> value: final('$1').
extensible -> xattr ':dn' ':' matchingrule ':=' value: extensible('$6', ['$1', '$4']).
extensible -> xattr ':' matchingrule ':=' value: extensible('$5', ['$1', '$3']).
extensible -> xattr ':dn' ':=' value: extensible('$4', ['$1']).
extensible -> xattr ':=' value: extensible('$3', ['$1']).
extensible -> ':dn' ':' matchingrule ':=' value: extensible('$5', ['$3']).
extensible -> ':' matchingrule ':=' value: extensible('$4', ['$2']).
xattr -> value: xattr('$1').
matchingrule -> value: matchingrule('$1').
attr -> str: value_of('$1').
value -> str: value_of('$1').
Erlang code.
'and'(Value) -> eldap:'and'(Value).
'or'(Value) -> eldap:'or'(Value).
'not'(Value) -> eldap:'not'(Value).
equal(Desc, Value) -> eldap:equalityMatch(Desc, Value).
approx(Desc, Value) -> eldap:approxMatch(Desc, Value).
greater(Desc, Value) -> eldap:greaterOrEqual(Desc, Value).
less(Desc, Value) -> eldap:lessOrEqual(Desc, Value).
present(Value) -> eldap:present(Value).
extensible(Value, Opts) -> eldap:extensibleMatch(Value, Opts).
substrings(Desc, ValueList) -> eldap:substrings(Desc, flatten(ValueList)).
initial(Value) -> {initial, Value}.
final(Value) -> {final, Value}.
'any'(Token, Value) -> [Token, {any, Value}].
xattr(Value) -> {type, Value}.
matchingrule(Value) -> {matchingRule, Value}.
value_of(Token) -> element(3, Token).
flatten(List) -> lists:flatten(List).
ejabberd-2.1.11/src/eldap/ELDAPv3.asn 0000664 0000000 0000000 00000024714 12240230175 013703 0 ustar -- LDAPv3 ASN.1 specification, taken from RFC 2251
-- Lightweight-Directory-Access-Protocol-V3 DEFINITIONS
ELDAPv3 DEFINITIONS
IMPLICIT TAGS ::=
BEGIN
LDAPMessage ::= SEQUENCE {
messageID MessageID,
protocolOp CHOICE {
bindRequest BindRequest,
bindResponse BindResponse,
unbindRequest UnbindRequest,
searchRequest SearchRequest,
searchResEntry SearchResultEntry,
searchResDone SearchResultDone,
searchResRef SearchResultReference,
modifyRequest ModifyRequest,
modifyResponse ModifyResponse,
addRequest AddRequest,
addResponse AddResponse,
delRequest DelRequest,
delResponse DelResponse,
modDNRequest ModifyDNRequest,
modDNResponse ModifyDNResponse,
compareRequest CompareRequest,
compareResponse CompareResponse,
abandonRequest AbandonRequest,
extendedReq ExtendedRequest,
extendedResp ExtendedResponse },
controls [0] Controls OPTIONAL }
MessageID ::= INTEGER (0 .. maxInt)
maxInt INTEGER ::= 2147483647 -- (2^^31 - 1) --
LDAPString ::= OCTET STRING
LDAPOID ::= OCTET STRING
LDAPDN ::= LDAPString
RelativeLDAPDN ::= LDAPString
AttributeType ::= LDAPString
AttributeDescription ::= LDAPString
-- Wahl, et. al. Standards Track [Page 44]
--
-- RFC 2251 LDAPv3 December 1997
AttributeDescriptionList ::= SEQUENCE OF
AttributeDescription
AttributeValue ::= OCTET STRING
AttributeValueAssertion ::= SEQUENCE {
attributeDesc AttributeDescription,
assertionValue AssertionValue }
AssertionValue ::= OCTET STRING
Attribute ::= SEQUENCE {
type AttributeDescription,
vals SET OF AttributeValue }
MatchingRuleId ::= LDAPString
LDAPResult ::= SEQUENCE {
resultCode ENUMERATED {
success (0),
operationsError (1),
protocolError (2),
timeLimitExceeded (3),
sizeLimitExceeded (4),
compareFalse (5),
compareTrue (6),
authMethodNotSupported (7),
strongAuthRequired (8),
-- 9 reserved --
referral (10), -- new
adminLimitExceeded (11), -- new
unavailableCriticalExtension (12), -- new
confidentialityRequired (13), -- new
saslBindInProgress (14), -- new
noSuchAttribute (16),
undefinedAttributeType (17),
inappropriateMatching (18),
constraintViolation (19),
attributeOrValueExists (20),
invalidAttributeSyntax (21),
-- 22-31 unused --
noSuchObject (32),
aliasProblem (33),
invalidDNSyntax (34),
-- 35 reserved for undefined isLeaf --
aliasDereferencingProblem (36),
-- 37-47 unused --
inappropriateAuthentication (48),
-- Wahl, et. al. Standards Track [Page 45]
--
-- RFC 2251 LDAPv3 December 1997
invalidCredentials (49),
insufficientAccessRights (50),
busy (51),
unavailable (52),
unwillingToPerform (53),
loopDetect (54),
-- 55-63 unused --
namingViolation (64),
objectClassViolation (65),
notAllowedOnNonLeaf (66),
notAllowedOnRDN (67),
entryAlreadyExists (68),
objectClassModsProhibited (69),
-- 70 reserved for CLDAP --
affectsMultipleDSAs (71), -- new
-- 72-79 unused --
other (80) },
-- 81-90 reserved for APIs --
matchedDN LDAPDN,
errorMessage LDAPString,
referral [3] Referral OPTIONAL }
Referral ::= SEQUENCE OF LDAPURL
LDAPURL ::= LDAPString -- limited to characters permitted in URLs
Controls ::= SEQUENCE OF Control
Control ::= SEQUENCE {
controlType LDAPOID,
criticality BOOLEAN DEFAULT FALSE,
controlValue OCTET STRING OPTIONAL }
BindRequest ::= [APPLICATION 0] SEQUENCE {
version INTEGER (1 .. 127),
name LDAPDN,
authentication AuthenticationChoice }
AuthenticationChoice ::= CHOICE {
simple [0] OCTET STRING,
-- 1 and 2 reserved
sasl [3] SaslCredentials }
SaslCredentials ::= SEQUENCE {
mechanism LDAPString,
credentials OCTET STRING OPTIONAL }
BindResponse ::= [APPLICATION 1] SEQUENCE {
-- Wahl, et. al. Standards Track [Page 46]
--
-- RFC 2251 LDAPv3 December 1997
COMPONENTS OF LDAPResult,
serverSaslCreds [7] OCTET STRING OPTIONAL }
UnbindRequest ::= [APPLICATION 2] NULL
SearchRequest ::= [APPLICATION 3] SEQUENCE {
baseObject LDAPDN,
scope ENUMERATED {
baseObject (0),
singleLevel (1),
wholeSubtree (2) },
derefAliases ENUMERATED {
neverDerefAliases (0),
derefInSearching (1),
derefFindingBaseObj (2),
derefAlways (3) },
sizeLimit INTEGER (0 .. maxInt),
timeLimit INTEGER (0 .. maxInt),
typesOnly BOOLEAN,
filter Filter,
attributes AttributeDescriptionList }
Filter ::= CHOICE {
and [0] SET OF Filter,
or [1] SET OF Filter,
not [2] Filter,
equalityMatch [3] AttributeValueAssertion,
substrings [4] SubstringFilter,
greaterOrEqual [5] AttributeValueAssertion,
lessOrEqual [6] AttributeValueAssertion,
present [7] AttributeDescription,
approxMatch [8] AttributeValueAssertion,
extensibleMatch [9] MatchingRuleAssertion }
SubstringFilter ::= SEQUENCE {
type AttributeDescription,
-- at least one must be present
substrings SEQUENCE OF CHOICE {
initial [0] LDAPString,
any [1] LDAPString,
final [2] LDAPString } }
MatchingRuleAssertion ::= SEQUENCE {
matchingRule [1] MatchingRuleId OPTIONAL,
type [2] AttributeDescription OPTIONAL,
matchValue [3] AssertionValue,
dnAttributes [4] BOOLEAN DEFAULT FALSE }
-- Wahl, et. al. Standards Track [Page 47]
--
-- RFC 2251 LDAPv3 December 1997
SearchResultEntry ::= [APPLICATION 4] SEQUENCE {
objectName LDAPDN,
attributes PartialAttributeList }
PartialAttributeList ::= SEQUENCE OF SEQUENCE {
type AttributeDescription,
vals SET OF AttributeValue }
SearchResultReference ::= [APPLICATION 19] SEQUENCE OF LDAPURL
SearchResultDone ::= [APPLICATION 5] LDAPResult
ModifyRequest ::= [APPLICATION 6] SEQUENCE {
object LDAPDN,
modification SEQUENCE OF SEQUENCE {
operation ENUMERATED {
add (0),
delete (1),
replace (2) },
modification AttributeTypeAndValues } }
AttributeTypeAndValues ::= SEQUENCE {
type AttributeDescription,
vals SET OF AttributeValue }
ModifyResponse ::= [APPLICATION 7] LDAPResult
AddRequest ::= [APPLICATION 8] SEQUENCE {
entry LDAPDN,
attributes AttributeList }
AttributeList ::= SEQUENCE OF SEQUENCE {
type AttributeDescription,
vals SET OF AttributeValue }
AddResponse ::= [APPLICATION 9] LDAPResult
DelRequest ::= [APPLICATION 10] LDAPDN
DelResponse ::= [APPLICATION 11] LDAPResult
ModifyDNRequest ::= [APPLICATION 12] SEQUENCE {
entry LDAPDN,
newrdn RelativeLDAPDN,
deleteoldrdn BOOLEAN,
newSuperior [0] LDAPDN OPTIONAL }
ModifyDNResponse ::= [APPLICATION 13] LDAPResult
-- Wahl, et. al. Standards Track [Page 48]
--
-- RFC 2251 LDAPv3 December 1997
CompareRequest ::= [APPLICATION 14] SEQUENCE {
entry LDAPDN,
ava AttributeValueAssertion }
CompareResponse ::= [APPLICATION 15] LDAPResult
AbandonRequest ::= [APPLICATION 16] MessageID
ExtendedRequest ::= [APPLICATION 23] SEQUENCE {
requestName [0] LDAPOID,
requestValue [1] OCTET STRING OPTIONAL }
ExtendedResponse ::= [APPLICATION 24] SEQUENCE {
COMPONENTS OF LDAPResult,
responseName [10] LDAPOID OPTIONAL,
response [11] OCTET STRING OPTIONAL }
passwdModifyOID LDAPOID ::= "1.3.6.1.4.1.4203.1.11.1"
PasswdModifyRequestValue ::= SEQUENCE {
userIdentity [0] OCTET STRING OPTIONAL,
oldPasswd [1] OCTET STRING OPTIONAL,
newPasswd [2] OCTET STRING OPTIONAL }
PasswdModifyResponseValue ::= SEQUENCE {
genPasswd [0] OCTET STRING OPTIONAL }
END
ejabberd-2.1.11/src/eldap/eldap_filter.erl 0000664 0000000 0000000 00000015335 12240230175 015237 0 ustar %%%----------------------------------------------------------------------
%%% File: eldap_filter.erl
%%% Purpose: Converts String Representation of
%%% LDAP Search Filter (RFC 2254)
%%% to eldap's representation of filter
%%% Author: Evgeniy Khramtsov
%%%
%%%
%%% ejabberd, Copyright (C) 2002-2012 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
%%% published by the Free Software Foundation; either version 2 of the
%%% License, or (at your option) any later version.
%%%
%%% This program is distributed in the hope that it will be useful,
%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
%%% General Public License for more details.
%%%
%%% You should have received a copy of the GNU General Public License
%%% along with this program; if not, write to the Free Software
%%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
%%% 02111-1307 USA
%%%
%%%----------------------------------------------------------------------
-module(eldap_filter).
%% TODO: remove this when new regexp module will be used
-compile({nowarn_deprecated_function, {regexp, sub, 3}}).
-export([parse/1, parse/2, do_sub/2]).
%%====================================================================
%% API
%%====================================================================
%%%-------------------------------------------------------------------
%%% Arity: parse/1
%%% Function: parse(RFC2254_Filter) -> {ok, EldapFilter} |
%%% {error, bad_filter}
%%%
%%% RFC2254_Filter = string().
%%%
%%% Description: Converts String Representation of LDAP Search Filter (RFC 2254)
%%% to eldap's representation of filter.
%%%
%%% Example:
%%% > eldap_filter:parse("(&(!(uid<=100))(mail=*))").
%%%
%%% {ok,{'and',[{'not',{lessOrEqual,{'AttributeValueAssertion',"uid","100"}}},
%%% {present,"mail"}]}}
%%%-------------------------------------------------------------------
parse(L) when is_list(L) ->
parse(L, []).
%%%-------------------------------------------------------------------
%%% Arity: parse/2
%%% Function: parse(RFC2254_Filter, [SubstValue |...]) ->
%%% {ok, EldapFilter} |
%%% {error, bad_filter} |
%%% {error, bad_regexp} |
%%% {error, max_substitute_recursion}
%%%
%%% SubstValue = {RegExp, Value} | {RegExp, Value, N},
%%% RFC2254_Filter = RegExp = Value = string(),
%%% N = integer().
%%%
%%% Description: The same as parse/1, but substitutes N or all occurences
%%% of RegExp with Value *after* parsing.
%%%
%%% Example:
%%% > eldap_filter:parse(
%%% "(|(mail=%u@%d)(jid=%u@%d))",
%%% [{"%u", "xramtsov"},{"%d","gmail.com"}]).
%%%
%%% {ok,{'or',[{equalityMatch,{'AttributeValueAssertion',
%%% "mail",
%%% "xramtsov@gmail.com"}},
%%% {equalityMatch,{'AttributeValueAssertion',
%%% "jid",
%%% "xramtsov@gmail.com"}}]}}
%%%-------------------------------------------------------------------
parse(L, SList) when is_list(L), is_list(SList) ->
case catch eldap_filter_yecc:parse(scan(L, SList)) of
{'EXIT', _} = Err ->
{error, Err};
{error, {_, _, Msg}} ->
{error, Msg};
{ok, Result} ->
{ok, Result};
{regexp, Err} ->
{error, Err}
end.
%%====================================================================
%% Internal functions
%%====================================================================
-define(do_scan(L), scan(Rest, [], [{L, 1} | check(Buf, S) ++ Result], L, S)).
scan(L, SList) ->
scan(L, "", [], undefined, SList).
scan("=*)" ++ Rest, Buf, Result, '(', S) ->
scan(Rest, [], [{')', 1}, {'=*', 1} | check(Buf, S) ++ Result], ')', S);
scan(":dn" ++ Rest, Buf, Result, '(', S) -> ?do_scan(':dn');
scan(":=" ++ Rest, Buf, Result, '(', S) -> ?do_scan(':=');
scan(":=" ++ Rest, Buf, Result, ':dn', S) -> ?do_scan(':=');
scan(":=" ++ Rest, Buf, Result, ':', S) -> ?do_scan(':=');
scan("~=" ++ Rest, Buf, Result, '(', S) -> ?do_scan('~=');
scan(">=" ++ Rest, Buf, Result, '(', S) -> ?do_scan('>=');
scan("<=" ++ Rest, Buf, Result, '(', S) -> ?do_scan('<=');
scan("=" ++ Rest, Buf, Result, '(', S) -> ?do_scan('=');
scan(":" ++ Rest, Buf, Result, '(', S) -> ?do_scan(':');
scan(":" ++ Rest, Buf, Result, ':dn', S) -> ?do_scan(':');
scan("&" ++ Rest, Buf, Result, '(', S) when Buf=="" -> ?do_scan('&');
scan("|" ++ Rest, Buf, Result, '(', S) when Buf=="" -> ?do_scan('|');
scan("!" ++ Rest, Buf, Result, '(', S) when Buf=="" -> ?do_scan('!');
scan("*" ++ Rest, Buf, Result, '*', S) -> ?do_scan('*');
scan("*" ++ Rest, Buf, Result, '=', S) -> ?do_scan('*');
scan("(" ++ Rest, Buf, Result, _, S) -> ?do_scan('(');
scan(")" ++ Rest, Buf, Result, _, S) -> ?do_scan(')');
scan([Letter | Rest], Buf, Result, PreviosAtom, S) ->
scan(Rest, [Letter|Buf], Result, PreviosAtom, S);
scan([], Buf, Result, _, S) ->
lists:reverse(check(Buf, S) ++ Result).
check([], _) ->
[];
check(Buf, S) ->
[{str, 1, do_sub(lists:reverse(Buf), S)}].
-define(MAX_RECURSION, 100).
do_sub(S, []) ->
S;
do_sub([], _) ->
[];
do_sub(S, [{RegExp, New} | T]) ->
Result = do_sub(S, {RegExp, replace_amps(New)}, 1),
do_sub(Result, T);
do_sub(S, [{RegExp, New, Times} | T]) ->
Result = do_sub(S, {RegExp, replace_amps(New), Times}, 1),
do_sub(Result, T).
do_sub(S, {RegExp, New}, Iter) ->
case ejabberd_regexp:run(S, RegExp) of
match ->
case ejabberd_regexp:replace(S, RegExp, New) of
NewS when Iter =< ?MAX_RECURSION ->
do_sub(NewS, {RegExp, New}, Iter+1);
_NewS when Iter > ?MAX_RECURSION ->
erlang:error(max_substitute_recursion)
end;
nomatch ->
S;
_ ->
erlang:error(bad_regexp)
end;
do_sub(S, {_, _, N}, _) when N<1 ->
S;
do_sub(S, {RegExp, New, Times}, Iter) ->
case ejabberd_regexp:run(S, RegExp) of
match ->
case ejabberd_regexp:replace(S, RegExp, New) of
NewS when Iter < Times ->
do_sub(NewS, {RegExp, New, Times}, Iter+1);
NewS ->
NewS
end;
nomatch ->
S;
_ ->
erlang:error(bad_regexp)
end.
replace_amps(String) ->
lists:flatmap(
fun($&) -> "\\&";
(Chr) -> [Chr]
end, String).
ejabberd-2.1.11/src/mod_pres_counter.erl 0000664 0000000 0000000 00000007212 12240230175 015062 0 ustar %%%----------------------------------------------------------------------
%%% File : mod_pres_counter.erl
%%% Author : Ahmed Omar
%%% Purpose : Presence subscription flood prevention
%%% Created : 23 Sep 2010 by Ahmed Omar
%%%
%%%
%%% ejabberd, Copyright (C) 2002-2012 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
%%% published by the Free Software Foundation; either version 2 of the
%%% License, or (at your option) any later version.
%%%
%%% This program is distributed in the hope that it will be useful,
%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
%%% General Public License for more details.
%%%
%%% You should have received a copy of the GNU General Public License
%%% along with this program; if not, write to the Free Software
%%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
%%% 02111-1307 USA
%%%
%%%----------------------------------------------------------------------
-module(mod_pres_counter).
-behavior(gen_mod).
-export([start/2,
stop/1,
check_packet/6]).
-include("ejabberd.hrl").
-include("jlib.hrl").
-record(pres_counter, {dir, start, count, logged = false}).
start(Host, _Opts) ->
ejabberd_hooks:add(privacy_check_packet, Host,
?MODULE, check_packet, 25),
ok.
stop(Host) ->
ejabberd_hooks:delete(privacy_check_packet, Host,
?MODULE, check_packet, 25),
ok.
check_packet(_, _User, Server,
_PrivacyList,
{From, To, {xmlelement, Name, Attrs, _}},
Dir) ->
case Name of
"presence" ->
IsSubscription =
case xml:get_attr_s("type", Attrs) of
"subscribe" -> true;
"subscribed" -> true;
"unsubscribe" -> true;
"unsubscribed" -> true;
_ -> false
end,
if
IsSubscription ->
JID = case Dir of
in -> To;
out -> From
end,
update(Server, JID, Dir);
true ->
allow
end;
_ ->
allow
end.
update(Server, JID, Dir) ->
%% get options
StormCount = gen_mod:get_module_opt(Server, ?MODULE, count, 5),
TimeInterval = gen_mod:get_module_opt(Server, ?MODULE, interval, 60),
{MegaSecs, Secs, _MicroSecs} = now(),
TimeStamp = MegaSecs * 1000000 + Secs,
case read(Dir) of
undefined ->
write(Dir, #pres_counter{dir = Dir,
start = TimeStamp,
count = 1}),
allow;
#pres_counter{start = TimeStart, count = Count, logged = Logged} = R ->
%% record for this key exists, check if we're
%% within TimeInterval seconds, and whether the StormCount is
%% high enough. or else just increment the count.
if
TimeStamp - TimeStart > TimeInterval ->
write(Dir, R#pres_counter{
start = TimeStamp,
count = 1}),
allow;
(Count =:= StormCount) and Logged ->
{stop, deny};
Count =:= StormCount ->
write(Dir, R#pres_counter{logged = true}),
case Dir of
in ->
?WARNING_MSG(
"User ~s is being flooded, "
"ignoring received presence subscriptions",
[jlib:jid_to_string(JID)]);
out ->
IP = ejabberd_sm:get_user_ip(
JID#jid.luser,
JID#jid.lserver,
JID#jid.lresource),
?WARNING_MSG(
"Flooder detected: ~s, on IP: ~s "
"ignoring sent presence subscriptions~n",
[jlib:jid_to_string(JID),
jlib:ip_to_list(IP)])
end,
{stop, deny};
true ->
write(Dir, R#pres_counter{
start = TimeStamp,
count = Count + 1}),
allow
end
end.
read(K)->
get({pres_counter, K}).
write(K, V)->
put({pres_counter, K}, V).
ejabberd-2.1.11/src/mod_vcard_xupdate_odbc.erl 0000664 0000000 0000000 00000010165 12240230175 016173 0 ustar %%%----------------------------------------------------------------------
%%% File : mod_vcard_xupdate_odbc.erl
%%% Author : Igor Goryachev
%%% Purpose : Add avatar hash in presence on behalf of client (XEP-0153)
%%% Created : 9 Mar 2007 by Igor Goryachev
%%%----------------------------------------------------------------------
-module(mod_vcard_xupdate_odbc).
-behaviour(gen_mod).
%% gen_mod callbacks
-export([start/2,
stop/1]).
%% hooks
-export([update_presence/3,
vcard_set/3]).
-include("ejabberd.hrl").
-include("jlib.hrl").
%%====================================================================
%% gen_mod callbacks
%%====================================================================
start(Host, _Opts) ->
ejabberd_hooks:add(c2s_update_presence, Host,
?MODULE, update_presence, 100),
ejabberd_hooks:add(vcard_set, Host,
?MODULE, vcard_set, 100),
ok.
stop(Host) ->
ejabberd_hooks:delete(c2s_update_presence, Host,
?MODULE, update_presence, 100),
ejabberd_hooks:delete(vcard_set, Host,
?MODULE, vcard_set, 100),
ok.
%%====================================================================
%% Hooks
%%====================================================================
update_presence({xmlelement, "presence", Attrs, _Els} = Packet, User, Host) ->
case xml:get_attr_s("type", Attrs) of
[] ->
presence_with_xupdate(Packet, User, Host);
_ ->
Packet
end;
update_presence(Packet, _User, _Host) ->
Packet.
vcard_set(LUser, LServer, VCARD) ->
US = {LUser, LServer},
case xml:get_path_s(VCARD, [{elem, "PHOTO"}, {elem, "BINVAL"}, cdata]) of
[] ->
remove_xupdate(LUser, LServer);
BinVal ->
add_xupdate(LUser, LServer, sha:sha(jlib:decode_base64(BinVal)))
end,
ejabberd_sm:force_update_presence(US).
%%====================================================================
%% ODBC storage
%%====================================================================
add_xupdate(LUser, LServer, Hash) ->
Username = ejabberd_odbc:escape(LUser),
SHash = ejabberd_odbc:escape(Hash),
F = fun() ->
odbc_queries:update_t(
"vcard_xupdate",
["username", "hash"],
[Username, SHash],
["username='", Username, "'"])
end,
ejabberd_odbc:sql_transaction(LServer, F).
get_xupdate(LUser, LServer) ->
Username = ejabberd_odbc:escape(LUser),
case ejabberd_odbc:sql_query(
LServer, ["select hash from vcard_xupdate "
"where username='", Username, "';"]) of
{selected, ["hash"], [{Hash}]} ->
Hash;
_ ->
undefined
end.
remove_xupdate(LUser, LServer) ->
Username = ejabberd_odbc:escape(LUser),
F = fun() ->
ejabberd_odbc:sql_query_t(
["delete from vcard_xupdate where "
"username='", Username, "';"])
end,
ejabberd_odbc:sql_transaction(LServer, F).
%%%----------------------------------------------------------------------
%%% Presence stanza rebuilding
%%%----------------------------------------------------------------------
presence_with_xupdate({xmlelement, "presence", Attrs, Els}, User, Host) ->
XPhotoEl = build_xphotoel(User, Host),
Els2 = presence_with_xupdate2(Els, [], XPhotoEl),
{xmlelement, "presence", Attrs, Els2}.
presence_with_xupdate2([], Els2, XPhotoEl) ->
lists:reverse([XPhotoEl | Els2]);
%% This clause assumes that the x element contains only the XMLNS attribute:
presence_with_xupdate2([{xmlelement, "x", [{"xmlns", ?NS_VCARD_UPDATE}], _}
| Els], Els2, XPhotoEl) ->
presence_with_xupdate2(Els, Els2, XPhotoEl);
presence_with_xupdate2([El | Els], Els2, XPhotoEl) ->
presence_with_xupdate2(Els, [El | Els2], XPhotoEl).
build_xphotoel(User, Host) ->
Hash = get_xupdate(User, Host),
PhotoSubEls = case Hash of
Hash when is_list(Hash) ->
[{xmlcdata, Hash}];
_ ->
[]
end,
PhotoEl = [{xmlelement, "photo", [], PhotoSubEls}],
{xmlelement, "x", [{"xmlns", ?NS_VCARD_UPDATE}], PhotoEl}.
ejabberd-2.1.11/src/mod_vcard_xupdate.erl 0000664 0000000 0000000 00000007503 12240230175 015206 0 ustar %%%----------------------------------------------------------------------
%%% File : mod_vcard_xupdate.erl
%%% Author : Igor Goryachev
%%% Purpose : Add avatar hash in presence on behalf of client (XEP-0153)
%%% Created : 9 Mar 2007 by Igor Goryachev
%%%----------------------------------------------------------------------
-module(mod_vcard_xupdate).
-behaviour(gen_mod).
%% gen_mod callbacks
-export([start/2,
stop/1]).
%% hooks
-export([update_presence/3,
vcard_set/3]).
-include("ejabberd.hrl").
-include("jlib.hrl").
-record(vcard_xupdate, {us, hash}).
%%====================================================================
%% gen_mod callbacks
%%====================================================================
start(Host, _Opts) ->
mnesia:create_table(vcard_xupdate,
[{disc_copies, [node()]},
{attributes, record_info(fields, vcard_xupdate)}]),
ejabberd_hooks:add(c2s_update_presence, Host,
?MODULE, update_presence, 100),
ejabberd_hooks:add(vcard_set, Host,
?MODULE, vcard_set, 100),
ok.
stop(Host) ->
ejabberd_hooks:delete(c2s_update_presence, Host,
?MODULE, update_presence, 100),
ejabberd_hooks:delete(vcard_set, Host,
?MODULE, vcard_set, 100),
ok.
%%====================================================================
%% Hooks
%%====================================================================
update_presence({xmlelement, "presence", Attrs, _Els} = Packet, User, Host) ->
case xml:get_attr_s("type", Attrs) of
[] ->
presence_with_xupdate(Packet, User, Host);
_ ->
Packet
end;
update_presence(Packet, _User, _Host) ->
Packet.
vcard_set(LUser, LServer, VCARD) ->
US = {LUser, LServer},
case xml:get_path_s(VCARD, [{elem, "PHOTO"}, {elem, "BINVAL"}, cdata]) of
[] ->
remove_xupdate(LUser, LServer);
BinVal ->
add_xupdate(LUser, LServer, sha:sha(jlib:decode_base64(BinVal)))
end,
ejabberd_sm:force_update_presence(US).
%%====================================================================
%% Mnesia storage
%%====================================================================
add_xupdate(LUser, LServer, Hash) ->
F = fun() ->
mnesia:write(#vcard_xupdate{us = {LUser, LServer}, hash = Hash})
end,
mnesia:transaction(F).
get_xupdate(LUser, LServer) ->
case mnesia:dirty_read(vcard_xupdate, {LUser, LServer}) of
[#vcard_xupdate{hash = Hash}] ->
Hash;
_ ->
undefined
end.
remove_xupdate(LUser, LServer) ->
F = fun() ->
mnesia:delete({vcard_xupdate, {LUser, LServer}})
end,
mnesia:transaction(F).
%%%----------------------------------------------------------------------
%%% Presence stanza rebuilding
%%%----------------------------------------------------------------------
presence_with_xupdate({xmlelement, "presence", Attrs, Els}, User, Host) ->
XPhotoEl = build_xphotoel(User, Host),
Els2 = presence_with_xupdate2(Els, [], XPhotoEl),
{xmlelement, "presence", Attrs, Els2}.
presence_with_xupdate2([], Els2, XPhotoEl) ->
lists:reverse([XPhotoEl | Els2]);
%% This clause assumes that the x element contains only the XMLNS attribute:
presence_with_xupdate2([{xmlelement, "x", [{"xmlns", ?NS_VCARD_UPDATE}], _}
| Els], Els2, XPhotoEl) ->
presence_with_xupdate2(Els, Els2, XPhotoEl);
presence_with_xupdate2([El | Els], Els2, XPhotoEl) ->
presence_with_xupdate2(Els, [El | Els2], XPhotoEl).
build_xphotoel(User, Host) ->
Hash = get_xupdate(User, Host),
PhotoSubEls = case Hash of
Hash when is_list(Hash) ->
[{xmlcdata, Hash}];
_ ->
[]
end,
PhotoEl = [{xmlelement, "photo", [], PhotoSubEls}],
{xmlelement, "x", [{"xmlns", ?NS_VCARD_UPDATE}], PhotoEl}.
ejabberd-2.1.11/src/mod_configure.erl 0000664 0000000 0000000 00000165421 12240230175 014342 0 ustar %%%----------------------------------------------------------------------
%%% File : mod_configure.erl
%%% Author : Alexey Shchepin
%%% Purpose : Support for online configuration of ejabberd
%%% Created : 19 Jan 2003 by Alexey Shchepin
%%%
%%%
%%% ejabberd, Copyright (C) 2002-2012 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
%%% published by the Free Software Foundation; either version 2 of the
%%% License, or (at your option) any later version.
%%%
%%% This program is distributed in the hope that it will be useful,
%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
%%% General Public License for more details.
%%%
%%% You should have received a copy of the GNU General Public License
%%% along with this program; if not, write to the Free Software
%%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
%%% 02111-1307 USA
%%%
%%%----------------------------------------------------------------------
%%% Implements most of XEP-0133: Service Administration Version 1.1
%%% (2005-08-19)
-module(mod_configure).
-author('alexey@process-one.net').
-behaviour(gen_mod).
-export([start/2,
stop/1,
get_local_identity/5,
get_local_features/5,
get_local_items/5,
adhoc_local_items/4,
adhoc_local_commands/4,
get_sm_identity/5,
get_sm_features/5,
get_sm_items/5,
adhoc_sm_items/4,
adhoc_sm_commands/4]).
-include("ejabberd.hrl").
-include("jlib.hrl").
-include("adhoc.hrl").
-define(T(Lang, Text), translate:translate(Lang, Text)).
%% Copied from ejabberd_sm.erl
-record(session, {sid, usr, us, priority, info}).
start(Host, _Opts) ->
ejabberd_hooks:add(disco_local_items, Host, ?MODULE, get_local_items, 50),
ejabberd_hooks:add(disco_local_features, Host, ?MODULE, get_local_features, 50),
ejabberd_hooks:add(disco_local_identity, Host, ?MODULE, get_local_identity, 50),
ejabberd_hooks:add(disco_sm_items, Host, ?MODULE, get_sm_items, 50),
ejabberd_hooks:add(disco_sm_features, Host, ?MODULE, get_sm_features, 50),
ejabberd_hooks:add(disco_sm_identity, Host, ?MODULE, get_sm_identity, 50),
ejabberd_hooks:add(adhoc_local_items, Host, ?MODULE, adhoc_local_items, 50),
ejabberd_hooks:add(adhoc_local_commands, Host, ?MODULE, adhoc_local_commands, 50),
ejabberd_hooks:add(adhoc_sm_items, Host, ?MODULE, adhoc_sm_items, 50),
ejabberd_hooks:add(adhoc_sm_commands, Host, ?MODULE, adhoc_sm_commands, 50),
ok.
stop(Host) ->
ejabberd_hooks:delete(adhoc_sm_commands, Host, ?MODULE, adhoc_sm_commands, 50),
ejabberd_hooks:delete(adhoc_sm_items, Host, ?MODULE, adhoc_sm_items, 50),
ejabberd_hooks:delete(adhoc_local_commands, Host, ?MODULE, adhoc_local_commands, 50),
ejabberd_hooks:delete(adhoc_local_items, Host, ?MODULE, adhoc_local_items, 50),
ejabberd_hooks:delete(disco_sm_identity, Host, ?MODULE, get_sm_identity, 50),
ejabberd_hooks:delete(disco_sm_features, Host, ?MODULE, get_sm_features, 50),
ejabberd_hooks:delete(disco_sm_items, Host, ?MODULE, get_sm_items, 50),
ejabberd_hooks:delete(disco_local_identity, Host, ?MODULE, get_local_identity, 50),
ejabberd_hooks:delete(disco_local_features, Host, ?MODULE, get_local_features, 50),
ejabberd_hooks:delete(disco_local_items, Host, ?MODULE, get_local_items, 50),
gen_iq_handler:remove_iq_handler(ejabberd_local, Host, ?NS_COMMANDS),
gen_iq_handler:remove_iq_handler(ejabberd_sm, Host, ?NS_COMMANDS).
%%%-----------------------------------------------------------------------
-define(INFO_IDENTITY(Category, Type, Name, Lang),
[{xmlelement, "identity",
[{"category", Category},
{"type", Type},
{"name", ?T(Lang, Name)}], []}]).
-define(INFO_COMMAND(Name, Lang),
?INFO_IDENTITY("automation", "command-node", Name, Lang)).
-define(NODEJID(To, Name, Node),
{xmlelement, "item",
[{"jid", jlib:jid_to_string(To)},
{"name", ?T(Lang, Name)},
{"node", Node}], []}).
-define(NODE(Name, Node),
{xmlelement, "item",
[{"jid", Server},
{"name", ?T(Lang, Name)},
{"node", Node}], []}).
-define(NS_ADMINX(Sub), ?NS_ADMIN++"#"++Sub).
-define(NS_ADMINL(Sub), ["http:","jabber.org","protocol","admin", Sub]).
tokenize(Node) -> string:tokens(Node, "/#").
get_sm_identity(Acc, _From, _To, Node, Lang) ->
case Node of
"config" ->
?INFO_COMMAND("Configuration", Lang);
_ ->
Acc
end.
get_local_identity(Acc, _From, _To, Node, Lang) ->
LNode = tokenize(Node),
case LNode of
["running nodes", ENode] ->
?INFO_IDENTITY("ejabberd", "node", ENode, Lang);
["running nodes", _ENode, "DB"] ->
?INFO_COMMAND("Database", Lang);
["running nodes", _ENode, "modules", "start"] ->
?INFO_COMMAND("Start Modules", Lang);
["running nodes", _ENode, "modules", "stop"] ->
?INFO_COMMAND("Stop Modules", Lang);
["running nodes", _ENode, "backup", "backup"] ->
?INFO_COMMAND("Backup", Lang);
["running nodes", _ENode, "backup", "restore"] ->
?INFO_COMMAND("Restore", Lang);
["running nodes", _ENode, "backup", "textfile"] ->
?INFO_COMMAND("Dump to Text File", Lang);
["running nodes", _ENode, "import", "file"] ->
?INFO_COMMAND("Import File", Lang);
["running nodes", _ENode, "import", "dir"] ->
?INFO_COMMAND("Import Directory", Lang);
["running nodes", _ENode, "restart"] ->
?INFO_COMMAND("Restart Service", Lang);
["running nodes", _ENode, "shutdown"] ->
?INFO_COMMAND("Shut Down Service", Lang);
?NS_ADMINL("add-user") ->
?INFO_COMMAND("Add User", Lang);
?NS_ADMINL("delete-user") ->
?INFO_COMMAND("Delete User", Lang);
?NS_ADMINL("end-user-session") ->
?INFO_COMMAND("End User Session", Lang);
?NS_ADMINL("get-user-password") ->
?INFO_COMMAND("Get User Password", Lang);
?NS_ADMINL("change-user-password") ->
?INFO_COMMAND("Change User Password", Lang);
?NS_ADMINL("get-user-lastlogin") ->
?INFO_COMMAND("Get User Last Login Time", Lang);
?NS_ADMINL("user-stats") ->
?INFO_COMMAND("Get User Statistics", Lang);
?NS_ADMINL("get-registered-users-num") ->
?INFO_COMMAND("Get Number of Registered Users", Lang);
?NS_ADMINL("get-online-users-num") ->
?INFO_COMMAND("Get Number of Online Users", Lang);
["config", "acls"] ->
?INFO_COMMAND("Access Control Lists", Lang);
["config", "access"] ->
?INFO_COMMAND("Access Rules", Lang);
_ ->
Acc
end.
%%%-----------------------------------------------------------------------
-define(INFO_RESULT(Allow, Feats),
case Allow of
deny ->
{error, ?ERR_FORBIDDEN};
allow ->
{result, Feats}
end).
get_sm_features(Acc, From, #jid{lserver = LServer} = _To, Node, _Lang) ->
case gen_mod:is_loaded(LServer, mod_adhoc) of
false ->
Acc;
_ ->
Allow = acl:match_rule(LServer, configure, From),
case Node of
"config" ->
?INFO_RESULT(Allow, [?NS_COMMANDS]);
_ ->
Acc
end
end.
get_local_features(Acc, From, #jid{lserver = LServer} = _To, Node, _Lang) ->
case gen_mod:is_loaded(LServer, mod_adhoc) of
false ->
Acc;
_ ->
LNode = tokenize(Node),
Allow = acl:match_rule(LServer, configure, From),
case LNode of
["config"] ->
?INFO_RESULT(Allow, []);
["user"] ->
?INFO_RESULT(Allow, []);
["online users"] ->
?INFO_RESULT(Allow, []);
["all users"] ->
?INFO_RESULT(Allow, []);
["all users", [$@ | _]] ->
?INFO_RESULT(Allow, []);
["outgoing s2s" | _] ->
?INFO_RESULT(Allow, []);
["running nodes"] ->
?INFO_RESULT(Allow, []);
["stopped nodes"] ->
?INFO_RESULT(Allow, []);
["running nodes", _ENode] ->
?INFO_RESULT(Allow, [?NS_STATS]);
["running nodes", _ENode, "DB"] ->
?INFO_RESULT(Allow, [?NS_COMMANDS]);
["running nodes", _ENode, "modules"] ->
?INFO_RESULT(Allow, []);
["running nodes", _ENode, "modules", _] ->
?INFO_RESULT(Allow, [?NS_COMMANDS]);
["running nodes", _ENode, "backup"] ->
?INFO_RESULT(Allow, []);
["running nodes", _ENode, "backup", _] ->
?INFO_RESULT(Allow, [?NS_COMMANDS]);
["running nodes", _ENode, "import"] ->
?INFO_RESULT(Allow, []);
["running nodes", _ENode, "import", _] ->
?INFO_RESULT(Allow, [?NS_COMMANDS]);
["running nodes", _ENode, "restart"] ->
?INFO_RESULT(Allow, [?NS_COMMANDS]);
["running nodes", _ENode, "shutdown"] ->
?INFO_RESULT(Allow, [?NS_COMMANDS]);
["config", _] ->
?INFO_RESULT(Allow, [?NS_COMMANDS]);
?NS_ADMINL("add-user") ->
?INFO_RESULT(Allow, [?NS_COMMANDS]);
?NS_ADMINL("delete-user") ->
?INFO_RESULT(Allow, [?NS_COMMANDS]);
?NS_ADMINL("end-user-session") ->
?INFO_RESULT(Allow, [?NS_COMMANDS]);
?NS_ADMINL("get-user-password") ->
?INFO_RESULT(Allow, [?NS_COMMANDS]);
?NS_ADMINL("change-user-password") ->
?INFO_RESULT(Allow, [?NS_COMMANDS]);
?NS_ADMINL("get-user-lastlogin") ->
?INFO_RESULT(Allow, [?NS_COMMANDS]);
?NS_ADMINL("user-stats") ->
?INFO_RESULT(Allow, [?NS_COMMANDS]);
?NS_ADMINL("get-registered-users-num") ->
?INFO_RESULT(Allow, [?NS_COMMANDS]);
?NS_ADMINL("get-online-users-num") ->
?INFO_RESULT(Allow, [?NS_COMMANDS]);
_ ->
Acc
end
end.
%%%-----------------------------------------------------------------------
adhoc_sm_items(Acc, From, #jid{lserver = LServer} = To, Lang) ->
case acl:match_rule(LServer, configure, From) of
allow ->
Items = case Acc of
{result, Its} -> Its;
empty -> []
end,
Nodes = [{xmlelement, "item",
[{"jid", jlib:jid_to_string(To)},
{"name", ?T(Lang, "Configuration")},
{"node", "config"}], []}],
{result, Items ++ Nodes};
_ ->
Acc
end.
%%%-----------------------------------------------------------------------
get_sm_items(Acc, From,
#jid{user = User, server = Server, lserver = LServer} = To,
Node, Lang) ->
case gen_mod:is_loaded(LServer, mod_adhoc) of
false ->
Acc;
_ ->
Items = case Acc of
{result, Its} -> Its;
empty -> []
end,
case {acl:match_rule(LServer, configure, From), Node} of
{allow, ""} ->
Nodes = [?NODEJID(To, "Configuration", "config"),
?NODEJID(To, "User Management", "user")],
{result, Items ++ Nodes ++ get_user_resources(User, Server)};
{allow, "config"} ->
{result, []};
{_, "config"} ->
{error, ?ERR_FORBIDDEN};
_ ->
Acc
end
end.
get_user_resources(User, Server) ->
Rs = ejabberd_sm:get_user_resources(User, Server),
lists:map(fun(R) ->
{xmlelement, "item",
[{"jid", User ++ "@" ++ Server ++ "/" ++ R},
{"name", User}], []}
end, lists:sort(Rs)).
%%%-----------------------------------------------------------------------
adhoc_local_items(Acc, From, #jid{lserver = LServer, server = Server} = To,
Lang) ->
case acl:match_rule(LServer, configure, From) of
allow ->
Items = case Acc of
{result, Its} -> Its;
empty -> []
end,
PermLev = get_permission_level(From),
%% Recursively get all configure commands
Nodes = recursively_get_local_items(PermLev, LServer, "", Server,
Lang),
Nodes1 = lists:filter(
fun(N) ->
Nd = xml:get_tag_attr_s("node", N),
F = get_local_features([], From, To, Nd, Lang),
case F of
{result, [?NS_COMMANDS]} ->
true;
_ ->
false
end
end, Nodes),
{result, Items ++ Nodes1};
_ ->
Acc
end.
recursively_get_local_items(_PermLev, _LServer, "online users", _Server, _Lang) ->
[];
recursively_get_local_items(_PermLev, _LServer, "all users", _Server, _Lang) ->
[];
recursively_get_local_items(PermLev, LServer, Node, Server, Lang) ->
LNode = tokenize(Node),
Items = case get_local_items({PermLev, LServer}, LNode, Server, Lang) of
{result, Res} ->
Res;
{error, _Error} ->
[]
end,
Nodes = lists:flatten(
lists:map(
fun(N) ->
S = xml:get_tag_attr_s("jid", N),
Nd = xml:get_tag_attr_s("node", N),
if (S /= Server) or (Nd == "") ->
[];
true ->
[N, recursively_get_local_items(
PermLev, LServer, Nd, Server, Lang)]
end
end, Items)),
Nodes.
get_permission_level(JID) ->
case acl:match_rule(global, configure, JID) of
allow -> global;
deny -> vhost
end.
%%%-----------------------------------------------------------------------
-define(ITEMS_RESULT(Allow, LNode, Fallback),
case Allow of
deny ->
Fallback;
allow ->
PermLev = get_permission_level(From),
case get_local_items({PermLev, LServer}, LNode,
jlib:jid_to_string(To), Lang) of
{result, Res} ->
{result, Res};
{error, Error} ->
{error, Error}
end
end).
get_local_items(Acc, From, #jid{lserver = LServer} = To, "", Lang) ->
case gen_mod:is_loaded(LServer, mod_adhoc) of
false ->
Acc;
_ ->
Items = case Acc of
{result, Its} -> Its;
empty -> []
end,
Allow = acl:match_rule(LServer, configure, From),
case Allow of
deny ->
{result, Items};
allow ->
PermLev = get_permission_level(From),
case get_local_items({PermLev, LServer}, [],
jlib:jid_to_string(To), Lang) of
{result, Res} ->
{result, Items ++ Res};
{error, _Error} ->
{result, Items}
end
end
end;
get_local_items(Acc, From, #jid{lserver = LServer} = To, Node, Lang) ->
case gen_mod:is_loaded(LServer, mod_adhoc) of
false ->
Acc;
_ ->
LNode = tokenize(Node),
Allow = acl:match_rule(LServer, configure, From),
case LNode of
["config"] ->
?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
["user"] ->
?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
["online users"] ->
?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
["all users"] ->
?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
["all users", [$@ | _]] ->
?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
["outgoing s2s" | _] ->
?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
["running nodes"] ->
?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
["stopped nodes"] ->
?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
["running nodes", _ENode] ->
?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
["running nodes", _ENode, "DB"] ->
?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
["running nodes", _ENode, "modules"] ->
?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
["running nodes", _ENode, "modules", _] ->
?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
["running nodes", _ENode, "backup"] ->
?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
["running nodes", _ENode, "backup", _] ->
?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
["running nodes", _ENode, "import"] ->
?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
["running nodes", _ENode, "import", _] ->
?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
["running nodes", _ENode, "restart"] ->
?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
["running nodes", _ENode, "shutdown"] ->
?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
["config", _] ->
?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
?NS_ADMINL("add-user") ->
?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
?NS_ADMINL("delete-user") ->
?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
?NS_ADMINL("end-user-session") ->
?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
?NS_ADMINL("get-user-password") ->
?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
?NS_ADMINL("change-user-password") ->
?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
?NS_ADMINL("get-user-lastlogin") ->
?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
?NS_ADMINL("user-stats") ->
?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
?NS_ADMINL("get-registered-users-num") ->
?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
?NS_ADMINL("get-online-users-num") ->
?ITEMS_RESULT(Allow, LNode, {error, ?ERR_FORBIDDEN});
_ ->
Acc
end
end.
%%%-----------------------------------------------------------------------
%% @spec ({PermissionLevel, Host}, [string()], Server::string(), Lang)
%% -> {result, [xmlelement()]}
%% PermissionLevel = global | vhost
get_local_items(_Host, [], Server, Lang) ->
{result,
[?NODE("Configuration", "config"),
?NODE("User Management", "user"),
?NODE("Online Users", "online users"),
?NODE("All Users", "all users"),
?NODE("Outgoing s2s Connections", "outgoing s2s"),
?NODE("Running Nodes", "running nodes"),
?NODE("Stopped Nodes", "stopped nodes")
]};
get_local_items(_Host, ["config"], Server, Lang) ->
{result,
[?NODE("Access Control Lists", "config/acls"),
?NODE("Access Rules", "config/access")
]};
get_local_items(_Host, ["config", _], _Server, _Lang) ->
{result, []};
get_local_items(_Host, ["user"], Server, Lang) ->
{result,
[?NODE("Add User", ?NS_ADMINX("add-user")),
?NODE("Delete User", ?NS_ADMINX("delete-user")),
?NODE("End User Session", ?NS_ADMINX("end-user-session")),
?NODE("Get User Password", ?NS_ADMINX("get-user-password")),
?NODE("Change User Password",?NS_ADMINX("change-user-password")),
?NODE("Get User Last Login Time", ?NS_ADMINX("get-user-lastlogin")),
?NODE("Get User Statistics", ?NS_ADMINX("user-stats")),
?NODE("Get Number of Registered Users",?NS_ADMINX("get-registered-users-num")),
?NODE("Get Number of Online Users",?NS_ADMINX("get-online-users-num"))
]};
get_local_items(_Host, ["http:" | _], _Server, _Lang) ->
{result, []};
get_local_items({_, Host}, ["online users"], _Server, _Lang) ->
{result, get_online_vh_users(Host)};
get_local_items({_, Host}, ["all users"], _Server, _Lang) ->
{result, get_all_vh_users(Host)};
get_local_items({_, Host}, ["all users", [$@ | Diap]], _Server, _Lang) ->
case catch ejabberd_auth:get_vh_registered_users(Host) of
{'EXIT', _Reason} ->
?ERR_INTERNAL_SERVER_ERROR;
Users ->
SUsers = lists:sort([{S, U} || {U, S} <- Users]),
case catch begin
[S1, S2] = ejabberd_regexp:split(Diap, "-"),
N1 = list_to_integer(S1),
N2 = list_to_integer(S2),
Sub = lists:sublist(SUsers, N1, N2 - N1 + 1),
lists:map(fun({S, U}) ->
{xmlelement, "item",
[{"jid", U ++ "@" ++ S},
{"name", U ++ "@" ++ S}], []}
end, Sub)
end of
{'EXIT', _Reason} ->
?ERR_NOT_ACCEPTABLE;
Res ->
{result, Res}
end
end;
get_local_items({_, Host}, ["outgoing s2s"], _Server, Lang) ->
{result, get_outgoing_s2s(Host, Lang)};
get_local_items({_, Host}, ["outgoing s2s", To], _Server, Lang) ->
{result, get_outgoing_s2s(Host, Lang, To)};
get_local_items(_Host, ["running nodes"], Server, Lang) ->
{result, get_running_nodes(Server, Lang)};
get_local_items(_Host, ["stopped nodes"], _Server, Lang) ->
{result, get_stopped_nodes(Lang)};
get_local_items({global, _Host}, ["running nodes", ENode], Server, Lang) ->
{result,
[?NODE("Database", "running nodes/" ++ ENode ++ "/DB"),
?NODE("Modules", "running nodes/" ++ ENode ++ "/modules"),
?NODE("Backup Management", "running nodes/" ++ ENode ++ "/backup"),
?NODE("Import Users From jabberd14 Spool Files",
"running nodes/" ++ ENode ++ "/import"),
?NODE("Restart Service", "running nodes/" ++ ENode ++ "/restart"),
?NODE("Shut Down Service", "running nodes/" ++ ENode ++ "/shutdown")
]};
get_local_items({vhost, _Host}, ["running nodes", ENode], Server, Lang) ->
{result,
[?NODE("Modules", "running nodes/" ++ ENode ++ "/modules")
]};
get_local_items(_Host, ["running nodes", _ENode, "DB"], _Server, _Lang) ->
{result, []};
get_local_items(_Host, ["running nodes", ENode, "modules"], Server, Lang) ->
{result,
[?NODE("Start Modules", "running nodes/" ++ ENode ++ "/modules/start"),
?NODE("Stop Modules", "running nodes/" ++ ENode ++ "/modules/stop")
]};
get_local_items(_Host, ["running nodes", _ENode, "modules", _], _Server, _Lang) ->
{result, []};
get_local_items(_Host, ["running nodes", ENode, "backup"], Server, Lang) ->
{result,
[?NODE("Backup", "running nodes/" ++ ENode ++ "/backup/backup"),
?NODE("Restore", "running nodes/" ++ ENode ++ "/backup/restore"),
?NODE("Dump to Text File",
"running nodes/" ++ ENode ++ "/backup/textfile")
]};
get_local_items(_Host, ["running nodes", _ENode, "backup", _], _Server, _Lang) ->
{result, []};
get_local_items(_Host, ["running nodes", ENode, "import"], Server, Lang) ->
{result,
[?NODE("Import File", "running nodes/" ++ ENode ++ "/import/file"),
?NODE("Import Directory", "running nodes/" ++ ENode ++ "/import/dir")
]};
get_local_items(_Host, ["running nodes", _ENode, "import", _], _Server, _Lang) ->
{result, []};
get_local_items(_Host, ["running nodes", _ENode, "restart"], _Server, _Lang) ->
{result, []};
get_local_items(_Host, ["running nodes", _ENode, "shutdown"], _Server, _Lang) ->
{result, []};
get_local_items(_Host, _, _Server, _Lang) ->
{error, ?ERR_ITEM_NOT_FOUND}.
get_online_vh_users(Host) ->
case catch ejabberd_sm:get_vh_session_list(Host) of
{'EXIT', _Reason} ->
[];
USRs ->
SURs = lists:sort([{S, U, R} || {U, S, R} <- USRs]),
lists:map(fun({S, U, R}) ->
{xmlelement, "item",
[{"jid", U ++ "@" ++ S ++ "/" ++ R},
{"name", U ++ "@" ++ S}], []}
end, SURs)
end.
get_all_vh_users(Host) ->
case catch ejabberd_auth:get_vh_registered_users(Host) of
{'EXIT', _Reason} ->
[];
Users ->
SUsers = lists:sort([{S, U} || {U, S} <- Users]),
case length(SUsers) of
N when N =< 100 ->
lists:map(fun({S, U}) ->
{xmlelement, "item",
[{"jid", U ++ "@" ++ S},
{"name", U ++ "@" ++ S}], []}
end, SUsers);
N ->
NParts = trunc(math:sqrt(N * 0.618)) + 1,
M = trunc(N / NParts) + 1,
lists:map(fun(K) ->
L = K + M - 1,
Node =
"@" ++ integer_to_list(K) ++
"-" ++ integer_to_list(L),
{FS, FU} = lists:nth(K, SUsers),
{LS, LU} =
if L < N -> lists:nth(L, SUsers);
true -> lists:last(SUsers)
end,
Name =
FU ++ "@" ++ FS ++
" -- " ++
LU ++ "@" ++ LS,
{xmlelement, "item",
[{"jid", Host},
{"node", "all users/" ++ Node},
{"name", Name}], []}
end, lists:seq(1, N, M))
end
end.
get_outgoing_s2s(Host, Lang) ->
case catch ejabberd_s2s:dirty_get_connections() of
{'EXIT', _Reason} ->
[];
Connections ->
DotHost = "." ++ Host,
TConns = [TH || {FH, TH} <- Connections,
Host == FH orelse lists:suffix(DotHost, FH)],
lists:map(
fun(T) ->
{xmlelement, "item",
[{"jid", Host},
{"node", "outgoing s2s/" ++ T},
{"name",
lists:flatten(
io_lib:format(
?T(Lang, "To ~s"), [T]))}],
[]}
end, lists:usort(TConns))
end.
get_outgoing_s2s(Host, Lang, To) ->
case catch ejabberd_s2s:dirty_get_connections() of
{'EXIT', _Reason} ->
[];
Connections ->
lists:map(
fun({F, _T}) ->
{xmlelement, "item",
[{"jid", Host},
{"node", "outgoing s2s/" ++ To ++ "/" ++ F},
{"name",
lists:flatten(
io_lib:format(
?T(Lang, "From ~s"), [F]))}],
[]}
end, lists:keysort(1, lists:filter(fun(E) ->
element(2, E) == To
end, Connections)))
end.
get_running_nodes(Server, _Lang) ->
case catch mnesia:system_info(running_db_nodes) of
{'EXIT', _Reason} ->
[];
DBNodes ->
lists:map(
fun(N) ->
S = atom_to_list(N),
{xmlelement, "item",
[{"jid", Server},
{"node", "running nodes/" ++ S},
{"name", S}],
[]}
end, lists:sort(DBNodes))
end.
get_stopped_nodes(_Lang) ->
case catch (lists:usort(mnesia:system_info(db_nodes) ++
mnesia:system_info(extra_db_nodes)) --
mnesia:system_info(running_db_nodes)) of
{'EXIT', _Reason} ->
[];
DBNodes ->
lists:map(
fun(N) ->
S = atom_to_list(N),
{xmlelement, "item",
[{"jid", ?MYNAME},
{"node", "stopped nodes/" ++ S},
{"name", S}],
[]}
end, lists:sort(DBNodes))
end.
%%-------------------------------------------------------------------------
-define(COMMANDS_RESULT(LServerOrGlobal, From, To, Request),
case acl:match_rule(LServerOrGlobal, configure, From) of
deny ->
{error, ?ERR_FORBIDDEN};
allow ->
adhoc_local_commands(From, To, Request)
end).
adhoc_local_commands(Acc, From, #jid{lserver = LServer} = To,
#adhoc_request{node = Node} = Request) ->
LNode = tokenize(Node),
case LNode of
["running nodes", _ENode, "DB"] ->
?COMMANDS_RESULT(global, From, To, Request);
["running nodes", _ENode, "modules", _] ->
?COMMANDS_RESULT(LServer, From, To, Request);
["running nodes", _ENode, "backup", _] ->
?COMMANDS_RESULT(global, From, To, Request);
["running nodes", _ENode, "import", _] ->
?COMMANDS_RESULT(global, From, To, Request);
["running nodes", _ENode, "restart"] ->
?COMMANDS_RESULT(global, From, To, Request);
["running nodes", _ENode, "shutdown"] ->
?COMMANDS_RESULT(global, From, To, Request);
["config", _] ->
?COMMANDS_RESULT(LServer, From, To, Request);
?NS_ADMINL(_) ->
?COMMANDS_RESULT(LServer, From, To, Request);
_ ->
Acc
end.
adhoc_local_commands(From, #jid{lserver = LServer} = _To,
#adhoc_request{lang = Lang,
node = Node,
sessionid = SessionID,
action = Action,
xdata = XData} = Request) ->
LNode = tokenize(Node),
%% If the "action" attribute is not present, it is
%% understood as "execute". If there was no
%% element in the first response (which there isn't in our
%% case), "execute" and "complete" are equivalent.
ActionIsExecute = lists:member(Action,
["", "execute", "complete"]),
if Action == "cancel" ->
%% User cancels request
adhoc:produce_response(
Request,
#adhoc_response{status = canceled});
XData == false, ActionIsExecute ->
%% User requests form
case get_form(LServer, LNode, Lang) of
{result, Form} ->
adhoc:produce_response(
Request,
#adhoc_response{status = executing,
elements = Form});
{result, Status, Form} ->
adhoc:produce_response(
Request,
#adhoc_response{status = Status,
elements = Form});
{error, Error} ->
{error, Error}
end;
XData /= false, ActionIsExecute ->
%% User returns form.
case jlib:parse_xdata_submit(XData) of
invalid ->
{error, ?ERR_BAD_REQUEST};
Fields ->
case catch set_form(From, LServer, LNode, Lang, Fields) of
{result, Res} ->
adhoc:produce_response(
#adhoc_response{lang = Lang,
node = Node,
sessionid = SessionID,
elements = Res,
status = completed});
{'EXIT', _} ->
{error, ?ERR_BAD_REQUEST};
{error, Error} ->
{error, Error}
end
end;
true ->
{error, ?ERR_BAD_REQUEST}
end.
-define(TVFIELD(Type, Var, Val),
{xmlelement, "field", [{"type", Type},
{"var", Var}],
[{xmlelement, "value", [], [{xmlcdata, Val}]}]}).
-define(HFIELD(), ?TVFIELD("hidden", "FORM_TYPE", ?NS_ADMIN)).
-define(TLFIELD(Type, Label, Var),
{xmlelement, "field", [{"type", Type},
{"label", ?T(Lang, Label)},
{"var", Var}], []}).
-define(XFIELD(Type, Label, Var, Val),
{xmlelement, "field", [{"type", Type},
{"label", ?T(Lang, Label)},
{"var", Var}],
[{xmlelement, "value", [], [{xmlcdata, Val}]}]}).
-define(XMFIELD(Type, Label, Var, Vals),
{xmlelement, "field", [{"type", Type},
{"label", ?T(Lang, Label)},
{"var", Var}],
[{xmlelement, "value", [], [{xmlcdata,Val}]} || Val <- Vals]}).
-define(TABLEFIELD(Table, Val),
{xmlelement, "field", [{"type", "list-single"},
{"label", atom_to_list(Table)},
{"var", atom_to_list(Table)}],
[{xmlelement, "value", [], [{xmlcdata, atom_to_list(Val)}]},
{xmlelement, "option", [{"label",
?T(Lang, "RAM copy")}],
[{xmlelement, "value", [], [{xmlcdata, "ram_copies"}]}]},
{xmlelement, "option", [{"label",
?T(Lang,
"RAM and disc copy")}],
[{xmlelement, "value", [], [{xmlcdata, "disc_copies"}]}]},
{xmlelement, "option", [{"label",
?T(Lang,
"Disc only copy")}],
[{xmlelement, "value", [], [{xmlcdata, "disc_only_copies"}]}]},
{xmlelement, "option", [{"label",
?T(Lang, "Remote copy")}],
[{xmlelement, "value", [], [{xmlcdata, "unknown"}]}]}
]}).
get_form(_Host, ["running nodes", ENode, "DB"], Lang) ->
case search_running_node(ENode) of
false ->
{error, ?ERR_ITEM_NOT_FOUND};
Node ->
case rpc:call(Node, mnesia, system_info, [tables]) of
{badrpc, _Reason} ->
{error, ?ERR_INTERNAL_SERVER_ERROR};
Tables ->
STables = lists:sort(Tables),
{result, [{xmlelement, "x", [{"xmlns", ?NS_XDATA}],
[?HFIELD(),
{xmlelement, "title", [],
[{xmlcdata,
?T(
Lang, "Database Tables Configuration at ") ++
ENode}]},
{xmlelement, "instructions", [],
[{xmlcdata,
?T(
Lang, "Choose storage type of tables")}]} |
lists:map(
fun(Table) ->
case rpc:call(Node,
mnesia,
table_info,
[Table, storage_type]) of
{badrpc, _} ->
?TABLEFIELD(Table, unknown);
Type ->
?TABLEFIELD(Table, Type)
end
end, STables)
]}]}
end
end;
get_form(Host, ["running nodes", ENode, "modules", "stop"], Lang) ->
case search_running_node(ENode) of
false ->
{error, ?ERR_ITEM_NOT_FOUND};
Node ->
case rpc:call(Node, gen_mod, loaded_modules, [Host]) of
{badrpc, _Reason} ->
{error, ?ERR_INTERNAL_SERVER_ERROR};
Modules ->
SModules = lists:sort(Modules),
{result, [{xmlelement, "x", [{"xmlns", ?NS_XDATA}],
[?HFIELD(),
{xmlelement, "title", [],
[{xmlcdata,
?T(
Lang, "Stop Modules at ") ++ ENode}]},
{xmlelement, "instructions", [],
[{xmlcdata,
?T(
Lang, "Choose modules to stop")}]} |
lists:map(fun(M) ->
S = atom_to_list(M),
?XFIELD("boolean", S, S, "0")
end, SModules)
]}]}
end
end;
get_form(_Host, ["running nodes", ENode, "modules", "start"], Lang) ->
{result, [{xmlelement, "x", [{"xmlns", ?NS_XDATA}],
[?HFIELD(),
{xmlelement, "title", [],
[{xmlcdata,
?T(
Lang, "Start Modules at ") ++ ENode}]},
{xmlelement, "instructions", [],
[{xmlcdata,
?T(
Lang, "Enter list of {Module, [Options]}")}]},
?XFIELD("text-multi", "List of modules to start", "modules", "[].")
]}]};
get_form(_Host, ["running nodes", ENode, "backup", "backup"], Lang) ->
{result, [{xmlelement, "x", [{"xmlns", ?NS_XDATA}],
[?HFIELD(),
{xmlelement, "title", [],
[{xmlcdata,
?T(
Lang, "Backup to File at ") ++ ENode}]},
{xmlelement, "instructions", [],
[{xmlcdata,
?T(
Lang, "Enter path to backup file")}]},
?XFIELD("text-single", "Path to File", "path", "")
]}]};
get_form(_Host, ["running nodes", ENode, "backup", "restore"], Lang) ->
{result, [{xmlelement, "x", [{"xmlns", ?NS_XDATA}],
[?HFIELD(),
{xmlelement, "title", [],
[{xmlcdata,
?T(
Lang, "Restore Backup from File at ") ++ ENode}]},
{xmlelement, "instructions", [],
[{xmlcdata,
?T(
Lang, "Enter path to backup file")}]},
?XFIELD("text-single", "Path to File", "path", "")
]}]};
get_form(_Host, ["running nodes", ENode, "backup", "textfile"], Lang) ->
{result, [{xmlelement, "x", [{"xmlns", ?NS_XDATA}],
[?HFIELD(),
{xmlelement, "title", [],
[{xmlcdata,
?T(
Lang, "Dump Backup to Text File at ") ++ ENode}]},
{xmlelement, "instructions", [],
[{xmlcdata,
?T(
Lang, "Enter path to text file")}]},
?XFIELD("text-single", "Path to File", "path", "")
]}]};
get_form(_Host, ["running nodes", ENode, "import", "file"], Lang) ->
{result, [{xmlelement, "x", [{"xmlns", ?NS_XDATA}],
[?HFIELD(),
{xmlelement, "title", [],
[{xmlcdata,
?T(
Lang, "Import User from File at ") ++ ENode}]},
{xmlelement, "instructions", [],
[{xmlcdata,
?T(
Lang, "Enter path to jabberd14 spool file")}]},
?XFIELD("text-single", "Path to File", "path", "")
]}]};
get_form(_Host, ["running nodes", ENode, "import", "dir"], Lang) ->
{result, [{xmlelement, "x", [{"xmlns", ?NS_XDATA}],
[?HFIELD(),
{xmlelement, "title", [],
[{xmlcdata,
?T(
Lang, "Import Users from Dir at ") ++ ENode}]},
{xmlelement, "instructions", [],
[{xmlcdata,
?T(
Lang, "Enter path to jabberd14 spool dir")}]},
?XFIELD("text-single", "Path to Dir", "path", "")
]}]};
get_form(_Host, ["running nodes", _ENode, "restart"], Lang) ->
Make_option =
fun(LabelNum, LabelUnit, Value)->
{xmlelement, "option",
[{"label", LabelNum ++ ?T(Lang, LabelUnit)}],
[{xmlelement, "value", [], [{xmlcdata, Value}]}]}
end,
{result, [{xmlelement, "x", [{"xmlns", ?NS_XDATA}],
[?HFIELD(),
{xmlelement, "title", [],
[{xmlcdata, ?T(Lang, "Restart Service")}]},
{xmlelement, "field",
[{"type", "list-single"},
{"label", ?T(Lang, "Time delay")},
{"var", "delay"}],
[Make_option("", "immediately", "1"),
Make_option("15 ", "seconds", "15"),
Make_option("30 ", "seconds", "30"),
Make_option("60 ", "seconds", "60"),
Make_option("90 ", "seconds", "90"),
Make_option("2 ", "minutes", "120"),
Make_option("3 ", "minutes", "180"),
Make_option("4 ", "minutes", "240"),
Make_option("5 ", "minutes", "300"),
Make_option("10 ", "minutes", "600"),
Make_option("15 ", "minutes", "900"),
Make_option("30 ", "minutes", "1800"),
{xmlelement, "required", [], []}
]},
{xmlelement, "field",
[{"type", "fixed"},
{"label", ?T(Lang, "Send announcement to all online users on all hosts")}],
[]},
{xmlelement, "field",
[{"var", "subject"},
{"type", "text-single"},
{"label", ?T(Lang, "Subject")}],
[]},
{xmlelement, "field",
[{"var", "announcement"},
{"type", "text-multi"},
{"label", ?T(Lang, "Message body")}],
[]}
]}]};
get_form(_Host, ["running nodes", _ENode, "shutdown"], Lang) ->
Make_option =
fun(LabelNum, LabelUnit, Value)->
{xmlelement, "option",
[{"label", LabelNum ++ ?T(Lang, LabelUnit)}],
[{xmlelement, "value", [], [{xmlcdata, Value}]}]}
end,
{result, [{xmlelement, "x", [{"xmlns", ?NS_XDATA}],
[?HFIELD(),
{xmlelement, "title", [],
[{xmlcdata, ?T(Lang, "Shut Down Service")}]},
{xmlelement, "field",
[{"type", "list-single"},
{"label", ?T(Lang, "Time delay")},
{"var", "delay"}],
[Make_option("", "immediately", "1"),
Make_option("15 ", "seconds", "15"),
Make_option("30 ", "seconds", "30"),
Make_option("60 ", "seconds", "60"),
Make_option("90 ", "seconds", "90"),
Make_option("2 ", "minutes", "120"),
Make_option("3 ", "minutes", "180"),
Make_option("4 ", "minutes", "240"),
Make_option("5 ", "minutes", "300"),
Make_option("10 ", "minutes", "600"),
Make_option("15 ", "minutes", "900"),
Make_option("30 ", "minutes", "1800"),
{xmlelement, "required", [], []}
]},
{xmlelement, "field",
[{"type", "fixed"},
{"label", ?T(Lang, "Send announcement to all online users on all hosts")}],
[]},
{xmlelement, "field",
[{"var", "subject"},
{"type", "text-single"},
{"label", ?T(Lang, "Subject")}],
[]},
{xmlelement, "field",
[{"var", "announcement"},
{"type", "text-multi"},
{"label", ?T(Lang, "Message body")}],
[]}
]}]};
get_form(Host, ["config", "acls"], Lang) ->
{result, [{xmlelement, "x", [{"xmlns", ?NS_XDATA}],
[?HFIELD(),
{xmlelement, "title", [],
[{xmlcdata,
?T(
Lang, "Access Control List Configuration")}]},
{xmlelement, "field", [{"type", "text-multi"},
{"label",
?T(
Lang, "Access control lists")},
{"var", "acls"}],
lists:map(fun(S) ->
{xmlelement, "value", [], [{xmlcdata, S}]}
end,
string:tokens(
lists:flatten(
io_lib:format(
"~p.",
[ets:select(acl,
[{{acl, {'$1', '$2'}, '$3'},
[{'==', '$2', Host}],
[{{acl, '$1', '$3'}}]}])
])),
"\n"))
}
]}]};
get_form(Host, ["config", "access"], Lang) ->
{result, [{xmlelement, "x", [{"xmlns", ?NS_XDATA}],
[?HFIELD(),
{xmlelement, "title", [],
[{xmlcdata,
?T(
Lang, "Access Configuration")}]},
{xmlelement, "field", [{"type", "text-multi"},
{"label",
?T(
Lang, "Access rules")},
{"var", "access"}],
lists:map(fun(S) ->
{xmlelement, "value", [], [{xmlcdata, S}]}
end,
string:tokens(
lists:flatten(
io_lib:format(
"~p.",
[ets:select(config,
[{{config, {access, '$1', '$2'}, '$3'},
[{'==', '$2', Host}],
[{{access, '$1', '$3'}}]}])
])),
"\n"))
}
]}]};
get_form(_Host, ?NS_ADMINL("add-user"), Lang) ->
{result, [{xmlelement, "x", [{"xmlns", ?NS_XDATA}],
[?HFIELD(),
{xmlelement, "title", [],
[{xmlcdata, ?T(Lang, "Add User")}]},
{xmlelement, "field",
[{"type", "jid-single"},
{"label", ?T(Lang, "Jabber ID")},
{"var", "accountjid"}],
[{xmlelement, "required", [], []}]},
{xmlelement, "field",
[{"type", "text-private"},
{"label", ?T(Lang, "Password")},
{"var", "password"}],
[{xmlelement, "required", [], []}]},
{xmlelement, "field",
[{"type", "text-private"},
{"label", ?T(Lang, "Password Verification")},
{"var", "password-verify"}],
[{xmlelement, "required", [], []}]}
]}]};
get_form(_Host, ?NS_ADMINL("delete-user"), Lang) ->
{result, [{xmlelement, "x", [{"xmlns", ?NS_XDATA}],
[?HFIELD(),
{xmlelement, "title", [],
[{xmlcdata, ?T(Lang, "Delete User")}]},
{xmlelement, "field",
[{"type", "jid-multi"},
{"label", ?T(Lang, "Jabber ID")},
{"var", "accountjids"}],
[{xmlelement, "required", [], []}]}
]}]};
get_form(_Host, ?NS_ADMINL("end-user-session"), Lang) ->
{result, [{xmlelement, "x", [{"xmlns", ?NS_XDATA}],
[?HFIELD(),
{xmlelement, "title", [],
[{xmlcdata, ?T(Lang, "End User Session")}]},
{xmlelement, "field",
[{"type", "jid-single"},
{"label", ?T(Lang, "Jabber ID")},
{"var", "accountjid"}],
[{xmlelement, "required", [], []}]}
]}]};
get_form(_Host, ?NS_ADMINL("get-user-password"), Lang) ->
{result, [{xmlelement, "x", [{"xmlns", ?NS_XDATA}],
[?HFIELD(),
{xmlelement, "title", [],
[{xmlcdata, ?T(Lang, "Get User Password")}]},
{xmlelement, "field",
[{"type", "jid-single"},
{"label", ?T(Lang, "Jabber ID")},
{"var", "accountjid"}],
[{xmlelement, "required", [], []}]}
]}]};
get_form(_Host, ?NS_ADMINL("change-user-password"), Lang) ->
{result, [{xmlelement, "x", [{"xmlns", ?NS_XDATA}],
[?HFIELD(),
{xmlelement, "title", [],
[{xmlcdata, ?T(Lang, "Get User Password")}]},
{xmlelement, "field",
[{"type", "jid-single"},
{"label", ?T(Lang, "Jabber ID")},
{"var", "accountjid"}],
[{xmlelement, "required", [], []}]},
{xmlelement, "field",
[{"type", "text-private"},
{"label", ?T(Lang, "Password")},
{"var", "password"}],
[{xmlelement, "required", [], []}]}
]}]};
get_form(_Host, ?NS_ADMINL("get-user-lastlogin"), Lang) ->
{result, [{xmlelement, "x", [{"xmlns", ?NS_XDATA}],
[?HFIELD(),
{xmlelement, "title", [],
[{xmlcdata, ?T(Lang, "Get User Last Login Time")}]},
{xmlelement, "field",
[{"type", "jid-single"},
{"label", ?T(Lang, "Jabber ID")},
{"var", "accountjid"}],
[{xmlelement, "required", [], []}]}
]}]};
get_form(_Host, ?NS_ADMINL("user-stats"), Lang) ->
{result, [{xmlelement, "x", [{"xmlns", ?NS_XDATA}],
[?HFIELD(),
{xmlelement, "title", [],
[{xmlcdata, ?T(Lang, "Get User Statistics")}]},
{xmlelement, "field",
[{"type", "jid-single"},
{"label", ?T(Lang, "Jabber ID")},
{"var", "accountjid"}],
[{xmlelement, "required", [], []}]}
]}]};
get_form(Host, ?NS_ADMINL("get-registered-users-num"), Lang) ->
[Num] = io_lib:format("~p", [ejabberd_auth:get_vh_registered_users_number(Host)]),
{result, completed,
[{xmlelement, "x",
[{"xmlns", ?NS_XDATA}],
[?HFIELD(),
{xmlelement,
"field",
[{"type", "text-single"},
{"label", ?T(Lang, "Number of registered users")},
{"var", "registeredusersnum"}],
[{xmlelement, "value", [], [{xmlcdata, Num}]}]
}]}]};
get_form(Host, ?NS_ADMINL("get-online-users-num"), Lang) ->
Num = io_lib:format("~p", [length(ejabberd_sm:get_vh_session_list(Host))]),
{result, completed,
[{xmlelement, "x",
[{"xmlns", ?NS_XDATA}],
[?HFIELD(),
{xmlelement,
"field",
[{"type", "text-single"},
{"label", ?T(Lang, "Number of online users")},
{"var", "onlineusersnum"}],
[{xmlelement, "value", [], [{xmlcdata, Num}]}]
}]}]};
get_form(_Host, _, _Lang) ->
{error, ?ERR_SERVICE_UNAVAILABLE}.
set_form(_From, _Host, ["running nodes", ENode, "DB"], _Lang, XData) ->
case search_running_node(ENode) of
false ->
{error, ?ERR_ITEM_NOT_FOUND};
Node ->
lists:foreach(
fun({SVar, SVals}) ->
%% We believe that this is allowed only for good people
Table = list_to_atom(SVar),
Type = case SVals of
["unknown"] -> unknown;
["ram_copies"] -> ram_copies;
["disc_copies"] -> disc_copies;
["disc_only_copies"] -> disc_only_copies;
_ -> false
end,
if
Type == false ->
ok;
Type == unknown ->
mnesia:del_table_copy(Table, Node);
true ->
case mnesia:add_table_copy(Table, Node, Type) of
{aborted, _} ->
mnesia:change_table_copy_type(
Table, Node, Type);
_ ->
ok
end
end
end, XData),
{result, []}
end;
set_form(_From, Host, ["running nodes", ENode, "modules", "stop"], _Lang, XData) ->
case search_running_node(ENode) of
false ->
{error, ?ERR_ITEM_NOT_FOUND};
Node ->
lists:foreach(
fun({Var, Vals}) ->
case Vals of
["1"] ->
Module = list_to_atom(Var),
rpc:call(Node, gen_mod, stop_module, [Host, Module]);
_ ->
ok
end
end, XData),
{result, []}
end;
set_form(_From, Host, ["running nodes", ENode, "modules", "start"], _Lang, XData) ->
case search_running_node(ENode) of
false ->
{error, ?ERR_ITEM_NOT_FOUND};
Node ->
case lists:keysearch("modules", 1, XData) of
false ->
{error, ?ERR_BAD_REQUEST};
{value, {_, Strings}} ->
String = lists:foldl(fun(S, Res) ->
Res ++ S ++ "\n"
end, "", Strings),
case erl_scan:string(String) of
{ok, Tokens, _} ->
case erl_parse:parse_term(Tokens) of
{ok, Modules} ->
lists:foreach(
fun({Module, Args}) ->
rpc:call(Node,
gen_mod,
start_module,
[Host, Module, Args])
end, Modules),
{result, []};
_ ->
{error, ?ERR_BAD_REQUEST}
end;
_ ->
{error, ?ERR_BAD_REQUEST}
end
end
end;
set_form(_From, _Host, ["running nodes", ENode, "backup", "backup"], _Lang, XData) ->
case search_running_node(ENode) of
false ->
{error, ?ERR_ITEM_NOT_FOUND};
Node ->
case lists:keysearch("path", 1, XData) of
false ->
{error, ?ERR_BAD_REQUEST};
{value, {_, [String]}} ->
case rpc:call(Node, mnesia, backup, [String]) of
{badrpc, _Reason} ->
{error, ?ERR_INTERNAL_SERVER_ERROR};
{error, _Reason} ->
{error, ?ERR_INTERNAL_SERVER_ERROR};
_ ->
{result, []}
end;
_ ->
{error, ?ERR_BAD_REQUEST}
end
end;
set_form(_From, _Host, ["running nodes", ENode, "backup", "restore"], _Lang, XData) ->
case search_running_node(ENode) of
false ->
{error, ?ERR_ITEM_NOT_FOUND};
Node ->
case lists:keysearch("path", 1, XData) of
false ->
{error, ?ERR_BAD_REQUEST};
{value, {_, [String]}} ->
case rpc:call(Node, ejabberd_admin, restore, [String]) of
{badrpc, _Reason} ->
{error, ?ERR_INTERNAL_SERVER_ERROR};
{error, _Reason} ->
{error, ?ERR_INTERNAL_SERVER_ERROR};
_ ->
{result, []}
end;
_ ->
{error, ?ERR_BAD_REQUEST}
end
end;
set_form(_From, _Host, ["running nodes", ENode, "backup", "textfile"], _Lang, XData) ->
case search_running_node(ENode) of
false ->
{error, ?ERR_ITEM_NOT_FOUND};
Node ->
case lists:keysearch("path", 1, XData) of
false ->
{error, ?ERR_BAD_REQUEST};
{value, {_, [String]}} ->
case rpc:call(Node, ejabberd_admin, dump_to_textfile, [String]) of
{badrpc, _Reason} ->
{error, ?ERR_INTERNAL_SERVER_ERROR};
{error, _Reason} ->
{error, ?ERR_INTERNAL_SERVER_ERROR};
_ ->
{result, []}
end;
_ ->
{error, ?ERR_BAD_REQUEST}
end
end;
set_form(_From, _Host, ["running nodes", ENode, "import", "file"], _Lang, XData) ->
case search_running_node(ENode) of
false ->
{error, ?ERR_ITEM_NOT_FOUND};
Node ->
case lists:keysearch("path", 1, XData) of
false ->
{error, ?ERR_BAD_REQUEST};
{value, {_, [String]}} ->
rpc:call(Node, jd2ejd, import_file, [String]),
{result, []};
_ ->
{error, ?ERR_BAD_REQUEST}
end
end;
set_form(_From, _Host, ["running nodes", ENode, "import", "dir"], _Lang, XData) ->
case search_running_node(ENode) of
false ->
{error, ?ERR_ITEM_NOT_FOUND};
Node ->
case lists:keysearch("path", 1, XData) of
false ->
{error, ?ERR_BAD_REQUEST};
{value, {_, [String]}} ->
rpc:call(Node, jd2ejd, import_dir, [String]),
{result, []};
_ ->
{error, ?ERR_BAD_REQUEST}
end
end;
set_form(From, Host, ["running nodes", ENode, "restart"], _Lang, XData) ->
stop_node(From, Host, ENode, restart, XData);
set_form(From, Host, ["running nodes", ENode, "shutdown"], _Lang, XData) ->
stop_node(From, Host, ENode, stop, XData);
set_form(_From, Host, ["config", "acls"], _Lang, XData) ->
case lists:keysearch("acls", 1, XData) of
{value, {_, Strings}} ->
String = lists:foldl(fun(S, Res) ->
Res ++ S ++ "\n"
end, "", Strings),
case erl_scan:string(String) of
{ok, Tokens, _} ->
case erl_parse:parse_term(Tokens) of
{ok, ACLs} ->
case acl:add_list(Host, ACLs, true) of
ok ->
{result, []};
_ ->
{error, ?ERR_BAD_REQUEST}
end;
_ ->
{error, ?ERR_BAD_REQUEST}
end;
_ ->
{error, ?ERR_BAD_REQUEST}
end;
_ ->
{error, ?ERR_BAD_REQUEST}
end;
set_form(_From, Host, ["config", "access"], _Lang, XData) ->
SetAccess =
fun(Rs) ->
mnesia:transaction(
fun() ->
Os = mnesia:select(config,
[{{config, {access, '$1', '$2'}, '$3'},
[{'==', '$2', Host}],
['$_']}]),
lists:foreach(fun(O) ->
mnesia:delete_object(O)
end, Os),
lists:foreach(
fun({access, Name, Rules}) ->
mnesia:write({config,
{access, Name, Host},
Rules})
end, Rs)
end)
end,
case lists:keysearch("access", 1, XData) of
{value, {_, Strings}} ->
String = lists:foldl(fun(S, Res) ->
Res ++ S ++ "\n"
end, "", Strings),
case erl_scan:string(String) of
{ok, Tokens, _} ->
case erl_parse:parse_term(Tokens) of
{ok, Rs} ->
case SetAccess(Rs) of
{atomic, _} ->
{result, []};
_ ->
{error, ?ERR_BAD_REQUEST}
end;
_ ->
{error, ?ERR_BAD_REQUEST}
end;
_ ->
{error, ?ERR_BAD_REQUEST}
end;
_ ->
{error, ?ERR_BAD_REQUEST}
end;
set_form(From, Host, ?NS_ADMINL("add-user"), _Lang, XData) ->
AccountString = get_value("accountjid", XData),
Password = get_value("password", XData),
Password = get_value("password-verify", XData),
AccountJID = jlib:string_to_jid(AccountString),
User = AccountJID#jid.luser,
Server = AccountJID#jid.lserver,
true = lists:member(Server, ?MYHOSTS),
true = (Server == Host) orelse (get_permission_level(From) == global),
ejabberd_auth:try_register(User, Server, Password),
{result, []};
set_form(From, Host, ?NS_ADMINL("delete-user"), _Lang, XData) ->
AccountStringList = get_values("accountjids", XData),
[_|_] = AccountStringList,
ASL2 = lists:map(
fun(AccountString) ->
JID = jlib:string_to_jid(AccountString),
[_|_] = JID#jid.luser,
User = JID#jid.luser,
Server = JID#jid.lserver,
true = (Server == Host) orelse (get_permission_level(From) == global),
true = ejabberd_auth:is_user_exists(User, Server),
{User, Server}
end,
AccountStringList),
[ejabberd_auth:remove_user(User, Server) || {User, Server} <- ASL2],
{result, []};
set_form(From, Host, ?NS_ADMINL("end-user-session"), _Lang, XData) ->
AccountString = get_value("accountjid", XData),
JID = jlib:string_to_jid(AccountString),
[_|_] = JID#jid.luser,
LUser = JID#jid.luser,
LServer = JID#jid.lserver,
true = (LServer == Host) orelse (get_permission_level(From) == global),
%% Code copied from ejabberd_sm.erl
case JID#jid.lresource of
[] ->
SIDs = mnesia:dirty_select(session,
[{#session{sid = '$1', usr = {LUser, LServer, '_'}, _ = '_'}, [], ['$1']}]),
[Pid ! replaced || {_, Pid} <- SIDs];
R ->
[{_, Pid}] = mnesia:dirty_select(session,
[{#session{sid = '$1', usr = {LUser, LServer, R}, _ = '_'}, [], ['$1']}]),
Pid ! replaced
end,
{result, []};
set_form(From, Host, ?NS_ADMINL("get-user-password"), Lang, XData) ->
AccountString = get_value("accountjid", XData),
JID = jlib:string_to_jid(AccountString),
[_|_] = JID#jid.luser,
User = JID#jid.luser,
Server = JID#jid.lserver,
true = (Server == Host) orelse (get_permission_level(From) == global),
Password = ejabberd_auth:get_password(User, Server),
true = is_list(Password),
{result, [{xmlelement, "x", [{"xmlns", ?NS_XDATA}],
[?HFIELD(),
?XFIELD("jid-single", "Jabber ID", "accountjid", AccountString),
?XFIELD("text-single", "Password", "password", Password)
]}]};
set_form(From, Host, ?NS_ADMINL("change-user-password"), _Lang, XData) ->
AccountString = get_value("accountjid", XData),
Password = get_value("password", XData),
JID = jlib:string_to_jid(AccountString),
[_|_] = JID#jid.luser,
User = JID#jid.luser,
Server = JID#jid.lserver,
true = (Server == Host) orelse (get_permission_level(From) == global),
true = ejabberd_auth:is_user_exists(User, Server),
ejabberd_auth:set_password(User, Server, Password),
{result, []};
set_form(From, Host, ?NS_ADMINL("get-user-lastlogin"), Lang, XData) ->
AccountString = get_value("accountjid", XData),
JID = jlib:string_to_jid(AccountString),
[_|_] = JID#jid.luser,
User = JID#jid.luser,
Server = JID#jid.lserver,
true = (Server == Host) orelse (get_permission_level(From) == global),
%% Code copied from web/ejabberd_web_admin.erl
%% TODO: Update time format to XEP-0202: Entity Time
FLast =
case ejabberd_sm:get_user_resources(User, Server) of
[] ->
_US = {User, Server},
case get_last_info(User, Server) of
not_found ->
?T(Lang, "Never");
{ok, Timestamp, _Status} ->
Shift = Timestamp,
TimeStamp = {Shift div 1000000,
Shift rem 1000000,
0},
{{Year, Month, Day}, {Hour, Minute, Second}} =
calendar:now_to_local_time(TimeStamp),
lists:flatten(
io_lib:format(
"~w-~.2.0w-~.2.0w ~.2.0w:~.2.0w:~.2.0w",
[Year, Month, Day, Hour, Minute, Second]))
end;
_ ->
?T(Lang, "Online")
end,
{result, [{xmlelement, "x", [{"xmlns", ?NS_XDATA}, {"type", "result"}],
[?HFIELD(),
?XFIELD("jid-single", "Jabber ID", "accountjid", AccountString),
?XFIELD("text-single", "Last login", "lastlogin", FLast)
]}]};
set_form(From, Host, ?NS_ADMINL("user-stats"), Lang, XData) ->
AccountString = get_value("accountjid", XData),
JID = jlib:string_to_jid(AccountString),
[_|_] = JID#jid.luser,
User = JID#jid.luser,
Server = JID#jid.lserver,
true = (Server == Host) orelse (get_permission_level(From) == global),
Resources = ejabberd_sm:get_user_resources(User, Server),
IPs1 = [ejabberd_sm:get_user_ip(User, Server, Resource) || Resource <- Resources],
IPs = [inet_parse:ntoa(IP)++":"++integer_to_list(Port) || {IP, Port} <- IPs1],
Items = ejabberd_hooks:run_fold(roster_get, Server, [], [{User, Server}]),
Rostersize = integer_to_list(erlang:length(Items)),
{result, [{xmlelement, "x", [{"xmlns", ?NS_XDATA}],
[?HFIELD(),
?XFIELD("jid-single", "Jabber ID", "accountjid", AccountString),
?XFIELD("text-single", "Roster size", "rostersize", Rostersize),
?XMFIELD("text-multi", "IP addresses", "ipaddresses", IPs),
?XMFIELD("text-multi", "Resources", "onlineresources", Resources)
]}]};
set_form(_From, _Host, _, _Lang, _XData) ->
{error, ?ERR_SERVICE_UNAVAILABLE}.
get_value(Field, XData) ->
hd(get_values(Field, XData)).
get_values(Field, XData) ->
{value, {_, ValueList}} = lists:keysearch(Field, 1, XData),
ValueList.
search_running_node(SNode) ->
search_running_node(SNode, mnesia:system_info(running_db_nodes)).
search_running_node(_, []) ->
false;
search_running_node(SNode, [Node | Nodes]) ->
case atom_to_list(Node) of
SNode ->
Node;
_ ->
search_running_node(SNode, Nodes)
end.
stop_node(From, Host, ENode, Action, XData) ->
Delay = list_to_integer(get_value("delay", XData)),
Subject = case get_value("subject", XData) of
[] -> [];
S -> [{xmlelement, "field", [{"var","subject"}],
[{xmlelement,"value",[],[{xmlcdata,S}]}]}]
end,
Announcement = case get_values("announcement", XData) of
[] -> [];
As -> [{xmlelement, "field", [{"var","body"}],
[{xmlelement,"value",[],[{xmlcdata,Line}]} || Line <- As] }]
end,
case Subject ++ Announcement of
[] -> ok;
SubEls ->
Request = #adhoc_request{
node = ?NS_ADMINX("announce-allhosts"),
action = "complete",
xdata = {xmlelement, "x",
[{"xmlns","jabber:x:data"},{"type","submit"}],
SubEls},
others= [{xmlelement, "x",
[{"xmlns","jabber:x:data"},{"type","submit"}],
SubEls}]
},
To = jlib:make_jid("", Host, ""),
mod_announce:announce_commands(empty, From, To, Request)
end,
Time = timer:seconds(Delay),
Node = list_to_atom(ENode),
{ok, _} = timer:apply_after(Time, rpc, call, [Node, init, Action, []]),
{result, []}.
get_last_info(User, Server) ->
ML = lists:member(mod_last, gen_mod:loaded_modules(Server)),
MLO = lists:member(mod_last_odbc, gen_mod:loaded_modules(Server)),
case {ML, MLO} of
{true, _} -> mod_last:get_last_info(User, Server);
{false, true} -> mod_last_odbc:get_last_info(User, Server);
{false, false} -> not_found
end.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
adhoc_sm_commands(_Acc, From,
#jid{user = User, server = Server, lserver = LServer} = _To,
#adhoc_request{lang = Lang,
node = "config",
action = Action,
xdata = XData} = Request) ->
case acl:match_rule(LServer, configure, From) of
deny ->
{error, ?ERR_FORBIDDEN};
allow ->
%% If the "action" attribute is not present, it is
%% understood as "execute". If there was no
%% element in the first response (which there isn't in our
%% case), "execute" and "complete" are equivalent.
ActionIsExecute = lists:member(Action,
["", "execute", "complete"]),
if Action == "cancel" ->
%% User cancels request
adhoc:produce_response(
Request,
#adhoc_response{status = canceled});
XData == false, ActionIsExecute ->
%% User requests form
case get_sm_form(User, Server, "config", Lang) of
{result, Form} ->
adhoc:produce_response(
Request,
#adhoc_response{status = executing,
elements = Form});
{error, Error} ->
{error, Error}
end;
XData /= false, ActionIsExecute ->
%% User returns form.
case jlib:parse_xdata_submit(XData) of
invalid ->
{error, ?ERR_BAD_REQUEST};
Fields ->
set_sm_form(User, Server, "config", Request, Fields)
end;
true ->
{error, ?ERR_BAD_REQUEST}
end
end;
adhoc_sm_commands(Acc, _From, _To, _Request) ->
Acc.
get_sm_form(User, Server, "config", Lang) ->
{result, [{xmlelement, "x", [{"xmlns", ?NS_XDATA}],
[?HFIELD(),
{xmlelement, "title", [],
[{xmlcdata,
?T(
Lang, "Administration of ") ++ User}]},
{xmlelement, "field",
[{"type", "list-single"},
{"label", ?T(Lang, "Action on user")},
{"var", "action"}],
[{xmlelement, "value", [], [{xmlcdata, "edit"}]},
{xmlelement, "option",
[{"label", ?T(Lang, "Edit Properties")}],
[{xmlelement, "value", [], [{xmlcdata, "edit"}]}]},
{xmlelement, "option",
[{"label", ?T(Lang, "Remove User")}],
[{xmlelement, "value", [], [{xmlcdata, "remove"}]}]}
]},
?XFIELD("text-private", "Password", "password",
ejabberd_auth:get_password_s(User, Server))
]}]};
get_sm_form(_User, _Server, _Node, _Lang) ->
{error, ?ERR_SERVICE_UNAVAILABLE}.
set_sm_form(User, Server, "config",
#adhoc_request{lang = Lang,
node = Node,
sessionid = SessionID}, XData) ->
Response = #adhoc_response{lang = Lang,
node = Node,
sessionid = SessionID,
status = completed},
case lists:keysearch("action", 1, XData) of
{value, {_, ["edit"]}} ->
case lists:keysearch("password", 1, XData) of
{value, {_, [Password]}} ->
ejabberd_auth:set_password(User, Server, Password),
adhoc:produce_response(Response);
_ ->
{error, ?ERR_NOT_ACCEPTABLE}
end;
{value, {_, ["remove"]}} ->
catch ejabberd_auth:remove_user(User, Server),
adhoc:produce_response(Response);
_ ->
{error, ?ERR_NOT_ACCEPTABLE}
end;
set_sm_form(_User, _Server, _Node, _Request, _Fields) ->
{error, ?ERR_SERVICE_UNAVAILABLE}.
ejabberd-2.1.11/src/mod_roster_odbc.erl 0000664 0000000 0000000 00000114367 12240230175 014671 0 ustar %%%----------------------------------------------------------------------
%%% File : mod_roster_odbc.erl
%%% Author : Alexey Shchepin
%%% Purpose : Roster management
%%% Created : 15 Dec 2004 by Alexey Shchepin
%%%
%%%
%%% ejabberd, Copyright (C) 2002-2012 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
%%% published by the Free Software Foundation; either version 2 of the
%%% License, or (at your option) any later version.
%%%
%%% This program is distributed in the hope that it will be useful,
%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
%%% General Public License for more details.
%%%
%%% You should have received a copy of the GNU General Public License
%%% along with this program; if not, write to the Free Software
%%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
%%% 02111-1307 USA
%%%
%%%----------------------------------------------------------------------
%%% @doc Roster management (Mnesia storage).
%%%
%%% Includes support for XEP-0237: Roster Versioning.
%%% The roster versioning follows an all-or-nothing strategy:
%%% - If the version supplied by the client is the latest, return an empty response.
%%% - If not, return the entire new roster (with updated version string).
%%% Roster version is a hash digest of the entire roster.
%%% No additional data is stored in DB.
-module(mod_roster_odbc).
-author('alexey@process-one.net').
-behaviour(gen_mod).
-export([start/2, stop/1,
process_iq/3,
process_local_iq/3,
get_user_roster/2,
get_subscription_lists/3,
get_in_pending_subscriptions/3,
in_subscription/6,
out_subscription/4,
set_items/3,
remove_user/2,
get_jid_info/4,
webadmin_page/3,
webadmin_user/4,
get_versioning_feature/2,
roster_versioning_enabled/1]).
-include("ejabberd.hrl").
-include("jlib.hrl").
-include("mod_roster.hrl").
-include("web/ejabberd_http.hrl").
-include("web/ejabberd_web_admin.hrl").
start(Host, Opts) ->
IQDisc = gen_mod:get_opt(iqdisc, Opts, one_queue),
ejabberd_hooks:add(roster_get, Host,
?MODULE, get_user_roster, 50),
ejabberd_hooks:add(roster_in_subscription, Host,
?MODULE, in_subscription, 50),
ejabberd_hooks:add(roster_out_subscription, Host,
?MODULE, out_subscription, 50),
ejabberd_hooks:add(roster_get_subscription_lists, Host,
?MODULE, get_subscription_lists, 50),
ejabberd_hooks:add(roster_get_jid_info, Host,
?MODULE, get_jid_info, 50),
ejabberd_hooks:add(remove_user, Host,
?MODULE, remove_user, 50),
ejabberd_hooks:add(anonymous_purge_hook, Host,
?MODULE, remove_user, 50),
ejabberd_hooks:add(resend_subscription_requests_hook, Host,
?MODULE, get_in_pending_subscriptions, 50),
ejabberd_hooks:add(roster_get_versioning_feature, Host,
?MODULE, get_versioning_feature, 50),
ejabberd_hooks:add(webadmin_page_host, Host,
?MODULE, webadmin_page, 50),
ejabberd_hooks:add(webadmin_user, Host,
?MODULE, webadmin_user, 50),
gen_iq_handler:add_iq_handler(ejabberd_sm, Host, ?NS_ROSTER,
?MODULE, process_iq, IQDisc).
stop(Host) ->
ejabberd_hooks:delete(roster_get, Host,
?MODULE, get_user_roster, 50),
ejabberd_hooks:delete(roster_in_subscription, Host,
?MODULE, in_subscription, 50),
ejabberd_hooks:delete(roster_out_subscription, Host,
?MODULE, out_subscription, 50),
ejabberd_hooks:delete(roster_get_subscription_lists, Host,
?MODULE, get_subscription_lists, 50),
ejabberd_hooks:delete(roster_get_jid_info, Host,
?MODULE, get_jid_info, 50),
ejabberd_hooks:delete(remove_user, Host,
?MODULE, remove_user, 50),
ejabberd_hooks:delete(anonymous_purge_hook, Host,
?MODULE, remove_user, 50),
ejabberd_hooks:delete(resend_subscription_requests_hook, Host,
?MODULE, get_in_pending_subscriptions, 50),
ejabberd_hooks:delete(roster_get_versioning_feature, Host,
?MODULE, get_versioning_feature, 50),
ejabberd_hooks:delete(webadmin_page_host, Host,
?MODULE, webadmin_page, 50),
ejabberd_hooks:delete(webadmin_user, Host,
?MODULE, webadmin_user, 50),
gen_iq_handler:remove_iq_handler(ejabberd_sm, Host, ?NS_ROSTER).
process_iq(From, To, IQ) ->
#iq{sub_el = SubEl} = IQ,
#jid{lserver = LServer} = From,
case lists:member(LServer, ?MYHOSTS) of
true ->
process_local_iq(From, To, IQ);
_ ->
IQ#iq{type = error, sub_el = [SubEl, ?ERR_ITEM_NOT_FOUND]}
end.
process_local_iq(From, To, #iq{type = Type} = IQ) ->
case Type of
set ->
process_iq_set(From, To, IQ);
get ->
process_iq_get(From, To, IQ)
end.
roster_hash(Items) ->
sha:sha(term_to_binary(
lists:sort(
[R#roster{groups = lists:sort(Grs)} ||
R = #roster{groups = Grs} <- Items]))).
roster_versioning_enabled(Host) ->
gen_mod:get_module_opt(Host, ?MODULE, versioning, false).
roster_version_on_db(Host) ->
gen_mod:get_module_opt(Host, ?MODULE, store_current_id, false).
%% Returns a list that may contain an xmlelement with the XEP-237 feature if it's enabled.
get_versioning_feature(Acc, Host) ->
case roster_versioning_enabled(Host) of
true ->
Feature = {xmlelement,
"ver",
[{"xmlns", ?NS_ROSTER_VER}],
[{xmlelement, "optional", [], []}]},
[Feature | Acc];
false -> []
end.
roster_version(LServer ,LUser) ->
US = {LUser, LServer},
case roster_version_on_db(LServer) of
true ->
case odbc_queries:get_roster_version(ejabberd_odbc:escape(LServer), ejabberd_odbc:escape(LUser)) of
{selected, ["version"], [{Version}]} -> Version;
{selected, ["version"], []} ->
%% If for some reason we don't had it on DB. Create a version Id and store it.
%% (we did the same on process_iq_get, that is called when client get roster,
%% not sure why it can still not be on DB at this point)
RosterVersion = sha:sha(term_to_binary(now())),
{atomic, {updated,1}} = odbc_queries:sql_transaction(LServer, fun() ->
odbc_queries:set_roster_version(ejabberd_odbc:escape(LUser), RosterVersion)
end),
RosterVersion
end;
false ->
roster_hash(ejabberd_hooks:run_fold(roster_get, LServer, [], [US]))
end.
%% Load roster from DB only if neccesary.
%% It is neccesary if
%% - roster versioning is disabled in server OR
%% - roster versioning is not used by the client OR
%% - roster versioning is used by server and client, BUT the server isn't storing versions on db OR
%% - the roster version from client don't match current version.
process_iq_get(From, To, #iq{sub_el = SubEl} = IQ) ->
LUser = From#jid.luser,
LServer = From#jid.lserver,
US = {LUser, LServer},
try
{ItemsToSend, VersionToSend} =
case {xml:get_tag_attr("ver", SubEl),
roster_versioning_enabled(LServer),
roster_version_on_db(LServer)} of
{{value, RequestedVersion}, true, true} ->
%% Retrieve version from DB. Only load entire roster
%% when neccesary.
case odbc_queries:get_roster_version(ejabberd_odbc:escape(LServer), ejabberd_odbc:escape(LUser)) of
{selected, ["version"], [{RequestedVersion}]} ->
{false, false};
{selected, ["version"], [{NewVersion}]} ->
{lists:map(fun item_to_xml/1,
ejabberd_hooks:run_fold(roster_get, To#jid.lserver, [], [US])), NewVersion};
{selected, ["version"], []} ->
RosterVersion = sha:sha(term_to_binary(now())),
{atomic, {updated,1}} = odbc_queries:sql_transaction(LServer, fun() ->
odbc_queries:set_roster_version(ejabberd_odbc:escape(LUser), RosterVersion)
end),
{lists:map(fun item_to_xml/1,
ejabberd_hooks:run_fold(roster_get, To#jid.lserver, [], [US])), RosterVersion}
end;
{{value, RequestedVersion}, true, false} ->
RosterItems = ejabberd_hooks:run_fold(roster_get, To#jid.lserver, [] , [US]),
case roster_hash(RosterItems) of
RequestedVersion ->
{false, false};
New ->
{lists:map(fun item_to_xml/1, RosterItems), New}
end;
_ ->
{lists:map(fun item_to_xml/1,
ejabberd_hooks:run_fold(roster_get, To#jid.lserver, [], [US])), false}
end,
IQ#iq{type = result, sub_el = case {ItemsToSend, VersionToSend} of
{false, false} -> [];
{Items, false} -> [{xmlelement, "query", [{"xmlns", ?NS_ROSTER}], Items}];
{Items, Version} -> [{xmlelement, "query", [{"xmlns", ?NS_ROSTER}, {"ver", Version}], Items}]
end}
catch
_:_ ->
IQ#iq{type =error, sub_el = [SubEl, ?ERR_INTERNAL_SERVER_ERROR]}
end.
get_user_roster(Acc, {LUser, LServer}) ->
Items = get_roster(LUser, LServer),
lists:filter(fun(#roster{subscription = none, ask = in}) ->
false;
(_) ->
true
end, Items) ++ Acc.
get_roster(LUser, LServer) ->
Username = ejabberd_odbc:escape(LUser),
case catch odbc_queries:get_roster(LServer, Username) of
{selected, ["username", "jid", "nick", "subscription", "ask",
"askmessage", "server", "subscribe", "type"],
Items} when is_list(Items) ->
JIDGroups = case catch odbc_queries:get_roster_jid_groups(LServer, Username) of
{selected, ["jid","grp"], JGrps}
when is_list(JGrps) ->
JGrps;
_ ->
[]
end,
GroupsDict =
lists:foldl(
fun({J, G}, Acc) ->
dict:append(J, G, Acc)
end, dict:new(), JIDGroups),
RItems = lists:flatmap(
fun(I) ->
case raw_to_record(LServer, I) of
%% Bad JID in database:
error ->
[];
R ->
SJID = jlib:jid_to_string(R#roster.jid),
Groups =
case dict:find(SJID, GroupsDict) of
{ok, Gs} -> Gs;
error -> []
end,
[R#roster{groups = Groups}]
end
end, Items),
RItems;
_ ->
[]
end.
item_to_xml(Item) ->
Attrs1 = [{"jid", jlib:jid_to_string(Item#roster.jid)}],
Attrs2 = case Item#roster.name of
"" ->
Attrs1;
Name ->
[{"name", Name} | Attrs1]
end,
Attrs3 = case Item#roster.subscription of
none ->
[{"subscription", "none"} | Attrs2];
from ->
[{"subscription", "from"} | Attrs2];
to ->
[{"subscription", "to"} | Attrs2];
both ->
[{"subscription", "both"} | Attrs2];
remove ->
[{"subscription", "remove"} | Attrs2]
end,
Attrs = case ask_to_pending(Item#roster.ask) of
out ->
[{"ask", "subscribe"} | Attrs3];
both ->
[{"ask", "subscribe"} | Attrs3];
_ ->
Attrs3
end,
SubEls = lists:map(fun(G) ->
{xmlelement, "group", [], [{xmlcdata, G}]}
end, Item#roster.groups),
{xmlelement, "item", Attrs, SubEls}.
process_iq_set(From, To, #iq{sub_el = SubEl} = IQ) ->
{xmlelement, _Name, _Attrs, Els} = SubEl,
lists:foreach(fun(El) -> process_item_set(From, To, El) end, Els),
IQ#iq{type = result, sub_el = []}.
process_item_set(From, To, {xmlelement, _Name, Attrs, Els}) ->
JID1 = jlib:string_to_jid(xml:get_attr_s("jid", Attrs)),
#jid{user = User, luser = LUser, lserver = LServer} = From,
case JID1 of
error ->
ok;
_ ->
LJID = jlib:jid_tolower(JID1),
Username = ejabberd_odbc:escape(LUser),
SJID = ejabberd_odbc:escape(jlib:jid_to_string(LJID)),
F = fun() ->
{selected,
["username", "jid", "nick", "subscription",
"ask", "askmessage", "server", "subscribe", "type"],
Res} = odbc_queries:get_roster_by_jid(LServer, Username, SJID),
Item = case Res of
[] ->
#roster{usj = {LUser, LServer, LJID},
us = {LUser, LServer},
jid = LJID};
[I] ->
R = raw_to_record(LServer, I),
case R of
%% Bad JID in database:
error ->
#roster{usj = {LUser, LServer, LJID},
us = {LUser, LServer},
jid = LJID};
_ ->
R#roster{
usj = {LUser, LServer, LJID},
us = {LUser, LServer},
jid = LJID,
name = ""}
end
end,
Item1 = process_item_attrs(Item, Attrs),
Item2 = process_item_els(Item1, Els),
case Item2#roster.subscription of
remove ->
odbc_queries:del_roster(LServer, Username, SJID);
_ ->
ItemVals = record_to_string(Item2),
ItemGroups = groups_to_string(Item2),
odbc_queries:update_roster(LServer, Username, SJID, ItemVals, ItemGroups)
end,
%% If the item exist in shared roster, take the
%% subscription information from there:
Item3 = ejabberd_hooks:run_fold(roster_process_item,
LServer, Item2, [LServer]),
case roster_version_on_db(LServer) of
true -> odbc_queries:set_roster_version(ejabberd_odbc:escape(LUser), sha:sha(term_to_binary(now())));
false -> ok
end,
{Item, Item3}
end,
case odbc_queries:sql_transaction(LServer, F) of
{atomic, {OldItem, Item}} ->
push_item(User, LServer, To, Item),
case Item#roster.subscription of
remove ->
send_unsubscribing_presence(From, OldItem),
ok;
_ ->
ok
end;
E ->
?DEBUG("ROSTER: roster item set error: ~p~n", [E]),
ok
end
end;
process_item_set(_From, _To, _) ->
ok.
process_item_attrs(Item, [{Attr, Val} | Attrs]) ->
case Attr of
"jid" ->
case jlib:string_to_jid(Val) of
error ->
process_item_attrs(Item, Attrs);
JID1 ->
JID = {JID1#jid.luser, JID1#jid.lserver, JID1#jid.lresource},
process_item_attrs(Item#roster{jid = JID}, Attrs)
end;
"name" ->
process_item_attrs(Item#roster{name = Val}, Attrs);
"subscription" ->
case Val of
"remove" ->
process_item_attrs(Item#roster{subscription = remove},
Attrs);
_ ->
process_item_attrs(Item, Attrs)
end;
"ask" ->
process_item_attrs(Item, Attrs);
_ ->
process_item_attrs(Item, Attrs)
end;
process_item_attrs(Item, []) ->
Item.
process_item_els(Item, [{xmlelement, Name, _Attrs, SEls} | Els]) ->
case Name of
"group" ->
Groups = [xml:get_cdata(SEls) | Item#roster.groups],
process_item_els(Item#roster{groups = Groups}, Els);
_ ->
process_item_els(Item, Els)
end;
process_item_els(Item, [{xmlcdata, _} | Els]) ->
process_item_els(Item, Els);
process_item_els(Item, []) ->
Item.
push_item(User, Server, From, Item) ->
ejabberd_sm:route(jlib:make_jid("", "", ""),
jlib:make_jid(User, Server, ""),
{xmlelement, "broadcast", [],
[{item,
Item#roster.jid,
Item#roster.subscription}]}),
case roster_versioning_enabled(Server) of
true ->
push_item_version(Server, User, From, Item, roster_version(Server, User));
false ->
lists:foreach(fun(Resource) ->
push_item(User, Server, Resource, From, Item)
end, ejabberd_sm:get_user_resources(User, Server))
end.
% TODO: don't push to those who not load roster
push_item(User, Server, Resource, From, Item) ->
ResIQ = #iq{type = set, xmlns = ?NS_ROSTER,
id = "push" ++ randoms:get_string(),
sub_el = [{xmlelement, "query",
[{"xmlns", ?NS_ROSTER}],
[item_to_xml(Item)]}]},
ejabberd_router:route(
From,
jlib:make_jid(User, Server, Resource),
jlib:iq_to_xml(ResIQ)).
%% @doc Roster push, calculate and include the version attribute.
%% TODO: don't push to those who didn't load roster
push_item_version(Server, User, From, Item, RosterVersion) ->
lists:foreach(fun(Resource) ->
push_item_version(User, Server, Resource, From, Item, RosterVersion)
end, ejabberd_sm:get_user_resources(User, Server)).
push_item_version(User, Server, Resource, From, Item, RosterVersion) ->
IQPush = #iq{type = 'set', xmlns = ?NS_ROSTER,
id = "push" ++ randoms:get_string(),
sub_el = [{xmlelement, "query",
[{"xmlns", ?NS_ROSTER},
{"ver", RosterVersion}],
[item_to_xml(Item)]}]},
ejabberd_router:route(
From,
jlib:make_jid(User, Server, Resource),
jlib:iq_to_xml(IQPush)).
get_subscription_lists(_, User, Server) ->
LUser = jlib:nodeprep(User),
LServer = jlib:nameprep(Server),
Username = ejabberd_odbc:escape(LUser),
case catch odbc_queries:get_roster(LServer, Username) of
{selected, ["username", "jid", "nick", "subscription", "ask",
"askmessage", "server", "subscribe", "type"],
Items} when is_list(Items) ->
fill_subscription_lists(LServer, Items, [], []);
_ ->
{[], []}
end.
fill_subscription_lists(LServer, [RawI | Is], F, T) ->
I = raw_to_record(LServer, RawI),
case I of
%% Bad JID in database:
error ->
fill_subscription_lists(LServer, Is, F, T);
_ ->
J = I#roster.jid,
case I#roster.subscription of
both ->
fill_subscription_lists(LServer, Is, [J | F], [J | T]);
from ->
fill_subscription_lists(LServer, Is, [J | F], T);
to ->
fill_subscription_lists(LServer, Is, F, [J | T]);
_ ->
fill_subscription_lists(LServer, Is, F, T)
end
end;
fill_subscription_lists(_LServer, [], F, T) ->
{F, T}.
ask_to_pending(subscribe) -> out;
ask_to_pending(unsubscribe) -> none;
ask_to_pending(Ask) -> Ask.
in_subscription(_, User, Server, JID, Type, Reason) ->
process_subscription(in, User, Server, JID, Type, Reason).
out_subscription(User, Server, JID, Type) ->
process_subscription(out, User, Server, JID, Type, []).
process_subscription(Direction, User, Server, JID1, Type, Reason) ->
LUser = jlib:nodeprep(User),
LServer = jlib:nameprep(Server),
LJID = jlib:jid_tolower(JID1),
Username = ejabberd_odbc:escape(LUser),
SJID = ejabberd_odbc:escape(jlib:jid_to_string(LJID)),
F = fun() ->
Item =
case odbc_queries:get_roster_by_jid(LServer, Username, SJID) of
{selected,
["username", "jid", "nick", "subscription", "ask",
"askmessage", "server", "subscribe", "type"],
[I]} ->
%% raw_to_record can return error, but
%% jlib_to_string would fail before this point
R = raw_to_record(LServer, I),
Groups =
case odbc_queries:get_roster_groups(LServer, Username, SJID) of
{selected, ["grp"], JGrps} when is_list(JGrps) ->
[JGrp || {JGrp} <- JGrps];
_ ->
[]
end,
R#roster{groups = Groups};
{selected,
["username", "jid", "nick", "subscription", "ask",
"askmessage", "server", "subscribe", "type"],
[]} ->
#roster{usj = {LUser, LServer, LJID},
us = {LUser, LServer},
jid = LJID}
end,
NewState = case Direction of
out ->
out_state_change(Item#roster.subscription,
Item#roster.ask,
Type);
in ->
in_state_change(Item#roster.subscription,
Item#roster.ask,
Type)
end,
AutoReply = case Direction of
out ->
none;
in ->
in_auto_reply(Item#roster.subscription,
Item#roster.ask,
Type)
end,
AskMessage = case NewState of
{_, both} -> Reason;
{_, in} -> Reason;
_ -> ""
end,
case NewState of
none ->
{none, AutoReply};
{none, none} when Item#roster.subscription == none,
Item#roster.ask == in ->
odbc_queries:del_roster(LServer, Username, SJID),
{none, AutoReply};
{Subscription, Pending} ->
NewItem = Item#roster{subscription = Subscription,
ask = Pending,
askmessage = AskMessage},
ItemVals = record_to_string(NewItem),
odbc_queries:roster_subscribe(LServer, Username, SJID, ItemVals),
case roster_version_on_db(LServer) of
true -> odbc_queries:set_roster_version(ejabberd_odbc:escape(LUser), sha:sha(term_to_binary(now())));
false -> ok
end,
{{push, NewItem}, AutoReply}
end
end,
case odbc_queries:sql_transaction(LServer, F) of
{atomic, {Push, AutoReply}} ->
case AutoReply of
none ->
ok;
_ ->
T = case AutoReply of
subscribed -> "subscribed";
unsubscribed -> "unsubscribed"
end,
ejabberd_router:route(
jlib:make_jid(User, Server, ""), JID1,
{xmlelement, "presence", [{"type", T}], []})
end,
case Push of
{push, Item} ->
if
Item#roster.subscription == none,
Item#roster.ask == in ->
ok;
true ->
push_item(User, Server,
jlib:make_jid(User, Server, ""), Item)
end,
true;
none ->
false
end;
_ ->
false
end.
%% in_state_change(Subscription, Pending, Type) -> NewState
%% NewState = none | {NewSubscription, NewPending}
-ifdef(ROSTER_GATEWAY_WORKAROUND).
-define(NNSD, {to, none}).
-define(NISD, {to, in}).
-else.
-define(NNSD, none).
-define(NISD, none).
-endif.
in_state_change(none, none, subscribe) -> {none, in};
in_state_change(none, none, subscribed) -> ?NNSD;
in_state_change(none, none, unsubscribe) -> none;
in_state_change(none, none, unsubscribed) -> none;
in_state_change(none, out, subscribe) -> {none, both};
in_state_change(none, out, subscribed) -> {to, none};
in_state_change(none, out, unsubscribe) -> none;
in_state_change(none, out, unsubscribed) -> {none, none};
in_state_change(none, in, subscribe) -> none;
in_state_change(none, in, subscribed) -> ?NISD;
in_state_change(none, in, unsubscribe) -> {none, none};
in_state_change(none, in, unsubscribed) -> none;
in_state_change(none, both, subscribe) -> none;
in_state_change(none, both, subscribed) -> {to, in};
in_state_change(none, both, unsubscribe) -> {none, out};
in_state_change(none, both, unsubscribed) -> {none, in};
in_state_change(to, none, subscribe) -> {to, in};
in_state_change(to, none, subscribed) -> none;
in_state_change(to, none, unsubscribe) -> none;
in_state_change(to, none, unsubscribed) -> {none, none};
in_state_change(to, in, subscribe) -> none;
in_state_change(to, in, subscribed) -> none;
in_state_change(to, in, unsubscribe) -> {to, none};
in_state_change(to, in, unsubscribed) -> {none, in};
in_state_change(from, none, subscribe) -> none;
in_state_change(from, none, subscribed) -> {both, none};
in_state_change(from, none, unsubscribe) -> {none, none};
in_state_change(from, none, unsubscribed) -> none;
in_state_change(from, out, subscribe) -> none;
in_state_change(from, out, subscribed) -> {both, none};
in_state_change(from, out, unsubscribe) -> {none, out};
in_state_change(from, out, unsubscribed) -> {from, none};
in_state_change(both, none, subscribe) -> none;
in_state_change(both, none, subscribed) -> none;
in_state_change(both, none, unsubscribe) -> {to, none};
in_state_change(both, none, unsubscribed) -> {from, none}.
out_state_change(none, none, subscribe) -> {none, out};
out_state_change(none, none, subscribed) -> none;
out_state_change(none, none, unsubscribe) -> none;
out_state_change(none, none, unsubscribed) -> none;
out_state_change(none, out, subscribe) -> {none, out}; %% We need to resend query (RFC3921, section 9.2)
out_state_change(none, out, subscribed) -> none;
out_state_change(none, out, unsubscribe) -> {none, none};
out_state_change(none, out, unsubscribed) -> none;
out_state_change(none, in, subscribe) -> {none, both};
out_state_change(none, in, subscribed) -> {from, none};
out_state_change(none, in, unsubscribe) -> none;
out_state_change(none, in, unsubscribed) -> {none, none};
out_state_change(none, both, subscribe) -> none;
out_state_change(none, both, subscribed) -> {from, out};
out_state_change(none, both, unsubscribe) -> {none, in};
out_state_change(none, both, unsubscribed) -> {none, out};
out_state_change(to, none, subscribe) -> none;
out_state_change(to, none, subscribed) -> {both, none};
out_state_change(to, none, unsubscribe) -> {none, none};
out_state_change(to, none, unsubscribed) -> none;
out_state_change(to, in, subscribe) -> none;
out_state_change(to, in, subscribed) -> {both, none};
out_state_change(to, in, unsubscribe) -> {none, in};
out_state_change(to, in, unsubscribed) -> {to, none};
out_state_change(from, none, subscribe) -> {from, out};
out_state_change(from, none, subscribed) -> none;
out_state_change(from, none, unsubscribe) -> none;
out_state_change(from, none, unsubscribed) -> {none, none};
out_state_change(from, out, subscribe) -> none;
out_state_change(from, out, subscribed) -> none;
out_state_change(from, out, unsubscribe) -> {from, none};
out_state_change(from, out, unsubscribed) -> {none, out};
out_state_change(both, none, subscribe) -> none;
out_state_change(both, none, subscribed) -> none;
out_state_change(both, none, unsubscribe) -> {from, none};
out_state_change(both, none, unsubscribed) -> {to, none}.
in_auto_reply(from, none, subscribe) -> subscribed;
in_auto_reply(from, out, subscribe) -> subscribed;
in_auto_reply(both, none, subscribe) -> subscribed;
in_auto_reply(none, in, unsubscribe) -> unsubscribed;
in_auto_reply(none, both, unsubscribe) -> unsubscribed;
in_auto_reply(to, in, unsubscribe) -> unsubscribed;
in_auto_reply(from, none, unsubscribe) -> unsubscribed;
in_auto_reply(from, out, unsubscribe) -> unsubscribed;
in_auto_reply(both, none, unsubscribe) -> unsubscribed;
in_auto_reply(_, _, _) -> none.
remove_user(User, Server) ->
LUser = jlib:nodeprep(User),
LServer = jlib:nameprep(Server),
Username = ejabberd_odbc:escape(LUser),
send_unsubscription_to_rosteritems(LUser, LServer),
odbc_queries:del_user_roster_t(LServer, Username),
ok.
%% For each contact with Subscription:
%% Both or From, send a "unsubscribed" presence stanza;
%% Both or To, send a "unsubscribe" presence stanza.
send_unsubscription_to_rosteritems(LUser, LServer) ->
RosterItems = get_user_roster([], {LUser, LServer}),
From = jlib:make_jid({LUser, LServer, ""}),
lists:foreach(fun(RosterItem) ->
send_unsubscribing_presence(From, RosterItem)
end,
RosterItems).
%% @spec (From::jid(), Item::roster()) -> ok
send_unsubscribing_presence(From, Item) ->
IsTo = case Item#roster.subscription of
both -> true;
to -> true;
_ -> false
end,
IsFrom = case Item#roster.subscription of
both -> true;
from -> true;
_ -> false
end,
if IsTo ->
send_presence_type(
jlib:jid_remove_resource(From),
jlib:make_jid(Item#roster.jid), "unsubscribe");
true -> ok
end,
if IsFrom ->
send_presence_type(
jlib:jid_remove_resource(From),
jlib:make_jid(Item#roster.jid), "unsubscribed");
true -> ok
end,
ok.
send_presence_type(From, To, Type) ->
ejabberd_router:route(
From, To,
{xmlelement, "presence",
[{"type", Type}],
[]}).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
set_items(User, Server, SubEl) ->
{xmlelement, _Name, _Attrs, Els} = SubEl,
LUser = jlib:nodeprep(User),
LServer = jlib:nameprep(Server),
catch odbc_queries:sql_transaction(
LServer,
lists:flatmap(fun(El) ->
process_item_set_t(LUser, LServer, El)
end, Els)).
process_item_set_t(LUser, LServer, {xmlelement, _Name, Attrs, Els}) ->
JID1 = jlib:string_to_jid(xml:get_attr_s("jid", Attrs)),
case JID1 of
error ->
[];
_ ->
LJID = {JID1#jid.luser, JID1#jid.lserver, JID1#jid.lresource},
Username = ejabberd_odbc:escape(LUser),
SJID = ejabberd_odbc:escape(jlib:jid_to_string(LJID)),
Item = #roster{usj = {LUser, LServer, LJID},
us = {LUser, LServer},
jid = LJID},
Item1 = process_item_attrs_ws(Item, Attrs),
Item2 = process_item_els(Item1, Els),
case Item2#roster.subscription of
remove ->
odbc_queries:del_roster_sql(Username, SJID);
_ ->
ItemVals = record_to_string(Item1),
ItemGroups = groups_to_string(Item2),
odbc_queries:update_roster_sql(Username, SJID, ItemVals, ItemGroups)
end
end;
process_item_set_t(_LUser, _LServer, _) ->
[].
process_item_attrs_ws(Item, [{Attr, Val} | Attrs]) ->
case Attr of
"jid" ->
case jlib:string_to_jid(Val) of
error ->
process_item_attrs_ws(Item, Attrs);
JID1 ->
JID = {JID1#jid.luser, JID1#jid.lserver, JID1#jid.lresource},
process_item_attrs_ws(Item#roster{jid = JID}, Attrs)
end;
"name" ->
process_item_attrs_ws(Item#roster{name = Val}, Attrs);
"subscription" ->
case Val of
"remove" ->
process_item_attrs_ws(Item#roster{subscription = remove},
Attrs);
"none" ->
process_item_attrs_ws(Item#roster{subscription = none},
Attrs);
"both" ->
process_item_attrs_ws(Item#roster{subscription = both},
Attrs);
"from" ->
process_item_attrs_ws(Item#roster{subscription = from},
Attrs);
"to" ->
process_item_attrs_ws(Item#roster{subscription = to},
Attrs);
_ ->
process_item_attrs_ws(Item, Attrs)
end;
"ask" ->
process_item_attrs_ws(Item, Attrs);
_ ->
process_item_attrs_ws(Item, Attrs)
end;
process_item_attrs_ws(Item, []) ->
Item.
get_in_pending_subscriptions(Ls, User, Server) ->
JID = jlib:make_jid(User, Server, ""),
LUser = JID#jid.luser,
LServer = JID#jid.lserver,
Username = ejabberd_odbc:escape(LUser),
case catch odbc_queries:get_roster(LServer, Username) of
{selected, ["username", "jid", "nick", "subscription", "ask",
"askmessage", "server", "subscribe", "type"],
Items} when is_list(Items) ->
Ls ++ lists:map(
fun(R) ->
Message = R#roster.askmessage,
{xmlelement, "presence",
[{"from", jlib:jid_to_string(R#roster.jid)},
{"to", jlib:jid_to_string(JID)},
{"type", "subscribe"}],
[{xmlelement, "status", [],
[{xmlcdata, Message}]}]}
end,
lists:flatmap(
fun(I) ->
case raw_to_record(LServer, I) of
%% Bad JID in database:
error ->
[];
R ->
case R#roster.ask of
in -> [R];
both -> [R];
_ -> []
end
end
end,
Items));
_ ->
Ls
end.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
get_jid_info(_, User, Server, JID) ->
LUser = jlib:nodeprep(User),
LServer = jlib:nameprep(Server),
LJID = jlib:jid_tolower(JID),
Username = ejabberd_odbc:escape(LUser),
SJID = ejabberd_odbc:escape(jlib:jid_to_string(LJID)),
case catch odbc_queries:get_subscription(LServer, Username, SJID) of
{selected, ["subscription"], [{SSubscription}]} ->
Subscription = case SSubscription of
"B" -> both;
"T" -> to;
"F" -> from;
_ -> none
end,
Groups = case catch odbc_queries:get_rostergroup_by_jid(LServer, Username, SJID) of
{selected, ["grp"], JGrps} when is_list(JGrps) ->
[JGrp || {JGrp} <- JGrps];
_ ->
[]
end,
{Subscription, Groups};
_ ->
LRJID = jlib:jid_tolower(jlib:jid_remove_resource(JID)),
if
LRJID == LJID ->
{none, []};
true ->
SRJID = ejabberd_odbc:escape(jlib:jid_to_string(LRJID)),
case catch odbc_queries:get_subscription(LServer, Username, SRJID) of
{selected, ["subscription"], [{SSubscription}]} ->
Subscription = case SSubscription of
"B" -> both;
"T" -> to;
"F" -> from;
_ -> none
end,
Groups = case catch odbc_queries:get_rostergroup_by_jid(LServer, Username, SRJID) of
{selected, ["grp"], JGrps} when is_list(JGrps) ->
[JGrp || {JGrp} <- JGrps];
_ ->
[]
end,
{Subscription, Groups};
_ ->
{none, []}
end
end
end.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
raw_to_record(LServer, {User, SJID, Nick, SSubscription, SAsk, SAskMessage,
_SServer, _SSubscribe, _SType}) ->
case jlib:string_to_jid(SJID) of
error ->
error;
JID ->
LJID = jlib:jid_tolower(JID),
Subscription = case SSubscription of
"B" -> both;
"T" -> to;
"F" -> from;
_ -> none
end,
Ask = case SAsk of
"S" -> subscribe;
"U" -> unsubscribe;
"B" -> both;
"O" -> out;
"I" -> in;
_ -> none
end,
#roster{usj = {User, LServer, LJID},
us = {User, LServer},
jid = LJID,
name = Nick,
subscription = Subscription,
ask = Ask,
askmessage = SAskMessage}
end.
record_to_string(#roster{us = {User, _Server},
jid = JID,
name = Name,
subscription = Subscription,
ask = Ask,
askmessage = AskMessage}) ->
Username = ejabberd_odbc:escape(User),
SJID = ejabberd_odbc:escape(jlib:jid_to_string(jlib:jid_tolower(JID))),
Nick = ejabberd_odbc:escape(Name),
SSubscription = case Subscription of
both -> "B";
to -> "T";
from -> "F";
none -> "N"
end,
SAsk = case Ask of
subscribe -> "S";
unsubscribe -> "U";
both -> "B";
out -> "O";
in -> "I";
none -> "N"
end,
SAskMessage = ejabberd_odbc:escape(AskMessage),
[Username, SJID, Nick, SSubscription, SAsk, SAskMessage, "N", "", "item"].
groups_to_string(#roster{us = {User, _Server},
jid = JID,
groups = Groups}) ->
Username = ejabberd_odbc:escape(User),
SJID = ejabberd_odbc:escape(jlib:jid_to_string(jlib:jid_tolower(JID))),
%% Empty groups do not need to be converted to string to be inserted in
%% the database
lists:foldl(
fun([], Acc) -> Acc;
(Group, Acc) ->
G = ejabberd_odbc:escape(Group),
[[Username, SJID, G]|Acc] end, [], Groups).
webadmin_page(_, Host,
#request{us = _US,
path = ["user", U, "roster"],
q = Query,
lang = Lang} = _Request) ->
Res = user_roster(U, Host, Query, Lang),
{stop, Res};
webadmin_page(Acc, _, _) -> Acc.
user_roster(User, Server, Query, Lang) ->
LUser = jlib:nodeprep(User),
LServer = jlib:nameprep(Server),
US = {LUser, LServer},
Items1 = get_roster(LUser, LServer),
Res = user_roster_parse_query(User, Server, Items1, Query),
Items = get_roster(LUser, LServer),
SItems = lists:sort(Items),
FItems =
case SItems of
[] ->
[?CT("None")];
_ ->
[?XE("table",
[?XE("thead",
[?XE("tr",
[?XCT("td", "Jabber ID"),
?XCT("td", "Nickname"),
?XCT("td", "Subscription"),
?XCT("td", "Pending"),
?XCT("td", "Groups")
])]),
?XE("tbody",
lists:map(
fun(R) ->
Groups =
lists:flatmap(
fun(Group) ->
[?C(Group), ?BR]
end, R#roster.groups),
Pending = ask_to_pending(R#roster.ask),
TDJID = build_contact_jid_td(R#roster.jid),
?XE("tr",
[TDJID,
?XAC("td", [{"class", "valign"}],
R#roster.name),
?XAC("td", [{"class", "valign"}],
atom_to_list(R#roster.subscription)),
?XAC("td", [{"class", "valign"}],
atom_to_list(Pending)),
?XAE("td", [{"class", "valign"}], Groups),
if
Pending == in ->
?XAE("td", [{"class", "valign"}],
[?INPUTT("submit",
"validate" ++
ejabberd_web_admin:term_to_id(R#roster.jid),
"Validate")]);
true ->
?X("td")
end,
?XAE("td", [{"class", "valign"}],
[?INPUTT("submit",
"remove" ++
ejabberd_web_admin:term_to_id(R#roster.jid),
"Remove")])])
end, SItems))])]
end,
[?XC("h1", ?T("Roster of ") ++ us_to_list(US))] ++
case Res of
ok -> [?XREST("Submitted")];
error -> [?XREST("Bad format")];
nothing -> []
end ++
[?XAE("form", [{"action", ""}, {"method", "post"}],
FItems ++
[?P,
?INPUT("text", "newjid", ""), ?C(" "),
?INPUTT("submit", "addjid", "Add Jabber ID")
])].
build_contact_jid_td(RosterJID) ->
%% Convert {U, S, R} into {jid, U, S, R, U, S, R}:
ContactJID = jlib:make_jid(RosterJID),
JIDURI = case {ContactJID#jid.luser, ContactJID#jid.lserver} of
{"", _} -> "";
{CUser, CServer} ->
case lists:member(CServer, ?MYHOSTS) of
false -> "";
true -> "/admin/server/" ++ CServer ++ "/user/" ++ CUser ++ "/"
end
end,
case JIDURI of
[] ->
?XAC("td", [{"class", "valign"}], jlib:jid_to_string(RosterJID));
URI when is_list(URI) ->
?XAE("td", [{"class", "valign"}], [?AC(JIDURI, jlib:jid_to_string(RosterJID))])
end.
user_roster_parse_query(User, Server, Items, Query) ->
case lists:keysearch("addjid", 1, Query) of
{value, _} ->
case lists:keysearch("newjid", 1, Query) of
{value, {_, undefined}} ->
error;
{value, {_, SJID}} ->
case jlib:string_to_jid(SJID) of
JID when is_record(JID, jid) ->
user_roster_subscribe_jid(User, Server, JID),
ok;
error ->
error
end;
false ->
error
end;
false ->
case catch user_roster_item_parse_query(
User, Server, Items, Query) of
submitted ->
ok;
{'EXIT', _Reason} ->
error;
_ ->
nothing
end
end.
user_roster_subscribe_jid(User, Server, JID) ->
out_subscription(User, Server, JID, subscribe),
UJID = jlib:make_jid(User, Server, ""),
ejabberd_router:route(
UJID, JID, {xmlelement, "presence", [{"type", "subscribe"}], []}).
user_roster_item_parse_query(User, Server, Items, Query) ->
lists:foreach(
fun(R) ->
JID = R#roster.jid,
case lists:keysearch(
"validate" ++ ejabberd_web_admin:term_to_id(JID), 1, Query) of
{value, _} ->
JID1 = jlib:make_jid(JID),
out_subscription(
User, Server, JID1, subscribed),
UJID = jlib:make_jid(User, Server, ""),
ejabberd_router:route(
UJID, JID1, {xmlelement, "presence",
[{"type", "subscribed"}], []}),
throw(submitted);
false ->
case lists:keysearch(
"remove" ++ ejabberd_web_admin:term_to_id(JID), 1, Query) of
{value, _} ->
UJID = jlib:make_jid(User, Server, ""),
process_iq(
UJID, UJID,
#iq{type = set,
sub_el = {xmlelement, "query",
[{"xmlns", ?NS_ROSTER}],
[{xmlelement, "item",
[{"jid", jlib:jid_to_string(JID)},
{"subscription", "remove"}],
[]}]}}),
throw(submitted);
false ->
ok
end
end
end, Items),
nothing.
us_to_list({User, Server}) ->
jlib:jid_to_string({User, Server, ""}).
webadmin_user(Acc, _User, _Server, Lang) ->
Acc ++ [?XE("h3", [?ACT("roster/", "Roster")])].
ejabberd-2.1.11/src/mod_announce.erl 0000664 0000000 0000000 00000075037 12240230175 014172 0 ustar %%%----------------------------------------------------------------------
%%% File : mod_announce.erl
%%% Author : Alexey Shchepin
%%% Purpose : Manage announce messages
%%% Created : 11 Aug 2003 by Alexey Shchepin
%%%
%%%
%%% ejabberd, Copyright (C) 2002-2012 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
%%% published by the Free Software Foundation; either version 2 of the
%%% License, or (at your option) any later version.
%%%
%%% This program is distributed in the hope that it will be useful,
%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
%%% General Public License for more details.
%%%
%%% You should have received a copy of the GNU General Public License
%%% along with this program; if not, write to the Free Software
%%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
%%% 02111-1307 USA
%%%
%%%----------------------------------------------------------------------
%%% Implements a small subset of XEP-0133: Service Administration
%%% Version 1.1 (2005-08-19)
-module(mod_announce).
-author('alexey@process-one.net').
-behaviour(gen_mod).
-export([start/2,
init/0,
stop/1,
announce/3,
send_motd/1,
disco_identity/5,
disco_features/5,
disco_items/5,
send_announcement_to_all/3,
announce_commands/4,
announce_items/4]).
-include("ejabberd.hrl").
-include("jlib.hrl").
-include("adhoc.hrl").
-record(motd, {server, packet}).
-record(motd_users, {us, dummy = []}).
-define(PROCNAME, ejabberd_announce).
-define(NS_ADMINL(Sub), ["http:","jabber.org","protocol","admin", Sub]).
tokenize(Node) -> string:tokens(Node, "/#").
start(Host, _Opts) ->
mnesia:create_table(motd, [{disc_copies, [node()]},
{attributes, record_info(fields, motd)}]),
mnesia:create_table(motd_users, [{disc_copies, [node()]},
{attributes, record_info(fields, motd_users)}]),
update_tables(),
ejabberd_hooks:add(local_send_to_resource_hook, Host,
?MODULE, announce, 50),
ejabberd_hooks:add(disco_local_identity, Host, ?MODULE, disco_identity, 50),
ejabberd_hooks:add(disco_local_features, Host, ?MODULE, disco_features, 50),
ejabberd_hooks:add(disco_local_items, Host, ?MODULE, disco_items, 50),
ejabberd_hooks:add(adhoc_local_items, Host, ?MODULE, announce_items, 50),
ejabberd_hooks:add(adhoc_local_commands, Host, ?MODULE, announce_commands, 50),
ejabberd_hooks:add(user_available_hook, Host,
?MODULE, send_motd, 50),
register(gen_mod:get_module_proc(Host, ?PROCNAME),
proc_lib:spawn(?MODULE, init, [])).
init() ->
loop().
loop() ->
receive
{announce_all, From, To, Packet} ->
announce_all(From, To, Packet),
loop();
{announce_all_hosts_all, From, To, Packet} ->
announce_all_hosts_all(From, To, Packet),
loop();
{announce_online, From, To, Packet} ->
announce_online(From, To, Packet),
loop();
{announce_all_hosts_online, From, To, Packet} ->
announce_all_hosts_online(From, To, Packet),
loop();
{announce_motd, From, To, Packet} ->
announce_motd(From, To, Packet),
loop();
{announce_all_hosts_motd, From, To, Packet} ->
announce_all_hosts_motd(From, To, Packet),
loop();
{announce_motd_update, From, To, Packet} ->
announce_motd_update(From, To, Packet),
loop();
{announce_all_hosts_motd_update, From, To, Packet} ->
announce_all_hosts_motd_update(From, To, Packet),
loop();
{announce_motd_delete, From, To, Packet} ->
announce_motd_delete(From, To, Packet),
loop();
{announce_all_hosts_motd_delete, From, To, Packet} ->
announce_all_hosts_motd_delete(From, To, Packet),
loop();
_ ->
loop()
end.
stop(Host) ->
ejabberd_hooks:delete(adhoc_local_commands, Host, ?MODULE, announce_commands, 50),
ejabberd_hooks:delete(adhoc_local_items, Host, ?MODULE, announce_items, 50),
ejabberd_hooks:delete(disco_local_identity, Host, ?MODULE, disco_identity, 50),
ejabberd_hooks:delete(disco_local_features, Host, ?MODULE, disco_features, 50),
ejabberd_hooks:delete(disco_local_items, Host, ?MODULE, disco_items, 50),
ejabberd_hooks:delete(local_send_to_resource_hook, Host,
?MODULE, announce, 50),
ejabberd_hooks:delete(user_available_hook, Host,
?MODULE, send_motd, 50),
Proc = gen_mod:get_module_proc(Host, ?PROCNAME),
exit(whereis(Proc), stop),
{wait, Proc}.
%% Announcing via messages to a custom resource
announce(From, To, Packet) ->
case To of
#jid{luser = "", lresource = Res} ->
{xmlelement, Name, _Attrs, _Els} = Packet,
Proc = gen_mod:get_module_proc(To#jid.lserver, ?PROCNAME),
case {Res, Name} of
{"announce/all", "message"} ->
Proc ! {announce_all, From, To, Packet},
stop;
{"announce/all-hosts/all", "message"} ->
Proc ! {announce_all_hosts_all, From, To, Packet},
stop;
{"announce/online", "message"} ->
Proc ! {announce_online, From, To, Packet},
stop;
{"announce/all-hosts/online", "message"} ->
Proc ! {announce_all_hosts_online, From, To, Packet},
stop;
{"announce/motd", "message"} ->
Proc ! {announce_motd, From, To, Packet},
stop;
{"announce/all-hosts/motd", "message"} ->
Proc ! {announce_all_hosts_motd, From, To, Packet},
stop;
{"announce/motd/update", "message"} ->
Proc ! {announce_motd_update, From, To, Packet},
stop;
{"announce/all-hosts/motd/update", "message"} ->
Proc ! {announce_all_hosts_motd_update, From, To, Packet},
stop;
{"announce/motd/delete", "message"} ->
Proc ! {announce_motd_delete, From, To, Packet},
stop;
{"announce/all-hosts/motd/delete", "message"} ->
Proc ! {announce_all_hosts_motd_delete, From, To, Packet},
stop;
_ ->
ok
end;
_ ->
ok
end.
%%-------------------------------------------------------------------------
%% Announcing via ad-hoc commands
-define(INFO_COMMAND(Lang, Node),
[{xmlelement, "identity",
[{"category", "automation"},
{"type", "command-node"},
{"name", get_title(Lang, Node)}], []}]).
disco_identity(Acc, _From, _To, Node, Lang) ->
LNode = tokenize(Node),
case LNode of
?NS_ADMINL("announce") ->
?INFO_COMMAND(Lang, Node);
?NS_ADMINL("announce-allhosts") ->
?INFO_COMMAND(Lang, Node);
?NS_ADMINL("announce-all") ->
?INFO_COMMAND(Lang, Node);
?NS_ADMINL("announce-all-allhosts") ->
?INFO_COMMAND(Lang, Node);
?NS_ADMINL("set-motd") ->
?INFO_COMMAND(Lang, Node);
?NS_ADMINL("set-motd-allhosts") ->
?INFO_COMMAND(Lang, Node);
?NS_ADMINL("edit-motd") ->
?INFO_COMMAND(Lang, Node);
?NS_ADMINL("edit-motd-allhosts") ->
?INFO_COMMAND(Lang, Node);
?NS_ADMINL("delete-motd") ->
?INFO_COMMAND(Lang, Node);
?NS_ADMINL("delete-motd-allhosts") ->
?INFO_COMMAND(Lang, Node);
_ ->
Acc
end.
%%-------------------------------------------------------------------------
-define(INFO_RESULT(Allow, Feats),
case Allow of
deny ->
{error, ?ERR_FORBIDDEN};
allow ->
{result, Feats}
end).
disco_features(Acc, From, #jid{lserver = LServer} = _To,
"announce", _Lang) ->
case gen_mod:is_loaded(LServer, mod_adhoc) of
false ->
Acc;
_ ->
Access1 = gen_mod:get_module_opt(LServer, ?MODULE, access, none),
Access2 = gen_mod:get_module_opt(global, ?MODULE, access, none),
case {acl:match_rule(LServer, Access1, From),
acl:match_rule(global, Access2, From)} of
{deny, deny} ->
{error, ?ERR_FORBIDDEN};
_ ->
{result, []}
end
end;
disco_features(Acc, From, #jid{lserver = LServer} = _To,
Node, _Lang) ->
case gen_mod:is_loaded(LServer, mod_adhoc) of
false ->
Acc;
_ ->
Access = gen_mod:get_module_opt(LServer, ?MODULE, access, none),
Allow = acl:match_rule(LServer, Access, From),
AccessGlobal = gen_mod:get_module_opt(global, ?MODULE, access, none),
AllowGlobal = acl:match_rule(global, AccessGlobal, From),
case Node of
?NS_ADMIN ++ "#announce" ->
?INFO_RESULT(Allow, [?NS_COMMANDS]);
?NS_ADMIN ++ "#announce-all" ->
?INFO_RESULT(Allow, [?NS_COMMANDS]);
?NS_ADMIN ++ "#set-motd" ->
?INFO_RESULT(Allow, [?NS_COMMANDS]);
?NS_ADMIN ++ "#edit-motd" ->
?INFO_RESULT(Allow, [?NS_COMMANDS]);
?NS_ADMIN ++ "#delete-motd" ->
?INFO_RESULT(Allow, [?NS_COMMANDS]);
?NS_ADMIN ++ "#announce-allhosts" ->
?INFO_RESULT(AllowGlobal, [?NS_COMMANDS]);
?NS_ADMIN ++ "#announce-all-allhosts" ->
?INFO_RESULT(AllowGlobal, [?NS_COMMANDS]);
?NS_ADMIN ++ "#set-motd-allhosts" ->
?INFO_RESULT(AllowGlobal, [?NS_COMMANDS]);
?NS_ADMIN ++ "#edit-motd-allhosts" ->
?INFO_RESULT(AllowGlobal, [?NS_COMMANDS]);
?NS_ADMIN ++ "#delete-motd-allhosts" ->
?INFO_RESULT(AllowGlobal, [?NS_COMMANDS]);
_ ->
Acc
end
end.
%%-------------------------------------------------------------------------
-define(NODE_TO_ITEM(Lang, Server, Node),
{xmlelement, "item",
[{"jid", Server},
{"node", Node},
{"name", get_title(Lang, Node)}],
[]}).
-define(ITEMS_RESULT(Allow, Items),
case Allow of
deny ->
{error, ?ERR_FORBIDDEN};
allow ->
{result, Items}
end).
disco_items(Acc, From, #jid{lserver = LServer, server = Server} = _To,
"", Lang) ->
case gen_mod:is_loaded(LServer, mod_adhoc) of
false ->
Acc;
_ ->
Access1 = gen_mod:get_module_opt(LServer, ?MODULE, access, none),
Access2 = gen_mod:get_module_opt(global, ?MODULE, access, none),
case {acl:match_rule(LServer, Access1, From),
acl:match_rule(global, Access2, From)} of
{deny, deny} ->
Acc;
_ ->
Items = case Acc of
{result, I} -> I;
_ -> []
end,
Nodes = [?NODE_TO_ITEM(Lang, Server, "announce")],
{result, Items ++ Nodes}
end
end;
disco_items(Acc, From, #jid{lserver = LServer} = To, "announce", Lang) ->
case gen_mod:is_loaded(LServer, mod_adhoc) of
false ->
Acc;
_ ->
announce_items(Acc, From, To, Lang)
end;
disco_items(Acc, From, #jid{lserver = LServer} = _To, Node, _Lang) ->
case gen_mod:is_loaded(LServer, mod_adhoc) of
false ->
Acc;
_ ->
Access = gen_mod:get_module_opt(LServer, ?MODULE, access, none),
Allow = acl:match_rule(LServer, Access, From),
AccessGlobal = gen_mod:get_module_opt(global, ?MODULE, access, none),
AllowGlobal = acl:match_rule(global, AccessGlobal, From),
case Node of
?NS_ADMIN ++ "#announce" ->
?ITEMS_RESULT(Allow, []);
?NS_ADMIN ++ "#announce-all" ->
?ITEMS_RESULT(Allow, []);
?NS_ADMIN ++ "#set-motd" ->
?ITEMS_RESULT(Allow, []);
?NS_ADMIN ++ "#edit-motd" ->
?ITEMS_RESULT(Allow, []);
?NS_ADMIN ++ "#delete-motd" ->
?ITEMS_RESULT(Allow, []);
?NS_ADMIN ++ "#announce-allhosts" ->
?ITEMS_RESULT(AllowGlobal, []);
?NS_ADMIN ++ "#announce-all-allhosts" ->
?ITEMS_RESULT(AllowGlobal, []);
?NS_ADMIN ++ "#set-motd-allhosts" ->
?ITEMS_RESULT(AllowGlobal, []);
?NS_ADMIN ++ "#edit-motd-allhosts" ->
?ITEMS_RESULT(AllowGlobal, []);
?NS_ADMIN ++ "#delete-motd-allhosts" ->
?ITEMS_RESULT(AllowGlobal, []);
_ ->
Acc
end
end.
%%-------------------------------------------------------------------------
announce_items(Acc, From, #jid{lserver = LServer, server = Server} = _To, Lang) ->
Access1 = gen_mod:get_module_opt(LServer, ?MODULE, access, none),
Nodes1 = case acl:match_rule(LServer, Access1, From) of
allow ->
[?NODE_TO_ITEM(Lang, Server, ?NS_ADMIN ++ "#announce"),
?NODE_TO_ITEM(Lang, Server, ?NS_ADMIN ++ "#announce-all"),
?NODE_TO_ITEM(Lang, Server, ?NS_ADMIN ++ "#set-motd"),
?NODE_TO_ITEM(Lang, Server, ?NS_ADMIN ++ "#edit-motd"),
?NODE_TO_ITEM(Lang, Server, ?NS_ADMIN ++ "#delete-motd")];
deny ->
[]
end,
Access2 = gen_mod:get_module_opt(global, ?MODULE, access, none),
Nodes2 = case acl:match_rule(global, Access2, From) of
allow ->
[?NODE_TO_ITEM(Lang, Server, ?NS_ADMIN ++ "#announce-allhosts"),
?NODE_TO_ITEM(Lang, Server, ?NS_ADMIN ++ "#announce-all-allhosts"),
?NODE_TO_ITEM(Lang, Server, ?NS_ADMIN ++ "#set-motd-allhosts"),
?NODE_TO_ITEM(Lang, Server, ?NS_ADMIN ++ "#edit-motd-allhosts"),
?NODE_TO_ITEM(Lang, Server, ?NS_ADMIN ++ "#delete-motd-allhosts")];
deny ->
[]
end,
case {Nodes1, Nodes2} of
{[], []} ->
Acc;
_ ->
Items = case Acc of
{result, I} -> I;
_ -> []
end,
{result, Items ++ Nodes1 ++ Nodes2}
end.
%%-------------------------------------------------------------------------
commands_result(Allow, From, To, Request) ->
case Allow of
deny ->
{error, ?ERR_FORBIDDEN};
allow ->
announce_commands(From, To, Request)
end.
announce_commands(Acc, From, #jid{lserver = LServer} = To,
#adhoc_request{ node = Node} = Request) ->
LNode = tokenize(Node),
F = fun() ->
Access = gen_mod:get_module_opt(global, ?MODULE, access, none),
Allow = acl:match_rule(global, Access, From),
commands_result(Allow, From, To, Request)
end,
R = case LNode of
?NS_ADMINL("announce-allhosts") -> F();
?NS_ADMINL("announce-all-allhosts") -> F();
?NS_ADMINL("set-motd-allhosts") -> F();
?NS_ADMINL("edit-motd-allhosts") -> F();
?NS_ADMINL("delete-motd-allhosts") -> F();
_ ->
Access = gen_mod:get_module_opt(LServer, ?MODULE, access, none),
Allow = acl:match_rule(LServer, Access, From),
case LNode of
?NS_ADMINL("announce") ->
commands_result(Allow, From, To, Request);
?NS_ADMINL("announce-all") ->
commands_result(Allow, From, To, Request);
?NS_ADMINL("set-motd") ->
commands_result(Allow, From, To, Request);
?NS_ADMINL("edit-motd") ->
commands_result(Allow, From, To, Request);
?NS_ADMINL("delete-motd") ->
commands_result(Allow, From, To, Request);
_ ->
unknown
end
end,
case R of
unknown -> Acc;
_ -> {stop, R}
end.
%%-------------------------------------------------------------------------
announce_commands(From, To,
#adhoc_request{lang = Lang,
node = Node,
action = Action,
xdata = XData} = Request) ->
%% If the "action" attribute is not present, it is
%% understood as "execute". If there was no
%% element in the first response (which there isn't in our
%% case), "execute" and "complete" are equivalent.
ActionIsExecute = lists:member(Action,
["", "execute", "complete"]),
if Action == "cancel" ->
%% User cancels request
adhoc:produce_response(Request,
#adhoc_response{status = canceled});
XData == false, ActionIsExecute ->
%% User requests form
Elements = generate_adhoc_form(Lang, Node, To#jid.lserver),
adhoc:produce_response(
Request,
#adhoc_response{status = executing,
elements = [Elements]});
XData /= false, ActionIsExecute ->
%% User returns form.
case jlib:parse_xdata_submit(XData) of
invalid ->
{error, ?ERR_BAD_REQUEST};
Fields ->
handle_adhoc_form(From, To, Request, Fields)
end;
true ->
{error, ?ERR_BAD_REQUEST}
end.
-define(VVALUE(Val),
{xmlelement, "value", [], [{xmlcdata, Val}]}).
-define(TVFIELD(Type, Var, Val),
{xmlelement, "field", [{"type", Type},
{"var", Var}],
vvaluel(Val)}).
-define(HFIELD(), ?TVFIELD("hidden", "FORM_TYPE", ?NS_ADMIN)).
vvaluel(Val) ->
case Val of
"" -> [];
_ -> [?VVALUE(Val)]
end.
generate_adhoc_form(Lang, Node, ServerHost) ->
LNode = tokenize(Node),
{OldSubject, OldBody} = if (LNode == ?NS_ADMINL("edit-motd"))
or (LNode == ?NS_ADMINL("edit-motd-allhosts")) ->
get_stored_motd(ServerHost);
true ->
{[], []}
end,
{xmlelement, "x",
[{"xmlns", ?NS_XDATA},
{"type", "form"}],
[?HFIELD(),
{xmlelement, "title", [], [{xmlcdata, get_title(Lang, Node)}]}]
++
if (LNode == ?NS_ADMINL("delete-motd"))
or (LNode == ?NS_ADMINL("delete-motd-allhosts")) ->
[{xmlelement, "field",
[{"var", "confirm"},
{"type", "boolean"},
{"label", translate:translate(Lang, "Really delete message of the day?")}],
[{xmlelement, "value",
[],
[{xmlcdata, "true"}]}]}];
true ->
[{xmlelement, "field",
[{"var", "subject"},
{"type", "text-single"},
{"label", translate:translate(Lang, "Subject")}],
vvaluel(OldSubject)},
{xmlelement, "field",
[{"var", "body"},
{"type", "text-multi"},
{"label", translate:translate(Lang, "Message body")}],
vvaluel(OldBody)}]
end}.
join_lines([]) ->
[];
join_lines(Lines) ->
join_lines(Lines, []).
join_lines([Line|Lines], Acc) ->
join_lines(Lines, ["\n",Line|Acc]);
join_lines([], Acc) ->
%% Remove last newline
lists:flatten(lists:reverse(tl(Acc))).
handle_adhoc_form(From, #jid{lserver = LServer} = To,
#adhoc_request{lang = Lang,
node = Node,
sessionid = SessionID},
Fields) ->
Confirm = case lists:keysearch("confirm", 1, Fields) of
{value, {"confirm", ["true"]}} ->
true;
{value, {"confirm", ["1"]}} ->
true;
_ ->
false
end,
Subject = case lists:keysearch("subject", 1, Fields) of
{value, {"subject", SubjectLines}} ->
%% There really shouldn't be more than one
%% subject line, but can we stop them?
join_lines(SubjectLines);
_ ->
[]
end,
Body = case lists:keysearch("body", 1, Fields) of
{value, {"body", BodyLines}} ->
join_lines(BodyLines);
_ ->
[]
end,
Response = #adhoc_response{lang = Lang,
node = Node,
sessionid = SessionID,
status = completed},
Packet = {xmlelement, "message", [{"type", "normal"}],
if Subject /= [] ->
[{xmlelement, "subject", [],
[{xmlcdata, Subject}]}];
true ->
[]
end ++
if Body /= [] ->
[{xmlelement, "body", [],
[{xmlcdata, Body}]}];
true ->
[]
end},
Proc = gen_mod:get_module_proc(LServer, ?PROCNAME),
case {Node, Body} of
{?NS_ADMIN ++ "#delete-motd", _} ->
if Confirm ->
Proc ! {announce_motd_delete, From, To, Packet},
adhoc:produce_response(Response);
true ->
adhoc:produce_response(Response)
end;
{?NS_ADMIN ++ "#delete-motd-allhosts", _} ->
if Confirm ->
Proc ! {announce_all_hosts_motd_delete, From, To, Packet},
adhoc:produce_response(Response);
true ->
adhoc:produce_response(Response)
end;
{_, []} ->
%% An announce message with no body is definitely an operator error.
%% Throw an error and give him/her a chance to send message again.
{error, ?ERRT_NOT_ACCEPTABLE(
Lang,
"No body provided for announce message")};
%% Now send the packet to ?PROCNAME.
%% We don't use direct announce_* functions because it
%% leads to large delay in response and queries processing
{?NS_ADMIN ++ "#announce", _} ->
Proc ! {announce_online, From, To, Packet},
adhoc:produce_response(Response);
{?NS_ADMIN ++ "#announce-allhosts", _} ->
Proc ! {announce_all_hosts_online, From, To, Packet},
adhoc:produce_response(Response);
{?NS_ADMIN ++ "#announce-all", _} ->
Proc ! {announce_all, From, To, Packet},
adhoc:produce_response(Response);
{?NS_ADMIN ++ "#announce-all-allhosts", _} ->
Proc ! {announce_all_hosts_all, From, To, Packet},
adhoc:produce_response(Response);
{?NS_ADMIN ++ "#set-motd", _} ->
Proc ! {announce_motd, From, To, Packet},
adhoc:produce_response(Response);
{?NS_ADMIN ++ "#set-motd-allhosts", _} ->
Proc ! {announce_all_hosts_motd, From, To, Packet},
adhoc:produce_response(Response);
{?NS_ADMIN ++ "#edit-motd", _} ->
Proc ! {announce_motd_update, From, To, Packet},
adhoc:produce_response(Response);
{?NS_ADMIN ++ "#edit-motd-allhosts", _} ->
Proc ! {announce_all_hosts_motd_update, From, To, Packet},
adhoc:produce_response(Response);
_ ->
%% This can't happen, as we haven't registered any other
%% command nodes.
{error, ?ERR_INTERNAL_SERVER_ERROR}
end.
get_title(Lang, "announce") ->
translate:translate(Lang, "Announcements");
get_title(Lang, ?NS_ADMIN ++ "#announce-all") ->
translate:translate(Lang, "Send announcement to all users");
get_title(Lang, ?NS_ADMIN ++ "#announce-all-allhosts") ->
translate:translate(Lang, "Send announcement to all users on all hosts");
get_title(Lang, ?NS_ADMIN ++ "#announce") ->
translate:translate(Lang, "Send announcement to all online users");
get_title(Lang, ?NS_ADMIN ++ "#announce-allhosts") ->
translate:translate(Lang, "Send announcement to all online users on all hosts");
get_title(Lang, ?NS_ADMIN ++ "#set-motd") ->
translate:translate(Lang, "Set message of the day and send to online users");
get_title(Lang, ?NS_ADMIN ++ "#set-motd-allhosts") ->
translate:translate(Lang, "Set message of the day on all hosts and send to online users");
get_title(Lang, ?NS_ADMIN ++ "#edit-motd") ->
translate:translate(Lang, "Update message of the day (don't send)");
get_title(Lang, ?NS_ADMIN ++ "#edit-motd-allhosts") ->
translate:translate(Lang, "Update message of the day on all hosts (don't send)");
get_title(Lang, ?NS_ADMIN ++ "#delete-motd") ->
translate:translate(Lang, "Delete message of the day");
get_title(Lang, ?NS_ADMIN ++ "#delete-motd-allhosts") ->
translate:translate(Lang, "Delete message of the day on all hosts").
%%-------------------------------------------------------------------------
announce_all(From, To, Packet) ->
Host = To#jid.lserver,
Access = gen_mod:get_module_opt(Host, ?MODULE, access, none),
case acl:match_rule(Host, Access, From) of
deny ->
Err = jlib:make_error_reply(Packet, ?ERR_FORBIDDEN),
ejabberd_router:route(To, From, Err);
allow ->
Local = jlib:make_jid("", To#jid.server, ""),
lists:foreach(
fun({User, Server}) ->
Dest = jlib:make_jid(User, Server, ""),
ejabberd_router:route(Local, Dest, Packet)
end, ejabberd_auth:get_vh_registered_users(Host))
end.
announce_all_hosts_all(From, To, Packet) ->
Access = gen_mod:get_module_opt(global, ?MODULE, access, none),
case acl:match_rule(global, Access, From) of
deny ->
Err = jlib:make_error_reply(Packet, ?ERR_FORBIDDEN),
ejabberd_router:route(To, From, Err);
allow ->
Local = jlib:make_jid("", To#jid.server, ""),
lists:foreach(
fun({User, Server}) ->
Dest = jlib:make_jid(User, Server, ""),
ejabberd_router:route(Local, Dest, Packet)
end, ejabberd_auth:dirty_get_registered_users())
end.
announce_online(From, To, Packet) ->
Host = To#jid.lserver,
Access = gen_mod:get_module_opt(Host, ?MODULE, access, none),
case acl:match_rule(Host, Access, From) of
deny ->
Err = jlib:make_error_reply(Packet, ?ERR_FORBIDDEN),
ejabberd_router:route(To, From, Err);
allow ->
announce_online1(ejabberd_sm:get_vh_session_list(Host),
To#jid.server,
Packet)
end.
announce_all_hosts_online(From, To, Packet) ->
Access = gen_mod:get_module_opt(global, ?MODULE, access, none),
case acl:match_rule(global, Access, From) of
deny ->
Err = jlib:make_error_reply(Packet, ?ERR_FORBIDDEN),
ejabberd_router:route(To, From, Err);
allow ->
announce_online1(ejabberd_sm:dirty_get_sessions_list(),
To#jid.server,
Packet)
end.
announce_online1(Sessions, Server, Packet) ->
Local = jlib:make_jid("", Server, ""),
lists:foreach(
fun({U, S, R}) ->
Dest = jlib:make_jid(U, S, R),
ejabberd_router:route(Local, Dest, Packet)
end, Sessions).
announce_motd(From, To, Packet) ->
Host = To#jid.lserver,
Access = gen_mod:get_module_opt(Host, ?MODULE, access, none),
case acl:match_rule(Host, Access, From) of
deny ->
Err = jlib:make_error_reply(Packet, ?ERR_FORBIDDEN),
ejabberd_router:route(To, From, Err);
allow ->
announce_motd(Host, Packet)
end.
announce_all_hosts_motd(From, To, Packet) ->
Access = gen_mod:get_module_opt(global, ?MODULE, access, none),
case acl:match_rule(global, Access, From) of
deny ->
Err = jlib:make_error_reply(Packet, ?ERR_FORBIDDEN),
ejabberd_router:route(To, From, Err);
allow ->
Hosts = ?MYHOSTS,
[announce_motd(Host, Packet) || Host <- Hosts]
end.
announce_motd(Host, Packet) ->
announce_motd_update(Host, Packet),
Sessions = ejabberd_sm:get_vh_session_list(Host),
announce_online1(Sessions, Host, Packet),
F = fun() ->
lists:foreach(
fun({U, S, _R}) ->
mnesia:write(#motd_users{us = {U, S}})
end, Sessions)
end,
mnesia:transaction(F).
announce_motd_update(From, To, Packet) ->
Host = To#jid.lserver,
Access = gen_mod:get_module_opt(Host, ?MODULE, access, none),
case acl:match_rule(Host, Access, From) of
deny ->
Err = jlib:make_error_reply(Packet, ?ERR_FORBIDDEN),
ejabberd_router:route(To, From, Err);
allow ->
announce_motd_update(Host, Packet)
end.
announce_all_hosts_motd_update(From, To, Packet) ->
Access = gen_mod:get_module_opt(global, ?MODULE, access, none),
case acl:match_rule(global, Access, From) of
deny ->
Err = jlib:make_error_reply(Packet, ?ERR_FORBIDDEN),
ejabberd_router:route(To, From, Err);
allow ->
Hosts = ?MYHOSTS,
[announce_motd_update(Host, Packet) || Host <- Hosts]
end.
announce_motd_update(LServer, Packet) ->
announce_motd_delete(LServer),
F = fun() ->
mnesia:write(#motd{server = LServer, packet = Packet})
end,
mnesia:transaction(F).
announce_motd_delete(From, To, Packet) ->
Host = To#jid.lserver,
Access = gen_mod:get_module_opt(Host, ?MODULE, access, none),
case acl:match_rule(Host, Access, From) of
deny ->
Err = jlib:make_error_reply(Packet, ?ERR_FORBIDDEN),
ejabberd_router:route(To, From, Err);
allow ->
announce_motd_delete(Host)
end.
announce_all_hosts_motd_delete(From, To, Packet) ->
Access = gen_mod:get_module_opt(global, ?MODULE, access, none),
case acl:match_rule(global, Access, From) of
deny ->
Err = jlib:make_error_reply(Packet, ?ERR_FORBIDDEN),
ejabberd_router:route(To, From, Err);
allow ->
Hosts = ?MYHOSTS,
[announce_motd_delete(Host) || Host <- Hosts]
end.
announce_motd_delete(LServer) ->
F = fun() ->
mnesia:delete({motd, LServer}),
mnesia:write_lock_table(motd_users),
Users = mnesia:select(
motd_users,
[{#motd_users{us = '$1', _ = '_'},
[{'==', {element, 2, '$1'}, LServer}],
['$1']}]),
lists:foreach(fun(US) ->
mnesia:delete({motd_users, US})
end, Users)
end,
mnesia:transaction(F).
send_motd(#jid{luser = LUser, lserver = LServer} = JID) ->
case catch mnesia:dirty_read({motd, LServer}) of
[#motd{packet = Packet}] ->
US = {LUser, LServer},
case catch mnesia:dirty_read({motd_users, US}) of
[#motd_users{}] ->
ok;
_ ->
Local = jlib:make_jid("", LServer, ""),
ejabberd_router:route(Local, JID, Packet),
F = fun() ->
mnesia:write(#motd_users{us = US})
end,
mnesia:transaction(F)
end;
_ ->
ok
end.
get_stored_motd(LServer) ->
case catch mnesia:dirty_read({motd, LServer}) of
[#motd{packet = Packet}] ->
{xml:get_subtag_cdata(Packet, "subject"),
xml:get_subtag_cdata(Packet, "body")};
_ ->
{"", ""}
end.
%% This function is similar to others, but doesn't perform any ACL verification
send_announcement_to_all(Host, SubjectS, BodyS) ->
SubjectEls = if SubjectS /= [] ->
[{xmlelement, "subject", [], [{xmlcdata, SubjectS}]}];
true ->
[]
end,
BodyEls = if BodyS /= [] ->
[{xmlelement, "body", [], [{xmlcdata, BodyS}]}];
true ->
[]
end,
Packet = {xmlelement, "message", [{"type", "normal"}], SubjectEls ++ BodyEls},
Sessions = ejabberd_sm:dirty_get_sessions_list(),
Local = jlib:make_jid("", Host, ""),
lists:foreach(
fun({U, S, R}) ->
Dest = jlib:make_jid(U, S, R),
ejabberd_router:route(Local, Dest, Packet)
end, Sessions).
%%-------------------------------------------------------------------------
update_tables() ->
update_motd_table(),
update_motd_users_table().
update_motd_table() ->
Fields = record_info(fields, motd),
case mnesia:table_info(motd, attributes) of
Fields ->
ok;
[id, packet] ->
?INFO_MSG("Converting motd table from "
"{id, packet} format", []),
Host = ?MYNAME,
{atomic, ok} = mnesia:create_table(
mod_announce_tmp_table,
[{disc_only_copies, [node()]},
{type, bag},
{local_content, true},
{record_name, motd},
{attributes, record_info(fields, motd)}]),
mnesia:transform_table(motd, ignore, Fields),
F1 = fun() ->
mnesia:write_lock_table(mod_announce_tmp_table),
mnesia:foldl(
fun(#motd{server = _} = R, _) ->
mnesia:dirty_write(
mod_announce_tmp_table,
R#motd{server = Host})
end, ok, motd)
end,
mnesia:transaction(F1),
mnesia:clear_table(motd),
F2 = fun() ->
mnesia:write_lock_table(motd),
mnesia:foldl(
fun(R, _) ->
mnesia:dirty_write(R)
end, ok, mod_announce_tmp_table)
end,
mnesia:transaction(F2),
mnesia:delete_table(mod_announce_tmp_table);
_ ->
?INFO_MSG("Recreating motd table", []),
mnesia:transform_table(motd, ignore, Fields)
end.
update_motd_users_table() ->
Fields = record_info(fields, motd_users),
case mnesia:table_info(motd_users, attributes) of
Fields ->
ok;
[luser, dummy] ->
?INFO_MSG("Converting motd_users table from "
"{luser, dummy} format", []),
Host = ?MYNAME,
{atomic, ok} = mnesia:create_table(
mod_announce_tmp_table,
[{disc_only_copies, [node()]},
{type, bag},
{local_content, true},
{record_name, motd_users},
{attributes, record_info(fields, motd_users)}]),
mnesia:transform_table(motd_users, ignore, Fields),
F1 = fun() ->
mnesia:write_lock_table(mod_announce_tmp_table),
mnesia:foldl(
fun(#motd_users{us = U} = R, _) ->
mnesia:dirty_write(
mod_announce_tmp_table,
R#motd_users{us = {U, Host}})
end, ok, motd_users)
end,
mnesia:transaction(F1),
mnesia:clear_table(motd_users),
F2 = fun() ->
mnesia:write_lock_table(motd_users),
mnesia:foldl(
fun(R, _) ->
mnesia:dirty_write(R)
end, ok, mod_announce_tmp_table)
end,
mnesia:transaction(F2),
mnesia:delete_table(mod_announce_tmp_table);
_ ->
?INFO_MSG("Recreating motd_users table", []),
mnesia:transform_table(motd_users, ignore, Fields)
end.
ejabberd-2.1.11/src/stringprep/ 0000775 0000000 0000000 00000000000 12240452476 013214 5 ustar ejabberd-2.1.11/src/stringprep/uni_parse.tcl 0000664 0000000 0000000 00000023726 12240230175 015705 0 ustar # uni_parse.tcl --
#
# This program parses the UnicodeData file and generates the
# corresponding uni_data.c file with compressed character
# data tables. The input to this program should be rfc3454.txt
#
# Copyright (c) 1998-1999 by Scriptics Corporation.
# All rights reserved.
#
# Modified for ejabberd by Alexey Shchepin
#
# RCS: @(#) $Id$
namespace eval uni {
set shift 8; # number of bits of data within a page
# This value can be adjusted to find the
# best split to minimize table size
variable pMap; # map from page to page index, each entry is
# an index into the pages table, indexed by
# page number
variable pages; # map from page index to page info, each
# entry is a list of indices into the groups
# table, the list is indexed by the offset
variable groups; # list of character info values, indexed by
# group number, initialized with the
# unassigned character group
}
proc uni::getValue {i} {
variable casemap
variable casemap2
variable tablemap
if {[info exists tablemap($i)]} {
set tables $tablemap($i)
} else {
set tables {}
}
if {[info exists casemap2($i)]} {
set multicase 1
set delta $casemap2($i)
} else {
set multicase 0
if {[info exists casemap($i)]} {
set delta $casemap($i)
} else {
set delta 0
}
}
if {abs($delta) > 0xFFFFF} {
puts "delta must be less than 22 bits wide"
exit
}
set ac 0
set c11 0
set c21 0
set b1 0
set d1 0
set d2 0
set xnp 0
foreach tab $tables {
switch -glob -- $tab {
C.1.1 {set c11 1}
C.2.1 {set c21 1}
C.* {set ac 1}
A.1 {set ac 1}
B.1 {set b1 1}
D.1 {set d1 1}
D.2 {set d2 1}
XNP {set xnp 1}
}
}
set val [expr {($ac << 0) |
($c11 << 1) |
($c21 << 2) |
($b1 << 3) |
($d1 << 4) |
($d2 << 5) |
($xnp << 6) |
($multicase << 7) |
($delta << 11)}]
return $val
}
proc uni::getGroup {value} {
variable groups
set gIndex [lsearch -exact $groups $value]
if {$gIndex == -1} {
set gIndex [llength $groups]
lappend groups $value
}
return $gIndex
}
proc uni::addPage {info} {
variable pMap
variable pages
variable pages_map
if {[info exists pages_map($info)]} {
lappend pMap $pages_map($info)
} else {
set pIndex [llength $pages]
lappend pages $info
set pages_map($info) $pIndex
lappend pMap $pIndex
}
return
}
proc uni::load_tables {data} {
variable casemap
variable casemap2
variable multicasemap
variable tablemap
set multicasemap {}
set table ""
foreach line [split $data \n] {
if {$table == ""} {
if {[regexp { ----- Start Table (.*) -----} $line temp table]} {
#puts "Start table '$table'"
}
} else {
if {[regexp { ----- End Table (.*) -----} $line temp table1]} {
set table ""
} else {
if {$table == "B.1"} {
if {[regexp {^ ([[:xdigit:]]+); ;} $line \
temp val]} {
scan $val %x val
if {$val <= 0x10ffff} {
lappend tablemap($val) $table
}
}
} elseif {$table == "B.2"} {
if {[regexp {^ ([[:xdigit:]]+); ([[:xdigit:]]+);} $line \
temp from to]} {
scan $from %x from
scan $to %x to
if {$from <= 0x10ffff && $to <= 0x10ffff} {
set casemap($from) [expr {$to - $from}]
}
} elseif {[regexp {^ ([[:xdigit:]]+); ([[:xdigit:]]+) ([[:xdigit:]]+);} $line \
temp from to1 to2]} {
scan $from %x from
scan $to1 %x to1
scan $to2 %x to2
if {$from <= 0x10ffff && \
$to1 <= 0x10ffff && $to2 <= 0x10ffff} {
set casemap2($from) [llength $multicasemap]
lappend multicasemap [list $to1 $to2]
}
} elseif {[regexp {^ ([[:xdigit:]]+); ([[:xdigit:]]+) ([[:xdigit:]]+) ([[:xdigit:]]+);} $line \
temp from to1 to2 to3]} {
scan $from %x from
scan $to1 %x to1
scan $to2 %x to2
scan $to3 %x to3
if {$from <= 0x10ffff && \
$to1 <= 0x10ffff && $to2 <= 0x10ffff && \
$to3 <= 0x10ffff} {
set casemap2($from) [llength $multicasemap]
lappend multicasemap [list $to1 $to2 $to3]
}
} else {
#puts "missed: $line"
}
} elseif {$table != "B.3"} {
if {[regexp {^ ([[:xdigit:]]+)-([[:xdigit:]]+)} $line \
temp from to]} {
scan $from %x from
scan $to %x to
for {set i $from} {$i <= $to && $i <= 0x10ffff} {incr i} {
lappend tablemap($i) $table
}
} elseif {[regexp {^ ([[:xdigit:]]+)} $line \
temp val]} {
scan $val %x val
if {$val <= 0x10ffff} {
lappend tablemap($val) $table
}
}
}
}
}
}
# XMPP nodeprep prohibited
foreach val {22 26 27 2f 3a 3c 3e 40} {
scan $val %x val
lappend tablemap($val) XNP
}
}
proc uni::buildTables {} {
variable shift
variable casemap
variable tablemap
variable pMap {}
variable pages {}
variable groups {}
set info {} ;# temporary page info
set mask [expr {(1 << $shift) - 1}]
set next 0
for {set i 0} {$i <= 0x10ffff} {incr i} {
set gIndex [getGroup [getValue $i]]
# Split character index into offset and page number
set offset [expr {$i & $mask}]
set page [expr {($i >> $shift)}]
# Add the group index to the info for the current page
lappend info $gIndex
# If this is the last entry in the page, add the page
if {$offset == $mask} {
addPage $info
set info {}
}
}
return
}
proc uni::main {} {
global argc argv0 argv
variable pMap
variable pages
variable groups
variable shift
variable multicasemap
if {$argc != 2} {
puts stderr "\nusage: $argv0 \n"
exit 1
}
set f [open [lindex $argv 0] r]
set data [read $f]
close $f
load_tables $data
buildTables
puts "X = [llength $pMap] Y= [llength $pages] A= [llength $groups]"
set size [expr {[llength $pMap] + [llength $pages]*(1<<$shift)}]
puts "shift = $shift, space = $size"
set f [open [file join [lindex $argv 1] uni_data.c] w]
fconfigure $f -translation lf
puts $f "/*
* uni_data.c --
*
* Declarations of Unicode character information tables. This file is
* automatically generated by the uni_parse.tcl script. Do not
* modify this file by hand.
*
* Copyright (c) 1998 by Scriptics Corporation.
* All rights reserved.
*
* Modified for ejabberd by Alexey Shchepin
*
* RCS: @(#) \$Id\$
*/
/*
* A 16-bit Unicode character is split into two parts in order to index
* into the following tables. The lower OFFSET_BITS comprise an offset
* into a page of characters. The upper bits comprise the page number.
*/
#define OFFSET_BITS $shift
/*
* The pageMap is indexed by page number and returns an alternate page number
* that identifies a unique page of characters. Many Unicode characters map
* to the same alternate page number.
*/
static unsigned char pageMap\[\] = {"
set line " "
set last [expr {[llength $pMap] - 1}]
for {set i 0} {$i <= $last} {incr i} {
append line [lindex $pMap $i]
if {$i != $last} {
append line ", "
}
if {[string length $line] > 70} {
puts $f $line
set line " "
}
}
puts $f $line
puts $f "};
/*
* The groupMap is indexed by combining the alternate page number with
* the page offset and returns a group number that identifies a unique
* set of character attributes.
*/
static unsigned short int groupMap\[\] = {"
set line " "
set lasti [expr {[llength $pages] - 1}]
for {set i 0} {$i <= $lasti} {incr i} {
set page [lindex $pages $i]
set lastj [expr {[llength $page] - 1}]
for {set j 0} {$j <= $lastj} {incr j} {
append line [lindex $page $j]
if {$j != $lastj || $i != $lasti} {
append line ", "
}
if {[string length $line] > 70} {
puts $f $line
set line " "
}
}
}
puts $f $line
puts $f "};
/*
* Each group represents a unique set of character attributes. The attributes
* are encoded into a 32-bit value as follows:
*
* Bit 0 A.1 | C.1.2 | C.2.2 | C.3 -- C.9
*
* Bit 1 C.1.1
*
* Bit 2 C.2.1
*
* Bit 3 B.1
*
* Bit 4 D.1
*
* Bit 5 D.2
*
* Bit 6 XNP
*
* Bit 7 Case maps to several characters
*
* Bits 8-10 Reserved for future use.
*
* Bits 11-31 Case delta: delta for case conversions. This should be the
* highest field so we can easily sign extend.
*/
static int groups\[\] = {"
set line " "
set last [expr {[llength $groups] - 1}]
for {set i 0} {$i <= $last} {incr i} {
set val [lindex $groups $i]
append line [format "%d" $val]
if {$i != $last} {
append line ", "
}
if {[string length $line] > 65} {
puts $f $line
set line " "
}
}
puts $f $line
puts $f "};
/*
* Table for characters that lowercased to multiple ones
*/
static int multiCaseTable\[\]\[4\] = {"
set last [expr {[llength $multicasemap] - 1}]
for {set i 0} {$i <= $last} {incr i} {
set val [lindex $multicasemap $i]
set line " "
append line [format "{%d, %s}" [llength $val] [join $val ", "]]
if {$i != $last} {
append line ", "
}
puts $f $line
}
puts $f "};
/*
* The following constants are used to determine the category of a
* Unicode character.
*/
#define ACMask (1 << 0)
#define C11Mask (1 << 1)
#define C21Mask (1 << 2)
#define B1Mask (1 << 3)
#define D1Mask (1 << 4)
#define D2Mask (1 << 5)
#define XNPMask (1 << 6)
#define MCMask (1 << 7)
/*
* The following macros extract the fields of the character info. The
* GetDelta() macro is complicated because we can't rely on the C compiler
* to do sign extension on right shifts.
*/
#define GetCaseType(info) (((info) & 0xE0) >> 5)
#define GetCategory(info) ((info) & 0x1F)
#define GetDelta(info) (((info) > 0) ? ((info) >> 11) : (~(~((info)) >> 11)))
#define GetMC(info) (multiCaseTable\[GetDelta(info)\])
/*
* This macro extracts the information about a character from the
* Unicode character tables.
*/
#define GetUniCharInfo(ch) (groups\[groupMap\[(pageMap\[(((int)(ch)) & 0x1fffff) >> OFFSET_BITS\] << OFFSET_BITS) | ((ch) & ((1 << OFFSET_BITS)-1))\]\])
"
close $f
}
uni::main
return
ejabberd-2.1.11/src/stringprep/uni_norm.c 0000664 0000000 0000000 00000641121 12240230175 015201 0 ustar /*
* uni_norm.c --
*
* Declarations of Unicode character information tables. This file is
* automatically generated by the uni_parse2.tcl script. Do not
* modify this file by hand.
*
* Copyright (c) 1998 by Scriptics Corporation.
* All rights reserved.
*
* Modified for ejabberd by Alexey Shchepin
*
* RCS: @(#) $Id$
*/
/*
* A 16-bit Unicode character is split into two parts in order to index
* into the following tables. The lower CCLASS_OFFSET_BITS comprise an offset
* into a page of characters. The upper bits comprise the page number.
*/
#define CCLASS_OFFSET_BITS 8
/*
* The pageMap is indexed by page number and returns an alternate page number
* that identifies a unique page of characters. Many Unicode characters map
* to the same alternate page number.
*/
static unsigned char cclassPageMap[] = {
0, 0, 0, 1, 2, 3, 4, 5, 0, 6, 7, 8, 9, 10, 11, 12, 13, 0, 0, 0, 0,
0, 0, 14, 15, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 18, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};
/*
* The cclassGroupMap is indexed by combining the alternate page number with
* the page offset and returns a combining class number.
*/
static unsigned char cclassGroupMap[] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230,
230, 230, 230, 230, 230, 230, 230, 230, 230, 232, 220, 220, 220, 220,
232, 216, 220, 220, 220, 220, 220, 202, 202, 220, 220, 220, 220, 202,
202, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 1, 1, 1,
1, 1, 220, 220, 220, 220, 230, 230, 230, 230, 230, 230, 230, 230, 240,
230, 220, 220, 220, 230, 230, 230, 220, 220, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 234, 234, 233, 230, 230, 230, 230, 230,
230, 230, 230, 230, 230, 230, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 230, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 230, 230, 230, 230, 220, 230, 230,
230, 222, 220, 230, 230, 230, 230, 230, 230, 0, 220, 220, 220, 220,
220, 230, 230, 220, 230, 230, 222, 228, 230, 10, 11, 12, 13, 14, 15,
16, 17, 18, 19, 0, 20, 21, 22, 0, 23, 0, 24, 25, 0, 230, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 28, 29, 30, 31, 32,
33, 34, 230, 230, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230,
230, 230, 230, 230, 230, 230, 0, 0, 230, 230, 230, 230, 220, 230, 0,
0, 230, 230, 0, 220, 230, 230, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 220, 230, 230, 220, 230, 230, 220,
220, 220, 230, 220, 220, 230, 220, 230, 230, 230, 220, 230, 220, 230,
220, 230, 220, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 230, 220, 230,
230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 84, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 103, 103, 9, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 107, 107, 107, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 118, 118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 122, 122, 122, 122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 220, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 220, 0, 220, 0, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 130, 0, 132,
0, 0, 0, 0, 0, 130, 130, 130, 130, 0, 0, 130, 0, 230, 230, 9, 0, 230,
230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 9, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 1,
1, 230, 230, 230, 230, 1, 1, 1, 230, 230, 0, 0, 0, 0, 230, 0, 0, 0,
1, 1, 230, 220, 230, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 218, 228, 232, 222, 224, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 230, 230, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 216, 216, 1, 1, 1, 0, 0, 0, 226, 216, 216,
216, 216, 216, 0, 0, 0, 0, 0, 0, 0, 0, 220, 220, 220, 220, 220, 220,
220, 220, 0, 0, 230, 230, 230, 230, 230, 220, 220, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 230, 230, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};
#define GetUniCharCClass(ch) (cclassGroupMap[(cclassPageMap[(((int)(ch)) & 0x1fffff) >> CCLASS_OFFSET_BITS] << CCLASS_OFFSET_BITS) | ((ch) & ((1 << CCLASS_OFFSET_BITS)-1))])
#define DECOMP_OFFSET_BITS 8
/*
* The pageMap is indexed by page number and returns an alternate page number
* that identifies a unique page of characters. Many Unicode characters map
* to the same alternate page number.
*/
static unsigned char decompPageMap[] = {
0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 9, 10, 11, 12, 13, 14, 15, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 16, 17, 18, 19, 20, 21, 22, 7, 7, 7, 7,
7, 23, 7, 7, 7, 24, 25, 26, 27, 28, 29, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 30, 31, 32, 33, 34, 35, 36, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 37, 7, 7, 38, 39, 40,
41, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 42, 43, 44, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7
};
/*
* The decompGroupMap is indexed by combining the alternate page number with
* the page offset and returns a group number that identifies a length and
* shift of decomposition sequence in decompList
*/
static int decompGroupMap[] = {
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, 65536, -1, -1, -1, -1, -1, -1, -1, 131073,
-1, 65539, -1, -1, -1, -1, 131076, -1, -1, 65542, 65543, 131080, 65546,
-1, -1, 131083, 65549, 65550, -1, 196623, 196626, 196629, -1, 131096,
131098, 131100, 131102, 131104, 131106, -1, 131108, 131110, 131112,
131114, 131116, 131118, 131120, 131122, 131124, -1, 131126, 131128,
131130, 131132, 131134, 131136, -1, -1, 131138, 131140, 131142, 131144,
131146, -1, -1, 131148, 131150, 131152, 131154, 131156, 131158, -1,
131160, 131162, 131164, 131166, 131168, 131170, 131172, 131174, 131176,
-1, 131178, 131180, 131182, 131184, 131186, 131188, -1, -1, 131190,
131192, 131194, 131196, 131198, -1, 131200, 131202, 131204, 131206,
131208, 131210, 131212, 131214, 131216, 131218, 131220, 131222, 131224,
131226, 131228, 131230, 131232, -1, -1, 131234, 131236, 131238, 131240,
131242, 131244, 131246, 131248, 131250, 131252, 131254, 131256, 131258,
131260, 131262, 131264, 131266, 131268, 131270, 131272, -1, -1, 131274,
131276, 131278, 131280, 131282, 131284, 131286, 131288, 131290, -1,
131292, 131294, 131296, 131298, 131300, 131302, -1, 131304, 131306,
131308, 131310, 131312, 131314, 131316, 131318, -1, -1, 131320, 131322,
131324, 131326, 131328, 131330, 131332, -1, -1, 131334, 131336, 131338,
131340, 131342, 131344, -1, -1, 131346, 131348, 131350, 131352, 131354,
131356, 131358, 131360, 131362, 131364, 131366, 131368, 131370, 131372,
131374, 131376, 131378, 131380, -1, -1, 131382, 131384, 131386, 131388,
131390, 131392, 131394, 131396, 131398, 131400, 131402, 131404, 131406,
131408, 131410, 131412, 131414, 131416, 131418, 131420, 131422, 131424,
131426, 65892, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, 131429, 131431, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, 131433, 131435, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, 196973, 196976, 196979, 131446, 131448,
131450, 131452, 131454, 131456, 131458, 131460, 131462, 131464, 131466,
131468, 131470, 131472, 197010, 197013, 197016, 197019, 197022, 197025,
197028, 197031, -1, 197034, 197037, 197040, 197043, 131510, 131512,
-1, -1, 131514, 131516, 131518, 131520, 131522, 131524, 197062, 197065,
131532, 131534, 131536, 131538, 131540, 131542, 131544, 131546, -1,
-1, 131548, 131550, 197088, 197091, 131558, 131560, 131562, 131564,
131566, 131568, 131570, 131572, 131574, 131576, 131578, 131580, 131582,
131584, 131586, 131588, 131590, 131592, 131594, 131596, 131598, 131600,
131602, 131604, 131606, 131608, 131610, 131612, 131614, 131616, 131618,
131620, -1, -1, 131622, 131624, -1, -1, -1, -1, -1, -1, 131626, 131628,
131630, 131632, 197170, 197173, 197176, 197179, 131646, 131648, 197186,
197189, 131656, 131658, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 66124, 66125, 66126, 66127,
66128, 66129, 66130, 66131, 66132, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, 131669, 131671, 131673, 131675, 131677, 131679,
-1, -1, 66145, 66146, 65892, 66147, 66148, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
66149, 66150, -1, 66151, 131688, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, 66154, -1, -1, -1, -1, -1, 131691, -1, -1, -1, 66157,
-1, -1, -1, -1, -1, 131080, 197230, 131697, 66163, 131700, 131702,
131704, -1, 131706, -1, 131708, 131710, 197248, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, 131715, 131717, 131719, 131721, 131723, 131725, 197263,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, 131730, 131732, 131734, 131736, 131738,
-1, 66204, 66205, 66206, 131708, 131717, 66207, 66208, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, 66209, 66210, 66211, -1, 66212, 66213, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, 131750, 131752, -1, 131754, -1, -1,
-1, 131756, -1, -1, -1, -1, 131758, 131760, 131762, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, 131764, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, 131766, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 131768, 131770, -1,
131772, -1, -1, -1, 131774, -1, -1, -1, -1, 131776, 131778, 131780,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, 131782, 131784, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 131786,
131788, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 131790,
131792, 131794, 131796, -1, -1, 131798, 131800, -1, -1, 131802, 131804,
131806, 131808, 131810, 131812, -1, -1, 131814, 131816, 131818, 131820,
131822, 131824, -1, -1, 131826, 131828, 131830, 131832, 131834, 131836,
131838, 131840, 131842, 131844, 131846, 131848, -1, -1, 131850, 131852,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, 131854, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, 131856, 131858, 131860, 131862, 131864,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 131866, 131868, 131870, 131872,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, 131874, -1, 131876, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, 131878, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 131880, -1, -1, -1, -1, -1,
-1, -1, 131882, -1, -1, 131884, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, 131886, 131888, 131890, 131892,
131894, 131896, 131898, 131900, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 131902, 131904,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 131906,
131908, -1, 131910, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, 131912, -1, -1, 131914, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, 131916, 131918, 131920, -1, -1,
131922, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 131924, -1,
-1, 131926, 131928, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, 131930, 131932, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 131934, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 131936, 131938,
131940, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, 131942, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, 131944, -1, -1, -1, -1, -1, -1, 131946,
131948, -1, 131950, 197488, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 131955, 131957,
131959, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, 131961, -1, 131963, 197501, 131968, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 131970,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, 131972, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 131974,
131976, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 66442, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, 131979, -1, -1, -1, -1, -1, -1, -1, -1, -1, 131981, -1, -1,
-1, -1, 131983, -1, -1, -1, -1, 131985, -1, -1, -1, -1, 131987, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 131989, -1, -1, -1, -1,
-1, -1, -1, -1, -1, 131991, -1, 131993, 131995, 197533, 132000, 197538,
-1, -1, -1, -1, -1, -1, -1, 132005, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, 132007, -1, -1, -1, -1, -1, -1,
-1, -1, -1, 132009, -1, -1, -1, -1, 132011, -1, -1, -1, -1, 132013,
-1, -1, -1, -1, 132015, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, 132017, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, 132019, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, 132021, 132023, 132025, 132027, 132029,
132031, 132033, 132035, 197573, 197576, 132043, 132045, 132047, 132049,
132051, 132053, 132055, 132057, 132059, 132061, 197599, 197602, 197605,
197608, 132075, 132077, 132079, 132081, 197619, 197622, 132089, 132091,
132093, 132095, 132097, 132099, 132101, 132103, 132105, 132107, 132109,
132111, 132113, 132115, 132117, 132119, 197657, 197660, 132127, 132129,
132131, 132133, 132135, 132137, 132139, 132141, 197679, 197682, 132149,
132151, 132153, 132155, 132157, 132159, 132161, 132163, 132165, 132167,
132169, 132171, 132173, 132175, 132177, 132179, 132181, 132183, 197721,
197724, 197727, 197730, 197733, 197736, 197739, 197742, 132209, 132211,
132213, 132215, 132217, 132219, 132221, 132223, 197761, 197764, 132231,
132233, 132235, 132237, 132239, 132241, 197779, 197782, 197785, 197788,
197791, 197794, 132261, 132263, 132265, 132267, 132269, 132271, 132273,
132275, 132277, 132279, 132281, 132283, 132285, 132287, 197825, 197828,
197831, 197834, 132301, 132303, 132305, 132307, 132309, 132311, 132313,
132315, 132317, 132319, 132321, 132323, 132325, 132327, 132329, 132331,
132333, 132335, 132337, 132339, 132341, 132343, 132345, 132347, 132349,
132351, 132353, 132355, 132357, 132359, 132361, 132237, -1, -1, -1,
-1, 132363, 132365, 132367, 132369, 197907, 197910, 197913, 197916,
197919, 197922, 197925, 197928, 197931, 197934, 197937, 197940, 197943,
197946, 197949, 197952, 197955, 197958, 197961, 197964, 132431, 132433,
132435, 132437, 132439, 132441, 197979, 197982, 197985, 197988, 197991,
197994, 197997, 198000, 198003, 198006, 132473, 132475, 132477, 132479,
132481, 132483, 132485, 132487, 198025, 198028, 198031, 198034, 198037,
198040, 198043, 198046, 198049, 198052, 198055, 198058, 198061, 198064,
198067, 198070, 198073, 198076, 198079, 198082, 132549, 132551, 132553,
132555, 198093, 198096, 198099, 198102, 198105, 198108, 198111, 198114,
198117, 198120, 132587, 132589, 132591, 132593, 132595, 132597, 132599,
132601, -1, -1, -1, -1, -1, -1, 132603, 132605, 198143, 198146, 198149,
198152, 198155, 198158, 132625, 132627, 198165, 198168, 198171, 198174,
198177, 198180, 132647, 132649, 198187, 198190, 198193, 198196, -1,
-1, 132663, 132665, 198203, 198206, 198209, 198212, -1, -1, 132679,
132681, 198219, 198222, 198225, 198228, 198231, 198234, 132701, 132703,
198241, 198244, 198247, 198250, 198253, 198256, 132723, 132725, 198263,
198266, 198269, 198272, 198275, 198278, 132745, 132747, 198285, 198288,
198291, 198294, 198297, 198300, 132767, 132769, 198307, 198310, 198313,
198316, -1, -1, 132783, 132785, 198323, 198326, 198329, 198332, -1,
-1, 132799, 132801, 198339, 198342, 198345, 198348, 198351, 198354,
-1, 132821, -1, 198359, -1, 198362, -1, 198365, 132832, 132834, 198372,
198375, 198378, 198381, 198384, 198387, 132854, 132856, 198394, 198397,
198400, 198403, 198406, 198409, 132876, 131719, 132878, 131721, 132880,
131723, 132882, 131725, 132884, 131734, 132886, 131736, 132888, 131738,
-1, -1, 198426, 198429, 263968, 263972, 263976, 263980, 263984, 263988,
198456, 198459, 263998, 264002, 264006, 264010, 264014, 264018, 198486,
198489, 264028, 264032, 264036, 264040, 264044, 264048, 198516, 198519,
264058, 264062, 264066, 264070, 264074, 264078, 198546, 198549, 264088,
264092, 264096, 264100, 264104, 264108, 198576, 198579, 264118, 264122,
264126, 264130, 264134, 264138, 133070, 133072, 198610, 133077, 198615,
-1, 133082, 198620, 133087, 133089, 133091, 131697, 133093, 133095,
67561, 133095, 133098, 198636, 198639, 133106, 198644, -1, 133111,
198649, 133116, 131700, 133118, 131702, 133120, 198658, 198661, 198664,
133131, 133133, 198671, 197248, -1, -1, 133138, 198676, 133143, 133145,
133147, 131704, -1, 198685, 198688, 198691, 133158, 133160, 198698,
197263, 133165, 133167, 133169, 198707, 133174, 133176, 133178, 131708,
133180, 198718, 197230, 67649, -1, -1, 198722, 133189, 198727, -1,
133194, 198732, 133199, 131706, 133201, 131710, 133203, 131080, 133205,
-1, 65536, 65536, 65536, 65536, 65536, 65536, 65536, 65536, 65536,
65536, 65536, -1, -1, -1, -1, -1, -1, 67671, -1, -1, -1, -1, -1, 133208,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 67674, 133211, 198749,
-1, -1, -1, -1, -1, -1, -1, -1, 65536, -1, -1, -1, 133216, 198754,
-1, 133221, 198759, -1, -1, -1, -1, 133226, -1, 133228, -1, -1, -1,
-1, -1, -1, -1, -1, 133230, 133232, 133234, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, 264308, -1, -1, -1, -1, -1, -1, -1, 65536,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 67704,
67705, -1, -1, 67706, 67707, 67708, 67709, 67710, 67711, 67712, 67713,
67714, 67715, 67716, 67717, 67704, 65549, 65542, 65543, 67706, 67707,
67708, 67709, 67710, 67711, 67712, 67713, 67714, 67715, 67716, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, 133254, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 198792, 198795, 67726,
133263, -1, 198801, 198804, 67735, -1, 133272, 67738, 67739, 67739,
67739, 66124, 67740, 67741, 67741, 67742, 66146, -1, 67743, 133280,
-1, -1, 67746, 67747, 67748, 67748, 67748, -1, -1, 133285, 198823,
133290, -1, 67756, -1, 67757, -1, 67756, -1, 67758, 131106, 67759,
67726, -1, 67760, 67761, 67762, -1, 67763, 65550, 67764, 67765, 67766,
67767, 67705, -1, -1, -1, 67768, 67769, 67770, 67771, -1, -1, -1, -1,
67772, 67773, 67760, 67705, 66126, -1, -1, -1, -1, -1, -1, -1, -1,
-1, 198846, 198849, 198852, 198855, 198858, 198861, 198864, 198867,
198870, 198873, 198876, 198879, 133346, 67741, 133348, 198886, 133353,
67819, 133356, 198894, 264433, 133365, 67831, 133368, 198906, 67742,
67726, 67772, 67763, 67705, 133373, 198911, 133378, 67844, 133381,
198919, 264458, 133390, 66147, 133392, 198930, 66146, 67861, 67773,
67862, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 133399, 133401, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 133403,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 133405, 133407,
133409, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, 133411, -1, -1, -1, -1, 133413, -1, -1, 133415, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, 133417, -1, 133419, -1, -1, -1, -1, -1, 133421, 198959,
-1, 133426, 198964, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, 133431, -1, -1, 133433, -1, -1, 133435, -1, 133437,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, 133439, -1, 133441, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, 133443, 133445, 133447, 133449, 133451, -1, -1, 133453,
133455, -1, -1, 133457, 133459, -1, -1, -1, -1, -1, -1, 133461, 133463,
-1, -1, 133465, 133467, -1, -1, 133469, 133471, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 133473, 133475, 133477,
133479, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 133481,
133483, 133485, 133487, -1, -1, -1, -1, -1, -1, 133489, 133491, 133493,
133495, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 67961, 67962, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 65549,
65542, 65543, 67706, 67707, 67708, 67709, 67710, 67711, 133499, 133501,
133503, 133505, 133507, 133509, 133511, 133513, 133515, 133517, 133519,
199057, 199060, 199063, 199066, 199069, 199072, 199075, 199078, 199081,
264620, 264624, 264628, 264632, 264636, 264640, 264644, 264648, 264652,
264656, 264660, 133592, 133594, 133596, 133598, 133600, 133602, 133604,
133606, 133608, 199146, 199149, 199152, 199155, 199158, 199161, 199164,
199167, 199170, 199173, 199176, 199179, 199182, 199185, 199188, 199191,
199194, 199197, 199200, 199203, 199206, 199209, 199212, 199215, 199218,
199221, 199224, 199227, 199230, 199233, 199236, 199239, 199242, 199245,
199248, 199251, 199254, 68185, 67759, 67726, 67772, 67761, 67762, 68186,
67739, 67741, 68187, 67758, 67742, 67763, 67743, 68188, 67746, 67747,
67748, 68189, 68190, 68191, 67819, 68192, 67831, 68193, 67756, 65539,
68194, 67861, 67773, 67760, 68195, 67738, 66124, 67705, 66126, 68196,
66146, 67862, 67717, 65550, 68197, 68198, 66127, 65892, 68199, 68200,
67844, 66131, 66147, 66132, 68201, 67704, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, 264810, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 199278, 133745, 199283,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 133750,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, 68216, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, 68217, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, 68218, 68219, 68220, 68221, 68222, 68223, 68224, 68225,
68226, 68227, 68228, 68229, 68230, 68231, 68232, 68233, 68234, 68235,
68236, 68237, 68238, 68239, 68240, 68241, 68242, 68243, 68244, 68245,
68246, 68247, 68248, 68249, 68250, 68251, 68252, 68253, 68254, 68255,
68256, 68257, 68258, 68259, 68260, 68261, 68262, 68263, 68264, 68265,
68266, 68267, 68268, 68269, 68270, 68271, 68272, 68273, 68274, 68275,
68276, 68277, 68278, 68279, 68280, 68281, 68282, 68283, 68284, 68285,
68286, 68287, 68288, 68289, 68290, 68291, 68292, 68293, 68294, 68295,
68296, 68297, 68298, 68299, 68300, 68301, 68302, 68303, 68304, 68305,
68306, 68307, 68308, 68309, 68310, 68311, 68312, 68313, 68314, 68315,
68316, 68317, 68318, 68319, 68320, 68321, 68322, 68323, 68324, 68325,
68326, 68327, 68328, 68329, 68330, 68331, 68332, 68333, 68334, 68335,
68336, 68337, 68338, 68339, 68340, 68341, 68342, 68343, 68344, 68345,
68346, 68347, 68348, 68349, 68350, 68351, 68352, 68353, 68354, 68355,
68356, 68357, 68358, 68359, 68360, 68361, 68362, 68363, 68364, 68365,
68366, 68367, 68368, 68369, 68370, 68371, 68372, 68373, 68374, 68375,
68376, 68377, 68378, 68379, 68380, 68381, 68382, 68383, 68384, 68385,
68386, 68387, 68388, 68389, 68390, 68391, 68392, 68393, 68394, 68395,
68396, 68397, 68398, 68399, 68400, 68401, 68402, 68403, 68404, 68405,
68406, 68407, 68408, 68409, 68410, 68411, 68412, 68413, 68414, 68415,
68416, 68417, 68418, 68419, 68420, 68421, 68422, 68423, 68424, 68425,
68426, 68427, 68428, 68429, 68430, 68431, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, 65536, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, 68432, -1, 68241, 68433, 68434, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 133971, -1, 133973,
-1, 133975, -1, 133977, -1, 133979, -1, 133981, -1, 133983, -1, 133985,
-1, 133987, -1, 133989, -1, 133991, -1, 133993, -1, -1, 133995, -1,
133997, -1, 133999, -1, -1, -1, -1, -1, -1, 134001, 134003, -1, 134005,
134007, -1, 134009, 134011, -1, 134013, 134015, -1, 134017, 134019,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, 134021, -1, -1, -1, -1, -1, -1, 134023, 134025,
-1, 134027, 134029, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
134031, -1, 134033, -1, 134035, -1, 134037, -1, 134039, -1, 134041,
-1, 134043, -1, 134045, -1, 134047, -1, 134049, -1, 134051, -1, 134053,
-1, -1, 134055, -1, 134057, -1, 134059, -1, -1, -1, -1, -1, -1, 134061,
134063, -1, 134065, 134067, -1, 134069, 134071, -1, 134073, 134075,
-1, 134077, 134079, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 134081, -1, -1, 134083, 134085,
134087, 134089, -1, -1, -1, 134091, 134093, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, 68559, 68560, 68561, 68562, 68563,
68564, 68565, 68566, 68567, 68568, 68569, 68570, 68571, 68572, 68573,
68574, 68575, 68576, 68577, 68578, 68579, 68580, 68581, 68582, 68583,
68584, 68585, 68586, 68587, 68588, 68589, 68590, 68591, 68592, 68593,
68594, 68595, 68596, 68597, 68598, 68599, 68600, 68601, 68602, 68603,
68604, 68605, 68606, 68607, 68608, 68609, 68610, 68611, 68612, 68613,
68614, 68615, 68616, 68617, 68618, 68619, 68620, 68621, 68622, 68623,
68624, 68625, 68626, 68627, 68628, 68629, 68630, 68631, 68632, 68633,
68634, 68635, 68636, 68637, 68638, 68639, 68640, 68641, 68642, 68643,
68644, 68645, 68646, 68647, 68648, 68649, 68650, 68651, 68652, -1,
-1, -1, 68218, 68224, 68653, 68654, 68655, 68656, 68657, 68658, 68222,
68659, 68660, 68661, 68662, 68226, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, 199735, 199738, 199741, 199744, 199747, 199750, 199753,
199756, 199759, 199762, 199765, 199768, 199771, 199774, 265313, 265317,
265321, 265325, 265329, 265333, 265337, 265341, 265345, 265349, 265353,
265357, 265361, 265365, 265369, -1, -1, -1, 199837, 199840, 199843,
199846, 199849, 199852, 199855, 199858, 199861, 199864, 199867, 199870,
199873, 199876, 199879, 199882, 199885, 199888, 199891, 199894, 199897,
199900, 199903, 199906, 199909, 199912, 199915, 199918, 199921, 199924,
199927, 199930, 199933, 199936, 199939, 199942, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, 134409, 134411, 134413, 134415, 134417,
134419, 134421, 134423, 134425, 134427, 134429, 134431, 134433, 134435,
134437, 68559, 68562, 68565, 68567, 68575, 68576, 68579, 68581, 68582,
68584, 68585, 68586, 68587, 68588, 134439, 134441, 134443, 134445,
134447, 134449, 134451, 134453, 134455, 134457, 134459, 134461, 134463,
134465, -1, -1, -1, -1, 68218, 68224, 68653, 68654, 68931, 68932, 68933,
68229, 68934, 68241, 68291, 68303, 68302, 68292, 68384, 68249, 68289,
68935, 68936, 68937, 68938, 68939, 68940, 68941, 68942, 68943, 68944,
68255, 68945, 68946, 68947, 68948, 68949, 68950, 68951, 68952, 68655,
68656, 68657, 68953, 68954, 68955, 68956, 68957, 68958, 68959, 68960,
68961, 68962, 134499, 134501, 134503, 134505, 134507, 134509, 134511,
134513, 134515, 134517, 134519, 134521, 134523, 134525, 134527, 134529,
134531, 134533, 134535, 134537, 134539, 134541, 134543, 134545, 200083,
200086, 200089, -1, -1, -1, -1, 69020, 69021, 69022, 69023, 69024,
69025, 69026, 69027, 69028, 69029, 69030, 69031, 69032, 69033, 69034,
69035, 69036, 69037, 69038, 69039, 69040, 69041, 69042, 69043, 69044,
69045, 69046, 69047, 69048, 69049, 69050, 69051, 69052, 69053, 69054,
69055, 69056, 69057, 69058, 69059, 69060, 69061, 69062, 69063, 69064,
69065, 69066, -1, 331211, 265680, 331220, 200153, 331228, 200161, 200164,
396775, 265709, 200177, 200180, 200183, 265722, 265726, 265730, 265734,
265738, 265742, 265746, 396822, 134684, 396830, 396836, 331306, 265775,
396851, 396857, 265791, 200259, 200262, 265801, 265805, 331345, 331350,
200283, 200286, 265825, 200293, 200296, 134763, 134765, 200303, 200306,
396917, 265851, 331391, 396932, 265866, 200334, 200337, 396948, 265882,
396958, 200356, 331431, 200364, 265903, 200371, 265910, 331450, 265919,
331459, 265928, 134860, 331470, 200403, 200406, 265945, 200413, 200416,
200419, 331494, 265963, 134895, 397041, 200439, 331514, 265983, 265987,
200455, 200458, 265997, 134929, 266003, 331543, 134940, 397086, 200484,
134951, 134953, 134955, 134957, 134959, 134961, 134963, 134965, 134967,
134969, 200507, 200510, 200513, 200516, 200519, 200522, 200525, 200528,
200531, 200534, 200537, 200540, 200543, 200546, 200549, 200552, 135019,
135021, 200559, 135026, 135028, -1, -1, -1, -1, 135030, 135032, 135034,
135036, 266110, 135042, 135044, 135046, 135048, 135050, 135052, 135054,
135056, 200594, 266133, 135065, 135067, 135069, 135071, 135073, 135075,
135077, 200615, 200618, 200621, 200624, 135091, 135093, 135095, 135097,
135099, 135101, 135103, 135105, 135107, 135109, 200647, 200650, 135117,
200655, 200658, 200661, 135128, 200666, 200669, 266208, 135140, 200678,
200681, 200684, 200687, 331762, 397303, 135165, 135167, 135169, 135171,
135173, 135175, 135177, 135179, 135181, 135183, 135185, 135187, 135189,
135191, 135193, 135195, 135197, 135199, 266273, 135205, 135207, 135209,
266283, 200751, 135218, 135220, 135222, 135224, 135226, 135228, 135230,
135232, 135234, 135236, 200774, 135241, 135243, 200781, 200784, 135251,
266325, 200793, 135260, 135262, 135264, 135266, -1, -1, 135268, 135270,
135272, 135274, 135276, 135278, 135280, 135282, 135284, 200822, 200825,
200828, 200831, 200834, 200837, 200840, 200843, 200846, 200849, 200852,
200855, 200858, 200861, 200864, 200867, 200870, 200873, 200876, 200879,
200882, 200885, -1, 69816, 69817, 68376, 69818, 69819, 69820, 69821,
68430, 68430, 69822, 68384, 69823, 69824, 69825, 69826, 69827, 69828,
69829, 69830, 69831, 69832, 69833, 69834, 69835, 69836, 69837, 69838,
69839, 69840, 69841, 69842, 69843, 69844, 69845, 69846, 69847, 69848,
69849, 69850, 69851, 69852, 69853, 69854, 69855, 69856, 69857, 69858,
69859, 69860, 69861, 69862, 69863, 68342, 69864, 69865, 69866, 69867,
69868, 69869, 69870, 69871, 69872, 69873, 69874, 68415, 69875, 69876,
69877, 69878, 69879, 69880, 69881, 69882, 69883, 69884, 69885, 69886,
69887, 69888, 69889, 69890, 69891, 69892, 69893, 69894, 69895, 69896,
69897, 69898, 69899, 69900, 69901, 69832, 69902, 69903, 69904, 69905,
69906, 69907, 69908, 69909, 69910, 69911, 69912, 69913, 69914, 69915,
69916, 69917, 69918, 69919, 69920, 69921, 68378, 69922, 69923, 69924,
69925, 69926, 69927, 69928, 69929, 69930, 69931, 69932, 69933, 69934,
69935, 69936, 68255, 69937, 69938, 69939, 69940, 69941, 69942, 69943,
69944, 68236, 69945, 69946, 69947, 69948, 69949, 69950, 69951, 69952,
69953, 69954, 69955, 69956, 69957, 69958, 69959, 69960, 69961, 69962,
69963, 69964, 69965, 69966, 69920, 69967, 69968, 69969, 69970, 69971,
69972, 69973, 69974, 69904, 69975, 69976, 69977, 69978, 69979, 69980,
69981, 69982, 69983, 69984, 69985, 69986, 69987, 69988, 69989, 69990,
69991, 69992, 69993, 69994, 69832, 69995, 69996, 69997, 69998, 68429,
69999, 70000, 70001, 70002, 70003, 70004, 70005, 70006, 70007, 70008,
70009, 70010, 68932, 70011, 70012, 70013, 70014, 70015, 70016, 70017,
70018, 70019, 69906, 70020, 70021, 70022, 70023, 70024, 70025, 70026,
70027, 70028, 70029, 70030, 70031, 70032, 68383, 70033, 70034, 70035,
70036, 70037, 70038, 70039, 70040, 70041, 70042, 70043, 70044, 70045,
68334, 70046, 70047, 70048, 70049, 70050, 70051, 70052, 70053, 70054,
70055, 70056, 70057, 70058, 70059, 70060, 70061, 68361, 70062, 68364,
70063, 70064, 70065, -1, -1, 70066, -1, 70067, -1, -1, 70068, 70069,
70070, 70071, 70072, 70073, 70074, 70075, 70076, 68341, -1, 70077,
-1, 70078, -1, -1, 70079, 70080, -1, -1, -1, 70081, 70082, 70083, 70084,
-1, -1, 70085, 70086, 70087, 70088, 70089, 70090, 70091, 70092, 70093,
70094, 70095, 70096, 68262, 70097, 70098, 70099, 70100, 70101, 70102,
70103, 70104, 70105, 70106, 70107, 70108, 70109, 70110, 70111, 68937,
70112, 70113, 70114, 70115, 68941, 70116, 70117, 70118, 70119, 70120,
69956, 70121, 70122, 70123, 70124, 70125, 70126, 70126, 70127, 70128,
70129, 70130, 70131, 70132, 70133, 70134, 70079, 70135, 70136, 70137,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 135674, 135676,
135678, 201216, 201219, 135686, 135686, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, 135688, 135690, 135692, 135694, 135696, -1, -1,
-1, -1, -1, 135698, -1, 135700, 70166, 67764, 67767, 70167, 70168,
70169, 70170, 70171, 70172, 67712, 135709, 135711, 201249, 201252,
135719, 135721, 135723, 135725, 135727, 135729, 135731, 135733, 135735,
-1, 135737, 135739, 135741, 135743, 135745, -1, 135747, -1, 135749,
135751, -1, 135753, 135755, -1, 135757, 135759, 135761, 135763, 135765,
135767, 135769, 135771, 135773, 135775, 70241, 70241, 70242, 70242,
70242, 70242, 70243, 70243, 70243, 70243, 70244, 70244, 70244, 70244,
70245, 70245, 70245, 70245, 70246, 70246, 70246, 70246, 70247, 70247,
70247, 70247, 70248, 70248, 70248, 70248, 70249, 70249, 70249, 70249,
70250, 70250, 70250, 70250, 70251, 70251, 70251, 70251, 70252, 70252,
70252, 70252, 70253, 70253, 70253, 70253, 70254, 70254, 70255, 70255,
70256, 70256, 70257, 70257, 70258, 70258, 70259, 70259, 70260, 70260,
70260, 70260, 70261, 70261, 70261, 70261, 70262, 70262, 70262, 70262,
70263, 70263, 70263, 70263, 70264, 70264, 70265, 70265, 70265, 70265,
131874, 131874, 70266, 70266, 70266, 70266, 70267, 70267, 70267, 70267,
70268, 70268, 131878, 131878, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, 70269, 70269, 70269, 70269, 70270, 70270, 70271,
70271, 70272, 70272, 131870, 70273, 70273, 70274, 70274, 70275, 70275,
70276, 70276, 70276, 70276, 70277, 70277, 201350, 201350, 201353, 201353,
201356, 201356, 201359, 201359, 201362, 201362, 201365, 201365, 201368,
201368, 201368, 201371, 201371, 201371, 70302, 70302, 70302, 70302,
201375, 201378, 201381, 201371, 201384, 135851, 135853, 135855, 135857,
135859, 135861, 135863, 135865, 135867, 135869, 135871, 135873, 135875,
135877, 135879, 135881, 135883, 135885, 135887, 135889, 135891, 135893,
135895, 135897, 135899, 135901, 135903, 135905, 135907, 135909, 135911,
135913, 135915, 135917, 135919, 135921, 135923, 135925, 135927, 135929,
135931, 135933, 135935, 135937, 135939, 135941, 135943, 135945, 135947,
135949, 135951, 135953, 135955, 135957, 135959, 135961, 135963, 135965,
135967, 135969, 135971, 135973, 135975, 135977, 135979, 135981, 135983,
135985, 135987, 135989, 135991, 135993, 135995, 135997, 135999, 136001,
136003, 136005, 136007, 136009, 136011, 136013, 136015, 136017, 136019,
136021, 136023, 136025, 136027, 201565, 201568, 201571, 201574, 201577,
201580, 201583, 201586, 201381, 201589, 201371, 201384, 136056, 136058,
135857, 136060, 135859, 135861, 136062, 136064, 135869, 136066, 135871,
135873, 136068, 136070, 135877, 136072, 135879, 135881, 135939, 135941,
135947, 135949, 135951, 135959, 135961, 135963, 135965, 135973, 135975,
135977, 136074, 135985, 136076, 136078, 135997, 136080, 135999, 136001,
136027, 136082, 136084, 136017, 136086, 136019, 136021, 201375, 201378,
201624, 201381, 201627, 135851, 135853, 135855, 135857, 136094, 135863,
135865, 135867, 135869, 136096, 135877, 135883, 135885, 135887, 135889,
135891, 135895, 135897, 135899, 135901, 135903, 135905, 136098, 135907,
135909, 135911, 135913, 135915, 135917, 135921, 135923, 135925, 135927,
135929, 135931, 135933, 135935, 135937, 135943, 135945, 135953, 135955,
135957, 135959, 135961, 135967, 135969, 135971, 135973, 136100, 135979,
135981, 135983, 135985, 135991, 135993, 135995, 135997, 136102, 136003,
136005, 136104, 136011, 136013, 136015, 136017, 136106, 201381, 201627,
135857, 136094, 135869, 136096, 135877, 136108, 135903, 136110, 136112,
136114, 135959, 135961, 135973, 135997, 136102, 136017, 136106, 201652,
201655, 201658, 136125, 136127, 136129, 136131, 136133, 136135, 136137,
136139, 136141, 136143, 136145, 136147, 136149, 136151, 136153, 136155,
136157, 136159, 136161, 136163, 136165, 136167, 136169, 136112, 136171,
136173, 136175, 136177, 136125, 136127, 136129, 136131, 136133, 136135,
136137, 136139, 136141, 136143, 136145, 136147, 136149, 136151, 136153,
136155, 136157, 136159, 136161, 136163, 136165, 136167, 136169, 136112,
136171, 136173, 136175, 136177, 136165, 136167, 136169, 136112, 136110,
136114, 135919, 135897, 135899, 135901, 136165, 136167, 136169, 135919,
135921, 136179, 136179, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, 201717, 201720, 201720, 201723, 201726,
201729, 201732, 201735, 201738, 201738, 201741, 201744, 201747, 201750,
201753, 201756, 201756, 201759, 201762, 201762, 201765, 201765, 201768,
201771, 201771, 201774, 201777, 201777, 201780, 201780, 201783, 201786,
201786, 201789, 201789, 201792, 201795, 201798, 201801, 201801, 201804,
201807, 201810, 201813, 201816, 201816, 201819, 201822, 201825, 201828,
201831, 201834, 201834, 201837, 201837, 201840, 201840, 201843, 201846,
201849, 201852, 201855, 201858, 201861, -1, -1, 201864, 201867, 201870,
201873, 201876, 201879, 201879, 201882, 201885, 201888, 201891, 201891,
201894, 201897, 201900, 201903, 201906, 201909, 201912, 201915, 201918,
201921, 201924, 201927, 201930, 201933, 201936, 201939, 201942, 201945,
201948, 201951, 201954, 201957, 201819, 201825, 201960, 201963, 201966,
201969, 201972, 201975, 201972, 201966, 201978, 201981, 201984, 201987,
201990, 201975, 201798, 201768, 201993, 201996, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, 201999, 202002, 267541, 267545, 267549, 267553, 267557, 267561,
267565, 202033, 1185076, 529734, 267598, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 133211, 70994, 70995, 70996,
70996, 67715, 67716, 70997, 70998, 70999, 71000, 71001, 71002, 71003,
71004, 67961, 67962, 71005, 71006, 71007, 71008, -1, -1, -1, -1, 133228,
133228, 133228, 133228, 70996, 70996, 70996, 71009, 71010, 67674, -1,
66157, 71011, 71012, 71013, 70994, 67715, 67716, 70997, 70998, 70999,
71000, 71014, 71015, 71016, 67712, 71017, 71018, 71019, 67714, -1,
71020, 71021, 71022, 71023, -1, -1, -1, -1, 136560, 136562, 136564,
-1, 136566, -1, 136568, 136570, 136572, 136574, 136576, 136578, 136580,
136582, 136584, 136586, 71052, 131856, 131856, 131858, 131858, 131860,
131860, 131862, 131862, 131864, 131864, 131864, 131864, 71053, 71053,
71054, 71054, 71054, 71054, 71055, 71055, 71056, 71056, 71056, 71056,
71057, 71057, 71057, 71057, 71058, 71058, 71058, 71058, 71059, 71059,
71059, 71059, 71060, 71060, 71060, 71060, 71061, 71061, 71062, 71062,
71063, 71063, 71064, 71064, 71065, 71065, 71065, 71065, 71066, 71066,
71066, 71066, 71067, 71067, 71067, 71067, 71068, 71068, 71068, 71068,
71069, 71069, 71069, 71069, 71070, 71070, 71070, 71070, 71071, 71071,
71071, 71071, 71072, 71072, 71072, 71072, 71073, 71073, 71073, 71073,
71074, 71074, 71074, 71074, 71075, 71075, 71075, 71075, 71076, 71076,
71076, 71076, 71077, 71077, 71077, 71077, 71078, 71078, 71078, 71078,
71079, 71079, 71079, 71079, 71080, 71080, 70277, 70277, 71081, 71081,
71081, 71081, 202154, 202154, 202157, 202157, 202160, 202160, 136627,
136627, -1, -1, -1, -1, 71013, 71093, 71014, 71021, 71022, 71015, 71094,
67715, 67716, 71016, 67712, 71009, 71017, 67674, 71095, 67704, 65549,
65542, 65543, 67706, 67707, 67708, 67709, 67710, 67711, 71011, 66157,
71018, 67714, 71019, 71012, 71023, 68185, 67759, 67726, 67772, 67761,
67762, 68186, 67739, 67741, 68187, 67758, 67742, 67763, 67743, 68188,
67746, 67747, 67748, 68189, 68190, 68191, 67819, 68192, 67831, 68193,
67756, 71096, 71020, 71097, 71098, 70996, 67649, 65539, 68194, 67861,
67773, 67760, 68195, 67738, 66124, 67705, 66126, 68196, 66146, 67862,
67717, 65550, 68197, 68198, 66127, 65892, 68199, 68200, 67844, 66131,
66147, 66132, 68201, 70997, 71099, 70998, 71100, 71101, 71102, 71103,
71005, 71006, 71010, 71104, 69066, 71105, 71106, 71107, 71108, 71109,
71110, 71111, 71112, 71113, 71114, 69020, 69021, 69022, 69023, 69024,
69025, 69026, 69027, 69028, 69029, 69030, 69031, 69032, 69033, 69034,
69035, 69036, 69037, 69038, 69039, 69040, 69041, 69042, 69043, 69044,
69045, 69046, 69047, 69048, 69049, 69050, 69051, 69052, 69053, 69054,
69055, 69056, 69057, 69058, 69059, 69060, 69061, 69062, 69063, 71115,
71116, 71117, 68610, 68559, 68560, 68561, 68562, 68563, 68564, 68565,
68566, 68567, 68568, 68569, 68570, 68571, 68572, 68573, 68574, 68575,
68576, 68577, 68578, 68579, 68580, 68581, 68582, 68583, 68584, 68585,
68586, 68587, 68588, -1, -1, -1, 68589, 68590, 68591, 68592, 68593,
68594, -1, -1, 68595, 68596, 68597, 68598, 68599, 68600, -1, -1, 68601,
68602, 68603, 68604, 68605, 68606, -1, -1, 68607, 68608, 68609, -1,
-1, -1, 71118, 71119, 71120, 131076, 71121, 71122, 71123, -1, 71124,
71125, 71126, 71127, 71128, 71129, 71130, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, 136667, 136669, 202207, 202210, 202213, 202216, 202219, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
136686, 136688, 202226, 202229, 202232, 202235, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, 68185, 67759, 67726, 67772, 67761, 67762,
68186, 67739, 67741, 68187, 67758, 67742, 67763, 67743, 68188, 67746,
67747, 67748, 68189, 68190, 68191, 67819, 68192, 67831, 68193, 67756,
65539, 68194, 67861, 67773, 67760, 68195, 67738, 66124, 67705, 66126,
68196, 66146, 67862, 67717, 65550, 68197, 68198, 66127, 65892, 68199,
68200, 67844, 66131, 66147, 66132, 68201, 68185, 67759, 67726, 67772,
67761, 67762, 68186, 67739, 67741, 68187, 67758, 67742, 67763, 67743,
68188, 67746, 67747, 67748, 68189, 68190, 68191, 67819, 68192, 67831,
68193, 67756, 65539, 68194, 67861, 67773, 67760, 68195, 67738, -1,
67705, 66126, 68196, 66146, 67862, 67717, 65550, 68197, 68198, 66127,
65892, 68199, 68200, 67844, 66131, 66147, 66132, 68201, 68185, 67759,
67726, 67772, 67761, 67762, 68186, 67739, 67741, 68187, 67758, 67742,
67763, 67743, 68188, 67746, 67747, 67748, 68189, 68190, 68191, 67819,
68192, 67831, 68193, 67756, 65539, 68194, 67861, 67773, 67760, 68195,
67738, 66124, 67705, 66126, 68196, 66146, 67862, 67717, 65550, 68197,
68198, 66127, 65892, 68199, 68200, 67844, 66131, 66147, 66132, 68201,
68185, -1, 67726, 67772, -1, -1, 68186, -1, -1, 68187, 67758, -1, -1,
67743, 68188, 67746, 67747, -1, 68189, 68190, 68191, 67819, 68192,
67831, 68193, 67756, 65539, 68194, 67861, 67773, -1, 68195, -1, 66124,
67705, 66126, 68196, -1, 67862, 67717, -1, 68197, 68198, 66127, 65892,
68199, 68200, 67844, 66131, 66147, 66132, 68201, 68185, 67759, 67726,
67772, 67761, 67762, 68186, 67739, 67741, 68187, 67758, 67742, 67763,
67743, 68188, 67746, 67747, 67748, 68189, 68190, 68191, 67819, 68192,
67831, 68193, 67756, 65539, 68194, 67861, 67773, 67760, 68195, 67738,
66124, 67705, 66126, 68196, 66146, 67862, 67717, 65550, 68197, 68198,
66127, 65892, 68199, 68200, 67844, 66131, 66147, 66132, 68201, 68185,
67759, -1, 67772, 67761, 67762, 68186, -1, -1, 68187, 67758, 67742,
67763, 67743, 68188, 67746, 67747, -1, 68189, 68190, 68191, 67819,
68192, 67831, 68193, -1, 65539, 68194, 67861, 67773, 67760, 68195,
67738, 66124, 67705, 66126, 68196, 66146, 67862, 67717, 65550, 68197,
68198, 66127, 65892, 68199, 68200, 67844, 66131, 66147, 66132, 68201,
68185, 67759, -1, 67772, 67761, 67762, 68186, -1, 67741, 68187, 67758,
67742, 67763, -1, 68188, -1, -1, -1, 68189, 68190, 68191, 67819, 68192,
67831, 68193, -1, 65539, 68194, 67861, 67773, 67760, 68195, 67738,
66124, 67705, 66126, 68196, 66146, 67862, 67717, 65550, 68197, 68198,
66127, 65892, 68199, 68200, 67844, 66131, 66147, 66132, 68201, 68185,
67759, 67726, 67772, 67761, 67762, 68186, 67739, 67741, 68187, 67758,
67742, 67763, 67743, 68188, 67746, 67747, 67748, 68189, 68190, 68191,
67819, 68192, 67831, 68193, 67756, 65539, 68194, 67861, 67773, 67760,
68195, 67738, 66124, 67705, 66126, 68196, 66146, 67862, 67717, 65550,
68197, 68198, 66127, 65892, 68199, 68200, 67844, 66131, 66147, 66132,
68201, 68185, 67759, 67726, 67772, 67761, 67762, 68186, 67739, 67741,
68187, 67758, 67742, 67763, 67743, 68188, 67746, 67747, 67748, 68189,
68190, 68191, 67819, 68192, 67831, 68193, 67756, 65539, 68194, 67861,
67773, 67760, 68195, 67738, 66124, 67705, 66126, 68196, 66146, 67862,
67717, 65550, 68197, 68198, 66127, 65892, 68199, 68200, 67844, 66131,
66147, 66132, 68201, 68185, 67759, 67726, 67772, 67761, 67762, 68186,
67739, 67741, 68187, 67758, 67742, 67763, 67743, 68188, 67746, 67747,
67748, 68189, 68190, 68191, 67819, 68192, 67831, 68193, 67756, 65539,
68194, 67861, 67773, 67760, 68195, 67738, 66124, 67705, 66126, 68196,
66146, 67862, 67717, 65550, 68197, 68198, 66127, 65892, 68199, 68200,
67844, 66131, 66147, 66132, 68201, 68185, 67759, 67726, 67772, 67761,
67762, 68186, 67739, 67741, 68187, 67758, 67742, 67763, 67743, 68188,
67746, 67747, 67748, 68189, 68190, 68191, 67819, 68192, 67831, 68193,
67756, 65539, 68194, 67861, 67773, 67760, 68195, 67738, 66124, 67705,
66126, 68196, 66146, 67862, 67717, 65550, 68197, 68198, 66127, 65892,
68199, 68200, 67844, 66131, 66147, 66132, 68201, 68185, 67759, 67726,
67772, 67761, 67762, 68186, 67739, 67741, 68187, 67758, 67742, 67763,
67743, 68188, 67746, 67747, 67748, 68189, 68190, 68191, 67819, 68192,
67831, 68193, 67756, 65539, 68194, 67861, 67773, 67760, 68195, 67738,
66124, 67705, 66126, 68196, 66146, 67862, 67717, 65550, 68197, 68198,
66127, 65892, 68199, 68200, 67844, 66131, 66147, 66132, 68201, 68185,
67759, 67726, 67772, 67761, 67762, 68186, 67739, 67741, 68187, 67758,
67742, 67763, 67743, 68188, 67746, 67747, 67748, 68189, 68190, 68191,
67819, 68192, 67831, 68193, 67756, 65539, 68194, 67861, 67773, 67760,
68195, 67738, 66124, 67705, 66126, 68196, 66146, 67862, 67717, 65550,
68197, 68198, 66127, 65892, 68199, 68200, 67844, 66131, 66147, 66132,
68201, -1, -1, -1, -1, 71166, 71167, 67769, 71168, 71169, 71170, 71171,
66212, 71172, 71173, 71174, 71175, 71176, 71177, 71178, 67770, 71179,
66212, 71180, 71181, 66206, 71182, 71183, 71184, 67757, 71185, 71186,
66204, 67768, 71187, 66213, 71188, 71189, 66205, 67561, 66209, 71190,
65546, 71191, 71192, 71193, 66208, 66210, 66211, 71194, 71195, 71196,
66207, 71197, 71198, 71199, 71200, 66213, 66205, 66209, 66207, 66210,
66208, 71166, 71167, 67769, 71168, 71169, 71170, 71171, 66212, 71172,
71173, 71174, 71175, 71176, 71177, 71178, 67770, 71179, 66212, 71180,
71181, 66206, 71182, 71183, 71184, 67757, 71185, 71186, 66204, 67768,
71187, 66213, 71188, 71189, 66205, 67561, 66209, 71190, 65546, 71191,
71192, 71193, 66208, 66210, 66211, 71194, 71195, 71196, 66207, 71197,
71198, 71199, 71200, 66213, 66205, 66209, 66207, 66210, 66208, 71166,
71167, 67769, 71168, 71169, 71170, 71171, 66212, 71172, 71173, 71174,
71175, 71176, 71177, 71178, 67770, 71179, 66212, 71180, 71181, 66206,
71182, 71183, 71184, 67757, 71185, 71186, 66204, 67768, 71187, 66213,
71188, 71189, 66205, 67561, 66209, 71190, 65546, 71191, 71192, 71193,
66208, 66210, 66211, 71194, 71195, 71196, 66207, 71197, 71198, 71199,
71200, 66213, 66205, 66209, 66207, 66210, 66208, 71166, 71167, 67769,
71168, 71169, 71170, 71171, 66212, 71172, 71173, 71174, 71175, 71176,
71177, 71178, 67770, 71179, 66212, 71180, 71181, 66206, 71182, 71183,
71184, 67757, 71185, 71186, 66204, 67768, 71187, 66213, 71188, 71189,
66205, 67561, 66209, 71190, 65546, 71191, 71192, 71193, 66208, 66210,
66211, 71194, 71195, 71196, 66207, 71197, 71198, 71199, 71200, 66213,
66205, 66209, 66207, 66210, 66208, 71166, 71167, 67769, 71168, 71169,
71170, 71171, 66212, 71172, 71173, 71174, 71175, 71176, 71177, 71178,
67770, 71179, 66212, 71180, 71181, 66206, 71182, 71183, 71184, 67757,
71185, 71186, 66204, 67768, 71187, 66213, 71188, 71189, 66205, 67561,
66209, 71190, 65546, 71191, 71192, 71193, 66208, 66210, 66211, 71194,
71195, 71196, 66207, 71197, 71198, 71199, 71200, 66213, 66205, 66209,
66207, 66210, 66208, -1, -1, -1, -1, 67704, 65549, 65542, 65543, 67706,
67707, 67708, 67709, 67710, 67711, 67704, 65549, 65542, 65543, 67706,
67707, 67708, 67709, 67710, 67711, 67704, 65549, 65542, 65543, 67706,
67707, 67708, 67709, 67710, 67711, 67704, 65549, 65542, 65543, 67706,
67707, 67708, 67709, 67710, 67711, 67704, 65549, 65542, 65543, 67706,
67707, 67708, 67709, 67710, 67711, 71201, 71202, 71203, 71204, 71205,
70085, 71206, 71207, 71208, 71209, 70086, 71210, 71211, 71212, 70087,
71213, 71214, 71215, 71216, 71217, 71218, 71219, 71220, 71221, 71222,
71223, 71224, 71225, 71226, 68234, 71227, 71228, 71229, 71230, 71231,
71232, 71233, 71234, 70088, 70089, 71235, 71236, 71237, 69908, 71238,
70090, 71239, 71240, 71241, 71242, 71242, 71242, 71243, 71244, 71245,
71246, 71247, 71248, 71249, 71250, 71251, 71252, 71253, 71254, 71255,
71256, 71257, 71258, 71259, 71260, 71260, 71261, 71262, 71263, 71264,
71265, 70092, 71266, 71267, 71268, 70054, 71269, 71270, 71271, 71272,
71273, 71274, 71275, 71276, 71277, 71278, 71279, 71280, 71281, 71282,
71283, 71284, 71285, 71286, 71287, 71288, 71289, 71290, 71291, 71292,
71293, 71294, 71294, 71295, 71296, 71297, 69904, 71298, 71299, 71300,
71301, 71302, 68260, 71303, 71304, 68262, 71305, 71306, 71307, 71308,
71309, 71310, 71311, 71312, 71313, 71314, 71315, 71316, 71317, 71318,
71319, 71320, 71321, 71322, 71323, 71324, 71325, 69852, 71326, 68272,
71327, 71327, 71328, 71329, 71329, 71330, 71331, 71332, 71333, 71334,
71335, 71336, 71337, 71338, 71339, 71340, 71341, 71342, 70097, 71343,
71344, 71345, 71346, 71347, 71346, 71348, 70099, 71349, 71350, 71351,
71352, 70100, 69825, 71353, 71354, 71355, 71356, 71357, 71358, 71359,
71360, 71361, 71362, 71363, 71364, 71365, 71366, 71367, 71368, 71369,
71370, 71371, 71372, 71373, 71374, 70101, 71375, 71376, 71377, 71378,
71379, 71380, 70103, 71381, 71382, 71383, 71384, 71385, 71386, 71387,
71388, 69853, 71389, 71390, 71391, 71392, 71393, 71394, 71395, 71396,
71397, 70104, 71398, 71399, 71400, 71401, 71402, 71403, 71404, 71405,
71406, 71407, 71408, 71409, 71410, 71411, 71412, 71413, 71414, 71415,
69921, 71416, 71417, 71418, 71419, 71420, 71421, 71422, 71423, 71424,
71425, 71426, 70105, 70004, 71427, 71428, 71429, 71430, 71431, 71432,
71433, 71434, 71435, 71436, 71437, 71438, 71439, 71440, 71441, 71442,
71443, 71444, 71445, 71446, 71447, 71448, 71449, 71450, 71451, 71452,
71453, 71454, 71455, 71456, 71457, 71458, 71459, 71460, 71461, 71462,
71463, 71464, 71465, 71466, 71467, 71468, 71468, 71469, 71470, 71471,
71472, 71473, 71474, 71475, 71476, 71477, 71478, 69907, 71479, 71480,
71481, 71482, 71483, 71484, 71485, 71486, 71487, 71488, 71489, 71490,
71491, 71492, 71492, 71493, 71494, 71495, 71496, 71497, 71498, 71499,
69870, 71500, 71501, 71502, 70115, 71503, 71504, 70074, 71505, 71506,
70118, 71507, 71508, 71509, 71510, 71510, 71511, 71512, 71513, 71514,
71515, 71516, 71517, 71518, 71519, 71520, 71521, 71522, 71523, 71524,
71525, 71526, 71527, 71528, 71529, 71530, 71531, 71532, 71533, 71534,
71535, 71536, 71537, 70124, 71538, 71539, 71540, 71541, 71542, 71543,
71544, 71545, 71546, 71547, 71548, 71549, 71550, 71551, 71552, 71553,
71328, 71554, 71555, 71556, 71557, 71558, 71559, 71560, 71561, 71562,
71563, 71564, 71565, 69924, 71566, 71567, 71568, 71569, 71570, 71571,
70127, 71572, 71573, 71574, 71575, 71576, 71577, 71578, 71579, 71580,
71581, 71582, 71583, 71584, 71585, 71586, 71587, 71588, 71589, 71590,
71591, 69865, 71592, 71593, 71594, 71595, 71596, 71597, 71598, 71599,
71600, 71601, 71602, 71603, 71604, 71605, 71606, 68362, 71607, 71608,
71609, 71610, 71611, 71612, 71613, 71614, 71615, 71616, 71617, 71618,
71619, 68369, 71620, 71621, 71622, 71623, 71624, 71625, 71626, 71627,
71628, 71629, 71630, 71631, 71632, 71633, 71634, 71635, 71636, 71637,
71638, 71639, 71640, 71641, 71642, 71643, 71644, 71645, 71646, 71647,
71648, 71649, 71650, 71651, 71652, 71653, 71654, 71655, 71656, 71657,
71658, 71659, 71660, 71661, 71662, 71663, 71663, 71664, 71665, 71666,
71667, 71668, 71669, 71670, 71671, 71672, 71673, 71674, 71675, 71676,
71677, 71678, 71679, 71680, 71681, 71682, 71683, 71684, 68417, 71685,
68421, 71686, 71687, 71688, 71689, 68426, 71690, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
};
/*
* List of decomposition sequences
*/
static int decompList[] = {
32, 32, 776, 97, 32, 772, 50, 51, 32, 769, 956, 32, 807, 49, 111, 49,
8260, 52, 49, 8260, 50, 51, 8260, 52, 65, 768, 65, 769, 65, 770, 65,
771, 65, 776, 65, 778, 67, 807, 69, 768, 69, 769, 69, 770, 69, 776,
73, 768, 73, 769, 73, 770, 73, 776, 78, 771, 79, 768, 79, 769, 79,
770, 79, 771, 79, 776, 85, 768, 85, 769, 85, 770, 85, 776, 89, 769,
97, 768, 97, 769, 97, 770, 97, 771, 97, 776, 97, 778, 99, 807, 101,
768, 101, 769, 101, 770, 101, 776, 105, 768, 105, 769, 105, 770, 105,
776, 110, 771, 111, 768, 111, 769, 111, 770, 111, 771, 111, 776, 117,
768, 117, 769, 117, 770, 117, 776, 121, 769, 121, 776, 65, 772, 97,
772, 65, 774, 97, 774, 65, 808, 97, 808, 67, 769, 99, 769, 67, 770,
99, 770, 67, 775, 99, 775, 67, 780, 99, 780, 68, 780, 100, 780, 69,
772, 101, 772, 69, 774, 101, 774, 69, 775, 101, 775, 69, 808, 101,
808, 69, 780, 101, 780, 71, 770, 103, 770, 71, 774, 103, 774, 71, 775,
103, 775, 71, 807, 103, 807, 72, 770, 104, 770, 73, 771, 105, 771,
73, 772, 105, 772, 73, 774, 105, 774, 73, 808, 105, 808, 73, 775, 73,
74, 105, 106, 74, 770, 106, 770, 75, 807, 107, 807, 76, 769, 108, 769,
76, 807, 108, 807, 76, 780, 108, 780, 76, 183, 108, 183, 78, 769, 110,
769, 78, 807, 110, 807, 78, 780, 110, 780, 700, 110, 79, 772, 111,
772, 79, 774, 111, 774, 79, 779, 111, 779, 82, 769, 114, 769, 82, 807,
114, 807, 82, 780, 114, 780, 83, 769, 115, 769, 83, 770, 115, 770,
83, 807, 115, 807, 83, 780, 115, 780, 84, 807, 116, 807, 84, 780, 116,
780, 85, 771, 117, 771, 85, 772, 117, 772, 85, 774, 117, 774, 85, 778,
117, 778, 85, 779, 117, 779, 85, 808, 117, 808, 87, 770, 119, 770,
89, 770, 121, 770, 89, 776, 90, 769, 122, 769, 90, 775, 122, 775, 90,
780, 122, 780, 115, 79, 795, 111, 795, 85, 795, 117, 795, 68, 90, 780,
68, 122, 780, 100, 122, 780, 76, 74, 76, 106, 108, 106, 78, 74, 78,
106, 110, 106, 65, 780, 97, 780, 73, 780, 105, 780, 79, 780, 111, 780,
85, 780, 117, 780, 85, 776, 772, 117, 776, 772, 85, 776, 769, 117,
776, 769, 85, 776, 780, 117, 776, 780, 85, 776, 768, 117, 776, 768,
65, 776, 772, 97, 776, 772, 65, 775, 772, 97, 775, 772, 198, 772, 230,
772, 71, 780, 103, 780, 75, 780, 107, 780, 79, 808, 111, 808, 79, 808,
772, 111, 808, 772, 439, 780, 658, 780, 106, 780, 68, 90, 68, 122,
100, 122, 71, 769, 103, 769, 78, 768, 110, 768, 65, 778, 769, 97, 778,
769, 198, 769, 230, 769, 216, 769, 248, 769, 65, 783, 97, 783, 65,
785, 97, 785, 69, 783, 101, 783, 69, 785, 101, 785, 73, 783, 105, 783,
73, 785, 105, 785, 79, 783, 111, 783, 79, 785, 111, 785, 82, 783, 114,
783, 82, 785, 114, 785, 85, 783, 117, 783, 85, 785, 117, 785, 83, 806,
115, 806, 84, 806, 116, 806, 72, 780, 104, 780, 65, 775, 97, 775, 69,
807, 101, 807, 79, 776, 772, 111, 776, 772, 79, 771, 772, 111, 771,
772, 79, 775, 111, 775, 79, 775, 772, 111, 775, 772, 89, 772, 121,
772, 104, 614, 106, 114, 633, 635, 641, 119, 121, 32, 774, 32, 775,
32, 778, 32, 808, 32, 771, 32, 779, 611, 108, 120, 661, 768, 769, 787,
776, 769, 697, 32, 837, 59, 32, 776, 769, 913, 769, 183, 917, 769,
919, 769, 921, 769, 927, 769, 933, 769, 937, 769, 953, 776, 769, 921,
776, 933, 776, 945, 769, 949, 769, 951, 769, 953, 769, 965, 776, 769,
953, 776, 965, 776, 959, 769, 965, 769, 969, 769, 946, 952, 933, 966,
960, 954, 961, 962, 920, 949, 1045, 768, 1045, 776, 1043, 769, 1030,
776, 1050, 769, 1048, 768, 1059, 774, 1048, 774, 1080, 774, 1077, 768,
1077, 776, 1075, 769, 1110, 776, 1082, 769, 1080, 768, 1091, 774, 1140,
783, 1141, 783, 1046, 774, 1078, 774, 1040, 774, 1072, 774, 1040, 776,
1072, 776, 1045, 774, 1077, 774, 1240, 776, 1241, 776, 1046, 776, 1078,
776, 1047, 776, 1079, 776, 1048, 772, 1080, 772, 1048, 776, 1080, 776,
1054, 776, 1086, 776, 1256, 776, 1257, 776, 1069, 776, 1101, 776, 1059,
772, 1091, 772, 1059, 776, 1091, 776, 1059, 779, 1091, 779, 1063, 776,
1095, 776, 1067, 776, 1099, 776, 1381, 1410, 1575, 1619, 1575, 1620,
1608, 1620, 1575, 1621, 1610, 1620, 1575, 1652, 1608, 1652, 1735, 1652,
1610, 1652, 1749, 1620, 1729, 1620, 1746, 1620, 2344, 2364, 2352, 2364,
2355, 2364, 2325, 2364, 2326, 2364, 2327, 2364, 2332, 2364, 2337, 2364,
2338, 2364, 2347, 2364, 2351, 2364, 2503, 2494, 2503, 2519, 2465, 2492,
2466, 2492, 2479, 2492, 2610, 2620, 2616, 2620, 2582, 2620, 2583, 2620,
2588, 2620, 2603, 2620, 2887, 2902, 2887, 2878, 2887, 2903, 2849, 2876,
2850, 2876, 2962, 3031, 3014, 3006, 3015, 3006, 3014, 3031, 3142, 3158,
3263, 3285, 3270, 3285, 3270, 3286, 3270, 3266, 3270, 3266, 3285, 3398,
3390, 3399, 3390, 3398, 3415, 3545, 3530, 3545, 3535, 3545, 3535, 3530,
3545, 3551, 3661, 3634, 3789, 3762, 3755, 3737, 3755, 3745, 3851, 3906,
4023, 3916, 4023, 3921, 4023, 3926, 4023, 3931, 4023, 3904, 4021, 3953,
3954, 3953, 3956, 4018, 3968, 4018, 3953, 3968, 4019, 3968, 4019, 3953,
3968, 3953, 3968, 3986, 4023, 3996, 4023, 4001, 4023, 4006, 4023, 4011,
4023, 3984, 4021, 4133, 4142, 65, 805, 97, 805, 66, 775, 98, 775, 66,
803, 98, 803, 66, 817, 98, 817, 67, 807, 769, 99, 807, 769, 68, 775,
100, 775, 68, 803, 100, 803, 68, 817, 100, 817, 68, 807, 100, 807,
68, 813, 100, 813, 69, 772, 768, 101, 772, 768, 69, 772, 769, 101,
772, 769, 69, 813, 101, 813, 69, 816, 101, 816, 69, 807, 774, 101,
807, 774, 70, 775, 102, 775, 71, 772, 103, 772, 72, 775, 104, 775,
72, 803, 104, 803, 72, 776, 104, 776, 72, 807, 104, 807, 72, 814, 104,
814, 73, 816, 105, 816, 73, 776, 769, 105, 776, 769, 75, 769, 107,
769, 75, 803, 107, 803, 75, 817, 107, 817, 76, 803, 108, 803, 76, 803,
772, 108, 803, 772, 76, 817, 108, 817, 76, 813, 108, 813, 77, 769,
109, 769, 77, 775, 109, 775, 77, 803, 109, 803, 78, 775, 110, 775,
78, 803, 110, 803, 78, 817, 110, 817, 78, 813, 110, 813, 79, 771, 769,
111, 771, 769, 79, 771, 776, 111, 771, 776, 79, 772, 768, 111, 772,
768, 79, 772, 769, 111, 772, 769, 80, 769, 112, 769, 80, 775, 112,
775, 82, 775, 114, 775, 82, 803, 114, 803, 82, 803, 772, 114, 803,
772, 82, 817, 114, 817, 83, 775, 115, 775, 83, 803, 115, 803, 83, 769,
775, 115, 769, 775, 83, 780, 775, 115, 780, 775, 83, 803, 775, 115,
803, 775, 84, 775, 116, 775, 84, 803, 116, 803, 84, 817, 116, 817,
84, 813, 116, 813, 85, 804, 117, 804, 85, 816, 117, 816, 85, 813, 117,
813, 85, 771, 769, 117, 771, 769, 85, 772, 776, 117, 772, 776, 86,
771, 118, 771, 86, 803, 118, 803, 87, 768, 119, 768, 87, 769, 119,
769, 87, 776, 119, 776, 87, 775, 119, 775, 87, 803, 119, 803, 88, 775,
120, 775, 88, 776, 120, 776, 89, 775, 121, 775, 90, 770, 122, 770,
90, 803, 122, 803, 90, 817, 122, 817, 104, 817, 116, 776, 119, 778,
121, 778, 97, 702, 65, 803, 97, 803, 65, 777, 97, 777, 65, 770, 769,
97, 770, 769, 65, 770, 768, 97, 770, 768, 65, 770, 777, 97, 770, 777,
65, 770, 771, 97, 770, 771, 65, 803, 770, 97, 803, 770, 65, 774, 769,
97, 774, 769, 65, 774, 768, 97, 774, 768, 65, 774, 777, 97, 774, 777,
65, 774, 771, 97, 774, 771, 65, 803, 774, 97, 803, 774, 69, 803, 101,
803, 69, 777, 101, 777, 69, 771, 101, 771, 69, 770, 769, 101, 770,
769, 69, 770, 768, 101, 770, 768, 69, 770, 777, 101, 770, 777, 69,
770, 771, 101, 770, 771, 69, 803, 770, 101, 803, 770, 73, 777, 105,
777, 73, 803, 105, 803, 79, 803, 111, 803, 79, 777, 111, 777, 79, 770,
769, 111, 770, 769, 79, 770, 768, 111, 770, 768, 79, 770, 777, 111,
770, 777, 79, 770, 771, 111, 770, 771, 79, 803, 770, 111, 803, 770,
79, 795, 769, 111, 795, 769, 79, 795, 768, 111, 795, 768, 79, 795,
777, 111, 795, 777, 79, 795, 771, 111, 795, 771, 79, 795, 803, 111,
795, 803, 85, 803, 117, 803, 85, 777, 117, 777, 85, 795, 769, 117,
795, 769, 85, 795, 768, 117, 795, 768, 85, 795, 777, 117, 795, 777,
85, 795, 771, 117, 795, 771, 85, 795, 803, 117, 795, 803, 89, 768,
121, 768, 89, 803, 121, 803, 89, 777, 121, 777, 89, 771, 121, 771,
945, 787, 945, 788, 945, 787, 768, 945, 788, 768, 945, 787, 769, 945,
788, 769, 945, 787, 834, 945, 788, 834, 913, 787, 913, 788, 913, 787,
768, 913, 788, 768, 913, 787, 769, 913, 788, 769, 913, 787, 834, 913,
788, 834, 949, 787, 949, 788, 949, 787, 768, 949, 788, 768, 949, 787,
769, 949, 788, 769, 917, 787, 917, 788, 917, 787, 768, 917, 788, 768,
917, 787, 769, 917, 788, 769, 951, 787, 951, 788, 951, 787, 768, 951,
788, 768, 951, 787, 769, 951, 788, 769, 951, 787, 834, 951, 788, 834,
919, 787, 919, 788, 919, 787, 768, 919, 788, 768, 919, 787, 769, 919,
788, 769, 919, 787, 834, 919, 788, 834, 953, 787, 953, 788, 953, 787,
768, 953, 788, 768, 953, 787, 769, 953, 788, 769, 953, 787, 834, 953,
788, 834, 921, 787, 921, 788, 921, 787, 768, 921, 788, 768, 921, 787,
769, 921, 788, 769, 921, 787, 834, 921, 788, 834, 959, 787, 959, 788,
959, 787, 768, 959, 788, 768, 959, 787, 769, 959, 788, 769, 927, 787,
927, 788, 927, 787, 768, 927, 788, 768, 927, 787, 769, 927, 788, 769,
965, 787, 965, 788, 965, 787, 768, 965, 788, 768, 965, 787, 769, 965,
788, 769, 965, 787, 834, 965, 788, 834, 933, 788, 933, 788, 768, 933,
788, 769, 933, 788, 834, 969, 787, 969, 788, 969, 787, 768, 969, 788,
768, 969, 787, 769, 969, 788, 769, 969, 787, 834, 969, 788, 834, 937,
787, 937, 788, 937, 787, 768, 937, 788, 768, 937, 787, 769, 937, 788,
769, 937, 787, 834, 937, 788, 834, 945, 768, 949, 768, 951, 768, 953,
768, 959, 768, 965, 768, 969, 768, 945, 787, 837, 945, 788, 837, 945,
787, 768, 837, 945, 788, 768, 837, 945, 787, 769, 837, 945, 788, 769,
837, 945, 787, 834, 837, 945, 788, 834, 837, 913, 787, 837, 913, 788,
837, 913, 787, 768, 837, 913, 788, 768, 837, 913, 787, 769, 837, 913,
788, 769, 837, 913, 787, 834, 837, 913, 788, 834, 837, 951, 787, 837,
951, 788, 837, 951, 787, 768, 837, 951, 788, 768, 837, 951, 787, 769,
837, 951, 788, 769, 837, 951, 787, 834, 837, 951, 788, 834, 837, 919,
787, 837, 919, 788, 837, 919, 787, 768, 837, 919, 788, 768, 837, 919,
787, 769, 837, 919, 788, 769, 837, 919, 787, 834, 837, 919, 788, 834,
837, 969, 787, 837, 969, 788, 837, 969, 787, 768, 837, 969, 788, 768,
837, 969, 787, 769, 837, 969, 788, 769, 837, 969, 787, 834, 837, 969,
788, 834, 837, 937, 787, 837, 937, 788, 837, 937, 787, 768, 837, 937,
788, 768, 837, 937, 787, 769, 837, 937, 788, 769, 837, 937, 787, 834,
837, 937, 788, 834, 837, 945, 774, 945, 772, 945, 768, 837, 945, 837,
945, 769, 837, 945, 834, 945, 834, 837, 913, 774, 913, 772, 913, 768,
913, 837, 32, 787, 953, 32, 834, 32, 776, 834, 951, 768, 837, 951,
837, 951, 769, 837, 951, 834, 951, 834, 837, 917, 768, 919, 768, 919,
837, 32, 787, 768, 32, 787, 769, 32, 787, 834, 953, 774, 953, 772,
953, 776, 768, 953, 834, 953, 776, 834, 921, 774, 921, 772, 921, 768,
32, 788, 768, 32, 788, 769, 32, 788, 834, 965, 774, 965, 772, 965,
776, 768, 961, 787, 961, 788, 965, 834, 965, 776, 834, 933, 774, 933,
772, 933, 768, 929, 788, 32, 776, 768, 96, 969, 768, 837, 969, 837,
969, 769, 837, 969, 834, 969, 834, 837, 927, 768, 937, 768, 937, 837,
32, 788, 8208, 32, 819, 46, 46, 46, 46, 46, 46, 8242, 8242, 8242, 8242,
8242, 8245, 8245, 8245, 8245, 8245, 33, 33, 32, 773, 63, 63, 63, 33,
33, 63, 8242, 8242, 8242, 8242, 48, 105, 52, 53, 54, 55, 56, 57, 43,
8722, 61, 40, 41, 110, 82, 115, 97, 47, 99, 97, 47, 115, 67, 176, 67,
99, 47, 111, 99, 47, 117, 400, 176, 70, 103, 72, 295, 73, 76, 78, 78,
111, 80, 81, 82, 83, 77, 84, 69, 76, 84, 77, 90, 937, 75, 66, 101,
69, 70, 77, 1488, 1489, 1490, 1491, 947, 915, 928, 8721, 68, 100, 49,
8260, 51, 50, 8260, 51, 49, 8260, 53, 50, 8260, 53, 51, 8260, 53, 52,
8260, 53, 49, 8260, 54, 53, 8260, 54, 49, 8260, 56, 51, 8260, 56, 53,
8260, 56, 55, 8260, 56, 49, 8260, 73, 73, 73, 73, 73, 73, 86, 86, 86,
73, 86, 73, 73, 86, 73, 73, 73, 73, 88, 88, 88, 73, 88, 73, 73, 105,
105, 105, 105, 105, 105, 118, 118, 118, 105, 118, 105, 105, 118, 105,
105, 105, 105, 120, 120, 105, 120, 105, 105, 99, 109, 8592, 824, 8594,
824, 8596, 824, 8656, 824, 8660, 824, 8658, 824, 8707, 824, 8712, 824,
8715, 824, 8739, 824, 8741, 824, 8747, 8747, 8747, 8747, 8747, 8750,
8750, 8750, 8750, 8750, 8764, 824, 8771, 824, 8773, 824, 8776, 824,
61, 824, 8801, 824, 8781, 824, 60, 824, 62, 824, 8804, 824, 8805, 824,
8818, 824, 8819, 824, 8822, 824, 8823, 824, 8826, 824, 8827, 824, 8834,
824, 8835, 824, 8838, 824, 8839, 824, 8866, 824, 8872, 824, 8873, 824,
8875, 824, 8828, 824, 8829, 824, 8849, 824, 8850, 824, 8882, 824, 8883,
824, 8884, 824, 8885, 824, 12296, 12297, 49, 48, 49, 49, 49, 50, 49,
51, 49, 52, 49, 53, 49, 54, 49, 55, 49, 56, 49, 57, 50, 48, 40, 49,
41, 40, 50, 41, 40, 51, 41, 40, 52, 41, 40, 53, 41, 40, 54, 41, 40,
55, 41, 40, 56, 41, 40, 57, 41, 40, 49, 48, 41, 40, 49, 49, 41, 40,
49, 50, 41, 40, 49, 51, 41, 40, 49, 52, 41, 40, 49, 53, 41, 40, 49,
54, 41, 40, 49, 55, 41, 40, 49, 56, 41, 40, 49, 57, 41, 40, 50, 48,
41, 49, 46, 50, 46, 51, 46, 52, 46, 53, 46, 54, 46, 55, 46, 56, 46,
57, 46, 49, 48, 46, 49, 49, 46, 49, 50, 46, 49, 51, 46, 49, 52, 46,
49, 53, 46, 49, 54, 46, 49, 55, 46, 49, 56, 46, 49, 57, 46, 50, 48,
46, 40, 97, 41, 40, 98, 41, 40, 99, 41, 40, 100, 41, 40, 101, 41, 40,
102, 41, 40, 103, 41, 40, 104, 41, 40, 105, 41, 40, 106, 41, 40, 107,
41, 40, 108, 41, 40, 109, 41, 40, 110, 41, 40, 111, 41, 40, 112, 41,
40, 113, 41, 40, 114, 41, 40, 115, 41, 40, 116, 41, 40, 117, 41, 40,
118, 41, 40, 119, 41, 40, 120, 41, 40, 121, 41, 40, 122, 41, 65, 71,
74, 79, 83, 84, 85, 87, 89, 98, 102, 107, 112, 113, 116, 117, 122,
8747, 8747, 8747, 8747, 58, 58, 61, 61, 61, 61, 61, 61, 10973, 824,
27597, 40863, 19968, 20008, 20022, 20031, 20057, 20101, 20108, 20128,
20154, 20799, 20837, 20843, 20866, 20886, 20907, 20960, 20981, 20992,
21147, 21241, 21269, 21274, 21304, 21313, 21340, 21353, 21378, 21430,
21448, 21475, 22231, 22303, 22763, 22786, 22794, 22805, 22823, 22899,
23376, 23424, 23544, 23567, 23586, 23608, 23662, 23665, 24027, 24037,
24049, 24062, 24178, 24186, 24191, 24308, 24318, 24331, 24339, 24400,
24417, 24435, 24515, 25096, 25142, 25163, 25903, 25908, 25991, 26007,
26020, 26041, 26080, 26085, 26352, 26376, 26408, 27424, 27490, 27513,
27571, 27595, 27604, 27611, 27663, 27668, 27700, 28779, 29226, 29238,
29243, 29247, 29255, 29273, 29275, 29356, 29572, 29577, 29916, 29926,
29976, 29983, 29992, 30000, 30091, 30098, 30326, 30333, 30382, 30399,
30446, 30683, 30690, 30707, 31034, 31160, 31166, 31348, 31435, 31481,
31859, 31992, 32566, 32593, 32650, 32701, 32769, 32780, 32786, 32819,
32895, 32905, 33251, 33258, 33267, 33276, 33292, 33307, 33311, 33390,
33394, 33400, 34381, 34411, 34880, 34892, 34915, 35198, 35211, 35282,
35328, 35895, 35910, 35925, 35960, 35997, 36196, 36208, 36275, 36523,
36554, 36763, 36784, 36789, 37009, 37193, 37318, 37324, 37329, 38263,
38272, 38428, 38582, 38585, 38632, 38737, 38750, 38754, 38761, 38859,
38893, 38899, 38913, 39080, 39131, 39135, 39318, 39321, 39340, 39592,
39640, 39647, 39717, 39727, 39730, 39740, 39770, 40165, 40565, 40575,
40613, 40635, 40643, 40653, 40657, 40697, 40701, 40718, 40723, 40736,
40763, 40778, 40786, 40845, 40860, 40864, 12306, 21316, 21317, 12363,
12441, 12365, 12441, 12367, 12441, 12369, 12441, 12371, 12441, 12373,
12441, 12375, 12441, 12377, 12441, 12379, 12441, 12381, 12441, 12383,
12441, 12385, 12441, 12388, 12441, 12390, 12441, 12392, 12441, 12399,
12441, 12399, 12442, 12402, 12441, 12402, 12442, 12405, 12441, 12405,
12442, 12408, 12441, 12408, 12442, 12411, 12441, 12411, 12442, 12358,
12441, 32, 12441, 32, 12442, 12445, 12441, 12424, 12426, 12459, 12441,
12461, 12441, 12463, 12441, 12465, 12441, 12467, 12441, 12469, 12441,
12471, 12441, 12473, 12441, 12475, 12441, 12477, 12441, 12479, 12441,
12481, 12441, 12484, 12441, 12486, 12441, 12488, 12441, 12495, 12441,
12495, 12442, 12498, 12441, 12498, 12442, 12501, 12441, 12501, 12442,
12504, 12441, 12504, 12442, 12507, 12441, 12507, 12442, 12454, 12441,
12527, 12441, 12528, 12441, 12529, 12441, 12530, 12441, 12541, 12441,
12467, 12488, 4352, 4353, 4522, 4354, 4524, 4525, 4355, 4356, 4357,
4528, 4529, 4530, 4531, 4532, 4533, 4378, 4358, 4359, 4360, 4385, 4361,
4362, 4363, 4364, 4365, 4366, 4367, 4368, 4369, 4370, 4449, 4450, 4451,
4452, 4453, 4454, 4455, 4456, 4457, 4458, 4459, 4460, 4461, 4462, 4463,
4464, 4465, 4466, 4467, 4468, 4469, 4448, 4372, 4373, 4551, 4552, 4556,
4558, 4563, 4567, 4569, 4380, 4573, 4575, 4381, 4382, 4384, 4386, 4387,
4391, 4393, 4395, 4396, 4397, 4398, 4399, 4402, 4406, 4416, 4423, 4428,
4593, 4594, 4439, 4440, 4441, 4484, 4485, 4488, 4497, 4498, 4500, 4510,
4513, 19977, 22235, 19978, 20013, 19979, 30002, 19993, 19969, 22825,
22320, 40, 4352, 41, 40, 4354, 41, 40, 4355, 41, 40, 4357, 41, 40,
4358, 41, 40, 4359, 41, 40, 4361, 41, 40, 4363, 41, 40, 4364, 41, 40,
4366, 41, 40, 4367, 41, 40, 4368, 41, 40, 4369, 41, 40, 4370, 41, 40,
4352, 4449, 41, 40, 4354, 4449, 41, 40, 4355, 4449, 41, 40, 4357, 4449,
41, 40, 4358, 4449, 41, 40, 4359, 4449, 41, 40, 4361, 4449, 41, 40,
4363, 4449, 41, 40, 4364, 4449, 41, 40, 4366, 4449, 41, 40, 4367, 4449,
41, 40, 4368, 4449, 41, 40, 4369, 4449, 41, 40, 4370, 4449, 41, 40,
4364, 4462, 41, 40, 19968, 41, 40, 20108, 41, 40, 19977, 41, 40, 22235,
41, 40, 20116, 41, 40, 20845, 41, 40, 19971, 41, 40, 20843, 41, 40,
20061, 41, 40, 21313, 41, 40, 26376, 41, 40, 28779, 41, 40, 27700,
41, 40, 26408, 41, 40, 37329, 41, 40, 22303, 41, 40, 26085, 41, 40,
26666, 41, 40, 26377, 41, 40, 31038, 41, 40, 21517, 41, 40, 29305,
41, 40, 36001, 41, 40, 31069, 41, 40, 21172, 41, 40, 20195, 41, 40,
21628, 41, 40, 23398, 41, 40, 30435, 41, 40, 20225, 41, 40, 36039,
41, 40, 21332, 41, 40, 31085, 41, 40, 20241, 41, 40, 33258, 41, 40,
33267, 41, 50, 49, 50, 50, 50, 51, 50, 52, 50, 53, 50, 54, 50, 55,
50, 56, 50, 57, 51, 48, 51, 49, 51, 50, 51, 51, 51, 52, 51, 53, 4352,
4449, 4354, 4449, 4355, 4449, 4357, 4449, 4358, 4449, 4359, 4449, 4361,
4449, 4363, 4449, 4364, 4449, 4366, 4449, 4367, 4449, 4368, 4449, 4369,
4449, 4370, 4449, 20116, 20845, 19971, 20061, 26666, 26377, 31038,
21517, 29305, 36001, 31069, 21172, 31192, 30007, 36969, 20778, 21360,
27880, 38917, 20241, 20889, 27491, 24038, 21491, 21307, 23447, 23398,
30435, 20225, 36039, 21332, 22812, 51, 54, 51, 55, 51, 56, 51, 57,
52, 48, 52, 49, 52, 50, 52, 51, 52, 52, 52, 53, 52, 54, 52, 55, 52,
56, 52, 57, 53, 48, 49, 26376, 50, 26376, 51, 26376, 52, 26376, 53,
26376, 54, 26376, 55, 26376, 56, 26376, 57, 26376, 49, 48, 26376, 49,
49, 26376, 49, 50, 26376, 12450, 12452, 12454, 12456, 12458, 12459,
12461, 12463, 12465, 12467, 12469, 12471, 12473, 12475, 12477, 12479,
12481, 12484, 12486, 12488, 12490, 12491, 12492, 12493, 12494, 12495,
12498, 12501, 12504, 12507, 12510, 12511, 12512, 12513, 12514, 12516,
12518, 12520, 12521, 12522, 12523, 12524, 12525, 12527, 12528, 12529,
12530, 12450, 12495, 12442, 12540, 12488, 12450, 12523, 12501, 12449,
12450, 12531, 12504, 12442, 12450, 12450, 12540, 12523, 12452, 12491,
12531, 12463, 12441, 12452, 12531, 12481, 12454, 12457, 12531, 12456,
12473, 12463, 12540, 12488, 12441, 12456, 12540, 12459, 12540, 12458,
12531, 12473, 12458, 12540, 12512, 12459, 12452, 12522, 12459, 12521,
12483, 12488, 12459, 12525, 12522, 12540, 12459, 12441, 12525, 12531,
12459, 12441, 12531, 12510, 12461, 12441, 12459, 12441, 12461, 12441,
12491, 12540, 12461, 12517, 12522, 12540, 12461, 12441, 12523, 12479,
12441, 12540, 12461, 12525, 12461, 12525, 12463, 12441, 12521, 12512,
12461, 12525, 12513, 12540, 12488, 12523, 12461, 12525, 12527, 12483,
12488, 12463, 12441, 12521, 12512, 12463, 12441, 12521, 12512, 12488,
12531, 12463, 12523, 12475, 12441, 12452, 12525, 12463, 12525, 12540,
12493, 12465, 12540, 12473, 12467, 12523, 12490, 12467, 12540, 12507,
12442, 12469, 12452, 12463, 12523, 12469, 12531, 12481, 12540, 12512,
12471, 12522, 12531, 12463, 12441, 12475, 12531, 12481, 12475, 12531,
12488, 12479, 12441, 12540, 12473, 12486, 12441, 12471, 12488, 12441,
12523, 12488, 12531, 12490, 12494, 12494, 12483, 12488, 12495, 12452,
12484, 12495, 12442, 12540, 12475, 12531, 12488, 12495, 12442, 12540,
12484, 12495, 12441, 12540, 12524, 12523, 12498, 12442, 12450, 12473,
12488, 12523, 12498, 12442, 12463, 12523, 12498, 12442, 12467, 12498,
12441, 12523, 12501, 12449, 12521, 12483, 12488, 12441, 12501, 12451,
12540, 12488, 12501, 12441, 12483, 12471, 12455, 12523, 12501, 12521,
12531, 12504, 12463, 12479, 12540, 12523, 12504, 12442, 12477, 12504,
12442, 12491, 12498, 12504, 12523, 12484, 12504, 12442, 12531, 12473,
12504, 12442, 12540, 12471, 12441, 12504, 12441, 12540, 12479, 12507,
12442, 12452, 12531, 12488, 12507, 12441, 12523, 12488, 12507, 12531,
12507, 12442, 12531, 12488, 12441, 12507, 12540, 12523, 12507, 12540,
12531, 12510, 12452, 12463, 12525, 12510, 12452, 12523, 12510, 12483,
12495, 12510, 12523, 12463, 12510, 12531, 12471, 12519, 12531, 12511,
12463, 12525, 12531, 12511, 12522, 12511, 12522, 12495, 12441, 12540,
12523, 12513, 12459, 12441, 12513, 12459, 12441, 12488, 12531, 12513,
12540, 12488, 12523, 12516, 12540, 12488, 12441, 12516, 12540, 12523,
12518, 12450, 12531, 12522, 12483, 12488, 12523, 12522, 12521, 12523,
12498, 12442, 12540, 12523, 12540, 12501, 12441, 12523, 12524, 12512,
12524, 12531, 12488, 12465, 12441, 12531, 12527, 12483, 12488, 48,
28857, 49, 28857, 50, 28857, 51, 28857, 52, 28857, 53, 28857, 54, 28857,
55, 28857, 56, 28857, 57, 28857, 49, 48, 28857, 49, 49, 28857, 49,
50, 28857, 49, 51, 28857, 49, 52, 28857, 49, 53, 28857, 49, 54, 28857,
49, 55, 28857, 49, 56, 28857, 49, 57, 28857, 50, 48, 28857, 50, 49,
28857, 50, 50, 28857, 50, 51, 28857, 50, 52, 28857, 104, 80, 97, 100,
97, 65, 85, 98, 97, 114, 111, 86, 112, 99, 24179, 25104, 26157, 21644,
22823, 27491, 26126, 27835, 26666, 24335, 20250, 31038, 112, 65, 110,
65, 956, 65, 109, 65, 107, 65, 75, 66, 77, 66, 71, 66, 99, 97, 108,
107, 99, 97, 108, 112, 70, 110, 70, 956, 70, 956, 103, 109, 103, 107,
103, 72, 122, 107, 72, 122, 77, 72, 122, 71, 72, 122, 84, 72, 122,
956, 108, 109, 108, 100, 108, 107, 108, 102, 109, 110, 109, 956, 109,
109, 109, 99, 109, 107, 109, 109, 109, 50, 99, 109, 50, 109, 50, 107,
109, 50, 109, 109, 51, 99, 109, 51, 109, 51, 107, 109, 51, 109, 8725,
115, 109, 8725, 115, 50, 80, 97, 107, 80, 97, 77, 80, 97, 71, 80, 97,
114, 97, 100, 114, 97, 100, 8725, 115, 114, 97, 100, 8725, 115, 50,
112, 115, 110, 115, 956, 115, 109, 115, 112, 86, 110, 86, 956, 86,
109, 86, 107, 86, 77, 86, 112, 87, 110, 87, 956, 87, 109, 87, 107,
87, 77, 87, 107, 937, 77, 937, 97, 46, 109, 46, 66, 113, 99, 99, 99,
100, 67, 8725, 107, 103, 67, 111, 46, 100, 66, 71, 121, 104, 97, 72,
80, 105, 110, 75, 75, 75, 77, 107, 116, 108, 109, 108, 110, 108, 111,
103, 108, 120, 109, 98, 109, 105, 108, 109, 111, 108, 80, 72, 112,
46, 109, 46, 80, 80, 77, 80, 82, 115, 114, 83, 118, 87, 98, 49, 26085,
50, 26085, 51, 26085, 52, 26085, 53, 26085, 54, 26085, 55, 26085, 56,
26085, 57, 26085, 49, 48, 26085, 49, 49, 26085, 49, 50, 26085, 49,
51, 26085, 49, 52, 26085, 49, 53, 26085, 49, 54, 26085, 49, 55, 26085,
49, 56, 26085, 49, 57, 26085, 50, 48, 26085, 50, 49, 26085, 50, 50,
26085, 50, 51, 26085, 50, 52, 26085, 50, 53, 26085, 50, 54, 26085,
50, 55, 26085, 50, 56, 26085, 50, 57, 26085, 51, 48, 26085, 51, 49,
26085, 35912, 26356, 36040, 28369, 20018, 21477, 22865, 21895, 22856,
25078, 30313, 32645, 34367, 34746, 35064, 37007, 27138, 27931, 28889,
29662, 33853, 37226, 39409, 20098, 21365, 27396, 29211, 34349, 40478,
23888, 28651, 34253, 35172, 25289, 33240, 34847, 24266, 26391, 28010,
29436, 37070, 20358, 20919, 21214, 25796, 27347, 29200, 30439, 34310,
34396, 36335, 38706, 39791, 40442, 30860, 31103, 32160, 33737, 37636,
35542, 22751, 24324, 31840, 32894, 29282, 30922, 36034, 38647, 22744,
23650, 27155, 28122, 28431, 32047, 32311, 38475, 21202, 32907, 20956,
20940, 31260, 32190, 33777, 38517, 35712, 25295, 35582, 20025, 23527,
24594, 29575, 30064, 21271, 30971, 20415, 24489, 19981, 27852, 25976,
32034, 21443, 22622, 30465, 33865, 35498, 27578, 27784, 25342, 33509,
25504, 30053, 20142, 20841, 20937, 26753, 31975, 33391, 35538, 37327,
21237, 21570, 24300, 26053, 28670, 31018, 38317, 39530, 40599, 40654,
26310, 27511, 36706, 24180, 24976, 25088, 25754, 28451, 29001, 29833,
31178, 32244, 32879, 36646, 34030, 36899, 37706, 21015, 21155, 21693,
28872, 35010, 24265, 24565, 25467, 27566, 31806, 29557, 20196, 22265,
23994, 24604, 29618, 29801, 32666, 32838, 37428, 38646, 38728, 38936,
20363, 31150, 37300, 38584, 24801, 20102, 20698, 23534, 23615, 26009,
29134, 30274, 34044, 36988, 26248, 38446, 21129, 26491, 26611, 27969,
28316, 29705, 30041, 30827, 32016, 39006, 25134, 38520, 20523, 23833,
28138, 36650, 24459, 24900, 26647, 38534, 21033, 21519, 23653, 26131,
26446, 26792, 27877, 29702, 30178, 32633, 35023, 35041, 38626, 21311,
28346, 21533, 29136, 29848, 34298, 38563, 40023, 40607, 26519, 28107,
33256, 31520, 31890, 29376, 28825, 35672, 20160, 33590, 21050, 20999,
24230, 25299, 31958, 23429, 27934, 26292, 36667, 38477, 24275, 20800,
21952, 22618, 26228, 20958, 29482, 30410, 31036, 31070, 31077, 31119,
38742, 31934, 34322, 35576, 36920, 37117, 39151, 39164, 39208, 40372,
20398, 20711, 20813, 21193, 21220, 21329, 21917, 22022, 22120, 22592,
22696, 23652, 24724, 24936, 24974, 25074, 25935, 26082, 26257, 26757,
28023, 28186, 28450, 29038, 29227, 29730, 30865, 31049, 31048, 31056,
31062, 31117, 31118, 31296, 31361, 31680, 32265, 32321, 32626, 32773,
33261, 33401, 33879, 35088, 35222, 35585, 35641, 36051, 36104, 36790,
38627, 38911, 38971, 102, 102, 102, 105, 102, 108, 102, 102, 105, 102,
102, 108, 115, 116, 1396, 1398, 1396, 1381, 1396, 1387, 1406, 1398,
1396, 1389, 1497, 1460, 1522, 1463, 1506, 1492, 1499, 1500, 1501, 1512,
1514, 1513, 1473, 1513, 1474, 1513, 1468, 1473, 1513, 1468, 1474, 1488,
1463, 1488, 1464, 1488, 1468, 1489, 1468, 1490, 1468, 1491, 1468, 1492,
1468, 1493, 1468, 1494, 1468, 1496, 1468, 1497, 1468, 1498, 1468, 1499,
1468, 1500, 1468, 1502, 1468, 1504, 1468, 1505, 1468, 1507, 1468, 1508,
1468, 1510, 1468, 1511, 1468, 1512, 1468, 1513, 1468, 1514, 1468, 1493,
1465, 1489, 1471, 1499, 1471, 1508, 1471, 1488, 1500, 1649, 1659, 1662,
1664, 1658, 1663, 1657, 1700, 1702, 1668, 1667, 1670, 1671, 1677, 1676,
1678, 1672, 1688, 1681, 1705, 1711, 1715, 1713, 1722, 1723, 1729, 1726,
1746, 1709, 1735, 1734, 1736, 1739, 1733, 1737, 1744, 1609, 1610, 1620,
1575, 1610, 1620, 1749, 1610, 1620, 1608, 1610, 1620, 1735, 1610, 1620,
1734, 1610, 1620, 1736, 1610, 1620, 1744, 1610, 1620, 1609, 1740, 1610,
1620, 1580, 1610, 1620, 1581, 1610, 1620, 1605, 1610, 1620, 1610, 1576,
1580, 1576, 1581, 1576, 1582, 1576, 1605, 1576, 1609, 1576, 1610, 1578,
1580, 1578, 1581, 1578, 1582, 1578, 1605, 1578, 1609, 1578, 1610, 1579,
1580, 1579, 1605, 1579, 1609, 1579, 1610, 1580, 1581, 1580, 1605, 1581,
1580, 1581, 1605, 1582, 1580, 1582, 1581, 1582, 1605, 1587, 1580, 1587,
1581, 1587, 1582, 1587, 1605, 1589, 1581, 1589, 1605, 1590, 1580, 1590,
1581, 1590, 1582, 1590, 1605, 1591, 1581, 1591, 1605, 1592, 1605, 1593,
1580, 1593, 1605, 1594, 1580, 1594, 1605, 1601, 1580, 1601, 1581, 1601,
1582, 1601, 1605, 1601, 1609, 1601, 1610, 1602, 1581, 1602, 1605, 1602,
1609, 1602, 1610, 1603, 1575, 1603, 1580, 1603, 1581, 1603, 1582, 1603,
1604, 1603, 1605, 1603, 1609, 1603, 1610, 1604, 1580, 1604, 1581, 1604,
1582, 1604, 1605, 1604, 1609, 1604, 1610, 1605, 1580, 1605, 1581, 1605,
1582, 1605, 1605, 1605, 1609, 1605, 1610, 1606, 1580, 1606, 1581, 1606,
1582, 1606, 1605, 1606, 1609, 1606, 1610, 1607, 1580, 1607, 1605, 1607,
1609, 1607, 1610, 1610, 1580, 1610, 1581, 1610, 1582, 1610, 1605, 1610,
1609, 1610, 1610, 1584, 1648, 1585, 1648, 1609, 1648, 32, 1612, 1617,
32, 1613, 1617, 32, 1614, 1617, 32, 1615, 1617, 32, 1616, 1617, 32,
1617, 1648, 1610, 1620, 1585, 1610, 1620, 1586, 1610, 1620, 1606, 1576,
1585, 1576, 1586, 1576, 1606, 1578, 1585, 1578, 1586, 1578, 1606, 1579,
1585, 1579, 1586, 1579, 1606, 1605, 1575, 1606, 1585, 1606, 1586, 1606,
1606, 1610, 1585, 1610, 1586, 1610, 1606, 1610, 1620, 1582, 1610, 1620,
1607, 1576, 1607, 1578, 1607, 1589, 1582, 1604, 1607, 1606, 1607, 1607,
1648, 1610, 1607, 1579, 1607, 1587, 1607, 1588, 1605, 1588, 1607, 1600,
1614, 1617, 1600, 1615, 1617, 1600, 1616, 1617, 1591, 1609, 1591, 1610,
1593, 1609, 1593, 1610, 1594, 1609, 1594, 1610, 1587, 1609, 1587, 1610,
1588, 1609, 1588, 1610, 1581, 1609, 1581, 1610, 1580, 1609, 1580, 1610,
1582, 1609, 1582, 1610, 1589, 1609, 1589, 1610, 1590, 1609, 1590, 1610,
1588, 1580, 1588, 1581, 1588, 1582, 1588, 1585, 1587, 1585, 1589, 1585,
1590, 1585, 1575, 1611, 1578, 1580, 1605, 1578, 1581, 1580, 1578, 1581,
1605, 1578, 1582, 1605, 1578, 1605, 1580, 1578, 1605, 1581, 1578, 1605,
1582, 1580, 1605, 1581, 1581, 1605, 1610, 1581, 1605, 1609, 1587, 1581,
1580, 1587, 1580, 1581, 1587, 1580, 1609, 1587, 1605, 1581, 1587, 1605,
1580, 1587, 1605, 1605, 1589, 1581, 1581, 1589, 1605, 1605, 1588, 1581,
1605, 1588, 1580, 1610, 1588, 1605, 1582, 1588, 1605, 1605, 1590, 1581,
1609, 1590, 1582, 1605, 1591, 1605, 1581, 1591, 1605, 1605, 1591, 1605,
1610, 1593, 1580, 1605, 1593, 1605, 1605, 1593, 1605, 1609, 1594, 1605,
1605, 1594, 1605, 1610, 1594, 1605, 1609, 1601, 1582, 1605, 1602, 1605,
1581, 1602, 1605, 1605, 1604, 1581, 1605, 1604, 1581, 1610, 1604, 1581,
1609, 1604, 1580, 1580, 1604, 1582, 1605, 1604, 1605, 1581, 1605, 1581,
1580, 1605, 1581, 1605, 1605, 1581, 1610, 1605, 1580, 1581, 1605, 1580,
1605, 1605, 1582, 1580, 1605, 1582, 1605, 1605, 1580, 1582, 1607, 1605,
1580, 1607, 1605, 1605, 1606, 1581, 1605, 1606, 1581, 1609, 1606, 1580,
1605, 1606, 1580, 1609, 1606, 1605, 1610, 1606, 1605, 1609, 1610, 1605,
1605, 1576, 1582, 1610, 1578, 1580, 1610, 1578, 1580, 1609, 1578, 1582,
1610, 1578, 1582, 1609, 1578, 1605, 1610, 1578, 1605, 1609, 1580, 1605,
1610, 1580, 1581, 1609, 1580, 1605, 1609, 1587, 1582, 1609, 1589, 1581,
1610, 1588, 1581, 1610, 1590, 1581, 1610, 1604, 1580, 1610, 1604, 1605,
1610, 1610, 1581, 1610, 1610, 1580, 1610, 1610, 1605, 1610, 1605, 1605,
1610, 1602, 1605, 1610, 1606, 1581, 1610, 1593, 1605, 1610, 1603, 1605,
1610, 1606, 1580, 1581, 1605, 1582, 1610, 1604, 1580, 1605, 1603, 1605,
1605, 1580, 1581, 1610, 1581, 1580, 1610, 1605, 1580, 1610, 1601, 1605,
1610, 1576, 1581, 1610, 1587, 1582, 1610, 1606, 1580, 1610, 1589, 1604,
1746, 1602, 1604, 1746, 1575, 1604, 1604, 1607, 1575, 1603, 1576, 1585,
1605, 1581, 1605, 1583, 1589, 1604, 1593, 1605, 1585, 1587, 1608, 1604,
1593, 1604, 1610, 1607, 1608, 1587, 1604, 1605, 1589, 1604, 1609, 1589,
1604, 1609, 32, 1575, 1604, 1604, 1607, 32, 1593, 1604, 1610, 1607,
32, 1608, 1587, 1604, 1605, 1580, 1604, 32, 1580, 1604, 1575, 1604,
1607, 1585, 1740, 1575, 1604, 8212, 8211, 95, 123, 125, 12308, 12309,
12304, 12305, 12298, 12299, 12300, 12301, 12302, 12303, 44, 12289,
58, 63, 33, 35, 38, 42, 45, 60, 62, 92, 36, 37, 64, 32, 1611, 1600,
1611, 32, 1612, 32, 1613, 32, 1614, 1600, 1614, 32, 1615, 1600, 1615,
32, 1616, 1600, 1616, 32, 1617, 1600, 1617, 32, 1618, 1600, 1618, 1569,
1575, 1576, 1577, 1578, 1579, 1580, 1581, 1582, 1583, 1584, 1585, 1586,
1587, 1588, 1589, 1590, 1591, 1592, 1593, 1594, 1601, 1602, 1603, 1604,
1605, 1606, 1607, 1608, 1610, 1604, 1575, 1619, 1604, 1575, 1620, 1604,
1575, 1621, 1604, 1575, 34, 39, 47, 91, 93, 94, 124, 126, 10629, 10630,
12290, 12539, 12449, 12451, 12453, 12455, 12457, 12515, 12517, 12519,
12483, 12540, 12531, 12441, 12442, 162, 163, 172, 166, 165, 8361, 9474,
8592, 8593, 8594, 8595, 9632, 9675, 119127, 119141, 119128, 119141,
119128, 119141, 119150, 119128, 119141, 119151, 119128, 119141, 119152,
119128, 119141, 119153, 119128, 119141, 119154, 119225, 119141, 119226,
119141, 119225, 119141, 119150, 119226, 119141, 119150, 119225, 119141,
119151, 119226, 119141, 119151, 913, 914, 916, 917, 918, 919, 921,
922, 923, 924, 925, 926, 927, 929, 931, 932, 934, 935, 936, 8711, 945,
948, 950, 951, 955, 957, 958, 959, 963, 964, 965, 967, 968, 969, 8706,
20029, 20024, 20033, 131362, 20320, 20411, 20482, 20602, 20633, 20687,
13470, 132666, 20820, 20836, 20855, 132380, 13497, 20839, 20877, 132427,
20887, 20900, 20172, 20908, 20917, 168415, 20995, 13535, 21051, 21062,
21106, 21111, 13589, 21191, 21242, 21253, 21254, 21321, 21338, 21363,
21373, 21375, 133676, 28784, 21450, 21471, 133987, 21483, 21489, 21510,
21662, 21560, 21576, 21608, 21666, 21750, 21776, 21843, 21859, 21892,
21913, 21931, 21939, 21954, 22294, 22295, 22097, 22132, 22766, 22478,
22516, 22541, 22411, 22578, 22577, 22700, 136420, 22770, 22775, 22790,
22810, 22818, 22882, 136872, 136938, 23020, 23067, 23079, 23000, 23142,
14062, 136042, 23304, 23358, 137672, 23491, 23512, 23539, 138008, 23551,
23558, 24371, 14209, 23648, 23744, 23693, 138724, 23875, 138726, 23918,
23915, 23932, 24033, 24034, 14383, 24061, 24104, 24125, 24169, 14434,
139651, 14460, 24240, 24243, 24246, 172946, 140081, 33281, 24354, 14535,
144056, 156122, 24418, 24427, 14563, 24474, 24525, 24535, 24569, 24705,
14650, 14620, 141012, 24775, 24904, 24908, 24910, 24954, 25010, 24996,
25007, 25054, 25104, 25115, 25181, 25265, 25300, 25424, 142092, 25405,
25340, 25448, 25475, 25572, 142321, 25634, 25541, 25513, 14894, 25705,
25726, 25757, 25719, 14956, 25964, 143370, 26083, 26360, 26185, 15129,
15112, 15076, 20882, 20885, 26368, 26268, 32941, 17369, 26395, 26401,
26462, 26451, 144323, 15177, 26618, 26501, 26706, 144493, 26766, 26655,
26900, 15261, 26946, 27043, 27114, 27304, 145059, 27355, 15384, 27425,
145575, 27476, 15438, 27506, 27551, 27579, 146061, 138507, 146170,
27726, 146620, 27839, 27853, 27751, 27926, 27966, 28009, 28024, 28037,
146718, 27956, 28207, 28270, 15667, 28363, 28359, 147153, 28153, 28526,
147294, 147342, 28614, 28729, 28702, 28699, 15766, 28746, 28797, 28791,
28845, 132389, 28997, 148067, 29084, 17323, 29224, 29237, 29264, 149000,
29312, 29333, 149301, 149524, 29562, 29579, 16044, 29605, 16056, 29767,
29788, 29809, 29829, 29898, 16155, 29988, 150582, 30014, 150674, 139679,
30224, 151457, 151480, 151620, 16380, 16392, 30452, 151795, 151794,
151833, 151859, 30494, 30495, 30538, 16441, 30603, 16454, 16534, 152605,
30798, 30924, 16611, 153126, 153242, 153285, 31211, 16687, 31306, 31311,
153980, 154279, 31406, 16898, 154539, 31686, 31689, 16935, 154752,
31954, 17056, 31976, 31971, 32000, 155526, 32099, 17153, 32199, 32258,
32325, 17204, 156200, 156231, 17241, 156377, 32634, 156478, 32661,
32762, 156890, 156963, 32864, 157096, 32880, 144223, 17365, 32946,
33027, 17419, 33086, 23221, 157607, 157621, 144275, 144284, 33284,
36766, 17515, 33425, 33419, 33437, 21171, 33457, 33459, 33469, 33510,
158524, 33565, 33635, 33709, 33571, 33725, 33767, 33619, 33738, 33740,
33756, 158774, 159083, 158933, 17707, 34033, 34035, 34070, 160714,
34148, 159532, 17757, 17761, 159665, 159954, 17771, 34384, 34407, 34409,
34473, 34440, 34574, 34530, 34681, 34600, 34667, 34694, 19799, 34785,
34817, 17913, 34912, 161383, 35031, 35038, 17973, 35066, 13499, 161966,
162150, 18110, 18119, 35488, 35565, 35722, 162984, 36011, 36033, 36123,
36215, 163631, 133124, 36299, 36284, 36336, 133342, 36564, 36664, 165330,
165357, 37012, 37105, 37137, 165678, 37147, 37432, 37591, 37592, 37500,
37881, 37909, 166906, 38283, 18837, 38327, 167287, 18918, 38595, 23986,
38691, 168261, 168474, 19054, 19062, 38880, 168970, 19122, 169110,
38923, 38953, 169398, 39138, 19251, 39209, 39335, 39362, 39422, 19406,
170800, 39698, 40000, 40189, 19662, 19693, 40295, 172238, 19704, 172293,
172558, 172689, 19798, 40702, 40709, 40719, 40726, 173568
};
/*
* This macro extracts the information about a character from the
* Unicode character tables.
*/
#define GetUniCharDecompInfo(ch) (decompGroupMap[(decompPageMap[(((int)(ch)) & 0x1fffff) >> DECOMP_OFFSET_BITS] << DECOMP_OFFSET_BITS) | ((ch) & ((1 << DECOMP_OFFSET_BITS)-1))])
#define GetDecompShift(info) ((info) & 0xffff)
#define GetDecompLen(info) ((info) >> 16)
#define COMP_OFFSET_BITS 8
/*
* The pageMap is indexed by page number and returns an alternate page number
* that identifies a unique page of characters. Many Unicode characters map
* to the same alternate page number.
*/
static unsigned char compPageMap[] = {
0, 1, 2, 3, 4, 5, 6, 5, 5, 7, 5, 8, 9, 10, 5, 5, 11, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 12, 13, 5, 14, 15, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 16, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5
};
/*
* The groupMap is indexed by combining the alternate page number with
* the page offset and returns a group number that identifies a unique
* set of character attributes.
*/
static int compGroupMap[] = {
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, 65564, 65640, 65738, -1, -1, 30,
91, 141, 65, 121, 65701, 38, 94, 1, 65604, 124, 44, 100, 12, 76, 77,
-1, 48, 105, 17, 84, 136, 54, 113, 23, 24, -1, -1, -1, -1, -1, -1,
140, 64, 120, 71, 123, 65573, 99, 10, 75, 129, 47, 104, 16, 15, 83,
135, -1, 110, 22, 86, 137, 59, 117, 118, 28, 89, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, 102, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6, -1,
65713, 65575, 101, 65550, -1, -1, 42, -1, -1, -1, -1, 65576, -1, -1,
-1, -1, 130, 50, 65678, -1, 65628, -1, -1, -1, 115, -1, -1, -1, -1,
-1, 32, -1, 65742, 65600, 67, 65704, -1, -1, 5, -1, -1, -1, -1, 65549,
-1, -1, -1, -1, 107, 20, 65626, -1, 65587, -1, -1, -1, 87, -1, -1,
-1, -1, -1, 142, 66, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, 106, 18, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, 37, 93, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, 65624, 65722, -1, -1, -1, -1, 65632, 65730,
-1, -1, -1, -1, -1, -1, 65597, 65699, 65567, 65649, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 65728,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 81, 131,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 119, 33, -1, -1,
-1, -1, -1, -1, 65546, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, 65593, 65696, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 65675,
65554, 65625, 65724, -1, -1, -1, -1, 65731, 65590, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, 65729, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, 131073, 131074, 131075, 131077, 131079, -1, 131080, 131082, 131083,
131084, 131098, 131102, 131085, -1, -1, 131086, -1, 131087, -1, 131076,
131078, -1, -1, -1, -1, -1, -1, 131103, -1, -1, -1, -1, -1, -1, -1,
131088, 131104, 131101, 131097, 131092, 131089, -1, -1, -1, -1, 131094,
131093, -1, 131090, 131095, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, 131091, -1, -1, 131072, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, 34, -1, -1, -1, 122, -1, 96, -1, 8, -1, -1, -1, -1, -1, 80,
-1, 65586, -1, -1, -1, 85, -1, -1, -1, 26, -1, -1, 65539, -1, 65707,
-1, -1, 2, -1, -1, -1, 95, -1, 7, -1, 125, -1, -1, -1, -1, -1, 51,
-1, 111, -1, -1, -1, 56, -1, -1, -1, 0, 138, 62, -1, -1, 65664, -1,
-1, -1, 39, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, 65736, -1, -1, -1, -1, -1, -1, -1, -1, -1, 97, -1, -1,
65714, -1, 103, 14, 65622, 132, -1, 65581, -1, -1, -1, 65727, -1, -1,
-1, -1, 139, -1, -1, -1, 65566, -1, -1, -1, 65706, -1, 65663, -1, -1,
72, -1, -1, 65670, -1, 79, 133, 65582, 52, -1, 65556, -1, -1, -1, 65687,
-1, -1, -1, -1, 63, -1, -1, -1, 65744, -1, -1, -1, 65659, -1, 65595,
-1, -1, -1, -1, -1, -1, -1, -1, 65658, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, 65661, 65545, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, 65651, 65542, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, 65682, 65559, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, 143, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
65733, -1, 65657, -1, -1, -1, -1, -1, -1, -1, -1, 196618, 131108, 196619,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, 65618, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, 65612, -1, -1, 65611, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, 65734, -1, -1, -1, -1, -1, -1, -1,
65656, -1, -1, 65655, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, 196611, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 196612,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
196613, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, 196614, 196615, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, 65577, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 131105, -1, -1,
-1, -1, -1, -1, -1, 98, 65584, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, 131106, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 65578,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, 65716, -1, -1, 196616, -1, -1, -1, 127, -1, -1, -1, 65630, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, 131107, 196617, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 131096, -1,
-1, -1, -1, -1, -1, -1, 19, 65695, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, 196610, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, 131081, -1, -1, -1, -1, 196608, -1, -1, -1, -1, -1,
-1, -1, -1, -1, 3, -1, -1, 65538, -1, -1, 196609, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 65616, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 65679,
65557, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, 65685, 65561, -1, -1, -1, -1, -1, -1, 65743, 65601, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, 114, 25, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 65673, 65553,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, 65540, 65605, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, 82, 134, 65591, 65692, 65693, 65565, 65641, 65739, 58,
116, 65568, 65652, 65543, 65609, 65610, 65710, 36, 92, -1, -1, -1,
-1, -1, -1, 9, 73, -1, -1, -1, -1, -1, -1, 53, 108, 65690, 65563, 65639,
65737, 65598, 65700, 27, 88, 65541, 65606, 65607, 65709, 65572, 65667,
11, 69, -1, -1, -1, -1, -1, -1, 126, 45, -1, -1, -1, -1, -1, -1, 13,
78, -1, -1, -1, -1, -1, -1, 55, 112, -1, -1, -1, -1, -1, -1, 29, 90,
-1, -1, -1, -1, -1, -1, -1, 70, -1, -1, -1, -1, -1, -1, 128, 46, 65683,
65560, 65635, 65732, 65592, 65694, 109, 21, 65642, 65740, 65599, 65702,
65569, 65653, 65544, -1, -1, -1, 65574, -1, -1, -1, -1, -1, -1, -1,
65552, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, 65537, -1, -1, -1, -1, -1, -1, -1,
-1, 40, -1, -1, -1, -1, -1, -1, 65680, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, 65570, -1, -1, -1, -1, -1, -1, -1, 4, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, 65705, -1, 65660, -1, 65614, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, 65698, -1, 65644, -1, 65741, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, 65711, -1, -1, -1, -1, 65619, -1, -1, 65676,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, 65668, -1, 65548, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 65648,
-1, -1, -1, -1, -1, -1, 65547, -1, 65715, -1, -1, 65551, -1, -1, -1,
-1, 65681, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, 65596, -1, -1, 65647, 65536, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, 65721, 65583, -1, -1, 65558, 65631, -1,
-1, 65688, 65562, 65637, 65735, -1, -1, -1, -1, 65646, 65745, -1, -1,
65571, 65662, -1, -1, -1, -1, -1, -1, -1, -1, -1, 65580, 65579, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 65602, -1,
-1, -1, -1, -1, 65613, 65712, -1, 65669, -1, -1, -1, -1, -1, -1, 65555,
65629, 65725, 65588, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 65718, -1, -1,
-1, -1, 65708, -1, 65703, -1, 65697, -1, 65686, -1, 65684, -1, 65677,
-1, 65671, -1, 65665, -1, 65650, -1, 65645, -1, 65638, -1, 65633, -1,
-1, 65623, -1, 65620, -1, 65615, -1, -1, -1, -1, -1, -1, 60, -1, -1,
74, -1, -1, 68, -1, -1, 61, -1, -1, 57, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, 131099, 131100, -1, -1, 65717, -1, -1, -1, -1,
-1, -1, -1, -1, 65691, -1, -1, -1, -1, 65674, -1, 65672, -1, 65666,
-1, 65654, -1, 65643, -1, 65636, -1, 65634, -1, 65627, -1, 65621, -1,
65617, -1, 65608, -1, 65603, -1, -1, 65594, -1, 65589, -1, 65585, -1,
-1, -1, -1, -1, -1, 41, -1, -1, 31, -1, -1, 49, -1, -1, 43, -1, -1,
35, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, 65726, 65723, 65720, 65719, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, 65689, -1, -1
};
/*
* Lists of compositions for characters that appears only in one composition
*/
static int compFirstList[][2] = {
{824, 8817}, {837, 8119}, {3530, 3549}, {837, 8116}, {770, 7896},
{837, 8090}, {776, 1243}, {837, 8076}, {837, 8114}, {783, 1143},
{780, 494}, {824, 8772}, {824, 8742}, {769, 7727}, {769, 7688},
{824, 8777}, {837, 8178}, {770, 7879}, {772, 481}, {824, 8938},
{769, 1116}, {772, 7737}, {824, 8824}, {776, 1259}, {837, 8099},
{772, 7773}, {824, 8833}, {837, 8083}, {824, 8814}, {837, 8069},
{776, 1268}, {776, 7802}, {837, 8074}, {837, 8110}, {837, 8183},
{824, 8840}, {837, 8094}, {775, 7711}, {837, 8130}, {769, 506},
{769, 7726}, {3031, 2964}, {3158, 3144}, {824, 8931}, {824, 8930},
{769, 1036}, {776, 1247}, {824, 8821}, {3006, 3019}, {12441, 12489},
{788, 8172}, {769, 511}, {824, 8941}, {12441, 12487}, {772, 561},
{837, 8066}, {837, 8102}, {772, 492}, {12441, 12485}, {776, 1261},
{824, 8802}, {769, 7800}, {837, 8086}, {837, 8108}, {769, 507},
{775, 7785}, {824, 8876}, {12441, 12482}, {770, 308}, {770, 7897},
{837, 8091}, {837, 8092}, {12441, 12480}, {837, 8077}, {837, 8078},
{1620, 1728}, {1620, 1747}, {824, 8877}, {824, 8622}, {12441, 12393},
{4142, 4134}, {12441, 12478}, {1620, 1730}, {824, 8713},
{12441, 12391}, {12441, 12476}, {776, 1246}, {12441, 12389},
{775, 7780}, {774, 7708}, {772, 555}, {12441, 12474}, {769, 510},
{824, 8939}, {3285, 3275}, {824, 8825}, {775, 7782}, {12441, 12386},
{12441, 12472}, {837, 8100}, {12441, 12470}, {824, 8928},
{12441, 12384}, {837, 8084}, {824, 8800}, {837, 8070}, {837, 8106},
{12441, 12468}, {824, 8655}, {12441, 12382}, {824, 8836},
{824, 8816}, {824, 8769}, {776, 7803}, {12441, 12380}, {776, 1242},
{837, 8075}, {837, 8111}, {12441, 12466}, {2364, 2356}, {2364, 2353},
{1620, 1574}, {776, 1111}, {776, 1273}, {824, 8603}, {783, 1142},
{824, 8841}, {776, 1260}, {837, 8180}, {12441, 12378}, {12441, 12464},
{837, 8095}, {824, 8740}, {824, 8879}, {769, 1107}, {12441, 12376},
{12441, 12462}, {770, 7878}, {12441, 12460}, {772, 480},
{824, 8716}, {12441, 12374}, {772, 554}, {772, 7736}, {837, 8135},
{824, 8813}, {776, 1258}, {837, 8098}, {12441, 12372}, {772, 7772},
{12441, 12370}, {776, 1255}, {824, 8832}, {12441, 12542},
{837, 8082}, {12441, 12532}, {837, 8067}, {837, 8068}, {837, 8103},
{3390, 3403}, {772, 493}, {12441, 12368}, {824, 8653}, {769, 7801},
{837, 8087}, {775, 7710}, {837, 8109}, {12441, 12366}, {769, 7689},
{824, 8602}, {776, 1272}, {837, 8132}, {12441, 12364}, {837, 8093},
{837, 8079}, {824, 8708}, {824, 8878}, {772, 478}, {769, 1027},
{824, 8775}, {3285, 3264}, {12441, 12446}, {12441, 12436},
{12441, 12538}, {12441, 12537}, {824, 8820}, {775, 7781},
{12441, 12536}, {774, 7709}, {824, 8940}, {12441, 12535},
{776, 1254}, {775, 7835}, {780, 495}, {775, 7783}, {772, 560},
{837, 8101}, {1620, 1572}, {2364, 2345}, {824, 8929}, {776, 1031},
{837, 8085}, {824, 8815}, {837, 8071}, {837, 8107}, {824, 8654},
{772, 479}, {775, 7784}, {776, 1269}, {824, 8837}
};
static int compSecondList[][2] = {
{3545, 3548}, {3545, 3550}, {3398, 3404}, {2503, 2507}, {2503, 2508},
{2887, 2891}, {2887, 2888}, {2887, 2892}, {3270, 3274}, {3270, 3272},
{1575, 1570}, {1575, 1573}
};
/*
* Compositions matrix
*/
static int compBothList[144][37] = {
{
8179, 8060, 974, 0, 8032, 0, 8033, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 8182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 204, 205, 206, 0, 296, 0, 298, 300, 0, 304, 207, 7880, 463,
520, 522, 7882, 302, 7724, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0
},
{
8115, 8048, 940, 0, 7936, 0, 7937, 8113, 8112, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 8118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0
},
{
0, 0, 0, 0, 0, 0, 0, 0, 0, 3546, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 8157, 8158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
8159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 7873, 7871, 0, 0, 7877, 0, 0, 0, 0, 0, 0, 7875, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 7846, 7844, 0, 0, 7850, 0, 0, 0, 0, 0, 0, 7848, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
8131, 8052, 942, 0, 7968, 0, 7969, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 8134, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 8154, 906, 0, 7992, 0, 7993, 8153, 8152, 0, 0, 938, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0
},
{
0, 7962, 7964, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 0, 0, 293, 0, 0, 0, 0, 0, 0, 7715, 7719, 0, 543, 0, 0, 7717,
0, 0, 0, 7721, 7723, 0, 7830, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0
},
{
0, 7986, 7988, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
7990, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 504, 323, 0, 0, 209, 0, 0, 0, 0, 7748, 0, 0, 327, 0, 0, 7750,
0, 0, 0, 325, 0, 7754, 7752, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0
},
{
0, 8002, 8004, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 0, 0, 0, 0, 0, 0, 0, 1217, 0, 0, 1244, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 505, 324, 0, 0, 241, 0, 0, 0, 0, 7749, 0, 0, 328, 0, 0, 7751,
0, 0, 0, 326, 0, 7755, 7753, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0
},
{
0, 0, 7743, 0, 0, 0, 0, 0, 0, 0, 7745, 0, 0, 0, 0, 0, 7747, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7786, 0, 0, 356, 0, 0, 7788, 0, 0,
0, 354, 0, 7792, 7790, 0, 538, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 7701, 7703, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 3402, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 0, 7757, 0, 0, 0, 0, 557, 0, 0, 0, 7759, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
8105, 8043, 8045, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 8047, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 0, 347, 349, 0, 0, 0, 0, 0, 0, 7777, 0, 0, 353, 0, 0, 7779,
0, 0, 0, 351, 0, 0, 0, 0, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 7922, 221, 374, 0, 7928, 0, 562, 0, 0, 7822, 376, 7926, 0, 0,
0, 7924, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0
},
{
0, 0, 377, 7824, 0, 0, 0, 0, 0, 0, 379, 0, 0, 381, 0, 0, 7826,
0, 0, 0, 0, 0, 0, 7828, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 0, 0, 7853, 0, 0, 0, 0, 7863, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
8188, 8186, 911, 0, 8040, 0, 8041, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
8088, 7978, 7980, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 7982, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 7923, 253, 375, 0, 7929, 0, 563, 0, 0, 7823, 255, 7927, 0, 0,
0, 7925, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7833, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0
},
{
0, 8018, 8020, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
8022, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 192, 193, 194, 0, 195, 0, 256, 258, 0, 550, 196, 7842, 461,
512, 514, 7840, 260, 0, 0, 0, 0, 0, 0, 0, 0, 197, 0, 0, 7680, 0,
0, 0, 0, 0, 0, 0
},
{
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 12499, 12500, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 7847, 7845, 0, 0, 7851, 0, 0, 0, 0, 0, 0, 7849, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 7915, 7913, 0, 0, 7919, 0, 0, 0, 0, 0, 0, 7917, 0, 0, 0, 7921,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
8124, 8122, 902, 0, 7944, 0, 7945, 8121, 8120, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0
},
{
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 12508, 12509, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 7954, 7956, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 7760, 7762, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 0, 500, 284, 0, 0, 0, 7712, 286, 0, 288, 0, 0, 486, 0, 0, 0,
0, 0, 0, 290, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 0, 979, 0, 0, 0, 0, 0, 0, 0, 0, 980, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 8141, 8142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
8143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 12496, 12497, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 7872, 7870, 0, 0, 7876, 0, 0, 0, 0, 0, 0, 7874, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 12505, 12506, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 0, 313, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 317, 0, 0, 7734, 0, 0,
0, 315, 0, 7740, 7738, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 7995, 7997, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
7999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
8097, 8035, 8037, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 8039, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 0, 7729, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 489, 0, 0, 7731, 0, 0,
0, 311, 0, 0, 7733, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 0, 340, 0, 0, 0, 0, 0, 0, 0, 7768, 0, 0, 344, 528, 530, 7770,
0, 0, 0, 342, 0, 0, 7774, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 12502, 12503, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 0, 7756, 0, 0, 0, 0, 556, 0, 0, 0, 7758, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 8056, 972, 0, 8000, 0, 8001, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 1117, 0, 0, 0, 0, 0, 1251, 1081, 0, 0, 1253, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
8080, 7970, 7972, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 7974, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 7808, 7810, 372, 0, 0, 0, 0, 0, 0, 7814, 7812, 0, 0, 0, 0, 7816,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 8010, 8012, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 8058, 973, 0, 8016, 0, 8017, 8161, 8160, 0, 0, 971, 0, 0, 0,
0, 0, 0, 0, 8166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0
},
{
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 12412, 12413, 0, 0, 0, 0, 0, 0, 0, 0
},
{
8072, 7946, 7948, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 7950, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 0, 0, 0, 0, 7805, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7807, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 12400, 12401, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 12409, 12410, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 8162, 944, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8167,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 0, 0, 0, 0, 0, 0, 1263, 1118, 0, 0, 1265, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1267, 0, 0, 0, 0, 0, 0
},
{
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7683, 0, 0, 0, 0, 0, 7685, 0, 0,
0, 0, 0, 0, 7687, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7690, 0, 0, 270, 0, 0, 7692, 0, 0,
0, 7696, 0, 7698, 7694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 7857, 7855, 0, 0, 7861, 0, 0, 0, 0, 0, 0, 7859, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 0, 509, 0, 0, 0, 0, 483, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 12406, 12407, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 7987, 7989, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
7991, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 8027, 8029, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
8031, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7691, 0, 0, 271, 0, 0, 7693, 0, 0,
0, 7697, 0, 7699, 7695, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 0, 0, 0, 0, 0, 0, 0, 1233, 0, 0, 1235, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 7963, 7965, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 12403, 12404, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 236, 237, 238, 0, 297, 0, 299, 301, 0, 0, 239, 7881, 464, 521,
523, 7883, 303, 7725, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0
},
{
0, 210, 211, 212, 0, 213, 0, 332, 334, 0, 558, 214, 7886, 465,
524, 526, 7884, 490, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 336, 416,
0, 0, 0, 0, 0
},
{
0, 0, 7764, 0, 0, 0, 0, 0, 0, 0, 7766, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 8003, 8005, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 1104, 0, 0, 0, 0, 0, 0, 1239, 0, 0, 1105, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 8184, 908, 0, 8008, 0, 8009, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 7900, 7898, 0, 0, 7904, 0, 0, 0, 0, 0, 0, 7902, 0, 0, 0, 7906,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
8064, 7938, 7940, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 7942, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 242, 243, 244, 0, 245, 0, 333, 335, 0, 559, 246, 7887, 466,
525, 527, 7885, 491, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 337, 417,
0, 0, 0, 0, 0
},
{
0, 217, 218, 219, 0, 360, 0, 362, 364, 0, 0, 220, 7910, 467, 532,
534, 7908, 370, 7796, 0, 0, 0, 7798, 0, 0, 0, 366, 0, 0, 0, 368,
431, 7794, 0, 0, 0, 0
},
{
0, 8170, 910, 0, 0, 0, 8025, 8169, 8168, 0, 0, 939, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7787, 7831, 0, 357, 0, 0, 7789, 0,
0, 0, 355, 0, 7793, 7791, 0, 539, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0
},
{
0, 476, 472, 0, 0, 0, 0, 470, 0, 0, 0, 0, 0, 474, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
8089, 7979, 7981, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 7983, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 0, 378, 7825, 0, 0, 0, 0, 0, 0, 380, 0, 0, 382, 0, 0, 7827,
0, 0, 0, 0, 0, 0, 7829, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 8019, 8021, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
8023, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7682, 0, 0, 0, 0, 0, 7684, 0, 0,
0, 0, 0, 0, 7686, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 7955, 7957, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 7761, 7763, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 0, 0, 292, 0, 0, 0, 0, 0, 0, 7714, 7718, 0, 542, 0, 0, 7716,
0, 0, 0, 7720, 7722, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0
},
{
0, 8050, 941, 0, 7952, 0, 7953, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
8140, 8138, 905, 0, 7976, 0, 7977, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 0, 0, 0, 0, 0, 0, 0, 1232, 0, 0, 1234, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3018, 3020, 0, 0
},
{
0, 0, 501, 285, 0, 0, 0, 7713, 287, 0, 289, 0, 0, 487, 0, 0, 0,
0, 0, 0, 291, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 0, 7742, 0, 0, 0, 0, 0, 0, 0, 7744, 0, 0, 0, 0, 0, 7746, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 0, 508, 0, 0, 0, 0, 482, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 8173, 901, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8129,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 1024, 0, 0, 0, 0, 0, 0, 1238, 0, 0, 1025, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 0, 314, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 318, 0, 0, 7735, 0, 0,
0, 316, 0, 7741, 7739, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 0, 346, 348, 0, 0, 0, 0, 0, 0, 7776, 0, 0, 352, 0, 0, 7778,
0, 0, 0, 350, 0, 0, 0, 0, 536, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 7700, 7702, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 7891, 7889, 0, 0, 7895, 0, 0, 0, 0, 0, 0, 7893, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
8081, 7971, 7973, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 7975, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
8104, 8042, 8044, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 8046, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 0, 341, 0, 0, 0, 0, 0, 0, 0, 7769, 0, 0, 345, 529, 531, 7771,
0, 0, 0, 343, 0, 0, 7775, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 0, 0, 0, 8164, 0, 8165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 8011, 8013, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7818, 7820, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 0, 0, 7852, 0, 0, 0, 0, 7862, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 475, 471, 0, 0, 0, 0, 469, 0, 0, 0, 0, 0, 473, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
8073, 7947, 7949, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 7951, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 7809, 7811, 373, 0, 0, 0, 0, 0, 0, 7815, 7813, 0, 0, 0, 0, 7817,
0, 0, 0, 0, 0, 0, 0, 0, 0, 7832, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7819, 7821, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 7914, 7912, 0, 0, 7918, 0, 0, 0, 0, 0, 0, 7916, 0, 0, 0, 7920,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 0, 263, 265, 0, 0, 0, 0, 0, 0, 267, 0, 0, 269, 0, 0, 0, 0, 0,
0, 231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 200, 201, 202, 0, 7868, 0, 274, 276, 0, 278, 203, 7866, 282,
516, 518, 7864, 280, 7706, 0, 552, 0, 7704, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0
},
{
0, 8136, 904, 0, 7960, 0, 7961, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 232, 233, 234, 0, 7869, 0, 275, 277, 0, 279, 235, 7867, 283,
517, 519, 7865, 281, 7707, 0, 553, 0, 7705, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0
},
{
0, 0, 7728, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 488, 0, 0, 7730, 0, 0,
0, 310, 0, 0, 7732, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 8054, 943, 0, 7984, 0, 7985, 8145, 8144, 0, 0, 970, 0, 0, 0,
0, 0, 0, 0, 8150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0
},
{
0, 7994, 7996, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
7998, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3271, 0
},
{
8096, 8034, 8036, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 8038, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 0, 0, 309, 0, 0, 0, 0, 0, 0, 0, 0, 0, 496, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 7890, 7888, 0, 0, 7894, 0, 0, 0, 0, 0, 0, 7892, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 7901, 7899, 0, 0, 7905, 0, 0, 0, 0, 0, 0, 7903, 0, 0, 0, 7907,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 1037, 0, 0, 0, 0, 0, 1250, 1049, 0, 0, 1252, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 0, 0, 0, 0, 0, 0, 0, 1218, 0, 0, 1245, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
8065, 7939, 7941, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 7943, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 0, 7765, 0, 0, 0, 0, 0, 0, 0, 7767, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 0, 0, 0, 0, 7804, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7806, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 249, 250, 251, 0, 361, 0, 363, 365, 0, 0, 252, 7911, 468, 533,
535, 7909, 371, 7797, 0, 0, 0, 7799, 0, 0, 0, 367, 0, 0, 0, 369,
432, 7795, 0, 0, 0, 0
},
{
0, 8146, 912, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8151,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 0, 0, 0, 0, 0, 0, 1262, 1038, 0, 0, 1264, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1266, 0, 0, 0, 0, 0, 0
},
{
0, 224, 225, 226, 0, 227, 0, 257, 259, 0, 551, 228, 7843, 462,
513, 515, 7841, 261, 0, 0, 0, 0, 0, 0, 0, 0, 229, 0, 0, 7681, 0,
0, 0, 0, 0, 0, 0
},
{
0, 0, 262, 264, 0, 0, 0, 0, 0, 0, 266, 0, 0, 268, 0, 0, 0, 0, 0,
0, 199, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 7856, 7854, 0, 0, 7860, 0, 0, 0, 0, 0, 0, 7858, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1571
},
};
#define GetUniCharCompInfo(ch) (compGroupMap[(compPageMap[(((int)(ch)) & 0x1fffff) >> COMP_OFFSET_BITS] << COMP_OFFSET_BITS) | ((ch) & ((1 << COMP_OFFSET_BITS)-1))])
#define CompSingleMask (1 << 16)
#define CompMask ((1 << 16) - 1)
#define CompSecondMask (1 << 17)
ejabberd-2.1.11/src/stringprep/uni_parse2.tcl 0000664 0000000 0000000 00000041770 12240230175 015766 0 ustar # uni_parse2.tcl --
#
# This program parses the UnicodeData file and generates the
# corresponding uni_norm.c file with compressed character
# data tables. The input to this program should be
# UnicodeData-3.2.0.txt and CompositionExclusions-3.2.0.txt files from:
# ftp://ftp.unicode.org/Public/UNIDATA/
#
# Copyright (c) 1998-1999 by Scriptics Corporation.
# All rights reserved.
#
# Modified for ejabberd by Alexey Shchepin
#
# RCS: @(#) $Id$
namespace eval uni {
set cclass_shift 8
set decomp_shift 8
set comp_shift 8
set shift 5; # number of bits of data within a page
# This value can be adjusted to find the
# best split to minimize table size
variable pMap; # map from page to page index, each entry is
# an index into the pages table, indexed by
# page number
variable pages; # map from page index to page info, each
# entry is a list of indices into the groups
# table, the list is indexed by the offset
variable groups; # list of character info values, indexed by
# group number, initialized with the
# unassigned character group
variable categories {
Cn Lu Ll Lt Lm Lo Mn Me Mc Nd Nl No Zs Zl Zp
Cc Cf Co Cs Pc Pd Ps Pe Pi Pf Po Sm Sc Sk So
}; # Ordered list of character categories, must
# match the enumeration in the header file.
variable titleCount 0; # Count of the number of title case
# characters. This value is used in the
# regular expression code to allocate enough
# space for the title case variants.
}
proc uni::getValue {items index} {
variable categories
variable titleCount
# Extract character info
set category [lindex $items 2]
if {[scan [lindex $items 12] %4x toupper] == 1} {
set toupper [expr {$index - $toupper}]
} else {
set toupper {}
}
if {[scan [lindex $items 13] %4x tolower] == 1} {
set tolower [expr {$tolower - $index}]
} else {
set tolower {}
}
if {[scan [lindex $items 14] %4x totitle] == 1} {
set totitle [expr {$index - $totitle}]
} else {
set totitle {}
}
set categoryIndex [lsearch -exact $categories $category]
if {$categoryIndex < 0} {
puts "Unexpected character category: $index($category)"
set categoryIndex 0
} elseif {$category == "Lt"} {
incr titleCount
}
return "$categoryIndex,$toupper,$tolower,$totitle"
}
proc uni::getGroup {value} {
variable groups
set gIndex [lsearch -exact $groups $value]
if {$gIndex == -1} {
set gIndex [llength $groups]
lappend groups $value
}
return $gIndex
}
proc uni::addPage {info} {
variable pMap
variable pages
set pIndex [lsearch -exact $pages $info]
if {$pIndex == -1} {
set pIndex [llength $pages]
lappend pages $info
}
lappend pMap $pIndex
return
}
proc uni::addPage {map_var pages_var info} {
variable $map_var
variable $pages_var
set pIndex [lsearch -exact [set $pages_var] $info]
if {$pIndex == -1} {
set pIndex [llength [set $pages_var]]
lappend $pages_var $info
}
lappend $map_var $pIndex
return
}
proc uni::load_exclusions {data} {
variable exclusions
foreach line [split $data \n] {
if {$line == ""} continue
set items [split $line " "]
if {[lindex $items 0] == "#"} continue
scan [lindex $items 0] %x index
set exclusions($index) ""
}
}
proc uni::load_tables {data} {
variable cclass_map
variable decomp_map
variable comp_map
variable comp_first
variable comp_second
variable exclusions
foreach line [split $data \n] {
if {$line == ""} continue
set items [split $line \;]
scan [lindex $items 0] %x index
set cclass [lindex $items 3]
set decomp [lindex $items 5]
set cclass_map($index) $cclass
#set decomp_map($index) $cclass
if {$decomp != ""} {
if {[string index [lindex $decomp 0] 0] == "<"} {
set decomp1 [lreplace $decomp 0 0]
set decomp {}
foreach ch $decomp1 {
scan $ch %x ch
lappend decomp $ch
}
set decomp_map($index) $decomp
} else {
switch -- [llength $decomp] {
1 {
scan $decomp %x ch
set decomp_map($index) $ch
}
2 {
scan $decomp "%x %x" ch1 ch2
set decomp [list $ch1 $ch2]
set decomp_map($index) $decomp
# hackish
if {(![info exists cclass_map($ch1)] || \
$cclass_map($ch1) == 0) && \
![info exists exclusions($index)]} {
if {[info exists comp_first($ch1)]} {
incr comp_first($ch1)
} else {
set comp_first($ch1) 1
}
if {[info exists comp_second($ch2)]} {
incr comp_second($ch2)
} else {
set comp_second($ch2) 1
}
set comp_map($decomp) $index
} else {
puts "Excluded $index"
}
}
default {
puts "Bad canonical decomposition: $line"
}
}
}
#puts "[format 0x%0.4x $index]\t$cclass\t$decomp_map($index)"
}
}
#puts [array get comp_first]
#puts [array get comp_second]
}
proc uni::buildTables {} {
variable cclass_shift
variable decomp_shift
variable comp_shift
variable cclass_map
variable cclass_pmap {}
variable cclass_pages {}
variable decomp_map
variable decomp_pmap {}
variable decomp_pages {}
variable decomp_list {}
variable comp_map
variable comp_pmap {}
variable comp_pages {}
variable comp_first
variable comp_second
variable comp_first_list {}
variable comp_second_list {}
variable comp_x_list {}
variable comp_y_list {}
variable comp_both_map {}
set cclass_info {}
set decomp_info {}
set comp_info {}
set cclass_mask [expr {(1 << $cclass_shift) - 1}]
set decomp_mask [expr {(1 << $decomp_shift) - 1}]
set comp_mask [expr {(1 << $comp_shift) - 1}]
foreach comp [array names comp_map] {
set ch1 [lindex $comp 0]
if {[info exists comp_first($ch1)] && $comp_first($ch1) > 0 && \
[info exists comp_second($ch1)] && $comp_second($ch1) > 0} {
if {[lsearch -exact $comp_x_list $ch1] < 0} {
set i [llength $comp_x_list]
lappend comp_x_list $ch1
set comp_info_map($ch1) $i
lappend comp_y_list $ch1
set comp_info_map($ch1) $i
puts "There should be no symbols which appears on"
puts "both first and second place in composition"
exit
}
}
}
foreach comp [array names comp_map] {
set ch1 [lindex $comp 0]
set ch2 [lindex $comp 1]
if {$comp_first($ch1) == 1 && ![info exists comp_second($ch1)]} {
set i [llength $comp_first_list]
lappend comp_first_list [list $ch2 $comp_map($comp)]
set comp_info_map($ch1) [expr {$i | (1 << 16)}]
} elseif {$comp_second($ch2) == 1 && ![info exists comp_first($ch2)]} {
set i [llength $comp_second_list]
lappend comp_second_list [list $ch1 $comp_map($comp)]
set comp_info_map($ch2) [expr {$i | (1 << 16) | (1 << 17)}]
} else {
if {[lsearch -exact $comp_x_list $ch1] < 0} {
set i [llength $comp_x_list]
lappend comp_x_list $ch1
set comp_info_map($ch1) $i
}
if {[lsearch -exact $comp_y_list $ch2] < 0} {
set i [llength $comp_y_list]
lappend comp_y_list $ch2
set comp_info_map($ch2) [expr {$i | (1 << 17)}]
}
}
}
set next 0
for {set i 0} {$i <= 0x10ffff} {incr i} {
#set gIndex [getGroup [getValue $i]]
set cclass_offset [expr {$i & $cclass_mask}]
if {[info exists cclass_map($i)]} {
set cclass $cclass_map($i)
} else {
set cclass 0
}
lappend cclass_info $cclass
if {$cclass_offset == $cclass_mask} {
addPage cclass_pmap cclass_pages $cclass_info
set cclass_info {}
}
set decomp_offset [expr {$i & $decomp_mask}]
if {[info exists decomp_map($i)]} {
set decomp $decomp_map($i)
set b 1
while {$b} {
set b 0
for {set j 0} {$j < [llength $decomp]} {incr j} {
if {[info exists \
decomp_map([set ch1 [lindex $decomp $j]])]} {
#puts -$decomp
set decomp [eval [list lreplace $decomp $j $j] \
$decomp_map($ch1)]
#puts +$decomp
set b 1
}
}
}
if {[info exists decomp_used($decomp)]} {
lappend decomp_info $decomp_used($decomp)
} else {
set val [expr {([llength $decomp] << 16) + \
[llength $decomp_list]}]
#set val [expr {[llength $decomp_list]}]
lappend decomp_info $val
set decomp_used($decomp) $val
#puts "$val $decomp"
foreach d $decomp {
lappend decomp_list $d
}
}
} else {
lappend decomp_info -1
}
if {$decomp_offset == $decomp_mask} {
addPage decomp_pmap decomp_pages $decomp_info
set decomp_info {}
}
set comp_offset [expr {$i & $comp_mask}]
if {[info exists comp_info_map($i)]} {
set comp $comp_info_map($i)
} else {
set comp -1
}
lappend comp_info $comp
if {$comp_offset == $comp_mask} {
addPage comp_pmap comp_pages $comp_info
set comp_info {}
}
}
#puts [array get decomp_map]
#puts $decomp_list
return
}
proc uni::main {} {
global argc argv0 argv
variable cclass_shift
variable cclass_pmap
variable cclass_pages
variable decomp_shift
variable decomp_pmap
variable decomp_pages
variable decomp_list
variable comp_shift
variable comp_map
variable comp_pmap
variable comp_pages
variable comp_first_list
variable comp_second_list
variable comp_x_list
variable comp_y_list
variable pages
variable groups {}
variable titleCount
if {$argc != 3} {
puts stderr "\nusage: $argv0 \n"
exit 1
}
set f [open [lindex $argv 1] r]
set data [read $f]
close $f
load_exclusions $data
set f [open [lindex $argv 0] r]
set data [read $f]
close $f
load_tables $data
buildTables
#puts "X = [llength $pMap] Y= [llength $pages] A= [llength $groups]"
#set size [expr {[llength $pMap] + [llength $pages]*(1<<$shift)}]
#puts "shift = 6, space = $size"
#puts "title case count = $titleCount"
set f [open [file join [lindex $argv 2] uni_norm.c] w]
fconfigure $f -translation lf
puts $f "/*
* uni_norm.c --
*
* Declarations of Unicode character information tables. This file is
* automatically generated by the uni_parse2.tcl script. Do not
* modify this file by hand.
*
* Copyright (c) 1998 by Scriptics Corporation.
* All rights reserved.
*
* Modified for ejabberd by Alexey Shchepin
*
* RCS: @(#) \$Id\$
*/
/*
* A 16-bit Unicode character is split into two parts in order to index
* into the following tables. The lower CCLASS_OFFSET_BITS comprise an offset
* into a page of characters. The upper bits comprise the page number.
*/
#define CCLASS_OFFSET_BITS $cclass_shift
/*
* The pageMap is indexed by page number and returns an alternate page number
* that identifies a unique page of characters. Many Unicode characters map
* to the same alternate page number.
*/
static unsigned char cclassPageMap\[\] = {"
set line " "
set last [expr {[llength $cclass_pmap] - 1}]
for {set i 0} {$i <= $last} {incr i} {
append line [lindex $cclass_pmap $i]
if {$i != $last} {
append line ", "
}
if {[string length $line] > 70} {
puts $f $line
set line " "
}
}
puts $f $line
puts $f "};
/*
* The cclassGroupMap is indexed by combining the alternate page number with
* the page offset and returns a combining class number.
*/
static unsigned char cclassGroupMap\[\] = {"
set line " "
set lasti [expr {[llength $cclass_pages] - 1}]
for {set i 0} {$i <= $lasti} {incr i} {
set page [lindex $cclass_pages $i]
set lastj [expr {[llength $page] - 1}]
for {set j 0} {$j <= $lastj} {incr j} {
append line [lindex $page $j]
if {$j != $lastj || $i != $lasti} {
append line ", "
}
if {[string length $line] > 70} {
puts $f $line
set line " "
}
}
}
puts $f $line
puts $f "};
#define GetUniCharCClass(ch) (cclassGroupMap\[(cclassPageMap\[(((int)(ch)) & 0x1fffff) >> CCLASS_OFFSET_BITS\] << CCLASS_OFFSET_BITS) | ((ch) & ((1 << CCLASS_OFFSET_BITS)-1))\])
#define DECOMP_OFFSET_BITS $decomp_shift
/*
* The pageMap is indexed by page number and returns an alternate page number
* that identifies a unique page of characters. Many Unicode characters map
* to the same alternate page number.
*/
static unsigned char decompPageMap\[\] = {"
set line " "
set last [expr {[llength $decomp_pmap] - 1}]
for {set i 0} {$i <= $last} {incr i} {
append line [lindex $decomp_pmap $i]
if {$i != $last} {
append line ", "
}
if {[string length $line] > 70} {
puts $f $line
set line " "
}
}
puts $f $line
puts $f "};
/*
* The decompGroupMap is indexed by combining the alternate page number with
* the page offset and returns a group number that identifies a length and
* shift of decomposition sequence in decompList
*/
static int decompGroupMap\[\] = {"
set line " "
set lasti [expr {[llength $decomp_pages] - 1}]
for {set i 0} {$i <= $lasti} {incr i} {
set page [lindex $decomp_pages $i]
set lastj [expr {[llength $page] - 1}]
for {set j 0} {$j <= $lastj} {incr j} {
append line [lindex $page $j]
if {$j != $lastj || $i != $lasti} {
append line ", "
}
if {[string length $line] > 70} {
puts $f $line
set line " "
}
}
}
puts $f $line
puts $f "};
/*
* List of decomposition sequences
*/
static int decompList\[\] = {"
set line " "
set last [expr {[llength $decomp_list] - 1}]
for {set i 0} {$i <= $last} {incr i} {
set val [lindex $decomp_list $i]
append line [format "%d" $val]
if {$i != $last} {
append line ", "
}
if {[string length $line] > 70} {
puts $f $line
set line " "
}
}
puts $f $line
puts $f "};
/*
* This macro extracts the information about a character from the
* Unicode character tables.
*/
#define GetUniCharDecompInfo(ch) (decompGroupMap\[(decompPageMap\[(((int)(ch)) & 0x1fffff) >> DECOMP_OFFSET_BITS\] << DECOMP_OFFSET_BITS) | ((ch) & ((1 << DECOMP_OFFSET_BITS)-1))\])
#define GetDecompShift(info) ((info) & 0xffff)
#define GetDecompLen(info) ((info) >> 16)
#define COMP_OFFSET_BITS $comp_shift
/*
* The pageMap is indexed by page number and returns an alternate page number
* that identifies a unique page of characters. Many Unicode characters map
* to the same alternate page number.
*/
static unsigned char compPageMap\[\] = {"
set line " "
set last [expr {[llength $comp_pmap] - 1}]
for {set i 0} {$i <= $last} {incr i} {
append line [lindex $comp_pmap $i]
if {$i != $last} {
append line ", "
}
if {[string length $line] > 70} {
puts $f $line
set line " "
}
}
puts $f $line
puts $f "};
/*
* The groupMap is indexed by combining the alternate page number with
* the page offset and returns a group number that identifies a unique
* set of character attributes.
*/
static int compGroupMap\[\] = {"
set line " "
set lasti [expr {[llength $comp_pages] - 1}]
for {set i 0} {$i <= $lasti} {incr i} {
set page [lindex $comp_pages $i]
set lastj [expr {[llength $page] - 1}]
for {set j 0} {$j <= $lastj} {incr j} {
append line [lindex $page $j]
if {$j != $lastj || $i != $lasti} {
append line ", "
}
if {[string length $line] > 70} {
puts $f $line
set line " "
}
}
}
puts $f $line
puts $f "};
/*
* Lists of compositions for characters that appears only in one composition
*/
static int compFirstList\[\]\[2\] = {"
set line " "
set last [expr {[llength $comp_first_list] - 1}]
for {set i 0} {$i <= $last} {incr i} {
set val [lindex $comp_first_list $i]
append line [format "{%d, %d}" [lindex $val 0] [lindex $val 1]]
if {$i != $last} {
append line ", "
}
if {[string length $line] > 60} {
puts $f $line
set line " "
}
}
puts $f $line
puts $f "};
static int compSecondList\[\]\[2\] = {"
set line " "
set last [expr {[llength $comp_second_list] - 1}]
for {set i 0} {$i <= $last} {incr i} {
set val [lindex $comp_second_list $i]
append line [format "{%d, %d}" [lindex $val 0] [lindex $val 1]]
if {$i != $last} {
append line ", "
}
if {[string length $line] > 60} {
puts $f $line
set line " "
}
}
puts $f $line
puts $f "};
/*
* Compositions matrix
*/
static int compBothList\[[llength $comp_x_list]\]\[[llength $comp_y_list]\] = {"
set lastx [expr {[llength $comp_x_list] - 1}]
set lasty [expr {[llength $comp_y_list] - 1}]
for {set i 0} {$i <= $lastx} {incr i} {
puts $f " \{"
set line " "
for {set j 0} {$j <= $lasty} {incr j} {
set comp [list [lindex $comp_x_list $i] [lindex $comp_y_list $j]]
if {[info exists comp_map($comp)]} {
set val $comp_map($comp)
} else {
set val 0
}
append line [format "%d" $val]
if {$j != $lasty} {
append line ", "
}
if {[string length $line] > 70} {
puts $f $line
set line " "
}
}
puts $f $line
if {$j != $lasty} {
puts $f " \},"
} else {
puts $f " \}"
}
}
puts $f "};
#define GetUniCharCompInfo(ch) (compGroupMap\[(compPageMap\[(((int)(ch)) & 0x1fffff) >> COMP_OFFSET_BITS\] << COMP_OFFSET_BITS) | ((ch) & ((1 << COMP_OFFSET_BITS)-1))\])
#define CompSingleMask (1 << 16)
#define CompMask ((1 << 16) - 1)
#define CompSecondMask (1 << 17)
"
close $f
}
uni::main
return
ejabberd-2.1.11/src/stringprep/stringprep.erl 0000664 0000000 0000000 00000005570 12240230175 016112 0 ustar %%%----------------------------------------------------------------------
%%% File : stringprep.erl
%%% Author : Alexey Shchepin
%%% Purpose : Interface to stringprep_drv
%%% Created : 16 Feb 2003 by Alexey Shchepin
%%%
%%%
%%% ejabberd, Copyright (C) 2002-2012 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
%%% published by the Free Software Foundation; either version 2 of the
%%% License, or (at your option) any later version.
%%%
%%% This program is distributed in the hope that it will be useful,
%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
%%% General Public License for more details.
%%%
%%% You should have received a copy of the GNU General Public License
%%% along with this program; if not, write to the Free Software
%%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
%%% 02111-1307 USA
%%%
%%%----------------------------------------------------------------------
-module(stringprep).
-author('alexey@process-one.net').
-behaviour(gen_server).
-export([start/0, start_link/0,
tolower/1,
nameprep/1,
nodeprep/1,
resourceprep/1]).
%% Internal exports, call-back functions.
-export([init/1,
handle_call/3,
handle_cast/2,
handle_info/2,
code_change/3,
terminate/2]).
-define(STRINGPREP_PORT, stringprep_port).
-define(NAMEPREP_COMMAND, 1).
-define(NODEPREP_COMMAND, 2).
-define(RESOURCEPREP_COMMAND, 3).
start() ->
gen_server:start({local, ?MODULE}, ?MODULE, [], []).
start_link() ->
gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
init([]) ->
case erl_ddll:load_driver(ejabberd:get_so_path(), stringprep_drv) of
ok -> ok;
{error, already_loaded} -> ok
end,
Port = open_port({spawn, "stringprep_drv"}, []),
register(?STRINGPREP_PORT, Port),
{ok, Port}.
%%% --------------------------------------------------------
%%% The call-back functions.
%%% --------------------------------------------------------
handle_call(_, _, State) ->
{noreply, State}.
handle_cast(_, State) ->
{noreply, State}.
handle_info({'EXIT', Port, Reason}, Port) ->
{stop, {port_died, Reason}, Port};
handle_info({'EXIT', _Pid, _Reason}, Port) ->
{noreply, Port};
handle_info(_, State) ->
{noreply, State}.
code_change(_OldVsn, State, _Extra) ->
{ok, State}.
terminate(_Reason, Port) ->
Port ! {self, close},
ok.
tolower(String) ->
control(0, String).
nameprep(String) ->
control(?NAMEPREP_COMMAND, String).
nodeprep(String) ->
control(?NODEPREP_COMMAND, String).
resourceprep(String) ->
control(?RESOURCEPREP_COMMAND, String).
control(Command, String) ->
case port_control(?STRINGPREP_PORT, Command, String) of
[0 | _] -> error;
[1 | Res] -> Res
end.
ejabberd-2.1.11/src/stringprep/Makefile.in 0000664 0000000 0000000 00000002250 12240230175 015246 0 ustar # $Id$
CC = @CC@
CFLAGS = @CFLAGS@
CPPFLAGS = @CPPFLAGS@
LDFLAGS = @LDFLAGS@
LIBS = @LIBS@
ERLANG_CFLAGS = @ERLANG_CFLAGS@
ERLANG_LIBS = @ERLANG_LIBS@
# Assume Linux-style dynamic library flags
DYNAMIC_LIB_CFLAGS = -fpic -shared
ifeq ($(shell uname),Darwin)
DYNAMIC_LIB_CFLAGS = -fPIC -bundle -flat_namespace -undefined suppress
endif
ifeq ($(shell uname),SunOs)
DYNAMIC_LIB_CFLAGS = -KPIC -G -z text
endif
EFLAGS += -I ..
EFLAGS += -pz ..
# make debug=true to compile Erlang module with debug informations.
ifdef debug
EFLAGS+=+debug_info +export_all
endif
ERLSHLIBS = ../stringprep_drv.so
OUTDIR = ..
SOURCES = $(wildcard *.erl)
BEAMS = $(addprefix $(OUTDIR)/,$(SOURCES:.erl=.beam))
all: $(BEAMS) $(ERLSHLIBS)
$(OUTDIR)/%.beam: %.erl
@ERLC@ -W $(EFLAGS) -o $(OUTDIR) $<
#all: $(ERLSHLIBS)
# erl -s make all report "{outdir, \"..\"}" -noinput -s erlang halt
$(ERLSHLIBS): ../%.so: %.c uni_data.c uni_norm.c
$(CC) $(CFLAGS) $(LDFLAGS) $(INCLUDES) \
$(subst ../,,$(subst .so,.c,$@)) $(LIBS) \
$(ERLANG_LIBS) \
$(ERLANG_CFLAGS) \
-o $@ \
$(DYNAMIC_LIB_CFLAGS)
clean:
rm -f $(BEAMS) $(ERLSHLIBS)
distclean: clean
rm -f Makefile
TAGS:
etags *.erl
ejabberd-2.1.11/src/stringprep/uni_data.c 0000664 0000000 0000000 00000231741 12240230175 015142 0 ustar /*
* uni_data.c --
*
* Declarations of Unicode character information tables. This file is
* automatically generated by the uni_parse.tcl script. Do not
* modify this file by hand.
*
* Copyright (c) 1998 by Scriptics Corporation.
* All rights reserved.
*
* Modified for ejabberd by Alexey Shchepin
*
* RCS: @(#) $Id$
*/
/*
* A 16-bit Unicode character is split into two parts in order to index
* into the following tables. The lower OFFSET_BITS comprise an offset
* into a page of characters. The upper bits comprise the page number.
*/
#define OFFSET_BITS 8
/*
* The pageMap is indexed by page number and returns an alternate page number
* that identifies a unique page of characters. Many Unicode characters map
* to the same alternate page number.
*/
static unsigned char pageMap[] = {
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
20, 21, 22, 23, 24, 8, 8, 8, 8, 8, 25, 26, 27, 28, 29, 30, 31, 29,
32, 33, 29, 29, 29, 8, 8, 8, 34, 35, 36, 37, 38, 39, 21, 21, 21, 21,
21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
21, 21, 21, 21, 40, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
21, 41, 21, 21, 21, 21, 42, 8, 8, 8, 8, 8, 8, 8, 21, 21, 21, 21, 21,
21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
21, 21, 21, 21, 43, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
44, 44, 44, 44, 21, 45, 46, 47, 48, 49, 50, 8, 8, 8, 51, 52, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 53, 54, 8, 8, 55,
56, 57, 58, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 21,
21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 59, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 21, 21, 60, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
44, 44, 44, 44, 61, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
44, 44, 44, 44, 44, 61
};
/*
* The groupMap is indexed by combining the alternate page number with
* the page offset and returns a group number that identifies a unique
* set of character attributes.
*/
static unsigned short int groupMap[] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 2, 2, 2, 3, 3, 2, 2, 2, 2, 2, 2,
2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 3, 2, 3, 2, 3, 4, 4, 4, 4,
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2,
2, 2, 2, 2, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 2, 2, 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 2, 2, 7, 2, 2, 2, 2, 2, 2, 2, 8, 2, 2,
2, 2, 5, 2, 2, 2, 2, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
4, 4, 4, 4, 4, 4, 4, 4, 2, 4, 4, 4, 4, 4, 4, 4, 9, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 5, 5, 5, 5, 5,
5, 5, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10,
5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10,
5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 11, 5, 10, 5, 10, 5, 10, 5, 5,
10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 12, 10, 5,
10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10,
5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10,
5, 10, 5, 10, 5, 13, 10, 5, 10, 5, 10, 5, 14, 5, 15, 10, 5, 10, 5,
16, 10, 5, 17, 17, 10, 5, 5, 18, 19, 20, 10, 5, 17, 21, 5, 22, 23,
10, 5, 5, 5, 22, 24, 5, 25, 10, 5, 10, 5, 10, 5, 26, 10, 5, 26, 5,
5, 10, 5, 26, 10, 5, 27, 27, 10, 5, 10, 5, 28, 10, 5, 5, 5, 10, 5,
5, 5, 5, 5, 5, 5, 29, 10, 5, 29, 10, 5, 29, 10, 5, 10, 5, 10, 5, 10,
5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 5, 10, 5, 10, 5, 10, 5, 10, 5,
10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 30, 29, 10, 5, 10, 5, 31, 32, 10,
5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10,
5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 33,
6, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 5, 5, 5, 5,
5, 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 5, 5, 5, 2, 2, 2, 2, 2, 2, 2, 2,
2, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 6, 2, 2, 2, 34, 2, 2,
2, 2, 2, 2, 2, 2, 2, 7, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 6, 6, 6, 2, 2,
6, 6, 6, 6, 35, 6, 6, 6, 2, 6, 6, 6, 6, 6, 2, 2, 36, 2, 37, 37, 37,
6, 38, 6, 39, 39, 40, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
4, 4, 6, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 41, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 10, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 6, 42, 43, 44, 45, 46, 47, 48, 5, 10, 5, 10, 5, 10, 5, 10,
5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 49, 50,
51, 5, 52, 53, 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 54, 54, 54, 54, 54, 54,
54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 4, 4, 4, 4, 4, 4, 4, 4, 4,
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5,
10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 5, 2, 2, 2,
2, 6, 2, 2, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5,
10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10,
5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 5,
10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 6, 10, 5, 10, 5, 10,
5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10,
5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 6, 6, 10, 5, 6, 6, 6,
6, 6, 6, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 6, 6, 5, 5, 5, 5, 5, 5,
5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 56, 6, 5, 2, 6,
6, 6, 6, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
6, 2, 2, 2, 57, 2, 57, 2, 2, 57, 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 6, 6, 6, 6, 6, 57, 57, 57,
57, 57, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 57, 6, 6, 6,
57, 6, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 6, 6, 6, 6, 6, 57, 57,
57, 57, 57, 57, 57, 57, 57, 57, 57, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
57, 57, 57, 2, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
57, 57, 57, 2, 2, 2, 2, 2, 2, 2, 58, 2, 2, 2, 2, 2, 2, 2, 57, 57, 2,
2, 2, 2, 2, 2, 2, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 57, 57, 57, 57,
57, 6, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 6, 6,
57, 2, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 6, 6, 6, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
57, 57, 57, 57, 57, 57, 57, 57, 57, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
57, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 2, 2, 5, 6, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 6, 6, 2, 5, 5, 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 5, 5, 2,
6, 6, 5, 2, 2, 2, 2, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 2, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 5, 5, 6, 6,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6,
5, 5, 5, 5, 5, 5, 5, 6, 5, 6, 6, 6, 5, 5, 5, 5, 6, 6, 2, 6, 5, 5, 5,
2, 2, 2, 2, 6, 6, 5, 5, 6, 6, 5, 5, 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5,
6, 6, 6, 6, 5, 5, 6, 5, 5, 5, 2, 2, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 2, 2, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 2, 6, 6, 5,
5, 5, 5, 5, 5, 6, 6, 6, 6, 5, 5, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5,
6, 5, 5, 6, 5, 5, 6, 6, 2, 6, 5, 5, 5, 2, 2, 6, 6, 6, 6, 2, 2, 6, 6,
2, 2, 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 6, 5, 6, 6, 6,
6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 5, 5, 5, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 2, 2, 5, 6, 5, 5, 5, 5, 5, 5, 5, 6, 5, 6, 5,
5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 6, 5, 5, 5, 5, 5, 6, 6, 2, 5,
5, 5, 5, 2, 2, 2, 2, 2, 6, 2, 2, 5, 6, 5, 5, 2, 6, 6, 5, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 2, 5,
5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 5, 5, 6, 6, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5,
6, 5, 5, 6, 6, 5, 5, 5, 5, 6, 6, 2, 5, 5, 2, 5, 2, 2, 2, 6, 6, 6, 5,
5, 6, 6, 5, 5, 2, 6, 6, 6, 6, 6, 6, 6, 6, 2, 5, 6, 6, 6, 6, 5, 5, 6,
5, 5, 5, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 2, 5, 6, 5, 5, 5, 5, 5, 5, 6, 6,
6, 5, 5, 5, 6, 5, 5, 5, 5, 6, 6, 6, 5, 5, 6, 5, 6, 5, 5, 6, 6, 6, 5,
5, 6, 6, 6, 5, 5, 5, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 6,
6, 6, 6, 5, 5, 2, 5, 5, 6, 6, 6, 5, 5, 5, 6, 5, 5, 5, 2, 6, 6, 6, 6,
6, 6, 6, 6, 6, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 5, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 6, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, 5, 6, 6, 6, 6, 2, 2, 2, 5, 5, 5, 5,
6, 2, 2, 2, 6, 2, 2, 2, 2, 6, 6, 6, 6, 6, 6, 6, 2, 2, 6, 6, 6, 6, 6,
6, 6, 6, 6, 5, 5, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 6, 5, 5, 5, 5, 5,
5, 5, 5, 6, 5, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5,
5, 5, 6, 6, 6, 6, 5, 2, 5, 5, 5, 5, 5, 6, 2, 5, 5, 6, 5, 5, 2, 2, 6,
6, 6, 6, 6, 6, 6, 5, 5, 6, 6, 6, 6, 6, 6, 6, 5, 6, 5, 5, 6, 6, 6, 6,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 6, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 5, 5, 5, 2,
2, 2, 6, 6, 5, 5, 5, 6, 5, 5, 5, 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 6,
6, 6, 6, 6, 6, 6, 6, 5, 5, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 6, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5,
5, 5, 5, 5, 5, 5, 5, 6, 5, 6, 6, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 2, 6,
6, 6, 6, 5, 5, 5, 2, 2, 2, 6, 2, 6, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 5, 5, 2, 2, 2, 2, 2, 2, 2, 6, 6, 6, 6,
2, 5, 5, 5, 5, 5, 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 6,
5, 6, 6, 5, 5, 6, 5, 6, 6, 5, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 6, 5, 5,
5, 5, 5, 5, 5, 6, 5, 5, 5, 6, 5, 6, 5, 6, 6, 5, 5, 6, 5, 5, 5, 5, 2,
5, 5, 2, 2, 2, 2, 2, 2, 6, 2, 2, 5, 6, 6, 5, 5, 5, 5, 5, 6, 5, 6, 2,
2, 2, 2, 2, 2, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 5, 5, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 5, 2, 5, 2, 2, 2,
2, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 6, 6, 6, 6, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 2,
2, 2, 2, 2, 5, 2, 2, 5, 5, 5, 5, 6, 6, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2,
6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 5, 5, 5, 5, 5, 5, 5, 5,
2, 5, 5, 5, 5, 5, 5, 6, 6, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
6, 5, 5, 5, 5, 5, 6, 5, 5, 6, 5, 2, 2, 2, 2, 5, 2, 6, 6, 6, 2, 2, 5,
2, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 5, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5,
5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 6,
5, 5, 5, 5, 6, 6, 5, 5, 5, 5, 5, 5, 5, 6, 5, 6, 5, 5, 5, 5, 6, 6, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 6, 5, 5, 5, 5, 6,
6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 6, 5, 5, 5, 5, 6, 6, 5, 5, 5, 5, 5,
5, 5, 6, 5, 6, 5, 5, 5, 5, 6, 6, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5,
5, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 6, 5, 5, 5, 5, 6, 6, 5,
5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6,
6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 2, 2, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
6, 5, 5, 5, 5, 2, 2, 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 2, 5, 5, 6, 6, 6, 6,
6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
2, 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 6, 5, 5, 5, 6, 2, 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 2, 2, 2, 2, 2, 5, 5, 5, 5, 5, 5, 5,
5, 2, 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 5, 5, 5, 5, 5, 2,
5, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 2, 2, 2, 2, 2, 2, 7, 2, 2, 2,
2, 7, 7, 7, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6,
6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 10, 5, 10, 5, 10, 5,
10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10,
5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10,
5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10,
5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10,
5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10,
5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10,
5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10,
5, 10, 5, 10, 5, 59, 60, 61, 62, 63, 64, 6, 6, 6, 6, 10, 5, 10, 5,
10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10,
5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10,
5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10,
5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10,
5, 10, 5, 10, 5, 10, 5, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 65,
65, 65, 65, 65, 65, 65, 65, 5, 5, 5, 5, 5, 5, 6, 6, 65, 65, 65, 65,
65, 65, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 65, 65, 65, 65, 65, 65, 65, 65,
5, 5, 5, 5, 5, 5, 5, 5, 65, 65, 65, 65, 65, 65, 65, 65, 5, 5, 5, 5,
5, 5, 6, 6, 65, 65, 65, 65, 65, 65, 6, 6, 66, 5, 67, 5, 68, 5, 69,
5, 6, 65, 6, 65, 6, 65, 6, 65, 5, 5, 5, 5, 5, 5, 5, 5, 65, 65, 65,
65, 65, 65, 65, 65, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6,
70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86,
87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102,
103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116,
117, 5, 5, 118, 119, 120, 6, 121, 122, 65, 65, 123, 123, 124, 2, 125,
2, 2, 2, 126, 127, 128, 6, 129, 130, 131, 131, 131, 131, 132, 2, 2,
2, 5, 5, 133, 134, 6, 6, 135, 136, 65, 65, 137, 137, 6, 2, 2, 2, 5,
5, 138, 139, 140, 5, 141, 142, 65, 65, 143, 143, 144, 2, 2, 2, 6, 6,
145, 146, 147, 6, 148, 149, 150, 150, 151, 151, 152, 2, 2, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 153, 153, 153, 154, 58, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 6, 6, 6, 6,
6, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 6, 6, 6, 2, 6, 6, 6,
6, 6, 6, 6, 6, 153, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 2,
5, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 2, 2, 2, 2, 2, 2, 2, 2, 155, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 2, 2, 156, 157, 2, 2, 2, 158, 2, 159, 5, 160, 161,
162, 5, 5, 163, 164, 165, 5, 2, 163, 166, 2, 2, 167, 167, 167, 168,
169, 2, 2, 170, 171, 172, 2, 168, 2, 173, 2, 174, 2, 175, 176, 177,
177, 2, 5, 178, 178, 2, 179, 5, 5, 5, 5, 5, 5, 2, 6, 6, 5, 180, 181,
2, 2, 2, 2, 2, 182, 5, 5, 5, 5, 2, 2, 6, 6, 6, 6, 6, 6, 6, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 183, 183, 183, 183, 183, 183, 183, 183,
183, 183, 183, 183, 183, 183, 183, 183, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184,
184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 6,
2, 2, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 2, 2, 2, 2, 6, 2, 2, 2, 2, 6, 6, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 2, 6, 2, 2, 2, 2, 6, 6, 6, 2, 6,
2, 2, 2, 2, 2, 2, 2, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 6, 6, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 6, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 2, 2, 2, 2, 5, 5, 5, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 2, 2, 2, 2, 2, 5, 5, 5, 5, 5, 2, 2,
5, 5, 5, 5, 5, 2, 2, 2, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 6, 6, 2, 2, 2, 2, 5, 5, 5, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 5, 5, 5, 5, 6, 6, 6, 6, 6, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 185, 5,
186, 5, 187, 5, 6, 6, 6, 6, 5, 5, 5, 5, 5, 188, 189, 190, 191, 192,
193, 194, 195, 5, 5, 196, 197, 198, 5, 5, 5, 199, 200, 201, 202, 203,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 204, 205,
206, 207, 5, 5, 5, 5, 5, 5, 5, 208, 209, 210, 211, 212, 213, 214, 215,
216, 217, 218, 219, 220, 221, 5, 222, 5, 5, 5, 223, 224, 225, 5, 226,
5, 227, 228, 5, 5, 5, 5, 5, 5, 5, 5, 229, 5, 230, 231, 5, 232, 233,
6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
154, 154, 154, 154, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 234, 235, 236, 237, 238, 239, 240, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 241, 242, 243, 244, 245, 6, 6, 6,
6, 6, 57, 2, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 2, 57, 57, 57,
57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 6, 57, 57, 57, 57, 57, 6, 57,
6, 57, 57, 6, 57, 57, 6, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
57, 57, 57, 57, 57, 57, 57, 57, 2, 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
6, 6, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
57, 57, 57, 57, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 6, 6, 6, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 2, 2, 2, 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 2, 2, 2, 2, 6, 6, 6, 6, 57, 57, 57, 57,
57, 6, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
57, 6, 6, 153, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 4, 4, 4, 4, 4, 4, 4,
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 2, 2,
2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 5, 5, 5, 5, 5, 5, 6, 6,
5, 5, 5, 5, 5, 5, 6, 6, 5, 5, 5, 5, 5, 5, 6, 6, 5, 5, 5, 6, 6, 6, 2,
2, 2, 2, 2, 2, 2, 6, 2, 2, 2, 2, 2, 2, 2, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 246, 246, 246, 246, 246, 246, 246,
246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246,
246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246,
246, 246, 246, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 2, 2, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6,
6, 6, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 2, 2, 2, 2, 2, 2, 2, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 2, 2, 2, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 247,
247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247,
247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 248,
248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248,
248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 5, 5, 5, 5,
5, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 249,
249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249,
249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 250,
6, 250, 250, 6, 6, 250, 6, 6, 250, 250, 6, 6, 250, 250, 250, 250, 6,
250, 250, 250, 250, 250, 250, 250, 250, 5, 5, 5, 5, 6, 5, 6, 5, 5,
5, 5, 6, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 251, 251, 251, 251,
251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251,
251, 251, 251, 251, 251, 251, 251, 251, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 252, 252, 6, 252,
252, 252, 252, 6, 6, 252, 252, 252, 252, 252, 252, 252, 252, 6, 252,
252, 252, 252, 252, 252, 252, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 253, 253, 6, 253, 253, 253,
253, 6, 253, 253, 253, 253, 253, 6, 253, 6, 6, 6, 253, 253, 253, 253,
253, 253, 253, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 254, 254, 254, 254, 254, 254, 254, 254,
254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254,
254, 254, 254, 254, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 256, 256, 256, 256, 256, 256, 256, 256,
256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256,
256, 256, 256, 256, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 257, 257, 257, 257, 257, 257, 257, 257,
257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257,
257, 257, 257, 257, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 258, 258, 258, 258, 258, 258, 258, 258,
258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258,
258, 258, 258, 258, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 259, 259, 259, 259, 259, 259, 259, 259,
259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259,
259, 259, 259, 259, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 260, 260, 260, 260, 260,
260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 261, 260,
260, 260, 260, 260, 260, 260, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 262, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 263,
263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263,
263, 263, 264, 263, 263, 263, 263, 263, 263, 263, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 265, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266,
266, 266, 266, 266, 266, 266, 267, 266, 266, 266, 266, 266, 266, 266,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 268, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 269, 269, 269, 269, 269, 269, 269,
269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 270, 269, 269, 269,
269, 269, 269, 269, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 271, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 272, 272, 272,
272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272,
273, 272, 272, 272, 272, 272, 272, 272, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 274, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 6, 6, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 154, 154, 154, 154,
154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 6, 6
};
/*
* Each group represents a unique set of character attributes. The attributes
* are encoded into a 32-bit value as follows:
*
* Bit 0 A.1 | C.1.2 | C.2.2 | C.3 -- C.9
*
* Bit 1 C.1.1
*
* Bit 2 C.2.1
*
* Bit 3 B.1
*
* Bit 4 D.1
*
* Bit 5 D.2
*
* Bit 6 XNP
*
* Bit 7 Case maps to several characters
*
* Bits 8-10 Reserved for future use.
*
* Bits 11-31 Case delta: delta for case conversions. This should be the
* highest field so we can easily sign extend.
*/
static int groups[] = {
4, 2, 0, 64, 65568, 32, 1, 8, 1587232, 160, 2080, 2208, 4256,
-247776, -548832, 430112, 421920, 419872, 161824, 413728, 415776,
423968, 432160, 428064, 436256, 438304, 446496, 444448, 448544,
4128, 6304, -198624, -114656, -266208, 237568, 8352, 77856, 75808,
131104, 129056, 10400, 12448, -61408, -51168, -26592, -12256,
-18400, -30688, -45024, -110560, -98272, -96224, -122848, -131040,
163872, 98336, 14496, 16, 17, 16544, 18592, 20640, 22688, 24736,
-118752, -16352, 26784, 28832, 30880, 32928, 34976, 37024, 39072,
41120, 43168, 45216, 47264, 49312, 51360, 53408, 55456, 57504,
59552, 61600, 63648, 65696, 67744, 69792, 71840, 73888, 75936,
77984, 80032, 82080, 84128, 86176, 88224, 90272, 92320, 94368,
96416, 98464, 100512, 102560, 104608, 106656, 108704, 110752,
112800, 114848, 116896, 118944, 120992, 123040, 125088, 127136,
129184, 131232, 133280, 135328, 137376, 139424, 141472, -151520,
143520, -14690272, 145568, 147616, 149664, 151712, 153760, -176096,
155808, 157856, 159904, 161952, 164000, -204768, 166048, 168096,
170144, 172192, 174240, -229344, -14304, 176288, 178336, 180384,
182432, 184480, -262112, -258016, 186528, 9, 33, 188544, -17102816,
190592, -16080864, 192640, -17111008, -17113056, -17115104, -17119200,
-17121248, -17117152, 194688, -17123296, -17125344, -17127392,
196736, 198784, 200832, -15394784, -17133536, -17168352, -16920544,
-17190880, -17192928, -17182688, -15488992, -15464416, -17237984,
32800, 53280, 202912, 204960, 207008, 209056, 211104, 213152,
215200, 217248, 219296, 221344, 223392, 225440, 227488, 229536,
231584, 233632, 235680, 237728, 239776, 241824, 243872, 245920,
247968, 250016, 252064, 254112, 256160, 258208, 260256, 262304,
264352, 266400, 268448, 270496, 272544, 274592, 276640, 278688,
280736, 282784, 284832, 286880, 288928, 290976, 293024, 295072,
297120, 299168, 301216, 303264, 305312, 307360, 309408, 311456,
313504, 315552, 317600, 319648, 321696, 323744, 325792, 81952,
-245168096, -245274592, -245381088, -245487584, -245594080, -245700576,
-245807072, -245913568, -246020064, -246126560, -246233056, -246339552,
-246446048, -244824032, -244844512, -244875232, -244942816, -244963296,
-244994016, -245061600, -245082080, -245112800, -245180384, -245200864,
-245231584, -245299168, -245319648, -245350368
};
/*
* Table for characters that lowercased to multiple ones
*/
static int multiCaseTable[][4] = {
{2, 115, 115},
{2, 105, 775},
{2, 700, 110},
{2, 106, 780},
{2, 32, 953},
{3, 953, 776, 769},
{3, 965, 776, 769},
{2, 1381, 1410},
{2, 104, 817},
{2, 116, 776},
{2, 119, 778},
{2, 121, 778},
{2, 97, 702},
{2, 965, 787},
{3, 965, 787, 768},
{3, 965, 787, 769},
{3, 965, 787, 834},
{2, 7936, 953},
{2, 7937, 953},
{2, 7938, 953},
{2, 7939, 953},
{2, 7940, 953},
{2, 7941, 953},
{2, 7942, 953},
{2, 7943, 953},
{2, 7936, 953},
{2, 7937, 953},
{2, 7938, 953},
{2, 7939, 953},
{2, 7940, 953},
{2, 7941, 953},
{2, 7942, 953},
{2, 7943, 953},
{2, 7968, 953},
{2, 7969, 953},
{2, 7970, 953},
{2, 7971, 953},
{2, 7972, 953},
{2, 7973, 953},
{2, 7974, 953},
{2, 7975, 953},
{2, 7968, 953},
{2, 7969, 953},
{2, 7970, 953},
{2, 7971, 953},
{2, 7972, 953},
{2, 7973, 953},
{2, 7974, 953},
{2, 7975, 953},
{2, 8032, 953},
{2, 8033, 953},
{2, 8034, 953},
{2, 8035, 953},
{2, 8036, 953},
{2, 8037, 953},
{2, 8038, 953},
{2, 8039, 953},
{2, 8032, 953},
{2, 8033, 953},
{2, 8034, 953},
{2, 8035, 953},
{2, 8036, 953},
{2, 8037, 953},
{2, 8038, 953},
{2, 8039, 953},
{2, 8048, 953},
{2, 945, 953},
{2, 940, 953},
{2, 945, 834},
{3, 945, 834, 953},
{2, 945, 953},
{2, 8052, 953},
{2, 951, 953},
{2, 942, 953},
{2, 951, 834},
{3, 951, 834, 953},
{2, 951, 953},
{3, 953, 776, 768},
{3, 953, 776, 769},
{2, 953, 834},
{3, 953, 776, 834},
{3, 965, 776, 768},
{3, 965, 776, 769},
{2, 961, 787},
{2, 965, 834},
{3, 965, 776, 834},
{2, 8060, 953},
{2, 969, 953},
{2, 974, 953},
{2, 969, 834},
{3, 969, 834, 953},
{2, 969, 953},
{2, 114, 115},
{2, 176, 99},
{2, 176, 102},
{2, 110, 111},
{2, 115, 109},
{3, 116, 101, 108},
{2, 116, 109},
{3, 104, 112, 97},
{2, 97, 117},
{2, 111, 118},
{2, 112, 97},
{2, 110, 97},
{2, 956, 97},
{2, 109, 97},
{2, 107, 97},
{2, 107, 98},
{2, 109, 98},
{2, 103, 98},
{2, 112, 102},
{2, 110, 102},
{2, 956, 102},
{2, 104, 122},
{3, 107, 104, 122},
{3, 109, 104, 122},
{3, 103, 104, 122},
{3, 116, 104, 122},
{2, 112, 97},
{3, 107, 112, 97},
{3, 109, 112, 97},
{3, 103, 112, 97},
{2, 112, 118},
{2, 110, 118},
{2, 956, 118},
{2, 109, 118},
{2, 107, 118},
{2, 109, 118},
{2, 112, 119},
{2, 110, 119},
{2, 956, 119},
{2, 109, 119},
{2, 107, 119},
{2, 109, 119},
{2, 107, 969},
{2, 109, 969},
{2, 98, 113},
{3, 99, 111, 46},
{2, 100, 98},
{2, 103, 121},
{2, 104, 112},
{2, 107, 107},
{2, 107, 109},
{2, 112, 104},
{3, 112, 112, 109},
{2, 112, 114},
{2, 115, 118},
{2, 119, 98},
{2, 102, 102},
{2, 102, 105},
{2, 102, 108},
{3, 102, 102, 105},
{3, 102, 102, 108},
{2, 115, 116},
{2, 115, 116},
{2, 1396, 1398},
{2, 1396, 1381},
{2, 1396, 1387},
{2, 1406, 1398},
{2, 1396, 1389}
};
/*
* The following constants are used to determine the category of a
* Unicode character.
*/
#define ACMask (1 << 0)
#define C11Mask (1 << 1)
#define C21Mask (1 << 2)
#define B1Mask (1 << 3)
#define D1Mask (1 << 4)
#define D2Mask (1 << 5)
#define XNPMask (1 << 6)
#define MCMask (1 << 7)
/*
* The following macros extract the fields of the character info. The
* GetDelta() macro is complicated because we can't rely on the C compiler
* to do sign extension on right shifts.
*/
#define GetCaseType(info) (((info) & 0xE0) >> 5)
#define GetCategory(info) ((info) & 0x1F)
#define GetDelta(info) (((info) > 0) ? ((info) >> 11) : (~(~((info)) >> 11)))
#define GetMC(info) (multiCaseTable[GetDelta(info)])
/*
* This macro extracts the information about a character from the
* Unicode character tables.
*/
#define GetUniCharInfo(ch) (groups[groupMap[(pageMap[(((int)(ch)) & 0x1fffff) >> OFFSET_BITS] << OFFSET_BITS) | ((ch) & ((1 << OFFSET_BITS)-1))]])
ejabberd-2.1.11/src/stringprep/Makefile.win32 0000664 0000000 0000000 00000002035 12240230175 015603 0 ustar
include ..\Makefile.inc
EFLAGS = -I .. -pz ..
OUTDIR = ..
BEAMS = ..\stringprep.beam ..\stringprep_sup.beam
SOURCE = stringprep_drv.c
AUXIL = uni_data.c uni_norm.c
OBJECT = stringprep_drv.o
DLL = $(OUTDIR)\stringprep_drv.dll
ALL : $(DLL) $(BEAMS)
CLEAN :
-@erase $(DLL)
-@erase $(OUTDIR)\stringprep_drv.exp
-@erase $(OUTDIR)\stringprep_drv.lib
-@erase $(OBJECT)
-@erase $(BEAMS)
$(OUTDIR)\stringprep.beam : stringprep.erl
erlc -W $(EFLAGS) -o $(OUTDIR) stringprep.erl
$(OUTDIR)\stringprep_sup.beam : stringprep_sup.erl
erlc -W $(EFLAGS) -o $(OUTDIR) stringprep_sup.erl
CC=cl.exe
CC_FLAGS=-nologo -D__WIN32__ -DWIN32 -DWINDOWS -D_WIN32 -DNT -MD -Ox -I"$(ERLANG_DIR)\usr\include" -I"$(EI_DIR)\include"
LD=link.exe
LD_FLAGS=-release -nologo -incremental:no -dll "$(EI_DIR)\lib\ei_md.lib" "$(EI_DIR)\lib\erl_interface_md.lib" MSVCRT.LIB kernel32.lib advapi32.lib gdi32.lib user32.lib comctl32.lib comdlg32.lib shell32.lib
$(DLL) : $(OBJECT)
$(LD) $(LD_FLAGS) -out:$@ $<
$(OBJECT) : $(SOURCE) $(AUXIL)
$(CC) $(CC_FLAGS) -c -Fo$@ $<
ejabberd-2.1.11/src/stringprep/stringprep_sup.erl 0000664 0000000 0000000 00000005157 12240230175 017002 0 ustar %%%-------------------------------------------------------------------
%%% File : stringprep_sup.erl
%%% Author : Mickael Remond
%%% Description : Supervisor for the Stringprep worker.
%%% Created : 29 Jun 2007 by Mickael Remond
%%%
%%%
%%% ejabberd, Copyright (C) 2002-2012 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
%%% published by the Free Software Foundation; either version 2 of the
%%% License, or (at your option) any later version.
%%%
%%% This program is distributed in the hope that it will be useful,
%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
%%% General Public License for more details.
%%%
%%% You should have received a copy of the GNU General Public License
%%% along with this program; if not, write to the Free Software
%%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
%%% 02111-1307 USA
%%%
%%%-------------------------------------------------------------------
-module(stringprep_sup).
-behaviour(supervisor).
%% API
-export([start_link/0]).
%% Supervisor callbacks
-export([init/1]).
-define(SERVER, ?MODULE).
%%====================================================================
%% API functions
%%====================================================================
%%--------------------------------------------------------------------
%% Function: start_link() -> {ok,Pid} | ignore | {error,Error}
%% Description: Starts the supervisor
%%--------------------------------------------------------------------
start_link() ->
supervisor:start_link({local, ?SERVER}, ?MODULE, []).
%%====================================================================
%% Supervisor callbacks
%%====================================================================
%%--------------------------------------------------------------------
%% Func: init(Args) -> {ok, {SupFlags, [ChildSpec]}} |
%% ignore |
%% {error, Reason}
%% Description: Whenever a supervisor is started using
%% supervisor:start_link/[2,3], this function is called by the new process
%% to find out about restart strategy, maximum restart frequency and child
%% specifications.
%%--------------------------------------------------------------------
init([]) ->
StringPrep = {stringprep,
{stringprep, start_link, []},
permanent,
brutal_kill,
worker,
[stringprep]},
{ok,{{one_for_all,10,1}, [StringPrep]}}.
ejabberd-2.1.11/src/stringprep/stringprep_drv.c 0000664 0000000 0000000 00000024706 12240230175 016427 0 ustar /*
* ejabberd, Copyright (C) 2002-2012 ProcessOne
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
* 02111-1307 USA
*
*/
#include
#include
#include
#include
#include "uni_data.c"
#include "uni_norm.c"
#define NAMEPREP_COMMAND 1
#define NODEPREP_COMMAND 2
#define RESOURCEPREP_COMMAND 3
/*
* R15B changed several driver callbacks to use ErlDrvSizeT and
* ErlDrvSSizeT typedefs instead of int.
* This provides missing typedefs on older OTP versions.
*/
#if ERL_DRV_EXTENDED_MAJOR_VERSION < 2
typedef int ErlDrvSizeT;
typedef int ErlDrvSSizeT;
#endif
typedef struct {
ErlDrvPort port;
} stringprep_data;
static ErlDrvData stringprep_erl_start(ErlDrvPort port, char *buff)
{
stringprep_data* d = (stringprep_data*)driver_alloc(sizeof(stringprep_data));
d->port = port;
//set_port_control_flags(port, PORT_CONTROL_FLAG_BINARY);
return (ErlDrvData)d;
}
static void stringprep_erl_stop(ErlDrvData handle)
{
driver_free((char*)handle);
}
/* Hangul constants */
#define SBase 0xAC00
#define LBase 0x1100
#define VBase 0x1161
#define TBase 0x11A7
#define LCount 19
#define VCount 21
#define TCount 28
#define NCount (VCount * TCount)
#define SCount (LCount * NCount)
/*
* "canonical_ordering" and "compose" functions are based on nfkc.c from Gnome
* library
*/
static void canonical_ordering(int *str, int len)
{
int i, j, t;
int last, next;
last = GetUniCharCClass(str[0]);
for (i = 0; i < len - 1; i++)
{
next = GetUniCharCClass(str[i + 1]);
if (next != 0 && last > next)
{
for (j = i; j >= 0; j--)
{
if (GetUniCharCClass(str[j]) <= next)
break;
t = str[j + 1];
str[j + 1] = str[j];
str[j] = t;
}
next = last;
}
last = next;
}
}
static int compose(int ch1, int ch2)
{
int info1, info2;
if (LBase <= ch1 && ch1 < LBase + LCount &&
VBase <= ch2 && ch2 < VBase + VCount) {
return SBase + ((ch1 - LBase) * VCount + (ch2 - VBase)) * TCount;
}
if (SBase <= ch1 && ch1 < SBase + SCount && ((ch1 - SBase) % TCount) == 0 &&
TBase <= ch2 && ch2 < TBase + TCount) {
return ch1 + ch2 - TBase;
}
info1 = GetUniCharCompInfo(ch1);
if (info1 != -1 && info1 & CompSingleMask) {
if (!(info1 & CompSecondMask) &&
ch2 == compFirstList[info1 & CompMask][0]) {
return compFirstList[info1 & CompMask][1];
} else
return 0;
}
info2 = GetUniCharCompInfo(ch2);
if (info2 != -1 && info2 & CompSingleMask) {
if ((info2 & CompSecondMask) &&
ch1 == compSecondList[info2 & CompMask][0]) {
return compSecondList[info2 & CompMask][1];
} else
return 0;
}
if (info1 != -1 && info2 != -1 &&
!(info1 & CompSecondMask) && (info2 & CompSecondMask))
return compBothList[info1][info2 & CompMask];
else
return 0;
}
#define ADD_UCHAR(ruc) \
if (ruc <= 0x7F) { \
if (pos >= size) { \
size = 2*size + 1; \
rstring = driver_realloc(rstring, size); \
} \
rstring[pos] = (char) ruc; \
pos++; \
} else if (ruc <= 0x7FF) { \
if (pos + 1 >= size) { \
size = 2*size + 2; \
rstring = driver_realloc(rstring, size); \
} \
rstring[pos] = (char) ((ruc >> 6) | 0xC0); \
rstring[pos+1] = (char) ((ruc | 0x80) & 0xBF); \
pos += 2; \
} else if (ruc <= 0xFFFF) { \
if (pos + 2 >= size) { \
size = 2*size + 3; \
rstring = driver_realloc(rstring, size); \
} \
rstring[pos] = (char) ((ruc >> 12) | 0xE0); \
rstring[pos+1] = (char) (((ruc >> 6) | 0x80) & 0xBF); \
rstring[pos+2] = (char) ((ruc | 0x80) & 0xBF); \
pos += 3; \
} else if (ruc <= 0x1FFFFF) { \
if (pos + 3 >= size) { \
size = 2*size + 4; \
rstring = driver_realloc(rstring, size); \
} \
rstring[pos] = (char) ((ruc >> 18) | 0xF0); \
rstring[pos+1] = (char) (((ruc >> 12) | 0x80) & 0xBF); \
rstring[pos+2] = (char) (((ruc >> 6) | 0x80) & 0xBF); \
rstring[pos+3] = (char) ((ruc | 0x80) & 0xBF); \
pos += 4; \
}
#define ADD_UCHAR32(str, pos, len, ch) \
if (pos >= len) { \
len = 2*len + 1; \
str = driver_realloc(str, len * sizeof(int)); \
} \
str[pos] = ch; \
pos++;
#define ADD_DECOMP(ruc) \
info = GetUniCharDecompInfo(ruc); \
if (info >= 0) { \
decomp_len = GetDecompLen(info); \
decomp_shift = GetDecompShift(info); \
for (j = 0; j < decomp_len; j++) { \
ADD_UCHAR32(str32, str32pos, str32len, \
decompList[decomp_shift + j]); \
} \
} else { \
ADD_UCHAR32(str32, str32pos, str32len, ruc); \
}
static ErlDrvSSizeT stringprep_erl_control(ErlDrvData drv_data,
unsigned int command,
char *buf, ErlDrvSizeT len,
char **rbuf, ErlDrvSizeT rlen)
{
int i, j, pos=1;
unsigned char c;
int bad = 0;
int uc = 0, ruc;
int size;
int info;
int prohibit = 0, tolower = 0;
char *rstring;
int *mc;
int *str32;
int str32len, str32pos = 0;
int decomp_len, decomp_shift;
int comp_pos, comp_starter_pos;
int cclass_prev, cclass2;
int ch1, ch2;
int first_ral, last_ral, have_ral, have_l;
size = len + 1;
rstring = driver_alloc(size);
rstring[0] = 0;
str32len = len + 1;
str32 = driver_alloc(str32len * sizeof(int));
switch (command)
{
case 0:
prohibit = ACMask;
tolower = 1;
break;
case NAMEPREP_COMMAND:
prohibit = ACMask;
tolower = 1;
break;
case NODEPREP_COMMAND:
prohibit = ACMask | C11Mask | C21Mask | XNPMask;
tolower = 1;
break;
case RESOURCEPREP_COMMAND:
prohibit = ACMask | C21Mask;
tolower = 0;
break;
}
for (i = 0; i < len; i++)
{
c = buf[i];
if (c < 0x80) {
uc = c;
} else if (c < 0xC0) {
bad = 1;
} else if (c < 0xE0) {
if (i+1 < len && (buf[i+1] & 0xC0) == 0x80) {
uc = ((c & 0x1F) << 6) | (buf[i+1] & 0x3F);
i++;
} else {
bad = 1;
}
} else if (c < 0xF0) {
if (i+2 < len && (buf[i+1] & 0xC0) == 0x80 &&
(buf[i+2] & 0xC0) == 0x80) {
uc = ((c & 0x0F) << 12)
| ((buf[i+1] & 0x3F) << 6)
| (buf[i+2] & 0x3F);
i += 2;
} else {
bad = 1;
}
} else if (c < 0xF8) {
if (i+3 < len &&
(buf[i+1] & 0xC0) == 0x80 &&
(buf[i+2] & 0xC0) == 0x80 &&
(buf[i+3] & 0xC0) == 0x80) {
uc = ((c & 0x07) << 18)
| ((buf[i+1] & 0x3F) << 12)
| ((buf[i+2] & 0x3F) << 6)
| (buf[i+3] & 0x3F);
i += 3;
if (uc > 0x10FFFF)
bad = 1;
} else {
bad = 1;
}
} else {
bad = 1;
}
if (bad) {
*rbuf = rstring;
driver_free(str32);
return 1;
}
info = GetUniCharInfo(uc);
if (!(info & B1Mask))
{
if (tolower) {
if (!(info & MCMask))
{
ruc = uc + GetDelta(info);
ADD_DECOMP(ruc);
} else {
mc = GetMC(info);
for (j = 1; j <= mc[0]; j++) {
ruc = mc[j];
ADD_DECOMP(ruc);
}
}
} else {
ruc = uc;
ADD_DECOMP(ruc);
}
}
}
if (str32pos == 0) {
rstring[0] = 1;
*rbuf = rstring;
driver_free(str32);
return 1;
}
canonical_ordering(str32, str32pos);
comp_pos = 1;
comp_starter_pos = 0;
ch1 = str32[0];
cclass_prev = GetUniCharCClass(ch1);
for (i = 1; i < str32pos; i++)
{
ch2 = str32[i];
cclass2 = GetUniCharCClass(ch2);
if ((cclass_prev == 0 || cclass2 > cclass_prev) &&
(ruc = compose(ch1, ch2))) {
ch1 = ruc;
} else {
if (cclass2 == 0) {
str32[comp_starter_pos] = ch1;
comp_starter_pos = comp_pos++;
ch1 = ch2;
cclass_prev = 0;
} else {
str32[comp_pos++] = ch2;
cclass_prev = cclass2;
}
}
}
str32[comp_starter_pos] = ch1;
str32pos = comp_pos;
last_ral = have_ral = have_l = 0;
info = GetUniCharInfo(str32[0]);
first_ral = info & D1Mask;
for (i = 0; i < str32pos; i++)
{
ruc = str32[i];
info = GetUniCharInfo(ruc);
if (info & prohibit) {
*rbuf = rstring;
driver_free(str32);
return 1;
}
last_ral = info & D1Mask;
have_ral = have_ral || last_ral;
have_l |= info & D2Mask;
ADD_UCHAR(ruc);
}
if (have_ral && (!first_ral || !last_ral || have_l)) {
*rbuf = rstring;
driver_free(str32);
return 1;
}
rstring[0] = 1;
*rbuf = rstring;
driver_free(str32);
return pos;
}
ErlDrvEntry stringprep_driver_entry = {
NULL, /* F_PTR init, N/A */
stringprep_erl_start, /* L_PTR start, called when port is opened */
stringprep_erl_stop, /* F_PTR stop, called when port is closed */
NULL, /* F_PTR output, called when erlang has sent */
NULL, /* F_PTR ready_input, called when input descriptor ready */
NULL, /* F_PTR ready_output, called when output descriptor ready */
"stringprep_drv", /* char *driver_name, the argument to open_port */
NULL, /* F_PTR finish, called when unloaded */
NULL, /* handle */
stringprep_erl_control, /* F_PTR control, port_command callback */
NULL, /* F_PTR timeout, reserved */
NULL, /* F_PTR outputv, reserved */
/* Added in Erlang/OTP R15B: */
NULL, /* ready_async */
NULL, /* flush */
NULL, /* call */
NULL, /* event */
ERL_DRV_EXTENDED_MARKER, /* extended_marker */
ERL_DRV_EXTENDED_MAJOR_VERSION, /* major_version */
ERL_DRV_EXTENDED_MINOR_VERSION, /* minor_version */
0, /* driver_flags */
NULL, /* handle2 */
NULL, /* process_exit */
NULL /* stop_select */
};
DRIVER_INIT(stringprep_erl) /* must match name in driver_entry */
{
return &stringprep_driver_entry;
}
ejabberd-2.1.11/src/mod_last.erl 0000664 0000000 0000000 00000017351 12240230175 013322 0 ustar %%%----------------------------------------------------------------------
%%% File : mod_last.erl
%%% Author : Alexey Shchepin
%%% Purpose : jabber:iq:last support (XEP-0012)
%%% Created : 24 Oct 2003 by Alexey Shchepin
%%%
%%%
%%% ejabberd, Copyright (C) 2002-2012 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
%%% published by the Free Software Foundation; either version 2 of the
%%% License, or (at your option) any later version.
%%%
%%% This program is distributed in the hope that it will be useful,
%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
%%% General Public License for more details.
%%%
%%% You should have received a copy of the GNU General Public License
%%% along with this program; if not, write to the Free Software
%%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
%%% 02111-1307 USA
%%%
%%%----------------------------------------------------------------------
-module(mod_last).
-author('alexey@process-one.net').
-behaviour(gen_mod).
-export([start/2,
stop/1,
process_local_iq/3,
process_sm_iq/3,
on_presence_update/4,
store_last_info/4,
get_last_info/2,
remove_user/2]).
-include("ejabberd.hrl").
-include("jlib.hrl").
-include("mod_privacy.hrl").
-record(last_activity, {us, timestamp, status}).
start(Host, Opts) ->
IQDisc = gen_mod:get_opt(iqdisc, Opts, one_queue),
mnesia:create_table(last_activity,
[{disc_copies, [node()]},
{attributes, record_info(fields, last_activity)}]),
update_table(),
gen_iq_handler:add_iq_handler(ejabberd_local, Host, ?NS_LAST,
?MODULE, process_local_iq, IQDisc),
gen_iq_handler:add_iq_handler(ejabberd_sm, Host, ?NS_LAST,
?MODULE, process_sm_iq, IQDisc),
ejabberd_hooks:add(remove_user, Host,
?MODULE, remove_user, 50),
ejabberd_hooks:add(unset_presence_hook, Host,
?MODULE, on_presence_update, 50).
stop(Host) ->
ejabberd_hooks:delete(remove_user, Host,
?MODULE, remove_user, 50),
ejabberd_hooks:delete(unset_presence_hook, Host,
?MODULE, on_presence_update, 50),
gen_iq_handler:remove_iq_handler(ejabberd_local, Host, ?NS_LAST),
gen_iq_handler:remove_iq_handler(ejabberd_sm, Host, ?NS_LAST).
%%%
%%% Uptime of ejabberd node
%%%
process_local_iq(_From, _To, #iq{type = Type, sub_el = SubEl} = IQ) ->
case Type of
set ->
IQ#iq{type = error, sub_el = [SubEl, ?ERR_NOT_ALLOWED]};
get ->
Sec = get_node_uptime(),
IQ#iq{type = result,
sub_el = [{xmlelement, "query",
[{"xmlns", ?NS_LAST},
{"seconds", integer_to_list(Sec)}],
[]}]}
end.
%% @spec () -> integer()
%% @doc Get the uptime of the ejabberd node, expressed in seconds.
%% When ejabberd is starting, ejabberd_config:start/0 stores the datetime.
get_node_uptime() ->
case ejabberd_config:get_local_option(node_start) of
{_, _, _} = StartNow ->
now_to_seconds(now()) - now_to_seconds(StartNow);
_undefined ->
trunc(element(1, erlang:statistics(wall_clock))/1000)
end.
now_to_seconds({MegaSecs, Secs, _MicroSecs}) ->
MegaSecs * 1000000 + Secs.
%%%
%%% Serve queries about user last online
%%%
process_sm_iq(From, To, #iq{type = Type, sub_el = SubEl} = IQ) ->
case Type of
set ->
IQ#iq{type = error, sub_el = [SubEl, ?ERR_NOT_ALLOWED]};
get ->
User = To#jid.luser,
Server = To#jid.lserver,
{Subscription, _Groups} =
ejabberd_hooks:run_fold(
roster_get_jid_info, Server,
{none, []}, [User, Server, From]),
if
(Subscription == both) or (Subscription == from)
or ((From#jid.luser == To#jid.luser)
and (From#jid.lserver == To#jid.lserver)) ->
UserListRecord = ejabberd_hooks:run_fold(
privacy_get_user_list, Server,
#userlist{},
[User, Server]),
case ejabberd_hooks:run_fold(
privacy_check_packet, Server,
allow,
[User, Server, UserListRecord,
{To, From,
{xmlelement, "presence", [], []}},
out]) of
allow ->
get_last_iq(IQ, SubEl, User, Server);
deny ->
IQ#iq{type = error,
sub_el = [SubEl, ?ERR_FORBIDDEN]}
end;
true ->
IQ#iq{type = error,
sub_el = [SubEl, ?ERR_FORBIDDEN]}
end
end.
%% @spec (LUser::string(), LServer::string()) ->
%% {ok, TimeStamp::integer(), Status::string()} | not_found | {error, Reason}
get_last(LUser, LServer) ->
case catch mnesia:dirty_read(last_activity, {LUser, LServer}) of
{'EXIT', Reason} ->
{error, Reason};
[] ->
not_found;
[#last_activity{timestamp = TimeStamp, status = Status}] ->
{ok, TimeStamp, Status}
end.
get_last_iq(IQ, SubEl, LUser, LServer) ->
case ejabberd_sm:get_user_resources(LUser, LServer) of
[] ->
case get_last(LUser, LServer) of
{error, _Reason} ->
IQ#iq{type = error, sub_el = [SubEl, ?ERR_INTERNAL_SERVER_ERROR]};
not_found ->
IQ#iq{type = error, sub_el = [SubEl, ?ERR_SERVICE_UNAVAILABLE]};
{ok, TimeStamp, Status} ->
TimeStamp2 = now_to_seconds(now()),
Sec = TimeStamp2 - TimeStamp,
IQ#iq{type = result,
sub_el = [{xmlelement, "query",
[{"xmlns", ?NS_LAST},
{"seconds", integer_to_list(Sec)}],
[{xmlcdata, Status}]}]}
end;
_ ->
IQ#iq{type = result,
sub_el = [{xmlelement, "query",
[{"xmlns", ?NS_LAST},
{"seconds", "0"}],
[]}]}
end.
on_presence_update(User, Server, _Resource, Status) ->
TimeStamp = now_to_seconds(now()),
store_last_info(User, Server, TimeStamp, Status).
store_last_info(User, Server, TimeStamp, Status) ->
LUser = jlib:nodeprep(User),
LServer = jlib:nameprep(Server),
US = {LUser, LServer},
F = fun() ->
mnesia:write(#last_activity{us = US,
timestamp = TimeStamp,
status = Status})
end,
mnesia:transaction(F).
%% @spec (LUser::string(), LServer::string()) ->
%% {ok, TimeStamp::integer(), Status::string()} | not_found
get_last_info(LUser, LServer) ->
case get_last(LUser, LServer) of
{error, _Reason} ->
not_found;
Res ->
Res
end.
remove_user(User, Server) ->
LUser = jlib:nodeprep(User),
LServer = jlib:nameprep(Server),
US = {LUser, LServer},
F = fun() ->
mnesia:delete({last_activity, US})
end,
mnesia:transaction(F).
update_table() ->
Fields = record_info(fields, last_activity),
case mnesia:table_info(last_activity, attributes) of
Fields ->
ok;
[user, timestamp, status] ->
?INFO_MSG("Converting last_activity table from {user, timestamp, status} format", []),
Host = ?MYNAME,
mnesia:transform_table(last_activity, ignore, Fields),
F = fun() ->
mnesia:write_lock_table(last_activity),
mnesia:foldl(
fun({_, U, T, S} = R, _) ->
mnesia:delete_object(R),
mnesia:write(
#last_activity{us = {U, Host},
timestamp = T,
status = S})
end, ok, last_activity)
end,
mnesia:transaction(F);
[user, timestamp] ->
?INFO_MSG("Converting last_activity table from {user, timestamp} format", []),
Host = ?MYNAME,
mnesia:transform_table(
last_activity,
fun({_, U, T}) ->
#last_activity{us = U,
timestamp = T,
status = ""}
end, Fields),
F = fun() ->
mnesia:write_lock_table(last_activity),
mnesia:foldl(
fun({_, U, T, S} = R, _) ->
mnesia:delete_object(R),
mnesia:write(
#last_activity{us = {U, Host},
timestamp = T,
status = S})
end, ok, last_activity)
end,
mnesia:transaction(F);
_ ->
?INFO_MSG("Recreating last_activity table", []),
mnesia:transform_table(last_activity, ignore, Fields)
end.
ejabberd-2.1.11/src/ejabberd_router.erl 0000664 0000000 0000000 00000027542 12240230175 014661 0 ustar %%%----------------------------------------------------------------------
%%% File : ejabberd_router.erl
%%% Author : Alexey Shchepin
%%% Purpose : Main router
%%% Created : 27 Nov 2002 by Alexey Shchepin
%%%
%%%
%%% ejabberd, Copyright (C) 2002-2012 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
%%% published by the Free Software Foundation; either version 2 of the
%%% License, or (at your option) any later version.
%%%
%%% This program is distributed in the hope that it will be useful,
%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
%%% General Public License for more details.
%%%
%%% You should have received a copy of the GNU General Public License
%%% along with this program; if not, write to the Free Software
%%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
%%% 02111-1307 USA
%%%
%%%----------------------------------------------------------------------
-module(ejabberd_router).
-author('alexey@process-one.net').
-behaviour(gen_server).
%% API
-export([route/3,
route_error/4,
register_route/1,
register_route/2,
register_routes/1,
unregister_route/1,
unregister_routes/1,
dirty_get_all_routes/0,
dirty_get_all_domains/0
]).
-export([start_link/0]).
%% gen_server callbacks
-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
terminate/2, code_change/3]).
-include("ejabberd.hrl").
-include("jlib.hrl").
-record(route, {domain, pid, local_hint}).
-record(state, {}).
%%====================================================================
%% API
%%====================================================================
%%--------------------------------------------------------------------
%% Function: start_link() -> {ok,Pid} | ignore | {error,Error}
%% Description: Starts the server
%%--------------------------------------------------------------------
start_link() ->
gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
route(From, To, Packet) ->
case catch do_route(From, To, Packet) of
{'EXIT', Reason} ->
?ERROR_MSG("~p~nwhen processing: ~p",
[Reason, {From, To, Packet}]);
_ ->
ok
end.
%% Route the error packet only if the originating packet is not an error itself.
%% RFC3920 9.3.1
route_error(From, To, ErrPacket, OrigPacket) ->
{xmlelement, _Name, Attrs, _Els} = OrigPacket,
case "error" == xml:get_attr_s("type", Attrs) of
false ->
route(From, To, ErrPacket);
true ->
ok
end.
register_route(Domain) ->
register_route(Domain, undefined).
register_route(Domain, LocalHint) ->
case jlib:nameprep(Domain) of
error ->
erlang:error({invalid_domain, Domain});
LDomain ->
Pid = self(),
case get_component_number(LDomain) of
undefined ->
F = fun() ->
mnesia:write(#route{domain = LDomain,
pid = Pid,
local_hint = LocalHint})
end,
mnesia:transaction(F);
N ->
F = fun() ->
case mnesia:wread({route, LDomain}) of
[] ->
mnesia:write(
#route{domain = LDomain,
pid = Pid,
local_hint = 1}),
lists:foreach(
fun(I) ->
mnesia:write(
#route{domain = LDomain,
pid = undefined,
local_hint = I})
end, lists:seq(2, N));
Rs ->
lists:any(
fun(#route{pid = undefined,
local_hint = I} = R) ->
mnesia:write(
#route{domain = LDomain,
pid = Pid,
local_hint = I}),
mnesia:delete_object(R),
true;
(_) ->
false
end, Rs)
end
end,
mnesia:transaction(F)
end
end.
register_routes(Domains) ->
lists:foreach(fun(Domain) ->
register_route(Domain)
end, Domains).
unregister_route(Domain) ->
case jlib:nameprep(Domain) of
error ->
erlang:error({invalid_domain, Domain});
LDomain ->
Pid = self(),
case get_component_number(LDomain) of
undefined ->
F = fun() ->
case mnesia:match_object(
#route{domain = LDomain,
pid = Pid,
_ = '_'}) of
[R] ->
mnesia:delete_object(R);
_ ->
ok
end
end,
mnesia:transaction(F);
_ ->
F = fun() ->
case mnesia:match_object(#route{domain=LDomain,
pid = Pid,
_ = '_'}) of
[R] ->
I = R#route.local_hint,
mnesia:write(
#route{domain = LDomain,
pid = undefined,
local_hint = I}),
mnesia:delete_object(R);
_ ->
ok
end
end,
mnesia:transaction(F)
end
end.
unregister_routes(Domains) ->
lists:foreach(fun(Domain) ->
unregister_route(Domain)
end, Domains).
dirty_get_all_routes() ->
lists:usort(mnesia:dirty_all_keys(route)) -- ?MYHOSTS.
dirty_get_all_domains() ->
lists:usort(mnesia:dirty_all_keys(route)).
%%====================================================================
%% gen_server callbacks
%%====================================================================
%%--------------------------------------------------------------------
%% Function: init(Args) -> {ok, State} |
%% {ok, State, Timeout} |
%% ignore |
%% {stop, Reason}
%% Description: Initiates the server
%%--------------------------------------------------------------------
init([]) ->
update_tables(),
mnesia:create_table(route,
[{ram_copies, [node()]},
{type, bag},
{attributes,
record_info(fields, route)}]),
mnesia:add_table_copy(route, node(), ram_copies),
mnesia:subscribe({table, route, simple}),
lists:foreach(
fun(Pid) ->
erlang:monitor(process, Pid)
end,
mnesia:dirty_select(route, [{{route, '_', '$1', '_'}, [], ['$1']}])),
{ok, #state{}}.
%%--------------------------------------------------------------------
%% Function: %% handle_call(Request, From, State) -> {reply, Reply, State} |
%% {reply, Reply, State, Timeout} |
%% {noreply, State} |
%% {noreply, State, Timeout} |
%% {stop, Reason, Reply, State} |
%% {stop, Reason, State}
%% Description: Handling call messages
%%--------------------------------------------------------------------
handle_call(_Request, _From, State) ->
Reply = ok,
{reply, Reply, State}.
%%--------------------------------------------------------------------
%% Function: handle_cast(Msg, State) -> {noreply, State} |
%% {noreply, State, Timeout} |
%% {stop, Reason, State}
%% Description: Handling cast messages
%%--------------------------------------------------------------------
handle_cast(_Msg, State) ->
{noreply, State}.
%%--------------------------------------------------------------------
%% Function: handle_info(Info, State) -> {noreply, State} |
%% {noreply, State, Timeout} |
%% {stop, Reason, State}
%% Description: Handling all non call/cast messages
%%--------------------------------------------------------------------
handle_info({route, From, To, Packet}, State) ->
case catch do_route(From, To, Packet) of
{'EXIT', Reason} ->
?ERROR_MSG("~p~nwhen processing: ~p",
[Reason, {From, To, Packet}]);
_ ->
ok
end,
{noreply, State};
handle_info({mnesia_table_event, {write, #route{pid = Pid}, _ActivityId}},
State) ->
erlang:monitor(process, Pid),
{noreply, State};
handle_info({'DOWN', _Ref, _Type, Pid, _Info}, State) ->
F = fun() ->
Es = mnesia:select(
route,
[{#route{pid = Pid, _ = '_'},
[],
['$_']}]),
lists:foreach(
fun(E) ->
if
is_integer(E#route.local_hint) ->
LDomain = E#route.domain,
I = E#route.local_hint,
mnesia:write(
#route{domain = LDomain,
pid = undefined,
local_hint = I}),
mnesia:delete_object(E);
true ->
mnesia:delete_object(E)
end
end, Es)
end,
mnesia:transaction(F),
{noreply, State};
handle_info(_Info, State) ->
{noreply, State}.
%%--------------------------------------------------------------------
%% Function: terminate(Reason, State) -> void()
%% Description: This function is called by a gen_server when it is about to
%% terminate. It should be the opposite of Module:init/1 and do any necessary
%% cleaning up. When it returns, the gen_server terminates with Reason.
%% The return value is ignored.
%%--------------------------------------------------------------------
terminate(_Reason, _State) ->
ok.
%%--------------------------------------------------------------------
%% Func: code_change(OldVsn, State, Extra) -> {ok, NewState}
%% Description: Convert process state when code is changed
%%--------------------------------------------------------------------
code_change(_OldVsn, State, _Extra) ->
{ok, State}.
%%--------------------------------------------------------------------
%%% Internal functions
%%--------------------------------------------------------------------
do_route(OrigFrom, OrigTo, OrigPacket) ->
?DEBUG("route~n\tfrom ~p~n\tto ~p~n\tpacket ~p~n",
[OrigFrom, OrigTo, OrigPacket]),
case ejabberd_hooks:run_fold(filter_packet,
{OrigFrom, OrigTo, OrigPacket}, []) of
{From, To, Packet} ->
LDstDomain = To#jid.lserver,
case mnesia:dirty_read(route, LDstDomain) of
[] ->
ejabberd_s2s:route(From, To, Packet);
[R] ->
Pid = R#route.pid,
if
node(Pid) == node() ->
case R#route.local_hint of
{apply, Module, Function} ->
Module:Function(From, To, Packet);
_ ->
Pid ! {route, From, To, Packet}
end;
is_pid(Pid) ->
Pid ! {route, From, To, Packet};
true ->
drop
end;
Rs ->
Value = case ejabberd_config:get_local_option(
{domain_balancing, LDstDomain}) of
undefined -> now();
random -> now();
source -> jlib:jid_tolower(From);
destination -> jlib:jid_tolower(To);
bare_source ->
jlib:jid_remove_resource(
jlib:jid_tolower(From));
bare_destination ->
jlib:jid_remove_resource(
jlib:jid_tolower(To))
end,
case get_component_number(LDstDomain) of
undefined ->
case [R || R <- Rs, node(R#route.pid) == node()] of
[] ->
R = lists:nth(erlang:phash(Value, length(Rs)), Rs),
Pid = R#route.pid,
if
is_pid(Pid) ->
Pid ! {route, From, To, Packet};
true ->
drop
end;
LRs ->
R = lists:nth(erlang:phash(Value, length(LRs)), LRs),
Pid = R#route.pid,
case R#route.local_hint of
{apply, Module, Function} ->
Module:Function(From, To, Packet);
_ ->
Pid ! {route, From, To, Packet}
end
end;
_ ->
SRs = lists:ukeysort(#route.local_hint, Rs),
R = lists:nth(erlang:phash(Value, length(SRs)), SRs),
Pid = R#route.pid,
if
is_pid(Pid) ->
Pid ! {route, From, To, Packet};
true ->
drop
end
end
end;
drop ->
ok
end.
get_component_number(LDomain) ->
case ejabberd_config:get_local_option(
{domain_balancing_component_number, LDomain}) of
N when is_integer(N),
N > 1 ->
N;
_ ->
undefined
end.
update_tables() ->
case catch mnesia:table_info(route, attributes) of
[domain, node, pid] ->
mnesia:delete_table(route);
[domain, pid] ->
mnesia:delete_table(route);
[domain, pid, local_hint] ->
ok;
{'EXIT', _} ->
ok
end,
case lists:member(local_route, mnesia:system_info(tables)) of
true ->
mnesia:delete_table(local_route);
false ->
ok
end.
ejabberd-2.1.11/src/inetrc 0000664 0000000 0000000 00000000157 12240230175 012217 0 ustar {lookup,["file","native"]}.
{host,{127,0,0,1}, ["localhost","hostalias"]}.
{file, resolv, "/etc/resolv.conf"}.
ejabberd-2.1.11/src/mod_adhoc.erl 0000664 0000000 0000000 00000021032 12240230175 013424 0 ustar %%%----------------------------------------------------------------------
%%% File : mod_adhoc.erl
%%% Author : Magnus Henoch
%%% Purpose : Handle incoming ad-doc requests (XEP-0050)
%%% Created : 15 Nov 2005 by Magnus Henoch
%%%
%%%
%%% ejabberd, Copyright (C) 2002-2012 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
%%% published by the Free Software Foundation; either version 2 of the
%%% License, or (at your option) any later version.
%%%
%%% This program is distributed in the hope that it will be useful,
%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
%%% General Public License for more details.
%%%
%%% You should have received a copy of the GNU General Public License
%%% along with this program; if not, write to the Free Software
%%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
%%% 02111-1307 USA
%%%
%%%----------------------------------------------------------------------
-module(mod_adhoc).
-author('henoch@dtek.chalmers.se').
-behaviour(gen_mod).
-export([start/2,
stop/1,
process_local_iq/3,
process_sm_iq/3,
get_local_commands/5,
get_local_identity/5,
get_local_features/5,
get_sm_commands/5,
get_sm_identity/5,
get_sm_features/5,
ping_item/4,
ping_command/4]).
-include("ejabberd.hrl").
-include("jlib.hrl").
-include("adhoc.hrl").
start(Host, Opts) ->
IQDisc = gen_mod:get_opt(iqdisc, Opts, one_queue),
gen_iq_handler:add_iq_handler(ejabberd_local, Host, ?NS_COMMANDS,
?MODULE, process_local_iq, IQDisc),
gen_iq_handler:add_iq_handler(ejabberd_sm, Host, ?NS_COMMANDS,
?MODULE, process_sm_iq, IQDisc),
ejabberd_hooks:add(disco_local_identity, Host, ?MODULE, get_local_identity, 99),
ejabberd_hooks:add(disco_local_features, Host, ?MODULE, get_local_features, 99),
ejabberd_hooks:add(disco_local_items, Host, ?MODULE, get_local_commands, 99),
ejabberd_hooks:add(disco_sm_identity, Host, ?MODULE, get_sm_identity, 99),
ejabberd_hooks:add(disco_sm_features, Host, ?MODULE, get_sm_features, 99),
ejabberd_hooks:add(disco_sm_items, Host, ?MODULE, get_sm_commands, 99),
ejabberd_hooks:add(adhoc_local_items, Host, ?MODULE, ping_item, 100),
ejabberd_hooks:add(adhoc_local_commands, Host, ?MODULE, ping_command, 100).
stop(Host) ->
ejabberd_hooks:delete(adhoc_local_commands, Host, ?MODULE, ping_command, 100),
ejabberd_hooks:delete(adhoc_local_items, Host, ?MODULE, ping_item, 100),
ejabberd_hooks:delete(disco_sm_items, Host, ?MODULE, get_sm_commands, 99),
ejabberd_hooks:delete(disco_sm_features, Host, ?MODULE, get_sm_features, 99),
ejabberd_hooks:delete(disco_sm_identity, Host, ?MODULE, get_sm_identity, 99),
ejabberd_hooks:delete(disco_local_items, Host, ?MODULE, get_local_commands, 99),
ejabberd_hooks:delete(disco_local_features, Host, ?MODULE, get_local_features, 99),
ejabberd_hooks:delete(disco_local_identity, Host, ?MODULE, get_local_identity, 99),
gen_iq_handler:remove_iq_handler(ejabberd_sm, Host, ?NS_COMMANDS),
gen_iq_handler:remove_iq_handler(ejabberd_local, Host, ?NS_COMMANDS).
%-------------------------------------------------------------------------
get_local_commands(Acc, _From, #jid{server = Server, lserver = LServer} = _To, "", Lang) ->
Display = gen_mod:get_module_opt(LServer, ?MODULE, report_commands_node, false),
case Display of
false ->
Acc;
_ ->
Items = case Acc of
{result, I} -> I;
_ -> []
end,
Nodes = [{xmlelement,
"item",
[{"jid", Server},
{"node", ?NS_COMMANDS},
{"name", translate:translate(Lang, "Commands")}],
[]}],
{result, Items ++ Nodes}
end;
get_local_commands(_Acc, From, #jid{lserver = LServer} = To, ?NS_COMMANDS, Lang) ->
ejabberd_hooks:run_fold(adhoc_local_items, LServer, {result, []}, [From, To, Lang]);
get_local_commands(_Acc, _From, _To, "ping", _Lang) ->
{result, []};
get_local_commands(Acc, _From, _To, _Node, _Lang) ->
Acc.
%-------------------------------------------------------------------------
get_sm_commands(Acc, _From, #jid{lserver = LServer} = To, "", Lang) ->
Display = gen_mod:get_module_opt(LServer, ?MODULE, report_commands_node, false),
case Display of
false ->
Acc;
_ ->
Items = case Acc of
{result, I} -> I;
_ -> []
end,
Nodes = [{xmlelement,
"item",
[{"jid", jlib:jid_to_string(To)},
{"node", ?NS_COMMANDS},
{"name", translate:translate(Lang, "Commands")}],
[]}],
{result, Items ++ Nodes}
end;
get_sm_commands(_Acc, From, #jid{lserver = LServer} = To, ?NS_COMMANDS, Lang) ->
ejabberd_hooks:run_fold(adhoc_sm_items, LServer, {result, []}, [From, To, Lang]);
get_sm_commands(Acc, _From, _To, _Node, _Lang) ->
Acc.
%-------------------------------------------------------------------------
%% On disco info request to the ad-hoc node, return automation/command-list.
get_local_identity(Acc, _From, _To, ?NS_COMMANDS, Lang) ->
[{xmlelement, "identity",
[{"category", "automation"},
{"type", "command-list"},
{"name", translate:translate(Lang, "Commands")}], []} | Acc];
get_local_identity(Acc, _From, _To, "ping", Lang) ->
[{xmlelement, "identity",
[{"category", "automation"},
{"type", "command-node"},
{"name", translate:translate(Lang, "Ping")}], []} | Acc];
get_local_identity(Acc, _From, _To, _Node, _Lang) ->
Acc.
%-------------------------------------------------------------------------
%% On disco info request to the ad-hoc node, return automation/command-list.
get_sm_identity(Acc, _From, _To, ?NS_COMMANDS, Lang) ->
[{xmlelement, "identity",
[{"category", "automation"},
{"type", "command-list"},
{"name", translate:translate(Lang, "Commands")}], []} | Acc];
get_sm_identity(Acc, _From, _To, _Node, _Lang) ->
Acc.
%-------------------------------------------------------------------------
get_local_features(Acc, _From, _To, "", _Lang) ->
Feats = case Acc of
{result, I} -> I;
_ -> []
end,
{result, Feats ++ [?NS_COMMANDS]};
get_local_features(_Acc, _From, _To, ?NS_COMMANDS, _Lang) ->
%% override all lesser features...
{result, []};
get_local_features(_Acc, _From, _To, "ping", _Lang) ->
%% override all lesser features...
{result, [?NS_COMMANDS]};
get_local_features(Acc, _From, _To, _Node, _Lang) ->
Acc.
%-------------------------------------------------------------------------
get_sm_features(Acc, _From, _To, "", _Lang) ->
Feats = case Acc of
{result, I} -> I;
_ -> []
end,
{result, Feats ++ [?NS_COMMANDS]};
get_sm_features(_Acc, _From, _To, ?NS_COMMANDS, _Lang) ->
%% override all lesser features...
{result, []};
get_sm_features(Acc, _From, _To, _Node, _Lang) ->
Acc.
%-------------------------------------------------------------------------
process_local_iq(From, To, IQ) ->
process_adhoc_request(From, To, IQ, adhoc_local_commands).
process_sm_iq(From, To, IQ) ->
process_adhoc_request(From, To, IQ, adhoc_sm_commands).
process_adhoc_request(From, To, #iq{sub_el = SubEl} = IQ, Hook) ->
?DEBUG("About to parse ~p...", [IQ]),
case adhoc:parse_request(IQ) of
{error, Error} ->
IQ#iq{type = error, sub_el = [SubEl, Error]};
#adhoc_request{} = AdhocRequest ->
Host = To#jid.lserver,
case ejabberd_hooks:run_fold(Hook, Host, empty,
[From, To, AdhocRequest]) of
ignore ->
ignore;
empty ->
IQ#iq{type = error, sub_el = [SubEl, ?ERR_ITEM_NOT_FOUND]};
{error, Error} ->
IQ#iq{type = error, sub_el = [SubEl, Error]};
Command ->
IQ#iq{type = result, sub_el = [Command]}
end
end.
ping_item(Acc, _From, #jid{server = Server} = _To, Lang) ->
Items = case Acc of
{result, I} ->
I;
_ ->
[]
end,
Nodes = [{xmlelement, "item",
[{"jid", Server},
{"node", "ping"},
{"name", translate:translate(Lang, "Ping")}],
[]}],
{result, Items ++ Nodes}.
ping_command(_Acc, _From, _To,
#adhoc_request{lang = Lang,
node = "ping",
sessionid = _Sessionid,
action = Action} = Request) ->
if
Action == ""; Action == "execute" ->
adhoc:produce_response(
Request,
#adhoc_response{status = completed,
notes = [{"info", translate:translate(
Lang,
"Pong")}]});
true ->
{error, ?ERR_BAD_REQUEST}
end;
ping_command(Acc, _From, _To, _Request) ->
Acc.
ejabberd-2.1.11/src/ejabberd_app.erl 0000664 0000000 0000000 00000014373 12240230175 014117 0 ustar %%%----------------------------------------------------------------------
%%% File : ejabberd_app.erl
%%% Author : Alexey Shchepin
%%% Purpose : ejabberd's application callback module
%%% Created : 31 Jan 2003 by Alexey Shchepin
%%%
%%%
%%% ejabberd, Copyright (C) 2002-2012 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
%%% published by the Free Software Foundation; either version 2 of the
%%% License, or (at your option) any later version.
%%%
%%% This program is distributed in the hope that it will be useful,
%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
%%% General Public License for more details.
%%%
%%% You should have received a copy of the GNU General Public License
%%% along with this program; if not, write to the Free Software
%%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
%%% 02111-1307 USA
%%%
%%%----------------------------------------------------------------------
-module(ejabberd_app).
-author('alexey@process-one.net').
-behaviour(application).
-export([start_modules/0,start/2, get_log_path/0, prep_stop/1, stop/1, init/0]).
-include("ejabberd.hrl").
%%%
%%% Application API
%%%
start(normal, _Args) ->
ejabberd_loglevel:set(4),
write_pid_file(),
application:start(sasl),
randoms:start(),
db_init(),
sha:start(),
stringprep_sup:start_link(),
xml:start(),
start(),
translate:start(),
acl:start(),
ejabberd_ctl:init(),
ejabberd_commands:init(),
ejabberd_admin:start(),
gen_mod:start(),
ejabberd_config:start(),
ejabberd_check:config(),
connect_nodes(),
%% Loading ASN.1 driver explicitly to avoid races in LDAP
catch asn1rt:load_driver(),
Sup = ejabberd_sup:start_link(),
ejabberd_rdbms:start(),
ejabberd_auth:start(),
cyrsasl:start(),
% Profiling
%ejabberd_debug:eprof_start(),
%ejabberd_debug:fprof_start(),
maybe_add_nameservers(),
start_modules(),
ejabberd_listener:start_listeners(),
?INFO_MSG("ejabberd ~s is started in the node ~p", [?VERSION, node()]),
Sup;
start(_, _) ->
{error, badarg}.
%% Prepare the application for termination.
%% This function is called when an application is about to be stopped,
%% before shutting down the processes of the application.
prep_stop(State) ->
stop_modules(),
ejabberd_admin:stop(),
broadcast_c2s_shutdown(),
timer:sleep(5000),
State.
%% All the processes were killed when this function is called
stop(_State) ->
?INFO_MSG("ejabberd ~s is stopped in the node ~p", [?VERSION, node()]),
delete_pid_file(),
%%ejabberd_debug:stop(),
ok.
%%%
%%% Internal functions
%%%
start() ->
spawn_link(?MODULE, init, []).
init() ->
register(ejabberd, self()),
%erlang:system_flag(fullsweep_after, 0),
%error_logger:logfile({open, ?LOG_PATH}),
LogPath = get_log_path(),
error_logger:add_report_handler(ejabberd_logger_h, LogPath),
erl_ddll:load_driver(ejabberd:get_so_path(), tls_drv),
case erl_ddll:load_driver(ejabberd:get_so_path(), expat_erl) of
ok -> ok;
{error, already_loaded} -> ok
end,
Port = open_port({spawn, "expat_erl"}, [binary]),
loop(Port).
loop(Port) ->
receive
_ ->
loop(Port)
end.
db_init() ->
case mnesia:system_info(extra_db_nodes) of
[] ->
mnesia:create_schema([node()]);
_ ->
ok
end,
application:start(mnesia, permanent),
mnesia:wait_for_tables(mnesia:system_info(local_tables), infinity).
%% Start all the modules in all the hosts
start_modules() ->
lists:foreach(
fun(Host) ->
case ejabberd_config:get_local_option({modules, Host}) of
undefined ->
ok;
Modules ->
lists:foreach(
fun({Module, Args}) ->
gen_mod:start_module(Host, Module, Args)
end, Modules)
end
end, ?MYHOSTS).
%% Stop all the modules in all the hosts
stop_modules() ->
lists:foreach(
fun(Host) ->
case ejabberd_config:get_local_option({modules, Host}) of
undefined ->
ok;
Modules ->
lists:foreach(
fun({Module, _Args}) ->
gen_mod:stop_module_keep_config(Host, Module)
end, Modules)
end
end, ?MYHOSTS).
connect_nodes() ->
case ejabberd_config:get_local_option(cluster_nodes) of
undefined ->
ok;
Nodes when is_list(Nodes) ->
lists:foreach(fun(Node) ->
net_kernel:connect_node(Node)
end, Nodes)
end.
%% @spec () -> string()
%% @doc Returns the full path to the ejabberd log file.
%% It first checks for application configuration parameter 'log_path'.
%% If not defined it checks the environment variable EJABBERD_LOG_PATH.
%% And if that one is neither defined, returns the default value:
%% "ejabberd.log" in current directory.
get_log_path() ->
case application:get_env(log_path) of
{ok, Path} ->
Path;
undefined ->
case os:getenv("EJABBERD_LOG_PATH") of
false ->
?LOG_PATH;
Path ->
Path
end
end.
%% If ejabberd is running on some Windows machine, get nameservers and add to Erlang
maybe_add_nameservers() ->
case os:type() of
{win32, _} -> add_windows_nameservers();
_ -> ok
end.
add_windows_nameservers() ->
IPTs = win32_dns:get_nameservers(),
?INFO_MSG("Adding machine's DNS IPs to Erlang system:~n~p", [IPTs]),
lists:foreach(fun(IPT) -> inet_db:add_ns(IPT) end, IPTs).
broadcast_c2s_shutdown() ->
Children = supervisor:which_children(ejabberd_c2s_sup),
lists:foreach(
fun({_, C2SPid, _, _}) ->
C2SPid ! system_shutdown
end, Children).
%%%
%%% PID file
%%%
write_pid_file() ->
case ejabberd:get_pid_file() of
false ->
ok;
PidFilename ->
write_pid_file(os:getpid(), PidFilename)
end.
write_pid_file(Pid, PidFilename) ->
case file:open(PidFilename, [write]) of
{ok, Fd} ->
io:format(Fd, "~s~n", [Pid]),
file:close(Fd);
{error, Reason} ->
?ERROR_MSG("Cannot write PID file ~s~nReason: ~p", [PidFilename, Reason]),
throw({cannot_write_pid_file, PidFilename, Reason})
end.
delete_pid_file() ->
case ejabberd:get_pid_file() of
false ->
ok;
PidFilename ->
file:delete(PidFilename)
end.
ejabberd-2.1.11/src/mod_time.erl 0000664 0000000 0000000 00000006424 12240230175 013314 0 ustar %%%----------------------------------------------------------------------
%%% File : mod_time.erl
%%% Author : Alexey Shchepin
%%% Purpose :
%%% Created : 18 Jan 2003 by Alexey Shchepin
%%%
%%%
%%% ejabberd, Copyright (C) 2002-2012 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
%%% published by the Free Software Foundation; either version 2 of the
%%% License, or (at your option) any later version.
%%%
%%% This program is distributed in the hope that it will be useful,
%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
%%% General Public License for more details.
%%%
%%% You should have received a copy of the GNU General Public License
%%% along with this program; if not, write to the Free Software
%%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
%%% 02111-1307 USA
%%%
%%%----------------------------------------------------------------------
-module(mod_time).
-author('alexey@process-one.net').
-behaviour(gen_mod).
-export([start/2,
stop/1,
process_local_iq90/3, % TODO: Remove once XEP-0090 is Obsolete
process_local_iq/3]).
-include("ejabberd.hrl").
-include("jlib.hrl").
start(Host, Opts) ->
IQDisc = gen_mod:get_opt(iqdisc, Opts, one_queue),
%% TODO: Remove the next two lines once XEP-0090 is Obsolete
gen_iq_handler:add_iq_handler(ejabberd_local, Host, ?NS_TIME90,
?MODULE, process_local_iq90, IQDisc),
gen_iq_handler:add_iq_handler(ejabberd_local, Host, ?NS_TIME,
?MODULE, process_local_iq, IQDisc).
stop(Host) ->
%% TODO: Remove the next line once XEP-0090 is Obsolete
gen_iq_handler:remove_iq_handler(ejabberd_local, Host, ?NS_TIME90),
gen_iq_handler:remove_iq_handler(ejabberd_local, Host, ?NS_TIME).
%% TODO: Remove this function once XEP-0090 is Obsolete
process_local_iq90(_From, _To, #iq{type = Type, sub_el = SubEl} = IQ) ->
case Type of
set ->
IQ#iq{type = error, sub_el = [SubEl, ?ERR_NOT_ALLOWED]};
get ->
UTC = jlib:timestamp_to_iso(calendar:universal_time()),
IQ#iq{type = result,
sub_el = [{xmlelement, "query",
[{"xmlns", ?NS_TIME90}],
[{xmlelement, "utc", [],
[{xmlcdata, UTC}]}]}]}
end.
process_local_iq(_From, _To, #iq{type = Type, sub_el = SubEl} = IQ) ->
case Type of
set ->
IQ#iq{type = error, sub_el = [SubEl, ?ERR_NOT_ALLOWED]};
get ->
Now = now(),
Now_universal = calendar:now_to_universal_time(Now),
Now_local = calendar:now_to_local_time(Now),
{UTC, UTC_diff} = jlib:timestamp_to_iso(Now_universal, utc),
Seconds_diff = calendar:datetime_to_gregorian_seconds(Now_local)
- calendar:datetime_to_gregorian_seconds(Now_universal),
{Hd, Md, _} = calendar:seconds_to_time(abs(Seconds_diff)),
{_, TZO_diff} = jlib:timestamp_to_iso({{0, 0, 0}, {0, 0, 0}}, {sign(Seconds_diff), {Hd, Md}}),
IQ#iq{type = result,
sub_el = [{xmlelement, "time",
[{"xmlns", ?NS_TIME}],
[{xmlelement, "tzo", [],
[{xmlcdata, TZO_diff}]},
{xmlelement, "utc", [],
[{xmlcdata, UTC ++ UTC_diff}]}]}]}
end.
sign(N) when N < 0 -> "-";
sign(_) -> "+".
ejabberd-2.1.11/src/mod_roster.hrl 0000664 0000000 0000000 00000002144 12240230175 013672 0 ustar %%%----------------------------------------------------------------------
%%%
%%% ejabberd, Copyright (C) 2002-2012 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
%%% published by the Free Software Foundation; either version 2 of the
%%% License, or (at your option) any later version.
%%%
%%% This program is distributed in the hope that it will be useful,
%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
%%% General Public License for more details.
%%%
%%% You should have received a copy of the GNU General Public License
%%% along with this program; if not, write to the Free Software
%%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
%%% 02111-1307 USA
%%%
%%%----------------------------------------------------------------------
-record(roster, {usj,
us,
jid,
name = "",
subscription = none,
ask = none,
groups = [],
askmessage = [],
xs = []}).
-record(roster_version, {us,
version}).
ejabberd-2.1.11/src/ejabberd_ctl.hrl 0000664 0000000 0000000 00000002034 12240230175 014113 0 ustar %%%----------------------------------------------------------------------
%%%
%%% ejabberd, Copyright (C) 2002-2012 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
%%% published by the Free Software Foundation; either version 2 of the
%%% License, or (at your option) any later version.
%%%
%%% This program is distributed in the hope that it will be useful,
%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
%%% General Public License for more details.
%%%
%%% You should have received a copy of the GNU General Public License
%%% along with this program; if not, write to the Free Software
%%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
%%% 02111-1307 USA
%%%
%%%----------------------------------------------------------------------
-define(STATUS_SUCCESS, 0).
-define(STATUS_ERROR, 1).
-define(STATUS_USAGE, 2).
-define(STATUS_BADRPC, 3).
ejabberd-2.1.11/src/ejabberd.cfg.example 0000664 0000000 0000000 00000034747 12240230175 014675 0 ustar %%%
%%% ejabberd configuration file
%%%
%%%'
%%% The parameters used in this configuration file are explained in more detail
%%% in the ejabberd Installation and Operation Guide.
%%% Please consult the Guide in case of doubts, it is included with
%%% your copy of ejabberd, and is also available online at
%%% http://www.process-one.net/en/ejabberd/docs/
%%% This configuration file contains Erlang terms.
%%% In case you want to understand the syntax, here are the concepts:
%%%
%%% - The character to comment a line is %
%%%
%%% - Each term ends in a dot, for example:
%%% override_global.
%%%
%%% - A tuple has a fixed definition, its elements are
%%% enclosed in {}, and separated with commas:
%%% {loglevel, 4}.
%%%
%%% - A list can have as many elements as you want,
%%% and is enclosed in [], for example:
%%% [http_poll, web_admin, tls]
%%%
%%% - A keyword of ejabberd is a word in lowercase.
%%% Strings are enclosed in "" and can contain spaces, dots, ...
%%% {language, "en"}.
%%% {ldap_rootdn, "dc=example,dc=com"}.
%%%
%%% - This term includes a tuple, a keyword, a list, and two strings:
%%% {hosts, ["jabber.example.net", "im.example.com"]}.
%%%
%%%. =======================
%%%' OVERRIDE STORED OPTIONS
%%
%% Override the old values stored in the database.
%%
%%
%% Override global options (shared by all ejabberd nodes in a cluster).
%%
%%override_global.
%%
%% Override local options (specific for this particular ejabberd node).
%%
%%override_local.
%%
%% Remove the Access Control Lists before new ones are added.
%%
%%override_acls.
%%%. =========
%%%' DEBUGGING
%%
%% loglevel: Verbosity of log files generated by ejabberd.
%% 0: No ejabberd log at all (not recommended)
%% 1: Critical
%% 2: Error
%% 3: Warning
%% 4: Info
%% 5: Debug
%%
{loglevel, 4}.
%%
%% watchdog_admins: Only useful for developers: if an ejabberd process
%% consumes a lot of memory, send live notifications to these XMPP
%% accounts.
%%
%%{watchdog_admins, ["bob@example.com"]}.
%%%. ================
%%%' SERVED HOSTNAMES
%%
%% hosts: Domains served by ejabberd.
%% You can define one or several, for example:
%% {hosts, ["example.net", "example.com", "example.org"]}.
%%
{hosts, ["localhost"]}.
%%
%% route_subdomains: Delegate subdomains to other XMPP servers.
%% For example, if this ejabberd serves example.org and you want
%% to allow communication with an XMPP server called im.example.org.
%%
%%{route_subdomains, s2s}.
%%%. ===============
%%%' LISTENING PORTS
%%
%% listen: The ports ejabberd will listen on, which service each is handled
%% by and what options to start it with.
%%
{listen,
[
{5222, ejabberd_c2s, [
%%
%% If TLS is compiled in and you installed a SSL
%% certificate, specify the full path to the
%% file and uncomment this line:
%%
%%{certfile, "/path/to/ssl.pem"}, starttls,
{access, c2s},
{shaper, c2s_shaper},
{max_stanza_size, 65536}
]},
%%
%% To enable the old SSL connection method on port 5223:
%%
%%{5223, ejabberd_c2s, [
%% {access, c2s},
%% {shaper, c2s_shaper},
%% {certfile, "/path/to/ssl.pem"}, tls,
%% {max_stanza_size, 65536}
%% ]},
{5269, ejabberd_s2s_in, [
{shaper, s2s_shaper},
{max_stanza_size, 131072}
]},
%%
%% ejabberd_service: Interact with external components (transports, ...)
%%
%%{8888, ejabberd_service, [
%% {access, all},
%% {shaper_rule, fast},
%% {ip, {127, 0, 0, 1}},
%% {hosts, ["icq.example.org", "sms.example.org"],
%% [{password, "secret"}]
%% }
%% ]},
%%
%% ejabberd_stun: Handles STUN Binding requests
%%
%%{{3478, udp}, ejabberd_stun, []},
{5280, ejabberd_http, [
%%{request_handlers,
%% [
%% {["pub", "archive"], mod_http_fileserver}
%% ]},
captcha,
http_bind,
http_poll,
%%register,
web_admin
]}
]}.
%%
%% s2s_use_starttls: Enable STARTTLS + Dialback for S2S connections.
%% Allowed values are: false optional required required_trusted
%% You must specify a certificate file.
%%
%%{s2s_use_starttls, optional}.
%%
%% s2s_certfile: Specify a certificate file.
%%
%%{s2s_certfile, "/path/to/ssl.pem"}.
%%
%% domain_certfile: Specify a different certificate for each served hostname.
%%
%%{domain_certfile, "example.org", "/path/to/example_org.pem"}.
%%{domain_certfile, "example.com", "/path/to/example_com.pem"}.
%%
%% S2S whitelist or blacklist
%%
%% Default s2s policy for undefined hosts.
%%
%%{s2s_default_policy, allow}.
%%
%% Allow or deny communication with specific servers.
%%
%%{{s2s_host, "goodhost.org"}, allow}.
%%{{s2s_host, "badhost.org"}, deny}.
%%
%% Outgoing S2S options
%%
%% Preferred address families (which to try first) and connect timeout
%% in milliseconds.
%%
%%{outgoing_s2s_options, [ipv4, ipv6], 10000}.
%%%. ==============
%%%' AUTHENTICATION
%%
%% auth_method: Method used to authenticate the users.
%% The default method is the internal.
%% If you want to use a different method,
%% comment this line and enable the correct ones.
%%
{auth_method, internal}.
%%
%% Store the plain passwords or hashed for SCRAM:
%%{auth_password_format, plain}.
%%{auth_password_format, scram}.
%%
%% Define the FQDN if ejabberd doesn't detect it:
%%{fqdn, "server3.example.com"}.
%%
%% Authentication using external script
%% Make sure the script is executable by ejabberd.
%%
%%{auth_method, external}.
%%{extauth_program, "/path/to/authentication/script"}.
%%
%% Authentication using ODBC
%% Remember to setup a database in the next section.
%%
%%{auth_method, odbc}.
%%
%% Authentication using PAM
%%
%%{auth_method, pam}.
%%{pam_service, "pamservicename"}.
%%
%% Authentication using LDAP
%%
%%{auth_method, ldap}.
%%
%% List of LDAP servers:
%%{ldap_servers, ["localhost"]}.
%%
%% Encryption of connection to LDAP servers:
%%{ldap_encrypt, none}.
%%{ldap_encrypt, tls}.
%%
%% Port to connect to on LDAP servers:
%%{ldap_port, 389}.
%%{ldap_port, 636}.
%%
%% LDAP manager:
%%{ldap_rootdn, "dc=example,dc=com"}.
%%
%% Password of LDAP manager:
%%{ldap_password, "******"}.
%%
%% Search base of LDAP directory:
%%{ldap_base, "dc=example,dc=com"}.
%%
%% LDAP attribute that holds user ID:
%%{ldap_uids, [{"mail", "%u@mail.example.org"}]}.
%%
%% LDAP filter:
%%{ldap_filter, "(objectClass=shadowAccount)"}.
%%
%% Anonymous login support:
%% auth_method: anonymous
%% anonymous_protocol: sasl_anon | login_anon | both
%% allow_multiple_connections: true | false
%%
%%{host_config, "public.example.org", [{auth_method, anonymous},
%% {allow_multiple_connections, false},
%% {anonymous_protocol, sasl_anon}]}.
%%
%% To use both anonymous and internal authentication:
%%
%%{host_config, "public.example.org", [{auth_method, [internal, anonymous]}]}.
%%%. ==============
%%%' DATABASE SETUP
%% ejabberd by default uses the internal Mnesia database,
%% so you do not necessarily need this section.
%% This section provides configuration examples in case
%% you want to use other database backends.
%% Please consult the ejabberd Guide for details on database creation.
%%
%% MySQL server:
%%
%%{odbc_server, {mysql, "server", "database", "username", "password"}}.
%%
%% If you want to specify the port:
%%{odbc_server, {mysql, "server", 1234, "database", "username", "password"}}.
%%
%% PostgreSQL server:
%%
%%{odbc_server, {pgsql, "server", "database", "username", "password"}}.
%%
%% If you want to specify the port:
%%{odbc_server, {pgsql, "server", 1234, "database", "username", "password"}}.
%%
%% If you use PostgreSQL, have a large database, and need a
%% faster but inexact replacement for "select count(*) from users"
%%
%%{pgsql_users_number_estimate, true}.
%%
%% ODBC compatible or MSSQL server:
%%
%%{odbc_server, "DSN=ejabberd;UID=ejabberd;PWD=ejabberd"}.
%%
%% Number of connections to open to the database for each virtual host
%%
%%{odbc_pool_size, 10}.
%%
%% Interval to make a dummy SQL request to keep the connections to the
%% database alive. Specify in seconds: for example 28800 means 8 hours
%%
%%{odbc_keepalive_interval, undefined}.
%%%. ===============
%%%' TRAFFIC SHAPERS
%%
%% The "normal" shaper limits traffic speed to 1000 B/s
%%
{shaper, normal, {maxrate, 1000}}.
%%
%% The "fast" shaper limits traffic speed to 50000 B/s
%%
{shaper, fast, {maxrate, 50000}}.
%%
%% This option specifies the maximum number of elements in the queue
%% of the FSM. Refer to the documentation for details.
%%
{max_fsm_queue, 1000}.
%%%. ====================
%%%' ACCESS CONTROL LISTS
%%
%% The 'admin' ACL grants administrative privileges to XMPP accounts.
%% You can put here as many accounts as you want.
%%
%%{acl, admin, {user, "aleksey", "localhost"}}.
%%{acl, admin, {user, "ermine", "example.org"}}.
%%
%% Blocked users
%%
%%{acl, blocked, {user, "baduser", "example.org"}}.
%%{acl, blocked, {user, "test"}}.
%%
%% Local users: don't modify this line.
%%
{acl, local, {user_regexp, ""}}.
%%
%% More examples of ACLs
%%
%%{acl, jabberorg, {server, "jabber.org"}}.
%%{acl, aleksey, {user, "aleksey", "jabber.ru"}}.
%%{acl, test, {user_regexp, "^test"}}.
%%{acl, test, {user_glob, "test*"}}.
%%
%% Define specific ACLs in a virtual host.
%%
%%{host_config, "localhost",
%% [
%% {acl, admin, {user, "bob-local", "localhost"}}
%% ]
%%}.
%%%. ============
%%%' ACCESS RULES
%% Maximum number of simultaneous sessions allowed for a single user:
{access, max_user_sessions, [{10, all}]}.
%% Maximum number of offline messages that users can have:
{access, max_user_offline_messages, [{5000, admin}, {100, all}]}.
%% This rule allows access only for local users:
{access, local, [{allow, local}]}.
%% Only non-blocked users can use c2s connections:
{access, c2s, [{deny, blocked},
{allow, all}]}.
%% For C2S connections, all users except admins use the "normal" shaper
{access, c2s_shaper, [{none, admin},
{normal, all}]}.
%% All S2S connections use the "fast" shaper
{access, s2s_shaper, [{fast, all}]}.
%% Only admins can send announcement messages:
{access, announce, [{allow, admin}]}.
%% Only admins can use the configuration interface:
{access, configure, [{allow, admin}]}.
%% Admins of this server are also admins of the MUC service:
{access, muc_admin, [{allow, admin}]}.
%% Only accounts of the local ejabberd server can create rooms:
{access, muc_create, [{allow, local}]}.
%% All users are allowed to use the MUC service:
{access, muc, [{allow, all}]}.
%% Only accounts on the local ejabberd server can create Pubsub nodes:
{access, pubsub_createnode, [{allow, local}]}.
%% In-band registration allows registration of any possible username.
%% To disable in-band registration, replace 'allow' with 'deny'.
{access, register, [{allow, all}]}.
%% By default the frequency of account registrations from the same IP
%% is limited to 1 account every 10 minutes. To disable, specify: infinity
%%{registration_timeout, 600}.
%%
%% Define specific Access Rules in a virtual host.
%%
%%{host_config, "localhost",
%% [
%% {access, c2s, [{allow, admin}, {deny, all}]},
%% {access, register, [{deny, all}]}
%% ]
%%}.
%%%. ================
%%%' DEFAULT LANGUAGE
%%
%% language: Default language used for server messages.
%%
{language, "en"}.
%%
%% Set a different default language in a virtual host.
%%
%%{host_config, "localhost",
%% [{language, "ru"}]
%%}.
%%%. =======
%%%' CAPTCHA
%%
%% Full path to a script that generates the image.
%%
%%{captcha_cmd, "/lib/ejabberd/priv/bin/captcha.sh"}.
%%
%% Host for the URL and port where ejabberd listens for CAPTCHA requests.
%%
%%{captcha_host, "example.org:5280"}.
%%
%% Limit CAPTCHA calls per minute for JID/IP to avoid DoS.
%%
%%{captcha_limit, 5}.
%%%. =======
%%%' MODULES
%%
%% Modules enabled in all ejabberd virtual hosts.
%%
{modules,
[
{mod_adhoc, []},
{mod_announce, [{access, announce}]}, % recommends mod_adhoc
{mod_blocking,[]}, % requires mod_privacy
{mod_caps, []},
{mod_configure,[]}, % requires mod_adhoc
{mod_disco, []},
%%{mod_echo, [{host, "echo.localhost"}]},
{mod_irc, []},
{mod_http_bind, []},
%%{mod_http_fileserver, [
%% {docroot, "/var/www"},
%% {accesslog, "/var/log/ejabberd/access.log"}
%% ]},
{mod_last, []},
{mod_muc, [
%%{host, "conference.@HOST@"},
{access, muc},
{access_create, muc_create},
{access_persistent, muc_create},
{access_admin, muc_admin}
]},
%%{mod_muc_log,[]},
{mod_offline, [{access_max_user_messages, max_user_offline_messages}]},
{mod_ping, []},
%%{mod_pres_counter,[{count, 5}, {interval, 60}]},
{mod_privacy, []},
{mod_private, []},
%%{mod_proxy65,[]},
{mod_pubsub, [
{access_createnode, pubsub_createnode},
{ignore_pep_from_offline, true}, % reduces resource comsumption, but XEP incompliant
%%{ignore_pep_from_offline, false}, % XEP compliant, but increases resource comsumption
{last_item_cache, false},
{plugins, ["flat", "hometree", "pep"]} % pep requires mod_caps
]},
{mod_register, [
%%
%% Protect In-Band account registrations with CAPTCHA.
%%
%%{captcha_protected, true},
%%
%% Set the minimum informational entropy for passwords.
%%
%%{password_strength, 32},
%%
%% After successful registration, the user receives
%% a message with this subject and body.
%%
{welcome_message, {"Welcome!",
"Hi.\nWelcome to this XMPP server."}},
%%
%% When a user registers, send a notification to
%% these XMPP accounts.
%%
%%{registration_watchers, ["admin1@example.org"]},
%%
%% Only clients in the server machine can register accounts
%%
{ip_access, [{allow, "127.0.0.0/8"},
{deny, "0.0.0.0/0"}]},
%%
%% Local c2s or remote s2s users cannot register accounts
%%
%%{access_from, deny},
{access, register}
]},
%%{mod_register_web, [
%%
%% When a user registers, send a notification to
%% these XMPP accounts.
%%
%%{registration_watchers, ["admin1@example.org"]}
%% ]},
{mod_roster, []},
%%{mod_service_log,[]},
{mod_shared_roster,[]},
{mod_stats, []},
{mod_time, []},
{mod_vcard, []},
{mod_version, []}
]}.
%%
%% Enable modules with custom options in a specific virtual host
%%
%%{host_config, "localhost",
%% [{{add, modules},
%% [
%% {mod_echo, [{host, "mirror.localhost"}]}
%% ]
%% }
%% ]}.
%%%.
%%%'
%%% $Id$
%%% Local Variables:
%%% mode: erlang
%%% End:
%%% vim: set filetype=erlang tabstop=8 foldmarker=%%%',%%%. foldmethod=marker:
ejabberd-2.1.11/src/cache_tab_sup.erl 0000664 0000000 0000000 00000003577 12240230175 014305 0 ustar %%%-------------------------------------------------------------------
%%% File : cache_tab_sup.erl
%%% Author : Evgeniy Khramtsov
%%% Description : Cache tables supervisor
%%%
%%% Created : 30 Aug 2010 by Evgeniy Khramtsov
%%%
%%%
%%% ejabberd, Copyright (C) 2002-2012 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
%%% published by the Free Software Foundation; either version 2 of the
%%% License, or (at your option) any later version.
%%%
%%% This program is distributed in the hope that it will be useful,
%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
%%% General Public License for more details.
%%%
%%% You should have received a copy of the GNU General Public License
%%% along with this program; if not, write to the Free Software
%%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
%%% 02111-1307 USA
%%%
%%%-------------------------------------------------------------------
-module(cache_tab_sup).
-behaviour(supervisor).
%% API
-export([start_link/0]).
%% Supervisor callbacks
-export([init/1]).
-define(SERVER, ?MODULE).
%%====================================================================
%% API functions
%%====================================================================
start_link() ->
supervisor:start_link({local, ?SERVER}, ?MODULE, []).
%%====================================================================
%% Supervisor callbacks
%%====================================================================
init([]) ->
{ok, {{one_for_one,10,1}, []}}.
%%====================================================================
%% Internal functions
%%====================================================================
ejabberd-2.1.11/src/ejabberd_frontend_socket.erl 0000664 0000000 0000000 00000026052 12240230175 016523 0 ustar %%%-------------------------------------------------------------------
%%% File : ejabberd_frontend_socket.erl
%%% Author : Alexey Shchepin
%%% Purpose : Frontend socket with zlib and TLS support library
%%% Created : 23 Aug 2006 by Alexey Shchepin
%%%
%%%
%%% ejabberd, Copyright (C) 2002-2012 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
%%% published by the Free Software Foundation; either version 2 of the
%%% License, or (at your option) any later version.
%%%
%%% This program is distributed in the hope that it will be useful,
%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
%%% General Public License for more details.
%%%
%%% You should have received a copy of the GNU General Public License
%%% along with this program; if not, write to the Free Software
%%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
%%% 02111-1307 USA
%%%
%%%----------------------------------------------------------------------
-module(ejabberd_frontend_socket).
-author('alexey@process-one.net').
-behaviour(gen_server).
%% API
-export([start/4,
start_link/5,
%connect/3,
starttls/2,
starttls/3,
compress/1,
compress/2,
reset_stream/1,
send/2,
change_shaper/2,
monitor/1,
get_sockmod/1,
get_peer_certificate/1,
get_verify_result/1,
close/1,
sockname/1, peername/1]).
%% gen_server callbacks
-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
terminate/2, code_change/3]).
-record(state, {sockmod, socket, receiver}).
-define(HIBERNATE_TIMEOUT, 90000).
%%====================================================================
%% API
%%====================================================================
%%--------------------------------------------------------------------
%% Function: start_link() -> {ok,Pid} | ignore | {error,Error}
%% Description: Starts the server
%%--------------------------------------------------------------------
start_link(Module, SockMod, Socket, Opts, Receiver) ->
gen_server:start_link(?MODULE,
[Module, SockMod, Socket, Opts, Receiver], []).
start(Module, SockMod, Socket, Opts) ->
case Module:socket_type() of
xml_stream ->
MaxStanzaSize =
case lists:keysearch(max_stanza_size, 1, Opts) of
{value, {_, Size}} -> Size;
_ -> infinity
end,
Receiver = ejabberd_receiver:start(Socket, SockMod, none, MaxStanzaSize),
case SockMod:controlling_process(Socket, Receiver) of
ok ->
ok;
{error, _Reason} ->
SockMod:close(Socket)
end,
supervisor:start_child(ejabberd_frontend_socket_sup,
[Module, SockMod, Socket, Opts, Receiver]);
raw ->
%{ok, Pid} = Module:start({SockMod, Socket}, Opts),
%case SockMod:controlling_process(Socket, Pid) of
% ok ->
% ok;
% {error, _Reason} ->
% SockMod:close(Socket)
%end
todo
end.
starttls(FsmRef, _TLSOpts) ->
%% TODO: Frontend improvements planned by Aleksey
%%gen_server:call(FsmRef, {starttls, TLSOpts}),
FsmRef.
starttls(FsmRef, TLSOpts, Data) ->
gen_server:call(FsmRef, {starttls, TLSOpts, Data}),
FsmRef.
compress(FsmRef) ->
gen_server:call(FsmRef, compress),
FsmRef.
compress(FsmRef, Data) ->
gen_server:call(FsmRef, {compress, Data}),
FsmRef.
reset_stream(FsmRef) ->
gen_server:call(FsmRef, reset_stream).
send(FsmRef, Data) ->
gen_server:call(FsmRef, {send, Data}).
change_shaper(FsmRef, Shaper) ->
gen_server:call(FsmRef, {change_shaper, Shaper}).
monitor(FsmRef) ->
erlang:monitor(process, FsmRef).
get_sockmod(FsmRef) ->
gen_server:call(FsmRef, get_sockmod).
get_peer_certificate(FsmRef) ->
gen_server:call(FsmRef, get_peer_certificate).
get_verify_result(FsmRef) ->
gen_server:call(FsmRef, get_verify_result).
close(FsmRef) ->
gen_server:call(FsmRef, close).
sockname(FsmRef) ->
gen_server:call(FsmRef, sockname).
peername(_FsmRef) ->
%% TODO: Frontend improvements planned by Aleksey
%%gen_server:call(FsmRef, peername).
{ok, {{0, 0, 0, 0}, 0}}.
%%====================================================================
%% gen_server callbacks
%%====================================================================
%%--------------------------------------------------------------------
%% Function: init(Args) -> {ok, State} |
%% {ok, State, Timeout} |
%% ignore |
%% {stop, Reason}
%% Description: Initiates the server
%%--------------------------------------------------------------------
init([Module, SockMod, Socket, Opts, Receiver]) ->
%% TODO: monitor the receiver
Node = ejabberd_node_groups:get_closest_node(backend),
{SockMod2, Socket2} = check_starttls(SockMod, Socket, Receiver, Opts),
{ok, Pid} =
rpc:call(Node, Module, start, [{?MODULE, self()}, Opts]),
ejabberd_receiver:become_controller(Receiver, Pid),
{ok, #state{sockmod = SockMod2,
socket = Socket2,
receiver = Receiver}}.
%%--------------------------------------------------------------------
%% Function: %% handle_call(Request, From, State) -> {reply, Reply, State} |
%% {reply, Reply, State, Timeout} |
%% {noreply, State} |
%% {noreply, State, Timeout} |
%% {stop, Reason, Reply, State} |
%% {stop, Reason, State}
%% Description: Handling call messages
%%--------------------------------------------------------------------
handle_call({starttls, TLSOpts}, _From, State) ->
{ok, TLSSocket} = tls:tcp_to_tls(State#state.socket, TLSOpts),
ejabberd_receiver:starttls(State#state.receiver, TLSSocket),
Reply = ok,
{reply, Reply, State#state{socket = TLSSocket, sockmod = tls},
?HIBERNATE_TIMEOUT};
handle_call({starttls, TLSOpts, Data}, _From, State) ->
{ok, TLSSocket} = tls:tcp_to_tls(State#state.socket, TLSOpts),
ejabberd_receiver:starttls(State#state.receiver, TLSSocket),
catch (State#state.sockmod):send(
State#state.socket, Data),
Reply = ok,
{reply, Reply, State#state{socket = TLSSocket, sockmod = tls},
?HIBERNATE_TIMEOUT};
handle_call(compress, _From, State) ->
{ok, ZlibSocket} = ejabberd_zlib:enable_zlib(
State#state.sockmod,
State#state.socket),
ejabberd_receiver:compress(State#state.receiver, ZlibSocket),
Reply = ok,
{reply, Reply, State#state{socket = ZlibSocket, sockmod = ejabberd_zlib},
?HIBERNATE_TIMEOUT};
handle_call({compress, Data}, _From, State) ->
{ok, ZlibSocket} = ejabberd_zlib:enable_zlib(
State#state.sockmod,
State#state.socket),
ejabberd_receiver:compress(State#state.receiver, ZlibSocket),
catch (State#state.sockmod):send(
State#state.socket, Data),
Reply = ok,
{reply, Reply, State#state{socket = ZlibSocket, sockmod = ejabberd_zlib},
?HIBERNATE_TIMEOUT};
handle_call(reset_stream, _From, State) ->
ejabberd_receiver:reset_stream(State#state.receiver),
Reply = ok,
{reply, Reply, State, ?HIBERNATE_TIMEOUT};
handle_call({send, Data}, _From, State) ->
catch (State#state.sockmod):send(
State#state.socket, Data),
Reply = ok,
{reply, Reply, State, ?HIBERNATE_TIMEOUT};
handle_call({change_shaper, Shaper}, _From, State) ->
ejabberd_receiver:change_shaper(State#state.receiver, Shaper),
Reply = ok,
{reply, Reply, State, ?HIBERNATE_TIMEOUT};
handle_call(get_sockmod, _From, State) ->
Reply = State#state.sockmod,
{reply, Reply, State, ?HIBERNATE_TIMEOUT};
handle_call(get_peer_certificate, _From, State) ->
Reply = tls:get_peer_certificate(State#state.socket),
{reply, Reply, State, ?HIBERNATE_TIMEOUT};
handle_call(get_verify_result, _From, State) ->
Reply = tls:get_verify_result(State#state.socket),
{reply, Reply, State, ?HIBERNATE_TIMEOUT};
handle_call(close, _From, State) ->
ejabberd_receiver:close(State#state.receiver),
Reply = ok,
{stop, normal, Reply, State};
handle_call(sockname, _From, State) ->
#state{sockmod = SockMod, socket = Socket} = State,
Reply =
case SockMod of
gen_tcp ->
inet:sockname(Socket);
_ ->
SockMod:sockname(Socket)
end,
{reply, Reply, State, ?HIBERNATE_TIMEOUT};
handle_call(peername, _From, State) ->
#state{sockmod = SockMod, socket = Socket} = State,
Reply =
case SockMod of
gen_tcp ->
inet:peername(Socket);
_ ->
SockMod:peername(Socket)
end,
{reply, Reply, State, ?HIBERNATE_TIMEOUT};
handle_call(_Request, _From, State) ->
Reply = ok,
{reply, Reply, State, ?HIBERNATE_TIMEOUT}.
%%--------------------------------------------------------------------
%% Function: handle_cast(Msg, State) -> {noreply, State} |
%% {noreply, State, Timeout} |
%% {stop, Reason, State}
%% Description: Handling cast messages
%%--------------------------------------------------------------------
handle_cast(_Msg, State) ->
{noreply, State, ?HIBERNATE_TIMEOUT}.
%%--------------------------------------------------------------------
%% Function: handle_info(Info, State) -> {noreply, State} |
%% {noreply, State, Timeout} |
%% {stop, Reason, State}
%% Description: Handling all non call/cast messages
%%--------------------------------------------------------------------
handle_info(timeout, State) ->
proc_lib:hibernate(gen_server, enter_loop, [?MODULE, [], State]),
{noreply, State, ?HIBERNATE_TIMEOUT};
handle_info(_Info, State) ->
{noreply, State, ?HIBERNATE_TIMEOUT}.
%%--------------------------------------------------------------------
%% Function: terminate(Reason, State) -> void()
%% Description: This function is called by a gen_server when it is about to
%% terminate. It should be the opposite of Module:init/1 and do any necessary
%% cleaning up. When it returns, the gen_server terminates with Reason.
%% The return value is ignored.
%%--------------------------------------------------------------------
terminate(_Reason, _State) ->
ok.
%%--------------------------------------------------------------------
%% Func: code_change(OldVsn, State, Extra) -> {ok, NewState}
%% Description: Convert process state when code is changed
%%--------------------------------------------------------------------
code_change(_OldVsn, State, _Extra) ->
{ok, State}.
%%--------------------------------------------------------------------
%%% Internal functions
%%--------------------------------------------------------------------
check_starttls(SockMod, Socket, Receiver, Opts) ->
TLSEnabled = lists:member(tls, Opts),
TLSOpts = lists:filter(fun({certfile, _}) -> true;
(_) -> false
end, Opts),
if
TLSEnabled ->
{ok, TLSSocket} = tls:tcp_to_tls(Socket, TLSOpts),
ejabberd_receiver:starttls(Receiver, TLSSocket),
{tls, TLSSocket};
true ->
{SockMod, Socket}
end.
ejabberd-2.1.11/src/cyrsasl_scram.erl 0000664 0000000 0000000 00000014237 12240230175 014365 0 ustar %%%----------------------------------------------------------------------
%%% File : cyrsasl_scram.erl
%%% Author : Stephen Röttger
%%% Purpose : SASL SCRAM authentication
%%% Created : 7 Aug 2011 by Stephen Röttger
%%%
%%%
%%% ejabberd, Copyright (C) 2002-2012 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
%%% published by the Free Software Foundation; either version 2 of the
%%% License, or (at your option) any later version.
%%%
%%% This program is distributed in the hope that it will be useful,
%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
%%% General Public License for more details.
%%%
%%% You should have received a copy of the GNU General Public License
%%% along with this program; if not, write to the Free Software
%%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
%%% 02111-1307 USA
%%%
%%%----------------------------------------------------------------------
-module(cyrsasl_scram).
-author('stephen.roettger@googlemail.com').
-export([start/1,
stop/0,
mech_new/4,
mech_step/2]).
-include("ejabberd.hrl").
-behaviour(cyrsasl).
-record(state, {step, stored_key, server_key, username, get_password, check_password,
auth_message, client_nonce, server_nonce}).
-define(SALT_LENGTH, 16).
-define(NONCE_LENGTH, 16).
start(_Opts) ->
cyrsasl:register_mechanism("SCRAM-SHA-1", ?MODULE, scram).
stop() ->
ok.
mech_new(_Host, GetPassword, _CheckPassword, _CheckPasswordDigest) ->
{ok, #state{step = 2, get_password = GetPassword}}.
mech_step(#state{step = 2} = State, ClientIn) ->
case string:tokens(ClientIn, ",") of
[CBind, UserNameAttribute, ClientNonceAttribute] when (CBind == "y") or (CBind == "n") ->
case parse_attribute(UserNameAttribute) of
{error, Reason} ->
{error, Reason};
{_, EscapedUserName} ->
case unescape_username(EscapedUserName) of
error ->
{error, "protocol-error-bad-username"};
UserName ->
case parse_attribute(ClientNonceAttribute) of
{$r, ClientNonce} ->
case (State#state.get_password)(UserName) of
{false, _} ->
{error, "not-authorized", UserName};
{Ret, _AuthModule} ->
{StoredKey, ServerKey, Salt, IterationCount} = if
is_tuple(Ret) ->
Ret;
true ->
TempSalt = crypto:rand_bytes(?SALT_LENGTH),
SaltedPassword = scram:salted_password(Ret, TempSalt, ?SCRAM_DEFAULT_ITERATION_COUNT),
{scram:stored_key(scram:client_key(SaltedPassword)),
scram:server_key(SaltedPassword), TempSalt, ?SCRAM_DEFAULT_ITERATION_COUNT}
end,
ClientFirstMessageBare = string:substr(ClientIn, string:str(ClientIn, "n=")),
ServerNonce = base64:encode_to_string(crypto:rand_bytes(?NONCE_LENGTH)),
ServerFirstMessage = "r=" ++ ClientNonce ++ ServerNonce ++ "," ++
"s=" ++ base64:encode_to_string(Salt) ++ "," ++
"i=" ++ integer_to_list(IterationCount),
{continue,
ServerFirstMessage,
State#state{step = 4, stored_key = StoredKey, server_key = ServerKey,
auth_message = ClientFirstMessageBare ++ "," ++ ServerFirstMessage,
client_nonce = ClientNonce, server_nonce = ServerNonce, username = UserName}}
end;
_Else ->
{error, "not-supported"}
end
end
end;
_Else ->
{error, "bad-protocol"}
end;
mech_step(#state{step = 4} = State, ClientIn) ->
case string:tokens(ClientIn, ",") of
[GS2ChannelBindingAttribute, NonceAttribute, ClientProofAttribute] ->
case parse_attribute(GS2ChannelBindingAttribute) of
{$c, CVal} when (CVal == "biws") or (CVal == "eSws") ->
%% biws is base64 for n,, => channelbinding not supported
%% eSws is base64 for y,, => channelbinding supported by client only
Nonce = State#state.client_nonce ++ State#state.server_nonce,
case parse_attribute(NonceAttribute) of
{$r, CompareNonce} when CompareNonce == Nonce ->
case parse_attribute(ClientProofAttribute) of
{$p, ClientProofB64} ->
ClientProof = base64:decode(ClientProofB64),
AuthMessage = State#state.auth_message ++ "," ++ string:substr(ClientIn, 1, string:str(ClientIn, ",p=")-1),
ClientSignature = scram:client_signature(State#state.stored_key, AuthMessage),
ClientKey = scram:client_key(ClientProof, ClientSignature),
CompareStoredKey = scram:stored_key(ClientKey),
if CompareStoredKey == State#state.stored_key ->
ServerSignature = scram:server_signature(State#state.server_key, AuthMessage),
{ok, [{username, State#state.username}], "v=" ++ base64:encode_to_string(ServerSignature)};
true ->
{error, "bad-auth"}
end;
_Else ->
{error, "bad-protocol"}
end;
{$r, _} ->
{error, "bad-nonce"};
_Else ->
{error, "bad-protocol"}
end;
_Else ->
{error, "bad-protocol"}
end;
_Else ->
{error, "bad-protocol"}
end.
parse_attribute(Attribute) ->
AttributeLen = string:len(Attribute),
if
AttributeLen >= 3 ->
SecondChar = lists:nth(2, Attribute),
case is_alpha(lists:nth(1, Attribute)) of
true ->
if
SecondChar == $= ->
String = string:substr(Attribute, 3),
{lists:nth(1, Attribute), String};
true ->
{error, "bad-format second char not equal sign"}
end;
_Else ->
{error, "bad-format first char not a letter"}
end;
true ->
{error, "bad-format attribute too short"}
end.
unescape_username("") ->
"";
unescape_username(EscapedUsername) ->
Pos = string:str(EscapedUsername, "="),
if
Pos == 0 ->
EscapedUsername;
true ->
Start = string:substr(EscapedUsername, 1, Pos-1),
End = string:substr(EscapedUsername, Pos),
EndLen = string:len(End),
if
EndLen < 3 ->
error;
true ->
case string:substr(End, 1, 3) of
"=2C" ->
Start ++ "," ++ unescape_username(string:substr(End, 4));
"=3D" ->
Start ++ "=" ++ unescape_username(string:substr(End, 4));
_Else ->
error
end
end
end.
is_alpha(Char) when Char >= $a, Char =< $z ->
true;
is_alpha(Char) when Char >= $A, Char =< $Z ->
true;
is_alpha(_) ->
false.
ejabberd-2.1.11/src/configure 0000775 0000000 0000000 00000536567 12240230175 012742 0 ustar #! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.68 for ejabberd 2.1.x.
#
# Report bugs to .
#
#
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software
# Foundation, Inc.
#
#
# This configure script is free software; the Free Software Foundation
# gives unlimited permission to copy, distribute and modify it.
## -------------------- ##
## M4sh Initialization. ##
## -------------------- ##
# Be more Bourne compatible
DUALCASE=1; export DUALCASE # for MKS sh
if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
emulate sh
NULLCMD=:
# Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
# is contrary to our usage. Disable this feature.
alias -g '${1+"$@"}'='"$@"'
setopt NO_GLOB_SUBST
else
case `(set -o) 2>/dev/null` in #(
*posix*) :
set -o posix ;; #(
*) :
;;
esac
fi
as_nl='
'
export as_nl
# Printing a long string crashes Solaris 7 /usr/bin/printf.
as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
# Prefer a ksh shell builtin over an external printf program on Solaris,
# but without wasting forks for bash or zsh.
if test -z "$BASH_VERSION$ZSH_VERSION" \
&& (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
as_echo='print -r --'
as_echo_n='print -rn --'
elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
as_echo='printf %s\n'
as_echo_n='printf %s'
else
if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
as_echo_n='/usr/ucb/echo -n'
else
as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
as_echo_n_body='eval
arg=$1;
case $arg in #(
*"$as_nl"*)
expr "X$arg" : "X\\(.*\\)$as_nl";
arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
esac;
expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
'
export as_echo_n_body
as_echo_n='sh -c $as_echo_n_body as_echo'
fi
export as_echo_body
as_echo='sh -c $as_echo_body as_echo'
fi
# The user is always right.
if test "${PATH_SEPARATOR+set}" != set; then
PATH_SEPARATOR=:
(PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
(PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
PATH_SEPARATOR=';'
}
fi
# IFS
# We need space, tab and new line, in precisely that order. Quoting is
# there to prevent editors from complaining about space-tab.
# (If _AS_PATH_WALK were called with IFS unset, it would disable word
# splitting by setting IFS to empty value.)
IFS=" "" $as_nl"
# Find who we are. Look in the path if we contain no directory separator.
as_myself=
case $0 in #((
*[\\/]* ) as_myself=$0 ;;
*) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
done
IFS=$as_save_IFS
;;
esac
# We did not find ourselves, most probably we were run as `sh COMMAND'
# in which case we are not to be found in the path.
if test "x$as_myself" = x; then
as_myself=$0
fi
if test ! -f "$as_myself"; then
$as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
exit 1
fi
# Unset variables that we do not need and which cause bugs (e.g. in
# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1"
# suppresses any "Segmentation fault" message there. '((' could
# trigger a bug in pdksh 5.2.14.
for as_var in BASH_ENV ENV MAIL MAILPATH
do eval test x\${$as_var+set} = xset \
&& ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
done
PS1='$ '
PS2='> '
PS4='+ '
# NLS nuisances.
LC_ALL=C
export LC_ALL
LANGUAGE=C
export LANGUAGE
# CDPATH.
(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
if test "x$CONFIG_SHELL" = x; then
as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
emulate sh
NULLCMD=:
# Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
# is contrary to our usage. Disable this feature.
alias -g '\${1+\"\$@\"}'='\"\$@\"'
setopt NO_GLOB_SUBST
else
case \`(set -o) 2>/dev/null\` in #(
*posix*) :
set -o posix ;; #(
*) :
;;
esac
fi
"
as_required="as_fn_return () { (exit \$1); }
as_fn_success () { as_fn_return 0; }
as_fn_failure () { as_fn_return 1; }
as_fn_ret_success () { return 0; }
as_fn_ret_failure () { return 1; }
exitcode=0
as_fn_success || { exitcode=1; echo as_fn_success failed.; }
as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
else
exitcode=1; echo positional parameters were not saved.
fi
test x\$exitcode = x0 || exit 1"
as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
test \$(( 1 + 1 )) = 2 || exit 1"
if (eval "$as_required") 2>/dev/null; then :
as_have_required=yes
else
as_have_required=no
fi
if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
as_found=false
for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
as_found=:
case $as_dir in #(
/*)
for as_base in sh bash ksh sh5; do
# Try only shells that exist, to save several forks.
as_shell=$as_dir/$as_base
if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
{ $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
CONFIG_SHELL=$as_shell as_have_required=yes
if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
break 2
fi
fi
done;;
esac
as_found=false
done
$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
{ $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
CONFIG_SHELL=$SHELL as_have_required=yes
fi; }
IFS=$as_save_IFS
if test "x$CONFIG_SHELL" != x; then :
# We cannot yet assume a decent shell, so we have to provide a
# neutralization value for shells without unset; and this also
# works around shells that cannot unset nonexistent variables.
# Preserve -v and -x to the replacement shell.
BASH_ENV=/dev/null
ENV=/dev/null
(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
export CONFIG_SHELL
case $- in # ((((
*v*x* | *x*v* ) as_opts=-vx ;;
*v* ) as_opts=-v ;;
*x* ) as_opts=-x ;;
* ) as_opts= ;;
esac
exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"}
fi
if test x$as_have_required = xno; then :
$as_echo "$0: This script requires a shell more modern than all"
$as_echo "$0: the shells that I found on your system."
if test x${ZSH_VERSION+set} = xset ; then
$as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
$as_echo "$0: be upgraded to zsh 4.3.4 or later."
else
$as_echo "$0: Please tell bug-autoconf@gnu.org and
$0: ejabberd@process-one.net about your system, including
$0: any error possibly output before this message. Then
$0: install a modern shell, or manually run the script
$0: under such a shell if you do have one."
fi
exit 1
fi
fi
fi
SHELL=${CONFIG_SHELL-/bin/sh}
export SHELL
# Unset more variables known to interfere with behavior of common tools.
CLICOLOR_FORCE= GREP_OPTIONS=
unset CLICOLOR_FORCE GREP_OPTIONS
## --------------------- ##
## M4sh Shell Functions. ##
## --------------------- ##
# as_fn_unset VAR
# ---------------
# Portably unset VAR.
as_fn_unset ()
{
{ eval $1=; unset $1;}
}
as_unset=as_fn_unset
# as_fn_set_status STATUS
# -----------------------
# Set $? to STATUS, without forking.
as_fn_set_status ()
{
return $1
} # as_fn_set_status
# as_fn_exit STATUS
# -----------------
# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
as_fn_exit ()
{
set +e
as_fn_set_status $1
exit $1
} # as_fn_exit
# as_fn_mkdir_p
# -------------
# Create "$as_dir" as a directory, including parents if necessary.
as_fn_mkdir_p ()
{
case $as_dir in #(
-*) as_dir=./$as_dir;;
esac
test -d "$as_dir" || eval $as_mkdir_p || {
as_dirs=
while :; do
case $as_dir in #(
*\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
*) as_qdir=$as_dir;;
esac
as_dirs="'$as_qdir' $as_dirs"
as_dir=`$as_dirname -- "$as_dir" ||
$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
X"$as_dir" : 'X\(//\)[^/]' \| \
X"$as_dir" : 'X\(//\)$' \| \
X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
$as_echo X"$as_dir" |
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
s//\1/
q
}
/^X\(\/\/\)[^/].*/{
s//\1/
q
}
/^X\(\/\/\)$/{
s//\1/
q
}
/^X\(\/\).*/{
s//\1/
q
}
s/.*/./; q'`
test -d "$as_dir" && break
done
test -z "$as_dirs" || eval "mkdir $as_dirs"
} || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
} # as_fn_mkdir_p
# as_fn_append VAR VALUE
# ----------------------
# Append the text in VALUE to the end of the definition contained in VAR. Take
# advantage of any shell optimizations that allow amortized linear growth over
# repeated appends, instead of the typical quadratic growth present in naive
# implementations.
if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
eval 'as_fn_append ()
{
eval $1+=\$2
}'
else
as_fn_append ()
{
eval $1=\$$1\$2
}
fi # as_fn_append
# as_fn_arith ARG...
# ------------------
# Perform arithmetic evaluation on the ARGs, and store the result in the
# global $as_val. Take advantage of shells that can avoid forks. The arguments
# must be portable across $(()) and expr.
if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
eval 'as_fn_arith ()
{
as_val=$(( $* ))
}'
else
as_fn_arith ()
{
as_val=`expr "$@" || test $? -eq 1`
}
fi # as_fn_arith
# as_fn_error STATUS ERROR [LINENO LOG_FD]
# ----------------------------------------
# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
# script with STATUS, using 1 if that was 0.
as_fn_error ()
{
as_status=$1; test $as_status -eq 0 && as_status=1
if test "$4"; then
as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
$as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
fi
$as_echo "$as_me: error: $2" >&2
as_fn_exit $as_status
} # as_fn_error
if expr a : '\(a\)' >/dev/null 2>&1 &&
test "X`expr 00001 : '.*\(...\)'`" = X001; then
as_expr=expr
else
as_expr=false
fi
if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
as_basename=basename
else
as_basename=false
fi
if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
as_dirname=dirname
else
as_dirname=false
fi
as_me=`$as_basename -- "$0" ||
$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
X"$0" : 'X\(//\)$' \| \
X"$0" : 'X\(/\)' \| . 2>/dev/null ||
$as_echo X/"$0" |
sed '/^.*\/\([^/][^/]*\)\/*$/{
s//\1/
q
}
/^X\/\(\/\/\)$/{
s//\1/
q
}
/^X\/\(\/\).*/{
s//\1/
q
}
s/.*/./; q'`
# Avoid depending upon Character Ranges.
as_cr_letters='abcdefghijklmnopqrstuvwxyz'
as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
as_cr_Letters=$as_cr_letters$as_cr_LETTERS
as_cr_digits='0123456789'
as_cr_alnum=$as_cr_Letters$as_cr_digits
as_lineno_1=$LINENO as_lineno_1a=$LINENO
as_lineno_2=$LINENO as_lineno_2a=$LINENO
eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
# Blame Lee E. McMahon (1931-1989) for sed's syntax. :-)
sed -n '
p
/[$]LINENO/=
' <$as_myself |
sed '
s/[$]LINENO.*/&-/
t lineno
b
:lineno
N
:loop
s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
t loop
s/-\n.*//
' >$as_me.lineno &&
chmod +x "$as_me.lineno" ||
{ $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
# Don't try to exec as it changes $[0], causing all sort of problems
# (the dirname of $[0] is not the place where we might find the
# original and so on. Autoconf is especially sensitive to this).
. "./$as_me.lineno"
# Exit status is that of the last command.
exit
}
ECHO_C= ECHO_N= ECHO_T=
case `echo -n x` in #(((((
-n*)
case `echo 'xy\c'` in
*c*) ECHO_T=' ';; # ECHO_T is single tab character.
xy) ECHO_C='\c';;
*) echo `echo ksh88 bug on AIX 6.1` > /dev/null
ECHO_T=' ';;
esac;;
*)
ECHO_N='-n';;
esac
rm -f conf$$ conf$$.exe conf$$.file
if test -d conf$$.dir; then
rm -f conf$$.dir/conf$$.file
else
rm -f conf$$.dir
mkdir conf$$.dir 2>/dev/null
fi
if (echo >conf$$.file) 2>/dev/null; then
if ln -s conf$$.file conf$$ 2>/dev/null; then
as_ln_s='ln -s'
# ... but there are two gotchas:
# 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
# 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
# In both cases, we have to default to `cp -p'.
ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
as_ln_s='cp -p'
elif ln conf$$.file conf$$ 2>/dev/null; then
as_ln_s=ln
else
as_ln_s='cp -p'
fi
else
as_ln_s='cp -p'
fi
rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
rmdir conf$$.dir 2>/dev/null
if mkdir -p . 2>/dev/null; then
as_mkdir_p='mkdir -p "$as_dir"'
else
test -d ./-p && rmdir ./-p
as_mkdir_p=false
fi
if test -x / >/dev/null 2>&1; then
as_test_x='test -x'
else
if ls -dL / >/dev/null 2>&1; then
as_ls_L_option=L
else
as_ls_L_option=
fi
as_test_x='
eval sh -c '\''
if test -d "$1"; then
test -d "$1/.";
else
case $1 in #(
-*)set "./$1";;
esac;
case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
???[sx]*):;;*)false;;esac;fi
'\'' sh
'
fi
as_executable_p=$as_test_x
# Sed expression to map a string onto a valid CPP name.
as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
# Sed expression to map a string onto a valid variable name.
as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
test -n "$DJDIR" || exec 7<&0 &1
# Name of the host.
# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,
# so uname gets run too.
ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
#
# Initializations.
#
ac_default_prefix=/usr/local
ac_clean_files=
ac_config_libobj_dir=.
LIBOBJS=
cross_compiling=no
subdirs=
MFLAGS=
MAKEFLAGS=
# Identity of this package.
PACKAGE_NAME='ejabberd'
PACKAGE_TARNAME='ejabberd'
PACKAGE_VERSION='2.1.x'
PACKAGE_STRING='ejabberd 2.1.x'
PACKAGE_BUGREPORT='ejabberd@process-one.net'
PACKAGE_URL=''
# Factoring default headers for most tests.
ac_includes_default="\
#include
#ifdef HAVE_SYS_TYPES_H
# include
#endif
#ifdef HAVE_SYS_STAT_H
# include
#endif
#ifdef STDC_HEADERS
# include
# include
#else
# ifdef HAVE_STDLIB_H
# include
# endif
#endif
#ifdef HAVE_STRING_H
# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
# include
# endif
# include
#endif
#ifdef HAVE_STRINGS_H
# include
#endif
#ifdef HAVE_INTTYPES_H
# include
#endif
#ifdef HAVE_STDINT_H
# include
#endif
#ifdef HAVE_UNISTD_H
# include
#endif"
ac_default_prefix=/
ac_subst_vars='LTLIBOBJS
ERLCFLAGS
target_os
target_vendor
target_cpu
target
host_os
host_vendor
host_cpu
host
build_os
build_vendor
build_cpu
build
md2
INSTALLUSER
SSL_CFLAGS
SSL_LIBS
nif
full_xml
transient_supervisors
db_type
roster_gateway_workaround
hipe
PAM_LIBS
PAM_CFLAGS
make_pam
pam
ZLIB_LIBS
ZLIB_CFLAGS
make_ejabberd_zlib
ejabberd_zlib
make_web
web
make_tls
tls
make_odbc
odbc
make_eldap
eldap
make_mod_pubsub
mod_pubsub
make_mod_proxy65
mod_proxy65
make_mod_muc
mod_muc
make_mod_irc
mod_irc
LIBOBJS
EXPAT_LIBS
EXPAT_CFLAGS
EGREP
GREP
CPP
LIBICONV
ERLANG_SSLVER
ERLANG_LIBS
ERLANG_CFLAGS
ERL
ERLC
SET_MAKE
OBJEXT
EXEEXT
ac_ct_CC
CPPFLAGS
LDFLAGS
CFLAGS
CC
target_alias
host_alias
build_alias
LIBS
ECHO_T
ECHO_N
ECHO_C
DEFS
mandir
localedir
libdir
psdir
pdfdir
dvidir
htmldir
infodir
docdir
oldincludedir
includedir
localstatedir
sharedstatedir
sysconfdir
datadir
datarootdir
libexecdir
sbindir
bindir
program_transform_name
prefix
exec_prefix
PACKAGE_URL
PACKAGE_BUGREPORT
PACKAGE_STRING
PACKAGE_VERSION
PACKAGE_TARNAME
PACKAGE_NAME
PATH_SEPARATOR
SHELL'
ac_subst_files=''
ac_user_opts='
enable_option_checking
with_erlang
with_libiconv_prefix
with_expat
enable_mod_irc
enable_mod_muc
enable_mod_proxy65
enable_mod_pubsub
enable_eldap
enable_odbc
enable_tls
enable_web
enable_ejabberd_zlib
with_zlib
enable_pam
with_pam
enable_hipe
enable_roster_gateway_workaround
enable_mssql
enable_transient_supervisors
enable_full_xml
enable_nif
with_openssl
enable_user
'
ac_precious_vars='build_alias
host_alias
target_alias
CC
CFLAGS
LDFLAGS
LIBS
CPPFLAGS
CPP
ERLC
ERLCFLAGS'
# Initialize some variables set by options.
ac_init_help=
ac_init_version=false
ac_unrecognized_opts=
ac_unrecognized_sep=
# The variables have the same names as the options, with
# dashes changed to underlines.
cache_file=/dev/null
exec_prefix=NONE
no_create=
no_recursion=
prefix=NONE
program_prefix=NONE
program_suffix=NONE
program_transform_name=s,x,x,
silent=
site=
srcdir=
verbose=
x_includes=NONE
x_libraries=NONE
# Installation directory options.
# These are left unexpanded so users can "make install exec_prefix=/foo"
# and all the variables that are supposed to be based on exec_prefix
# by default will actually change.
# Use braces instead of parens because sh, perl, etc. also accept them.
# (The list follows the same order as the GNU Coding Standards.)
bindir='${exec_prefix}/bin'
sbindir='${exec_prefix}/sbin'
libexecdir='${exec_prefix}/libexec'
datarootdir='${prefix}/share'
datadir='${datarootdir}'
sysconfdir='${prefix}/etc'
sharedstatedir='${prefix}/com'
localstatedir='${prefix}/var'
includedir='${prefix}/include'
oldincludedir='/usr/include'
docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
infodir='${datarootdir}/info'
htmldir='${docdir}'
dvidir='${docdir}'
pdfdir='${docdir}'
psdir='${docdir}'
libdir='${exec_prefix}/lib'
localedir='${datarootdir}/locale'
mandir='${datarootdir}/man'
ac_prev=
ac_dashdash=
for ac_option
do
# If the previous option needs an argument, assign it.
if test -n "$ac_prev"; then
eval $ac_prev=\$ac_option
ac_prev=
continue
fi
case $ac_option in
*=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
*=) ac_optarg= ;;
*) ac_optarg=yes ;;
esac
# Accept the important Cygnus configure options, so we can diagnose typos.
case $ac_dashdash$ac_option in
--)
ac_dashdash=yes ;;
-bindir | --bindir | --bindi | --bind | --bin | --bi)
ac_prev=bindir ;;
-bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
bindir=$ac_optarg ;;
-build | --build | --buil | --bui | --bu)
ac_prev=build_alias ;;
-build=* | --build=* | --buil=* | --bui=* | --bu=*)
build_alias=$ac_optarg ;;
-cache-file | --cache-file | --cache-fil | --cache-fi \
| --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
ac_prev=cache_file ;;
-cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
| --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
cache_file=$ac_optarg ;;
--config-cache | -C)
cache_file=config.cache ;;
-datadir | --datadir | --datadi | --datad)
ac_prev=datadir ;;
-datadir=* | --datadir=* | --datadi=* | --datad=*)
datadir=$ac_optarg ;;
-datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
| --dataroo | --dataro | --datar)
ac_prev=datarootdir ;;
-datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
| --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
datarootdir=$ac_optarg ;;
-disable-* | --disable-*)
ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
# Reject names that are not valid shell variable names.
expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
as_fn_error $? "invalid feature name: $ac_useropt"
ac_useropt_orig=$ac_useropt
ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
case $ac_user_opts in
*"
"enable_$ac_useropt"
"*) ;;
*) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
ac_unrecognized_sep=', ';;
esac
eval enable_$ac_useropt=no ;;
-docdir | --docdir | --docdi | --doc | --do)
ac_prev=docdir ;;
-docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
docdir=$ac_optarg ;;
-dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
ac_prev=dvidir ;;
-dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
dvidir=$ac_optarg ;;
-enable-* | --enable-*)
ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
# Reject names that are not valid shell variable names.
expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
as_fn_error $? "invalid feature name: $ac_useropt"
ac_useropt_orig=$ac_useropt
ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
case $ac_user_opts in
*"
"enable_$ac_useropt"
"*) ;;
*) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
ac_unrecognized_sep=', ';;
esac
eval enable_$ac_useropt=\$ac_optarg ;;
-exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
| --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
| --exec | --exe | --ex)
ac_prev=exec_prefix ;;
-exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
| --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
| --exec=* | --exe=* | --ex=*)
exec_prefix=$ac_optarg ;;
-gas | --gas | --ga | --g)
# Obsolete; use --with-gas.
with_gas=yes ;;
-help | --help | --hel | --he | -h)
ac_init_help=long ;;
-help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
ac_init_help=recursive ;;
-help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
ac_init_help=short ;;
-host | --host | --hos | --ho)
ac_prev=host_alias ;;
-host=* | --host=* | --hos=* | --ho=*)
host_alias=$ac_optarg ;;
-htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
ac_prev=htmldir ;;
-htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
| --ht=*)
htmldir=$ac_optarg ;;
-includedir | --includedir | --includedi | --included | --include \
| --includ | --inclu | --incl | --inc)
ac_prev=includedir ;;
-includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
| --includ=* | --inclu=* | --incl=* | --inc=*)
includedir=$ac_optarg ;;
-infodir | --infodir | --infodi | --infod | --info | --inf)
ac_prev=infodir ;;
-infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
infodir=$ac_optarg ;;
-libdir | --libdir | --libdi | --libd)
ac_prev=libdir ;;
-libdir=* | --libdir=* | --libdi=* | --libd=*)
libdir=$ac_optarg ;;
-libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
| --libexe | --libex | --libe)
ac_prev=libexecdir ;;
-libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
| --libexe=* | --libex=* | --libe=*)
libexecdir=$ac_optarg ;;
-localedir | --localedir | --localedi | --localed | --locale)
ac_prev=localedir ;;
-localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
localedir=$ac_optarg ;;
-localstatedir | --localstatedir | --localstatedi | --localstated \
| --localstate | --localstat | --localsta | --localst | --locals)
ac_prev=localstatedir ;;
-localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
| --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
localstatedir=$ac_optarg ;;
-mandir | --mandir | --mandi | --mand | --man | --ma | --m)
ac_prev=mandir ;;
-mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
mandir=$ac_optarg ;;
-nfp | --nfp | --nf)
# Obsolete; use --without-fp.
with_fp=no ;;
-no-create | --no-create | --no-creat | --no-crea | --no-cre \
| --no-cr | --no-c | -n)
no_create=yes ;;
-no-recursion | --no-recursion | --no-recursio | --no-recursi \
| --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
no_recursion=yes ;;
-oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
| --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
| --oldin | --oldi | --old | --ol | --o)
ac_prev=oldincludedir ;;
-oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
| --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
| --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
oldincludedir=$ac_optarg ;;
-prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
ac_prev=prefix ;;
-prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
prefix=$ac_optarg ;;
-program-prefix | --program-prefix | --program-prefi | --program-pref \
| --program-pre | --program-pr | --program-p)
ac_prev=program_prefix ;;
-program-prefix=* | --program-prefix=* | --program-prefi=* \
| --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
program_prefix=$ac_optarg ;;
-program-suffix | --program-suffix | --program-suffi | --program-suff \
| --program-suf | --program-su | --program-s)
ac_prev=program_suffix ;;
-program-suffix=* | --program-suffix=* | --program-suffi=* \
| --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
program_suffix=$ac_optarg ;;
-program-transform-name | --program-transform-name \
| --program-transform-nam | --program-transform-na \
| --program-transform-n | --program-transform- \
| --program-transform | --program-transfor \
| --program-transfo | --program-transf \
| --program-trans | --program-tran \
| --progr-tra | --program-tr | --program-t)
ac_prev=program_transform_name ;;
-program-transform-name=* | --program-transform-name=* \
| --program-transform-nam=* | --program-transform-na=* \
| --program-transform-n=* | --program-transform-=* \
| --program-transform=* | --program-transfor=* \
| --program-transfo=* | --program-transf=* \
| --program-trans=* | --program-tran=* \
| --progr-tra=* | --program-tr=* | --program-t=*)
program_transform_name=$ac_optarg ;;
-pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
ac_prev=pdfdir ;;
-pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
pdfdir=$ac_optarg ;;
-psdir | --psdir | --psdi | --psd | --ps)
ac_prev=psdir ;;
-psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
psdir=$ac_optarg ;;
-q | -quiet | --quiet | --quie | --qui | --qu | --q \
| -silent | --silent | --silen | --sile | --sil)
silent=yes ;;
-sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
ac_prev=sbindir ;;
-sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
| --sbi=* | --sb=*)
sbindir=$ac_optarg ;;
-sharedstatedir | --sharedstatedir | --sharedstatedi \
| --sharedstated | --sharedstate | --sharedstat | --sharedsta \
| --sharedst | --shareds | --shared | --share | --shar \
| --sha | --sh)
ac_prev=sharedstatedir ;;
-sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
| --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
| --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
| --sha=* | --sh=*)
sharedstatedir=$ac_optarg ;;
-site | --site | --sit)
ac_prev=site ;;
-site=* | --site=* | --sit=*)
site=$ac_optarg ;;
-srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
ac_prev=srcdir ;;
-srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
srcdir=$ac_optarg ;;
-sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
| --syscon | --sysco | --sysc | --sys | --sy)
ac_prev=sysconfdir ;;
-sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
| --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
sysconfdir=$ac_optarg ;;
-target | --target | --targe | --targ | --tar | --ta | --t)
ac_prev=target_alias ;;
-target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
target_alias=$ac_optarg ;;
-v | -verbose | --verbose | --verbos | --verbo | --verb)
verbose=yes ;;
-version | --version | --versio | --versi | --vers | -V)
ac_init_version=: ;;
-with-* | --with-*)
ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
# Reject names that are not valid shell variable names.
expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
as_fn_error $? "invalid package name: $ac_useropt"
ac_useropt_orig=$ac_useropt
ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
case $ac_user_opts in
*"
"with_$ac_useropt"
"*) ;;
*) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
ac_unrecognized_sep=', ';;
esac
eval with_$ac_useropt=\$ac_optarg ;;
-without-* | --without-*)
ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
# Reject names that are not valid shell variable names.
expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
as_fn_error $? "invalid package name: $ac_useropt"
ac_useropt_orig=$ac_useropt
ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
case $ac_user_opts in
*"
"with_$ac_useropt"
"*) ;;
*) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
ac_unrecognized_sep=', ';;
esac
eval with_$ac_useropt=no ;;
--x)
# Obsolete; use --with-x.
with_x=yes ;;
-x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
| --x-incl | --x-inc | --x-in | --x-i)
ac_prev=x_includes ;;
-x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
| --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
x_includes=$ac_optarg ;;
-x-libraries | --x-libraries | --x-librarie | --x-librari \
| --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
ac_prev=x_libraries ;;
-x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
| --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
x_libraries=$ac_optarg ;;
-*) as_fn_error $? "unrecognized option: \`$ac_option'
Try \`$0 --help' for more information"
;;
*=*)
ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
# Reject names that are not valid shell variable names.
case $ac_envvar in #(
'' | [0-9]* | *[!_$as_cr_alnum]* )
as_fn_error $? "invalid variable name: \`$ac_envvar'" ;;
esac
eval $ac_envvar=\$ac_optarg
export $ac_envvar ;;
*)
# FIXME: should be removed in autoconf 3.0.
$as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
$as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
: "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"
;;
esac
done
if test -n "$ac_prev"; then
ac_option=--`echo $ac_prev | sed 's/_/-/g'`
as_fn_error $? "missing argument to $ac_option"
fi
if test -n "$ac_unrecognized_opts"; then
case $enable_option_checking in
no) ;;
fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
*) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
esac
fi
# Check all directory arguments for consistency.
for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \
datadir sysconfdir sharedstatedir localstatedir includedir \
oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
libdir localedir mandir
do
eval ac_val=\$$ac_var
# Remove trailing slashes.
case $ac_val in
*/ )
ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
eval $ac_var=\$ac_val;;
esac
# Be sure to have absolute directory names.
case $ac_val in
[\\/$]* | ?:[\\/]* ) continue;;
NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
esac
as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val"
done
# There might be people who depend on the old broken behavior: `$host'
# used to hold the argument of --host etc.
# FIXME: To remove some day.
build=$build_alias
host=$host_alias
target=$target_alias
# FIXME: To remove some day.
if test "x$host_alias" != x; then
if test "x$build_alias" = x; then
cross_compiling=maybe
$as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host.
If a cross compiler is detected then cross compile mode will be used" >&2
elif test "x$build_alias" != "x$host_alias"; then
cross_compiling=yes
fi
fi
ac_tool_prefix=
test -n "$host_alias" && ac_tool_prefix=$host_alias-
test "$silent" = yes && exec 6>/dev/null
ac_pwd=`pwd` && test -n "$ac_pwd" &&
ac_ls_di=`ls -di .` &&
ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
as_fn_error $? "working directory cannot be determined"
test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
as_fn_error $? "pwd does not report name of working directory"
# Find the source files, if location was not specified.
if test -z "$srcdir"; then
ac_srcdir_defaulted=yes
# Try the directory containing this script, then the parent directory.
ac_confdir=`$as_dirname -- "$as_myself" ||
$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
X"$as_myself" : 'X\(//\)[^/]' \| \
X"$as_myself" : 'X\(//\)$' \| \
X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
$as_echo X"$as_myself" |
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
s//\1/
q
}
/^X\(\/\/\)[^/].*/{
s//\1/
q
}
/^X\(\/\/\)$/{
s//\1/
q
}
/^X\(\/\).*/{
s//\1/
q
}
s/.*/./; q'`
srcdir=$ac_confdir
if test ! -r "$srcdir/$ac_unique_file"; then
srcdir=..
fi
else
ac_srcdir_defaulted=no
fi
if test ! -r "$srcdir/$ac_unique_file"; then
test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir"
fi
ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
ac_abs_confdir=`(
cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg"
pwd)`
# When building in place, set srcdir=.
if test "$ac_abs_confdir" = "$ac_pwd"; then
srcdir=.
fi
# Remove unnecessary trailing slashes from srcdir.
# Double slashes in file names in object file debugging info
# mess up M-x gdb in Emacs.
case $srcdir in
*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
esac
for ac_var in $ac_precious_vars; do
eval ac_env_${ac_var}_set=\${${ac_var}+set}
eval ac_env_${ac_var}_value=\$${ac_var}
eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
eval ac_cv_env_${ac_var}_value=\$${ac_var}
done
#
# Report the --help message.
#
if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF
\`configure' configures ejabberd 2.1.x to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
To assign environment variables (e.g., CC, CFLAGS...), specify them as
VAR=VALUE. See below for descriptions of some of the useful variables.
Defaults for the options are specified in brackets.
Configuration:
-h, --help display this help and exit
--help=short display options specific to this package
--help=recursive display the short help of all the included packages
-V, --version display version information and exit
-q, --quiet, --silent do not print \`checking ...' messages
--cache-file=FILE cache test results in FILE [disabled]
-C, --config-cache alias for \`--cache-file=config.cache'
-n, --no-create do not create output files
--srcdir=DIR find the sources in DIR [configure dir or \`..']
Installation directories:
--prefix=PREFIX install architecture-independent files in PREFIX
[$ac_default_prefix]
--exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
[PREFIX]
By default, \`make install' will install all the files in
\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify
an installation prefix other than \`$ac_default_prefix' using \`--prefix',
for instance \`--prefix=\$HOME'.
For better control, use the options below.
Fine tuning of the installation directories:
--bindir=DIR user executables [EPREFIX/bin]
--sbindir=DIR system admin executables [EPREFIX/sbin]
--libexecdir=DIR program executables [EPREFIX/libexec]
--sysconfdir=DIR read-only single-machine data [PREFIX/etc]
--sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
--localstatedir=DIR modifiable single-machine data [PREFIX/var]
--libdir=DIR object code libraries [EPREFIX/lib]
--includedir=DIR C header files [PREFIX/include]
--oldincludedir=DIR C header files for non-gcc [/usr/include]
--datarootdir=DIR read-only arch.-independent data root [PREFIX/share]
--datadir=DIR read-only architecture-independent data [DATAROOTDIR]
--infodir=DIR info documentation [DATAROOTDIR/info]
--localedir=DIR locale-dependent data [DATAROOTDIR/locale]
--mandir=DIR man documentation [DATAROOTDIR/man]
--docdir=DIR documentation root [DATAROOTDIR/doc/ejabberd]
--htmldir=DIR html documentation [DOCDIR]
--dvidir=DIR dvi documentation [DOCDIR]
--pdfdir=DIR pdf documentation [DOCDIR]
--psdir=DIR ps documentation [DOCDIR]
_ACEOF
cat <<\_ACEOF
System types:
--build=BUILD configure for building on BUILD [guessed]
--host=HOST cross-compile to build programs to run on HOST [BUILD]
--target=TARGET configure for building compilers for TARGET [HOST]
_ACEOF
fi
if test -n "$ac_init_help"; then
case $ac_init_help in
short | recursive ) echo "Configuration of ejabberd 2.1.x:";;
esac
cat <<\_ACEOF
Optional Features:
--disable-option-checking ignore unrecognized --enable/--with options
--disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
--enable-FEATURE[=ARG] include FEATURE [ARG=yes]
--enable-mod_irc enable mod_irc (default: yes)
--enable-mod_muc enable mod_muc (default: yes)
--enable-mod_proxy65 enable mod_proxy65 (default: yes)
--enable-mod_pubsub enable mod_pubsub (default: yes)
--enable-eldap enable eldap (default: yes)
--enable-odbc enable odbc (default: no)
--enable-tls enable tls (default: yes)
--enable-web enable web (default: yes)
--enable-ejabberd_zlib enable ejabberd_zlib (default: yes)
--enable-pam enable pam (default: no)
--enable-hipe compile natively with HiPE, not recommended
(default: no)
--enable-roster-gateway-workaround
turn on workaround for processing gateway
subscriptions (default: no)
--enable-mssql use Microsoft SQL Server database (default: no,
requires --enable-odbc)
--enable-transient_supervisors
use Erlang supervision for transient process
(default: yes)
--enable-full-xml use XML features in XMPP stream (ex: CDATA)
(default: no, requires XML compliant clients)
--enable-nif replace some functions with C equivalents. Requires
Erlang R13B04 or higher (default: no)
--enable-user[[[=USER]]]
allow this system user to start ejabberd (default:
no)
Optional Packages:
--with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
--without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
--with-erlang=PREFIX path to erlc and erl
--with-libiconv-prefix=PREFIX
prefix where libiconv is installed
--with-expat=PREFIX prefix where EXPAT is installed
--with-zlib=PREFIX prefix where zlib is installed
--with-pam=PREFIX prefix where PAM is installed
--with-openssl=PREFIX prefix where OPENSSL is installed
Some influential environment variables:
CC C compiler command
CFLAGS C compiler flags
LDFLAGS linker flags, e.g. -L if you have libraries in a
nonstandard directory
LIBS libraries to pass to the linker, e.g. -l
CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if
you have headers in a nonstandard directory
CPP C preprocessor
ERLC Erlang/OTP compiler command [autodetected]
ERLCFLAGS Erlang/OTP compiler flags [none]
Use these variables to override the choices made by `configure' or to help
it to find libraries and programs with nonstandard names/locations.
Report bugs to .
_ACEOF
ac_status=$?
fi
if test "$ac_init_help" = "recursive"; then
# If there are subdirs, report their specific --help.
for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
test -d "$ac_dir" ||
{ cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
continue
ac_builddir=.
case "$ac_dir" in
.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
*)
ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
# A ".." for each directory in $ac_dir_suffix.
ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
case $ac_top_builddir_sub in
"") ac_top_builddir_sub=. ac_top_build_prefix= ;;
*) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
esac ;;
esac
ac_abs_top_builddir=$ac_pwd
ac_abs_builddir=$ac_pwd$ac_dir_suffix
# for backward compatibility:
ac_top_builddir=$ac_top_build_prefix
case $srcdir in
.) # We are building in place.
ac_srcdir=.
ac_top_srcdir=$ac_top_builddir_sub
ac_abs_top_srcdir=$ac_pwd ;;
[\\/]* | ?:[\\/]* ) # Absolute name.
ac_srcdir=$srcdir$ac_dir_suffix;
ac_top_srcdir=$srcdir
ac_abs_top_srcdir=$srcdir ;;
*) # Relative name.
ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
ac_top_srcdir=$ac_top_build_prefix$srcdir
ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
esac
ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
cd "$ac_dir" || { ac_status=$?; continue; }
# Check for guested configure.
if test -f "$ac_srcdir/configure.gnu"; then
echo &&
$SHELL "$ac_srcdir/configure.gnu" --help=recursive
elif test -f "$ac_srcdir/configure"; then
echo &&
$SHELL "$ac_srcdir/configure" --help=recursive
else
$as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
fi || ac_status=$?
cd "$ac_pwd" || { ac_status=$?; break; }
done
fi
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
ejabberd configure 2.1.x
generated by GNU Autoconf 2.68
Copyright (C) 2010 Free Software Foundation, Inc.
This configure script is free software; the Free Software Foundation
gives unlimited permission to copy, distribute and modify it.
_ACEOF
exit
fi
## ------------------------ ##
## Autoconf initialization. ##
## ------------------------ ##
# ac_fn_c_try_compile LINENO
# --------------------------
# Try to compile conftest.$ac_ext, and return whether this succeeded.
ac_fn_c_try_compile ()
{
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
rm -f conftest.$ac_objext
if { { ac_try="$ac_compile"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
(eval "$ac_compile") 2>conftest.err
ac_status=$?
if test -s conftest.err; then
grep -v '^ *+' conftest.err >conftest.er1
cat conftest.er1 >&5
mv -f conftest.er1 conftest.err
fi
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; } && {
test -z "$ac_c_werror_flag" ||
test ! -s conftest.err
} && test -s conftest.$ac_objext; then :
ac_retval=0
else
$as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_retval=1
fi
eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
as_fn_set_status $ac_retval
} # ac_fn_c_try_compile
# ac_fn_c_try_link LINENO
# -----------------------
# Try to link conftest.$ac_ext, and return whether this succeeded.
ac_fn_c_try_link ()
{
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
rm -f conftest.$ac_objext conftest$ac_exeext
if { { ac_try="$ac_link"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
(eval "$ac_link") 2>conftest.err
ac_status=$?
if test -s conftest.err; then
grep -v '^ *+' conftest.err >conftest.er1
cat conftest.er1 >&5
mv -f conftest.er1 conftest.err
fi
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; } && {
test -z "$ac_c_werror_flag" ||
test ! -s conftest.err
} && test -s conftest$ac_exeext && {
test "$cross_compiling" = yes ||
$as_test_x conftest$ac_exeext
}; then :
ac_retval=0
else
$as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_retval=1
fi
# Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
# created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
# interfere with the next link command; also delete a directory that is
# left behind by Apple's compiler. We do this before executing the actions.
rm -rf conftest.dSYM conftest_ipa8_conftest.oo
eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
as_fn_set_status $ac_retval
} # ac_fn_c_try_link
# ac_fn_c_try_cpp LINENO
# ----------------------
# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
ac_fn_c_try_cpp ()
{
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
if { { ac_try="$ac_cpp conftest.$ac_ext"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
(eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
ac_status=$?
if test -s conftest.err; then
grep -v '^ *+' conftest.err >conftest.er1
cat conftest.er1 >&5
mv -f conftest.er1 conftest.err
fi
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; } > conftest.i && {
test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
test ! -s conftest.err
}; then :
ac_retval=0
else
$as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_retval=1
fi
eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
as_fn_set_status $ac_retval
} # ac_fn_c_try_cpp
# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES
# -------------------------------------------------------
# Tests whether HEADER exists, giving a warning if it cannot be compiled using
# the include files in INCLUDES and setting the cache variable VAR
# accordingly.
ac_fn_c_check_header_mongrel ()
{
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
if eval \${$3+:} false; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
$as_echo_n "checking for $2... " >&6; }
if eval \${$3+:} false; then :
$as_echo_n "(cached) " >&6
fi
eval ac_res=\$$3
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }
else
# Is the header compilable?
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5
$as_echo_n "checking $2 usability... " >&6; }
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
$4
#include <$2>
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
ac_header_compiler=yes
else
ac_header_compiler=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5
$as_echo "$ac_header_compiler" >&6; }
# Is the header present?
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5
$as_echo_n "checking $2 presence... " >&6; }
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <$2>
_ACEOF
if ac_fn_c_try_cpp "$LINENO"; then :
ac_header_preproc=yes
else
ac_header_preproc=no
fi
rm -f conftest.err conftest.i conftest.$ac_ext
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
$as_echo "$ac_header_preproc" >&6; }
# So? What about this header?
case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #((
yes:no: )
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5
$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;}
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
;;
no:yes:* )
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5
$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;}
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5
$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;}
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5
$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5
$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;}
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
( $as_echo "## --------------------------------------- ##
## Report this to ejabberd@process-one.net ##
## --------------------------------------- ##"
) | sed "s/^/$as_me: WARNING: /" >&2
;;
esac
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
$as_echo_n "checking for $2... " >&6; }
if eval \${$3+:} false; then :
$as_echo_n "(cached) " >&6
else
eval "$3=\$ac_header_compiler"
fi
eval ac_res=\$$3
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }
fi
eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
} # ac_fn_c_check_header_mongrel
# ac_fn_c_try_run LINENO
# ----------------------
# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
# that executables *can* be run.
ac_fn_c_try_run ()
{
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
if { { ac_try="$ac_link"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
(eval "$ac_link") 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
{ { case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
(eval "$ac_try") 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; }; then :
ac_retval=0
else
$as_echo "$as_me: program exited with status $ac_status" >&5
$as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_retval=$ac_status
fi
rm -rf conftest.dSYM conftest_ipa8_conftest.oo
eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
as_fn_set_status $ac_retval
} # ac_fn_c_try_run
# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
# -------------------------------------------------------
# Tests whether HEADER exists and can be compiled using the include files in
# INCLUDES, setting the cache variable VAR accordingly.
ac_fn_c_check_header_compile ()
{
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
$as_echo_n "checking for $2... " >&6; }
if eval \${$3+:} false; then :
$as_echo_n "(cached) " >&6
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
$4
#include <$2>
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
eval "$3=yes"
else
eval "$3=no"
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
eval ac_res=\$$3
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }
eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
} # ac_fn_c_check_header_compile
# ac_fn_erl_try_run LINENO
# ------------------------
# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
# that executables *can* be run.
ac_fn_erl_try_run ()
{
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
if { { ac_try="$ac_link"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
(eval "$ac_link") 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
{ { case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
(eval "$ac_try") 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; }; then :
ac_retval=0
else
$as_echo "$as_me: program exited with status $ac_status" >&5
$as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_retval=$ac_status
fi
rm -rf conftest.dSYM conftest_ipa8_conftest.oo
eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
as_fn_set_status $ac_retval
} # ac_fn_erl_try_run
cat >config.log <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
It was created by ejabberd $as_me 2.1.x, which was
generated by GNU Autoconf 2.68. Invocation command line was
$ $0 $@
_ACEOF
exec 5>>config.log
{
cat <<_ASUNAME
## --------- ##
## Platform. ##
## --------- ##
hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
uname -m = `(uname -m) 2>/dev/null || echo unknown`
uname -r = `(uname -r) 2>/dev/null || echo unknown`
uname -s = `(uname -s) 2>/dev/null || echo unknown`
uname -v = `(uname -v) 2>/dev/null || echo unknown`
/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown`
/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown`
/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown`
/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown`
/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown`
/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown`
/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown`
_ASUNAME
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
$as_echo "PATH: $as_dir"
done
IFS=$as_save_IFS
} >&5
cat >&5 <<_ACEOF
## ----------- ##
## Core tests. ##
## ----------- ##
_ACEOF
# Keep a trace of the command line.
# Strip out --no-create and --no-recursion so they do not pile up.
# Strip out --silent because we don't want to record it for future runs.
# Also quote any args containing shell meta-characters.
# Make two passes to allow for proper duplicate-argument suppression.
ac_configure_args=
ac_configure_args0=
ac_configure_args1=
ac_must_keep_next=false
for ac_pass in 1 2
do
for ac_arg
do
case $ac_arg in
-no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
-q | -quiet | --quiet | --quie | --qui | --qu | --q \
| -silent | --silent | --silen | --sile | --sil)
continue ;;
*\'*)
ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
esac
case $ac_pass in
1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
2)
as_fn_append ac_configure_args1 " '$ac_arg'"
if test $ac_must_keep_next = true; then
ac_must_keep_next=false # Got value, back to normal.
else
case $ac_arg in
*=* | --config-cache | -C | -disable-* | --disable-* \
| -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
| -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
| -with-* | --with-* | -without-* | --without-* | --x)
case "$ac_configure_args0 " in
"$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
esac
;;
-* ) ac_must_keep_next=true ;;
esac
fi
as_fn_append ac_configure_args " '$ac_arg'"
;;
esac
done
done
{ ac_configure_args0=; unset ac_configure_args0;}
{ ac_configure_args1=; unset ac_configure_args1;}
# When interrupted or exit'd, cleanup temporary files, and complete
# config.log. We remove comments because anyway the quotes in there
# would cause problems or look ugly.
# WARNING: Use '\'' to represent an apostrophe within the trap.
# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
trap 'exit_status=$?
# Save into config.log some information that might help in debugging.
{
echo
$as_echo "## ---------------- ##
## Cache variables. ##
## ---------------- ##"
echo
# The following way of writing the cache mishandles newlines in values,
(
for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
eval ac_val=\$$ac_var
case $ac_val in #(
*${as_nl}*)
case $ac_var in #(
*_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
esac
case $ac_var in #(
_ | IFS | as_nl) ;; #(
BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
*) { eval $ac_var=; unset $ac_var;} ;;
esac ;;
esac
done
(set) 2>&1 |
case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
*${as_nl}ac_space=\ *)
sed -n \
"s/'\''/'\''\\\\'\'''\''/g;
s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
;; #(
*)
sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
;;
esac |
sort
)
echo
$as_echo "## ----------------- ##
## Output variables. ##
## ----------------- ##"
echo
for ac_var in $ac_subst_vars
do
eval ac_val=\$$ac_var
case $ac_val in
*\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
esac
$as_echo "$ac_var='\''$ac_val'\''"
done | sort
echo
if test -n "$ac_subst_files"; then
$as_echo "## ------------------- ##
## File substitutions. ##
## ------------------- ##"
echo
for ac_var in $ac_subst_files
do
eval ac_val=\$$ac_var
case $ac_val in
*\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
esac
$as_echo "$ac_var='\''$ac_val'\''"
done | sort
echo
fi
if test -s confdefs.h; then
$as_echo "## ----------- ##
## confdefs.h. ##
## ----------- ##"
echo
cat confdefs.h
echo
fi
test "$ac_signal" != 0 &&
$as_echo "$as_me: caught signal $ac_signal"
$as_echo "$as_me: exit $exit_status"
} >&5
rm -f core *.core core.conftest.* &&
rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
exit $exit_status
' 0
for ac_signal in 1 2 13 15; do
trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal
done
ac_signal=0
# confdefs.h avoids OS command line length limits that DEFS can exceed.
rm -f -r conftest* confdefs.h
$as_echo "/* confdefs.h */" > confdefs.h
# Predefined preprocessor variables.
cat >>confdefs.h <<_ACEOF
#define PACKAGE_NAME "$PACKAGE_NAME"
_ACEOF
cat >>confdefs.h <<_ACEOF
#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
_ACEOF
cat >>confdefs.h <<_ACEOF
#define PACKAGE_VERSION "$PACKAGE_VERSION"
_ACEOF
cat >>confdefs.h <<_ACEOF
#define PACKAGE_STRING "$PACKAGE_STRING"
_ACEOF
cat >>confdefs.h <<_ACEOF
#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
_ACEOF
cat >>confdefs.h <<_ACEOF
#define PACKAGE_URL "$PACKAGE_URL"
_ACEOF
# Let the site file select an alternate cache file if it wants to.
# Prefer an explicitly selected file to automatically selected ones.
ac_site_file1=NONE
ac_site_file2=NONE
if test -n "$CONFIG_SITE"; then
# We do not want a PATH search for config.site.
case $CONFIG_SITE in #((
-*) ac_site_file1=./$CONFIG_SITE;;
*/*) ac_site_file1=$CONFIG_SITE;;
*) ac_site_file1=./$CONFIG_SITE;;
esac
elif test "x$prefix" != xNONE; then
ac_site_file1=$prefix/share/config.site
ac_site_file2=$prefix/etc/config.site
else
ac_site_file1=$ac_default_prefix/share/config.site
ac_site_file2=$ac_default_prefix/etc/config.site
fi
for ac_site_file in "$ac_site_file1" "$ac_site_file2"
do
test "x$ac_site_file" = xNONE && continue
if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
$as_echo "$as_me: loading site script $ac_site_file" >&6;}
sed 's/^/| /' "$ac_site_file" >&5
. "$ac_site_file" \
|| { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "failed to load site script $ac_site_file
See \`config.log' for more details" "$LINENO" 5; }
fi
done
if test -r "$cache_file"; then
# Some versions of bash will fail to source /dev/null (special files
# actually), so we avoid doing that. DJGPP emulates it as a regular file.
if test /dev/null != "$cache_file" && test -f "$cache_file"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
$as_echo "$as_me: loading cache $cache_file" >&6;}
case $cache_file in
[\\/]* | ?:[\\/]* ) . "$cache_file";;
*) . "./$cache_file";;
esac
fi
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
$as_echo "$as_me: creating cache $cache_file" >&6;}
>$cache_file
fi
# Check that the precious variables saved in the cache have kept the same
# value.
ac_cache_corrupted=false
for ac_var in $ac_precious_vars; do
eval ac_old_set=\$ac_cv_env_${ac_var}_set
eval ac_new_set=\$ac_env_${ac_var}_set
eval ac_old_val=\$ac_cv_env_${ac_var}_value
eval ac_new_val=\$ac_env_${ac_var}_value
case $ac_old_set,$ac_new_set in
set,)
{ $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
ac_cache_corrupted=: ;;
,set)
{ $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
ac_cache_corrupted=: ;;
,);;
*)
if test "x$ac_old_val" != "x$ac_new_val"; then
# differences in whitespace do not lead to failure.
ac_old_val_w=`echo x $ac_old_val`
ac_new_val_w=`echo x $ac_new_val`
if test "$ac_old_val_w" != "$ac_new_val_w"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
ac_cache_corrupted=:
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
eval $ac_var=\$ac_old_val
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5
$as_echo "$as_me: former value: \`$ac_old_val'" >&2;}
{ $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5
$as_echo "$as_me: current value: \`$ac_new_val'" >&2;}
fi;;
esac
# Pass precious variables to config.status.
if test "$ac_new_set" = set; then
case $ac_new_val in
*\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
*) ac_arg=$ac_var=$ac_new_val ;;
esac
case " $ac_configure_args " in
*" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy.
*) as_fn_append ac_configure_args " '$ac_arg'" ;;
esac
fi
done
if $ac_cache_corrupted; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
{ $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
fi
## -------------------- ##
## Main body of script. ##
## -------------------- ##
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
# Checks for programs.
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
if test -n "$ac_tool_prefix"; then
# Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
set dummy ${ac_tool_prefix}gcc; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_CC+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$CC"; then
ac_cv_prog_CC="$CC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
ac_cv_prog_CC="${ac_tool_prefix}gcc"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
fi
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
$as_echo "$CC" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
fi
if test -z "$ac_cv_prog_CC"; then
ac_ct_CC=$CC
# Extract the first word of "gcc", so it can be a program name with args.
set dummy gcc; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_ac_ct_CC+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$ac_ct_CC"; then
ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
ac_cv_prog_ac_ct_CC="gcc"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
fi
fi
ac_ct_CC=$ac_cv_prog_ac_ct_CC
if test -n "$ac_ct_CC"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
$as_echo "$ac_ct_CC" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
if test "x$ac_ct_CC" = x; then
CC=""
else
case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
CC=$ac_ct_CC
fi
else
CC="$ac_cv_prog_CC"
fi
if test -z "$CC"; then
if test -n "$ac_tool_prefix"; then
# Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
set dummy ${ac_tool_prefix}cc; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_CC+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$CC"; then
ac_cv_prog_CC="$CC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
ac_cv_prog_CC="${ac_tool_prefix}cc"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
fi
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
$as_echo "$CC" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
fi
fi
if test -z "$CC"; then
# Extract the first word of "cc", so it can be a program name with args.
set dummy cc; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_CC+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$CC"; then
ac_cv_prog_CC="$CC" # Let the user override the test.
else
ac_prog_rejected=no
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
ac_prog_rejected=yes
continue
fi
ac_cv_prog_CC="cc"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
if test $ac_prog_rejected = yes; then
# We found a bogon in the path, so make sure we never use it.
set dummy $ac_cv_prog_CC
shift
if test $# != 0; then
# We chose a different compiler from the bogus one.
# However, it has the same basename, so the bogon will be chosen
# first if we set CC to just the basename; use the full file name.
shift
ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
fi
fi
fi
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
$as_echo "$CC" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
fi
if test -z "$CC"; then
if test -n "$ac_tool_prefix"; then
for ac_prog in cl.exe
do
# Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
set dummy $ac_tool_prefix$ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_CC+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$CC"; then
ac_cv_prog_CC="$CC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
fi
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
$as_echo "$CC" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
test -n "$CC" && break
done
fi
if test -z "$CC"; then
ac_ct_CC=$CC
for ac_prog in cl.exe
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_ac_ct_CC+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$ac_ct_CC"; then
ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
ac_cv_prog_ac_ct_CC="$ac_prog"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
fi
fi
ac_ct_CC=$ac_cv_prog_ac_ct_CC
if test -n "$ac_ct_CC"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
$as_echo "$ac_ct_CC" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
test -n "$ac_ct_CC" && break
done
if test "x$ac_ct_CC" = x; then
CC=""
else
case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
CC=$ac_ct_CC
fi
fi
fi
test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "no acceptable C compiler found in \$PATH
See \`config.log' for more details" "$LINENO" 5; }
# Provide some information about the compiler.
$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
set X $ac_compile
ac_compiler=$2
for ac_option in --version -v -V -qversion; do
{ { ac_try="$ac_compiler $ac_option >&5"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
(eval "$ac_compiler $ac_option >&5") 2>conftest.err
ac_status=$?
if test -s conftest.err; then
sed '10a\
... rest of stderr output deleted ...
10q' conftest.err >conftest.er1
cat conftest.er1 >&5
fi
rm -f conftest.er1 conftest.err
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }
done
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
main ()
{
;
return 0;
}
_ACEOF
ac_clean_files_save=$ac_clean_files
ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
# Try to create an executable without -o first, disregard a.out.
# It will help us diagnose broken compilers, and finding out an intuition
# of exeext.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
$as_echo_n "checking whether the C compiler works... " >&6; }
ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
# The possible output files:
ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
ac_rmfiles=
for ac_file in $ac_files
do
case $ac_file in
*.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
* ) ac_rmfiles="$ac_rmfiles $ac_file";;
esac
done
rm -f $ac_rmfiles
if { { ac_try="$ac_link_default"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
(eval "$ac_link_default") 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; then :
# Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
# in a Makefile. We should not override ac_cv_exeext if it was cached,
# so that the user can short-circuit this test for compilers unknown to
# Autoconf.
for ac_file in $ac_files ''
do
test -f "$ac_file" || continue
case $ac_file in
*.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
;;
[ab].out )
# We found the default executable, but exeext='' is most
# certainly right.
break;;
*.* )
if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
then :; else
ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
fi
# We set ac_cv_exeext here because the later test for it is not
# safe: cross compilers may not add the suffix if given an `-o'
# argument, so we may need to know it at that point already.
# Even if this section looks crufty: it has the advantage of
# actually working.
break;;
* )
break;;
esac
done
test "$ac_cv_exeext" = no && ac_cv_exeext=
else
ac_file=''
fi
if test -z "$ac_file"; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
$as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error 77 "C compiler cannot create executables
See \`config.log' for more details" "$LINENO" 5; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
$as_echo_n "checking for C compiler default output file name... " >&6; }
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
$as_echo "$ac_file" >&6; }
ac_exeext=$ac_cv_exeext
rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
ac_clean_files=$ac_clean_files_save
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
$as_echo_n "checking for suffix of executables... " >&6; }
if { { ac_try="$ac_link"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
(eval "$ac_link") 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; then :
# If both `conftest.exe' and `conftest' are `present' (well, observable)
# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will
# work properly (i.e., refer to `conftest.exe'), while it won't with
# `rm'.
for ac_file in conftest.exe conftest conftest.*; do
test -f "$ac_file" || continue
case $ac_file in
*.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
*.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
break;;
* ) break;;
esac
done
else
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "cannot compute suffix of executables: cannot compile and link
See \`config.log' for more details" "$LINENO" 5; }
fi
rm -f conftest conftest$ac_cv_exeext
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
$as_echo "$ac_cv_exeext" >&6; }
rm -f conftest.$ac_ext
EXEEXT=$ac_cv_exeext
ac_exeext=$EXEEXT
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include
int
main ()
{
FILE *f = fopen ("conftest.out", "w");
return ferror (f) || fclose (f) != 0;
;
return 0;
}
_ACEOF
ac_clean_files="$ac_clean_files conftest.out"
# Check that the compiler produces executables we can run. If not, either
# the compiler is broken, or we cross compile.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
$as_echo_n "checking whether we are cross compiling... " >&6; }
if test "$cross_compiling" != yes; then
{ { ac_try="$ac_link"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
(eval "$ac_link") 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }
if { ac_try='./conftest$ac_cv_exeext'
{ { case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
(eval "$ac_try") 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; }; then
cross_compiling=no
else
if test "$cross_compiling" = maybe; then
cross_compiling=yes
else
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "cannot run C compiled programs.
If you meant to cross compile, use \`--host'.
See \`config.log' for more details" "$LINENO" 5; }
fi
fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
$as_echo "$cross_compiling" >&6; }
rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
ac_clean_files=$ac_clean_files_save
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
$as_echo_n "checking for suffix of object files... " >&6; }
if ${ac_cv_objext+:} false; then :
$as_echo_n "(cached) " >&6
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
main ()
{
;
return 0;
}
_ACEOF
rm -f conftest.o conftest.obj
if { { ac_try="$ac_compile"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
(eval "$ac_compile") 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; then :
for ac_file in conftest.o conftest.obj conftest.*; do
test -f "$ac_file" || continue;
case $ac_file in
*.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
*) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
break;;
esac
done
else
$as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "cannot compute suffix of object files: cannot compile
See \`config.log' for more details" "$LINENO" 5; }
fi
rm -f conftest.$ac_cv_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
$as_echo "$ac_cv_objext" >&6; }
OBJEXT=$ac_cv_objext
ac_objext=$OBJEXT
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
if ${ac_cv_c_compiler_gnu+:} false; then :
$as_echo_n "(cached) " >&6
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
main ()
{
#ifndef __GNUC__
choke me
#endif
;
return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
ac_compiler_gnu=yes
else
ac_compiler_gnu=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
ac_cv_c_compiler_gnu=$ac_compiler_gnu
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
$as_echo "$ac_cv_c_compiler_gnu" >&6; }
if test $ac_compiler_gnu = yes; then
GCC=yes
else
GCC=
fi
ac_test_CFLAGS=${CFLAGS+set}
ac_save_CFLAGS=$CFLAGS
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
$as_echo_n "checking whether $CC accepts -g... " >&6; }
if ${ac_cv_prog_cc_g+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_save_c_werror_flag=$ac_c_werror_flag
ac_c_werror_flag=yes
ac_cv_prog_cc_g=no
CFLAGS="-g"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
main ()
{
;
return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
ac_cv_prog_cc_g=yes
else
CFLAGS=""
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
main ()
{
;
return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
else
ac_c_werror_flag=$ac_save_c_werror_flag
CFLAGS="-g"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
main ()
{
;
return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
ac_cv_prog_cc_g=yes
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
ac_c_werror_flag=$ac_save_c_werror_flag
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
$as_echo "$ac_cv_prog_cc_g" >&6; }
if test "$ac_test_CFLAGS" = set; then
CFLAGS=$ac_save_CFLAGS
elif test $ac_cv_prog_cc_g = yes; then
if test "$GCC" = yes; then
CFLAGS="-g -O2"
else
CFLAGS="-g"
fi
else
if test "$GCC" = yes; then
CFLAGS="-O2"
else
CFLAGS=
fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
if ${ac_cv_prog_cc_c89+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_cv_prog_cc_c89=no
ac_save_CC=$CC
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include
#include
#include
#include
/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */
struct buf { int x; };
FILE * (*rcsopen) (struct buf *, struct stat *, int);
static char *e (p, i)
char **p;
int i;
{
return p[i];
}
static char *f (char * (*g) (char **, int), char **p, ...)
{
char *s;
va_list v;
va_start (v,p);
s = g (p, va_arg (v,int));
va_end (v);
return s;
}
/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has
function prototypes and stuff, but not '\xHH' hex character constants.
These don't provoke an error unfortunately, instead are silently treated
as 'x'. The following induces an error, until -std is added to get
proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an
array size at least. It's necessary to write '\x00'==0 to get something
that's true only with -std. */
int osf4_cc_array ['\x00' == 0 ? 1 : -1];
/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
inside strings and character constants. */
#define FOO(x) 'x'
int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
int test (int i, double x);
struct s1 {int (*f) (int a);};
struct s2 {int (*f) (double a);};
int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
int argc;
char **argv;
int
main ()
{
return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1];
;
return 0;
}
_ACEOF
for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
-Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
do
CC="$ac_save_CC $ac_arg"
if ac_fn_c_try_compile "$LINENO"; then :
ac_cv_prog_cc_c89=$ac_arg
fi
rm -f core conftest.err conftest.$ac_objext
test "x$ac_cv_prog_cc_c89" != "xno" && break
done
rm -f conftest.$ac_ext
CC=$ac_save_CC
fi
# AC_CACHE_VAL
case "x$ac_cv_prog_cc_c89" in
x)
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
$as_echo "none needed" >&6; } ;;
xno)
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
$as_echo "unsupported" >&6; } ;;
*)
CC="$CC $ac_cv_prog_cc_c89"
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
esac
if test "x$ac_cv_prog_cc_c89" != xno; then :
fi
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
set x ${MAKE-make}
ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then :
$as_echo_n "(cached) " >&6
else
cat >conftest.make <<\_ACEOF
SHELL = /bin/sh
all:
@echo '@@@%%%=$(MAKE)=@@@%%%'
_ACEOF
# GNU make sometimes prints "make[1]: Entering ...", which would confuse us.
case `${MAKE-make} -f conftest.make 2>/dev/null` in
*@@@%%%=?*=@@@%%%*)
eval ac_cv_prog_make_${ac_make}_set=yes;;
*)
eval ac_cv_prog_make_${ac_make}_set=no;;
esac
rm -f conftest.make
fi
if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
SET_MAKE=
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
SET_MAKE="MAKE=${MAKE-make}"
fi
if test "x$GCC" = "xyes"; then
CFLAGS="$CFLAGS -Wall"
fi
#locating erlang
# Check whether --with-erlang was given.
if test "${with_erlang+set}" = set; then :
withval=$with_erlang;
fi
if test -n "$ac_tool_prefix"; then
# Extract the first word of "${ac_tool_prefix}erlc", so it can be a program name with args.
set dummy ${ac_tool_prefix}erlc; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_path_ERLC+:} false; then :
$as_echo_n "(cached) " >&6
else
case $ERLC in
[\\/]* | ?:[\\/]*)
ac_cv_path_ERLC="$ERLC" # Let the user override the test with a path.
;;
*)
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
as_dummy="$with_erlang:$with_erlang/bin:$PATH"
for as_dir in $as_dummy
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
ac_cv_path_ERLC="$as_dir/$ac_word$ac_exec_ext"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
;;
esac
fi
ERLC=$ac_cv_path_ERLC
if test -n "$ERLC"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ERLC" >&5
$as_echo "$ERLC" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
fi
if test -z "$ac_cv_path_ERLC"; then
ac_pt_ERLC=$ERLC
# Extract the first word of "erlc", so it can be a program name with args.
set dummy erlc; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_path_ac_pt_ERLC+:} false; then :
$as_echo_n "(cached) " >&6
else
case $ac_pt_ERLC in
[\\/]* | ?:[\\/]*)
ac_cv_path_ac_pt_ERLC="$ac_pt_ERLC" # Let the user override the test with a path.
;;
*)
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
as_dummy="$with_erlang:$with_erlang/bin:$PATH"
for as_dir in $as_dummy
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
ac_cv_path_ac_pt_ERLC="$as_dir/$ac_word$ac_exec_ext"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
;;
esac
fi
ac_pt_ERLC=$ac_cv_path_ac_pt_ERLC
if test -n "$ac_pt_ERLC"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_ERLC" >&5
$as_echo "$ac_pt_ERLC" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
if test "x$ac_pt_ERLC" = x; then
ERLC=""
else
case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
ERLC=$ac_pt_ERLC
fi
else
ERLC="$ac_cv_path_ERLC"
fi
if test -n "$ac_tool_prefix"; then
# Extract the first word of "${ac_tool_prefix}erl", so it can be a program name with args.
set dummy ${ac_tool_prefix}erl; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_path_ERL+:} false; then :
$as_echo_n "(cached) " >&6
else
case $ERL in
[\\/]* | ?:[\\/]*)
ac_cv_path_ERL="$ERL" # Let the user override the test with a path.
;;
*)
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
as_dummy="$with_erlang:$with_erlang/bin:$PATH"
for as_dir in $as_dummy
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
ac_cv_path_ERL="$as_dir/$ac_word$ac_exec_ext"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
;;
esac
fi
ERL=$ac_cv_path_ERL
if test -n "$ERL"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ERL" >&5
$as_echo "$ERL" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
fi
if test -z "$ac_cv_path_ERL"; then
ac_pt_ERL=$ERL
# Extract the first word of "erl", so it can be a program name with args.
set dummy erl; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_path_ac_pt_ERL+:} false; then :
$as_echo_n "(cached) " >&6
else
case $ac_pt_ERL in
[\\/]* | ?:[\\/]*)
ac_cv_path_ac_pt_ERL="$ac_pt_ERL" # Let the user override the test with a path.
;;
*)
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
as_dummy="$with_erlang:$with_erlang/bin:$PATH"
for as_dir in $as_dummy
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
ac_cv_path_ac_pt_ERL="$as_dir/$ac_word$ac_exec_ext"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
;;
esac
fi
ac_pt_ERL=$ac_cv_path_ac_pt_ERL
if test -n "$ac_pt_ERL"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_ERL" >&5
$as_echo "$ac_pt_ERL" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
if test "x$ac_pt_ERL" = x; then
ERL=""
else
case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
ERL=$ac_pt_ERL
fi
else
ERL="$ac_cv_path_ERL"
fi
if test "z$ERLC" = "z" || test "z$ERL" = "z"; then
as_fn_error $? "erlang not found" "$LINENO" 5
fi
cat >>conftest.erl <<_EOF
-module(conftest).
-author('alexey@sevcom.net').
-export([start/0]).
start() ->
EIDirS = code:lib_dir("erl_interface") ++ "\n",
EILibS = libpath("erl_interface") ++ "\n",
RootDirS = code:root_dir() ++ "\n",
file:write_file("conftest.out", list_to_binary(EIDirS ++ EILibS ++ ssldef() ++ RootDirS)),
halt().
ssldef() ->
OTP = (catch erlang:system_info(otp_release)),
if
OTP >= "R14" -> "-DSSL40\n";
OTP >= "R12" -> "-DSSL39\n";
true -> "\n"
end.
%% return physical architecture based on OS/Processor
archname() ->
ArchStr = erlang:system_info(system_architecture),
case os:type() of
{win32, _} -> "windows";
{unix,UnixName} ->
Specs = string:tokens(ArchStr,"-"),
Cpu = case lists:nth(2,Specs) of
"pc" -> "x86";
_ -> hd(Specs)
end,
atom_to_list(UnixName) ++ "-" ++ Cpu;
_ -> "generic"
end.
%% Return arch-based library path or a default value if this directory
%% does not exist
libpath(App) ->
PrivDir = code:priv_dir(App),
ArchDir = archname(),
LibArchDir = filename:join([PrivDir,"lib",ArchDir]),
case file:list_dir(LibArchDir) of
%% Arch lib dir exists: We use it
{ok, _List} -> LibArchDir;
%% Arch lib dir does not exist: Return the default value
%% ({error, enoent}):
_Error -> code:lib_dir("erl_interface") ++ "/lib"
end.
_EOF
if ! $ERLC conftest.erl; then
as_fn_error $? "could not compile sample program" "$LINENO" 5
fi
if ! $ERL -s conftest -noshell; then
as_fn_error $? "could not run sample program" "$LINENO" 5
fi
if ! test -f conftest.out; then
as_fn_error $? "erlang program was not properly executed, (conftest.out was not produced)" "$LINENO" 5
fi
# First line
ERLANG_EI_DIR=`cat conftest.out | head -n 1`
# Second line
ERLANG_EI_LIB=`cat conftest.out | head -n 2 | tail -n 1`
# Third line
ERLANG_SSLVER=`cat conftest.out | head -n 3 | tail -n 1`
# End line
ERLANG_DIR=`cat conftest.out | tail -n 1`
ERLANG_CFLAGS="-I$ERLANG_EI_DIR/include -I$ERLANG_DIR/usr/include"
ERLANG_LIBS="-L$ERLANG_EI_LIB -lerl_interface -lei"
#locating iconv
# Check whether --with-libiconv-prefix was given.
if test "${with_libiconv_prefix+set}" = set; then :
withval=$with_libiconv_prefix;
for dir in `echo "$withval" | tr : ' '`; do
if test -d $dir/include; then CPPFLAGS="$CPPFLAGS -I$dir/include"; fi
if test -d $dir/include; then CFLAGS="$CFLAGS -I$dir/include"; fi
if test -d $dir/lib; then LDFLAGS="$LDFLAGS -L$dir/lib"; fi
done
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv" >&5
$as_echo_n "checking for iconv... " >&6; }
if ${am_cv_func_iconv+:} false; then :
$as_echo_n "(cached) " >&6
else
am_cv_func_iconv="no, consider installing GNU libiconv"
am_cv_lib_iconv=no
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include
#include
int
main ()
{
iconv_t cd = iconv_open("","");
iconv(cd,NULL,NULL,NULL,NULL);
iconv_close(cd);
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
am_cv_func_iconv=yes
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
if test "$am_cv_func_iconv" != yes; then
am_save_LIBS="$LIBS"
LIBS="$LIBS -liconv"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include
#include
int
main ()
{
iconv_t cd = iconv_open("","");
iconv(cd,NULL,NULL,NULL,NULL);
iconv_close(cd);
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
am_cv_lib_iconv=yes
am_cv_func_iconv=yes
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LIBS="$am_save_LIBS"
fi
if test "$am_cv_func_iconv" != yes; then
am_save_LIBS="$LIBS"
am_save_CFLAGS="$CFLAGS"
am_save_LDFLAGS="$LDFLAGS"
LIBS="$LIBS -liconv"
LDFLAGS="$LDFLAGS -L/usr/local/lib"
CFLAGS="$CFLAGS -I/usr/local/include"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include
#include
int
main ()
{
iconv_t cd = iconv_open("","");
iconv(cd,NULL,NULL,NULL,NULL);
iconv_close(cd);
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
am_cv_lib_iconv=yes
am_cv_func_iconv=yes
CPPFLAGS="$CPPFLAGS -I/usr/local/include"
else
LDFLAGS="$am_save_LDFLAGS"
CFLAGS="$am_save_CFLAGS"
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LIBS="$am_save_LIBS"
fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv" >&5
$as_echo "$am_cv_func_iconv" >&6; }
if test "$am_cv_func_iconv" = yes; then
$as_echo "#define HAVE_ICONV 1" >>confdefs.h
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv declaration" >&5
$as_echo_n "checking for iconv declaration... " >&6; }
if ${am_cv_proto_iconv+:} false; then :
$as_echo_n "(cached) " >&6
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include
#include
extern
#ifdef __cplusplus
"C"
#endif
#if defined(__STDC__) || defined(__cplusplus)
size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);
#else
size_t iconv();
#endif
int
main ()
{
;
return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
am_cv_proto_iconv_arg1=""
else
am_cv_proto_iconv_arg1="const"
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"
fi
am_cv_proto_iconv=`echo "$am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'`
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: ${ac_t:-
}$am_cv_proto_iconv" >&5
$as_echo "${ac_t:-
}$am_cv_proto_iconv" >&6; }
cat >>confdefs.h <<_ACEOF
#define ICONV_CONST $am_cv_proto_iconv_arg1
_ACEOF
fi
LIBICONV=
if test "$am_cv_lib_iconv" = yes; then
LIBICONV="-liconv"
fi
#locating libexpat
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
$as_echo_n "checking how to run the C preprocessor... " >&6; }
# On Suns, sometimes $CPP names a directory.
if test -n "$CPP" && test -d "$CPP"; then
CPP=
fi
if test -z "$CPP"; then
if ${ac_cv_prog_CPP+:} false; then :
$as_echo_n "(cached) " >&6
else
# Double quotes because CPP needs to be expanded
for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
do
ac_preproc_ok=false
for ac_c_preproc_warn_flag in '' yes
do
# Use a header file that comes with gcc, so configuring glibc
# with a fresh cross-compiler works.
# Prefer to if __STDC__ is defined, since
# exists even on freestanding compilers.
# On the NeXT, cc -E runs the code through the compiler's parser,
# not just through cpp. "Syntax error" is here to catch this case.
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#ifdef __STDC__
# include
#else
# include
#endif
Syntax error
_ACEOF
if ac_fn_c_try_cpp "$LINENO"; then :
else
# Broken: fails on valid input.
continue
fi
rm -f conftest.err conftest.i conftest.$ac_ext
# OK, works on sane cases. Now check whether nonexistent headers
# can be detected and how.
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include
_ACEOF
if ac_fn_c_try_cpp "$LINENO"; then :
# Broken: success on invalid input.
continue
else
# Passes both tests.
ac_preproc_ok=:
break
fi
rm -f conftest.err conftest.i conftest.$ac_ext
done
# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
rm -f conftest.i conftest.err conftest.$ac_ext
if $ac_preproc_ok; then :
break
fi
done
ac_cv_prog_CPP=$CPP
fi
CPP=$ac_cv_prog_CPP
else
ac_cv_prog_CPP=$CPP
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
$as_echo "$CPP" >&6; }
ac_preproc_ok=false
for ac_c_preproc_warn_flag in '' yes
do
# Use a header file that comes with gcc, so configuring glibc
# with a fresh cross-compiler works.
# Prefer to if __STDC__ is defined, since
# exists even on freestanding compilers.
# On the NeXT, cc -E runs the code through the compiler's parser,
# not just through cpp. "Syntax error" is here to catch this case.
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#ifdef __STDC__
# include
#else
# include
#endif
Syntax error
_ACEOF
if ac_fn_c_try_cpp "$LINENO"; then :
else
# Broken: fails on valid input.
continue
fi
rm -f conftest.err conftest.i conftest.$ac_ext
# OK, works on sane cases. Now check whether nonexistent headers
# can be detected and how.
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include
_ACEOF
if ac_fn_c_try_cpp "$LINENO"; then :
# Broken: success on invalid input.
continue
else
# Passes both tests.
ac_preproc_ok=:
break
fi
rm -f conftest.err conftest.i conftest.$ac_ext
done
# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
rm -f conftest.i conftest.err conftest.$ac_ext
if $ac_preproc_ok; then :
else
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
See \`config.log' for more details" "$LINENO" 5; }
fi
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
if ${ac_cv_path_GREP+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -z "$GREP"; then
ac_path_GREP_found=false
# Loop through the user's path and test for each of PROGNAME-LIST
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_prog in grep ggrep; do
for ac_exec_ext in '' $ac_executable_extensions; do
ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
{ test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue
# Check for GNU ac_path_GREP and select it if it is found.
# Check for GNU $ac_path_GREP
case `"$ac_path_GREP" --version 2>&1` in
*GNU*)
ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
*)
ac_count=0
$as_echo_n 0123456789 >"conftest.in"
while :
do
cat "conftest.in" "conftest.in" >"conftest.tmp"
mv "conftest.tmp" "conftest.in"
cp "conftest.in" "conftest.nl"
$as_echo 'GREP' >> "conftest.nl"
"$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
as_fn_arith $ac_count + 1 && ac_count=$as_val
if test $ac_count -gt ${ac_path_GREP_max-0}; then
# Best one so far, save it but keep looking for a better one
ac_cv_path_GREP="$ac_path_GREP"
ac_path_GREP_max=$ac_count
fi
# 10*(2^10) chars as input seems more than enough
test $ac_count -gt 10 && break
done
rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
esac
$ac_path_GREP_found && break 3
done
done
done
IFS=$as_save_IFS
if test -z "$ac_cv_path_GREP"; then
as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
fi
else
ac_cv_path_GREP=$GREP
fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
$as_echo "$ac_cv_path_GREP" >&6; }
GREP="$ac_cv_path_GREP"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
$as_echo_n "checking for egrep... " >&6; }
if ${ac_cv_path_EGREP+:} false; then :
$as_echo_n "(cached) " >&6
else
if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
then ac_cv_path_EGREP="$GREP -E"
else
if test -z "$EGREP"; then
ac_path_EGREP_found=false
# Loop through the user's path and test for each of PROGNAME-LIST
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_prog in egrep; do
for ac_exec_ext in '' $ac_executable_extensions; do
ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
{ test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue
# Check for GNU ac_path_EGREP and select it if it is found.
# Check for GNU $ac_path_EGREP
case `"$ac_path_EGREP" --version 2>&1` in
*GNU*)
ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
*)
ac_count=0
$as_echo_n 0123456789 >"conftest.in"
while :
do
cat "conftest.in" "conftest.in" >"conftest.tmp"
mv "conftest.tmp" "conftest.in"
cp "conftest.in" "conftest.nl"
$as_echo 'EGREP' >> "conftest.nl"
"$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
as_fn_arith $ac_count + 1 && ac_count=$as_val
if test $ac_count -gt ${ac_path_EGREP_max-0}; then
# Best one so far, save it but keep looking for a better one
ac_cv_path_EGREP="$ac_path_EGREP"
ac_path_EGREP_max=$ac_count
fi
# 10*(2^10) chars as input seems more than enough
test $ac_count -gt 10 && break
done
rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
esac
$ac_path_EGREP_found && break 3
done
done
done
IFS=$as_save_IFS
if test -z "$ac_cv_path_EGREP"; then
as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
fi
else
ac_cv_path_EGREP=$EGREP
fi
fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
$as_echo "$ac_cv_path_EGREP" >&6; }
EGREP="$ac_cv_path_EGREP"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
$as_echo_n "checking for ANSI C header files... " >&6; }
if ${ac_cv_header_stdc+:} false; then :
$as_echo_n "(cached) " >&6
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include
#include
#include
#include
int
main ()
{
;
return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
ac_cv_header_stdc=yes
else
ac_cv_header_stdc=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
if test $ac_cv_header_stdc = yes; then
# SunOS 4.x string.h does not declare mem*, contrary to ANSI.
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include
_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
$EGREP "memchr" >/dev/null 2>&1; then :
else
ac_cv_header_stdc=no
fi
rm -f conftest*
fi
if test $ac_cv_header_stdc = yes; then
# ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include
_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
$EGREP "free" >/dev/null 2>&1; then :
else
ac_cv_header_stdc=no
fi
rm -f conftest*
fi
if test $ac_cv_header_stdc = yes; then
# /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
if test "$cross_compiling" = yes; then :
:
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include
#include
#if ((' ' & 0x0FF) == 0x020)
# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
#else
# define ISLOWER(c) \
(('a' <= (c) && (c) <= 'i') \
|| ('j' <= (c) && (c) <= 'r') \
|| ('s' <= (c) && (c) <= 'z'))
# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
#endif
#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
int
main ()
{
int i;
for (i = 0; i < 256; i++)
if (XOR (islower (i), ISLOWER (i))
|| toupper (i) != TOUPPER (i))
return 2;
return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
else
ac_cv_header_stdc=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
conftest.$ac_objext conftest.beam conftest.$ac_ext
fi
fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
$as_echo "$ac_cv_header_stdc" >&6; }
if test $ac_cv_header_stdc = yes; then
$as_echo "#define STDC_HEADERS 1" >>confdefs.h
fi
# On IRIX 5.3, sys/types and inttypes.h are conflicting.
for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
inttypes.h stdint.h unistd.h
do :
as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
"
if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
_ACEOF
fi
done
# Check whether --with-expat was given.
if test "${with_expat+set}" = set; then :
withval=$with_expat;
fi
EXPAT_CFLAGS=
EXPAT_LIBS=
if test x"$with_expat" != x; then
EXPAT_CFLAGS="-I$with_expat/include"
EXPAT_LIBS="-L$with_expat/lib"
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for XML_ParserCreate in -lexpat" >&5
$as_echo_n "checking for XML_ParserCreate in -lexpat... " >&6; }
if ${ac_cv_lib_expat_XML_ParserCreate+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lexpat "$EXPAT_LIBS" $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
#ifdef __cplusplus
extern "C"
#endif
char XML_ParserCreate ();
int
main ()
{
return XML_ParserCreate ();
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
ac_cv_lib_expat_XML_ParserCreate=yes
else
ac_cv_lib_expat_XML_ParserCreate=no
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_expat_XML_ParserCreate" >&5
$as_echo "$ac_cv_lib_expat_XML_ParserCreate" >&6; }
if test "x$ac_cv_lib_expat_XML_ParserCreate" = xyes; then :
EXPAT_LIBS="$EXPAT_LIBS -lexpat"
expat_found=yes
else
expat_found=no
fi
if test $expat_found = no; then
as_fn_error $? "Could not find development files of Expat library" "$LINENO" 5
fi
expat_save_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS $EXPAT_CFLAGS"
expat_save_CPPFLAGS="$CPPFLAGS"
CPPFLAGS="$CPPFLAGS $EXPAT_CFLAGS"
for ac_header in expat.h
do :
ac_fn_c_check_header_mongrel "$LINENO" "expat.h" "ac_cv_header_expat_h" "$ac_includes_default"
if test "x$ac_cv_header_expat_h" = xyes; then :
cat >>confdefs.h <<_ACEOF
#define HAVE_EXPAT_H 1
_ACEOF
else
expat_found=no
fi
done
if test $expat_found = no; then
as_fn_error $? "Could not find expat.h" "$LINENO" 5
fi
CFLAGS="$expat_save_CFLAGS"
CPPFLAGS="$expat_save_CPPFLAGS"
# Checks for typedefs, structures, and compiler characteristics.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5
$as_echo_n "checking for an ANSI C-conforming const... " >&6; }
if ${ac_cv_c_const+:} false; then :
$as_echo_n "(cached) " >&6
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
main ()
{
/* FIXME: Include the comments suggested by Paul. */
#ifndef __cplusplus
/* Ultrix mips cc rejects this. */
typedef int charset[2];
const charset cs;
/* SunOS 4.1.1 cc rejects this. */
char const *const *pcpcc;
char **ppc;
/* NEC SVR4.0.2 mips cc rejects this. */
struct point {int x, y;};
static struct point const zero = {0,0};
/* AIX XL C 1.02.0.0 rejects this.
It does not let you subtract one const X* pointer from another in
an arm of an if-expression whose if-part is not a constant
expression */
const char *g = "string";
pcpcc = &g + (g ? g-g : 0);
/* HPUX 7.0 cc rejects these. */
++pcpcc;
ppc = (char**) pcpcc;
pcpcc = (char const *const *) ppc;
{ /* SCO 3.2v4 cc rejects this. */
char *t;
char const *s = 0 ? (char *) 0 : (char const *) 0;
*t++ = 0;
if (s) return 0;
}
{ /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */
int x[] = {25, 17};
const int *foo = &x[0];
++foo;
}
{ /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */
typedef const int *iptr;
iptr p = 0;
++p;
}
{ /* AIX XL C 1.02.0.0 rejects this saying
"k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
struct s { int j; const int *ap[3]; };
struct s *b; b->j = 5;
}
{ /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
const int foo = 10;
if (!foo) return 0;
}
return !cs[0] && !zero.x;
#endif
;
return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
ac_cv_c_const=yes
else
ac_cv_c_const=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5
$as_echo "$ac_cv_c_const" >&6; }
if test $ac_cv_c_const = no; then
$as_echo "#define const /**/" >>confdefs.h
fi
# Check Erlang headers are installed
#AC_CHECK_HEADER(erl_driver.h,,[AC_MSG_ERROR([cannot find Erlang header files])])
# Change default prefix
# Checks for library functions.
for ac_header in stdlib.h
do :
ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default"
if test "x$ac_cv_header_stdlib_h" = xyes; then :
cat >>confdefs.h <<_ACEOF
#define HAVE_STDLIB_H 1
_ACEOF
fi
done
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU libc compatible malloc" >&5
$as_echo_n "checking for GNU libc compatible malloc... " >&6; }
if ${ac_cv_func_malloc_0_nonnull+:} false; then :
$as_echo_n "(cached) " >&6
else
if test "$cross_compiling" = yes; then :
ac_cv_func_malloc_0_nonnull=no
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#if defined STDC_HEADERS || defined HAVE_STDLIB_H
# include
#else
char *malloc ();
#endif
int
main ()
{
return ! malloc (0);
;
return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
ac_cv_func_malloc_0_nonnull=yes
else
ac_cv_func_malloc_0_nonnull=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
conftest.$ac_objext conftest.beam conftest.$ac_ext
fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_malloc_0_nonnull" >&5
$as_echo "$ac_cv_func_malloc_0_nonnull" >&6; }
if test $ac_cv_func_malloc_0_nonnull = yes; then :
$as_echo "#define HAVE_MALLOC 1" >>confdefs.h
else
$as_echo "#define HAVE_MALLOC 0" >>confdefs.h
case " $LIBOBJS " in
*" malloc.$ac_objext "* ) ;;
*) LIBOBJS="$LIBOBJS malloc.$ac_objext"
;;
esac
$as_echo "#define malloc rpl_malloc" >>confdefs.h
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
$as_echo_n "checking for ANSI C header files... " >&6; }
if ${ac_cv_header_stdc+:} false; then :
$as_echo_n "(cached) " >&6
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include
#include
#include
#include
int
main ()
{
;
return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
ac_cv_header_stdc=yes
else
ac_cv_header_stdc=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
if test $ac_cv_header_stdc = yes; then
# SunOS 4.x string.h does not declare mem*, contrary to ANSI.
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include
_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
$EGREP "memchr" >/dev/null 2>&1; then :
else
ac_cv_header_stdc=no
fi
rm -f conftest*
fi
if test $ac_cv_header_stdc = yes; then
# ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include
_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
$EGREP "free" >/dev/null 2>&1; then :
else
ac_cv_header_stdc=no
fi
rm -f conftest*
fi
if test $ac_cv_header_stdc = yes; then
# /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
if test "$cross_compiling" = yes; then :
:
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include
#include
#if ((' ' & 0x0FF) == 0x020)
# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
#else
# define ISLOWER(c) \
(('a' <= (c) && (c) <= 'i') \
|| ('j' <= (c) && (c) <= 'r') \
|| ('s' <= (c) && (c) <= 'z'))
# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
#endif
#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
int
main ()
{
int i;
for (i = 0; i < 256; i++)
if (XOR (islower (i), ISLOWER (i))
|| toupper (i) != TOUPPER (i))
return 2;
return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
else
ac_cv_header_stdc=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
conftest.$ac_objext conftest.beam conftest.$ac_ext
fi
fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
$as_echo "$ac_cv_header_stdc" >&6; }
if test $ac_cv_header_stdc = yes; then
$as_echo "#define STDC_HEADERS 1" >>confdefs.h
fi
mod_irc=
make_mod_irc=
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build mod_irc" >&5
$as_echo_n "checking whether build mod_irc... " >&6; }
# Check whether --enable-mod_irc was given.
if test "${enable_mod_irc+set}" = set; then :
enableval=$enable_mod_irc; mr_enable_mod_irc="$enableval"
else
mr_enable_mod_irc=yes
fi
if test "$mr_enable_mod_irc" = "yes"; then
mod_irc=mod_irc
make_mod_irc=mod_irc/Makefile
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $mr_enable_mod_irc" >&5
$as_echo "$mr_enable_mod_irc" >&6; }
mod_muc=
make_mod_muc=
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build mod_muc" >&5
$as_echo_n "checking whether build mod_muc... " >&6; }
# Check whether --enable-mod_muc was given.
if test "${enable_mod_muc+set}" = set; then :
enableval=$enable_mod_muc; mr_enable_mod_muc="$enableval"
else
mr_enable_mod_muc=yes
fi
if test "$mr_enable_mod_muc" = "yes"; then
mod_muc=mod_muc
make_mod_muc=mod_muc/Makefile
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $mr_enable_mod_muc" >&5
$as_echo "$mr_enable_mod_muc" >&6; }
mod_proxy65=
make_mod_proxy65=
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build mod_proxy65" >&5
$as_echo_n "checking whether build mod_proxy65... " >&6; }
# Check whether --enable-mod_proxy65 was given.
if test "${enable_mod_proxy65+set}" = set; then :
enableval=$enable_mod_proxy65; mr_enable_mod_proxy65="$enableval"
else
mr_enable_mod_proxy65=yes
fi
if test "$mr_enable_mod_proxy65" = "yes"; then
mod_proxy65=mod_proxy65
make_mod_proxy65=mod_proxy65/Makefile
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $mr_enable_mod_proxy65" >&5
$as_echo "$mr_enable_mod_proxy65" >&6; }
mod_pubsub=
make_mod_pubsub=
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build mod_pubsub" >&5
$as_echo_n "checking whether build mod_pubsub... " >&6; }
# Check whether --enable-mod_pubsub was given.
if test "${enable_mod_pubsub+set}" = set; then :
enableval=$enable_mod_pubsub; mr_enable_mod_pubsub="$enableval"
else
mr_enable_mod_pubsub=yes
fi
if test "$mr_enable_mod_pubsub" = "yes"; then
mod_pubsub=mod_pubsub
make_mod_pubsub=mod_pubsub/Makefile
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $mr_enable_mod_pubsub" >&5
$as_echo "$mr_enable_mod_pubsub" >&6; }
eldap=
make_eldap=
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build eldap" >&5
$as_echo_n "checking whether build eldap... " >&6; }
# Check whether --enable-eldap was given.
if test "${enable_eldap+set}" = set; then :
enableval=$enable_eldap; mr_enable_eldap="$enableval"
else
mr_enable_eldap=yes
fi
if test "$mr_enable_eldap" = "yes"; then
eldap=eldap
make_eldap=eldap/Makefile
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $mr_enable_eldap" >&5
$as_echo "$mr_enable_eldap" >&6; }
odbc=
make_odbc=
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build odbc" >&5
$as_echo_n "checking whether build odbc... " >&6; }
# Check whether --enable-odbc was given.
if test "${enable_odbc+set}" = set; then :
enableval=$enable_odbc; mr_enable_odbc="$enableval"
else
mr_enable_odbc=no
fi
if test "$mr_enable_odbc" = "yes"; then
odbc=odbc
make_odbc=odbc/Makefile
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $mr_enable_odbc" >&5
$as_echo "$mr_enable_odbc" >&6; }
tls=
make_tls=
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build tls" >&5
$as_echo_n "checking whether build tls... " >&6; }
# Check whether --enable-tls was given.
if test "${enable_tls+set}" = set; then :
enableval=$enable_tls; mr_enable_tls="$enableval"
else
mr_enable_tls=yes
fi
if test "$mr_enable_tls" = "yes"; then
tls=tls
make_tls=tls/Makefile
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $mr_enable_tls" >&5
$as_echo "$mr_enable_tls" >&6; }
web=
make_web=
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build web" >&5
$as_echo_n "checking whether build web... " >&6; }
# Check whether --enable-web was given.
if test "${enable_web+set}" = set; then :
enableval=$enable_web; mr_enable_web="$enableval"
else
mr_enable_web=yes
fi
if test "$mr_enable_web" = "yes"; then
web=web
make_web=web/Makefile
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $mr_enable_web" >&5
$as_echo "$mr_enable_web" >&6; }
ejabberd_zlib=
make_ejabberd_zlib=
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build ejabberd_zlib" >&5
$as_echo_n "checking whether build ejabberd_zlib... " >&6; }
# Check whether --enable-ejabberd_zlib was given.
if test "${enable_ejabberd_zlib+set}" = set; then :
enableval=$enable_ejabberd_zlib; mr_enable_ejabberd_zlib="$enableval"
else
mr_enable_ejabberd_zlib=yes
fi
if test "$mr_enable_ejabberd_zlib" = "yes"; then
ejabberd_zlib=ejabberd_zlib
make_ejabberd_zlib=ejabberd_zlib/Makefile
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $mr_enable_ejabberd_zlib" >&5
$as_echo "$mr_enable_ejabberd_zlib" >&6; }
#locating zlib
# Check whether --with-zlib was given.
if test "${with_zlib+set}" = set; then :
withval=$with_zlib;
fi
if test x"$ejabberd_zlib" != x; then
ZLIB_CFLAGS=
ZLIB_LIBS=
if test x"$with_zlib" != x; then
ZLIB_CFLAGS="-I$with_zlib/include"
ZLIB_LIBS="-L$with_zlib/lib"
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for gzgets in -lz" >&5
$as_echo_n "checking for gzgets in -lz... " >&6; }
if ${ac_cv_lib_z_gzgets+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lz "$ZLIB_LIBS" $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
#ifdef __cplusplus
extern "C"
#endif
char gzgets ();
int
main ()
{
return gzgets ();
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
ac_cv_lib_z_gzgets=yes
else
ac_cv_lib_z_gzgets=no
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_gzgets" >&5
$as_echo "$ac_cv_lib_z_gzgets" >&6; }
if test "x$ac_cv_lib_z_gzgets" = xyes; then :
ZLIB_LIBS="$ZLIB_LIBS -lz"
zlib_found=yes
else
zlib_found=no
fi
if test $zlib_found = no; then
as_fn_error $? "Could not find development files of zlib library. Install them or disable \`ejabberd_zlib' with: --disable-ejabberd_zlib" "$LINENO" 5
fi
zlib_save_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS $ZLIB_CFLAGS"
zlib_save_CPPFLAGS="$CFLAGS"
CPPFLAGS="$CPPFLAGS $ZLIB_CFLAGS"
for ac_header in zlib.h
do :
ac_fn_c_check_header_mongrel "$LINENO" "zlib.h" "ac_cv_header_zlib_h" "$ac_includes_default"
if test "x$ac_cv_header_zlib_h" = xyes; then :
cat >>confdefs.h <<_ACEOF
#define HAVE_ZLIB_H 1
_ACEOF
else
zlib_found=no
fi
done
if test $zlib_found = no; then
as_fn_error $? "Could not find zlib.h. Install it or disable \`ejabberd_zlib' with: --disable-ejabberd_zlib" "$LINENO" 5
fi
CFLAGS="$zlib_save_CFLAGS"
CPPFLAGS="$zlib_save_CPPFLAGS"
fi
pam=
make_pam=
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build pam" >&5
$as_echo_n "checking whether build pam... " >&6; }
# Check whether --enable-pam was given.
if test "${enable_pam+set}" = set; then :
enableval=$enable_pam; mr_enable_pam="$enableval"
else
mr_enable_pam=no
fi
if test "$mr_enable_pam" = "yes"; then
pam=pam
make_pam=pam/Makefile
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $mr_enable_pam" >&5
$as_echo "$mr_enable_pam" >&6; }
#locating PAM
# Check whether --with-pam was given.
if test "${with_pam+set}" = set; then :
withval=$with_pam;
fi
if test x"$pam" != x; then
PAM_CFLAGS=
PAM_LIBS=
if test x"$with_pam" != x; then
PAM_CFLAGS="-I$with_pam/include"
PAM_LIBS="-L$with_pam/lib"
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for pam_start in -lpam" >&5
$as_echo_n "checking for pam_start in -lpam... " >&6; }
if ${ac_cv_lib_pam_pam_start+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lpam "$PAM_LIBS" $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
#ifdef __cplusplus
extern "C"
#endif
char pam_start ();
int
main ()
{
return pam_start ();
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
ac_cv_lib_pam_pam_start=yes
else
ac_cv_lib_pam_pam_start=no
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pam_pam_start" >&5
$as_echo "$ac_cv_lib_pam_pam_start" >&6; }
if test "x$ac_cv_lib_pam_pam_start" = xyes; then :
PAM_LIBS="$PAM_LIBS -lpam"
pam_found=yes
else
pam_found=no
fi
if test $pam_found = no; then
as_fn_error $? "Could not find development files of PAM library. Install them or disable \`pam' with: --disable-pam" "$LINENO" 5
fi
pam_save_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS $PAM_CFLAGS"
pam_save_CPPFLAGS="$CPPFLAGS"
CPPFLAGS="$CPPFLAGS $PAM_CFLAGS"
for ac_header in security/pam_appl.h
do :
ac_fn_c_check_header_mongrel "$LINENO" "security/pam_appl.h" "ac_cv_header_security_pam_appl_h" "$ac_includes_default"
if test "x$ac_cv_header_security_pam_appl_h" = xyes; then :
cat >>confdefs.h <<_ACEOF
#define HAVE_SECURITY_PAM_APPL_H 1
_ACEOF
else
pam_found=no
fi
done
if test $pam_found = no; then
as_fn_error $? "Could not find security/pam_appl.h. Install it or disable \`pam' with: --disable-pam" "$LINENO" 5
fi
CFLAGS="$pam_save_CFLAGS"
CPPFLAGS="$pam_save_CPPFLAGS"
fi
# Check whether --enable-hipe was given.
if test "${enable_hipe+set}" = set; then :
enableval=$enable_hipe; case "${enableval}" in
yes) hipe=true ;;
no) hipe=false ;;
*) as_fn_error $? "bad value ${enableval} for --enable-hipe" "$LINENO" 5 ;;
esac
else
hipe=false
fi
# Check whether --enable-roster_gateway_workaround was given.
if test "${enable_roster_gateway_workaround+set}" = set; then :
enableval=$enable_roster_gateway_workaround; case "${enableval}" in
yes) roster_gateway_workaround=true ;;
no) roster_gateway_workaround=false ;;
*) as_fn_error $? "bad value ${enableval} for --enable-roster-gateway-workaround" "$LINENO" 5 ;;
esac
else
roster_gateway_workaround=false
fi
# Check whether --enable-mssql was given.
if test "${enable_mssql+set}" = set; then :
enableval=$enable_mssql; case "${enableval}" in
yes) db_type=mssql ;;
no) db_type=generic ;;
*) as_fn_error $? "bad value ${enableval} for --enable-mssql" "$LINENO" 5 ;;
esac
else
db_type=generic
fi
# Check whether --enable-transient_supervisors was given.
if test "${enable_transient_supervisors+set}" = set; then :
enableval=$enable_transient_supervisors; case "${enableval}" in
yes) transient_supervisors=true ;;
no) transient_supervisors=false ;;
*) as_fn_error $? "bad value ${enableval} for --enable-transient_supervisors" "$LINENO" 5 ;;
esac
else
transient_supervisors=true
fi
# Check whether --enable-full_xml was given.
if test "${enable_full_xml+set}" = set; then :
enableval=$enable_full_xml; case "${enableval}" in
yes) full_xml=true ;;
no) full_xml=false ;;
*) as_fn_error $? "bad value ${enableval} for --enable-full-xml" "$LINENO" 5 ;;
esac
else
full_xml=false
fi
# Check whether --enable-nif was given.
if test "${enable_nif+set}" = set; then :
enableval=$enable_nif; case "${enableval}" in
yes) nif=true ;;
no) nif=false ;;
*) as_fn_error $? "bad value ${enableval} for --enable-nif" "$LINENO" 5 ;;
esac
else
nif=false
fi
ac_config_files="$ac_config_files Makefile $make_mod_irc $make_mod_muc $make_mod_pubsub $make_mod_proxy65 $make_eldap $make_pam $make_web stringprep/Makefile stun/Makefile $make_tls $make_odbc $make_ejabberd_zlib"
#openssl
# Check whether --with-openssl was given.
if test "${with_openssl+set}" = set; then :
withval=$with_openssl;
fi
unset SSL_LIBS;
unset SSL_CFLAGS;
have_openssl=no
if test x"$tls" != x; then
for ssl_prefix in $withval /usr/local/ssl /usr/lib/ssl /usr/ssl /usr/pkg /usr/local /usr; do
printf "looking for openssl in $ssl_prefix...\n"
SSL_CFLAGS="-I$ssl_prefix/include"
SSL_LIBS="-L$ssl_prefix/lib -lcrypto"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for SSL_new in -lssl" >&5
$as_echo_n "checking for SSL_new in -lssl... " >&6; }
if ${ac_cv_lib_ssl_SSL_new+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lssl $SSL_LIBS $SSL_CFLAGS $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
#ifdef __cplusplus
extern "C"
#endif
char SSL_new ();
int
main ()
{
return SSL_new ();
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
ac_cv_lib_ssl_SSL_new=yes
else
ac_cv_lib_ssl_SSL_new=no
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ssl_SSL_new" >&5
$as_echo "$ac_cv_lib_ssl_SSL_new" >&6; }
if test "x$ac_cv_lib_ssl_SSL_new" = xyes; then :
have_openssl=yes
else
have_openssl=no
fi
if test x"$have_openssl" = xyes; then
save_CPPFLAGS=$CPPFLAGS
CPPFLAGS="-I$ssl_prefix/include $CPPFLAGS"
for ac_header in openssl/ssl.h
do :
ac_fn_c_check_header_mongrel "$LINENO" "openssl/ssl.h" "ac_cv_header_openssl_ssl_h" "$ac_includes_default"
if test "x$ac_cv_header_openssl_ssl_h" = xyes; then :
cat >>confdefs.h <<_ACEOF
#define HAVE_OPENSSL_SSL_H 1
_ACEOF
have_openssl_h=yes
fi
done
CPPFLAGS=$save_CPPFLAGS
if test x"$have_openssl_h" = xyes; then
have_openssl=yes
printf "openssl found in $ssl_prefix\n";
SSL_LIBS="-L$ssl_prefix/lib -lssl -lcrypto"
CPPFLAGS="-I$ssl_prefix/include $CPPFLAGS"
SSL_CFLAGS="-DHAVE_SSL"
break
fi
else
# Clear this from the autoconf cache, so in the next pass of
# this loop with different -L arguments, it will test again.
unset ac_cv_lib_ssl_SSL_new
fi
done
if test x${have_openssl} != xyes; then
as_fn_error $? "Could not find development files of OpenSSL library. Install them or disable \`tls' with: --disable-tls" "$LINENO" 5
fi
fi
# If ssl is kerberized it need krb5.h
# On RedHat and OpenBSD, krb5.h is in an unsual place:
KRB5_INCLUDE="`krb5-config --cflags 2>/dev/null`"
if test -n "$KRB5_INCLUDE" ; then
CPPFLAGS="$CPPFLAGS $KRB5_INCLUDE"
else
# For RedHat For BSD
for D in /usr/kerberos/include /usr/include/kerberos /usr/include/kerberosV
do
if test -d $D ; then
CPPFLAGS="$CPPFLAGS -I$D"
fi
done
fi
ac_fn_c_check_header_mongrel "$LINENO" "krb5.h" "ac_cv_header_krb5_h" "$ac_includes_default"
if test "x$ac_cv_header_krb5_h" = xyes; then :
fi
ENABLEUSER=""
# Check whether --enable-user was given.
if test "${enable_user+set}" = set; then :
enableval=$enable_user; case "${enableval}" in
yes) ENABLEUSER=`whoami` ;;
no) ENABLEUSER="" ;;
*) ENABLEUSER=$enableval
esac
fi
if test "$ENABLEUSER" != ""; then
echo "allow this system user to start ejabberd: $ENABLEUSER"
INSTALLUSER=$ENABLEUSER
fi
ac_fn_c_check_header_mongrel "$LINENO" "openssl/md2.h" "ac_cv_header_openssl_md2_h" "$ac_includes_default"
if test "x$ac_cv_header_openssl_md2_h" = xyes; then :
md2=true
else
md2=false
fi
ac_aux_dir=
for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
if test -f "$ac_dir/install-sh"; then
ac_aux_dir=$ac_dir
ac_install_sh="$ac_aux_dir/install-sh -c"
break
elif test -f "$ac_dir/install.sh"; then
ac_aux_dir=$ac_dir
ac_install_sh="$ac_aux_dir/install.sh -c"
break
elif test -f "$ac_dir/shtool"; then
ac_aux_dir=$ac_dir
ac_install_sh="$ac_aux_dir/shtool install -c"
break
fi
done
if test -z "$ac_aux_dir"; then
as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5
fi
# These three variables are undocumented and unsupported,
# and are intended to be withdrawn in a future Autoconf release.
# They can cause serious problems if a builder's source tree is in a directory
# whose full name contains unusual characters.
ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var.
ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var.
ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var.
# Make sure we can run config.sub.
$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
$as_echo_n "checking build system type... " >&6; }
if ${ac_cv_build+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_build_alias=$build_alias
test "x$ac_build_alias" = x &&
ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
test "x$ac_build_alias" = x &&
as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
$as_echo "$ac_cv_build" >&6; }
case $ac_cv_build in
*-*-*) ;;
*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
esac
build=$ac_cv_build
ac_save_IFS=$IFS; IFS='-'
set x $ac_cv_build
shift
build_cpu=$1
build_vendor=$2
shift; shift
# Remember, the first character of IFS is used to create $*,
# except with old shells:
build_os=$*
IFS=$ac_save_IFS
case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
$as_echo_n "checking host system type... " >&6; }
if ${ac_cv_host+:} false; then :
$as_echo_n "(cached) " >&6
else
if test "x$host_alias" = x; then
ac_cv_host=$ac_cv_build
else
ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
$as_echo "$ac_cv_host" >&6; }
case $ac_cv_host in
*-*-*) ;;
*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
esac
host=$ac_cv_host
ac_save_IFS=$IFS; IFS='-'
set x $ac_cv_host
shift
host_cpu=$1
host_vendor=$2
shift; shift
# Remember, the first character of IFS is used to create $*,
# except with old shells:
host_os=$*
IFS=$ac_save_IFS
case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking target system type" >&5
$as_echo_n "checking target system type... " >&6; }
if ${ac_cv_target+:} false; then :
$as_echo_n "(cached) " >&6
else
if test "x$target_alias" = x; then
ac_cv_target=$ac_cv_host
else
ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` ||
as_fn_error $? "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5
fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5
$as_echo "$ac_cv_target" >&6; }
case $ac_cv_target in
*-*-*) ;;
*) as_fn_error $? "invalid value of canonical target" "$LINENO" 5;;
esac
target=$ac_cv_target
ac_save_IFS=$IFS; IFS='-'
set x $ac_cv_target
shift
target_cpu=$1
target_vendor=$2
shift; shift
# Remember, the first character of IFS is used to create $*,
# except with old shells:
target_os=$*
IFS=$ac_save_IFS
case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac
# The aliases save the names the user supplied, while $host etc.
# will get canonicalized.
test -n "$target_alias" &&
test "$program_prefix$program_suffix$program_transform_name" = \
NONENONEs,x,x, &&
program_prefix=${target_alias}-
#AC_DEFINE_UNQUOTED(CPU_VENDOR_OS, "$target")
#AC_SUBST(target_os)
case "$target_os" in
*darwin10*)
echo "Target OS is 'Darwin10'"
ac_ext=erl
ac_compile='$ERLC $ERLCFLAGS -b beam conftest.$ac_ext >&5'
ac_link='$ERLC $ERLCFLAGS -b beam conftest.$ac_ext >&5 && echo "#!/bin/sh" > conftest$ac_exeext && $as_echo "\"$ERL\" -run conftest start -run init stop -noshell" >> conftest$ac_exeext && chmod +x conftest$ac_exeext'
if test -n "$ERLC"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for erlc" >&5
$as_echo_n "checking for erlc... " >&6; }
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ERLC" >&5
$as_echo "$ERLC" >&6; }
else
if test -n "$ac_tool_prefix"; then
# Extract the first word of "${ac_tool_prefix}erlc", so it can be a program name with args.
set dummy ${ac_tool_prefix}erlc; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_path_ERLC+:} false; then :
$as_echo_n "(cached) " >&6
else
case $ERLC in
[\\/]* | ?:[\\/]*)
ac_cv_path_ERLC="$ERLC" # Let the user override the test with a path.
;;
*)
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
ac_cv_path_ERLC="$as_dir/$ac_word$ac_exec_ext"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
;;
esac
fi
ERLC=$ac_cv_path_ERLC
if test -n "$ERLC"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ERLC" >&5
$as_echo "$ERLC" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
fi
if test -z "$ac_cv_path_ERLC"; then
ac_pt_ERLC=$ERLC
# Extract the first word of "erlc", so it can be a program name with args.
set dummy erlc; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_path_ac_pt_ERLC+:} false; then :
$as_echo_n "(cached) " >&6
else
case $ac_pt_ERLC in
[\\/]* | ?:[\\/]*)
ac_cv_path_ac_pt_ERLC="$ac_pt_ERLC" # Let the user override the test with a path.
;;
*)
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
ac_cv_path_ac_pt_ERLC="$as_dir/$ac_word$ac_exec_ext"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
;;
esac
fi
ac_pt_ERLC=$ac_cv_path_ac_pt_ERLC
if test -n "$ac_pt_ERLC"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_ERLC" >&5
$as_echo "$ac_pt_ERLC" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
if test "x$ac_pt_ERLC" = x; then
ERLC=""
else
case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
ERLC=$ac_pt_ERLC
fi
else
ERLC="$ac_cv_path_ERLC"
fi
fi
if test "$cross_compiling" = yes; then :
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "cannot run test program while cross compiling
See \`config.log' for more details" "$LINENO" 5; }
else
cat > conftest.$ac_ext <<_ACEOF
-module(conftest).
-export([start/0]).
start() ->
halt(case erlang:system_info(wordsize) of
8 -> 0; 4 -> 1 end)
.
_ACEOF
if ac_fn_erl_try_run "$LINENO"; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: found 64-bit Erlang" >&5
$as_echo "$as_me: found 64-bit Erlang" >&6;}
CBIT=-m64
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: found 32-bit Erlang" >&5
$as_echo "$as_me: found 32-bit Erlang" >&6;}
CBIT=-m32
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
conftest.$ac_objext conftest.beam conftest.$ac_ext
fi
;;
*)
echo "Target OS is '$target_os'"
CBIT=""
;;
esac
CFLAGS="$CFLAGS $CBIT"
LD_SHARED="$LD_SHARED $CBIT"
echo "CBIT is set to '$CBIT'"
cat >confcache <<\_ACEOF
# This file is a shell script that caches the results of configure
# tests run on this system so they can be shared between configure
# scripts and configure runs, see configure's option --config-cache.
# It is not useful on other systems. If it contains results you don't
# want to keep, you may remove or edit it.
#
# config.status only pays attention to the cache file if you give it
# the --recheck option to rerun configure.
#
# `ac_cv_env_foo' variables (set or unset) will be overridden when
# loading this file, other *unset* `ac_cv_foo' will be assigned the
# following values.
_ACEOF
# The following way of writing the cache mishandles newlines in values,
# but we know of no workaround that is simple, portable, and efficient.
# So, we kill variables containing newlines.
# Ultrix sh set writes to stderr and can't be redirected directly,
# and sets the high bit in the cache file unless we assign to the vars.
(
for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
eval ac_val=\$$ac_var
case $ac_val in #(
*${as_nl}*)
case $ac_var in #(
*_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
esac
case $ac_var in #(
_ | IFS | as_nl) ;; #(
BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
*) { eval $ac_var=; unset $ac_var;} ;;
esac ;;
esac
done
(set) 2>&1 |
case $as_nl`(ac_space=' '; set) 2>&1` in #(
*${as_nl}ac_space=\ *)
# `set' does not quote correctly, so add quotes: double-quote
# substitution turns \\\\ into \\, and sed turns \\ into \.
sed -n \
"s/'/'\\\\''/g;
s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
;; #(
*)
# `set' quotes correctly as required by POSIX, so do not add quotes.
sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
;;
esac |
sort
) |
sed '
/^ac_cv_env_/b end
t clear
:clear
s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
t end
s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
:end' >>confcache
if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
if test -w "$cache_file"; then
if test "x$cache_file" != "x/dev/null"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
$as_echo "$as_me: updating cache $cache_file" >&6;}
if test ! -f "$cache_file" || test -h "$cache_file"; then
cat confcache >"$cache_file"
else
case $cache_file in #(
*/* | ?:*)
mv -f confcache "$cache_file"$$ &&
mv -f "$cache_file"$$ "$cache_file" ;; #(
*)
mv -f confcache "$cache_file" ;;
esac
fi
fi
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
fi
fi
rm -f confcache
test "x$prefix" = xNONE && prefix=$ac_default_prefix
# Let make expand exec_prefix.
test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
# Transform confdefs.h into DEFS.
# Protect against shell expansion while executing Makefile rules.
# Protect against Makefile macro expansion.
#
# If the first sed substitution is executed (which looks for macros that
# take arguments), then branch to the quote section. Otherwise,
# look for a macro that doesn't take arguments.
ac_script='
:mline
/\\$/{
N
s,\\\n,,
b mline
}
t clear
:clear
s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g
t quote
s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g
t quote
b any
:quote
s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g
s/\[/\\&/g
s/\]/\\&/g
s/\$/$$/g
H
:any
${
g
s/^\n//
s/\n/ /g
p
}
'
DEFS=`sed -n "$ac_script" confdefs.h`
ac_libobjs=
ac_ltlibobjs=
U=
for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
# 1. Remove the extension, and $U if already installed.
ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
# 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR
# will be set to the directory where LIBOBJS objects are built.
as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'
done
LIBOBJS=$ac_libobjs
LTLIBOBJS=$ac_ltlibobjs
: "${CONFIG_STATUS=./config.status}"
ac_write_fail=0
ac_clean_files_save=$ac_clean_files
ac_clean_files="$ac_clean_files $CONFIG_STATUS"
{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
as_write_fail=0
cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
#! $SHELL
# Generated by $as_me.
# Run this file to recreate the current configuration.
# Compiler output produced by configure, useful for debugging
# configure, is in config.log if it exists.
debug=false
ac_cs_recheck=false
ac_cs_silent=false
SHELL=\${CONFIG_SHELL-$SHELL}
export SHELL
_ASEOF
cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
## -------------------- ##
## M4sh Initialization. ##
## -------------------- ##
# Be more Bourne compatible
DUALCASE=1; export DUALCASE # for MKS sh
if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
emulate sh
NULLCMD=:
# Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
# is contrary to our usage. Disable this feature.
alias -g '${1+"$@"}'='"$@"'
setopt NO_GLOB_SUBST
else
case `(set -o) 2>/dev/null` in #(
*posix*) :
set -o posix ;; #(
*) :
;;
esac
fi
as_nl='
'
export as_nl
# Printing a long string crashes Solaris 7 /usr/bin/printf.
as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
# Prefer a ksh shell builtin over an external printf program on Solaris,
# but without wasting forks for bash or zsh.
if test -z "$BASH_VERSION$ZSH_VERSION" \
&& (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
as_echo='print -r --'
as_echo_n='print -rn --'
elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
as_echo='printf %s\n'
as_echo_n='printf %s'
else
if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
as_echo_n='/usr/ucb/echo -n'
else
as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
as_echo_n_body='eval
arg=$1;
case $arg in #(
*"$as_nl"*)
expr "X$arg" : "X\\(.*\\)$as_nl";
arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
esac;
expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
'
export as_echo_n_body
as_echo_n='sh -c $as_echo_n_body as_echo'
fi
export as_echo_body
as_echo='sh -c $as_echo_body as_echo'
fi
# The user is always right.
if test "${PATH_SEPARATOR+set}" != set; then
PATH_SEPARATOR=:
(PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
(PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
PATH_SEPARATOR=';'
}
fi
# IFS
# We need space, tab and new line, in precisely that order. Quoting is
# there to prevent editors from complaining about space-tab.
# (If _AS_PATH_WALK were called with IFS unset, it would disable word
# splitting by setting IFS to empty value.)
IFS=" "" $as_nl"
# Find who we are. Look in the path if we contain no directory separator.
as_myself=
case $0 in #((
*[\\/]* ) as_myself=$0 ;;
*) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
done
IFS=$as_save_IFS
;;
esac
# We did not find ourselves, most probably we were run as `sh COMMAND'
# in which case we are not to be found in the path.
if test "x$as_myself" = x; then
as_myself=$0
fi
if test ! -f "$as_myself"; then
$as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
exit 1
fi
# Unset variables that we do not need and which cause bugs (e.g. in
# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1"
# suppresses any "Segmentation fault" message there. '((' could
# trigger a bug in pdksh 5.2.14.
for as_var in BASH_ENV ENV MAIL MAILPATH
do eval test x\${$as_var+set} = xset \
&& ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
done
PS1='$ '
PS2='> '
PS4='+ '
# NLS nuisances.
LC_ALL=C
export LC_ALL
LANGUAGE=C
export LANGUAGE
# CDPATH.
(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
# as_fn_error STATUS ERROR [LINENO LOG_FD]
# ----------------------------------------
# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
# script with STATUS, using 1 if that was 0.
as_fn_error ()
{
as_status=$1; test $as_status -eq 0 && as_status=1
if test "$4"; then
as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
$as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
fi
$as_echo "$as_me: error: $2" >&2
as_fn_exit $as_status
} # as_fn_error
# as_fn_set_status STATUS
# -----------------------
# Set $? to STATUS, without forking.
as_fn_set_status ()
{
return $1
} # as_fn_set_status
# as_fn_exit STATUS
# -----------------
# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
as_fn_exit ()
{
set +e
as_fn_set_status $1
exit $1
} # as_fn_exit
# as_fn_unset VAR
# ---------------
# Portably unset VAR.
as_fn_unset ()
{
{ eval $1=; unset $1;}
}
as_unset=as_fn_unset
# as_fn_append VAR VALUE
# ----------------------
# Append the text in VALUE to the end of the definition contained in VAR. Take
# advantage of any shell optimizations that allow amortized linear growth over
# repeated appends, instead of the typical quadratic growth present in naive
# implementations.
if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
eval 'as_fn_append ()
{
eval $1+=\$2
}'
else
as_fn_append ()
{
eval $1=\$$1\$2
}
fi # as_fn_append
# as_fn_arith ARG...
# ------------------
# Perform arithmetic evaluation on the ARGs, and store the result in the
# global $as_val. Take advantage of shells that can avoid forks. The arguments
# must be portable across $(()) and expr.
if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
eval 'as_fn_arith ()
{
as_val=$(( $* ))
}'
else
as_fn_arith ()
{
as_val=`expr "$@" || test $? -eq 1`
}
fi # as_fn_arith
if expr a : '\(a\)' >/dev/null 2>&1 &&
test "X`expr 00001 : '.*\(...\)'`" = X001; then
as_expr=expr
else
as_expr=false
fi
if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
as_basename=basename
else
as_basename=false
fi
if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
as_dirname=dirname
else
as_dirname=false
fi
as_me=`$as_basename -- "$0" ||
$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
X"$0" : 'X\(//\)$' \| \
X"$0" : 'X\(/\)' \| . 2>/dev/null ||
$as_echo X/"$0" |
sed '/^.*\/\([^/][^/]*\)\/*$/{
s//\1/
q
}
/^X\/\(\/\/\)$/{
s//\1/
q
}
/^X\/\(\/\).*/{
s//\1/
q
}
s/.*/./; q'`
# Avoid depending upon Character Ranges.
as_cr_letters='abcdefghijklmnopqrstuvwxyz'
as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
as_cr_Letters=$as_cr_letters$as_cr_LETTERS
as_cr_digits='0123456789'
as_cr_alnum=$as_cr_Letters$as_cr_digits
ECHO_C= ECHO_N= ECHO_T=
case `echo -n x` in #(((((
-n*)
case `echo 'xy\c'` in
*c*) ECHO_T=' ';; # ECHO_T is single tab character.
xy) ECHO_C='\c';;
*) echo `echo ksh88 bug on AIX 6.1` > /dev/null
ECHO_T=' ';;
esac;;
*)
ECHO_N='-n';;
esac
rm -f conf$$ conf$$.exe conf$$.file
if test -d conf$$.dir; then
rm -f conf$$.dir/conf$$.file
else
rm -f conf$$.dir
mkdir conf$$.dir 2>/dev/null
fi
if (echo >conf$$.file) 2>/dev/null; then
if ln -s conf$$.file conf$$ 2>/dev/null; then
as_ln_s='ln -s'
# ... but there are two gotchas:
# 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
# 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
# In both cases, we have to default to `cp -p'.
ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
as_ln_s='cp -p'
elif ln conf$$.file conf$$ 2>/dev/null; then
as_ln_s=ln
else
as_ln_s='cp -p'
fi
else
as_ln_s='cp -p'
fi
rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
rmdir conf$$.dir 2>/dev/null
# as_fn_mkdir_p
# -------------
# Create "$as_dir" as a directory, including parents if necessary.
as_fn_mkdir_p ()
{
case $as_dir in #(
-*) as_dir=./$as_dir;;
esac
test -d "$as_dir" || eval $as_mkdir_p || {
as_dirs=
while :; do
case $as_dir in #(
*\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
*) as_qdir=$as_dir;;
esac
as_dirs="'$as_qdir' $as_dirs"
as_dir=`$as_dirname -- "$as_dir" ||
$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
X"$as_dir" : 'X\(//\)[^/]' \| \
X"$as_dir" : 'X\(//\)$' \| \
X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
$as_echo X"$as_dir" |
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
s//\1/
q
}
/^X\(\/\/\)[^/].*/{
s//\1/
q
}
/^X\(\/\/\)$/{
s//\1/
q
}
/^X\(\/\).*/{
s//\1/
q
}
s/.*/./; q'`
test -d "$as_dir" && break
done
test -z "$as_dirs" || eval "mkdir $as_dirs"
} || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
} # as_fn_mkdir_p
if mkdir -p . 2>/dev/null; then
as_mkdir_p='mkdir -p "$as_dir"'
else
test -d ./-p && rmdir ./-p
as_mkdir_p=false
fi
if test -x / >/dev/null 2>&1; then
as_test_x='test -x'
else
if ls -dL / >/dev/null 2>&1; then
as_ls_L_option=L
else
as_ls_L_option=
fi
as_test_x='
eval sh -c '\''
if test -d "$1"; then
test -d "$1/.";
else
case $1 in #(
-*)set "./$1";;
esac;
case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
???[sx]*):;;*)false;;esac;fi
'\'' sh
'
fi
as_executable_p=$as_test_x
# Sed expression to map a string onto a valid CPP name.
as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
# Sed expression to map a string onto a valid variable name.
as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
exec 6>&1
## ----------------------------------- ##
## Main body of $CONFIG_STATUS script. ##
## ----------------------------------- ##
_ASEOF
test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1
cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# Save the log message, to keep $0 and so on meaningful, and to
# report actual input values of CONFIG_FILES etc. instead of their
# values after options handling.
ac_log="
This file was extended by ejabberd $as_me 2.1.x, which was
generated by GNU Autoconf 2.68. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
CONFIG_HEADERS = $CONFIG_HEADERS
CONFIG_LINKS = $CONFIG_LINKS
CONFIG_COMMANDS = $CONFIG_COMMANDS
$ $0 $@
on `(hostname || uname -n) 2>/dev/null | sed 1q`
"
_ACEOF
case $ac_config_files in *"
"*) set x $ac_config_files; shift; ac_config_files=$*;;
esac
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
# Files that config.status was made for.
config_files="$ac_config_files"
_ACEOF
cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
ac_cs_usage="\
\`$as_me' instantiates files and other configuration actions
from templates according to the current configuration. Unless the files
and actions are specified as TAGs, all are instantiated by default.
Usage: $0 [OPTION]... [TAG]...
-h, --help print this help, then exit
-V, --version print version number and configuration settings, then exit
--config print configuration, then exit
-q, --quiet, --silent
do not print progress messages
-d, --debug don't remove temporary files
--recheck update $as_me by reconfiguring in the same conditions
--file=FILE[:TEMPLATE]
instantiate the configuration file FILE
Configuration files:
$config_files
Report bugs to ."
_ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
ac_cs_version="\\
ejabberd config.status 2.1.x
configured by $0, generated by GNU Autoconf 2.68,
with options \\"\$ac_cs_config\\"
Copyright (C) 2010 Free Software Foundation, Inc.
This config.status script is free software; the Free Software Foundation
gives unlimited permission to copy, distribute and modify it."
ac_pwd='$ac_pwd'
srcdir='$srcdir'
test -n "\$AWK" || AWK=awk
_ACEOF
cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# The default lists apply if the user does not specify any file.
ac_need_defaults=:
while test $# != 0
do
case $1 in
--*=?*)
ac_option=`expr "X$1" : 'X\([^=]*\)='`
ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
ac_shift=:
;;
--*=)
ac_option=`expr "X$1" : 'X\([^=]*\)='`
ac_optarg=
ac_shift=:
;;
*)
ac_option=$1
ac_optarg=$2
ac_shift=shift
;;
esac
case $ac_option in
# Handling of the options.
-recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
ac_cs_recheck=: ;;
--version | --versio | --versi | --vers | --ver | --ve | --v | -V )
$as_echo "$ac_cs_version"; exit ;;
--config | --confi | --conf | --con | --co | --c )
$as_echo "$ac_cs_config"; exit ;;
--debug | --debu | --deb | --de | --d | -d )
debug=: ;;
--file | --fil | --fi | --f )
$ac_shift
case $ac_optarg in
*\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
'') as_fn_error $? "missing file argument" ;;
esac
as_fn_append CONFIG_FILES " '$ac_optarg'"
ac_need_defaults=false;;
--he | --h | --help | --hel | -h )
$as_echo "$ac_cs_usage"; exit ;;
-q | -quiet | --quiet | --quie | --qui | --qu | --q \
| -silent | --silent | --silen | --sile | --sil | --si | --s)
ac_cs_silent=: ;;
# This is an error.
-*) as_fn_error $? "unrecognized option: \`$1'
Try \`$0 --help' for more information." ;;
*) as_fn_append ac_config_targets " $1"
ac_need_defaults=false ;;
esac
shift
done
ac_configure_extra_args=
if $ac_cs_silent; then
exec 6>/dev/null
ac_configure_extra_args="$ac_configure_extra_args --silent"
fi
_ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
if \$ac_cs_recheck; then
set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
shift
\$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
CONFIG_SHELL='$SHELL'
export CONFIG_SHELL
exec "\$@"
fi
_ACEOF
cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
exec 5>>config.log
{
echo
sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
## Running $as_me. ##
_ASBOX
$as_echo "$ac_log"
} >&5
_ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
_ACEOF
cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# Handling of arguments.
for ac_config_target in $ac_config_targets
do
case $ac_config_target in
"Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
"$make_mod_irc") CONFIG_FILES="$CONFIG_FILES $make_mod_irc" ;;
"$make_mod_muc") CONFIG_FILES="$CONFIG_FILES $make_mod_muc" ;;
"$make_mod_pubsub") CONFIG_FILES="$CONFIG_FILES $make_mod_pubsub" ;;
"$make_mod_proxy65") CONFIG_FILES="$CONFIG_FILES $make_mod_proxy65" ;;
"$make_eldap") CONFIG_FILES="$CONFIG_FILES $make_eldap" ;;
"$make_pam") CONFIG_FILES="$CONFIG_FILES $make_pam" ;;
"$make_web") CONFIG_FILES="$CONFIG_FILES $make_web" ;;
"stringprep/Makefile") CONFIG_FILES="$CONFIG_FILES stringprep/Makefile" ;;
"stun/Makefile") CONFIG_FILES="$CONFIG_FILES stun/Makefile" ;;
"$make_tls") CONFIG_FILES="$CONFIG_FILES $make_tls" ;;
"$make_odbc") CONFIG_FILES="$CONFIG_FILES $make_odbc" ;;
"$make_ejabberd_zlib") CONFIG_FILES="$CONFIG_FILES $make_ejabberd_zlib" ;;
*) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
esac
done
# If the user did not use the arguments to specify the items to instantiate,
# then the envvar interface is used. Set only those that are not.
# We use the long form for the default assignment because of an extremely
# bizarre bug on SunOS 4.1.3.
if $ac_need_defaults; then
test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
fi
# Have a temporary directory for convenience. Make it in the build tree
# simply because there is no reason against having it here, and in addition,
# creating and moving files from /tmp can sometimes cause problems.
# Hook for its removal unless debugging.
# Note that there is a small window in which the directory will not be cleaned:
# after its creation but before its name has been assigned to `$tmp'.
$debug ||
{
tmp= ac_tmp=
trap 'exit_status=$?
: "${ac_tmp:=$tmp}"
{ test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status
' 0
trap 'as_fn_exit 1' 1 2 13 15
}
# Create a (secure) tmp directory for tmp files.
{
tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
test -d "$tmp"
} ||
{
tmp=./conf$$-$RANDOM
(umask 077 && mkdir "$tmp")
} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5
ac_tmp=$tmp
# Set up the scripts for CONFIG_FILES section.
# No need to generate them if there are no CONFIG_FILES.
# This happens for instance with `./config.status config.h'.
if test -n "$CONFIG_FILES"; then
ac_cr=`echo X | tr X '\015'`
# On cygwin, bash can eat \r inside `` if the user requested igncr.
# But we know of no other shell where ac_cr would be empty at this
# point, so we can use a bashism as a fallback.
if test "x$ac_cr" = x; then
eval ac_cr=\$\'\\r\'
fi
ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null`
if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
ac_cs_awk_cr='\\r'
else
ac_cs_awk_cr=$ac_cr
fi
echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&
_ACEOF
{
echo "cat >conf$$subs.awk <<_ACEOF" &&
echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
echo "_ACEOF"
} >conf$$subs.sh ||
as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'`
ac_delim='%!_!# '
for ac_last_try in false false false false false :; do
. ./conf$$subs.sh ||
as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
if test $ac_delim_n = $ac_delim_num; then
break
elif $ac_last_try; then
as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
else
ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
fi
done
rm -f conf$$subs.sh
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK &&
_ACEOF
sed -n '
h
s/^/S["/; s/!.*/"]=/
p
g
s/^[^!]*!//
:repl
t repl
s/'"$ac_delim"'$//
t delim
:nl
h
s/\(.\{148\}\)..*/\1/
t more1
s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
p
n
b repl
:more1
s/["\\]/\\&/g; s/^/"/; s/$/"\\/
p
g
s/.\{148\}//
t nl
:delim
h
s/\(.\{148\}\)..*/\1/
t more2
s/["\\]/\\&/g; s/^/"/; s/$/"/
p
b
:more2
s/["\\]/\\&/g; s/^/"/; s/$/"\\/
p
g
s/.\{148\}//
t delim
' >$CONFIG_STATUS || ac_write_fail=1
rm -f conf$$subs.awk
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
_ACAWK
cat >>"\$ac_tmp/subs1.awk" <<_ACAWK &&
for (key in S) S_is_set[key] = 1
FS = ""
}
{
line = $ 0
nfields = split(line, field, "@")
substed = 0
len = length(field[1])
for (i = 2; i < nfields; i++) {
key = field[i]
keylen = length(key)
if (S_is_set[key]) {
value = S[key]
line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
len += length(value) + length(field[++i])
substed = 1
} else
len += 1 + keylen
}
print line
}
_ACAWK
_ACEOF
cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
else
cat
fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \
|| as_fn_error $? "could not setup config files machinery" "$LINENO" 5
_ACEOF
# VPATH may cause trouble with some makes, so we remove sole $(srcdir),
# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and
# trailing colons and then remove the whole line if VPATH becomes empty
# (actually we leave an empty line to preserve line numbers).
if test "x$srcdir" = x.; then
ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{
h
s///
s/^/:/
s/[ ]*$/:/
s/:\$(srcdir):/:/g
s/:\${srcdir}:/:/g
s/:@srcdir@:/:/g
s/^:*//
s/:*$//
x
s/\(=[ ]*\).*/\1/
G
s/\n//
s/^[^=]*=[ ]*$//
}'
fi
cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
fi # test -n "$CONFIG_FILES"
eval set X " :F $CONFIG_FILES "
shift
for ac_tag
do
case $ac_tag in
:[FHLC]) ac_mode=$ac_tag; continue;;
esac
case $ac_mode$ac_tag in
:[FHL]*:*);;
:L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;;
:[FH]-) ac_tag=-:-;;
:[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
esac
ac_save_IFS=$IFS
IFS=:
set x $ac_tag
IFS=$ac_save_IFS
shift
ac_file=$1
shift
case $ac_mode in
:L) ac_source=$1;;
:[FH])
ac_file_inputs=
for ac_f
do
case $ac_f in
-) ac_f="$ac_tmp/stdin";;
*) # Look for the file first in the build tree, then in the source tree
# (if the path is not absolute). The absolute path cannot be DOS-style,
# because $ac_f cannot contain `:'.
test -f "$ac_f" ||
case $ac_f in
[\\/$]*) false;;
*) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
esac ||
as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
esac
case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
as_fn_append ac_file_inputs " '$ac_f'"
done
# Let's still pretend it is `configure' which instantiates (i.e., don't
# use $as_me), people would be surprised to read:
# /* config.h. Generated by config.status. */
configure_input='Generated from '`
$as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
`' by configure.'
if test x"$ac_file" != x-; then
configure_input="$ac_file. $configure_input"
{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
$as_echo "$as_me: creating $ac_file" >&6;}
fi
# Neutralize special characters interpreted by sed in replacement strings.
case $configure_input in #(
*\&* | *\|* | *\\* )
ac_sed_conf_input=`$as_echo "$configure_input" |
sed 's/[\\\\&|]/\\\\&/g'`;; #(
*) ac_sed_conf_input=$configure_input;;
esac
case $ac_tag in
*:-:* | *:-) cat >"$ac_tmp/stdin" \
|| as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
esac
;;
esac
ac_dir=`$as_dirname -- "$ac_file" ||
$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
X"$ac_file" : 'X\(//\)[^/]' \| \
X"$ac_file" : 'X\(//\)$' \| \
X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
$as_echo X"$ac_file" |
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
s//\1/
q
}
/^X\(\/\/\)[^/].*/{
s//\1/
q
}
/^X\(\/\/\)$/{
s//\1/
q
}
/^X\(\/\).*/{
s//\1/
q
}
s/.*/./; q'`
as_dir="$ac_dir"; as_fn_mkdir_p
ac_builddir=.
case "$ac_dir" in
.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
*)
ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
# A ".." for each directory in $ac_dir_suffix.
ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
case $ac_top_builddir_sub in
"") ac_top_builddir_sub=. ac_top_build_prefix= ;;
*) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
esac ;;
esac
ac_abs_top_builddir=$ac_pwd
ac_abs_builddir=$ac_pwd$ac_dir_suffix
# for backward compatibility:
ac_top_builddir=$ac_top_build_prefix
case $srcdir in
.) # We are building in place.
ac_srcdir=.
ac_top_srcdir=$ac_top_builddir_sub
ac_abs_top_srcdir=$ac_pwd ;;
[\\/]* | ?:[\\/]* ) # Absolute name.
ac_srcdir=$srcdir$ac_dir_suffix;
ac_top_srcdir=$srcdir
ac_abs_top_srcdir=$srcdir ;;
*) # Relative name.
ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
ac_top_srcdir=$ac_top_build_prefix$srcdir
ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
esac
ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
case $ac_mode in
:F)
#
# CONFIG_FILE
#
_ACEOF
cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# If the template does not know about datarootdir, expand it.
# FIXME: This hack should be removed a few years after 2.60.
ac_datarootdir_hack=; ac_datarootdir_seen=
ac_sed_dataroot='
/datarootdir/ {
p
q
}
/@datadir@/p
/@docdir@/p
/@infodir@/p
/@localedir@/p
/@mandir@/p'
case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
*datarootdir*) ac_datarootdir_seen=yes;;
*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
_ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_datarootdir_hack='
s&@datadir@&$datadir&g
s&@docdir@&$docdir&g
s&@infodir@&$infodir&g
s&@localedir@&$localedir&g
s&@mandir@&$mandir&g
s&\\\${datarootdir}&$datarootdir&g' ;;
esac
_ACEOF
# Neutralize VPATH when `$srcdir' = `.'.
# Shell code in configure.ac might set extrasub.
# FIXME: do we really want to maintain this feature?
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_sed_extra="$ac_vpsub
$extrasub
_ACEOF
cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
:t
/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
s|@configure_input@|$ac_sed_conf_input|;t t
s&@top_builddir@&$ac_top_builddir_sub&;t t
s&@top_build_prefix@&$ac_top_build_prefix&;t t
s&@srcdir@&$ac_srcdir&;t t
s&@abs_srcdir@&$ac_abs_srcdir&;t t
s&@top_srcdir@&$ac_top_srcdir&;t t
s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
s&@builddir@&$ac_builddir&;t t
s&@abs_builddir@&$ac_abs_builddir&;t t
s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
$ac_datarootdir_hack
"
eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \
>$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5
test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
{ ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
{ ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \
"$ac_tmp/out"`; test -z "$ac_out"; } &&
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
which seems to be undefined. Please make sure it is defined" >&5
$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
which seems to be undefined. Please make sure it is defined" >&2;}
rm -f "$ac_tmp/stdin"
case $ac_file in
-) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";;
*) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";;
esac \
|| as_fn_error $? "could not create $ac_file" "$LINENO" 5
;;
esac
done # for ac_tag
as_fn_exit 0
_ACEOF
ac_clean_files=$ac_clean_files_save
test $ac_write_fail = 0 ||
as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5
# configure is writing to config.log, and then calls config.status.
# config.status does its own redirection, appending to config.log.
# Unfortunately, on DOS this fails, as config.log is still kept open
# by configure, so config.status won't be able to write to it; its
# output is simply discarded. So we exec the FD to /dev/null,
# effectively closing config.log, so it can be properly (re)opened and
# appended to by config.status. When coming back to configure, we
# need to make the FD available again.
if test "$no_create" != yes; then
ac_cs_success=:
ac_config_status_args=
test "$silent" = yes &&
ac_config_status_args="$ac_config_status_args --quiet"
exec 5>/dev/null
$SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
exec 5>>config.log
# Use ||, not &&, to avoid exiting from the if with $? = 1, which
# would make configure fail if this is the last instruction.
$ac_cs_success || as_fn_exit 1
fi
if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
fi
ejabberd-2.1.11/src/ejabberd_listener.erl 0000664 0000000 0000000 00000036445 12240230175 015170 0 ustar %%%----------------------------------------------------------------------
%%% File : ejabberd_listener.erl
%%% Author : Alexey Shchepin
%%% Purpose : Manage socket listener
%%% Created : 16 Nov 2002 by Alexey Shchepin
%%%
%%%
%%% ejabberd, Copyright (C) 2002-2012 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
%%% published by the Free Software Foundation; either version 2 of the
%%% License, or (at your option) any later version.
%%%
%%% This program is distributed in the hope that it will be useful,
%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
%%% General Public License for more details.
%%%
%%% You should have received a copy of the GNU General Public License
%%% along with this program; if not, write to the Free Software
%%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
%%% 02111-1307 USA
%%%
%%%----------------------------------------------------------------------
-module(ejabberd_listener).
-author('alexey@process-one.net').
-export([start_link/0, init/1, start/3,
init/3,
start_listeners/0,
start_listener/3,
stop_listeners/0,
stop_listener/2,
parse_listener_portip/2,
add_listener/3,
delete_listener/2
]).
-include("ejabberd.hrl").
%% We do not block on send anymore.
-define(TCP_SEND_TIMEOUT, 15000).
start_link() ->
supervisor:start_link({local, ejabberd_listeners}, ?MODULE, []).
init(_) ->
ets:new(listen_sockets, [named_table, public]),
bind_tcp_ports(),
{ok, {{one_for_one, 10, 1}, []}}.
bind_tcp_ports() ->
case ejabberd_config:get_local_option(listen) of
undefined ->
ignore;
Ls ->
lists:foreach(
fun({Port, Module, Opts}) ->
ModuleRaw = strip_frontend(Module),
case ModuleRaw:socket_type() of
independent -> ok;
_ ->
bind_tcp_port(Port, Module, Opts)
end
end, Ls)
end.
bind_tcp_port(PortIP, Module, RawOpts) ->
try check_listener_options(RawOpts) of
ok ->
{Port, IPT, IPS, IPV, Proto, OptsClean} = parse_listener_portip(PortIP, RawOpts),
{_Opts, SockOpts} = prepare_opts(IPT, IPV, OptsClean),
case Proto of
udp -> ok;
_ ->
ListenSocket = listen_tcp(PortIP, Module, SockOpts, Port, IPS),
ets:insert(listen_sockets, {PortIP, ListenSocket})
end
catch
throw:{error, Error} ->
?ERROR_MSG(Error, [])
end.
start_listeners() ->
case ejabberd_config:get_local_option(listen) of
undefined ->
ignore;
Ls ->
Ls2 = lists:map(
fun({Port, Module, Opts}) ->
case start_listener(Port, Module, Opts) of
{ok, _Pid} = R -> R;
{error, Error} ->
throw(Error)
end
end, Ls),
report_duplicated_portips(Ls),
{ok, {{one_for_one, 10, 1}, Ls2}}
end.
report_duplicated_portips(L) ->
LKeys = [Port || {Port, _, _} <- L],
LNoDupsKeys = proplists:get_keys(L),
case LKeys -- LNoDupsKeys of
[] -> ok;
Dups ->
?CRITICAL_MSG("In the ejabberd configuration there are duplicated "
"Port number + IP address:~n ~p",
[Dups])
end.
start(Port, Module, Opts) ->
%% Check if the module is an ejabberd listener or an independent listener
ModuleRaw = strip_frontend(Module),
case ModuleRaw:socket_type() of
independent -> ModuleRaw:start_listener(Port, Opts);
_ -> start_dependent(Port, Module, Opts)
end.
%% @spec(Port, Module, Opts) -> {ok, Pid} | {error, ErrorMessage}
start_dependent(Port, Module, Opts) ->
try check_listener_options(Opts) of
ok ->
proc_lib:start_link(?MODULE, init, [Port, Module, Opts])
catch
throw:{error, Error} ->
?ERROR_MSG(Error, []),
{error, Error}
end.
init(PortIP, Module, RawOpts) ->
{Port, IPT, IPS, IPV, Proto, OptsClean} = parse_listener_portip(PortIP, RawOpts),
{Opts, SockOpts} = prepare_opts(IPT, IPV, OptsClean),
if Proto == udp ->
init_udp(PortIP, Module, Opts, SockOpts, Port, IPS);
true ->
init_tcp(PortIP, Module, Opts, SockOpts, Port, IPS)
end.
init_udp(PortIP, Module, Opts, SockOpts, Port, IPS) ->
case gen_udp:open(Port, [binary,
{active, false},
{reuseaddr, true} |
SockOpts]) of
{ok, Socket} ->
%% Inform my parent that this port was opened succesfully
proc_lib:init_ack({ok, self()}),
udp_recv(Socket, Module, Opts);
{error, Reason} ->
socket_error(Reason, PortIP, Module, SockOpts, Port, IPS)
end.
init_tcp(PortIP, Module, Opts, SockOpts, Port, IPS) ->
ListenSocket = listen_tcp(PortIP, Module, SockOpts, Port, IPS),
%% Inform my parent that this port was opened succesfully
proc_lib:init_ack({ok, self()}),
%% And now start accepting connection attempts
accept(ListenSocket, Module, Opts).
listen_tcp(PortIP, Module, SockOpts, Port, IPS) ->
case ets:lookup(listen_sockets, PortIP) of
[{PortIP, ListenSocket}] ->
?INFO_MSG("Reusing listening port for ~p", [Port]),
ets:delete(listen_sockets, Port),
ListenSocket;
_ ->
SockOpts2 = try erlang:system_info(otp_release) >= "R13B" of
true -> [{send_timeout_close, true} | SockOpts];
false -> SockOpts
catch
_:_ -> []
end,
Res = gen_tcp:listen(Port, [binary,
{packet, 0},
{active, false},
{reuseaddr, true},
{nodelay, true},
{send_timeout, ?TCP_SEND_TIMEOUT},
{keepalive, true} |
SockOpts2]),
case Res of
{ok, ListenSocket} ->
ListenSocket;
{error, Reason} ->
socket_error(Reason, PortIP, Module, SockOpts, Port, IPS)
end
end.
%% @spec (PortIP, Opts) -> {Port, IPT, IPS, IPV, OptsClean}
%% where
%% PortIP = Port | {Port, IPT | IPS}
%% Port = integer()
%% IPT = tuple()
%% IPS = string()
%% IPV = inet | inet6
%% Opts = [IPV | {ip, IPT} | atom() | tuple()]
%% OptsClean = [atom() | tuple()]
%% @doc Parse any kind of ejabberd listener specification.
%% The parsed options are returned in several formats.
%% OptsClean does not include inet/inet6 or ip options.
%% Opts can include the options inet6 and {ip, Tuple},
%% but they are only used when no IP address was specified in the PortIP.
%% The IP version (either IPv4 or IPv6) is inferred from the IP address type,
%% so the option inet/inet6 is only used when no IP is specified at all.
parse_listener_portip(PortIP, Opts) ->
{IPOpt, Opts2} = strip_ip_option(Opts),
{IPVOpt, OptsClean} = case lists:member(inet6, Opts2) of
true -> {inet6, Opts2 -- [inet6]};
false -> {inet, Opts2}
end,
{Port, IPT, IPS, Proto} =
case add_proto(PortIP, Opts) of
{P, Prot} ->
T = get_ip_tuple(IPOpt, IPVOpt),
S = inet_parse:ntoa(T),
{P, T, S, Prot};
{P, T, Prot} when is_integer(P) and is_tuple(T) ->
S = inet_parse:ntoa(T),
{P, T, S, Prot};
{P, S, Prot} when is_integer(P) and is_list(S) ->
[S | _] = string:tokens(S, "/"),
{ok, T} = inet_parse:address(S),
{P, T, S, Prot}
end,
IPV = case size(IPT) of
4 -> inet;
8 -> inet6
end,
{Port, IPT, IPS, IPV, Proto, OptsClean}.
prepare_opts(IPT, IPV, OptsClean) ->
%% The first inet|inet6 and the last {ip, _} work,
%% so overriding those in Opts
Opts = [IPV | OptsClean] ++ [{ip, IPT}],
SockOpts = lists:filter(fun({ip, _}) -> true;
(inet6) -> true;
(inet) -> true;
({backlog, _}) -> true;
(_) -> false
end, Opts),
{Opts, SockOpts}.
add_proto(Port, Opts) when is_integer(Port) ->
{Port, get_proto(Opts)};
add_proto({Port, Proto}, _Opts) when is_atom(Proto) ->
{Port, normalize_proto(Proto)};
add_proto({Port, Addr}, Opts) ->
{Port, Addr, get_proto(Opts)};
add_proto({Port, Addr, Proto}, _Opts) ->
{Port, Addr, normalize_proto(Proto)}.
strip_ip_option(Opts) ->
{IPL, OptsNoIP} = lists:partition(
fun({ip, _}) -> true;
(_) -> false
end,
Opts),
case IPL of
%% Only the first ip option is considered
[{ip, T1} | _] when is_tuple(T1) ->
{T1, OptsNoIP};
[] ->
{no_ip_option, OptsNoIP}
end.
get_ip_tuple(no_ip_option, inet) ->
{0, 0, 0, 0};
get_ip_tuple(no_ip_option, inet6) ->
{0, 0, 0, 0, 0, 0, 0, 0};
get_ip_tuple(IPOpt, _IPVOpt) ->
IPOpt.
accept(ListenSocket, Module, Opts) ->
case gen_tcp:accept(ListenSocket) of
{ok, Socket} ->
case {inet:sockname(Socket), inet:peername(Socket)} of
{{ok, Addr}, {ok, PAddr}} ->
?INFO_MSG("(~w) Accepted connection ~w -> ~w",
[Socket, PAddr, Addr]);
_ ->
ok
end,
CallMod = case is_frontend(Module) of
true -> ejabberd_frontend_socket;
false -> ejabberd_socket
end,
CallMod:start(strip_frontend(Module), gen_tcp, Socket, Opts),
accept(ListenSocket, Module, Opts);
{error, Reason} ->
?ERROR_MSG("(~w) Failed TCP accept: ~w",
[ListenSocket, Reason]),
accept(ListenSocket, Module, Opts)
end.
udp_recv(Socket, Module, Opts) ->
case gen_udp:recv(Socket, 0) of
{ok, {Addr, Port, Packet}} ->
case catch Module:udp_recv(Socket, Addr, Port, Packet, Opts) of
{'EXIT', Reason} ->
?ERROR_MSG("failed to process UDP packet:~n"
"** Source: {~p, ~p}~n"
"** Reason: ~p~n** Packet: ~p",
[Addr, Port, Reason, Packet]);
_ ->
ok
end,
udp_recv(Socket, Module, Opts);
{error, Reason} ->
?ERROR_MSG("unexpected UDP error: ~s", [format_error(Reason)]),
throw({error, Reason})
end.
%% @spec (Port, Module, Opts) -> {ok, Pid} | {error, Error}
start_listener(Port, Module, Opts) ->
case start_listener2(Port, Module, Opts) of
{ok, _Pid} = R -> R;
{error, {{'EXIT', {undef, [{M, _F, _A}|_]}}, _} = Error} ->
?ERROR_MSG("Error starting the ejabberd listener: ~p.~n"
"It could not be loaded or is not an ejabberd listener.~n"
"Error: ~p~n", [Module, Error]),
{error, {module_not_available, M}};
{error, {already_started, Pid}} ->
{ok, Pid};
{error, Error} ->
{error, Error}
end.
%% @spec (Port, Module, Opts) -> {ok, Pid} | {error, Error}
start_listener2(Port, Module, Opts) ->
%% It is only required to start the supervisor in some cases.
%% But it doesn't hurt to attempt to start it for any listener.
%% So, it's normal (and harmless) that in most cases this call returns: {error, {already_started, pid()}}
start_module_sup(Port, Module),
start_listener_sup(Port, Module, Opts).
start_module_sup(_Port, Module) ->
Proc1 = gen_mod:get_module_proc("sup", Module),
ChildSpec1 =
{Proc1,
{ejabberd_tmp_sup, start_link, [Proc1, strip_frontend(Module)]},
permanent,
infinity,
supervisor,
[ejabberd_tmp_sup]},
supervisor:start_child(ejabberd_sup, ChildSpec1).
start_listener_sup(Port, Module, Opts) ->
ChildSpec = {Port,
{?MODULE, start, [Port, Module, Opts]},
transient,
brutal_kill,
worker,
[?MODULE]},
supervisor:start_child(ejabberd_listeners, ChildSpec).
stop_listeners() ->
Ports = ejabberd_config:get_local_option(listen),
lists:foreach(
fun({PortIpNetp, Module, _Opts}) ->
delete_listener(PortIpNetp, Module)
end,
Ports).
%% @spec (PortIP, Module) -> ok
%% where
%% PortIP = {Port, IPT | IPS}
%% Port = integer()
%% IPT = tuple()
%% IPS = string()
%% Module = atom()
stop_listener(PortIP, _Module) ->
supervisor:terminate_child(ejabberd_listeners, PortIP),
supervisor:delete_child(ejabberd_listeners, PortIP).
%% @spec (PortIP, Module, Opts) -> {ok, Pid} | {error, Error}
%% where
%% PortIP = {Port, IPT | IPS}
%% Port = integer()
%% IPT = tuple()
%% IPS = string()
%% IPV = inet | inet6
%% Module = atom()
%% Opts = [IPV | {ip, IPT} | atom() | tuple()]
%% @doc Add a listener and store in config if success
add_listener(PortIP, Module, Opts) ->
{Port, IPT, _, _, Proto, _} = parse_listener_portip(PortIP, Opts),
PortIP1 = {Port, IPT, Proto},
case start_listener(PortIP1, Module, Opts) of
{ok, _Pid} ->
Ports = case ejabberd_config:get_local_option(listen) of
undefined ->
[];
Ls ->
Ls
end,
Ports1 = lists:keydelete(PortIP1, 1, Ports),
Ports2 = [{PortIP1, Module, Opts} | Ports1],
ejabberd_config:add_local_option(listen, Ports2),
ok;
{error, {already_started, _Pid}} ->
{error, {already_started, PortIP}};
{error, Error} ->
{error, Error}
end.
delete_listener(PortIP, Module) ->
delete_listener(PortIP, Module, []).
%% @spec (PortIP, Module, Opts) -> ok
%% where
%% PortIP = {Port, IPT | IPS}
%% Port = integer()
%% IPT = tuple()
%% IPS = string()
%% Module = atom()
%% Opts = [term()]
delete_listener(PortIP, Module, Opts) ->
{Port, IPT, _, _, Proto, _} = parse_listener_portip(PortIP, Opts),
PortIP1 = {Port, IPT, Proto},
Ports = case ejabberd_config:get_local_option(listen) of
undefined ->
[];
Ls ->
Ls
end,
Ports1 = lists:keydelete(PortIP1, 1, Ports),
ejabberd_config:add_local_option(listen, Ports1),
stop_listener(PortIP1, Module).
is_frontend({frontend, _Module}) -> true;
is_frontend(_) -> false.
%% @doc(FrontMod) -> atom()
%% where FrontMod = atom() | {frontend, atom()}
strip_frontend({frontend, Module}) -> Module;
strip_frontend(Module) when is_atom(Module) -> Module.
%%%
%%% Check options
%%%
check_listener_options(Opts) ->
case includes_deprecated_ssl_option(Opts) of
false -> ok;
true ->
Error = "There is a problem with your ejabberd configuration file: "
"the option 'ssl' for listening sockets is no longer available."
" To get SSL encryption use the option 'tls'.",
throw({error, Error})
end,
case certfile_readable(Opts) of
true -> ok;
{false, Path} ->
ErrorText = "There is a problem in the configuration: "
"the specified file is not readable: ",
throw({error, ErrorText ++ Path})
end,
ok.
%% Parse the options of the socket,
%% and return if the deprecated option 'ssl' is included
%% @spec (Opts) -> true | false
includes_deprecated_ssl_option(Opts) ->
case lists:keysearch(ssl, 1, Opts) of
{value, {ssl, _SSLOpts}} ->
true;
_ ->
lists:member(ssl, Opts)
end.
%% @spec (Opts) -> true | {false, Path::string()}
certfile_readable(Opts) ->
case proplists:lookup(certfile, Opts) of
none -> true;
{certfile, Path} ->
case ejabberd_config:is_file_readable(Path) of
true -> true;
false -> {false, Path}
end
end.
get_proto(Opts) ->
case proplists:get_value(proto, Opts) of
undefined ->
tcp;
Proto ->
normalize_proto(Proto)
end.
normalize_proto(tcp) -> tcp;
normalize_proto(udp) -> udp;
normalize_proto(UnknownProto) ->
?WARNING_MSG("There is a problem in the configuration: "
"~p is an unknown IP protocol. Using tcp as fallback",
[UnknownProto]),
tcp.
socket_error(Reason, PortIP, Module, SockOpts, Port, IPS) ->
ReasonT = case Reason of
eaddrnotavail ->
"IP address not available: " ++ IPS;
eaddrinuse ->
"IP address and port number already used: "
++IPS++" "++integer_to_list(Port);
_ ->
format_error(Reason)
end,
?ERROR_MSG("Failed to open socket:~n ~p~nReason: ~s",
[{Port, Module, SockOpts}, ReasonT]),
throw({Reason, PortIP}).
format_error(Reason) ->
case inet:format_error(Reason) of
"unknown POSIX error" ->
atom_to_list(Reason);
ReasonStr ->
ReasonStr
end.
ejabberd-2.1.11/src/mod_sic.erl 0000664 0000000 0000000 00000005753 12240230175 013140 0 ustar %%%----------------------------------------------------------------------
%%% File : mod_sic.erl
%%% Author : Karim Gemayel
%%% Purpose : XEP-0279 Server IP Check
%%% Created : 6 Mar 2010 by Karim Gemayel
%%%
%%%
%%% ejabberd, Copyright (C) 2002-2012 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
%%% published by the Free Software Foundation; either version 2 of the
%%% License, or (at your option) any later version.
%%%
%%% This program is distributed in the hope that it will be useful,
%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
%%% General Public License for more details.
%%%
%%% You should have received a copy of the GNU General Public License
%%% along with this program; if not, write to the Free Software
%%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
%%% 02111-1307 USA
%%%
%%%----------------------------------------------------------------------
-module(mod_sic).
-author('karim.gemayel@process-one.net').
-behaviour(gen_mod).
-export([start/2,
stop/1,
process_local_iq/3,
process_sm_iq/3
]).
-include("ejabberd.hrl").
-include("jlib.hrl").
-define(NS_SIC, "urn:xmpp:sic:0").
start(Host, Opts) ->
IQDisc = gen_mod:get_opt(iqdisc, Opts, one_queue),
gen_iq_handler:add_iq_handler(ejabberd_local, Host,
?NS_SIC, ?MODULE, process_local_iq, IQDisc),
gen_iq_handler:add_iq_handler(ejabberd_sm, Host,
?NS_SIC, ?MODULE, process_sm_iq, IQDisc).
stop(Host) ->
gen_iq_handler:remove_iq_handler(ejabberd_local, Host, ?NS_SIC),
gen_iq_handler:remove_iq_handler(ejabberd_sm, Host, ?NS_SIC).
process_local_iq(#jid{user = User, server = Server, resource = Resource}, _To,
#iq{type = 'get', sub_el = _SubEl} = IQ) ->
get_ip({User, Server, Resource}, IQ);
process_local_iq(_From, _To, #iq{type = 'set', sub_el = SubEl} = IQ) ->
IQ#iq{type = error, sub_el = [SubEl, ?ERR_NOT_ALLOWED]}.
process_sm_iq(#jid{user = User, server = Server, resource = Resource},
#jid{user = User, server = Server},
#iq{type = 'get', sub_el = _SubEl} = IQ) ->
get_ip({User, Server, Resource}, IQ);
process_sm_iq(_From, _To, #iq{type = 'get', sub_el = SubEl} = IQ) ->
IQ#iq{type = error, sub_el = [SubEl, ?ERR_FORBIDDEN]};
process_sm_iq(_From, _To, #iq{type = 'set', sub_el = SubEl} = IQ) ->
IQ#iq{type = error, sub_el = [SubEl, ?ERR_NOT_ALLOWED]}.
get_ip({User, Server, Resource},
#iq{sub_el = {xmlelement, Name, Attrs, _} = SubEl} = IQ) ->
case ejabberd_sm:get_user_ip(User, Server, Resource) of
{IP, _} when is_tuple(IP) ->
IQ#iq{
type = 'result',
sub_el = [
{xmlelement, Name, Attrs,
[{xmlcdata, list_to_binary(inet_parse:ntoa(IP))}]}
]
};
_ ->
IQ#iq{
type = 'error',
sub_el = [SubEl, ?ERR_INTERNAL_SERVER_ERROR]
}
end.
ejabberd-2.1.11/src/ejabberd_auth_internal.erl 0000664 0000000 0000000 00000033135 12240230175 016171 0 ustar %%%----------------------------------------------------------------------
%%% File : ejabberd_auth_internal.erl
%%% Author : Alexey Shchepin
%%% Purpose : Authentification via mnesia
%%% Created : 12 Dec 2004 by Alexey Shchepin
%%%
%%%
%%% ejabberd, Copyright (C) 2002-2012 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
%%% published by the Free Software Foundation; either version 2 of the
%%% License, or (at your option) any later version.
%%%
%%% This program is distributed in the hope that it will be useful,
%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
%%% General Public License for more details.
%%%
%%% You should have received a copy of the GNU General Public License
%%% along with this program; if not, write to the Free Software
%%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
%%% 02111-1307 USA
%%%
%%%----------------------------------------------------------------------
-module(ejabberd_auth_internal).
-author('alexey@process-one.net').
%% External exports
-export([start/1,
set_password/3,
check_password/3,
check_password/5,
try_register/3,
dirty_get_registered_users/0,
get_vh_registered_users/1,
get_vh_registered_users/2,
get_vh_registered_users_number/1,
get_vh_registered_users_number/2,
get_password/2,
get_password_s/2,
is_user_exists/2,
remove_user/2,
remove_user/3,
store_type/0,
plain_password_required/0
]).
-include("ejabberd.hrl").
-record(passwd, {us, password}).
-record(reg_users_counter, {vhost, count}).
-define(SALT_LENGTH, 16).
%%%----------------------------------------------------------------------
%%% API
%%%----------------------------------------------------------------------
start(Host) ->
mnesia:create_table(passwd, [{disc_copies, [node()]},
{attributes, record_info(fields, passwd)}]),
mnesia:create_table(reg_users_counter,
[{ram_copies, [node()]},
{attributes, record_info(fields, reg_users_counter)}]),
update_table(),
update_reg_users_counter_table(Host),
maybe_alert_password_scrammed_without_option(),
ok.
update_reg_users_counter_table(Server) ->
Set = get_vh_registered_users(Server),
Size = length(Set),
LServer = jlib:nameprep(Server),
F = fun() ->
mnesia:write(#reg_users_counter{vhost = LServer,
count = Size})
end,
mnesia:sync_dirty(F).
plain_password_required() ->
case is_scrammed() of
false -> false;
true -> true
end.
store_type() ->
case is_scrammed() of
false -> plain; %% allows: PLAIN DIGEST-MD5 SCRAM
true -> scram %% allows: PLAIN SCRAM
end.
check_password(User, Server, Password) ->
LUser = jlib:nodeprep(User),
LServer = jlib:nameprep(Server),
US = {LUser, LServer},
case catch mnesia:dirty_read({passwd, US}) of
[#passwd{password = Password}] when is_list(Password) ->
Password /= "";
[#passwd{password = Scram}] when is_record(Scram, scram) ->
is_password_scram_valid(Password, Scram);
_ ->
false
end.
check_password(User, Server, Password, Digest, DigestGen) ->
LUser = jlib:nodeprep(User),
LServer = jlib:nameprep(Server),
US = {LUser, LServer},
case catch mnesia:dirty_read({passwd, US}) of
[#passwd{password = Passwd}] when is_list(Passwd) ->
DigRes = if
Digest /= "" ->
Digest == DigestGen(Passwd);
true ->
false
end,
if DigRes ->
true;
true ->
(Passwd == Password) and (Password /= "")
end;
[#passwd{password = Scram}] when is_record(Scram, scram) ->
Passwd = base64:decode(Scram#scram.storedkey),
DigRes = if
Digest /= "" ->
Digest == DigestGen(Passwd);
true ->
false
end,
if DigRes ->
true;
true ->
(Passwd == Password) and (Password /= "")
end;
_ ->
false
end.
%% @spec (User::string(), Server::string(), Password::string()) ->
%% ok | {error, invalid_jid}
set_password(User, Server, Password) ->
LUser = jlib:nodeprep(User),
LServer = jlib:nameprep(Server),
US = {LUser, LServer},
if
(LUser == error) or (LServer == error) ->
{error, invalid_jid};
true ->
F = fun() ->
Password2 = case is_scrammed() and is_list(Password) of
true -> password_to_scram(Password);
false -> Password
end,
mnesia:write(#passwd{us = US,
password = Password2})
end,
{atomic, ok} = mnesia:transaction(F),
ok
end.
%% @spec (User, Server, Password) -> {atomic, ok} | {atomic, exists} | {error, invalid_jid} | {aborted, Reason}
try_register(User, Server, Password) ->
LUser = jlib:nodeprep(User),
LServer = jlib:nameprep(Server),
US = {LUser, LServer},
if
(LUser == error) or (LServer == error) ->
{error, invalid_jid};
true ->
F = fun() ->
case mnesia:read({passwd, US}) of
[] ->
Password2 = case is_scrammed() and is_list(Password) of
true -> password_to_scram(Password);
false -> Password
end,
mnesia:write(#passwd{us = US,
password = Password2}),
mnesia:dirty_update_counter(
reg_users_counter,
LServer, 1),
ok;
[_E] ->
exists
end
end,
mnesia:transaction(F)
end.
%% Get all registered users in Mnesia
dirty_get_registered_users() ->
mnesia:dirty_all_keys(passwd).
get_vh_registered_users(Server) ->
LServer = jlib:nameprep(Server),
mnesia:dirty_select(
passwd,
[{#passwd{us = '$1', _ = '_'},
[{'==', {element, 2, '$1'}, LServer}],
['$1']}]).
get_vh_registered_users(Server, [{from, Start}, {to, End}])
when is_integer(Start) and is_integer(End) ->
get_vh_registered_users(Server, [{limit, End-Start+1}, {offset, Start}]);
get_vh_registered_users(Server, [{limit, Limit}, {offset, Offset}])
when is_integer(Limit) and is_integer(Offset) ->
case get_vh_registered_users(Server) of
[] ->
[];
Users ->
Set = lists:keysort(1, Users),
L = length(Set),
Start = if Offset < 1 -> 1;
Offset > L -> L;
true -> Offset
end,
lists:sublist(Set, Start, Limit)
end;
get_vh_registered_users(Server, [{prefix, Prefix}])
when is_list(Prefix) ->
Set = [{U,S} || {U, S} <- get_vh_registered_users(Server), lists:prefix(Prefix, U)],
lists:keysort(1, Set);
get_vh_registered_users(Server, [{prefix, Prefix}, {from, Start}, {to, End}])
when is_list(Prefix) and is_integer(Start) and is_integer(End) ->
get_vh_registered_users(Server, [{prefix, Prefix}, {limit, End-Start+1}, {offset, Start}]);
get_vh_registered_users(Server, [{prefix, Prefix}, {limit, Limit}, {offset, Offset}])
when is_list(Prefix) and is_integer(Limit) and is_integer(Offset) ->
case [{U,S} || {U, S} <- get_vh_registered_users(Server), lists:prefix(Prefix, U)] of
[] ->
[];
Users ->
Set = lists:keysort(1, Users),
L = length(Set),
Start = if Offset < 1 -> 1;
Offset > L -> L;
true -> Offset
end,
lists:sublist(Set, Start, Limit)
end;
get_vh_registered_users(Server, _) ->
get_vh_registered_users(Server).
get_vh_registered_users_number(Server) ->
LServer = jlib:nameprep(Server),
Query = mnesia:dirty_select(
reg_users_counter,
[{#reg_users_counter{vhost = LServer, count = '$1'},
[],
['$1']}]),
case Query of
[Count] ->
Count;
_ -> 0
end.
get_vh_registered_users_number(Server, [{prefix, Prefix}]) when is_list(Prefix) ->
Set = [{U, S} || {U, S} <- get_vh_registered_users(Server), lists:prefix(Prefix, U)],
length(Set);
get_vh_registered_users_number(Server, _) ->
get_vh_registered_users_number(Server).
get_password(User, Server) ->
LUser = jlib:nodeprep(User),
LServer = jlib:nameprep(Server),
US = {LUser, LServer},
case catch mnesia:dirty_read(passwd, US) of
[#passwd{password = Password}] when is_list(Password) ->
Password;
[#passwd{password = Scram}] when is_record(Scram, scram) ->
{base64:decode(Scram#scram.storedkey),
base64:decode(Scram#scram.serverkey),
base64:decode(Scram#scram.salt),
Scram#scram.iterationcount};
_ ->
false
end.
get_password_s(User, Server) ->
LUser = jlib:nodeprep(User),
LServer = jlib:nameprep(Server),
US = {LUser, LServer},
case catch mnesia:dirty_read(passwd, US) of
[#passwd{password = Password}] when is_list(Password) ->
Password;
[#passwd{password = Scram}] when is_record(Scram, scram) ->
[];
_ ->
[]
end.
%% @spec (User, Server) -> true | false | {error, Error}
is_user_exists(User, Server) ->
LUser = jlib:nodeprep(User),
LServer = jlib:nameprep(Server),
US = {LUser, LServer},
case catch mnesia:dirty_read({passwd, US}) of
[] ->
false;
[_] ->
true;
Other ->
{error, Other}
end.
%% @spec (User, Server) -> ok
%% @doc Remove user.
%% Note: it returns ok even if there was some problem removing the user.
remove_user(User, Server) ->
LUser = jlib:nodeprep(User),
LServer = jlib:nameprep(Server),
US = {LUser, LServer},
F = fun() ->
mnesia:delete({passwd, US}),
mnesia:dirty_update_counter(reg_users_counter,
LServer, -1)
end,
mnesia:transaction(F),
ok.
%% @spec (User, Server, Password) -> ok | not_exists | not_allowed | bad_request
%% @doc Remove user if the provided password is correct.
remove_user(User, Server, Password) ->
LUser = jlib:nodeprep(User),
LServer = jlib:nameprep(Server),
US = {LUser, LServer},
F = fun() ->
case mnesia:read({passwd, US}) of
[#passwd{password = Password}] when is_list(Password) ->
mnesia:delete({passwd, US}),
mnesia:dirty_update_counter(reg_users_counter,
LServer, -1),
ok;
[#passwd{password = Scram}] when is_record(Scram, scram) ->
case is_password_scram_valid(Password, Scram) of
true ->
mnesia:delete({passwd, US}),
mnesia:dirty_update_counter(reg_users_counter,
LServer, -1),
ok;
false ->
not_allowed
end;
_ ->
not_exists
end
end,
case mnesia:transaction(F) of
{atomic, ok} ->
ok;
{atomic, Res} ->
Res;
_ ->
bad_request
end.
update_table() ->
Fields = record_info(fields, passwd),
case mnesia:table_info(passwd, attributes) of
Fields ->
maybe_scram_passwords(),
ok;
[user, password] ->
?INFO_MSG("Converting passwd table from "
"{user, password} format", []),
Host = ?MYNAME,
{atomic, ok} = mnesia:create_table(
ejabberd_auth_internal_tmp_table,
[{disc_only_copies, [node()]},
{type, bag},
{local_content, true},
{record_name, passwd},
{attributes, record_info(fields, passwd)}]),
mnesia:transform_table(passwd, ignore, Fields),
F1 = fun() ->
mnesia:write_lock_table(ejabberd_auth_internal_tmp_table),
mnesia:foldl(
fun(#passwd{us = U} = R, _) ->
mnesia:dirty_write(
ejabberd_auth_internal_tmp_table,
R#passwd{us = {U, Host}})
end, ok, passwd)
end,
mnesia:transaction(F1),
mnesia:clear_table(passwd),
F2 = fun() ->
mnesia:write_lock_table(passwd),
mnesia:foldl(
fun(R, _) ->
mnesia:dirty_write(R)
end, ok, ejabberd_auth_internal_tmp_table)
end,
mnesia:transaction(F2),
mnesia:delete_table(ejabberd_auth_internal_tmp_table);
_ ->
?INFO_MSG("Recreating passwd table", []),
mnesia:transform_table(passwd, ignore, Fields)
end.
%%%
%%% SCRAM
%%%
%% The passwords are stored scrammed in the table either if the option says so,
%% or if at least the first password is scrammed.
is_scrammed() ->
OptionScram = is_option_scram(),
FirstElement = mnesia:dirty_read(passwd, mnesia:dirty_first(passwd)),
case {OptionScram, FirstElement} of
{true, _} ->
true;
{false, [#passwd{password = Scram}]} when is_record(Scram, scram) ->
true;
_ ->
false
end.
is_option_scram() ->
scram == ejabberd_config:get_local_option({auth_password_format, ?MYNAME}).
maybe_alert_password_scrammed_without_option() ->
case is_scrammed() andalso not is_option_scram() of
true ->
?ERROR_MSG("Some passwords were stored in the database as SCRAM, "
"but 'auth_password_format' is not configured 'scram'. "
"The option will now be considered to be 'scram'.", []);
false ->
ok
end.
maybe_scram_passwords() ->
case is_scrammed() of
true -> scram_passwords();
false -> ok
end.
scram_passwords() ->
?INFO_MSG("Converting the stored passwords into SCRAM bits", []),
Fun = fun(#passwd{password = Password} = P) ->
Scram = password_to_scram(Password),
P#passwd{password = Scram}
end,
Fields = record_info(fields, passwd),
mnesia:transform_table(passwd, Fun, Fields).
password_to_scram(Password) ->
password_to_scram(Password, ?SCRAM_DEFAULT_ITERATION_COUNT).
password_to_scram(Password, IterationCount) ->
Salt = crypto:rand_bytes(?SALT_LENGTH),
SaltedPassword = scram:salted_password(Password, Salt, IterationCount),
StoredKey = scram:stored_key(scram:client_key(SaltedPassword)),
ServerKey = scram:server_key(SaltedPassword),
#scram{storedkey = base64:encode(StoredKey),
serverkey = base64:encode(ServerKey),
salt = base64:encode(Salt),
iterationcount = IterationCount}.
is_password_scram_valid(Password, Scram) ->
IterationCount = Scram#scram.iterationcount,
Salt = base64:decode(Scram#scram.salt),
SaltedPassword = scram:salted_password(Password, Salt, IterationCount),
StoredKey = scram:stored_key(scram:client_key(SaltedPassword)),
(base64:decode(Scram#scram.storedkey) == StoredKey).
ejabberd-2.1.11/src/cache_tab.erl 0000664 0000000 0000000 00000042166 12240230175 013413 0 ustar %%%-------------------------------------------------------------------
%%% File : cache_tab.erl
%%% Author : Evgeniy Khramtsov
%%% Description : Caching key-value table
%%%
%%% Created : 29 Aug 2010 by Evgeniy Khramtsov
%%%
%%%
%%% ejabberd, Copyright (C) 2002-2012 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
%%% published by the Free Software Foundation; either version 2 of the
%%% License, or (at your option) any later version.
%%%
%%% This program is distributed in the hope that it will be useful,
%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
%%% General Public License for more details.
%%%
%%% You should have received a copy of the GNU General Public License
%%% along with this program; if not, write to the Free Software
%%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
%%% 02111-1307 USA
%%%
%%%-------------------------------------------------------------------
-module(cache_tab).
-define(GEN_SERVER, gen_server).
-behaviour(?GEN_SERVER).
%% API
-export([start_link/4, new/2, delete/1, delete/3, lookup/3,
insert/4, info/2, tab2list/1, setopts/2,
dirty_lookup/3, dirty_insert/4, dirty_delete/3,
all/0, test/0]).
%% gen_server callbacks
-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
terminate/2, code_change/3]).
-include("ejabberd.hrl").
-record(state, {tab = treap:empty(),
name,
size = 0,
owner,
max_size,
life_time,
warn,
hits = 0,
miss = 0,
procs_num,
cache_missed,
lru,
shrink_size}).
-define(PROCNAME, ?MODULE).
-define(CALL_TIMEOUT, 60000).
%% Defaults
-define(MAX_SIZE, 1000).
-define(WARN, true).
-define(CACHE_MISSED, true).
-define(LRU, true).
-define(LIFETIME, 600). %% 10 minutes
%%====================================================================
%% API
%%====================================================================
start_link(Proc, Tab, Opts, Owner) ->
?GEN_SERVER:start_link(
{local, Proc}, ?MODULE, [Tab, Opts, get_proc_num(), Owner], []).
new(Tab, Opts) ->
Res = lists:flatmap(
fun(Proc) ->
Spec = {{Tab, Proc},
{?MODULE, start_link,
[Proc, Tab, Opts, self()]},
permanent,
brutal_kill,
worker,
[?MODULE]},
case supervisor:start_child(cache_tab_sup, Spec) of
{ok, _Pid} ->
[ok];
R ->
[R]
end
end, get_all_procs(Tab)),
case lists:filter(fun(ok) -> false; (_) -> true end, Res) of
[] ->
ok;
Err ->
{error, Err}
end.
delete(Tab) ->
lists:foreach(
fun(Proc) ->
supervisor:terminate_child(cache_tab_sup, {Tab, Proc}),
supervisor:delete_child(cache_tab_sup, {Tab, Proc})
end, get_all_procs(Tab)).
delete(Tab, Key, F) ->
?GEN_SERVER:call(
get_proc_by_hash(Tab, Key), {delete, Key, F}, ?CALL_TIMEOUT).
dirty_delete(Tab, Key, F) ->
F(),
?GEN_SERVER:call(
get_proc_by_hash(Tab, Key), {cache_delete, Key}, ?CALL_TIMEOUT).
lookup(Tab, Key, F) ->
?GEN_SERVER:call(
get_proc_by_hash(Tab, Key), {lookup, Key, F}, ?CALL_TIMEOUT).
dirty_lookup(Tab, Key, F) ->
Proc = get_proc_by_hash(Tab, Key),
case ?GEN_SERVER:call(Proc, {cache_lookup, Key}, ?CALL_TIMEOUT) of
{ok, '$cached_mismatch'} ->
error;
{ok, Val} ->
{ok, Val};
_ ->
{Result, NewVal} = case F() of
{ok, Val} ->
{{ok, Val}, Val};
_ ->
{error, '$cached_mismatch'}
end,
?GEN_SERVER:call(
Proc, {cache_insert, Key, NewVal}, ?CALL_TIMEOUT),
Result
end.
insert(Tab, Key, Val, F) ->
?GEN_SERVER:call(
get_proc_by_hash(Tab, Key), {insert, Key, Val, F}, ?CALL_TIMEOUT).
dirty_insert(Tab, Key, Val, F) ->
F(),
?GEN_SERVER:call(
get_proc_by_hash(Tab, Key), {cache_insert, Key, Val}, ?CALL_TIMEOUT).
info(Tab, Info) ->
case lists:map(
fun(Proc) ->
?GEN_SERVER:call(Proc, {info, Info}, ?CALL_TIMEOUT)
end, get_all_procs(Tab)) of
Res when Info == size ->
{ok, lists:sum(Res)};
Res when Info == all ->
{ok, Res};
Res when Info == ratio ->
{H, M} = lists:foldl(
fun({Hits, Miss}, {HitsAcc, MissAcc}) ->
{HitsAcc + Hits, MissAcc + Miss}
end, {0, 0}, Res),
{ok, [{hits, H}, {miss, M}]};
_ ->
{error, badarg}
end.
setopts(Tab, Opts) ->
lists:foreach(
fun(Proc) ->
?GEN_SERVER:call(Proc, {setopts, Opts}, ?CALL_TIMEOUT)
end, get_all_procs(Tab)).
tab2list(Tab) ->
lists:flatmap(
fun(Proc) ->
?GEN_SERVER:call(Proc, tab2list, ?CALL_TIMEOUT)
end, get_all_procs(Tab)).
all() ->
lists:usort(
[Tab || {{Tab, _}, _, _, _} <- supervisor:which_children(cache_tab_sup)]).
%%====================================================================
%% gen_server callbacks
%%====================================================================
init([Tab, Opts, N, Pid]) ->
State = #state{procs_num = N,
owner = Pid,
name = Tab},
{ok, do_setopts(State, Opts)}.
handle_call({lookup, Key, F}, _From, #state{tab = T} = State) ->
CleanPrio = clean_priority(State#state.life_time),
case treap:lookup(Key, T) of
{ok, Prio, Val} when (State#state.lru == true) or (Prio =< CleanPrio) ->
Hits = State#state.hits,
NewState = treap_update(Key, Val, State#state{hits = Hits + 1}),
case Val of
'$cached_mismatch' ->
{reply, error, NewState};
_ ->
{reply, {ok, Val}, NewState}
end;
_ ->
case catch F() of
{ok, Val} ->
Miss = State#state.miss,
NewState = treap_insert(Key, Val, State),
{reply, {ok, Val}, NewState#state{miss = Miss + 1}};
{'EXIT', Reason} ->
print_error(lookup, [Key], Reason, State),
{reply, error, State};
_ ->
Miss = State#state.miss,
NewState = State#state{miss = Miss + 1},
if State#state.cache_missed ->
{reply, error,
treap_insert(Key, '$cached_mismatch', NewState)};
true ->
{reply, error, NewState}
end
end
end;
handle_call({cache_lookup, Key}, _From, #state{tab = T} = State) ->
CleanPrio = clean_priority(State#state.life_time),
case treap:lookup(Key, T) of
{ok, Prio, Val} when (State#state.lru == true) or (Prio =< CleanPrio) ->
Hits = State#state.hits,
NewState = treap_update(Key, Val, State#state{hits = Hits + 1}),
{reply, {ok, Val}, NewState};
_ ->
Miss = State#state.miss,
NewState = State#state{miss = Miss + 1},
{reply, error, NewState}
end;
handle_call({insert, Key, Val, F}, _From, #state{tab = T} = State) ->
case treap:lookup(Key, T) of
{ok, _Prio, Val} ->
{reply, ok, treap_update(Key, Val, State)};
_ ->
case catch F() of
{'EXIT', Reason} ->
print_error(insert, [Key, Val], Reason, State),
{reply, ok, State};
_ ->
{reply, ok, treap_insert(Key, Val, State)}
end
end;
handle_call({cache_insert, _, '$cached_mismatch'}, _From,
#state{cache_missed = false} = State) ->
{reply, ok, State};
handle_call({cache_insert, Key, Val}, _From, State) ->
{reply, ok, treap_insert(Key, Val, State)};
handle_call({delete, Key, F}, _From, State) ->
NewState = treap_delete(Key, State),
case catch F() of
{'EXIT', Reason} ->
print_error(delete, [Key], Reason, State);
_ ->
ok
end,
{reply, ok, NewState};
handle_call({cache_delete, Key}, _From, State) ->
NewState = treap_delete(Key, State),
{reply, ok, NewState};
handle_call({info, Info}, _From, State) ->
Res = case Info of
size ->
State#state.size;
ratio ->
{State#state.hits, State#state.miss};
all ->
[{max_size, State#state.max_size},
{life_time, State#state.life_time},
{shrink_size, State#state.shrink_size},
{size, State#state.size},
{owner, State#state.owner},
{hits, State#state.hits},
{miss, State#state.miss},
{cache_missed, State#state.cache_missed},
{lru, State#state.lru},
{warn, State#state.warn}];
_ ->
badarg
end,
{reply, Res, State};
handle_call(tab2list, _From, #state{tab = T} = State) ->
Res = treap:fold(
fun({Key, _, Val}, Acc) ->
[{Key, Val}|Acc]
end, [], T),
{reply, Res, State};
handle_call({setopts, Opts}, _From, State) ->
{reply, ok, do_setopts(State, Opts)};
handle_call(_Request, _From, State) ->
Reply = ok,
{reply, Reply, State}.
handle_cast(_Msg, State) ->
{noreply, State}.
handle_info(_Info, State) ->
{noreply, State}.
terminate(_Reason, _State) ->
ok.
code_change(_OldVsn, State, _Extra) ->
{ok, State}.
%%--------------------------------------------------------------------
%%% Internal functions
%%--------------------------------------------------------------------
do_setopts(#state{procs_num = N} = State, Opts) ->
MaxSize = case {proplists:get_value(max_size, Opts),
State#state.max_size} of
{MS, _} when is_integer(MS), MS > 0 ->
round(MS/N);
{unlimited, _} ->
unlimited;
{_, undefined} ->
round(?MAX_SIZE/N);
{_, MS} ->
MS
end,
LifeTime = case {proplists:get_value(life_time, Opts),
State#state.life_time} of
{LT, _} when is_integer(LT), LT > 0 ->
LT*1000*1000;
{unlimited, _} ->
unlimited;
{_, undefined} ->
?LIFETIME*1000*1000;
{_, LT} ->
LT
end,
ShrinkSize = case {proplists:get_value(shrink_size, Opts),
State#state.shrink_size} of
{SS, _} when is_integer(SS), SS > 0 ->
round(SS/N);
_ when is_integer(MaxSize) ->
round(MaxSize/2);
_ ->
unlimited
end,
Warn = case {proplists:get_value(warn, Opts),
State#state.warn} of
{true, _} ->
true;
{false, _} ->
false;
{_, undefined} ->
?WARN;
{_, W} ->
W
end,
CacheMissed = case proplists:get_value(
cache_missed, Opts, State#state.cache_missed) of
false ->
false;
true ->
true;
_ ->
?CACHE_MISSED
end,
LRU = case proplists:get_value(
lru, Opts, State#state.lru) of
false ->
false;
true ->
true;
_ ->
?LRU
end,
State#state{max_size = MaxSize,
warn = Warn,
life_time = LifeTime,
cache_missed = CacheMissed,
lru = LRU,
shrink_size = ShrinkSize}.
get_proc_num() ->
case erlang:system_info(logical_processors) of
unknown ->
1;
Num ->
Num
end.
get_proc_by_hash(Tab, Term) ->
N = erlang:phash2(Term, get_proc_num()) + 1,
get_proc(Tab, N).
get_proc(Tab, N) ->
list_to_atom(atom_to_list(?PROCNAME) ++ "_" ++
atom_to_list(Tab) ++ "_" ++ integer_to_list(N)).
get_all_procs(Tab) ->
[get_proc(Tab, N) || N <- lists:seq(1, get_proc_num())].
now_priority() ->
{MSec, Sec, USec} = now(),
-((MSec*1000000 + Sec)*1000000 + USec).
clean_priority(LifeTime) ->
if is_integer(LifeTime) ->
now_priority() + LifeTime;
true ->
unlimited
end.
treap_update(Key, Val, #state{tab = T, lru = LRU} = State) ->
if LRU ->
Priority = now_priority(),
NewT = treap:insert(Key, Priority, Val, T),
State#state{tab = NewT};
true ->
State
end.
treap_insert(Key, Val, State) ->
State1 = clean_treap(State),
#state{size = Size} = State2 = shrink_treap(State1),
T = State2#state.tab,
case treap:lookup(Key, T) of
{ok, _, Val} ->
treap_update(Key, Val, State2);
{ok, _, _} ->
NewT = treap:insert(Key, now_priority(), Val, T),
State2#state{tab = NewT};
_ ->
NewT = treap:insert(Key, now_priority(), Val, T),
State2#state{tab = NewT, size = Size+1}
end.
treap_delete(Key, #state{tab = T, size = Size} = State) ->
case treap:lookup(Key, T) of
{ok, _, _} ->
NewT = treap:delete(Key, T),
clean_treap(State#state{tab = NewT, size = Size-1});
_ ->
State
end.
clean_treap(#state{tab = T, size = Size, life_time = LifeTime} = State) ->
if is_integer(LifeTime) ->
Priority = now_priority(),
{Cleaned, NewT} = clean_treap(T, Priority + LifeTime, 0),
State#state{size = Size - Cleaned, tab = NewT};
true ->
State
end.
clean_treap(Treap, CleanPriority, N) ->
case treap:is_empty(Treap) of
true ->
{N, Treap};
false ->
{_Key, Priority, _Value} = treap:get_root(Treap),
if Priority > CleanPriority ->
clean_treap(treap:delete_root(Treap), CleanPriority, N+1);
true ->
{N, Treap}
end
end.
shrink_treap(#state{tab = T,
max_size = MaxSize,
shrink_size = ShrinkSize,
warn = Warn,
size = Size} = State) when Size >= MaxSize ->
if Warn ->
?WARNING_MSG("shrinking table:~n"
"** Table: ~p~n"
"** Processes Number: ~p~n"
"** Max Size: ~p items~n"
"** Shrink Size: ~p items~n"
"** Life Time: ~p microseconds~n"
"** Hits/Miss: ~p/~p~n"
"** Owner: ~p~n"
"** Cache Missed: ~p~n"
"** Instruction: you have to tune cacheing options"
" if this message repeats too frequently",
[State#state.name, State#state.procs_num,
MaxSize, ShrinkSize, State#state.life_time,
State#state.hits, State#state.miss,
State#state.owner, State#state.cache_missed]);
true ->
ok
end,
{Shrinked, NewT} = shrink_treap(T, ShrinkSize, 0),
State#state{tab = NewT, size = Size - Shrinked};
shrink_treap(State) ->
State.
shrink_treap(T, ShrinkSize, ShrinkSize) ->
{ShrinkSize, T};
shrink_treap(T, ShrinkSize, N) ->
case treap:is_empty(T) of
true ->
{N, T};
false ->
shrink_treap(treap:delete_root(T), ShrinkSize, N+1)
end.
print_error(Operation, Args, Reason, State) ->
?ERROR_MSG("callback failed:~n"
"** Tab: ~p~n"
"** Owner: ~p~n"
"** Operation: ~p~n"
"** Args: ~p~n"
"** Reason: ~p",
[State#state.name, State#state.owner,
Operation, Args, Reason]).
%%--------------------------------------------------------------------
%%% Tests
%%--------------------------------------------------------------------
-define(lookup, dirty_lookup).
-define(delete, dirty_delete).
-define(insert, dirty_insert).
%%-define(lookup, lookup).
%%-define(delete, delete).
%%-define(insert, insert).
test() ->
LifeTime = 2,
ok = new(test_tbl, [{life_time, LifeTime}, {max_size, unlimited}]),
check([]),
ok = ?insert(test_tbl, "key", "value", fun() -> ok end),
check([{"key", "value"}]),
{ok, "value"} = ?lookup(test_tbl, "key", fun() -> error end),
check([{"key", "value"}]),
io:format("** waiting for ~p seconds to check if LRU works fine...~n",
[LifeTime+1]),
timer:sleep(timer:seconds(LifeTime+1)),
ok = ?insert(test_tbl, "key1", "value1", fun() -> ok end),
check([{"key1", "value1"}]),
ok = ?delete(test_tbl, "key1", fun() -> ok end),
{ok, "value"} = ?lookup(test_tbl, "key", fun() -> {ok, "value"} end),
check([{"key", "value"}]),
ok = ?delete(test_tbl, "key", fun() -> ok end),
check([]),
%% io:format("** testing buggy callbacks...~n"),
%% delete(test_tbl, "key", fun() -> erlang:error(badarg) end),
%% insert(test_tbl, "key", "val", fun() -> erlang:error(badarg) end),
%% lookup(test_tbl, "key", fun() -> erlang:error(badarg) end),
check([]),
delete(test_tbl),
test1().
test1() ->
MaxSize = 10,
ok = new(test_tbl, [{max_size, MaxSize}, {shrink_size, 1}, {warn, false}]),
lists:foreach(
fun(N) ->
ok = ?insert(test_tbl, N, N, fun() -> ok end)
end, lists:seq(1, MaxSize*get_proc_num())),
{ok, MaxSize} = info(test_tbl, size),
delete(test_tbl),
test2().
test2() ->
LifeTime = 2,
ok = new(test_tbl, [{life_time, LifeTime},
{max_size, unlimited},
{lru, false}]),
check([]),
ok = ?insert(test_tbl, "key", "value", fun() -> ok end),
{ok, "value"} = ?lookup(test_tbl, "key", fun() -> error end),
check([{"key", "value"}]),
io:format("** waiting for ~p seconds to check if non-LRU works fine...~n",
[LifeTime+1]),
timer:sleep(timer:seconds(LifeTime+1)),
error = ?lookup(test_tbl, "key", fun() -> error end),
check([{"key", '$cached_mismatch'}]),
ok = ?insert(test_tbl, "key", "value1", fun() -> ok end),
check([{"key", "value1"}]),
delete(test_tbl),
io:format("** testing speed, this may take a while...~n"),
test3(1000),
test3(10000),
test3(100000),
test3(1000000).
test3(Iter) ->
ok = new(test_tbl, [{max_size, unlimited}, {life_time, unlimited}]),
L = lists:seq(1, Iter),
T1 = now(),
lists:foreach(
fun(N) ->
ok = ?insert(test_tbl, N, N, fun() -> ok end)
end, L),
io:format("** average insert (size = ~p): ~p usec~n",
[Iter, round(timer:now_diff(now(), T1)/Iter)]),
T2 = now(),
lists:foreach(
fun(N) ->
{ok, N} = ?lookup(test_tbl, N, fun() -> ok end)
end, L),
io:format("** average lookup (size = ~p): ~p usec~n",
[Iter, round(timer:now_diff(now(), T2)/Iter)]),
{ok, Iter} = info(test_tbl, size),
delete(test_tbl).
check(List) ->
Size = length(List),
{ok, Size} = info(test_tbl, size),
List = tab2list(test_tbl).
ejabberd-2.1.11/src/mod_offline.erl 0000664 0000000 0000000 00000047124 12240230175 014002 0 ustar %%%----------------------------------------------------------------------
%%% File : mod_offline.erl
%%% Author : Alexey Shchepin
%%% Purpose : Store and manage offline messages in Mnesia database.
%%% Created : 5 Jan 2003 by Alexey Shchepin
%%%
%%%
%%% ejabberd, Copyright (C) 2002-2012 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
%%% published by the Free Software Foundation; either version 2 of the
%%% License, or (at your option) any later version.
%%%
%%% This program is distributed in the hope that it will be useful,
%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
%%% General Public License for more details.
%%%
%%% You should have received a copy of the GNU General Public License
%%% along with this program; if not, write to the Free Software
%%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
%%% 02111-1307 USA
%%%
%%%----------------------------------------------------------------------
-module(mod_offline).
-author('alexey@process-one.net').
-behaviour(gen_mod).
-export([start/2,
loop/1,
stop/1,
store_packet/3,
resend_offline_messages/2,
pop_offline_messages/3,
get_sm_features/5,
remove_expired_messages/0,
remove_old_messages/1,
remove_user/2,
get_queue_length/2,
webadmin_page/3,
webadmin_user/4,
webadmin_user_parse_query/5]).
-include("ejabberd.hrl").
-include("jlib.hrl").
-include("web/ejabberd_http.hrl").
-include("web/ejabberd_web_admin.hrl").
-record(offline_msg, {us, timestamp, expire, from, to, packet}).
-define(PROCNAME, ejabberd_offline).
-define(OFFLINE_TABLE_LOCK_THRESHOLD, 1000).
%% default value for the maximum number of user messages
-define(MAX_USER_MESSAGES, infinity).
start(Host, Opts) ->
mnesia:create_table(offline_msg,
[{disc_only_copies, [node()]},
{type, bag},
{attributes, record_info(fields, offline_msg)}]),
update_table(),
ejabberd_hooks:add(offline_message_hook, Host,
?MODULE, store_packet, 50),
ejabberd_hooks:add(resend_offline_messages_hook, Host,
?MODULE, pop_offline_messages, 50),
ejabberd_hooks:add(remove_user, Host,
?MODULE, remove_user, 50),
ejabberd_hooks:add(anonymous_purge_hook, Host,
?MODULE, remove_user, 50),
ejabberd_hooks:add(disco_sm_features, Host,
?MODULE, get_sm_features, 50),
ejabberd_hooks:add(disco_local_features, Host,
?MODULE, get_sm_features, 50),
ejabberd_hooks:add(webadmin_page_host, Host,
?MODULE, webadmin_page, 50),
ejabberd_hooks:add(webadmin_user, Host,
?MODULE, webadmin_user, 50),
ejabberd_hooks:add(webadmin_user_parse_query, Host,
?MODULE, webadmin_user_parse_query, 50),
AccessMaxOfflineMsgs = gen_mod:get_opt(access_max_user_messages, Opts, max_user_offline_messages),
register(gen_mod:get_module_proc(Host, ?PROCNAME),
spawn(?MODULE, loop, [AccessMaxOfflineMsgs])).
loop(AccessMaxOfflineMsgs) ->
receive
#offline_msg{us=US} = Msg ->
Msgs = receive_all(US, [Msg]),
Len = length(Msgs),
{User, Host} = US,
MaxOfflineMsgs = get_max_user_messages(AccessMaxOfflineMsgs,
User, Host),
F = fun() ->
%% Only count messages if needed:
Count = if MaxOfflineMsgs =/= infinity ->
Len + p1_mnesia:count_records(
offline_msg,
#offline_msg{us=US, _='_'});
true ->
0
end,
if
Count > MaxOfflineMsgs ->
discard_warn_sender(Msgs);
true ->
if
Len >= ?OFFLINE_TABLE_LOCK_THRESHOLD ->
mnesia:write_lock_table(offline_msg);
true ->
ok
end,
lists:foreach(fun(M) ->
mnesia:write(M)
end, Msgs)
end
end,
mnesia:transaction(F),
loop(AccessMaxOfflineMsgs);
_ ->
loop(AccessMaxOfflineMsgs)
end.
%% Function copied from ejabberd_sm.erl:
get_max_user_messages(AccessRule, LUser, Host) ->
case acl:match_rule(
Host, AccessRule, jlib:make_jid(LUser, Host, "")) of
Max when is_integer(Max) -> Max;
infinity -> infinity;
_ -> ?MAX_USER_MESSAGES
end.
receive_all(US, Msgs) ->
receive
#offline_msg{us=US} = Msg ->
receive_all(US, [Msg | Msgs])
after 0 ->
Msgs
end.
stop(Host) ->
ejabberd_hooks:delete(offline_message_hook, Host,
?MODULE, store_packet, 50),
ejabberd_hooks:delete(resend_offline_messages_hook, Host,
?MODULE, pop_offline_messages, 50),
ejabberd_hooks:delete(remove_user, Host,
?MODULE, remove_user, 50),
ejabberd_hooks:delete(anonymous_purge_hook, Host,
?MODULE, remove_user, 50),
ejabberd_hooks:delete(disco_sm_features, Host, ?MODULE, get_sm_features, 50),
ejabberd_hooks:delete(disco_local_features, Host, ?MODULE, get_sm_features, 50),
ejabberd_hooks:delete(webadmin_page_host, Host,
?MODULE, webadmin_page, 50),
ejabberd_hooks:delete(webadmin_user, Host,
?MODULE, webadmin_user, 50),
ejabberd_hooks:delete(webadmin_user_parse_query, Host,
?MODULE, webadmin_user_parse_query, 50),
Proc = gen_mod:get_module_proc(Host, ?PROCNAME),
exit(whereis(Proc), stop),
{wait, Proc}.
get_sm_features(Acc, _From, _To, "", _Lang) ->
Feats = case Acc of
{result, I} -> I;
_ -> []
end,
{result, Feats ++ [?NS_FEATURE_MSGOFFLINE]};
get_sm_features(_Acc, _From, _To, ?NS_FEATURE_MSGOFFLINE, _Lang) ->
%% override all lesser features...
{result, []};
get_sm_features(Acc, _From, _To, _Node, _Lang) ->
Acc.
store_packet(From, To, Packet) ->
Type = xml:get_tag_attr_s("type", Packet),
if
(Type /= "error") and (Type /= "groupchat") and
(Type /= "headline") ->
case check_event_chatstates(From, To, Packet) of
true ->
#jid{luser = LUser, lserver = LServer} = To,
TimeStamp = now(),
{xmlelement, _Name, _Attrs, Els} = Packet,
Expire = find_x_expire(TimeStamp, Els),
gen_mod:get_module_proc(To#jid.lserver, ?PROCNAME) !
#offline_msg{us = {LUser, LServer},
timestamp = TimeStamp,
expire = Expire,
from = From,
to = To,
packet = Packet},
stop;
_ ->
ok
end;
true ->
ok
end.
%% Check if the packet has any content about XEP-0022 or XEP-0085
check_event_chatstates(From, To, Packet) ->
{xmlelement, Name, Attrs, Els} = Packet,
case find_x_event_chatstates(Els, {false, false, false}) of
%% There wasn't any x:event or chatstates subelements
{false, false, _} ->
true;
%% There a chatstates subelement and other stuff, but no x:event
{false, CEl, true} when CEl /= false ->
true;
%% There was only a subelement: a chatstates
{false, CEl, false} when CEl /= false ->
%% Don't allow offline storage
false;
%% There was an x:event element, and maybe also other stuff
{El, _, _} when El /= false ->
case xml:get_subtag(El, "id") of
false ->
case xml:get_subtag(El, "offline") of
false ->
true;
_ ->
ID = case xml:get_tag_attr_s("id", Packet) of
"" ->
{xmlelement, "id", [], []};
S ->
{xmlelement, "id", [],
[{xmlcdata, S}]}
end,
ejabberd_router:route(
To, From, {xmlelement, Name, Attrs,
[{xmlelement, "x",
[{"xmlns", ?NS_EVENT}],
[ID,
{xmlelement, "offline", [], []}]}]
}),
true
end;
_ ->
false
end
end.
%% Check if the packet has subelements about XEP-0022, XEP-0085 or other
find_x_event_chatstates([], Res) ->
Res;
find_x_event_chatstates([{xmlcdata, _} | Els], Res) ->
find_x_event_chatstates(Els, Res);
find_x_event_chatstates([El | Els], {A, B, C}) ->
case xml:get_tag_attr_s("xmlns", El) of
?NS_EVENT ->
find_x_event_chatstates(Els, {El, B, C});
?NS_CHATSTATES ->
find_x_event_chatstates(Els, {A, El, C});
_ ->
find_x_event_chatstates(Els, {A, B, true})
end.
find_x_expire(_, []) ->
never;
find_x_expire(TimeStamp, [{xmlcdata, _} | Els]) ->
find_x_expire(TimeStamp, Els);
find_x_expire(TimeStamp, [El | Els]) ->
case xml:get_tag_attr_s("xmlns", El) of
?NS_EXPIRE ->
Val = xml:get_tag_attr_s("seconds", El),
case catch list_to_integer(Val) of
{'EXIT', _} ->
never;
Int when Int > 0 ->
{MegaSecs, Secs, MicroSecs} = TimeStamp,
S = MegaSecs * 1000000 + Secs + Int,
MegaSecs1 = S div 1000000,
Secs1 = S rem 1000000,
{MegaSecs1, Secs1, MicroSecs};
_ ->
never
end;
_ ->
find_x_expire(TimeStamp, Els)
end.
resend_offline_messages(User, Server) ->
LUser = jlib:nodeprep(User),
LServer = jlib:nameprep(Server),
US = {LUser, LServer},
F = fun() ->
Rs = mnesia:wread({offline_msg, US}),
mnesia:delete({offline_msg, US}),
Rs
end,
case mnesia:transaction(F) of
{atomic, Rs} ->
lists:foreach(
fun(R) ->
{xmlelement, Name, Attrs, Els} = R#offline_msg.packet,
ejabberd_sm !
{route,
R#offline_msg.from,
R#offline_msg.to,
{xmlelement, Name, Attrs,
Els ++
[jlib:timestamp_to_xml(
calendar:now_to_universal_time(
R#offline_msg.timestamp),
utc,
jlib:make_jid("", Server, ""),
"Offline Storage"),
%% TODO: Delete the next three lines once XEP-0091 is Obsolete
jlib:timestamp_to_xml(
calendar:now_to_universal_time(
R#offline_msg.timestamp))]}}
end,
lists:keysort(#offline_msg.timestamp, Rs));
_ ->
ok
end.
pop_offline_messages(Ls, User, Server) ->
LUser = jlib:nodeprep(User),
LServer = jlib:nameprep(Server),
US = {LUser, LServer},
F = fun() ->
Rs = mnesia:wread({offline_msg, US}),
mnesia:delete({offline_msg, US}),
Rs
end,
case mnesia:transaction(F) of
{atomic, Rs} ->
TS = now(),
Ls ++ lists:map(
fun(R) ->
{xmlelement, Name, Attrs, Els} = R#offline_msg.packet,
{route,
R#offline_msg.from,
R#offline_msg.to,
{xmlelement, Name, Attrs,
Els ++
[jlib:timestamp_to_xml(
calendar:now_to_universal_time(
R#offline_msg.timestamp),
utc,
jlib:make_jid("", Server, ""),
"Offline Storage"),
%% TODO: Delete the next three lines once XEP-0091 is Obsolete
jlib:timestamp_to_xml(
calendar:now_to_universal_time(
R#offline_msg.timestamp))]}}
end,
lists:filter(
fun(R) ->
case R#offline_msg.expire of
never ->
true;
TimeStamp ->
TS < TimeStamp
end
end,
lists:keysort(#offline_msg.timestamp, Rs)));
_ ->
Ls
end.
remove_expired_messages() ->
TimeStamp = now(),
F = fun() ->
mnesia:write_lock_table(offline_msg),
mnesia:foldl(
fun(Rec, _Acc) ->
case Rec#offline_msg.expire of
never ->
ok;
TS ->
if
TS < TimeStamp ->
mnesia:delete_object(Rec);
true ->
ok
end
end
end, ok, offline_msg)
end,
mnesia:transaction(F).
remove_old_messages(Days) ->
{MegaSecs, Secs, _MicroSecs} = now(),
S = MegaSecs * 1000000 + Secs - 60 * 60 * 24 * Days,
MegaSecs1 = S div 1000000,
Secs1 = S rem 1000000,
TimeStamp = {MegaSecs1, Secs1, 0},
F = fun() ->
mnesia:write_lock_table(offline_msg),
mnesia:foldl(
fun(#offline_msg{timestamp = TS} = Rec, _Acc)
when TS < TimeStamp ->
mnesia:delete_object(Rec);
(_Rec, _Acc) -> ok
end, ok, offline_msg)
end,
mnesia:transaction(F).
remove_user(User, Server) ->
LUser = jlib:nodeprep(User),
LServer = jlib:nameprep(Server),
US = {LUser, LServer},
F = fun() ->
mnesia:delete({offline_msg, US})
end,
mnesia:transaction(F).
update_table() ->
Fields = record_info(fields, offline_msg),
case mnesia:table_info(offline_msg, attributes) of
Fields ->
ok;
[user, timestamp, expire, from, to, packet] ->
?INFO_MSG("Converting offline_msg table from "
"{user, timestamp, expire, from, to, packet} format", []),
Host = ?MYNAME,
{atomic, ok} = mnesia:create_table(
mod_offline_tmp_table,
[{disc_only_copies, [node()]},
{type, bag},
{local_content, true},
{record_name, offline_msg},
{attributes, record_info(fields, offline_msg)}]),
mnesia:transform_table(offline_msg, ignore, Fields),
F1 = fun() ->
mnesia:write_lock_table(mod_offline_tmp_table),
mnesia:foldl(
fun(#offline_msg{us = U} = R, _) ->
mnesia:dirty_write(
mod_offline_tmp_table,
R#offline_msg{us = {U, Host}})
end, ok, offline_msg)
end,
mnesia:transaction(F1),
mnesia:clear_table(offline_msg),
F2 = fun() ->
mnesia:write_lock_table(offline_msg),
mnesia:foldl(
fun(R, _) ->
mnesia:dirty_write(R)
end, ok, mod_offline_tmp_table)
end,
mnesia:transaction(F2),
mnesia:delete_table(mod_offline_tmp_table);
[user, timestamp, from, to, packet] ->
?INFO_MSG("Converting offline_msg table from "
"{user, timestamp, from, to, packet} format", []),
Host = ?MYNAME,
{atomic, ok} = mnesia:create_table(
mod_offline_tmp_table,
[{disc_only_copies, [node()]},
{type, bag},
{local_content, true},
{record_name, offline_msg},
{attributes, record_info(fields, offline_msg)}]),
mnesia:transform_table(
offline_msg,
fun({_, U, TS, F, T, P}) ->
{xmlelement, _Name, _Attrs, Els} = P,
Expire = find_x_expire(TS, Els),
#offline_msg{us = U,
timestamp = TS,
expire = Expire,
from = F,
to = T,
packet = P}
end, Fields),
F1 = fun() ->
mnesia:write_lock_table(mod_offline_tmp_table),
mnesia:foldl(
fun(#offline_msg{us = U} = R, _) ->
mnesia:dirty_write(
mod_offline_tmp_table,
R#offline_msg{us = {U, Host}})
end, ok, offline_msg)
end,
mnesia:transaction(F1),
mnesia:clear_table(offline_msg),
F2 = fun() ->
mnesia:write_lock_table(offline_msg),
mnesia:foldl(
fun(R, _) ->
mnesia:dirty_write(R)
end, ok, mod_offline_tmp_table)
end,
mnesia:transaction(F2),
mnesia:delete_table(mod_offline_tmp_table);
_ ->
?INFO_MSG("Recreating offline_msg table", []),
mnesia:transform_table(offline_msg, ignore, Fields)
end.
%% Helper functions:
%% Warn senders that their messages have been discarded:
discard_warn_sender(Msgs) ->
lists:foreach(
fun(#offline_msg{from=From, to=To, packet=Packet}) ->
ErrText = "Your contact offline message queue is full. The message has been discarded.",
Lang = xml:get_tag_attr_s("xml:lang", Packet),
Err = jlib:make_error_reply(
Packet, ?ERRT_RESOURCE_CONSTRAINT(Lang, ErrText)),
ejabberd_router:route(
To,
From, Err)
end, Msgs).
webadmin_page(_, Host,
#request{us = _US,
path = ["user", U, "queue"],
q = Query,
lang = Lang} = _Request) ->
Res = user_queue(U, Host, Query, Lang),
{stop, Res};
webadmin_page(Acc, _, _) -> Acc.
user_queue(User, Server, Query, Lang) ->
US = {jlib:nodeprep(User), jlib:nameprep(Server)},
Res = user_queue_parse_query(US, Query),
MsgsAll = lists:keysort(#offline_msg.timestamp,
mnesia:dirty_read({offline_msg, US})),
Msgs = get_messages_subset(User, Server, MsgsAll),
FMsgs =
lists:map(
fun(#offline_msg{timestamp = TimeStamp, from = From, to = To,
packet = {xmlelement, Name, Attrs, Els}} = Msg) ->
ID = jlib:encode_base64(binary_to_list(term_to_binary(Msg))),
{{Year, Month, Day}, {Hour, Minute, Second}} =
calendar:now_to_local_time(TimeStamp),
Time = lists:flatten(
io_lib:format(
"~w-~.2.0w-~.2.0w ~.2.0w:~.2.0w:~.2.0w",
[Year, Month, Day, Hour, Minute, Second])),
SFrom = jlib:jid_to_string(From),
STo = jlib:jid_to_string(To),
Attrs2 = jlib:replace_from_to_attrs(SFrom, STo, Attrs),
Packet = {xmlelement, Name, Attrs2, Els},
FPacket = ejabberd_web_admin:pretty_print_xml(Packet),
?XE("tr",
[?XAE("td", [{"class", "valign"}], [?INPUT("checkbox", "selected", ID)]),
?XAC("td", [{"class", "valign"}], Time),
?XAC("td", [{"class", "valign"}], SFrom),
?XAC("td", [{"class", "valign"}], STo),
?XAE("td", [{"class", "valign"}], [?XC("pre", FPacket)])]
)
end, Msgs),
[?XC("h1", io_lib:format(?T("~s's Offline Messages Queue"),
[us_to_list(US)]))] ++
case Res of
ok -> [?XREST("Submitted")];
nothing -> []
end ++
[?XAE("form", [{"action", ""}, {"method", "post"}],
[?XE("table",
[?XE("thead",
[?XE("tr",
[?X("td"),
?XCT("td", "Time"),
?XCT("td", "From"),
?XCT("td", "To"),
?XCT("td", "Packet")
])]),
?XE("tbody",
if
FMsgs == [] ->
[?XE("tr",
[?XAC("td", [{"colspan", "4"}], " ")]
)];
true ->
FMsgs
end
)]),
?BR,
?INPUTT("submit", "delete", "Delete Selected")
])].
user_queue_parse_query(US, Query) ->
case lists:keysearch("delete", 1, Query) of
{value, _} ->
Msgs = lists:keysort(#offline_msg.timestamp,
mnesia:dirty_read({offline_msg, US})),
F = fun() ->
lists:foreach(
fun(Msg) ->
ID = jlib:encode_base64(
binary_to_list(term_to_binary(Msg))),
case lists:member({"selected", ID}, Query) of
true ->
mnesia:delete_object(Msg);
false ->
ok
end
end, Msgs)
end,
mnesia:transaction(F),
ok;
false ->
nothing
end.
us_to_list({User, Server}) ->
jlib:jid_to_string({User, Server, ""}).
get_queue_length(User, Server) ->
length(mnesia:dirty_read({offline_msg, {User, Server}})).
get_messages_subset(User, Host, MsgsAll) ->
Access = gen_mod:get_module_opt(Host, ?MODULE, access_max_user_messages,
max_user_offline_messages),
MaxOfflineMsgs = case get_max_user_messages(Access, User, Host) of
Number when is_integer(Number) -> Number;
_ -> 100
end,
Length = length(MsgsAll),
get_messages_subset2(MaxOfflineMsgs, Length, MsgsAll).
get_messages_subset2(Max, Length, MsgsAll) when Length =< Max*2 ->
MsgsAll;
get_messages_subset2(Max, Length, MsgsAll) ->
FirstN = Max,
{MsgsFirstN, Msgs2} = lists:split(FirstN, MsgsAll),
MsgsLastN = lists:nthtail(Length - FirstN - FirstN, Msgs2),
NoJID = jlib:make_jid("...", "...", ""),
IntermediateMsg = #offline_msg{timestamp = now(), from = NoJID, to = NoJID,
packet = {xmlelement, "...", [], []}},
MsgsFirstN ++ [IntermediateMsg] ++ MsgsLastN.
webadmin_user(Acc, User, Server, Lang) ->
QueueLen = get_queue_length(jlib:nodeprep(User), jlib:nameprep(Server)),
FQueueLen = [?AC("queue/",
integer_to_list(QueueLen))],
Acc ++ [?XCT("h3", "Offline Messages:")] ++ FQueueLen ++ [?C(" "), ?INPUTT("submit", "removealloffline", "Remove All Offline Messages")].
webadmin_user_parse_query(_, "removealloffline", User, Server, _Query) ->
US = {User, Server},
F = fun() ->
mnesia:write_lock_table(offline_msg),
lists:foreach(
fun(Msg) ->
mnesia:delete_object(Msg)
end, mnesia:dirty_read({offline_msg, US}))
end,
case mnesia:transaction(F) of
{aborted, Reason} ->
?ERROR_MSG("Failed to remove offline messages: ~p", [Reason]),
{stop, error};
{atomic, ok} ->
?INFO_MSG("Removed all offline messages for ~s@~s", [User, Server]),
{stop, ok}
end;
webadmin_user_parse_query(Acc, _Action, _User, _Server, _Query) ->
Acc.
ejabberd-2.1.11/src/ejabberd_c2s.erl 0000664 0000000 0000000 00000220177 12240230175 014027 0 ustar %%%----------------------------------------------------------------------
%%% File : ejabberd_c2s.erl
%%% Author : Alexey Shchepin
%%% Purpose : Serve C2S connection
%%% Created : 16 Nov 2002 by Alexey Shchepin
%%%
%%%
%%% ejabberd, Copyright (C) 2002-2012 ProcessOne
%%%
%%% This program is free software; you can redistribute it and/or
%%% modify it under the terms of the GNU General Public License as
%%% published by the Free Software Foundation; either version 2 of the
%%% License, or (at your option) any later version.
%%%
%%% This program is distributed in the hope that it will be useful,
%%% but WITHOUT ANY WARRANTY; without even the implied warranty of
%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
%%% General Public License for more details.
%%%
%%% You should have received a copy of the GNU General Public License
%%% along with this program; if not, write to the Free Software
%%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
%%% 02111-1307 USA
%%%
%%%----------------------------------------------------------------------
-module(ejabberd_c2s).
-author('alexey@process-one.net').
-update_info({update, 0}).
-define(GEN_FSM, p1_fsm).
-behaviour(?GEN_FSM).
%% External exports
-export([start/2,
stop/1,
start_link/2,
send_text/2,
send_element/2,
socket_type/0,
get_presence/1,
get_aux_field/2,
set_aux_field/3,
del_aux_field/2,
get_subscription/2,
broadcast/4,
get_subscribed/1]).
%% gen_fsm callbacks
-export([init/1,
wait_for_stream/2,
wait_for_auth/2,
wait_for_feature_request/2,
wait_for_bind/2,
wait_for_session/2,
wait_for_sasl_response/2,
session_established/2,
handle_event/3,
handle_sync_event/4,
code_change/4,
handle_info/3,
terminate/3,
print_state/1
]).
-include("ejabberd.hrl").
-include("jlib.hrl").
-include("mod_privacy.hrl").
-define(SETS, gb_sets).
-define(DICT, dict).
%% pres_a contains all the presence available send (either through roster mechanism or directed).
%% Directed presence unavailable remove user from pres_a.
-record(state, {socket,
sockmod,
socket_monitor,
xml_socket,
streamid,
sasl_state,
access,
shaper,
zlib = false,
tls = false,
tls_required = false,
tls_enabled = false,
tls_options = [],
authenticated = false,
jid,
user = "", server = ?MYNAME, resource = "",
sid,
pres_t = ?SETS:new(),
pres_f = ?SETS:new(),
pres_a = ?SETS:new(),
pres_i = ?SETS:new(),
pres_last, pres_pri,
pres_timestamp,
pres_invis = false,
privacy_list = #userlist{},
conn = unknown,
auth_module = unknown,
ip,
aux_fields = [],
lang}).
%-define(DBGFSM, true).
-ifdef(DBGFSM).
-define(FSMOPTS, [{debug, [trace]}]).
-else.
-define(FSMOPTS, []).
-endif.
%% Module start with or without supervisor:
-ifdef(NO_TRANSIENT_SUPERVISORS).
-define(SUPERVISOR_START, ?GEN_FSM:start(ejabberd_c2s, [SockData, Opts],
fsm_limit_opts(Opts) ++ ?FSMOPTS)).
-else.
-define(SUPERVISOR_START, supervisor:start_child(ejabberd_c2s_sup,
[SockData, Opts])).
-endif.
%% This is the timeout to apply between event when starting a new
%% session:
-define(C2S_OPEN_TIMEOUT, 60000).
-define(C2S_HIBERNATE_TIMEOUT, 90000).
-define(STREAM_HEADER,
""
"